@mml-io/3d-web-client-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/camera/CameraManager.d.ts +23 -0
- package/build/character/Character.d.ts +32 -0
- package/build/character/CharacterManager.d.ts +29 -0
- package/build/character/CharacterMaterial.d.ts +11 -0
- package/build/character/CharacterModel.d.ts +23 -0
- package/build/character/CharacterState.d.ts +21 -0
- package/build/character/LocalController.d.ts +50 -0
- package/build/character/ModelLoader.d.ts +9 -0
- package/build/character/RemoteController.d.ts +20 -0
- package/build/collisions/CollisionsManager.d.ts +17 -0
- package/build/helpers/math-helpers.d.ts +4 -0
- package/build/index.d.ts +9 -0
- package/build/index.js +1476 -0
- package/build/index.js.map +7 -0
- package/build/input/KeyInputManager.d.ts +11 -0
- package/build/mml/MMLCompositionScene.d.ts +18 -0
- package/build/rendering/composer.d.ts +20 -0
- package/build/rendering/post-effects/gauss-grain.d.ts +2 -0
- package/build/rendering/shaders/bayer-dither.d.ts +1 -0
- package/build/rendering/shaders/shader-helpers.d.ts +4 -0
- package/build/rendering/shaders/vertex-shader.d.ts +1 -0
- package/build/time/TimeManager.d.ts +16 -0
- package/package.json +26 -0
@@ -0,0 +1,7 @@
|
|
1
|
+
{
|
2
|
+
"version": 3,
|
3
|
+
"sources": ["../src/camera/CameraManager.ts", "../src/helpers/math-helpers.ts", "../src/character/Character.ts", "../src/character/CharacterModel.ts", "../src/character/CharacterMaterial.ts", "../src/rendering/shaders/bayer-dither.ts", "../src/rendering/shaders/shader-helpers.ts", "../src/character/CharacterState.ts", "../src/character/ModelLoader.ts", "../src/character/LocalController.ts", "../src/character/CharacterManager.ts", "../src/character/RemoteController.ts", "../src/input/KeyInputManager.ts", "../src/mml/MMLCompositionScene.ts", "../src/rendering/composer.ts", "../src/rendering/post-effects/gauss-grain.ts", "../src/rendering/shaders/vertex-shader.ts", "../src/time/TimeManager.ts", "../src/collisions/CollisionsManager.ts"],
|
4
|
+
"sourcesContent": ["import { PerspectiveCamera, Vector3 } from \"three\";\n\nimport { ease } from \"../helpers/math-helpers\";\n\nexport class CameraManager {\n public readonly camera: PerspectiveCamera;\n private dragging: boolean = false;\n private target: Vector3 = new Vector3(0, 1.55, 0);\n private targetDistance: number;\n private maxTargetDistance: number = 20;\n private distance: number;\n private targetPhi: number | null = Math.PI / 2;\n private phi: number | null = Math.PI / 2;\n private targetTheta: number | null = -Math.PI / 2;\n private theta: number | null = -Math.PI / 2;\n private hadTarget: boolean = false;\n\n constructor() {\n this.camera = new PerspectiveCamera(80, window.innerWidth / window.innerHeight, 0.1, 2000);\n this.camera.position.set(0, 1.4, 3);\n\n this.targetDistance = 2.5;\n this.distance = this.targetDistance;\n\n document.addEventListener(\"mousedown\", this.onMouseDown.bind(this));\n document.addEventListener(\"mouseup\", this.onMouseUp.bind(this));\n document.addEventListener(\"mousemove\", this.onMouseMove.bind(this));\n document.addEventListener(\"wheel\", this.onMouseWheel.bind(this));\n window.addEventListener(\"resize\", this.onResize.bind(this));\n }\n\n private onResize(): void {\n const width = window.innerWidth;\n const height = window.innerHeight;\n this.camera.aspect = width / height;\n this.camera.updateProjectionMatrix();\n }\n\n private onMouseDown(_event: MouseEvent): void {\n this.dragging = true;\n }\n\n private onMouseUp(_event: MouseEvent): void {\n this.dragging = false;\n }\n\n private onMouseMove(event: MouseEvent): void {\n if (!this.dragging) {\n return;\n }\n if (this.targetTheta === null || this.targetPhi === null) {\n return;\n }\n this.targetTheta += event.movementX * 0.01;\n this.targetPhi -= event.movementY * 0.01;\n this.targetPhi = Math.max(Math.PI * 0.1, Math.min(Math.PI - Math.PI * 0.1, this.targetPhi));\n this.targetPhi = Math.min(Math.PI * 0.7, this.targetPhi);\n }\n\n private onMouseWheel(event: WheelEvent): void {\n const scrollAmount = event.deltaY * 0.01;\n this.targetDistance += scrollAmount;\n this.targetDistance = Math.max(0, this.targetDistance);\n this.targetDistance = Math.min(this.targetDistance, this.maxTargetDistance);\n }\n\n public setTarget(target: THREE.Vector3): void {\n this.target.copy(target);\n if (!this.hadTarget) {\n this.hadTarget = true;\n this.reverseUpdateFromPositions();\n }\n }\n\n private reverseUpdateFromPositions(): void {\n if (this.phi === null || this.theta == null) return;\n const dx = this.camera.position.x - this.target.x;\n const dy = this.camera.position.y - this.target.y;\n const dz = this.camera.position.z - this.target.z;\n this.targetDistance = Math.sqrt(dx * dx + dy * dy + dz * dz);\n this.targetTheta = (this.theta + 2 * Math.PI) % (2 * Math.PI);\n this.targetPhi = Math.max(0, Math.min(Math.PI, this.phi));\n this.phi = this.targetPhi;\n this.theta = this.targetTheta;\n this.distance = this.targetDistance;\n }\n\n public update(): void {\n if (this.target === null) {\n return;\n }\n if (\n this.phi !== null &&\n this.targetPhi !== null &&\n this.theta !== null &&\n this.targetTheta !== null\n ) {\n this.distance += ease(this.targetDistance, this.distance, 0.02);\n this.distance = Math.min(this.distance, this.maxTargetDistance);\n this.phi += ease(this.targetPhi, this.phi, 0.07);\n this.theta += ease(this.targetTheta, this.theta, 0.07);\n\n const x = this.target.x + this.distance * Math.sin(this.phi) * Math.cos(this.theta);\n const y = this.target.y + this.distance * Math.cos(this.phi);\n const z = this.target.z + this.distance * Math.sin(this.phi) * Math.sin(this.theta);\n\n this.camera.position.set(x, y, z);\n this.camera.lookAt(this.target);\n }\n }\n}\n", "import { Vector3 } from \"three\";\n\nexport const getSpawnPositionInsideCircle = (\n radius: number,\n positions: number,\n id: number,\n yPos: number = 0,\n): Vector3 => {\n if (id > 0) id += 3;\n const goldenAngle = Math.PI * (3 - Math.sqrt(5));\n const theta = id * goldenAngle;\n const scale = id / positions;\n const scaledRadius = scale * radius;\n const x = Math.cos(theta) * scaledRadius;\n const z = Math.sin(theta) * scaledRadius;\n return new Vector3(x, yPos, z);\n};\n\nexport const round = (n: number, digits: number): number => {\n return Number(n.toFixed(digits));\n};\n\nexport const ease = (target: number, n: number, factor: number): number => {\n return round((target - n) * factor, 5);\n};\n", "import { Color, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { CharacterModel } from \"./CharacterModel\";\nimport { LocalController } from \"./LocalController\";\n\nexport type CharacterDescription = {\n meshFileUrl: string;\n idleAnimationFileUrl: string;\n jogAnimationFileUrl: string;\n sprintAnimationFileUrl: string;\n modelScale: number;\n};\n\nexport class Character {\n public controller: LocalController | null = null;\n\n public name: string | null = null;\n public model: CharacterModel | null = null;\n public color: Color = new Color();\n\n public position: Vector3 = new Vector3();\n\n constructor(\n private readonly characterDescription: CharacterDescription,\n private readonly id: number,\n private readonly isLocal: boolean,\n private readonly modelLoadedCallback: () => void,\n private readonly collisionsManager: CollisionsManager,\n private readonly keyInputManager: KeyInputManager,\n private readonly cameraManager: CameraManager,\n private readonly timeManager: TimeManager,\n ) {\n this.load();\n }\n\n private async load(): Promise<void> {\n this.model = new CharacterModel(this.characterDescription);\n await this.model.init();\n this.color = this.model.material.colorsCube216[this.id];\n if (this.isLocal) {\n this.controller = new LocalController(\n this.model,\n this.id,\n this.collisionsManager,\n this.keyInputManager,\n this.cameraManager,\n this.timeManager,\n );\n }\n this.modelLoadedCallback();\n }\n\n public update(time: number) {\n if (!this.model) return;\n this.model.mesh!.getWorldPosition(this.position);\n if (typeof this.model.material.uniforms.time !== \"undefined\") {\n this.model.material.uniforms.time.value = time;\n this.model.material.uniforms.diffuseRandomColor.value = this.color;\n }\n }\n}\n", "import {\n AnimationAction,\n AnimationClip,\n AnimationMixer,\n LoopRepeat,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n} from \"three\";\n\nimport { CharacterDescription } from \"./Character\";\nimport { CharacterMaterial } from \"./CharacterMaterial\";\nimport { AnimationState } from \"./CharacterState\";\nimport { ModelLoader } from \"./ModelLoader\";\n\nexport class CharacterModel {\n private modelLoader: ModelLoader = new ModelLoader();\n\n public mesh: Object3D | null = null;\n public material: CharacterMaterial = new CharacterMaterial();\n\n public animations: Record<string, AnimationAction> = {};\n public animationMixer: AnimationMixer | null = null;\n public currentAnimation: AnimationState = AnimationState.idle;\n\n constructor(private readonly characterDescription: CharacterDescription) {}\n\n public async init(): Promise<void> {\n await this.loadMainMesh();\n await this.setAnimationFromFile(\n this.characterDescription.idleAnimationFileUrl,\n AnimationState.idle,\n );\n await this.setAnimationFromFile(\n this.characterDescription.jogAnimationFileUrl,\n AnimationState.walking,\n );\n await this.setAnimationFromFile(\n this.characterDescription.sprintAnimationFileUrl,\n AnimationState.running,\n );\n this.applyMaterialToAllSkinnedMeshes(this.material);\n }\n\n public updateAnimation(targetAnimation: AnimationState, deltaTime: number) {\n if (this.currentAnimation !== targetAnimation) {\n this.transitionToAnimation(targetAnimation);\n }\n this.animationMixer?.update(deltaTime);\n }\n\n public hideMaterialByMeshName(meshName: any): void {\n if (!this.mesh) return;\n this.mesh.traverse((child: Object3D) => {\n if (child.type === \"SkinnedMesh\" && child.name === meshName) {\n (child as Mesh).material = new MeshStandardMaterial({\n color: 0xff0000,\n transparent: true,\n opacity: 0,\n });\n }\n });\n }\n\n private setShadows(\n mesh: Object3D,\n castShadow: boolean = true,\n receiveShadow: boolean = true,\n ): void {\n mesh.traverse((child: Object3D) => {\n if (child.type === \"SkinnedMesh\") {\n child.castShadow = castShadow;\n child.receiveShadow = receiveShadow;\n }\n });\n }\n\n private applyMaterialToAllSkinnedMeshes(material: any): void {\n if (!this.mesh) return;\n this.mesh.traverse((child: Object3D) => {\n if (child.type === \"SkinnedMesh\") {\n (child as Mesh).material = material;\n }\n });\n }\n\n private initAnimationMixer() {\n if (this.animationMixer !== null || this.mesh === null) return;\n this.animationMixer = new AnimationMixer(this.mesh);\n }\n\n private async loadMainMesh(): Promise<void> {\n const mainMeshUrl = this.characterDescription.meshFileUrl;\n const scale = this.characterDescription.modelScale;\n const extension = mainMeshUrl.split(\".\").pop();\n const name = mainMeshUrl.split(\"/\").pop()!.replace(`.${extension}`, \"\");\n const mainMesh = await this.modelLoader.load(mainMeshUrl, \"model\");\n if (typeof mainMesh !== \"undefined\") {\n this.mesh = new Object3D();\n const model = mainMesh as Object3D;\n model.position.set(0, -0.35, 0);\n this.mesh.add(model);\n this.mesh.name = name;\n this.mesh.scale.set(scale, scale, scale);\n this.setShadows(this.mesh);\n }\n }\n\n private async setAnimationFromFile(\n animationFileUrl: string,\n animationType: AnimationState,\n ): Promise<void> {\n return new Promise(async (resolve, reject) => {\n this.initAnimationMixer();\n const animation = await this.modelLoader.load(animationFileUrl, \"animation\");\n if (typeof animation !== \"undefined\" && animation instanceof AnimationClip) {\n this.animations[animationType] = this.animationMixer!.clipAction(animation);\n this.animations[animationType].stop();\n if (animationType === AnimationState.idle) {\n this.animations[animationType].play();\n }\n resolve();\n } else {\n reject(`failed to load ${animationType} from ${animationFileUrl}`);\n }\n });\n }\n\n private transitionToAnimation(\n targetAnimation: AnimationState,\n transitionDuration: number = 0.21,\n ): void {\n if (!this.mesh || this.currentAnimation === null) return;\n\n const currentAction = this.animations[this.currentAnimation];\n const targetAction = this.animations[targetAnimation];\n\n if (!targetAction) return;\n\n if (currentAction) {\n currentAction.enabled = true;\n currentAction.fadeOut(transitionDuration);\n }\n\n if (!targetAction.isRunning()) targetAction.play();\n\n targetAction.setLoop(LoopRepeat, Infinity);\n targetAction.enabled = true;\n targetAction.fadeIn(transitionDuration);\n\n this.currentAnimation = targetAnimation;\n }\n}\n", "import { Color, MeshPhysicalMaterial, UniformsUtils } from \"three\";\n\nimport { bayerDither } from \"../rendering/shaders/bayer-dither\";\nimport {\n injectBefore,\n injectBeforeMain,\n injectInsideMain,\n} from \"../rendering/shaders/shader-helpers\";\n\ntype TUniform<TValue = any> = { value: TValue };\n\nexport class CharacterMaterial extends MeshPhysicalMaterial {\n public uniforms: Record<string, TUniform> = {};\n public colorsCube216: Color[] = [];\n\n constructor() {\n super();\n this.color = new Color(0xffffff);\n this.transmission = 0.5;\n this.metalness = 0.5;\n this.roughness = 0.3;\n this.ior = 2.0;\n this.thickness = 0.1;\n this.specularColor = new Color(0x0077ff);\n this.specularIntensity = 0.1;\n this.envMapIntensity = 1.8;\n this.sheenColor = new Color(0x770077);\n this.sheen = 0.35;\n\n this.onBeforeCompile = (shader) => {\n this.uniforms = UniformsUtils.clone(shader.uniforms);\n this.uniforms.nearClip = { value: 0.01 };\n this.uniforms.farClip = { value: 1000.0 };\n this.uniforms.ditheringNear = { value: 0.25 };\n this.uniforms.ditheringRange = { value: 0.5 };\n this.uniforms.time = { value: 0.0 };\n this.uniforms.diffuseRandomColor = { value: new Color() };\n shader.uniforms = this.uniforms;\n\n shader.vertexShader = injectBeforeMain(shader.vertexShader, \"varying vec2 vUv;\");\n shader.vertexShader = injectInsideMain(shader.vertexShader, \"vUv = uv;\");\n\n shader.fragmentShader = injectBeforeMain(\n shader.fragmentShader,\n /* glsl */ `\n varying vec2 vUv;\n uniform float nearClip;\n uniform float farClip;\n uniform float ditheringNear;\n uniform float ditheringRange;\n uniform float time;\n uniform vec3 diffuseRandomColor;\n ${bayerDither}\n `,\n );\n\n shader.fragmentShader = injectBefore(\n shader.fragmentShader,\n \"#include <output_fragment>\",\n /* glsl */ `\n float distance = length(vWorldPosition - cameraPosition);\n float normalizedDistance = (distance - nearClip) / (farClip - nearClip);\n ivec2 p = ivec2(mod(gl_FragCoord.xy, 8.0));\n float d = 0.0;\n if (p.x <= 3 && p.y <= 3) {\n d = bayerDither(bayertl, p);\n } else if (p.x > 3 && p.y <= 3) {\n d = bayerDither(bayertr, p - ivec2(4, 0));\n } else if (p.x <= 3 && p.y > 3) {\n d = bayerDither(bayerbl, p - ivec2(0, 4));\n } else if (p.x > 3 && p.y > 3) {\n d = bayerDither(bayerbr, p - ivec2(4, 4));\n }\n if (distance <= ditheringNear + d * ditheringRange) discard;\n vec2 suv = vUv;\n float s = clamp(0.35 + 0.35 * sin(5.0 * -time + suv.y * 500.0), 0.0, 1.0);\n float scanLines = pow(s, 1.33);\n outgoingLight *= diffuseRandomColor;\n outgoingLight += smoothstep(0.1, 0.0, scanLines) * 0.1;\n `,\n );\n };\n\n this.generateColorCube();\n }\n\n private generateColorCube() {\n const saturation = 0.7;\n const lightness = 0.8;\n const goldenRatioConjugate = 0.618033988749895;\n let hue = 0;\n\n for (let i = 0; i < 216; i++) {\n const color = new Color();\n color.setHSL(hue, saturation, lightness);\n this.colorsCube216.push(color);\n hue = (hue + goldenRatioConjugate) % 1;\n }\n }\n}\n", "export const bayerDither: string = /* glsl */ `\nconst mat4 bayertl = mat4( \n 0.0 / 64.0, 32.0 / 64.0, 8.0 / 64.0, 40.0 / 64.0,\n 48.0 / 64.0, 16.0 / 64.0, 56.0 / 64.0, 24.0 / 64.0,\n 12.0 / 64.0, 44.0 / 64.0, 4.0 / 64.0, 36.0 / 64.0,\n 60.0 / 64.0, 28.0 / 64.0, 52.0 / 64.0, 20.0 / 64.0\n);\n\nconst mat4 bayertr = mat4( \n 2.0 / 64.0, 34.0 / 64.0, 10.0 / 64.0, 42.0 / 64.0,\n 50.0 / 64.0, 18.0 / 64.0, 58.0 / 64.0, 26.0 / 64.0,\n 14.0 / 64.0, 46.0 / 64.0, 6.0 / 64.0, 38.0 / 64.0,\n 62.0 / 64.0, 30.0 / 64.0, 54.0 / 64.0, 22.0 / 64.0\n);\n\nconst mat4 bayerbl = mat4( \n 3.0 / 64.0, 35.0 / 64.0, 11.0 / 64.0, 43.0 / 64.0,\n 51.0 / 64.0, 19.0 / 64.0, 59.0 / 64.0, 27.0 / 64.0,\n 15.0 / 64.0, 47.0 / 64.0, 7.0 / 64.0, 39.0 / 64.0,\n 63.0 / 64.0, 31.0 / 64.0, 55.0 / 64.0, 23.0 / 64.0\n);\n\nconst mat4 bayerbr = mat4( \n 1.0 / 64.0, 33.0 / 64.0, 9.0 / 64.0, 41.0 / 64.0,\n 49.0 / 64.0, 17.0 / 64.0, 57.0 / 64.0, 25.0 / 64.0,\n 13.0 / 64.0, 45.0 / 64.0, 5.0 / 64.0, 37.0 / 64.0,\n 61.0 / 64.0, 29.0 / 64.0, 53.0 / 64.0, 21.0 / 64.0\n);\n\nfloat bayerDither(mat4 m, ivec2 p) {\n if (p.y == 0) {\n if (p.x == 0) { return m[0][0]; }\n else if (p.x == 1) { return m[1][0]; }\n else if (p.x == 2) { return m[2][0]; }\n else { return m[3][0]; }\n } else if (p.y == 1) {\n if (p.x == 0) { return m[0][1]; }\n else if (p.x == 1) { return m[1][1]; }\n else if (p.x == 2) { return m[2][1]; }\n else { return m[3][1]; }\n } else if (p.y == 2) {\n if (p.x == 0) { return m[0][1]; }\n else if (p.x == 1) { return m[1][2]; }\n else if (p.x == 2) { return m[2][2]; }\n else { return m[3][2]; }\n } else {\n if (p.x == 0) { return m[0][3]; }\n else if (p.x == 1) { return m[1][3]; }\n else if (p.x == 2) { return m[2][3]; }\n else { return m[3][3]; }\n }\n}\n`;\n", "export function injectBeforeMain(shaderSource: string, codeToInject: string): string {\n return shaderSource.replace(\n \"void main() {\",\n `\n\n${codeToInject}\n\nvoid main() {`,\n );\n}\n\nexport function injectInsideMain(shaderSource: string, codeToInject: string): string {\n return shaderSource.replace(\n \"void main() {\",\n `void main() {\n\n${codeToInject}\n\n `,\n );\n}\n\nexport function injectBefore(shaderSource: string, before: string, codeToInject: string): string {\n return shaderSource.replace(\n before,\n `\n${codeToInject}\n\n${before}\n `,\n );\n}\n\nexport function injectAfter(shaderSource: string, after: string, codeToInject: string): string {\n return shaderSource.replace(\n after,\n `\n${after}\n\n${codeToInject}\n\n `,\n );\n}\n", "export enum AnimationState {\n \"idle\" = 0,\n \"walking\" = 1,\n \"running\" = 2,\n \"jumpToAir\" = 3,\n \"air\" = 4,\n \"airToGround\" = 5,\n}\n\nexport type CharacterState = {\n id: number;\n position: {\n x: number;\n y: number;\n z: number;\n };\n rotation: {\n quaternionY: number;\n quaternionW: number;\n };\n state: AnimationState;\n};\n", "import { AnimationClip, LoadingManager, Object3D } from \"three\";\nimport { FBXLoader } from \"three/examples/jsm/loaders/FBXLoader.js\";\nimport { GLTF, GLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader.js\";\n\nexport class ModelLoader {\n private debug: boolean = false;\n private readonly loadingManager: LoadingManager;\n private readonly fbxLoader: FBXLoader;\n private readonly gltfLoader: GLTFLoader;\n\n constructor() {\n this.loadingManager = new LoadingManager();\n this.fbxLoader = new FBXLoader(this.loadingManager);\n this.gltfLoader = new GLTFLoader(this.loadingManager);\n }\n\n async load(\n fileUrl: string,\n fileType: \"model\" | \"animation\",\n ): Promise<Object3D | AnimationClip | undefined> {\n const extension = fileUrl.split(\".\").pop();\n if (typeof extension === \"undefined\") {\n console.error(`Unable to identify model type from ${fileUrl}`);\n return;\n }\n const name = fileUrl.split(\"/\").pop()!.replace(`.${extension!}`, \"\");\n if (this.debug) {\n console.log(`Loading ${extension} model ${name} from ${fileUrl}`);\n }\n if ([\"gltf\", \"glb\"].includes(extension)) {\n return new Promise((resolve, reject) => {\n this.gltfLoader.load(\n fileUrl,\n (object: GLTF) => {\n if (fileType === \"model\") {\n resolve(object.scene as Object3D);\n } else if (fileType === \"animation\") {\n resolve(object.animations[0] as AnimationClip);\n } else {\n const error = `Trying to load unknown ${fileType} type of element from file ${fileUrl}`;\n console.error(error);\n reject(error);\n }\n },\n undefined,\n (error) => {\n console.error(`Error loading GL(B|TF) from ${fileUrl}: ${error}`);\n reject(error);\n },\n );\n });\n } else if (extension === \"fbx\") {\n return new Promise((resolve, reject) => {\n this.fbxLoader.load(\n fileUrl,\n (object: Object3D) => {\n resolve(object as Object3D);\n },\n undefined,\n (error) => {\n console.error(`Error loading FBX from ${fileUrl}: ${error}`);\n reject(error);\n },\n );\n });\n }\n }\n}\n", "import { Box3, Line3, Matrix4, PerspectiveCamera, Quaternion, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { ease } from \"../helpers/math-helpers\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { CharacterModel } from \"./CharacterModel\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\n\nexport class LocalController {\n private collisionDetectionSteps = 15;\n\n public capsuleInfo = {\n radius: 0.4,\n segment: new Line3(new Vector3(), new Vector3(0, 1.05, 0)),\n };\n\n private characterOnGround: boolean = false;\n private characterVelocity: Vector3 = new Vector3();\n private gravity = -20;\n private upVector: Vector3 = new Vector3(0, 1, 0);\n\n private rotationOffset: number = 0;\n private azimuthalAngle: number = 0;\n\n private tempBox: Box3 = new Box3();\n private tempMatrix: Matrix4 = new Matrix4();\n private tempSegment: Line3 = new Line3();\n private tempVector: Vector3 = new Vector3();\n private tempVector2: Vector3 = new Vector3();\n\n private jumpInput: boolean = false;\n private jumpForce: number = 10;\n private canJump: boolean = true;\n\n private inputDirections: {\n forward: boolean;\n backward: boolean;\n left: boolean;\n right: boolean;\n } = {\n forward: false,\n backward: false,\n left: false,\n right: false,\n };\n private runInput: boolean = false;\n\n private thirdPersonCamera: PerspectiveCamera | null = null;\n\n private speed: number = 0;\n private targetSpeed: number = 0;\n\n public networkState: CharacterState = {\n id: 0,\n position: { x: 0, y: 0, z: 0 },\n rotation: { quaternionY: 0, quaternionW: 0 },\n state: AnimationState.idle,\n };\n\n constructor(\n private readonly model: CharacterModel,\n private readonly id: number,\n private readonly collisionsManager: CollisionsManager,\n private readonly keyInputManager: KeyInputManager,\n private readonly cameraManager: CameraManager,\n private readonly timeManager: TimeManager,\n ) {}\n\n public update(): void {\n if (!this.model?.mesh || !this.model?.animationMixer) return;\n if (!this.thirdPersonCamera) this.thirdPersonCamera = this.cameraManager.camera;\n\n const movementKeysPressed = this.keyInputManager.isMovementKeyPressed();\n const forward = this.keyInputManager.isKeyPressed(\"w\");\n const backward = this.keyInputManager.isKeyPressed(\"s\");\n const left = this.keyInputManager.isKeyPressed(\"a\");\n const right = this.keyInputManager.isKeyPressed(\"d\");\n\n this.inputDirections = { forward, backward, left, right };\n this.jumpInput = this.keyInputManager.isJumping();\n this.runInput = this.keyInputManager.isShiftPressed();\n\n if (movementKeysPressed) {\n const targetAnimation = this.getTargetAnimation();\n this.model.updateAnimation(targetAnimation, this.timeManager.deltaTime);\n } else {\n this.model.updateAnimation(AnimationState.idle, this.timeManager.deltaTime);\n }\n\n if (Object.values(this.inputDirections).some((v) => v)) {\n this.updateRotation();\n }\n\n for (let i = 0; i < this.collisionDetectionSteps; i++) {\n this.updatePosition(this.timeManager.deltaTime / this.collisionDetectionSteps, i);\n }\n\n if (this.model.mesh.position.y < 0) {\n this.resetPosition();\n }\n this.updateNetworkState();\n }\n\n private getTargetAnimation(): AnimationState {\n const { forward, backward, left, right } = this.inputDirections;\n const hasAnyDirection = forward || backward || left || right;\n const isRunning = this.runInput && hasAnyDirection;\n const conflictingDirections = (forward && backward) || (left && right);\n\n if (conflictingDirections) return AnimationState.idle;\n return hasAnyDirection\n ? isRunning\n ? AnimationState.running\n : AnimationState.walking\n : AnimationState.idle;\n }\n\n private updateRotationOffset(): void {\n const { forward, backward, left, right } = this.inputDirections;\n if ((left && right) || (forward && backward)) return;\n if (forward) {\n this.rotationOffset = Math.PI;\n if (left) this.rotationOffset = Math.PI + Math.PI / 4;\n if (right) this.rotationOffset = Math.PI - Math.PI / 4;\n } else if (backward) {\n this.rotationOffset = Math.PI * 2;\n if (left) this.rotationOffset = -Math.PI * 2 - Math.PI / 4;\n if (right) this.rotationOffset = Math.PI * 2 + Math.PI / 4;\n } else if (left) {\n this.rotationOffset = Math.PI * -0.5;\n } else if (right) {\n this.rotationOffset = Math.PI * 0.5;\n }\n }\n\n private updateAzimuthalAngle(): void {\n if (!this.thirdPersonCamera || !this.model?.mesh) return;\n this.azimuthalAngle = Math.atan2(\n this.thirdPersonCamera.position.x - this.model.mesh.position.x,\n this.thirdPersonCamera.position.z - this.model.mesh.position.z,\n );\n }\n\n private updateRotation(): void {\n if (!this.thirdPersonCamera || !this.model?.mesh) return;\n this.updateRotationOffset();\n this.updateAzimuthalAngle();\n const rotationQuaternion = new Quaternion();\n rotationQuaternion.setFromAxisAngle(this.upVector, this.azimuthalAngle + this.rotationOffset);\n this.model.mesh.quaternion.rotateTowards(rotationQuaternion, 0.07);\n }\n\n private addScaledVectorToCharacter(deltaTime: number) {\n if (!this.model?.mesh) return;\n this.model.mesh.position.addScaledVector(this.tempVector, this.speed * deltaTime);\n }\n\n private updatePosition(deltaTime: number, _iter: number): void {\n if (!this.model?.mesh) return;\n const { forward, backward, left, right } = this.inputDirections;\n\n this.targetSpeed = this.runInput ? 14 : 8;\n this.speed += ease(this.targetSpeed, this.speed, 0.07);\n\n if (this.characterOnGround) {\n this.canJump = true;\n if (this.jumpInput && this.canJump) {\n this.characterVelocity.y += this.jumpForce;\n this.canJump = false;\n } else {\n this.characterVelocity.y = deltaTime * this.gravity;\n }\n } else {\n this.characterVelocity.y += deltaTime * this.gravity;\n this.canJump = false;\n }\n\n this.model.mesh.position.addScaledVector(this.characterVelocity, deltaTime);\n\n if (forward) {\n this.tempVector.set(0, 0, -1).applyAxisAngle(this.upVector, this.azimuthalAngle);\n this.addScaledVectorToCharacter(deltaTime);\n }\n\n if (backward) {\n this.tempVector.set(0, 0, 1).applyAxisAngle(this.upVector, this.azimuthalAngle);\n this.addScaledVectorToCharacter(deltaTime);\n }\n\n if (left) {\n this.tempVector.set(-1, 0, 0).applyAxisAngle(this.upVector, this.azimuthalAngle);\n this.addScaledVectorToCharacter(deltaTime);\n }\n\n if (right) {\n this.tempVector.set(1, 0, 0).applyAxisAngle(this.upVector, this.azimuthalAngle);\n this.addScaledVectorToCharacter(deltaTime);\n }\n\n this.model.mesh.updateMatrixWorld();\n\n this.tempBox.makeEmpty();\n\n this.tempSegment.copy(this.capsuleInfo.segment!);\n this.tempSegment.start.applyMatrix4(this.model.mesh.matrixWorld).applyMatrix4(this.tempMatrix);\n this.tempSegment.end.applyMatrix4(this.model.mesh.matrixWorld).applyMatrix4(this.tempMatrix);\n\n this.tempBox.expandByPoint(this.tempSegment.start);\n this.tempBox.expandByPoint(this.tempSegment.end);\n\n this.tempBox.min.subScalar(this.capsuleInfo.radius!);\n this.tempBox.max.addScalar(this.capsuleInfo.radius!);\n\n this.collisionsManager.applyColliders(this.tempSegment, this.capsuleInfo.radius!, this.tempBox);\n\n const newPosition = this.tempVector;\n newPosition.copy(this.tempSegment.start);\n\n const deltaVector = this.tempVector2;\n deltaVector.subVectors(newPosition, this.model.mesh.position);\n\n const offset = Math.max(0.0, deltaVector.length() - 1e-5);\n deltaVector.normalize().multiplyScalar(offset);\n\n this.model.mesh.position.add(deltaVector);\n\n this.characterOnGround = deltaVector.y > Math.abs(deltaTime * this.characterVelocity.y * 0.25);\n\n if (this.characterOnGround) {\n this.characterVelocity.set(0, 0, 0);\n } else {\n deltaVector.normalize();\n this.characterVelocity.addScaledVector(deltaVector, -deltaVector.dot(this.characterVelocity));\n }\n }\n\n private updateNetworkState(): void {\n if (!this.model?.mesh) return;\n const characterQuaternion = this.model.mesh.getWorldQuaternion(new Quaternion());\n const positionUpdate = new Vector3(\n this.model.mesh.position.x,\n this.model.mesh.position.y,\n this.model.mesh.position.z,\n );\n this.networkState = {\n id: this.id,\n position: positionUpdate,\n rotation: { quaternionY: characterQuaternion?.y, quaternionW: characterQuaternion?.w },\n state: this.model.currentAnimation as AnimationState,\n };\n }\n\n private resetPosition(): void {\n if (!this.model?.mesh) return;\n this.characterVelocity.y = 0;\n this.model.mesh.position.y = 5;\n this.characterOnGround = false;\n }\n}\n", "import { PositionAndRotation } from \"mml-web\";\nimport { Camera, Group, Object3D, PerspectiveCamera, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { getSpawnPositionInsideCircle } from \"../helpers/math-helpers\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { Character, CharacterDescription } from \"./Character\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\nimport { RemoteController } from \"./RemoteController\";\n\nfunction encodeCharacterAndCamera(character: Object3D, camera: PerspectiveCamera): string {\n return [\n ...character.position.toArray(),\n ...character.quaternion.toArray(),\n ...camera.position.toArray(),\n ...camera.quaternion.toArray(),\n ].join(\",\");\n}\n\nfunction decodeCharacterAndCamera(hash: string, character: Object3D, camera: Camera) {\n const values = hash.split(\",\").map(Number);\n character.position.fromArray(values.slice(0, 3));\n character.quaternion.fromArray(values.slice(3, 7));\n camera.position.fromArray(values.slice(7, 10));\n camera.quaternion.fromArray(values.slice(10, 14));\n}\n\nexport class CharacterManager {\n /*\n TODO - re-enable updating location hash when there is a solution that waits for models to load (currently if the \n character was standing on a model and the page is reloaded the character falls into the model before it loads and \n can be trapped).\n */\n private updateLocationHash = false;\n\n public loadingCharacters: Map<number, Promise<Character>> = new Map();\n\n public remoteCharacters: Map<number, Character> = new Map();\n public remoteCharacterControllers: Map<number, RemoteController> = new Map();\n\n private characterDescription: CharacterDescription | null = null;\n public character: Character | null = null;\n\n public readonly group: Group;\n\n constructor(\n private readonly collisionsManager: CollisionsManager,\n private readonly cameraManager: CameraManager,\n private readonly timeManager: TimeManager,\n private readonly inputManager: KeyInputManager,\n private readonly clientStates: Map<number, CharacterState>,\n private readonly sendUpdate: (update: CharacterState) => void,\n ) {\n this.group = new Group();\n }\n\n public spawnCharacter(\n characterDescription: CharacterDescription,\n id: number,\n isLocal: boolean = false,\n ) {\n this.characterDescription = characterDescription;\n const characterLoadingPromise = new Promise<Character>((resolve) => {\n const character = new Character(\n characterDescription,\n id,\n isLocal,\n () => {\n if (window.location.hash && window.location.hash.length > 1) {\n decodeCharacterAndCamera(\n window.location.hash.substring(1),\n character.model!.mesh!,\n this.cameraManager.camera,\n );\n } else {\n const spawnPosition = getSpawnPositionInsideCircle(3, 30, id);\n character.model!.mesh!.position.set(spawnPosition.x, spawnPosition.y, spawnPosition.z);\n this.cameraManager.camera.position.set(\n spawnPosition.x,\n spawnPosition.y + 1.5,\n spawnPosition.z + 3,\n );\n }\n character.model!.hideMaterialByMeshName(\"SK_UE5Mannequin_1\");\n this.group.add(character.model!.mesh!);\n\n if (isLocal) {\n this.character = character;\n } else {\n this.remoteCharacters.set(id, character);\n const remoteController = new RemoteController(character, id);\n remoteController.setAnimationFromFile(\n AnimationState.idle,\n characterDescription.idleAnimationFileUrl,\n );\n remoteController.setAnimationFromFile(\n AnimationState.walking,\n characterDescription.jogAnimationFileUrl,\n );\n remoteController.setAnimationFromFile(\n AnimationState.running,\n characterDescription.sprintAnimationFileUrl,\n );\n this.remoteCharacterControllers.set(id, remoteController);\n }\n\n resolve(character);\n },\n this.collisionsManager,\n this.inputManager,\n this.cameraManager,\n this.timeManager,\n );\n });\n\n this.loadingCharacters.set(id, characterLoadingPromise);\n return characterLoadingPromise;\n }\n\n public getLocalCharacterPositionAndRotation(): PositionAndRotation {\n if (this.character && this.character.model && this.character.model.mesh) {\n return {\n position: this.character.model.mesh.position,\n rotation: this.character.model.mesh.rotation,\n };\n }\n return {\n position: { x: 0, y: 0, z: 0 },\n rotation: { x: 0, y: 0, z: 0 },\n };\n }\n\n public clear() {\n for (const [id, character] of this.remoteCharacters) {\n this.group.remove(character.model!.mesh!);\n this.remoteCharacters.delete(id);\n this.remoteCharacterControllers.delete(id);\n }\n if (this.character) {\n this.group.remove(this.character.model!.mesh!);\n this.character = null;\n }\n this.loadingCharacters.clear();\n }\n\n public update() {\n if (this.character) {\n this.character.update(this.timeManager.time);\n this.cameraManager.setTarget(this.character.position.add(new Vector3(0, 1.3, 0)));\n\n if (this.character.controller) {\n this.character.controller.update();\n if (this.timeManager.frame % 2 === 0) {\n this.sendUpdate(this.character.controller.networkState);\n }\n }\n\n for (const [id, update] of this.clientStates) {\n if (!this.remoteCharacters.has(id) && !this.loadingCharacters.has(id)) {\n this.spawnCharacter(this.characterDescription!, id).then(() => {\n this.loadingCharacters.delete(id);\n });\n }\n\n const characterController = this.remoteCharacterControllers.get(id);\n if (characterController) {\n characterController.update(update, this.timeManager.time, this.timeManager.deltaTime);\n }\n }\n\n for (const [id, character] of this.remoteCharacters) {\n if (!this.clientStates.has(id)) {\n this.group.remove(character.model!.mesh!);\n this.remoteCharacters.delete(id);\n this.remoteCharacterControllers.delete(id);\n }\n }\n\n if (this.updateLocationHash && this.timeManager.frame % 60 === 0) {\n window.location.hash = encodeCharacterAndCamera(\n this.character.model!.mesh!,\n this.cameraManager.camera,\n );\n }\n }\n }\n}\n", "import {\n AnimationAction,\n AnimationClip,\n AnimationMixer,\n LoadingManager,\n Object3D,\n Quaternion,\n Vector3,\n} from \"three\";\nimport { FBXLoader } from \"three/examples/jsm/loaders/FBXLoader.js\";\nimport { GLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader.js\";\n\nimport { Character } from \"./Character\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\n\nexport class RemoteController {\n public characterModel: Object3D | null = null;\n private loadManager: LoadingManager = new LoadingManager();\n\n private animationMixer: AnimationMixer = new AnimationMixer(new Object3D());\n private animations = new Map<AnimationState, AnimationAction>();\n public currentAnimation: AnimationState = AnimationState.idle;\n\n private fbxLoader: FBXLoader = new FBXLoader(this.loadManager);\n private gltfLoader: GLTFLoader = new GLTFLoader(this.loadManager);\n\n public networkState: CharacterState = {\n id: 0,\n position: { x: 0, y: 0, z: 0 },\n rotation: { quaternionY: 0, quaternionW: 0 },\n state: this.currentAnimation as AnimationState,\n };\n\n constructor(public readonly character: Character, public readonly id: number) {\n this.characterModel = this.character.model!.mesh!;\n this.animationMixer = new AnimationMixer(this.characterModel);\n }\n\n public update(clientUpdate: CharacterState, time: number, deltaTime: number): void {\n if (!this.character) return;\n this.character.update(time);\n this.updateFromNetwork(clientUpdate);\n this.animationMixer.update(deltaTime);\n }\n\n public setAnimationFromFile(animationType: AnimationState, fileName: string): void {\n const animationFile = `${fileName}`;\n const extension = fileName.split(\".\").pop();\n if (typeof extension !== \"string\") {\n console.error(`Error: could not recognize extension of animation: ${animationFile}`);\n return;\n }\n if ([\"gltf\", \"glb\"].includes(extension)) {\n this.gltfLoader.load(\n animationFile,\n (anim) => {\n const animation = anim.animations[0] as AnimationClip;\n const animationAction = this.animationMixer.clipAction(animation);\n this.animations.set(animationType, animationAction);\n if (animationType === AnimationState.idle) {\n animationAction.play();\n }\n },\n undefined,\n (error) => console.error(`Error loading ${animationFile}: ${error}`),\n );\n } else if ([\"fbx\"].includes(extension)) {\n this.fbxLoader.load(\n animationFile,\n (anim) => {\n const animation = anim.animations[0] as AnimationClip;\n const animationAction = this.animationMixer.clipAction(animation);\n this.animations.set(animationType, animationAction);\n if (animationType === AnimationState.idle) {\n animationAction.play();\n }\n },\n undefined,\n (error) => console.error(`Error loading ${animationFile}: ${error}`),\n );\n }\n }\n\n private transitionToAnimation(\n targetAnimation: AnimationState,\n transitionDuration: number = 0.21,\n ): void {\n if (this.currentAnimation === targetAnimation) return;\n\n const currentAction = this.animations.get(this.currentAnimation);\n const targetAction = this.animations.get(targetAnimation);\n\n if (!targetAction) return;\n\n if (currentAction) {\n currentAction.enabled = true;\n targetAction\n .reset()\n .setEffectiveTimeScale(1)\n .setEffectiveWeight(1)\n .fadeIn(transitionDuration)\n .play();\n currentAction.crossFadeTo(targetAction, transitionDuration, true);\n } else {\n targetAction.play();\n }\n\n this.currentAnimation = targetAnimation;\n }\n\n private updateFromNetwork(clientUpdate: CharacterState): void {\n if (!this.characterModel) return;\n const { position, rotation, state } = clientUpdate;\n this.characterModel.position.lerp(new Vector3(position.x, position.y, position.z), 0.2);\n const rotationQuaternion = new Quaternion(0, rotation.quaternionY, 0, rotation.quaternionW);\n this.characterModel.quaternion.slerp(rotationQuaternion, 0.2);\n if (state !== this.currentAnimation) {\n this.transitionToAnimation(state);\n }\n }\n}\n", "export class KeyInputManager {\n private keys = new Map<string, boolean>();\n\n constructor() {\n document.addEventListener(\"keydown\", this.onKeyDown.bind(this));\n document.addEventListener(\"keyup\", this.onKeyUp.bind(this));\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n this.keys.set(event.key.toLowerCase(), true);\n }\n\n private onKeyUp(event: KeyboardEvent): void {\n this.keys.set(event.key.toLowerCase(), false);\n }\n\n public isKeyPressed(key: string): boolean {\n return this.keys.get(key) || false;\n }\n\n public isMovementKeyPressed(): boolean {\n return [\"w\", \"a\", \"s\", \"d\"].some((key) => this.isKeyPressed(key));\n }\n\n public isShiftPressed(): boolean {\n return this.isKeyPressed(\"shift\");\n }\n\n public isJumping(): boolean {\n return this.isKeyPressed(\" \");\n }\n\n public dispose() {\n document.removeEventListener(\"keydown\", this.onKeyDown.bind(this));\n document.removeEventListener(\"keyup\", this.onKeyDown.bind(this));\n }\n}\n", "import {\n IMMLScene,\n Interaction,\n InteractionListener,\n InteractionManager,\n MMLClickTrigger,\n PromptManager,\n PromptProps,\n registerCustomElementsToWindow,\n setGlobalMScene,\n PositionAndRotation,\n MElement,\n} from \"mml-web\";\nimport { AudioListener, Group, Object3D, PerspectiveCamera, Scene, WebGLRenderer } from \"three\";\n\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\n\nexport class MMLCompositionScene {\n public group: Group;\n private debug: boolean = false;\n\n private readonly mmlScene: Partial<IMMLScene>;\n private readonly promptManager: PromptManager;\n private readonly interactionListener: InteractionListener;\n private readonly clickTrigger: MMLClickTrigger;\n\n constructor(\n private renderer: WebGLRenderer,\n private scene: Scene,\n private camera: PerspectiveCamera,\n private audioListener: AudioListener,\n private collisionsManager: CollisionsManager,\n private getUserPositionAndRotation: () => PositionAndRotation,\n documentAddresses: Array<string>,\n ) {\n this.group = new Group();\n this.promptManager = PromptManager.init(document.body);\n\n const { interactionListener } = InteractionManager.init(document.body, this.camera, this.scene);\n this.interactionListener = interactionListener;\n\n this.mmlScene = {\n getAudioListener: () => this.audioListener,\n getRenderer: () => this.renderer,\n getThreeScene: () => this.scene,\n getRootContainer: () => this.group,\n getCamera: () => this.camera,\n addCollider: (object: Object3D, mElement: MElement) => {\n this.collisionsManager.addMeshesGroup(object as Group, mElement);\n },\n updateCollider: (object: Object3D) => {\n this.collisionsManager.updateMeshesGroup(object as Group);\n },\n removeCollider: (object: Object3D) => {\n this.collisionsManager.removeMeshesGroup(object as Group);\n },\n getUserPositionAndRotation: this.getUserPositionAndRotation,\n addInteraction: (interaction: Interaction) => {\n this.interactionListener.addInteraction(interaction);\n },\n updateInteraction: (interaction: Interaction) => {\n this.interactionListener.updateInteraction(interaction);\n },\n removeInteraction: (interaction: Interaction) => {\n this.interactionListener.removeInteraction(interaction);\n },\n prompt: (promptProps: PromptProps, callback: (message: string | null) => void) => {\n this.promptManager.prompt(promptProps, callback);\n },\n };\n setGlobalMScene(this.mmlScene as IMMLScene);\n registerCustomElementsToWindow(window);\n this.clickTrigger = MMLClickTrigger.init(document, this.mmlScene as IMMLScene);\n if (this.debug) {\n console.log(this.clickTrigger);\n }\n for (const address of documentAddresses) {\n const frameElement = document.createElement(\"m-frame\");\n frameElement.setAttribute(\"src\", address);\n document.body.appendChild(frameElement);\n }\n }\n}\n", "import {\n EffectComposer,\n RenderPass,\n EffectPass,\n FXAAEffect,\n ShaderPass,\n BloomEffect,\n} from \"postprocessing\";\nimport {\n ACESFilmicToneMapping,\n PCFSoftShadowMap,\n PerspectiveCamera,\n Scene,\n Vector2,\n WebGLRenderer,\n} from \"three\";\n\nimport { GaussGrainEffect } from \"./post-effects/gauss-grain\";\n\nexport class Composer {\n private width: number = window.innerWidth;\n private height: number = window.innerHeight;\n public resolution: Vector2 = new Vector2(this.width, this.height);\n\n private readonly scene: Scene;\n private readonly camera: PerspectiveCamera;\n public readonly renderer: WebGLRenderer;\n\n private readonly composer: EffectComposer;\n private readonly renderPass: RenderPass;\n private readonly fxaaEffect: FXAAEffect;\n private readonly fxaaPass: EffectPass;\n private readonly bloomEffect: BloomEffect;\n private readonly bloomPass: EffectPass;\n\n private readonly gaussGrainEffect = GaussGrainEffect;\n private readonly gaussGrainPass: ShaderPass;\n\n constructor(scene: Scene, camera: PerspectiveCamera) {\n this.scene = scene;\n this.camera = camera;\n this.renderer = new WebGLRenderer({\n powerPreference: \"high-performance\",\n antialias: false,\n stencil: false,\n depth: false,\n });\n this.renderer.setSize(this.width, this.height);\n this.renderer.shadowMap.enabled = true;\n this.renderer.shadowMap.type = PCFSoftShadowMap;\n this.renderer.toneMapping = ACESFilmicToneMapping;\n this.renderer.toneMappingExposure = 0.5;\n document.body.appendChild(this.renderer.domElement);\n\n this.composer = new EffectComposer(this.renderer);\n this.renderPass = new RenderPass(this.scene, this.camera);\n this.fxaaEffect = new FXAAEffect();\n this.fxaaPass = new EffectPass(this.camera, this.fxaaEffect);\n this.bloomEffect = new BloomEffect();\n this.bloomPass = new EffectPass(this.camera, this.bloomEffect);\n this.gaussGrainPass = new ShaderPass(this.gaussGrainEffect, \"tDiffuse\");\n\n this.composer.addPass(this.renderPass);\n this.composer.addPass(this.fxaaPass);\n this.composer.addPass(this.bloomPass);\n this.composer.addPass(this.gaussGrainPass);\n\n window.addEventListener(\"resize\", () => {\n this.updateProjection();\n });\n this.updateProjection();\n }\n\n private updateProjection(): void {\n this.width = window.innerWidth;\n this.height = innerHeight;\n this.resolution = new Vector2(this.width, this.height);\n if (this.composer) this.composer.setSize(this.width, this.height);\n if (this.fxaaPass) this.fxaaPass.setSize(this.width, this.height);\n if (this.renderPass) this.renderPass.setSize(this.width, this.height);\n this.renderer.setSize(this.width, this.height);\n }\n\n public render(time: number): void {\n this.composer.render();\n this.gaussGrainEffect.uniforms.resolution.value = this.resolution;\n this.gaussGrainEffect.uniforms.time.value = time;\n this.gaussGrainEffect.uniforms.alpha.value = 1.0;\n this.gaussGrainEffect.uniforms.amount.value = 0.035;\n this.bloomEffect.intensity = 1.0;\n }\n}\n", "import { ShaderMaterial, Uniform, Vector2 } from \"three\";\n\nimport { vertexShader } from \"../shaders/vertex-shader\";\n\nexport const GaussGrainEffect = new ShaderMaterial({\n uniforms: {\n tDiffuse: new Uniform(null),\n resolution: new Uniform(new Vector2()),\n time: new Uniform(0.0),\n amount: new Uniform(0.0),\n alpha: new Uniform(0.0),\n },\n vertexShader: vertexShader,\n fragmentShader: /* glsl */ `\n precision highp float;\n in vec2 vUv;\n\n uniform sampler2D tDiffuse;\n uniform vec2 resolution;\n uniform float time;\n uniform float amount;\n uniform float alpha;\n\n const float PI = acos(-1.0);\n const float TAU = PI * 2.0;\n const float SQRTAU = sqrt(TAU);\n\n float gaussian(float z, float u, float o) {\n return (\n (1.0 / (o * SQRTAU)) *\n (exp(-(((z - u) * (z - u)) / (2.0 * (o * o)))))\n );\n }\n\n vec3 gaussgrain() {\n vec2 ps = vec2(1.01) / resolution.xy;\n vec2 uv = gl_FragCoord.xy * ps;\n float t = time;\n float seed = dot(uv, vec2(12.9898, 78.233));\n float noise = fract(sin(seed) * 43758.5453123 + t);\n noise = gaussian(noise, 0.0, 0.5);\n return vec3(noise);\n }\n\n void main(void) {\n vec2 uv = vUv;\n vec4 originalColor = texture(tDiffuse, uv);\n vec3 grain = gaussgrain();\n vec3 col = originalColor.rgb + (grain * amount);\n gl_FragColor = vec4(clamp(col, 0.0, 1.0), alpha);\n }\n `,\n});\n", "export const vertexShader = /* glsl */ `\n precision highp float;\n\n out vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `;\n", "import { Clock } from \"three\";\n\nimport { ease } from \"../helpers/math-helpers\";\n\nexport class TimeManager {\n private clock: Clock = new Clock();\n private roundMagnitude: number = 200000;\n private maxAverageFrames: number = 300;\n private deltaTimes: number[] = [];\n private targetAverageDeltaTime: number = 0;\n private lerpedAverageMagDelta: number = 0;\n private fpsUpdateTime: number = 0;\n private framesSinceLastFPSUpdate: number = 0;\n\n public time: number = 0;\n public deltaTime: number = 0;\n public rawDeltaTime: number = 0;\n public frame: number = 0;\n public fps: number = 0;\n\n update() {\n this.rawDeltaTime = this.clock.getDelta();\n this.frame++;\n this.time += this.rawDeltaTime;\n this.deltaTimes.push(this.rawDeltaTime);\n\n if (this.deltaTimes.length > this.maxAverageFrames) {\n this.deltaTimes.shift();\n }\n\n this.targetAverageDeltaTime =\n this.deltaTimes.reduce((prev, curr) => prev + curr, 0) / this.deltaTimes.length;\n\n this.lerpedAverageMagDelta += ease(\n this.targetAverageDeltaTime * this.roundMagnitude,\n this.lerpedAverageMagDelta,\n 0.12,\n );\n\n const revertMagnitude = this.lerpedAverageMagDelta / this.roundMagnitude;\n const smoothDT = Math.round(revertMagnitude * this.roundMagnitude) / this.roundMagnitude;\n\n this.deltaTime = smoothDT > this.rawDeltaTime * 1.75 ? this.rawDeltaTime : smoothDT;\n\n this.framesSinceLastFPSUpdate++;\n if (this.framesSinceLastFPSUpdate >= this.maxAverageFrames) {\n this.fps =\n Math.round((this.framesSinceLastFPSUpdate / (this.time - this.fpsUpdateTime)) * 100) / 100;\n this.fpsUpdateTime = this.time;\n this.framesSinceLastFPSUpdate = 0;\n }\n }\n}\n", "import {\n MElement,\n MMLCollisionTrigger,\n getRelativePositionAndRotationRelativeToObject,\n} from \"mml-web\";\nimport {\n Box3,\n BufferGeometry,\n Color,\n Euler,\n FrontSide,\n Group,\n Line3,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n Scene,\n Vector3,\n} from \"three\";\nimport * as BufferGeometryUtils from \"three/examples/jsm/utils/BufferGeometryUtils.js\";\nimport { MeshBVH, MeshBVHVisualizer } from \"three-mesh-bvh\";\n\ntype CollisionMeshState = {\n source: Group;\n meshBVH: MeshBVH;\n visualizer: MeshBVHVisualizer | null;\n};\n\nexport class CollisionsManager {\n private debug: boolean = false;\n private scene: Scene;\n private tempVector: Vector3 = new Vector3();\n private tempVector2: Vector3 = new Vector3();\n\n private collisionMeshState: Map<Group, CollisionMeshState> = new Map();\n private collisionTrigger: MMLCollisionTrigger;\n\n constructor(scene: Scene) {\n this.scene = scene;\n this.collisionTrigger = MMLCollisionTrigger.init();\n }\n\n private createCollisionMeshState(group: Group): CollisionMeshState {\n const geometries: Array<BufferGeometry> = [];\n group.traverse((child: Object3D) => {\n if (child.type === \"Mesh\") {\n const mesh = child as Mesh;\n mesh.localToWorld(new Vector3());\n mesh.updateMatrixWorld();\n const clonedGeometry = mesh.geometry.clone();\n clonedGeometry.applyMatrix4(mesh.matrixWorld);\n\n for (const key in clonedGeometry.attributes) {\n if (key !== \"position\") {\n clonedGeometry.deleteAttribute(key);\n }\n }\n if (clonedGeometry.index) {\n geometries.push(clonedGeometry.toNonIndexed());\n } else {\n geometries.push(clonedGeometry);\n }\n }\n });\n const newBufferGeometry = BufferGeometryUtils.mergeGeometries(geometries);\n const meshBVH = new MeshBVH(newBufferGeometry);\n\n if (!this.debug) {\n return { source: group, visualizer: null, meshBVH };\n }\n\n const mergedMesh = new Mesh(\n newBufferGeometry,\n new MeshStandardMaterial({ color: 0xff0000, side: FrontSide, wireframe: true }),\n );\n mergedMesh.geometry.boundsTree = meshBVH;\n const visualizer = new MeshBVHVisualizer(mergedMesh, 3);\n visualizer.edgeMaterial.color = new Color(0x0000ff);\n visualizer.update();\n return { source: group, visualizer, meshBVH };\n }\n\n public addMeshesGroup(group: Group, mElement?: MElement): void {\n if (mElement) {\n this.collisionTrigger.addCollider(group, mElement);\n }\n const meshState = this.createCollisionMeshState(group);\n if (meshState.visualizer) {\n this.scene.add(meshState.visualizer);\n }\n this.collisionMeshState.set(group, meshState);\n }\n\n public updateMeshesGroup(group: Group): void {\n const meshState = this.collisionMeshState.get(group);\n if (meshState) {\n const newMeshState = this.createCollisionMeshState(group);\n if (meshState.visualizer) {\n this.scene.remove(meshState.visualizer);\n }\n if (newMeshState.visualizer) {\n this.scene.add(newMeshState.visualizer);\n }\n this.collisionMeshState.set(group, newMeshState);\n }\n }\n\n public removeMeshesGroup(group: Group): void {\n this.collisionTrigger.removeCollider(group);\n const meshState = this.collisionMeshState.get(group);\n if (meshState) {\n if (meshState.visualizer) {\n this.scene.remove(meshState.visualizer);\n }\n this.collisionMeshState.delete(group);\n }\n }\n\n private applyCollider(\n tempSegment: Line3,\n radius: number,\n boundingBox: Box3,\n meshState: CollisionMeshState,\n ): Vector3 | null {\n let collisionPosition: Vector3 | null = null;\n meshState.meshBVH.shapecast({\n intersectsBounds: (box) => box.intersectsBox(boundingBox),\n intersectsTriangle: (tri) => {\n const triPoint = this.tempVector;\n const capsulePoint = this.tempVector2;\n const distance = tri.closestPointToSegment(tempSegment, triPoint, capsulePoint);\n if (distance < radius) {\n const depth = radius - distance;\n collisionPosition = new Vector3().copy(capsulePoint);\n const direction = capsulePoint.sub(triPoint).normalize();\n tempSegment.start.addScaledVector(direction, depth);\n tempSegment.end.addScaledVector(direction, depth);\n }\n },\n });\n return collisionPosition;\n }\n\n public applyColliders(tempSegment: Line3, radius: number, boundingBox: Box3) {\n let collidedElements: Map<\n Object3D,\n {\n position: { x: number; y: number; z: number };\n }\n > | null = null;\n for (const meshState of this.collisionMeshState.values()) {\n const collisionPosition = this.applyCollider(tempSegment, radius, boundingBox, meshState);\n if (collisionPosition) {\n if (collidedElements === null) {\n collidedElements = new Map();\n }\n const relativePosition = getRelativePositionAndRotationRelativeToObject(\n {\n position: collisionPosition,\n rotation: new Euler(),\n },\n meshState.source,\n );\n collidedElements.set(meshState.source, {\n position: relativePosition.position,\n });\n }\n }\n\n this.collisionTrigger.setCurrentCollisions(collidedElements);\n }\n}\n"],
|
5
|
+
"mappings": "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",
|
6
|
+
"names": ["Vector3", "Vector3", "Color", "Vector3", "AnimationClip", "Object3D", "AnimationState", "Object3D", "AnimationClip", "Vector3", "Vector3", "Color", "Vector3", "Vector3", "AnimationMixer", "LoadingManager", "Object3D", "Quaternion", "Vector3", "FBXLoader", "GLTFLoader", "LoadingManager", "AnimationMixer", "Object3D", "FBXLoader", "GLTFLoader", "Vector3", "Quaternion", "Vector3", "Group", "Group", "Vector2", "WebGLRenderer", "Vector2", "WebGLRenderer", "Color", "Mesh", "MeshStandardMaterial", "Vector3", "Vector3", "Mesh", "MeshStandardMaterial", "Color"]
|
7
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
export declare class KeyInputManager {
|
2
|
+
private keys;
|
3
|
+
constructor();
|
4
|
+
private onKeyDown;
|
5
|
+
private onKeyUp;
|
6
|
+
isKeyPressed(key: string): boolean;
|
7
|
+
isMovementKeyPressed(): boolean;
|
8
|
+
isShiftPressed(): boolean;
|
9
|
+
isJumping(): boolean;
|
10
|
+
dispose(): void;
|
11
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import { PositionAndRotation } from "mml-web";
|
2
|
+
import { AudioListener, Group, PerspectiveCamera, Scene, WebGLRenderer } from "three";
|
3
|
+
import { CollisionsManager } from "../collisions/CollisionsManager";
|
4
|
+
export declare class MMLCompositionScene {
|
5
|
+
private renderer;
|
6
|
+
private scene;
|
7
|
+
private camera;
|
8
|
+
private audioListener;
|
9
|
+
private collisionsManager;
|
10
|
+
private getUserPositionAndRotation;
|
11
|
+
group: Group;
|
12
|
+
private debug;
|
13
|
+
private readonly mmlScene;
|
14
|
+
private readonly promptManager;
|
15
|
+
private readonly interactionListener;
|
16
|
+
private readonly clickTrigger;
|
17
|
+
constructor(renderer: WebGLRenderer, scene: Scene, camera: PerspectiveCamera, audioListener: AudioListener, collisionsManager: CollisionsManager, getUserPositionAndRotation: () => PositionAndRotation, documentAddresses: Array<string>);
|
18
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import { PerspectiveCamera, Scene, Vector2, WebGLRenderer } from "three";
|
2
|
+
export declare class Composer {
|
3
|
+
private width;
|
4
|
+
private height;
|
5
|
+
resolution: Vector2;
|
6
|
+
private readonly scene;
|
7
|
+
private readonly camera;
|
8
|
+
readonly renderer: WebGLRenderer;
|
9
|
+
private readonly composer;
|
10
|
+
private readonly renderPass;
|
11
|
+
private readonly fxaaEffect;
|
12
|
+
private readonly fxaaPass;
|
13
|
+
private readonly bloomEffect;
|
14
|
+
private readonly bloomPass;
|
15
|
+
private readonly gaussGrainEffect;
|
16
|
+
private readonly gaussGrainPass;
|
17
|
+
constructor(scene: Scene, camera: PerspectiveCamera);
|
18
|
+
private updateProjection;
|
19
|
+
render(time: number): void;
|
20
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare const bayerDither: string;
|
@@ -0,0 +1,4 @@
|
|
1
|
+
export declare function injectBeforeMain(shaderSource: string, codeToInject: string): string;
|
2
|
+
export declare function injectInsideMain(shaderSource: string, codeToInject: string): string;
|
3
|
+
export declare function injectBefore(shaderSource: string, before: string, codeToInject: string): string;
|
4
|
+
export declare function injectAfter(shaderSource: string, after: string, codeToInject: string): string;
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare const vertexShader = "\n precision highp float;\n\n out vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n ";
|
@@ -0,0 +1,16 @@
|
|
1
|
+
export declare class TimeManager {
|
2
|
+
private clock;
|
3
|
+
private roundMagnitude;
|
4
|
+
private maxAverageFrames;
|
5
|
+
private deltaTimes;
|
6
|
+
private targetAverageDeltaTime;
|
7
|
+
private lerpedAverageMagDelta;
|
8
|
+
private fpsUpdateTime;
|
9
|
+
private framesSinceLastFPSUpdate;
|
10
|
+
time: number;
|
11
|
+
deltaTime: number;
|
12
|
+
rawDeltaTime: number;
|
13
|
+
frame: number;
|
14
|
+
fps: number;
|
15
|
+
update(): void;
|
16
|
+
}
|
package/package.json
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
{
|
2
|
+
"name": "@mml-io/3d-web-client-core",
|
3
|
+
"version": "0.1.0",
|
4
|
+
"main": "./build/index.js",
|
5
|
+
"types": "./build/index.d.ts",
|
6
|
+
"type": "module",
|
7
|
+
"files": [
|
8
|
+
"/build"
|
9
|
+
],
|
10
|
+
"scripts": {
|
11
|
+
"build": "rimraf ./build && node ./build.js --build",
|
12
|
+
"iterate": "node ./build.js --watch",
|
13
|
+
"type-check": "tsc --noEmit",
|
14
|
+
"lint": "eslint \"./src/**/*.{ts,}\" --max-warnings 0",
|
15
|
+
"lint:fix": "eslint \"./src/**/*.{ts,}\" --fix"
|
16
|
+
},
|
17
|
+
"dependencies": {
|
18
|
+
"mml-web": "0.3.0",
|
19
|
+
"postprocessing": "6.32.1",
|
20
|
+
"three": "^0.153.0",
|
21
|
+
"three-mesh-bvh": "0.6.0"
|
22
|
+
},
|
23
|
+
"devDependencies": {
|
24
|
+
"@types/three": "^0.152.1"
|
25
|
+
}
|
26
|
+
}
|