@mml-io/3d-web-client-core 0.9.0 → 0.10.1

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/camera/CameraManager.ts", "../src/helpers/math-helpers.ts", "../src/input/EventHandlerCollection.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/blades/characterFolder.ts", "../src/character/CharacterState.ts", "../src/character/CharacterSpeakingIndicator.ts", "../src/character/CharacterTooltip.ts", "../src/character/CanvasText.ts", "../src/character/LocalController.ts", "../src/character/CharacterManager.ts", "../src/character/RemoteController.ts", "../src/character/CharacterModelLoader.ts", "../src/input/KeyInputManager.ts", "../src/mml/MMLCompositionScene.ts", "../src/tweakpane/TweakPane.ts", "../src/tweakpane/blades/bcsFolder.ts", "../src/tweakpane/blades/environmentFolder.ts", "../src/tweakpane/blades/postExtrasFolder.ts", "../src/tweakpane/blades/rendererFolder.ts", "../src/tweakpane/blades/rendererStatsFolder.ts", "../src/tweakpane/blades/ssaoFolder.ts", "../src/tweakpane/blades/toneMappingFolder.ts", "../src/tweakpane/tweakPaneStyle.ts", "../src/rendering/composer.ts", "../src/sun/Sun.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 { EventHandlerCollection } from \"../input/EventHandlerCollection\";\nimport { getTweakpaneActive } from \"../tweakpane/tweakPaneActivity\";\n\nexport class CameraManager {\n public readonly camera: PerspectiveCamera;\n\n public initialDistance: number = 3.3;\n\n private minDistance: number = 0.1;\n private maxDistance: number = 8;\n\n private initialFOV: number = 60;\n private fov: number = this.initialFOV;\n private minFOV: number = 50;\n private maxFOV: number = 70;\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 private desiredDistance: number = this.initialDistance;\n\n private targetPhi: number | null;\n private phi: number | null;\n private targetTheta: number | null;\n private theta: number | null;\n public 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 private eventHandlerCollection: EventHandlerCollection;\n\n constructor(\n targetElement: HTMLElement,\n private collisionsManager: CollisionsManager,\n initialPhi = Math.PI / 2,\n initialTheta = -Math.PI / 2,\n ) {\n this.phi = initialPhi;\n this.targetPhi = initialPhi;\n this.theta = initialTheta;\n this.targetTheta = initialTheta;\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 this.eventHandlerCollection = EventHandlerCollection.create([\n [targetElement, \"mousedown\", this.onMouseDown.bind(this)],\n [document, \"mouseup\", this.onMouseUp.bind(this)],\n [document, \"mousemove\", this.onMouseMove.bind(this)],\n [targetElement, \"wheel\", this.onMouseWheel.bind(this)],\n ]);\n }\n\n private onMouseDown(): 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()) 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 event.preventDefault();\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 this.desiredDistance = this.targetDistance;\n event.preventDefault();\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 } else {\n this.targetDistance += (this.desiredDistance - this.targetDistance) * this.dampingFactor * 4;\n }\n }\n\n public dispose() {\n this.eventHandlerCollection.clear();\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 { Quaternion, Vector3, Vector4 } from \"three\";\n\nexport const roundToDecimalPlaces = (value: number, decimalPlaces: number): number => {\n const mult = 10 ** decimalPlaces;\n return Math.round(value * mult) / mult;\n};\n\nexport const toArray = (\n origin: Vector3 | Vector4 | Quaternion,\n precision: number = 3,\n): number[] => {\n const array = [];\n array[0] = roundToDecimalPlaces(origin.x, precision);\n array[1] = roundToDecimalPlaces(origin.y, precision);\n array[2] = roundToDecimalPlaces(origin.z, precision);\n if (origin instanceof Vector4 || origin instanceof Quaternion) {\n array[3] = roundToDecimalPlaces(origin.w, precision);\n }\n return array;\n};\n\nexport const getSpawnPositionInsideCircle = (\n radius: number,\n positions: number,\n id: number,\n yPos: number = 0,\n): 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", "type ListenerFunc = (...args: any[]) => void;\n\ntype EventSpecificationTuple = [EventTarget, string, ListenerFunc, AddEventListenerOptions?];\n\nexport class EventHandlerCollection {\n private eventsByTarget: Map<EventTarget, Map<string, Set<ListenerFunc>>> = new Map();\n\n public add(\n target: EventTarget,\n key: string,\n listener: ListenerFunc,\n options?: AddEventListenerOptions,\n ): this {\n target.addEventListener(key, listener, options);\n\n let existingTarget = this.eventsByTarget.get(target);\n if (existingTarget === undefined) {\n existingTarget = new Map();\n this.eventsByTarget.set(target, existingTarget);\n }\n let existingKey = existingTarget.get(key);\n if (existingKey === undefined) {\n existingKey = new Set();\n existingTarget.set(key, existingKey);\n }\n existingKey.add(listener);\n\n return this;\n }\n\n public clear() {\n this.eventsByTarget.forEach((keyMap, target) => {\n keyMap.forEach((listenerSet, key) => {\n listenerSet.forEach((listenerFunc) => {\n target.removeEventListener(key, listenerFunc);\n });\n });\n });\n this.eventsByTarget.clear();\n }\n\n static create(initial?: Array<EventSpecificationTuple>): EventHandlerCollection {\n const instance = new EventHandlerCollection();\n if (initial !== undefined) {\n initial.forEach(([target, key, listenerFunc, options]) => {\n instance.add(target, key, listenerFunc, options);\n });\n }\n return instance;\n }\n}\n", "let isTweakpaneActive = false;\n\nexport function setTweakpaneActive(status: boolean) {\n isTweakpaneActive = status;\n}\n\nexport function getTweakpaneActive() {\n return isTweakpaneActive;\n}\n", "import { Color, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { Composer } from \"../rendering/composer\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { CharacterModel } from \"./CharacterModel\";\nimport { CharacterModelLoader } from \"./CharacterModelLoader\";\nimport { CharacterSpeakingIndicator } from \"./CharacterSpeakingIndicator\";\nimport { CharacterTooltip } from \"./CharacterTooltip\";\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 public tooltip: CharacterTooltip | null = null;\n public speakingIndicator: CharacterSpeakingIndicator | null = null;\n\n constructor(\n private readonly characterDescription: CharacterDescription,\n private readonly characterModelLoader: CharacterModelLoader,\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 private readonly composer: Composer,\n ) {\n this.load();\n }\n\n private async load(): Promise<void> {\n this.model = new CharacterModel(this.characterDescription, this.characterModelLoader);\n await this.model.init();\n if (this.tooltip === null) {\n this.tooltip = new CharacterTooltip(this.model.mesh!);\n }\n if (this.speakingIndicator === null) {\n this.speakingIndicator = new CharacterSpeakingIndicator(this.composer.postPostScene);\n }\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 if (this.tooltip) {\n this.tooltip.update(this.cameraManager.camera);\n }\n if (this.speakingIndicator) {\n this.speakingIndicator.setTime(time);\n if (this.model.mesh && this.model.headBone) {\n this.speakingIndicator.setBillboarding(\n this.model.headBone?.getWorldPosition(new Vector3()),\n this.cameraManager.camera,\n );\n }\n }\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 Bone,\n LoopRepeat,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n} from \"three\";\n\nimport { CharacterDescription } from \"./Character\";\nimport { CharacterMaterial } from \"./CharacterMaterial\";\nimport { CharacterModelLoader } from \"./CharacterModelLoader\";\nimport { AnimationState } from \"./CharacterState\";\n\nexport class CharacterModel {\n public mesh: Object3D | null = null;\n public material: CharacterMaterial = new CharacterMaterial();\n public headBone: Bone | null = null;\n\n public animations: Record<string, AnimationAction> = {};\n public animationMixer: AnimationMixer | null = null;\n public currentAnimation: AnimationState = AnimationState.idle;\n\n constructor(\n private readonly characterDescription: CharacterDescription,\n private characterModelLoader: CharacterModelLoader,\n ) {}\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 === \"Bone\" && child.name === \"mixamorigHeadTop_End\") {\n this.headBone = child as Bone;\n }\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.characterModelLoader.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.characterModelLoader.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/blades/characterFolder\";\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.transmission;\n this.metalness = characterValues.metalness;\n this.roughness = characterValues.roughness;\n this.ior = characterValues.ior;\n this.thickness = characterValues.thickness;\n this.specularColor = new Color().setRGB(\n characterValues.specularColor.r,\n characterValues.specularColor.g,\n characterValues.specularColor.b,\n );\n this.specularIntensity = characterValues.specularIntensity;\n this.emissive = new Color().setRGB(\n characterValues.emissive.r,\n characterValues.emissive.g,\n characterValues.emissive.b,\n );\n this.emissiveIntensity = characterValues.emissiveIntensity;\n this.envMapIntensity = characterValues.envMapIntensity;\n this.sheenColor = new Color().setRGB(\n characterValues.sheenColor.r,\n characterValues.sheenColor.g,\n characterValues.sheenColor.b,\n );\n this.sheen = characterValues.sheen;\n this.clearcoat = characterValues.clearcoat;\n this.clearcoatRoughness = characterValues.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.transmission;\n this.metalness = characterValues.metalness;\n this.roughness = characterValues.roughness;\n this.ior = characterValues.ior;\n this.thickness = characterValues.thickness;\n this.specularColor = new Color().setRGB(\n characterValues.specularColor.r,\n characterValues.specularColor.g,\n characterValues.specularColor.b,\n );\n this.specularIntensity = characterValues.specularIntensity;\n this.emissive = new Color().setRGB(\n characterValues.emissive.r,\n characterValues.emissive.g,\n characterValues.emissive.b,\n );\n this.emissiveIntensity = characterValues.emissiveIntensity;\n this.envMapIntensity = characterValues.envMapIntensity;\n this.sheenColor = new Color().setRGB(\n characterValues.sheenColor.r,\n characterValues.sheenColor.g,\n characterValues.sheenColor.b,\n );\n this.sheen = characterValues.sheen;\n this.clearcoat = characterValues.clearcoat;\n this.clearcoatRoughness = characterValues.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", "import { BladeController, View } from \"@tweakpane/core\";\nimport { BladeApi, FolderApi, TpChangeEvent } from \"tweakpane\";\n\nexport const characterValues = {\n transmission: 0.01,\n metalness: 0.8,\n roughness: 0.05,\n ior: 1.0,\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: 0.8,\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\nconst characterOptions = {\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: 1, 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\nexport class CharacterFolder {\n private folder: FolderApi;\n constructor(parentFolder: FolderApi, expand: boolean = false) {\n this.folder = parentFolder.addFolder({ title: \"characterMaterial\", expanded: expand });\n this.folder.addBinding(characterValues, \"transmission\", characterOptions.transmission);\n this.folder.addBinding(characterValues, \"metalness\", characterOptions.metalness);\n this.folder.addBinding(characterValues, \"roughness\", characterOptions.roughness);\n this.folder.addBinding(characterValues, \"ior\", characterOptions.ior);\n this.folder.addBinding(characterValues, \"thickness\", characterOptions.thickness);\n this.folder.addBinding(characterValues, \"specularColor\", {\n color: { type: \"float\" },\n });\n this.folder.addBinding(\n characterValues,\n \"specularIntensity\",\n characterOptions.specularIntensity,\n );\n this.folder.addBinding(characterValues, \"emissive\", {\n color: { type: \"float\" },\n });\n this.folder.addBinding(\n characterValues,\n \"emissiveIntensity\",\n characterOptions.emissiveIntensity,\n );\n this.folder.addBinding(characterValues, \"envMapIntensity\", characterOptions.envMapIntensity);\n this.folder.addBinding(characterValues, \"sheenColor\", {\n color: { type: \"float\" },\n });\n this.folder.addBinding(characterValues, \"sheen\", characterOptions.sheen);\n this.folder.addBinding(characterValues, \"clearcoat\", characterOptions.clearcoat);\n this.folder.addBinding(\n characterValues,\n \"clearcoatRoughness\",\n characterOptions.clearcoatRoughness,\n );\n }\n\n public setupChangeEvent(): void {\n this.folder.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"specularColor\": {\n const value = e.value as { r: number; g: number; b: number };\n characterValues.specularColor = {\n r: value.r,\n g: value.g,\n b: value.b,\n };\n break;\n }\n case \"emissive\": {\n const value = e.value as { r: number; g: number; b: number };\n characterValues.emissive = {\n r: value.r,\n g: value.g,\n b: value.b,\n };\n break;\n }\n case \"sheenColor\": {\n const value = e.value as { r: number; g: number; b: number };\n characterValues.sheenColor = {\n r: value.r,\n g: value.g,\n b: value.b,\n };\n break;\n }\n default: {\n break;\n }\n }\n });\n }\n}\n", "export enum AnimationState {\n \"idle\" = 0,\n \"walking\" = 1,\n \"running\" = 2,\n \"jumpToAir\" = 3,\n \"air\" = 4,\n \"airToGround\" = 5,\n}\n\nexport type CharacterState = {\n id: number;\n position: {\n x: number;\n y: number;\n z: number;\n };\n rotation: {\n quaternionY: number;\n quaternionW: number;\n };\n state: AnimationState;\n};\n", "import {\n Camera,\n CircleGeometry,\n GLSL3,\n Mesh,\n Object3D,\n RawShaderMaterial,\n Scene,\n Vector3,\n} from \"three\";\n\nimport { ease } from \"../helpers/math-helpers\";\n\nexport class CharacterSpeakingIndicator {\n private vertexShader = /* glsl */ `\n in vec3 position;\n in vec2 uv;\n uniform mat4 modelViewMatrix;\n uniform mat4 projectionMatrix;\n out vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }`;\n\n private fragmentShader = /* glsl */ `\n precision highp float;\n\n uniform float time;\n uniform float alpha;\n in vec2 vUv;\n out vec4 fragColor;\n\n const float size = 1.7;\n const float distribution = 0.03;\n const float speed = 0.2;\n const float overdraw = 3.5;\n const float shapeK = 0.25;\n\n float sdHyperbola(vec2 p, float k, float wi) {\n p = abs(p);\n float k2 = k * k;\n float a = p.x + p.y;\n float i = 0.5 * (a - k2 / a) > wi ? -1.0 : 1.0;\n float x = clamp(0.5 * (a - k2 / a), 0.0, wi);\n vec2 q = vec2(x, sqrt(x * x + k2));\n float s = sign(p.x * p.x - p.y * p.y + k2);\n return s * length(p - q);\n }\n\n void main(void) {\n vec2 uv = (vUv * 2.0 - 1.0);\n float r = -(uv.x * uv.x + uv.y * uv.y);\n float z = 0.5 + 0.5 * sin((r + time * speed) / distribution);\n float a = clamp(smoothstep(-0.1, 0.2, size - length(uv * 2.0)), 0.0, 0.5);\n float h = clamp(sdHyperbola(uv, shapeK, 1.0), 0.0, 1.0) * overdraw;\n float fragAlpha = clamp(a * h, 0.0, 0.7);\n fragColor = vec4(z * fragAlpha) * alpha;\n }`;\n\n private uniforms = {\n time: { value: 0.0 },\n alpha: { value: 0.0 },\n };\n\n private geometry: CircleGeometry = new CircleGeometry(0.35, 21);\n private material: RawShaderMaterial = new RawShaderMaterial({\n vertexShader: this.vertexShader,\n fragmentShader: this.fragmentShader,\n uniforms: this.uniforms,\n transparent: true,\n glslVersion: GLSL3,\n });\n private mesh = new Mesh(this.geometry, this.material);\n\n private currentAlpha = 0.0;\n private targetAlpha = 0.0;\n\n constructor(private scene: Scene | Object3D) {\n this.scene.add(this.mesh);\n }\n\n public setBillboarding(position: Vector3, camera: Camera) {\n this.mesh.position.set(position.x, position.y - 0.15, position.z);\n this.mesh.lookAt(camera.position);\n }\n\n public setTime(value: number) {\n this.currentAlpha += ease(this.targetAlpha, this.currentAlpha, 0.06);\n this.uniforms.time.value = value;\n this.uniforms.alpha.value = this.currentAlpha;\n }\n\n public setSpeaking(value: boolean) {\n this.targetAlpha = value === true ? 1.0 : 0.0;\n }\n\n public dispose() {\n this.scene.remove(this.mesh);\n this.mesh.material.dispose();\n this.mesh.geometry.dispose();\n }\n}\n", "import {\n Camera,\n Color,\n FrontSide,\n LinearFilter,\n Mesh,\n MeshBasicMaterial,\n Object3D,\n PlaneGeometry,\n} from \"three\";\n\nimport { THREECanvasTextTexture } from \"./CanvasText\";\n\nenum LabelAlignment {\n left = \"left\",\n center = \"center\",\n right = \"right\",\n}\n\nconst fontScale = 5;\nconst defaultLabelColor = new Color(0x000000);\nconst defaultFontColor = new Color(0xffffff);\nconst defaultLabelAlignment = LabelAlignment.center;\nconst defaultLabelFontSize = 9;\nconst defaultLabelPadding = 0;\nconst defaultLabelWidth = 0.25;\nconst defaultLabelHeight = 0.125;\nconst defaultLabelCastShadows = true;\n\nexport class CharacterTooltip {\n private geometry: PlaneGeometry;\n private material: MeshBasicMaterial;\n private mesh: Mesh<PlaneGeometry, MeshBasicMaterial>;\n\n private visibleOpacity: number = 0.85;\n private targetOpacity: number = 0;\n private fadingSpeed: number = 0.02;\n private secondsToFadeOut: number = 15;\n\n private props = {\n content: \"\",\n alignment: defaultLabelAlignment,\n width: defaultLabelWidth,\n height: defaultLabelHeight,\n fontSize: defaultLabelFontSize,\n padding: defaultLabelPadding,\n color: defaultLabelColor,\n fontColor: defaultFontColor,\n castShadows: defaultLabelCastShadows,\n };\n\n constructor(parentModel: Object3D) {\n this.setText = this.setText.bind(this);\n this.material = new MeshBasicMaterial({\n map: null,\n transparent: true,\n opacity: 0,\n });\n this.material.side = FrontSide;\n this.geometry = new PlaneGeometry(1, 1, 1, 1);\n this.mesh = new Mesh(this.geometry, this.material);\n this.mesh.position.set(0, 1.6, 0);\n this.mesh.visible = false;\n parentModel.add(this.mesh);\n }\n\n private redrawText(content: string) {\n if (!this.material) {\n return;\n }\n if (this.material.map) {\n this.material.map.dispose();\n }\n const { texture, width, height } = THREECanvasTextTexture(content, {\n bold: true,\n fontSize: this.props.fontSize * fontScale,\n paddingPx: this.props.padding,\n textColorRGB255A1: {\n r: this.props.fontColor.r * 255,\n g: this.props.fontColor.g * 255,\n b: this.props.fontColor.b * 255,\n a: 1.0,\n },\n backgroundColorRGB255A1: {\n r: this.props.color.r * 255,\n g: this.props.color.g * 255,\n b: this.props.color.b * 255,\n a: 1.0,\n },\n dimensions: {\n width: this.props.width * (100 * fontScale),\n height: this.props.height * (100 * fontScale),\n },\n alignment: this.props.alignment,\n });\n\n this.material.map = texture;\n this.material.map.magFilter = LinearFilter;\n this.material.map.minFilter = LinearFilter;\n this.material.needsUpdate = true;\n\n this.mesh.scale.x = width / (100 * fontScale);\n this.mesh.scale.y = height / (100 * fontScale);\n this.mesh.position.y = 1.6;\n }\n\n setText(text: string, temporary: boolean = false) {\n this.redrawText(text);\n this.mesh.visible = true;\n this.targetOpacity = this.visibleOpacity;\n if (temporary) {\n setTimeout(() => {\n this.hide();\n }, this.secondsToFadeOut * 1000);\n }\n }\n\n hide() {\n this.targetOpacity = 0;\n }\n\n update(camera: Camera) {\n this.mesh.lookAt(camera.position);\n const opacity = this.mesh.material.opacity;\n if (opacity < this.targetOpacity) {\n this.mesh.material.opacity = Math.min(\n this.mesh.material.opacity + this.fadingSpeed,\n this.targetOpacity,\n );\n } else if (opacity > this.targetOpacity) {\n this.mesh.material.opacity = Math.max(\n this.mesh.material.opacity - this.fadingSpeed,\n this.targetOpacity,\n );\n if (opacity >= 1 && this.mesh.material.transparent === true) {\n this.mesh.material.transparent = false;\n this.mesh.material.needsUpdate = true;\n } else if (opacity > 0 && opacity < 1 && this.mesh.material.transparent === false) {\n this.mesh.material.transparent = true;\n this.mesh.material.needsUpdate = true;\n }\n if (this.mesh.material.opacity <= 0) {\n this.mesh.visible = false;\n }\n }\n }\n}\n", "import { Texture, LinearFilter, RGBAFormat, MeshBasicMaterial } from \"three\";\n\ntype RGBA = {\n r: number;\n g: number;\n b: number;\n a: number;\n};\n\ntype CanvasTextOptions = {\n fontSize: number;\n textColorRGB255A1: RGBA;\n backgroundColorRGB255A1?: RGBA;\n font?: string;\n bold?: boolean;\n paddingPx?: number;\n alignment?: string;\n dimensions?: {\n width: number;\n height: number;\n };\n};\n\nfunction getTextAlignOffset(textAlign: CanvasTextAlign, width: number) {\n switch (textAlign) {\n case \"center\":\n return width / 2;\n case \"right\":\n return width;\n default:\n return 0;\n }\n}\n\nfunction printAtWordWrap(\n context: CanvasRenderingContext2D,\n fullText: string,\n x: number,\n y: number,\n lineHeight: number,\n fitWidth: number,\n padding: number,\n alignment: string,\n) {\n const lines = fullText.split(\"\\n\");\n let currentLine = 0;\n for (const text of lines) {\n fitWidth = fitWidth || 0;\n\n if (fitWidth <= 0) {\n context.fillText(text, x, y + lineHeight * currentLine);\n currentLine++;\n continue;\n }\n let words = text.split(\" \");\n let lastWordIndex = 1;\n while (words.length > 0 && lastWordIndex <= words.length) {\n const str = words.slice(0, lastWordIndex).join(\" \");\n const textWidth = context.measureText(str).width;\n if (textWidth + padding * 2 > fitWidth) {\n if (lastWordIndex === 1) {\n lastWordIndex = 2;\n }\n context.fillText(\n words.slice(0, lastWordIndex - 1).join(\" \"),\n x + padding,\n y + lineHeight * currentLine + padding,\n );\n currentLine++;\n words = words.splice(lastWordIndex - 1);\n lastWordIndex = 1;\n } else {\n lastWordIndex++;\n }\n }\n if (lastWordIndex > 0 && words.length > 0) {\n const xOffset = alignment === \"center\" ? 0 : padding;\n context.fillText(words.join(\" \"), x + xOffset, y + lineHeight * currentLine + padding);\n currentLine++;\n }\n }\n}\n\nexport function CanvasText(message: string, options: CanvasTextOptions): HTMLCanvasElement {\n const fontsize = options.fontSize;\n const textColor = options.textColorRGB255A1;\n const backgroundColor = options.backgroundColorRGB255A1 || { r: 255, g: 255, b: 255, a: 1 };\n const padding = options.paddingPx || 0;\n const font = options.font || \"Arial\";\n const fontString = (options.bold ? \"bold \" : \"\") + fontsize + \"px \" + font;\n\n const canvas = document.createElement(\"canvas\");\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const ct = canvas.getContext(\"2d\")!;\n\n // calculate text alignment offset\n const textAlign = (options.alignment as CanvasTextAlign) ?? \"left\";\n\n if (options.dimensions) {\n // NOTE: setting the canvas dimensions resets the context properties, so\n // we always do it first\n canvas.width = options.dimensions.width;\n canvas.height = options.dimensions.height;\n ct.clearRect(0, 0, canvas.width, canvas.height);\n ct.font = fontString;\n ct.textAlign = textAlign;\n ct.fillStyle = `rgba(${backgroundColor.r}, ${backgroundColor.g}, ${backgroundColor.b}, ${backgroundColor.a})`;\n ct.lineWidth = 0;\n ct.fillRect(0, 0, canvas.width, canvas.height);\n ct.fillStyle = `rgba(${textColor.r}, ${textColor.g}, ${textColor.b}, ${textColor.a})`;\n ct.font = fontString;\n printAtWordWrap(\n ct,\n message,\n getTextAlignOffset(textAlign, canvas.width),\n fontsize,\n fontsize,\n canvas.width,\n padding,\n textAlign,\n );\n } else {\n // NOTE: setting the canvas dimensions resets the context properties, so\n // we always do it first. However, we also need to take into account the\n // font size to measure the text in the first place.\n ct.font = fontString;\n const metrics = ct.measureText(message);\n const textWidth = metrics.width;\n const textHeight = metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent;\n canvas.width = textWidth + padding * 2;\n canvas.height = textHeight + padding;\n ct.clearRect(0, 0, canvas.width, canvas.height);\n ct.font = fontString;\n ct.textAlign = textAlign;\n ct.fillStyle = `rgba(${backgroundColor.r}, ${backgroundColor.g}, ${backgroundColor.b}, ${backgroundColor.a})`;\n ct.lineWidth = 0;\n ct.fillRect(0, 0, canvas.width, canvas.height);\n ct.fillStyle = `rgba(${textColor.r}, ${textColor.g}, ${textColor.b}, ${textColor.a})`;\n ct.font = fontString;\n ct.fillText(message, padding + getTextAlignOffset(textAlign, textWidth), textHeight);\n }\n\n return canvas;\n}\n\nexport function THREECanvasTextTexture(\n text: string,\n options: CanvasTextOptions,\n): { texture: Texture; width: number; height: number } {\n const canvas = CanvasText(text, options);\n\n const texture = new Texture(canvas);\n texture.minFilter = LinearFilter;\n texture.magFilter = LinearFilter;\n texture.format = RGBAFormat;\n texture.needsUpdate = true;\n\n return { texture, width: canvas.width, height: canvas.height };\n}\n\nexport function THREECanvasTextMaterial(\n text: string,\n options: CanvasTextOptions,\n): { material: MeshBasicMaterial; width: number; height: number } {\n const { texture, width, height } = THREECanvasTextTexture(text, options);\n\n const material = new MeshBasicMaterial();\n material.map = texture;\n material.transparent = true;\n material.depthWrite = false;\n material.needsUpdate = true;\n\n return { material, width, height };\n}\n", "import { 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 = 70;\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 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\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 this.networkState = {\n id: this.id,\n position: { x: 0, y: 0, z: 0 },\n rotation: { quaternionY: 0, quaternionW: 1 },\n state: AnimationState.idle,\n };\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 computeAngularDifference(rotationQuaternion: Quaternion): number {\n if (!this.model?.mesh) return 0;\n return 2 * Math.acos(Math.abs(this.model.mesh.quaternion.dot(rotationQuaternion)));\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 const angularDifference = this.computeAngularDifference(rotationQuaternion);\n const desiredTime = 0.07;\n const angularSpeed = angularDifference / desiredTime;\n const frameRotation = angularSpeed * this.timeManager.deltaTime;\n this.model.mesh.quaternion.rotateTowards(rotationQuaternion, frameRotation);\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 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.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.collisionsManager.applyColliders(this.tempSegment, this.capsuleInfo.radius!);\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) {\n this.networkState = {\n id: this.id,\n position: new Vector3(),\n rotation: { quaternionY: 0, quaternionW: 1 },\n state: AnimationState.idle as AnimationState,\n };\n } else {\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\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, Euler, Group, Object3D, PerspectiveCamera, Quaternion, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { ease, getSpawnPositionInsideCircle, toArray } from \"../helpers/math-helpers\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { Composer } from \"../rendering/composer\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { Character, CharacterDescription } from \"./Character\";\nimport { CharacterModelLoader } from \"./CharacterModelLoader\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\nimport { RemoteController } from \"./RemoteController\";\n\nfunction encodeCharacterAndCamera(character: Object3D, camera: PerspectiveCamera): string {\n return [\n ...toArray(character.position),\n ...toArray(character.quaternion),\n ...toArray(camera.position),\n ...toArray(camera.quaternion),\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 private id: number = 0;\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 private speakingCharacters: Map<number, boolean> = new Map();\n\n public readonly group: Group;\n\n constructor(\n private readonly composer: Composer,\n private readonly characterModelLoader: CharacterModelLoader,\n private readonly collisionsManager: CollisionsManager,\n private readonly cameraManager: CameraManager,\n private readonly timeManager: TimeManager,\n private readonly inputManager: KeyInputManager,\n private readonly clientStates: Map<number, CharacterState>,\n private readonly sendUpdate: (update: CharacterState) => void,\n ) {\n this.group = new Group();\n }\n\n /* 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 spawnRotation: Euler = new Euler(),\n ) {\n this.characterDescription = characterDescription;\n const characterLoadingPromise = new Promise<Character>((resolve) => {\n const character = new Character(\n characterDescription,\n this.characterModelLoader,\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 = spawnPosition || getSpawnPositionInsideCircle(3, 30, id, 0.4);\n character.model!.mesh!.position.set(spawnPosition.x, spawnPosition.y, spawnPosition.z);\n character.model!.mesh!.rotation.set(spawnRotation.x, spawnRotation.y, spawnRotation.z);\n character.position.set(spawnPosition.x, spawnPosition.y, spawnPosition.z);\n character.model!.mesh!.updateMatrixWorld();\n const quaternion = new Quaternion().setFromEuler(character.model!.mesh!.rotation);\n this.sendUpdate({\n id: id,\n position: {\n x: spawnPosition.x,\n y: spawnPosition.y,\n z: spawnPosition.z,\n },\n rotation: { quaternionY: quaternion.y, quaternionW: quaternion.w },\n state: AnimationState.idle,\n });\n }\n 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.id = id;\n this.character = character;\n this.character.tooltip?.setText(`${id}`);\n } else {\n this.remoteCharacters.set(id, character);\n const remoteController = new RemoteController(character, this.characterModelLoader, 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 character.tooltip?.setText(`${id}`);\n }\n resolve(character);\n },\n this.collisionsManager,\n this.inputManager,\n this.cameraManager,\n this.timeManager,\n this.composer,\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 setSpeakingCharacter(id: number, value: boolean) {\n this.speakingCharacters.set(id, value);\n }\n\n public update() {\n if (this.character) {\n this.character.update(this.timeManager.time);\n if (this.speakingCharacters.has(this.id)) {\n this.character.speakingIndicator?.setSpeaking(this.speakingCharacters.get(this.id)!);\n }\n\n if (this.character.model?.mesh) {\n this.cameraOffsetTarget = this.cameraManager.targetDistance <= 0.4 ? 0.13 : 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 if (this.remoteCharacters.has(id) && this.speakingCharacters.has(id)) {\n const character = this.remoteCharacters.get(id);\n character?.speakingIndicator?.setSpeaking(this.speakingCharacters.get(id)!);\n }\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 character.speakingIndicator?.dispose();\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 { CharacterModelLoader } from \"./CharacterModelLoader\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\n\nexport class RemoteController {\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\n constructor(\n public readonly character: Character,\n private readonly characterModelLoader: CharacterModelLoader,\n public readonly id: number,\n ) {\n this.characterModel = this.character.model!.mesh!;\n this.characterModel.updateMatrixWorld();\n this.animationMixer = new AnimationMixer(this.characterModel);\n this.networkState = {\n id: this.id,\n position: { x: 0, y: 0, z: 0 },\n rotation: { quaternionY: 0, quaternionW: 1 },\n state: this.currentAnimation as AnimationState,\n };\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.characterModelLoader.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", "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 CharacterModelLoader {\n private static instance: CharacterModelLoader | 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(): CharacterModelLoader {\n if (!CharacterModelLoader.instance) {\n CharacterModelLoader.instance = new CharacterModelLoader();\n }\n return CharacterModelLoader.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 = CharacterModelLoader.getInstance();\nexport default MODEL_LOADER;\n", "import { EventHandlerCollection } from \"./EventHandlerCollection\";\n\nenum Key {\n W = \"w\",\n A = \"a\",\n S = \"s\",\n D = \"d\",\n SHIFT = \"shift\",\n SPACE = \" \",\n}\n\nexport class KeyInputManager {\n private keys = new Map<string, boolean>();\n private eventHandlerCollection = new EventHandlerCollection();\n\n constructor(private shouldCaptureKeyPress: () => boolean = () => true) {\n this.eventHandlerCollection.add(document, \"keydown\", this.onKeyDown.bind(this));\n this.eventHandlerCollection.add(document, \"keyup\", this.onKeyUp.bind(this));\n this.eventHandlerCollection.add(window, \"blur\", this.handleUnfocus.bind(this));\n }\n\n private handleUnfocus(_event: FocusEvent): void {\n this.keys.clear();\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n if (this.shouldCaptureKeyPress()) {\n if (event.key.length === 2 && event.key[0] === \"F\") {\n // Ignore all Function keys\n return;\n }\n if (event.metaKey) {\n // Ignore all meta keys (e.g. Alt, Cmd)\n return;\n }\n this.keys.set(event.key.toLowerCase(), true);\n event.preventDefault();\n }\n }\n\n private onKeyUp(event: KeyboardEvent): void {\n this.keys.set(event.key.toLowerCase(), false);\n }\n\n public isKeyPressed(key: string): boolean {\n return this.keys.get(key) || false;\n }\n\n public isMovementKeyPressed(): boolean {\n return [Key.W, Key.A, Key.S, Key.D].some((key) => this.isKeyPressed(key));\n }\n\n get forward(): boolean {\n return this.isKeyPressed(Key.W);\n }\n\n get backward(): boolean {\n return this.isKeyPressed(Key.S);\n }\n\n get left(): boolean {\n return this.isKeyPressed(Key.A);\n }\n\n get right(): boolean {\n return this.isKeyPressed(Key.D);\n }\n\n get run(): boolean {\n return this.isKeyPressed(Key.SHIFT);\n }\n\n get jump(): boolean {\n return this.isKeyPressed(Key.SPACE);\n }\n\n get anyDirection(): boolean {\n return this.isMovementKeyPressed();\n }\n\n get conflictingDirection(): boolean {\n return (\n (this.isKeyPressed(Key.W) && this.isKeyPressed(Key.S)) ||\n (this.isKeyPressed(Key.A) && this.isKeyPressed(Key.D))\n );\n }\n\n public dispose() {\n this.eventHandlerCollection.clear();\n }\n}\n", "import {\n IMMLScene,\n Interaction,\n InteractionListener,\n InteractionManager,\n MElement,\n MMLClickTrigger,\n PositionAndRotation,\n PromptManager,\n PromptProps,\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\n public readonly mmlScene: IMMLScene;\n private readonly promptManager: PromptManager;\n private readonly interactionManager: InteractionManager;\n private readonly interactionListener: InteractionListener;\n private readonly clickTrigger: MMLClickTrigger;\n\n constructor(\n targetElement: HTMLElement,\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 ) {\n this.group = new Group();\n this.promptManager = PromptManager.init(targetElement);\n\n const { interactionListener, interactionManager } = InteractionManager.init(\n targetElement,\n this.camera,\n this.scene,\n );\n this.interactionManager = interactionManager;\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\n this.clickTrigger = MMLClickTrigger.init(targetElement, this.mmlScene as IMMLScene);\n }\n\n dispose() {\n this.promptManager.dispose();\n this.clickTrigger.dispose();\n this.interactionManager.dispose();\n }\n}\n", "import * as EssentialsPlugin from \"@tweakpane/plugin-essentials\";\nimport {\n BloomEffect,\n EffectComposer,\n EffectPass,\n NormalPass,\n SSAOEffect,\n ToneMappingEffect,\n} from \"postprocessing\";\nimport { Scene, WebGLRenderer } from \"three\";\nimport { FolderApi, Pane } from \"tweakpane\";\n\nimport { BrightnessContrastSaturation } from \"../rendering/post-effects/bright-contrast-sat\";\nimport { GaussGrainEffect } from \"../rendering/post-effects/gauss-grain\";\nimport { Sun } from \"../sun/Sun\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { BrightnessContrastSaturationFolder } from \"./blades/bcsFolder\";\nimport { CharacterFolder } from \"./blades/characterFolder\";\nimport { EnvironmentFolder } from \"./blades/environmentFolder\";\nimport { PostExtrasFolder } from \"./blades/postExtrasFolder\";\nimport { RendererFolder, rendererValues } from \"./blades/rendererFolder\";\nimport { RendererStatsFolder } from \"./blades/rendererStatsFolder\";\nimport { SSAOFolder } from \"./blades/ssaoFolder\";\nimport { ToneMappingFolder } from \"./blades/toneMappingFolder\";\nimport { setTweakpaneActive } from \"./tweakPaneActivity\";\nimport { tweakPaneStyle } from \"./tweakPaneStyle\";\n\nexport class TweakPane {\n private gui: Pane = new Pane();\n\n private renderStatsFolder: RendererStatsFolder;\n private rendererFolder: RendererFolder;\n private toneMappingFolder: ToneMappingFolder;\n private ssaoFolder: SSAOFolder;\n private bcsFolder: BrightnessContrastSaturationFolder;\n private postExtrasFolder: PostExtrasFolder;\n // @ts-ignore\n private character: CharacterFolder;\n private environment: EnvironmentFolder;\n\n private export: FolderApi;\n\n private saveVisibilityInLocalStorage: boolean = true;\n public guiVisible: boolean = false;\n\n constructor(\n private renderer: WebGLRenderer,\n private scene: Scene,\n private composer: EffectComposer,\n ) {\n this.gui.registerPlugin(EssentialsPlugin);\n\n if (this.saveVisibilityInLocalStorage) {\n const localStorageGuiVisible = localStorage.getItem(\"guiVisible\");\n if (localStorageGuiVisible !== null) {\n if (localStorageGuiVisible === \"true\") {\n this.guiVisible = true;\n } else if (localStorageGuiVisible === \"false\") {\n this.guiVisible = false;\n }\n }\n }\n\n const styleElement = document.createElement(\"style\");\n styleElement.type = \"text/css\";\n styleElement.appendChild(document.createTextNode(tweakPaneStyle));\n document.head.appendChild(styleElement);\n\n this.renderStatsFolder = new RendererStatsFolder(this.gui, true);\n this.rendererFolder = new RendererFolder(this.gui, false);\n this.toneMappingFolder = new ToneMappingFolder(this.gui, false);\n this.ssaoFolder = new SSAOFolder(this.gui, false);\n this.bcsFolder = new BrightnessContrastSaturationFolder(this.gui, false);\n this.postExtrasFolder = new PostExtrasFolder(this.gui, false);\n this.character = new CharacterFolder(this.gui, false);\n this.environment = new EnvironmentFolder(this.gui, false);\n\n this.toneMappingFolder.folder.hidden = rendererValues.toneMapping === 5 ? false : true;\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 composer: EffectComposer,\n normalPass: NormalPass,\n ppssaoEffect: SSAOEffect,\n ppssaoPass: EffectPass,\n n8aopass: any,\n toneMappingEffect: ToneMappingEffect,\n toneMappingPass: EffectPass,\n brightnessContrastSaturation: typeof BrightnessContrastSaturation,\n bloomEffect: BloomEffect,\n gaussGrainEffect: typeof GaussGrainEffect,\n hasLighting: boolean,\n sun: Sun | null,\n setHDR: () => void,\n setAmbientLight: () => void,\n setFog: () => void,\n ): void {\n // RenderOptions\n this.rendererFolder.setupChangeEvent(\n this.scene,\n this.renderer,\n this.toneMappingFolder.folder,\n toneMappingPass,\n );\n\n this.toneMappingFolder.setupChangeEvent(toneMappingEffect);\n this.ssaoFolder.setupChangeEvent(composer, normalPass, ppssaoEffect, ppssaoPass, n8aopass);\n this.bcsFolder.setupChangeEvent(brightnessContrastSaturation);\n this.postExtrasFolder.setupChangeEvent(bloomEffect, gaussGrainEffect);\n this.environment.setupChangeEvent(setHDR, setAmbientLight, setFog, sun);\n this.environment.folder.hidden = hasLighting === false || sun === null;\n\n const exportButton = this.export.addButton({ title: \"export\" });\n exportButton.on(\"click\", () => {\n this.downloadSettingsAsJSON(this.gui.exportState());\n });\n const importButton = this.export.addButton({ title: \"import\" });\n importButton.on(\"click\", () => {\n this.importSettingsFromJSON((settings) => {\n this.gui.importState(settings);\n });\n });\n }\n\n public updateStats(timeManager: TimeManager): void {\n this.renderStatsFolder.update(this.renderer, this.composer, timeManager);\n }\n\n private formatDateForFilename(): string {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\"); // Months are 0-11\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${year}-${month}-${day} ${hours}-${minutes}-${seconds}`;\n }\n\n private downloadSettingsAsJSON(settings: any): void {\n const jsonString = JSON.stringify(settings, null, 2);\n const blob = new Blob([jsonString], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.download = `settings ${this.formatDateForFilename()}.json`;\n a.href = url;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n private importSettingsFromJSON(callback: (settings: any) => void): void {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \".json\";\n input.addEventListener(\"change\", (event) => {\n const file = (event.target as HTMLInputElement).files?.[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (loadEvent) => {\n try {\n const settings = JSON.parse(loadEvent.target?.result as string);\n callback(settings);\n } catch (err) {\n console.error(\"Error parsing JSON:\", err);\n }\n };\n reader.readAsText(file);\n }\n });\n input.click();\n }\n\n private toggleGUI(): void {\n 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 { BladeController, View } from \"@tweakpane/core\";\nimport { BladeApi, FolderApi, TpChangeEvent } from \"tweakpane\";\n\nimport { BrightnessContrastSaturation } from \"../../rendering/post-effects/bright-contrast-sat\";\n\nexport const bcsValues = {\n brightness: 0,\n contrast: 1.25,\n saturation: 1,\n};\n\nconst bcsOptions = {\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};\n\nexport class BrightnessContrastSaturationFolder {\n private folder: FolderApi;\n constructor(parentFolder: FolderApi, expand: boolean = false) {\n this.folder = parentFolder.addFolder({\n title: \"brightness / contrast / sat\",\n expanded: expand,\n });\n this.folder.addBinding(bcsValues, \"brightness\", bcsOptions.brightness.amount);\n this.folder.addBinding(bcsValues, \"contrast\", bcsOptions.contrast.amount);\n this.folder.addBinding(bcsValues, \"saturation\", bcsOptions.saturation.amount);\n }\n\n public setupChangeEvent(brightnessContrastSaturation: typeof BrightnessContrastSaturation): void {\n this.folder.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"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 }\n });\n }\n}\n", "import { BladeController, View } from \"@tweakpane/core\";\nimport { BladeApi, ButtonApi, FolderApi, TpChangeEvent } from \"tweakpane\";\n\nimport { Sun } from \"../../sun/Sun\";\n\nexport const sunValues = {\n sunPosition: {\n sunAzimuthalAngle: 39,\n sunPolarAngle: 50,\n },\n sunIntensity: 0.5,\n sunColor: { r: 1.0, g: 0.74, b: 0.5 },\n};\n\nconst sunOptions = {\n sunPosition: {\n sunAzimuthalAngle: { min: 0, max: 360, step: 1 },\n sunPolarAngle: { min: -90, max: 90, step: 1 },\n },\n sunIntensity: { min: 0, max: 1, step: 0.05 },\n};\n\nexport const envValues = {\n ambientLight: {\n ambientLightIntensity: 0.0,\n ambientLightColor: { r: 1, g: 1, b: 1 },\n },\n fog: {\n fogNear: 30,\n fogFar: 210,\n fogColor: { r: 0.42, g: 0.48, b: 0.59 },\n },\n};\n\nconst envOptions = {\n ambientLight: {\n ambientLightIntensity: { min: 0, max: 1, step: 0.01 },\n },\n fog: {\n fogNear: { min: 0, max: 80, step: 1 },\n fogFar: { min: 81, max: 300, step: 1 },\n },\n};\n\nexport class EnvironmentFolder {\n public folder: FolderApi;\n private sun: FolderApi;\n private sunButton: ButtonApi;\n private ambient: FolderApi;\n\n constructor(parentFolder: FolderApi, expand: boolean = false) {\n this.folder = parentFolder.addFolder({ title: \"environment\", expanded: expand });\n\n this.sun = this.folder.addFolder({ title: \"sun\", expanded: true });\n\n this.ambient = this.folder.addFolder({ title: \"ambient\", expanded: true });\n\n this.sun.addBinding(\n sunValues.sunPosition,\n \"sunAzimuthalAngle\",\n sunOptions.sunPosition.sunAzimuthalAngle,\n );\n this.sun.addBinding(\n sunValues.sunPosition,\n \"sunPolarAngle\",\n sunOptions.sunPosition.sunPolarAngle,\n );\n this.sun.addBinding(sunValues, \"sunIntensity\", sunOptions.sunIntensity);\n this.sun.addBinding(sunValues, \"sunColor\", {\n color: { type: \"float\" },\n });\n this.sunButton = this.sun.addButton({ title: \"Set HDRI\" });\n\n this.ambient.addBinding(\n envValues.ambientLight,\n \"ambientLightIntensity\",\n envOptions.ambientLight.ambientLightIntensity,\n );\n this.ambient.addBinding(envValues.ambientLight, \"ambientLightColor\", {\n color: { type: \"float\" },\n });\n this.ambient.addBinding(envValues.fog, \"fogNear\", envOptions.fog.fogNear);\n this.ambient.addBinding(envValues.fog, \"fogFar\", envOptions.fog.fogFar);\n this.ambient.addBinding(envValues.fog, \"fogColor\", {\n color: { type: \"float\" },\n });\n }\n\n public setupChangeEvent(\n setHDR: () => void,\n setAmbientLight: () => void,\n setFog: () => void,\n sun: Sun | null,\n ): void {\n this.sun.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"sunAzimuthalAngle\": {\n const value = e.value as number;\n sun?.setAzimuthalAngle(value * (Math.PI / 180));\n break;\n }\n case \"sunPolarAngle\": {\n const value = e.value as number;\n sun?.setPolarAngle(value * (Math.PI / 180));\n break;\n }\n case \"sunIntensity\": {\n const value = e.value as number;\n sun?.setIntensity(value);\n break;\n }\n case \"sunColor\": {\n const value = e.value as { r: number; g: number; b: number };\n sunValues.sunColor = {\n r: value.r,\n g: value.g,\n b: value.b,\n };\n sun?.setColor();\n break;\n }\n default:\n break;\n }\n });\n this.sunButton.on(\"click\", () => {\n setHDR();\n });\n this.ambient.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"ambientLightIntensity\": {\n envValues.ambientLight.ambientLightIntensity = e.value as number;\n setAmbientLight();\n break;\n }\n case \"ambientLightColor\": {\n const value = e.value as { r: number; g: number; b: number };\n envValues.ambientLight.ambientLightColor = {\n r: value.r,\n g: value.g,\n b: value.b,\n };\n setAmbientLight();\n break;\n }\n case \"fogNear\": {\n envValues.fog.fogNear = e.value as number;\n setFog();\n break;\n }\n case \"fogFar\": {\n envValues.fog.fogFar = e.value as number;\n setFog();\n break;\n }\n case \"fogColor\": {\n const value = e.value as { r: number; g: number; b: number };\n envValues.fog.fogColor = {\n r: value.r,\n g: value.g,\n b: value.b,\n };\n setFog();\n break;\n }\n default:\n break;\n }\n });\n }\n}\n", "import { BladeController, View } from \"@tweakpane/core\";\nimport { BloomEffect } from \"postprocessing\";\nimport { BladeApi, FolderApi, TpChangeEvent } from \"tweakpane\";\n\nimport { GaussGrainEffect } from \"../../rendering/post-effects/gauss-grain\";\n\nexport const extrasValues = {\n grain: 0.055,\n bloom: 0.25,\n};\n\nconst extrasOptions = {\n grain: {\n amount: { min: 0, max: 0.2, step: 0.002 },\n },\n bloom: {\n amount: { min: 0, max: 2, step: 0.05 },\n },\n};\n\nexport class PostExtrasFolder {\n private folder: FolderApi;\n constructor(parentFolder: FolderApi, expand: boolean = false) {\n this.folder = parentFolder.addFolder({ title: \"bloom / grain\", expanded: expand });\n this.folder.addBinding(extrasValues, \"bloom\", extrasOptions.bloom.amount);\n this.folder.addBinding(extrasValues, \"grain\", extrasOptions.grain.amount);\n }\n\n public setupChangeEvent(\n bloomEffect: BloomEffect,\n gaussGrainEffect: typeof GaussGrainEffect,\n ): void {\n this.folder.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"bloom\":\n bloomEffect.intensity = e.value as number;\n break;\n case \"grain\":\n gaussGrainEffect.uniforms.amount.value = e.value as number;\n break;\n default:\n break;\n }\n });\n }\n}\n", "import { BladeController, View } from \"@tweakpane/core\";\nimport { EffectPass } from \"postprocessing\";\nimport { Scene, ShadowMapType, ToneMapping, WebGLRenderer } from \"three\";\nimport { BladeApi, FolderApi, TpChangeEvent } from \"tweakpane\";\n\nexport const rendererValues = {\n shadowMap: 2,\n toneMapping: 5,\n exposure: 1,\n bgIntensity: 0.45,\n bgBlurriness: 0.0,\n};\n\nconst rendererOptions = {\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.3, step: 0.01 },\n bgBlurriness: { min: 0, max: 0.1, step: 0.001 },\n};\n\nconst shadowMapTypes: Record<number, string> = {\n 0: \"BasicShadowMap\",\n 1: \"PCFShadowMap\",\n 2: \"PCFSoftShadowMap\",\n};\n\nconst toneMappingTypes: Record<number, string> = {\n 0: \"NoToneMapping\",\n 1: \"LinearToneMapping\",\n 2: \"ReinhardToneMapping\",\n 3: \"CineonToneMapping\",\n 4: \"ACESFilmicToneMapping\",\n 5: \"CustomToneMapping\",\n};\n\nconst monitoredValues = {\n shadowMapType: shadowMapTypes[rendererValues.shadowMap],\n toneMappingType: toneMappingTypes[rendererValues.toneMapping],\n};\n\nconst setShadowMapType = (value: number): void => {\n monitoredValues.shadowMapType = shadowMapTypes[value];\n};\n\nconst setToneMappingType = (value: number): void => {\n monitoredValues.toneMappingType = toneMappingTypes[value];\n};\n\nexport class RendererFolder {\n private folder: FolderApi;\n\n constructor(parentFolder: FolderApi, expand: boolean = false) {\n this.folder = parentFolder.addFolder({\n title: \"rendererOptions\",\n expanded: expand,\n });\n\n this.folder.addBinding(rendererValues, \"shadowMap\", rendererOptions.shadowMap);\n this.folder.addBinding(monitoredValues, \"shadowMapType\", { readonly: true });\n this.folder.addBinding(rendererValues, \"toneMapping\", rendererOptions.toneMapping);\n this.folder.addBinding(monitoredValues, \"toneMappingType\", { readonly: true });\n this.folder.addBinding(rendererValues, \"exposure\", rendererOptions.exposure);\n this.folder.addBinding(rendererValues, \"bgIntensity\", rendererOptions.bgIntensity);\n this.folder.addBinding(rendererValues, \"bgBlurriness\", rendererOptions.bgBlurriness);\n }\n\n public setupChangeEvent(\n scene: Scene,\n renderer: WebGLRenderer,\n toneMappingFolder: FolderApi,\n toneMappingPass: EffectPass,\n ): void {\n this.folder.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"shadowMap\": {\n const value = e.value as ShadowMapType;\n renderer.shadowMap.type = value;\n setShadowMapType(value);\n break;\n }\n case \"toneMapping\":\n renderer.toneMapping = e.value as ToneMapping;\n toneMappingFolder.hidden = e.value !== 5;\n toneMappingPass.enabled = e.value === 5 ? true : false;\n setToneMappingType(e.value as ToneMapping);\n break;\n case \"exposure\":\n renderer.toneMappingExposure = e.value as number;\n break;\n case \"bgIntensity\":\n scene.backgroundIntensity = e.value as number;\n break;\n case \"bgBlurriness\":\n scene.backgroundBlurriness = e.value as number;\n break;\n default:\n break;\n }\n });\n }\n}\n", "import { EffectComposer } from \"postprocessing\";\nimport { WebGLRenderer } from \"three\";\nimport { FolderApi } from \"tweakpane\";\n\nimport { TimeManager } from \"../../time/TimeManager\";\n\ntype StatsData = {\n triangles: string;\n geometries: string;\n textures: string;\n shaders: string;\n postPasses: string;\n drawCalls: string;\n rawDeltaTime: string;\n deltaTime: string;\n FPS: string;\n};\n\nexport class RendererStatsFolder {\n private folder: FolderApi;\n private performance: FolderApi;\n private defails: FolderApi;\n\n private statsData: 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\n constructor(parentFolder: FolderApi, expanded: boolean = true) {\n this.folder = parentFolder.addFolder({ title: \"renderStats\", expanded: expanded });\n this.performance = this.folder.addFolder({ title: \"performance\", expanded: true });\n this.defails = this.folder.addFolder({ title: \"pipeline details\", expanded: false });\n this.folder.addBlade({ view: \"separator\" });\n\n this.performance.addBinding(this.statsData, \"FPS\", { readonly: true });\n this.performance.addBinding(this.statsData, \"deltaTime\", { readonly: true });\n this.performance.addBinding(this.statsData, \"rawDeltaTime\", { readonly: true });\n\n this.defails.addBinding(this.statsData, \"triangles\", { readonly: true });\n this.defails.addBinding(this.statsData, \"geometries\", { readonly: true });\n this.defails.addBinding(this.statsData, \"textures\", { readonly: true });\n this.defails.addBinding(this.statsData, \"shaders\", { readonly: true });\n this.defails.addBinding(this.statsData, \"postPasses\", { readonly: true });\n this.defails.addBinding(this.statsData, \"drawCalls\", { readonly: true });\n }\n\n public update(renderer: WebGLRenderer, composer: EffectComposer, timeManager: TimeManager): void {\n const { geometries, textures } = renderer.info.memory;\n const { triangles, calls } = renderer.info.render;\n this.statsData.triangles = triangles.toString();\n this.statsData.geometries = geometries.toString();\n this.statsData.textures = textures.toString();\n this.statsData.shaders = renderer.info.programs!.length.toString();\n this.statsData.postPasses = composer.passes.length.toString();\n this.statsData.drawCalls = calls.toString();\n this.statsData.rawDeltaTime = (\n Math.round(timeManager.rawDeltaTime * 100000) / 100000\n ).toString();\n this.statsData.deltaTime = (Math.round(timeManager.deltaTime * 100000) / 100000).toString();\n this.statsData.FPS = timeManager.fps.toString();\n }\n}\n", "import { BindingApi, BladeApi, BladeController, TpChangeEvent, View } from \"@tweakpane/core\";\nimport { BlendFunction, EffectComposer, EffectPass, NormalPass, SSAOEffect } from \"postprocessing\";\nimport { Color } from \"three\";\nimport { FolderApi } from \"tweakpane\";\n\nexport const ppssaoValues = {\n enabled: false,\n blendFunction: BlendFunction.MULTIPLY,\n distanceScaling: true,\n depthAwareUpsampling: true,\n samples: 30,\n rings: 11,\n luminanceInfluence: 0.7,\n radius: 0.03,\n intensity: 2.5,\n bias: 0.05,\n fade: 0.03,\n resolutionScale: 0.5,\n color: { r: 0, g: 0, b: 0 },\n worldDistanceThreshold: 30,\n worldDistanceFalloff: 7,\n worldProximityThreshold: 0.5,\n worldProximityFalloff: 0.3,\n};\n\nconst ppssaoOptions = {\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\nexport const n8ssaoValues = {\n enabled: true,\n halfRes: false,\n aoRadius: 5,\n distanceFalloff: 3.0,\n intensity: 1.0,\n color: { r: 0, g: 0, b: 0 },\n aoSamples: 16,\n denoiseSamples: 4,\n denoiseRadius: 12,\n viewMode: \"Combined\",\n};\n\nconst n8ssaoOptions = {\n radius: { min: 0.1, max: 6, step: 0.1 },\n distanceFalloff: { min: 1, max: 6, step: 0.1 },\n intensity: { min: 0.1, max: 5, step: 0.1 },\n aoSamples: [2, 4, 8, 16, 32, 64],\n denoiseSamples: [2, 4, 8, 16, 32, 64],\n denoiseRadius: [3, 6, 12],\n viewMode: [\"Combined\", \"AO\", \"Split\", \"No AO\"],\n};\n\nconst ssaoMaterialParams = [\n \"fade\",\n \"bias\",\n \"minRadiusScale\",\n \"worldDistanceThreshold\",\n \"worldDistanceFalloff\",\n \"worldProximityThreshold\",\n \"worldProximityFalloff\",\n];\n\nexport class SSAOFolder {\n private folder: FolderApi;\n\n private ppssao: FolderApi;\n private n8ssao: FolderApi;\n\n private aoSamples: BindingApi;\n private denoiseSamples: BindingApi;\n private denoiseRadius: BindingApi;\n private aoDisplay: BindingApi;\n\n private postProcessingSSAOIndex: number = 1;\n\n constructor(parentFolder: FolderApi, expand: boolean = false) {\n this.folder = parentFolder.addFolder({ title: \"ambientOcclusion\", expanded: expand });\n this.n8ssao = this.folder.addFolder({\n title: \"N8 ambientOcclusion\",\n expanded: n8ssaoValues.enabled,\n });\n this.ppssao = this.folder.addFolder({\n title: \"PP ambientOcclusion\",\n expanded: ppssaoValues.enabled,\n });\n\n // Post-processing SSAO\n {\n this.ppssao.addBinding({ enabled: ppssaoValues.enabled }, \"enabled\");\n this.ppssao.addBinding({ showEffectOnly: false }, \"showEffectOnly\");\n this.ppssao.addBinding(ppssaoValues, \"samples\", ppssaoOptions.samples);\n this.ppssao.addBinding(ppssaoValues, \"rings\", ppssaoOptions.rings);\n this.ppssao.addBinding(ppssaoValues, \"luminanceInfluence\", ppssaoOptions.luminanceInfluence);\n this.ppssao.addBinding(ppssaoValues, \"radius\", ppssaoOptions.radius);\n this.ppssao.addBinding(ppssaoValues, \"intensity\", ppssaoOptions.intensity);\n this.ppssao.addBinding(ppssaoValues, \"bias\", ppssaoOptions.bias);\n this.ppssao.addBinding(ppssaoValues, \"fade\", ppssaoOptions.fade);\n this.ppssao.addBinding(ppssaoValues, \"resolutionScale\", ppssaoOptions.resolutionScale);\n this.ppssao.addBinding(\n ppssaoValues,\n \"worldDistanceThreshold\",\n ppssaoOptions.worldDistanceThreshold,\n );\n this.ppssao.addBinding(\n ppssaoValues,\n \"worldDistanceFalloff\",\n ppssaoOptions.worldDistanceFalloff,\n );\n this.ppssao.addBinding(\n ppssaoValues,\n \"worldProximityThreshold\",\n ppssaoOptions.worldProximityThreshold,\n );\n this.ppssao.addBinding(\n ppssaoValues,\n \"worldProximityFalloff\",\n ppssaoOptions.worldProximityFalloff,\n );\n this.ppssao.addBinding(ppssaoValues, \"color\", { color: { alpha: false, type: \"float\" } });\n }\n\n // N8 SSAO\n {\n this.n8ssao.addBinding({ enabled: n8ssaoValues.enabled }, \"enabled\");\n this.n8ssao.addBinding({ halfRes: n8ssaoValues.halfRes }, \"halfRes\");\n this.n8ssao.addBinding(n8ssaoValues, \"aoRadius\", n8ssaoOptions.radius);\n this.n8ssao.addBinding(n8ssaoValues, \"distanceFalloff\", n8ssaoOptions.distanceFalloff);\n this.n8ssao.addBinding(n8ssaoValues, \"intensity\", n8ssaoOptions.intensity);\n this.n8ssao.addBinding(n8ssaoValues, \"color\", { color: { alpha: false, type: \"float\" } });\n\n this.aoSamples = this.n8ssao.addBinding(n8ssaoValues, \"aoSamples\", {\n view: \"radiogrid\",\n groupName: \"aoSamples\",\n size: [3, 2],\n cells: (x: number, y: number) => ({\n title: `${n8ssaoOptions.aoSamples[y * 3 + x]}`,\n value: n8ssaoOptions.aoSamples[y * 3 + x],\n }),\n label: \"aoSamples\",\n });\n\n this.denoiseSamples = this.n8ssao.addBinding(n8ssaoValues, \"denoiseSamples\", {\n view: \"radiogrid\",\n groupName: \"denoiseSamples\",\n size: [3, 2],\n cells: (x: number, y: number) => ({\n title: `${n8ssaoOptions.denoiseSamples[y * 3 + x]}`,\n value: n8ssaoOptions.denoiseSamples[y * 3 + x],\n }),\n label: \"denoiseSamples\",\n });\n\n this.denoiseRadius = this.n8ssao.addBinding(n8ssaoValues, \"denoiseRadius\", {\n view: \"radiogrid\",\n groupName: \"denoiseRadius\",\n size: [3, 1],\n cells: (x: number, y: number) => ({\n title: `${n8ssaoOptions.denoiseRadius[y * 3 + x]}`,\n value: n8ssaoOptions.denoiseRadius[y * 3 + x],\n }),\n label: \"denoiseRadius\",\n });\n\n this.aoDisplay = this.n8ssao.addBinding(n8ssaoValues, \"viewMode\", {\n view: \"radiogrid\",\n groupName: \"viewMode\",\n size: [2, 2],\n cells: (x: number, y: number) => ({\n title: `${n8ssaoOptions.viewMode[y * 2 + x]}`,\n value: `${n8ssaoOptions.viewMode[y * 2 + x]}`,\n }),\n label: \"viewMode\",\n });\n }\n\n this.folder.addBlade({ view: \"separator\" });\n }\n\n public setupChangeEvent(\n composer: EffectComposer,\n normalPass: NormalPass,\n ppssaoEffect: SSAOEffect,\n ppssaoPass: EffectPass,\n n8aopass: any,\n ): void {\n this.ppssao.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"enabled\": {\n const value = e.value as boolean;\n if (e.value === true) {\n composer.addPass(normalPass, this.postProcessingSSAOIndex);\n composer.addPass(ppssaoPass, this.postProcessingSSAOIndex + 1);\n } else {\n composer.removePass(ppssaoPass);\n composer.removePass(normalPass);\n }\n ppssaoValues.enabled = value;\n normalPass.enabled = value;\n ppssaoPass.enabled = value;\n break;\n }\n case \"showEffectOnly\": {\n const value = e.value as boolean;\n const blend = value === true ? BlendFunction.NORMAL : BlendFunction.MULTIPLY;\n ppssaoEffect.blendMode.blendFunction = blend;\n break;\n }\n case \"resolutionScale\": {\n const value = e.value as number;\n ppssaoEffect.resolution.scale = value;\n break;\n }\n case \"color\": {\n const value = e.value as { r: number; g: number; b: number };\n ppssaoEffect.color = new Color().setRGB(value.r, value.g, value.b);\n break;\n }\n default: {\n break;\n }\n }\n\n if (ssaoMaterialParams.includes(target)) {\n (ppssaoEffect.ssaoMaterial as any)[target] = e.value;\n return;\n }\n (ppssaoEffect as any)[target] = e.value;\n });\n\n this.n8ssao.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"enabled\":\n if (e.value === true) {\n composer.addPass(n8aopass, this.postProcessingSSAOIndex + 2);\n } else {\n composer.removePass(n8aopass);\n }\n n8aopass.enabled = e.value;\n break;\n case \"halfRes\":\n n8aopass.configuration.halfRes = e.value;\n break;\n case \"aoRadius\":\n n8aopass.configuration.aoRadius = e.value;\n break;\n case \"distanceFalloff\":\n n8aopass.configuration.distanceFalloff = e.value;\n break;\n case \"intensity\":\n n8aopass.configuration.intensity = e.value;\n break;\n case \"color\":\n const value = (e as any).value;\n n8aopass.configuration.color = new Color().setRGB(value.r, value.g, value.b);\n break;\n default:\n break;\n }\n });\n\n this.aoSamples.on(\"change\", (e: any) => {\n n8aopass.configuration.aoSamples = e.value;\n });\n\n this.denoiseSamples.on(\"change\", (e: any) => {\n n8aopass.configuration.denoiseSamples = e.value;\n });\n\n this.denoiseRadius.on(\"change\", (e: any) => {\n n8aopass.configuration.denoiseRadius = e.value;\n });\n\n this.aoDisplay.on(\"change\", (e: any) => {\n n8aopass.setDisplayMode(e.value);\n });\n }\n}\n", "import { BindingApi, BladeApi, BladeController, TpChangeEvent, View } from \"@tweakpane/core\";\nimport { ToneMappingEffect, ToneMappingMode } from \"postprocessing\";\nimport { FolderApi } from \"tweakpane\";\n\nexport const toneMappingValues = {\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\nconst toneMappingOptions = {\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\nconst customToneMappingTypes: Record<number, string> = {\n 0: \"REINHARD\",\n 1: \"REINHARD2\",\n 2: \"REINHARD2_ADAPTIVE\",\n 3: \"OPTIMIZED_CINEON\",\n 4: \"ACES_FILMIC\",\n};\n\nconst customToneMappingBlade = {\n customToneMappingType: customToneMappingTypes[toneMappingValues.mode],\n};\n\nconst setCustomToneMappingType = (value: number): void => {\n customToneMappingBlade.customToneMappingType = customToneMappingTypes[value];\n};\n\nexport class ToneMappingFolder {\n public folder: FolderApi;\n private minLuminance: BindingApi;\n private avgLuminance: BindingApi;\n\n constructor(parentFolder: FolderApi, expand: boolean = false) {\n this.folder = parentFolder.addFolder({\n title: \"customToneMapping\",\n expanded: expand,\n });\n this.folder.addBinding(toneMappingValues, \"mode\", toneMappingOptions.mode);\n this.folder.addBinding(customToneMappingBlade, \"customToneMappingType\", { readonly: true });\n this.folder.addBinding(toneMappingValues, \"whitePoint\", toneMappingOptions.whitePoint);\n this.folder.addBinding(toneMappingValues, \"middleGrey\", toneMappingOptions.middleGrey);\n this.minLuminance = this.folder.addBinding(\n toneMappingValues,\n \"minLuminance\",\n toneMappingOptions.minLuminance,\n );\n this.minLuminance.hidden = toneMappingValues.mode === 2 ? true : false;\n this.avgLuminance = this.folder.addBinding(\n toneMappingValues,\n \"averageLuminance\",\n toneMappingOptions.averageLuminance,\n );\n this.avgLuminance.hidden = toneMappingValues.mode === 2 ? true : false;\n this.folder.addBinding(toneMappingValues, \"adaptationRate\", toneMappingOptions.adaptationRate);\n }\n\n public setupChangeEvent(toneMappingEffect: ToneMappingEffect): void {\n this.folder.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n if (target === \"mode\") {\n this.minLuminance.hidden = toneMappingValues.mode === 2 ? true : false;\n this.avgLuminance.hidden = toneMappingValues.mode === 2 ? true : false;\n setCustomToneMappingType(e.value as number);\n }\n (toneMappingEffect as any)[target] = e.value;\n return;\n });\n }\n}\n", "export const tweakPaneStyle = `\n:root {\n --tp-base-background-color: rgba(0, 0, 0, 0.6);\n --tp-base-shadow-color: hsla(0, 0%, 0%, 0.2);\n --tp-button-background-color: hsla(0, 0%, 80%, 1);\n --tp-button-background-color-active: hsla(0, 0%, 100%, 1);\n --tp-button-background-color-focus: hsla(0, 0%, 95%, 1);\n --tp-button-background-color-hover: hsla(0, 0%, 85%, 1);\n --tp-button-foreground-color: hsla(0, 0%, 0%, 0.7);\n --tp-container-background-color: hsla(0, 0%, 0%, 0.3);\n --tp-container-background-color-active: hsla(0, 0%, 0%, 0.6);\n --tp-container-background-color-focus: hsla(0, 0%, 0%, 0.5);\n --tp-container-background-color-hover: hsla(0, 0%, 0%, 0.4);\n --tp-container-foreground-color: hsla(0, 0%, 90%, 0.6);\n --tp-groove-foreground-color: hsla(0, 0%, 0%, 0.2);\n --tp-input-background-color: hsla(0, 0%, 30%, 0.3);\n --tp-input-background-color-active: hsla(0, 0%, 0%, 0.6);\n --tp-input-background-color-focus: hsla(0, 0%, 0%, 0.5);\n --tp-input-background-color-hover: hsla(0, 0%, 0%, 0.4);\n --tp-input-foreground-color: hsla(0, 0%, 100%, 0.6);\n --tp-label-foreground-color: hsla(0, 0%, 100%, 0.6);\n --tp-monitor-background-color: hsla(0, 0%, 0%, 0.3);\n --tp-monitor-foreground-color: hsla(0, 0%, 100%, 0.3);\n}\n\n.tp-brkv {\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.tp-dfwv {\n color: white;\n backdrop-filter: blur(12px);\n width: 360px !important;\n display: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.tp-fldv_t {\n font-size: 11px;\n background-color: rgba(0, 0, 0, 0.1);\n}\n\n.tp-lblv_l {\n font-size: 11px;\n padding-left: 0px !important;\n padding-right: 0px !important;\n}\n\n.tp-lblv_v {\n width: 180px;\n}\n\n.tp-sldtxtv_t {\n max-width: 50px;\n}\n\n.tp-sglv_i {\n font-size: 11px;\n color: rgba(255, 255, 255, 0.7);\n}\n`;\n", "/* @ts-ignore */\nimport { N8AOPostPass } from \"n8ao\";\nimport {\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 AmbientLight,\n Color,\n Fog,\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 { Sun } from \"../sun/Sun\";\nimport { TimeManager } from \"../time/TimeManager\";\nimport { bcsValues } from \"../tweakpane/blades/bcsFolder\";\nimport { envValues } from \"../tweakpane/blades/environmentFolder\";\nimport { extrasValues } from \"../tweakpane/blades/postExtrasFolder\";\nimport { rendererValues } from \"../tweakpane/blades/rendererFolder\";\nimport { n8ssaoValues, ppssaoValues } from \"../tweakpane/blades/ssaoFolder\";\nimport { toneMappingValues } from \"../tweakpane/blades/toneMappingFolder\";\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 = 1;\n private height: number = 1;\n private resizeListener: () => void;\n\n public resolution: Vector2 = new Vector2(this.width, this.height);\n\n private isEnvHDRI: boolean = false;\n\n private readonly scene: Scene;\n public postPostScene: Scene;\n private readonly camera: PerspectiveCamera;\n public readonly renderer: WebGLRenderer;\n\n public readonly effectComposer: EffectComposer;\n private readonly renderPass: RenderPass;\n\n private readonly normalPass: NormalPass;\n private readonly normalTextureEffect: TextureEffect;\n private readonly ppssaoEffect: SSAOEffect;\n private readonly ppssaoPass: EffectPass;\n private readonly n8aopass: N8AOPostPass;\n\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 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 ambientLight: AmbientLight | null = null;\n\n public sun: Sun | null = null;\n public spawnSun: boolean;\n\n constructor(scene: Scene, camera: PerspectiveCamera, spawnSun: boolean = false) {\n this.scene = scene;\n this.postPostScene = new Scene();\n this.camera = camera;\n this.spawnSun = spawnSun;\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 = rendererValues.shadowMap as ShadowMapType;\n this.renderer.toneMapping = rendererValues.toneMapping as ToneMapping;\n this.renderer.toneMappingExposure = rendererValues.exposure;\n\n this.setAmbientLight();\n this.setFog();\n\n this.effectComposer = new EffectComposer(this.renderer, {\n frameBufferType: HalfFloatType,\n });\n\n this.renderPass = new RenderPass(this.scene, this.camera);\n\n this.normalPass = new NormalPass(this.scene, this.camera);\n this.normalPass.enabled = ppssaoValues.enabled;\n this.normalTextureEffect = new TextureEffect({\n blendFunction: BlendFunction.SKIP,\n texture: this.normalPass.texture,\n });\n this.ppssaoEffect = new SSAOEffect(this.camera, this.normalPass.texture, {\n blendFunction: ppssaoValues.blendFunction,\n distanceScaling: ppssaoValues.distanceScaling,\n depthAwareUpsampling: ppssaoValues.depthAwareUpsampling,\n samples: ppssaoValues.samples,\n rings: ppssaoValues.rings,\n luminanceInfluence: ppssaoValues.luminanceInfluence,\n radius: ppssaoValues.radius,\n intensity: ppssaoValues.intensity,\n bias: ppssaoValues.bias,\n fade: ppssaoValues.fade,\n resolutionScale: ppssaoValues.resolutionScale,\n color: new Color().setRGB(ppssaoValues.color.r, ppssaoValues.color.g, ppssaoValues.color.b),\n worldDistanceThreshold: ppssaoValues.worldDistanceThreshold,\n worldDistanceFalloff: ppssaoValues.worldDistanceFalloff,\n worldProximityThreshold: ppssaoValues.worldProximityThreshold,\n worldProximityFalloff: ppssaoValues.worldProximityFalloff,\n });\n this.ppssaoPass = new EffectPass(this.camera, this.ppssaoEffect, this.normalTextureEffect);\n this.ppssaoPass.enabled = ppssaoValues.enabled;\n\n this.fxaaEffect = new FXAAEffect();\n this.bloomEffect = new BloomEffect({\n intensity: extrasValues.bloom,\n });\n\n this.n8aopass = new N8AOPostPass(this.scene, this.camera, this.width, this.height);\n this.n8aopass.configuration.aoRadius = n8ssaoValues.aoRadius;\n this.n8aopass.configuration.distanceFalloff = n8ssaoValues.distanceFalloff;\n this.n8aopass.configuration.intensity = n8ssaoValues.intensity;\n this.n8aopass.configuration.color = new Color().setRGB(\n n8ssaoValues.color.r,\n n8ssaoValues.color.g,\n n8ssaoValues.color.b,\n );\n this.n8aopass.configuration.aoSamples = n8ssaoValues.aoSamples;\n this.n8aopass.configuration.denoiseSamples = n8ssaoValues.denoiseSamples;\n this.n8aopass.configuration.denoiseRadius = n8ssaoValues.denoiseRadius;\n this.n8aopass.enabled = n8ssaoValues.enabled;\n\n this.fxaaPass = new EffectPass(this.camera, this.fxaaEffect);\n this.bloomPass = new EffectPass(this.camera, this.bloomEffect);\n\n this.toneMappingEffect = new ToneMappingEffect({\n mode: toneMappingValues.mode,\n resolution: toneMappingValues.resolution,\n whitePoint: toneMappingValues.whitePoint,\n middleGrey: toneMappingValues.middleGrey,\n minLuminance: toneMappingValues.minLuminance,\n averageLuminance: toneMappingValues.averageLuminance,\n adaptationRate: toneMappingValues.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 rendererValues.toneMapping === 5 || rendererValues.toneMapping === 0 ? true : false;\n\n this.bcsPass = new ShaderPass(this.bcs, \"tDiffuse\");\n this.bcs.uniforms.brightness.value = bcsValues.brightness;\n this.bcs.uniforms.contrast.value = bcsValues.contrast;\n this.bcs.uniforms.saturation.value = bcsValues.saturation;\n\n this.gaussGrainPass = new ShaderPass(this.gaussGrainEffect, \"tDiffuse\");\n this.smaaPass = new EffectPass(this.camera, this.smaaEffect);\n\n this.effectComposer.addPass(this.renderPass);\n if (ppssaoValues.enabled) {\n this.effectComposer.addPass(this.normalPass);\n this.effectComposer.addPass(this.ppssaoPass);\n }\n if (n8ssaoValues.enabled) {\n this.effectComposer.addPass(this.n8aopass);\n }\n this.effectComposer.addPass(this.fxaaPass);\n this.effectComposer.addPass(this.smaaPass);\n this.effectComposer.addPass(this.bloomPass);\n this.effectComposer.addPass(this.toneMappingPass);\n this.effectComposer.addPass(this.bcsPass);\n this.effectComposer.addPass(this.gaussGrainPass);\n\n if (this.spawnSun === true) {\n this.sun = new Sun();\n this.scene.add(this.sun);\n }\n\n this.resizeListener = () => {\n this.fitContainer();\n };\n window.addEventListener(\"resize\", this.resizeListener, false);\n this.fitContainer();\n }\n\n public setupTweakPane(tweakPane: TweakPane) {\n tweakPane.setupRenderPane(\n this.effectComposer,\n this.normalPass,\n this.ppssaoEffect,\n this.ppssaoPass,\n this.n8aopass,\n this.toneMappingEffect,\n this.toneMappingPass,\n this.bcs,\n this.bloomEffect,\n this.gaussGrainEffect,\n this.spawnSun,\n this.sun,\n this.setHDRIFromFile.bind(this),\n this.setAmbientLight.bind(this),\n this.setFog.bind(this),\n );\n }\n\n public dispose() {\n window.removeEventListener(\"resize\", this.resizeListener);\n }\n\n public fitContainer() {\n if (!this) {\n console.error(\"Composer not initialized\");\n return;\n }\n const parentElement = this.renderer.domElement.parentNode as HTMLElement;\n if (!parentElement) {\n return;\n }\n this.width = parentElement.clientWidth;\n this.height = parentElement.clientHeight;\n this.camera.aspect = this.width / this.height;\n this.camera.updateProjectionMatrix();\n this.renderer.setPixelRatio(window.devicePixelRatio);\n this.resolution.set(\n this.width * window.devicePixelRatio,\n this.height * window.devicePixelRatio,\n );\n this.effectComposer.setSize(\n this.width / window.devicePixelRatio,\n this.height / window.devicePixelRatio,\n );\n this.renderPass.setSize(this.width, this.height);\n if (ppssaoValues.enabled) {\n this.normalPass.setSize(this.width, this.height);\n this.normalTextureEffect.setSize(this.width, this.height);\n this.ppssaoPass.setSize(this.width, this.height);\n }\n if (n8ssaoValues.enabled) {\n this.n8aopass.setSize(this.width, this.height);\n }\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 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.effectComposer.render();\n this.renderer.render(this.postPostScene, this.camera);\n }\n\n public useHDRI(url: string, fromFile: boolean = false): void {\n if ((this.isEnvHDRI && fromFile === false) || !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 = rendererValues.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 public setHDRIFromFile(): void {\n if (!this.renderer) return;\n const fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.accept = \".hdr\";\n fileInput.addEventListener(\"change\", () => {\n const file = fileInput.files?.[0];\n if (!file) {\n console.log(\"no file\");\n return;\n }\n const fileURL = URL.createObjectURL(file);\n if (fileURL) {\n this.useHDRI(fileURL, true);\n URL.revokeObjectURL(fileURL);\n document.body.removeChild(fileInput);\n }\n });\n document.body.appendChild(fileInput);\n fileInput.click();\n }\n\n public setFog(): void {\n const fogColor = new Color().setRGB(\n envValues.fog.fogColor.r,\n envValues.fog.fogColor.g,\n envValues.fog.fogColor.b,\n );\n this.scene.fog = new Fog(fogColor, envValues.fog.fogNear, envValues.fog.fogFar);\n }\n\n public setAmbientLight(): void {\n if (this.ambientLight) {\n this.scene.remove(this.ambientLight);\n this.ambientLight.dispose();\n }\n const ambientLightColor = new Color().setRGB(\n envValues.ambientLight.ambientLightColor.r,\n envValues.ambientLight.ambientLightColor.g,\n envValues.ambientLight.ambientLightColor.b,\n );\n this.ambientLight = new AmbientLight(\n ambientLightColor,\n envValues.ambientLight.ambientLightIntensity,\n );\n this.scene.add(this.ambientLight);\n }\n}\n", "import { CameraHelper, Color, DirectionalLight, Group, OrthographicCamera, Vector3 } from \"three\";\n\nimport { sunValues } from \"../tweakpane/blades/environmentFolder\";\n\nexport class Sun extends Group {\n private readonly debug: boolean = false;\n private readonly sunOffset: Vector3 = new Vector3(\n 39 * (Math.PI / 180),\n 50 * (Math.PI / 180),\n 100,\n );\n private readonly shadowResolution: number = 8192;\n private readonly shadowCamFrustum: number = 50;\n private readonly camHelper: CameraHelper | null = null;\n\n private readonly shadowCamera: OrthographicCamera;\n private readonly directionalLight: DirectionalLight;\n\n public target: Vector3 | null = null;\n\n constructor() {\n super();\n this.shadowCamera = new OrthographicCamera(\n -this.shadowCamFrustum,\n this.shadowCamFrustum,\n this.shadowCamFrustum,\n -this.shadowCamFrustum,\n 0.1,\n 200,\n );\n if (this.debug === true) {\n this.camHelper = new CameraHelper(this.shadowCamera);\n }\n this.directionalLight = new DirectionalLight(0xffffff, 0.5);\n this.directionalLight.shadow.normalBias = 0.05;\n this.directionalLight.shadow.radius = 1.5;\n this.directionalLight.shadow.camera = this.shadowCamera;\n this.directionalLight.shadow.mapSize.set(this.shadowResolution, this.shadowResolution);\n this.directionalLight.castShadow = true;\n this.setColor();\n\n this.updateCharacterPosition(new Vector3(0, 0, 0));\n\n this.add(this.directionalLight);\n if (this.debug === true && this.camHelper instanceof CameraHelper) {\n this.add(this.camHelper);\n }\n }\n\n public updateCharacterPosition(position: Vector3 | undefined) {\n if (!position) return;\n this.target = position;\n this.setSunPosition(this.sunOffset.x, this.sunOffset.y);\n }\n\n public setAzimuthalAngle(angle: number) {\n if (this.sunOffset) this.sunOffset.x = angle;\n if (this.target) this.updateCharacterPosition(this.target);\n }\n\n public setPolarAngle(angle: number) {\n if (this.sunOffset) this.sunOffset.y = angle;\n if (this.target) this.updateCharacterPosition(this.target);\n }\n\n public setIntensity(intensity: number) {\n this.directionalLight.intensity = intensity;\n }\n\n public setColor() {\n this.directionalLight.color = new Color().setRGB(\n sunValues.sunColor.r,\n sunValues.sunColor.g,\n sunValues.sunColor.b,\n );\n }\n\n private setSunPosition(azimuthalAngle: number, polarAngle: number) {\n if (!this.target) return;\n const distance = this.sunOffset.z;\n const sphericalPosition = new Vector3(\n distance * Math.sin(polarAngle) * Math.cos(azimuthalAngle),\n distance * Math.cos(polarAngle),\n distance * Math.sin(polarAngle) * Math.sin(azimuthalAngle),\n );\n const newSunPosition = this.target.clone().add(sphericalPosition);\n this.directionalLight.position.set(newSunPosition.x, newSunPosition.y, newSunPosition.z);\n this.directionalLight.target.position.copy(this.target.clone());\n this.directionalLight.target.updateMatrixWorld();\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 getRelativePositionAndRotationRelativeToObject,\n MElement,\n MMLCollisionTrigger,\n} from \"mml-web\";\nimport {\n Box3,\n BufferGeometry,\n Color,\n DoubleSide,\n Euler,\n Group,\n Line3,\n LineBasicMaterial,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n Object3D,\n Ray,\n Scene,\n Vector3,\n} from \"three\";\nimport { VertexNormalsHelper } from \"three/examples/jsm/helpers/VertexNormalsHelper.js\";\nimport * as BufferGeometryUtils from \"three/examples/jsm/utils/BufferGeometryUtils.js\";\nimport { MeshBVH, MeshBVHVisualizer } from \"three-mesh-bvh\";\n\ntype CollisionMeshState = {\n matrix: Matrix4;\n source: Group;\n meshBVH: MeshBVH;\n debugGroup?: Group;\n trackCollisions: boolean;\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 private tempVector3: Vector3 = new Vector3();\n private tempRay: Ray = new Ray();\n private tempMatrix = new Matrix4();\n private tempMatrix2 = new Matrix4();\n private tempBox = new Box3();\n private tempEuler = new Euler();\n private tempSegment = new Line3();\n private tempSegment2 = new Line3();\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 | null = null;\n for (const [, value] of this.collisionMeshState) {\n this.tempRay.copy(ray).applyMatrix4(this.tempMatrix.copy(value.matrix).invert());\n const hit = value.meshBVH.raycastFirst(this.tempRay, DoubleSide);\n if (hit) {\n this.tempSegment.start.copy(this.tempRay.origin);\n this.tempSegment.end.copy(hit.point);\n this.tempSegment.applyMatrix4(value.matrix);\n const dist = this.tempSegment.distance();\n if (minimumDistance === null || dist < minimumDistance) {\n minimumDistance = dist;\n }\n }\n }\n return minimumDistance;\n }\n\n private createCollisionMeshState(group: Group, trackCollisions: boolean): CollisionMeshState {\n const geometries: Array<BufferGeometry> = [];\n group.updateWorldMatrix(true, false);\n const invertedRootMatrix = this.tempMatrix.copy(group.matrixWorld).invert();\n group.traverse((child: Object3D) => {\n if (child.type === \"Mesh\") {\n const mesh = child as Mesh;\n const clonedGeometry = mesh.geometry.clone();\n if (child !== group) {\n mesh.updateWorldMatrix(true, false);\n clonedGeometry.applyMatrix4(\n this.tempMatrix2.multiplyMatrices(invertedRootMatrix, mesh.matrixWorld),\n );\n }\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, false);\n newBufferGeometry.computeVertexNormals();\n const meshBVH = new MeshBVH(newBufferGeometry);\n\n const meshState: CollisionMeshState = {\n source: group,\n meshBVH,\n matrix: group.matrixWorld.clone(),\n trackCollisions,\n };\n if (this.debug) {\n // Have to cast to add the boundsTree property to the geometry so that the MeshBVHVisualizer can find it\n (newBufferGeometry as any).boundsTree = meshBVH;\n\n const wireframeMesh = new Mesh(newBufferGeometry, new MeshBasicMaterial({ wireframe: true }));\n\n const normalsHelper = new VertexNormalsHelper(wireframeMesh, 0.25, 0x00ff00);\n\n const visualizer = new MeshBVHVisualizer(wireframeMesh, 4);\n (visualizer.edgeMaterial as LineBasicMaterial).color = new Color(\"blue\");\n\n const debugGroup = new Group();\n debugGroup.add(wireframeMesh, normalsHelper, visualizer as unknown as Object3D);\n\n group.matrixWorld.decompose(debugGroup.position, debugGroup.quaternion, debugGroup.scale);\n visualizer.update();\n\n meshState.debugGroup = debugGroup;\n }\n return meshState;\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, mElement !== undefined);\n if (meshState.debugGroup) {\n this.scene.add(meshState.debugGroup);\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 group.updateWorldMatrix(true, false);\n meshState.matrix.copy(group.matrixWorld);\n if (meshState.debugGroup) {\n group.matrixWorld.decompose(\n meshState.debugGroup.position,\n meshState.debugGroup.quaternion,\n meshState.debugGroup.scale,\n );\n }\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.debugGroup) {\n this.scene.remove(meshState.debugGroup);\n }\n this.collisionMeshState.delete(group);\n }\n }\n\n private applyCollider(\n worldBasedCapsuleSegment: Line3,\n capsuleRadius: number,\n meshState: CollisionMeshState,\n ): Vector3 | null {\n // Create a matrix to convert from world-space to mesh-space\n const meshMatrix = this.tempMatrix.copy(meshState.matrix).invert();\n\n // Create the bounding box for the capsule if it were in mesh-space\n const meshRelativeCapsuleBoundingBox = this.tempBox;\n meshRelativeCapsuleBoundingBox.makeEmpty();\n meshRelativeCapsuleBoundingBox.expandByPoint(worldBasedCapsuleSegment.start);\n meshRelativeCapsuleBoundingBox.expandByPoint(worldBasedCapsuleSegment.end);\n meshRelativeCapsuleBoundingBox.min.subScalar(capsuleRadius);\n meshRelativeCapsuleBoundingBox.max.addScalar(capsuleRadius);\n meshRelativeCapsuleBoundingBox.applyMatrix4(meshMatrix);\n // Create a segment/line for the capsule in mesh-space\n const meshRelativeCapsuleSegment = this.tempSegment;\n meshRelativeCapsuleSegment.start.copy(worldBasedCapsuleSegment.start);\n meshRelativeCapsuleSegment.end.copy(worldBasedCapsuleSegment.end);\n meshRelativeCapsuleSegment.applyMatrix4(meshMatrix);\n\n // Keep track of where the segment started in mesh-space so that we can calculate the delta later\n const initialMeshRelativeCapsuleSegmentStart = this.tempVector3.copy(\n meshRelativeCapsuleSegment.start,\n );\n\n let collisionPosition: Vector3 | null = null;\n meshState.meshBVH.shapecast({\n intersectsBounds: (meshBox) => {\n // Determine if this portion of the mesh overlaps with the capsule bounding box and is therefore worth checking\n // all of the triangles within\n return meshBox.intersectsBox(meshRelativeCapsuleBoundingBox);\n },\n intersectsTriangle: (meshTriangle) => {\n const closestPointOnTriangle = this.tempVector;\n const closestPointOnSegment = this.tempVector2;\n // Find the closest point between this triangle and the capsule segment in mesh-space\n meshTriangle.closestPointToSegment(\n meshRelativeCapsuleSegment,\n closestPointOnTriangle,\n closestPointOnSegment,\n );\n // Create a line segment between the closest points\n const intersectionSegment = this.tempSegment2;\n intersectionSegment.start.copy(closestPointOnTriangle);\n intersectionSegment.end.copy(closestPointOnSegment);\n // Calculate the distance between the closest points in mesh-space\n const modelReferenceDistance = intersectionSegment.distance();\n\n // Calculate the distance between the points in world-space\n intersectionSegment.applyMatrix4(meshState.matrix);\n const realDistance = intersectionSegment.distance();\n\n // If the real distance is less than the capsule radius then there is actually a collision between the capsule\n // and the triangle\n if (realDistance < capsuleRadius) {\n if (!collisionPosition) {\n collisionPosition = new Vector3()\n .copy(closestPointOnSegment)\n .applyMatrix4(meshState.matrix);\n }\n // Calculate the ratio between the real distance and the mesh-space distance\n const ratio = realDistance / modelReferenceDistance;\n // Calculate the depth of the collision in world-space\n const realDepth = capsuleRadius - realDistance;\n // Convert that depth back into mesh-space as all calculations during collision are to a mesh-space segment\n const modelDepth = realDepth / ratio;\n\n // Apply a corrective movement to the segment in mesh-space\n const direction = closestPointOnSegment.sub(closestPointOnTriangle).normalize();\n meshRelativeCapsuleSegment.start.addScaledVector(direction, modelDepth);\n meshRelativeCapsuleSegment.end.addScaledVector(direction, modelDepth);\n }\n },\n });\n\n if (collisionPosition) {\n // If there was a collision, calculate the delta between the original mesh-space segment and the now-moved one\n const delta = this.tempVector\n .copy(meshRelativeCapsuleSegment.start)\n .sub(initialMeshRelativeCapsuleSegmentStart);\n\n // Use the matrix for the mesh to convert the delta vector back to world-space (remove the position component of the matrix first to avoid translation)\n this.tempMatrix.copy(meshState.matrix).setPosition(0, 0, 0);\n delta.applyMatrix4(this.tempMatrix);\n\n // There's a possibility that the matrix is invalid (or scale zero) and the delta is NaN - if so, don't apply the delta\n if (!(isNaN(delta.x) && isNaN(delta.y) && isNaN(delta.z))) {\n // Convert the potentially-modified mesh-space segment back to world-space\n worldBasedCapsuleSegment.start.add(delta);\n worldBasedCapsuleSegment.end.add(delta);\n }\n }\n\n return collisionPosition;\n }\n\n public applyColliders(tempSegment: Line3, radius: number) {\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, meshState);\n if (collisionPosition && meshState.trackCollisions) {\n if (collidedElements === null) {\n collidedElements = new Map();\n }\n const relativePosition = getRelativePositionAndRotationRelativeToObject(\n {\n position: collisionPosition,\n rotation: this.tempEuler.set(0, 0, 0),\n },\n meshState.source as Object3D,\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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",
4
+ "sourcesContent": ["import { PerspectiveCamera, Raycaster, Vector3 } from \"three\";\n\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { remap } from \"../helpers/math-helpers\";\nimport { EventHandlerCollection } from \"../input/EventHandlerCollection\";\nimport { getTweakpaneActive } from \"../tweakpane/tweakPaneActivity\";\n\nexport class CameraManager {\n public readonly camera: PerspectiveCamera;\n\n public initialDistance: number = 3.3;\n\n private minDistance: number = 0.1;\n private maxDistance: number = 8;\n\n private initialFOV: number = 60;\n private fov: number = this.initialFOV;\n private minFOV: number = 50;\n private maxFOV: number = 70;\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 private desiredDistance: number = this.initialDistance;\n\n private targetPhi: number | null;\n private phi: number | null;\n private targetTheta: number | null;\n private theta: number | null;\n public dragging: boolean = false;\n\n private target: Vector3 = new Vector3(0, 1.55, 0);\n private hadTarget: boolean = false;\n\n private rayCaster: Raycaster;\n\n private eventHandlerCollection: EventHandlerCollection;\n\n private isLerping: boolean = false;\n private finalTarget: Vector3 = new Vector3();\n private lerpTarget: Vector3 = new Vector3();\n\n private lerpFactor: number = 0;\n private lerpDuration: number = 2.1;\n\n constructor(\n targetElement: HTMLElement,\n private collisionsManager: CollisionsManager,\n initialPhi = Math.PI / 2,\n initialTheta = -Math.PI / 2,\n ) {\n this.phi = initialPhi;\n this.targetPhi = initialPhi;\n this.theta = initialTheta;\n this.targetTheta = initialTheta;\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 this.rayCaster = new Raycaster();\n this.eventHandlerCollection = EventHandlerCollection.create([\n [targetElement, \"mousedown\", this.onMouseDown.bind(this)],\n [document, \"mouseup\", this.onMouseUp.bind(this)],\n [document, \"mousemove\", this.onMouseMove.bind(this)],\n [targetElement, \"wheel\", this.onMouseWheel.bind(this)],\n ]);\n }\n\n private onMouseDown(): 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()) 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 event.preventDefault();\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 this.desiredDistance = this.targetDistance;\n event.preventDefault();\n }\n\n public setTarget(target: Vector3): void {\n if (!this.isLerping) {\n this.target.copy(target);\n } else {\n this.finalTarget.copy(target);\n this.lerpTarget.copy(this.target);\n this.lerpFactor = 0;\n }\n\n if (!this.hadTarget) {\n this.hadTarget = true;\n this.reverseUpdateFromPositions();\n }\n }\n\n public setLerpedTarget(target: Vector3, targetDistance: number): void {\n this.isLerping = true;\n this.targetDistance = targetDistance;\n this.desiredDistance = targetDistance;\n this.setTarget(target);\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 } else {\n this.targetDistance += (this.desiredDistance - this.targetDistance) * this.dampingFactor * 4;\n }\n }\n\n public dispose() {\n this.eventHandlerCollection.clear();\n }\n\n private easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n }\n\n public updateAspect(aspect: number): void {\n this.camera.aspect = aspect;\n }\n\n public update(): void {\n if (this.isLerping && this.lerpFactor < 1) {\n this.lerpFactor += 0.01 / this.lerpDuration;\n this.lerpFactor = Math.min(1, this.lerpFactor);\n this.target.lerpVectors(this.lerpTarget, this.finalTarget, this.easeOutExpo(this.lerpFactor));\n } else {\n this.adjustCameraPosition();\n }\n\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 this.fov += (this.targetFOV - this.fov) * this.dampingFactor;\n this.camera.fov = this.fov;\n this.camera.updateProjectionMatrix();\n\n this.camera.position.set(x, y, z);\n this.camera.lookAt(this.target);\n\n if (this.isLerping && this.lerpFactor >= 1) {\n this.isLerping = false;\n }\n }\n }\n}\n", "import { Quaternion, Vector3, Vector4 } from \"three\";\n\nexport const roundToDecimalPlaces = (value: number, decimalPlaces: number): number => {\n const mult = 10 ** decimalPlaces;\n return Math.round(value * mult) / mult;\n};\n\nexport const toArray = (\n origin: Vector3 | Vector4 | Quaternion,\n precision: number = 3,\n): number[] => {\n const array = [];\n array[0] = roundToDecimalPlaces(origin.x, precision);\n array[1] = roundToDecimalPlaces(origin.y, precision);\n array[2] = roundToDecimalPlaces(origin.z, precision);\n if (origin instanceof Vector4 || origin instanceof Quaternion) {\n array[3] = roundToDecimalPlaces(origin.w, precision);\n }\n return array;\n};\n\nexport const getSpawnPositionInsideCircle = (\n radius: number,\n positions: number,\n id: number,\n yPos: number = 0,\n): 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", "type ListenerFunc = (...args: any[]) => void;\n\ntype EventSpecificationTuple = [EventTarget, string, ListenerFunc, AddEventListenerOptions?];\n\nexport class EventHandlerCollection {\n private eventsByTarget: Map<EventTarget, Map<string, Set<ListenerFunc>>> = new Map();\n\n public add(\n target: EventTarget,\n key: string,\n listener: ListenerFunc,\n options?: AddEventListenerOptions,\n ): this {\n target.addEventListener(key, listener, options);\n\n let existingTarget = this.eventsByTarget.get(target);\n if (existingTarget === undefined) {\n existingTarget = new Map();\n this.eventsByTarget.set(target, existingTarget);\n }\n let existingKey = existingTarget.get(key);\n if (existingKey === undefined) {\n existingKey = new Set();\n existingTarget.set(key, existingKey);\n }\n existingKey.add(listener);\n\n return this;\n }\n\n public clear() {\n this.eventsByTarget.forEach((keyMap, target) => {\n keyMap.forEach((listenerSet, key) => {\n listenerSet.forEach((listenerFunc) => {\n target.removeEventListener(key, listenerFunc);\n });\n });\n });\n this.eventsByTarget.clear();\n }\n\n static create(initial?: Array<EventSpecificationTuple>): EventHandlerCollection {\n const instance = new EventHandlerCollection();\n if (initial !== undefined) {\n initial.forEach(([target, key, listenerFunc, options]) => {\n instance.add(target, key, listenerFunc, options);\n });\n }\n return instance;\n }\n}\n", "let isTweakpaneActive = false;\n\nexport function setTweakpaneActive(status: boolean) {\n isTweakpaneActive = status;\n}\n\nexport function getTweakpaneActive() {\n return isTweakpaneActive;\n}\n", "import { Color, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { Composer } from \"../rendering/composer\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { CharacterModel } from \"./CharacterModel\";\nimport { CharacterModelLoader } from \"./CharacterModelLoader\";\nimport { CharacterSpeakingIndicator } from \"./CharacterSpeakingIndicator\";\nimport { CharacterTooltip } from \"./CharacterTooltip\";\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 public tooltip: CharacterTooltip | null = null;\n public speakingIndicator: CharacterSpeakingIndicator | null = null;\n\n constructor(\n private readonly characterDescription: CharacterDescription,\n private readonly characterModelLoader: CharacterModelLoader,\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 private readonly composer: Composer,\n ) {\n this.load();\n }\n\n private async load(): Promise<void> {\n this.model = new CharacterModel(this.characterDescription, this.characterModelLoader);\n await this.model.init();\n if (this.tooltip === null) {\n this.tooltip = new CharacterTooltip(this.model.mesh!);\n }\n if (this.speakingIndicator === null) {\n this.speakingIndicator = new CharacterSpeakingIndicator(this.composer.postPostScene);\n }\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 if (this.tooltip) {\n this.tooltip.update(this.cameraManager.camera);\n }\n if (this.speakingIndicator) {\n this.speakingIndicator.setTime(time);\n if (this.model.mesh && this.model.headBone) {\n this.speakingIndicator.setBillboarding(\n this.model.headBone?.getWorldPosition(new Vector3()),\n this.cameraManager.camera,\n );\n }\n }\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 Bone,\n LoopRepeat,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n} from \"three\";\n\nimport { CharacterDescription } from \"./Character\";\nimport { CharacterMaterial } from \"./CharacterMaterial\";\nimport { CharacterModelLoader } from \"./CharacterModelLoader\";\nimport { AnimationState } from \"./CharacterState\";\n\nexport class CharacterModel {\n public mesh: Object3D | null = null;\n public material: CharacterMaterial = new CharacterMaterial();\n public headBone: Bone | null = null;\n\n public animations: Record<string, AnimationAction> = {};\n public animationMixer: AnimationMixer | null = null;\n public currentAnimation: AnimationState = AnimationState.idle;\n\n constructor(\n private readonly characterDescription: CharacterDescription,\n private characterModelLoader: CharacterModelLoader,\n ) {}\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 === \"Bone\" && child.name === \"mixamorigHeadTop_End\") {\n this.headBone = child as Bone;\n }\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.characterModelLoader.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.characterModelLoader.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/blades/characterFolder\";\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.transmission;\n this.metalness = characterValues.metalness;\n this.roughness = characterValues.roughness;\n this.ior = characterValues.ior;\n this.thickness = characterValues.thickness;\n this.specularColor = new Color().setRGB(\n characterValues.specularColor.r,\n characterValues.specularColor.g,\n characterValues.specularColor.b,\n );\n this.specularIntensity = characterValues.specularIntensity;\n this.emissive = new Color().setRGB(\n characterValues.emissive.r,\n characterValues.emissive.g,\n characterValues.emissive.b,\n );\n this.emissiveIntensity = characterValues.emissiveIntensity;\n this.envMapIntensity = characterValues.envMapIntensity;\n this.sheenColor = new Color().setRGB(\n characterValues.sheenColor.r,\n characterValues.sheenColor.g,\n characterValues.sheenColor.b,\n );\n this.sheen = characterValues.sheen;\n this.clearcoat = characterValues.clearcoat;\n this.clearcoatRoughness = characterValues.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.transmission;\n this.metalness = characterValues.metalness;\n this.roughness = characterValues.roughness;\n this.ior = characterValues.ior;\n this.thickness = characterValues.thickness;\n this.specularColor = new Color().setRGB(\n characterValues.specularColor.r,\n characterValues.specularColor.g,\n characterValues.specularColor.b,\n );\n this.specularIntensity = characterValues.specularIntensity;\n this.emissive = new Color().setRGB(\n characterValues.emissive.r,\n characterValues.emissive.g,\n characterValues.emissive.b,\n );\n this.emissiveIntensity = characterValues.emissiveIntensity;\n this.envMapIntensity = characterValues.envMapIntensity;\n this.sheenColor = new Color().setRGB(\n characterValues.sheenColor.r,\n characterValues.sheenColor.g,\n characterValues.sheenColor.b,\n );\n this.sheen = characterValues.sheen;\n this.clearcoat = characterValues.clearcoat;\n this.clearcoatRoughness = characterValues.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", "import { BladeController, View } from \"@tweakpane/core\";\nimport { BladeApi, FolderApi, TpChangeEvent } from \"tweakpane\";\n\nexport const characterValues = {\n transmission: 0.01,\n metalness: 0.8,\n roughness: 0.05,\n ior: 1.0,\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: 0.8,\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\nconst characterOptions = {\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: 1, 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\nexport class CharacterFolder {\n private folder: FolderApi;\n constructor(parentFolder: FolderApi, expand: boolean = false) {\n this.folder = parentFolder.addFolder({ title: \"characterMaterial\", expanded: expand });\n this.folder.addBinding(characterValues, \"transmission\", characterOptions.transmission);\n this.folder.addBinding(characterValues, \"metalness\", characterOptions.metalness);\n this.folder.addBinding(characterValues, \"roughness\", characterOptions.roughness);\n this.folder.addBinding(characterValues, \"ior\", characterOptions.ior);\n this.folder.addBinding(characterValues, \"thickness\", characterOptions.thickness);\n this.folder.addBinding(characterValues, \"specularColor\", {\n color: { type: \"float\" },\n });\n this.folder.addBinding(\n characterValues,\n \"specularIntensity\",\n characterOptions.specularIntensity,\n );\n this.folder.addBinding(characterValues, \"emissive\", {\n color: { type: \"float\" },\n });\n this.folder.addBinding(\n characterValues,\n \"emissiveIntensity\",\n characterOptions.emissiveIntensity,\n );\n this.folder.addBinding(characterValues, \"envMapIntensity\", characterOptions.envMapIntensity);\n this.folder.addBinding(characterValues, \"sheenColor\", {\n color: { type: \"float\" },\n });\n this.folder.addBinding(characterValues, \"sheen\", characterOptions.sheen);\n this.folder.addBinding(characterValues, \"clearcoat\", characterOptions.clearcoat);\n this.folder.addBinding(\n characterValues,\n \"clearcoatRoughness\",\n characterOptions.clearcoatRoughness,\n );\n }\n\n public setupChangeEvent(): void {\n this.folder.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"specularColor\": {\n const value = e.value as { r: number; g: number; b: number };\n characterValues.specularColor = {\n r: value.r,\n g: value.g,\n b: value.b,\n };\n break;\n }\n case \"emissive\": {\n const value = e.value as { r: number; g: number; b: number };\n characterValues.emissive = {\n r: value.r,\n g: value.g,\n b: value.b,\n };\n break;\n }\n case \"sheenColor\": {\n const value = e.value as { r: number; g: number; b: number };\n characterValues.sheenColor = {\n r: value.r,\n g: value.g,\n b: value.b,\n };\n break;\n }\n default: {\n break;\n }\n }\n });\n }\n}\n", "export enum AnimationState {\n \"idle\" = 0,\n \"walking\" = 1,\n \"running\" = 2,\n \"jumpToAir\" = 3,\n \"air\" = 4,\n \"airToGround\" = 5,\n}\n\nexport type CharacterState = {\n id: number;\n position: {\n x: number;\n y: number;\n z: number;\n };\n rotation: {\n quaternionY: number;\n quaternionW: number;\n };\n state: AnimationState;\n};\n", "import {\n Camera,\n CircleGeometry,\n GLSL3,\n Mesh,\n Object3D,\n RawShaderMaterial,\n Scene,\n Vector3,\n} from \"three\";\n\nimport { ease } from \"../helpers/math-helpers\";\n\nexport class CharacterSpeakingIndicator {\n private vertexShader = /* glsl */ `\n in vec3 position;\n in vec2 uv;\n uniform mat4 modelViewMatrix;\n uniform mat4 projectionMatrix;\n out vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }`;\n\n private fragmentShader = /* glsl */ `\n precision highp float;\n\n uniform float time;\n uniform float alpha;\n in vec2 vUv;\n out vec4 fragColor;\n\n const float size = 1.7;\n const float distribution = 0.03;\n const float speed = 0.2;\n const float overdraw = 3.5;\n const float shapeK = 0.25;\n\n float sdHyperbola(vec2 p, float k, float wi) {\n p = abs(p);\n float k2 = k * k;\n float a = p.x + p.y;\n float i = 0.5 * (a - k2 / a) > wi ? -1.0 : 1.0;\n float x = clamp(0.5 * (a - k2 / a), 0.0, wi);\n vec2 q = vec2(x, sqrt(x * x + k2));\n float s = sign(p.x * p.x - p.y * p.y + k2);\n return s * length(p - q);\n }\n\n void main(void) {\n vec2 uv = (vUv * 2.0 - 1.0);\n float r = -(uv.x * uv.x + uv.y * uv.y);\n float z = 0.5 + 0.5 * sin((r + time * speed) / distribution);\n float a = clamp(smoothstep(-0.1, 0.2, size - length(uv * 2.0)), 0.0, 0.5);\n float h = clamp(sdHyperbola(uv, shapeK, 1.0), 0.0, 1.0) * overdraw;\n float fragAlpha = clamp(a * h, 0.0, 0.7);\n fragColor = vec4(z * fragAlpha) * alpha;\n }`;\n\n private uniforms = {\n time: { value: 0.0 },\n alpha: { value: 0.0 },\n };\n\n private geometry: CircleGeometry = new CircleGeometry(0.35, 21);\n private material: RawShaderMaterial = new RawShaderMaterial({\n vertexShader: this.vertexShader,\n fragmentShader: this.fragmentShader,\n uniforms: this.uniforms,\n transparent: true,\n glslVersion: GLSL3,\n });\n private mesh = new Mesh(this.geometry, this.material);\n\n private currentAlpha = 0.0;\n private targetAlpha = 0.0;\n\n constructor(private scene: Scene | Object3D) {\n this.scene.add(this.mesh);\n }\n\n public setBillboarding(position: Vector3, camera: Camera) {\n this.mesh.position.set(position.x, position.y - 0.15, position.z);\n this.mesh.lookAt(camera.position);\n }\n\n public setTime(value: number) {\n this.currentAlpha += ease(this.targetAlpha, this.currentAlpha, 0.06);\n this.uniforms.time.value = value;\n this.uniforms.alpha.value = this.currentAlpha;\n }\n\n public setSpeaking(value: boolean) {\n this.targetAlpha = value === true ? 1.0 : 0.0;\n }\n\n public dispose() {\n this.scene.remove(this.mesh);\n this.mesh.material.dispose();\n this.mesh.geometry.dispose();\n }\n}\n", "import {\n Camera,\n Color,\n FrontSide,\n LinearFilter,\n Mesh,\n MeshBasicMaterial,\n Object3D,\n PlaneGeometry,\n} from \"three\";\n\nimport { THREECanvasTextTexture } from \"./CanvasText\";\n\nenum LabelAlignment {\n left = \"left\",\n center = \"center\",\n right = \"right\",\n}\n\nconst fontScale = 5;\nconst defaultLabelColor = new Color(0x000000);\nconst defaultFontColor = new Color(0xffffff);\nconst defaultLabelAlignment = LabelAlignment.center;\nconst defaultLabelFontSize = 9;\nconst defaultLabelPadding = 0;\nconst defaultLabelWidth = 0.25;\nconst defaultLabelHeight = 0.125;\nconst defaultLabelCastShadows = true;\n\nexport class CharacterTooltip {\n private geometry: PlaneGeometry;\n private material: MeshBasicMaterial;\n private mesh: Mesh<PlaneGeometry, MeshBasicMaterial>;\n\n private visibleOpacity: number = 0.85;\n private targetOpacity: number = 0;\n private fadingSpeed: number = 0.02;\n private secondsToFadeOut: number = 15;\n\n private props = {\n content: \"\",\n alignment: defaultLabelAlignment,\n width: defaultLabelWidth,\n height: defaultLabelHeight,\n fontSize: defaultLabelFontSize,\n padding: defaultLabelPadding,\n color: defaultLabelColor,\n fontColor: defaultFontColor,\n castShadows: defaultLabelCastShadows,\n };\n\n constructor(parentModel: Object3D) {\n this.setText = this.setText.bind(this);\n this.material = new MeshBasicMaterial({\n map: null,\n transparent: true,\n opacity: 0,\n });\n this.material.side = FrontSide;\n this.geometry = new PlaneGeometry(1, 1, 1, 1);\n this.mesh = new Mesh(this.geometry, this.material);\n this.mesh.position.set(0, 1.6, 0);\n this.mesh.visible = false;\n parentModel.add(this.mesh);\n }\n\n private redrawText(content: string) {\n if (!this.material) {\n return;\n }\n if (this.material.map) {\n this.material.map.dispose();\n }\n const { texture, width, height } = THREECanvasTextTexture(content, {\n bold: true,\n fontSize: this.props.fontSize * fontScale,\n paddingPx: this.props.padding,\n textColorRGB255A1: {\n r: this.props.fontColor.r * 255,\n g: this.props.fontColor.g * 255,\n b: this.props.fontColor.b * 255,\n a: 1.0,\n },\n backgroundColorRGB255A1: {\n r: this.props.color.r * 255,\n g: this.props.color.g * 255,\n b: this.props.color.b * 255,\n a: 1.0,\n },\n dimensions: {\n width: this.props.width * (100 * fontScale),\n height: this.props.height * (100 * fontScale),\n },\n alignment: this.props.alignment,\n });\n\n this.material.map = texture;\n this.material.map.magFilter = LinearFilter;\n this.material.map.minFilter = LinearFilter;\n this.material.needsUpdate = true;\n\n this.mesh.scale.x = width / (100 * fontScale);\n this.mesh.scale.y = height / (100 * fontScale);\n this.mesh.position.y = 1.6;\n }\n\n setText(text: string, temporary: boolean = false) {\n this.redrawText(text);\n this.mesh.visible = true;\n this.targetOpacity = this.visibleOpacity;\n if (temporary) {\n setTimeout(() => {\n this.hide();\n }, this.secondsToFadeOut * 1000);\n }\n }\n\n hide() {\n this.targetOpacity = 0;\n }\n\n update(camera: Camera) {\n this.mesh.lookAt(camera.position);\n const opacity = this.mesh.material.opacity;\n if (opacity < this.targetOpacity) {\n this.mesh.material.opacity = Math.min(\n this.mesh.material.opacity + this.fadingSpeed,\n this.targetOpacity,\n );\n } else if (opacity > this.targetOpacity) {\n this.mesh.material.opacity = Math.max(\n this.mesh.material.opacity - this.fadingSpeed,\n this.targetOpacity,\n );\n if (opacity >= 1 && this.mesh.material.transparent === true) {\n this.mesh.material.transparent = false;\n this.mesh.material.needsUpdate = true;\n } else if (opacity > 0 && opacity < 1 && this.mesh.material.transparent === false) {\n this.mesh.material.transparent = true;\n this.mesh.material.needsUpdate = true;\n }\n if (this.mesh.material.opacity <= 0) {\n this.mesh.visible = false;\n }\n }\n }\n}\n", "import { Texture, LinearFilter, RGBAFormat, MeshBasicMaterial } from \"three\";\n\ntype RGBA = {\n r: number;\n g: number;\n b: number;\n a: number;\n};\n\ntype CanvasTextOptions = {\n fontSize: number;\n textColorRGB255A1: RGBA;\n backgroundColorRGB255A1?: RGBA;\n font?: string;\n bold?: boolean;\n paddingPx?: number;\n alignment?: string;\n dimensions?: {\n width: number;\n height: number;\n };\n};\n\nfunction getTextAlignOffset(textAlign: CanvasTextAlign, width: number) {\n switch (textAlign) {\n case \"center\":\n return width / 2;\n case \"right\":\n return width;\n default:\n return 0;\n }\n}\n\nfunction printAtWordWrap(\n context: CanvasRenderingContext2D,\n fullText: string,\n x: number,\n y: number,\n lineHeight: number,\n fitWidth: number,\n padding: number,\n alignment: string,\n) {\n const lines = fullText.split(\"\\n\");\n let currentLine = 0;\n for (const text of lines) {\n fitWidth = fitWidth || 0;\n\n if (fitWidth <= 0) {\n context.fillText(text, x, y + lineHeight * currentLine);\n currentLine++;\n continue;\n }\n let words = text.split(\" \");\n let lastWordIndex = 1;\n while (words.length > 0 && lastWordIndex <= words.length) {\n const str = words.slice(0, lastWordIndex).join(\" \");\n const textWidth = context.measureText(str).width;\n if (textWidth + padding * 2 > fitWidth) {\n if (lastWordIndex === 1) {\n lastWordIndex = 2;\n }\n context.fillText(\n words.slice(0, lastWordIndex - 1).join(\" \"),\n x + padding,\n y + lineHeight * currentLine + padding,\n );\n currentLine++;\n words = words.splice(lastWordIndex - 1);\n lastWordIndex = 1;\n } else {\n lastWordIndex++;\n }\n }\n if (lastWordIndex > 0 && words.length > 0) {\n const xOffset = alignment === \"center\" ? 0 : padding;\n context.fillText(words.join(\" \"), x + xOffset, y + lineHeight * currentLine + padding);\n currentLine++;\n }\n }\n}\n\nexport function CanvasText(message: string, options: CanvasTextOptions): HTMLCanvasElement {\n const fontsize = options.fontSize;\n const textColor = options.textColorRGB255A1;\n const backgroundColor = options.backgroundColorRGB255A1 || { r: 255, g: 255, b: 255, a: 1 };\n const padding = options.paddingPx || 0;\n const font = options.font || \"Arial\";\n const fontString = (options.bold ? \"bold \" : \"\") + fontsize + \"px \" + font;\n\n const canvas = document.createElement(\"canvas\");\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const ct = canvas.getContext(\"2d\")!;\n\n // calculate text alignment offset\n const textAlign = (options.alignment as CanvasTextAlign) ?? \"left\";\n\n if (options.dimensions) {\n // NOTE: setting the canvas dimensions resets the context properties, so\n // we always do it first\n canvas.width = options.dimensions.width;\n canvas.height = options.dimensions.height;\n ct.clearRect(0, 0, canvas.width, canvas.height);\n ct.font = fontString;\n ct.textAlign = textAlign;\n ct.fillStyle = `rgba(${backgroundColor.r}, ${backgroundColor.g}, ${backgroundColor.b}, ${backgroundColor.a})`;\n ct.lineWidth = 0;\n ct.fillRect(0, 0, canvas.width, canvas.height);\n ct.fillStyle = `rgba(${textColor.r}, ${textColor.g}, ${textColor.b}, ${textColor.a})`;\n ct.font = fontString;\n printAtWordWrap(\n ct,\n message,\n getTextAlignOffset(textAlign, canvas.width),\n fontsize,\n fontsize,\n canvas.width,\n padding,\n textAlign,\n );\n } else {\n // NOTE: setting the canvas dimensions resets the context properties, so\n // we always do it first. However, we also need to take into account the\n // font size to measure the text in the first place.\n ct.font = fontString;\n const metrics = ct.measureText(message);\n const textWidth = metrics.width;\n const textHeight = metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent;\n canvas.width = textWidth + padding * 2;\n canvas.height = textHeight + padding;\n ct.clearRect(0, 0, canvas.width, canvas.height);\n ct.font = fontString;\n ct.textAlign = textAlign;\n ct.fillStyle = `rgba(${backgroundColor.r}, ${backgroundColor.g}, ${backgroundColor.b}, ${backgroundColor.a})`;\n ct.lineWidth = 0;\n ct.fillRect(0, 0, canvas.width, canvas.height);\n ct.fillStyle = `rgba(${textColor.r}, ${textColor.g}, ${textColor.b}, ${textColor.a})`;\n ct.font = fontString;\n ct.fillText(message, padding + getTextAlignOffset(textAlign, textWidth), textHeight);\n }\n\n return canvas;\n}\n\nexport function THREECanvasTextTexture(\n text: string,\n options: CanvasTextOptions,\n): { texture: Texture; width: number; height: number } {\n const canvas = CanvasText(text, options);\n\n const texture = new Texture(canvas);\n texture.minFilter = LinearFilter;\n texture.magFilter = LinearFilter;\n texture.format = RGBAFormat;\n texture.needsUpdate = true;\n\n return { texture, width: canvas.width, height: canvas.height };\n}\n\nexport function THREECanvasTextMaterial(\n text: string,\n options: CanvasTextOptions,\n): { material: MeshBasicMaterial; width: number; height: number } {\n const { texture, width, height } = THREECanvasTextTexture(text, options);\n\n const material = new MeshBasicMaterial();\n material.map = texture;\n material.transparent = true;\n material.depthWrite = false;\n material.needsUpdate = true;\n\n return { material, width, height };\n}\n", "import { 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 = 70;\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 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\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 this.networkState = {\n id: this.id,\n position: { x: 0, y: 0, z: 0 },\n rotation: { quaternionY: 0, quaternionW: 1 },\n state: AnimationState.idle,\n };\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 computeAngularDifference(rotationQuaternion: Quaternion): number {\n if (!this.model?.mesh) return 0;\n return 2 * Math.acos(Math.abs(this.model.mesh.quaternion.dot(rotationQuaternion)));\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 const angularDifference = this.computeAngularDifference(rotationQuaternion);\n const desiredTime = 0.07;\n const angularSpeed = angularDifference / desiredTime;\n const frameRotation = angularSpeed * this.timeManager.deltaTime;\n this.model.mesh.quaternion.rotateTowards(rotationQuaternion, frameRotation);\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 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.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.collisionsManager.applyColliders(this.tempSegment, this.capsuleInfo.radius!);\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) {\n this.networkState = {\n id: this.id,\n position: new Vector3(),\n rotation: { quaternionY: 0, quaternionW: 1 },\n state: AnimationState.idle as AnimationState,\n };\n } else {\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\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, Euler, Group, Object3D, PerspectiveCamera, Quaternion, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { ease, getSpawnPositionInsideCircle, toArray } from \"../helpers/math-helpers\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { Composer } from \"../rendering/composer\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { Character, CharacterDescription } from \"./Character\";\nimport { CharacterModelLoader } from \"./CharacterModelLoader\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\nimport { RemoteController } from \"./RemoteController\";\n\nfunction encodeCharacterAndCamera(character: Object3D, camera: PerspectiveCamera): string {\n return [\n ...toArray(character.position),\n ...toArray(character.quaternion),\n ...toArray(camera.position),\n ...toArray(camera.quaternion),\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 private id: number = 0;\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 private speakingCharacters: Map<number, boolean> = new Map();\n\n public readonly group: Group;\n\n constructor(\n private readonly composer: Composer,\n private readonly characterModelLoader: CharacterModelLoader,\n private readonly collisionsManager: CollisionsManager,\n private readonly cameraManager: CameraManager,\n private readonly timeManager: TimeManager,\n private readonly inputManager: KeyInputManager,\n private readonly clientStates: Map<number, CharacterState>,\n private readonly sendUpdate: (update: CharacterState) => void,\n ) {\n this.group = new Group();\n }\n\n /* 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 spawnRotation: Euler = new Euler(),\n ) {\n this.characterDescription = characterDescription;\n const characterLoadingPromise = new Promise<Character>((resolve) => {\n const character = new Character(\n characterDescription,\n this.characterModelLoader,\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 = spawnPosition || getSpawnPositionInsideCircle(3, 30, id, 0.4);\n character.model!.mesh!.position.set(spawnPosition.x, spawnPosition.y, spawnPosition.z);\n character.model!.mesh!.rotation.set(spawnRotation.x, spawnRotation.y, spawnRotation.z);\n character.position.set(spawnPosition.x, spawnPosition.y, spawnPosition.z);\n character.model!.mesh!.updateMatrixWorld();\n const quaternion = new Quaternion().setFromEuler(character.model!.mesh!.rotation);\n this.sendUpdate({\n id: id,\n position: {\n x: spawnPosition.x,\n y: spawnPosition.y,\n z: spawnPosition.z,\n },\n rotation: { quaternionY: quaternion.y, quaternionW: quaternion.w },\n state: AnimationState.idle,\n });\n }\n 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.id = id;\n this.character = character;\n this.character.tooltip?.setText(`${id}`);\n } else {\n this.remoteCharacters.set(id, character);\n const remoteController = new RemoteController(character, this.characterModelLoader, 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 character.tooltip?.setText(`${id}`);\n }\n resolve(character);\n },\n this.collisionsManager,\n this.inputManager,\n this.cameraManager,\n this.timeManager,\n this.composer,\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 setSpeakingCharacter(id: number, value: boolean) {\n this.speakingCharacters.set(id, value);\n }\n\n public update() {\n if (this.character) {\n this.character.update(this.timeManager.time);\n if (this.speakingCharacters.has(this.id)) {\n this.character.speakingIndicator?.setSpeaking(this.speakingCharacters.get(this.id)!);\n }\n\n if (this.character.model?.mesh) {\n this.cameraOffsetTarget = this.cameraManager.targetDistance <= 0.4 ? 0.13 : 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 if (this.remoteCharacters.has(id) && this.speakingCharacters.has(id)) {\n const character = this.remoteCharacters.get(id);\n character?.speakingIndicator?.setSpeaking(this.speakingCharacters.get(id)!);\n }\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 character.speakingIndicator?.dispose();\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 { CharacterModelLoader } from \"./CharacterModelLoader\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\n\nexport class RemoteController {\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\n constructor(\n public readonly character: Character,\n private readonly characterModelLoader: CharacterModelLoader,\n public readonly id: number,\n ) {\n this.characterModel = this.character.model!.mesh!;\n this.characterModel.updateMatrixWorld();\n this.animationMixer = new AnimationMixer(this.characterModel);\n this.networkState = {\n id: this.id,\n position: { x: 0, y: 0, z: 0 },\n rotation: { quaternionY: 0, quaternionW: 1 },\n state: this.currentAnimation as AnimationState,\n };\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.characterModelLoader.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", "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 CharacterModelLoader {\n private static instance: CharacterModelLoader | 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(): CharacterModelLoader {\n if (!CharacterModelLoader.instance) {\n CharacterModelLoader.instance = new CharacterModelLoader();\n }\n return CharacterModelLoader.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 = CharacterModelLoader.getInstance();\nexport default MODEL_LOADER;\n", "import { EventHandlerCollection } from \"./EventHandlerCollection\";\n\nenum Key {\n W = \"w\",\n A = \"a\",\n S = \"s\",\n D = \"d\",\n SHIFT = \"shift\",\n SPACE = \" \",\n}\n\nexport class KeyInputManager {\n private keys = new Map<string, boolean>();\n private eventHandlerCollection = new EventHandlerCollection();\n\n constructor(private shouldCaptureKeyPress: () => boolean = () => true) {\n this.eventHandlerCollection.add(document, \"keydown\", this.onKeyDown.bind(this));\n this.eventHandlerCollection.add(document, \"keyup\", this.onKeyUp.bind(this));\n this.eventHandlerCollection.add(window, \"blur\", this.handleUnfocus.bind(this));\n }\n\n private handleUnfocus(_event: FocusEvent): void {\n this.keys.clear();\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n if (this.shouldCaptureKeyPress()) {\n if (event.key.length === 2 && event.key[0] === \"F\") {\n // Ignore all Function keys\n return;\n }\n if (event.metaKey) {\n // Ignore all meta keys (e.g. Alt, Cmd)\n return;\n }\n this.keys.set(event.key.toLowerCase(), true);\n event.preventDefault();\n }\n }\n\n private onKeyUp(event: KeyboardEvent): void {\n this.keys.set(event.key.toLowerCase(), false);\n }\n\n public isKeyPressed(key: string): boolean {\n return this.keys.get(key) || false;\n }\n\n public isMovementKeyPressed(): boolean {\n return [Key.W, Key.A, Key.S, Key.D].some((key) => this.isKeyPressed(key));\n }\n\n get forward(): boolean {\n return this.isKeyPressed(Key.W);\n }\n\n get backward(): boolean {\n return this.isKeyPressed(Key.S);\n }\n\n get left(): boolean {\n return this.isKeyPressed(Key.A);\n }\n\n get right(): boolean {\n return this.isKeyPressed(Key.D);\n }\n\n get run(): boolean {\n return this.isKeyPressed(Key.SHIFT);\n }\n\n get jump(): boolean {\n return this.isKeyPressed(Key.SPACE);\n }\n\n get anyDirection(): boolean {\n return this.isMovementKeyPressed();\n }\n\n get conflictingDirection(): boolean {\n return (\n (this.isKeyPressed(Key.W) && this.isKeyPressed(Key.S)) ||\n (this.isKeyPressed(Key.A) && this.isKeyPressed(Key.D))\n );\n }\n\n public dispose() {\n this.eventHandlerCollection.clear();\n }\n}\n", "import {\n IMMLScene,\n Interaction,\n InteractionListener,\n InteractionManager,\n MElement,\n MMLClickTrigger,\n PositionAndRotation,\n PromptManager,\n PromptProps,\n ChatProbe,\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\n public readonly mmlScene: IMMLScene;\n private readonly promptManager: PromptManager;\n private readonly interactionManager: InteractionManager;\n private readonly interactionListener: InteractionListener;\n private readonly chatProbes = new Set<ChatProbe>();\n private readonly clickTrigger: MMLClickTrigger;\n\n constructor(\n targetElement: HTMLElement,\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 ) {\n this.group = new Group();\n this.promptManager = PromptManager.init(targetElement);\n\n const { interactionListener, interactionManager } = InteractionManager.init(\n targetElement,\n this.camera,\n this.scene,\n );\n this.interactionManager = interactionManager;\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 addChatProbe: (chatProbe: ChatProbe) => {\n this.chatProbes.add(chatProbe);\n },\n updateChatProbe: () => {\n // no-op\n },\n removeChatProbe: (chatProbe: ChatProbe) => {\n this.chatProbes.delete(chatProbe);\n },\n prompt: (promptProps: PromptProps, callback: (message: string | null) => void) => {\n this.promptManager.prompt(promptProps, callback);\n },\n };\n\n this.clickTrigger = MMLClickTrigger.init(targetElement, this.mmlScene as IMMLScene);\n }\n\n onChatMessage(message: string) {\n for (const chatProbe of this.chatProbes) {\n chatProbe.trigger(message);\n }\n }\n\n dispose() {\n this.promptManager.dispose();\n this.clickTrigger.dispose();\n this.interactionManager.dispose();\n }\n}\n", "import * as EssentialsPlugin from \"@tweakpane/plugin-essentials\";\nimport {\n BloomEffect,\n EffectComposer,\n EffectPass,\n NormalPass,\n SSAOEffect,\n ToneMappingEffect,\n} from \"postprocessing\";\nimport { Scene, WebGLRenderer } from \"three\";\nimport { FolderApi, Pane } from \"tweakpane\";\n\nimport { BrightnessContrastSaturation } from \"../rendering/post-effects/bright-contrast-sat\";\nimport { GaussGrainEffect } from \"../rendering/post-effects/gauss-grain\";\nimport { Sun } from \"../sun/Sun\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { BrightnessContrastSaturationFolder } from \"./blades/bcsFolder\";\nimport { CharacterFolder } from \"./blades/characterFolder\";\nimport { EnvironmentFolder } from \"./blades/environmentFolder\";\nimport { PostExtrasFolder } from \"./blades/postExtrasFolder\";\nimport { RendererFolder, rendererValues } from \"./blades/rendererFolder\";\nimport { RendererStatsFolder } from \"./blades/rendererStatsFolder\";\nimport { SSAOFolder } from \"./blades/ssaoFolder\";\nimport { ToneMappingFolder } from \"./blades/toneMappingFolder\";\nimport { setTweakpaneActive } from \"./tweakPaneActivity\";\nimport { tweakPaneStyle } from \"./tweakPaneStyle\";\n\nexport class TweakPane {\n private gui: Pane = new Pane();\n\n private renderStatsFolder: RendererStatsFolder;\n private rendererFolder: RendererFolder;\n private toneMappingFolder: ToneMappingFolder;\n private ssaoFolder: SSAOFolder;\n private bcsFolder: BrightnessContrastSaturationFolder;\n private postExtrasFolder: PostExtrasFolder;\n // @ts-ignore\n private character: CharacterFolder;\n private environment: EnvironmentFolder;\n\n private export: FolderApi;\n\n private saveVisibilityInLocalStorage: boolean = true;\n public guiVisible: boolean = false;\n\n constructor(\n private renderer: WebGLRenderer,\n private scene: Scene,\n private composer: EffectComposer,\n ) {\n this.gui.registerPlugin(EssentialsPlugin);\n\n if (this.saveVisibilityInLocalStorage) {\n const localStorageGuiVisible = localStorage.getItem(\"guiVisible\");\n if (localStorageGuiVisible !== null) {\n if (localStorageGuiVisible === \"true\") {\n this.guiVisible = true;\n } else if (localStorageGuiVisible === \"false\") {\n this.guiVisible = false;\n }\n }\n }\n\n const styleElement = document.createElement(\"style\");\n styleElement.type = \"text/css\";\n styleElement.appendChild(document.createTextNode(tweakPaneStyle));\n document.head.appendChild(styleElement);\n\n this.renderStatsFolder = new RendererStatsFolder(this.gui, true);\n this.rendererFolder = new RendererFolder(this.gui, false);\n this.toneMappingFolder = new ToneMappingFolder(this.gui, false);\n this.ssaoFolder = new SSAOFolder(this.gui, false);\n this.bcsFolder = new BrightnessContrastSaturationFolder(this.gui, false);\n this.postExtrasFolder = new PostExtrasFolder(this.gui, false);\n this.character = new CharacterFolder(this.gui, false);\n this.environment = new EnvironmentFolder(this.gui, false);\n\n this.toneMappingFolder.folder.hidden = rendererValues.toneMapping === 5 ? false : true;\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 composer: EffectComposer,\n normalPass: NormalPass,\n ppssaoEffect: SSAOEffect,\n ppssaoPass: EffectPass,\n n8aopass: any,\n toneMappingEffect: ToneMappingEffect,\n toneMappingPass: EffectPass,\n brightnessContrastSaturation: typeof BrightnessContrastSaturation,\n bloomEffect: BloomEffect,\n gaussGrainEffect: typeof GaussGrainEffect,\n hasLighting: boolean,\n sun: Sun | null,\n setHDR: () => void,\n setAmbientLight: () => void,\n setFog: () => void,\n ): void {\n // RenderOptions\n this.rendererFolder.setupChangeEvent(\n this.scene,\n this.renderer,\n this.toneMappingFolder.folder,\n toneMappingPass,\n );\n\n this.toneMappingFolder.setupChangeEvent(toneMappingEffect);\n this.ssaoFolder.setupChangeEvent(composer, normalPass, ppssaoEffect, ppssaoPass, n8aopass);\n this.bcsFolder.setupChangeEvent(brightnessContrastSaturation);\n this.postExtrasFolder.setupChangeEvent(bloomEffect, gaussGrainEffect);\n this.environment.setupChangeEvent(setHDR, setAmbientLight, setFog, sun);\n this.environment.folder.hidden = hasLighting === false || sun === null;\n\n const exportButton = this.export.addButton({ title: \"export\" });\n exportButton.on(\"click\", () => {\n this.downloadSettingsAsJSON(this.gui.exportState());\n });\n const importButton = this.export.addButton({ title: \"import\" });\n importButton.on(\"click\", () => {\n this.importSettingsFromJSON((settings) => {\n this.gui.importState(settings);\n });\n });\n }\n\n public updateStats(timeManager: TimeManager): void {\n this.renderStatsFolder.update(this.renderer, this.composer, timeManager);\n }\n\n private formatDateForFilename(): string {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\"); // Months are 0-11\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${year}-${month}-${day} ${hours}-${minutes}-${seconds}`;\n }\n\n private downloadSettingsAsJSON(settings: any): void {\n const jsonString = JSON.stringify(settings, null, 2);\n const blob = new Blob([jsonString], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.download = `settings ${this.formatDateForFilename()}.json`;\n a.href = url;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n private importSettingsFromJSON(callback: (settings: any) => void): void {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \".json\";\n input.addEventListener(\"change\", (event) => {\n const file = (event.target as HTMLInputElement).files?.[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (loadEvent) => {\n try {\n const settings = JSON.parse(loadEvent.target?.result as string);\n callback(settings);\n } catch (err) {\n console.error(\"Error parsing JSON:\", err);\n }\n };\n reader.readAsText(file);\n }\n });\n input.click();\n }\n\n private toggleGUI(): void {\n 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 { BladeController, View } from \"@tweakpane/core\";\nimport { BladeApi, FolderApi, TpChangeEvent } from \"tweakpane\";\n\nimport { BrightnessContrastSaturation } from \"../../rendering/post-effects/bright-contrast-sat\";\n\nexport const bcsValues = {\n brightness: 0,\n contrast: 1.25,\n saturation: 1,\n};\n\nconst bcsOptions = {\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};\n\nexport class BrightnessContrastSaturationFolder {\n private folder: FolderApi;\n constructor(parentFolder: FolderApi, expand: boolean = false) {\n this.folder = parentFolder.addFolder({\n title: \"brightness / contrast / sat\",\n expanded: expand,\n });\n this.folder.addBinding(bcsValues, \"brightness\", bcsOptions.brightness.amount);\n this.folder.addBinding(bcsValues, \"contrast\", bcsOptions.contrast.amount);\n this.folder.addBinding(bcsValues, \"saturation\", bcsOptions.saturation.amount);\n }\n\n public setupChangeEvent(brightnessContrastSaturation: typeof BrightnessContrastSaturation): void {\n this.folder.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"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 }\n });\n }\n}\n", "import { BladeController, View } from \"@tweakpane/core\";\nimport { BladeApi, ButtonApi, FolderApi, TpChangeEvent } from \"tweakpane\";\n\nimport { Sun } from \"../../sun/Sun\";\n\nexport const sunValues = {\n sunPosition: {\n sunAzimuthalAngle: 39,\n sunPolarAngle: 50,\n },\n sunIntensity: 0.5,\n sunColor: { r: 1.0, g: 0.74, b: 0.5 },\n};\n\nconst sunOptions = {\n sunPosition: {\n sunAzimuthalAngle: { min: 0, max: 360, step: 1 },\n sunPolarAngle: { min: -90, max: 90, step: 1 },\n },\n sunIntensity: { min: 0, max: 1, step: 0.05 },\n};\n\nexport const envValues = {\n ambientLight: {\n ambientLightIntensity: 0.0,\n ambientLightColor: { r: 1, g: 1, b: 1 },\n },\n fog: {\n fogNear: 30,\n fogFar: 210,\n fogColor: { r: 0.42, g: 0.48, b: 0.59 },\n },\n};\n\nconst envOptions = {\n ambientLight: {\n ambientLightIntensity: { min: 0, max: 1, step: 0.01 },\n },\n fog: {\n fogNear: { min: 0, max: 80, step: 1 },\n fogFar: { min: 81, max: 300, step: 1 },\n },\n};\n\nexport class EnvironmentFolder {\n public folder: FolderApi;\n private sun: FolderApi;\n private sunButton: ButtonApi;\n private ambient: FolderApi;\n\n constructor(parentFolder: FolderApi, expand: boolean = false) {\n this.folder = parentFolder.addFolder({ title: \"environment\", expanded: expand });\n\n this.sun = this.folder.addFolder({ title: \"sun\", expanded: true });\n\n this.ambient = this.folder.addFolder({ title: \"ambient\", expanded: true });\n\n this.sun.addBinding(\n sunValues.sunPosition,\n \"sunAzimuthalAngle\",\n sunOptions.sunPosition.sunAzimuthalAngle,\n );\n this.sun.addBinding(\n sunValues.sunPosition,\n \"sunPolarAngle\",\n sunOptions.sunPosition.sunPolarAngle,\n );\n this.sun.addBinding(sunValues, \"sunIntensity\", sunOptions.sunIntensity);\n this.sun.addBinding(sunValues, \"sunColor\", {\n color: { type: \"float\" },\n });\n this.sunButton = this.sun.addButton({ title: \"Set HDRI\" });\n\n this.ambient.addBinding(\n envValues.ambientLight,\n \"ambientLightIntensity\",\n envOptions.ambientLight.ambientLightIntensity,\n );\n this.ambient.addBinding(envValues.ambientLight, \"ambientLightColor\", {\n color: { type: \"float\" },\n });\n this.ambient.addBinding(envValues.fog, \"fogNear\", envOptions.fog.fogNear);\n this.ambient.addBinding(envValues.fog, \"fogFar\", envOptions.fog.fogFar);\n this.ambient.addBinding(envValues.fog, \"fogColor\", {\n color: { type: \"float\" },\n });\n }\n\n public setupChangeEvent(\n setHDR: () => void,\n setAmbientLight: () => void,\n setFog: () => void,\n sun: Sun | null,\n ): void {\n this.sun.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"sunAzimuthalAngle\": {\n const value = e.value as number;\n sun?.setAzimuthalAngle(value * (Math.PI / 180));\n break;\n }\n case \"sunPolarAngle\": {\n const value = e.value as number;\n sun?.setPolarAngle(value * (Math.PI / 180));\n break;\n }\n case \"sunIntensity\": {\n const value = e.value as number;\n sun?.setIntensity(value);\n break;\n }\n case \"sunColor\": {\n const value = e.value as { r: number; g: number; b: number };\n sunValues.sunColor = {\n r: value.r,\n g: value.g,\n b: value.b,\n };\n sun?.setColor();\n break;\n }\n default:\n break;\n }\n });\n this.sunButton.on(\"click\", () => {\n setHDR();\n });\n this.ambient.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"ambientLightIntensity\": {\n envValues.ambientLight.ambientLightIntensity = e.value as number;\n setAmbientLight();\n break;\n }\n case \"ambientLightColor\": {\n const value = e.value as { r: number; g: number; b: number };\n envValues.ambientLight.ambientLightColor = {\n r: value.r,\n g: value.g,\n b: value.b,\n };\n setAmbientLight();\n break;\n }\n case \"fogNear\": {\n envValues.fog.fogNear = e.value as number;\n setFog();\n break;\n }\n case \"fogFar\": {\n envValues.fog.fogFar = e.value as number;\n setFog();\n break;\n }\n case \"fogColor\": {\n const value = e.value as { r: number; g: number; b: number };\n envValues.fog.fogColor = {\n r: value.r,\n g: value.g,\n b: value.b,\n };\n setFog();\n break;\n }\n default:\n break;\n }\n });\n }\n}\n", "import { BladeController, View } from \"@tweakpane/core\";\nimport { BloomEffect } from \"postprocessing\";\nimport { BladeApi, FolderApi, TpChangeEvent } from \"tweakpane\";\n\nimport { GaussGrainEffect } from \"../../rendering/post-effects/gauss-grain\";\n\nexport const extrasValues = {\n grain: 0.055,\n bloom: 0.25,\n};\n\nconst extrasOptions = {\n grain: {\n amount: { min: 0, max: 0.2, step: 0.002 },\n },\n bloom: {\n amount: { min: 0, max: 2, step: 0.05 },\n },\n};\n\nexport class PostExtrasFolder {\n private folder: FolderApi;\n constructor(parentFolder: FolderApi, expand: boolean = false) {\n this.folder = parentFolder.addFolder({ title: \"bloom / grain\", expanded: expand });\n this.folder.addBinding(extrasValues, \"bloom\", extrasOptions.bloom.amount);\n this.folder.addBinding(extrasValues, \"grain\", extrasOptions.grain.amount);\n }\n\n public setupChangeEvent(\n bloomEffect: BloomEffect,\n gaussGrainEffect: typeof GaussGrainEffect,\n ): void {\n this.folder.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"bloom\":\n bloomEffect.intensity = e.value as number;\n break;\n case \"grain\":\n gaussGrainEffect.uniforms.amount.value = e.value as number;\n break;\n default:\n break;\n }\n });\n }\n}\n", "import { BladeController, View } from \"@tweakpane/core\";\nimport { EffectPass } from \"postprocessing\";\nimport { Scene, ShadowMapType, ToneMapping, WebGLRenderer } from \"three\";\nimport { BladeApi, FolderApi, TpChangeEvent } from \"tweakpane\";\n\nexport const rendererValues = {\n shadowMap: 2,\n toneMapping: 5,\n exposure: 1,\n bgIntensity: 0.45,\n bgBlurriness: 0.0,\n};\n\nconst rendererOptions = {\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.3, step: 0.01 },\n bgBlurriness: { min: 0, max: 0.1, step: 0.001 },\n};\n\nconst shadowMapTypes: Record<number, string> = {\n 0: \"BasicShadowMap\",\n 1: \"PCFShadowMap\",\n 2: \"PCFSoftShadowMap\",\n};\n\nconst toneMappingTypes: Record<number, string> = {\n 0: \"NoToneMapping\",\n 1: \"LinearToneMapping\",\n 2: \"ReinhardToneMapping\",\n 3: \"CineonToneMapping\",\n 4: \"ACESFilmicToneMapping\",\n 5: \"CustomToneMapping\",\n};\n\nconst monitoredValues = {\n shadowMapType: shadowMapTypes[rendererValues.shadowMap],\n toneMappingType: toneMappingTypes[rendererValues.toneMapping],\n};\n\nconst setShadowMapType = (value: number): void => {\n monitoredValues.shadowMapType = shadowMapTypes[value];\n};\n\nconst setToneMappingType = (value: number): void => {\n monitoredValues.toneMappingType = toneMappingTypes[value];\n};\n\nexport class RendererFolder {\n private folder: FolderApi;\n\n constructor(parentFolder: FolderApi, expand: boolean = false) {\n this.folder = parentFolder.addFolder({\n title: \"rendererOptions\",\n expanded: expand,\n });\n\n this.folder.addBinding(rendererValues, \"shadowMap\", rendererOptions.shadowMap);\n this.folder.addBinding(monitoredValues, \"shadowMapType\", { readonly: true });\n this.folder.addBinding(rendererValues, \"toneMapping\", rendererOptions.toneMapping);\n this.folder.addBinding(monitoredValues, \"toneMappingType\", { readonly: true });\n this.folder.addBinding(rendererValues, \"exposure\", rendererOptions.exposure);\n this.folder.addBinding(rendererValues, \"bgIntensity\", rendererOptions.bgIntensity);\n this.folder.addBinding(rendererValues, \"bgBlurriness\", rendererOptions.bgBlurriness);\n }\n\n public setupChangeEvent(\n scene: Scene,\n renderer: WebGLRenderer,\n toneMappingFolder: FolderApi,\n toneMappingPass: EffectPass,\n ): void {\n this.folder.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"shadowMap\": {\n const value = e.value as ShadowMapType;\n renderer.shadowMap.type = value;\n setShadowMapType(value);\n break;\n }\n case \"toneMapping\":\n renderer.toneMapping = e.value as ToneMapping;\n toneMappingFolder.hidden = e.value !== 5;\n toneMappingPass.enabled = e.value === 5 ? true : false;\n setToneMappingType(e.value as ToneMapping);\n break;\n case \"exposure\":\n renderer.toneMappingExposure = e.value as number;\n break;\n case \"bgIntensity\":\n scene.backgroundIntensity = e.value as number;\n break;\n case \"bgBlurriness\":\n scene.backgroundBlurriness = e.value as number;\n break;\n default:\n break;\n }\n });\n }\n}\n", "import { EffectComposer } from \"postprocessing\";\nimport { WebGLRenderer } from \"three\";\nimport { FolderApi } from \"tweakpane\";\n\nimport { TimeManager } from \"../../time/TimeManager\";\n\ntype StatsData = {\n triangles: string;\n geometries: string;\n textures: string;\n shaders: string;\n postPasses: string;\n drawCalls: string;\n rawDeltaTime: string;\n deltaTime: string;\n FPS: string;\n};\n\nexport class RendererStatsFolder {\n private folder: FolderApi;\n private performance: FolderApi;\n private defails: FolderApi;\n\n private statsData: 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\n constructor(parentFolder: FolderApi, expanded: boolean = true) {\n this.folder = parentFolder.addFolder({ title: \"renderStats\", expanded: expanded });\n this.performance = this.folder.addFolder({ title: \"performance\", expanded: true });\n this.defails = this.folder.addFolder({ title: \"pipeline details\", expanded: false });\n this.folder.addBlade({ view: \"separator\" });\n\n this.performance.addBinding(this.statsData, \"FPS\", { readonly: true });\n this.performance.addBinding(this.statsData, \"deltaTime\", { readonly: true });\n this.performance.addBinding(this.statsData, \"rawDeltaTime\", { readonly: true });\n\n this.defails.addBinding(this.statsData, \"triangles\", { readonly: true });\n this.defails.addBinding(this.statsData, \"geometries\", { readonly: true });\n this.defails.addBinding(this.statsData, \"textures\", { readonly: true });\n this.defails.addBinding(this.statsData, \"shaders\", { readonly: true });\n this.defails.addBinding(this.statsData, \"postPasses\", { readonly: true });\n this.defails.addBinding(this.statsData, \"drawCalls\", { readonly: true });\n }\n\n public update(renderer: WebGLRenderer, composer: EffectComposer, timeManager: TimeManager): void {\n const { geometries, textures } = renderer.info.memory;\n const { triangles, calls } = renderer.info.render;\n this.statsData.triangles = triangles.toString();\n this.statsData.geometries = geometries.toString();\n this.statsData.textures = textures.toString();\n this.statsData.shaders = renderer.info.programs!.length.toString();\n this.statsData.postPasses = composer.passes.length.toString();\n this.statsData.drawCalls = calls.toString();\n this.statsData.rawDeltaTime = (\n Math.round(timeManager.rawDeltaTime * 100000) / 100000\n ).toString();\n this.statsData.deltaTime = (Math.round(timeManager.deltaTime * 100000) / 100000).toString();\n this.statsData.FPS = timeManager.fps.toString();\n }\n}\n", "import { BindingApi, BladeApi, BladeController, TpChangeEvent, View } from \"@tweakpane/core\";\nimport { BlendFunction, EffectComposer, EffectPass, NormalPass, SSAOEffect } from \"postprocessing\";\nimport { Color } from \"three\";\nimport { FolderApi } from \"tweakpane\";\n\nexport const ppssaoValues = {\n enabled: false,\n blendFunction: BlendFunction.MULTIPLY,\n distanceScaling: true,\n depthAwareUpsampling: true,\n samples: 30,\n rings: 11,\n luminanceInfluence: 0.7,\n radius: 0.03,\n intensity: 2.5,\n bias: 0.05,\n fade: 0.03,\n resolutionScale: 0.5,\n color: { r: 0, g: 0, b: 0 },\n worldDistanceThreshold: 30,\n worldDistanceFalloff: 7,\n worldProximityThreshold: 0.5,\n worldProximityFalloff: 0.3,\n};\n\nconst ppssaoOptions = {\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\nexport const n8ssaoValues = {\n enabled: true,\n halfRes: false,\n aoRadius: 5,\n distanceFalloff: 3.0,\n intensity: 1.0,\n color: { r: 0, g: 0, b: 0 },\n aoSamples: 16,\n denoiseSamples: 4,\n denoiseRadius: 12,\n viewMode: \"Combined\",\n};\n\nconst n8ssaoOptions = {\n radius: { min: 0.1, max: 6, step: 0.1 },\n distanceFalloff: { min: 1, max: 6, step: 0.1 },\n intensity: { min: 0.1, max: 5, step: 0.1 },\n aoSamples: [2, 4, 8, 16, 32, 64],\n denoiseSamples: [2, 4, 8, 16, 32, 64],\n denoiseRadius: [3, 6, 12],\n viewMode: [\"Combined\", \"AO\", \"Split\", \"No AO\"],\n};\n\nconst ssaoMaterialParams = [\n \"fade\",\n \"bias\",\n \"minRadiusScale\",\n \"worldDistanceThreshold\",\n \"worldDistanceFalloff\",\n \"worldProximityThreshold\",\n \"worldProximityFalloff\",\n];\n\nexport class SSAOFolder {\n private folder: FolderApi;\n\n private ppssao: FolderApi;\n private n8ssao: FolderApi;\n\n private aoSamples: BindingApi;\n private denoiseSamples: BindingApi;\n private denoiseRadius: BindingApi;\n private aoDisplay: BindingApi;\n\n private postProcessingSSAOIndex: number = 1;\n\n constructor(parentFolder: FolderApi, expand: boolean = false) {\n this.folder = parentFolder.addFolder({ title: \"ambientOcclusion\", expanded: expand });\n this.n8ssao = this.folder.addFolder({\n title: \"N8 ambientOcclusion\",\n expanded: n8ssaoValues.enabled,\n });\n this.ppssao = this.folder.addFolder({\n title: \"PP ambientOcclusion\",\n expanded: ppssaoValues.enabled,\n });\n\n // Post-processing SSAO\n {\n this.ppssao.addBinding({ enabled: ppssaoValues.enabled }, \"enabled\");\n this.ppssao.addBinding({ showEffectOnly: false }, \"showEffectOnly\");\n this.ppssao.addBinding(ppssaoValues, \"samples\", ppssaoOptions.samples);\n this.ppssao.addBinding(ppssaoValues, \"rings\", ppssaoOptions.rings);\n this.ppssao.addBinding(ppssaoValues, \"luminanceInfluence\", ppssaoOptions.luminanceInfluence);\n this.ppssao.addBinding(ppssaoValues, \"radius\", ppssaoOptions.radius);\n this.ppssao.addBinding(ppssaoValues, \"intensity\", ppssaoOptions.intensity);\n this.ppssao.addBinding(ppssaoValues, \"bias\", ppssaoOptions.bias);\n this.ppssao.addBinding(ppssaoValues, \"fade\", ppssaoOptions.fade);\n this.ppssao.addBinding(ppssaoValues, \"resolutionScale\", ppssaoOptions.resolutionScale);\n this.ppssao.addBinding(\n ppssaoValues,\n \"worldDistanceThreshold\",\n ppssaoOptions.worldDistanceThreshold,\n );\n this.ppssao.addBinding(\n ppssaoValues,\n \"worldDistanceFalloff\",\n ppssaoOptions.worldDistanceFalloff,\n );\n this.ppssao.addBinding(\n ppssaoValues,\n \"worldProximityThreshold\",\n ppssaoOptions.worldProximityThreshold,\n );\n this.ppssao.addBinding(\n ppssaoValues,\n \"worldProximityFalloff\",\n ppssaoOptions.worldProximityFalloff,\n );\n this.ppssao.addBinding(ppssaoValues, \"color\", { color: { alpha: false, type: \"float\" } });\n }\n\n // N8 SSAO\n {\n this.n8ssao.addBinding({ enabled: n8ssaoValues.enabled }, \"enabled\");\n this.n8ssao.addBinding({ halfRes: n8ssaoValues.halfRes }, \"halfRes\");\n this.n8ssao.addBinding(n8ssaoValues, \"aoRadius\", n8ssaoOptions.radius);\n this.n8ssao.addBinding(n8ssaoValues, \"distanceFalloff\", n8ssaoOptions.distanceFalloff);\n this.n8ssao.addBinding(n8ssaoValues, \"intensity\", n8ssaoOptions.intensity);\n this.n8ssao.addBinding(n8ssaoValues, \"color\", { color: { alpha: false, type: \"float\" } });\n\n this.aoSamples = this.n8ssao.addBinding(n8ssaoValues, \"aoSamples\", {\n view: \"radiogrid\",\n groupName: \"aoSamples\",\n size: [3, 2],\n cells: (x: number, y: number) => ({\n title: `${n8ssaoOptions.aoSamples[y * 3 + x]}`,\n value: n8ssaoOptions.aoSamples[y * 3 + x],\n }),\n label: \"aoSamples\",\n });\n\n this.denoiseSamples = this.n8ssao.addBinding(n8ssaoValues, \"denoiseSamples\", {\n view: \"radiogrid\",\n groupName: \"denoiseSamples\",\n size: [3, 2],\n cells: (x: number, y: number) => ({\n title: `${n8ssaoOptions.denoiseSamples[y * 3 + x]}`,\n value: n8ssaoOptions.denoiseSamples[y * 3 + x],\n }),\n label: \"denoiseSamples\",\n });\n\n this.denoiseRadius = this.n8ssao.addBinding(n8ssaoValues, \"denoiseRadius\", {\n view: \"radiogrid\",\n groupName: \"denoiseRadius\",\n size: [3, 1],\n cells: (x: number, y: number) => ({\n title: `${n8ssaoOptions.denoiseRadius[y * 3 + x]}`,\n value: n8ssaoOptions.denoiseRadius[y * 3 + x],\n }),\n label: \"denoiseRadius\",\n });\n\n this.aoDisplay = this.n8ssao.addBinding(n8ssaoValues, \"viewMode\", {\n view: \"radiogrid\",\n groupName: \"viewMode\",\n size: [2, 2],\n cells: (x: number, y: number) => ({\n title: `${n8ssaoOptions.viewMode[y * 2 + x]}`,\n value: `${n8ssaoOptions.viewMode[y * 2 + x]}`,\n }),\n label: \"viewMode\",\n });\n }\n\n this.folder.addBlade({ view: \"separator\" });\n }\n\n public setupChangeEvent(\n composer: EffectComposer,\n normalPass: NormalPass,\n ppssaoEffect: SSAOEffect,\n ppssaoPass: EffectPass,\n n8aopass: any,\n ): void {\n this.ppssao.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"enabled\": {\n const value = e.value as boolean;\n if (e.value === true) {\n composer.addPass(normalPass, this.postProcessingSSAOIndex);\n composer.addPass(ppssaoPass, this.postProcessingSSAOIndex + 1);\n } else {\n composer.removePass(ppssaoPass);\n composer.removePass(normalPass);\n }\n ppssaoValues.enabled = value;\n normalPass.enabled = value;\n ppssaoPass.enabled = value;\n break;\n }\n case \"showEffectOnly\": {\n const value = e.value as boolean;\n const blend = value === true ? BlendFunction.NORMAL : BlendFunction.MULTIPLY;\n ppssaoEffect.blendMode.blendFunction = blend;\n break;\n }\n case \"resolutionScale\": {\n const value = e.value as number;\n ppssaoEffect.resolution.scale = value;\n break;\n }\n case \"color\": {\n const value = e.value as { r: number; g: number; b: number };\n ppssaoEffect.color = new Color().setRGB(value.r, value.g, value.b);\n break;\n }\n default: {\n break;\n }\n }\n\n if (ssaoMaterialParams.includes(target)) {\n (ppssaoEffect.ssaoMaterial as any)[target] = e.value;\n return;\n }\n (ppssaoEffect as any)[target] = e.value;\n });\n\n this.n8ssao.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n switch (target) {\n case \"enabled\":\n if (e.value === true) {\n composer.addPass(n8aopass, this.postProcessingSSAOIndex + 2);\n } else {\n composer.removePass(n8aopass);\n }\n n8aopass.enabled = e.value;\n break;\n case \"halfRes\":\n n8aopass.configuration.halfRes = e.value;\n break;\n case \"aoRadius\":\n n8aopass.configuration.aoRadius = e.value;\n break;\n case \"distanceFalloff\":\n n8aopass.configuration.distanceFalloff = e.value;\n break;\n case \"intensity\":\n n8aopass.configuration.intensity = e.value;\n break;\n case \"color\":\n const value = (e as any).value;\n n8aopass.configuration.color = new Color().setRGB(value.r, value.g, value.b);\n break;\n default:\n break;\n }\n });\n\n this.aoSamples.on(\"change\", (e: any) => {\n n8aopass.configuration.aoSamples = e.value;\n });\n\n this.denoiseSamples.on(\"change\", (e: any) => {\n n8aopass.configuration.denoiseSamples = e.value;\n });\n\n this.denoiseRadius.on(\"change\", (e: any) => {\n n8aopass.configuration.denoiseRadius = e.value;\n });\n\n this.aoDisplay.on(\"change\", (e: any) => {\n n8aopass.setDisplayMode(e.value);\n });\n }\n}\n", "import { BindingApi, BladeApi, BladeController, TpChangeEvent, View } from \"@tweakpane/core\";\nimport { ToneMappingEffect, ToneMappingMode } from \"postprocessing\";\nimport { FolderApi } from \"tweakpane\";\n\nexport const toneMappingValues = {\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\nconst toneMappingOptions = {\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\nconst customToneMappingTypes: Record<number, string> = {\n 0: \"REINHARD\",\n 1: \"REINHARD2\",\n 2: \"REINHARD2_ADAPTIVE\",\n 3: \"OPTIMIZED_CINEON\",\n 4: \"ACES_FILMIC\",\n};\n\nconst customToneMappingBlade = {\n customToneMappingType: customToneMappingTypes[toneMappingValues.mode],\n};\n\nconst setCustomToneMappingType = (value: number): void => {\n customToneMappingBlade.customToneMappingType = customToneMappingTypes[value];\n};\n\nexport class ToneMappingFolder {\n public folder: FolderApi;\n private minLuminance: BindingApi;\n private avgLuminance: BindingApi;\n\n constructor(parentFolder: FolderApi, expand: boolean = false) {\n this.folder = parentFolder.addFolder({\n title: \"customToneMapping\",\n expanded: expand,\n });\n this.folder.addBinding(toneMappingValues, \"mode\", toneMappingOptions.mode);\n this.folder.addBinding(customToneMappingBlade, \"customToneMappingType\", { readonly: true });\n this.folder.addBinding(toneMappingValues, \"whitePoint\", toneMappingOptions.whitePoint);\n this.folder.addBinding(toneMappingValues, \"middleGrey\", toneMappingOptions.middleGrey);\n this.minLuminance = this.folder.addBinding(\n toneMappingValues,\n \"minLuminance\",\n toneMappingOptions.minLuminance,\n );\n this.minLuminance.hidden = toneMappingValues.mode === 2 ? true : false;\n this.avgLuminance = this.folder.addBinding(\n toneMappingValues,\n \"averageLuminance\",\n toneMappingOptions.averageLuminance,\n );\n this.avgLuminance.hidden = toneMappingValues.mode === 2 ? true : false;\n this.folder.addBinding(toneMappingValues, \"adaptationRate\", toneMappingOptions.adaptationRate);\n }\n\n public setupChangeEvent(toneMappingEffect: ToneMappingEffect): void {\n this.folder.on(\"change\", (e: TpChangeEvent<unknown, BladeApi<BladeController<View>>>) => {\n const target = (e.target as any).key;\n if (!target) return;\n if (target === \"mode\") {\n this.minLuminance.hidden = toneMappingValues.mode === 2 ? true : false;\n this.avgLuminance.hidden = toneMappingValues.mode === 2 ? true : false;\n setCustomToneMappingType(e.value as number);\n }\n (toneMappingEffect as any)[target] = e.value;\n return;\n });\n }\n}\n", "export const tweakPaneStyle = `\n:root {\n --tp-base-background-color: rgba(0, 0, 0, 0.6);\n --tp-base-shadow-color: hsla(0, 0%, 0%, 0.2);\n --tp-button-background-color: hsla(0, 0%, 80%, 1);\n --tp-button-background-color-active: hsla(0, 0%, 100%, 1);\n --tp-button-background-color-focus: hsla(0, 0%, 95%, 1);\n --tp-button-background-color-hover: hsla(0, 0%, 85%, 1);\n --tp-button-foreground-color: hsla(0, 0%, 0%, 0.7);\n --tp-container-background-color: hsla(0, 0%, 0%, 0.3);\n --tp-container-background-color-active: hsla(0, 0%, 0%, 0.6);\n --tp-container-background-color-focus: hsla(0, 0%, 0%, 0.5);\n --tp-container-background-color-hover: hsla(0, 0%, 0%, 0.4);\n --tp-container-foreground-color: hsla(0, 0%, 90%, 0.6);\n --tp-groove-foreground-color: hsla(0, 0%, 0%, 0.2);\n --tp-input-background-color: hsla(0, 0%, 30%, 0.3);\n --tp-input-background-color-active: hsla(0, 0%, 0%, 0.6);\n --tp-input-background-color-focus: hsla(0, 0%, 0%, 0.5);\n --tp-input-background-color-hover: hsla(0, 0%, 0%, 0.4);\n --tp-input-foreground-color: hsla(0, 0%, 100%, 0.6);\n --tp-label-foreground-color: hsla(0, 0%, 100%, 0.6);\n --tp-monitor-background-color: hsla(0, 0%, 0%, 0.3);\n --tp-monitor-foreground-color: hsla(0, 0%, 100%, 0.3);\n}\n\n.tp-brkv {\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.tp-dfwv {\n color: white;\n backdrop-filter: blur(12px);\n width: 360px !important;\n display: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.tp-fldv_t {\n font-size: 11px;\n background-color: rgba(0, 0, 0, 0.1);\n}\n\n.tp-lblv_l {\n font-size: 11px;\n padding-left: 0px !important;\n padding-right: 0px !important;\n}\n\n.tp-lblv_v {\n width: 180px;\n}\n\n.tp-sldtxtv_t {\n max-width: 50px;\n}\n\n.tp-sglv_i {\n font-size: 11px;\n color: rgba(255, 255, 255, 0.7);\n}\n`;\n", "/* @ts-ignore */\nimport { N8AOPostPass } from \"n8ao\";\nimport {\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 AmbientLight,\n Color,\n Fog,\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 { Sun } from \"../sun/Sun\";\nimport { TimeManager } from \"../time/TimeManager\";\nimport { bcsValues } from \"../tweakpane/blades/bcsFolder\";\nimport { envValues } from \"../tweakpane/blades/environmentFolder\";\nimport { extrasValues } from \"../tweakpane/blades/postExtrasFolder\";\nimport { rendererValues } from \"../tweakpane/blades/rendererFolder\";\nimport { n8ssaoValues, ppssaoValues } from \"../tweakpane/blades/ssaoFolder\";\nimport { toneMappingValues } from \"../tweakpane/blades/toneMappingFolder\";\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 = 1;\n private height: number = 1;\n private resizeListener: () => void;\n\n public resolution: Vector2 = new Vector2(this.width, this.height);\n\n private isEnvHDRI: boolean = false;\n\n private readonly scene: Scene;\n public postPostScene: Scene;\n private readonly camera: PerspectiveCamera;\n public readonly renderer: WebGLRenderer;\n\n public readonly effectComposer: EffectComposer;\n private readonly renderPass: RenderPass;\n\n private readonly normalPass: NormalPass;\n private readonly normalTextureEffect: TextureEffect;\n private readonly ppssaoEffect: SSAOEffect;\n private readonly ppssaoPass: EffectPass;\n private readonly n8aopass: N8AOPostPass;\n\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 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 ambientLight: AmbientLight | null = null;\n\n public sun: Sun | null = null;\n public spawnSun: boolean;\n\n constructor(scene: Scene, camera: PerspectiveCamera, spawnSun: boolean = false) {\n this.scene = scene;\n this.postPostScene = new Scene();\n this.camera = camera;\n this.spawnSun = spawnSun;\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 = rendererValues.shadowMap as ShadowMapType;\n this.renderer.toneMapping = rendererValues.toneMapping as ToneMapping;\n this.renderer.toneMappingExposure = rendererValues.exposure;\n\n this.setAmbientLight();\n this.setFog();\n\n this.effectComposer = new EffectComposer(this.renderer, {\n frameBufferType: HalfFloatType,\n });\n\n this.renderPass = new RenderPass(this.scene, this.camera);\n\n this.normalPass = new NormalPass(this.scene, this.camera);\n this.normalPass.enabled = ppssaoValues.enabled;\n this.normalTextureEffect = new TextureEffect({\n blendFunction: BlendFunction.SKIP,\n texture: this.normalPass.texture,\n });\n this.ppssaoEffect = new SSAOEffect(this.camera, this.normalPass.texture, {\n blendFunction: ppssaoValues.blendFunction,\n distanceScaling: ppssaoValues.distanceScaling,\n depthAwareUpsampling: ppssaoValues.depthAwareUpsampling,\n samples: ppssaoValues.samples,\n rings: ppssaoValues.rings,\n luminanceInfluence: ppssaoValues.luminanceInfluence,\n radius: ppssaoValues.radius,\n intensity: ppssaoValues.intensity,\n bias: ppssaoValues.bias,\n fade: ppssaoValues.fade,\n resolutionScale: ppssaoValues.resolutionScale,\n color: new Color().setRGB(ppssaoValues.color.r, ppssaoValues.color.g, ppssaoValues.color.b),\n worldDistanceThreshold: ppssaoValues.worldDistanceThreshold,\n worldDistanceFalloff: ppssaoValues.worldDistanceFalloff,\n worldProximityThreshold: ppssaoValues.worldProximityThreshold,\n worldProximityFalloff: ppssaoValues.worldProximityFalloff,\n });\n this.ppssaoPass = new EffectPass(this.camera, this.ppssaoEffect, this.normalTextureEffect);\n this.ppssaoPass.enabled = ppssaoValues.enabled;\n\n this.fxaaEffect = new FXAAEffect();\n this.bloomEffect = new BloomEffect({\n intensity: extrasValues.bloom,\n });\n\n this.n8aopass = new N8AOPostPass(this.scene, this.camera, this.width, this.height);\n this.n8aopass.configuration.aoRadius = n8ssaoValues.aoRadius;\n this.n8aopass.configuration.distanceFalloff = n8ssaoValues.distanceFalloff;\n this.n8aopass.configuration.intensity = n8ssaoValues.intensity;\n this.n8aopass.configuration.color = new Color().setRGB(\n n8ssaoValues.color.r,\n n8ssaoValues.color.g,\n n8ssaoValues.color.b,\n );\n this.n8aopass.configuration.aoSamples = n8ssaoValues.aoSamples;\n this.n8aopass.configuration.denoiseSamples = n8ssaoValues.denoiseSamples;\n this.n8aopass.configuration.denoiseRadius = n8ssaoValues.denoiseRadius;\n this.n8aopass.enabled = n8ssaoValues.enabled;\n\n this.fxaaPass = new EffectPass(this.camera, this.fxaaEffect);\n this.bloomPass = new EffectPass(this.camera, this.bloomEffect);\n\n this.toneMappingEffect = new ToneMappingEffect({\n mode: toneMappingValues.mode,\n resolution: toneMappingValues.resolution,\n whitePoint: toneMappingValues.whitePoint,\n middleGrey: toneMappingValues.middleGrey,\n minLuminance: toneMappingValues.minLuminance,\n averageLuminance: toneMappingValues.averageLuminance,\n adaptationRate: toneMappingValues.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 rendererValues.toneMapping === 5 || rendererValues.toneMapping === 0 ? true : false;\n\n this.bcsPass = new ShaderPass(this.bcs, \"tDiffuse\");\n this.bcs.uniforms.brightness.value = bcsValues.brightness;\n this.bcs.uniforms.contrast.value = bcsValues.contrast;\n this.bcs.uniforms.saturation.value = bcsValues.saturation;\n\n this.gaussGrainPass = new ShaderPass(this.gaussGrainEffect, \"tDiffuse\");\n this.smaaPass = new EffectPass(this.camera, this.smaaEffect);\n\n this.effectComposer.addPass(this.renderPass);\n if (ppssaoValues.enabled) {\n this.effectComposer.addPass(this.normalPass);\n this.effectComposer.addPass(this.ppssaoPass);\n }\n if (n8ssaoValues.enabled) {\n this.effectComposer.addPass(this.n8aopass);\n }\n this.effectComposer.addPass(this.fxaaPass);\n this.effectComposer.addPass(this.smaaPass);\n this.effectComposer.addPass(this.bloomPass);\n this.effectComposer.addPass(this.toneMappingPass);\n this.effectComposer.addPass(this.bcsPass);\n this.effectComposer.addPass(this.gaussGrainPass);\n\n if (this.spawnSun === true) {\n this.sun = new Sun();\n this.scene.add(this.sun);\n }\n\n this.resizeListener = () => {\n this.fitContainer();\n };\n window.addEventListener(\"resize\", this.resizeListener, false);\n this.fitContainer();\n }\n\n public setupTweakPane(tweakPane: TweakPane) {\n tweakPane.setupRenderPane(\n this.effectComposer,\n this.normalPass,\n this.ppssaoEffect,\n this.ppssaoPass,\n this.n8aopass,\n this.toneMappingEffect,\n this.toneMappingPass,\n this.bcs,\n this.bloomEffect,\n this.gaussGrainEffect,\n this.spawnSun,\n this.sun,\n this.setHDRIFromFile.bind(this),\n this.setAmbientLight.bind(this),\n this.setFog.bind(this),\n );\n }\n\n public dispose() {\n window.removeEventListener(\"resize\", this.resizeListener);\n }\n\n public fitContainer() {\n if (!this) {\n console.error(\"Composer not initialized\");\n return;\n }\n const parentElement = this.renderer.domElement.parentNode as HTMLElement;\n if (!parentElement) {\n return;\n }\n this.width = parentElement.clientWidth;\n this.height = parentElement.clientHeight;\n this.camera.aspect = this.width / this.height;\n this.camera.updateProjectionMatrix();\n this.renderer.setPixelRatio(window.devicePixelRatio);\n this.resolution.set(\n this.width * window.devicePixelRatio,\n this.height * window.devicePixelRatio,\n );\n this.effectComposer.setSize(\n this.width / window.devicePixelRatio,\n this.height / window.devicePixelRatio,\n );\n this.renderPass.setSize(this.width, this.height);\n if (ppssaoValues.enabled) {\n this.normalPass.setSize(this.width, this.height);\n this.normalTextureEffect.setSize(this.width, this.height);\n this.ppssaoPass.setSize(this.width, this.height);\n }\n if (n8ssaoValues.enabled) {\n this.n8aopass.setSize(this.width, this.height);\n }\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 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.effectComposer.render();\n this.renderer.render(this.postPostScene, this.camera);\n }\n\n public useHDRI(url: string, fromFile: boolean = false): void {\n if ((this.isEnvHDRI && fromFile === false) || !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 = rendererValues.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 public setHDRIFromFile(): void {\n if (!this.renderer) return;\n const fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.accept = \".hdr\";\n fileInput.addEventListener(\"change\", () => {\n const file = fileInput.files?.[0];\n if (!file) {\n console.log(\"no file\");\n return;\n }\n const fileURL = URL.createObjectURL(file);\n if (fileURL) {\n this.useHDRI(fileURL, true);\n URL.revokeObjectURL(fileURL);\n document.body.removeChild(fileInput);\n }\n });\n document.body.appendChild(fileInput);\n fileInput.click();\n }\n\n public setFog(): void {\n const fogColor = new Color().setRGB(\n envValues.fog.fogColor.r,\n envValues.fog.fogColor.g,\n envValues.fog.fogColor.b,\n );\n this.scene.fog = new Fog(fogColor, envValues.fog.fogNear, envValues.fog.fogFar);\n }\n\n public setAmbientLight(): void {\n if (this.ambientLight) {\n this.scene.remove(this.ambientLight);\n this.ambientLight.dispose();\n }\n const ambientLightColor = new Color().setRGB(\n envValues.ambientLight.ambientLightColor.r,\n envValues.ambientLight.ambientLightColor.g,\n envValues.ambientLight.ambientLightColor.b,\n );\n this.ambientLight = new AmbientLight(\n ambientLightColor,\n envValues.ambientLight.ambientLightIntensity,\n );\n this.scene.add(this.ambientLight);\n }\n}\n", "import { CameraHelper, Color, DirectionalLight, Group, OrthographicCamera, Vector3 } from \"three\";\n\nimport { sunValues } from \"../tweakpane/blades/environmentFolder\";\n\nexport class Sun extends Group {\n private readonly debug: boolean = false;\n private readonly sunOffset: Vector3 = new Vector3(\n 39 * (Math.PI / 180),\n 50 * (Math.PI / 180),\n 100,\n );\n private readonly shadowResolution: number = 8192;\n private readonly shadowCamFrustum: number = 50;\n private readonly camHelper: CameraHelper | null = null;\n\n private readonly shadowCamera: OrthographicCamera;\n private readonly directionalLight: DirectionalLight;\n\n public target: Vector3 | null = null;\n\n constructor() {\n super();\n this.shadowCamera = new OrthographicCamera(\n -this.shadowCamFrustum,\n this.shadowCamFrustum,\n this.shadowCamFrustum,\n -this.shadowCamFrustum,\n 0.1,\n 200,\n );\n if (this.debug === true) {\n this.camHelper = new CameraHelper(this.shadowCamera);\n }\n this.directionalLight = new DirectionalLight(0xffffff, 0.5);\n this.directionalLight.shadow.normalBias = 0.05;\n this.directionalLight.shadow.radius = 1.5;\n this.directionalLight.shadow.camera = this.shadowCamera;\n this.directionalLight.shadow.mapSize.set(this.shadowResolution, this.shadowResolution);\n this.directionalLight.castShadow = true;\n this.setColor();\n\n this.updateCharacterPosition(new Vector3(0, 0, 0));\n\n this.add(this.directionalLight);\n if (this.debug === true && this.camHelper instanceof CameraHelper) {\n this.add(this.camHelper);\n }\n }\n\n public updateCharacterPosition(position: Vector3 | undefined) {\n if (!position) return;\n this.target = position;\n this.setSunPosition(this.sunOffset.x, this.sunOffset.y);\n }\n\n public setAzimuthalAngle(angle: number) {\n if (this.sunOffset) this.sunOffset.x = angle;\n if (this.target) this.updateCharacterPosition(this.target);\n }\n\n public setPolarAngle(angle: number) {\n if (this.sunOffset) this.sunOffset.y = angle;\n if (this.target) this.updateCharacterPosition(this.target);\n }\n\n public setIntensity(intensity: number) {\n this.directionalLight.intensity = intensity;\n }\n\n public setColor() {\n this.directionalLight.color = new Color().setRGB(\n sunValues.sunColor.r,\n sunValues.sunColor.g,\n sunValues.sunColor.b,\n );\n }\n\n private setSunPosition(azimuthalAngle: number, polarAngle: number) {\n if (!this.target) return;\n const distance = this.sunOffset.z;\n const sphericalPosition = new Vector3(\n distance * Math.sin(polarAngle) * Math.cos(azimuthalAngle),\n distance * Math.cos(polarAngle),\n distance * Math.sin(polarAngle) * Math.sin(azimuthalAngle),\n );\n const newSunPosition = this.target.clone().add(sphericalPosition);\n this.directionalLight.position.set(newSunPosition.x, newSunPosition.y, newSunPosition.z);\n this.directionalLight.target.position.copy(this.target.clone());\n this.directionalLight.target.updateMatrixWorld();\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 getRelativePositionAndRotationRelativeToObject,\n MElement,\n MMLCollisionTrigger,\n} from \"mml-web\";\nimport {\n Box3,\n BufferGeometry,\n Color,\n DoubleSide,\n Euler,\n Group,\n Line3,\n LineBasicMaterial,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n Object3D,\n Ray,\n Scene,\n Vector3,\n} from \"three\";\nimport { VertexNormalsHelper } from \"three/examples/jsm/helpers/VertexNormalsHelper.js\";\nimport * as BufferGeometryUtils from \"three/examples/jsm/utils/BufferGeometryUtils.js\";\nimport { MeshBVH, MeshBVHVisualizer } from \"three-mesh-bvh\";\n\ntype CollisionMeshState = {\n matrix: Matrix4;\n source: Group;\n meshBVH: MeshBVH;\n debugGroup?: Group;\n trackCollisions: boolean;\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 private tempVector3: Vector3 = new Vector3();\n private tempRay: Ray = new Ray();\n private tempMatrix = new Matrix4();\n private tempMatrix2 = new Matrix4();\n private tempBox = new Box3();\n private tempEuler = new Euler();\n private tempSegment = new Line3();\n private tempSegment2 = new Line3();\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 | null = null;\n for (const [, value] of this.collisionMeshState) {\n this.tempRay.copy(ray).applyMatrix4(this.tempMatrix.copy(value.matrix).invert());\n const hit = value.meshBVH.raycastFirst(this.tempRay, DoubleSide);\n if (hit) {\n this.tempSegment.start.copy(this.tempRay.origin);\n this.tempSegment.end.copy(hit.point);\n this.tempSegment.applyMatrix4(value.matrix);\n const dist = this.tempSegment.distance();\n if (minimumDistance === null || dist < minimumDistance) {\n minimumDistance = dist;\n }\n }\n }\n return minimumDistance;\n }\n\n private createCollisionMeshState(group: Group, trackCollisions: boolean): CollisionMeshState {\n const geometries: Array<BufferGeometry> = [];\n group.updateWorldMatrix(true, false);\n const invertedRootMatrix = this.tempMatrix.copy(group.matrixWorld).invert();\n group.traverse((child: Object3D) => {\n if (child.type === \"Mesh\") {\n const mesh = child as Mesh;\n const clonedGeometry = mesh.geometry.clone();\n if (child !== group) {\n mesh.updateWorldMatrix(true, false);\n clonedGeometry.applyMatrix4(\n this.tempMatrix2.multiplyMatrices(invertedRootMatrix, mesh.matrixWorld),\n );\n }\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, false);\n newBufferGeometry.computeVertexNormals();\n const meshBVH = new MeshBVH(newBufferGeometry);\n\n const meshState: CollisionMeshState = {\n source: group,\n meshBVH,\n matrix: group.matrixWorld.clone(),\n trackCollisions,\n };\n if (this.debug) {\n // Have to cast to add the boundsTree property to the geometry so that the MeshBVHVisualizer can find it\n (newBufferGeometry as any).boundsTree = meshBVH;\n\n const wireframeMesh = new Mesh(newBufferGeometry, new MeshBasicMaterial({ wireframe: true }));\n\n const normalsHelper = new VertexNormalsHelper(wireframeMesh, 0.25, 0x00ff00);\n\n const visualizer = new MeshBVHVisualizer(wireframeMesh, 4);\n (visualizer.edgeMaterial as LineBasicMaterial).color = new Color(\"blue\");\n\n const debugGroup = new Group();\n debugGroup.add(wireframeMesh, normalsHelper, visualizer as unknown as Object3D);\n\n group.matrixWorld.decompose(debugGroup.position, debugGroup.quaternion, debugGroup.scale);\n visualizer.update();\n\n meshState.debugGroup = debugGroup;\n }\n return meshState;\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, mElement !== undefined);\n if (meshState.debugGroup) {\n this.scene.add(meshState.debugGroup);\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 group.updateWorldMatrix(true, false);\n meshState.matrix.copy(group.matrixWorld);\n if (meshState.debugGroup) {\n group.matrixWorld.decompose(\n meshState.debugGroup.position,\n meshState.debugGroup.quaternion,\n meshState.debugGroup.scale,\n );\n }\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.debugGroup) {\n this.scene.remove(meshState.debugGroup);\n }\n this.collisionMeshState.delete(group);\n }\n }\n\n private applyCollider(\n worldBasedCapsuleSegment: Line3,\n capsuleRadius: number,\n meshState: CollisionMeshState,\n ): Vector3 | null {\n // Create a matrix to convert from world-space to mesh-space\n const meshMatrix = this.tempMatrix.copy(meshState.matrix).invert();\n\n // Create the bounding box for the capsule if it were in mesh-space\n const meshRelativeCapsuleBoundingBox = this.tempBox;\n meshRelativeCapsuleBoundingBox.makeEmpty();\n meshRelativeCapsuleBoundingBox.expandByPoint(worldBasedCapsuleSegment.start);\n meshRelativeCapsuleBoundingBox.expandByPoint(worldBasedCapsuleSegment.end);\n meshRelativeCapsuleBoundingBox.min.subScalar(capsuleRadius);\n meshRelativeCapsuleBoundingBox.max.addScalar(capsuleRadius);\n meshRelativeCapsuleBoundingBox.applyMatrix4(meshMatrix);\n // Create a segment/line for the capsule in mesh-space\n const meshRelativeCapsuleSegment = this.tempSegment;\n meshRelativeCapsuleSegment.start.copy(worldBasedCapsuleSegment.start);\n meshRelativeCapsuleSegment.end.copy(worldBasedCapsuleSegment.end);\n meshRelativeCapsuleSegment.applyMatrix4(meshMatrix);\n\n // Keep track of where the segment started in mesh-space so that we can calculate the delta later\n const initialMeshRelativeCapsuleSegmentStart = this.tempVector3.copy(\n meshRelativeCapsuleSegment.start,\n );\n\n let collisionPosition: Vector3 | null = null;\n meshState.meshBVH.shapecast({\n intersectsBounds: (meshBox) => {\n // Determine if this portion of the mesh overlaps with the capsule bounding box and is therefore worth checking\n // all of the triangles within\n return meshBox.intersectsBox(meshRelativeCapsuleBoundingBox);\n },\n intersectsTriangle: (meshTriangle) => {\n const closestPointOnTriangle = this.tempVector;\n const closestPointOnSegment = this.tempVector2;\n // Find the closest point between this triangle and the capsule segment in mesh-space\n meshTriangle.closestPointToSegment(\n meshRelativeCapsuleSegment,\n closestPointOnTriangle,\n closestPointOnSegment,\n );\n // Create a line segment between the closest points\n const intersectionSegment = this.tempSegment2;\n intersectionSegment.start.copy(closestPointOnTriangle);\n intersectionSegment.end.copy(closestPointOnSegment);\n // Calculate the distance between the closest points in mesh-space\n const modelReferenceDistance = intersectionSegment.distance();\n\n // Calculate the distance between the points in world-space\n intersectionSegment.applyMatrix4(meshState.matrix);\n const realDistance = intersectionSegment.distance();\n\n // If the real distance is less than the capsule radius then there is actually a collision between the capsule\n // and the triangle\n if (realDistance < capsuleRadius) {\n if (!collisionPosition) {\n collisionPosition = new Vector3()\n .copy(closestPointOnSegment)\n .applyMatrix4(meshState.matrix);\n }\n // Calculate the ratio between the real distance and the mesh-space distance\n const ratio = realDistance / modelReferenceDistance;\n // Calculate the depth of the collision in world-space\n const realDepth = capsuleRadius - realDistance;\n // Convert that depth back into mesh-space as all calculations during collision are to a mesh-space segment\n const modelDepth = realDepth / ratio;\n\n // Apply a corrective movement to the segment in mesh-space\n const direction = closestPointOnSegment.sub(closestPointOnTriangle).normalize();\n meshRelativeCapsuleSegment.start.addScaledVector(direction, modelDepth);\n meshRelativeCapsuleSegment.end.addScaledVector(direction, modelDepth);\n }\n },\n });\n\n if (collisionPosition) {\n // If there was a collision, calculate the delta between the original mesh-space segment and the now-moved one\n const delta = this.tempVector\n .copy(meshRelativeCapsuleSegment.start)\n .sub(initialMeshRelativeCapsuleSegmentStart);\n\n // Use the matrix for the mesh to convert the delta vector back to world-space (remove the position component of the matrix first to avoid translation)\n this.tempMatrix.copy(meshState.matrix).setPosition(0, 0, 0);\n delta.applyMatrix4(this.tempMatrix);\n\n // There's a possibility that the matrix is invalid (or scale zero) and the delta is NaN - if so, don't apply the delta\n if (!(isNaN(delta.x) && isNaN(delta.y) && isNaN(delta.z))) {\n // Convert the potentially-modified mesh-space segment back to world-space\n worldBasedCapsuleSegment.start.add(delta);\n worldBasedCapsuleSegment.end.add(delta);\n }\n }\n\n return collisionPosition;\n }\n\n public applyColliders(tempSegment: Line3, radius: number) {\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, meshState);\n if (collisionPosition && meshState.trackCollisions) {\n if (collidedElements === null) {\n collidedElements = new Map();\n }\n const relativePosition = getRelativePositionAndRotationRelativeToObject(\n {\n position: collisionPosition,\n rotation: this.tempEuler.set(0, 0, 0),\n },\n meshState.source as Object3D,\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
6
  "names": ["Vector3", "Vector3", "Color", "Vector3", "AnimationState", "Mesh", "Mesh", "Color", "LinearFilter", "Mesh", "MeshBasicMaterial", "Color", "MeshBasicMaterial", "Mesh", "LinearFilter", "Quaternion", "Raycaster", "Vector3", "Vector3", "Raycaster", "Quaternion", "Color", "Vector3", "Quaternion", "Vector3", "AnimationMixer", "Object3D", "Quaternion", "Vector3", "AnimationMixer", "Object3D", "Vector3", "Quaternion", "Vector3", "Quaternion", "Group", "Color", "_a", "EffectComposer", "EffectPass", "SSAOEffect", "BlendFunction", "NormalPass", "Color", "LoadingManager", "Scene", "Vector2", "WebGLRenderer", "Color", "Group", "Vector3", "Group", "Vector3", "Color", "ShaderMaterial", "Uniform", "ShaderMaterial", "Uniform", "Vector2", "Scene", "WebGLRenderer", "EffectComposer", "NormalPass", "BlendFunction", "SSAOEffect", "Color", "EffectPass", "LoadingManager", "Color", "Euler", "Group", "Line3", "Matrix4", "Mesh", "MeshBasicMaterial", "Vector3"]
7
7
  }