├── .gitignore ├── LICENSE ├── app ├── Experience │ ├── Camera.js │ ├── Experience.js │ ├── LocalStorage.js │ ├── Renderer.js │ ├── Utils │ │ ├── Loaders.js │ │ ├── Resources.js │ │ ├── Sizes.js │ │ ├── Time.js │ │ └── assets.js │ └── World │ │ ├── Interior │ │ ├── Components │ │ │ ├── Castle.js │ │ │ └── Interactions.js │ │ └── Interior.js │ │ ├── Player │ │ └── Player.js │ │ ├── Whiterun │ │ ├── Components │ │ │ ├── Buildings.js │ │ │ ├── Environment.js │ │ │ ├── Interactions.js │ │ │ ├── Items.js │ │ │ ├── Landscape.js │ │ │ └── Walls.js │ │ └── Whiterun.js │ │ └── World.js ├── Interface │ ├── Components │ │ └── Message.js │ ├── Interface.js │ └── Utils │ │ ├── Elements.js │ │ └── key.js ├── index.html ├── main.css ├── main.js └── styles │ ├── experience.css │ └── interface.css ├── package-lock.json ├── package.json ├── public ├── draco │ ├── README.md │ ├── draco_decoder.js │ ├── draco_decoder.wasm │ ├── draco_encoder.js │ ├── draco_wasm_wrapper.js │ └── gltf │ │ ├── draco_decoder.js │ │ ├── draco_decoder.wasm │ │ ├── draco_encoder.js │ │ └── draco_wasm_wrapper.js ├── models │ ├── Interior_w_collider.glb │ ├── buildings.glb │ ├── interior_interactions.glb │ ├── land_items.glb │ ├── land_w_collider.glb │ ├── outside_interactions.glb │ └── walls.glb ├── textures │ ├── buildings.webp │ ├── interior_baked.webp │ ├── items.webp │ ├── land.webp │ ├── skybox │ │ ├── nx.webp │ │ ├── ny.webp │ │ ├── nz.webp │ │ ├── px.webp │ │ ├── py.webp │ │ └── pz.webp │ └── walls_baked.webp └── vite.svg └── vite.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Andrew Woan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/Experience/Camera.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | import Experience from "./Experience.js"; 3 | import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; 4 | 5 | export default class Camera { 6 | constructor() { 7 | this.experience = new Experience(); 8 | this.sizes = this.experience.sizes; 9 | this.scene = this.experience.scene; 10 | this.canvas = this.experience.canvas; 11 | this.params = { 12 | fov: 75, 13 | aspect: this.sizes.aspect, 14 | near: 0.01, 15 | far: 1000, 16 | }; 17 | 18 | this.setPerspectiveCamera(); 19 | // this.setOrbitControls(); 20 | } 21 | 22 | setPerspectiveCamera() { 23 | this.perspectiveCamera = new THREE.PerspectiveCamera( 24 | this.params.fov, 25 | this.params.aspect, 26 | this.params.near, 27 | this.params.far 28 | ); 29 | 30 | this.perspectiveCamera.position.set(12.64, 1.7, 64.0198); 31 | 32 | this.scene.add(this.perspectiveCamera); 33 | } 34 | 35 | setOrbitControls() { 36 | this.controls = new OrbitControls(this.perspectiveCamera, this.canvas); 37 | this.controls.enableDamping = true; 38 | } 39 | 40 | onResize() { 41 | this.perspectiveCamera.aspect = this.sizes.aspect; 42 | this.perspectiveCamera.updateProjectionMatrix(); 43 | } 44 | 45 | update() { 46 | // this.controls.update(); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/Experience/Experience.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | 3 | import Sizes from "./Utils/Sizes.js"; 4 | import Time from "./Utils/Time.js"; 5 | import Resources from "./Utils/Resources.js"; 6 | import assets from "./Utils/assets.js"; 7 | 8 | import Camera from "./Camera.js"; 9 | import Renderer from "./Renderer.js"; 10 | import LocalStorage from "./LocalStorage.js"; 11 | 12 | import World from "./World/World.js"; 13 | 14 | export default class Experience { 15 | static instance; 16 | 17 | constructor(canvas) { 18 | if (Experience.instance) { 19 | return Experience.instance; 20 | } 21 | 22 | Experience.instance = this; 23 | 24 | this.canvas = canvas; 25 | this.sizes = new Sizes(); 26 | this.time = new Time(); 27 | 28 | this.setScene(); 29 | this.setCamera(); 30 | this.setRenderer(); 31 | this.setLocalStorage(); 32 | this.setResources(); 33 | this.setWorld(); 34 | 35 | this.sizes.on("resize", () => { 36 | this.onResize(); 37 | }); 38 | 39 | this.update(); 40 | } 41 | 42 | setScene() { 43 | this.scene = new THREE.Scene(); 44 | } 45 | 46 | setCamera() { 47 | this.camera = new Camera(); 48 | } 49 | 50 | setRenderer() { 51 | this.renderer = new Renderer(); 52 | } 53 | 54 | setLocalStorage() { 55 | this.localStorage = new LocalStorage(); 56 | } 57 | 58 | setResources() { 59 | this.resources = new Resources(assets); 60 | } 61 | 62 | setWorld() { 63 | this.world = new World(); 64 | } 65 | 66 | onResize() { 67 | this.camera.onResize(); 68 | this.renderer.onResize(); 69 | } 70 | 71 | update() { 72 | if (this.camera) this.camera.update(); 73 | if (this.renderer) this.renderer.update(); 74 | if (this.world) this.world.update(); 75 | if (this.time) this.time.update(); 76 | 77 | window.requestAnimationFrame(() => { 78 | this.update(); 79 | }); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /app/Experience/LocalStorage.js: -------------------------------------------------------------------------------- 1 | import Experience from "./Experience.js"; 2 | 3 | export default class LocalStorage { 4 | constructor() { 5 | this.experience = new Experience(); 6 | this.camera = this.experience.camera; 7 | 8 | this.initPlayerState(); 9 | this.setStateObject(); 10 | } 11 | 12 | initPlayerState() { 13 | this.stringState = { 14 | playerPosition: "whiterun|0|0|0", 15 | playerRotation: "0|0|0", 16 | }; 17 | 18 | localStorage.clear(); 19 | 20 | if ( 21 | localStorage.getItem("playerPosition") && 22 | localStorage.getItem("playerRotation") 23 | ) { 24 | this.stringState.playerPosition = 25 | localStorage.getItem("playerPosition"); 26 | this.stringState.playerRotation = 27 | localStorage.getItem("playerRotation"); 28 | } else { 29 | localStorage.setItem( 30 | "playerPosition", 31 | this.stringState.playerPosition 32 | ); 33 | localStorage.setItem( 34 | "playerRotation", 35 | this.stringState.playerRotation 36 | ); 37 | } 38 | } 39 | 40 | updateLocalStorage() { 41 | localStorage.setItem( 42 | "playerPosition", 43 | `${this.state.location}|${this.camera.perspectiveCamera.position.x}|${this.camera.perspectiveCamera.position.y}|${this.camera.perspectiveCamera.position.z}` 44 | ); 45 | localStorage.setItem( 46 | "playerRotation", 47 | `${this.camera.perspectiveCamera.rotation._x}|${this.camera.perspectiveCamera.rotation._y}|${this.camera.perspectiveCamera.rotation._z}` 48 | ); 49 | 50 | this.stringState.playerPosition = 51 | localStorage.getItem("playerPosition"); 52 | this.stringState.playerRotation = 53 | localStorage.getItem("playerRotation"); 54 | } 55 | 56 | setLocation(location) { 57 | this.state.location = location; 58 | } 59 | 60 | setStateObject() { 61 | this.state = { 62 | location: this.stringState.playerPosition.split("|")[0], 63 | 64 | posX: Number(this.stringState.playerPosition.split("|")[1]), 65 | posY: Number(this.stringState.playerPosition.split("|")[2]), 66 | posZ: Number(this.stringState.playerPosition.split("|")[3]), 67 | 68 | rotX: Number(this.stringState.playerRotation.split("|")[1]), 69 | rotY: Number(this.stringState.playerRotation.split("|")[2]), 70 | rotZ: Number(this.stringState.playerRotation.split("|")[3]), 71 | }; 72 | } 73 | 74 | update() { 75 | this.updateLocalStorage(); 76 | this.setStateObject(); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /app/Experience/Renderer.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | import Experience from "./Experience.js"; 3 | 4 | export default class Renderer { 5 | constructor() { 6 | this.experience = new Experience(); 7 | this.sizes = this.experience.sizes; 8 | this.scene = this.experience.scene; 9 | this.canvas = this.experience.canvas; 10 | this.camera = this.experience.camera; 11 | 12 | this.setRenderer(); 13 | } 14 | 15 | setRenderer() { 16 | this.renderer = new THREE.WebGLRenderer({ 17 | canvas: this.canvas, 18 | antialias: true, 19 | }); 20 | this.renderer.outputEncoding = THREE.sRGBEncoding; 21 | this.renderer.toneMapping = THREE.CineonToneMapping; 22 | this.renderer.toneMappingExposure = 1.75; 23 | this.renderer.setSize(this.sizes.width, this.sizes.height); 24 | this.renderer.setPixelRatio(this.sizes.pixelRatio); 25 | } 26 | 27 | onResize() { 28 | this.renderer.setSize(this.sizes.width, this.sizes.height); 29 | this.renderer.setPixelRatio(this.sizes.pixelRatio); 30 | } 31 | 32 | update() { 33 | this.renderer.render(this.scene, this.camera.perspectiveCamera); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/Experience/Utils/Loaders.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | 3 | import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js"; 4 | import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader.js"; 5 | 6 | export default class Loaders { 7 | constructor() { 8 | this.loaders = {}; 9 | 10 | this.setLoaders(); 11 | } 12 | 13 | setLoaders() { 14 | this.loaders.cubeTextureLoader = new THREE.CubeTextureLoader(); 15 | 16 | this.loaders.gltfLoader = new GLTFLoader(); 17 | this.loaders.dracoLoader = new DRACOLoader(); 18 | this.loaders.dracoLoader.setDecoderPath("/draco/"); 19 | this.loaders.gltfLoader.setDRACOLoader(this.loaders.dracoLoader); 20 | 21 | this.loaders.textureLoader = new THREE.TextureLoader(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/Experience/Utils/Resources.js: -------------------------------------------------------------------------------- 1 | import Loaders from "./Loaders.js"; 2 | import { EventEmitter } from "events"; 3 | 4 | export default class Resources extends EventEmitter { 5 | constructor(assets) { 6 | super(); 7 | 8 | this.items = {}; 9 | this.assets = assets; 10 | this.location = null; 11 | 12 | this.loaders = new Loaders().loaders; 13 | } 14 | 15 | determineLoad(location) { 16 | this.location = location; 17 | 18 | if (!this.items.hasOwnProperty(this.location)) { 19 | this.items[this.location] = {}; 20 | this.startLoading(); 21 | } else { 22 | this.emitReady(); 23 | } 24 | } 25 | 26 | emitReady() { 27 | this.emit("ready"); 28 | } 29 | 30 | startLoading() { 31 | this.loaded = 0; 32 | this.queue = this.assets[0][this.location].assets.length; 33 | 34 | for (const asset of this.assets[0][this.location].assets) { 35 | if (asset.type === "glbModel") { 36 | this.loaders.gltfLoader.load(asset.path, (file) => { 37 | this.singleAssetLoaded(asset, file); 38 | }); 39 | } else if (asset.type === "imageTexture") { 40 | this.loaders.textureLoader.load(asset.path, (file) => { 41 | this.singleAssetLoaded(asset, file); 42 | }); 43 | } else if (asset.type === "cubeTexture") { 44 | this.loaders.cubeTextureLoader.load(asset.path, (file) => { 45 | this.singleAssetLoaded(asset, file); 46 | }); 47 | } 48 | } 49 | } 50 | 51 | singleAssetLoaded(asset, file) { 52 | this.items[this.location][asset.name] = file; 53 | this.loaded++; 54 | 55 | if (this.loaded === this.queue) { 56 | this.emitReady(); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /app/Experience/Utils/Sizes.js: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from "events"; 2 | 3 | export default class Sizes extends EventEmitter { 4 | constructor() { 5 | super(); 6 | this.handleSizes(); 7 | window.addEventListener("resize", () => { 8 | this.handleSizes(); 9 | this.emit("resize"); 10 | }); 11 | } 12 | 13 | handleSizes() { 14 | this.width = window.innerWidth; 15 | this.height = window.innerHeight; 16 | this.aspect = this.width / this.height; 17 | this.pixelRatio = Math.min(window.devicePixelRatio, 2); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Experience/Utils/Time.js: -------------------------------------------------------------------------------- 1 | export default class Time { 2 | constructor() { 3 | this.start = Date.now(); 4 | this.current = this.start; 5 | this.elapsed = 0; 6 | this.delta = 16; 7 | } 8 | 9 | update() { 10 | const currentTime = Date.now(); 11 | this.delta = (currentTime - this.current) / 1000; 12 | this.current = currentTime; 13 | this.elapsed = this.current - this.start; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/Experience/Utils/assets.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | whiterun: { 4 | assets: [ 5 | { 6 | name: "land", 7 | type: "glbModel", 8 | path: "/models/land_w_collider.glb", 9 | }, 10 | { 11 | name: "items", 12 | type: "glbModel", 13 | path: "/models/land_items.glb", 14 | }, 15 | { 16 | name: "buildings", 17 | type: "glbModel", 18 | path: "/models/buildings.glb", 19 | }, 20 | { 21 | name: "interactions", 22 | type: "glbModel", 23 | path: "/models/outside_interactions.glb", 24 | }, 25 | { 26 | name: "walls", 27 | type: "glbModel", 28 | path: "/models/walls.glb", 29 | }, 30 | { 31 | name: "buildings_texture", 32 | type: "imageTexture", 33 | path: "/textures/buildings.webp", 34 | }, 35 | { 36 | name: "items_texture", 37 | type: "imageTexture", 38 | path: "/textures/items.webp", 39 | }, 40 | { 41 | name: "land_texture", 42 | type: "imageTexture", 43 | path: "/textures/land.webp", 44 | }, 45 | { 46 | name: "walls_texture", 47 | type: "imageTexture", 48 | path: "/textures/walls_baked.webp", 49 | }, 50 | { 51 | name: "skyBoxTexture", 52 | type: "cubeTexture", 53 | path: [ 54 | "/textures/skybox/px.webp", 55 | "/textures/skybox/nx.webp", 56 | "/textures/skybox/py.webp", 57 | "/textures/skybox/ny.webp", 58 | "/textures/skybox/pz.webp", 59 | "/textures/skybox/nz.webp", 60 | ], 61 | }, 62 | ], 63 | }, 64 | castleInterior: { 65 | assets: [ 66 | { 67 | name: "castle", 68 | type: "glbModel", 69 | path: "/models/interior_w_collider.glb", 70 | }, 71 | { 72 | name: "interactions", 73 | type: "glbModel", 74 | path: "/models/interior_interactions.glb", 75 | }, 76 | { 77 | name: "castle_texture", 78 | type: "imageTexture", 79 | path: "/textures/interior_baked.webp", 80 | }, 81 | ], 82 | }, 83 | }, 84 | ]; 85 | -------------------------------------------------------------------------------- /app/Experience/World/Interior/Components/Castle.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | import Experience from "../../../Experience.js"; 3 | 4 | export default class Castle { 5 | constructor() { 6 | this.experience = new Experience(); 7 | this.scene = this.experience.scene; 8 | this.resources = this.experience.resources; 9 | 10 | this.init(); 11 | this.setMaterials(); 12 | } 13 | 14 | init() { 15 | this.castle = this.resources.items.castleInterior.castle.scene; 16 | this.castle_texture = 17 | this.resources.items.castleInterior.castle_texture; 18 | } 19 | 20 | setMaterials() { 21 | this.castle_texture.flipY = false; 22 | this.castle_texture.encoding = THREE.sRGBEncoding; 23 | 24 | this.castle.children.find((child) => { 25 | child.material = new THREE.MeshBasicMaterial({ 26 | map: this.castle_texture, 27 | }); 28 | }); 29 | 30 | this.scene.add(this.castle); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Experience/World/Interior/Components/Interactions.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | import Experience from "../../../Experience.js"; 3 | 4 | export default class Interactions { 5 | constructor() { 6 | this.experience = new Experience(); 7 | this.scene = this.experience.scene; 8 | this.resources = this.experience.resources; 9 | 10 | this.init(); 11 | this.setMaterials(); 12 | } 13 | 14 | init() { 15 | this.interactions = 16 | this.resources.items.castleInterior.interactions.scene; 17 | // this.interactions_texture = 18 | // this.resources.items.whiterun.interactions_texture; 19 | } 20 | 21 | setMaterials() { 22 | // this.interactions_texture.flipY = false; 23 | // this.interactions_texture.encoding = THREE.sRGBEncoding; 24 | 25 | this.interactions.children.find((child) => { 26 | child.material = new THREE.MeshBasicMaterial({ 27 | // map: this.interactions_texture, 28 | color: 0xff0000, 29 | }); 30 | }); 31 | 32 | this.scene.add(this.interactions); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/Experience/World/Interior/Interior.js: -------------------------------------------------------------------------------- 1 | import Castle from "./Components/Castle.js"; 2 | import Interactions from "./Components/Interactions.js"; 3 | 4 | export default class WhiteRun { 5 | constructor() { 6 | this.castle = new Castle(); 7 | this.interactions = new Interactions(); 8 | } 9 | 10 | resize() {} 11 | 12 | update() {} 13 | } 14 | -------------------------------------------------------------------------------- /app/Experience/World/Player/Player.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | import Experience from "../../Experience.js"; 3 | 4 | import { EventEmitter } from "events"; 5 | 6 | import { Capsule } from "three/examples/jsm/math/Capsule"; 7 | 8 | export default class Player extends EventEmitter { 9 | constructor() { 10 | super(); 11 | this.experience = new Experience(); 12 | this.time = this.experience.time; 13 | this.camera = this.experience.camera; 14 | this.octree = this.experience.world.octree; 15 | 16 | this.initPlayer(); 17 | this.initControls(); 18 | 19 | this.addEventListeners(); 20 | } 21 | 22 | initPlayer() { 23 | this.player = {}; 24 | this.player.body = this.camera.perspectiveCamera; 25 | 26 | this.player.onFloor = false; 27 | this.player.gravity = 60; 28 | 29 | this.player.spawn = { 30 | position: new THREE.Vector3(), 31 | rotation: new THREE.Euler(), 32 | velocity: new THREE.Vector3(), 33 | }; 34 | 35 | this.player.raycaster = new THREE.Raycaster(); 36 | this.player.raycaster.far = 5; 37 | 38 | this.player.height = 1.7; 39 | this.player.position = new THREE.Vector3(); 40 | this.player.rotation = new THREE.Euler(); 41 | this.player.rotation.order = "YXZ"; 42 | 43 | this.player.velocity = new THREE.Vector3(); 44 | this.player.direction = new THREE.Vector3(); 45 | 46 | this.player.speedMultiplier = 1.5; 47 | 48 | this.player.collider = new Capsule( 49 | new THREE.Vector3(), 50 | new THREE.Vector3(), 51 | 0.35 52 | ); 53 | } 54 | 55 | initControls() { 56 | this.actions = {}; 57 | } 58 | 59 | onDesktopPointerMove = (e) => { 60 | if (document.pointerLockElement !== document.body) return; 61 | this.player.body.rotation.order = this.player.rotation.order; 62 | 63 | this.player.body.rotation.x -= e.movementY / 500; 64 | this.player.body.rotation.y -= e.movementX / 500; 65 | 66 | this.player.body.rotation.x = THREE.MathUtils.clamp( 67 | this.player.body.rotation.x, 68 | -Math.PI / 2, 69 | Math.PI / 2 70 | ); 71 | }; 72 | 73 | onKeyDown = (e) => { 74 | if (document.pointerLockElement !== document.body) return; 75 | 76 | if (e.code === "KeyW") { 77 | this.actions.forward = true; 78 | } 79 | if (e.code === "KeyS") { 80 | this.actions.backward = true; 81 | } 82 | if (e.code === "KeyA") { 83 | this.actions.left = true; 84 | } 85 | if (e.code === "KeyD") { 86 | this.actions.right = true; 87 | } 88 | 89 | if (e.code === "ShiftLeft") { 90 | this.actions.run = true; 91 | } 92 | 93 | if (e.code === "Space") { 94 | this.actions.jump = true; 95 | } 96 | }; 97 | 98 | onKeyUp = (e) => { 99 | if (document.pointerLockElement !== document.body) return; 100 | 101 | if (e.code === "KeyW") { 102 | this.actions.forward = false; 103 | } 104 | if (e.code === "KeyS") { 105 | this.actions.backward = false; 106 | } 107 | if (e.code === "KeyA") { 108 | this.actions.left = false; 109 | } 110 | if (e.code === "KeyD") { 111 | this.actions.right = false; 112 | } 113 | 114 | if (e.code === "ShiftLeft") { 115 | this.actions.run = false; 116 | } 117 | 118 | if (e.code === "Space") { 119 | this.actions.jump = false; 120 | } 121 | }; 122 | 123 | onPointerDown = (e) => { 124 | if (e.pointerType === "mouse") { 125 | document.body.requestPointerLock(); 126 | return; 127 | } 128 | }; 129 | 130 | playerCollisions() { 131 | const result = this.octree.capsuleIntersect(this.player.collider); 132 | this.player.onFloor = false; 133 | 134 | if (result) { 135 | this.player.onFloor = result.normal.y > 0; 136 | 137 | this.player.collider.translate( 138 | result.normal.multiplyScalar(result.depth) 139 | ); 140 | } 141 | } 142 | 143 | getForwardVector() { 144 | this.camera.perspectiveCamera.getWorldDirection(this.player.direction); 145 | this.player.direction.y = 0; 146 | this.player.direction.normalize(); 147 | 148 | return this.player.direction; 149 | } 150 | 151 | getSideVector() { 152 | this.camera.perspectiveCamera.getWorldDirection(this.player.direction); 153 | this.player.direction.y = 0; 154 | this.player.direction.normalize(); 155 | this.player.direction.cross(this.camera.perspectiveCamera.up); 156 | 157 | return this.player.direction; 158 | } 159 | 160 | addEventListeners() { 161 | document.addEventListener("keydown", this.onKeyDown); 162 | document.addEventListener("keyup", this.onKeyUp); 163 | document.addEventListener("pointermove", this.onDesktopPointerMove); 164 | document.addEventListener("pointerdown", this.onPointerDown); 165 | } 166 | 167 | resize() {} 168 | 169 | spawnPlayerOutOfBounds() { 170 | const spawnPos = new THREE.Vector3(12.64, 1.7 + 10, 64.0198); 171 | this.player.velocity = this.player.spawn.velocity; 172 | this.player.body.position.copy(spawnPos); 173 | 174 | this.player.collider.start.copy(spawnPos); 175 | this.player.collider.end.copy(spawnPos); 176 | 177 | this.player.collider.end.y += this.player.height; 178 | } 179 | 180 | updateMovement() { 181 | const speed = 182 | (this.player.onFloor ? 1.75 : 0.2) * 183 | this.player.gravity * 184 | this.player.speedMultiplier; 185 | 186 | //The amount of distance we travel between each frame 187 | let speedDelta = this.time.delta * speed; 188 | 189 | if (this.actions.run) { 190 | speedDelta *= 1.6; 191 | } 192 | if (this.actions.forward) { 193 | this.player.velocity.add( 194 | this.getForwardVector().multiplyScalar(speedDelta) 195 | ); 196 | } 197 | if (this.actions.backward) { 198 | this.player.velocity.add( 199 | this.getForwardVector().multiplyScalar(-speedDelta * 0.5) 200 | ); 201 | } 202 | if (this.actions.left) { 203 | this.player.velocity.add( 204 | this.getSideVector().multiplyScalar(-speedDelta * 0.75) 205 | ); 206 | } 207 | if (this.actions.right) { 208 | this.player.velocity.add( 209 | this.getSideVector().multiplyScalar(speedDelta * 0.75) 210 | ); 211 | } 212 | 213 | if (this.player.onFloor) { 214 | if (this.actions.jump) { 215 | this.player.velocity.y = 30; 216 | } 217 | } 218 | 219 | let damping = Math.exp(-15 * this.time.delta) - 1; 220 | 221 | if (!this.player.onFloor) { 222 | this.player.velocity.y -= this.player.gravity * this.time.delta; 223 | damping *= 0.1; 224 | } 225 | 226 | this.player.velocity.addScaledVector(this.player.velocity, damping); 227 | 228 | const deltaPosition = this.player.velocity 229 | .clone() 230 | .multiplyScalar(this.time.delta); 231 | 232 | this.player.collider.translate(deltaPosition); 233 | this.playerCollisions(); 234 | 235 | this.player.body.position.copy(this.player.collider.end); 236 | this.player.body.updateMatrixWorld(); 237 | 238 | if (this.player.body.position.y < -20) { 239 | this.spawnPlayerOutOfBounds(); 240 | } 241 | } 242 | 243 | setInteractionObjects(interactionObjects) { 244 | this.player.interactionObjects = interactionObjects; 245 | } 246 | 247 | getgetCameraLookAtDirectionalVector() { 248 | const direction = new THREE.Vector3(0, 0, -1); 249 | return direction.applyQuaternion( 250 | this.camera.perspectiveCamera.quaternion 251 | ); 252 | } 253 | 254 | updateRaycaster() { 255 | this.player.raycaster.ray.origin.copy( 256 | this.camera.perspectiveCamera.position 257 | ); 258 | 259 | this.player.raycaster.ray.direction.copy( 260 | this.getgetCameraLookAtDirectionalVector() 261 | ); 262 | 263 | const intersects = this.player.raycaster.intersectObjects( 264 | this.player.interactionObjects.children 265 | ); 266 | 267 | if (intersects.length === 0) { 268 | this.currentIntersectObject = ""; 269 | } else { 270 | this.currentIntersectObject = intersects[0].object.name; 271 | } 272 | 273 | if (this.currentIntersectObject !== this.previousIntersectObject) { 274 | this.previousIntersectObject = this.currentIntersectObject; 275 | this.emit("updateMessage", this.previousIntersectObject); 276 | } 277 | } 278 | 279 | update() { 280 | this.updateMovement(); 281 | this.updateRaycaster(); 282 | } 283 | } 284 | -------------------------------------------------------------------------------- /app/Experience/World/Whiterun/Components/Buildings.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | import Experience from "../../../Experience.js"; 3 | 4 | export default class Buildings { 5 | constructor() { 6 | this.experience = new Experience(); 7 | this.scene = this.experience.scene; 8 | this.resources = this.experience.resources; 9 | 10 | this.init(); 11 | this.setMaterials(); 12 | } 13 | 14 | init() { 15 | this.buildings = this.resources.items.whiterun.buildings.scene; 16 | this.buildings_texture = 17 | this.resources.items.whiterun.buildings_texture; 18 | } 19 | 20 | setMaterials() { 21 | this.buildings_texture.flipY = false; 22 | this.buildings_texture.encoding = THREE.sRGBEncoding; 23 | 24 | this.buildings.children.find((child) => { 25 | child.material = new THREE.MeshBasicMaterial({ 26 | map: this.buildings_texture, 27 | }); 28 | }); 29 | 30 | this.scene.add(this.buildings); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Experience/World/Whiterun/Components/Environment.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | import Experience from "../../../Experience.js"; 3 | 4 | export default class Environment { 5 | constructor() { 6 | this.experience = new Experience(); 7 | this.scene = this.experience.scene; 8 | this.resources = this.experience.resources; 9 | 10 | this.init(); 11 | } 12 | 13 | init() { 14 | this.skyboxTexture = this.resources.items.whiterun.skyBoxTexture; 15 | this.skyboxTexture.encoding = THREE.sRGBEncoding; 16 | this.scene.background = this.skyboxTexture; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/Experience/World/Whiterun/Components/Interactions.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | import Experience from "../../../Experience.js"; 3 | 4 | export default class Interactions { 5 | constructor() { 6 | this.experience = new Experience(); 7 | this.scene = this.experience.scene; 8 | this.resources = this.experience.resources; 9 | 10 | this.init(); 11 | this.setMaterials(); 12 | } 13 | 14 | init() { 15 | this.interactions = this.resources.items.whiterun.interactions.scene; 16 | // this.interactions_texture = 17 | // this.resources.items.whiterun.interactions_texture; 18 | } 19 | 20 | setMaterials() { 21 | // this.interactions_texture.flipY = false; 22 | // this.interactions_texture.encoding = THREE.sRGBEncoding; 23 | 24 | this.interactions.children.find((child) => { 25 | child.material = new THREE.MeshBasicMaterial({ 26 | // map: this.interactions_texture, 27 | color: 0xff0000, 28 | }); 29 | }); 30 | 31 | this.scene.add(this.interactions); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/Experience/World/Whiterun/Components/Items.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | import Experience from "../../../Experience.js"; 3 | 4 | export default class Items { 5 | constructor() { 6 | this.experience = new Experience(); 7 | this.scene = this.experience.scene; 8 | this.resources = this.experience.resources; 9 | 10 | this.init(); 11 | this.setMaterials(); 12 | } 13 | 14 | init() { 15 | this.items = this.resources.items.whiterun.items.scene; 16 | this.items_texture = this.resources.items.whiterun.items_texture; 17 | } 18 | 19 | setMaterials() { 20 | this.items_texture.flipY = false; 21 | this.items_texture.encoding = THREE.sRGBEncoding; 22 | 23 | this.items.children.find((child) => { 24 | child.material = new THREE.MeshBasicMaterial({ 25 | map: this.items_texture, 26 | }); 27 | }); 28 | 29 | this.scene.add(this.items); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Experience/World/Whiterun/Components/Landscape.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | import Experience from "../../../Experience.js"; 3 | 4 | import { OctreeHelper } from "three/examples/jsm/helpers/OctreeHelper.js"; 5 | 6 | export default class Landscape { 7 | constructor() { 8 | this.experience = new Experience(); 9 | this.scene = this.experience.scene; 10 | this.resources = this.experience.resources; 11 | this.octree = this.experience.world.octree; 12 | 13 | this.init(); 14 | this.setMaterials(); 15 | this.setLandscapeCollider(); 16 | } 17 | 18 | init() { 19 | this.landscape = this.resources.items.whiterun.land.scene; 20 | this.land_texture = this.resources.items.whiterun.land_texture; 21 | } 22 | 23 | setMaterials() { 24 | this.land_texture.flipY = false; 25 | this.land_texture.encoding = THREE.sRGBEncoding; 26 | 27 | this.landscape.children.find((child) => { 28 | child.material = new THREE.MeshBasicMaterial({ 29 | map: this.land_texture, 30 | }); 31 | }); 32 | 33 | this.scene.add(this.landscape); 34 | } 35 | 36 | setLandscapeCollider() { 37 | const collider = this.landscape.getObjectByName("collider"); 38 | this.octree.fromGraphNode(collider); 39 | collider.removeFromParent(); 40 | collider.geometry.dispose(); 41 | collider.material.dispose(); 42 | 43 | // const helper = new OctreeHelper(this.octree); 44 | // helper.visible = true; 45 | // this.scene.add(helper); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/Experience/World/Whiterun/Components/Walls.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | import Experience from "../../../Experience.js"; 3 | 4 | export default class Walls { 5 | constructor() { 6 | this.experience = new Experience(); 7 | this.scene = this.experience.scene; 8 | this.resources = this.experience.resources; 9 | 10 | this.init(); 11 | this.setMaterials(); 12 | } 13 | 14 | init() { 15 | this.walls = this.resources.items.whiterun.walls.scene; 16 | this.walls_texture = this.resources.items.whiterun.walls_texture; 17 | } 18 | 19 | setMaterials() { 20 | this.walls_texture.flipY = false; 21 | this.walls_texture.encoding = THREE.sRGBEncoding; 22 | 23 | this.walls.children.find((child) => { 24 | child.material = new THREE.MeshBasicMaterial({ 25 | map: this.walls_texture, 26 | }); 27 | }); 28 | 29 | this.scene.add(this.walls); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Experience/World/Whiterun/Whiterun.js: -------------------------------------------------------------------------------- 1 | import Landscape from "./Components/Landscape.js"; 2 | import Items from "./Components/Items.js"; 3 | import Interactions from "./Components/Interactions.js"; 4 | import Buildings from "./Components/Buildings.js"; 5 | import Walls from "./Components/Walls.js"; 6 | import Environment from "./Components/Environment.js"; 7 | 8 | export default class WhiteRun { 9 | constructor() { 10 | this.items = new Items(); 11 | this.landscape = new Landscape(); 12 | this.interactions = new Interactions(); 13 | this.buildings = new Buildings(); 14 | this.walls = new Walls(); 15 | this.environment = new Environment(); 16 | } 17 | 18 | resize() {} 19 | 20 | update() {} 21 | } 22 | -------------------------------------------------------------------------------- /app/Experience/World/World.js: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | import { EventEmitter } from "events"; 3 | import Experience from "../Experience.js"; 4 | 5 | import { Octree } from "three/examples/jsm/math/Octree"; 6 | 7 | import Player from "./Player/Player.js"; 8 | 9 | import Whiterun from "./Whiterun/Whiterun.js"; 10 | import Interior from "./Interior/Interior.js"; 11 | 12 | export default class World extends EventEmitter { 13 | constructor() { 14 | super(); 15 | this.experience = new Experience(); 16 | this.resources = this.experience.resources; 17 | 18 | this.octree = new Octree(); 19 | 20 | this.localStorage = this.experience.localStorage; 21 | this.state = this.localStorage.state; 22 | 23 | this.resources.determineLoad(this.state.location); 24 | 25 | this.player = null; 26 | 27 | this.resources.on("ready", () => { 28 | if (this.player === null) { 29 | this.player = new Player(); 30 | this.setPlayerEvents(); 31 | } 32 | this.setWorld(); 33 | }); 34 | } 35 | 36 | setWorld() { 37 | this.whiterun = new Whiterun(); 38 | this.player.setInteractionObjects( 39 | this.whiterun.interactions.interactions 40 | ); 41 | 42 | // this.interior = new Interior(); 43 | } 44 | 45 | setPlayerEvents() { 46 | // HERE------------------------------ 47 | this.player.on("updateMessage", (objectName) => { 48 | this.emit("updateMessage", objectName); 49 | }); 50 | 51 | this.player.on("interact", (objectName) => { 52 | this.emit("interact", objectName); 53 | }); 54 | } 55 | 56 | update() { 57 | if (this.player) this.player.update(); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /app/Interface/Components/Message.js: -------------------------------------------------------------------------------- 1 | export default class Message { 2 | constructor(elements, key) { 3 | this.elements = elements; 4 | this.key = key; 5 | console.log(this.elements); 6 | } 7 | 8 | setCrosshair(message) { 9 | if (message === "" || message === undefined || message === null) { 10 | this.elements.crosshair.classList.add("hidden"); 11 | } else { 12 | this.elements.crosshair.classList.remove("hidden"); 13 | } 14 | } 15 | 16 | setMessage(message) { 17 | const newMsg = message.toLowerCase(); 18 | 19 | if (newMsg.includes("door")) { 20 | this.elements.message.innerHTML = `Go through door`; 21 | } else if (newMsg.includes("sign")) { 22 | this.elements.message.innerHTML = `Read`; 23 | } else if (newMsg.includes("teleporter")) { 24 | this.elements.message.innerHTML = `Travel`; 25 | } else { 26 | this.elements.message.innerHTML = ""; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/Interface/Interface.js: -------------------------------------------------------------------------------- 1 | import Message from "./Components/Message.js"; 2 | import Elements from "./Utils/Elements.js"; 3 | import key from "./Utils/key.js"; 4 | 5 | export default class Interface { 6 | constructor() { 7 | this.key = key; 8 | this.elements = new Elements().elements; 9 | this.message = new Message(this.elements, key); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/Interface/Utils/Elements.js: -------------------------------------------------------------------------------- 1 | export default class Elements { 2 | constructor() { 3 | this.domSelectors = { 4 | crosshair: ".crosshair", 5 | message: ".message", 6 | }; 7 | 8 | this.init(); 9 | } 10 | 11 | init() { 12 | this.elements = {}; 13 | 14 | Object.entries(this.domSelectors).forEach((selector) => { 15 | const key = selector[0]; 16 | const data = selector[1]; 17 | this.elements[key] = document.querySelector(data); 18 | }); 19 | } 20 | 21 | getElements() { 22 | return this.elements; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Interface/Utils/key.js: -------------------------------------------------------------------------------- 1 | export default { 2 | type: { 3 | teleporter: "teleporter", 4 | sign: "sign", 5 | }, 6 | 7 | locations: { 8 | whiterun: "whiterun", 9 | inside: "inside", 10 | }, 11 | 12 | messageContent: { 13 | door: "What's up doctor", 14 | sign: "read me bro", 15 | whiterunSign: ` 16 |
Yo
17 | `, 18 | }, 19 | }; 20 | -------------------------------------------------------------------------------- /app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 | 11 |
12 | 13 |
14 | 15 | 16 | 17 |
18 | 19 | 20 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /app/main.css: -------------------------------------------------------------------------------- 1 | @import './styles/experience.css'; 2 | @import './styles/interface.css'; 3 | 4 | * { 5 | margin: 0; 6 | padding: 0; 7 | box-sizing: border-box; 8 | } 9 | 10 | html, 11 | body{ 12 | overflow: hidden; 13 | } 14 | 15 | .hidden{ 16 | display: none; 17 | } 18 | 19 | -------------------------------------------------------------------------------- /app/main.js: -------------------------------------------------------------------------------- 1 | import "./main.css"; 2 | import Experience from "./Experience/Experience.js"; 3 | import Interface from "./Interface/Interface.js"; 4 | 5 | class Main { 6 | constructor() { 7 | this.createInterface(); 8 | this.createExperience(); 9 | } 10 | 11 | createInterface() { 12 | this.interface = new Interface(); 13 | } 14 | 15 | createExperience() { 16 | this.experience = new Experience( 17 | document.querySelector("canvas.experience-canvas") 18 | ); 19 | 20 | this.experience.world.on("updateMessage", (objectName) => { 21 | this.interface.message.setCrosshair(objectName); 22 | this.interface.message.setMessage(objectName); 23 | }); 24 | } 25 | } 26 | 27 | new Main(); 28 | -------------------------------------------------------------------------------- /app/styles/experience.css: -------------------------------------------------------------------------------- 1 | .experience-wrapper{ 2 | position: fixed; 3 | height: 100vh; 4 | width: 100vw; 5 | z-index: -1; 6 | } 7 | 8 | .experience{ 9 | position: fixed; 10 | height: 100%; 11 | width: 100%; 12 | } -------------------------------------------------------------------------------- /app/styles/interface.css: -------------------------------------------------------------------------------- 1 | .crosshair{ 2 | position: absolute; 3 | top: 50%; 4 | left: 50%; 5 | transform: translate(-50%,-50%); 6 | z-index: 9999; 7 | pointer-events: none; 8 | display: flex; 9 | flex-direction: column; 10 | justify-content: center; 11 | align-items: center; 12 | } 13 | 14 | .middle{ 15 | display: flex; 16 | flex-direction: row; 17 | justify-content: center; 18 | align-items: center; 19 | gap: 1rem; 20 | } 21 | 22 | 23 | .top{ 24 | animation: topBounce 0.5s alternate infinite; 25 | } 26 | 27 | .bottom{ 28 | animation: bottomBounce 0.5s alternate infinite; 29 | } 30 | 31 | .left{ 32 | animation: leftBounce 0.5s alternate infinite; 33 | } 34 | 35 | .right{ 36 | animation: rightBounce 0.5s alternate infinite; 37 | } 38 | 39 | @keyframes topBounce { 40 | 0%{ 41 | transform: translateY(0); 42 | } 43 | 44 | 100%{ 45 | transform: translateY(3px); 46 | } 47 | } 48 | 49 | @keyframes bottomBounce { 50 | 0%{ 51 | transform: translateY(0); 52 | } 53 | 54 | 100%{ 55 | transform: translateY(-3px); 56 | } 57 | } 58 | 59 | @keyframes leftBounce { 60 | 0%{ 61 | transform: translateX(0); 62 | } 63 | 64 | 100%{ 65 | transform: translateX(3px); 66 | } 67 | } 68 | 69 | @keyframes rightBounce { 70 | 0%{ 71 | transform: translateX(0); 72 | } 73 | 74 | 100%{ 75 | transform: translateX(-3px); 76 | } 77 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "immersive-world", 3 | "version": "0.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "immersive-world", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "events": "^3.3.0", 12 | "three": "^0.145.0", 13 | "vite-plugin-glsl": "^0.5.1" 14 | }, 15 | "devDependencies": { 16 | "vite": "^3.1.0" 17 | } 18 | }, 19 | "node_modules/@esbuild/android-arm": { 20 | "version": "0.15.10", 21 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", 22 | "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", 23 | "cpu": [ 24 | "arm" 25 | ], 26 | "optional": true, 27 | "os": [ 28 | "android" 29 | ], 30 | "engines": { 31 | "node": ">=12" 32 | } 33 | }, 34 | "node_modules/@esbuild/linux-loong64": { 35 | "version": "0.15.10", 36 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", 37 | "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", 38 | "cpu": [ 39 | "loong64" 40 | ], 41 | "optional": true, 42 | "os": [ 43 | "linux" 44 | ], 45 | "engines": { 46 | "node": ">=12" 47 | } 48 | }, 49 | "node_modules/@rollup/pluginutils": { 50 | "version": "4.2.1", 51 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", 52 | "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", 53 | "dependencies": { 54 | "estree-walker": "^2.0.1", 55 | "picomatch": "^2.2.2" 56 | }, 57 | "engines": { 58 | "node": ">= 8.0.0" 59 | } 60 | }, 61 | "node_modules/esbuild": { 62 | "version": "0.15.10", 63 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", 64 | "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", 65 | "hasInstallScript": true, 66 | "bin": { 67 | "esbuild": "bin/esbuild" 68 | }, 69 | "engines": { 70 | "node": ">=12" 71 | }, 72 | "optionalDependencies": { 73 | "@esbuild/android-arm": "0.15.10", 74 | "@esbuild/linux-loong64": "0.15.10", 75 | "esbuild-android-64": "0.15.10", 76 | "esbuild-android-arm64": "0.15.10", 77 | "esbuild-darwin-64": "0.15.10", 78 | "esbuild-darwin-arm64": "0.15.10", 79 | "esbuild-freebsd-64": "0.15.10", 80 | "esbuild-freebsd-arm64": "0.15.10", 81 | "esbuild-linux-32": "0.15.10", 82 | "esbuild-linux-64": "0.15.10", 83 | "esbuild-linux-arm": "0.15.10", 84 | "esbuild-linux-arm64": "0.15.10", 85 | "esbuild-linux-mips64le": "0.15.10", 86 | "esbuild-linux-ppc64le": "0.15.10", 87 | "esbuild-linux-riscv64": "0.15.10", 88 | "esbuild-linux-s390x": "0.15.10", 89 | "esbuild-netbsd-64": "0.15.10", 90 | "esbuild-openbsd-64": "0.15.10", 91 | "esbuild-sunos-64": "0.15.10", 92 | "esbuild-windows-32": "0.15.10", 93 | "esbuild-windows-64": "0.15.10", 94 | "esbuild-windows-arm64": "0.15.10" 95 | } 96 | }, 97 | "node_modules/esbuild-android-64": { 98 | "version": "0.15.10", 99 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", 100 | "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", 101 | "cpu": [ 102 | "x64" 103 | ], 104 | "optional": true, 105 | "os": [ 106 | "android" 107 | ], 108 | "engines": { 109 | "node": ">=12" 110 | } 111 | }, 112 | "node_modules/esbuild-android-arm64": { 113 | "version": "0.15.10", 114 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", 115 | "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", 116 | "cpu": [ 117 | "arm64" 118 | ], 119 | "optional": true, 120 | "os": [ 121 | "android" 122 | ], 123 | "engines": { 124 | "node": ">=12" 125 | } 126 | }, 127 | "node_modules/esbuild-darwin-64": { 128 | "version": "0.15.10", 129 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", 130 | "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", 131 | "cpu": [ 132 | "x64" 133 | ], 134 | "optional": true, 135 | "os": [ 136 | "darwin" 137 | ], 138 | "engines": { 139 | "node": ">=12" 140 | } 141 | }, 142 | "node_modules/esbuild-darwin-arm64": { 143 | "version": "0.15.10", 144 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", 145 | "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", 146 | "cpu": [ 147 | "arm64" 148 | ], 149 | "optional": true, 150 | "os": [ 151 | "darwin" 152 | ], 153 | "engines": { 154 | "node": ">=12" 155 | } 156 | }, 157 | "node_modules/esbuild-freebsd-64": { 158 | "version": "0.15.10", 159 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", 160 | "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", 161 | "cpu": [ 162 | "x64" 163 | ], 164 | "optional": true, 165 | "os": [ 166 | "freebsd" 167 | ], 168 | "engines": { 169 | "node": ">=12" 170 | } 171 | }, 172 | "node_modules/esbuild-freebsd-arm64": { 173 | "version": "0.15.10", 174 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", 175 | "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", 176 | "cpu": [ 177 | "arm64" 178 | ], 179 | "optional": true, 180 | "os": [ 181 | "freebsd" 182 | ], 183 | "engines": { 184 | "node": ">=12" 185 | } 186 | }, 187 | "node_modules/esbuild-linux-32": { 188 | "version": "0.15.10", 189 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", 190 | "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", 191 | "cpu": [ 192 | "ia32" 193 | ], 194 | "optional": true, 195 | "os": [ 196 | "linux" 197 | ], 198 | "engines": { 199 | "node": ">=12" 200 | } 201 | }, 202 | "node_modules/esbuild-linux-64": { 203 | "version": "0.15.10", 204 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", 205 | "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", 206 | "cpu": [ 207 | "x64" 208 | ], 209 | "optional": true, 210 | "os": [ 211 | "linux" 212 | ], 213 | "engines": { 214 | "node": ">=12" 215 | } 216 | }, 217 | "node_modules/esbuild-linux-arm": { 218 | "version": "0.15.10", 219 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", 220 | "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", 221 | "cpu": [ 222 | "arm" 223 | ], 224 | "optional": true, 225 | "os": [ 226 | "linux" 227 | ], 228 | "engines": { 229 | "node": ">=12" 230 | } 231 | }, 232 | "node_modules/esbuild-linux-arm64": { 233 | "version": "0.15.10", 234 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", 235 | "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", 236 | "cpu": [ 237 | "arm64" 238 | ], 239 | "optional": true, 240 | "os": [ 241 | "linux" 242 | ], 243 | "engines": { 244 | "node": ">=12" 245 | } 246 | }, 247 | "node_modules/esbuild-linux-mips64le": { 248 | "version": "0.15.10", 249 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", 250 | "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", 251 | "cpu": [ 252 | "mips64el" 253 | ], 254 | "optional": true, 255 | "os": [ 256 | "linux" 257 | ], 258 | "engines": { 259 | "node": ">=12" 260 | } 261 | }, 262 | "node_modules/esbuild-linux-ppc64le": { 263 | "version": "0.15.10", 264 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", 265 | "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", 266 | "cpu": [ 267 | "ppc64" 268 | ], 269 | "optional": true, 270 | "os": [ 271 | "linux" 272 | ], 273 | "engines": { 274 | "node": ">=12" 275 | } 276 | }, 277 | "node_modules/esbuild-linux-riscv64": { 278 | "version": "0.15.10", 279 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", 280 | "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", 281 | "cpu": [ 282 | "riscv64" 283 | ], 284 | "optional": true, 285 | "os": [ 286 | "linux" 287 | ], 288 | "engines": { 289 | "node": ">=12" 290 | } 291 | }, 292 | "node_modules/esbuild-linux-s390x": { 293 | "version": "0.15.10", 294 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", 295 | "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", 296 | "cpu": [ 297 | "s390x" 298 | ], 299 | "optional": true, 300 | "os": [ 301 | "linux" 302 | ], 303 | "engines": { 304 | "node": ">=12" 305 | } 306 | }, 307 | "node_modules/esbuild-netbsd-64": { 308 | "version": "0.15.10", 309 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", 310 | "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", 311 | "cpu": [ 312 | "x64" 313 | ], 314 | "optional": true, 315 | "os": [ 316 | "netbsd" 317 | ], 318 | "engines": { 319 | "node": ">=12" 320 | } 321 | }, 322 | "node_modules/esbuild-openbsd-64": { 323 | "version": "0.15.10", 324 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", 325 | "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", 326 | "cpu": [ 327 | "x64" 328 | ], 329 | "optional": true, 330 | "os": [ 331 | "openbsd" 332 | ], 333 | "engines": { 334 | "node": ">=12" 335 | } 336 | }, 337 | "node_modules/esbuild-sunos-64": { 338 | "version": "0.15.10", 339 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", 340 | "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", 341 | "cpu": [ 342 | "x64" 343 | ], 344 | "optional": true, 345 | "os": [ 346 | "sunos" 347 | ], 348 | "engines": { 349 | "node": ">=12" 350 | } 351 | }, 352 | "node_modules/esbuild-windows-32": { 353 | "version": "0.15.10", 354 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", 355 | "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", 356 | "cpu": [ 357 | "ia32" 358 | ], 359 | "optional": true, 360 | "os": [ 361 | "win32" 362 | ], 363 | "engines": { 364 | "node": ">=12" 365 | } 366 | }, 367 | "node_modules/esbuild-windows-64": { 368 | "version": "0.15.10", 369 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", 370 | "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", 371 | "cpu": [ 372 | "x64" 373 | ], 374 | "optional": true, 375 | "os": [ 376 | "win32" 377 | ], 378 | "engines": { 379 | "node": ">=12" 380 | } 381 | }, 382 | "node_modules/esbuild-windows-arm64": { 383 | "version": "0.15.10", 384 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", 385 | "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", 386 | "cpu": [ 387 | "arm64" 388 | ], 389 | "optional": true, 390 | "os": [ 391 | "win32" 392 | ], 393 | "engines": { 394 | "node": ">=12" 395 | } 396 | }, 397 | "node_modules/estree-walker": { 398 | "version": "2.0.2", 399 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 400 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 401 | }, 402 | "node_modules/events": { 403 | "version": "3.3.0", 404 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 405 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 406 | "engines": { 407 | "node": ">=0.8.x" 408 | } 409 | }, 410 | "node_modules/fsevents": { 411 | "version": "2.3.2", 412 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 413 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 414 | "hasInstallScript": true, 415 | "optional": true, 416 | "os": [ 417 | "darwin" 418 | ], 419 | "engines": { 420 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 421 | } 422 | }, 423 | "node_modules/function-bind": { 424 | "version": "1.1.1", 425 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 426 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 427 | }, 428 | "node_modules/has": { 429 | "version": "1.0.3", 430 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 431 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 432 | "dependencies": { 433 | "function-bind": "^1.1.1" 434 | }, 435 | "engines": { 436 | "node": ">= 0.4.0" 437 | } 438 | }, 439 | "node_modules/is-core-module": { 440 | "version": "2.10.0", 441 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", 442 | "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", 443 | "dependencies": { 444 | "has": "^1.0.3" 445 | }, 446 | "funding": { 447 | "url": "https://github.com/sponsors/ljharb" 448 | } 449 | }, 450 | "node_modules/nanoid": { 451 | "version": "3.3.4", 452 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 453 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 454 | "bin": { 455 | "nanoid": "bin/nanoid.cjs" 456 | }, 457 | "engines": { 458 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 459 | } 460 | }, 461 | "node_modules/path-parse": { 462 | "version": "1.0.7", 463 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 464 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 465 | }, 466 | "node_modules/picocolors": { 467 | "version": "1.0.0", 468 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 469 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 470 | }, 471 | "node_modules/picomatch": { 472 | "version": "2.3.1", 473 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 474 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 475 | "engines": { 476 | "node": ">=8.6" 477 | }, 478 | "funding": { 479 | "url": "https://github.com/sponsors/jonschlinkert" 480 | } 481 | }, 482 | "node_modules/postcss": { 483 | "version": "8.4.18", 484 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", 485 | "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", 486 | "funding": [ 487 | { 488 | "type": "opencollective", 489 | "url": "https://opencollective.com/postcss/" 490 | }, 491 | { 492 | "type": "tidelift", 493 | "url": "https://tidelift.com/funding/github/npm/postcss" 494 | } 495 | ], 496 | "dependencies": { 497 | "nanoid": "^3.3.4", 498 | "picocolors": "^1.0.0", 499 | "source-map-js": "^1.0.2" 500 | }, 501 | "engines": { 502 | "node": "^10 || ^12 || >=14" 503 | } 504 | }, 505 | "node_modules/resolve": { 506 | "version": "1.22.1", 507 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 508 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 509 | "dependencies": { 510 | "is-core-module": "^2.9.0", 511 | "path-parse": "^1.0.7", 512 | "supports-preserve-symlinks-flag": "^1.0.0" 513 | }, 514 | "bin": { 515 | "resolve": "bin/resolve" 516 | }, 517 | "funding": { 518 | "url": "https://github.com/sponsors/ljharb" 519 | } 520 | }, 521 | "node_modules/rollup": { 522 | "version": "2.78.1", 523 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", 524 | "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", 525 | "bin": { 526 | "rollup": "dist/bin/rollup" 527 | }, 528 | "engines": { 529 | "node": ">=10.0.0" 530 | }, 531 | "optionalDependencies": { 532 | "fsevents": "~2.3.2" 533 | } 534 | }, 535 | "node_modules/source-map-js": { 536 | "version": "1.0.2", 537 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 538 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 539 | "engines": { 540 | "node": ">=0.10.0" 541 | } 542 | }, 543 | "node_modules/supports-preserve-symlinks-flag": { 544 | "version": "1.0.0", 545 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 546 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 547 | "engines": { 548 | "node": ">= 0.4" 549 | }, 550 | "funding": { 551 | "url": "https://github.com/sponsors/ljharb" 552 | } 553 | }, 554 | "node_modules/three": { 555 | "version": "0.145.0", 556 | "resolved": "https://registry.npmjs.org/three/-/three-0.145.0.tgz", 557 | "integrity": "sha512-EKoHQEtEJ4CB6b2BGMBgLZrfwLjXcSUfoI/MiIXUuRpeYsfK5aPWbYhdtIVWOH+x6X0TouldHKHBuc/LAiFzAw==" 558 | }, 559 | "node_modules/vite": { 560 | "version": "3.1.7", 561 | "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.7.tgz", 562 | "integrity": "sha512-5vCAmU4S8lyVdFCInu9M54f/g8qbOMakVw5xJ4pjoaDy5wgy9sLLZkGdSLN52dlsBqh0tBqxjaqqa8LgPqwRAA==", 563 | "dependencies": { 564 | "esbuild": "^0.15.9", 565 | "postcss": "^8.4.16", 566 | "resolve": "^1.22.1", 567 | "rollup": "~2.78.0" 568 | }, 569 | "bin": { 570 | "vite": "bin/vite.js" 571 | }, 572 | "engines": { 573 | "node": "^14.18.0 || >=16.0.0" 574 | }, 575 | "optionalDependencies": { 576 | "fsevents": "~2.3.2" 577 | }, 578 | "peerDependencies": { 579 | "less": "*", 580 | "sass": "*", 581 | "stylus": "*", 582 | "terser": "^5.4.0" 583 | }, 584 | "peerDependenciesMeta": { 585 | "less": { 586 | "optional": true 587 | }, 588 | "sass": { 589 | "optional": true 590 | }, 591 | "stylus": { 592 | "optional": true 593 | }, 594 | "terser": { 595 | "optional": true 596 | } 597 | } 598 | }, 599 | "node_modules/vite-plugin-glsl": { 600 | "version": "0.5.1", 601 | "resolved": "https://registry.npmjs.org/vite-plugin-glsl/-/vite-plugin-glsl-0.5.1.tgz", 602 | "integrity": "sha512-r4zKN8dlOVIB30whl4rlGgiUTnDk4DHDpDMfUwAERkkoJVf7yXqiNCcGCe4SRgi/GLekAyP4ShW4dSyfycvwfA==", 603 | "dependencies": { 604 | "@rollup/pluginutils": "^4.2.1" 605 | }, 606 | "engines": { 607 | "node": ">= 14.18.0", 608 | "npm": ">= 6.14.17" 609 | }, 610 | "peerDependencies": { 611 | "vite": "^3.0.0" 612 | } 613 | } 614 | }, 615 | "dependencies": { 616 | "@esbuild/android-arm": { 617 | "version": "0.15.10", 618 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", 619 | "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", 620 | "optional": true 621 | }, 622 | "@esbuild/linux-loong64": { 623 | "version": "0.15.10", 624 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", 625 | "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", 626 | "optional": true 627 | }, 628 | "@rollup/pluginutils": { 629 | "version": "4.2.1", 630 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", 631 | "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", 632 | "requires": { 633 | "estree-walker": "^2.0.1", 634 | "picomatch": "^2.2.2" 635 | } 636 | }, 637 | "esbuild": { 638 | "version": "0.15.10", 639 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", 640 | "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", 641 | "requires": { 642 | "@esbuild/android-arm": "0.15.10", 643 | "@esbuild/linux-loong64": "0.15.10", 644 | "esbuild-android-64": "0.15.10", 645 | "esbuild-android-arm64": "0.15.10", 646 | "esbuild-darwin-64": "0.15.10", 647 | "esbuild-darwin-arm64": "0.15.10", 648 | "esbuild-freebsd-64": "0.15.10", 649 | "esbuild-freebsd-arm64": "0.15.10", 650 | "esbuild-linux-32": "0.15.10", 651 | "esbuild-linux-64": "0.15.10", 652 | "esbuild-linux-arm": "0.15.10", 653 | "esbuild-linux-arm64": "0.15.10", 654 | "esbuild-linux-mips64le": "0.15.10", 655 | "esbuild-linux-ppc64le": "0.15.10", 656 | "esbuild-linux-riscv64": "0.15.10", 657 | "esbuild-linux-s390x": "0.15.10", 658 | "esbuild-netbsd-64": "0.15.10", 659 | "esbuild-openbsd-64": "0.15.10", 660 | "esbuild-sunos-64": "0.15.10", 661 | "esbuild-windows-32": "0.15.10", 662 | "esbuild-windows-64": "0.15.10", 663 | "esbuild-windows-arm64": "0.15.10" 664 | } 665 | }, 666 | "esbuild-android-64": { 667 | "version": "0.15.10", 668 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", 669 | "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", 670 | "optional": true 671 | }, 672 | "esbuild-android-arm64": { 673 | "version": "0.15.10", 674 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", 675 | "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", 676 | "optional": true 677 | }, 678 | "esbuild-darwin-64": { 679 | "version": "0.15.10", 680 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", 681 | "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", 682 | "optional": true 683 | }, 684 | "esbuild-darwin-arm64": { 685 | "version": "0.15.10", 686 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", 687 | "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", 688 | "optional": true 689 | }, 690 | "esbuild-freebsd-64": { 691 | "version": "0.15.10", 692 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", 693 | "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", 694 | "optional": true 695 | }, 696 | "esbuild-freebsd-arm64": { 697 | "version": "0.15.10", 698 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", 699 | "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", 700 | "optional": true 701 | }, 702 | "esbuild-linux-32": { 703 | "version": "0.15.10", 704 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", 705 | "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", 706 | "optional": true 707 | }, 708 | "esbuild-linux-64": { 709 | "version": "0.15.10", 710 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", 711 | "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", 712 | "optional": true 713 | }, 714 | "esbuild-linux-arm": { 715 | "version": "0.15.10", 716 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", 717 | "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", 718 | "optional": true 719 | }, 720 | "esbuild-linux-arm64": { 721 | "version": "0.15.10", 722 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", 723 | "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", 724 | "optional": true 725 | }, 726 | "esbuild-linux-mips64le": { 727 | "version": "0.15.10", 728 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", 729 | "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", 730 | "optional": true 731 | }, 732 | "esbuild-linux-ppc64le": { 733 | "version": "0.15.10", 734 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", 735 | "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", 736 | "optional": true 737 | }, 738 | "esbuild-linux-riscv64": { 739 | "version": "0.15.10", 740 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", 741 | "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", 742 | "optional": true 743 | }, 744 | "esbuild-linux-s390x": { 745 | "version": "0.15.10", 746 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", 747 | "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", 748 | "optional": true 749 | }, 750 | "esbuild-netbsd-64": { 751 | "version": "0.15.10", 752 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", 753 | "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", 754 | "optional": true 755 | }, 756 | "esbuild-openbsd-64": { 757 | "version": "0.15.10", 758 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", 759 | "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", 760 | "optional": true 761 | }, 762 | "esbuild-sunos-64": { 763 | "version": "0.15.10", 764 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", 765 | "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", 766 | "optional": true 767 | }, 768 | "esbuild-windows-32": { 769 | "version": "0.15.10", 770 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", 771 | "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", 772 | "optional": true 773 | }, 774 | "esbuild-windows-64": { 775 | "version": "0.15.10", 776 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", 777 | "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", 778 | "optional": true 779 | }, 780 | "esbuild-windows-arm64": { 781 | "version": "0.15.10", 782 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", 783 | "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", 784 | "optional": true 785 | }, 786 | "estree-walker": { 787 | "version": "2.0.2", 788 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 789 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 790 | }, 791 | "events": { 792 | "version": "3.3.0", 793 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 794 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" 795 | }, 796 | "fsevents": { 797 | "version": "2.3.2", 798 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 799 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 800 | "optional": true 801 | }, 802 | "function-bind": { 803 | "version": "1.1.1", 804 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 805 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 806 | }, 807 | "has": { 808 | "version": "1.0.3", 809 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 810 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 811 | "requires": { 812 | "function-bind": "^1.1.1" 813 | } 814 | }, 815 | "is-core-module": { 816 | "version": "2.10.0", 817 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", 818 | "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", 819 | "requires": { 820 | "has": "^1.0.3" 821 | } 822 | }, 823 | "nanoid": { 824 | "version": "3.3.4", 825 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 826 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" 827 | }, 828 | "path-parse": { 829 | "version": "1.0.7", 830 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 831 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 832 | }, 833 | "picocolors": { 834 | "version": "1.0.0", 835 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 836 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 837 | }, 838 | "picomatch": { 839 | "version": "2.3.1", 840 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 841 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 842 | }, 843 | "postcss": { 844 | "version": "8.4.18", 845 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", 846 | "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", 847 | "requires": { 848 | "nanoid": "^3.3.4", 849 | "picocolors": "^1.0.0", 850 | "source-map-js": "^1.0.2" 851 | } 852 | }, 853 | "resolve": { 854 | "version": "1.22.1", 855 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 856 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 857 | "requires": { 858 | "is-core-module": "^2.9.0", 859 | "path-parse": "^1.0.7", 860 | "supports-preserve-symlinks-flag": "^1.0.0" 861 | } 862 | }, 863 | "rollup": { 864 | "version": "2.78.1", 865 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", 866 | "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", 867 | "requires": { 868 | "fsevents": "~2.3.2" 869 | } 870 | }, 871 | "source-map-js": { 872 | "version": "1.0.2", 873 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 874 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 875 | }, 876 | "supports-preserve-symlinks-flag": { 877 | "version": "1.0.0", 878 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 879 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" 880 | }, 881 | "three": { 882 | "version": "0.145.0", 883 | "resolved": "https://registry.npmjs.org/three/-/three-0.145.0.tgz", 884 | "integrity": "sha512-EKoHQEtEJ4CB6b2BGMBgLZrfwLjXcSUfoI/MiIXUuRpeYsfK5aPWbYhdtIVWOH+x6X0TouldHKHBuc/LAiFzAw==" 885 | }, 886 | "vite": { 887 | "version": "3.1.7", 888 | "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.7.tgz", 889 | "integrity": "sha512-5vCAmU4S8lyVdFCInu9M54f/g8qbOMakVw5xJ4pjoaDy5wgy9sLLZkGdSLN52dlsBqh0tBqxjaqqa8LgPqwRAA==", 890 | "requires": { 891 | "esbuild": "^0.15.9", 892 | "fsevents": "~2.3.2", 893 | "postcss": "^8.4.16", 894 | "resolve": "^1.22.1", 895 | "rollup": "~2.78.0" 896 | } 897 | }, 898 | "vite-plugin-glsl": { 899 | "version": "0.5.1", 900 | "resolved": "https://registry.npmjs.org/vite-plugin-glsl/-/vite-plugin-glsl-0.5.1.tgz", 901 | "integrity": "sha512-r4zKN8dlOVIB30whl4rlGgiUTnDk4DHDpDMfUwAERkkoJVf7yXqiNCcGCe4SRgi/GLekAyP4ShW4dSyfycvwfA==", 902 | "requires": { 903 | "@rollup/pluginutils": "^4.2.1" 904 | } 905 | } 906 | } 907 | } 908 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "immersive-world", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite --host", 8 | "build": "vite build", 9 | "preview": "vite preview" 10 | }, 11 | "devDependencies": { 12 | "vite": "^3.1.0" 13 | }, 14 | "dependencies": { 15 | "events": "^3.3.0", 16 | "three": "^0.145.0", 17 | "vite-plugin-glsl": "^0.5.1" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /public/draco/README.md: -------------------------------------------------------------------------------- 1 | # Draco 3D Data Compression 2 | 3 | Draco is an open-source library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics. 4 | 5 | [Website](https://google.github.io/draco/) | [GitHub](https://github.com/google/draco) 6 | 7 | ## Contents 8 | 9 | This folder contains three utilities: 10 | 11 | * `draco_decoder.js` — Emscripten-compiled decoder, compatible with any modern browser. 12 | * `draco_decoder.wasm` — WebAssembly decoder, compatible with newer browsers and devices. 13 | * `draco_wasm_wrapper.js` — JavaScript wrapper for the WASM decoder. 14 | 15 | Each file is provided in two variations: 16 | 17 | * **Default:** Latest stable builds, tracking the project's [master branch](https://github.com/google/draco). 18 | * **glTF:** Builds targeted by the [glTF mesh compression extension](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression), tracking the [corresponding Draco branch](https://github.com/google/draco/tree/gltf_2.0_draco_extension). 19 | 20 | Either variation may be used with `THREE.DRACOLoader`: 21 | 22 | ```js 23 | var dracoLoader = new THREE.DRACOLoader(); 24 | dracoLoader.setDecoderPath('path/to/decoders/'); 25 | dracoLoader.setDecoderConfig({type: 'js'}); // (Optional) Override detection of WASM support. 26 | ``` 27 | 28 | Further [documentation on GitHub](https://github.com/google/draco/tree/master/javascript/example#static-loading-javascript-decoder). 29 | 30 | ## License 31 | 32 | [Apache License 2.0](https://github.com/google/draco/blob/master/LICENSE) 33 | -------------------------------------------------------------------------------- /public/draco/draco_decoder.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewwoan/immersive-world-tutorial/229aef1ab98d730cf1d3afbc6c518d6734b27e0f/public/draco/draco_decoder.wasm -------------------------------------------------------------------------------- /public/draco/draco_wasm_wrapper.js: -------------------------------------------------------------------------------- 1 | var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.arrayIteratorImpl=function(f){var m=0;return function(){return m=d);)++b;if(16k?d+=String.fromCharCode(k):(k-=65536,d+=String.fromCharCode(55296|k>>10,56320|k&1023))}}else d+=String.fromCharCode(k)}return d}function X(a,c){return a?h(ca,a,c):""}function e(a,c){0=d&&(d=65536+((d&1023)<<10)|a.charCodeAt(++b)&1023);127>=d?++c:c=2047>=d?c+2:65535>=d?c+3:c+4}c=Array(c+1);b=0;d=c.length;if(0=e){var f=a.charCodeAt(++k);e=65536+((e&1023)<<10)|f&1023}if(127>=e){if(b>=d)break;c[b++]=e}else{if(2047>=e){if(b+1>=d)break;c[b++]=192|e>>6}else{if(65535>=e){if(b+2>=d)break;c[b++]=224|e>>12}else{if(b+3>=d)break;c[b++]=240|e>>18;c[b++]=128|e>>12&63}c[b++]=128|e>>6&63}c[b++]=128| 18 | e&63}}c[b]=0}a=n.alloc(c,T);n.copy(c,T,a)}return a}function x(){throw"cannot construct a Status, no constructor in IDL";}function A(){this.ptr=Oa();u(A)[this.ptr]=this}function B(){this.ptr=Pa();u(B)[this.ptr]=this}function C(){this.ptr=Qa();u(C)[this.ptr]=this}function D(){this.ptr=Ra();u(D)[this.ptr]=this}function E(){this.ptr=Sa();u(E)[this.ptr]=this}function q(){this.ptr=Ta();u(q)[this.ptr]=this}function J(){this.ptr=Ua();u(J)[this.ptr]=this}function w(){this.ptr=Va();u(w)[this.ptr]=this}function F(){this.ptr= 19 | Wa();u(F)[this.ptr]=this}function r(){this.ptr=Xa();u(r)[this.ptr]=this}function G(){this.ptr=Ya();u(G)[this.ptr]=this}function H(){this.ptr=Za();u(H)[this.ptr]=this}function O(){this.ptr=$a();u(O)[this.ptr]=this}function K(){this.ptr=ab();u(K)[this.ptr]=this}function g(){this.ptr=bb();u(g)[this.ptr]=this}function y(){this.ptr=cb();u(y)[this.ptr]=this}function Q(){throw"cannot construct a VoidPtr, no constructor in IDL";}function I(){this.ptr=db();u(I)[this.ptr]=this}function L(){this.ptr=eb();u(L)[this.ptr]= 20 | this}m=m||{};var a="undefined"!==typeof m?m:{},Ga=!1,Ha=!1;a.onRuntimeInitialized=function(){Ga=!0;if(Ha&&"function"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.onModuleParsed=function(){Ha=!0;if(Ga&&"function"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.isVersionSupported=function(a){if("string"!==typeof a)return!1;a=a.split(".");return 2>a.length||3=a[1]?!0:0!=a[0]||10>2]},getStr:function(){return X(R.get())}, 26 | get64:function(){var a=R.get();R.get();return a},getZero:function(){R.get()}},Ka={__cxa_allocate_exception:function(a){return ib(a)},__cxa_throw:function(a,c,b){"uncaught_exception"in ta?ta.uncaught_exceptions++:ta.uncaught_exceptions=1;throw a;},abort:function(){z()},emscripten_get_sbrk_ptr:function(){return 18416},emscripten_memcpy_big:function(a,c,b){ca.set(ca.subarray(c,c+b),a)},emscripten_resize_heap:function(a){if(2147418112= 27 | c?e(2*c,65536):Math.min(e((3*c+2147483648)/4,65536),2147418112);a:{try{ia.grow(c-ka.byteLength+65535>>16);l(ia.buffer);var b=1;break a}catch(d){}b=void 0}return b?!0:!1},environ_get:function(a,c){var b=0;ba().forEach(function(d,e){var f=c+b;e=P[a+4*e>>2]=f;for(f=0;f>0]=d.charCodeAt(f);T[e>>0]=0;b+=d.length+1});return 0},environ_sizes_get:function(a,c){var b=ba();P[a>>2]=b.length;var d=0;b.forEach(function(a){d+=a.length+1});P[c>>2]=d;return 0},fd_close:function(a){return 0},fd_seek:function(a, 28 | c,b,d,e){return 0},fd_write:function(a,c,b,d){try{for(var e=0,f=0;f>2],k=P[c+(8*f+4)>>2],h=0;h>2]=e;return 0}catch(ua){return"undefined"!==typeof FS&&ua instanceof FS.ErrnoError||z(ua),ua.errno}},memory:ia,setTempRet0:function(a){},table:gb},La=function(){function e(c,b){a.asm=c.exports;aa--;a.monitorRunDependencies&&a.monitorRunDependencies(aa);0==aa&&(null!==sa&&(clearInterval(sa),sa=null),ja&&(c=ja,ja=null,c()))}function c(a){e(a.instance)} 29 | function b(a){return Ma().then(function(a){return WebAssembly.instantiate(a,d)}).then(a,function(a){Y("failed to asynchronously prepare wasm: "+a);z(a)})}var d={env:Ka,wasi_unstable:Ka};aa++;a.monitorRunDependencies&&a.monitorRunDependencies(aa);if(a.instantiateWasm)try{return a.instantiateWasm(d,e)}catch(Na){return Y("Module.instantiateWasm callback failed with error: "+Na),!1}(function(){if(da||"function"!==typeof WebAssembly.instantiateStreaming||va(U)||"function"!==typeof fetch)return b(c);fetch(U, 30 | {credentials:"same-origin"}).then(function(a){return WebAssembly.instantiateStreaming(a,d).then(c,function(a){Y("wasm streaming compile failed: "+a);Y("falling back to ArrayBuffer instantiation");b(c)})})})();return{}}();a.asm=La;var hb=a.___wasm_call_ctors=function(){return a.asm.__wasm_call_ctors.apply(null,arguments)},jb=a._emscripten_bind_Status_code_0=function(){return a.asm.emscripten_bind_Status_code_0.apply(null,arguments)},kb=a._emscripten_bind_Status_ok_0=function(){return a.asm.emscripten_bind_Status_ok_0.apply(null, 31 | arguments)},lb=a._emscripten_bind_Status_error_msg_0=function(){return a.asm.emscripten_bind_Status_error_msg_0.apply(null,arguments)},mb=a._emscripten_bind_Status___destroy___0=function(){return a.asm.emscripten_bind_Status___destroy___0.apply(null,arguments)},Oa=a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=function(){return a.asm.emscripten_bind_DracoUInt16Array_DracoUInt16Array_0.apply(null,arguments)},nb=a._emscripten_bind_DracoUInt16Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoUInt16Array_GetValue_1.apply(null, 32 | arguments)},ob=a._emscripten_bind_DracoUInt16Array_size_0=function(){return a.asm.emscripten_bind_DracoUInt16Array_size_0.apply(null,arguments)},pb=a._emscripten_bind_DracoUInt16Array___destroy___0=function(){return a.asm.emscripten_bind_DracoUInt16Array___destroy___0.apply(null,arguments)},Pa=a._emscripten_bind_PointCloud_PointCloud_0=function(){return a.asm.emscripten_bind_PointCloud_PointCloud_0.apply(null,arguments)},qb=a._emscripten_bind_PointCloud_num_attributes_0=function(){return a.asm.emscripten_bind_PointCloud_num_attributes_0.apply(null, 33 | arguments)},rb=a._emscripten_bind_PointCloud_num_points_0=function(){return a.asm.emscripten_bind_PointCloud_num_points_0.apply(null,arguments)},sb=a._emscripten_bind_PointCloud___destroy___0=function(){return a.asm.emscripten_bind_PointCloud___destroy___0.apply(null,arguments)},Qa=a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=function(){return a.asm.emscripten_bind_DracoUInt8Array_DracoUInt8Array_0.apply(null,arguments)},tb=a._emscripten_bind_DracoUInt8Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoUInt8Array_GetValue_1.apply(null, 34 | arguments)},ub=a._emscripten_bind_DracoUInt8Array_size_0=function(){return a.asm.emscripten_bind_DracoUInt8Array_size_0.apply(null,arguments)},vb=a._emscripten_bind_DracoUInt8Array___destroy___0=function(){return a.asm.emscripten_bind_DracoUInt8Array___destroy___0.apply(null,arguments)},Ra=a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=function(){return a.asm.emscripten_bind_DracoUInt32Array_DracoUInt32Array_0.apply(null,arguments)},wb=a._emscripten_bind_DracoUInt32Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoUInt32Array_GetValue_1.apply(null, 35 | arguments)},xb=a._emscripten_bind_DracoUInt32Array_size_0=function(){return a.asm.emscripten_bind_DracoUInt32Array_size_0.apply(null,arguments)},yb=a._emscripten_bind_DracoUInt32Array___destroy___0=function(){return a.asm.emscripten_bind_DracoUInt32Array___destroy___0.apply(null,arguments)},Sa=a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=function(){return a.asm.emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0.apply(null,arguments)},zb=a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1= 36 | function(){return a.asm.emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1.apply(null,arguments)},Ab=a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=function(){return a.asm.emscripten_bind_AttributeOctahedronTransform_quantization_bits_0.apply(null,arguments)},Bb=a._emscripten_bind_AttributeOctahedronTransform___destroy___0=function(){return a.asm.emscripten_bind_AttributeOctahedronTransform___destroy___0.apply(null,arguments)},Ta=a._emscripten_bind_PointAttribute_PointAttribute_0= 37 | function(){return a.asm.emscripten_bind_PointAttribute_PointAttribute_0.apply(null,arguments)},Cb=a._emscripten_bind_PointAttribute_size_0=function(){return a.asm.emscripten_bind_PointAttribute_size_0.apply(null,arguments)},Db=a._emscripten_bind_PointAttribute_GetAttributeTransformData_0=function(){return a.asm.emscripten_bind_PointAttribute_GetAttributeTransformData_0.apply(null,arguments)},Eb=a._emscripten_bind_PointAttribute_attribute_type_0=function(){return a.asm.emscripten_bind_PointAttribute_attribute_type_0.apply(null, 38 | arguments)},Fb=a._emscripten_bind_PointAttribute_data_type_0=function(){return a.asm.emscripten_bind_PointAttribute_data_type_0.apply(null,arguments)},Gb=a._emscripten_bind_PointAttribute_num_components_0=function(){return a.asm.emscripten_bind_PointAttribute_num_components_0.apply(null,arguments)},Hb=a._emscripten_bind_PointAttribute_normalized_0=function(){return a.asm.emscripten_bind_PointAttribute_normalized_0.apply(null,arguments)},Ib=a._emscripten_bind_PointAttribute_byte_stride_0=function(){return a.asm.emscripten_bind_PointAttribute_byte_stride_0.apply(null, 39 | arguments)},Jb=a._emscripten_bind_PointAttribute_byte_offset_0=function(){return a.asm.emscripten_bind_PointAttribute_byte_offset_0.apply(null,arguments)},Kb=a._emscripten_bind_PointAttribute_unique_id_0=function(){return a.asm.emscripten_bind_PointAttribute_unique_id_0.apply(null,arguments)},Lb=a._emscripten_bind_PointAttribute___destroy___0=function(){return a.asm.emscripten_bind_PointAttribute___destroy___0.apply(null,arguments)},Ua=a._emscripten_bind_AttributeTransformData_AttributeTransformData_0= 40 | function(){return a.asm.emscripten_bind_AttributeTransformData_AttributeTransformData_0.apply(null,arguments)},Mb=a._emscripten_bind_AttributeTransformData_transform_type_0=function(){return a.asm.emscripten_bind_AttributeTransformData_transform_type_0.apply(null,arguments)},Nb=a._emscripten_bind_AttributeTransformData___destroy___0=function(){return a.asm.emscripten_bind_AttributeTransformData___destroy___0.apply(null,arguments)},Va=a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0= 41 | function(){return a.asm.emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0.apply(null,arguments)},Ob=a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=function(){return a.asm.emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1.apply(null,arguments)},Pb=a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=function(){return a.asm.emscripten_bind_AttributeQuantizationTransform_quantization_bits_0.apply(null,arguments)}, 42 | Qb=a._emscripten_bind_AttributeQuantizationTransform_min_value_1=function(){return a.asm.emscripten_bind_AttributeQuantizationTransform_min_value_1.apply(null,arguments)},Rb=a._emscripten_bind_AttributeQuantizationTransform_range_0=function(){return a.asm.emscripten_bind_AttributeQuantizationTransform_range_0.apply(null,arguments)},Sb=a._emscripten_bind_AttributeQuantizationTransform___destroy___0=function(){return a.asm.emscripten_bind_AttributeQuantizationTransform___destroy___0.apply(null,arguments)}, 43 | Wa=a._emscripten_bind_DracoInt8Array_DracoInt8Array_0=function(){return a.asm.emscripten_bind_DracoInt8Array_DracoInt8Array_0.apply(null,arguments)},Tb=a._emscripten_bind_DracoInt8Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoInt8Array_GetValue_1.apply(null,arguments)},Ub=a._emscripten_bind_DracoInt8Array_size_0=function(){return a.asm.emscripten_bind_DracoInt8Array_size_0.apply(null,arguments)},Vb=a._emscripten_bind_DracoInt8Array___destroy___0=function(){return a.asm.emscripten_bind_DracoInt8Array___destroy___0.apply(null, 44 | arguments)},Xa=a._emscripten_bind_MetadataQuerier_MetadataQuerier_0=function(){return a.asm.emscripten_bind_MetadataQuerier_MetadataQuerier_0.apply(null,arguments)},Wb=a._emscripten_bind_MetadataQuerier_HasEntry_2=function(){return a.asm.emscripten_bind_MetadataQuerier_HasEntry_2.apply(null,arguments)},Xb=a._emscripten_bind_MetadataQuerier_GetIntEntry_2=function(){return a.asm.emscripten_bind_MetadataQuerier_GetIntEntry_2.apply(null,arguments)},Yb=a._emscripten_bind_MetadataQuerier_GetIntEntryArray_3= 45 | function(){return a.asm.emscripten_bind_MetadataQuerier_GetIntEntryArray_3.apply(null,arguments)},Zb=a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=function(){return a.asm.emscripten_bind_MetadataQuerier_GetDoubleEntry_2.apply(null,arguments)},$b=a._emscripten_bind_MetadataQuerier_GetStringEntry_2=function(){return a.asm.emscripten_bind_MetadataQuerier_GetStringEntry_2.apply(null,arguments)},ac=a._emscripten_bind_MetadataQuerier_NumEntries_1=function(){return a.asm.emscripten_bind_MetadataQuerier_NumEntries_1.apply(null, 46 | arguments)},bc=a._emscripten_bind_MetadataQuerier_GetEntryName_2=function(){return a.asm.emscripten_bind_MetadataQuerier_GetEntryName_2.apply(null,arguments)},cc=a._emscripten_bind_MetadataQuerier___destroy___0=function(){return a.asm.emscripten_bind_MetadataQuerier___destroy___0.apply(null,arguments)},Ya=a._emscripten_bind_DracoInt16Array_DracoInt16Array_0=function(){return a.asm.emscripten_bind_DracoInt16Array_DracoInt16Array_0.apply(null,arguments)},dc=a._emscripten_bind_DracoInt16Array_GetValue_1= 47 | function(){return a.asm.emscripten_bind_DracoInt16Array_GetValue_1.apply(null,arguments)},ec=a._emscripten_bind_DracoInt16Array_size_0=function(){return a.asm.emscripten_bind_DracoInt16Array_size_0.apply(null,arguments)},fc=a._emscripten_bind_DracoInt16Array___destroy___0=function(){return a.asm.emscripten_bind_DracoInt16Array___destroy___0.apply(null,arguments)},Za=a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=function(){return a.asm.emscripten_bind_DracoFloat32Array_DracoFloat32Array_0.apply(null, 48 | arguments)},gc=a._emscripten_bind_DracoFloat32Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoFloat32Array_GetValue_1.apply(null,arguments)},hc=a._emscripten_bind_DracoFloat32Array_size_0=function(){return a.asm.emscripten_bind_DracoFloat32Array_size_0.apply(null,arguments)},ic=a._emscripten_bind_DracoFloat32Array___destroy___0=function(){return a.asm.emscripten_bind_DracoFloat32Array___destroy___0.apply(null,arguments)},$a=a._emscripten_bind_GeometryAttribute_GeometryAttribute_0=function(){return a.asm.emscripten_bind_GeometryAttribute_GeometryAttribute_0.apply(null, 49 | arguments)},jc=a._emscripten_bind_GeometryAttribute___destroy___0=function(){return a.asm.emscripten_bind_GeometryAttribute___destroy___0.apply(null,arguments)},ab=a._emscripten_bind_DecoderBuffer_DecoderBuffer_0=function(){return a.asm.emscripten_bind_DecoderBuffer_DecoderBuffer_0.apply(null,arguments)},kc=a._emscripten_bind_DecoderBuffer_Init_2=function(){return a.asm.emscripten_bind_DecoderBuffer_Init_2.apply(null,arguments)},lc=a._emscripten_bind_DecoderBuffer___destroy___0=function(){return a.asm.emscripten_bind_DecoderBuffer___destroy___0.apply(null, 50 | arguments)},bb=a._emscripten_bind_Decoder_Decoder_0=function(){return a.asm.emscripten_bind_Decoder_Decoder_0.apply(null,arguments)},mc=a._emscripten_bind_Decoder_GetEncodedGeometryType_1=function(){return a.asm.emscripten_bind_Decoder_GetEncodedGeometryType_1.apply(null,arguments)},nc=a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2=function(){return a.asm.emscripten_bind_Decoder_DecodeBufferToPointCloud_2.apply(null,arguments)},oc=a._emscripten_bind_Decoder_DecodeBufferToMesh_2=function(){return a.asm.emscripten_bind_Decoder_DecodeBufferToMesh_2.apply(null, 51 | arguments)},pc=a._emscripten_bind_Decoder_GetAttributeId_2=function(){return a.asm.emscripten_bind_Decoder_GetAttributeId_2.apply(null,arguments)},qc=a._emscripten_bind_Decoder_GetAttributeIdByName_2=function(){return a.asm.emscripten_bind_Decoder_GetAttributeIdByName_2.apply(null,arguments)},rc=a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3.apply(null,arguments)},sc=a._emscripten_bind_Decoder_GetAttribute_2= 52 | function(){return a.asm.emscripten_bind_Decoder_GetAttribute_2.apply(null,arguments)},tc=a._emscripten_bind_Decoder_GetAttributeByUniqueId_2=function(){return a.asm.emscripten_bind_Decoder_GetAttributeByUniqueId_2.apply(null,arguments)},uc=a._emscripten_bind_Decoder_GetMetadata_1=function(){return a.asm.emscripten_bind_Decoder_GetMetadata_1.apply(null,arguments)},vc=a._emscripten_bind_Decoder_GetAttributeMetadata_2=function(){return a.asm.emscripten_bind_Decoder_GetAttributeMetadata_2.apply(null, 53 | arguments)},wc=a._emscripten_bind_Decoder_GetFaceFromMesh_3=function(){return a.asm.emscripten_bind_Decoder_GetFaceFromMesh_3.apply(null,arguments)},xc=a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=function(){return a.asm.emscripten_bind_Decoder_GetTriangleStripsFromMesh_2.apply(null,arguments)},yc=a._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=function(){return a.asm.emscripten_bind_Decoder_GetTrianglesUInt16Array_3.apply(null,arguments)},zc=a._emscripten_bind_Decoder_GetTrianglesUInt32Array_3= 54 | function(){return a.asm.emscripten_bind_Decoder_GetTrianglesUInt32Array_3.apply(null,arguments)},Ac=a._emscripten_bind_Decoder_GetAttributeFloat_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeFloat_3.apply(null,arguments)},Bc=a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3.apply(null,arguments)},Cc=a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeIntForAllPoints_3.apply(null, 55 | arguments)},Dc=a._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3.apply(null,arguments)},Ec=a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3.apply(null,arguments)},Fc=a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3.apply(null,arguments)}, 56 | Gc=a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3.apply(null,arguments)},Hc=a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3.apply(null,arguments)},Ic=a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3.apply(null,arguments)},Jc= 57 | a._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=function(){return a.asm.emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5.apply(null,arguments)},Kc=a._emscripten_bind_Decoder_SkipAttributeTransform_1=function(){return a.asm.emscripten_bind_Decoder_SkipAttributeTransform_1.apply(null,arguments)},Lc=a._emscripten_bind_Decoder___destroy___0=function(){return a.asm.emscripten_bind_Decoder___destroy___0.apply(null,arguments)},cb=a._emscripten_bind_Mesh_Mesh_0=function(){return a.asm.emscripten_bind_Mesh_Mesh_0.apply(null, 58 | arguments)},Mc=a._emscripten_bind_Mesh_num_faces_0=function(){return a.asm.emscripten_bind_Mesh_num_faces_0.apply(null,arguments)},Nc=a._emscripten_bind_Mesh_num_attributes_0=function(){return a.asm.emscripten_bind_Mesh_num_attributes_0.apply(null,arguments)},Oc=a._emscripten_bind_Mesh_num_points_0=function(){return a.asm.emscripten_bind_Mesh_num_points_0.apply(null,arguments)},Pc=a._emscripten_bind_Mesh___destroy___0=function(){return a.asm.emscripten_bind_Mesh___destroy___0.apply(null,arguments)}, 59 | Qc=a._emscripten_bind_VoidPtr___destroy___0=function(){return a.asm.emscripten_bind_VoidPtr___destroy___0.apply(null,arguments)},db=a._emscripten_bind_DracoInt32Array_DracoInt32Array_0=function(){return a.asm.emscripten_bind_DracoInt32Array_DracoInt32Array_0.apply(null,arguments)},Rc=a._emscripten_bind_DracoInt32Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoInt32Array_GetValue_1.apply(null,arguments)},Sc=a._emscripten_bind_DracoInt32Array_size_0=function(){return a.asm.emscripten_bind_DracoInt32Array_size_0.apply(null, 60 | arguments)},Tc=a._emscripten_bind_DracoInt32Array___destroy___0=function(){return a.asm.emscripten_bind_DracoInt32Array___destroy___0.apply(null,arguments)},eb=a._emscripten_bind_Metadata_Metadata_0=function(){return a.asm.emscripten_bind_Metadata_Metadata_0.apply(null,arguments)},Uc=a._emscripten_bind_Metadata___destroy___0=function(){return a.asm.emscripten_bind_Metadata___destroy___0.apply(null,arguments)},Vc=a._emscripten_enum_draco_StatusCode_OK=function(){return a.asm.emscripten_enum_draco_StatusCode_OK.apply(null, 61 | arguments)},Wc=a._emscripten_enum_draco_StatusCode_DRACO_ERROR=function(){return a.asm.emscripten_enum_draco_StatusCode_DRACO_ERROR.apply(null,arguments)},Xc=a._emscripten_enum_draco_StatusCode_IO_ERROR=function(){return a.asm.emscripten_enum_draco_StatusCode_IO_ERROR.apply(null,arguments)},Yc=a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER=function(){return a.asm.emscripten_enum_draco_StatusCode_INVALID_PARAMETER.apply(null,arguments)},Zc=a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION= 62 | function(){return a.asm.emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION.apply(null,arguments)},$c=a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=function(){return a.asm.emscripten_enum_draco_StatusCode_UNKNOWN_VERSION.apply(null,arguments)},ad=a._emscripten_enum_draco_DataType_DT_INVALID=function(){return a.asm.emscripten_enum_draco_DataType_DT_INVALID.apply(null,arguments)},bd=a._emscripten_enum_draco_DataType_DT_INT8=function(){return a.asm.emscripten_enum_draco_DataType_DT_INT8.apply(null, 63 | arguments)},cd=a._emscripten_enum_draco_DataType_DT_UINT8=function(){return a.asm.emscripten_enum_draco_DataType_DT_UINT8.apply(null,arguments)},dd=a._emscripten_enum_draco_DataType_DT_INT16=function(){return a.asm.emscripten_enum_draco_DataType_DT_INT16.apply(null,arguments)},ed=a._emscripten_enum_draco_DataType_DT_UINT16=function(){return a.asm.emscripten_enum_draco_DataType_DT_UINT16.apply(null,arguments)},fd=a._emscripten_enum_draco_DataType_DT_INT32=function(){return a.asm.emscripten_enum_draco_DataType_DT_INT32.apply(null, 64 | arguments)},gd=a._emscripten_enum_draco_DataType_DT_UINT32=function(){return a.asm.emscripten_enum_draco_DataType_DT_UINT32.apply(null,arguments)},hd=a._emscripten_enum_draco_DataType_DT_INT64=function(){return a.asm.emscripten_enum_draco_DataType_DT_INT64.apply(null,arguments)},id=a._emscripten_enum_draco_DataType_DT_UINT64=function(){return a.asm.emscripten_enum_draco_DataType_DT_UINT64.apply(null,arguments)},jd=a._emscripten_enum_draco_DataType_DT_FLOAT32=function(){return a.asm.emscripten_enum_draco_DataType_DT_FLOAT32.apply(null, 65 | arguments)},kd=a._emscripten_enum_draco_DataType_DT_FLOAT64=function(){return a.asm.emscripten_enum_draco_DataType_DT_FLOAT64.apply(null,arguments)},ld=a._emscripten_enum_draco_DataType_DT_BOOL=function(){return a.asm.emscripten_enum_draco_DataType_DT_BOOL.apply(null,arguments)},md=a._emscripten_enum_draco_DataType_DT_TYPES_COUNT=function(){return a.asm.emscripten_enum_draco_DataType_DT_TYPES_COUNT.apply(null,arguments)},nd=a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=function(){return a.asm.emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE.apply(null, 66 | arguments)},od=a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=function(){return a.asm.emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD.apply(null,arguments)},pd=a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=function(){return a.asm.emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH.apply(null,arguments)},qd=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=function(){return a.asm.emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM.apply(null, 67 | arguments)},rd=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=function(){return a.asm.emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM.apply(null,arguments)},sd=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=function(){return a.asm.emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM.apply(null,arguments)},td=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=function(){return a.asm.emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM.apply(null, 68 | arguments)},ud=a._emscripten_enum_draco_GeometryAttribute_Type_INVALID=function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_INVALID.apply(null,arguments)},vd=a._emscripten_enum_draco_GeometryAttribute_Type_POSITION=function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_POSITION.apply(null,arguments)},wd=a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_NORMAL.apply(null,arguments)},xd=a._emscripten_enum_draco_GeometryAttribute_Type_COLOR= 69 | function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_COLOR.apply(null,arguments)},yd=a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD.apply(null,arguments)},zd=a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_GENERIC.apply(null,arguments)};a._setThrew=function(){return a.asm.setThrew.apply(null,arguments)};var ta=a.__ZSt18uncaught_exceptionv= 70 | function(){return a.asm._ZSt18uncaught_exceptionv.apply(null,arguments)};a._free=function(){return a.asm.free.apply(null,arguments)};var ib=a._malloc=function(){return a.asm.malloc.apply(null,arguments)};a.stackSave=function(){return a.asm.stackSave.apply(null,arguments)};a.stackAlloc=function(){return a.asm.stackAlloc.apply(null,arguments)};a.stackRestore=function(){return a.asm.stackRestore.apply(null,arguments)};a.__growWasmMemory=function(){return a.asm.__growWasmMemory.apply(null,arguments)}; 71 | a.dynCall_ii=function(){return a.asm.dynCall_ii.apply(null,arguments)};a.dynCall_vi=function(){return a.asm.dynCall_vi.apply(null,arguments)};a.dynCall_iii=function(){return a.asm.dynCall_iii.apply(null,arguments)};a.dynCall_vii=function(){return a.asm.dynCall_vii.apply(null,arguments)};a.dynCall_iiii=function(){return a.asm.dynCall_iiii.apply(null,arguments)};a.dynCall_v=function(){return a.asm.dynCall_v.apply(null,arguments)};a.dynCall_viii=function(){return a.asm.dynCall_viii.apply(null,arguments)}; 72 | a.dynCall_viiii=function(){return a.asm.dynCall_viiii.apply(null,arguments)};a.dynCall_iiiiiii=function(){return a.asm.dynCall_iiiiiii.apply(null,arguments)};a.dynCall_iidiiii=function(){return a.asm.dynCall_iidiiii.apply(null,arguments)};a.dynCall_jiji=function(){return a.asm.dynCall_jiji.apply(null,arguments)};a.dynCall_viiiiii=function(){return a.asm.dynCall_viiiiii.apply(null,arguments)};a.dynCall_viiiii=function(){return a.asm.dynCall_viiiii.apply(null,arguments)};a.asm=La;var fa;a.then=function(e){if(fa)e(a); 73 | else{var c=a.onRuntimeInitialized;a.onRuntimeInitialized=function(){c&&c();e(a)}}return a};ja=function c(){fa||ma();fa||(ja=c)};a.run=ma;if(a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);0=n.size?(t(0>=1;break;case 4:d>>=2;break;case 8:d>>=3}for(var c=0;c=d);)++b;if(16k?d+=String.fromCharCode(k):(k-=65536,d+=String.fromCharCode(55296|k>>10,56320|k&1023))}}else d+=String.fromCharCode(k)}return d}function X(a,c){return a?h(ca,a,c):""}function e(a,c){0=d&&(d=65536+((d&1023)<<10)|a.charCodeAt(++b)&1023);127>=d?++c:c=2047>=d?c+2:65535>=d?c+3:c+4}c=Array(c+1);b=0;d=c.length;if(0=e){var f=a.charCodeAt(++k);e=65536+((e&1023)<<10)|f&1023}if(127>=e){if(b>=d)break;c[b++]=e}else{if(2047>=e){if(b+1>=d)break;c[b++]=192|e>>6}else{if(65535>=e){if(b+2>=d)break;c[b++]=224|e>>12}else{if(b+3>=d)break;c[b++]=240|e>>18;c[b++]=128|e>>12&63}c[b++]=128|e>>6&63}c[b++]=128| 18 | e&63}}c[b]=0}a=n.alloc(c,T);n.copy(c,T,a)}return a}function x(){throw"cannot construct a Status, no constructor in IDL";}function A(){this.ptr=Oa();u(A)[this.ptr]=this}function B(){this.ptr=Pa();u(B)[this.ptr]=this}function C(){this.ptr=Qa();u(C)[this.ptr]=this}function D(){this.ptr=Ra();u(D)[this.ptr]=this}function E(){this.ptr=Sa();u(E)[this.ptr]=this}function q(){this.ptr=Ta();u(q)[this.ptr]=this}function J(){this.ptr=Ua();u(J)[this.ptr]=this}function w(){this.ptr=Va();u(w)[this.ptr]=this}function F(){this.ptr= 19 | Wa();u(F)[this.ptr]=this}function r(){this.ptr=Xa();u(r)[this.ptr]=this}function G(){this.ptr=Ya();u(G)[this.ptr]=this}function H(){this.ptr=Za();u(H)[this.ptr]=this}function O(){this.ptr=$a();u(O)[this.ptr]=this}function K(){this.ptr=ab();u(K)[this.ptr]=this}function g(){this.ptr=bb();u(g)[this.ptr]=this}function y(){this.ptr=cb();u(y)[this.ptr]=this}function Q(){throw"cannot construct a VoidPtr, no constructor in IDL";}function I(){this.ptr=db();u(I)[this.ptr]=this}function L(){this.ptr=eb();u(L)[this.ptr]= 20 | this}m=m||{};var a="undefined"!==typeof m?m:{},Ga=!1,Ha=!1;a.onRuntimeInitialized=function(){Ga=!0;if(Ha&&"function"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.onModuleParsed=function(){Ha=!0;if(Ga&&"function"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.isVersionSupported=function(a){if("string"!==typeof a)return!1;a=a.split(".");return 2>a.length||3=a[1]?!0:0!=a[0]||10>2]},getStr:function(){return X(R.get())}, 26 | get64:function(){var a=R.get();R.get();return a},getZero:function(){R.get()}},Ka={__cxa_allocate_exception:function(a){return ib(a)},__cxa_throw:function(a,c,b){"uncaught_exception"in ta?ta.uncaught_exceptions++:ta.uncaught_exceptions=1;throw a;},abort:function(){z()},emscripten_get_sbrk_ptr:function(){return 13664},emscripten_memcpy_big:function(a,c,b){ca.set(ca.subarray(c,c+b),a)},emscripten_resize_heap:function(a){if(2147418112= 27 | c?e(2*c,65536):Math.min(e((3*c+2147483648)/4,65536),2147418112);a:{try{ia.grow(c-ka.byteLength+65535>>16);l(ia.buffer);var b=1;break a}catch(d){}b=void 0}return b?!0:!1},environ_get:function(a,c){var b=0;ba().forEach(function(d,e){var f=c+b;e=P[a+4*e>>2]=f;for(f=0;f>0]=d.charCodeAt(f);T[e>>0]=0;b+=d.length+1});return 0},environ_sizes_get:function(a,c){var b=ba();P[a>>2]=b.length;var d=0;b.forEach(function(a){d+=a.length+1});P[c>>2]=d;return 0},fd_close:function(a){return 0},fd_seek:function(a, 28 | c,b,d,e){return 0},fd_write:function(a,c,b,d){try{for(var e=0,f=0;f>2],k=P[c+(8*f+4)>>2],h=0;h>2]=e;return 0}catch(ua){return"undefined"!==typeof FS&&ua instanceof FS.ErrnoError||z(ua),ua.errno}},memory:ia,setTempRet0:function(a){},table:gb},La=function(){function e(c,b){a.asm=c.exports;aa--;a.monitorRunDependencies&&a.monitorRunDependencies(aa);0==aa&&(null!==sa&&(clearInterval(sa),sa=null),ja&&(c=ja,ja=null,c()))}function c(a){e(a.instance)} 29 | function b(a){return Ma().then(function(a){return WebAssembly.instantiate(a,d)}).then(a,function(a){Y("failed to asynchronously prepare wasm: "+a);z(a)})}var d={env:Ka,wasi_unstable:Ka};aa++;a.monitorRunDependencies&&a.monitorRunDependencies(aa);if(a.instantiateWasm)try{return a.instantiateWasm(d,e)}catch(Na){return Y("Module.instantiateWasm callback failed with error: "+Na),!1}(function(){if(da||"function"!==typeof WebAssembly.instantiateStreaming||va(U)||"function"!==typeof fetch)return b(c);fetch(U, 30 | {credentials:"same-origin"}).then(function(a){return WebAssembly.instantiateStreaming(a,d).then(c,function(a){Y("wasm streaming compile failed: "+a);Y("falling back to ArrayBuffer instantiation");b(c)})})})();return{}}();a.asm=La;var hb=a.___wasm_call_ctors=function(){return a.asm.__wasm_call_ctors.apply(null,arguments)},jb=a._emscripten_bind_Status_code_0=function(){return a.asm.emscripten_bind_Status_code_0.apply(null,arguments)},kb=a._emscripten_bind_Status_ok_0=function(){return a.asm.emscripten_bind_Status_ok_0.apply(null, 31 | arguments)},lb=a._emscripten_bind_Status_error_msg_0=function(){return a.asm.emscripten_bind_Status_error_msg_0.apply(null,arguments)},mb=a._emscripten_bind_Status___destroy___0=function(){return a.asm.emscripten_bind_Status___destroy___0.apply(null,arguments)},Oa=a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=function(){return a.asm.emscripten_bind_DracoUInt16Array_DracoUInt16Array_0.apply(null,arguments)},nb=a._emscripten_bind_DracoUInt16Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoUInt16Array_GetValue_1.apply(null, 32 | arguments)},ob=a._emscripten_bind_DracoUInt16Array_size_0=function(){return a.asm.emscripten_bind_DracoUInt16Array_size_0.apply(null,arguments)},pb=a._emscripten_bind_DracoUInt16Array___destroy___0=function(){return a.asm.emscripten_bind_DracoUInt16Array___destroy___0.apply(null,arguments)},Pa=a._emscripten_bind_PointCloud_PointCloud_0=function(){return a.asm.emscripten_bind_PointCloud_PointCloud_0.apply(null,arguments)},qb=a._emscripten_bind_PointCloud_num_attributes_0=function(){return a.asm.emscripten_bind_PointCloud_num_attributes_0.apply(null, 33 | arguments)},rb=a._emscripten_bind_PointCloud_num_points_0=function(){return a.asm.emscripten_bind_PointCloud_num_points_0.apply(null,arguments)},sb=a._emscripten_bind_PointCloud___destroy___0=function(){return a.asm.emscripten_bind_PointCloud___destroy___0.apply(null,arguments)},Qa=a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=function(){return a.asm.emscripten_bind_DracoUInt8Array_DracoUInt8Array_0.apply(null,arguments)},tb=a._emscripten_bind_DracoUInt8Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoUInt8Array_GetValue_1.apply(null, 34 | arguments)},ub=a._emscripten_bind_DracoUInt8Array_size_0=function(){return a.asm.emscripten_bind_DracoUInt8Array_size_0.apply(null,arguments)},vb=a._emscripten_bind_DracoUInt8Array___destroy___0=function(){return a.asm.emscripten_bind_DracoUInt8Array___destroy___0.apply(null,arguments)},Ra=a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=function(){return a.asm.emscripten_bind_DracoUInt32Array_DracoUInt32Array_0.apply(null,arguments)},wb=a._emscripten_bind_DracoUInt32Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoUInt32Array_GetValue_1.apply(null, 35 | arguments)},xb=a._emscripten_bind_DracoUInt32Array_size_0=function(){return a.asm.emscripten_bind_DracoUInt32Array_size_0.apply(null,arguments)},yb=a._emscripten_bind_DracoUInt32Array___destroy___0=function(){return a.asm.emscripten_bind_DracoUInt32Array___destroy___0.apply(null,arguments)},Sa=a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=function(){return a.asm.emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0.apply(null,arguments)},zb=a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1= 36 | function(){return a.asm.emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1.apply(null,arguments)},Ab=a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=function(){return a.asm.emscripten_bind_AttributeOctahedronTransform_quantization_bits_0.apply(null,arguments)},Bb=a._emscripten_bind_AttributeOctahedronTransform___destroy___0=function(){return a.asm.emscripten_bind_AttributeOctahedronTransform___destroy___0.apply(null,arguments)},Ta=a._emscripten_bind_PointAttribute_PointAttribute_0= 37 | function(){return a.asm.emscripten_bind_PointAttribute_PointAttribute_0.apply(null,arguments)},Cb=a._emscripten_bind_PointAttribute_size_0=function(){return a.asm.emscripten_bind_PointAttribute_size_0.apply(null,arguments)},Db=a._emscripten_bind_PointAttribute_GetAttributeTransformData_0=function(){return a.asm.emscripten_bind_PointAttribute_GetAttributeTransformData_0.apply(null,arguments)},Eb=a._emscripten_bind_PointAttribute_attribute_type_0=function(){return a.asm.emscripten_bind_PointAttribute_attribute_type_0.apply(null, 38 | arguments)},Fb=a._emscripten_bind_PointAttribute_data_type_0=function(){return a.asm.emscripten_bind_PointAttribute_data_type_0.apply(null,arguments)},Gb=a._emscripten_bind_PointAttribute_num_components_0=function(){return a.asm.emscripten_bind_PointAttribute_num_components_0.apply(null,arguments)},Hb=a._emscripten_bind_PointAttribute_normalized_0=function(){return a.asm.emscripten_bind_PointAttribute_normalized_0.apply(null,arguments)},Ib=a._emscripten_bind_PointAttribute_byte_stride_0=function(){return a.asm.emscripten_bind_PointAttribute_byte_stride_0.apply(null, 39 | arguments)},Jb=a._emscripten_bind_PointAttribute_byte_offset_0=function(){return a.asm.emscripten_bind_PointAttribute_byte_offset_0.apply(null,arguments)},Kb=a._emscripten_bind_PointAttribute_unique_id_0=function(){return a.asm.emscripten_bind_PointAttribute_unique_id_0.apply(null,arguments)},Lb=a._emscripten_bind_PointAttribute___destroy___0=function(){return a.asm.emscripten_bind_PointAttribute___destroy___0.apply(null,arguments)},Ua=a._emscripten_bind_AttributeTransformData_AttributeTransformData_0= 40 | function(){return a.asm.emscripten_bind_AttributeTransformData_AttributeTransformData_0.apply(null,arguments)},Mb=a._emscripten_bind_AttributeTransformData_transform_type_0=function(){return a.asm.emscripten_bind_AttributeTransformData_transform_type_0.apply(null,arguments)},Nb=a._emscripten_bind_AttributeTransformData___destroy___0=function(){return a.asm.emscripten_bind_AttributeTransformData___destroy___0.apply(null,arguments)},Va=a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0= 41 | function(){return a.asm.emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0.apply(null,arguments)},Ob=a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=function(){return a.asm.emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1.apply(null,arguments)},Pb=a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=function(){return a.asm.emscripten_bind_AttributeQuantizationTransform_quantization_bits_0.apply(null,arguments)}, 42 | Qb=a._emscripten_bind_AttributeQuantizationTransform_min_value_1=function(){return a.asm.emscripten_bind_AttributeQuantizationTransform_min_value_1.apply(null,arguments)},Rb=a._emscripten_bind_AttributeQuantizationTransform_range_0=function(){return a.asm.emscripten_bind_AttributeQuantizationTransform_range_0.apply(null,arguments)},Sb=a._emscripten_bind_AttributeQuantizationTransform___destroy___0=function(){return a.asm.emscripten_bind_AttributeQuantizationTransform___destroy___0.apply(null,arguments)}, 43 | Wa=a._emscripten_bind_DracoInt8Array_DracoInt8Array_0=function(){return a.asm.emscripten_bind_DracoInt8Array_DracoInt8Array_0.apply(null,arguments)},Tb=a._emscripten_bind_DracoInt8Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoInt8Array_GetValue_1.apply(null,arguments)},Ub=a._emscripten_bind_DracoInt8Array_size_0=function(){return a.asm.emscripten_bind_DracoInt8Array_size_0.apply(null,arguments)},Vb=a._emscripten_bind_DracoInt8Array___destroy___0=function(){return a.asm.emscripten_bind_DracoInt8Array___destroy___0.apply(null, 44 | arguments)},Xa=a._emscripten_bind_MetadataQuerier_MetadataQuerier_0=function(){return a.asm.emscripten_bind_MetadataQuerier_MetadataQuerier_0.apply(null,arguments)},Wb=a._emscripten_bind_MetadataQuerier_HasEntry_2=function(){return a.asm.emscripten_bind_MetadataQuerier_HasEntry_2.apply(null,arguments)},Xb=a._emscripten_bind_MetadataQuerier_GetIntEntry_2=function(){return a.asm.emscripten_bind_MetadataQuerier_GetIntEntry_2.apply(null,arguments)},Yb=a._emscripten_bind_MetadataQuerier_GetIntEntryArray_3= 45 | function(){return a.asm.emscripten_bind_MetadataQuerier_GetIntEntryArray_3.apply(null,arguments)},Zb=a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=function(){return a.asm.emscripten_bind_MetadataQuerier_GetDoubleEntry_2.apply(null,arguments)},$b=a._emscripten_bind_MetadataQuerier_GetStringEntry_2=function(){return a.asm.emscripten_bind_MetadataQuerier_GetStringEntry_2.apply(null,arguments)},ac=a._emscripten_bind_MetadataQuerier_NumEntries_1=function(){return a.asm.emscripten_bind_MetadataQuerier_NumEntries_1.apply(null, 46 | arguments)},bc=a._emscripten_bind_MetadataQuerier_GetEntryName_2=function(){return a.asm.emscripten_bind_MetadataQuerier_GetEntryName_2.apply(null,arguments)},cc=a._emscripten_bind_MetadataQuerier___destroy___0=function(){return a.asm.emscripten_bind_MetadataQuerier___destroy___0.apply(null,arguments)},Ya=a._emscripten_bind_DracoInt16Array_DracoInt16Array_0=function(){return a.asm.emscripten_bind_DracoInt16Array_DracoInt16Array_0.apply(null,arguments)},dc=a._emscripten_bind_DracoInt16Array_GetValue_1= 47 | function(){return a.asm.emscripten_bind_DracoInt16Array_GetValue_1.apply(null,arguments)},ec=a._emscripten_bind_DracoInt16Array_size_0=function(){return a.asm.emscripten_bind_DracoInt16Array_size_0.apply(null,arguments)},fc=a._emscripten_bind_DracoInt16Array___destroy___0=function(){return a.asm.emscripten_bind_DracoInt16Array___destroy___0.apply(null,arguments)},Za=a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=function(){return a.asm.emscripten_bind_DracoFloat32Array_DracoFloat32Array_0.apply(null, 48 | arguments)},gc=a._emscripten_bind_DracoFloat32Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoFloat32Array_GetValue_1.apply(null,arguments)},hc=a._emscripten_bind_DracoFloat32Array_size_0=function(){return a.asm.emscripten_bind_DracoFloat32Array_size_0.apply(null,arguments)},ic=a._emscripten_bind_DracoFloat32Array___destroy___0=function(){return a.asm.emscripten_bind_DracoFloat32Array___destroy___0.apply(null,arguments)},$a=a._emscripten_bind_GeometryAttribute_GeometryAttribute_0=function(){return a.asm.emscripten_bind_GeometryAttribute_GeometryAttribute_0.apply(null, 49 | arguments)},jc=a._emscripten_bind_GeometryAttribute___destroy___0=function(){return a.asm.emscripten_bind_GeometryAttribute___destroy___0.apply(null,arguments)},ab=a._emscripten_bind_DecoderBuffer_DecoderBuffer_0=function(){return a.asm.emscripten_bind_DecoderBuffer_DecoderBuffer_0.apply(null,arguments)},kc=a._emscripten_bind_DecoderBuffer_Init_2=function(){return a.asm.emscripten_bind_DecoderBuffer_Init_2.apply(null,arguments)},lc=a._emscripten_bind_DecoderBuffer___destroy___0=function(){return a.asm.emscripten_bind_DecoderBuffer___destroy___0.apply(null, 50 | arguments)},bb=a._emscripten_bind_Decoder_Decoder_0=function(){return a.asm.emscripten_bind_Decoder_Decoder_0.apply(null,arguments)},mc=a._emscripten_bind_Decoder_GetEncodedGeometryType_1=function(){return a.asm.emscripten_bind_Decoder_GetEncodedGeometryType_1.apply(null,arguments)},nc=a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2=function(){return a.asm.emscripten_bind_Decoder_DecodeBufferToPointCloud_2.apply(null,arguments)},oc=a._emscripten_bind_Decoder_DecodeBufferToMesh_2=function(){return a.asm.emscripten_bind_Decoder_DecodeBufferToMesh_2.apply(null, 51 | arguments)},pc=a._emscripten_bind_Decoder_GetAttributeId_2=function(){return a.asm.emscripten_bind_Decoder_GetAttributeId_2.apply(null,arguments)},qc=a._emscripten_bind_Decoder_GetAttributeIdByName_2=function(){return a.asm.emscripten_bind_Decoder_GetAttributeIdByName_2.apply(null,arguments)},rc=a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3.apply(null,arguments)},sc=a._emscripten_bind_Decoder_GetAttribute_2= 52 | function(){return a.asm.emscripten_bind_Decoder_GetAttribute_2.apply(null,arguments)},tc=a._emscripten_bind_Decoder_GetAttributeByUniqueId_2=function(){return a.asm.emscripten_bind_Decoder_GetAttributeByUniqueId_2.apply(null,arguments)},uc=a._emscripten_bind_Decoder_GetMetadata_1=function(){return a.asm.emscripten_bind_Decoder_GetMetadata_1.apply(null,arguments)},vc=a._emscripten_bind_Decoder_GetAttributeMetadata_2=function(){return a.asm.emscripten_bind_Decoder_GetAttributeMetadata_2.apply(null, 53 | arguments)},wc=a._emscripten_bind_Decoder_GetFaceFromMesh_3=function(){return a.asm.emscripten_bind_Decoder_GetFaceFromMesh_3.apply(null,arguments)},xc=a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=function(){return a.asm.emscripten_bind_Decoder_GetTriangleStripsFromMesh_2.apply(null,arguments)},yc=a._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=function(){return a.asm.emscripten_bind_Decoder_GetTrianglesUInt16Array_3.apply(null,arguments)},zc=a._emscripten_bind_Decoder_GetTrianglesUInt32Array_3= 54 | function(){return a.asm.emscripten_bind_Decoder_GetTrianglesUInt32Array_3.apply(null,arguments)},Ac=a._emscripten_bind_Decoder_GetAttributeFloat_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeFloat_3.apply(null,arguments)},Bc=a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3.apply(null,arguments)},Cc=a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeIntForAllPoints_3.apply(null, 55 | arguments)},Dc=a._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3.apply(null,arguments)},Ec=a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3.apply(null,arguments)},Fc=a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3.apply(null,arguments)}, 56 | Gc=a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3.apply(null,arguments)},Hc=a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3.apply(null,arguments)},Ic=a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=function(){return a.asm.emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3.apply(null,arguments)},Jc= 57 | a._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=function(){return a.asm.emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5.apply(null,arguments)},Kc=a._emscripten_bind_Decoder_SkipAttributeTransform_1=function(){return a.asm.emscripten_bind_Decoder_SkipAttributeTransform_1.apply(null,arguments)},Lc=a._emscripten_bind_Decoder___destroy___0=function(){return a.asm.emscripten_bind_Decoder___destroy___0.apply(null,arguments)},cb=a._emscripten_bind_Mesh_Mesh_0=function(){return a.asm.emscripten_bind_Mesh_Mesh_0.apply(null, 58 | arguments)},Mc=a._emscripten_bind_Mesh_num_faces_0=function(){return a.asm.emscripten_bind_Mesh_num_faces_0.apply(null,arguments)},Nc=a._emscripten_bind_Mesh_num_attributes_0=function(){return a.asm.emscripten_bind_Mesh_num_attributes_0.apply(null,arguments)},Oc=a._emscripten_bind_Mesh_num_points_0=function(){return a.asm.emscripten_bind_Mesh_num_points_0.apply(null,arguments)},Pc=a._emscripten_bind_Mesh___destroy___0=function(){return a.asm.emscripten_bind_Mesh___destroy___0.apply(null,arguments)}, 59 | Qc=a._emscripten_bind_VoidPtr___destroy___0=function(){return a.asm.emscripten_bind_VoidPtr___destroy___0.apply(null,arguments)},db=a._emscripten_bind_DracoInt32Array_DracoInt32Array_0=function(){return a.asm.emscripten_bind_DracoInt32Array_DracoInt32Array_0.apply(null,arguments)},Rc=a._emscripten_bind_DracoInt32Array_GetValue_1=function(){return a.asm.emscripten_bind_DracoInt32Array_GetValue_1.apply(null,arguments)},Sc=a._emscripten_bind_DracoInt32Array_size_0=function(){return a.asm.emscripten_bind_DracoInt32Array_size_0.apply(null, 60 | arguments)},Tc=a._emscripten_bind_DracoInt32Array___destroy___0=function(){return a.asm.emscripten_bind_DracoInt32Array___destroy___0.apply(null,arguments)},eb=a._emscripten_bind_Metadata_Metadata_0=function(){return a.asm.emscripten_bind_Metadata_Metadata_0.apply(null,arguments)},Uc=a._emscripten_bind_Metadata___destroy___0=function(){return a.asm.emscripten_bind_Metadata___destroy___0.apply(null,arguments)},Vc=a._emscripten_enum_draco_StatusCode_OK=function(){return a.asm.emscripten_enum_draco_StatusCode_OK.apply(null, 61 | arguments)},Wc=a._emscripten_enum_draco_StatusCode_DRACO_ERROR=function(){return a.asm.emscripten_enum_draco_StatusCode_DRACO_ERROR.apply(null,arguments)},Xc=a._emscripten_enum_draco_StatusCode_IO_ERROR=function(){return a.asm.emscripten_enum_draco_StatusCode_IO_ERROR.apply(null,arguments)},Yc=a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER=function(){return a.asm.emscripten_enum_draco_StatusCode_INVALID_PARAMETER.apply(null,arguments)},Zc=a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION= 62 | function(){return a.asm.emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION.apply(null,arguments)},$c=a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=function(){return a.asm.emscripten_enum_draco_StatusCode_UNKNOWN_VERSION.apply(null,arguments)},ad=a._emscripten_enum_draco_DataType_DT_INVALID=function(){return a.asm.emscripten_enum_draco_DataType_DT_INVALID.apply(null,arguments)},bd=a._emscripten_enum_draco_DataType_DT_INT8=function(){return a.asm.emscripten_enum_draco_DataType_DT_INT8.apply(null, 63 | arguments)},cd=a._emscripten_enum_draco_DataType_DT_UINT8=function(){return a.asm.emscripten_enum_draco_DataType_DT_UINT8.apply(null,arguments)},dd=a._emscripten_enum_draco_DataType_DT_INT16=function(){return a.asm.emscripten_enum_draco_DataType_DT_INT16.apply(null,arguments)},ed=a._emscripten_enum_draco_DataType_DT_UINT16=function(){return a.asm.emscripten_enum_draco_DataType_DT_UINT16.apply(null,arguments)},fd=a._emscripten_enum_draco_DataType_DT_INT32=function(){return a.asm.emscripten_enum_draco_DataType_DT_INT32.apply(null, 64 | arguments)},gd=a._emscripten_enum_draco_DataType_DT_UINT32=function(){return a.asm.emscripten_enum_draco_DataType_DT_UINT32.apply(null,arguments)},hd=a._emscripten_enum_draco_DataType_DT_INT64=function(){return a.asm.emscripten_enum_draco_DataType_DT_INT64.apply(null,arguments)},id=a._emscripten_enum_draco_DataType_DT_UINT64=function(){return a.asm.emscripten_enum_draco_DataType_DT_UINT64.apply(null,arguments)},jd=a._emscripten_enum_draco_DataType_DT_FLOAT32=function(){return a.asm.emscripten_enum_draco_DataType_DT_FLOAT32.apply(null, 65 | arguments)},kd=a._emscripten_enum_draco_DataType_DT_FLOAT64=function(){return a.asm.emscripten_enum_draco_DataType_DT_FLOAT64.apply(null,arguments)},ld=a._emscripten_enum_draco_DataType_DT_BOOL=function(){return a.asm.emscripten_enum_draco_DataType_DT_BOOL.apply(null,arguments)},md=a._emscripten_enum_draco_DataType_DT_TYPES_COUNT=function(){return a.asm.emscripten_enum_draco_DataType_DT_TYPES_COUNT.apply(null,arguments)},nd=a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=function(){return a.asm.emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE.apply(null, 66 | arguments)},od=a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=function(){return a.asm.emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD.apply(null,arguments)},pd=a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=function(){return a.asm.emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH.apply(null,arguments)},qd=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=function(){return a.asm.emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM.apply(null, 67 | arguments)},rd=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=function(){return a.asm.emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM.apply(null,arguments)},sd=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=function(){return a.asm.emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM.apply(null,arguments)},td=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=function(){return a.asm.emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM.apply(null, 68 | arguments)},ud=a._emscripten_enum_draco_GeometryAttribute_Type_INVALID=function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_INVALID.apply(null,arguments)},vd=a._emscripten_enum_draco_GeometryAttribute_Type_POSITION=function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_POSITION.apply(null,arguments)},wd=a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_NORMAL.apply(null,arguments)},xd=a._emscripten_enum_draco_GeometryAttribute_Type_COLOR= 69 | function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_COLOR.apply(null,arguments)},yd=a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD.apply(null,arguments)},zd=a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=function(){return a.asm.emscripten_enum_draco_GeometryAttribute_Type_GENERIC.apply(null,arguments)};a._setThrew=function(){return a.asm.setThrew.apply(null,arguments)};var ta=a.__ZSt18uncaught_exceptionv= 70 | function(){return a.asm._ZSt18uncaught_exceptionv.apply(null,arguments)};a._free=function(){return a.asm.free.apply(null,arguments)};var ib=a._malloc=function(){return a.asm.malloc.apply(null,arguments)};a.stackSave=function(){return a.asm.stackSave.apply(null,arguments)};a.stackAlloc=function(){return a.asm.stackAlloc.apply(null,arguments)};a.stackRestore=function(){return a.asm.stackRestore.apply(null,arguments)};a.__growWasmMemory=function(){return a.asm.__growWasmMemory.apply(null,arguments)}; 71 | a.dynCall_ii=function(){return a.asm.dynCall_ii.apply(null,arguments)};a.dynCall_vi=function(){return a.asm.dynCall_vi.apply(null,arguments)};a.dynCall_iii=function(){return a.asm.dynCall_iii.apply(null,arguments)};a.dynCall_vii=function(){return a.asm.dynCall_vii.apply(null,arguments)};a.dynCall_iiii=function(){return a.asm.dynCall_iiii.apply(null,arguments)};a.dynCall_v=function(){return a.asm.dynCall_v.apply(null,arguments)};a.dynCall_viii=function(){return a.asm.dynCall_viii.apply(null,arguments)}; 72 | a.dynCall_viiii=function(){return a.asm.dynCall_viiii.apply(null,arguments)};a.dynCall_iiiiiii=function(){return a.asm.dynCall_iiiiiii.apply(null,arguments)};a.dynCall_iidiiii=function(){return a.asm.dynCall_iidiiii.apply(null,arguments)};a.dynCall_jiji=function(){return a.asm.dynCall_jiji.apply(null,arguments)};a.dynCall_viiiiii=function(){return a.asm.dynCall_viiiiii.apply(null,arguments)};a.dynCall_viiiii=function(){return a.asm.dynCall_viiiii.apply(null,arguments)};a.asm=La;var fa;a.then=function(e){if(fa)e(a); 73 | else{var c=a.onRuntimeInitialized;a.onRuntimeInitialized=function(){c&&c();e(a)}}return a};ja=function c(){fa||ma();fa||(ja=c)};a.run=ma;if(a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);0=n.size?(t(0>=1;break;case 4:d>>=2;break;case 8:d>>=3}for(var c=0;c