minerender 2.1.0-alpha.0 → 2.1.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +0 -2
  2. package/dist/browser/index.d.mts +106 -84
  3. package/dist/browser/index.d.ts +106 -84
  4. package/dist/browser/index.js +1094 -968
  5. package/dist/browser/index.js.map +1 -1
  6. package/dist/browser/index.mjs +1107 -981
  7. package/dist/browser/index.mjs.map +1 -1
  8. package/dist/bundle.js +1045 -921
  9. package/dist/bundle.js.map +1 -1
  10. package/dist/node/index.d.mts +106 -84
  11. package/dist/node/index.d.ts +106 -84
  12. package/dist/node/index.js +1100 -970
  13. package/dist/node/index.js.map +1 -1
  14. package/dist/node/index.mjs +1112 -982
  15. package/dist/node/index.mjs.map +1 -1
  16. package/package.json +5 -5
  17. package/.worktrees/jobqu-review/LICENSE +0 -21
  18. package/.worktrees/jobqu-review/README.md +0 -176
  19. package/.worktrees/v2-asset-sources/LICENSE +0 -21
  20. package/.worktrees/v2-asset-sources/README.md +0 -30
  21. package/.worktrees/v2-asset-sources/examples/script-tag/README.md +0 -13
  22. package/.worktrees/v2-asset-sources/examples/vite/README.md +0 -13
  23. package/.worktrees/v2-asset-sources/packages/minerender/LICENSE +0 -21
  24. package/.worktrees/v2-asset-sources/packages/minerender/README.md +0 -24
  25. package/.worktrees/v2-brightness/LICENSE +0 -21
  26. package/.worktrees/v2-brightness/README.md +0 -30
  27. package/.worktrees/v2-brightness/examples/script-tag/README.md +0 -13
  28. package/.worktrees/v2-brightness/examples/vite/README.md +0 -13
  29. package/.worktrees/v2-brightness/packages/minerender/LICENSE +0 -21
  30. package/.worktrees/v2-brightness/packages/minerender/README.md +0 -24
  31. package/.worktrees/v2-cache-recovery/LICENSE +0 -21
  32. package/.worktrees/v2-cache-recovery/README.md +0 -30
  33. package/.worktrees/v2-cache-recovery/examples/script-tag/README.md +0 -13
  34. package/.worktrees/v2-cache-recovery/examples/vite/README.md +0 -13
  35. package/.worktrees/v2-cache-recovery/packages/minerender/LICENSE +0 -21
  36. package/.worktrees/v2-cache-recovery/packages/minerender/README.md +0 -24
  37. package/.worktrees/v2-ci-stack/LICENSE +0 -21
  38. package/.worktrees/v2-ci-stack/README.md +0 -109
  39. package/.worktrees/v2-ci-stack/examples/script-tag/README.md +0 -15
  40. package/.worktrees/v2-ci-stack/examples/vite/README.md +0 -15
  41. package/.worktrees/v2-ci-stack/packages/minerender/LICENSE +0 -21
  42. package/.worktrees/v2-ci-stack/packages/minerender/README.md +0 -11
  43. package/.worktrees/v2-ci-typescript/LICENSE +0 -21
  44. package/.worktrees/v2-ci-typescript/README.md +0 -11
  45. package/.worktrees/v2-controls/LICENSE +0 -21
  46. package/.worktrees/v2-controls/README.md +0 -30
  47. package/.worktrees/v2-controls/examples/script-tag/README.md +0 -13
  48. package/.worktrees/v2-controls/examples/vite/README.md +0 -13
  49. package/.worktrees/v2-controls/packages/minerender/LICENSE +0 -21
  50. package/.worktrees/v2-controls/packages/minerender/README.md +0 -24
  51. package/.worktrees/v2-dependencies/LICENSE +0 -21
  52. package/.worktrees/v2-dependencies/README.md +0 -30
  53. package/.worktrees/v2-dependencies/examples/script-tag/README.md +0 -13
  54. package/.worktrees/v2-dependencies/examples/vite/README.md +0 -13
  55. package/.worktrees/v2-dependencies/packages/minerender/LICENSE +0 -21
  56. package/.worktrees/v2-dependencies/packages/minerender/README.md +0 -24
  57. package/.worktrees/v2-frame-limit/LICENSE +0 -21
  58. package/.worktrees/v2-frame-limit/README.md +0 -30
  59. package/.worktrees/v2-frame-limit/examples/script-tag/README.md +0 -13
  60. package/.worktrees/v2-frame-limit/examples/vite/README.md +0 -13
  61. package/.worktrees/v2-frame-limit/packages/minerender/LICENSE +0 -21
  62. package/.worktrees/v2-frame-limit/packages/minerender/README.md +0 -24
  63. package/.worktrees/v2-images/LICENSE +0 -21
  64. package/.worktrees/v2-images/README.md +0 -30
  65. package/.worktrees/v2-images/examples/script-tag/README.md +0 -13
  66. package/.worktrees/v2-images/examples/vite/README.md +0 -13
  67. package/.worktrees/v2-images/packages/minerender/LICENSE +0 -21
  68. package/.worktrees/v2-images/packages/minerender/README.md +0 -24
  69. package/.worktrees/v2-lifecycle/LICENSE +0 -21
  70. package/.worktrees/v2-lifecycle/README.md +0 -30
  71. package/.worktrees/v2-lifecycle/examples/script-tag/README.md +0 -13
  72. package/.worktrees/v2-lifecycle/examples/vite/README.md +0 -13
  73. package/.worktrees/v2-lifecycle/packages/minerender/LICENSE +0 -21
  74. package/.worktrees/v2-lifecycle/packages/minerender/README.md +0 -24
  75. package/.worktrees/v2-main-conflicts/LICENSE +0 -21
  76. package/.worktrees/v2-main-conflicts/README.md +0 -11
  77. package/.worktrees/v2-monorepo/LICENSE +0 -21
  78. package/.worktrees/v2-monorepo/README.md +0 -30
  79. package/.worktrees/v2-monorepo/examples/script-tag/README.md +0 -13
  80. package/.worktrees/v2-monorepo/examples/vite/README.md +0 -13
  81. package/.worktrees/v2-monorepo/packages/minerender/LICENSE +0 -21
  82. package/.worktrees/v2-monorepo/packages/minerender/README.md +0 -24
  83. package/.worktrees/v2-requests/LICENSE +0 -21
  84. package/.worktrees/v2-requests/README.md +0 -30
  85. package/.worktrees/v2-requests/examples/script-tag/README.md +0 -13
  86. package/.worktrees/v2-requests/examples/vite/README.md +0 -13
  87. package/.worktrees/v2-requests/packages/minerender/LICENSE +0 -21
  88. package/.worktrees/v2-requests/packages/minerender/README.md +0 -26
  89. package/.worktrees/v2-source-errors/LICENSE +0 -21
  90. package/.worktrees/v2-source-errors/README.md +0 -30
  91. package/.worktrees/v2-source-errors/examples/script-tag/README.md +0 -13
  92. package/.worktrees/v2-source-errors/examples/vite/README.md +0 -13
  93. package/.worktrees/v2-source-errors/packages/minerender/LICENSE +0 -21
  94. package/.worktrees/v2-source-errors/packages/minerender/README.md +0 -26
@@ -1 +1 @@
1
- {"version":3,"sources":["../../node_modules/ts-deepmerge/src/index.ts","../../src/env/node/NodeEnv.ts","../../src/Env.ts","../../src/cache/PersistentCache.ts","../../src/env/node/NodeCache.ts","../../src/env/node/register.ts","../../src/Axis.ts","../../src/CubeFace.ts","../../src/Disposable.ts","../../src/Geometries.ts","../../src/util/util.ts","../../src/cache/CacheKey.ts","../../src/cache/Caching.ts","../../src/Materials.ts","../../src/texture/Textures.ts","../../src/texture/TextureLoader.ts","../../src/canvas/CanvasCompat.ts","../../src/request/Requests.ts","../../src/util/log.ts","../../src/util/BatchedExecutor.ts","../../src/util/model.ts","../../src/util/performance.ts","../../src/util/three.ts","../../src/WrappedImage.ts","../../src/image/ImageLoader.ts","../../src/Meshes.ts","../../src/UVMapper.ts","../../src/model/ModelMerger.ts","../../src/assets/AssetKey.ts","../../src/assets/Models.ts","../../src/assets/source/parser/AssetParsers.ts","../../src/assets/BlockStates.ts","../../src/assets/Assets.ts","../../src/assets/source/AssetSource.ts","../../src/nbt/NBTHelper.ts","../../src/assets/source/HostedAssetSource.ts","../../src/assets/source/archive/BrowserArchiveProxy.ts","../../src/assets/source/archive/ArchiveAssetSource.ts","../../src/assets/AssetLoader.ts","../../src/assets/ModelTextures.ts","../../src/canvas/CanvasImage.ts","../../src/Ticker.ts","../../src/texture/TextureAtlas.ts","../../src/model/ModelGenerator.ts","../../src/MinecraftCubeTexture.ts","../../src/SceneStats.ts","../../src/TintColors.ts","../../src/Transformable.ts","../../src/shutdown.ts","../../src/assets/Entities.ts","../../src/renderer/SceneObject.ts","../../src/instance/InstanceReference.ts","../../src/error/MineRenderError.ts","../../src/entity/scene/EntityObject.ts","../../src/gui/scene/GuiObject.ts","../../src/inspector/SceneInspector.ts","../../src/inspector/SceneStatsDisplay.ts","../../src/instance/InstanceManager.ts","../../src/instance/Instanceable.ts","../../src/model/DisplayPosition.ts","../../src/model/GuiLight.ts","../../src/model/Model.ts","../../src/model/scene/ModelObject.ts","../../src/three/BufferGeometryUtils.js","../../src/model/block/scene/BlockObject.ts","../../src/model/multiblock/SchematicParser.ts","../../src/model/multiblock/StructureParser.ts","../../src/renderer/MineRenderScene.ts","../../src/skin/SkinPart.ts","../../src/skin/SkinTextureCoordinates.ts","../../src/skin/SkinGeometries.ts","../../src/skin/scene/SkinObject.ts","../../src/renderer/Renderer.ts","../../src/skin/Skins.ts","../../src/three/OrbitControls.js","../../src/world/Chunk.ts","../../src/world/MineRenderWorld.ts"],"sourcesContent":[null,"import * as nodeCanvas from \"canvas\";\nimport imageSize from \"image-size\";\nimport NodePersist from \"node-persist\";\nimport { Env, EnvProvider, ImageSizeInfo } from \"../../Env\";\nimport type { CompatCanvas, CompatImage } from \"../../canvas/CanvasCompat\";\nimport type { PersistentCache } from \"../../cache/PersistentCache\";\nimport { NodeCache } from \"./NodeCache\";\n\n/**\n * {@link EnvProvider} for headless Node.\n *\n * This is the only place in the library allowed to reach for Node-only modules. Nothing here may\n * be imported from `src/index.ts` - it is reachable exclusively through the `src/index.node.ts`\n * entry, which is what keeps `canvas` and friends out of the browser bundle.\n *\n * `canvas` is an optional dependency: browser-only consumers never install its native binary.\n * Importing this module without it will fail, which is intended - rasterisation under Node needs it.\n */\nexport class NodeEnv implements EnvProvider {\n\n public readonly name = \"node\";\n\n createCanvas(width: number, height: number): CompatCanvas {\n return nodeCanvas.createCanvas(width, height);\n }\n\n createImage(width?: number, height?: number): CompatImage {\n const image = new nodeCanvas.Image();\n if (width) image.width = width;\n if (height) image.height = height;\n return image;\n }\n\n imageSize(data: Uint8Array): ImageSizeInfo {\n return imageSize(Buffer.isBuffer(data) ? data : Buffer.from(data));\n }\n\n openCache(name: string, version: number): PersistentCache {\n return new NodeCache(NodePersist.create({\n dir: name + version,\n encoding: \"utf8\"\n }));\n }\n\n}\n\nexport function registerNodeEnv(): NodeEnv {\n const env = new NodeEnv();\n Env.register(env);\n return env;\n}\n","import type { CompatCanvas, CompatImage } from \"./canvas/CanvasCompat\";\nimport type { PersistentCache } from \"./cache/PersistentCache\";\n\n/**\n * Dimensions probed from raw, still-encoded image bytes.\n * Mirrors the subset of `image-size`'s result that MineRender actually uses.\n */\nexport interface ImageSizeInfo {\n width?: number;\n height?: number;\n type?: string;\n}\n\n/**\n * Everything MineRender needs from the platform it is running on.\n *\n * This is the seam between the browser and Node builds: core code only ever talks to the\n * registered provider, so nothing outside of `src/env/node/` may reference a Node-only module\n * (`canvas`, `node-persist`, `image-size`, `fs`, …). Keeping that rule is what allows the browser\n * bundle to be built without Node polyfills.\n */\nexport interface EnvProvider {\n\n readonly name: string;\n\n createCanvas(width: number, height: number): CompatCanvas;\n\n createImage(width?: number, height?: number): CompatImage;\n\n /** Read width/height out of encoded image bytes without fully decoding them. */\n imageSize(data: Uint8Array): ImageSizeInfo;\n\n openCache(name: string, version: number): PersistentCache;\n\n}\n\n/**\n * Registry holding the active {@link EnvProvider}.\n *\n * The `minerender` package entries register one for you — importing the library through its\n * `exports` map gets you the browser provider in bundlers and the Node provider under Node.\n * Only call {@link Env.register} directly if you are embedding MineRender in an exotic host.\n */\nexport class Env {\n\n private static _provider: EnvProvider | undefined;\n\n public static register(provider: EnvProvider): void {\n this._provider = provider;\n }\n\n public static get registered(): boolean {\n return typeof this._provider !== \"undefined\";\n }\n\n public static get provider(): EnvProvider {\n const provider = this._provider;\n if (!provider) {\n throw new Error(\n \"MineRender has no environment provider registered. Import the package itself \" +\n \"(\\\"minerender\\\") rather than a file inside dist/, or register one yourself via \" +\n \"Env.register(...).\"\n );\n }\n return provider;\n }\n\n}\n","import { Env } from \"../Env\";\n\n/**\n * Key/value store that survives a page reload or process restart.\n *\n * The concrete backing store is supplied by the active {@link EnvProvider} - `localforage`\n * (IndexedDB) in the browser, `node-persist` (disk) under Node - so this file itself stays\n * free of any platform-specific import.\n */\nexport abstract class PersistentCache<B = unknown> {\n\n /** Bump to invalidate every persisted entry. */\n public static readonly VERSION = 1;\n\n public static open(name: string): PersistentCache {\n return Env.provider.openCache(name, PersistentCache.VERSION);\n }\n\n protected constructor(readonly backing: B) {\n }\n\n abstract get<T>(key: string): Promise<T>;\n\n async getOrLoad<T>(key: string, loader: (key: string) => Promise<T>): Promise<T> {\n let v = await this.get<T>(key);\n if (typeof v === \"undefined\" || v === null) {\n v = await loader(key);\n await this.put<T>(key, v);\n }\n return v;\n }\n\n abstract put<T>(key: string, value: T): Promise<T>;\n\n abstract delete<T>(key: string): Promise<void>;\n\n abstract clear(): Promise<void> ;\n\n abstract length(): Promise<number> ;\n\n abstract keys(): Promise<string[]>;\n\n abstract forEach<T>(callback: (v: T, k: string) => void): Promise<void>;\n\n}\n","import type { LocalStorage } from \"node-persist\";\nimport { PersistentCache } from \"../../cache/PersistentCache\";\n\n/**\n * {@link PersistentCache} backed by node-persist (one directory of JSON files per cache).\n *\n * node-persist requires an explicit `init()` before any read or write; that is done lazily on\n * first access so that merely constructing the cache stays free of filesystem side effects.\n */\nexport class NodeCache extends PersistentCache<LocalStorage> {\n\n private initialized: Promise<unknown> | undefined;\n\n constructor(backing: LocalStorage) {\n super(backing);\n }\n\n private ready(): Promise<unknown> {\n return this.initialized ??= this.backing.init();\n }\n\n async get<T>(key: string): Promise<T> {\n await this.ready();\n return this.backing.getItem(key);\n }\n\n async put<T>(key: string, value: T): Promise<T> {\n await this.ready();\n return this.backing.setItem(key, value).then(res => res.content);\n }\n\n async delete<T>(key: string): Promise<void> {\n await this.ready();\n await this.backing.removeItem(key);\n }\n\n async clear(): Promise<void> {\n await this.ready();\n return this.backing.clear();\n }\n\n async length(): Promise<number> {\n await this.ready();\n return this.backing.length();\n }\n\n async keys(): Promise<string[]> {\n await this.ready();\n return this.backing.keys();\n }\n\n async forEach<T>(callback: (v: T, k: string) => void): Promise<void> {\n await this.ready();\n return this.backing.forEach(d => {\n callback(d.value, d.key);\n });\n }\n\n}\n","import { registerNodeEnv } from \"./NodeEnv\";\n\n// Side-effect module: importing it installs the Node provider. Kept separate from NodeEnv.ts so\n// entries can guarantee registration happens before anything else evaluates.\nregisterNodeEnv();\n\nexport {};\n","import { Vector3 } from \"three\";\n\nexport enum Axis {\n X = \"X\",\n Y = \"y\",\n Z = \"z\"\n}\n\nexport const AXES = Object.values(Axis);\n\nexport function axisToVec3(axis: Axis): Vector3 {\n switch (axis) {\n case Axis.X:\n return new Vector3(1, 0, 0);\n case Axis.Y:\n return new Vector3(0, 1, 0);\n case Axis.Z:\n return new Vector3(0, 0, 1);\n }\n}\n","export enum CubeFace {\n EAST = \"east\", // px\n WEST = \"west\", // nx\n UP = \"up\", // py\n DOWN = \"down\", // ny\n SOUTH = \"south\", // pz\n NORTH = \"north\", // nz\n}\n\nexport enum CubeFaceIndex {\n EAST,\n WEST,\n UP,\n DOWN,\n SOUTH,\n NORTH\n}\n\nexport const CUBE_FACES = Object.values(CubeFace);\n\n","export interface Disposable {\n dispose(): void;\n}\n\nexport function isDisposable(obj: any): obj is Disposable {\n return 'dispose' in obj;\n}\n","import { BoxGeometry, BufferAttribute, Float32BufferAttribute } from \"three\";\nimport { BoxGeometryKey, serializeBoxGeometryKey } from \"./cache/CacheKey\";\nimport { Caching } from \"./cache/Caching\";\n\nexport class Geometries {\n\n public static createBox(key: BoxGeometryKey): BoxGeometry {\n const geometry = new BoxGeometry(key.width, key.height, key.depth);\n geometry.computeBoundingBox();\n\n if (key.uv) {\n geometry.setAttribute(\"uv\", new Float32BufferAttribute(key.uv, 2));\n }\n\n\n\n // if (key.coordinates) { // Create UV mappings\n // const w = key.texWidth || 16;\n // const h = key.texHeight || 16;\n //\n // const index = geometry.getIndex();\n // const uvAttributes = geometry.getAttribute(\"uv\");\n //\n // const faceUvs = [];\n // const faceNames = Object.values(CubeFace);\n // let j = 0;\n // for (let i = 0; i < faceNames.length; i++) {\n // const faceName = faceNames[i];\n // const face = key.coordinates[faceName];\n //\n // console.log(faceName);\n // console.log(face)\n //\n // const tx1 = face.x / w;\n // const ty1 = (face.y / h);\n // const tx2 = (face.x + face.w) / w;\n // const ty2 = ((face.y + face.h) / h);\n //\n //\n // uvAttributes.setXY(j + 0, tx1, ty1);\n //\n // uvAttributes.setXY(j + 2, tx2, ty2);\n //\n // // faceUvs[i] = [\n // // new THREE.Vector2(tx1, ty2),\n // // new THREE.Vector2(tx1, ty1),\n // // new THREE.Vector2(tx2, ty1),\n // // new THREE.Vector2(tx2, ty2)\n // // ];\n // //\n // // const flipX = face.fx;\n // // const flipY = face.fy;\n // //\n // // let temp;\n // // if (flipY) {\n // // temp = faceUvs[i].slice(0);\n // // faceUvs[i][0] = temp[2];\n // // faceUvs[i][1] = temp[3];\n // // faceUvs[i][2] = temp[0];\n // // faceUvs[i][3] = temp[1]\n // // }\n // // if (flipX) {\n // // temp = faceUvs[i].slice(0);\n // // faceUvs[i][0] = temp[3];\n // // faceUvs[i][1] = temp[2];\n // // faceUvs[i][2] = temp[1];\n // // faceUvs[i][3] = temp[0]\n // // }\n //\n //\n //\n // j+=4;\n // }\n //\n //\n // for (let i = 0; i < faceUvs.length; i++) {\n // // uvAttributes.array[j] = [faceUvs[i][0], faceUvs[i][1], faceUvs[i][3]];\n // // uvAttributes.array[j + 1] = [faceUvs[i][1], faceUvs[i][2], faceUvs[i][3]];\n // // j += 2;\n // }\n // uvAttributes.needsUpdate = true;\n //\n //\n // }\n\n\n return geometry;\n }\n\n public static getBox(key: BoxGeometryKey): BoxGeometry {\n const keyStr = serializeBoxGeometryKey(key)\n return Caching.boxGeometryCache.get(keyStr, k => {\n return Geometries.createBox(key);\n })!;\n }\n\n}\n\n\n","// `crypto-js/core` was imported separately here, but that deep path is unresolvable under Node's\n// ESM loader (crypto-js has no exports map and the specifier carries no extension). The main\n// entry exposes `enc` just the same.\nimport * as CryptoJS from \"crypto-js\";\nimport { Vector3 } from \"three\";\n\nexport const changeEvent = { type: 'change'};\n\nexport type Maybe<T> = T | undefined;\n\n// crypto-js runs identically in both environments, so these deliberately do not go through Env -\n// using it here would pull Node's `crypto` into the browser graph for no benefit.\n\nexport function md5(str: string): string {\n return CryptoJS.MD5(str).toString(CryptoJS.enc.Hex);\n}\n\nexport function sha1(str: string): string {\n return CryptoJS.SHA1(str).toString(CryptoJS.enc.Hex);\n}\n\nexport function sha256(str: string): string {\n return CryptoJS.SHA256(str).toString(CryptoJS.enc.Hex);\n}\n\nexport function sha512(str: string): string {\n return CryptoJS.SHA512(str).toString(CryptoJS.enc.Hex);\n}\n\nexport function base64encode(str: string): string {\n if (typeof btoa !== \"undefined\") {\n return btoa(str);\n }\n return Buffer.from(str).toString(\"base64\");\n}\n\nexport function base64decode(str: string): string {\n if (typeof atob !== \"undefined\") {\n return atob(str);\n }\n return Buffer.from(str, \"base64\").toString(\"ascii\");\n}\n\nexport function toRadians(degrees: number): number {\n return degrees * Math.PI / 180;\n}\n\nexport function toDegrees(radians: number): number {\n return radians * 180 / Math.PI;\n}\n\nexport async function sleep(timeout: number): Promise<void> {\n return new Promise(resolve => {\n setTimeout(() => resolve(), timeout);\n });\n}\n\nexport function clampRotationDegrees(deg: number): number {\n return deg % 360;\n}\n\nexport function isVector3(obj: any): obj is Vector3 {\n return (<Vector3>obj).isVector3;\n}\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: DeepPartial<T[P]>;\n};\n","import { PixelFormat } from \"three\";\nimport { md5 } from \"../util/util\";\n\nexport type CacheKey = string;\n\nexport interface RawImageKey {\n src: string;\n}\n\nexport function serializeImageKey(key: RawImageKey): string {\n return md5(key.src);\n}\n\n// export function parseImageKey(key: string): RawImageKey {\n// return {\n// src: base64decode(key)\n// };\n// }\n\n///\n\nexport interface BoxGeometryKey {\n width: number;\n height: number;\n depth: number;\n uv?: number[];\n}\n\nexport function serializeBoxGeometryKey(key: BoxGeometryKey): string {\n return md5([key.width, key.height, key.depth, key.uv?.join(\":\")].join(\"_\"));\n}\n\n// export function parseBoxGeometryKey(key: string): BoxGeometryKey {\n// let [width, height, depth, uvS] = base64decode(key).split(\"_\");\n// let uv = uvS.split(\":\").map(s => +s);\n// return {\n// width: +width,\n// height: +height,\n// depth: +depth,\n// uv\n// }\n// }\n\n///\n\nexport interface TextureKey extends RawImageKey {\n format?: PixelFormat;\n rotation?: number;\n}\n\nexport function serializeTextureKey(key: TextureKey): string {\n return md5([key.src, key.format, key.rotation].join(\"$\"));\n}\n\n// export function parseTextureGeometryKey(key: string): TextureKey {\n// let [src, format] = base64decode(key).split(\"$\");\n// return {\n// src,\n// format: +format\n// }\n// }\n\n///\n\nexport interface MaterialKey {\n texture: TextureKey;\n transparent?: boolean;\n}\n\nexport function serializeMaterialKey(key: MaterialKey): string {\n return md5([serializeTextureKey(key.texture), key.transparent].join(\"~\"));\n}\n\n\n///\n\nexport interface MeshKey {\n geometry: BoxGeometryKey;\n material: MaterialKey;\n}\n\nexport function serializeMeshKey(key: MeshKey): string {\n return md5([serializeBoxGeometryKey(key.geometry), serializeMaterialKey(key.material)].join(\"#\"));\n}\n\n\n///\n\n\n\n","import { AsyncLoadingCache, Caches, Loader, LoadingCache, SimpleCache } from \"@inventivetalent/loading-cache\";\nimport { BoxGeometryKey, CacheKey, serializeBoxGeometryKey, serializeImageKey, TextureKey } from \"./CacheKey\";\nimport { Time } from \"@inventivetalent/time\";\nimport { ImageInfo, ImageLoader } from \"../image/ImageLoader\";\nimport { BoxGeometry, Material, Mesh, PixelFormat, RGBAFormat, Texture } from \"three\";\nimport { Materials } from \"../Materials\";\nimport { CompatImage } from \"../canvas/CanvasCompat\";\nimport { Model, TextureAsset } from \"../model/Model\";\nimport { WrappedImage } from \"../WrappedImage\";\nimport { TextureAtlas } from \"../texture/TextureAtlas\";\nimport { ExtractableImageData } from \"../ExtractableImageData\";\nimport { MinecraftTextureMeta } from \"../MinecraftTextureMeta\";\nimport { BlockStates } from \"../assets/BlockStates\";\nimport { BlockState } from \"../model/block/BlockState\";\n\nexport class Caching {\n\n static readonly rawImageCache: AsyncLoadingCache<CacheKey, ImageInfo> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(5))\n .buildAsync<CacheKey, ImageInfo>();\n static readonly imageDataCache: AsyncLoadingCache<CacheKey, ImageData> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(10))\n .buildAsync<CacheKey, ImageData>();\n static readonly canvasImageDataCache: AsyncLoadingCache<CacheKey, ExtractableImageData> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(10))\n .buildAsync<CacheKey, ExtractableImageData>();\n static readonly wrappedImageCache: AsyncLoadingCache<CacheKey, WrappedImage> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(10))\n .buildAsync<CacheKey, WrappedImage>();\n\n static readonly boxGeometryCache: SimpleCache<CacheKey, BoxGeometry> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(20))\n .build<CacheKey, BoxGeometry>();\n\n static readonly textureCache: SimpleCache<CacheKey, Texture> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .build<CacheKey, Texture>();\n\n static readonly materialCache: SimpleCache<CacheKey, Material> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .build<CacheKey, Material>();\n\n static readonly boxMeshCache: SimpleCache<CacheKey, Mesh> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .build<CacheKey, Mesh>();\n\n static readonly textureAssetCache: AsyncLoadingCache<CacheKey, TextureAsset> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .buildAsync<CacheKey, TextureAsset>();\n static readonly textureMetaCache: AsyncLoadingCache<CacheKey, MinecraftTextureMeta> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .buildAsync<CacheKey, MinecraftTextureMeta>();\n\n static readonly rawModelCache: AsyncLoadingCache<CacheKey, Model> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .buildAsync<CacheKey, Model>();\n static readonly mergedModelCache: AsyncLoadingCache<CacheKey, Model> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .buildAsync<CacheKey, Model>();\n static readonly modelTextureAtlasCache: AsyncLoadingCache<CacheKey, TextureAtlas> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .buildAsync<CacheKey, TextureAtlas>();\n\n static readonly blockStateCache: AsyncLoadingCache<CacheKey, BlockState> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .buildAsync<CacheKey, BlockState>();\n\n\n /** Every cache above, so clear()/end() can never fall out of sync with the field list again. */\n private static get all(): { invalidateAll(): void; end(): void }[] {\n return [\n this.rawImageCache,\n this.imageDataCache,\n this.canvasImageDataCache,\n this.wrappedImageCache,\n this.boxGeometryCache,\n this.textureCache,\n this.materialCache,\n this.boxMeshCache,\n this.textureAssetCache,\n this.textureMetaCache,\n this.rawModelCache,\n this.mergedModelCache,\n this.modelTextureAtlasCache,\n this.blockStateCache\n ];\n }\n\n public static clear() {\n for (const cache of this.all) {\n cache.invalidateAll();\n }\n }\n\n /**\n * Clears every cache and stops its expiry timer.\n *\n * loading-cache reschedules that timer indefinitely, so a Node process will not exit until\n * this is called - see {@link shutdown}.\n */\n public static end() {\n for (const cache of this.all) {\n cache.invalidateAll();\n cache.end();\n }\n }\n\n public static get cacheSizes() {\n return {\n //TODO\n }\n }\n\n}\n\n","import { MaterialKey, serializeMaterialKey } from \"./cache/CacheKey\";\nimport { Color, DoubleSide, FrontSide, Material, MeshBasicMaterial, MeshLambertMaterial, MeshPhongMaterial, MeshStandardMaterial, ShaderMaterial } from \"three\";\nimport { Textures } from \"./texture/Textures\";\nimport { Caching } from \"./cache/Caching\";\nimport { AssetKey } from \"./assets/AssetKey\";\n\nexport class Materials {\n\n private static readonly MISSING_TEXTURE_SRC = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQMAAACQp+OdAAAABlBMVEX/AP8AAACfphTyAAAAFUlEQVQoz2MIhQKGVVAwKjIqQrwIAHRz/wFI17TEAAAAAElFTkSuQmCC\";\n\n // resolved lazily: as a static field this decoded an image the moment the library was\n // imported, which needs both a DOM and an EnvProvider to already be in place\n public static get MISSING_TEXTURE(): Material {\n return Materials.getImage({ texture: { src: Materials.MISSING_TEXTURE_SRC } });\n }\n\n public static createImage(key: MaterialKey): Material {\n //TODO: type from key\n const transparent = key.transparent || false;\n return new MeshBasicMaterial({\n map: Textures.getImage(key.texture),\n transparent: transparent,\n side: transparent ? DoubleSide : FrontSide,\n alphaTest: 0.5\n });\n //TODO: params\n }\n\n\n public static createBasicCanvasMaterial(canvas: HTMLCanvasElement, transparent: boolean = false, shade: boolean = false): Material {\n if (shade) {\n return new MeshStandardMaterial({\n map: Textures.createCanvasTexture(canvas),\n transparent: transparent,\n side: transparent ? DoubleSide : FrontSide,\n alphaTest: 0.5,\n\n })\n }\n return new MeshBasicMaterial({\n map: Textures.createCanvasTexture(canvas),\n transparent: transparent,\n side: transparent ? DoubleSide : FrontSide,\n alphaTest: 0.5,\n\n })\n }\n\n public static createShadedCanvasMaterial(canvas: HTMLCanvasElement, transparent: boolean = false, shade:boolean=false):Material {\n //TODO\n // this might help https://github.com/JannisX11/blockbench/blob/1701f764641376414d29100c4f6c7cd74997fad8/js/preview/canvas.js#L62\n\n\n // Based on https://github.com/JannisX11/blockbench/blob/cc73aa8a9c0494fd9fe1cee4d062d060af4db06d/js/texturing/textures.js#L59\n // + support for instanced meshes\n const vertShader =`\n uniform bool SHADE;\n \n varying vec2 vUv;\n varying float light;\n varying float lift;\n\n float AMBIENT = 0.5;\n float XFAC = -0.15;\n float ZFAC = 0.05;\n\n void main()\n {\n\n if (SHADE) {\n\n vec3 N = vec3( modelMatrix * instanceMatrix * vec4(normal, 0.0) );\n\n float yLight = (1.0+N.y) * 0.5;\n light = yLight * (1.0-AMBIENT) + N.x*N.x * XFAC + N.z*N.z * ZFAC + AMBIENT;\n\n } else {\n\n light = 1.0;\n\n } \n\n if (color.b > 1.1) {\n lift = 0.1;\n } else {\n lift = 0.0;\n }\n \n vUv = uv;\n \n #ifdef USE_INSTANCING\n gl_Position = projectionMatrix * viewMatrix * modelMatrix * instanceMatrix * vec4(position, 1.0);\n #else\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n #endif\n \n }\n `\n const fragShader = `\n #ifdef GL_ES\n precision highp float;\n #endif\n\n uniform sampler2D map;\n\n uniform bool SHADE;\n uniform bool EMISSIVE;\n uniform float BRIGHTNESS;\n\n varying vec2 vUv;\n varying float light;\n varying float lift;\n\n void main(void)\n {\n vec4 color = texture2D(map, vUv);\n \n if (color.a < 0.01) discard;\n\n if (EMISSIVE == false) {\n\n gl_FragColor = vec4(lift + color.rgb * light * BRIGHTNESS, color.a);\n\n } else {\n\n float light2 = (light * BRIGHTNESS) + (1.0 - light * BRIGHTNESS) * (1.0 - color.a);\n gl_FragColor = vec4(lift + color.rgb * light2, 1.0);\n\n }\n }\n `\n //TODO: this does add the MC-like shading, but breaks when stuff is instanced (can't updated position)\n // https://medium.com/@pailhead011/instancing-with-three-js-part-2-3be34ae83c57 might help with that\n\n try {\n return new ShaderMaterial({\n uniforms: {\n SHADE: { value: true },\n BRIGHTNESS: { value: 1 },\n EMISSIVE:{value:false},\n base: { value: new Color(0xc1c1c1)/*TODO*/ },\n map: {value:Textures.createCanvasTexture(canvas)}\n },\n vertexShader: vertShader,\n fragmentShader: fragShader,\n vertexColors: true,\n transparent: transparent,\n side: transparent ? DoubleSide : FrontSide,\n alphaTest: 0.5,\n });\n } catch (e) {\n console.warn(e)\n }\n\n // fallback\n return this.createBasicCanvasMaterial(canvas, transparent, shade);\n }\n\n public static getImage(key: MaterialKey): Material {\n const keyStr = serializeMaterialKey(key);\n return Caching.materialCache.get(keyStr, k => {\n return Materials.createImage(key);\n })!;\n }\n\n public static needsUpdate(mat: Material) {\n mat.needsUpdate = true;\n\n if (mat.type === 'ShaderMaterial') {\n let mat1=mat as ShaderMaterial;\n if (\"map\" in mat1.uniforms) {\n mat1.uniforms.map.value.needsUpdate = true;\n }\n }\n if (mat.type === 'MeshBasicMaterial' || mat.type === 'MeshStandardMaterial') {\n let mat1 = mat as (MeshBasicMaterial | MeshStandardMaterial);\n if (mat1.map) {\n mat1.map.needsUpdate = true;\n }\n }\n }\n\n}\n","import { CanvasTexture, Texture } from \"three\";\nimport { TextureLoader } from \"./TextureLoader\";\nimport { Caching } from \"../cache/Caching\";\nimport { serializeTextureKey, TextureKey } from \"../cache/CacheKey\";\nimport { AssetKey } from \"../assets/AssetKey\";\nimport * as THREE from \"three\";\n\nexport class Textures {\n\n public static initTextureProps<T extends Texture>(texture: T): T {\n texture.magFilter = THREE.NearestFilter;\n texture.minFilter = THREE.NearestFilter;\n texture.anisotropy = 0;\n return texture;\n }\n\n\n public static createImage(key: TextureKey): Texture {\n return TextureLoader.load(key.src, key.format, key.rotation);\n }\n\n public static createAsset(key: AssetKey): Texture {\n return new Texture()\n }\n\n public static createCanvasTexture(canvas: HTMLCanvasElement): CanvasTexture {\n return this.initTextureProps(new CanvasTexture(canvas));\n }\n\n public static getImage(key: TextureKey): Texture {\n const keyStr = serializeTextureKey(key);\n return Caching.textureCache.get(keyStr, k=>{\n return Textures.createImage(key);\n })!;\n }\n\n}\n","import { PixelFormat, RGBAFormat, Texture } from \"three\";\nimport { Caching } from \"../cache/Caching\";\nimport * as THREE from \"three\";\nimport { ImageLoader } from \"../image/ImageLoader\";\nimport { createCanvas } from \"../canvas/CanvasCompat\";\nimport type { CanvasRenderingContext2D } from \"canvas\";\nimport { Textures } from \"./Textures\";\n\nexport class TextureLoader {\n\n protected static createTexture(): Texture {\n return new Texture();\n }\n\n public static loadInBackground(src: string, format: PixelFormat = RGBAFormat, rotation: number = 0): Texture {\n const texture = this.createTexture();\n const image = ImageLoader.loadElement(src);\n image.onload = function () {\n texture.needsUpdate = true;\n }\n texture.image = image;\n texture.format = format;\n texture.rotation = rotation;\n\n return Textures.initTextureProps(texture);\n }\n\n public static load(src: string,format: PixelFormat = RGBAFormat, rotation: number = 0): Texture {\n const texture = new Texture();\n ImageLoader.getData(src).then(image=>{\n texture.needsUpdate = true;\n texture.image = image;\n })\n texture.format = format;\n texture.rotation = rotation;\n\n return Textures.initTextureProps(texture);\n }\n\n\n}\n","import type * as nodeCanvas from \"canvas\";\nimport { Env } from \"../Env\";\n\nexport type CompatImage = HTMLImageElement | nodeCanvas.Image;\nexport type CompatCanvas = HTMLCanvasElement | nodeCanvas.Canvas;\n\nexport function createImage(width?: number, height?: number): CompatImage {\n return Env.provider.createImage(width, height);\n}\n\nexport function createCanvas(width: number, height: number): CompatCanvas {\n return Env.provider.createCanvas(width, height);\n}\n","import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { JobQueue } from \"jobqu\";\nimport { Time } from \"@inventivetalent/time\";\nimport { prefix } from \"../util/log\";\nimport { sleep } from \"../util\";\n\nconst p = prefix(\"Requests\");\n\nif (typeof window === \"undefined\") {\n axios.defaults.headers[\"User-Agent\"] = \"MineRender\";\n}\n\nexport class Requests {\n\n private static axiosInstance: AxiosInstance = axios.create({\n timeout: 5000\n });\n\n private static mcAssetInstance: AxiosInstance = axios.create({\n timeout: 5000\n })\n\n private static genericQueue: JobQueue<AxiosRequestConfig, AxiosResponse>\n = new JobQueue<AxiosRequestConfig, AxiosResponse>(request => Requests.axiosInstance.request(request), Time.millis(10), 1);\n private static mcAssetRequestQueue: JobQueue<AxiosRequestConfig, AxiosResponse>\n = new JobQueue<AxiosRequestConfig, AxiosResponse>(request => Requests.mcAssetInstance.request(request), Time.millis(10), 1);\n\n public static genericRequest(request: AxiosRequestConfig): Promise<AxiosResponse> {\n // return this.axiosInstance.request(request);\n return this.genericQueue.add(request).catch(async e => {\n console.debug(p, \"generic catch\", e.code, e);\n\n // axios really likes to randomly cancel requests\n // no idea why, but just keep retrying\n if (this.shouldRetry(e, request)) {\n await sleep(100);\n return this.genericRequest(request);\n }\n\n throw e;\n });\n }\n\n public static mcAssetRequest(request: AxiosRequestConfig): Promise<AxiosResponse> {\n return this.mcAssetRequestQueue.add(request).catch(e => {\n console.debug(p, \"mcAssetRequest catch\", e.code, e);\n throw e;\n });\n // return Requests.mcAssetInstance.request(request)\n }\n\n private static shouldRetry(e: any, request: AxiosRequestConfig): boolean {\n if ('code' in e) {\n if ('ECONNABORTED' === e.code) {\n if ('minerenderRetry' in request) {\n if (request['minerenderRetry'] as number > 0) {\n (request['minerenderRetry'] as number)--;\n return true;\n }\n } else {\n request['minerenderRetry'] = 3;\n return true;\n }\n }\n }\n return false;\n }\n\n public static setMcAssetRoot(root: string) {\n this.mcAssetInstance.defaults.baseURL = root;\n }\n\n public static get queueSizes() {\n return {\n generic: this.genericQueue.size,\n mcAsset: this.mcAssetRequestQueue.size\n }\n }\n\n /**\n * Stops both queue timers. jobqu reschedules itself indefinitely, so a Node process will not\n * exit until this is called - see {@link shutdown}.\n */\n public static end() {\n this.genericQueue.end();\n this.mcAssetRequestQueue.end();\n }\n\n}\n","// https://stackoverflow.com/a/41407246/6257838\nconst Reset = \"\\x1b[0m\"\nconst Bright = \"\\x1b[1m\"\nconst Dim = \"\\x1b[2m\"\nconst Underscore = \"\\x1b[4m\"\nconst Blink = \"\\x1b[5m\"\nconst Reverse = \"\\x1b[7m\"\nconst Hidden = \"\\x1b[8m\"\n\nconst FgBlack = \"\\x1b[30m\"\nconst FgRed = \"\\x1b[31m\"\nconst FgGreen = \"\\x1b[32m\"\nconst FgYellow = \"\\x1b[33m\"\nconst FgBlue = \"\\x1b[34m\"\nconst FgMagenta = \"\\x1b[35m\"\nconst FgCyan = \"\\x1b[36m\"\nconst FgWhite = \"\\x1b[37m\"\n\nconst BgBlack = \"\\x1b[40m\"\nconst BgRed = \"\\x1b[41m\"\nconst BgGreen = \"\\x1b[42m\"\nconst BgYellow = \"\\x1b[43m\"\nconst BgBlue = \"\\x1b[44m\"\nconst BgMagenta = \"\\x1b[45m\"\nconst BgCyan = \"\\x1b[46m\"\nconst BgWhite = \"\\x1b[47m\"\n\nexport function prefix(prefix?: string): string {\n return `${ FgGreen }MR${ BgBlack }${ prefix ?? '' }${ Reset }`\n}\n","import Timeout = NodeJS.Timeout;\n\nexport class BatchedExecutor {\n\n public readonly interval: number;\n public readonly batch: number;\n\n private readonly queue: Task[];\n private readonly task: Timeout;\n\n constructor(interval: number = 1, batch: number = 30) {\n this.interval = interval;\n this.batch = batch;\n\n this.queue = [];\n this.task = setInterval(() => this.run());\n }\n\n public submit(task: Task): void {\n this.queue.push(task);\n }\n\n private run() {\n for (let i = 0; i < this.batch; i++) {\n this.runNext();\n }\n }\n\n private runNext() {\n let next = this.queue.shift();\n if (next) next();\n }\n\n\n}\n\ntype Task = () => any | Promise<any>\n","/// https://stackoverflow.com/questions/42812861/three-js-pivot-point/42866733#42866733\n// obj - your object (THREE.Object3D or derived)\n// point - the point of rotation (THREE.Vector3)\n// axis - the axis of rotation (normalized THREE.Vector3)\n// theta - radian value of rotation\nimport { ElementRotation } from \"../model/ModelElement\";\nimport { BufferGeometry } from \"three/src/core/BufferGeometry\";\nimport { Axis } from \"../Axis\";\nimport { toRadians } from \"./util\";\nimport { AxesHelper, Box3, BoxGeometry, EdgesGeometry, LineBasicMaterial, LineSegments, Matrix4, Mesh, Object3D, Quaternion, Vector3, Vector4 } from \"three\";\nimport { ModelPart } from \"../model/ModelPart\";\n\nfunction rotateAboutPoint(obj: THREE.Object3D, point: THREE.Vector3, axis: THREE.Vector3, theta: number) {\n obj.position.sub(point); // remove the offset\n obj.position.applyAxisAngle(axis, theta); // rotate the POSITION\n obj.position.add(point); // re-add the offset\n\n obj.rotateOnAxis(axis, theta); // rotate the OBJECT\n}\n\nexport function applyElementRotation(rotation: ElementRotation, geometry: BufferGeometry) {\n const origin = new Vector3(rotation.origin[0], rotation.origin[1], rotation.origin[2]);\n // origin.multiplyScalar(0.0625);\n\n\n // let axisVector: Vector3;\n // let inverseAxisVector: Vector3;\n // switch (rotation.axis) {\n // case Axis.X:\n // axisVector = new Vector3(1, 0, 0);\n // inverseAxisVector = new Vector3(0, 1, 1);\n // break;\n // case Axis.Y:\n // axisVector = new Vector3(0, 1, 0);\n // inverseAxisVector = new Vector3(1, 0, 1);\n // break;\n // case Axis.Z:\n // axisVector = new Vector3(0, 0, 1);\n // inverseAxisVector = new Vector3(1, 1, 0);\n // break;\n // }\n // const quat = new Quaternion().setFromAxisAngle(axisVector, (rotation.angle*0.017453292));\n // if (rotation.rescale) {\n // if (Math.abs(rotation.angle) === 22.5) {\n // inverseAxisVector.multiplyScalar(1.0 / Math.cos(0.39269909262657166) - 1.0)\n // }else {\n // inverseAxisVector.multiplyScalar(1.0 / Math.cos(0.7853981852531433) - 1.0)\n // }\n //\n // inverseAxisVector.add(new Vector3(1, 1, 1));\n // }else{\n // inverseAxisVector.set(1, 1, 1);\n // }\n\n // Vector4 vec4 = new Vector4(geometry.getAttribute(\"position\").)\n\n\n // subtract origin\n geometry.translate(-origin.x, -origin.y, -origin.z);\n // apply rotation\n switch (rotation.axis) {\n case Axis.X:\n geometry.rotateX(toRadians(rotation.angle));\n break;\n case Axis.Y:\n geometry.rotateY(toRadians(rotation.angle));\n break;\n case Axis.Z:\n geometry.rotateZ(toRadians(rotation.angle));\n break;\n }\n\n\n // if (rotation.rescale) {\n // console.log(\"angle\", Math.abs(rotation.angle) )\n // if (Math.abs(rotation.angle) === 22.5) {\n // const s = 2;\n // geometry.scale(s, s, s);\n // }else{\n // const s = 2;\n // geometry.scale(s, s, s);\n // }\n // }\n if (rotation.rescale) {\n //TODO: y height seems a bit too tall (1 pixel)\n if (Math.abs(rotation.angle) === 22.5) {\n const s = 1.0 / Math.cos(0.39269909262657166);\n geometry.scale(s, 1, s);\n }else {\n const s = 1.0 / Math.cos(0.7853981852531433);\n geometry.scale(s, 1, s);\n }\n }\n\n // add back origin\n geometry.translate(origin.x, origin.y, origin.z);\n\n\n}\n\nexport function applyModelPartRotation(modelPart: ModelPart, geometry: BufferGeometry) {\n const origin = new Vector3(modelPart.pivotX,modelPart.pivotY,modelPart.pivotZ);\n\n\n // subtract origin\n geometry.translate(-origin.x, -origin.y, -origin.z);\n // apply rotation\n //TODO: these might be the wrong order\n geometry.rotateX(toRadians(modelPart.pitch));\n geometry.rotateY(toRadians(modelPart.yaw));\n geometry.rotateZ(toRadians(modelPart.roll));\n\n\n // add back origin\n geometry.translate(origin.x, origin.y, origin.z);\n\n\n}\n\nexport function applyGenericRotation(axis: Axis, rotation: number, obj: Object3D) {\n\n\n // obj.position.sub(new Vector3(8,8,8).add(obj.position))\n //\n // switch (axis) {\n // case Axis.X:\n // obj.position.applyAxisAngle(new Vector3(1, 0, 0), toRadians(rotation));\n // break;\n // case Axis.Y:\n // obj.position.applyAxisAngle(new Vector3(0, 1, 0), toRadians(rotation));\n // break;\n // case Axis.Z:\n // obj.position.applyAxisAngle(new Vector3(0, 0, 1), toRadians(rotation));\n // break;\n // }\n //\n // obj.position.add(new Vector3(8,8,8).add(obj.position))\n\n switch (axis) {\n case Axis.X:\n obj.rotateOnAxis(new Vector3(1, 0, 0), toRadians(rotation));\n break;\n case Axis.Y:\n obj.rotateOnAxis(new Vector3(0, 1, 0), toRadians(rotation));\n break;\n case Axis.Z:\n obj.rotateOnAxis(new Vector3(0, 0, 1), toRadians(rotation));\n break;\n }\n\n // subtract origin\n // obj.translateX(-8);\n // obj.translateZ(-8);\n // obj.translateY(-8);\n // // apply rotation\n // switch (axis) {\n // case Axis.X:\n // obj.rotateX(toRadians(rotation));\n // // matrix.makeRotationX(toRadians(rotation));\n // break;\n // case Axis.Y:\n // obj.rotateY(toRadians(rotation));\n // // matrix.makeRotationY(toRadians(rotation));\n // break;\n // case Axis.Z:\n // obj.rotateZ(toRadians(rotation));\n // // matrix.makeRotationZ(toRadians(rotation));\n // break;\n // }\n // // add back origin\n // obj.translateX(8);\n // obj.translateZ(8);\n // obj.translateY(8);\n\n // obj.applyMatrix4(matrix);\n}\n\nexport function addBox3WireframeToObject(box: Box3, obj: Object3D, color: number = 0xffffff, w: number = 2) {\n let size = new Vector3();\n box.getSize(size);\n\n let boxGeo = new BoxGeometry(size.x, size.y, size.z, 1, 1, 1);\n // boxGeo.translate(box.min.x, box.min.y, box.min.z);\n let wireGeo = new EdgesGeometry(boxGeo);\n let wireMat = new LineBasicMaterial({ color: color, linewidth: w, })\n let wireframe = new LineSegments(wireGeo, wireMat);\n obj.add(wireframe);\n\n let axes = new AxesHelper(1);\n obj.add(axes);\n}\n\n\nexport function addWireframeToObject(obj: Object3D, color: number = 0xffffff, w: number = 2) {\n let boxGeo = new BoxGeometry(16, 16, 16, 1, 1, 1);\n let wireGeo = new EdgesGeometry(boxGeo);\n let wireMat = new LineBasicMaterial({ color: color, linewidth: w, })\n let wireframe = new LineSegments(wireGeo, wireMat);\n obj.add(wireframe);\n\n let axes = new AxesHelper(1);\n obj.add(axes);\n}\n\nexport function addWireframeToMesh(geo: BufferGeometry, mesh: Mesh, color: number = 0xffffff, w: number = 2) {\n let wireGeo = new EdgesGeometry(geo);\n let wireMat = new LineBasicMaterial({ color: color, linewidth: w, })\n let wireframe = new LineSegments(wireGeo, wireMat);\n mesh.add(wireframe);\n\n let axes = new AxesHelper(1);\n mesh.add(axes);\n}\n","export function captureException(e: any, ...extra: any[]) {\n console.error(e, extra);\n //TODO\n}\n\nexport function timingStart(marker: string) {\n console.time(marker);\n //TODO\n}\n\nexport function timingEnd(marker: string) {\n console.timeEnd(marker);\n //TODO\n}\n","import { InstancedMesh, Mesh, Object3D, OrthographicCamera, PerspectiveCamera } from \"three\";\nimport { SceneObject } from \"../renderer/SceneObject\";\n\nexport function isObject3D(obj: any): obj is Object3D {\n return (<Object3D> obj).isObject3D;\n}\n\nexport function isMesh(obj: any): obj is Mesh {\n return (<Mesh> obj).isMesh;\n}\n\nexport function isInstancedMesh(obj: any): obj is InstancedMesh {\n return (<InstancedMesh> obj).isInstancedMesh;\n}\n\nexport function isPerspectiveCamera(obj: any): obj is PerspectiveCamera {\n return (<PerspectiveCamera>obj).isPerspectiveCamera;\n}\n\nexport function isOrthographicCamera(obj: any): obj is OrthographicCamera {\n return (<OrthographicCamera>obj).isOrthographicCamera;\n}\n","import type { ImageData } from \"canvas\";\nimport { ImageInfo } from \"./image/ImageLoader\";\nimport { ExtractableImageData } from \"./ExtractableImageData\";\n\nexport class WrappedImage {\n\n constructor(readonly dta: ExtractableImageData) {\n }\n\n get data(): ImageData {\n return this.getSectionData(0, 0, this.width, this.height);\n }\n\n get dataArray(): Uint8ClampedArray {\n return this.data.data;\n }\n\n get width(): number {\n return this.dta.width;\n }\n\n get height(): number {\n return this.dta.height;\n }\n\n get hasTransparency(): boolean {\n const data = this.data.data;\n for (let i = 0; i < data.length; i += 4) {\n if (data[i + 3] < 255) {\n return true;\n }\n }\n return false;\n }\n\n get animated(): boolean {\n return this.height > this.width && this.height % this.width === 0;\n }\n\n get frameWidth(): number {\n return this.width;\n }\n\n get frameHeight(): number {\n return this.animated ? this.width : this.height;\n }\n\n get frameCount(): number {\n return this.height / this.width;\n }\n\n getFrameY(frame: number): number {\n return (this.height / this.frameCount) * Math.max(0, Math.min(this.frameCount, frame));\n }\n\n getSectionData(sx: number, sy: number, sw: number, sh: number): ImageData {\n return this.dta.data.getImageData(sx, sy, sw, sh);\n }\n\n getPixel(x: number, y: number): Uint8ClampedArray {\n return this.dta.data.getImageData(x,y,1,1).data;\n }\n\n getFrameSectionData(frame: number): ImageData {\n const y = this.getFrameY(frame);\n return this.getSectionData(0, y, this.width, this.width + y);\n }\n\n}\n","import { CompatImage, createCanvas, createImage } from \"../canvas/CanvasCompat\";\nimport { serializeImageKey } from \"../cache/CacheKey\";\nimport { Caching } from \"../cache/Caching\";\nimport { AxiosResponse } from \"axios\";\nimport { Env } from \"../Env\";\nimport { Requests } from \"../request/Requests\";\nimport { SSAOPassOUTPUT } from \"three/examples/jsm/postprocessing/SSAOPass\";\nimport { WrappedImage } from \"../WrappedImage\";\nimport { ExtractableImageData } from \"../ExtractableImageData\";\nimport { Buffer } from \"buffer\";\nimport { prefix } from \"../util/log\";\n\nconst p = prefix(\"ImageLoader\");\n\nexport interface ImageInfo {\n src?: string;\n width: number;\n height: number;\n type?: string;\n data: Buffer;\n}\n\nexport class ImageLoader {\n\n protected static _createImage(): CompatImage {\n //TODO: probably needs cross-origin stuff set for browser\n return createImage();\n }\n\n public static async loadAsync(src: string): Promise<CompatImage> {\n return new Promise<CompatImage>((resolve, reject) => {\n const image = this._createImage();\n image.src = src;\n image.onload = () => resolve(image);\n image.onerror = (err: Error) => reject(err);\n });\n }\n\n public static loadElement(src: string, onload?: () => void, onerr?: (err: Error) => void): CompatImage {\n const image = this._createImage();\n image.src = src;\n if (onload)\n image.onload = onload;\n if (onerr)\n image.onerror = onerr;\n return image;\n }\n\n public static async loadData(src: string): Promise<ImageData> {\n console.debug(p, \"loadData\", src);\n return await this.infoToData(await this.getInfo(src));\n }\n\n public static async loadCanvasData(src: string): Promise<ExtractableImageData> {\n return await this.infoToCanvasData(await this.getInfo(src));\n }\n\n public static async infoToCanvasData(info: ImageInfo): Promise<ExtractableImageData> {\n const image = await ImageLoader.loadAsync(info.src!);\n const canvas = createCanvas(info.width, info.height);\n const context = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n context.drawImage(image as CanvasImageSource, 0, 0);\n return {\n data: context,\n width: info.width,\n height: info.height\n }\n\n // return new ImageData(new Uint8ClampedArray(info.data), info.width, info.height)\n }\n\n\n public static async infoToData(info: ImageInfo): Promise<ImageData> {\n const image = await ImageLoader.loadAsync(info.src!);\n const canvas = createCanvas(info.width, info.height);\n const context = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n context.drawImage(image as CanvasImageSource, 0, 0);\n return context.getImageData(0, 0, canvas.width, canvas.height);\n\n\n // return new ImageData(new Uint8ClampedArray(info.data), info.width, info.height)\n }\n\n public static async getData(src: string): Promise<ImageData> {\n const keyStr = serializeImageKey({ src });\n return (await Caching.imageDataCache.get(keyStr, k => {\n return ImageLoader.loadData(src);\n }))!;\n }\n\n public static async getCanvasData(src: string): Promise<ExtractableImageData> {\n const keyStr = serializeImageKey({ src });\n return (await Caching.canvasImageDataCache.get(keyStr, k => {\n return ImageLoader.loadCanvasData(src);\n }))!;\n }\n\n public static async processResponse(response: Partial<AxiosResponse>): Promise<ImageInfo> {\n const src = response.config!.url;\n const data = Buffer.from(response.data!);\n const { width, height, type } = Env.provider.imageSize(data);\n return {\n src,\n width: width || 0,\n height: height || 0,\n type,\n data: data\n }\n }\n\n\n public static async loadInfo(src: string): Promise<ImageInfo> {\n\n // axios doesn't like data urls\n if (src.startsWith(\"data:image/png;base64\")) {\n return this.processResponse({\n config: {\n url: src\n },\n data: Buffer.from(src.substr(\"data:image/png;base64,\".length), \"base64\")\n })\n }\n\n //TODO: figure out a way to allow data/base64 requests\n return Requests.genericRequest({\n url: src,\n responseType: \"arraybuffer\"\n })\n .then(this.processResponse)\n .catch(err => {\n return {\n src,\n width: 0,\n height: 0,\n type: undefined,\n data: Buffer.from([0])\n };\n });\n }\n\n public static async getInfo(src: string): Promise<ImageInfo> {\n const keyStr = serializeImageKey({ src });\n return (await Caching.rawImageCache.get(keyStr, k => {\n return ImageLoader.loadInfo(src);\n }))!;\n }\n\n public static async loadWrapped(src: string): Promise<WrappedImage> {\n const data = await this.getCanvasData(src);\n return new WrappedImage(data);\n }\n\n public static async getWrapped(src: string): Promise<WrappedImage> {\n const keyStr = serializeImageKey({ src });\n return (await Caching.wrappedImageCache.get(keyStr, k => {\n return ImageLoader.loadWrapped(src);\n }))!;\n }\n\n\n}\n","import { BoxGeometryKey, MeshKey, serializeBoxGeometryKey, serializeMeshKey, serializeTextureKey, TextureKey } from \"./cache/CacheKey\";\nimport { Mesh } from \"three\";\nimport { Geometries } from \"./Geometries\";\nimport { Materials } from \"./Materials\";\nimport { Caching } from \"./cache/Caching\";\n\nexport class Meshes {\n\n public static createBox(key: MeshKey): Mesh {\n return new Mesh(Geometries.getBox(key.geometry), Materials.getImage(key.material));\n }\n\n public static getBox(key: MeshKey): Mesh {\n const keyStr = serializeMeshKey(key);\n return Caching.boxMeshCache.get(keyStr, k=>{\n return Meshes.createBox(key);\n })!;\n }\n\n}\n","import { BoxGeometry, BufferAttribute, Float32BufferAttribute, Vec2, Vector2, Vector4 } from \"three\";\nimport { DoubleArray, Model, QuadArray, TextureAsset } from \"./model/Model\";\nimport { ModelElement, ModelFaces } from \"./model/ModelElement\";\nimport { CUBE_FACES, CubeFace } from \"./CubeFace\";\nimport { ModelTextures } from \"./assets/ModelTextures\";\nimport { Assets } from \"./assets/Assets\";\nimport { Maybe, toRadians } from \"./util/util\";\nimport { WrappedImage } from \"./WrappedImage\";\nimport { CanvasImage } from \"./canvas/CanvasImage\";\nimport { TextureAtlas } from \"./texture/TextureAtlas\";\nimport { Caching } from \"./cache/Caching\";\nimport { ImageLoader } from \"./image/ImageLoader\";\nimport { AnimatorFunction } from \"./AnimatorFunction\";\nimport { MinecraftTextureMeta } from \"./MinecraftTextureMeta\";\nimport { AssetKey } from \"./assets/AssetKey\";\nimport { ModelGenerator } from \"./model/ModelGenerator\";\nimport { prefix } from \"./util/log\";\n\nconst p = prefix(\"UVMapper\");\n\nexport const DEFAULT_UV: QuadArray = [0, 0, 16, 16];\nconst X = 0;\nconst Y = 1;\nconst Z = 2;\n\n/*\n * - Minecraft Block UVs are from the top-left to bottom-right\n * - three.js UVs are from the bottom-left to top-right\n * - canvas coordinates are from the top-left to bottom-right\n */\n\n// noinspection PointlessArithmeticExpressionJS\nexport class UVMapper {\n\n protected static makeUv(uvCoord: number, originalTextureSize: number, actualTextureSize: number): number {\n if (uvCoord === 0) return 0;\n return (actualTextureSize / originalTextureSize) * (uvCoord / originalTextureSize);\n }\n\n protected static makeUvCoords([originalTextureWidth, originalTextureHeight]: DoubleArray, [actualTextureWidth, actualTextureHeight]: DoubleArray, [x1, y1, x2, y2]: QuadArray): QuadArray {\n // Flip from top-to-bottom coordinates to bottom-to-top ones\n y1 = originalTextureHeight - y1;\n y2 = originalTextureHeight - y2;\n\n const u1 = this.makeUv(x1, originalTextureWidth, actualTextureWidth);\n const v1 = this.makeUv(y1, originalTextureHeight, actualTextureHeight);\n const u2 = this.makeUv(x2, originalTextureWidth, actualTextureWidth);\n const v2 = this.makeUv(y2, originalTextureHeight, actualTextureHeight);\n\n return [u1, v1, u2, v2];\n }\n\n\n public static rotateSingleUv([u, v]: DoubleArray, [px, py]: DoubleArray, radians: number): DoubleArray {\n const sin = Math.sin(radians);\n const cos = Math.cos(radians);\n\n u -= px;\n v -= py;\n\n const uc = u;\n const vc = v;\n\n u = cos * uc - sin * vc;\n v = cos * vc + sin * uc;\n\n u += px;\n v += py;\n\n // return [parseFloat(u.toFixed(8)), parseFloat(v.toFixed(8))];\n return [u, v];\n }\n\n public static addCubeFaceUvToArray(array: number[], faceIndex: number, originalTextureSize: DoubleArray, actualTextureSize: DoubleArray, originalCoords: QuadArray) {\n const uv = this.makeUvCoords(originalTextureSize, actualTextureSize, originalCoords);\n this.setCubeFaceUvInArray(array, faceIndex, uv);\n }\n\n public static setCubeFaceUvInArray(array: number[], faceIndex: number, [u1, v1, u2, v2]: QuadArray) {\n let a: DoubleArray = [u1, v1]; // top left\n let b: DoubleArray = [u2, v1]; // top right\n let c: DoubleArray = [u1, v2]; // bottom left\n let d: DoubleArray = [u2, v2]; // bottom right\n\n let uvs: QuadArray<DoubleArray> = [a, b, c, d];\n\n this.setFaceUvInArray(array, faceIndex, uvs);\n }\n\n public static setFaceUvInArrayV(array: number[], faceIndex: number, uvs: QuadArray<Vector2>) {\n array[((faceIndex + 0) * 2) + 0] = uvs[0].x;\n array[((faceIndex + 0) * 2) + 1] = uvs[0].y;\n\n array[((faceIndex + 1) * 2) + 0] = uvs[1].x;\n array[((faceIndex + 1) * 2) + 1] = uvs[1].y;\n\n array[((faceIndex + 2) * 2) + 0] = uvs[2].x;\n array[((faceIndex + 2) * 2) + 1] = uvs[2].y;\n\n array[((faceIndex + 3) * 2) + 0] = uvs[3].x;\n array[((faceIndex + 3) * 2) + 1] = uvs[3].y;\n }\n\n public static setFaceUvInArray(array: number[], faceIndex: number, uvs: QuadArray<DoubleArray>) {\n array[((faceIndex + 0) * 2) + 0] = uvs[0][0];\n array[((faceIndex + 0) * 2) + 1] = uvs[0][1];\n\n array[((faceIndex + 1) * 2) + 0] = uvs[1][0];\n array[((faceIndex + 1) * 2) + 1] = uvs[1][1];\n\n array[((faceIndex + 2) * 2) + 0] = uvs[2][0];\n array[((faceIndex + 2) * 2) + 1] = uvs[2][1];\n\n array[((faceIndex + 3) * 2) + 0] = uvs[3][0];\n array[((faceIndex + 3) * 2) + 1] = uvs[3][1];\n }\n\n public static setCubeFaceUvAttribute(attributes: BufferAttribute, faceIndex: number, originalTextureSize: DoubleArray, actualTextureSize: DoubleArray, originalCoords: QuadArray): void {\n const uv = this.makeUvCoords(originalTextureSize, actualTextureSize, originalCoords);\n this.setCubeFaceUvInAttribute(attributes, faceIndex, uv);\n }\n\n public static setCubeFaceUvInAttribute(attributes: BufferAttribute, faceIndex: number, [u1, v1, u2, v2]: QuadArray) {\n attributes.setXY(faceIndex + 0, u1, v1);\n attributes.setXY(faceIndex + 1, u2, v1);\n attributes.setXY(faceIndex + 2, u1, v2);\n attributes.setXY(faceIndex + 3, u2, v2);\n }\n\n public static setCubeUvs(geometry: BoxGeometry, originalTextureSize: DoubleArray, actualTextureSize: DoubleArray, faces: ModelFaces): void {\n const attributes = geometry.getAttribute(\"uv\") as BufferAttribute;\n for (let faceIndex = 0; faceIndex < CUBE_FACES.length; faceIndex++) {\n let faceName = CUBE_FACES[faceIndex];\n let face = faces[faceName];\n if (!face) continue;\n if (!face.uv) {\n face.uv = DEFAULT_UV;\n }\n\n this.setCubeFaceUvAttribute(attributes, faceIndex * 4, originalTextureSize, actualTextureSize, face.uv);\n }\n }\n\n public static facesToUvArray(faces: ModelFaces, originalTextureSize: DoubleArray, actualTextureSize: DoubleArray): number[] {\n const array: number[] = [];\n for (let faceIndex = 0; faceIndex < CUBE_FACES.length; faceIndex++) {\n let faceName = CUBE_FACES[faceIndex];\n let face = faces[faceName];\n if (!face) continue;\n if (!face.uv) {\n face.uv = DEFAULT_UV;\n }\n\n this.addCubeFaceUvToArray(array, faceIndex * 4, originalTextureSize, actualTextureSize, face.uv);\n }\n return array;\n }\n\n public static facesToUv(faces: ModelFaces, originalTextureSize: DoubleArray, actualTextureSize: DoubleArray): Float32BufferAttribute {\n return new Float32BufferAttribute(this.facesToUvArray(faces, originalTextureSize, actualTextureSize), 2);\n }\n\n public static async getAtlas(model: Model): Promise<Maybe<TextureAtlas>> {\n const keyStr = model.key!.serialize();\n return Caching.modelTextureAtlasCache.get(keyStr, k => {\n return this.createAtlas(model);\n })\n }\n\n public static fillMissingTextureKeys<T>(textures: ModelTextures, target: { [k: string]: T }): { [k: string]: T } {\n for (let faceName of CUBE_FACES) {\n let v = textures[faceName];\n if (v && v.startsWith(\"#\")) {\n target[faceName] = target[v.substr(1)];\n }\n }\n return target;\n }\n\n // https://yeleha.co/3qlboGS\n protected static getFallbackUv(element: ModelElement, faceName: CubeFace): QuadArray {\n switch (faceName) {\n case CubeFace.DOWN:\n return [element.from[X], 16 - element.to[Z], element.to[X], 16 - element.from[Z]];\n case CubeFace.UP:\n return [element.from[X], element.from[Z], element.to[X], element.to[Z]];\n case CubeFace.NORTH:\n default:\n return [16 - element.to[X], 16 - element.to[Y], 16 - element.from[X], 16 - element.from[Y]];\n case CubeFace.SOUTH:\n return [element.from[X], 16 - element.to[Y], element.to[X], 16 - element.from[Y]];\n case CubeFace.WEST:\n return [element.from[Z], 16 - element.to[Y], element.to[Z], 16 - element.from[Y]];\n case CubeFace.EAST:\n return [16 - element.to[Z], 16 - element.to[Y], 16 - element.from[Z], 16 - element.from[Y]];\n }\n }\n\n protected static expandAndRotateMcUvs([u1, v1, u2, v2]: QuadArray, rotation: number = 0, actualWidth: number, actualHeight: number): QuadArray<Vector2> {\n // Resize coordinates to actual texture size\n const scaleU = actualWidth / 16;\n const scaleV = actualHeight / 16;\n u1 *= scaleU;\n v1 *= scaleV;\n u2 *= scaleU;\n v2 *= scaleV;\n\n let tl: Vector2 = new Vector2(u1, v1);// top left\n let tr: Vector2 = new Vector2(u2, v1);// top right\n let bl: Vector2 = new Vector2(u1, v2);// bottom left\n let br: Vector2 = new Vector2(u2, v2);// bottom right\n\n switch (rotation) {\n case 0:\n case 360:\n default:\n break;\n case 90:\n tl = new Vector2(u1, v2);\n tr = new Vector2(u1, v1);\n bl = new Vector2(u2, v2);\n br = new Vector2(u2, v1);\n break;\n case 180:\n tl = new Vector2(u2, v2);\n tr = new Vector2(u1, v2);\n bl = new Vector2(u2, v1);\n br = new Vector2(u1, v1);\n break;\n case 270:\n tl = new Vector2(u2, v1);\n tr = new Vector2(u2, v2);\n bl = new Vector2(u1, v1);\n br = new Vector2(u1, v2);\n break;\n }\n\n return [tl, tr, bl, br];\n }\n\n public static async createAtlas(originalModel: Model): Promise<Maybe<TextureAtlas>> {\n const textureMap: { [key: string]: Maybe<WrappedImage>; } = {};\n const metaMap: { [key: string]: Maybe<MinecraftTextureMeta>; } = {};\n const model = {...originalModel};\n const isItemModel = !(\"elements\" in model);\n\n console.debug(p, \"Creating Atlas for\", model.key);\n\n if (model.textures) {\n const promises: Promise<void>[] = [];\n const uniqueTextureNames: string[] = []; // TODO: make these actually unique\n const textureReferences: { [k: string]: string; } = {};\n for (let textureKey in model.textures) {\n let textureValue = model.textures[textureKey];\n if (textureValue.startsWith(\"#\")) {\n textureReferences[textureKey] = textureValue.substr(1);\n } else {\n uniqueTextureNames.push(textureKey);\n const assetKey = AssetKey.parse(\"textures\", textureValue, model.key);\n promises.push(ModelTextures.get(assetKey).then(asset => {\n if (!asset) {\n console.warn(p, \"Missing texture\", assetKey)\n return;\n }\n textureMap[textureKey] = new WrappedImage(asset);\n }));\n promises.push(ModelTextures.getMeta(assetKey).then(meta => {\n metaMap[textureKey] = meta;\n }))\n }\n }\n await Promise.all(promises);\n const textureCount = uniqueTextureNames.length;\n console.debug(p, \"Creating Atlas for\", textureCount, \"textures\");\n // console.log(model.textures)\n\n this.fillMissingTextureKeys(model.textures, textureMap);\n this.fillMissingTextureKeys(model.textures, metaMap);\n\n const sizes: { [texture: string]: DoubleArray; } = {};\n\n // Find largest texture dimensions\n let maxWidth = 0;\n let maxHeight = 0;\n for (let textureKey of uniqueTextureNames) {\n let texture = textureMap[textureKey];\n if (!texture) continue;\n sizes[textureKey] = [texture.frameWidth, texture.frameHeight];\n if (texture.frameWidth > maxWidth) {\n maxWidth = texture.width;\n }\n if (texture.frameHeight > maxHeight) {\n maxHeight = texture.frameHeight;\n }\n }\n this.fillMissingTextureKeys(model.textures, sizes);\n\n // console.log(\"sizes\", sizes);\n\n const s = (Math.ceil(Math.sqrt(textureCount + 1))); // +1 for transparency\n const size = Math.ceil(s * maxWidth)\n console.debug(p, \"Atlas size:\", size);\n // console.log(\"size: \" + size);\n const squaredSize = size * size;\n\n const missing = await ImageLoader.getData(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQMAAACQp+OdAAAABlBMVEX/AP8AAACfphTyAAAAFUlEQVQoz2MIhQKGVVAwKjIqQrwIAHRz/wFI17TEAAAAAElFTkSuQmCC\");\n const empty = await ImageLoader.getData(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQMAAACQp+OdAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAA5JREFUKM9jGAWjgAIAAAJAAAFSSwuTAAAAAElFTkSuQmCC\");\n //TODO: add transparent texture and use as default uv\n\n // Create image\n const image = new CanvasImage(size, size);\n image.putData(missing, 0, 0); // fill with invalid texture image\n image.putData(empty, 0, 0, 0, 0, maxWidth, maxWidth); // add transparent section in the top-left corner\n\n const positions: { [texture: string]: DoubleArray; } = {};\n\n let hasTransparency = false;\n\n let hasAnimation = false;\n const animatorFunctions: { [texture: string]: AnimatorFunction; } = {};\n\n // Draw all textures onto a single image\n let tx = 1; // start one over to leave room for the transparent space\n let ty = 0;\n for (let textureIndex = 0; textureIndex < uniqueTextureNames.length; textureIndex++) {\n let textureKey = uniqueTextureNames[textureIndex];\n let texture = textureMap[textureKey];\n let x = tx * maxWidth;\n let y = ty * maxWidth;\n if (texture) {\n console.log(texture);\n positions[textureKey] = [x, y];\n image.putData(texture.data, x, y, 0, 0, maxWidth, maxWidth);\n // console.log(image.toDataURL())\n //TODO: only first frame for animated textures\n\n if (texture.hasTransparency) {\n hasTransparency = true;\n }\n\n console.log(\"texture\", textureKey, \"animated\", texture.animated)\n\n if (texture.animated) {\n hasAnimation = true;\n const meta = metaMap[textureKey];\n const frameTime = meta?.animation?.frametime ?? 1;\n console.log(meta);\n console.log(frameTime);\n\n let t = 0;\n let f = 0;\n\n animatorFunctions[textureKey] = () => {\n // console.log(\"animating\", textureKey)\n //TODO: use mcmeta for frame count, delays, etc\n //TODO: interpolate?\n if (t++ >= frameTime) {\n t = 0;\n\n const frames = meta?.animation?.frames;\n const frame = frames ? frames[f] as number : f; //TODO: frame.time support\n\n image.putData(texture!.getFrameSectionData(frame), x, y, 0, 0, maxWidth, maxWidth);\n\n f++;\n if (f >= (frames ? frames.length : texture!.frameCount)) {\n f = 0;\n }\n }\n\n };\n }\n }\n tx++;\n if (tx >= s) {\n tx = 0;\n ty++;\n }\n }\n const atlasImageData = image.toDataURL();\n console.log(p, \"Atlas Image for\", model.key, atlasImageData);\n\n this.fillMissingTextureKeys(model.textures, positions);\n\n // console.log(\"positions\", positions);\n\n if (isItemModel) {\n console.debug(p, \"Generating item model for\", model);\n model.elements = [];\n for (let layerName of ModelGenerator.ITEM_LAYERS) {\n const textureImage = textureMap[layerName];\n if (textureImage) {\n model.elements.push(...ModelGenerator.generateItemModel(textureImage.data, layerName))\n }\n }\n console.debug(p, \"Item model elements\", model.elements)\n }\n\n if (!model.elements) {\n //TODO: default elements\n }\n\n // Adjust UV positions\n if (model.elements) {\n for (let elementIndex = 0; elementIndex < model.elements.length; elementIndex++) {\n let element = model.elements[elementIndex];\n let uv: number[] = [];\n // Set default uvs to missing texture\n for (let i = 0; i < CUBE_FACES.length; i++) {\n this.setCubeFaceUvInArray(uv, i * 4, [0, 0, 8 / size, 8 / size])\n }\n for (let faceIndex = 0; faceIndex < CUBE_FACES.length; faceIndex++) {\n let faceName = CUBE_FACES[faceIndex];\n // console.log(faceName)\n let face = element.faces[faceName];\n if (!face) {\n // set uv transparent\n this.setCubeFaceUvInArray(uv, faceIndex * 4, [0, 1, 8 / size, (size - 8) / size])\n continue;\n }\n if (!face.uv) {\n face.uv = this.getFallbackUv(element, faceName);\n }\n\n let faceTexture = face.texture;\n let texPosition;\n let texSize;\n if (faceTexture) {\n faceTexture = faceTexture.substr(1); // remove #\n texPosition = positions[faceTexture] || [0, 0];\n texSize = sizes[faceTexture] || [16, 16];\n }\n\n let texPosV = new Vector2(texPosition[0], texPosition[1]);\n\n const [tl, tr, bl, br] = this.expandAndRotateMcUvs(face.uv, face.rotation, texSize[0], texSize[1]);\n\n // move to atlas position\n tl.add(texPosV);\n tr.add(texPosV);\n bl.add(texPosV);\n br.add(texPosV);\n\n // divide to 0-1\n tl.divideScalar(size);\n tr.divideScalar(size);\n bl.divideScalar(size);\n br.divideScalar(size);\n\n // flip y coordinates\n tl.y = 1 - tl.y;\n tr.y = 1 - tr.y;\n bl.y = 1 - bl.y;\n br.y = 1 - br.y;\n\n //TODO: figure out how uv lock works\n\n\n let uvs: QuadArray<Vector2> = [tl, tr, bl, br];\n // console.log(\"uvs\", uvs);\n this.setFaceUvInArrayV(uv, faceIndex * 4, uvs);\n }\n\n element.mappedUv = uv;\n }\n } else {\n //TODO: item model\n }\n\n return new TextureAtlas(\n model,\n image,\n sizes,\n positions,\n hasAnimation,\n animatorFunctions,\n hasTransparency\n );\n } else {\n console.warn(p, \"Model does not have any textures\", model);\n }\n return undefined;\n }\n\n}\n\n// Based on net.minecraft.client.renderer.block.model.BlockFaceUV\nexport class MinecraftFaceUV {\n\n constructor(readonly uv: QuadArray = [0, 0, 16, 16], readonly rotation: number = 0) {\n }\n\n getU(index: number): number {\n const shiftedIndex = this.getShiftedIndex(index);\n return this.uv[shiftedIndex !== 0 && index !== 1 ? 2 : 0];\n }\n\n getV(index: number): number {\n const shiftedIndex = this.getShiftedIndex(index);\n return this.uv[shiftedIndex !== 0 && index !== 3 ? 3 : 1];\n }\n\n protected getShiftedIndex(index: number): number {\n return (index + this.rotation / 90) % 40;\n }\n\n protected getReverseIndex(index: number): number {\n return (index + 4 - this.rotation / 90) % 4;\n }\n\n}\n","import { Model } from \"./Model\";\nimport { Models } from \"../assets/Models\";\nimport merge from \"ts-deepmerge\";\nimport { Assets } from \"../assets/Assets\";\nimport { AssetKey } from \"../assets/AssetKey\";\n\nexport class ModelMerger {\n\n public static async mergeWithParents(model: Model): Promise<Model> {\n const models = await this.collectAllParents(model);\n let merged: Model = {};\n for (let parentModel of models) {\n merged = merge(merged, parentModel);\n }\n merged = merge(merged, model);\n merged.hierarchy = models.map(m => m.parent).filter(p => `${p}`) as string[];\n merged.hierarchy.push(`${merged.parent}`);\n // delete merged.parent;\n return merged;\n }\n\n protected static async collectAllParents(model: Model): Promise<Model[]> {\n if (!model.parent) {\n return [];\n }\n const models: Model[] = [];\n const parentKey = AssetKey.parse(\"models\", model.parent);\n const parentModel = await Models.getRaw(parentKey);\n if (parentModel) {\n models.unshift(parentModel);\n models.unshift(...await this.collectAllParents(parentModel));\n }\n return models;\n }\n\n}\n","import { Serializable } from \"../Serializable\";\nimport { DEFAULT_NAMESPACE, DEFAULT_ROOT } from \"./Assets\";\nimport { AssetLoader } from \"./AssetLoader\";\n\nexport type AssetType = \"models\" | \"textures\" | \"blockstates\" | string;\n\nexport class BasicAssetKey implements Serializable {\n\n readonly namespace: string;\n readonly path: string;\n\n constructor(key: BasicAssetKey);\n constructor(namespace: string, path: string);\n constructor(namespaceOrKey: string | BasicAssetKey, path?: string) {\n if (path) {\n this.namespace = namespaceOrKey as string;\n this.path = path;\n } else {\n this.namespace = (namespaceOrKey as BasicAssetKey).namespace;\n this.path = (namespaceOrKey as BasicAssetKey).path\n }\n }\n\n toNamespacedString() {\n return this.namespace + \":\" + this.path;\n }\n\n toString() {\n return this.toNamespacedString();\n }\n\n serialize(): string {\n return this.toString();\n }\n}\n\n// TODO: rewrite this to be less dumb\nexport class AssetKey extends BasicAssetKey {\n\n constructor(\n readonly namespace: string, readonly path: string,\n public assetType?: AssetType,\n public type?: string,\n public rootType: \"assets\" | \"data\" | string = \"assets\",\n public extension: \".json\" | \".png\" | string = \".json\",\n public root?: string,\n ) {\n super(namespace, path);\n }\n\n\n public static parse(assetType: AssetType, str: string, origin?: AssetKey): AssetKey {\n let namespace = origin?.namespace || DEFAULT_NAMESPACE;\n if (str.includes(\":\")) {\n let split = str.split(\"\\:\");\n namespace = split[0];\n str = split[1];\n }\n\n let split = str.split(\"\\/\");\n let type: string | undefined = undefined;\n if (split.length > 1) {\n type = split[0];\n split.shift();\n }\n let path = split.join(\"/\");\n\n let extension = assetType === \"textures\" ? \".png\" :\n origin?.assetType || \".json\";\n\n return new AssetKey(namespace, path, assetType, type, \"assets\", extension, origin?.root);\n }\n\n toString(): string {\n let a = [\n (typeof this.root !== 'undefined' || AssetLoader.ROOT !== DEFAULT_ROOT) ? (this.root ?? AssetLoader.ROOT) : \"__root__\",\n this.rootType ?? \"__rootType__\",\n this.assetType ?? \"__assetType__\",\n this.type ?? \"__type__\",\n this.namespace,\n this.path\n ];\n return a.join(\"/\");\n }\n\n getFullPath() {\n let p: string[] = [];\n if (this.type) {\n p.push(this.type);\n }\n p.push(this.path);\n return p.join(\"/\");\n }\n\n toNamespacedString() {\n return this.namespace + \":\" + this.getFullPath();\n }\n\n serialize(): string {\n return this.toString();\n }\n}\n\nexport function isBasicAssetKey(obj: any): obj is BasicAssetKey {\n return \"namespace\" in obj && \"path\" in obj;\n}\n\nexport function isAssetKey(obj: any): obj is AssetKey {\n return isBasicAssetKey(obj) && \"parse\" in obj;\n}\n","import { Model } from \"../model/Model\";\nimport { Caching } from \"../cache/Caching\";\nimport { Textures } from \"../texture/Textures\";\nimport { Maybe } from \"../util/util\";\nimport { ModelMerger } from \"../model/ModelMerger\";\nimport { AssetLoader } from \"./AssetLoader\";\nimport { Memoize } from \"typescript-memoize\";\nimport { DEFAULT_NAMESPACE, DEFAULT_ROOT } from \"./Assets\";\nimport { PersistentCache } from \"../cache/PersistentCache\";\nimport { AssetKey } from \"./AssetKey\";\nimport { ListAsset } from \"../ListAsset\";\nimport { AssetParser } from \"./source/parser/AssetParsers\";\n\nexport class Models {\n\n private static _persistentCache: PersistentCache | undefined;\n\n // opened lazily: touching the store at import time would hit IndexedDB/disk just for loading\n // the library, and would require an EnvProvider before any entry has had a chance to register\n private static get PERSISTENT_CACHE(): PersistentCache {\n return this._persistentCache ??= PersistentCache.open(\"minerender-models\");\n }\n\n @Memoize()\n public static async getItemList(): Promise<string[]> {\n return AssetLoader.get<ListAsset>(new AssetKey(\n DEFAULT_NAMESPACE,\n \"_list\",\n \"models\",\n \"item\",\n \"assets\",\n \".json\",\n DEFAULT_ROOT\n ), AssetParser.LIST).then(r => r?.files ?? []);\n }\n\n public static async loadAndMerge(key: AssetKey): Promise<Maybe<Model>> {\n const model = await this.getRaw(key);\n if (!model) {\n return undefined;\n }\n return ModelMerger.mergeWithParents(model);\n }\n\n public static async getRaw(key: AssetKey): Promise<Maybe<Model>> {\n if (!key.assetType) {\n key.assetType = \"models\";\n }\n if (!key.extension) {\n key.extension = \".json\";\n }\n const keyStr = key.serialize();\n //TODO: maybe add the asset source to the key\n return Caching.rawModelCache.get(keyStr, k => {\n return this.PERSISTENT_CACHE.getOrLoad(keyStr, k1 => {\n return AssetLoader.get<Model>(key, AssetParser.MODEL);\n })\n }).then(asset => {\n if (asset) {\n asset.key = key;\n }\n return asset;\n })\n }\n\n public static async getMerged(key: AssetKey): Promise<Maybe<Model>> {\n if (!key.assetType) {\n key.assetType = \"models\";\n }\n if (!key.extension) {\n key.extension = \".json\";\n }\n const keyStr = key.serialize();\n return Caching.mergedModelCache.get(keyStr, k => {\n //TODO: persistent cache\n return Models.loadAndMerge(key);\n });\n }\n\n public static async get(key: AssetKey): Promise<Maybe<Model>> {\n return this.getMerged(key);\n }\n\n public static async clearCache() {\n return this.PERSISTENT_CACHE.clear();\n }\n\n}\n","export enum AssetParser {\n\n MODEL = \"model\",\n BLOCKSTATE = \"blockstate\",\n META = \"meta\",\n NBT = \"nbt\",\n IMAGE = \"image\",\n LIST = \"list\",\n JSON = \"json\",\n\n}","import { Maybe } from \"../util/util\";\nimport { BlockState } from \"../model/block/BlockState\";\nimport { Caching } from \"../cache/Caching\";\nimport { AssetLoader } from \"./AssetLoader\";\nimport { DEFAULT_NAMESPACE, DEFAULT_ROOT } from \"./Assets\";\nimport { Memoize } from \"typescript-memoize\";\nimport { BlockStatePropertyDefaults } from \"../model/block/BlockStateProperties\";\nimport { AssetKey } from \"./AssetKey\";\nimport { PersistentCache } from \"../cache/PersistentCache\";\nimport { AssetParser } from \"./source/parser/AssetParsers\";\nimport { ListAsset } from \"../ListAsset\";\nimport { MinecraftAsset } from \"../MinecraftAsset\";\n\nexport class BlockStates {\n\n private static _persistentCache: PersistentCache | undefined;\n\n private static get PERSISTENT_CACHE(): PersistentCache {\n return this._persistentCache ??= PersistentCache.open(\"minerender-blockstates\");\n }\n\n // BlockState names are hardcoded\n @Memoize()\n public static async getList(): Promise<string[]> {\n return AssetLoader.get<ListAsset>(new AssetKey(\n DEFAULT_NAMESPACE,\n \"_list\",\n \"blockstates\",\n undefined,\n \"assets\",\n \".json\",\n DEFAULT_ROOT\n ), AssetParser.LIST).then(r => r?.files ?? []);\n }\n\n @Memoize()\n public static async getDefaultStates(): Promise<Maybe<DefaultBlockStates>> {\n const key = AssetKey.parse(\"blockstates\", \"minerender:defaultBlockStates\");\n return AssetLoader.get<DefaultBlockStates>(key, AssetParser.JSON);\n }\n\n public static async getDefaultState(key: AssetKey): Promise<Maybe<BlockStatePropertyDefaults>> {\n const defaultStates = await this.getDefaultStates();\n if (!defaultStates) {\n return undefined;\n }\n return defaultStates[\"minecraft:\" + key.path] as BlockStatePropertyDefaults;\n }\n\n public static async get(key: AssetKey): Promise<Maybe<BlockState>> {\n if (!key.assetType) {\n key.assetType = \"blockstates\";\n }\n if (!key.extension) {\n key.extension = \".json\";\n }\n const keyStr = key.serialize();\n return Caching.blockStateCache.get(keyStr, k => {\n return this.PERSISTENT_CACHE.getOrLoad(keyStr, k1 => {\n return AssetLoader.get<BlockState>(key, AssetParser.BLOCKSTATE);\n })\n }).then(asset => {\n if (asset) {\n asset.key = key;\n }\n return asset;\n })\n }\n\n public static getAll(keys: AssetKey[] | Iterable<AssetKey>): Promise<Maybe<BlockState>[]> {\n const promises: Promise<Maybe<BlockState>>[] = [];\n for (let key of keys) {\n promises.push(this.get(key));\n }\n return Promise.all(promises);\n }\n\n public static async clearCache() {\n await this.PERSISTENT_CACHE.clear();\n }\n\n}\n\nexport class DefaultBlockStates implements MinecraftAsset {\n [k: string]: BlockStatePropertyDefaults;\n}","import { Models } from \"./Models\";\nimport { Model } from \"../model/Model\";\nimport { Maybe } from \"../util/util\";\nimport { BlockState } from \"../model/block/BlockState\";\nimport { BlockStates } from \"./BlockStates\";\nimport { AssetKey, AssetType } from \"./AssetKey\";\n\nexport const DEFAULT_ROOT = \"https://cdn.mcasset.cloud/file/minecraft-assets/1.17.1\";\nexport const DEFAULT_NAMESPACE = \"minecraft\";\n\nexport class Assets {\n\n /**\n * @deprecated\n */\n public static parseAssetKey(assetType: AssetType, str: string, origin?: AssetKey): AssetKey {\n return AssetKey.parse(assetType, str, origin);\n }\n\n public static async getModel(key: AssetKey): Promise<Maybe<Model>> {\n return Models.getMerged(key);\n }\n\n public static async getBlockState(key: AssetKey): Promise<Maybe<BlockState>> {\n return BlockStates.get(key);\n }\n\n}\n","import { MinecraftAsset } from \"../../MinecraftAsset\";\nimport { AssetKey } from \"../AssetKey\";\nimport { Maybe } from \"../../util\";\nimport { AssetParser } from \"./parser/AssetParsers\";\n\nexport abstract class AssetSource {\n\n protected constructor() {\n }\n\n public abstract get<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser | string): Promise<Maybe<T>>;\n\n}","import type { NBT } from \"prismarine-nbt\";\nimport { MinecraftAsset } from \"../MinecraftAsset\";\n\nexport class NBTHelper {\n\n public static async fromBuffer(buffer: Buffer): Promise<NBTAsset> {\n const prismarineNbt = await import(\"prismarine-nbt\");\n const { parsed, type, metadata } = await prismarineNbt.parse(buffer);\n return parsed;\n }\n\n}\n\nexport interface NBTAsset extends MinecraftAsset, NBT {\n}\n","import { AssetSource } from \".\";\nimport { BlockState, Model, TextureAsset } from \"../../model\";\nimport { AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { Maybe, prefix } from \"../../util\";\nimport { MinecraftTextureMeta } from \"../../MinecraftTextureMeta\";\nimport { NBTAsset, NBTHelper } from \"../../nbt\";\nimport { ImageLoader } from \"../../image\";\nimport { ListAsset } from \"../../ListAsset\";\nimport { MinecraftAsset } from \"../../MinecraftAsset\";\nimport { AssetKey } from \"../AssetKey\";\nimport { DEFAULT_NAMESPACE, DEFAULT_ROOT } from \"../Assets\";\nimport { Requests } from \"../../request\";\nimport { AssetLoader } from \"../AssetLoader\";\nimport { AssetParser } from \"./parser\";\nimport { ResponseParser } from \"./parser\";\nimport merge from \"ts-deepmerge\";\n\nconst p = prefix(\"HostedAssetSource\");\n\nconst DEFAULT_OPTIONS: HostedAssetSourceOptions = {\n retryDefaults: true\n}\n\nexport class HostedAssetSource extends AssetSource {\n\n static readonly MODEL: ResponseParser<Model> = {\n config(request: AxiosRequestConfig) {\n },\n parse(response: AxiosResponse): Maybe<Model> {\n return response.data as Model;\n }\n }\n static readonly BLOCKSTATE: ResponseParser<BlockState> = {\n config(request: AxiosRequestConfig) {\n },\n parse(response: AxiosResponse): Maybe<BlockState> {\n return response.data as BlockState;\n }\n }\n static readonly META: ResponseParser<MinecraftTextureMeta> = {\n config(request: AxiosRequestConfig) {\n // request.responseType = \"arraybuffer\";\n },\n parse(response: AxiosResponse): Maybe<MinecraftTextureMeta> {\n return response.data as MinecraftTextureMeta;\n }\n }\n static readonly NBT: ResponseParser<NBTAsset> = {\n config(request: AxiosRequestConfig) {\n request.responseType = \"arraybuffer\";\n },\n parse(response: AxiosResponse): Promise<Maybe<NBTAsset>> {\n return NBTHelper.fromBuffer(Buffer.from(response.data));\n }\n }\n static readonly IMAGE: ResponseParser<TextureAsset> = {\n config(request: AxiosRequestConfig) {\n request.responseType = \"arraybuffer\";\n },\n async parse(response: AxiosResponse): Promise<Maybe<TextureAsset>> {\n return await ImageLoader.processResponse(response) as TextureAsset;\n }\n }\n static readonly LIST: ResponseParser<ListAsset> = {\n config(request: AxiosRequestConfig) {\n },\n parse(response: AxiosResponse): Maybe<ListAsset> {\n return response.data as ListAsset;\n }\n }\n static readonly JSON: ResponseParser<any> = {\n config(request: AxiosRequestConfig) {\n },\n parse(response: AxiosResponse): Maybe<any> {\n return response.data;\n }\n }\n\n static readonly PARSER_MAP: Map<AssetParser, ResponseParser<any>> = new Map<AssetParser, ResponseParser<any>>([\n [AssetParser.MODEL, HostedAssetSource.MODEL],\n [AssetParser.BLOCKSTATE, HostedAssetSource.BLOCKSTATE],\n [AssetParser.META, HostedAssetSource.META],\n [AssetParser.NBT, HostedAssetSource.NBT],\n [AssetParser.IMAGE, HostedAssetSource.IMAGE],\n [AssetParser.LIST, HostedAssetSource.LIST],\n [AssetParser.JSON, HostedAssetSource.JSON],\n ]);\n\n public async loadOrRetryWithDefaults<T extends MinecraftAsset>(key: AssetKey, parser: ResponseParser<T>): Promise<Maybe<T>> {\n const direct = await this.load<T>(key, parser);\n if (typeof direct !== \"undefined\") {\n return direct;\n }\n if (key.namespace !== DEFAULT_NAMESPACE) {\n console.info(p, \"Retrying\", key, \"with default namespace\");\n // Try on the same host but with default minecraft: namespace\n const namespaceKey = new AssetKey(DEFAULT_NAMESPACE, key.path, key.assetType, key.type, key.rootType, key.extension, key.root);\n const namespaced = await this.load<T>(namespaceKey, parser);\n if (typeof namespaced !== \"undefined\") {\n return namespaced;\n }\n if ((typeof key.root !== \"undefined\" && key.root !== DEFAULT_ROOT) || (typeof this.root !== \"undefined\" && this.root !== DEFAULT_ROOT)) {\n console.info(p, \"Retrying\", key, \"with default root+namespace\");\n // Try both defaults\n const namespacedRootedKey = new AssetKey(DEFAULT_NAMESPACE, key.path, key.assetType, key.type, key.rootType, key.extension, DEFAULT_ROOT);\n const namespacedRooted = await this.load<T>(namespacedRootedKey, parser);\n if (typeof namespacedRooted !== \"undefined\") {\n return namespacedRooted;\n }\n }\n } else if ((typeof key.root !== \"undefined\" && key.root !== DEFAULT_ROOT) || (typeof this.root !== \"undefined\" && this.root !== DEFAULT_ROOT)) {\n console.info(p, \"Retrying\", key, \"with default root\");\n // Try on default root\n const rootKey = new AssetKey(key.namespace, key.path, key.assetType, key.type, key.rootType, key.extension, DEFAULT_ROOT);\n const rooted = await this.load<T>(rootKey, parser);\n if (typeof rooted !== \"undefined\") {\n return rooted;\n }\n }\n return undefined;\n }\n\n\n protected async load<T extends MinecraftAsset>(key: AssetKey, parser: ResponseParser<T>): Promise<Maybe<T>> {\n console.info(p, \"Loading\", key);\n const url = `${ this.assetBasePath(key) }${ key.type !== undefined ? key.type + '/' : '' }${ key.path }${ key.extension }`;\n console.debug(p, url);\n let req: AxiosRequestConfig = {\n url: url\n };\n parser.config(req);\n // @ts-ignore\n return await Requests.mcAssetRequest(req)\n .then(response => {\n if (response && response.data) {\n try {\n return parser.parse(response);\n } catch (e) {\n console.warn(\"Parser failed to process response\", response, e);\n throw e;\n }\n }\n return undefined;\n })\n .catch(err => {\n if (err.response) {\n let response = err.response as AxiosResponse;\n if (response.status === 404) {\n console.debug(p, key, \"not found\");\n return undefined;\n }\n }\n console.debug(p, \"Failed to load\", key, err?.message);\n return undefined;\n })\n }\n\n public assetBasePath(key: AssetKey) {\n return `${ key.root ?? this.root ?? AssetLoader.ROOT }/${ key.rootType !== undefined ? key.rootType + '/' : '' }${ key.namespace !== undefined ? key.namespace + '/' : '' }${ key.assetType !== undefined ? key.assetType + '/' : '' }`;\n }\n\n private readonly _root: string;\n private readonly _options: HostedAssetSourceOptions;\n\n public constructor(root: string, options?: Partial<HostedAssetSourceOptions>) {\n super();\n this._root = root;\n this._options = merge({}, DEFAULT_OPTIONS, options ?? {});\n }\n\n public get root(): string {\n return this._root;\n }\n\n public get options(): HostedAssetSourceOptions {\n return this._options;\n }\n\n public get<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser): Promise<Maybe<T>> {\n const responseParser = HostedAssetSource.PARSER_MAP.get(parser) as ResponseParser<T>;\n if (this.options.retryDefaults) {\n return this.loadOrRetryWithDefaults(key, responseParser);\n }\n return this.load(key, responseParser);\n }\n\n}\n\ninterface HostedAssetSourceOptions {\n retryDefaults: boolean;\n}","import { ArchiveProxy } from \"./ArchiveProxy\";\nimport { BlobReader, BlobWriter, ZipReader } from \"@zip.js/zip.js\";\nimport { ArchiveEntry } from \"./ArchiveEntry\";\n\nexport class BrowserArchiveProxy implements ArchiveProxy {\n\n readonly _blob: Blob;\n readonly _reader: ZipReader<Blob>;\n\n constructor(blob: Blob) {\n this._blob = blob;\n this._reader = new ZipReader(new BlobReader(this._blob));\n }\n\n public async getEntries(): Promise<ArchiveEntry[]> {\n return (await this._reader.getEntries()).map(e => {\n return {\n filename: e.filename,\n directory: e.directory,\n getData(): Promise<Blob> {\n return e.getData!(new BlobWriter())\n }\n }\n })\n }\n\n}","import { AssetSource } from \"../AssetSource\";\nimport { ArchiveProxy } from \"./ArchiveProxy\";\nimport { ArchiveEntry } from \"./ArchiveEntry\";\nimport { MinecraftAsset } from \"../../../MinecraftAsset\";\nimport { AssetKey } from \"../../AssetKey\";\nimport { AssetParser, ResponseParser } from \"../parser\";\nimport { Maybe, prefix } from \"../../../util\";\nimport { Requests } from \"../../../request\";\nimport { HostedAssetSource } from \"../HostedAssetSource\";\nimport { AssetLoader } from \"../../AssetLoader\";\nimport { AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { BrowserArchiveProxy } from \"./BrowserArchiveProxy\";\n\nconst p = prefix(\"ArchiveAssetSource\");\n\nexport class ArchiveAssetSource extends AssetSource implements ArchiveProxy {\n\n readonly _archiveProxy: ArchiveProxy;\n\n constructor(archiveProxy: ArchiveProxy) {\n super();\n console.log(archiveProxy)\n this._archiveProxy = archiveProxy;\n }\n\n public static blob(blob: Blob): ArchiveAssetSource {\n return new ArchiveAssetSource(new BrowserArchiveProxy(blob));\n }\n\n public async getEntries(): Promise<ArchiveEntry[]> {\n return this._archiveProxy.getEntries();\n }\n\n public async getEntry(path: string): Promise<Maybe<ArchiveEntry>> {\n const entries = await this.getEntries();\n return entries.find(e => e.filename === path);\n }\n\n async get<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser | string): Promise<Maybe<T>> {\n const responseParser = HostedAssetSource.PARSER_MAP.get(parser as AssetParser) as ResponseParser<T>;\n\n console.log(\"ArchiveAssetSource.get\", key, parser);\n let entries = (await this.getEntries());\n\n const path = `${this.assetBasePath(key)}${key.type !== undefined ? key.type + '/' : ''}${key.path}${key.extension}`;\n console.log(path);\n const entry = await this.getEntry(path);\n console.log(entry);\n if (!entry) {\n return undefined;\n }\n\n let blob = await entry.getData();\n const url = URL.createObjectURL(blob);\n console.log(url);\n let req = {\n url: url,\n };\n responseParser.config(req);\n return Requests.genericRequest(req)\n .then(response => {\n if (response && response.data) {\n try {\n return responseParser.parse(response);\n } catch (e) {\n console.warn(\"Parser failed to process response\", response, e);\n throw e;\n }\n }\n return undefined;\n })\n .catch(err => {\n if (err.response) {\n let response = err.response as AxiosResponse;\n if (response.status === 404) {\n console.debug(p, key, \"not found\");\n return undefined;\n }\n }\n console.debug(p, \"Failed to load\", key, err?.message);\n return undefined;\n })\n }\n\n //TODO: abstract this\n protected async load<T extends MinecraftAsset>(key: AssetKey, parser: ResponseParser<T>): Promise<Maybe<T>> {\n console.info(p, \"Loading\", key);\n const url = `${this.assetBasePath(key)}${key.type !== undefined ? key.type + '/' : ''}${key.path}${key.extension}`;\n console.debug(p, url);\n let req: AxiosRequestConfig = {\n url: url\n };\n parser.config(req);\n // @ts-ignore\n return await Requests.genericRequest(req)\n .then(response => {\n if (response && response.data) {\n try {\n return parser.parse(response);\n } catch (e) {\n console.warn(\"Parser failed to process response\", response, e);\n throw e;\n }\n }\n return undefined;\n })\n .catch(err => {\n if (err.response) {\n let response = err.response as AxiosResponse;\n if (response.status === 404) {\n console.debug(p, key, \"not found\");\n return undefined;\n }\n }\n console.debug(p, \"Failed to load\", key, err?.message);\n return undefined;\n })\n }\n\n public assetBasePath(key: AssetKey) {\n return `${key.rootType !== undefined ? key.rootType + '/' : ''}${key.namespace !== undefined ? key.namespace + '/' : ''}${key.assetType !== undefined ? key.assetType + '/' : ''}`;\n }\n\n}","import { Model, TextureAsset } from \"../model/Model\";\nimport { Maybe } from \"../util/util\";\nimport { Requests } from \"../request/Requests\";\nimport { AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { MinecraftAsset } from \"../MinecraftAsset\";\nimport { ImageInfo, ImageLoader } from \"../image/ImageLoader\";\nimport { MinecraftTextureMeta } from \"../MinecraftTextureMeta\";\nimport { BlockState } from \"../model/block/BlockState\";\nimport { DEFAULT_NAMESPACE, DEFAULT_ROOT } from \"./Assets\";\nimport { ListAsset } from \"../ListAsset\";\nimport { AssetKey } from \"./AssetKey\";\nimport { NBTAsset, NBTHelper } from \"../nbt/NBTHelper\";\nimport { prefix } from \"../util/log\";\nimport { AssetSource } from \"./source/AssetSource\";\nimport { AssetParser } from \"./source/parser/AssetParsers\";\nimport { HostedAssetSource } from \"./source\";\nimport merge from \"ts-deepmerge\";\n\nconst p = prefix(\"AssetLoader\");\n\n\nexport class AssetLoader {\n\n static ROOT: string = DEFAULT_ROOT;\n\n private static _SOURCES: AssetSourceReference[] = [];\n\n public static addSource(key: string, source: AssetSource, override: boolean = true) {\n if (override) {\n const existing = this.removeSource(key);\n if (existing) {\n console.log(p, \"Removed existing AssetSource\", key);\n }\n }\n\n this._SOURCES.unshift({key, source});\n console.log(p, \"Added AssetSource\", key);\n }\n\n public static removeSource(key: string): Maybe<AssetSource> {\n const index = this._SOURCES.findIndex(s => s.key === key);\n if (index != -1) {\n const spliced = this._SOURCES.splice(index, 1);\n if (spliced.length > 0) {\n return spliced[0].source;\n }\n }\n return undefined;\n }\n\n static {\n this.addSource(\"mcassets-fallback\", new HostedAssetSource('https://raw.githubusercontent.com/InventivetalentDev/minerender-fallback-assets/master'));\n this.addSource(\"mcassets\", new HostedAssetSource(DEFAULT_ROOT));\n }\n\n public static async getAll<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser | string): Promise<T[]> {\n console.log(this._SOURCES)\n let promises: Promise<Maybe<T>>[] = [];\n for (const source of this._SOURCES) {\n promises.push(source.source.get<T>(key, parser));\n }\n return Promise.all(promises).then(results => {\n return results.filter(r => r != undefined) as T[];\n });\n }\n\n public static async get<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser | string): Promise<Maybe<T>> {\n console.log(this._SOURCES)\n let promises: Promise<Maybe<T>>[] = [];\n for (const source of this._SOURCES) {\n promises.push(source.source.get<T>(key, parser));\n }\n return Promise.all(promises).then(results => {\n const fallback = results[results.length - 1];\n for (const result of results) {\n if (result) {\n if (fallback) {\n // we have a fallback, so merge it with the result\n return merge({}, fallback, result) as T;\n }\n return result;\n }\n }\n return undefined;\n });\n }\n\n}\n\ninterface AssetSourceReference {\n key: string;\n source: AssetSource;\n}\n","import { Maybe } from \"../util/util\";\nimport { TextureAsset } from \"../model/Model\";\nimport { Caching } from \"../cache/Caching\";\nimport { AssetLoader } from \"./AssetLoader\";\nimport { CompatImage } from \"../canvas/CanvasCompat\";\nimport { ImageLoader } from \"../image/ImageLoader\";\nimport { ExtractableImageData } from \"../ExtractableImageData\";\nimport { MinecraftTextureMeta } from \"../MinecraftTextureMeta\";\nimport { PersistentCache } from \"../cache/PersistentCache\";\nimport { AssetKey } from \"./AssetKey\";\nimport { AssetParser } from \"./source/parser/AssetParsers\";\n\nexport class ModelTextures {\n\n private static _persistentMetaCache: PersistentCache | undefined;\n\n private static get PERSISTENT_META_CACHE(): PersistentCache {\n return this._persistentMetaCache ??= PersistentCache.open(\"minerender-texturemeta\");\n }\n\n public static async get(key: AssetKey): Promise<Maybe<ExtractableImageData>> {\n const asset = await this.preload(key);\n if (asset) {\n return ImageLoader.infoToCanvasData(asset);\n }\n return undefined;\n }\n\n public static async preload(key: AssetKey): Promise<Maybe<TextureAsset>> {\n const keyStr = key.serialize();\n return Caching.textureAssetCache.get(keyStr, k => {\n return AssetLoader.get<TextureAsset>(key, AssetParser.IMAGE).then(asset => {\n if (asset)\n asset.key = key;\n return asset;\n })\n })\n }\n\n public static async getMeta(key: AssetKey): Promise<Maybe<MinecraftTextureMeta>> {\n if (!key.extension || !key.extension.endsWith(\".mcmeta\")) {\n key = Object.assign(new AssetKey(\"\", \"\"), key);\n key.extension += \".mcmeta\";\n }\n const keyStr = key.serialize();\n\n return Caching.textureMetaCache.get(keyStr, k => {\n return this.PERSISTENT_META_CACHE.getOrLoad(keyStr, k1 => {\n return AssetLoader.get<MinecraftTextureMeta>(key, AssetParser.META).then(asset => {\n if (asset)\n asset.key = key;\n return asset;\n })\n })\n })\n }\n\n public static async clearCache() {\n await this.PERSISTENT_META_CACHE.clear();\n }\n\n}\n","import type { ImageData, CanvasRenderingContext2D } from \"canvas\";\nimport { CompatCanvas, createCanvas } from \"./CanvasCompat\";\nimport { Disposable } from \"../Disposable\";\n\nexport class CanvasImage implements Disposable {\n\n readonly canvas: CompatCanvas;\n readonly context: CanvasRenderingContext2D;\n\n constructor(width: number, height: number);\n constructor(data: ImageData);\n constructor(dataOrWidth: ImageData | number, height?: number) {\n if (height) {\n this.canvas = createCanvas(dataOrWidth as number, height);\n } else {\n this.canvas = createCanvas((dataOrWidth as ImageData).width, (dataOrWidth as ImageData).height);\n }\n this.context = this.canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n }\n\n get width(): number {\n return this.canvas.width;\n }\n\n set width(width: number) {\n this.canvas.width = width;\n }\n\n get height(): number {\n return this.canvas.height;\n }\n\n set height(height: number) {\n this.canvas.height = height;\n }\n\n get dataUrl() {\n return this.toDataURL();\n }\n\n toDataURL(): string {\n return this.canvas.toDataURL();\n }\n\n getData(sx: number = 0, sy: number = 0, sw: number = this.width, sh: number = this.height): ImageData {\n return this.context.getImageData(sx, sy, sw, sh);\n }\n\n putData(data: ImageData, dx = 0, dy = 0, dirtyX = 0, dirtyY = 0, dirtyWidth=data.width,dirtyHeight=data.height): void {\n this.context.putImageData(data, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);\n }\n\n test() {\n }\n\n dispose() {\n }\n\n}\n","export interface TickerFunction {\n (): void;\n}\n\ntype IntervalHandle = ReturnType<typeof setInterval>;\n\n/**\n * Shared 20-per-second tick loop, used for things like animated texture frames.\n *\n * The timers are started lazily by {@link Ticker.add} and unref'd where the platform supports it -\n * importing MineRender must never on its own keep a Node process alive.\n */\nexport class Ticker {\n\n public static readonly TPS = 20;\n\n private static counter: number = 0;\n private static readonly _tickers: Map<number, TickerFunction> = new Map<number, TickerFunction>();\n\n private static interval: IntervalHandle | undefined;\n private static oneSecondTicksTracker: IntervalHandle | undefined;\n private static fiveSecondTicksTracker: IntervalHandle | undefined;\n\n private static oneSecondTps = 0;\n private static oneSecondTicks = 0;\n\n private static fiveSecondTps = 0;\n private static fiveSecondTicks = 0;\n\n private static schedule(fn: () => void, ms: number): IntervalHandle {\n const handle = setInterval(fn, ms);\n // Node's Timeout keeps the event loop alive unless unref'd; browsers return a plain number\n const unref = (handle as { unref?: () => void }).unref;\n if (typeof unref === \"function\") {\n unref.call(handle);\n }\n return handle;\n }\n\n public static start(): void {\n if (this.interval) return;\n\n this.interval = this.schedule(() => {\n Ticker._tickers.forEach(t => {\n try {\n t();\n } catch (e) {\n console.warn(e);\n }\n });\n Ticker.oneSecondTicks++;\n Ticker.fiveSecondTicks++;\n }, 1000 / this.TPS);\n\n this.oneSecondTicksTracker = this.schedule(() => {\n Ticker.oneSecondTps = Ticker.oneSecondTicks;\n Ticker.oneSecondTicks = 0;\n }, 1000);\n\n this.fiveSecondTicksTracker = this.schedule(() => {\n Ticker.fiveSecondTps = Ticker.fiveSecondTicks / 5;\n Ticker.fiveSecondTicks = 0;\n }, 1000 * 5);\n }\n\n public static stop(): void {\n if (this.interval) clearInterval(this.interval);\n if (this.oneSecondTicksTracker) clearInterval(this.oneSecondTicksTracker);\n if (this.fiveSecondTicksTracker) clearInterval(this.fiveSecondTicksTracker);\n this.interval = undefined;\n this.oneSecondTicksTracker = undefined;\n this.fiveSecondTicksTracker = undefined;\n }\n\n public static add(tick: TickerFunction): number {\n this.start();\n const c = this.counter++;\n this._tickers.set(c, tick);\n return c;\n }\n\n public static remove(c?: number) {\n // note: plain `if (c)` used to drop id 0, i.e. the very first registered ticker\n if (typeof c === \"number\") this._tickers.delete(c);\n }\n\n public static get tickers(): Map<number, TickerFunction> {\n return this._tickers;\n }\n\n public static get tpsOneSecond() {\n return this.oneSecondTps;\n }\n\n public static get tpsFiveSeconds() {\n return this.fiveSecondTps;\n }\n\n public static dispose() {\n this.stop();\n this._tickers.clear();\n }\n\n}\n","import type { ImageData } from \"canvas\";\nimport { CanvasImage } from \"../canvas/CanvasImage\";\nimport { DoubleArray, Model } from \"../model/Model\";\nimport { AnimatorFunction } from \"../AnimatorFunction\";\nimport Timeout = NodeJS.Timeout;\nimport { Disposable } from \"../Disposable\";\nimport { Ticker } from \"../Ticker\";\n\nexport class TextureAtlas implements Disposable {\n ticker?: number;\n\n constructor(\n readonly model: Model,\n readonly image: CanvasImage,\n readonly sizes: { [texture: string]: DoubleArray },\n readonly positions: { [texture: string]: DoubleArray },\n readonly hasAnimation: boolean,\n readonly animatorFunctions: { [p: string]: AnimatorFunction },\n readonly hasTransparency: boolean\n ) {\n }\n\n getData(texture: string): ImageData {\n const pos = this.positions[texture];\n const size = this.sizes[texture];\n return this.image.getData(pos[0], pos[1], size[0], size[1]);\n }\n\n dispose() {\n this.image.dispose();\n Ticker.remove(this.ticker);\n }\n}\n","import { Model } from \"./Model\";\nimport { BufferGeometry } from \"three/src/core/BufferGeometry\";\nimport type { ImageData } from \"canvas\";\nimport { BoxGeometry, PlaneGeometry } from \"three\";\nimport { UVMapper } from \"../UVMapper\";\nimport { ModelElement } from \"./ModelElement\";\n\nexport class ModelGenerator {\n\n public static readonly ITEM_LAYERS: string[] = [\"layer0\", \"layer1\", \"layer2\", \"layer3\", \"layer4\"];\n\n public static generateItemModel(imageData: ImageData, layer: string): ModelElement[] {\n const mainElement: ModelElement = {\n from: [0,0,7.5],\n to: [16,16,8.5],\n faces: {\n \"south\": {\n uv: [0,0,16,16],\n texture: `#${layer}`\n },\n \"north\": {\n uv: [16,0,0,16],\n texture: `#${layer}`\n }\n },\n shade: true\n };\n //TODO: wrapped edges\n return [mainElement];\n }\n\n}\n","import { CanvasImage } from \"./canvas/CanvasImage\";\nimport { UVMapper } from \"./UVMapper\";\nimport { CUBE_FACES, CubeFace } from \"./CubeFace\";\nimport { DoubleArray, QuadArray } from \"./model/Model\";\nimport { ExtractableImageData } from \"./ExtractableImageData\";\n\n/**\n * down up\n * east north west south\n *\n * bottom-left to top-right\n * [bl, br, tl, tr]\n */\nexport class MinecraftCubeTexture {\n\n constructor(\n readonly u: number, readonly v: number,\n readonly width: number, readonly height: number\n ) {\n }\n\n\n protected mapW(x: number) {\n return x / this.width;\n }\n\n protected mapH(x: number) {\n return 1 - (x / this.height);\n }\n\n getUvEast(w: number, h: number, l: number): QuadArray<DoubleArray> {\n return [\n [this.mapW(this.u), this.mapH(this.v + l + h)],\n [this.mapW(this.u + l), this.mapH(this.v + l + h)],\n [this.mapW(this.u), this.mapH(this.v + l)],\n [this.mapW(this.u + l), this.mapH(this.v + l)],\n ]\n }\n\n getUvWest(w: number, h: number, l: number): QuadArray<DoubleArray> {\n//TODO\n return [\n [this.mapW(this.u + l + w), this.mapH(this.v + l + h)],\n [this.mapW(this.u + l + w + l), this.mapH(this.v + l + h)],\n [this.mapW(this.u + l + w), this.mapH(this.v + l)],\n [this.mapW(this.u + l + w + l), this.mapH(this.v + l)],\n ]\n }\n\n getUvUp(w: number, h: number, l: number): QuadArray<DoubleArray> {\n//TODO\n return [\n [this.mapW(this.u + l + w), this.mapH(this.v + l)],\n [this.mapW(this.u + l + w + w), this.mapH(this.v + l)],\n [this.mapW(this.u + l + w), this.mapH(this.v)],\n [this.mapW(this.u + l + w + w), this.mapH(this.v)],\n ]\n }\n\n getUvDown(w: number, h: number, l: number): QuadArray<DoubleArray> {\n//TODO\n return [\n [this.mapW(this.u + l), this.mapH(this.v + l)],\n [this.mapW(this.u + l + w), this.mapH(this.v + l)],\n [this.mapW(this.u + l), this.mapH(this.v)],\n [this.mapW(this.u + l+w), this.mapH(this.v)],\n ]\n }\n\n getUvSouth(w: number, h: number, l: number): QuadArray<DoubleArray> {\n//TODO\n return [\n [this.mapW(this.u + l + w + l), this.mapH(this.v + l + h)],\n [this.mapW(this.u + l + w + l + w), this.mapH(this.v + l + h)],\n [this.mapW(this.u + l + w + l), this.mapH(this.v + l)],\n [this.mapW(this.u + l + w + l + w), this.mapH(this.v + l)],\n ]\n }\n\n getUvNorth(w: number, h: number, l: number): QuadArray<DoubleArray> {\n//TODO\n return [\n [this.mapW(this.u + l), this.mapH(this.v + l + h)],\n [this.mapW(this.u + l + w), this.mapH(this.v + l + h)],\n [this.mapW(this.u + l), this.mapH(this.v + l)],\n [this.mapW(this.u + l + w), this.mapH(this.v + l)],\n ]\n }\n\n getFaceUv(face: CubeFace, w: number, h: number, l: number): QuadArray<DoubleArray> {\n switch (face) {\n case CubeFace.EAST:\n return this.getUvEast(w, h, l);\n case CubeFace.WEST:\n return this.getUvWest(w, h, l);\n case CubeFace.UP:\n return this.getUvUp(w, h, l);\n case CubeFace.DOWN:\n return this.getUvDown(w, h, l);\n case CubeFace.SOUTH:\n return this.getUvSouth(w, h, l);\n case CubeFace.NORTH:\n return this.getUvNorth(w, h, l);\n }\n }\n\n toUvArray(w: number, h: number, l: number): number[] {\n const uv: number[] = [];\n for (let i = 0; i < CUBE_FACES.length; i++) {\n UVMapper.setFaceUvInArray(uv, i * 4, this.getFaceUv(CUBE_FACES[i], w, h, l));\n }\n return uv;\n }\n\n\n}\n","export class SceneStats {\n\n objectCount: number = 0;\n sceneObjectCount: number = 0;\n instanceCount: number = 0;\n\n}\n","export const TintColors = [\n\n]\n","import { Euler, Vector3 } from \"three\";\n\nexport interface Transformable {\n\n setPositionRotationScale(position?: Vector3, rotation?: Euler, scale?: Vector3): void;\n\n setPosition(position: Vector3): void;\n\n getPosition(): Vector3;\n\n setRotation(rotation: Euler): void;\n\n getRotation(): Euler;\n\n setScale(scale: Vector3): void;\n\n getScale(): Vector3;\n\n}\n\nexport function isTransformable(obj: any): obj is Transformable {\n return \"setPosition\" in obj && \"setRotation\" in obj && \"setScale\" in obj;\n}\n","import { Caching } from \"./cache/Caching\";\nimport { Requests } from \"./request/Requests\";\nimport { Ticker } from \"./Ticker\";\n\n/**\n * Releases every long-lived timer MineRender holds, so a Node process can exit.\n *\n * Both `@inventivetalent/loading-cache` (cache expiry) and `jobqu` (request queue draining) use\n * self-rescheduling timers that are not unref'd, which keeps the event loop alive for as long as\n * the library is loaded. Browsers don't care, but anything headless - a render server, a CLI, a\n * test run - has to call this when it's done.\n *\n * The library stays usable afterwards; the caches and queues simply start over.\n */\nexport function shutdown(): void {\n Ticker.dispose();\n Requests.end();\n Caching.end();\n}\n","import { AssetKey, BasicAssetKey } from \"./AssetKey\";\nimport { EntityModel } from \"../entity/EntityModel\";\nimport { MinecraftAsset } from \"../MinecraftAsset\";\nimport { AssetLoader } from \"./AssetLoader\";\nimport { AssetParser } from \"./source\";\nimport { Maybe } from \"../util\";\nimport { Memoize } from \"typescript-memoize\";\n\nexport class Entities {\n\n @Memoize()\n public static async getBlockEntityModels(): Promise<Maybe<BlockEntityModels>> {\n const key = AssetKey.parse(\"models\", \"minerender:blockEntityModels\");\n console.log(key);\n return AssetLoader.get<BlockEntityModels>(key, AssetParser.JSON);\n }\n\n @Memoize()\n public static async getEntityModels(): Promise<Maybe<EntityModels>> {\n const key = AssetKey.parse(\"models\", \"minerender:entityModels\");\n console.log(key);\n return AssetLoader.get<EntityModels>(key, AssetParser.JSON);\n }\n\n // BlockEntity names are hardcoded\n public static async getBlockList(): Promise<string[]> {\n const models = await this.getBlockEntityModels();\n if (!models) {\n return [];\n }\n return Object.keys(models);\n }\n\n public static async getEntityList(): Promise<string[]> {\n const models = await this.getEntityModels();\n if (!models) {\n return [];\n }\n return Object.keys(models);\n }\n\n public static async getBlock(modelKey: BasicAssetKey, textureKey?: BasicAssetKey): Promise<Maybe<EntityModel>> {\n const models = await this.getBlockEntityModels();\n if (!models) {\n return undefined;\n }\n if (!textureKey) {\n textureKey = modelKey;\n }\n const baseKey = modelKey.path.includes(\"/\") ? new BasicAssetKey(modelKey.namespace, modelKey.path.split(\"\\/\")[0]) : modelKey;\n return {\n key: textureKey,\n parts: models[baseKey.toNamespacedString()]\n }\n }\n\n public static async getEntity(modelKey: BasicAssetKey, textureKey?: BasicAssetKey): Promise<Maybe<EntityModel>> {\n const models = await this.getEntityModels();\n if (!models) {\n return undefined;\n }\n if (!textureKey) {\n textureKey = modelKey\n }\n const baseKey = modelKey.path.includes(\"/\") ? new BasicAssetKey(modelKey.namespace, modelKey.path.split(\"\\/\")[0]) : modelKey;\n return {\n key: textureKey,\n parts: models[baseKey.toNamespacedString()]\n }\n }\n\n\n}\n\nexport class EntityModels implements MinecraftAsset {\n [k: string]: any;\n}\n\nexport class BlockEntityModels implements MinecraftAsset {\n [k: string]: any;\n}\n","import { BoxGeometry, Color, EdgesGeometry, Euler, InstancedMesh, LineBasicMaterial, LineSegments, MathUtils, Matrix4, Mesh, Object3D, Quaternion, Scene, Vector3 } from \"three\";\nimport { ModelElement, ModelFaces } from \"../model/ModelElement\";\nimport { Geometries } from \"../Geometries\";\nimport { UVMapper } from \"../UVMapper\";\nimport { DoubleArray, TripleArray } from \"../model/Model\";\nimport { Axis, axisToVec3 } from \"../Axis\";\nimport { BufferGeometry } from \"three/src/core/BufferGeometry\";\nimport { Material } from \"three/src/materials/Material\";\nimport { SkinPart } from \"../skin/SkinPart\";\nimport { changeEvent, Maybe } from \"../util/util\";\nimport { InstanceReference } from \"../instance/InstanceReference\";\nimport { MineRenderError } from \"../error/MineRenderError\";\nimport { isInstancedMesh, isMesh } from \"../util/three\";\nimport { Disposable, isDisposable } from \"../Disposable\";\nimport { SceneObjectOptions } from \"./SceneObjectOptions\";\nimport merge from \"ts-deepmerge\";\nimport { Instanceable } from \"../instance/Instanceable\";\nimport { isMineRenderScene, MineRenderScene } from \"./MineRenderScene\";\nimport { Transformable } from \"../Transformable\";\nimport generateUUID = MathUtils.generateUUID;\nimport { prefix } from \"../util/log\";\n\nconst p = prefix(\"SceneObject\");\n\nexport class SceneObject extends Object3D implements Disposable, Instanceable, Transformable {\n\n public readonly isSceneObject: true = true;\n\n public static readonly DEFAULT_OPTIONS: SceneObjectOptions = merge({}, <SceneObjectOptions>{\n instanceMeshes: true,\n maxInstanceCount: 50,\n mergeMeshes: true,\n wireframe: false\n });\n public readonly options: SceneObjectOptions;\n\n private _scene: Maybe<MineRenderScene>;\n\n private materialCallbacks: { [key: string]: Array<(mat: Material, key: string) => void>; } = {};\n\n protected _isInstanced: boolean = false;\n _instanceCounter: number = 0;\n\n constructor(options?: Partial<SceneObjectOptions>) {\n super();\n this.options = merge({}, SceneObject.DEFAULT_OPTIONS, options ?? {});\n console.log(\"SceneObject options\", this.options);\n }\n\n public set scene(scene: MineRenderScene) {\n if (!!this._scene) throw new MineRenderError(\"Scene already set\");\n this._scene = scene;\n }\n\n public get scene(): MineRenderScene {\n if (!this._scene) throw new MineRenderError(\"Scene not set\");\n return this._scene;\n }\n\n async init(): Promise<void> {\n }\n\n public notifyDirty() {\n this.dispatchEvent(changeEvent);\n }\n\n //<editor-fold desc=\"GROUPS\">\n\n protected createAndAddGroup(name?: string, x: number = 0, y: number = 0, z: number = 0, offsetAxis?: Axis, offset: number = 0): Object3D {\n const group = this.createGroup(name, x, y, z, offsetAxis, offset);\n\n if (name) {\n let existing = this.getObjectByName(group.name);\n if (existing) {\n this.remove(existing);\n }\n }\n\n console.log(\"add\", group, group.name);\n this.add(group);\n this.notifyDirty();\n return group;\n }\n\n protected createGroup(name?: string, x: number = 0, y: number = 0, z: number = 0, offsetAxis?: Axis, offset: number = 0): Object3D {\n const obj = new Object3D();\n if (name) {\n obj.name = `group:${name}`;\n }\n if (x > 0 || y > 0 || z > 0) {\n obj.position.set(x, y, z);\n }\n if (offsetAxis) {\n obj.translateOnAxis(axisToVec3(offsetAxis), offset);\n }\n return obj;\n }\n\n /**\n * Get a group by its name\n */\n public getGroupByName(name: string): Maybe<Object3D> {\n return this.getObjectByName(`group:${name}`) as Object3D;\n }\n\n /**\n * Toggle visibility of a group\n * @param name name of the group\n * @param visible set the visibility directly, if not set toggles it\n */\n public toggleGroupVisibility(name: string, visible?: boolean): boolean {\n return this.toggleObjectVisibility(this.getGroupByName(name), visible);\n }\n\n //</editor-fold>\n\n //<editor-fold desc=\"MESHES\">\n\n protected addOrReplaceMesh(mesh: Mesh, parent: Object3D, name?: string) {\n if (name) {\n const existing = parent.getObjectByName(mesh.name);\n if (existing) {\n console.log(\"remove\", existing.name, existing);\n parent.remove(existing);\n }\n }\n console.log(\"add\", mesh, mesh.name);\n parent.add(mesh);\n }\n\n protected createAndAddMesh(name?: string, group?: Object3D, geometry?: BufferGeometry, material?: Material | Material[], offsetAxis?: Axis, offset: number = 0): Mesh {\n const mesh = this.createMesh(name, geometry, material, offsetAxis, offset);\n if (group) {\n this.addOrReplaceMesh(mesh, group, name);\n } else {\n this.addOrReplaceMesh(mesh, this, name);\n }\n this.notifyDirty();\n return mesh;\n }\n\n protected createMesh(name?: string, geometry?: BufferGeometry, material?: Material | Material[], offsetAxis?: Axis, offset: number = 0): Mesh {\n const mesh = new Mesh(geometry, material);\n if (name) {\n mesh.name = `mesh:${name}`;\n }\n\n //TODO\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n\n if (offsetAxis) {\n mesh.translateOnAxis(axisToVec3(offsetAxis), offset);\n }\n return mesh;\n }\n\n protected createInstancedMesh(name: Maybe<string>, geometry: BufferGeometry, material: Material | Material[], count: number): InstancedMesh {\n const mesh = new InstancedMesh(geometry, material, count);\n if (name) {\n mesh.name = `mesh:${name}`;\n }\n return mesh;\n }\n\n /**\n * Get a mesh by its name\n */\n public getMeshByName(name: string): Maybe<Mesh> {\n return this.getObjectByName(`mesh:${name}`) as Mesh;\n }\n\n /**\n * Toggle visibility of a mesh\n * @param name name of the mesh\n * @param visible set the visibility directly, if not set toggles it\n */\n public toggleMeshVisibility(name: string, visible?: boolean): boolean {\n return this.toggleObjectVisibility(this.getMeshByName(name), visible);\n }\n\n public iterateAllMeshes(cb: (mesh: Mesh) => void) {\n this.children.forEach(obj => {\n if ((<Mesh>obj).isMesh) {\n cb(obj as Mesh);\n }\n obj.children.forEach(obj1 => {\n if ((<Mesh>obj1).isMesh) {\n cb(obj1 as Mesh);\n }\n })\n })\n }\n\n //</editor-fold>\n\n //<editor-fold desc=\"GEOMETRIES\">\n\n protected _getBoxGeometryFromDimensions([width, height, depth]: TripleArray, faces: ModelFaces, originalTextureSize: DoubleArray, actualTextureSize: DoubleArray): BoxGeometry {\n const uv = UVMapper.facesToUvArray(faces, originalTextureSize, actualTextureSize);\n return Geometries.getBox({\n width,\n height,\n depth,\n uv\n });\n }\n\n protected _getBoxGeometryFromElement(element: ModelElement): BoxGeometry {\n const width = element.to[0] - element.from[0];\n const height = element.to[1] - element.from[1];\n const depth = element.to[2] - element.from[2];\n\n const uv = element.mappedUv;\n\n return Geometries.getBox({\n width,\n height,\n depth,\n uv\n });\n }\n\n protected _getBoxGeometryForDimensionsAndUv(width: number, height: number, depth: number, uv: number[]): BoxGeometry {\n return Geometries.getBox({\n width,\n height,\n depth,\n uv\n });\n }\n\n //</editor-fold>\n\n //<editor-fold desc=\"INSTANCING\">\n\n get isInstanced(): boolean {\n return this._isInstanced;\n }\n\n get instanceCounter(): number {\n return this._instanceCounter;\n }\n\n protected constructInstanceReference(i: number): InstanceReference<SceneObject> {\n return new InstanceReference<this>(this, i);\n }\n\n nextInstance(): InstanceReference<SceneObject> {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n const i = this._instanceCounter++;\n this.setMatrixAt(i, new Matrix4());\n console.debug(p, \"nextInstance \" + i);\n if (i === this.options.maxInstanceCount) {\n console.warn(p, \"Max instance count reached for \" + this);\n }\n if (this.scene) {\n this.scene.stats.instanceCount++;\n }\n this.notifyDirty();\n return this.constructInstanceReference(i);\n }\n\n //</editor-fold>\n\n //<editor-fold desc=\"TRANSFORMATION\">\n\n getMatrixAt(index: number, matrix: Matrix4 = new Matrix4()): Matrix4 {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n const child = this.children[0];\n if (child && isInstancedMesh(child)) {//TODO: figure out why child isn't set\n child.getMatrixAt(index, matrix);\n }\n return matrix;\n }\n\n setMatrixAt(index: number, matrix: Matrix4) {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n const child = this.children[0];\n if (child && isInstancedMesh(child)) {//TODO: figure out why child isn't set\n child.setMatrixAt(index, matrix);\n child.instanceMatrix.needsUpdate = true;\n }\n this.notifyDirty();\n }\n\n setPositionRotationScaleAt(index: number, position?: Vector3, rotation?: Euler, scale?: Vector3) {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n\n const oldPosition = new Vector3();\n const oldRotation = new Quaternion();\n const oldScale = new Vector3();\n\n const matrix = new Matrix4();\n if (!scale || !rotation || !position) {\n this.getMatrixAt(index, matrix).decompose(oldPosition, oldRotation, oldScale);\n }\n\n matrix.compose(\n position ? position : oldPosition,\n rotation ? new Quaternion().setFromEuler(rotation) : oldRotation,\n scale ? scale : oldScale\n );\n\n this.setMatrixAt(index, matrix);\n }\n\n setPositionAt(index: number, position: Vector3) {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n this.setPositionRotationScaleAt(index, position);\n }\n\n getPositionAt(index: number, vector: Vector3 = new Vector3()): Vector3 {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n const matrix = this.getMatrixAt(index)\n vector.setFromMatrixPosition(matrix);\n return vector;\n }\n\n setRotationAt(index: number, rotation: Euler) {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n this.setPositionRotationScaleAt(index, undefined, rotation, undefined);\n }\n\n getRotationAt(index: number, euler: Euler = new Euler()): Euler {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n const matrix = this.getMatrixAt(index)\n euler.setFromRotationMatrix(matrix);\n return euler;\n }\n\n setScaleAt(index: number, scale: Vector3) {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n this.setPositionRotationScaleAt(index, undefined, undefined, scale);\n }\n\n getScaleAt(index: number, vector: Vector3 = new Vector3()): Vector3 {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n const matrix = this.getMatrixAt(index)\n vector.setFromMatrixScale(matrix);\n return vector;\n }\n\n setPositionRotationScale(position?: Vector3, rotation?: Euler, scale?: Vector3): void {\n if (this.isInstanced) {\n //TODO: specific instance\n for (let i = 0; i < this.instanceCounter; i++) {\n this.setPositionRotationScaleAt(i, position, rotation, scale);\n }\n } else {\n if (position) {\n this.position.set(position.x, position.y, position.z);\n }\n if (rotation) {\n this.rotation.set(rotation.x, rotation.y, rotation.z);\n }\n if (scale) {\n this.scale.set(scale.x, scale.y, scale.z);\n }\n }\n this.notifyDirty();\n }\n\n setPosition(position: Vector3) {\n if (this.isInstanced) {\n //TODO: specific instance\n for (let i = 0; i < this.instanceCounter; i++) {\n this.setPositionRotationScaleAt(i, position);\n }\n } else {\n this.position.set(position.x, position.y, position.z);\n }\n this.notifyDirty();\n }\n\n getPosition(): Vector3 {\n if (this.isInstanced) {\n return this.getPositionAt(0);\n } else {\n return this.position;\n }\n }\n\n setRotation(rotation: Euler) {\n if (this.isInstanced) {\n //TODO: specific instance\n for (let i = 0; i < this.instanceCounter; i++) {\n this.setPositionRotationScaleAt(i, undefined, rotation);\n }\n } else {\n this.rotation.set(rotation.x, rotation.y, rotation.z);\n }\n this.notifyDirty();\n }\n\n getRotation(): Euler {\n if (this.isInstanced) {\n return this.getRotationAt(0);\n } else {\n return this.rotation;\n }\n }\n\n setScale(scale: Vector3) {\n if (this.isInstanced) {\n //TODO: specific instance\n for (let i = 0; i < this.instanceCounter; i++) {\n this.setPositionRotationScaleAt(i, undefined, undefined, scale);\n }\n } else {\n this.scale.set(scale.x, scale.y, scale.z);\n }\n this.notifyDirty();\n }\n\n getScale(): Vector3 {\n if (this.isInstanced) {\n return this.getScaleAt(0);\n } else {\n return this.scale;\n }\n }\n\n //</editor-fold>\n\n protected toggleObjectVisibility(object?: Object3D, visible?: boolean): boolean {\n if (object) {\n if (typeof visible !== \"undefined\") {\n object.visible = visible;\n } else {\n object.visible = !object.visible;\n }\n return object.visible;\n }\n this.notifyDirty();\n return false;\n }\n\n //<editor-fold desc=\"CLEANUP\">\n\n public dispose() {\n this.disposeAndRemoveAllChildren();\n this.notifyDirty();\n }\n\n public disposeAndRemoveAllChildren() {\n while (this.children.length > 0) {\n let c = this.children[0];\n if (isDisposable(c)) {\n c.dispose();\n }\n this.remove(c);\n }\n this.notifyDirty();\n }\n\n public removeFromScene() {\n this._scene?.remove(this);\n this.notifyDirty();\n }\n\n //</editor-fold>\n\n}\n\nexport function isSceneObject(obj: any): obj is SceneObject {\n return (<SceneObject>obj).isSceneObject;\n}\n","import { Instanceable } from \"./Instanceable\";\nimport { Euler, Matrix4, Vector3 } from \"three\";\nimport { Transformable } from \"../Transformable\";\nimport { SceneObject } from \"../renderer/SceneObject\";\n\nexport class InstanceReference<T extends Instanceable> implements Transformable {\n\n public readonly isInstanceReference: true = true;\n\n constructor(readonly instanceable: T, readonly index: number) {\n }\n\n nextInstance(): InstanceReference<SceneObject> {\n return this.instanceable.nextInstance();\n }\n\n getMatrix(matrix?: Matrix4): Matrix4 {\n return this.instanceable.getMatrixAt(this.index, matrix);\n }\n\n setMatrix(matrix: Matrix4): void {\n this.instanceable.setMatrixAt(this.index, matrix);\n }\n\n setPositionRotationScale(position?: Vector3, rotation?: Euler, scale?: Vector3): void {\n this.instanceable.setPositionRotationScaleAt(this.index, position, rotation, scale);\n }\n\n setPosition(position: Vector3): void {\n // console.log(\"InstanceReference#setPosition\",position)\n this.instanceable.setPositionAt(this.index, position);\n }\n\n getPosition(): Vector3 {\n return this.instanceable.getPositionAt(this.index);\n }\n\n setRotation(rotation: Euler): void {\n // console.log(\"InstanceReference#setRotation\",rotation)\n this.instanceable.setRotationAt(this.index, rotation);\n }\n\n getRotation(): Euler {\n // console.log(\"InstanceReference#getRotation\")\n return this.instanceable.getRotationAt(this.index);\n }\n\n setScale(scale: Vector3): void {\n this.instanceable.setScaleAt(this.index, scale);\n }\n\n getScale(): Vector3 {\n return this.instanceable.getScaleAt(this.index);\n }\n\n //TODO: support for custom methods e.g. setting block variants\n\n}\n\nexport function isInstanceReference(obj: any): obj is InstanceReference<any> {\n return (<InstanceReference<any>>obj).isInstanceReference;\n}\n","// https://stackoverflow.com/a/60323233/6257838\nexport class MineRenderError extends Error {\n constructor(msg) {\n super(msg);\n Object.setPrototypeOf(this, MineRenderError.prototype);\n }\n\n get name(): string {\n return 'MineRenderError';\n }\n}\n","import { SceneObject } from \"../../renderer/SceneObject\";\nimport { BlockState, BlockStateVariant, BlockStateVariants, MultipartCondition } from \"../../model/block/BlockState\";\nimport { SceneObjectOptions } from \"../../renderer/SceneObjectOptions\";\nimport { Caching } from \"../../cache/Caching\";\nimport { Models } from \"../../assets/Models\";\nimport { Assets, DEFAULT_NAMESPACE } from \"../../assets/Assets\";\nimport merge from \"ts-deepmerge\";\nimport { AxesHelper, Euler, Matrix4, Object3D, Vector3 } from \"three\";\nimport { Maybe, toRadians } from \"../../util/util\";\nimport { addWireframeToMesh, addWireframeToObject, applyElementRotation, applyGenericRotation, applyModelPartRotation } from \"../../util/model\";\nimport { ModelTextures } from \"../../assets/ModelTextures\";\nimport { AssetKey } from \"../../assets/AssetKey\";\nimport { ExtractableImageData } from \"../../ExtractableImageData\";\nimport { Materials } from \"../../Materials\";\nimport { MinecraftCubeTexture } from \"../../MinecraftCubeTexture\";\nimport * as THREE from \"three\";\nimport { Ticker } from \"../../Ticker\";\nimport { EntityModel } from \"../EntityModel\";\n\nexport class EntityObject extends SceneObject {\n\n public readonly isEntityObject: true = true;\n\n public static readonly DEFAULT_OPTIONS: EntityObjectOptions = merge({}, SceneObject.DEFAULT_OPTIONS, <EntityObjectOptions>{});\n public readonly options: EntityObjectOptions;\n\n private imageData?: ExtractableImageData;\n\n private meshesCreated: boolean = false;\n\n constructor(readonly entity: EntityModel, options?: Partial<EntityObjectOptions>) {\n super();\n this.options = merge({}, SceneObject.DEFAULT_OPTIONS, options ?? {});\n //TODO\n }\n\n async init(): Promise<void> {\n this.createMeshes();\n await this.applyTextures();\n }\n\n dispose() {\n super.dispose();\n }\n\n protected async loadTextures(): Promise<void> {\n this.imageData = await ModelTextures.get(new AssetKey(\n this.entity.key?.namespace ?? DEFAULT_NAMESPACE,\n this.entity.key!.path, //TODO: texture may differ from entity name; most of them are in subdirectories for multiple variants etc.\n \"textures\",\n \"entity\",\n \"assets\",\n \".png\"\n ))\n }\n\n //TODO: abstract this, since extracted model data can be used for entities, blocks, players\n protected createMeshes(force: boolean = false) {\n if (this.meshesCreated && !force) return;\n\n const mat = Materials.MISSING_TEXTURE;\n\n //TODO: don't know which parts are actually meant to be rendered atm\n for (let partName in this.entity.parts) {\n const part = this.entity.parts[partName];\n const texture = new MinecraftCubeTexture(part.textureOffsetU, part.textureOffsetV, part.textureWidth, part.textureHeight);\n const partAnchor = new Object3D();\n partAnchor.position.x = part.pivotX;\n partAnchor.position.y = part.pivotY;\n partAnchor.position.z = part.pivotZ;\n for (let cube of part.cubes) {\n const w = cube.maxX - cube.minX;\n const h = cube.maxY - cube.minY;\n const l = cube.maxZ - cube.minZ;\n const uv = texture.toUvArray(w, h, l);\n\n //TODO: mirror\n // MC does it by flipping min and max X; might be easier than moving around all face UVs\n\n const cubeGeo = this._getBoxGeometryForDimensionsAndUv(w, h, l, uv).clone();\n\n cubeGeo.applyMatrix4(new THREE.Matrix4().makeTranslation(w / 2, h / 2, l / 2));\n cubeGeo.applyMatrix4(new THREE.Matrix4().makeTranslation(cube.minX, cube.minY, cube.minZ));\n\n applyModelPartRotation(part, cubeGeo);\n\n\n // TODO: merge parts\n // const mesh = this.createAndAddMesh(partName, undefined, cubeGeo, mat);\n const mesh = this.createMesh(partName, cubeGeo, mat);\n partAnchor.add(mesh);\n if (this.options.wireframe) {\n addWireframeToMesh(cubeGeo, mesh);\n }\n }\n this.add(partAnchor);\n }\n\n //TODO\n\n this.meshesCreated = true;\n }\n\n protected async applyTextures() {\n\n const textureAsset = await ModelTextures.preload(new AssetKey(\n this.entity.key?.namespace ?? DEFAULT_NAMESPACE,\n this.entity.key!.path,\n \"textures\",\n \"entity\",\n \"assets\",\n \".png\"\n ));\n // if (this.atlas!.model.textures) {\n // for (let textureKey in this.atlas!.model.textures) {\n // let asset = this.textureMap[textureKey];\n // if (asset) {\n //TODO: transparency\n if (textureAsset) {\n let mat = Materials.getImage({ texture: { src: textureAsset.src! } })\n this.iterateAllMeshes(mesh => {\n mesh.material = mat;\n });\n }\n // }\n // }\n // }\n }\n\n\n}\n\nexport interface EntityObjectOptions extends SceneObjectOptions {\n}\n\nexport function isEntityObject(obj: any): obj is EntityObject {\n return (<EntityObject>obj).isEntityObject;\n}\n","import { Renderer, RendererOptions } from \"../../renderer/Renderer\";\nimport { SceneObject } from \"../../renderer/SceneObject\";\nimport { SceneObjectOptions } from \"../../renderer/SceneObjectOptions\";\n\nexport class GuiObject extends SceneObject {\n\n //TODO\n\n}\n\nexport interface GuiObjectOptions extends SceneObjectOptions {\n\n}\n","import { Renderer } from \"../renderer/Renderer\";\nimport { InstancedMesh, Intersection, Mesh, Object3D, Raycaster, Vector2 } from \"three\";\nimport { isSceneObject, SceneObject } from \"../renderer/SceneObject\";\nimport { Maybe, toDegrees, toRadians } from \"../util/util\";\nimport { isTransformable, Transformable } from \"../Transformable\";\nimport { prefix } from \"../util/log\";\nimport { isMesh } from \"../util/three\";\nimport { TextureAtlas } from \"../texture\";\n\nconst p = prefix(\"SceneInspector\");\n\nconst help = \"<span>Ctrl+Click to Select<br/></span><br/>\";\n\nexport class SceneInspector {\n\n readonly objectInfoContainer: HTMLDivElement;\n readonly objectControlsContainer: HTMLDivElement;\n\n protected readonly raycaster: Raycaster;\n private readonly mouse: Vector2 = new Vector2();\n\n private selectedObject?: Object3D;\n\n constructor(readonly renderer: Renderer) {\n this.objectInfoContainer = document.createElement(\"div\");\n this.objectControlsContainer = document.createElement(\"div\");\n\n this.raycaster = new Raycaster();\n\n this.init();\n }\n\n protected init() {\n this.objectInfoContainer.classList.add(\"minerender-inspector\", \"minerender-object-info\");\n this.objectControlsContainer.classList.add(\"minerender-inspector\", \"minerender-object-controls\");\n\n this.objectInfoContainer.innerHTML = help;\n\n document.addEventListener(\"click\", this.onClick.bind(this), {\n passive: true\n })\n }\n\n findMeshChildren(from: Object3D, out: Mesh[] = []) {\n for (let c of from.children) {\n if (isMesh(c)) {\n out.push(c);\n }\n this.findMeshChildren(c, out);\n }\n return out;\n }\n\n onClick(event) {\n if ((<HTMLElement>event.target)?.nodeName !== \"CANVAS\") return;\n if (!event.ctrlKey) return;\n\n setTimeout(() => {\n this.mouse.x = (event.clientX / window.innerWidth) * 2 - 1;\n this.mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;\n this.raycaster.setFromCamera(this.mouse, this.renderer.camera);\n let start = Date.now();\n let targets = this.findMeshChildren(this.renderer.scene);\n const intersects = this.raycaster.intersectObjects(targets, false);\n console.debug(\"Raycast took \" + (Date.now() - start) + \"ms for \" + targets.length + \" possible targets with \" + intersects.length + \" results\");\n if (intersects.length > 0) {\n this.handleRaycasterObjects(intersects)\n }\n });\n }\n\n appendTo(el: HTMLElement) {\n el.append(this.objectInfoContainer);\n el.append(this.objectControlsContainer);\n }\n\n protected handleRaycasterObjects(intersections: Intersection[]) {\n console.debug(intersections);\n const firstIntersection = intersections[0];\n if (firstIntersection && firstIntersection.object) {\n const firstObject = firstIntersection.object;\n\n let targetIntersection: Maybe<Intersection> = undefined;\n let targetObject: Maybe<Object3D> = undefined;\n const firstSceneObjectIntersection = intersections.find(i => i.object && i.object.parent && isSceneObject(i.object.parent));\n if (firstSceneObjectIntersection && firstSceneObjectIntersection.object) {\n targetIntersection = firstSceneObjectIntersection;\n targetObject = firstSceneObjectIntersection.object;\n } else {\n // fallback to first intersect\n targetIntersection = firstIntersection;\n targetObject = firstObject;\n }\n\n if (!targetIntersection || !targetObject) return;\n\n this.selectObject(targetObject, targetIntersection);\n }\n }\n\n public selectObject(targetObject: Object3D, targetIntersection?: Intersection) {\n this.selectedObject = targetObject;\n console.log(p, \"selected\", targetObject);\n\n this.redraw(targetObject, targetIntersection);\n }\n\n protected redraw(targetObject: Object3D, targetIntersection?: Intersection) {\n this.objectInfoContainer.innerHTML = help;\n if (targetIntersection) {\n this.addInfoLine(\"Distance\", \"D\", targetIntersection.distance);\n this.addInfoLine(\"Instance #\", \"I\", targetIntersection.instanceId);\n }\n this.addInfoLine(\"Type\", \"T\", targetObject.constructor.name + \"/\" + targetObject.type);\n this.addInfoLine(\"Name\", \"N\", targetObject.name);\n if (targetObject.parent) {\n this.addInfoLine(\"Parent\", \"P\", targetObject.parent.constructor.name);\n if (isSceneObject(targetObject.parent)) {\n //...\n }\n }\n\n if ('atlas' in targetObject) {\n const atlas = targetObject['atlas'] as TextureAtlas;\n // const img = document.createElement(\"img\");\n const img = atlas.image.canvas as HTMLCanvasElement;\n // img.src = atlas.image.dataUrl;\n img.style.width = \"100px\";\n img.style.height = \"100px\";\n img.style.float = \"right\";\n img.style.imageRendering = \"pixelated\";\n this.objectInfoContainer.prepend(img);\n }\n\n this.objectControlsContainer.innerHTML = '';\n this.addControls(targetObject, targetIntersection);\n }\n\n protected addControls(object: Object3D, intersection?: Intersection) {\n const container = document.createElement(\"div\");\n\n container.append(this.separator(\"Select Parent/Child\"));\n\n if (object.parent) {\n container.append(this.buttonControl(\"Select Parent \" + object.parent.constructor.name + \" \" + object.parent.name, \"P\", () => {\n this.selectObject(object.parent!, intersection);\n }));\n }\n if (object.children.length > 0) {\n let i = 1;\n for (let child of object.children) {\n container.append(this.buttonControl(\"Select Child \" + child.constructor.name + \" \" + child.name, \"C\" + (i++), () => {\n this.selectObject(child, intersection);\n }));\n }\n }\n container.append(this.separator());\n\n container.append(this.toggleControl(\"Visibility\", \"V\", object.visible, v => object.visible = v));\n\n // let transformTarget = object.parent!;\n // container.append(this.selectControl(\"Transform Target\",\"T\",[\"parent\",\"mesh\"],v=>{\n // switch (v) {\n // case \"parent\":\n // transformTarget = object.parent!;\n // break;\n // case \"mesh\":\n // transformTarget = object;\n // break;\n // }\n // }))\n\n\n // if(object.parent) {\n // container.append(this.separator(\"Parent\"))\n // this.addObjectControls(object.parent, intersection, container);\n // container.append(this.separator());\n // }\n\n\n container.append(this.separator(\"Mesh\"))\n this.addObjectControls(object, intersection, container);\n container.append(this.separator());\n\n\n this.objectControlsContainer.append(container);\n }\n\n\n protected addInfoLine(name: string, id: string, value: any): HTMLElement {\n const el = document.createElement(\"span\");\n el.innerText = `${ id }: ${ value }`;\n el.setAttribute(\"title\", name);\n\n this.objectInfoContainer.append(el);\n this.objectInfoContainer.append(document.createElement(\"br\"));\n\n return el;\n }\n\n\n protected addObjectControls(target: Object3D, intersection: Maybe<Intersection>, container: HTMLElement) {\n\n const posRange = 16 * 16;\n const rotRange = 360;\n const scaleRange = 4;\n\n if (typeof intersection !== \"undefined\" && typeof intersection.instanceId !== \"undefined\" && isSceneObject(target) && (<SceneObject>target).isInstanced) {\n const scObj: SceneObject = target as SceneObject;\n\n container.append(this.separator(\"Position\"))\n\n let pos = scObj.getPositionAt(intersection.instanceId);\n container.append(this.rangeControl(\"X Position\", \"X\", -posRange + pos.x, posRange + pos.x, pos.x, 1, v => {\n pos = scObj.getPositionAt(intersection.instanceId!);\n pos.x = v;\n scObj.setPositionAt(intersection.instanceId!, pos);\n }));\n container.append(this.rangeControl(\"Y Position\", \"Y\", -posRange + pos.y, posRange + pos.y, pos.y, 1, v => {\n pos = scObj.getPositionAt(intersection.instanceId!);\n pos.y = v;\n scObj.setPositionAt(intersection.instanceId!, pos);\n }));\n container.append(this.rangeControl(\"Z Position\", \"Z\", -posRange + pos.z, posRange + pos.z, pos.z, 1, v => {\n pos = scObj.getPositionAt(intersection.instanceId!);\n pos.z = v;\n scObj.setPositionAt(intersection.instanceId!, pos);\n }));\n\n container.append(this.separator(\"Rotation\"))\n\n let rot = scObj.getRotationAt(intersection.instanceId);\n container.append(this.rangeControl(\"X Rotation\", \"X\", 0, rotRange, Math.round(toDegrees(rot.x)), 1, v => {\n rot = scObj.getRotationAt(intersection.instanceId!);\n rot.x = toRadians(v);\n scObj.setRotationAt(intersection.instanceId!, rot);\n }));\n container.append(this.rangeControl(\"Y Rotation\", \"Y\", 0, rotRange, Math.round(toDegrees(rot.y)), 1, v => {\n rot = scObj.getRotationAt(intersection.instanceId!);\n rot.y = toRadians(v);\n scObj.setRotationAt(intersection.instanceId!, rot);\n }));\n container.append(this.rangeControl(\"Z Rotation\", \"Z\", 0, rotRange, Math.round(toDegrees(rot.z)), 1, v => {\n rot = scObj.getRotationAt(intersection.instanceId!);\n rot.z = toRadians(v);\n scObj.setRotationAt(intersection.instanceId!, rot);\n }));\n\n container.append(this.separator(\"Scale\"))\n\n let scl = scObj.getScale();\n container.append(this.rangeControl(\"X Scale\", \"X\", 0, scaleRange, scl.x, 0.1, v => {\n scl = scObj.getScaleAt(intersection.instanceId!);\n scl.x = v;\n scObj.setScaleAt(intersection.instanceId!, scl);\n }));\n container.append(this.rangeControl(\"Y Scale\", \"Y\", 0, scaleRange, scl.y, 0.1, v => {\n scl = scObj.getScaleAt(intersection.instanceId!);\n scl.y = v;\n scObj.setScaleAt(intersection.instanceId!, scl);\n }));\n container.append(this.rangeControl(\"Z Scale\", \"Z\", 0, scaleRange, scl.z, 0.1, v => {\n scl = scObj.getScaleAt(intersection.instanceId!);\n scl.z = v;\n scObj.setScaleAt(intersection.instanceId!, scl);\n }));\n } else if (isTransformable(target)) {\n const parent: Transformable = target;\n\n container.append(this.separator(\"Position\"))\n\n let pos = parent.getPosition();\n container.append(this.rangeControl(\"X Position\", \"X\", -posRange, posRange, pos.x, 1, v => {\n pos = parent.getPosition();\n pos.x = v;\n parent.setPosition(pos)\n }));\n container.append(this.rangeControl(\"Y Position\", \"Y\", -posRange, posRange, pos.y, 1, v => {\n pos = parent.getPosition();\n pos.y = v;\n parent.setPosition(pos)\n }));\n container.append(this.rangeControl(\"Z Position\", \"Z\", -posRange, posRange, pos.z, 1, v => {\n pos = parent.getPosition();\n pos.z = v;\n parent.setPosition(pos)\n }));\n\n container.append(this.separator(\"Rotation\"))\n\n let rot = parent.getRotation();\n container.append(this.rangeControl(\"X Rotation\", \"X\", 0, rotRange, Math.round(toDegrees(rot.x)), 1, v => {\n rot = parent.getRotation();\n rot.x = toRadians(v);\n parent.setRotation(rot);\n }));\n container.append(this.rangeControl(\"Y Rotation\", \"Y\", 0, rotRange, Math.round(toDegrees(rot.y)), 1, v => {\n rot = parent.getRotation();\n rot.y = toRadians(v);\n parent.setRotation(rot);\n }));\n container.append(this.rangeControl(\"Z Rotation\", \"Z\", 0, rotRange, Math.round(toDegrees(rot.z)), 1, v => {\n rot = parent.getRotation();\n rot.z = toRadians(v);\n parent.setRotation(rot);\n }));\n\n container.append(this.separator(\"Scale\"))\n\n let scl = parent.getScale();\n container.append(this.rangeControl(\"X Scale\", \"X\", 0, scaleRange, scl.x, 0.1, v => {\n scl = parent.getScale();\n scl.x = v;\n parent.setScale(scl);\n }));\n container.append(this.rangeControl(\"Y Scale\", \"Y\", 0, scaleRange, scl.y, 0.1, v => {\n scl = parent.getScale();\n scl.y = v;\n parent.setScale(scl);\n }));\n container.append(this.rangeControl(\"Z Scale\", \"Z\", 0, scaleRange, scl.z, 0.1, v => {\n scl = parent.getScale();\n scl.z = v;\n parent.setScale(scl);\n }));\n } else {\n container.append(this.separator(\"Position\"))\n\n container.append(this.rangeControl(\"X Position\", \"X\", -posRange, posRange, target.position.x, 1, v => target!.position.setX(v)));\n container.append(this.rangeControl(\"Y Position\", \"Y\", -posRange, posRange, target.position.y, 1, v => target!.position.setY(v)));\n container.append(this.rangeControl(\"Z Position\", \"Z\", -posRange, posRange, target.position.z, 1, v => target!.position.setZ(v)));\n\n container.append(this.separator(\"Rotation\"))\n\n container.append(this.rangeControl(\"X Rotation\", \"X\", 0, rotRange, toDegrees(target.rotation.x), 1, v => target!.rotation.x = toRadians(v)));\n container.append(this.rangeControl(\"Y Rotation\", \"Y\", 0, rotRange, toDegrees(target.rotation.y), 1, v => target!.rotation.y = toRadians(v)));\n container.append(this.rangeControl(\"Z Rotation\", \"Z\", 0, rotRange, toDegrees(target.rotation.z), 1, v => target!.rotation.z = toRadians(v)));\n\n container.append(this.separator(\"Scale\"))\n\n container.append(this.rangeControl(\"X Scale\", \"X\", 0, scaleRange, target.scale.x, 0.1, v => target!.scale.x = v));\n container.append(this.rangeControl(\"Y Scale\", \"Y\", 0, scaleRange, target.scale.y, 0.1, v => target!.scale.y = v));\n container.append(this.rangeControl(\"Z Scale\", \"Z\", 0, scaleRange, target.scale.z, 0.1, v => target!.scale.z = v));\n }\n }\n\n protected buttonControl(name: string, id: string, click: () => void): HTMLElement {\n const button = document.createElement(\"button\");\n button.innerText = id;\n button.setAttribute(\"title\", name);\n button.addEventListener(\"click\", click);\n return button;\n }\n\n protected selectControl(name: string, id: string, options: string[], change: (v: string) => void): HTMLElement {\n const label = document.createElement(\"label\");\n label.innerText = id;\n label.setAttribute(\"title\", name);\n\n const select = document.createElement(\"select\");\n options.forEach(o => {\n const opt = document.createElement(\"option\");\n opt.value = o;\n opt.innerText = o;\n select.append(opt);\n });\n select.addEventListener(\"change\", e => {\n change(options[select.selectedIndex]);\n });\n select.selectedIndex = 0;\n label.append(select);\n label.append(document.createElement(\"br\"));\n return label;\n }\n\n protected toggleControl(name: string, id: string, val: boolean, change: (v: boolean) => void): HTMLElement {\n const label = document.createElement(\"label\");\n label.innerText = id;\n label.setAttribute(\"title\", name);\n\n const toggle = document.createElement(\"input\");\n toggle.setAttribute(\"type\", \"checkbox\");\n toggle.checked = val; //TODO: instance\n toggle.addEventListener(\"change\", e => {\n change(toggle.checked);\n });\n label.append(toggle);\n label.append(document.createElement(\"br\"));\n return label;\n }\n\n protected rangeControl(name: string, id: string, min: number, max: number, val: number, step: number, change: (v: number) => void): HTMLElement {\n const label = document.createElement(\"label\");\n const labelText = document.createElement(\"span\");\n label.append(labelText);\n label.setAttribute(\"title\", name);\n labelText.style.width = \"18%\";\n labelText.style.display = \"inline-block\";\n labelText.innerText = `${ id } (${ val })`;\n\n const range = document.createElement(\"input\");\n range.setAttribute(\"type\", \"range\");\n range.style.width = \"80%\";\n range.max = `${ max }`;\n range.min = `${ min }`;\n range.step = `${ step }`;\n range.value = `${ val }`;\n const onChange = () => {\n change(parseFloat(range.value));\n labelText.innerText = `${ id } (${ range.value })`\n };\n // range.addEventListener(\"change\", onChange);\n range.addEventListener(\"input\", onChange);\n range.addEventListener(\"wheel\", e => {\n e.preventDefault();\n if (e.deltaY < 0) {\n range.value = `${ parseFloat(range.value) + step }`;\n onChange();\n } else if (e.deltaY > 0) {\n range.value = `${ parseFloat(range.value) - step }`;\n onChange();\n }\n })\n label.append(range);\n label.append(document.createElement(\"br\"));\n return label;\n }\n\n protected separator(name?: string): HTMLElement {\n const span = document.createElement(\"span\");\n if (name) {\n span.innerText = name;\n }\n span.prepend(document.createElement(\"br\"));\n span.append(document.createElement(\"br\"));\n return span;\n }\n\n}\n","import { MineRenderScene } from \"../renderer/MineRenderScene\";\nimport { Renderer } from \"../renderer/Renderer\";\n\nexport class SceneStatsDisplay {\n\n readonly statsContainer: HTMLDivElement;\n\n private readonly lines: StatLine[] = [];\n\n constructor(readonly renderer: Renderer) {\n this.statsContainer = document.createElement(\"div\");\n\n this.init();\n }\n\n protected init() {\n this.statsContainer.classList.add(\"minerender-stats\");\n\n setInterval(() => {\n for (let line of this.lines) {\n line.update();\n }\n }, 1000);\n }\n\n appendTo(el: HTMLElement) {\n el.append(this.statsContainer);\n }\n\n add(line?: StatLine) {\n if (typeof line !== \"undefined\") {\n this.lines.push(line);\n this.statsContainer.append(line.wrapper);\n }\n this.statsContainer.append(document.createElement(\"br\"));\n }\n\n\n\n}\n\nclass StatLine {\n\n readonly wrapper: HTMLSpanElement;\n readonly element: HTMLSpanElement;\n\n value: number = 0;\n\n constructor(readonly key: string, readonly shortName: string, readonly longName: string, readonly valueProvider: () => number) {\n this.wrapper = document.createElement(\"span\");\n this.wrapper.classList.add(\"minerender-stat-wrapper\");\n this.wrapper.title = longName;\n\n this.element = document.createElement(\"span\");\n this.element.classList.add(\"minerender-stat\");\n this.element.id = \"minerender-stat-\" + key;\n this.element.dataset[\"stat\"] = key;\n\n this.wrapper.append(shortName);\n this.wrapper.append(this.element);\n }\n\n update() {\n this.value = this.valueProvider();\n this.element.innerText = `${ this.value }`;\n }\n\n}\n","import { InstanceReference } from \"./InstanceReference\";\nimport { SceneObject } from \"../renderer/SceneObject\";\nimport { Maybe } from \"../util/util\";\nimport { prefix } from \"../util/log\";\n\nconst p = prefix(\"InstanceManager\");\n\nexport class InstanceManager {\n\n public readonly isInstanceManager: true = true;\n\n protected readonly instanceCache: { [key: string]: Promise<InstanceReference<SceneObject>>; } = {};\n\n constructor() {\n }\n\n public async get<T extends SceneObject>(key: string): Promise<Maybe<InstanceReference<T>>> {\n if (key in this.instanceCache) {\n console.debug(p, \"key in cache\", key)\n // create next instance of existing object\n return (await this.instanceCache[key]).nextInstance() as InstanceReference<T>;\n }\n return undefined;\n }\n\n public async getOrCreate<T extends SceneObject>(key: string, supplier: () => T | Promise<T>): Promise<InstanceReference<T>> {\n if (key in this.instanceCache) {\n return await (this.get<T>(key)) as InstanceReference<T>;\n }\n console.debug(p, \"key not in cache\", key)\n this.instanceCache[key] = new Promise<InstanceReference<SceneObject>>(async (resolve) => {\n const obj = await supplier();\n const instance = obj.nextInstance();\n // this.instanceCache[key] = Promise.resolve(instance);\n resolve(instance);\n })\n return await this.instanceCache[key] as InstanceReference<T>;\n }\n\n public reset() {\n for (let instanceCacheKey in this.instanceCache) {\n delete this.instanceCache[instanceCacheKey];\n }\n }\n\n\n}\n\nexport function isInstanceManager(obj: any): obj is InstanceManager {\n return (<InstanceManager>obj).isInstanceManager;\n}\n","import { InstanceReference } from \"./InstanceReference\";\nimport { MineRenderError } from \"../error/MineRenderError\";\nimport { Euler, Matrix4, Vector3 } from \"three\";\nimport { isInstancedMesh } from \"../util/three\";\nimport { SceneObject } from \"../renderer/SceneObject\";\n\nexport interface Instanceable {\n\n nextInstance(): InstanceReference<SceneObject>;\n\n getMatrixAt(index: number, matrix?: Matrix4): Matrix4;\n\n setMatrixAt(index: number, matrix: Matrix4): void;\n\n setPositionRotationScaleAt(index: number, position?: Vector3, rotation?: Euler, scale?: Vector3): void;\n\n setPositionAt(index: number, position: Vector3): void;\n\n getPositionAt(index: number, vector?: Vector3): Vector3;\n\n setRotationAt(index: number, rotation: Euler): void;\n\n getRotationAt(index: number, euler?: Euler): Euler;\n\n setScaleAt(index: number, scale: Vector3): void;\n\n getScaleAt(index: number, vector?: Vector3): Vector3;\n\n}\n\nexport function isInstanceable(obj: any): obj is Instanceable {\n return 'nextInstance' in obj;\n}\n","export enum DisplayPosition {\n THIRDPERSON_RIGHTHAND = \"thirdperson_righthand\",\n THIRDPERSON_LEFTHAND = \"thirdperson_lefthand\",\n FIRSTPERSON_RIGHTHAND = \"firstperson_righthand\",\n FIRSTPERSON_LEFTHAND = \"firstperson_lefthand\",\n GUI = \"gui\",\n HEAD = \"head\",\n GROUND = \"ground\",\n FIXED = \"fixed\",\n}\n\nexport const DISPLAY_POSITIONS = Object.values(DisplayPosition);\n","export enum GuiLight {\n FRONT=\"front\",\n SIDE=\"side\"\n}\n","import { ModelElement } from \"./ModelElement\";\nimport { DisplayPosition } from \"./DisplayPosition\";\nimport { GuiLight } from \"./GuiLight\";\nimport { MinecraftAsset } from \"../MinecraftAsset\";\nimport { ImageInfo } from \"../image/ImageLoader\";\n\nexport const ITEM_GENERATED = \"item/generated\";\nexport const BUILTIN_GENERATED = \"builtin/generated\";\nexport const BUILTIN_ENTITY = \"builtin/entity\";\n\nexport const DEFAULT_ELEMENTS: ModelElement[] = []\n\nexport interface Model extends MinecraftAsset {\n textures?: IModelTextures;\n parent?: string;\n display?: ModelDisplay;\n elements?: ModelElement[];\n hierarchy?: string[];\n}\n\nexport interface BlockModel extends Model {\n textures?: BlockModelTextures;\n ambientocclusion?: boolean;\n}\n\nexport interface ItemModel extends Model {\n textures?: ItemModelTextures;\n gui_light?: GuiLight;\n}\n\nexport interface TextureAsset extends MinecraftAsset, ImageInfo {\n}\n\nexport interface ModelDisplay {\n position?: DisplayPosition;\n translation?: TripleArray;\n rotation?: TripleArray;\n scale?: TripleArray;\n}\n\nexport interface IModelTextures {\n [variable: string]: string;\n}\n\nexport interface BlockModelTextures extends IModelTextures {\n particle: string;\n}\n\nexport interface ItemModelTextures extends BlockModelTextures {\n /*layerN: number*/\n}\n\nexport type DoubleArray<T = number> = [T, T];\nexport type TripleArray<T = number> = [T, T, T];\nexport type QuadArray<T = number> = [T, T, T, T];\n\nexport function isDoubleArray(obj: any): obj is DoubleArray {\n return Array.isArray(obj) && obj.length === 2;\n}\n\nexport function isTripleArray(obj: any): obj is TripleArray {\n return Array.isArray(obj) && obj.length === 3;\n}\n\nexport function isQuadArray(obj: any): obj is QuadArray {\n return Array.isArray(obj) && obj.length === 4;\n}\n","import { SceneObject } from \"../../renderer/SceneObject\";\nimport { Model, TextureAsset } from \"../Model\";\nimport { Materials } from \"../../Materials\";\nimport { Maybe, toRadians } from \"../../util/util\";\nimport { UVMapper } from \"../../UVMapper\";\nimport { TextureAtlas } from \"../../texture/TextureAtlas\";\nimport { BoxGeometry, BoxHelper, BufferAttribute, EdgesGeometry, InstancedMesh, LineBasicMaterial, LineSegments, Material, Matrix4, Mesh, MeshBasicMaterial, MeshStandardMaterial, ShaderMaterial } from \"three\";\nimport { mergeBufferGeometries } from \"../../three/BufferGeometryUtils\";\nimport { SceneObjectOptions } from \"../../renderer/SceneObjectOptions\";\nimport { addBox3WireframeToObject, addWireframeToMesh, addWireframeToObject, applyElementRotation } from \"../../util/model\";\nimport { Ticker } from \"../../Ticker\";\nimport merge from \"ts-deepmerge\";\nimport { BufferGeometry } from \"three/src/core/BufferGeometry\";\nimport { BlockObject } from \"../block/scene/BlockObject\";\nimport { prefix } from \"../../util/log\";\n\n\nconst p = prefix(\"ModelObject\");\n\n//TODO: might want to abstract this out into a generic model, and create a separate class for Block models\nexport class ModelObject extends SceneObject {\n\n public readonly isModelObject: true = true;\n\n public static readonly DEFAULT_OPTIONS: ModelObjectOptions = merge({}, SceneObject.DEFAULT_OPTIONS, <ModelObjectOptions>{});\n public readonly options: ModelObjectOptions;\n\n private atlas?: TextureAtlas;\n\n public blockParent: Maybe<BlockObject>;\n\n private meshesCreated: boolean = false;\n\n constructor(readonly originalModel: Model, options?: Partial<ModelObjectOptions>) {\n super(options);\n this.options = merge({}, ModelObject.DEFAULT_OPTIONS, options ?? {});\n console.log(\"ModelObject options\", this.options);\n }\n\n async init(): Promise<void> {\n // load textures first so we have the updated UV coordinates from the atlas\n await this.loadTextures();\n\n this.createMeshes();\n this.applyTextures();\n }\n\n dispose() {\n super.dispose();\n this.atlas?.dispose();\n }\n\n public get textureAtlas(): Maybe<TextureAtlas> {\n return this.atlas;\n }\n\n //TODO: support for replacing textures\n\n protected async loadTextures(): Promise<void> {\n this.atlas = await UVMapper.getAtlas(this.originalModel);\n }\n\n\n protected createMeshes(force: boolean = false) {\n if (this.meshesCreated && !force) return;\n\n const mat = Materials.MISSING_TEXTURE;\n\n let allGeos: BufferGeometry[] = [];\n\n if (this.atlas) {\n if (this.atlas.model.elements) {\n this.atlas.model.elements?.forEach(el => {\n const elGeo = this._getBoxGeometryFromElement(el).clone();\n\n // elGeo.applyMatrix4(new THREE.Matrix4().makeTranslation(-8,-8,-8));\n\n\n elGeo.applyMatrix4(new Matrix4().makeTranslation((el.to[0] - el.from[0]) / 2, (el.to[1] - el.from[1]) / 2, (el.to[2] - el.from[2]) / 2));\n elGeo.applyMatrix4(new Matrix4().makeTranslation(el.from[0], el.from[1], el.from[2]));\n\n if (el.rotation) {\n applyElementRotation(el.rotation, elGeo);\n }\n\n\n elGeo.applyMatrix4(new Matrix4().makeTranslation(-8, -8, -8));\n\n if (this.options.mergeMeshes) {\n allGeos.push(elGeo);\n } else {\n const mesh = this.createAndAddMesh(undefined, undefined, elGeo, mat);\n if (this.options.wireframe) {\n addWireframeToMesh(elGeo, mesh);\n }\n }\n });\n } else {\n console.debug(p, this.atlas.model, \"has no elements\")\n }\n } else {\n console.debug(p, \"Missing atlas for\", this);\n }\n\n if (this.options.mergeMeshes) {\n let combinedGeo: BufferGeometry;\n if (allGeos.length > 0) {\n // if (this.options.wireframe) {\n // allGeos.push(new BoxGeometry(16, 16, 16, 1, 1, 1))\n // }\n\n combinedGeo = mergeBufferGeometries(allGeos);\n } else {\n combinedGeo = new BoxGeometry(16, 16, 16);\n }\n combinedGeo.computeBoundingBox();\n // combinedGeo.translate(-8, -8, -8);\n // TODO: cache the combined geometry\n let mesh: Mesh;\n if (this.options.instanceMeshes) {\n mesh = this.createInstancedMesh(undefined, combinedGeo, mat, this.options.maxInstanceCount || 50);\n this.add(mesh);\n this._isInstanced = true;\n //TODO\n } else {\n mesh = this.createAndAddMesh(undefined, undefined, combinedGeo, mat)\n }\n if (this.options.wireframe) {\n addWireframeToMesh(combinedGeo, mesh, 0x0000ff, 4);\n addBox3WireframeToObject(combinedGeo.boundingBox!, mesh, 0x00ffff, 3);\n }\n }\n\n if (this.options.wireframe) {\n addWireframeToObject(this, 0x00ff00, 3)\n }\n\n this.meshesCreated = true;\n }\n\n\n protected applyTextures() {\n // if (this.atlas!.model.textures) {\n // for (let textureKey in this.atlas!.model.textures) {\n // let asset = this.textureMap[textureKey];\n // if (asset) {\n //TODO: transparency\n if (this.atlas) {\n let mat = Materials.createShadedCanvasMaterial(this.atlas.image!.canvas! as HTMLCanvasElement, this.atlas.hasTransparency, false/*TODO: get this from render options*/);\n this.iterateAllMeshes(mesh => {\n mesh.material = mat;\n });\n\n //TODO: move this somewhere else\n //TODO: this seems to be ticking way too fast atm\n if (this.atlas.hasAnimation) {\n if (typeof this.atlas.ticker === \"undefined\") { //TODO: fix missing texture update for reused atlas\n this.atlas.ticker = Ticker.add(() => {\n for (let key in this.atlas!.animatorFunctions) {\n this.atlas!.animatorFunctions[key]();\n }\n Materials.needsUpdate(mat);\n });\n }\n }\n }\n // }\n // }\n // }\n }\n\n\n}\n\nexport interface ModelObjectOptions extends SceneObjectOptions {\n\n}\n\nexport function isModelObject(obj: any): obj is ModelObject {\n return (<ModelObject>obj).isModelObject;\n}\n","/// https://github.com/mrdoob/three.js/blob/dev/examples/jsm/utils/BufferGeometryUtils.js\n\nimport {\n BufferAttribute,\n BufferGeometry,\n Float32BufferAttribute,\n InterleavedBuffer,\n InterleavedBufferAttribute,\n TriangleFanDrawMode,\n TriangleStripDrawMode,\n TrianglesDrawMode,\n Vector3\n} from 'three';\n\n\nfunction computeTangents(geometry) {\n\n geometry.computeTangents();\n console.warn('THREE.BufferGeometryUtils: .computeTangents() has been removed. Use BufferGeometry.computeTangents() instead.');\n\n}\n\n/**\n * @param {Array<BufferGeometry>} geometries\n * @param {Boolean} useGroups\n * @return {BufferGeometry}\n */\nfunction mergeBufferGeometries(geometries, useGroups = false) {\n\n const isIndexed = geometries[0].index !== null;\n\n const attributesUsed = new Set(Object.keys(geometries[0].attributes));\n const morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes));\n\n const attributes = {};\n const morphAttributes = {};\n\n const morphTargetsRelative = geometries[0].morphTargetsRelative;\n\n const mergedGeometry = new BufferGeometry();\n\n let offset = 0;\n\n for (let i = 0; i < geometries.length; ++i) {\n\n const geometry = geometries[i];\n let attributesCount = 0;\n\n // ensure that all geometries are indexed, or none\n\n if (isIndexed !== (geometry.index !== null)) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.');\n return null;\n\n }\n\n // gather attributes, exit early if they're different\n\n for (const name in geometry.attributes) {\n\n if (!attributesUsed.has(name)) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.');\n return null;\n\n }\n\n if (attributes[name] === undefined) attributes[name] = [];\n\n attributes[name].push(geometry.attributes[name]);\n\n attributesCount++;\n\n }\n\n // ensure geometries have the same number of attributes\n\n if (attributesCount !== attributesUsed.size) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.');\n return null;\n\n }\n\n // gather morph attributes, exit early if they're different\n\n if (morphTargetsRelative !== geometry.morphTargetsRelative) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.');\n return null;\n\n }\n\n for (const name in geometry.morphAttributes) {\n\n if (!morphAttributesUsed.has(name)) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. .morphAttributes must be consistent throughout all geometries.');\n return null;\n\n }\n\n if (morphAttributes[name] === undefined) morphAttributes[name] = [];\n\n morphAttributes[name].push(geometry.morphAttributes[name]);\n\n }\n\n // gather .userData\n\n mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];\n mergedGeometry.userData.mergedUserData.push(geometry.userData);\n\n if (useGroups) {\n\n let count;\n\n if (isIndexed) {\n\n count = geometry.index.count;\n\n } else if (geometry.attributes.position !== undefined) {\n\n count = geometry.attributes.position.count;\n\n } else {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute');\n return null;\n\n }\n\n mergedGeometry.addGroup(offset, count, i);\n\n offset += count;\n\n }\n\n }\n\n // merge indices\n\n if (isIndexed) {\n\n let indexOffset = 0;\n const mergedIndex = [];\n\n for (let i = 0; i < geometries.length; ++i) {\n\n const index = geometries[i].index;\n\n for (let j = 0; j < index.count; ++j) {\n\n mergedIndex.push(index.getX(j) + indexOffset);\n\n }\n\n indexOffset += geometries[i].attributes.position.count;\n\n }\n\n mergedGeometry.setIndex(mergedIndex);\n\n }\n\n // merge attributes\n\n for (const name in attributes) {\n\n const mergedAttribute = mergeBufferAttributes(attributes[name]);\n\n if (!mergedAttribute) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the ' + name + ' attribute.');\n return null;\n\n }\n\n mergedGeometry.setAttribute(name, mergedAttribute);\n\n }\n\n // merge morph attributes\n\n for (const name in morphAttributes) {\n\n const numMorphTargets = morphAttributes[name][0].length;\n\n if (numMorphTargets === 0) break;\n\n mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n mergedGeometry.morphAttributes[name] = [];\n\n for (let i = 0; i < numMorphTargets; ++i) {\n\n const morphAttributesToMerge = [];\n\n for (let j = 0; j < morphAttributes[name].length; ++j) {\n\n morphAttributesToMerge.push(morphAttributes[name][j][i]);\n\n }\n\n const mergedMorphAttribute = mergeBufferAttributes(morphAttributesToMerge);\n\n if (!mergedMorphAttribute) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the ' + name + ' morphAttribute.');\n return null;\n\n }\n\n mergedGeometry.morphAttributes[name].push(mergedMorphAttribute);\n\n }\n\n }\n\n return mergedGeometry;\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {BufferAttribute}\n */\nfunction mergeBufferAttributes(attributes) {\n\n let TypedArray;\n let itemSize;\n let normalized;\n let arrayLength = 0;\n\n for (let i = 0; i < attributes.length; ++i) {\n\n const attribute = attributes[i];\n\n if (attribute.isInterleavedBufferAttribute) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. InterleavedBufferAttributes are not supported.');\n return null;\n\n }\n\n if (TypedArray === undefined) TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.');\n return null;\n\n }\n\n if (itemSize === undefined) itemSize = attribute.itemSize;\n if (itemSize !== attribute.itemSize) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.');\n return null;\n\n }\n\n if (normalized === undefined) normalized = attribute.normalized;\n if (normalized !== attribute.normalized) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.');\n return null;\n\n }\n\n arrayLength += attribute.array.length;\n\n }\n\n const array = new TypedArray(arrayLength);\n let offset = 0;\n\n for (let i = 0; i < attributes.length; ++i) {\n\n array.set(attributes[i].array, offset);\n\n offset += attributes[i].array.length;\n\n }\n\n return new BufferAttribute(array, itemSize, normalized);\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {Array<InterleavedBufferAttribute>}\n */\nfunction interleaveAttributes(attributes) {\n\n // Interleaves the provided attributes into an InterleavedBuffer and returns\n // a set of InterleavedBufferAttributes for each attribute\n let TypedArray;\n let arrayLength = 0;\n let stride = 0;\n\n // calculate the the length and type of the interleavedBuffer\n for (let i = 0, l = attributes.length; i < l; ++i) {\n\n const attribute = attributes[i];\n\n if (TypedArray === undefined) TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n\n console.error('AttributeBuffers of different types cannot be interleaved');\n return null;\n\n }\n\n arrayLength += attribute.array.length;\n stride += attribute.itemSize;\n\n }\n\n // Create the set of buffer attributes\n const interleavedBuffer = new InterleavedBuffer(new TypedArray(arrayLength), stride);\n let offset = 0;\n const res = [];\n const getters = ['getX', 'getY', 'getZ', 'getW'];\n const setters = ['setX', 'setY', 'setZ', 'setW'];\n\n for (let j = 0, l = attributes.length; j < l; j++) {\n\n const attribute = attributes[j];\n const itemSize = attribute.itemSize;\n const count = attribute.count;\n const iba = new InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, attribute.normalized);\n res.push(iba);\n\n offset += itemSize;\n\n // Move the data for each attribute into the new interleavedBuffer\n // at the appropriate offset\n for (let c = 0; c < count; c++) {\n\n for (let k = 0; k < itemSize; k++) {\n\n iba[setters[k]](c, attribute[getters[k]](c));\n\n }\n\n }\n\n }\n\n return res;\n\n}\n\n/**\n * @param {Array<BufferGeometry>} geometry\n * @return {number}\n */\nfunction estimateBytesUsed(geometry) {\n\n // Return the estimated memory used by this geometry in bytes\n // Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n // for InterleavedBufferAttributes.\n let mem = 0;\n for (const name in geometry.attributes) {\n\n const attr = geometry.getAttribute(name);\n mem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n }\n\n const indices = geometry.getIndex();\n mem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n return mem;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} tolerance\n * @return {BufferGeometry>}\n */\nfunction mergeVertices(geometry, tolerance = 1e-4) {\n\n tolerance = Math.max(tolerance, Number.EPSILON);\n\n // Generate an index buffer if the geometry doesn't have one, or optimize it\n // if it's already available.\n const hashToIndex = {};\n const indices = geometry.getIndex();\n const positions = geometry.getAttribute('position');\n const vertexCount = indices ? indices.count : positions.count;\n\n // next value for triangle indices\n let nextIndex = 0;\n\n // attributes and new attribute arrays\n const attributeNames = Object.keys(geometry.attributes);\n const attrArrays = {};\n const morphAttrsArrays = {};\n const newIndices = [];\n const getters = ['getX', 'getY', 'getZ', 'getW'];\n\n // initialize the arrays\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n\n const name = attributeNames[i];\n\n attrArrays[name] = [];\n\n const morphAttr = geometry.morphAttributes[name];\n if (morphAttr) {\n\n morphAttrsArrays[name] = new Array(morphAttr.length).fill().map(() => []);\n\n }\n\n }\n\n // convert the error tolerance to an amount of decimal places to truncate to\n const decimalShift = Math.log10(1 / tolerance);\n const shiftMultiplier = Math.pow(10, decimalShift);\n for (let i = 0; i < vertexCount; i++) {\n\n const index = indices ? indices.getX(i) : i;\n\n // Generate a hash for the vertex attributes at the current index 'i'\n let hash = '';\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const itemSize = attribute.itemSize;\n\n for (let k = 0; k < itemSize; k++) {\n\n // double tilde truncates the decimal value\n hash += `${ ~~(attribute[getters[k]](index) * shiftMultiplier) },`;\n\n }\n\n }\n\n // Add another reference to the vertex if it's already\n // used by another index\n if (hash in hashToIndex) {\n\n newIndices.push(hashToIndex[hash]);\n\n } else {\n\n // copy data to the new index in the attribute arrays\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const morphAttr = geometry.morphAttributes[name];\n const itemSize = attribute.itemSize;\n const newarray = attrArrays[name];\n const newMorphArrays = morphAttrsArrays[name];\n\n for (let k = 0; k < itemSize; k++) {\n\n const getterFunc = getters[k];\n newarray.push(attribute[getterFunc](index));\n\n if (morphAttr) {\n\n for (let m = 0, ml = morphAttr.length; m < ml; m++) {\n\n newMorphArrays[m].push(morphAttr[m][getterFunc](index));\n\n }\n\n }\n\n }\n\n }\n\n hashToIndex[hash] = nextIndex;\n newIndices.push(nextIndex);\n nextIndex++;\n\n }\n\n }\n\n // Generate typed arrays from new attribute arrays and update\n // the attributeBuffers\n const result = geometry.clone();\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n\n const name = attributeNames[i];\n const oldAttribute = geometry.getAttribute(name);\n\n const buffer = new oldAttribute.array.constructor(attrArrays[name]);\n const attribute = new BufferAttribute(buffer, oldAttribute.itemSize, oldAttribute.normalized);\n\n result.setAttribute(name, attribute);\n\n // Update the attribute arrays\n if (name in morphAttrsArrays) {\n\n for (let j = 0; j < morphAttrsArrays[name].length; j++) {\n\n const oldMorphAttribute = geometry.morphAttributes[name][j];\n\n const buffer = new oldMorphAttribute.array.constructor(morphAttrsArrays[name][j]);\n const morphAttribute = new BufferAttribute(buffer, oldMorphAttribute.itemSize, oldMorphAttribute.normalized);\n result.morphAttributes[name][j] = morphAttribute;\n\n }\n\n }\n\n }\n\n // indices\n\n result.setIndex(newIndices);\n\n return result;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} drawMode\n * @return {BufferGeometry>}\n */\nfunction toTrianglesDrawMode(geometry, drawMode) {\n\n if (drawMode === TrianglesDrawMode) {\n\n console.warn('THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.');\n return geometry;\n\n }\n\n if (drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode) {\n\n let index = geometry.getIndex();\n\n // generate index if not present\n\n if (index === null) {\n\n const indices = [];\n\n const position = geometry.getAttribute('position');\n\n if (position !== undefined) {\n\n for (let i = 0; i < position.count; i++) {\n\n indices.push(i);\n\n }\n\n geometry.setIndex(indices);\n index = geometry.getIndex();\n\n } else {\n\n console.error('THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.');\n return geometry;\n\n }\n\n }\n\n //\n\n const numberOfTriangles = index.count - 2;\n const newIndices = [];\n\n if (drawMode === TriangleFanDrawMode) {\n\n // gl.TRIANGLE_FAN\n\n for (let i = 1; i <= numberOfTriangles; i++) {\n\n newIndices.push(index.getX(0));\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n\n }\n\n } else {\n\n // gl.TRIANGLE_STRIP\n\n for (let i = 0; i < numberOfTriangles; i++) {\n\n if (i % 2 === 0) {\n\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i + 2));\n\n } else {\n\n newIndices.push(index.getX(i + 2));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i));\n\n }\n\n }\n\n }\n\n if ((newIndices.length / 3) !== numberOfTriangles) {\n\n console.error('THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.');\n\n }\n\n // build final geometry\n\n const newGeometry = geometry.clone();\n newGeometry.setIndex(newIndices);\n newGeometry.clearGroups();\n\n return newGeometry;\n\n } else {\n\n console.error('THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode);\n return geometry;\n\n }\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n * Helpful for Raytracing or Decals.\n * @param {Mesh | Line | Points} object An instance of Mesh, Line or Points.\n * @return {Object} An Object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes(object) {\n\n if (object.geometry.isBufferGeometry !== true) {\n\n console.error('THREE.BufferGeometryUtils: Geometry is not of type BufferGeometry.');\n return null;\n\n }\n\n const _vA = new Vector3();\n const _vB = new Vector3();\n const _vC = new Vector3();\n\n const _tempA = new Vector3();\n const _tempB = new Vector3();\n const _tempC = new Vector3();\n\n const _morphA = new Vector3();\n const _morphB = new Vector3();\n const _morphC = new Vector3();\n\n function _calculateMorphedAttributeData(\n object,\n material,\n attribute,\n morphAttribute,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedAttributeArray\n ) {\n\n _vA.fromBufferAttribute(attribute, a);\n _vB.fromBufferAttribute(attribute, b);\n _vC.fromBufferAttribute(attribute, c);\n\n const morphInfluences = object.morphTargetInfluences;\n\n if (material.morphTargets && morphAttribute && morphInfluences) {\n\n _morphA.set(0, 0, 0);\n _morphB.set(0, 0, 0);\n _morphC.set(0, 0, 0);\n\n for (let i = 0, il = morphAttribute.length; i < il; i++) {\n\n const influence = morphInfluences[i];\n const morph = morphAttribute[i];\n\n if (influence === 0) continue;\n\n _tempA.fromBufferAttribute(morph, a);\n _tempB.fromBufferAttribute(morph, b);\n _tempC.fromBufferAttribute(morph, c);\n\n if (morphTargetsRelative) {\n\n _morphA.addScaledVector(_tempA, influence);\n _morphB.addScaledVector(_tempB, influence);\n _morphC.addScaledVector(_tempC, influence);\n\n } else {\n\n _morphA.addScaledVector(_tempA.sub(_vA), influence);\n _morphB.addScaledVector(_tempB.sub(_vB), influence);\n _morphC.addScaledVector(_tempC.sub(_vC), influence);\n\n }\n\n }\n\n _vA.add(_morphA);\n _vB.add(_morphB);\n _vC.add(_morphC);\n\n }\n\n if (object.isSkinnedMesh) {\n\n object.boneTransform(a, _vA);\n object.boneTransform(b, _vB);\n object.boneTransform(c, _vC);\n\n }\n\n modifiedAttributeArray[a * 3 + 0] = _vA.x;\n modifiedAttributeArray[a * 3 + 1] = _vA.y;\n modifiedAttributeArray[a * 3 + 2] = _vA.z;\n modifiedAttributeArray[b * 3 + 0] = _vB.x;\n modifiedAttributeArray[b * 3 + 1] = _vB.y;\n modifiedAttributeArray[b * 3 + 2] = _vB.z;\n modifiedAttributeArray[c * 3 + 0] = _vC.x;\n modifiedAttributeArray[c * 3 + 1] = _vC.y;\n modifiedAttributeArray[c * 3 + 2] = _vC.z;\n\n }\n\n const geometry = object.geometry;\n const material = object.material;\n\n let a, b, c;\n const index = geometry.index;\n const positionAttribute = geometry.attributes.position;\n const morphPosition = geometry.morphAttributes.position;\n const morphTargetsRelative = geometry.morphTargetsRelative;\n const normalAttribute = geometry.attributes.normal;\n const morphNormal = geometry.morphAttributes.position;\n\n const groups = geometry.groups;\n const drawRange = geometry.drawRange;\n let i, j, il, jl;\n let group, groupMaterial;\n let start, end;\n\n const modifiedPosition = new Float32Array(positionAttribute.count * positionAttribute.itemSize);\n const modifiedNormal = new Float32Array(normalAttribute.count * normalAttribute.itemSize);\n\n if (index !== null) {\n\n // indexed buffer geometry\n\n if (Array.isArray(material)) {\n\n for (i = 0, il = groups.length; i < il; i++) {\n\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n\n start = Math.max(group.start, drawRange.start);\n end = Math.min((group.start + group.count), (drawRange.start + drawRange.count));\n\n for (j = start, jl = end; j < jl; j += 3) {\n\n a = index.getX(j);\n b = index.getX(j + 1);\n c = index.getX(j + 2);\n\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a, b, c,\n modifiedPosition\n );\n\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a, b, c,\n modifiedNormal\n );\n\n }\n\n }\n\n } else {\n\n start = Math.max(0, drawRange.start);\n end = Math.min(index.count, (drawRange.start + drawRange.count));\n\n for (i = start, il = end; i < il; i += 3) {\n\n a = index.getX(i);\n b = index.getX(i + 1);\n c = index.getX(i + 2);\n\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a, b, c,\n modifiedPosition\n );\n\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a, b, c,\n modifiedNormal\n );\n\n }\n\n }\n\n } else if (positionAttribute !== undefined) {\n\n // non-indexed buffer geometry\n\n if (Array.isArray(material)) {\n\n for (i = 0, il = groups.length; i < il; i++) {\n\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n\n start = Math.max(group.start, drawRange.start);\n end = Math.min((group.start + group.count), (drawRange.start + drawRange.count));\n\n for (j = start, jl = end; j < jl; j += 3) {\n\n a = j;\n b = j + 1;\n c = j + 2;\n\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a, b, c,\n modifiedPosition\n );\n\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a, b, c,\n modifiedNormal\n );\n\n }\n\n }\n\n } else {\n\n start = Math.max(0, drawRange.start);\n end = Math.min(positionAttribute.count, (drawRange.start + drawRange.count));\n\n for (i = start, il = end; i < il; i += 3) {\n\n a = i;\n b = i + 1;\n c = i + 2;\n\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a, b, c,\n modifiedPosition\n );\n\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a, b, c,\n modifiedNormal\n );\n\n }\n\n }\n\n }\n\n const morphedPositionAttribute = new Float32BufferAttribute(modifiedPosition, 3);\n const morphedNormalAttribute = new Float32BufferAttribute(modifiedNormal, 3);\n\n return {\n\n positionAttribute: positionAttribute,\n normalAttribute: normalAttribute,\n morphedPositionAttribute: morphedPositionAttribute,\n morphedNormalAttribute: morphedNormalAttribute\n\n };\n\n}\n\n\nexport {\n computeTangents,\n mergeBufferGeometries,\n mergeBufferAttributes,\n interleaveAttributes,\n estimateBytesUsed,\n mergeVertices,\n toTrianglesDrawMode,\n computeMorphedAttributes,\n};\n","import { SceneObject } from \"../../../renderer/SceneObject\";\nimport { BlockState, BlockStateVariant, BlockStateVariants, MultipartCondition } from \"../BlockState\";\nimport { SceneObjectOptions } from \"../../../renderer/SceneObjectOptions\";\nimport { isModelObject, ModelObject, ModelObjectOptions } from \"../../scene/ModelObject\";\nimport { Caching } from \"../../../cache/Caching\";\nimport { Models } from \"../../../assets/Models\";\nimport merge from \"ts-deepmerge\";\nimport { Euler, Matrix4, Vector3 } from \"three\";\nimport { clampRotationDegrees, Maybe, toRadians } from \"../../../util/util\";\nimport { MineRenderError } from \"../../../error/MineRenderError\";\nimport { BlockStateProperties, BlockStatePropertyDefaults } from \"../BlockStateProperties\";\nimport { BlockStates } from \"../../../assets/BlockStates\";\nimport { InstanceReference, isInstanceReference } from \"../../../instance/InstanceReference\";\nimport { AssetKey } from \"../../../assets/AssetKey\";\nimport { prefix } from \"../../../util/log\";\n\nconst p = prefix(\"BlockObject\");\n\nexport class BlockObject extends SceneObject {\n\n public readonly isBlockObject: true = true;\n\n public static readonly DEFAULT_OPTIONS: BlockObjectOptions = merge({}, ModelObject.DEFAULT_OPTIONS, <BlockObjectOptions>{\n applyDefaultState: true\n });\n public readonly options: BlockObjectOptions;\n\n private _previousState: BlockStateProperties = {};\n private _state: BlockStateProperties = {};\n private _variant: Maybe<BlockStateVariant> = undefined;\n\n private _instanceState: BlockStateProperties[] = [];\n private _instanceVariant: BlockStateVariant[][] = [];\n private _instanceModel: (ModelObject | InstanceReference<ModelObject>)[] = [];\n\n private _variants: BlockStateVariant[] = [];\n private _models: (ModelObject | InstanceReference<ModelObject>)[] = [];\n\n constructor(readonly blockState: BlockState, options?: Partial<BlockObjectOptions>) {\n super(options);\n this.options = merge({}, BlockObject.DEFAULT_OPTIONS, options ?? {});\n //TODO\n }\n\n async init(): Promise<void> {\n if (this.options.applyDefaultState) {\n const defaultState = this.blockState.key ? BlockStates.getDefaultState(this.blockState.key) : undefined;\n if (defaultState && Object.keys(defaultState).length > 0) { // use defined state\n const state = {};\n for (let k in defaultState) {\n state[k] = defaultState[k].default;\n }\n await this.setState(state);\n } else { // fallback to guessing from blockState definition\n if (this.blockState.variants) {\n await this.setState(Object.keys(this.blockState.variants)[0]);\n } else if (this.blockState.multipart) {\n for (let part of this.blockState.multipart) {\n if (part.when && !(\"OR\" in part.when)) {\n const k = Object.keys(part.when)[0];\n if (k) {\n await this.setState(k, part.when[k].split(\"|\")[0]);\n break;\n }\n }\n }\n }\n }\n } else {\n await this.recreateModels();\n }\n //TODO\n }\n\n dispose() {\n super.dispose();\n }\n\n removeFromScene() {\n for (let model of this._models) {\n if (isModelObject(model)) {\n model.removeFromScene();\n } else if (isInstanceReference(model)) {\n model.setScale(new Vector3(0, 0, 0));\n }\n }\n super.removeFromScene();\n }\n\n public get state(): { [key: string]: string; } {\n return this._state;\n }\n\n nextInstance(): InstanceReference<SceneObject> {\n\n const ref = super.nextInstance();\n for (let child of this.children) {\n if (isModelObject(child)) {\n child._instanceCounter = this.instanceCounter;\n }\n }\n return ref;\n }\n\n protected async mapStateToVariant(state: BlockStateProperties): Promise<BlockStateVariant[]> {\n const out: BlockStateVariant[] = [];\n if (this.blockState.variants) {\n if (Object.keys(this.blockState.variants).length === 1 && \"\" in this.blockState.variants) { // default variant\n out.push(this.getSingleVariant(this.blockState.variants[\"\"]));\n } else {\n for (let variantKey in this.blockState.variants) {\n const split = variantKey.split(\",\");\n let matches = true;\n for (let s of split) {\n const [k, v] = s.split(\"=\");\n if (`${ state[k] }` !== `${ v }`) {\n matches = false;\n break;\n }\n }\n if (matches) {\n const variants = this.blockState.variants[variantKey];\n out.push(this.getSingleVariant(variants));\n }\n }\n }\n } else if (this.blockState.multipart) {\n for (let part of this.blockState.multipart) {\n if (!part.apply) {\n console.debug(p, \"Missing apply for blockState part\", part);\n continue;\n }\n if (!part.when) { // no condition -> always apply\n out.push(this.getSingleVariant(part.apply));\n } else {\n let matches = true;\n // TODO: apparently AND is a thing too (https://yeleha.co/31Jec6P)\n if (\"OR\" in part.when) {\n const or = part.when.OR as MultipartCondition[];\n let anyMatch = false;\n for (let o of or) {\n for (let k in o) {\n const split = o[k].split(\"|\");\n let m = false;\n for (let s of split) {\n if (`${ state[k] }` === `${ s }`) {\n m = true;\n break;\n }\n }\n if (m) {\n anyMatch = true;\n break;\n }\n }\n }\n if (!anyMatch) {\n matches = false;\n }\n } else {\n for (let k in part.when) {\n const split = part.when[k].split(\"|\");\n let m = false;\n for (let s of split) {\n if (`${ state[k] }` === `${ s }`) {\n m = true;\n break;\n }\n }\n if (!m) { // none of the possible values match\n matches = false;\n break;\n }\n }\n }\n if (matches) {\n const variants = part.apply;\n out.push(this.getSingleVariant(variants));\n }\n }\n }\n }\n\n return out;\n }\n\n public async recreateModels(): Promise<void> {\n //TODO: change this to create models once, and then modify rotations when updating the state\n\n // Copy current instance info\n const instanceInfo: Matrix4[] = [];\n if (this.isInstanced) {\n for (let i = 0; i < this.instanceCounter; i++) {\n instanceInfo[i] = this.getMatrixAt(i);\n }\n }\n\n // Remove all children\n // this.disposeAndRemoveAllChildren(); //TODO: just removes all children of all instances atm...\n\n // TODO: try to reuse models instead of just removing them and creating new ones\n for (let model of this._models) {\n if (isInstanceReference(model)) {\n model.setScale(new Vector3(0, 0, 0));//TODO\n } else {\n model.dispose();\n }\n }\n while (this._models.length > 0) {\n this._models.shift();\n }\n\n\n //TODO: might want to preload all possible states & cache their data\n //TODO: make sure to only instance stuff with different rotations together; i.e. not those with different multipart settings, or different models\n\n /*\n if (this.isInstanced) {\n //TODO: only map once per state\n for (let i = 0; i < this.instanceCounter; i++) {\n this._instanceVariant[i] = await this.mapStateToVariant(this._instanceState[i]);\n for (let variant of this._instanceVariant[i]) {\n this._instanceModel[i] = await this.createVariant(variant);\n }\n }\n //TODO: actually create\n //TODO: group by model\n this._isInstanced = true;\n } else {\n */\n const variantsToCreate = await this.mapStateToVariant(this.state);\n this._variants = variantsToCreate;\n for (let blockStateVariant of variantsToCreate) {\n this._models.push(await this.createVariant(blockStateVariant));\n }\n /*\n }\n\n */\n\n // console.log(instanceInfo);\n // // Re-apply instances\n // if (instanceInfo.length>0) {\n // for (let i = 0; i < instanceInfo.length; i++) {\n // this.setMatrixAt(i, instanceInfo[i]);\n // }\n // }\n }\n\n protected getSingleVariant(variants: BlockStateVariant | BlockStateVariant[]) {\n if (Array.isArray(variants)) {\n //TODO: randomizer option / weights\n return (<BlockStateVariant[]>variants)[0];\n } else {\n return variants as BlockStateVariant;\n }\n }\n\n // @deprecated\n protected async createAVariant(variants: BlockStateVariant | BlockStateVariant[], instanceInfo: Matrix4[]) {\n const variant = this.getSingleVariant(variants);\n await this.createVariant(variant);\n }\n\n protected async createVariant(variant: BlockStateVariant): Promise<ModelObject | InstanceReference<ModelObject>> {\n //TODO: uvlock\n //TODO: default state?\n const model = await Models.getMerged(AssetKey.parse(\"models\", variant.model!));\n const obj: ModelObject | InstanceReference<ModelObject> = await this.scene.addModel(model!, this.options);\n /*\n const obj = new ModelObject(model!, this.options);\n await obj.init();\n */\n if (isInstanceReference(obj) || (<ModelObject>obj).isInstanced) {\n this._isInstanced = true;\n this._instanceCounter = 1;//TODO: BlockObject itself isn't technically instanced, but needs the id for the get/setMatrix calls to work properly\n /*\n if (isInstanceReference(obj)) {\n this._instanceCounter = obj.index;\n } else {\n this._instanceCounter = (<ModelObject>obj).instanceCounter;\n }\n */\n }\n\n\n /*\n // Re-apply instance info as a base\n if (instanceInfo.length > 0) {\n for (let i = 0; i < instanceInfo.length; i++) {\n obj.setMatrixAt(i, instanceInfo[i]);\n }\n }\n */\n\n let rotation = new Euler(0, 0, 0);\n if (typeof variant.x !== \"undefined\") {\n // obj.rotation.x = toRadians(variant.x);\n // obj.rotation.set(obj.rotation.x + toRadians(variant.x), obj.rotation.y, obj.rotation.z);\n // for (let child of obj.children) {\n // // applyGenericRotation(Axis.X, variant.x, child);\n // child.rotation.x = toRadians(variant.x);\n // }\n // this.setRotationAt(0, new Euler(variant.x, 0, 0));\n rotation.x = toRadians(clampRotationDegrees(variant.x));\n }\n if (typeof variant.y !== \"undefined\") {\n // obj.rotation.y = toRadians(variant.y);\n // obj.rotation.set(obj.rotation.x, obj.rotation.y + toRadians(variant.y), obj.rotation.z);\n // for (let child of obj.children) {\n // // applyGenericRotation(Axis.Y, variant.y, child);\n // child.rotation.y = toRadians(variant.y);\n // }\n // this.setRotationAt(0, new Euler(0, variant.y, 0));\n // Y-Rotations are weird...\n if(typeof variant.x!==\"undefined\"){\n rotation.y = toRadians(clampRotationDegrees(variant.y));\n }else{\n rotation.y = toRadians(clampRotationDegrees(360-variant.y));\n }\n }\n // console.log(obj.isInstanced);\n obj.setRotation(rotation);\n setTimeout(() => {\n obj.setRotation(rotation)\n }, 150);//TODO\n console.log(obj)\n\n /*\n this.add(obj);\n\n if (this.options.wireframe) {\n addWireframeToObject(this, 0xff0000, 2)\n }\n */\n return obj;\n }\n\n public async resetState() {\n this._previousState = this._state;\n this._state = {};\n await this.recreateModels();\n }\n\n // TODO: support state per instance\n public async setState(string: string);\n public async setState(state: BlockStateProperties);\n public async setState(key: string, value: string);\n public async setState(stringOrKeyOrState: string | BlockStateProperties, value?: string) {\n this._setState(stringOrKeyOrState, value);\n await this.recreateModels();\n }\n\n protected _setState(stringOrKeyOrState: string | BlockStateProperties, value?: string): void {\n this._previousState = this._state;\n if (typeof value === \"undefined\") { // a=b,c=d,... or state object\n if (typeof stringOrKeyOrState === \"string\") {\n if (stringOrKeyOrState === \"\") return;\n const split = stringOrKeyOrState.split(\",\");\n for (let s of split) {\n let [k, v] = s.split(\"=\");\n this._setState(k, v);\n }\n } else if (typeof stringOrKeyOrState === \"object\") {\n for (let k in stringOrKeyOrState) {\n this._state[k] = stringOrKeyOrState[k];\n }\n }\n } else {\n this._state[stringOrKeyOrState as string] = value;\n }\n }\n\n /*\n public async setStateAt(index: number, string: string);\n public async setStateAt(index: number, state: BlockStateProperties);\n public async setStateAt(index: number, key: string, value: string);\n public async setStateAt(index: number, stringOrKeyOrState: string | BlockStateProperties, value?: string);\n public async setStateAt(index: number, stringOrKeyOrState: string | BlockStateProperties, value?: string) {\n this._setStateAt(index, stringOrKeyOrState, value);\n await this.recreateModels();\n }\n\n protected _setStateAt(index: number, stringOrKeyOrState: string | BlockStateProperties, value?: string): void {\n if (!this._instanceState[index]) this._instanceState[index] = {};\n if (typeof value === \"undefined\") { // a=b,c=d,... or state object\n if (typeof stringOrKeyOrState === \"string\") {\n if (stringOrKeyOrState === \"\") return;\n const split = stringOrKeyOrState.split(\",\");\n for (let s of split) {\n let [k, v] = s.split(\"=\");\n this._setStateAt(index, k, v);\n }\n } else if (typeof stringOrKeyOrState === \"object\") {\n for (let k in stringOrKeyOrState) {\n this._instanceState[index][k] = stringOrKeyOrState[k];\n }\n }\n } else {\n this._instanceState[index][stringOrKeyOrState as string] = value;\n }\n }\n\n _getStateAt(index: number): BlockStateProperties {\n return this._instanceState[index];\n }\n\n */\n\n setPositionRotationScaleAt(index: number, position?: Vector3, rotation?: Euler, scale?: Vector3) {\n super.setPositionRotationScaleAt(index, position, rotation, scale);\n }\n\n getMatrixAt(index: number, matrix: Matrix4 = new Matrix4()): Matrix4 {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n const child = this._models[0];\n if (child && isModelObject(child)) {\n child.getMatrixAt(index, matrix);\n } else if (child && isInstanceReference(child)) {\n child.getMatrix(matrix);\n }\n /*\n console.log(this.children)\n const child = this.children[0];\n if (child && isModelObject(child)) {\n if (!child.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n child.getMatrixAt(index, matrix);\n }\n return matrix;\n */\n // return super.getMatrixAt(0, matrix);\n return matrix;\n }\n\n setMatrixAt(index: number, matrix: Matrix4) {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n // const child = this._models[0];\n for(let child of this._models) {\n if (child && isModelObject(child)) {\n child.setMatrixAt(index, matrix);\n } else if (child && isInstanceReference(child)) {\n child.setMatrix(matrix);\n }\n }\n /*\n console.log(this.children)\n for (let child of this.children) {\n if (isModelObject(child)) {\n if (!child.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n child.setMatrixAt(index, matrix);\n }\n }\n */\n }\n\n setPosition(position: Vector3) {\n super.setPosition(position);\n for (let model of this._models) {\n model.setPosition(position);\n }\n }\n\n //TODO: should override rotation + scale methods\n\n //TODO\n\n}\n\nexport interface BlockObjectOptions extends ModelObjectOptions {\n applyDefaultState: boolean;\n}\n\nexport function isBlockObject(obj: any): obj is BlockObject {\n return (<BlockObject>obj).isBlockObject;\n}\n","import { MultiBlockStructure } from \"./MultiBlockStructure\";\n\nexport class SchematicParser {\n\n public static async parse(): Promise<MultiBlockStructure> {\n //TODO\n // @ts-ignore\n return Promise.resolve({ });\n }\n\n}\n","import { MultiBlockBlock, MultiBlockStructure } from \"./MultiBlockStructure\";\nimport { TripleArray } from \"../Model\";\nimport type { NBT } from \"prismarine-nbt\";\nimport { MineRenderError } from \"../../error/MineRenderError\";\nimport { BlockStateProperties } from \"../block/BlockStateProperties\";\n\nexport class StructureParser {\n\n public static async parse(_nbt: NBT, paletteIndex?: number): Promise<MultiBlockStructure> {\n const nbt = _nbt.value as unknown as StructureNBT;\n\n let palette: Palette;\n if (\"palette\" in nbt) {\n palette = nbt.palette!;\n } else if (\"palettes\" in nbt) {\n palette = nbt.palettes![paletteIndex ?? 0];\n } else {\n throw new MineRenderError(\"Structure does not have palette(s)\");\n }\n\n const blocks: MultiBlockBlock[] =\n nbt.blocks.value.value.map(block => {\n const state = palette.value.value[block.state.value];\n if (state.Name.value === \"minecraft:air\") return undefined;\n\n const props: BlockStateProperties = {};\n for (let k in state.Properties?.value) {\n props[k] = state.Properties.value[k].value;\n }\n return <MultiBlockBlock>{\n type: state.Name.value,\n properties: props,\n position: block.pos.value.value,\n nbt: block.nbt\n }\n }).filter(m => typeof m !== \"undefined\") as MultiBlockBlock[] ;\n return {\n blocks: blocks,\n size: nbt.size.value.value\n }\n }\n\n}\n\nexport interface StructureNBT {\n DataVersion: {\n type: \"int\";\n value: number;\n }\n size: {\n type: \"list\";\n value: {\n type: \"int\";\n value: TripleArray;\n }\n }\n palette?: Palette;\n palettes?: Palette[];\n blocks: {\n type: \"list\";\n value: {\n type: \"compound\";\n value: BlockEntry[];\n }\n }\n entities: {};//TODO\n}\n\ninterface Palette {\n type: \"list\";\n value: {\n type: \"compound\";\n value: PaletteEntry[]\n }\n}\n\ninterface PaletteEntry {\n Name: {\n type: \"string\";\n value: string;\n }\n Properties: {\n type: \"compound\";\n value: { [property: string]: PalettePropertyValue; };\n }\n}\n\ninterface PalettePropertyValue {\n type: string;\n value: string;\n}\n\ninterface BlockEntry {\n pos: {\n type: \"list\";\n value: {\n type: \"int\";\n value: TripleArray;\n }\n }\n state: {\n type: \"int\";\n value: number;\n }\n nbt: {\n type: \"compound\";\n value: any;\n }\n}\n","import { Object3D, Scene } from \"three\";\nimport {isSceneObject, SceneObject} from \"./SceneObject\";\nimport merge from \"ts-deepmerge\";\nimport { Model } from \"../model/Model\";\nimport { ModelObject, ModelObjectOptions } from \"../model/scene/ModelObject\";\nimport { InstanceReference } from \"../instance/InstanceReference\";\nimport { SceneStats } from \"../SceneStats\";\nimport { SSAOPassOUTPUT } from \"three/examples/jsm/postprocessing/SSAOPass\";\nimport { BasicMinecraftAsset, MinecraftAsset } from \"../MinecraftAsset\";\nimport { SceneObjectOptions } from \"./SceneObjectOptions\";\nimport { BlockState } from \"../model/block/BlockState\";\nimport { BlockObject, BlockObjectOptions, isBlockObject } from \"../model/block/scene/BlockObject\";\nimport { InstanceManager } from \"../instance/InstanceManager\";\nimport { DeepPartial, sleep } from \"../util/util\";\nimport { SkinObject, SkinObjectOptions } from \"../skin/scene/SkinObject\";\nimport { EntityObject, EntityObjectOptions } from \"../entity/scene/EntityObject\";\nimport { EntityModel } from \"../entity/EntityModel\";\nimport { AssetKey, isAssetKey } from \"../assets/AssetKey\";\n\nexport class MineRenderScene extends Scene {\n\n public readonly isMineRenderScene: true = true;\n\n public static readonly DEFAULT_OPTIONS: MineRenderSceneOptions = merge({}, <MineRenderSceneOptions>{});\n public readonly options: MineRenderSceneOptions;\n\n readonly stats: SceneStats = new SceneStats();\n protected readonly instanceManager: InstanceManager = new InstanceManager();\n\n public dirty: boolean = true;\n\n constructor(options?: DeepPartial<MineRenderSceneOptions>) {\n super();\n this.options = merge({}, MineRenderScene.DEFAULT_OPTIONS, options ?? {});\n }\n\n add(...object): this {\n this.dirty = true;\n this.stats.objectCount += object.length;\n for (let obj of object) {\n if (isSceneObject(obj)) {\n this.stats.sceneObjectCount++;\n }\n // obj.addEventListener('dirty',event=>{\n // this.dirty = true;\n // });\n obj.addEventListener('change',event=>{\n this.dirty = true;\n });\n }\n return super.add(...object);\n }\n\n remove(...object): this {\n this.dirty = true;\n return super.remove(...object);\n }\n\n public async initAndAdd(...object: SceneObject[]): Promise<this> {\n this.dirty = true;\n for (let obj of object) {\n await obj.init();\n }\n return this.add(...object);\n }\n\n async addSceneObject<A extends BasicMinecraftAsset, T extends SceneObject, O extends SceneObjectOptions>(asset: A, objectSupplier: () => T | Promise<T>, _options?: Partial<O>, parent: Object3D = this): Promise<T | InstanceReference<T>> {\n console.log(\"addSceneObject\", asset)\n console.log(\"parent\", parent)\n console.log(_options);\n this.dirty = true;\n // console.log(this.instanceManager)\n //TODO: we need a way to call objectSupplier in the instance supplier below\n // but we also need to get the options that have been merged with the defaults properly\n // so maybe to the option merging _somewhere_ else, not in the object constructor\n const obj = await objectSupplier();\n if (obj?.options?.instanceMeshes && asset.key && (<AssetKey>asset.key)?.assetType === \"models\"/*TODO*/) {\n console.log(\"instanceMeshes + key\")\n // check for existing instances\n const key = asset.key.serialize();\n return this.instanceManager.getOrCreate(key, async () => {\n // const obj = await objectSupplier();\n obj.scene = this;\n await obj.init();\n parent.add(obj);\n // await sleep(500)//TODO\n return obj;\n });\n } else {\n // const obj = await objectSupplier();\n console.log(\"!instanceMeshes | !key\")\n obj.scene = this;\n // await this.initAndAdd(obj);\n await obj.init();\n if (!isBlockObject(obj)) { //TODO: adding block objects slows things down (since each block has its own)\n parent.add(obj);\n }\n // await sleep(500)//TODO\n return obj;\n }\n }\n\n public async addModel(model: Model, options?: Partial<ModelObjectOptions>, parent: Object3D = this): Promise<ModelObject | InstanceReference<ModelObject>> {\n return this.addSceneObject<Model, ModelObject, ModelObjectOptions>(model, () => new ModelObject(model, options), options, parent);\n }\n\n public async addBlock(blockState: BlockState, options?: Partial<BlockObjectOptions>, parent: Object3D = this): Promise<BlockObject | InstanceReference<BlockObject>> {\n return this.addSceneObject<BlockState, BlockObject, BlockObjectOptions>(blockState, () => new BlockObject(blockState, options), options, parent);\n }\n\n public async addSkin(skin?: string, options?: Partial<SkinObjectOptions>, parent: Object3D = this): Promise<SkinObject> {\n this.dirty = true;\n const obj = new SkinObject(options);\n obj.scene = this;\n await obj.init();\n if (skin) {\n obj.setSkinTexture(skin);\n }\n parent.add(obj);\n return obj;\n }\n\n public async addEntity(entity: EntityModel, options?: Partial<EntityObjectOptions>, parent: Object3D = this): Promise<EntityObject | InstanceReference<EntityObject>> {\n return this.addSceneObject<EntityModel, EntityObject, BlockObjectOptions>(entity, () => new EntityObject(entity, options), options, parent);\n }\n\n}\n\nexport interface MineRenderSceneOptions {\n\n}\n\n\nexport function isMineRenderScene(obj: any): obj is MineRenderScene {\n return (<MineRenderScene>obj).isMineRenderScene;\n}\n","export enum SkinPart {\n HEAD = \"head\",\n BODY = \"body\",\n RIGHT_ARM = \"rightArm\",\n LEFT_ARM = \"leftArm\",\n RIGHT_LEG = \"rightLeg\",\n LEFT_LEG = \"leftLeg\",\n\n HAT = \"hat\",\n JACKET = \"jacket\",\n RIGHT_SLEEVE = \"rightSleeve\",\n LEFT_SLEEVE = \"leftSleeve\",\n RIGHT_TROUSERS = \"rightTrousers\",\n LEFT_TROUSERS = \"leftTrousers\",\n\n CAPE = \"cape\"\n}\n\nexport const SKIN_PARTS: SkinPart[] = Object.values(SkinPart);\n","import { SkinPart } from \"./SkinPart\";\nimport { ModelFaces } from \"../model/ModelElement\";\n\n\nexport type SkinTextureCoordinates = Record<SkinPart, ModelFaces>;\n\n// up and down UVs are weird\n// so they're flipped on X - u0 is u1, u1 is u0\n// up seems to also be flipped on Y - v0 is v1, v1 is v0\n\nconst baseSkinCoordinates: SkinTextureCoordinates = {\n head: {\n east: { // left\n uv: [\n 0,\n 8,\n 8,\n 16\n ]\n },\n west: { // right\n uv: [\n 16,\n 8,\n 24,\n 16\n ]\n },\n north: { // front\n uv: [\n 8,\n 8,\n 16,\n 16\n ]\n },\n south: { // back\n uv: [\n 24,\n 8,\n 32,\n 16\n ]\n },\n up: { // top\n uv: [\n 16,\n 8,\n 8,\n 0\n ]\n },\n down: { // bottom\n uv: [\n 24,\n 0,\n 16,\n 8\n ]\n }\n },\n body: {\n east: {\n uv: [\n 16,\n 20,\n 20,\n 32\n ]\n },\n west: {\n uv: [\n 28,\n 20,\n 32,\n 32\n ]\n },\n north: {\n uv: [\n 20,\n 20,\n 28,\n 32\n ]\n },\n south: {\n uv: [\n 32,\n 20,\n 40,\n 32\n ]\n },\n up: {\n uv: [\n 28,\n 20,\n 20,\n 16\n ]\n },\n down: {\n uv: [\n 36,\n 16,\n 28,\n 20\n ]\n }\n },\n leftArm: {\n east: {\n uv: [\n 32,\n 52,\n 36,\n 64\n ]\n },\n west: {\n uv: [\n 40,\n 52,\n 44,\n 64\n ]\n },\n north: {\n uv: [\n 36,\n 52,\n 40,\n 64\n ]\n },\n south: {\n uv: [\n 44,\n 52,\n 48,\n 64\n ]\n },\n up: {\n uv: [\n 40,\n 52,\n 36,\n 48\n ]\n },\n down: {\n uv: [\n 44,\n 48,\n 40,\n 52\n ]\n }\n },\n rightArm: {\n east: {\n uv: [\n 40,\n 20,\n 44,\n 32\n ],\n\n },\n west: {\n uv: [\n 48,\n 20,\n 52,\n 32\n ],\n\n },\n north: {\n uv: [\n 44,\n 20,\n 48,\n 32\n ],\n\n },\n south: {\n uv: [\n 52,\n 20,\n 56,\n 32\n ],\n\n },\n up: {\n uv: [\n 48,\n 20,\n 44,\n 16\n ],\n\n },\n down: {\n uv: [\n 52,\n 16,\n 48,\n 20\n ],\n\n\n }\n },\n leftLeg: {\n east: {\n uv: [\n 16,\n 52,\n 20,\n 64\n ]\n },\n west: {\n uv: [\n 24,\n 52,\n 28,\n 64\n ]\n },\n north: {\n uv: [\n 20,\n 52,\n 24,\n 64\n ]\n },\n south: {\n uv: [\n 28,\n 52,\n 32,\n 64\n ]\n },\n up: {\n uv: [\n 24,\n 52,\n 20,\n 48\n ]\n },\n down: {\n uv: [\n 28,\n 48,\n 24,\n 52\n ],\n rotation: 180\n }\n },\n rightLeg: {\n east: {\n uv: [\n 0,\n 20,\n 4,\n 32\n ],\n\n },\n west: {\n uv: [\n 8,\n 20,\n 12,\n 32\n ]\n },\n north: {\n uv: [\n 4,\n 20,\n 8,\n 32\n ],\n\n },\n south: {\n uv: [\n 12,\n 20,\n 16,\n 32\n ],\n\n },\n up: {\n uv: [\n 8,\n 20,\n 4,\n 16\n ],\n\n },\n down: {\n uv: [\n 12,\n 16,\n 8,\n 20\n ],\n\n\n }\n },\n hat: {\n east: {\n uv: [\n 32,\n 8,\n 40,\n 16\n ]\n },\n west: {\n uv: [\n 48,\n 8,\n 56,\n 16\n ]\n },\n north: {\n uv: [\n 40,\n 8,\n 48,\n 16\n ]\n },\n south: {\n uv: [\n 56,\n 8,\n 64,\n 16\n ]\n },\n up: {\n uv: [\n 48,\n 8,\n 40,\n 0\n ]\n },\n down: {\n uv: [\n 56,\n 0,\n 48,\n 8\n ],\n rotation: 180\n }\n },\n jacket: {\n east: {\n uv: [\n 16,\n 36,\n 20,\n 48\n ]\n },\n west: {\n uv: [\n 28,\n 36,\n 32,\n 48\n ]\n },\n north: {\n uv: [\n 20,\n 36,\n 28,\n 48\n ]\n },\n south: {\n uv: [\n 32,\n 36,\n 40,\n 48\n ]\n },\n up: {\n uv: [\n 28,\n 36,\n 20,\n 32\n ]\n },\n down: {\n uv: [\n 36,\n 32,\n 28,\n 36\n ],\n rotation: 180\n }\n },\n leftSleeve: {\n east: {\n uv: [\n 48,\n 52,\n 52,\n 64\n ]\n },\n west: {\n uv: [\n 56,\n 52,\n 60,\n 64\n ]\n },\n north: {\n uv: [\n 52,\n 52,\n 56,\n 64\n ]\n },\n south: {\n uv: [\n 60,\n 52,\n 64,\n 64\n ]\n },\n up: {\n uv: [\n 56,\n 52,\n 52,\n 48\n ]\n },\n down: {\n uv: [\n 60,\n 48,\n 56,\n 52\n ],\n rotation: 180\n }\n },\n rightSleeve: {\n east: {\n uv: [\n 40,\n 36,\n 44,\n 48\n ]\n },\n west: {\n uv: [\n 48,\n 36,\n 52,\n 48\n ]\n },\n north: {\n uv: [\n 44,\n 36,\n 48,\n 48\n ]\n },\n south: {\n uv: [\n 52,\n 36,\n 56,\n 48\n ]\n },\n up: {\n uv: [\n 48,\n 36,\n 44,\n 32\n ]\n },\n down: {\n uv: [\n 52,\n 32,\n 48,\n 36\n ],\n rotation: 180\n }\n },\n leftTrousers: {\n east: {\n uv: [\n 0,\n 52,\n 4,\n 64\n ]\n },\n west: {\n uv: [\n 8,\n 52,\n 12,\n 64\n ]\n },\n north: {\n uv: [\n 4,\n 52,\n 8,\n 64\n ]\n },\n south: {\n uv: [\n 12,\n 52,\n 16,\n 64\n ]\n },\n up: {\n uv: [\n 8,\n 52,\n 4,\n 48\n ]\n },\n down: {\n uv: [\n 12,\n 48,\n 8,\n 52\n ]\n }\n },\n rightTrousers: {\n east: {\n uv: [\n 0,\n 36,\n 4,\n 48\n ]\n },\n west: {\n uv: [\n 8,\n 36,\n 12,\n 48\n ]\n },\n north: {\n uv: [\n 4,\n 36,\n 8,\n 48\n ]\n },\n south: {\n uv: [\n 12,\n 36,\n 16,\n 48\n ]\n },\n up: {\n uv: [\n 4,\n 36,\n 8,\n 32\n ]\n },\n down: {\n uv: [\n 8,\n 32,\n 12,\n 36\n ],\n rotation: 180\n }\n },\n cape: {//TODO\n east: {\n uv: [\n 0,\n 36,\n 4,\n 48\n ]\n },\n west: {\n uv: [\n 8,\n 36,\n 12,\n 48\n ]\n },\n north: {\n uv: [\n 4,\n 36,\n 8,\n 48\n ]\n },\n south: {\n uv: [\n 12,\n 36,\n 16,\n 48\n ]\n },\n up: {\n uv: [\n 4,\n 32,\n 8,\n 36\n ]\n },\n down: {\n uv: [\n 8,\n 32,\n 12,\n 36\n ],\n rotation: 180\n }\n }\n}\n\n\nexport const classicSkinTextureCoordinates: Readonly<SkinTextureCoordinates> = {\n ...baseSkinCoordinates\n};\n\n//TODO\nexport const slimSkinTextureCoordinates: Readonly<SkinTextureCoordinates> = {...baseSkinCoordinates} /*merge(baseSkinCoordinates, <SkinTextureCoordinates>{\n rightArm: {\n west: {\n x: 39\n },\n south: {\n w: 3\n },\n north: {\n x: 43,\n w: 3\n },\n up: {\n w: 3\n },\n down: {\n x: 39,\n w: 3\n }\n },\n leftArm: {\n west: {\n x: 47\n },\n south: {\n w: 3\n },\n north: {\n x: 51,\n w: 3\n },\n up: {\n w: 3\n },\n down: {\n x: 47,\n w: 3\n }\n },\n\n rightSleeve: {\n west: {\n x: 55\n },\n south: {\n w: 3\n },\n north: {\n x: 59,\n w: 3\n },\n up: {\n w: 3\n },\n down: {\n x: 55,\n w: 3\n }\n },\n leftSleeve: {\n west: {\n x: 47\n },\n south: {\n w: 3\n },\n north: {\n x: 51,\n w: 3\n },\n up: {\n w: 3\n },\n down: {\n x: 47,\n w: 3\n }\n }\n});\n*/\n","import { SkinPart } from \"./SkinPart\";\nimport { TripleArray } from \"../model/Model\";\nimport merge from \"ts-deepmerge\";\n\nexport type SkinGeometries = Record<SkinPart, TripleArray>;\n\nconst box8inner: TripleArray = [8, 8, 8];\nconst box8outer: TripleArray = [8.504, 8.504, 8.504];\n\nconst box8_12_4inner: TripleArray = [8, 12, 4];\nconst box8_12_4outer: TripleArray = [8.504, 12.504, 4.504];\n\nconst box4_12_4inner: TripleArray = [4, 12, 4];\nconst box4_12_4outer: TripleArray = [4.504, 12.504, 4.504];\n\nconst box3_12_4inner: TripleArray = [3, 12, 4];\nconst box3_12_4outer: TripleArray = [3.504, 12.504, 4.504];\n\nconst box4_12_3inner: TripleArray = [4, 12, 3];\nconst box4_12_3outer: TripleArray = [4.504, 12.504, 3.504];\n\nconst box10_16_1: TripleArray = [10, 16, 1];\n\nconst baseSkinGeometries: SkinGeometries = {\n head: box8inner,\n hat: box8outer,\n\n body: box8_12_4inner,\n jacket: box8_12_4outer,\n\n leftArm: box4_12_4inner,\n leftSleeve: box4_12_4outer,\n\n rightArm: box4_12_4inner,\n rightSleeve: box4_12_4outer,\n\n leftLeg: box4_12_4inner,\n leftTrousers: box4_12_4outer,\n\n rightLeg: box4_12_4inner,\n rightTrousers: box4_12_4outer,\n\n cape: box10_16_1\n}\n\nexport const classicSkinGeometries: SkinGeometries = {...{}, ...baseSkinGeometries};\nexport const slimSkinGeometries: SkinGeometries = {\n ...{}, ...baseSkinGeometries, ...{\n leftArm: box3_12_4inner,\n leftSleeve: box3_12_4outer,\n\n rightArm: box3_12_4inner,\n rightSleeve: box3_12_4outer,\n }\n};\n","import { SceneObject } from \"../../renderer/SceneObject\";\nimport { BoxGeometry } from \"three\";\nimport { SKIN_PARTS, SkinPart } from \"../SkinPart\";\nimport { classicSkinTextureCoordinates, SkinTextureCoordinates, slimSkinTextureCoordinates } from \"../SkinTextureCoordinates\";\nimport { classicSkinGeometries, SkinGeometries, slimSkinGeometries } from \"../SkinGeometries\";\nimport { Axis } from \"../../Axis\";\nimport { Materials } from \"../../Materials\";\nimport { ModelObjectOptions } from \"../../model/scene/ModelObject\";\nimport merge from \"ts-deepmerge\";\nimport { SceneObjectOptions } from \"../../renderer/SceneObjectOptions\";\nimport { DeepPartial } from \"../../util/util\";\n\nexport class SkinObject extends SceneObject {\n\n public readonly options: SkinObjectOptions;\n\n private slim: boolean = false;\n private legacy: boolean = false;\n\n private skinTextureSrc?: string;\n private skinTextureWidth: number = 64;\n private skinTextureHeight: number = 64;\n\n private capeTextureSrc?: string;\n\n\n constructor(options?: DeepPartial<SkinObjectOptions>) {\n super();\n this.options = merge({}, SceneObject.DEFAULT_OPTIONS, options ?? {});\n }\n\n async init(): Promise<void> {\n this.createMeshes();\n }\n\n protected removeMeshes(): void {\n\n }\n\n protected createMeshes() {\n console.log(\"#createMeshes\")\n const mat = Materials.MISSING_TEXTURE;\n\n {\n const headGroup = this.createAndAddGroup(\"head\", 0, 28, 0, Axis.Y, -4);\n\n const headGeo = this.getBoxGeometry(SkinPart.HEAD);\n const head = this.createAndAddMesh(\"head\", headGroup, headGeo, mat, Axis.Y, 4);\n\n if (!this.legacy) {\n const hatGeo = this.getBoxGeometry(SkinPart.HAT);\n const hat = this.createAndAddMesh(\"hat\", headGroup, hatGeo, mat, Axis.Y, 4);\n }\n }\n\n {\n const bodyGroup = this.createAndAddGroup(\"body\", 0, 18, 0);\n\n const bodyGeo = this.getBoxGeometry(SkinPart.BODY);\n const body = this.createAndAddMesh(\"body\", bodyGroup, bodyGeo, mat);\n\n const jacketGeo = this.getBoxGeometry(SkinPart.JACKET);\n const jacket = this.createAndAddMesh(\"jacket\", bodyGroup, jacketGeo, mat);\n }\n\n {\n {\n const leftArmGroup = this.createAndAddGroup(\"leftArm\", this.slim ? -5.5 : -6, 18, 0, Axis.Y, 4);\n\n const leftArmGeo = this.getBoxGeometry(SkinPart.LEFT_ARM);\n const leftArm = this.createAndAddMesh(\"leftArm\", leftArmGroup, leftArmGeo, mat, Axis.Y, -4);\n\n const leftSleeveGeo = this.getBoxGeometry(SkinPart.LEFT_SLEEVE);\n const leftSleeve = this.createAndAddMesh(\"leftSleeve\", leftArmGroup, leftSleeveGeo, mat, Axis.Y, -4);\n }\n {\n const rightArmGroup = this.createAndAddGroup(\"rightArm\", this.slim ? 5.5 : 6, 18, 0, Axis.Y, 4);\n\n const rightArmGeo = this.getBoxGeometry(SkinPart.RIGHT_ARM);\n const rightArm = this.createAndAddMesh(\"rightArm\", rightArmGroup, rightArmGeo, mat, Axis.Y, -4);\n\n const rightSleeveGeo = this.getBoxGeometry(SkinPart.RIGHT_SLEEVE);\n const rightSleeve = this.createAndAddMesh(\"rightSleeve\", rightArmGroup, rightSleeveGeo, mat, Axis.Y, -4);\n }\n }\n\n {\n {\n const leftLegGroup = this.createAndAddGroup(\"leftLeg\", -2, 6, 0, Axis.Y, 4);\n\n const leftLegGeo = this.getBoxGeometry(SkinPart.LEFT_LEG);\n const leftLeg = this.createAndAddMesh(\"leftLeg\", leftLegGroup, leftLegGeo, mat, Axis.Y, -4);\n\n const leftTrousersGeo = this.getBoxGeometry(SkinPart.LEFT_TROUSERS);\n const leftTrousers = this.createAndAddMesh(\"leftTrousers\", leftLegGroup, leftTrousersGeo, mat, Axis.Y, -4);\n }\n {\n const rightLegGroup = this.createAndAddGroup(\"rightLeg\", 2, 6, 0, Axis.Y, 4);\n\n const rightLegGeo = this.getBoxGeometry(SkinPart.RIGHT_LEG);\n const rightLeg = this.createAndAddMesh(\"rightLeg\", rightLegGroup, rightLegGeo, mat, Axis.Y, -4);\n\n const rightTrousersGeo = this.getBoxGeometry(SkinPart.RIGHT_TROUSERS);\n const rightTrousers = this.createAndAddMesh(\"rightTrousers\", rightLegGroup, rightTrousersGeo, mat, Axis.Y, -4);\n }\n }\n\n console.log(\"#createMeshes done\")\n\n //TODO: cape\n }\n\n\n public setSkinTexture(src: string): void {\n if (typeof src === \"undefined\") return;\n\n this.skinTextureSrc = src;\n\n //TODO: detect variant\n\n //TODO\n const mat = Materials.getImage({\n texture: {src: src},\n transparent: true\n });\n for (let part of SKIN_PARTS) {\n let mesh = this.getMeshByName(part);\n if (mesh) {\n mesh.material = mat;\n }\n }\n }\n\n //TODO: cape\n\n public setSlim(slim: boolean): void {\n console.log(\"#setSlim\")\n const changed = slim !== this.slim;\n this.slim = slim;\n\n if (changed) {\n //TODO: update geometries and mesh positions\n // for (let child of this.children) {\n // this.remove(child);\n // }\n this.createMeshes();\n }\n\n if (changed) {\n if (this.skinTextureSrc) {\n this.setSkinTexture(this.skinTextureSrc);\n }\n }\n\n console.log(\"#setSlim done\");\n }\n\n public setLegacy(legacy: boolean): void {\n if (legacy !== this.legacy) {\n //TODO: update geometries and mesh positions\n }\n this.legacy = legacy;\n }\n\n //TODO: layer toggles\n\n\n protected getBoxGeometry(part: SkinPart): BoxGeometry {\n //TODO support for 64x32 dimensions\n console.log(\"slim\", this.slim)\n const coordinates: SkinTextureCoordinates = this.slim ? slimSkinTextureCoordinates : classicSkinTextureCoordinates;\n const geometries: SkinGeometries = this.slim ? slimSkinGeometries : classicSkinGeometries;\n return this._getBoxGeometryFromDimensions(geometries[part], coordinates[part], [64, 64], [this.skinTextureWidth, this.skinTextureHeight]);\n }\n\n\n}\n\nexport interface SkinObjectOptions extends SceneObjectOptions {\n\n}\n","import { AxesHelper, Camera, EventDispatcher, GridHelper, LinearEncoding, OrthographicCamera, PCFSoftShadowMap, PerspectiveCamera, Scene, sRGBEncoding, TextureEncoding, Vector3, warn, WebGLRenderer } from \"three\";\nimport {MineRenderScene} from \"./MineRenderScene\";\nimport merge from \"ts-deepmerge\";\nimport Stats from \"stats.js\";\nimport { BloomEffect, EffectComposer, RenderPass, SSAOEffect, } from \"postprocessing\";\nimport {DeepPartial, isVector3, Maybe} from \"../util/util\";\nimport {isTripleArray, TripleArray} from \"../model/Model\";\nimport {isOrthographicCamera, isPerspectiveCamera} from \"../util/three\";\n\nexport class Renderer {\n\n public static readonly DEFAULT_OPTIONS: RendererOptions = merge({}, <RendererOptions>{\n camera: {\n type: \"perspective\",\n near: 1,\n far: 5000,\n perspective: {\n aspect: undefined,\n fov: 50,\n },\n orthographic: {\n left: undefined,\n right: undefined,\n top: undefined,\n bottom: undefined\n },\n position: new Vector3(50, 50, 50),\n lookingAt: new Vector3(0, 0, 0)\n },\n render: {\n fpsLimit: 60,\n stats: false,\n antialias: true,\n shade: true,\n autoResize: true,\n renderAlways: false\n },\n composer: {\n enabled: true\n },\n debug: {\n grid: false,\n axes: false\n }\n });\n public readonly options: RendererOptions;\n\n protected _element?: HTMLElement;\n\n protected _scene: MineRenderScene;\n protected _camera: Camera;\n protected _renderer: WebGLRenderer;\n protected _composer: EffectComposer;\n\n protected _stats?: Stats;\n\n protected _dirty: boolean = true;\n\n protected _animationLoop;\n protected _fpsTimer;\n protected _animationTimer?: NodeJS.Timeout = undefined;\n protected _animationFrame?: number = undefined;\n protected _resizeListener?: () => void = undefined;\n\n constructor(options?: DeepPartial<RendererOptions>) {\n this.options = merge({}, Renderer.DEFAULT_OPTIONS, options ?? {});\n\n this._animationLoop = this.animate.bind(this);\n this._fpsTimer = this.options.render.fpsLimit > 0 ? (1000 / this.options.render.fpsLimit) : undefined;\n\n this._scene = this.createScene();\n this._camera = this.createCamera();\n this._renderer = this.createRenderer();\n this._composer = this.createComposer();\n\n if (this.options.render.stats) {\n this._stats = new Stats();\n\n document.body.appendChild(this._stats.dom);//TODO\n }\n\n this.init();\n }\n\n //<editor-fold desc=\"INIT\">\n\n protected createScene(): MineRenderScene {\n return new MineRenderScene();\n }\n\n protected createCamera(): Camera {\n switch (this.options.camera.type) {\n case \"perspective\":\n default:\n return new PerspectiveCamera(\n this.options.camera.perspective.fov,\n this.options.camera.perspective.aspect ?? (this.viewWidth / this.viewHeight),\n this.options.camera.near,\n this.options.camera.far\n );\n case \"orthographic\":\n return new OrthographicCamera(\n this.options.camera.orthographic.left ?? (this.viewWidth / -2),\n this.options.camera.orthographic.right ?? (this.viewWidth / 2),\n this.options.camera.orthographic.top ?? (this.viewHeight / 2),\n this.options.camera.orthographic.bottom ?? (this.viewHeight / -2),\n this.options.camera.near,\n this.options.camera.far\n )\n\n }\n\n }\n\n protected createRenderer(): WebGLRenderer {\n const renderer = new WebGLRenderer({\n antialias: this.options.render.antialias,\n alpha: true,\n powerPreference: \"high-performance\",\n depth: true\n });\n\n renderer.setClearColor(0x000000, 0);\n\n renderer.shadowMap.enabled = true;\n renderer.shadowMap.type = PCFSoftShadowMap;\n\n // supposedly the default is already LinearEncoding, but not doing this renders the scene way too bright\n renderer.outputEncoding = LinearEncoding;\n\n // renderer.setPixelRatio(window.devicePixelRatio);\n renderer.setSize(this.viewWidth, this.viewHeight);\n\n return renderer;\n }\n\n protected createComposer(): EffectComposer {\n const composer = new EffectComposer(this.renderer);\n if (!this.options.composer.enabled) return composer;\n\n composer.setSize(this.viewWidth, this.viewHeight);\n //TODO: options\n\n //TODO: compser seems to cause skin objects to appear way too bright\n\n // // This one just tanks completely down to ~2fps (in structures at least, works pretty well for simpler stuff)\n // const ssaaPass = new SSAARenderPass(this.scene, this.camera, 0x000000, 0);//TODO: options\n // ssaaPass.unbiased = true;\n // composer.addPass(ssaaPass);\n\n\n composer.addPass(new RenderPass(this.scene, this.camera));\n\n // composer.addPass(new EffectPass(this.camera, new SSAOEffect(this.camera)))\n\n\n // composer.addPass(new SMAAPass(this.viewWidth, this.viewHeight));\n\n\n //\n // Makes movement sluggish\n // const ssaoPass = new SSAOPass(this.scene, this.camera, this.viewWidth, this.viewHeight);\n // composer.addPass(ssaoPass);\n\n // const saoPass = new SAOPass(this.scene, this.camera);\n // composer.addPass(saoPass);\n\n\n //\n // //\n // const shaderPass1 = new ShaderPass(CopyShader);\n // shaderPass1.renderToScreen = true;\n // composer.addPass(shaderPass1);\n\n return composer;\n }\n\n //</editor-fold>\n\n public init() {\n if (typeof window[\"__THREE_DEVTOOLS__\"] !== 'undefined') {\n window[\"__THREE_DEVTOOLS__\"].dispatchEvent(new CustomEvent('observe', {detail: this.scene}));\n }\n\n /// DEBUG\n if (this.options.debug.grid) {\n const gridHelper = new GridHelper(128, 16);\n this.scene.add(gridHelper);\n\n const gridHelper2 = new GridHelper(128, 16);\n gridHelper2.rotation.x = 90 * (Math.PI / 180)\n this.scene.add(gridHelper2);\n\n const gridHelper3 = new GridHelper(128, 16);\n gridHelper3.rotation.z = 90 * (Math.PI / 180)\n this.scene.add(gridHelper3);\n }\n if (this.options.debug.axes) {\n const axesHelper = new AxesHelper(64);\n this.scene.add(axesHelper);\n }\n\n /// CAMERA\n if (this.options.camera.position) {\n if (isVector3(this.options.camera.position)) {\n this.camera.position.set(this.options.camera.position.x, this.options.camera.position.y, this.options.camera.position.z);\n } else if (isTripleArray(this.options.camera.position)) {\n this.camera.position.set(this.options.camera.position[0], this.options.camera.position[1], this.options.camera.position[2]);\n }\n }\n if (this.options.camera.lookingAt) {\n if (isVector3(this.options.camera.lookingAt)) {\n this.camera.lookAt(this.options.camera.lookingAt);\n } else if (isTripleArray(this.options.camera.lookingAt)) {\n this.camera.lookAt(this.options.camera.lookingAt[0], this.options.camera.lookingAt[1], this.options.camera.lookingAt[2]);\n }\n }\n\n if (this.options.render.autoResize) {\n this._resizeListener = () => {\n this.resize(this.viewWidth, this.viewHeight);\n };\n window.addEventListener('resize', this._resizeListener);//TODO: remove listener\n }\n }\n\n public get element(): Maybe<HTMLElement> {\n return this._element;\n }\n\n public appendTo(element: HTMLElement): void {\n this._element = element;\n this._element.appendChild(this.renderer.domElement);\n if (this.viewWidth == 0) {\n console.warn('0 element width');\n }\n if (this.viewHeight == 0) {\n console.warn('0 element height');\n }\n this.resize(this.viewWidth, this.viewHeight);\n }\n\n /**\n * Register an EventDispatcher which may update the scene or renderer in order to redraw the scene\n */\n public registerEventDispatcher(dispatcher: EventDispatcher, changeEvent: string = 'change') {\n dispatcher.addEventListener(changeEvent, event => {\n this._dirty = true;\n })\n }\n\n public resize(width: number, height: number) {\n if (isPerspectiveCamera(this.camera)) {\n this.camera.aspect = width / height;\n this.camera.updateProjectionMatrix();\n } else if (isOrthographicCamera(this.camera)) {\n this.camera.left = width / -2;\n this.camera.right = width / 2;\n this.camera.top = height / 2;\n this.camera.bottom = height / -2;\n this.camera.updateProjectionMatrix();\n }\n\n this.renderer.setSize(width, height);\n this.composer.setSize(width, height);\n }\n\n //<editor-fold desc=\"RENDER\">\n\n public get dirty(): boolean {\n return this._dirty || this.scene.dirty;\n }\n\n public set dirty(dirty: boolean) {\n this._dirty = dirty;\n this.scene.dirty = dirty;\n }\n\n public start() {\n stop(); // just in case\n //this.animate();\n this.renderer.setAnimationLoop(this._animationLoop);\n }\n\n public stop() {\n this.renderer.setAnimationLoop(null);\n\n //TODO: remove below\n if (this._animationTimer)\n clearTimeout(this._animationTimer);\n this._animationTimer = undefined;\n\n if (this._animationFrame)\n cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n\n private animate(t?: number): void {\n\n // if (this.options.render.fpsLimit === 0) {\n // this._animationFrame = requestAnimationFrame(this._animationLoop);\n // } else {\n // this._animationTimer = setTimeout(() => {\n // this._animationFrame = requestAnimationFrame(this._animationLoop);\n // }, this._fpsTimer);\n // }\n\n if (this._stats) {\n this._stats.begin();\n }\n\n if (this.dirty || this.options.render.renderAlways) {\n if (this.options.composer.enabled) {\n this.composer.render();\n } else {\n this.renderer.render(this.scene, this.camera);\n }\n }\n\n this.dirty = false;\n\n if (this._stats) {\n this._stats.end();\n }\n\n }\n\n //</editor-fold>\n\n public toImage(): string {\n //TODO: mime type, trim transparent pixels\n return this.renderer.domElement.toDataURL();\n }\n\n ///\n\n protected get attachedToBody() {\n return this.element === document.body;\n }\n\n protected get viewWidth() {\n return this.attachedToBody ? window.innerWidth : this.element?.offsetWidth || 0;\n }\n\n protected get viewHeight() {\n return this.attachedToBody ? window.innerHeight : this.element?.offsetHeight || 0;\n }\n\n public get scene(): MineRenderScene {\n return this._scene;\n }\n\n public get camera(): Camera {\n return this._camera;\n }\n\n public get renderer(): WebGLRenderer {\n return this._renderer;\n }\n\n public get composer(): EffectComposer {\n return this._composer;\n }\n\n ///\n\n\n}\n\nexport interface RendererOptions {\n camera: CameraOptions;\n render: RenderOptions;\n composer: ComposerOptions;\n debug: DebugOptions;\n}\n\nexport interface CameraOptions {\n type: \"perspective\" | \"orthographic\";\n near: number;\n far: number;\n perspective: {\n aspect: undefined | number;\n fov: number;\n }\n orthographic: {\n left: undefined | number;\n right: undefined | number;\n top: undefined | number;\n bottom: undefined | number;\n }\n position: Vector3 | TripleArray;\n lookingAt: Vector3 | TripleArray;\n}\n\nexport interface RenderOptions {\n fpsLimit: number;\n stats: boolean;\n antialias: boolean;\n shade: boolean;\n autoResize: boolean;\n renderAlways: boolean;\n}\n\nexport interface ComposerOptions {\n enabled: boolean;\n}\n\nexport interface DebugOptions {\n grid: boolean;\n axes: boolean;\n}\n","import { Requests } from \"../request/Requests\";\nimport { Maybe } from \"../util/util\";\n\n//TODO: cache stuff\nexport class Skins {\n\n\n //<editor-fold desc=\"Skins\">\n\n static async fromUuidOrUsername(uuidOrUsername: string): Promise<Maybe<string>> {\n if (uuidOrUsername.length === 32 || uuidOrUsername.length === 36) {\n return this.fromUuid(uuidOrUsername);\n }\n return this.fromUsername(uuidOrUsername);\n }\n\n static async fromUuid(uuid: string): Promise<Maybe<string>> {\n // return this.getProfile(uuid).then(profile => {\n // if (profile) {\n // return profile.decoded.textures.SKIN?.url;\n // }\n // return undefined;\n // })\n return this.getSkinProxySkinUrl(uuid);\n }\n\n static async fromUsername(username: string): Promise<Maybe<string>> {\n return this.usernameToUuid(username).then(uuid => {\n if (uuid) {\n return this.fromUuid(uuid);\n }\n return undefined;\n })\n }\n\n static async fromMineSkin(mineskinId: string): Promise<Maybe<string>> {\n return this.getMineSkin(mineskinId).then(mineskin => {\n if (mineskin) {\n return mineskin[\"data\"][\"texture\"][\"value\"][\"urls\"][\"skins\"];\n }\n return undefined;\n })\n }\n\n //</editor-fold>\n\n\n //<editor-fold desc=\"Capes\">\n\n static async capeFromUuidOrUsername(uuidOrUsername: string): Promise<Maybe<string>> {\n if (uuidOrUsername.length === 32 || uuidOrUsername.length === 36) {\n return this.capeFromUuid(uuidOrUsername);\n }\n return this.capeFromUsername(uuidOrUsername);\n }\n\n static async capeFromUuid(uuid: string): Promise<Maybe<string>> {\n // return this.getProfile(uuid).then(profile => {\n // if (profile) {\n // return profile.decoded.textures.CAPE?.url;\n // }\n // return undefined;\n // })\n return this.getSkinProxyCapeUrl(uuid);\n }\n\n static async capeFromUsername(username: string): Promise<Maybe<string>> {\n return this.usernameToUuid(username).then(uuid => {\n if (uuid) {\n return this.capeFromUuid(uuid);\n }\n return undefined;\n })\n }\n\n static async capeFromCapesDev(uuid: string, capeType: string = \"minecraft\"): Promise<Maybe<string>> {\n return this.getCapesDev(uuid, capeType).then(cape => {\n if (cape) {\n //TODO: support for animated\n return cape?.stillImageUrl;\n }\n return undefined;\n })\n }\n\n //</editor-fold>\n\n\n //<editor-fold desc=\"Helpers\">\n\n private static async usernameToUuid(username: string): Promise<Maybe<string>> {\n return this.usernameToUuidSkinProxy(username);\n }\n\n private static async usernameToUuidSkinProxy(username: string): Promise<Maybe<string>> {\n return Requests.genericRequest({\n baseURL: 'https://minecraft-skin-proxy.inventive.workers.dev',\n url: '/uuid/' + username\n }).then(res => {\n if (res.status === 200) {\n return res.data[\"id\"];\n }\n return undefined;\n }).catch(err => {\n console.warn(err);\n return undefined;\n })\n }\n\n private static async usernameToUuidMineTools(username: string): Promise<Maybe<string>> {\n return Requests.genericRequest({\n baseURL: 'https://api.minetools.eu',\n url: '/uuid/' + username\n }).then(res => {\n if (res.status === 200) {\n return res.data[\"id\"];\n }\n return undefined;\n }).catch(err => {\n console.warn(err);\n return undefined;\n })\n }\n\n private static async getProfileFromMinetools(uuid: string): Promise<Maybe<any>> {\n return Requests.genericRequest({\n baseURL: 'https://api.minetools.eu',\n url: '/profile/' + uuid\n }).then(res => {\n if (res.status === 200) {\n return res.data;\n }\n })\n }\n\n private static async getMineSkin(mineskinId: string): Promise<Maybe<any>> {\n return Requests.genericRequest({\n baseURL: 'https://api.mineskin.org',\n url: '/get/uuid/' + mineskinId\n }).then(res => {\n if (res.status === 200) {\n return res.data;\n }\n return undefined;\n }).catch(err => {\n console.warn(err);\n return undefined;\n })\n }\n\n private static async getCapesDev(uuid: string, type: string = 'all'): Promise<Maybe<any>> {\n return Requests.genericRequest({\n baseURL: 'https://api.capes.dev',\n url: '/load/' + uuid + '/' + type\n }).then(res => {\n if (res.status === 200) {\n return res.data;\n }\n return undefined;\n }).catch(err => {\n console.warn(err);\n return undefined;\n })\n }\n\n private static getCrafatarSkinUrl(uuid: string): string {\n return \"https://crafatar.com/skins/\" + uuid;\n }\n\n private static getCrafatarCapeUrl(uuid: string): string {\n return \"https://crafatar.com/capes/\" + uuid;\n }\n\n private static getMcHeadsSkinUrl(uuid: string): string {\n return \"https://mc-heads.net/skin/\" + uuid;\n }\n\n private static getMineSkinPlayerSkinUrl(uuid: string): string {\n return \"https://mineskin.org/skin/player/\" + uuid;\n }\n\n private static getSkinProxySkinUrl(uuid: string): string {\n return \"https://minecraft-skin-proxy.inventive.workers.dev/skin/\" + uuid;\n }\n\n private static getSkinProxyCapeUrl(uuid: string): string {\n return \"https://minecraft-skin-proxy.inventive.workers.dev/cape/\" + uuid;\n }\n\n //</editor-fold>\n\n\n}\n","/// https://github.com/mrdoob/three.js/blob/dev/examples/jsm/controls/OrbitControls.js\n\nimport {\n EventDispatcher,\n MOUSE,\n Quaternion,\n Spherical,\n TOUCH,\n Vector2,\n Vector3\n} from 'three';\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one-finger move\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move\n\nconst _changeEvent = { type: 'change' };\nconst _startEvent = { type: 'start' };\nconst _endEvent = { type: 'end' };\n\nclass OrbitControls extends EventDispatcher {\n\n constructor( object, domElement ) {\n\n super();\n\n if ( domElement === undefined ) console.warn( 'THREE.OrbitControls: The second parameter \"domElement\" is now mandatory.' );\n if ( domElement === document ) console.error( 'THREE.OrbitControls: \"document\" should not be used as the target \"domElement\". Please use \"renderer.domElement\" instead.' );\n\n this.object = object;\n this.domElement = domElement;\n this.domElement.style.touchAction = 'none'; // disable touch scroll\n\n // Set to false to disable this control\n this.enabled = true;\n\n // \"target\" sets the location of focus, where the object orbits around\n this.target = new Vector3();\n\n // How far you can dolly in and out ( PerspectiveCamera only )\n this.minDistance = 0;\n this.maxDistance = Infinity;\n\n // How far you can zoom in and out ( OrthographicCamera only )\n this.minZoom = 0;\n this.maxZoom = Infinity;\n\n // How far you can orbit vertically, upper and lower limits.\n // Range is 0 to Math.PI radians.\n this.minPolarAngle = 0; // radians\n this.maxPolarAngle = Math.PI; // radians\n\n // How far you can orbit horizontally, upper and lower limits.\n // If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\n this.minAzimuthAngle = - Infinity; // radians\n this.maxAzimuthAngle = Infinity; // radians\n\n // Set to true to enable damping (inertia)\n // If damping is enabled, you must call controls.update() in your animation loop\n this.enableDamping = false;\n this.dampingFactor = 0.05;\n\n // This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n // Set to false to disable zooming\n this.enableZoom = true;\n this.zoomSpeed = 1.0;\n\n // Set to false to disable rotating\n this.enableRotate = true;\n this.rotateSpeed = 1.0;\n\n // Set to false to disable panning\n this.enablePan = true;\n this.panSpeed = 1.0;\n this.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up\n this.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n // Set to true to automatically rotate around the target\n // If auto-rotate is enabled, you must call controls.update() in your animation loop\n this.autoRotate = false;\n this.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60\n\n // The four arrow keys\n this.keys = { LEFT: 'ArrowLeft', UP: 'ArrowUp', RIGHT: 'ArrowRight', BOTTOM: 'ArrowDown' };\n\n // Mouse buttons\n this.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\n\n // Touch fingers\n this.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n\n // for reset\n this.target0 = this.target.clone();\n this.position0 = this.object.position.clone();\n this.zoom0 = this.object.zoom;\n\n // the target DOM element for key events\n this._domElementKeyEvents = null;\n\n //\n // public methods\n //\n\n this.getPolarAngle = function () {\n\n return spherical.phi;\n\n };\n\n this.getAzimuthalAngle = function () {\n\n return spherical.theta;\n\n };\n\n this.getDistance = function () {\n\n return this.object.position.distanceTo( this.target );\n\n };\n\n // typescript compile doesn't like this for reasons\n // this.listenToKeyEvents = function ( domElement ) {\n //\n // domElement.addEventListener( 'keydown', onKeyDown );\n // this._domElementKeyEvents = domElement;\n //\n // };\n\n this.saveState = function () {\n\n scope.target0.copy( scope.target );\n scope.position0.copy( scope.object.position );\n scope.zoom0 = scope.object.zoom;\n\n };\n\n this.reset = function () {\n\n scope.target.copy( scope.target0 );\n scope.object.position.copy( scope.position0 );\n scope.object.zoom = scope.zoom0;\n\n scope.object.updateProjectionMatrix();\n scope.dispatchEvent( _changeEvent );\n\n scope.update();\n\n state = STATE.NONE;\n\n };\n\n // this method is exposed, but perhaps it would be better if we can make it private...\n this.update = function () {\n\n const offset = new Vector3();\n\n // so camera.up is the orbit axis\n const quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) );\n const quatInverse = quat.clone().invert();\n\n const lastPosition = new Vector3();\n const lastQuaternion = new Quaternion();\n\n const twoPI = 2 * Math.PI;\n\n return function update() {\n\n const position = scope.object.position;\n\n offset.copy( position ).sub( scope.target );\n\n // rotate offset to \"y-axis-is-up\" space\n offset.applyQuaternion( quat );\n\n // angle from z-axis around y-axis\n spherical.setFromVector3( offset );\n\n if ( scope.autoRotate && state === STATE.NONE ) {\n\n rotateLeft( getAutoRotationAngle() );\n\n }\n\n if ( scope.enableDamping ) {\n\n spherical.theta += sphericalDelta.theta * scope.dampingFactor;\n spherical.phi += sphericalDelta.phi * scope.dampingFactor;\n\n } else {\n\n spherical.theta += sphericalDelta.theta;\n spherical.phi += sphericalDelta.phi;\n\n }\n\n // restrict theta to be between desired limits\n\n let min = scope.minAzimuthAngle;\n let max = scope.maxAzimuthAngle;\n\n if ( isFinite( min ) && isFinite( max ) ) {\n\n if ( min < - Math.PI ) min += twoPI; else if ( min > Math.PI ) min -= twoPI;\n\n if ( max < - Math.PI ) max += twoPI; else if ( max > Math.PI ) max -= twoPI;\n\n if ( min <= max ) {\n\n spherical.theta = Math.max( min, Math.min( max, spherical.theta ) );\n\n } else {\n\n spherical.theta = ( spherical.theta > ( min + max ) / 2 ) ?\n Math.max( min, spherical.theta ) :\n Math.min( max, spherical.theta );\n\n }\n\n }\n\n // restrict phi to be between desired limits\n spherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n spherical.makeSafe();\n\n\n spherical.radius *= scale;\n\n // restrict radius to be between desired limits\n spherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n // move target to panned location\n\n if ( scope.enableDamping === true ) {\n\n scope.target.addScaledVector( panOffset, scope.dampingFactor );\n\n } else {\n\n scope.target.add( panOffset );\n\n }\n\n offset.setFromSpherical( spherical );\n\n // rotate offset back to \"camera-up-vector-is-up\" space\n offset.applyQuaternion( quatInverse );\n\n position.copy( scope.target ).add( offset );\n\n scope.object.lookAt( scope.target );\n\n if ( scope.enableDamping === true ) {\n\n sphericalDelta.theta *= ( 1 - scope.dampingFactor );\n sphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n panOffset.multiplyScalar( 1 - scope.dampingFactor );\n\n } else {\n\n sphericalDelta.set( 0, 0, 0 );\n\n panOffset.set( 0, 0, 0 );\n\n }\n\n scale = 1;\n\n // update condition is:\n // min(camera displacement, camera rotation in radians)^2 > EPS\n // using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n if ( zoomChanged ||\n lastPosition.distanceToSquared( scope.object.position ) > EPS ||\n 8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n scope.dispatchEvent( _changeEvent );\n\n lastPosition.copy( scope.object.position );\n lastQuaternion.copy( scope.object.quaternion );\n zoomChanged = false;\n\n return true;\n\n }\n\n return false;\n\n };\n\n }();\n\n this.dispose = function () {\n\n scope.domElement.removeEventListener( 'contextmenu', onContextMenu );\n\n scope.domElement.removeEventListener( 'pointerdown', onPointerDown );\n scope.domElement.removeEventListener( 'pointercancel', onPointerCancel );\n scope.domElement.removeEventListener( 'wheel', onMouseWheel );\n\n scope.domElement.removeEventListener( 'pointermove', onPointerMove );\n scope.domElement.removeEventListener( 'pointerup', onPointerUp );\n\n\n if ( scope._domElementKeyEvents !== null ) {\n\n scope._domElementKeyEvents.removeEventListener( 'keydown', onKeyDown );\n\n }\n\n //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n };\n\n //\n // internals\n //\n\n const scope = this;\n\n const STATE = {\n NONE: - 1,\n ROTATE: 0,\n DOLLY: 1,\n PAN: 2,\n TOUCH_ROTATE: 3,\n TOUCH_PAN: 4,\n TOUCH_DOLLY_PAN: 5,\n TOUCH_DOLLY_ROTATE: 6\n };\n\n let state = STATE.NONE;\n\n const EPS = 0.000001;\n\n // current position in spherical coordinates\n const spherical = new Spherical();\n const sphericalDelta = new Spherical();\n\n let scale = 1;\n const panOffset = new Vector3();\n let zoomChanged = false;\n\n const rotateStart = new Vector2();\n const rotateEnd = new Vector2();\n const rotateDelta = new Vector2();\n\n const panStart = new Vector2();\n const panEnd = new Vector2();\n const panDelta = new Vector2();\n\n const dollyStart = new Vector2();\n const dollyEnd = new Vector2();\n const dollyDelta = new Vector2();\n\n const pointers = [];\n const pointerPositions = {};\n\n function getAutoRotationAngle() {\n\n return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n }\n\n function getZoomScale() {\n\n return Math.pow( 0.95, scope.zoomSpeed );\n\n }\n\n function rotateLeft( angle ) {\n\n sphericalDelta.theta -= angle;\n\n }\n\n function rotateUp( angle ) {\n\n sphericalDelta.phi -= angle;\n\n }\n\n const panLeft = function () {\n\n const v = new Vector3();\n\n return function panLeft( distance, objectMatrix ) {\n\n v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n v.multiplyScalar( - distance );\n\n panOffset.add( v );\n\n };\n\n }();\n\n const panUp = function () {\n\n const v = new Vector3();\n\n return function panUp( distance, objectMatrix ) {\n\n if ( scope.screenSpacePanning === true ) {\n\n v.setFromMatrixColumn( objectMatrix, 1 );\n\n } else {\n\n v.setFromMatrixColumn( objectMatrix, 0 );\n v.crossVectors( scope.object.up, v );\n\n }\n\n v.multiplyScalar( distance );\n\n panOffset.add( v );\n\n };\n\n }();\n\n // deltaX and deltaY are in pixels; right and down are positive\n const pan = function () {\n\n const offset = new Vector3();\n\n return function pan( deltaX, deltaY ) {\n\n const element = scope.domElement;\n\n if ( scope.object.isPerspectiveCamera ) {\n\n // perspective\n const position = scope.object.position;\n offset.copy( position ).sub( scope.target );\n let targetDistance = offset.length();\n\n // half of the fov is center to top of screen\n targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n // we use only clientHeight here so aspect ratio does not distort speed\n panLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n panUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n } else if ( scope.object.isOrthographicCamera ) {\n\n // orthographic\n panLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n panUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n } else {\n\n // camera neither orthographic nor perspective\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n scope.enablePan = false;\n\n }\n\n };\n\n }();\n\n function dollyOut( dollyScale ) {\n\n if ( scope.object.isPerspectiveCamera ) {\n\n scale /= dollyScale;\n\n } else if ( scope.object.isOrthographicCamera ) {\n\n scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n scope.object.updateProjectionMatrix();\n zoomChanged = true;\n\n } else {\n\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n scope.enableZoom = false;\n\n }\n\n }\n\n function dollyIn( dollyScale ) {\n\n if ( scope.object.isPerspectiveCamera ) {\n\n scale *= dollyScale;\n\n } else if ( scope.object.isOrthographicCamera ) {\n\n scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n scope.object.updateProjectionMatrix();\n zoomChanged = true;\n\n } else {\n\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n scope.enableZoom = false;\n\n }\n\n }\n\n //\n // event callbacks - update the object state\n //\n\n function handleMouseDownRotate( event ) {\n\n rotateStart.set( event.clientX, event.clientY );\n\n }\n\n function handleMouseDownDolly( event ) {\n\n dollyStart.set( event.clientX, event.clientY );\n\n }\n\n function handleMouseDownPan( event ) {\n\n panStart.set( event.clientX, event.clientY );\n\n }\n\n function handleMouseMoveRotate( event ) {\n\n rotateEnd.set( event.clientX, event.clientY );\n\n rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n const element = scope.domElement;\n\n rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n rotateStart.copy( rotateEnd );\n\n scope.update();\n\n }\n\n function handleMouseMoveDolly( event ) {\n\n dollyEnd.set( event.clientX, event.clientY );\n\n dollyDelta.subVectors( dollyEnd, dollyStart );\n\n if ( dollyDelta.y > 0 ) {\n\n dollyOut( getZoomScale() );\n\n } else if ( dollyDelta.y < 0 ) {\n\n dollyIn( getZoomScale() );\n\n }\n\n dollyStart.copy( dollyEnd );\n\n scope.update();\n\n }\n\n function handleMouseMovePan( event ) {\n\n panEnd.set( event.clientX, event.clientY );\n\n panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n pan( panDelta.x, panDelta.y );\n\n panStart.copy( panEnd );\n\n scope.update();\n\n }\n\n function handleMouseUp( /*event*/ ) {\n\n // no-op\n\n }\n\n function handleMouseWheel( event ) {\n\n if ( event.deltaY < 0 ) {\n\n dollyIn( getZoomScale() );\n\n } else if ( event.deltaY > 0 ) {\n\n dollyOut( getZoomScale() );\n\n }\n\n scope.update();\n\n }\n\n function handleKeyDown( event ) {\n\n let needsUpdate = false;\n\n switch ( event.code ) {\n\n case scope.keys.UP:\n pan( 0, scope.keyPanSpeed );\n needsUpdate = true;\n break;\n\n case scope.keys.BOTTOM:\n pan( 0, - scope.keyPanSpeed );\n needsUpdate = true;\n break;\n\n case scope.keys.LEFT:\n pan( scope.keyPanSpeed, 0 );\n needsUpdate = true;\n break;\n\n case scope.keys.RIGHT:\n pan( - scope.keyPanSpeed, 0 );\n needsUpdate = true;\n break;\n\n }\n\n if ( needsUpdate ) {\n\n // prevent the browser from scrolling on cursor keys\n event.preventDefault();\n\n scope.update();\n\n }\n\n\n }\n\n function handleTouchStartRotate() {\n\n if ( pointers.length === 1 ) {\n\n rotateStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );\n\n } else {\n\n const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );\n const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );\n\n rotateStart.set( x, y );\n\n }\n\n }\n\n function handleTouchStartPan() {\n\n if ( pointers.length === 1 ) {\n\n panStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );\n\n } else {\n\n const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );\n const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );\n\n panStart.set( x, y );\n\n }\n\n }\n\n function handleTouchStartDolly() {\n\n const dx = pointers[ 0 ].pageX - pointers[ 1 ].pageX;\n const dy = pointers[ 0 ].pageY - pointers[ 1 ].pageY;\n\n const distance = Math.sqrt( dx * dx + dy * dy );\n\n dollyStart.set( 0, distance );\n\n }\n\n function handleTouchStartDollyPan() {\n\n if ( scope.enableZoom ) handleTouchStartDolly();\n\n if ( scope.enablePan ) handleTouchStartPan();\n\n }\n\n function handleTouchStartDollyRotate() {\n\n if ( scope.enableZoom ) handleTouchStartDolly();\n\n if ( scope.enableRotate ) handleTouchStartRotate();\n\n }\n\n function handleTouchMoveRotate( event ) {\n\n if ( pointers.length == 1 ) {\n\n rotateEnd.set( event.pageX, event.pageY );\n\n } else {\n\n const position = getSecondPointerPosition( event );\n\n const x = 0.5 * ( event.pageX + position.x );\n const y = 0.5 * ( event.pageY + position.y );\n\n rotateEnd.set( x, y );\n\n }\n\n rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n const element = scope.domElement;\n\n rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n rotateStart.copy( rotateEnd );\n\n }\n\n function handleTouchMovePan( event ) {\n\n if ( pointers.length === 1 ) {\n\n panEnd.set( event.pageX, event.pageY );\n\n } else {\n\n const position = getSecondPointerPosition( event );\n\n const x = 0.5 * ( event.pageX + position.x );\n const y = 0.5 * ( event.pageY + position.y );\n\n panEnd.set( x, y );\n\n }\n\n panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n pan( panDelta.x, panDelta.y );\n\n panStart.copy( panEnd );\n\n }\n\n function handleTouchMoveDolly( event ) {\n\n const position = getSecondPointerPosition( event );\n\n const dx = event.pageX - position.x;\n const dy = event.pageY - position.y;\n\n const distance = Math.sqrt( dx * dx + dy * dy );\n\n dollyEnd.set( 0, distance );\n\n dollyDelta.set( 0, Math.pow( dollyEnd.y / dollyStart.y, scope.zoomSpeed ) );\n\n dollyOut( dollyDelta.y );\n\n dollyStart.copy( dollyEnd );\n\n }\n\n function handleTouchMoveDollyPan( event ) {\n\n if ( scope.enableZoom ) handleTouchMoveDolly( event );\n\n if ( scope.enablePan ) handleTouchMovePan( event );\n\n }\n\n function handleTouchMoveDollyRotate( event ) {\n\n if ( scope.enableZoom ) handleTouchMoveDolly( event );\n\n if ( scope.enableRotate ) handleTouchMoveRotate( event );\n\n }\n\n function handleTouchEnd( /*event*/ ) {\n\n // no-op\n\n }\n\n //\n // event handlers - FSM: listen for events and reset state\n //\n\n function onPointerDown( event ) {\n\n if ( scope.enabled === false ) return;\n\n if ( pointers.length === 0 ) {\n\n scope.domElement.setPointerCapture( event.pointerId );\n\n scope.domElement.addEventListener( 'pointermove', onPointerMove );\n scope.domElement.addEventListener( 'pointerup', onPointerUp );\n\n }\n\n //\n\n addPointer( event );\n\n if ( event.pointerType === 'touch' ) {\n\n onTouchStart( event );\n\n } else {\n\n onMouseDown( event );\n\n }\n\n }\n\n function onPointerMove( event ) {\n\n if ( scope.enabled === false ) return;\n\n if ( event.pointerType === 'touch' ) {\n\n onTouchMove( event );\n\n } else {\n\n onMouseMove( event );\n\n }\n\n }\n\n function onPointerUp( event ) {\n\n if ( scope.enabled === false ) return;\n\n if ( event.pointerType === 'touch' ) {\n\n onTouchEnd();\n\n } else {\n\n onMouseUp( event );\n\n }\n\n removePointer( event );\n\n //\n\n if ( pointers.length === 0 ) {\n\n scope.domElement.releasePointerCapture( event.pointerId );\n\n scope.domElement.removeEventListener( 'pointermove', onPointerMove );\n scope.domElement.removeEventListener( 'pointerup', onPointerUp );\n\n }\n\n }\n\n function onPointerCancel( event ) {\n\n removePointer( event );\n\n }\n\n function onMouseDown( event ) {\n\n let mouseAction;\n\n switch ( event.button ) {\n\n case 0:\n\n mouseAction = scope.mouseButtons.LEFT;\n break;\n\n case 1:\n\n mouseAction = scope.mouseButtons.MIDDLE;\n break;\n\n case 2:\n\n mouseAction = scope.mouseButtons.RIGHT;\n break;\n\n default:\n\n mouseAction = - 1;\n\n }\n\n switch ( mouseAction ) {\n\n case MOUSE.DOLLY:\n\n if ( scope.enableZoom === false ) return;\n\n handleMouseDownDolly( event );\n\n state = STATE.DOLLY;\n\n break;\n\n case MOUSE.ROTATE:\n\n if ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n if ( scope.enablePan === false ) return;\n\n handleMouseDownPan( event );\n\n state = STATE.PAN;\n\n } else {\n\n if ( scope.enableRotate === false ) return;\n\n handleMouseDownRotate( event );\n\n state = STATE.ROTATE;\n\n }\n\n break;\n\n case MOUSE.PAN:\n\n if ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n if ( scope.enableRotate === false ) return;\n\n handleMouseDownRotate( event );\n\n state = STATE.ROTATE;\n\n } else {\n\n if ( scope.enablePan === false ) return;\n\n handleMouseDownPan( event );\n\n state = STATE.PAN;\n\n }\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n if ( state !== STATE.NONE ) {\n\n scope.dispatchEvent( _startEvent );\n\n }\n\n }\n\n function onMouseMove( event ) {\n\n if ( scope.enabled === false ) return;\n\n switch ( state ) {\n\n case STATE.ROTATE:\n\n if ( scope.enableRotate === false ) return;\n\n handleMouseMoveRotate( event );\n\n break;\n\n case STATE.DOLLY:\n\n if ( scope.enableZoom === false ) return;\n\n handleMouseMoveDolly( event );\n\n break;\n\n case STATE.PAN:\n\n if ( scope.enablePan === false ) return;\n\n handleMouseMovePan( event );\n\n break;\n\n }\n\n }\n\n function onMouseUp( event ) {\n\n handleMouseUp( event );\n\n scope.dispatchEvent( _endEvent );\n\n state = STATE.NONE;\n\n }\n\n function onMouseWheel( event ) {\n\n if ( scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE ) return;\n\n event.preventDefault();\n\n scope.dispatchEvent( _startEvent );\n\n handleMouseWheel( event );\n\n scope.dispatchEvent( _endEvent );\n\n }\n\n function onKeyDown( event ) {\n\n if ( scope.enabled === false || scope.enablePan === false ) return;\n\n handleKeyDown( event );\n\n }\n\n function onTouchStart( event ) {\n\n trackPointer( event );\n\n switch ( pointers.length ) {\n\n case 1:\n\n switch ( scope.touches.ONE ) {\n\n case TOUCH.ROTATE:\n\n if ( scope.enableRotate === false ) return;\n\n handleTouchStartRotate();\n\n state = STATE.TOUCH_ROTATE;\n\n break;\n\n case TOUCH.PAN:\n\n if ( scope.enablePan === false ) return;\n\n handleTouchStartPan();\n\n state = STATE.TOUCH_PAN;\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n break;\n\n case 2:\n\n switch ( scope.touches.TWO ) {\n\n case TOUCH.DOLLY_PAN:\n\n if ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n handleTouchStartDollyPan();\n\n state = STATE.TOUCH_DOLLY_PAN;\n\n break;\n\n case TOUCH.DOLLY_ROTATE:\n\n if ( scope.enableZoom === false && scope.enableRotate === false ) return;\n\n handleTouchStartDollyRotate();\n\n state = STATE.TOUCH_DOLLY_ROTATE;\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n if ( state !== STATE.NONE ) {\n\n scope.dispatchEvent( _startEvent );\n\n }\n\n }\n\n function onTouchMove( event ) {\n\n trackPointer( event );\n\n switch ( state ) {\n\n case STATE.TOUCH_ROTATE:\n\n if ( scope.enableRotate === false ) return;\n\n handleTouchMoveRotate( event );\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_PAN:\n\n if ( scope.enablePan === false ) return;\n\n handleTouchMovePan( event );\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_DOLLY_PAN:\n\n if ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n handleTouchMoveDollyPan( event );\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_DOLLY_ROTATE:\n\n if ( scope.enableZoom === false && scope.enableRotate === false ) return;\n\n handleTouchMoveDollyRotate( event );\n\n scope.update();\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n }\n\n function onTouchEnd( event ) {\n\n handleTouchEnd( event );\n\n scope.dispatchEvent( _endEvent );\n\n state = STATE.NONE;\n\n }\n\n function onContextMenu( event ) {\n\n if ( scope.enabled === false ) return;\n\n event.preventDefault();\n\n }\n\n function addPointer( event ) {\n\n pointers.push( event );\n\n }\n\n function removePointer( event ) {\n\n delete pointerPositions[ event.pointerId ];\n\n for ( let i = 0; i < pointers.length; i ++ ) {\n\n if ( pointers[ i ].pointerId == event.pointerId ) {\n\n pointers.splice( i, 1 );\n return;\n\n }\n\n }\n\n }\n\n function trackPointer( event ) {\n\n let position = pointerPositions[ event.pointerId ];\n\n if ( position === undefined ) {\n\n position = new Vector2();\n pointerPositions[ event.pointerId ] = position;\n\n }\n\n position.set( event.pageX, event.pageY );\n\n }\n\n function getSecondPointerPosition( event ) {\n\n const pointer = ( event.pointerId === pointers[ 0 ].pointerId ) ? pointers[ 1 ] : pointers[ 0 ];\n\n return pointerPositions[ pointer.pointerId ];\n\n }\n\n //\n\n scope.domElement.addEventListener( 'contextmenu', onContextMenu );\n\n scope.domElement.addEventListener( 'pointerdown', onPointerDown );\n scope.domElement.addEventListener( 'pointercancel', onPointerCancel );\n scope.domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } );\n\n // force an update at start\n\n this.update();\n\n }\n\n}\n\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n// This is very similar to OrbitControls, another set of touch behavior\n//\n// Orbit - right mouse, or left mouse + ctrl/meta/shiftKey / touch: two-finger rotate\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - left mouse, or arrow keys / touch: one-finger move\n\nclass MapControls extends OrbitControls {\n\n constructor( object, domElement ) {\n\n super( object, domElement );\n\n this.screenSpacePanning = false; // pan orthogonal to world-space direction camera.up\n\n this.mouseButtons.LEFT = MOUSE.PAN;\n this.mouseButtons.RIGHT = MOUSE.ROTATE;\n\n this.touches.ONE = TOUCH.PAN;\n this.touches.TWO = TOUCH.DOLLY_ROTATE;\n\n }\n\n}\n\nexport { OrbitControls, MapControls };\n","import { Block } from \"../model/block/Block\";\nimport { BlockObject, isBlockObject } from \"../model/block/scene/BlockObject\";\nimport { Box3, Object3D, Vector3 } from \"three\";\nimport { Maybe } from \"../util/util\";\nimport { BlockInfo } from \"./BlockInfo\";\nimport { MineRenderScene } from \"../renderer/MineRenderScene\";\nimport { BlockStates } from \"../assets/BlockStates\";\nimport { AssetKey } from \"../assets/AssetKey\";\nimport { MineRenderWorld } from \"./MineRenderWorld\";\nimport { isTripleArray, TripleArray } from \"../model/Model\";\nimport { addBox3WireframeToObject } from \"../util/model\";\nimport { prefix } from \"../util/log\";\n\nconst p = prefix(\"Chunk\");\n\nexport class Chunk {\n\n public readonly scene: MineRenderScene; //TODO: should probably be the world\n\n public readonly x: number;\n public readonly y: number;\n public readonly z: number;\n\n private readonly _blocks: BlockInfo[] = [];\n\n private readonly _anchor: Object3D;\n\n constructor(scene: MineRenderScene, x: number, y: number, z: number) {\n this.scene = scene;\n this.x = x;\n this.y = y;\n this.z = z;\n\n //TODO: option to visualize chunks\n let anchor = new Object3D();\n this._anchor = anchor;\n scene.add(anchor)\n anchor.position.set((this.x * 256) + 128 - 8, (this.y * 256) + 128 - 8, (this.z * 256) + 128 - 8);\n addBox3WireframeToObject(\n new Box3(new Vector3(0, 0, 0), new Vector3(256, 256, 256)),\n anchor,\n 0xffff00,\n 4);\n }\n\n public getBlockAt(x: number, y: number, z: number): Maybe<BlockInfo>;\n public getBlockAt(pos: Vector3): Maybe<BlockInfo>;\n public getBlockAt(pos: TripleArray): Maybe<BlockInfo>;\n public getBlockAt(posOrX: number | Vector3 | TripleArray, y?: number, z?: number): Maybe<BlockInfo> {\n if (typeof posOrX == \"number\") {\n return this.getBlockAt(new Vector3(posOrX, y, z));\n }\n if (isTripleArray(posOrX)) {\n return this.getBlockAt(new Vector3(posOrX[0], posOrX[1], posOrX[2]))\n }\n const pos: Vector3 = this.worldPosToChunkPos(posOrX);\n const index = Chunk.chunkPosToBlockIndex(pos);\n return this._blocks[index];\n }\n\n /**\n * Set block at a _world_ position\n */\n public async setBlockAt(x: number, y: number, z: number, block: Maybe<Block>): Promise<Maybe<BlockInfo>>;\n public async setBlockAt(pos: Vector3, block: Maybe<Block>): Promise<Maybe<BlockInfo>>;\n public async setBlockAt(pos: TripleArray, block: Maybe<Block>): Promise<Maybe<BlockInfo>>;\n public async setBlockAt(posOrX: number | Vector3 | TripleArray, yOrBlock?: number | Block, z?: number, block?: Block): Promise<Maybe<BlockInfo>> {\n if (typeof posOrX == \"number\") {\n return this.setBlockAt(new Vector3(posOrX, yOrBlock as number, z), block as Block);\n }\n if (isTripleArray(posOrX)) {\n return this.setBlockAt(new Vector3(posOrX[0], posOrX[1], posOrX[2]), yOrBlock as Block);\n }\n const worldPos: Vector3 = posOrX;\n const pos: Vector3 = this.worldPosToChunkPos(worldPos);\n block = yOrBlock as Block;\n\n return this.setBlockInChunkAt(pos, block, worldPos);\n }\n\n /**\n * Set block at a _chunk_ position (0-16)\n */\n public async setBlockInChunkAt(pos: Vector3, block?: Block, worldPos?: Vector3): Promise<Maybe<BlockInfo>> {\n if (typeof worldPos === \"undefined\") {\n worldPos = this.chunkPosToWorldPos(pos);\n }\n\n const index = Chunk.chunkPosToBlockIndex(pos);\n const current = this._blocks[index];\n if (typeof current !== \"undefined\") {\n console.debug(p, \"deleting existing block at\", pos, worldPos, index);\n // current.object.setScale(new Vector3(0, 0, 0));//TODO\n current.object.removeFromScene();\n delete this._blocks[index];\n }\n\n if (typeof block === \"undefined\" || typeof block.type === \"undefined\" || block.type === \"air\") return undefined; // only delete block\n\n const blockState = await BlockStates.get(AssetKey.parse(\"blockstates\", block.type));\n if (blockState) {\n const blockObject: BlockObject = await this.scene.addBlock(blockState, {\n mergeMeshes: true,\n instanceMeshes: true,\n wireframe: true,\n maxInstanceCount: 2000 //TODO: setting this to high kills FPS; increase on demand somehow?\n }) as BlockObject;//TODO\n if (block.properties) {\n await blockObject.setState(block.properties);\n }\n\n const scenePos = MineRenderWorld.worldToScenePosition(worldPos);\n blockObject.setPosition(scenePos);\n\n this._blocks[index] = {\n block: block,\n object: blockObject as BlockObject\n }\n return this._blocks[index];\n }\n return undefined;\n }\n\n public async clear(): Promise<void> {\n let promises: Promise<any>[] = [];\n let pos = new Vector3();\n for (let x = 0; x < 16; x++) {\n for (let z = 0; z < 16; z++) {\n for (let y = 0; y < 16; y++) {\n promises.push(this.setBlockInChunkAt(pos.set(x,y,z), undefined));\n }\n }\n }\n return Promise.all(promises).then(ignored => {\n });\n }\n\n public async dispose(): Promise<void> {\n await this.clear();\n this.scene.remove(this._anchor);\n }\n\n static chunkPosToBlockIndex(pos: Vector3): number {\n return (pos.y * 16 * 16) + (pos.z * 16) + pos.x;\n }\n\n worldPosToChunkPos(pos: Vector3): Vector3 {\n return new Vector3(\n pos.x - (this.x * 16),\n pos.y - (this.y * 16),\n pos.z - (this.z * 16)\n )\n }\n\n chunkPosToWorldPos(pos: Vector3): Vector3 {\n return new Vector3(\n (this.x * 16) + pos.x,\n (this.y * 16) + pos.y,\n (this.z * 16) + pos.z\n );\n }\n\n}\n","import { MineRenderScene } from \"../renderer/MineRenderScene\";\nimport { Block } from \"../model/block/Block\";\nimport { BlockObject } from \"../model/block/scene/BlockObject\";\nimport { Vector3 } from \"three\";\nimport { isTripleArray, TripleArray } from \"../model/Model\";\nimport { isVector3, Maybe } from \"../util/util\";\nimport { Chunk } from \"./Chunk\";\nimport { BlockInfo } from \"./BlockInfo\";\nimport { MultiBlockBlock, MultiBlockStructure } from \"../model/multiblock/MultiBlockStructure\";\nimport { BatchedExecutor } from \"../util/BatchedExecutor\";\nimport { AssetKey } from \"../assets/AssetKey\";\nimport { BlockStates } from \"../assets/BlockStates\";\n\n//TODO: maybe make this an Object3D to add children\nexport class MineRenderWorld {\n\n public readonly scene: MineRenderScene;\n\n private _size: number = 4; //TODO: expandable\n private _blockSize: number = this._size * 16;\n\n private readonly _chunks: Map<string,Chunk> = new Map<string, Chunk>();\n\n constructor(scene: MineRenderScene) {\n this.scene = scene;\n }\n\n public getBlockAt(x: number, y: number, z: number): Maybe<BlockInfo>;\n public getBlockAt(pos: Vector3): Maybe<BlockInfo>;\n public getBlockAt(pos: TripleArray): Maybe<BlockInfo>;\n public getBlockAt(posOrX: number | Vector3 | TripleArray, y?: number, z?: number): Maybe<BlockInfo> {\n if (typeof posOrX == \"number\") {\n return this.getBlockAt(new Vector3(posOrX, y, z));\n }\n if (isTripleArray(posOrX)) {\n return this.getBlockAt(new Vector3(posOrX[0], posOrX[1], posOrX[2]))\n }\n const chunk = this.getChunkAt(posOrX);\n if (typeof chunk === \"undefined\") {\n return undefined;\n }\n this.validatePosBounds(posOrX);\n return chunk.getBlockAt(posOrX);\n }\n\n public async setBlockAt(x: number, y: number, z: number, block: Block): Promise<Maybe<BlockInfo>>;\n public async setBlockAt(pos: Vector3, block: Block): Promise<Maybe<BlockInfo>>;\n public async setBlockAt(pos: TripleArray, block: Block): Promise<Maybe<BlockInfo>>;\n public async setBlockAt(posOrX: number | Vector3 | TripleArray, yOrBlock?: number | Block, z?: number, block?: Block): Promise<Maybe<BlockInfo>> {\n if (typeof posOrX == \"number\") {\n return this.setBlockAt(new Vector3(posOrX, yOrBlock as number, z), block as Block);\n }\n if (isTripleArray(posOrX)) {\n return this.setBlockAt(new Vector3(posOrX[0], posOrX[1], posOrX[2]), yOrBlock as Block);\n }\n this.validatePosBounds(posOrX);\n const chunk = this.getOrCreateChunkAt(posOrX);\n return chunk.setBlockAt(posOrX, yOrBlock as Block);\n }\n\n\n public async placeMultiBlock(multiblock: MultiBlockStructure, useBatches: boolean = true, executor: BatchedExecutor = new BatchedExecutor()): Promise<void> {\n // preload blockstates\n const keys = new Set<AssetKey>(multiblock.blocks.map(block => AssetKey.parse(\"blockstates\", block.type)));\n await BlockStates.getAll(keys);\n\n const place = async (block: MultiBlockBlock) => {\n if (useBatches && typeof executor !== \"undefined\") {\n await new Promise((resolve, reject) => {\n executor.submit(() => {\n this.setBlockAt(block.position, block).then(resolve).catch(reject)\n })\n });\n } else {\n await this.setBlockAt(block.position, block);\n }\n }\n for (let block of multiblock.blocks) {\n await place(block);\n }\n }\n\n\n public async clear(): Promise<void> {\n console.log(\"CHUNKS\",this._chunks)\n\n for (let chunk of this._chunks.values()) {\n console.log(\"dispose chunk\",chunk)\n await chunk?.dispose();\n }\n this._chunks.clear();\n }\n\n private getOrCreateChunkAt(pos: Vector3): Chunk {\n const key = this.worldPosToChunkKey(pos);\n let chunk = this._chunks.get(key);\n if (typeof chunk === \"undefined\") {\n chunk = new Chunk(this.scene, Math.floor(pos.x / 16), Math.floor(pos.y / 16), Math.floor(pos.z / 16));\n this._chunks.set(key, chunk);\n }\n return chunk;\n }\n\n public getChunkAt(pos: Vector3): Maybe<Chunk> {\n const index = this.worldPosToChunkIndex(pos);\n return this._chunks[index];\n }\n\n\n static worldToScenePosition(pos: Vector3): Vector3 {\n return new Vector3(\n pos.x * 16.0,\n pos.y * 16.0,\n pos.z * 16.0\n );\n }\n\n static sceneToWorldPosition(pos: Vector3): Vector3 {\n return new Vector3(\n pos.x / 16.0,\n pos.y / 16.0,\n pos.z / 16.0\n );\n }\n\n worldPosToChunkIndex(pos: Vector3): number {\n const chunkX = Math.floor(pos.x / 16);\n const chunkY = Math.floor(pos.y / 16);\n const chunkZ = Math.floor(pos.z / 16);\n return (chunkZ * this._size * this._size) + (chunkY * this._size) + chunkX;\n }\n\n worldPosToChunkKey(pos: Vector3): string {\n const chunkX = Math.floor(pos.x / 16);\n const chunkY = Math.floor(pos.y / 16);\n const chunkZ = Math.floor(pos.z / 16);\n return `${chunkX}_${chunkY}_${chunkZ}`;\n }\n\n validatePosBounds(pos: Vector3): void {\n if (pos.x < 0) throw new Error(\"x<0\");\n if (pos.y < 0) throw new Error(\"y<0\");\n if (pos.z < 0) throw new Error(\"z<0\");\n if (pos.x > this._blockSize) throw new Error(\"x>\" + this._blockSize);\n if (pos.y > this._blockSize) throw new Error(\"y>\" + this._blockSize);\n if (pos.z > this._blockSize) throw new Error(\"z>\" + this._blockSize);\n }\n\n}\n"],"mappings":"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","names":["merge","Axis","CubeFace","CubeFaceIndex","Texture","createCanvas","Time","prefix","BoxGeometry","Vector3","Vector3","BoxGeometry","Time","Buffer","p","createCanvas","Buffer","Texture","Mesh","Mesh","Float32BufferAttribute","split","p","merge","p","AssetParser","Memoize","Memoize","import_ts_deepmerge","p","merge","p","import_ts_deepmerge","p","merge","createCanvas","p","Float32BufferAttribute","_a","Memoize","Memoize","Matrix4","Mesh","Object3D","Quaternion","Vector3","import_ts_deepmerge","p","Object3D","merge","Mesh","Matrix4","Vector3","Quaternion","import_ts_deepmerge","Object3D","THREE","merge","Object3D","Vector2","p","Vector2","p","DisplayPosition","GuiLight","BoxGeometry","Matrix4","BufferAttribute","Float32BufferAttribute","Vector3","buffer","object","material","morphTargetsRelative","a","b","c","i","il","import_ts_deepmerge","p","merge","Matrix4","BoxGeometry","import_ts_deepmerge","Euler","Matrix4","Vector3","p","merge","Vector3","Euler","Matrix4","Scene","import_ts_deepmerge","SkinPart","import_ts_deepmerge","merge","Scene","merge","AxesHelper","Vector3","import_ts_deepmerge","merge","AxesHelper","changeEvent","Vector3","EventDispatcher","Quaternion","Vector2","Vector3","panLeft","panUp","pan","Box3","Object3D","Vector3","Vector3","Vector3","p","Object3D","Box3","Vector3"]}
1
+ {"version":3,"sources":["../../../../node_modules/ts-deepmerge/src/index.ts","../../src/env/node/NodeEnv.ts","../../src/Env.ts","../../src/cache/PersistentCache.ts","../../src/env/node/NodeCache.ts","../../src/env/node/register.ts","../../src/Axis.ts","../../src/CubeFace.ts","../../src/Disposable.ts","../../src/Geometries.ts","../../src/util/util.ts","../../src/cache/CacheKey.ts","../../src/cache/Caching.ts","../../src/Materials.ts","../../src/texture/Textures.ts","../../src/texture/TextureLoader.ts","../../src/canvas/CanvasCompat.ts","../../src/request/Requests.ts","../../src/util/log.ts","../../src/util/BatchedExecutor.ts","../../src/util/model.ts","../../src/util/performance.ts","../../src/util/three.ts","../../src/WrappedImage.ts","../../src/image/ImageLoader.ts","../../src/Meshes.ts","../../src/UVMapper.ts","../../src/model/ModelMerger.ts","../../src/assets/AssetKey.ts","../../src/assets/Models.ts","../../src/assets/source/parser/AssetParsers.ts","../../src/assets/BlockStates.ts","../../src/assets/Assets.ts","../../src/assets/source/AssetSource.ts","../../src/nbt/NBTHelper.ts","../../src/assets/source/HostedAssetSource.ts","../../src/assets/source/archive/BrowserArchiveProxy.ts","../../src/assets/source/archive/ArchiveAssetSource.ts","../../src/assets/AssetLoader.ts","../../src/assets/ModelTextures.ts","../../src/canvas/CanvasImage.ts","../../src/Ticker.ts","../../src/texture/TextureAtlas.ts","../../src/model/ModelGenerator.ts","../../src/MinecraftCubeTexture.ts","../../src/SceneStats.ts","../../src/TintColors.ts","../../src/Transformable.ts","../../src/shutdown.ts","../../src/assets/Entities.ts","../../src/renderer/SceneObject.ts","../../src/instance/InstanceReference.ts","../../src/error/MineRenderError.ts","../../src/entity/scene/EntityObject.ts","../../src/gui/scene/GuiObject.ts","../../src/inspector/SceneInspector.ts","../../src/inspector/SceneStatsDisplay.ts","../../src/instance/InstanceManager.ts","../../src/instance/Instanceable.ts","../../src/model/DisplayPosition.ts","../../src/model/GuiLight.ts","../../src/model/Model.ts","../../src/model/scene/ModelObject.ts","../../src/three/BufferGeometryUtils.js","../../src/model/block/scene/BlockObject.ts","../../src/model/multiblock/SchematicParser.ts","../../src/model/multiblock/StructureParser.ts","../../src/renderer/MineRenderScene.ts","../../src/skin/SkinPart.ts","../../src/skin/SkinTextureCoordinates.ts","../../src/skin/SkinGeometries.ts","../../src/skin/scene/SkinObject.ts","../../src/renderer/Renderer.ts","../../src/three/OrbitControls.js","../../src/skin/Skins.ts","../../src/world/Chunk.ts","../../src/world/MineRenderWorld.ts"],"sourcesContent":[null,"import * as nodeCanvas from \"canvas\";\nimport imageSize from \"image-size\";\nimport NodePersist from \"node-persist\";\nimport { Env, EnvProvider, ImageSizeInfo } from \"../../Env\";\nimport type { CompatCanvas, CompatImage } from \"../../canvas/CanvasCompat\";\nimport type { PersistentCache } from \"../../cache/PersistentCache\";\nimport { NodeCache } from \"./NodeCache\";\n\n/**\n * {@link EnvProvider} for headless Node.\n *\n * This is the only place in the library allowed to reach for Node-only modules. Nothing here may\n * be imported from `src/index.ts` - it is reachable exclusively through the `src/index.node.ts`\n * entry, which is what keeps `canvas` and friends out of the browser bundle.\n *\n * `canvas` is an optional dependency: browser-only consumers never install its native binary.\n * Importing this module without it will fail, which is intended - rasterisation under Node needs it.\n */\nexport class NodeEnv implements EnvProvider {\n\n public readonly name = \"node\";\n\n createCanvas(width: number, height: number): CompatCanvas {\n return nodeCanvas.createCanvas(width, height);\n }\n\n createImage(width?: number, height?: number): CompatImage {\n const image = new nodeCanvas.Image();\n if (width) image.width = width;\n if (height) image.height = height;\n return image;\n }\n\n imageSize(data: Uint8Array): ImageSizeInfo {\n return imageSize(Buffer.isBuffer(data) ? data : Buffer.from(data));\n }\n\n openCache(name: string, version: number): PersistentCache {\n return new NodeCache(NodePersist.create({\n dir: name + version,\n encoding: \"utf8\"\n }));\n }\n\n}\n\nexport function registerNodeEnv(): NodeEnv {\n const env = new NodeEnv();\n Env.register(env);\n return env;\n}\n","import type { CompatCanvas, CompatImage } from \"./canvas/CanvasCompat\";\nimport type { PersistentCache } from \"./cache/PersistentCache\";\n\n/**\n * Dimensions probed from raw, still-encoded image bytes.\n * Mirrors the subset of `image-size`'s result that MineRender actually uses.\n */\nexport interface ImageSizeInfo {\n width?: number;\n height?: number;\n type?: string;\n}\n\n/**\n * Everything MineRender needs from the platform it is running on.\n *\n * This is the seam between the browser and Node builds: core code only ever talks to the\n * registered provider, so nothing outside of `src/env/node/` may reference a Node-only module\n * (`canvas`, `node-persist`, `image-size`, `fs`, …). Keeping that rule is what allows the browser\n * bundle to be built without Node polyfills.\n */\nexport interface EnvProvider {\n\n readonly name: string;\n\n createCanvas(width: number, height: number): CompatCanvas;\n\n createImage(width?: number, height?: number): CompatImage;\n\n /** Read width/height out of encoded image bytes without fully decoding them. */\n imageSize(data: Uint8Array): ImageSizeInfo;\n\n openCache(name: string, version: number): PersistentCache;\n\n}\n\n/**\n * Registry holding the active {@link EnvProvider}.\n *\n * The `minerender` package entries register one for you — importing the library through its\n * `exports` map gets you the browser provider in bundlers and the Node provider under Node.\n * Only call {@link Env.register} directly if you are embedding MineRender in an exotic host.\n */\nexport class Env {\n\n private static _provider: EnvProvider | undefined;\n\n public static register(provider: EnvProvider): void {\n this._provider = provider;\n }\n\n public static get registered(): boolean {\n return typeof this._provider !== \"undefined\";\n }\n\n public static get provider(): EnvProvider {\n const provider = this._provider;\n if (!provider) {\n throw new Error(\n \"MineRender has no environment provider registered. Import the package itself \" +\n \"(\\\"minerender\\\") rather than a file inside dist/, or register one yourself via \" +\n \"Env.register(...).\"\n );\n }\n return provider;\n }\n\n}\n","import { Env } from \"../Env\";\n\n/**\n * Key/value store that survives a page reload or process restart.\n *\n * The concrete backing store is supplied by the active {@link EnvProvider} - `localforage`\n * (IndexedDB) in the browser, `node-persist` (disk) under Node - so this file itself stays\n * free of any platform-specific import.\n */\nexport abstract class PersistentCache<B = unknown> {\n\n /** Bump to invalidate every persisted entry. */\n public static readonly VERSION = 1;\n\n public static open(name: string): PersistentCache {\n return Env.provider.openCache(name, PersistentCache.VERSION);\n }\n\n protected constructor(readonly backing: B) {\n }\n\n abstract get<T>(key: string): Promise<T>;\n\n async getOrLoad<T>(key: string, loader: (key: string) => Promise<T>): Promise<T> {\n let v = await this.get<T>(key);\n if (typeof v === \"undefined\" || v === null) {\n v = await loader(key);\n await this.put<T>(key, v);\n }\n return v;\n }\n\n abstract put<T>(key: string, value: T): Promise<T>;\n\n abstract delete<T>(key: string): Promise<void>;\n\n abstract clear(): Promise<void> ;\n\n abstract length(): Promise<number> ;\n\n abstract keys(): Promise<string[]>;\n\n abstract forEach<T>(callback: (v: T, k: string) => void): Promise<void>;\n\n}\n","import type { LocalStorage } from \"node-persist\";\nimport { PersistentCache } from \"../../cache/PersistentCache\";\n\n/**\n * {@link PersistentCache} backed by node-persist (one directory of JSON files per cache).\n *\n * node-persist requires an explicit `init()` before any read or write; that is done lazily on\n * first access so that merely constructing the cache stays free of filesystem side effects.\n */\nexport class NodeCache extends PersistentCache<LocalStorage> {\n\n private initialized: Promise<unknown> | undefined;\n\n constructor(backing: LocalStorage) {\n super(backing);\n }\n\n private ready(): Promise<unknown> {\n return this.initialized ??= this.backing.init();\n }\n\n async get<T>(key: string): Promise<T> {\n await this.ready();\n return this.backing.getItem(key);\n }\n\n async put<T>(key: string, value: T): Promise<T> {\n await this.ready();\n return this.backing.setItem(key, value).then(res => res.content);\n }\n\n async delete<T>(key: string): Promise<void> {\n await this.ready();\n await this.backing.removeItem(key);\n }\n\n async clear(): Promise<void> {\n await this.ready();\n return this.backing.clear();\n }\n\n async length(): Promise<number> {\n await this.ready();\n return this.backing.length();\n }\n\n async keys(): Promise<string[]> {\n await this.ready();\n return this.backing.keys();\n }\n\n async forEach<T>(callback: (v: T, k: string) => void): Promise<void> {\n await this.ready();\n return this.backing.forEach(d => {\n callback(d.value, d.key);\n });\n }\n\n}\n","import { registerNodeEnv } from \"./NodeEnv\";\n\n// Side-effect module: importing it installs the Node provider. Kept separate from NodeEnv.ts so\n// entries can guarantee registration happens before anything else evaluates.\nregisterNodeEnv();\n\nexport {};\n","import { Vector3 } from \"three\";\n\nexport enum Axis {\n X = \"X\",\n Y = \"y\",\n Z = \"z\"\n}\n\nexport const AXES = Object.values(Axis);\n\nexport function axisToVec3(axis: Axis): Vector3 {\n switch (axis) {\n case Axis.X:\n return new Vector3(1, 0, 0);\n case Axis.Y:\n return new Vector3(0, 1, 0);\n case Axis.Z:\n return new Vector3(0, 0, 1);\n }\n}\n","export enum CubeFace {\n EAST = \"east\", // px\n WEST = \"west\", // nx\n UP = \"up\", // py\n DOWN = \"down\", // ny\n SOUTH = \"south\", // pz\n NORTH = \"north\", // nz\n}\n\nexport enum CubeFaceIndex {\n EAST,\n WEST,\n UP,\n DOWN,\n SOUTH,\n NORTH\n}\n\nexport const CUBE_FACES = Object.values(CubeFace);\n\n","export interface Disposable {\n dispose(): void;\n}\n\nexport function isDisposable(obj: any): obj is Disposable {\n return 'dispose' in obj;\n}\n","import { BoxGeometry, BufferAttribute, Float32BufferAttribute } from \"three\";\nimport { BoxGeometryKey, serializeBoxGeometryKey } from \"./cache/CacheKey\";\nimport { Caching } from \"./cache/Caching\";\n\nexport class Geometries {\n\n public static createBox(key: BoxGeometryKey): BoxGeometry {\n const geometry = new BoxGeometry(key.width, key.height, key.depth);\n geometry.computeBoundingBox();\n\n if (key.uv) {\n geometry.setAttribute(\"uv\", new Float32BufferAttribute(key.uv, 2));\n }\n\n\n\n // if (key.coordinates) { // Create UV mappings\n // const w = key.texWidth || 16;\n // const h = key.texHeight || 16;\n //\n // const index = geometry.getIndex();\n // const uvAttributes = geometry.getAttribute(\"uv\");\n //\n // const faceUvs = [];\n // const faceNames = Object.values(CubeFace);\n // let j = 0;\n // for (let i = 0; i < faceNames.length; i++) {\n // const faceName = faceNames[i];\n // const face = key.coordinates[faceName];\n //\n // console.log(faceName);\n // console.log(face)\n //\n // const tx1 = face.x / w;\n // const ty1 = (face.y / h);\n // const tx2 = (face.x + face.w) / w;\n // const ty2 = ((face.y + face.h) / h);\n //\n //\n // uvAttributes.setXY(j + 0, tx1, ty1);\n //\n // uvAttributes.setXY(j + 2, tx2, ty2);\n //\n // // faceUvs[i] = [\n // // new THREE.Vector2(tx1, ty2),\n // // new THREE.Vector2(tx1, ty1),\n // // new THREE.Vector2(tx2, ty1),\n // // new THREE.Vector2(tx2, ty2)\n // // ];\n // //\n // // const flipX = face.fx;\n // // const flipY = face.fy;\n // //\n // // let temp;\n // // if (flipY) {\n // // temp = faceUvs[i].slice(0);\n // // faceUvs[i][0] = temp[2];\n // // faceUvs[i][1] = temp[3];\n // // faceUvs[i][2] = temp[0];\n // // faceUvs[i][3] = temp[1]\n // // }\n // // if (flipX) {\n // // temp = faceUvs[i].slice(0);\n // // faceUvs[i][0] = temp[3];\n // // faceUvs[i][1] = temp[2];\n // // faceUvs[i][2] = temp[1];\n // // faceUvs[i][3] = temp[0]\n // // }\n //\n //\n //\n // j+=4;\n // }\n //\n //\n // for (let i = 0; i < faceUvs.length; i++) {\n // // uvAttributes.array[j] = [faceUvs[i][0], faceUvs[i][1], faceUvs[i][3]];\n // // uvAttributes.array[j + 1] = [faceUvs[i][1], faceUvs[i][2], faceUvs[i][3]];\n // // j += 2;\n // }\n // uvAttributes.needsUpdate = true;\n //\n //\n // }\n\n\n return geometry;\n }\n\n public static getBox(key: BoxGeometryKey): BoxGeometry {\n const keyStr = serializeBoxGeometryKey(key)\n return Caching.boxGeometryCache.get(keyStr, k => {\n return Geometries.createBox(key);\n })!;\n }\n\n}\n\n\n","// `crypto-js/core` was imported separately here, but that deep path is unresolvable under Node's\n// ESM loader (crypto-js has no exports map and the specifier carries no extension). The main\n// entry exposes `enc` just the same.\nimport * as CryptoJS from \"crypto-js\";\nimport { Vector3 } from \"three\";\n\nexport const changeEvent = { type: 'change'};\n\nexport type Maybe<T> = T | undefined;\n\n// crypto-js runs identically in both environments, so these deliberately do not go through Env -\n// using it here would pull Node's `crypto` into the browser graph for no benefit.\n\nexport function md5(str: string): string {\n return CryptoJS.MD5(str).toString(CryptoJS.enc.Hex);\n}\n\nexport function sha1(str: string): string {\n return CryptoJS.SHA1(str).toString(CryptoJS.enc.Hex);\n}\n\nexport function sha256(str: string): string {\n return CryptoJS.SHA256(str).toString(CryptoJS.enc.Hex);\n}\n\nexport function sha512(str: string): string {\n return CryptoJS.SHA512(str).toString(CryptoJS.enc.Hex);\n}\n\nexport function base64encode(str: string): string {\n if (typeof btoa !== \"undefined\") {\n return btoa(str);\n }\n return Buffer.from(str).toString(\"base64\");\n}\n\nexport function base64decode(str: string): string {\n if (typeof atob !== \"undefined\") {\n return atob(str);\n }\n return Buffer.from(str, \"base64\").toString(\"ascii\");\n}\n\nexport function toRadians(degrees: number): number {\n return degrees * Math.PI / 180;\n}\n\nexport function toDegrees(radians: number): number {\n return radians * 180 / Math.PI;\n}\n\nexport async function sleep(timeout: number): Promise<void> {\n return new Promise(resolve => {\n setTimeout(() => resolve(), timeout);\n });\n}\n\nexport function clampRotationDegrees(deg: number): number {\n return deg % 360;\n}\n\nexport function isVector3(obj: any): obj is Vector3 {\n return (<Vector3>obj).isVector3;\n}\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: DeepPartial<T[P]>;\n};\n","import { PixelFormat } from \"three\";\nimport { md5 } from \"../util/util\";\n\nexport type CacheKey = string;\n\nexport interface RawImageKey {\n src: string;\n}\n\nexport function serializeImageKey(key: RawImageKey): string {\n return md5(key.src);\n}\n\n// export function parseImageKey(key: string): RawImageKey {\n// return {\n// src: base64decode(key)\n// };\n// }\n\n///\n\nexport interface BoxGeometryKey {\n width: number;\n height: number;\n depth: number;\n uv?: number[];\n}\n\nexport function serializeBoxGeometryKey(key: BoxGeometryKey): string {\n return md5([key.width, key.height, key.depth, key.uv?.join(\":\")].join(\"_\"));\n}\n\n// export function parseBoxGeometryKey(key: string): BoxGeometryKey {\n// let [width, height, depth, uvS] = base64decode(key).split(\"_\");\n// let uv = uvS.split(\":\").map(s => +s);\n// return {\n// width: +width,\n// height: +height,\n// depth: +depth,\n// uv\n// }\n// }\n\n///\n\nexport interface TextureKey extends RawImageKey {\n format?: PixelFormat;\n rotation?: number;\n}\n\nexport function serializeTextureKey(key: TextureKey): string {\n return md5([key.src, key.format, key.rotation].join(\"$\"));\n}\n\n// export function parseTextureGeometryKey(key: string): TextureKey {\n// let [src, format] = base64decode(key).split(\"$\");\n// return {\n// src,\n// format: +format\n// }\n// }\n\n///\n\nexport interface MaterialKey {\n texture: TextureKey;\n transparent?: boolean;\n}\n\nexport function serializeMaterialKey(key: MaterialKey): string {\n return md5([serializeTextureKey(key.texture), key.transparent].join(\"~\"));\n}\n\n\n///\n\nexport interface MeshKey {\n geometry: BoxGeometryKey;\n material: MaterialKey;\n}\n\nexport function serializeMeshKey(key: MeshKey): string {\n return md5([serializeBoxGeometryKey(key.geometry), serializeMaterialKey(key.material)].join(\"#\"));\n}\n\n\n///\n\n\n\n","import { AsyncLoadingCache, Caches, Loader, LoadingCache, SimpleCache } from \"@inventivetalent/loading-cache\";\nimport { BoxGeometryKey, CacheKey, serializeBoxGeometryKey, serializeImageKey, TextureKey } from \"./CacheKey\";\nimport { Time } from \"@inventivetalent/time\";\nimport { ImageInfo, ImageLoader } from \"../image/ImageLoader\";\nimport { BoxGeometry, Material, Mesh, PixelFormat, RGBAFormat, Texture } from \"three\";\nimport { Materials } from \"../Materials\";\nimport { CompatImage } from \"../canvas/CanvasCompat\";\nimport { Model, TextureAsset } from \"../model/Model\";\nimport { WrappedImage } from \"../WrappedImage\";\nimport { TextureAtlas } from \"../texture/TextureAtlas\";\nimport { ExtractableImageData } from \"../ExtractableImageData\";\nimport { MinecraftTextureMeta } from \"../MinecraftTextureMeta\";\nimport { BlockStates } from \"../assets/BlockStates\";\nimport { BlockState } from \"../model/block/BlockState\";\n\nexport class Caching {\n\n static readonly rawImageCache: AsyncLoadingCache<CacheKey, ImageInfo> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(5))\n .buildAsync<CacheKey, ImageInfo>();\n static readonly imageDataCache: AsyncLoadingCache<CacheKey, ImageData> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(10))\n .buildAsync<CacheKey, ImageData>();\n static readonly canvasImageDataCache: AsyncLoadingCache<CacheKey, ExtractableImageData> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(10))\n .buildAsync<CacheKey, ExtractableImageData>();\n static readonly wrappedImageCache: AsyncLoadingCache<CacheKey, WrappedImage> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(10))\n .buildAsync<CacheKey, WrappedImage>();\n\n static readonly boxGeometryCache: SimpleCache<CacheKey, BoxGeometry> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(20))\n .build<CacheKey, BoxGeometry>();\n\n static readonly textureCache: SimpleCache<CacheKey, Texture> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .build<CacheKey, Texture>();\n\n static readonly materialCache: SimpleCache<CacheKey, Material> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .build<CacheKey, Material>();\n\n static readonly boxMeshCache: SimpleCache<CacheKey, Mesh> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .build<CacheKey, Mesh>();\n\n static readonly textureAssetCache: AsyncLoadingCache<CacheKey, TextureAsset> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .buildAsync<CacheKey, TextureAsset>();\n static readonly textureMetaCache: AsyncLoadingCache<CacheKey, MinecraftTextureMeta> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .buildAsync<CacheKey, MinecraftTextureMeta>();\n\n static readonly rawModelCache: AsyncLoadingCache<CacheKey, Model> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .buildAsync<CacheKey, Model>();\n static readonly mergedModelCache: AsyncLoadingCache<CacheKey, Model> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .buildAsync<CacheKey, Model>();\n static readonly modelTextureAtlasCache: AsyncLoadingCache<CacheKey, TextureAtlas> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .buildAsync<CacheKey, TextureAtlas>();\n\n static readonly blockStateCache: AsyncLoadingCache<CacheKey, BlockState> = Caches.builder()\n .expireAfterWrite(Time.minutes(10))\n .expireAfterAccess(Time.minutes(5))\n .expirationInterval(Time.seconds(30))\n .buildAsync<CacheKey, BlockState>();\n\n\n /** Every cache above, so clear()/end() can never fall out of sync with the field list again. */\n private static get all(): { invalidateAll(): void; end(): void }[] {\n return [\n this.rawImageCache,\n this.imageDataCache,\n this.canvasImageDataCache,\n this.wrappedImageCache,\n this.boxGeometryCache,\n this.textureCache,\n this.materialCache,\n this.boxMeshCache,\n this.textureAssetCache,\n this.textureMetaCache,\n this.rawModelCache,\n this.mergedModelCache,\n this.modelTextureAtlasCache,\n this.blockStateCache\n ];\n }\n\n public static clear() {\n for (const cache of this.all) {\n cache.invalidateAll();\n }\n }\n\n /**\n * Clears every cache and stops its expiry timer.\n *\n * loading-cache reschedules that timer indefinitely, so a Node process will not exit until\n * this is called - see {@link shutdown}.\n */\n public static end() {\n for (const cache of this.all) {\n cache.invalidateAll();\n cache.end();\n }\n }\n\n public static get cacheSizes() {\n return {\n //TODO\n }\n }\n\n}\n\n","import { MaterialKey, serializeMaterialKey } from \"./cache/CacheKey\";\nimport { Color, DoubleSide, FrontSide, Material, MeshBasicMaterial, MeshLambertMaterial, MeshPhongMaterial, MeshStandardMaterial, ShaderMaterial } from \"three\";\nimport { Textures } from \"./texture/Textures\";\nimport { Caching } from \"./cache/Caching\";\nimport { AssetKey } from \"./assets/AssetKey\";\n\nexport class Materials {\n\n private static readonly MISSING_TEXTURE_SRC = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQMAAACQp+OdAAAABlBMVEX/AP8AAACfphTyAAAAFUlEQVQoz2MIhQKGVVAwKjIqQrwIAHRz/wFI17TEAAAAAElFTkSuQmCC\";\n\n // resolved lazily: as a static field this decoded an image the moment the library was\n // imported, which needs both a DOM and an EnvProvider to already be in place\n public static get MISSING_TEXTURE(): Material {\n return Materials.getImage({ texture: { src: Materials.MISSING_TEXTURE_SRC } });\n }\n\n public static createImage(key: MaterialKey): Material {\n //TODO: type from key\n const transparent = key.transparent || false;\n return new MeshBasicMaterial({\n map: Textures.getImage(key.texture),\n transparent: transparent,\n side: transparent ? DoubleSide : FrontSide,\n alphaTest: 0.5\n });\n //TODO: params\n }\n\n\n public static createBasicCanvasMaterial(canvas: HTMLCanvasElement, transparent: boolean = false, shade: boolean = false): Material {\n if (shade) {\n return new MeshStandardMaterial({\n map: Textures.createCanvasTexture(canvas),\n transparent: transparent,\n side: transparent ? DoubleSide : FrontSide,\n alphaTest: 0.5,\n\n })\n }\n return new MeshBasicMaterial({\n map: Textures.createCanvasTexture(canvas),\n transparent: transparent,\n side: transparent ? DoubleSide : FrontSide,\n alphaTest: 0.5,\n\n })\n }\n\n public static createShadedCanvasMaterial(canvas: HTMLCanvasElement, transparent: boolean = false, shade:boolean=false):Material {\n //TODO\n // this might help https://github.com/JannisX11/blockbench/blob/1701f764641376414d29100c4f6c7cd74997fad8/js/preview/canvas.js#L62\n\n\n // Based on https://github.com/JannisX11/blockbench/blob/cc73aa8a9c0494fd9fe1cee4d062d060af4db06d/js/texturing/textures.js#L59\n // + support for instanced meshes\n const vertShader =`\n uniform bool SHADE;\n \n varying vec2 vUv;\n varying float light;\n varying float lift;\n\n float AMBIENT = 0.5;\n float XFAC = -0.15;\n float ZFAC = 0.05;\n\n void main()\n {\n\n if (SHADE) {\n\n vec3 N = vec3( modelMatrix * instanceMatrix * vec4(normal, 0.0) );\n\n float yLight = (1.0+N.y) * 0.5;\n light = yLight * (1.0-AMBIENT) + N.x*N.x * XFAC + N.z*N.z * ZFAC + AMBIENT;\n\n } else {\n\n light = 1.0;\n\n } \n\n if (color.b > 1.1) {\n lift = 0.1;\n } else {\n lift = 0.0;\n }\n \n vUv = uv;\n \n #ifdef USE_INSTANCING\n gl_Position = projectionMatrix * viewMatrix * modelMatrix * instanceMatrix * vec4(position, 1.0);\n #else\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n #endif\n \n }\n `\n const fragShader = `\n #ifdef GL_ES\n precision highp float;\n #endif\n\n uniform sampler2D map;\n\n uniform bool SHADE;\n uniform bool EMISSIVE;\n uniform float BRIGHTNESS;\n\n varying vec2 vUv;\n varying float light;\n varying float lift;\n\n void main(void)\n {\n vec4 color = texture2D(map, vUv);\n \n if (color.a < 0.01) discard;\n\n if (EMISSIVE == false) {\n\n gl_FragColor = vec4(lift + color.rgb * light * BRIGHTNESS, color.a);\n\n } else {\n\n float light2 = (light * BRIGHTNESS) + (1.0 - light * BRIGHTNESS) * (1.0 - color.a);\n gl_FragColor = vec4(lift + color.rgb * light2, 1.0);\n\n }\n }\n `\n //TODO: this does add the MC-like shading, but breaks when stuff is instanced (can't updated position)\n // https://medium.com/@pailhead011/instancing-with-three-js-part-2-3be34ae83c57 might help with that\n\n try {\n return new ShaderMaterial({\n uniforms: {\n SHADE: { value: true },\n BRIGHTNESS: { value: 1 },\n EMISSIVE:{value:false},\n base: { value: new Color(0xc1c1c1)/*TODO*/ },\n map: {value:Textures.createCanvasTexture(canvas)}\n },\n vertexShader: vertShader,\n fragmentShader: fragShader,\n vertexColors: true,\n transparent: transparent,\n side: transparent ? DoubleSide : FrontSide,\n alphaTest: 0.5,\n });\n } catch (e) {\n console.warn(e)\n }\n\n // fallback\n return this.createBasicCanvasMaterial(canvas, transparent, shade);\n }\n\n public static getImage(key: MaterialKey): Material {\n const keyStr = serializeMaterialKey(key);\n return Caching.materialCache.get(keyStr, k => {\n return Materials.createImage(key);\n })!;\n }\n\n public static needsUpdate(mat: Material) {\n mat.needsUpdate = true;\n\n if (mat.type === 'ShaderMaterial') {\n let mat1=mat as ShaderMaterial;\n if (\"map\" in mat1.uniforms) {\n mat1.uniforms.map.value.needsUpdate = true;\n }\n }\n if (mat.type === 'MeshBasicMaterial' || mat.type === 'MeshStandardMaterial') {\n let mat1 = mat as (MeshBasicMaterial | MeshStandardMaterial);\n if (mat1.map) {\n mat1.map.needsUpdate = true;\n }\n }\n }\n\n}\n","import { CanvasTexture, Texture } from \"three\";\nimport { TextureLoader } from \"./TextureLoader\";\nimport { Caching } from \"../cache/Caching\";\nimport { serializeTextureKey, TextureKey } from \"../cache/CacheKey\";\nimport { AssetKey } from \"../assets/AssetKey\";\nimport * as THREE from \"three\";\n\nexport class Textures {\n\n public static initTextureProps<T extends Texture>(texture: T): T {\n texture.magFilter = THREE.NearestFilter;\n texture.minFilter = THREE.NearestFilter;\n texture.anisotropy = 0;\n return texture;\n }\n\n\n public static createImage(key: TextureKey): Texture {\n return TextureLoader.load(key.src, key.format, key.rotation);\n }\n\n public static createAsset(key: AssetKey): Texture {\n return new Texture()\n }\n\n public static createCanvasTexture(canvas: HTMLCanvasElement): CanvasTexture {\n return this.initTextureProps(new CanvasTexture(canvas));\n }\n\n public static getImage(key: TextureKey): Texture {\n const keyStr = serializeTextureKey(key);\n return Caching.textureCache.get(keyStr, k=>{\n return Textures.createImage(key);\n })!;\n }\n\n}\n","import { PixelFormat, RGBAFormat, Texture } from \"three\";\nimport { Caching } from \"../cache/Caching\";\nimport * as THREE from \"three\";\nimport { ImageLoader } from \"../image/ImageLoader\";\nimport { createCanvas } from \"../canvas/CanvasCompat\";\nimport type { CanvasRenderingContext2D } from \"canvas\";\nimport { Textures } from \"./Textures\";\n\nexport class TextureLoader {\n\n protected static createTexture(): Texture {\n return new Texture();\n }\n\n public static loadInBackground(src: string, format: PixelFormat = RGBAFormat, rotation: number = 0): Texture {\n const texture = this.createTexture();\n const image = ImageLoader.loadElement(src);\n image.onload = function () {\n texture.needsUpdate = true;\n }\n texture.image = image;\n texture.format = format;\n texture.rotation = rotation;\n\n return Textures.initTextureProps(texture);\n }\n\n public static load(src: string,format: PixelFormat = RGBAFormat, rotation: number = 0): Texture {\n const texture = new Texture();\n ImageLoader.getData(src).then(image=>{\n texture.needsUpdate = true;\n texture.image = image;\n })\n texture.format = format;\n texture.rotation = rotation;\n\n return Textures.initTextureProps(texture);\n }\n\n\n}\n","import type * as nodeCanvas from \"canvas\";\nimport { Env } from \"../Env\";\n\nexport type CompatImage = HTMLImageElement | nodeCanvas.Image;\nexport type CompatCanvas = HTMLCanvasElement | nodeCanvas.Canvas;\n\nexport function createImage(width?: number, height?: number): CompatImage {\n return Env.provider.createImage(width, height);\n}\n\nexport function createCanvas(width: number, height: number): CompatCanvas {\n return Env.provider.createCanvas(width, height);\n}\n","import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { JobQueue } from \"jobqu\";\nimport { Time } from \"@inventivetalent/time\";\nimport { prefix } from \"../util/log\";\nimport { sleep } from \"../util\";\n\nconst p = prefix(\"Requests\");\n\nif (typeof window === \"undefined\") {\n axios.defaults.headers[\"User-Agent\"] = \"MineRender\";\n}\n\nexport class Requests {\n\n private static axiosInstance: AxiosInstance = axios.create({\n timeout: 5000\n });\n\n private static mcAssetInstance: AxiosInstance = axios.create({\n timeout: 5000\n })\n\n private static genericQueue: JobQueue<AxiosRequestConfig, AxiosResponse>\n = new JobQueue<AxiosRequestConfig, AxiosResponse>(request => Requests.axiosInstance.request(request), Time.millis(10), 1);\n private static mcAssetRequestQueue: JobQueue<AxiosRequestConfig, AxiosResponse>\n = new JobQueue<AxiosRequestConfig, AxiosResponse>(request => Requests.mcAssetInstance.request(request), Time.millis(10), 1);\n\n public static genericRequest(request: AxiosRequestConfig): Promise<AxiosResponse> {\n // return this.axiosInstance.request(request);\n return this.genericQueue.add(request).catch(async e => {\n console.debug(p, \"generic catch\", e.code, e);\n\n // axios really likes to randomly cancel requests\n // no idea why, but just keep retrying\n if (this.shouldRetry(e, request)) {\n await sleep(100);\n return this.genericRequest(request);\n }\n\n throw e;\n });\n }\n\n public static mcAssetRequest(request: AxiosRequestConfig): Promise<AxiosResponse> {\n return this.mcAssetRequestQueue.add(request).catch(e => {\n console.debug(p, \"mcAssetRequest catch\", e.code, e);\n throw e;\n });\n // return Requests.mcAssetInstance.request(request)\n }\n\n private static shouldRetry(e: any, request: AxiosRequestConfig): boolean {\n if ('code' in e) {\n if ('ECONNABORTED' === e.code) {\n if ('minerenderRetry' in request) {\n if (request['minerenderRetry'] as number > 0) {\n (request['minerenderRetry'] as number)--;\n return true;\n }\n } else {\n request['minerenderRetry'] = 3;\n return true;\n }\n }\n }\n return false;\n }\n\n public static setMcAssetRoot(root: string) {\n this.mcAssetInstance.defaults.baseURL = root;\n }\n\n public static get queueSizes() {\n return {\n generic: this.genericQueue.size,\n mcAsset: this.mcAssetRequestQueue.size\n }\n }\n\n /**\n * Stops both queue timers. jobqu reschedules itself indefinitely, so a Node process will not\n * exit until this is called - see {@link shutdown}.\n */\n public static end() {\n this.genericQueue.end();\n this.mcAssetRequestQueue.end();\n }\n\n}\n","// https://stackoverflow.com/a/41407246/6257838\nconst Reset = \"\\x1b[0m\"\nconst Bright = \"\\x1b[1m\"\nconst Dim = \"\\x1b[2m\"\nconst Underscore = \"\\x1b[4m\"\nconst Blink = \"\\x1b[5m\"\nconst Reverse = \"\\x1b[7m\"\nconst Hidden = \"\\x1b[8m\"\n\nconst FgBlack = \"\\x1b[30m\"\nconst FgRed = \"\\x1b[31m\"\nconst FgGreen = \"\\x1b[32m\"\nconst FgYellow = \"\\x1b[33m\"\nconst FgBlue = \"\\x1b[34m\"\nconst FgMagenta = \"\\x1b[35m\"\nconst FgCyan = \"\\x1b[36m\"\nconst FgWhite = \"\\x1b[37m\"\n\nconst BgBlack = \"\\x1b[40m\"\nconst BgRed = \"\\x1b[41m\"\nconst BgGreen = \"\\x1b[42m\"\nconst BgYellow = \"\\x1b[43m\"\nconst BgBlue = \"\\x1b[44m\"\nconst BgMagenta = \"\\x1b[45m\"\nconst BgCyan = \"\\x1b[46m\"\nconst BgWhite = \"\\x1b[47m\"\n\nexport function prefix(prefix?: string): string {\n return `${ FgGreen }MR${ BgBlack }${ prefix ?? '' }${ Reset }`\n}\n","import Timeout = NodeJS.Timeout;\n\nexport class BatchedExecutor {\n\n public readonly interval: number;\n public readonly batch: number;\n\n private readonly queue: Task[];\n private readonly task: Timeout;\n\n constructor(interval: number = 1, batch: number = 30) {\n this.interval = interval;\n this.batch = batch;\n\n this.queue = [];\n this.task = setInterval(() => this.run());\n }\n\n public submit(task: Task): void {\n this.queue.push(task);\n }\n\n private run() {\n for (let i = 0; i < this.batch; i++) {\n this.runNext();\n }\n }\n\n private runNext() {\n let next = this.queue.shift();\n if (next) next();\n }\n\n\n}\n\ntype Task = () => any | Promise<any>\n","/// https://stackoverflow.com/questions/42812861/three-js-pivot-point/42866733#42866733\n// obj - your object (THREE.Object3D or derived)\n// point - the point of rotation (THREE.Vector3)\n// axis - the axis of rotation (normalized THREE.Vector3)\n// theta - radian value of rotation\nimport { ElementRotation } from \"../model/ModelElement\";\nimport { BufferGeometry } from \"three/src/core/BufferGeometry\";\nimport { Axis } from \"../Axis\";\nimport { toRadians } from \"./util\";\nimport { AxesHelper, Box3, BoxGeometry, EdgesGeometry, LineBasicMaterial, LineSegments, Matrix4, Mesh, Object3D, Quaternion, Vector3, Vector4 } from \"three\";\nimport { ModelPart } from \"../model/ModelPart\";\n\nfunction rotateAboutPoint(obj: THREE.Object3D, point: THREE.Vector3, axis: THREE.Vector3, theta: number) {\n obj.position.sub(point); // remove the offset\n obj.position.applyAxisAngle(axis, theta); // rotate the POSITION\n obj.position.add(point); // re-add the offset\n\n obj.rotateOnAxis(axis, theta); // rotate the OBJECT\n}\n\nexport function applyElementRotation(rotation: ElementRotation, geometry: BufferGeometry) {\n const origin = new Vector3(rotation.origin[0], rotation.origin[1], rotation.origin[2]);\n // origin.multiplyScalar(0.0625);\n\n\n // let axisVector: Vector3;\n // let inverseAxisVector: Vector3;\n // switch (rotation.axis) {\n // case Axis.X:\n // axisVector = new Vector3(1, 0, 0);\n // inverseAxisVector = new Vector3(0, 1, 1);\n // break;\n // case Axis.Y:\n // axisVector = new Vector3(0, 1, 0);\n // inverseAxisVector = new Vector3(1, 0, 1);\n // break;\n // case Axis.Z:\n // axisVector = new Vector3(0, 0, 1);\n // inverseAxisVector = new Vector3(1, 1, 0);\n // break;\n // }\n // const quat = new Quaternion().setFromAxisAngle(axisVector, (rotation.angle*0.017453292));\n // if (rotation.rescale) {\n // if (Math.abs(rotation.angle) === 22.5) {\n // inverseAxisVector.multiplyScalar(1.0 / Math.cos(0.39269909262657166) - 1.0)\n // }else {\n // inverseAxisVector.multiplyScalar(1.0 / Math.cos(0.7853981852531433) - 1.0)\n // }\n //\n // inverseAxisVector.add(new Vector3(1, 1, 1));\n // }else{\n // inverseAxisVector.set(1, 1, 1);\n // }\n\n // Vector4 vec4 = new Vector4(geometry.getAttribute(\"position\").)\n\n\n // subtract origin\n geometry.translate(-origin.x, -origin.y, -origin.z);\n // apply rotation\n switch (rotation.axis) {\n case Axis.X:\n geometry.rotateX(toRadians(rotation.angle));\n break;\n case Axis.Y:\n geometry.rotateY(toRadians(rotation.angle));\n break;\n case Axis.Z:\n geometry.rotateZ(toRadians(rotation.angle));\n break;\n }\n\n\n // if (rotation.rescale) {\n // console.log(\"angle\", Math.abs(rotation.angle) )\n // if (Math.abs(rotation.angle) === 22.5) {\n // const s = 2;\n // geometry.scale(s, s, s);\n // }else{\n // const s = 2;\n // geometry.scale(s, s, s);\n // }\n // }\n if (rotation.rescale) {\n //TODO: y height seems a bit too tall (1 pixel)\n if (Math.abs(rotation.angle) === 22.5) {\n const s = 1.0 / Math.cos(0.39269909262657166);\n geometry.scale(s, 1, s);\n }else {\n const s = 1.0 / Math.cos(0.7853981852531433);\n geometry.scale(s, 1, s);\n }\n }\n\n // add back origin\n geometry.translate(origin.x, origin.y, origin.z);\n\n\n}\n\nexport function applyModelPartRotation(modelPart: ModelPart, geometry: BufferGeometry) {\n const origin = new Vector3(modelPart.pivotX,modelPart.pivotY,modelPart.pivotZ);\n\n\n // subtract origin\n geometry.translate(-origin.x, -origin.y, -origin.z);\n // apply rotation\n //TODO: these might be the wrong order\n geometry.rotateX(toRadians(modelPart.pitch));\n geometry.rotateY(toRadians(modelPart.yaw));\n geometry.rotateZ(toRadians(modelPart.roll));\n\n\n // add back origin\n geometry.translate(origin.x, origin.y, origin.z);\n\n\n}\n\nexport function applyGenericRotation(axis: Axis, rotation: number, obj: Object3D) {\n\n\n // obj.position.sub(new Vector3(8,8,8).add(obj.position))\n //\n // switch (axis) {\n // case Axis.X:\n // obj.position.applyAxisAngle(new Vector3(1, 0, 0), toRadians(rotation));\n // break;\n // case Axis.Y:\n // obj.position.applyAxisAngle(new Vector3(0, 1, 0), toRadians(rotation));\n // break;\n // case Axis.Z:\n // obj.position.applyAxisAngle(new Vector3(0, 0, 1), toRadians(rotation));\n // break;\n // }\n //\n // obj.position.add(new Vector3(8,8,8).add(obj.position))\n\n switch (axis) {\n case Axis.X:\n obj.rotateOnAxis(new Vector3(1, 0, 0), toRadians(rotation));\n break;\n case Axis.Y:\n obj.rotateOnAxis(new Vector3(0, 1, 0), toRadians(rotation));\n break;\n case Axis.Z:\n obj.rotateOnAxis(new Vector3(0, 0, 1), toRadians(rotation));\n break;\n }\n\n // subtract origin\n // obj.translateX(-8);\n // obj.translateZ(-8);\n // obj.translateY(-8);\n // // apply rotation\n // switch (axis) {\n // case Axis.X:\n // obj.rotateX(toRadians(rotation));\n // // matrix.makeRotationX(toRadians(rotation));\n // break;\n // case Axis.Y:\n // obj.rotateY(toRadians(rotation));\n // // matrix.makeRotationY(toRadians(rotation));\n // break;\n // case Axis.Z:\n // obj.rotateZ(toRadians(rotation));\n // // matrix.makeRotationZ(toRadians(rotation));\n // break;\n // }\n // // add back origin\n // obj.translateX(8);\n // obj.translateZ(8);\n // obj.translateY(8);\n\n // obj.applyMatrix4(matrix);\n}\n\nexport function addBox3WireframeToObject(box: Box3, obj: Object3D, color: number = 0xffffff, w: number = 2) {\n let size = new Vector3();\n box.getSize(size);\n\n let boxGeo = new BoxGeometry(size.x, size.y, size.z, 1, 1, 1);\n // boxGeo.translate(box.min.x, box.min.y, box.min.z);\n let wireGeo = new EdgesGeometry(boxGeo);\n let wireMat = new LineBasicMaterial({ color: color, linewidth: w, })\n let wireframe = new LineSegments(wireGeo, wireMat);\n obj.add(wireframe);\n\n let axes = new AxesHelper(1);\n obj.add(axes);\n}\n\n\nexport function addWireframeToObject(obj: Object3D, color: number = 0xffffff, w: number = 2) {\n let boxGeo = new BoxGeometry(16, 16, 16, 1, 1, 1);\n let wireGeo = new EdgesGeometry(boxGeo);\n let wireMat = new LineBasicMaterial({ color: color, linewidth: w, })\n let wireframe = new LineSegments(wireGeo, wireMat);\n obj.add(wireframe);\n\n let axes = new AxesHelper(1);\n obj.add(axes);\n}\n\nexport function addWireframeToMesh(geo: BufferGeometry, mesh: Mesh, color: number = 0xffffff, w: number = 2) {\n let wireGeo = new EdgesGeometry(geo);\n let wireMat = new LineBasicMaterial({ color: color, linewidth: w, })\n let wireframe = new LineSegments(wireGeo, wireMat);\n mesh.add(wireframe);\n\n let axes = new AxesHelper(1);\n mesh.add(axes);\n}\n","export function captureException(e: any, ...extra: any[]) {\n console.error(e, extra);\n //TODO\n}\n\nexport function timingStart(marker: string) {\n console.time(marker);\n //TODO\n}\n\nexport function timingEnd(marker: string) {\n console.timeEnd(marker);\n //TODO\n}\n","import { InstancedMesh, Mesh, Object3D, OrthographicCamera, PerspectiveCamera } from \"three\";\nimport { SceneObject } from \"../renderer/SceneObject\";\n\nexport function isObject3D(obj: any): obj is Object3D {\n return (<Object3D> obj).isObject3D;\n}\n\nexport function isMesh(obj: any): obj is Mesh {\n return (<Mesh> obj).isMesh;\n}\n\nexport function isInstancedMesh(obj: any): obj is InstancedMesh {\n return (<InstancedMesh> obj).isInstancedMesh;\n}\n\nexport function isPerspectiveCamera(obj: any): obj is PerspectiveCamera {\n return (<PerspectiveCamera>obj).isPerspectiveCamera;\n}\n\nexport function isOrthographicCamera(obj: any): obj is OrthographicCamera {\n return (<OrthographicCamera>obj).isOrthographicCamera;\n}\n","import type { ImageData } from \"canvas\";\nimport { ImageInfo } from \"./image/ImageLoader\";\nimport { ExtractableImageData } from \"./ExtractableImageData\";\n\nexport class WrappedImage {\n\n constructor(readonly dta: ExtractableImageData) {\n }\n\n get data(): ImageData {\n return this.getSectionData(0, 0, this.width, this.height);\n }\n\n get dataArray(): Uint8ClampedArray {\n return this.data.data;\n }\n\n get width(): number {\n return this.dta.width;\n }\n\n get height(): number {\n return this.dta.height;\n }\n\n get hasTransparency(): boolean {\n const data = this.data.data;\n for (let i = 0; i < data.length; i += 4) {\n if (data[i + 3] < 255) {\n return true;\n }\n }\n return false;\n }\n\n get animated(): boolean {\n return this.height > this.width && this.height % this.width === 0;\n }\n\n get frameWidth(): number {\n return this.width;\n }\n\n get frameHeight(): number {\n return this.animated ? this.width : this.height;\n }\n\n get frameCount(): number {\n return this.height / this.width;\n }\n\n getFrameY(frame: number): number {\n return (this.height / this.frameCount) * Math.max(0, Math.min(this.frameCount, frame));\n }\n\n getSectionData(sx: number, sy: number, sw: number, sh: number): ImageData {\n return this.dta.data.getImageData(sx, sy, sw, sh);\n }\n\n getPixel(x: number, y: number): Uint8ClampedArray {\n return this.dta.data.getImageData(x,y,1,1).data;\n }\n\n getFrameSectionData(frame: number): ImageData {\n const y = this.getFrameY(frame);\n return this.getSectionData(0, y, this.width, this.width + y);\n }\n\n}\n","import { CompatImage, createCanvas, createImage } from \"../canvas/CanvasCompat\";\nimport { serializeImageKey } from \"../cache/CacheKey\";\nimport { Caching } from \"../cache/Caching\";\nimport { AxiosResponse } from \"axios\";\nimport { Env } from \"../Env\";\nimport { Requests } from \"../request/Requests\";\nimport { SSAOPassOUTPUT } from \"three/examples/jsm/postprocessing/SSAOPass\";\nimport { WrappedImage } from \"../WrappedImage\";\nimport { ExtractableImageData } from \"../ExtractableImageData\";\nimport { Buffer } from \"buffer\";\nimport { prefix } from \"../util/log\";\n\nconst p = prefix(\"ImageLoader\");\n\nexport interface ImageInfo {\n src?: string;\n width: number;\n height: number;\n type?: string;\n data: Buffer;\n}\n\nexport class ImageLoader {\n\n protected static _createImage(): CompatImage {\n //TODO: probably needs cross-origin stuff set for browser\n return createImage();\n }\n\n public static async loadAsync(src: string): Promise<CompatImage> {\n return new Promise<CompatImage>((resolve, reject) => {\n const image = this._createImage();\n image.src = src;\n image.onload = () => resolve(image);\n image.onerror = (err: Error) => reject(err);\n });\n }\n\n public static loadElement(src: string, onload?: () => void, onerr?: (err: Error) => void): CompatImage {\n const image = this._createImage();\n image.src = src;\n if (onload)\n image.onload = onload;\n if (onerr)\n image.onerror = onerr;\n return image;\n }\n\n public static async loadData(src: string): Promise<ImageData> {\n console.debug(p, \"loadData\", src);\n return await this.infoToData(await this.getInfo(src));\n }\n\n public static async loadCanvasData(src: string): Promise<ExtractableImageData> {\n return await this.infoToCanvasData(await this.getInfo(src));\n }\n\n public static async infoToCanvasData(info: ImageInfo): Promise<ExtractableImageData> {\n const image = await ImageLoader.loadAsync(info.src!);\n const canvas = createCanvas(info.width, info.height);\n const context = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n context.drawImage(image as CanvasImageSource, 0, 0);\n return {\n data: context,\n width: info.width,\n height: info.height\n }\n\n // return new ImageData(new Uint8ClampedArray(info.data), info.width, info.height)\n }\n\n\n public static async infoToData(info: ImageInfo): Promise<ImageData> {\n const image = await ImageLoader.loadAsync(info.src!);\n const canvas = createCanvas(info.width, info.height);\n const context = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n context.drawImage(image as CanvasImageSource, 0, 0);\n return context.getImageData(0, 0, canvas.width, canvas.height);\n\n\n // return new ImageData(new Uint8ClampedArray(info.data), info.width, info.height)\n }\n\n public static async getData(src: string): Promise<ImageData> {\n const keyStr = serializeImageKey({ src });\n return (await Caching.imageDataCache.get(keyStr, k => {\n return ImageLoader.loadData(src);\n }))!;\n }\n\n public static async getCanvasData(src: string): Promise<ExtractableImageData> {\n const keyStr = serializeImageKey({ src });\n return (await Caching.canvasImageDataCache.get(keyStr, k => {\n return ImageLoader.loadCanvasData(src);\n }))!;\n }\n\n public static async processResponse(response: Partial<AxiosResponse>): Promise<ImageInfo> {\n const src = response.config!.url;\n const data = Buffer.from(response.data!);\n const { width, height, type } = Env.provider.imageSize(data);\n return {\n src,\n width: width || 0,\n height: height || 0,\n type,\n data: data\n }\n }\n\n\n public static async loadInfo(src: string): Promise<ImageInfo> {\n\n // axios doesn't like data urls\n if (src.startsWith(\"data:image/png;base64\")) {\n return this.processResponse({\n config: {\n url: src\n },\n data: Buffer.from(src.substr(\"data:image/png;base64,\".length), \"base64\")\n })\n }\n\n //TODO: figure out a way to allow data/base64 requests\n return Requests.genericRequest({\n url: src,\n responseType: \"arraybuffer\"\n })\n .then(this.processResponse)\n .catch(err => {\n return {\n src,\n width: 0,\n height: 0,\n type: undefined,\n data: Buffer.from([0])\n };\n });\n }\n\n public static async getInfo(src: string): Promise<ImageInfo> {\n const keyStr = serializeImageKey({ src });\n return (await Caching.rawImageCache.get(keyStr, k => {\n return ImageLoader.loadInfo(src);\n }))!;\n }\n\n public static async loadWrapped(src: string): Promise<WrappedImage> {\n const data = await this.getCanvasData(src);\n return new WrappedImage(data);\n }\n\n public static async getWrapped(src: string): Promise<WrappedImage> {\n const keyStr = serializeImageKey({ src });\n return (await Caching.wrappedImageCache.get(keyStr, k => {\n return ImageLoader.loadWrapped(src);\n }))!;\n }\n\n\n}\n","import { BoxGeometryKey, MeshKey, serializeBoxGeometryKey, serializeMeshKey, serializeTextureKey, TextureKey } from \"./cache/CacheKey\";\nimport { Mesh } from \"three\";\nimport { Geometries } from \"./Geometries\";\nimport { Materials } from \"./Materials\";\nimport { Caching } from \"./cache/Caching\";\n\nexport class Meshes {\n\n public static createBox(key: MeshKey): Mesh {\n return new Mesh(Geometries.getBox(key.geometry), Materials.getImage(key.material));\n }\n\n public static getBox(key: MeshKey): Mesh {\n const keyStr = serializeMeshKey(key);\n return Caching.boxMeshCache.get(keyStr, k=>{\n return Meshes.createBox(key);\n })!;\n }\n\n}\n","import { BoxGeometry, BufferAttribute, Float32BufferAttribute, Vec2, Vector2, Vector4 } from \"three\";\nimport { DoubleArray, Model, QuadArray, TextureAsset } from \"./model/Model\";\nimport { ModelElement, ModelFaces } from \"./model/ModelElement\";\nimport { CUBE_FACES, CubeFace } from \"./CubeFace\";\nimport { ModelTextures } from \"./assets/ModelTextures\";\nimport { Assets } from \"./assets/Assets\";\nimport { Maybe, toRadians } from \"./util/util\";\nimport { WrappedImage } from \"./WrappedImage\";\nimport { CanvasImage } from \"./canvas/CanvasImage\";\nimport { TextureAtlas } from \"./texture/TextureAtlas\";\nimport { Caching } from \"./cache/Caching\";\nimport { ImageLoader } from \"./image/ImageLoader\";\nimport { AnimatorFunction } from \"./AnimatorFunction\";\nimport { MinecraftTextureMeta } from \"./MinecraftTextureMeta\";\nimport { AssetKey } from \"./assets/AssetKey\";\nimport { ModelGenerator } from \"./model/ModelGenerator\";\nimport { prefix } from \"./util/log\";\n\nconst p = prefix(\"UVMapper\");\n\nexport const DEFAULT_UV: QuadArray = [0, 0, 16, 16];\nconst X = 0;\nconst Y = 1;\nconst Z = 2;\n\n/*\n * - Minecraft Block UVs are from the top-left to bottom-right\n * - three.js UVs are from the bottom-left to top-right\n * - canvas coordinates are from the top-left to bottom-right\n */\n\n// noinspection PointlessArithmeticExpressionJS\nexport class UVMapper {\n\n protected static makeUv(uvCoord: number, originalTextureSize: number, actualTextureSize: number): number {\n if (uvCoord === 0) return 0;\n return (actualTextureSize / originalTextureSize) * (uvCoord / originalTextureSize);\n }\n\n protected static makeUvCoords([originalTextureWidth, originalTextureHeight]: DoubleArray, [actualTextureWidth, actualTextureHeight]: DoubleArray, [x1, y1, x2, y2]: QuadArray): QuadArray {\n // Flip from top-to-bottom coordinates to bottom-to-top ones\n y1 = originalTextureHeight - y1;\n y2 = originalTextureHeight - y2;\n\n const u1 = this.makeUv(x1, originalTextureWidth, actualTextureWidth);\n const v1 = this.makeUv(y1, originalTextureHeight, actualTextureHeight);\n const u2 = this.makeUv(x2, originalTextureWidth, actualTextureWidth);\n const v2 = this.makeUv(y2, originalTextureHeight, actualTextureHeight);\n\n return [u1, v1, u2, v2];\n }\n\n\n public static rotateSingleUv([u, v]: DoubleArray, [px, py]: DoubleArray, radians: number): DoubleArray {\n const sin = Math.sin(radians);\n const cos = Math.cos(radians);\n\n u -= px;\n v -= py;\n\n const uc = u;\n const vc = v;\n\n u = cos * uc - sin * vc;\n v = cos * vc + sin * uc;\n\n u += px;\n v += py;\n\n // return [parseFloat(u.toFixed(8)), parseFloat(v.toFixed(8))];\n return [u, v];\n }\n\n public static addCubeFaceUvToArray(array: number[], faceIndex: number, originalTextureSize: DoubleArray, actualTextureSize: DoubleArray, originalCoords: QuadArray) {\n const uv = this.makeUvCoords(originalTextureSize, actualTextureSize, originalCoords);\n this.setCubeFaceUvInArray(array, faceIndex, uv);\n }\n\n public static setCubeFaceUvInArray(array: number[], faceIndex: number, [u1, v1, u2, v2]: QuadArray) {\n let a: DoubleArray = [u1, v1]; // top left\n let b: DoubleArray = [u2, v1]; // top right\n let c: DoubleArray = [u1, v2]; // bottom left\n let d: DoubleArray = [u2, v2]; // bottom right\n\n let uvs: QuadArray<DoubleArray> = [a, b, c, d];\n\n this.setFaceUvInArray(array, faceIndex, uvs);\n }\n\n public static setFaceUvInArrayV(array: number[], faceIndex: number, uvs: QuadArray<Vector2>) {\n array[((faceIndex + 0) * 2) + 0] = uvs[0].x;\n array[((faceIndex + 0) * 2) + 1] = uvs[0].y;\n\n array[((faceIndex + 1) * 2) + 0] = uvs[1].x;\n array[((faceIndex + 1) * 2) + 1] = uvs[1].y;\n\n array[((faceIndex + 2) * 2) + 0] = uvs[2].x;\n array[((faceIndex + 2) * 2) + 1] = uvs[2].y;\n\n array[((faceIndex + 3) * 2) + 0] = uvs[3].x;\n array[((faceIndex + 3) * 2) + 1] = uvs[3].y;\n }\n\n public static setFaceUvInArray(array: number[], faceIndex: number, uvs: QuadArray<DoubleArray>) {\n array[((faceIndex + 0) * 2) + 0] = uvs[0][0];\n array[((faceIndex + 0) * 2) + 1] = uvs[0][1];\n\n array[((faceIndex + 1) * 2) + 0] = uvs[1][0];\n array[((faceIndex + 1) * 2) + 1] = uvs[1][1];\n\n array[((faceIndex + 2) * 2) + 0] = uvs[2][0];\n array[((faceIndex + 2) * 2) + 1] = uvs[2][1];\n\n array[((faceIndex + 3) * 2) + 0] = uvs[3][0];\n array[((faceIndex + 3) * 2) + 1] = uvs[3][1];\n }\n\n public static setCubeFaceUvAttribute(attributes: BufferAttribute, faceIndex: number, originalTextureSize: DoubleArray, actualTextureSize: DoubleArray, originalCoords: QuadArray): void {\n const uv = this.makeUvCoords(originalTextureSize, actualTextureSize, originalCoords);\n this.setCubeFaceUvInAttribute(attributes, faceIndex, uv);\n }\n\n public static setCubeFaceUvInAttribute(attributes: BufferAttribute, faceIndex: number, [u1, v1, u2, v2]: QuadArray) {\n attributes.setXY(faceIndex + 0, u1, v1);\n attributes.setXY(faceIndex + 1, u2, v1);\n attributes.setXY(faceIndex + 2, u1, v2);\n attributes.setXY(faceIndex + 3, u2, v2);\n }\n\n public static setCubeUvs(geometry: BoxGeometry, originalTextureSize: DoubleArray, actualTextureSize: DoubleArray, faces: ModelFaces): void {\n const attributes = geometry.getAttribute(\"uv\") as BufferAttribute;\n for (let faceIndex = 0; faceIndex < CUBE_FACES.length; faceIndex++) {\n let faceName = CUBE_FACES[faceIndex];\n let face = faces[faceName];\n if (!face) continue;\n if (!face.uv) {\n face.uv = DEFAULT_UV;\n }\n\n this.setCubeFaceUvAttribute(attributes, faceIndex * 4, originalTextureSize, actualTextureSize, face.uv);\n }\n }\n\n public static facesToUvArray(faces: ModelFaces, originalTextureSize: DoubleArray, actualTextureSize: DoubleArray): number[] {\n const array: number[] = [];\n for (let faceIndex = 0; faceIndex < CUBE_FACES.length; faceIndex++) {\n let faceName = CUBE_FACES[faceIndex];\n let face = faces[faceName];\n if (!face) continue;\n if (!face.uv) {\n face.uv = DEFAULT_UV;\n }\n\n this.addCubeFaceUvToArray(array, faceIndex * 4, originalTextureSize, actualTextureSize, face.uv);\n }\n return array;\n }\n\n public static facesToUv(faces: ModelFaces, originalTextureSize: DoubleArray, actualTextureSize: DoubleArray): Float32BufferAttribute {\n return new Float32BufferAttribute(this.facesToUvArray(faces, originalTextureSize, actualTextureSize), 2);\n }\n\n public static async getAtlas(model: Model): Promise<Maybe<TextureAtlas>> {\n const keyStr = model.key!.serialize();\n return Caching.modelTextureAtlasCache.get(keyStr, k => {\n return this.createAtlas(model);\n })\n }\n\n public static fillMissingTextureKeys<T>(textures: ModelTextures, target: { [k: string]: T }): { [k: string]: T } {\n for (let faceName of CUBE_FACES) {\n let v = textures[faceName];\n if (v && v.startsWith(\"#\")) {\n target[faceName] = target[v.substr(1)];\n }\n }\n return target;\n }\n\n // https://yeleha.co/3qlboGS\n protected static getFallbackUv(element: ModelElement, faceName: CubeFace): QuadArray {\n switch (faceName) {\n case CubeFace.DOWN:\n return [element.from[X], 16 - element.to[Z], element.to[X], 16 - element.from[Z]];\n case CubeFace.UP:\n return [element.from[X], element.from[Z], element.to[X], element.to[Z]];\n case CubeFace.NORTH:\n default:\n return [16 - element.to[X], 16 - element.to[Y], 16 - element.from[X], 16 - element.from[Y]];\n case CubeFace.SOUTH:\n return [element.from[X], 16 - element.to[Y], element.to[X], 16 - element.from[Y]];\n case CubeFace.WEST:\n return [element.from[Z], 16 - element.to[Y], element.to[Z], 16 - element.from[Y]];\n case CubeFace.EAST:\n return [16 - element.to[Z], 16 - element.to[Y], 16 - element.from[Z], 16 - element.from[Y]];\n }\n }\n\n protected static expandAndRotateMcUvs([u1, v1, u2, v2]: QuadArray, rotation: number = 0, actualWidth: number, actualHeight: number): QuadArray<Vector2> {\n // Resize coordinates to actual texture size\n const scaleU = actualWidth / 16;\n const scaleV = actualHeight / 16;\n u1 *= scaleU;\n v1 *= scaleV;\n u2 *= scaleU;\n v2 *= scaleV;\n\n let tl: Vector2 = new Vector2(u1, v1);// top left\n let tr: Vector2 = new Vector2(u2, v1);// top right\n let bl: Vector2 = new Vector2(u1, v2);// bottom left\n let br: Vector2 = new Vector2(u2, v2);// bottom right\n\n switch (rotation) {\n case 0:\n case 360:\n default:\n break;\n case 90:\n tl = new Vector2(u1, v2);\n tr = new Vector2(u1, v1);\n bl = new Vector2(u2, v2);\n br = new Vector2(u2, v1);\n break;\n case 180:\n tl = new Vector2(u2, v2);\n tr = new Vector2(u1, v2);\n bl = new Vector2(u2, v1);\n br = new Vector2(u1, v1);\n break;\n case 270:\n tl = new Vector2(u2, v1);\n tr = new Vector2(u2, v2);\n bl = new Vector2(u1, v1);\n br = new Vector2(u1, v2);\n break;\n }\n\n return [tl, tr, bl, br];\n }\n\n public static async createAtlas(originalModel: Model): Promise<Maybe<TextureAtlas>> {\n const textureMap: { [key: string]: Maybe<WrappedImage>; } = {};\n const metaMap: { [key: string]: Maybe<MinecraftTextureMeta>; } = {};\n const model = {...originalModel};\n const isItemModel = !(\"elements\" in model);\n\n console.debug(p, \"Creating Atlas for\", model.key);\n\n if (model.textures) {\n const promises: Promise<void>[] = [];\n const uniqueTextureNames: string[] = []; // TODO: make these actually unique\n const textureReferences: { [k: string]: string; } = {};\n for (let textureKey in model.textures) {\n let textureValue = model.textures[textureKey];\n if (textureValue.startsWith(\"#\")) {\n textureReferences[textureKey] = textureValue.substr(1);\n } else {\n uniqueTextureNames.push(textureKey);\n const assetKey = AssetKey.parse(\"textures\", textureValue, model.key);\n promises.push(ModelTextures.get(assetKey).then(asset => {\n if (!asset) {\n console.warn(p, \"Missing texture\", assetKey)\n return;\n }\n textureMap[textureKey] = new WrappedImage(asset);\n }));\n promises.push(ModelTextures.getMeta(assetKey).then(meta => {\n metaMap[textureKey] = meta;\n }))\n }\n }\n await Promise.all(promises);\n const textureCount = uniqueTextureNames.length;\n console.debug(p, \"Creating Atlas for\", textureCount, \"textures\");\n // console.log(model.textures)\n\n this.fillMissingTextureKeys(model.textures, textureMap);\n this.fillMissingTextureKeys(model.textures, metaMap);\n\n const sizes: { [texture: string]: DoubleArray; } = {};\n\n // Find largest texture dimensions\n let maxWidth = 0;\n let maxHeight = 0;\n for (let textureKey of uniqueTextureNames) {\n let texture = textureMap[textureKey];\n if (!texture) continue;\n sizes[textureKey] = [texture.frameWidth, texture.frameHeight];\n if (texture.frameWidth > maxWidth) {\n maxWidth = texture.width;\n }\n if (texture.frameHeight > maxHeight) {\n maxHeight = texture.frameHeight;\n }\n }\n this.fillMissingTextureKeys(model.textures, sizes);\n\n // console.log(\"sizes\", sizes);\n\n const s = (Math.ceil(Math.sqrt(textureCount + 1))); // +1 for transparency\n const size = Math.ceil(s * maxWidth)\n console.debug(p, \"Atlas size:\", size);\n // console.log(\"size: \" + size);\n const squaredSize = size * size;\n\n const missing = await ImageLoader.getData(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQMAAACQp+OdAAAABlBMVEX/AP8AAACfphTyAAAAFUlEQVQoz2MIhQKGVVAwKjIqQrwIAHRz/wFI17TEAAAAAElFTkSuQmCC\");\n const empty = await ImageLoader.getData(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQMAAACQp+OdAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAA5JREFUKM9jGAWjgAIAAAJAAAFSSwuTAAAAAElFTkSuQmCC\");\n //TODO: add transparent texture and use as default uv\n\n // Create image\n const image = new CanvasImage(size, size);\n image.putData(missing, 0, 0); // fill with invalid texture image\n image.putData(empty, 0, 0, 0, 0, maxWidth, maxWidth); // add transparent section in the top-left corner\n\n const positions: { [texture: string]: DoubleArray; } = {};\n\n let hasTransparency = false;\n\n let hasAnimation = false;\n const animatorFunctions: { [texture: string]: AnimatorFunction; } = {};\n\n // Draw all textures onto a single image\n let tx = 1; // start one over to leave room for the transparent space\n let ty = 0;\n for (let textureIndex = 0; textureIndex < uniqueTextureNames.length; textureIndex++) {\n let textureKey = uniqueTextureNames[textureIndex];\n let texture = textureMap[textureKey];\n let x = tx * maxWidth;\n let y = ty * maxWidth;\n if (texture) {\n console.log(texture);\n positions[textureKey] = [x, y];\n image.putData(texture.data, x, y, 0, 0, maxWidth, maxWidth);\n // console.log(image.toDataURL())\n //TODO: only first frame for animated textures\n\n if (texture.hasTransparency) {\n hasTransparency = true;\n }\n\n console.log(\"texture\", textureKey, \"animated\", texture.animated)\n\n if (texture.animated) {\n hasAnimation = true;\n const meta = metaMap[textureKey];\n const frameTime = meta?.animation?.frametime ?? 1;\n console.log(meta);\n console.log(frameTime);\n\n let t = 0;\n let f = 0;\n\n animatorFunctions[textureKey] = () => {\n // console.log(\"animating\", textureKey)\n //TODO: use mcmeta for frame count, delays, etc\n //TODO: interpolate?\n if (t++ >= frameTime) {\n t = 0;\n\n const frames = meta?.animation?.frames;\n const frame = frames ? frames[f] as number : f; //TODO: frame.time support\n\n image.putData(texture!.getFrameSectionData(frame), x, y, 0, 0, maxWidth, maxWidth);\n\n f++;\n if (f >= (frames ? frames.length : texture!.frameCount)) {\n f = 0;\n }\n }\n\n };\n }\n }\n tx++;\n if (tx >= s) {\n tx = 0;\n ty++;\n }\n }\n const atlasImageData = image.toDataURL();\n console.log(p, \"Atlas Image for\", model.key, atlasImageData);\n\n this.fillMissingTextureKeys(model.textures, positions);\n\n // console.log(\"positions\", positions);\n\n if (isItemModel) {\n console.debug(p, \"Generating item model for\", model);\n model.elements = [];\n for (let layerName of ModelGenerator.ITEM_LAYERS) {\n const textureImage = textureMap[layerName];\n if (textureImage) {\n model.elements.push(...ModelGenerator.generateItemModel(textureImage.data, layerName))\n }\n }\n console.debug(p, \"Item model elements\", model.elements)\n }\n\n if (!model.elements) {\n //TODO: default elements\n }\n\n // Adjust UV positions\n if (model.elements) {\n for (let elementIndex = 0; elementIndex < model.elements.length; elementIndex++) {\n let element = model.elements[elementIndex];\n let uv: number[] = [];\n // Set default uvs to missing texture\n for (let i = 0; i < CUBE_FACES.length; i++) {\n this.setCubeFaceUvInArray(uv, i * 4, [0, 0, 8 / size, 8 / size])\n }\n for (let faceIndex = 0; faceIndex < CUBE_FACES.length; faceIndex++) {\n let faceName = CUBE_FACES[faceIndex];\n // console.log(faceName)\n let face = element.faces[faceName];\n if (!face) {\n // set uv transparent\n this.setCubeFaceUvInArray(uv, faceIndex * 4, [0, 1, 8 / size, (size - 8) / size])\n continue;\n }\n if (!face.uv) {\n face.uv = this.getFallbackUv(element, faceName);\n }\n\n let faceTexture = face.texture;\n let texPosition;\n let texSize;\n if (faceTexture) {\n faceTexture = faceTexture.substr(1); // remove #\n texPosition = positions[faceTexture] || [0, 0];\n texSize = sizes[faceTexture] || [16, 16];\n }\n\n let texPosV = new Vector2(texPosition[0], texPosition[1]);\n\n const [tl, tr, bl, br] = this.expandAndRotateMcUvs(face.uv, face.rotation, texSize[0], texSize[1]);\n\n // move to atlas position\n tl.add(texPosV);\n tr.add(texPosV);\n bl.add(texPosV);\n br.add(texPosV);\n\n // divide to 0-1\n tl.divideScalar(size);\n tr.divideScalar(size);\n bl.divideScalar(size);\n br.divideScalar(size);\n\n // flip y coordinates\n tl.y = 1 - tl.y;\n tr.y = 1 - tr.y;\n bl.y = 1 - bl.y;\n br.y = 1 - br.y;\n\n //TODO: figure out how uv lock works\n\n\n let uvs: QuadArray<Vector2> = [tl, tr, bl, br];\n // console.log(\"uvs\", uvs);\n this.setFaceUvInArrayV(uv, faceIndex * 4, uvs);\n }\n\n element.mappedUv = uv;\n }\n } else {\n //TODO: item model\n }\n\n return new TextureAtlas(\n model,\n image,\n sizes,\n positions,\n hasAnimation,\n animatorFunctions,\n hasTransparency\n );\n } else {\n console.warn(p, \"Model does not have any textures\", model);\n }\n return undefined;\n }\n\n}\n\n// Based on net.minecraft.client.renderer.block.model.BlockFaceUV\nexport class MinecraftFaceUV {\n\n constructor(readonly uv: QuadArray = [0, 0, 16, 16], readonly rotation: number = 0) {\n }\n\n getU(index: number): number {\n const shiftedIndex = this.getShiftedIndex(index);\n return this.uv[shiftedIndex !== 0 && index !== 1 ? 2 : 0];\n }\n\n getV(index: number): number {\n const shiftedIndex = this.getShiftedIndex(index);\n return this.uv[shiftedIndex !== 0 && index !== 3 ? 3 : 1];\n }\n\n protected getShiftedIndex(index: number): number {\n return (index + this.rotation / 90) % 40;\n }\n\n protected getReverseIndex(index: number): number {\n return (index + 4 - this.rotation / 90) % 4;\n }\n\n}\n","import { Model } from \"./Model\";\nimport { Models } from \"../assets/Models\";\nimport merge from \"ts-deepmerge\";\nimport { Assets } from \"../assets/Assets\";\nimport { AssetKey } from \"../assets/AssetKey\";\n\nexport class ModelMerger {\n\n public static async mergeWithParents(model: Model): Promise<Model> {\n const models = await this.collectAllParents(model);\n let merged: Model = {};\n for (let parentModel of models) {\n merged = merge(merged, parentModel);\n }\n merged = merge(merged, model);\n merged.hierarchy = models.map(m => m.parent).filter(p => `${p}`) as string[];\n merged.hierarchy.push(`${merged.parent}`);\n // delete merged.parent;\n return merged;\n }\n\n protected static async collectAllParents(model: Model): Promise<Model[]> {\n if (!model.parent) {\n return [];\n }\n const models: Model[] = [];\n const parentKey = AssetKey.parse(\"models\", model.parent);\n const parentModel = await Models.getRaw(parentKey);\n if (parentModel) {\n models.unshift(parentModel);\n models.unshift(...await this.collectAllParents(parentModel));\n }\n return models;\n }\n\n}\n","import { Serializable } from \"../Serializable\";\nimport { DEFAULT_NAMESPACE, DEFAULT_ROOT } from \"./Assets\";\nimport { AssetLoader } from \"./AssetLoader\";\n\nexport type AssetType = \"models\" | \"textures\" | \"blockstates\" | string;\n\nexport class BasicAssetKey implements Serializable {\n\n readonly namespace: string;\n readonly path: string;\n\n constructor(key: BasicAssetKey);\n constructor(namespace: string, path: string);\n constructor(namespaceOrKey: string | BasicAssetKey, path?: string) {\n if (path) {\n this.namespace = namespaceOrKey as string;\n this.path = path;\n } else {\n this.namespace = (namespaceOrKey as BasicAssetKey).namespace;\n this.path = (namespaceOrKey as BasicAssetKey).path\n }\n }\n\n toNamespacedString() {\n return this.namespace + \":\" + this.path;\n }\n\n toString() {\n return this.toNamespacedString();\n }\n\n serialize(): string {\n return this.toString();\n }\n}\n\n// TODO: rewrite this to be less dumb\nexport class AssetKey extends BasicAssetKey {\n\n constructor(\n readonly namespace: string, readonly path: string,\n public assetType?: AssetType,\n public type?: string,\n public rootType: \"assets\" | \"data\" | string = \"assets\",\n public extension: \".json\" | \".png\" | string = \".json\",\n public root?: string,\n ) {\n super(namespace, path);\n }\n\n\n public static parse(assetType: AssetType, str: string, origin?: AssetKey): AssetKey {\n let namespace = origin?.namespace || DEFAULT_NAMESPACE;\n if (str.includes(\":\")) {\n let split = str.split(\"\\:\");\n namespace = split[0];\n str = split[1];\n }\n\n let split = str.split(\"\\/\");\n let type: string | undefined = undefined;\n if (split.length > 1) {\n type = split[0];\n split.shift();\n }\n let path = split.join(\"/\");\n\n let extension = assetType === \"textures\" ? \".png\" :\n origin?.assetType || \".json\";\n\n return new AssetKey(namespace, path, assetType, type, \"assets\", extension, origin?.root);\n }\n\n toString(): string {\n let a = [\n (typeof this.root !== 'undefined' || AssetLoader.ROOT !== DEFAULT_ROOT) ? (this.root ?? AssetLoader.ROOT) : \"__root__\",\n this.rootType ?? \"__rootType__\",\n this.assetType ?? \"__assetType__\",\n this.type ?? \"__type__\",\n this.namespace,\n this.path\n ];\n return a.join(\"/\");\n }\n\n getFullPath() {\n let p: string[] = [];\n if (this.type) {\n p.push(this.type);\n }\n p.push(this.path);\n return p.join(\"/\");\n }\n\n toNamespacedString() {\n return this.namespace + \":\" + this.getFullPath();\n }\n\n serialize(): string {\n return this.toString();\n }\n}\n\nexport function isBasicAssetKey(obj: any): obj is BasicAssetKey {\n return \"namespace\" in obj && \"path\" in obj;\n}\n\nexport function isAssetKey(obj: any): obj is AssetKey {\n return isBasicAssetKey(obj) && \"parse\" in obj;\n}\n","import { Model } from \"../model/Model\";\nimport { Caching } from \"../cache/Caching\";\nimport { Textures } from \"../texture/Textures\";\nimport { Maybe } from \"../util/util\";\nimport { ModelMerger } from \"../model/ModelMerger\";\nimport { AssetLoader } from \"./AssetLoader\";\nimport { Memoize } from \"typescript-memoize\";\nimport { DEFAULT_NAMESPACE, DEFAULT_ROOT } from \"./Assets\";\nimport { PersistentCache } from \"../cache/PersistentCache\";\nimport { AssetKey } from \"./AssetKey\";\nimport { ListAsset } from \"../ListAsset\";\nimport { AssetParser } from \"./source/parser/AssetParsers\";\n\nexport class Models {\n\n private static _persistentCache: PersistentCache | undefined;\n\n // opened lazily: touching the store at import time would hit IndexedDB/disk just for loading\n // the library, and would require an EnvProvider before any entry has had a chance to register\n private static get PERSISTENT_CACHE(): PersistentCache {\n return this._persistentCache ??= PersistentCache.open(\"minerender-models\");\n }\n\n @Memoize()\n public static async getItemList(): Promise<string[]> {\n return AssetLoader.get<ListAsset>(new AssetKey(\n DEFAULT_NAMESPACE,\n \"_list\",\n \"models\",\n \"item\",\n \"assets\",\n \".json\",\n DEFAULT_ROOT\n ), AssetParser.LIST).then(r => r?.files ?? []);\n }\n\n public static async loadAndMerge(key: AssetKey): Promise<Maybe<Model>> {\n const model = await this.getRaw(key);\n if (!model) {\n return undefined;\n }\n return ModelMerger.mergeWithParents(model);\n }\n\n public static async getRaw(key: AssetKey): Promise<Maybe<Model>> {\n if (!key.assetType) {\n key.assetType = \"models\";\n }\n if (!key.extension) {\n key.extension = \".json\";\n }\n const keyStr = key.serialize();\n //TODO: maybe add the asset source to the key\n return Caching.rawModelCache.get(keyStr, k => {\n return this.PERSISTENT_CACHE.getOrLoad(keyStr, k1 => {\n return AssetLoader.get<Model>(key, AssetParser.MODEL);\n })\n }).then(asset => {\n if (asset) {\n asset.key = key;\n }\n return asset;\n })\n }\n\n public static async getMerged(key: AssetKey): Promise<Maybe<Model>> {\n if (!key.assetType) {\n key.assetType = \"models\";\n }\n if (!key.extension) {\n key.extension = \".json\";\n }\n const keyStr = key.serialize();\n return Caching.mergedModelCache.get(keyStr, k => {\n //TODO: persistent cache\n return Models.loadAndMerge(key);\n });\n }\n\n public static async get(key: AssetKey): Promise<Maybe<Model>> {\n return this.getMerged(key);\n }\n\n public static async clearCache() {\n return this.PERSISTENT_CACHE.clear();\n }\n\n}\n","export enum AssetParser {\n\n MODEL = \"model\",\n BLOCKSTATE = \"blockstate\",\n META = \"meta\",\n NBT = \"nbt\",\n IMAGE = \"image\",\n LIST = \"list\",\n JSON = \"json\",\n\n}","import { Maybe } from \"../util/util\";\nimport { BlockState } from \"../model/block/BlockState\";\nimport { Caching } from \"../cache/Caching\";\nimport { AssetLoader } from \"./AssetLoader\";\nimport { DEFAULT_NAMESPACE, DEFAULT_ROOT } from \"./Assets\";\nimport { Memoize } from \"typescript-memoize\";\nimport { BlockStatePropertyDefaults } from \"../model/block/BlockStateProperties\";\nimport { AssetKey } from \"./AssetKey\";\nimport { PersistentCache } from \"../cache/PersistentCache\";\nimport { AssetParser } from \"./source/parser/AssetParsers\";\nimport { ListAsset } from \"../ListAsset\";\nimport { MinecraftAsset } from \"../MinecraftAsset\";\n\nexport class BlockStates {\n\n private static _persistentCache: PersistentCache | undefined;\n\n private static get PERSISTENT_CACHE(): PersistentCache {\n return this._persistentCache ??= PersistentCache.open(\"minerender-blockstates\");\n }\n\n // BlockState names are hardcoded\n @Memoize()\n public static async getList(): Promise<string[]> {\n return AssetLoader.get<ListAsset>(new AssetKey(\n DEFAULT_NAMESPACE,\n \"_list\",\n \"blockstates\",\n undefined,\n \"assets\",\n \".json\",\n DEFAULT_ROOT\n ), AssetParser.LIST).then(r => r?.files ?? []);\n }\n\n @Memoize()\n public static async getDefaultStates(): Promise<Maybe<DefaultBlockStates>> {\n const key = AssetKey.parse(\"blockstates\", \"minerender:defaultBlockStates\");\n return AssetLoader.get<DefaultBlockStates>(key, AssetParser.JSON);\n }\n\n public static async getDefaultState(key: AssetKey): Promise<Maybe<BlockStatePropertyDefaults>> {\n const defaultStates = await this.getDefaultStates();\n if (!defaultStates) {\n return undefined;\n }\n return defaultStates[\"minecraft:\" + key.path] as BlockStatePropertyDefaults;\n }\n\n public static async get(key: AssetKey): Promise<Maybe<BlockState>> {\n if (!key.assetType) {\n key.assetType = \"blockstates\";\n }\n if (!key.extension) {\n key.extension = \".json\";\n }\n const keyStr = key.serialize();\n return Caching.blockStateCache.get(keyStr, k => {\n return this.PERSISTENT_CACHE.getOrLoad(keyStr, k1 => {\n return AssetLoader.get<BlockState>(key, AssetParser.BLOCKSTATE);\n })\n }).then(asset => {\n if (asset) {\n asset.key = key;\n }\n return asset;\n })\n }\n\n public static getAll(keys: AssetKey[] | Iterable<AssetKey>): Promise<Maybe<BlockState>[]> {\n const promises: Promise<Maybe<BlockState>>[] = [];\n for (let key of keys) {\n promises.push(this.get(key));\n }\n return Promise.all(promises);\n }\n\n public static async clearCache() {\n await this.PERSISTENT_CACHE.clear();\n }\n\n}\n\nexport class DefaultBlockStates implements MinecraftAsset {\n [k: string]: BlockStatePropertyDefaults;\n}","import { Models } from \"./Models\";\nimport { Model } from \"../model/Model\";\nimport { Maybe } from \"../util/util\";\nimport { BlockState } from \"../model/block/BlockState\";\nimport { BlockStates } from \"./BlockStates\";\nimport { AssetKey, AssetType } from \"./AssetKey\";\n\nexport const DEFAULT_ROOT = \"https://assets.mcasset.cloud/1.17.1\";\nexport const DEFAULT_NAMESPACE = \"minecraft\";\n\nexport class Assets {\n\n /**\n * @deprecated\n */\n public static parseAssetKey(assetType: AssetType, str: string, origin?: AssetKey): AssetKey {\n return AssetKey.parse(assetType, str, origin);\n }\n\n public static async getModel(key: AssetKey): Promise<Maybe<Model>> {\n return Models.getMerged(key);\n }\n\n public static async getBlockState(key: AssetKey): Promise<Maybe<BlockState>> {\n return BlockStates.get(key);\n }\n\n}\n","import { MinecraftAsset } from \"../../MinecraftAsset\";\nimport { AssetKey } from \"../AssetKey\";\nimport { Maybe } from \"../../util\";\nimport { AssetParser } from \"./parser/AssetParsers\";\n\nexport abstract class AssetSource {\n\n protected constructor() {\n }\n\n public abstract get<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser | string): Promise<Maybe<T>>;\n\n}","import type { NBT } from \"prismarine-nbt\";\nimport { MinecraftAsset } from \"../MinecraftAsset\";\n\nexport class NBTHelper {\n\n public static async fromBuffer(buffer: Buffer): Promise<NBTAsset> {\n const prismarineNbt = await import(\"prismarine-nbt\");\n const { parsed, type, metadata } = await prismarineNbt.parse(buffer);\n return parsed;\n }\n\n}\n\nexport interface NBTAsset extends MinecraftAsset, NBT {\n}\n","import { AssetSource } from \".\";\nimport { BlockState, Model, TextureAsset } from \"../../model\";\nimport { AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { Maybe, prefix } from \"../../util\";\nimport { MinecraftTextureMeta } from \"../../MinecraftTextureMeta\";\nimport { NBTAsset, NBTHelper } from \"../../nbt\";\nimport { ImageLoader } from \"../../image\";\nimport { ListAsset } from \"../../ListAsset\";\nimport { MinecraftAsset } from \"../../MinecraftAsset\";\nimport { AssetKey } from \"../AssetKey\";\nimport { DEFAULT_NAMESPACE, DEFAULT_ROOT } from \"../Assets\";\nimport { Requests } from \"../../request\";\nimport { AssetLoader } from \"../AssetLoader\";\nimport { AssetParser } from \"./parser\";\nimport { ResponseParser } from \"./parser\";\nimport merge from \"ts-deepmerge\";\n\nconst p = prefix(\"HostedAssetSource\");\n\nconst DEFAULT_OPTIONS: HostedAssetSourceOptions = {\n retryDefaults: true\n}\n\nexport class HostedAssetSource extends AssetSource {\n\n static readonly MODEL: ResponseParser<Model> = {\n config(request: AxiosRequestConfig) {\n },\n parse(response: AxiosResponse): Maybe<Model> {\n return response.data as Model;\n }\n }\n static readonly BLOCKSTATE: ResponseParser<BlockState> = {\n config(request: AxiosRequestConfig) {\n },\n parse(response: AxiosResponse): Maybe<BlockState> {\n return response.data as BlockState;\n }\n }\n static readonly META: ResponseParser<MinecraftTextureMeta> = {\n config(request: AxiosRequestConfig) {\n // request.responseType = \"arraybuffer\";\n },\n parse(response: AxiosResponse): Maybe<MinecraftTextureMeta> {\n return response.data as MinecraftTextureMeta;\n }\n }\n static readonly NBT: ResponseParser<NBTAsset> = {\n config(request: AxiosRequestConfig) {\n request.responseType = \"arraybuffer\";\n },\n parse(response: AxiosResponse): Promise<Maybe<NBTAsset>> {\n return NBTHelper.fromBuffer(Buffer.from(response.data));\n }\n }\n static readonly IMAGE: ResponseParser<TextureAsset> = {\n config(request: AxiosRequestConfig) {\n request.responseType = \"arraybuffer\";\n },\n async parse(response: AxiosResponse): Promise<Maybe<TextureAsset>> {\n return await ImageLoader.processResponse(response) as TextureAsset;\n }\n }\n static readonly LIST: ResponseParser<ListAsset> = {\n config(request: AxiosRequestConfig) {\n },\n parse(response: AxiosResponse): Maybe<ListAsset> {\n return response.data as ListAsset;\n }\n }\n static readonly JSON: ResponseParser<any> = {\n config(request: AxiosRequestConfig) {\n },\n parse(response: AxiosResponse): Maybe<any> {\n return response.data;\n }\n }\n\n static readonly PARSER_MAP: Map<AssetParser, ResponseParser<any>> = new Map<AssetParser, ResponseParser<any>>([\n [AssetParser.MODEL, HostedAssetSource.MODEL],\n [AssetParser.BLOCKSTATE, HostedAssetSource.BLOCKSTATE],\n [AssetParser.META, HostedAssetSource.META],\n [AssetParser.NBT, HostedAssetSource.NBT],\n [AssetParser.IMAGE, HostedAssetSource.IMAGE],\n [AssetParser.LIST, HostedAssetSource.LIST],\n [AssetParser.JSON, HostedAssetSource.JSON],\n ]);\n\n public async loadOrRetryWithDefaults<T extends MinecraftAsset>(key: AssetKey, parser: ResponseParser<T>): Promise<Maybe<T>> {\n const direct = await this.load<T>(key, parser);\n if (typeof direct !== \"undefined\") {\n return direct;\n }\n if (key.namespace !== DEFAULT_NAMESPACE) {\n console.info(p, \"Retrying\", key, \"with default namespace\");\n // Try on the same host but with default minecraft: namespace\n const namespaceKey = new AssetKey(DEFAULT_NAMESPACE, key.path, key.assetType, key.type, key.rootType, key.extension, key.root);\n const namespaced = await this.load<T>(namespaceKey, parser);\n if (typeof namespaced !== \"undefined\") {\n return namespaced;\n }\n if ((typeof key.root !== \"undefined\" && key.root !== DEFAULT_ROOT) || (typeof this.root !== \"undefined\" && this.root !== DEFAULT_ROOT)) {\n console.info(p, \"Retrying\", key, \"with default root+namespace\");\n // Try both defaults\n const namespacedRootedKey = new AssetKey(DEFAULT_NAMESPACE, key.path, key.assetType, key.type, key.rootType, key.extension, DEFAULT_ROOT);\n const namespacedRooted = await this.load<T>(namespacedRootedKey, parser);\n if (typeof namespacedRooted !== \"undefined\") {\n return namespacedRooted;\n }\n }\n } else if ((typeof key.root !== \"undefined\" && key.root !== DEFAULT_ROOT) || (typeof this.root !== \"undefined\" && this.root !== DEFAULT_ROOT)) {\n console.info(p, \"Retrying\", key, \"with default root\");\n // Try on default root\n const rootKey = new AssetKey(key.namespace, key.path, key.assetType, key.type, key.rootType, key.extension, DEFAULT_ROOT);\n const rooted = await this.load<T>(rootKey, parser);\n if (typeof rooted !== \"undefined\") {\n return rooted;\n }\n }\n return undefined;\n }\n\n\n protected async load<T extends MinecraftAsset>(key: AssetKey, parser: ResponseParser<T>): Promise<Maybe<T>> {\n console.info(p, \"Loading\", key);\n const url = `${ this.assetBasePath(key) }${ key.type !== undefined ? key.type + '/' : '' }${ key.path }${ key.extension }`;\n console.debug(p, url);\n let req: AxiosRequestConfig = {\n url: url\n };\n parser.config(req);\n // @ts-ignore\n return await Requests.mcAssetRequest(req)\n .then(response => {\n if (response && response.data) {\n try {\n return parser.parse(response);\n } catch (e) {\n console.warn(\"Parser failed to process response\", response, e);\n throw e;\n }\n }\n return undefined;\n })\n .catch(err => {\n if (err.response) {\n let response = err.response as AxiosResponse;\n if (response.status === 404) {\n console.debug(p, key, \"not found\");\n return undefined;\n }\n }\n console.debug(p, \"Failed to load\", key, err?.message);\n return undefined;\n })\n }\n\n public assetBasePath(key: AssetKey) {\n return `${ key.root ?? this.root ?? AssetLoader.ROOT }/${ key.rootType !== undefined ? key.rootType + '/' : '' }${ key.namespace !== undefined ? key.namespace + '/' : '' }${ key.assetType !== undefined ? key.assetType + '/' : '' }`;\n }\n\n private readonly _root: string;\n private readonly _options: HostedAssetSourceOptions;\n\n public constructor(root: string, options?: Partial<HostedAssetSourceOptions>) {\n super();\n this._root = root;\n this._options = merge({}, DEFAULT_OPTIONS, options ?? {});\n }\n\n public get root(): string {\n return this._root;\n }\n\n public get options(): HostedAssetSourceOptions {\n return this._options;\n }\n\n public get<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser): Promise<Maybe<T>> {\n const responseParser = HostedAssetSource.PARSER_MAP.get(parser) as ResponseParser<T>;\n if (this.options.retryDefaults) {\n return this.loadOrRetryWithDefaults(key, responseParser);\n }\n return this.load(key, responseParser);\n }\n\n}\n\ninterface HostedAssetSourceOptions {\n retryDefaults: boolean;\n}","import { ArchiveProxy } from \"./ArchiveProxy\";\nimport { BlobReader, BlobWriter, ZipReader } from \"@zip.js/zip.js\";\nimport { ArchiveEntry } from \"./ArchiveEntry\";\n\nexport class BrowserArchiveProxy implements ArchiveProxy {\n\n readonly _blob: Blob;\n readonly _reader: ZipReader<Blob>;\n\n constructor(blob: Blob) {\n this._blob = blob;\n this._reader = new ZipReader(new BlobReader(this._blob));\n }\n\n public async getEntries(): Promise<ArchiveEntry[]> {\n return (await this._reader.getEntries()).map(e => {\n return {\n filename: e.filename,\n directory: e.directory,\n getData(): Promise<Blob> {\n return e.getData!(new BlobWriter())\n }\n }\n })\n }\n\n}","import { AssetSource } from \"../AssetSource\";\nimport { ArchiveProxy } from \"./ArchiveProxy\";\nimport { ArchiveEntry } from \"./ArchiveEntry\";\nimport { MinecraftAsset } from \"../../../MinecraftAsset\";\nimport { AssetKey } from \"../../AssetKey\";\nimport { AssetParser, ResponseParser } from \"../parser\";\nimport { Maybe, prefix } from \"../../../util\";\nimport { Requests } from \"../../../request\";\nimport { HostedAssetSource } from \"../HostedAssetSource\";\nimport { AssetLoader } from \"../../AssetLoader\";\nimport { AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { BrowserArchiveProxy } from \"./BrowserArchiveProxy\";\n\nconst p = prefix(\"ArchiveAssetSource\");\n\nexport class ArchiveAssetSource extends AssetSource implements ArchiveProxy {\n\n readonly _archiveProxy: ArchiveProxy;\n\n constructor(archiveProxy: ArchiveProxy) {\n super();\n console.log(archiveProxy)\n this._archiveProxy = archiveProxy;\n }\n\n public static blob(blob: Blob): ArchiveAssetSource {\n return new ArchiveAssetSource(new BrowserArchiveProxy(blob));\n }\n\n public async getEntries(): Promise<ArchiveEntry[]> {\n return this._archiveProxy.getEntries();\n }\n\n public async getEntry(path: string): Promise<Maybe<ArchiveEntry>> {\n const entries = await this.getEntries();\n return entries.find(e => e.filename === path);\n }\n\n async get<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser | string): Promise<Maybe<T>> {\n const responseParser = HostedAssetSource.PARSER_MAP.get(parser as AssetParser) as ResponseParser<T>;\n\n console.log(\"ArchiveAssetSource.get\", key, parser);\n let entries = (await this.getEntries());\n\n const path = `${this.assetBasePath(key)}${key.type !== undefined ? key.type + '/' : ''}${key.path}${key.extension}`;\n console.log(path);\n const entry = await this.getEntry(path);\n console.log(entry);\n if (!entry) {\n return undefined;\n }\n\n let blob = await entry.getData();\n const url = URL.createObjectURL(blob);\n console.log(url);\n let req = {\n url: url,\n };\n responseParser.config(req);\n return Requests.genericRequest(req)\n .then(response => {\n if (response && response.data) {\n try {\n return responseParser.parse(response);\n } catch (e) {\n console.warn(\"Parser failed to process response\", response, e);\n throw e;\n }\n }\n return undefined;\n })\n .catch(err => {\n if (err.response) {\n let response = err.response as AxiosResponse;\n if (response.status === 404) {\n console.debug(p, key, \"not found\");\n return undefined;\n }\n }\n console.debug(p, \"Failed to load\", key, err?.message);\n return undefined;\n })\n }\n\n //TODO: abstract this\n protected async load<T extends MinecraftAsset>(key: AssetKey, parser: ResponseParser<T>): Promise<Maybe<T>> {\n console.info(p, \"Loading\", key);\n const url = `${this.assetBasePath(key)}${key.type !== undefined ? key.type + '/' : ''}${key.path}${key.extension}`;\n console.debug(p, url);\n let req: AxiosRequestConfig = {\n url: url\n };\n parser.config(req);\n // @ts-ignore\n return await Requests.genericRequest(req)\n .then(response => {\n if (response && response.data) {\n try {\n return parser.parse(response);\n } catch (e) {\n console.warn(\"Parser failed to process response\", response, e);\n throw e;\n }\n }\n return undefined;\n })\n .catch(err => {\n if (err.response) {\n let response = err.response as AxiosResponse;\n if (response.status === 404) {\n console.debug(p, key, \"not found\");\n return undefined;\n }\n }\n console.debug(p, \"Failed to load\", key, err?.message);\n return undefined;\n })\n }\n\n public assetBasePath(key: AssetKey) {\n return `${key.rootType !== undefined ? key.rootType + '/' : ''}${key.namespace !== undefined ? key.namespace + '/' : ''}${key.assetType !== undefined ? key.assetType + '/' : ''}`;\n }\n\n}","import { Model, TextureAsset } from \"../model/Model\";\nimport { Maybe } from \"../util/util\";\nimport { Requests } from \"../request/Requests\";\nimport { AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { MinecraftAsset } from \"../MinecraftAsset\";\nimport { ImageInfo, ImageLoader } from \"../image/ImageLoader\";\nimport { MinecraftTextureMeta } from \"../MinecraftTextureMeta\";\nimport { BlockState } from \"../model/block/BlockState\";\nimport { DEFAULT_NAMESPACE, DEFAULT_ROOT } from \"./Assets\";\nimport { ListAsset } from \"../ListAsset\";\nimport { AssetKey } from \"./AssetKey\";\nimport { NBTAsset, NBTHelper } from \"../nbt/NBTHelper\";\nimport { prefix } from \"../util/log\";\nimport { AssetSource } from \"./source/AssetSource\";\nimport { AssetParser } from \"./source/parser/AssetParsers\";\nimport { HostedAssetSource } from \"./source\";\nimport merge from \"ts-deepmerge\";\n\nconst p = prefix(\"AssetLoader\");\n\n\nexport class AssetLoader {\n\n static ROOT: string = DEFAULT_ROOT;\n\n private static _SOURCES: AssetSourceReference[] = [];\n\n public static addSource(key: string, source: AssetSource, override: boolean = true) {\n if (override) {\n const existing = this.removeSource(key);\n if (existing) {\n console.log(p, \"Removed existing AssetSource\", key);\n }\n }\n\n this._SOURCES.unshift({key, source});\n console.log(p, \"Added AssetSource\", key);\n }\n\n public static removeSource(key: string): Maybe<AssetSource> {\n const index = this._SOURCES.findIndex(s => s.key === key);\n if (index != -1) {\n const spliced = this._SOURCES.splice(index, 1);\n if (spliced.length > 0) {\n return spliced[0].source;\n }\n }\n return undefined;\n }\n\n static {\n this.addSource(\"mcassets-fallback\", new HostedAssetSource('https://raw.githubusercontent.com/InventivetalentDev/minerender-fallback-assets/master', { retryDefaults: false }));\n this.addSource(\"mcassets\", new HostedAssetSource(DEFAULT_ROOT, { retryDefaults: false }));\n }\n\n public static async getAll<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser | string): Promise<T[]> {\n console.log(this._SOURCES)\n let promises: Promise<Maybe<T>>[] = [];\n for (const source of this._SOURCES) {\n promises.push(source.source.get<T>(key, parser));\n }\n return Promise.all(promises).then(results => {\n return results.filter(r => r != undefined) as T[];\n });\n }\n\n public static async get<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser | string): Promise<Maybe<T>> {\n console.log(this._SOURCES)\n let promises: Promise<Maybe<T>>[] = [];\n for (const source of this._SOURCES) {\n promises.push(source.source.get<T>(key, parser));\n }\n return Promise.all(promises).then(results => {\n const fallback = results[results.length - 1];\n for (const result of results) {\n if (result) {\n if (fallback) {\n // we have a fallback, so merge it with the result\n return merge({}, fallback, result) as T;\n }\n return result;\n }\n }\n return undefined;\n });\n }\n\n}\n\ninterface AssetSourceReference {\n key: string;\n source: AssetSource;\n}\n","import { Maybe } from \"../util/util\";\nimport { TextureAsset } from \"../model/Model\";\nimport { Caching } from \"../cache/Caching\";\nimport { AssetLoader } from \"./AssetLoader\";\nimport { CompatImage } from \"../canvas/CanvasCompat\";\nimport { ImageLoader } from \"../image/ImageLoader\";\nimport { ExtractableImageData } from \"../ExtractableImageData\";\nimport { MinecraftTextureMeta } from \"../MinecraftTextureMeta\";\nimport { PersistentCache } from \"../cache/PersistentCache\";\nimport { AssetKey } from \"./AssetKey\";\nimport { AssetParser } from \"./source/parser/AssetParsers\";\n\nexport class ModelTextures {\n\n private static _persistentMetaCache: PersistentCache | undefined;\n\n private static get PERSISTENT_META_CACHE(): PersistentCache {\n return this._persistentMetaCache ??= PersistentCache.open(\"minerender-texturemeta\");\n }\n\n public static async get(key: AssetKey): Promise<Maybe<ExtractableImageData>> {\n const asset = await this.preload(key);\n if (asset) {\n return ImageLoader.infoToCanvasData(asset);\n }\n return undefined;\n }\n\n public static async preload(key: AssetKey): Promise<Maybe<TextureAsset>> {\n const keyStr = key.serialize();\n return Caching.textureAssetCache.get(keyStr, k => {\n return AssetLoader.get<TextureAsset>(key, AssetParser.IMAGE).then(asset => {\n if (asset)\n asset.key = key;\n return asset;\n })\n })\n }\n\n public static async getMeta(key: AssetKey): Promise<Maybe<MinecraftTextureMeta>> {\n if (!key.extension || !key.extension.endsWith(\".mcmeta\")) {\n key = Object.assign(new AssetKey(\"\", \"\"), key);\n key.extension += \".mcmeta\";\n }\n const keyStr = key.serialize();\n\n return Caching.textureMetaCache.get(keyStr, k => {\n return this.PERSISTENT_META_CACHE.getOrLoad(keyStr, k1 => {\n return AssetLoader.get<MinecraftTextureMeta>(key, AssetParser.META).then(asset => {\n if (asset)\n asset.key = key;\n return asset;\n })\n })\n })\n }\n\n public static async clearCache() {\n await this.PERSISTENT_META_CACHE.clear();\n }\n\n}\n","import type { ImageData, CanvasRenderingContext2D } from \"canvas\";\nimport { CompatCanvas, createCanvas } from \"./CanvasCompat\";\nimport { Disposable } from \"../Disposable\";\n\nexport class CanvasImage implements Disposable {\n\n readonly canvas: CompatCanvas;\n readonly context: CanvasRenderingContext2D;\n\n constructor(width: number, height: number);\n constructor(data: ImageData);\n constructor(dataOrWidth: ImageData | number, height?: number) {\n if (height) {\n this.canvas = createCanvas(dataOrWidth as number, height);\n } else {\n this.canvas = createCanvas((dataOrWidth as ImageData).width, (dataOrWidth as ImageData).height);\n }\n this.context = this.canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n }\n\n get width(): number {\n return this.canvas.width;\n }\n\n set width(width: number) {\n this.canvas.width = width;\n }\n\n get height(): number {\n return this.canvas.height;\n }\n\n set height(height: number) {\n this.canvas.height = height;\n }\n\n get dataUrl() {\n return this.toDataURL();\n }\n\n toDataURL(): string {\n return this.canvas.toDataURL();\n }\n\n getData(sx: number = 0, sy: number = 0, sw: number = this.width, sh: number = this.height): ImageData {\n return this.context.getImageData(sx, sy, sw, sh);\n }\n\n putData(data: ImageData, dx = 0, dy = 0, dirtyX = 0, dirtyY = 0, dirtyWidth=data.width,dirtyHeight=data.height): void {\n this.context.putImageData(data, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);\n }\n\n test() {\n }\n\n dispose() {\n }\n\n}\n","export interface TickerFunction {\n (): void;\n}\n\ntype IntervalHandle = ReturnType<typeof setInterval>;\n\n/**\n * Shared 20-per-second tick loop, used for things like animated texture frames.\n *\n * The timers are started lazily by {@link Ticker.add} and unref'd where the platform supports it -\n * importing MineRender must never on its own keep a Node process alive.\n */\nexport class Ticker {\n\n public static readonly TPS = 20;\n\n private static counter: number = 0;\n private static readonly _tickers: Map<number, TickerFunction> = new Map<number, TickerFunction>();\n\n private static interval: IntervalHandle | undefined;\n private static oneSecondTicksTracker: IntervalHandle | undefined;\n private static fiveSecondTicksTracker: IntervalHandle | undefined;\n\n private static oneSecondTps = 0;\n private static oneSecondTicks = 0;\n\n private static fiveSecondTps = 0;\n private static fiveSecondTicks = 0;\n\n private static schedule(fn: () => void, ms: number): IntervalHandle {\n const handle = setInterval(fn, ms);\n // Node's Timeout keeps the event loop alive unless unref'd; browsers return a plain number\n const unref = (handle as { unref?: () => void }).unref;\n if (typeof unref === \"function\") {\n unref.call(handle);\n }\n return handle;\n }\n\n public static start(): void {\n if (this.interval) return;\n\n this.interval = this.schedule(() => {\n Ticker._tickers.forEach(t => {\n try {\n t();\n } catch (e) {\n console.warn(e);\n }\n });\n Ticker.oneSecondTicks++;\n Ticker.fiveSecondTicks++;\n }, 1000 / this.TPS);\n\n this.oneSecondTicksTracker = this.schedule(() => {\n Ticker.oneSecondTps = Ticker.oneSecondTicks;\n Ticker.oneSecondTicks = 0;\n }, 1000);\n\n this.fiveSecondTicksTracker = this.schedule(() => {\n Ticker.fiveSecondTps = Ticker.fiveSecondTicks / 5;\n Ticker.fiveSecondTicks = 0;\n }, 1000 * 5);\n }\n\n public static stop(): void {\n if (this.interval) clearInterval(this.interval);\n if (this.oneSecondTicksTracker) clearInterval(this.oneSecondTicksTracker);\n if (this.fiveSecondTicksTracker) clearInterval(this.fiveSecondTicksTracker);\n this.interval = undefined;\n this.oneSecondTicksTracker = undefined;\n this.fiveSecondTicksTracker = undefined;\n }\n\n public static add(tick: TickerFunction): number {\n this.start();\n const c = this.counter++;\n this._tickers.set(c, tick);\n return c;\n }\n\n public static remove(c?: number) {\n // note: plain `if (c)` used to drop id 0, i.e. the very first registered ticker\n if (typeof c === \"number\") this._tickers.delete(c);\n }\n\n public static get tickers(): Map<number, TickerFunction> {\n return this._tickers;\n }\n\n public static get tpsOneSecond() {\n return this.oneSecondTps;\n }\n\n public static get tpsFiveSeconds() {\n return this.fiveSecondTps;\n }\n\n public static dispose() {\n this.stop();\n this._tickers.clear();\n }\n\n}\n","import type { ImageData } from \"canvas\";\nimport { CanvasImage } from \"../canvas/CanvasImage\";\nimport { DoubleArray, Model } from \"../model/Model\";\nimport { AnimatorFunction } from \"../AnimatorFunction\";\nimport Timeout = NodeJS.Timeout;\nimport { Disposable } from \"../Disposable\";\nimport { Ticker } from \"../Ticker\";\n\nexport class TextureAtlas implements Disposable {\n ticker?: number;\n\n constructor(\n readonly model: Model,\n readonly image: CanvasImage,\n readonly sizes: { [texture: string]: DoubleArray },\n readonly positions: { [texture: string]: DoubleArray },\n readonly hasAnimation: boolean,\n readonly animatorFunctions: { [p: string]: AnimatorFunction },\n readonly hasTransparency: boolean\n ) {\n }\n\n getData(texture: string): ImageData {\n const pos = this.positions[texture];\n const size = this.sizes[texture];\n return this.image.getData(pos[0], pos[1], size[0], size[1]);\n }\n\n dispose() {\n this.image.dispose();\n Ticker.remove(this.ticker);\n }\n}\n","import { Model } from \"./Model\";\nimport { BufferGeometry } from \"three/src/core/BufferGeometry\";\nimport type { ImageData } from \"canvas\";\nimport { BoxGeometry, PlaneGeometry } from \"three\";\nimport { UVMapper } from \"../UVMapper\";\nimport { ModelElement } from \"./ModelElement\";\n\nexport class ModelGenerator {\n\n public static readonly ITEM_LAYERS: string[] = [\"layer0\", \"layer1\", \"layer2\", \"layer3\", \"layer4\"];\n\n public static generateItemModel(imageData: ImageData, layer: string): ModelElement[] {\n const mainElement: ModelElement = {\n from: [0,0,7.5],\n to: [16,16,8.5],\n faces: {\n \"south\": {\n uv: [0,0,16,16],\n texture: `#${layer}`\n },\n \"north\": {\n uv: [16,0,0,16],\n texture: `#${layer}`\n }\n },\n shade: true\n };\n //TODO: wrapped edges\n return [mainElement];\n }\n\n}\n","import { CanvasImage } from \"./canvas/CanvasImage\";\nimport { UVMapper } from \"./UVMapper\";\nimport { CUBE_FACES, CubeFace } from \"./CubeFace\";\nimport { DoubleArray, QuadArray } from \"./model/Model\";\nimport { ExtractableImageData } from \"./ExtractableImageData\";\n\n/**\n * down up\n * east north west south\n *\n * bottom-left to top-right\n * [bl, br, tl, tr]\n */\nexport class MinecraftCubeTexture {\n\n constructor(\n readonly u: number, readonly v: number,\n readonly width: number, readonly height: number\n ) {\n }\n\n\n protected mapW(x: number) {\n return x / this.width;\n }\n\n protected mapH(x: number) {\n return 1 - (x / this.height);\n }\n\n getUvEast(w: number, h: number, l: number): QuadArray<DoubleArray> {\n return [\n [this.mapW(this.u), this.mapH(this.v + l + h)],\n [this.mapW(this.u + l), this.mapH(this.v + l + h)],\n [this.mapW(this.u), this.mapH(this.v + l)],\n [this.mapW(this.u + l), this.mapH(this.v + l)],\n ]\n }\n\n getUvWest(w: number, h: number, l: number): QuadArray<DoubleArray> {\n//TODO\n return [\n [this.mapW(this.u + l + w), this.mapH(this.v + l + h)],\n [this.mapW(this.u + l + w + l), this.mapH(this.v + l + h)],\n [this.mapW(this.u + l + w), this.mapH(this.v + l)],\n [this.mapW(this.u + l + w + l), this.mapH(this.v + l)],\n ]\n }\n\n getUvUp(w: number, h: number, l: number): QuadArray<DoubleArray> {\n//TODO\n return [\n [this.mapW(this.u + l + w), this.mapH(this.v + l)],\n [this.mapW(this.u + l + w + w), this.mapH(this.v + l)],\n [this.mapW(this.u + l + w), this.mapH(this.v)],\n [this.mapW(this.u + l + w + w), this.mapH(this.v)],\n ]\n }\n\n getUvDown(w: number, h: number, l: number): QuadArray<DoubleArray> {\n//TODO\n return [\n [this.mapW(this.u + l), this.mapH(this.v + l)],\n [this.mapW(this.u + l + w), this.mapH(this.v + l)],\n [this.mapW(this.u + l), this.mapH(this.v)],\n [this.mapW(this.u + l+w), this.mapH(this.v)],\n ]\n }\n\n getUvSouth(w: number, h: number, l: number): QuadArray<DoubleArray> {\n//TODO\n return [\n [this.mapW(this.u + l + w + l), this.mapH(this.v + l + h)],\n [this.mapW(this.u + l + w + l + w), this.mapH(this.v + l + h)],\n [this.mapW(this.u + l + w + l), this.mapH(this.v + l)],\n [this.mapW(this.u + l + w + l + w), this.mapH(this.v + l)],\n ]\n }\n\n getUvNorth(w: number, h: number, l: number): QuadArray<DoubleArray> {\n//TODO\n return [\n [this.mapW(this.u + l), this.mapH(this.v + l + h)],\n [this.mapW(this.u + l + w), this.mapH(this.v + l + h)],\n [this.mapW(this.u + l), this.mapH(this.v + l)],\n [this.mapW(this.u + l + w), this.mapH(this.v + l)],\n ]\n }\n\n getFaceUv(face: CubeFace, w: number, h: number, l: number): QuadArray<DoubleArray> {\n switch (face) {\n case CubeFace.EAST:\n return this.getUvEast(w, h, l);\n case CubeFace.WEST:\n return this.getUvWest(w, h, l);\n case CubeFace.UP:\n return this.getUvUp(w, h, l);\n case CubeFace.DOWN:\n return this.getUvDown(w, h, l);\n case CubeFace.SOUTH:\n return this.getUvSouth(w, h, l);\n case CubeFace.NORTH:\n return this.getUvNorth(w, h, l);\n }\n }\n\n toUvArray(w: number, h: number, l: number): number[] {\n const uv: number[] = [];\n for (let i = 0; i < CUBE_FACES.length; i++) {\n UVMapper.setFaceUvInArray(uv, i * 4, this.getFaceUv(CUBE_FACES[i], w, h, l));\n }\n return uv;\n }\n\n\n}\n","export class SceneStats {\n\n objectCount: number = 0;\n sceneObjectCount: number = 0;\n instanceCount: number = 0;\n\n}\n","export const TintColors = [\n\n]\n","import { Euler, Vector3 } from \"three\";\n\nexport interface Transformable {\n\n setPositionRotationScale(position?: Vector3, rotation?: Euler, scale?: Vector3): void;\n\n setPosition(position: Vector3): void;\n\n getPosition(): Vector3;\n\n setRotation(rotation: Euler): void;\n\n getRotation(): Euler;\n\n setScale(scale: Vector3): void;\n\n getScale(): Vector3;\n\n}\n\nexport function isTransformable(obj: any): obj is Transformable {\n return \"setPosition\" in obj && \"setRotation\" in obj && \"setScale\" in obj;\n}\n","import { Caching } from \"./cache/Caching\";\nimport { Requests } from \"./request/Requests\";\nimport { Ticker } from \"./Ticker\";\n\n/**\n * Releases every long-lived timer MineRender holds, so a Node process can exit.\n *\n * Both `@inventivetalent/loading-cache` (cache expiry) and `jobqu` (request queue draining) use\n * self-rescheduling timers that are not unref'd, which keeps the event loop alive for as long as\n * the library is loaded. Browsers don't care, but anything headless - a render server, a CLI, a\n * test run - has to call this when it's done.\n *\n * The library stays usable afterwards; the caches and queues simply start over.\n */\nexport function shutdown(): void {\n Ticker.dispose();\n Requests.end();\n Caching.end();\n}\n","import { AssetKey, BasicAssetKey } from \"./AssetKey\";\nimport { EntityModel } from \"../entity/EntityModel\";\nimport { MinecraftAsset } from \"../MinecraftAsset\";\nimport { AssetLoader } from \"./AssetLoader\";\nimport { AssetParser } from \"./source\";\nimport { Maybe } from \"../util\";\nimport { Memoize } from \"typescript-memoize\";\n\nexport class Entities {\n\n @Memoize()\n public static async getBlockEntityModels(): Promise<Maybe<BlockEntityModels>> {\n const key = AssetKey.parse(\"models\", \"minerender:blockEntityModels\");\n console.log(key);\n return AssetLoader.get<BlockEntityModels>(key, AssetParser.JSON);\n }\n\n @Memoize()\n public static async getEntityModels(): Promise<Maybe<EntityModels>> {\n const key = AssetKey.parse(\"models\", \"minerender:entityModels\");\n console.log(key);\n return AssetLoader.get<EntityModels>(key, AssetParser.JSON);\n }\n\n // BlockEntity names are hardcoded\n public static async getBlockList(): Promise<string[]> {\n const models = await this.getBlockEntityModels();\n if (!models) {\n return [];\n }\n return Object.keys(models);\n }\n\n public static async getEntityList(): Promise<string[]> {\n const models = await this.getEntityModels();\n if (!models) {\n return [];\n }\n return Object.keys(models);\n }\n\n public static async getBlock(modelKey: BasicAssetKey, textureKey?: BasicAssetKey): Promise<Maybe<EntityModel>> {\n const models = await this.getBlockEntityModels();\n if (!models) {\n return undefined;\n }\n if (!textureKey) {\n textureKey = modelKey;\n }\n const baseKey = modelKey.path.includes(\"/\") ? new BasicAssetKey(modelKey.namespace, modelKey.path.split(\"\\/\")[0]) : modelKey;\n return {\n key: textureKey,\n parts: models[baseKey.toNamespacedString()]\n }\n }\n\n public static async getEntity(modelKey: BasicAssetKey, textureKey?: BasicAssetKey): Promise<Maybe<EntityModel>> {\n const models = await this.getEntityModels();\n if (!models) {\n return undefined;\n }\n if (!textureKey) {\n textureKey = modelKey\n }\n const baseKey = modelKey.path.includes(\"/\") ? new BasicAssetKey(modelKey.namespace, modelKey.path.split(\"\\/\")[0]) : modelKey;\n return {\n key: textureKey,\n parts: models[baseKey.toNamespacedString()]\n }\n }\n\n\n}\n\nexport class EntityModels implements MinecraftAsset {\n [k: string]: any;\n}\n\nexport class BlockEntityModels implements MinecraftAsset {\n [k: string]: any;\n}\n","import { BoxGeometry, Color, EdgesGeometry, Euler, InstancedMesh, LineBasicMaterial, LineSegments, MathUtils, Matrix4, Mesh, Object3D, Quaternion, Scene, Vector3 } from \"three\";\nimport { ModelElement, ModelFaces } from \"../model/ModelElement\";\nimport { Geometries } from \"../Geometries\";\nimport { UVMapper } from \"../UVMapper\";\nimport { DoubleArray, TripleArray } from \"../model/Model\";\nimport { Axis, axisToVec3 } from \"../Axis\";\nimport { BufferGeometry } from \"three/src/core/BufferGeometry\";\nimport { Material } from \"three/src/materials/Material\";\nimport { SkinPart } from \"../skin/SkinPart\";\nimport { changeEvent, Maybe } from \"../util/util\";\nimport { InstanceReference } from \"../instance/InstanceReference\";\nimport { MineRenderError } from \"../error/MineRenderError\";\nimport { isInstancedMesh, isMesh } from \"../util/three\";\nimport { Disposable, isDisposable } from \"../Disposable\";\nimport { SceneObjectOptions } from \"./SceneObjectOptions\";\nimport merge from \"ts-deepmerge\";\nimport { Instanceable } from \"../instance/Instanceable\";\nimport { isMineRenderScene, MineRenderScene } from \"./MineRenderScene\";\nimport { Transformable } from \"../Transformable\";\nimport generateUUID = MathUtils.generateUUID;\nimport { prefix } from \"../util/log\";\n\nconst p = prefix(\"SceneObject\");\n\nexport class SceneObject extends Object3D implements Disposable, Instanceable, Transformable {\n\n public readonly isSceneObject: true = true;\n\n public static readonly DEFAULT_OPTIONS: SceneObjectOptions = merge({}, <SceneObjectOptions>{\n instanceMeshes: true,\n maxInstanceCount: 50,\n mergeMeshes: true,\n wireframe: false\n });\n public readonly options: SceneObjectOptions;\n\n private _scene: Maybe<MineRenderScene>;\n\n private materialCallbacks: { [key: string]: Array<(mat: Material, key: string) => void>; } = {};\n\n protected _isInstanced: boolean = false;\n _instanceCounter: number = 0;\n\n constructor(options?: Partial<SceneObjectOptions>) {\n super();\n this.options = merge({}, SceneObject.DEFAULT_OPTIONS, options ?? {});\n console.log(\"SceneObject options\", this.options);\n }\n\n public set scene(scene: MineRenderScene) {\n if (!!this._scene) throw new MineRenderError(\"Scene already set\");\n this._scene = scene;\n }\n\n public get scene(): MineRenderScene {\n if (!this._scene) throw new MineRenderError(\"Scene not set\");\n return this._scene;\n }\n\n async init(): Promise<void> {\n }\n\n public notifyDirty() {\n this.dispatchEvent(changeEvent);\n }\n\n //<editor-fold desc=\"GROUPS\">\n\n protected createAndAddGroup(name?: string, x: number = 0, y: number = 0, z: number = 0, offsetAxis?: Axis, offset: number = 0): Object3D {\n const group = this.createGroup(name, x, y, z, offsetAxis, offset);\n\n if (name) {\n let existing = this.getObjectByName(group.name);\n if (existing) {\n this.remove(existing);\n }\n }\n\n console.log(\"add\", group, group.name);\n this.add(group);\n this.notifyDirty();\n return group;\n }\n\n protected createGroup(name?: string, x: number = 0, y: number = 0, z: number = 0, offsetAxis?: Axis, offset: number = 0): Object3D {\n const obj = new Object3D();\n if (name) {\n obj.name = `group:${name}`;\n }\n if (x > 0 || y > 0 || z > 0) {\n obj.position.set(x, y, z);\n }\n if (offsetAxis) {\n obj.translateOnAxis(axisToVec3(offsetAxis), offset);\n }\n return obj;\n }\n\n /**\n * Get a group by its name\n */\n public getGroupByName(name: string): Maybe<Object3D> {\n return this.getObjectByName(`group:${name}`) as Object3D;\n }\n\n /**\n * Toggle visibility of a group\n * @param name name of the group\n * @param visible set the visibility directly, if not set toggles it\n */\n public toggleGroupVisibility(name: string, visible?: boolean): boolean {\n return this.toggleObjectVisibility(this.getGroupByName(name), visible);\n }\n\n //</editor-fold>\n\n //<editor-fold desc=\"MESHES\">\n\n protected addOrReplaceMesh(mesh: Mesh, parent: Object3D, name?: string) {\n if (name) {\n const existing = parent.getObjectByName(mesh.name);\n if (existing) {\n console.log(\"remove\", existing.name, existing);\n parent.remove(existing);\n }\n }\n console.log(\"add\", mesh, mesh.name);\n parent.add(mesh);\n }\n\n protected createAndAddMesh(name?: string, group?: Object3D, geometry?: BufferGeometry, material?: Material | Material[], offsetAxis?: Axis, offset: number = 0): Mesh {\n const mesh = this.createMesh(name, geometry, material, offsetAxis, offset);\n if (group) {\n this.addOrReplaceMesh(mesh, group, name);\n } else {\n this.addOrReplaceMesh(mesh, this, name);\n }\n this.notifyDirty();\n return mesh;\n }\n\n protected createMesh(name?: string, geometry?: BufferGeometry, material?: Material | Material[], offsetAxis?: Axis, offset: number = 0): Mesh {\n const mesh = new Mesh(geometry, material);\n if (name) {\n mesh.name = `mesh:${name}`;\n }\n\n //TODO\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n\n if (offsetAxis) {\n mesh.translateOnAxis(axisToVec3(offsetAxis), offset);\n }\n return mesh;\n }\n\n protected createInstancedMesh(name: Maybe<string>, geometry: BufferGeometry, material: Material | Material[], count: number): InstancedMesh {\n const mesh = new InstancedMesh(geometry, material, count);\n if (name) {\n mesh.name = `mesh:${name}`;\n }\n return mesh;\n }\n\n /**\n * Get a mesh by its name\n */\n public getMeshByName(name: string): Maybe<Mesh> {\n return this.getObjectByName(`mesh:${name}`) as Mesh;\n }\n\n /**\n * Toggle visibility of a mesh\n * @param name name of the mesh\n * @param visible set the visibility directly, if not set toggles it\n */\n public toggleMeshVisibility(name: string, visible?: boolean): boolean {\n return this.toggleObjectVisibility(this.getMeshByName(name), visible);\n }\n\n public iterateAllMeshes(cb: (mesh: Mesh) => void) {\n this.children.forEach(obj => {\n if ((<Mesh>obj).isMesh) {\n cb(obj as Mesh);\n }\n obj.children.forEach(obj1 => {\n if ((<Mesh>obj1).isMesh) {\n cb(obj1 as Mesh);\n }\n })\n })\n }\n\n //</editor-fold>\n\n //<editor-fold desc=\"GEOMETRIES\">\n\n protected _getBoxGeometryFromDimensions([width, height, depth]: TripleArray, faces: ModelFaces, originalTextureSize: DoubleArray, actualTextureSize: DoubleArray): BoxGeometry {\n const uv = UVMapper.facesToUvArray(faces, originalTextureSize, actualTextureSize);\n return Geometries.getBox({\n width,\n height,\n depth,\n uv\n });\n }\n\n protected _getBoxGeometryFromElement(element: ModelElement): BoxGeometry {\n const width = element.to[0] - element.from[0];\n const height = element.to[1] - element.from[1];\n const depth = element.to[2] - element.from[2];\n\n const uv = element.mappedUv;\n\n return Geometries.getBox({\n width,\n height,\n depth,\n uv\n });\n }\n\n protected _getBoxGeometryForDimensionsAndUv(width: number, height: number, depth: number, uv: number[]): BoxGeometry {\n return Geometries.getBox({\n width,\n height,\n depth,\n uv\n });\n }\n\n //</editor-fold>\n\n //<editor-fold desc=\"INSTANCING\">\n\n get isInstanced(): boolean {\n return this._isInstanced;\n }\n\n get instanceCounter(): number {\n return this._instanceCounter;\n }\n\n protected constructInstanceReference(i: number): InstanceReference<SceneObject> {\n return new InstanceReference<this>(this, i);\n }\n\n nextInstance(): InstanceReference<SceneObject> {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n const i = this._instanceCounter++;\n this.setMatrixAt(i, new Matrix4());\n console.debug(p, \"nextInstance \" + i);\n if (i === this.options.maxInstanceCount) {\n console.warn(p, \"Max instance count reached for \" + this);\n }\n if (this.scene) {\n this.scene.stats.instanceCount++;\n }\n this.notifyDirty();\n return this.constructInstanceReference(i);\n }\n\n //</editor-fold>\n\n //<editor-fold desc=\"TRANSFORMATION\">\n\n getMatrixAt(index: number, matrix: Matrix4 = new Matrix4()): Matrix4 {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n const child = this.children[0];\n if (child && isInstancedMesh(child)) {//TODO: figure out why child isn't set\n child.getMatrixAt(index, matrix);\n }\n return matrix;\n }\n\n setMatrixAt(index: number, matrix: Matrix4) {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n const child = this.children[0];\n if (child && isInstancedMesh(child)) {//TODO: figure out why child isn't set\n child.setMatrixAt(index, matrix);\n child.instanceMatrix.needsUpdate = true;\n }\n this.notifyDirty();\n }\n\n setPositionRotationScaleAt(index: number, position?: Vector3, rotation?: Euler, scale?: Vector3) {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n\n const oldPosition = new Vector3();\n const oldRotation = new Quaternion();\n const oldScale = new Vector3();\n\n const matrix = new Matrix4();\n if (!scale || !rotation || !position) {\n this.getMatrixAt(index, matrix).decompose(oldPosition, oldRotation, oldScale);\n }\n\n matrix.compose(\n position ? position : oldPosition,\n rotation ? new Quaternion().setFromEuler(rotation) : oldRotation,\n scale ? scale : oldScale\n );\n\n this.setMatrixAt(index, matrix);\n }\n\n setPositionAt(index: number, position: Vector3) {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n this.setPositionRotationScaleAt(index, position);\n }\n\n getPositionAt(index: number, vector: Vector3 = new Vector3()): Vector3 {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n const matrix = this.getMatrixAt(index)\n vector.setFromMatrixPosition(matrix);\n return vector;\n }\n\n setRotationAt(index: number, rotation: Euler) {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n this.setPositionRotationScaleAt(index, undefined, rotation, undefined);\n }\n\n getRotationAt(index: number, euler: Euler = new Euler()): Euler {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n const matrix = this.getMatrixAt(index)\n euler.setFromRotationMatrix(matrix);\n return euler;\n }\n\n setScaleAt(index: number, scale: Vector3) {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n this.setPositionRotationScaleAt(index, undefined, undefined, scale);\n }\n\n getScaleAt(index: number, vector: Vector3 = new Vector3()): Vector3 {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n const matrix = this.getMatrixAt(index)\n vector.setFromMatrixScale(matrix);\n return vector;\n }\n\n setPositionRotationScale(position?: Vector3, rotation?: Euler, scale?: Vector3): void {\n if (this.isInstanced) {\n //TODO: specific instance\n for (let i = 0; i < this.instanceCounter; i++) {\n this.setPositionRotationScaleAt(i, position, rotation, scale);\n }\n } else {\n if (position) {\n this.position.set(position.x, position.y, position.z);\n }\n if (rotation) {\n this.rotation.set(rotation.x, rotation.y, rotation.z);\n }\n if (scale) {\n this.scale.set(scale.x, scale.y, scale.z);\n }\n }\n this.notifyDirty();\n }\n\n setPosition(position: Vector3) {\n if (this.isInstanced) {\n //TODO: specific instance\n for (let i = 0; i < this.instanceCounter; i++) {\n this.setPositionRotationScaleAt(i, position);\n }\n } else {\n this.position.set(position.x, position.y, position.z);\n }\n this.notifyDirty();\n }\n\n getPosition(): Vector3 {\n if (this.isInstanced) {\n return this.getPositionAt(0);\n } else {\n return this.position;\n }\n }\n\n setRotation(rotation: Euler) {\n if (this.isInstanced) {\n //TODO: specific instance\n for (let i = 0; i < this.instanceCounter; i++) {\n this.setPositionRotationScaleAt(i, undefined, rotation);\n }\n } else {\n this.rotation.set(rotation.x, rotation.y, rotation.z);\n }\n this.notifyDirty();\n }\n\n getRotation(): Euler {\n if (this.isInstanced) {\n return this.getRotationAt(0);\n } else {\n return this.rotation;\n }\n }\n\n setScale(scale: Vector3) {\n if (this.isInstanced) {\n //TODO: specific instance\n for (let i = 0; i < this.instanceCounter; i++) {\n this.setPositionRotationScaleAt(i, undefined, undefined, scale);\n }\n } else {\n this.scale.set(scale.x, scale.y, scale.z);\n }\n this.notifyDirty();\n }\n\n getScale(): Vector3 {\n if (this.isInstanced) {\n return this.getScaleAt(0);\n } else {\n return this.scale;\n }\n }\n\n //</editor-fold>\n\n protected toggleObjectVisibility(object?: Object3D, visible?: boolean): boolean {\n if (object) {\n if (typeof visible !== \"undefined\") {\n object.visible = visible;\n } else {\n object.visible = !object.visible;\n }\n return object.visible;\n }\n this.notifyDirty();\n return false;\n }\n\n //<editor-fold desc=\"CLEANUP\">\n\n public dispose() {\n this.disposeAndRemoveAllChildren();\n this.notifyDirty();\n }\n\n public disposeAndRemoveAllChildren() {\n while (this.children.length > 0) {\n let c = this.children[0];\n if (isDisposable(c)) {\n c.dispose();\n }\n this.remove(c);\n }\n this.notifyDirty();\n }\n\n public removeFromScene() {\n this._scene?.remove(this);\n this.notifyDirty();\n }\n\n //</editor-fold>\n\n}\n\nexport function isSceneObject(obj: any): obj is SceneObject {\n return (<SceneObject>obj).isSceneObject;\n}\n","import { Instanceable } from \"./Instanceable\";\nimport { Euler, Matrix4, Vector3 } from \"three\";\nimport { Transformable } from \"../Transformable\";\nimport { SceneObject } from \"../renderer/SceneObject\";\n\nexport class InstanceReference<T extends Instanceable> implements Transformable {\n\n public readonly isInstanceReference: true = true;\n\n constructor(readonly instanceable: T, readonly index: number) {\n }\n\n nextInstance(): InstanceReference<SceneObject> {\n return this.instanceable.nextInstance();\n }\n\n getMatrix(matrix?: Matrix4): Matrix4 {\n return this.instanceable.getMatrixAt(this.index, matrix);\n }\n\n setMatrix(matrix: Matrix4): void {\n this.instanceable.setMatrixAt(this.index, matrix);\n }\n\n setPositionRotationScale(position?: Vector3, rotation?: Euler, scale?: Vector3): void {\n this.instanceable.setPositionRotationScaleAt(this.index, position, rotation, scale);\n }\n\n setPosition(position: Vector3): void {\n // console.log(\"InstanceReference#setPosition\",position)\n this.instanceable.setPositionAt(this.index, position);\n }\n\n getPosition(): Vector3 {\n return this.instanceable.getPositionAt(this.index);\n }\n\n setRotation(rotation: Euler): void {\n // console.log(\"InstanceReference#setRotation\",rotation)\n this.instanceable.setRotationAt(this.index, rotation);\n }\n\n getRotation(): Euler {\n // console.log(\"InstanceReference#getRotation\")\n return this.instanceable.getRotationAt(this.index);\n }\n\n setScale(scale: Vector3): void {\n this.instanceable.setScaleAt(this.index, scale);\n }\n\n getScale(): Vector3 {\n return this.instanceable.getScaleAt(this.index);\n }\n\n //TODO: support for custom methods e.g. setting block variants\n\n}\n\nexport function isInstanceReference(obj: any): obj is InstanceReference<any> {\n return (<InstanceReference<any>>obj).isInstanceReference;\n}\n","// https://stackoverflow.com/a/60323233/6257838\nexport class MineRenderError extends Error {\n constructor(msg) {\n super(msg);\n Object.setPrototypeOf(this, MineRenderError.prototype);\n }\n\n get name(): string {\n return 'MineRenderError';\n }\n}\n","import { SceneObject } from \"../../renderer/SceneObject\";\nimport { BlockState, BlockStateVariant, BlockStateVariants, MultipartCondition } from \"../../model/block/BlockState\";\nimport { SceneObjectOptions } from \"../../renderer/SceneObjectOptions\";\nimport { Caching } from \"../../cache/Caching\";\nimport { Models } from \"../../assets/Models\";\nimport { Assets, DEFAULT_NAMESPACE } from \"../../assets/Assets\";\nimport merge from \"ts-deepmerge\";\nimport { AxesHelper, Euler, Matrix4, Object3D, Vector3 } from \"three\";\nimport { Maybe, toRadians } from \"../../util/util\";\nimport { addWireframeToMesh, addWireframeToObject, applyElementRotation, applyGenericRotation, applyModelPartRotation } from \"../../util/model\";\nimport { ModelTextures } from \"../../assets/ModelTextures\";\nimport { AssetKey } from \"../../assets/AssetKey\";\nimport { ExtractableImageData } from \"../../ExtractableImageData\";\nimport { Materials } from \"../../Materials\";\nimport { MinecraftCubeTexture } from \"../../MinecraftCubeTexture\";\nimport * as THREE from \"three\";\nimport { Ticker } from \"../../Ticker\";\nimport { EntityModel } from \"../EntityModel\";\n\nexport class EntityObject extends SceneObject {\n\n public readonly isEntityObject: true = true;\n\n public static readonly DEFAULT_OPTIONS: EntityObjectOptions = merge({}, SceneObject.DEFAULT_OPTIONS, <EntityObjectOptions>{});\n public readonly options: EntityObjectOptions;\n\n private imageData?: ExtractableImageData;\n\n private meshesCreated: boolean = false;\n\n constructor(readonly entity: EntityModel, options?: Partial<EntityObjectOptions>) {\n super();\n this.options = merge({}, SceneObject.DEFAULT_OPTIONS, options ?? {});\n //TODO\n }\n\n async init(): Promise<void> {\n this.createMeshes();\n await this.applyTextures();\n }\n\n dispose() {\n super.dispose();\n }\n\n protected async loadTextures(): Promise<void> {\n this.imageData = await ModelTextures.get(new AssetKey(\n this.entity.key?.namespace ?? DEFAULT_NAMESPACE,\n this.entity.key!.path, //TODO: texture may differ from entity name; most of them are in subdirectories for multiple variants etc.\n \"textures\",\n \"entity\",\n \"assets\",\n \".png\"\n ))\n }\n\n //TODO: abstract this, since extracted model data can be used for entities, blocks, players\n protected createMeshes(force: boolean = false) {\n if (this.meshesCreated && !force) return;\n\n const mat = Materials.MISSING_TEXTURE;\n\n //TODO: don't know which parts are actually meant to be rendered atm\n for (let partName in this.entity.parts) {\n const part = this.entity.parts[partName];\n const texture = new MinecraftCubeTexture(part.textureOffsetU, part.textureOffsetV, part.textureWidth, part.textureHeight);\n const partAnchor = new Object3D();\n partAnchor.position.x = part.pivotX;\n partAnchor.position.y = part.pivotY;\n partAnchor.position.z = part.pivotZ;\n for (let cube of part.cubes) {\n const w = cube.maxX - cube.minX;\n const h = cube.maxY - cube.minY;\n const l = cube.maxZ - cube.minZ;\n const uv = texture.toUvArray(w, h, l);\n\n //TODO: mirror\n // MC does it by flipping min and max X; might be easier than moving around all face UVs\n\n const cubeGeo = this._getBoxGeometryForDimensionsAndUv(w, h, l, uv).clone();\n\n cubeGeo.applyMatrix4(new THREE.Matrix4().makeTranslation(w / 2, h / 2, l / 2));\n cubeGeo.applyMatrix4(new THREE.Matrix4().makeTranslation(cube.minX, cube.minY, cube.minZ));\n\n applyModelPartRotation(part, cubeGeo);\n\n\n // TODO: merge parts\n // const mesh = this.createAndAddMesh(partName, undefined, cubeGeo, mat);\n const mesh = this.createMesh(partName, cubeGeo, mat);\n partAnchor.add(mesh);\n if (this.options.wireframe) {\n addWireframeToMesh(cubeGeo, mesh);\n }\n }\n this.add(partAnchor);\n }\n\n //TODO\n\n this.meshesCreated = true;\n }\n\n protected async applyTextures() {\n\n const textureAsset = await ModelTextures.preload(new AssetKey(\n this.entity.key?.namespace ?? DEFAULT_NAMESPACE,\n this.entity.key!.path,\n \"textures\",\n \"entity\",\n \"assets\",\n \".png\"\n ));\n // if (this.atlas!.model.textures) {\n // for (let textureKey in this.atlas!.model.textures) {\n // let asset = this.textureMap[textureKey];\n // if (asset) {\n //TODO: transparency\n if (textureAsset) {\n let mat = Materials.getImage({ texture: { src: textureAsset.src! } })\n this.iterateAllMeshes(mesh => {\n mesh.material = mat;\n });\n }\n // }\n // }\n // }\n }\n\n\n}\n\nexport interface EntityObjectOptions extends SceneObjectOptions {\n}\n\nexport function isEntityObject(obj: any): obj is EntityObject {\n return (<EntityObject>obj).isEntityObject;\n}\n","import { Renderer, RendererOptions } from \"../../renderer/Renderer\";\nimport { SceneObject } from \"../../renderer/SceneObject\";\nimport { SceneObjectOptions } from \"../../renderer/SceneObjectOptions\";\n\nexport class GuiObject extends SceneObject {\n\n //TODO\n\n}\n\nexport interface GuiObjectOptions extends SceneObjectOptions {\n\n}\n","import { Renderer } from \"../renderer/Renderer\";\nimport { InstancedMesh, Intersection, Mesh, Object3D, Raycaster, Vector2 } from \"three\";\nimport { isSceneObject, SceneObject } from \"../renderer/SceneObject\";\nimport { Maybe, toDegrees, toRadians } from \"../util/util\";\nimport { isTransformable, Transformable } from \"../Transformable\";\nimport { prefix } from \"../util/log\";\nimport { isMesh } from \"../util/three\";\nimport { TextureAtlas } from \"../texture\";\n\nconst p = prefix(\"SceneInspector\");\n\nconst help = \"<span>Ctrl+Click to Select<br/></span><br/>\";\n\nexport class SceneInspector {\n\n readonly objectInfoContainer: HTMLDivElement;\n readonly objectControlsContainer: HTMLDivElement;\n\n protected readonly raycaster: Raycaster;\n private readonly mouse: Vector2 = new Vector2();\n\n private selectedObject?: Object3D;\n\n constructor(readonly renderer: Renderer) {\n this.objectInfoContainer = document.createElement(\"div\");\n this.objectControlsContainer = document.createElement(\"div\");\n\n this.raycaster = new Raycaster();\n\n this.init();\n }\n\n protected init() {\n this.objectInfoContainer.classList.add(\"minerender-inspector\", \"minerender-object-info\");\n this.objectControlsContainer.classList.add(\"minerender-inspector\", \"minerender-object-controls\");\n\n this.objectInfoContainer.innerHTML = help;\n\n document.addEventListener(\"click\", this.onClick.bind(this), {\n passive: true\n })\n }\n\n findMeshChildren(from: Object3D, out: Mesh[] = []) {\n for (let c of from.children) {\n if (isMesh(c)) {\n out.push(c);\n }\n this.findMeshChildren(c, out);\n }\n return out;\n }\n\n onClick(event) {\n if ((<HTMLElement>event.target)?.nodeName !== \"CANVAS\") return;\n if (!event.ctrlKey) return;\n\n setTimeout(() => {\n this.mouse.x = (event.clientX / window.innerWidth) * 2 - 1;\n this.mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;\n this.raycaster.setFromCamera(this.mouse, this.renderer.camera);\n let start = Date.now();\n let targets = this.findMeshChildren(this.renderer.scene);\n const intersects = this.raycaster.intersectObjects(targets, false);\n console.debug(\"Raycast took \" + (Date.now() - start) + \"ms for \" + targets.length + \" possible targets with \" + intersects.length + \" results\");\n if (intersects.length > 0) {\n this.handleRaycasterObjects(intersects)\n }\n });\n }\n\n appendTo(el: HTMLElement) {\n el.append(this.objectInfoContainer);\n el.append(this.objectControlsContainer);\n }\n\n protected handleRaycasterObjects(intersections: Intersection[]) {\n console.debug(intersections);\n const firstIntersection = intersections[0];\n if (firstIntersection && firstIntersection.object) {\n const firstObject = firstIntersection.object;\n\n let targetIntersection: Maybe<Intersection> = undefined;\n let targetObject: Maybe<Object3D> = undefined;\n const firstSceneObjectIntersection = intersections.find(i => i.object && i.object.parent && isSceneObject(i.object.parent));\n if (firstSceneObjectIntersection && firstSceneObjectIntersection.object) {\n targetIntersection = firstSceneObjectIntersection;\n targetObject = firstSceneObjectIntersection.object;\n } else {\n // fallback to first intersect\n targetIntersection = firstIntersection;\n targetObject = firstObject;\n }\n\n if (!targetIntersection || !targetObject) return;\n\n this.selectObject(targetObject, targetIntersection);\n }\n }\n\n public selectObject(targetObject: Object3D, targetIntersection?: Intersection) {\n this.selectedObject = targetObject;\n console.log(p, \"selected\", targetObject);\n\n this.redraw(targetObject, targetIntersection);\n }\n\n protected redraw(targetObject: Object3D, targetIntersection?: Intersection) {\n this.objectInfoContainer.innerHTML = help;\n if (targetIntersection) {\n this.addInfoLine(\"Distance\", \"D\", targetIntersection.distance);\n this.addInfoLine(\"Instance #\", \"I\", targetIntersection.instanceId);\n }\n this.addInfoLine(\"Type\", \"T\", targetObject.constructor.name + \"/\" + targetObject.type);\n this.addInfoLine(\"Name\", \"N\", targetObject.name);\n if (targetObject.parent) {\n this.addInfoLine(\"Parent\", \"P\", targetObject.parent.constructor.name);\n if (isSceneObject(targetObject.parent)) {\n //...\n }\n }\n\n if ('atlas' in targetObject) {\n const atlas = targetObject['atlas'] as TextureAtlas;\n // const img = document.createElement(\"img\");\n const img = atlas.image.canvas as HTMLCanvasElement;\n // img.src = atlas.image.dataUrl;\n img.style.width = \"100px\";\n img.style.height = \"100px\";\n img.style.float = \"right\";\n img.style.imageRendering = \"pixelated\";\n this.objectInfoContainer.prepend(img);\n }\n\n this.objectControlsContainer.innerHTML = '';\n this.addControls(targetObject, targetIntersection);\n }\n\n protected addControls(object: Object3D, intersection?: Intersection) {\n const container = document.createElement(\"div\");\n\n container.append(this.separator(\"Select Parent/Child\"));\n\n if (object.parent) {\n container.append(this.buttonControl(\"Select Parent \" + object.parent.constructor.name + \" \" + object.parent.name, \"P\", () => {\n this.selectObject(object.parent!, intersection);\n }));\n }\n if (object.children.length > 0) {\n let i = 1;\n for (let child of object.children) {\n container.append(this.buttonControl(\"Select Child \" + child.constructor.name + \" \" + child.name, \"C\" + (i++), () => {\n this.selectObject(child, intersection);\n }));\n }\n }\n container.append(this.separator());\n\n container.append(this.toggleControl(\"Visibility\", \"V\", object.visible, v => object.visible = v));\n\n // let transformTarget = object.parent!;\n // container.append(this.selectControl(\"Transform Target\",\"T\",[\"parent\",\"mesh\"],v=>{\n // switch (v) {\n // case \"parent\":\n // transformTarget = object.parent!;\n // break;\n // case \"mesh\":\n // transformTarget = object;\n // break;\n // }\n // }))\n\n\n // if(object.parent) {\n // container.append(this.separator(\"Parent\"))\n // this.addObjectControls(object.parent, intersection, container);\n // container.append(this.separator());\n // }\n\n\n container.append(this.separator(\"Mesh\"))\n this.addObjectControls(object, intersection, container);\n container.append(this.separator());\n\n\n this.objectControlsContainer.append(container);\n }\n\n\n protected addInfoLine(name: string, id: string, value: any): HTMLElement {\n const el = document.createElement(\"span\");\n el.innerText = `${ id }: ${ value }`;\n el.setAttribute(\"title\", name);\n\n this.objectInfoContainer.append(el);\n this.objectInfoContainer.append(document.createElement(\"br\"));\n\n return el;\n }\n\n\n protected addObjectControls(target: Object3D, intersection: Maybe<Intersection>, container: HTMLElement) {\n\n const posRange = 16 * 16;\n const rotRange = 360;\n const scaleRange = 4;\n\n if (typeof intersection !== \"undefined\" && typeof intersection.instanceId !== \"undefined\" && isSceneObject(target) && (<SceneObject>target).isInstanced) {\n const scObj: SceneObject = target as SceneObject;\n\n container.append(this.separator(\"Position\"))\n\n let pos = scObj.getPositionAt(intersection.instanceId);\n container.append(this.rangeControl(\"X Position\", \"X\", -posRange + pos.x, posRange + pos.x, pos.x, 1, v => {\n pos = scObj.getPositionAt(intersection.instanceId!);\n pos.x = v;\n scObj.setPositionAt(intersection.instanceId!, pos);\n }));\n container.append(this.rangeControl(\"Y Position\", \"Y\", -posRange + pos.y, posRange + pos.y, pos.y, 1, v => {\n pos = scObj.getPositionAt(intersection.instanceId!);\n pos.y = v;\n scObj.setPositionAt(intersection.instanceId!, pos);\n }));\n container.append(this.rangeControl(\"Z Position\", \"Z\", -posRange + pos.z, posRange + pos.z, pos.z, 1, v => {\n pos = scObj.getPositionAt(intersection.instanceId!);\n pos.z = v;\n scObj.setPositionAt(intersection.instanceId!, pos);\n }));\n\n container.append(this.separator(\"Rotation\"))\n\n let rot = scObj.getRotationAt(intersection.instanceId);\n container.append(this.rangeControl(\"X Rotation\", \"X\", 0, rotRange, Math.round(toDegrees(rot.x)), 1, v => {\n rot = scObj.getRotationAt(intersection.instanceId!);\n rot.x = toRadians(v);\n scObj.setRotationAt(intersection.instanceId!, rot);\n }));\n container.append(this.rangeControl(\"Y Rotation\", \"Y\", 0, rotRange, Math.round(toDegrees(rot.y)), 1, v => {\n rot = scObj.getRotationAt(intersection.instanceId!);\n rot.y = toRadians(v);\n scObj.setRotationAt(intersection.instanceId!, rot);\n }));\n container.append(this.rangeControl(\"Z Rotation\", \"Z\", 0, rotRange, Math.round(toDegrees(rot.z)), 1, v => {\n rot = scObj.getRotationAt(intersection.instanceId!);\n rot.z = toRadians(v);\n scObj.setRotationAt(intersection.instanceId!, rot);\n }));\n\n container.append(this.separator(\"Scale\"))\n\n let scl = scObj.getScale();\n container.append(this.rangeControl(\"X Scale\", \"X\", 0, scaleRange, scl.x, 0.1, v => {\n scl = scObj.getScaleAt(intersection.instanceId!);\n scl.x = v;\n scObj.setScaleAt(intersection.instanceId!, scl);\n }));\n container.append(this.rangeControl(\"Y Scale\", \"Y\", 0, scaleRange, scl.y, 0.1, v => {\n scl = scObj.getScaleAt(intersection.instanceId!);\n scl.y = v;\n scObj.setScaleAt(intersection.instanceId!, scl);\n }));\n container.append(this.rangeControl(\"Z Scale\", \"Z\", 0, scaleRange, scl.z, 0.1, v => {\n scl = scObj.getScaleAt(intersection.instanceId!);\n scl.z = v;\n scObj.setScaleAt(intersection.instanceId!, scl);\n }));\n } else if (isTransformable(target)) {\n const parent: Transformable = target;\n\n container.append(this.separator(\"Position\"))\n\n let pos = parent.getPosition();\n container.append(this.rangeControl(\"X Position\", \"X\", -posRange, posRange, pos.x, 1, v => {\n pos = parent.getPosition();\n pos.x = v;\n parent.setPosition(pos)\n }));\n container.append(this.rangeControl(\"Y Position\", \"Y\", -posRange, posRange, pos.y, 1, v => {\n pos = parent.getPosition();\n pos.y = v;\n parent.setPosition(pos)\n }));\n container.append(this.rangeControl(\"Z Position\", \"Z\", -posRange, posRange, pos.z, 1, v => {\n pos = parent.getPosition();\n pos.z = v;\n parent.setPosition(pos)\n }));\n\n container.append(this.separator(\"Rotation\"))\n\n let rot = parent.getRotation();\n container.append(this.rangeControl(\"X Rotation\", \"X\", 0, rotRange, Math.round(toDegrees(rot.x)), 1, v => {\n rot = parent.getRotation();\n rot.x = toRadians(v);\n parent.setRotation(rot);\n }));\n container.append(this.rangeControl(\"Y Rotation\", \"Y\", 0, rotRange, Math.round(toDegrees(rot.y)), 1, v => {\n rot = parent.getRotation();\n rot.y = toRadians(v);\n parent.setRotation(rot);\n }));\n container.append(this.rangeControl(\"Z Rotation\", \"Z\", 0, rotRange, Math.round(toDegrees(rot.z)), 1, v => {\n rot = parent.getRotation();\n rot.z = toRadians(v);\n parent.setRotation(rot);\n }));\n\n container.append(this.separator(\"Scale\"))\n\n let scl = parent.getScale();\n container.append(this.rangeControl(\"X Scale\", \"X\", 0, scaleRange, scl.x, 0.1, v => {\n scl = parent.getScale();\n scl.x = v;\n parent.setScale(scl);\n }));\n container.append(this.rangeControl(\"Y Scale\", \"Y\", 0, scaleRange, scl.y, 0.1, v => {\n scl = parent.getScale();\n scl.y = v;\n parent.setScale(scl);\n }));\n container.append(this.rangeControl(\"Z Scale\", \"Z\", 0, scaleRange, scl.z, 0.1, v => {\n scl = parent.getScale();\n scl.z = v;\n parent.setScale(scl);\n }));\n } else {\n container.append(this.separator(\"Position\"))\n\n container.append(this.rangeControl(\"X Position\", \"X\", -posRange, posRange, target.position.x, 1, v => target!.position.setX(v)));\n container.append(this.rangeControl(\"Y Position\", \"Y\", -posRange, posRange, target.position.y, 1, v => target!.position.setY(v)));\n container.append(this.rangeControl(\"Z Position\", \"Z\", -posRange, posRange, target.position.z, 1, v => target!.position.setZ(v)));\n\n container.append(this.separator(\"Rotation\"))\n\n container.append(this.rangeControl(\"X Rotation\", \"X\", 0, rotRange, toDegrees(target.rotation.x), 1, v => target!.rotation.x = toRadians(v)));\n container.append(this.rangeControl(\"Y Rotation\", \"Y\", 0, rotRange, toDegrees(target.rotation.y), 1, v => target!.rotation.y = toRadians(v)));\n container.append(this.rangeControl(\"Z Rotation\", \"Z\", 0, rotRange, toDegrees(target.rotation.z), 1, v => target!.rotation.z = toRadians(v)));\n\n container.append(this.separator(\"Scale\"))\n\n container.append(this.rangeControl(\"X Scale\", \"X\", 0, scaleRange, target.scale.x, 0.1, v => target!.scale.x = v));\n container.append(this.rangeControl(\"Y Scale\", \"Y\", 0, scaleRange, target.scale.y, 0.1, v => target!.scale.y = v));\n container.append(this.rangeControl(\"Z Scale\", \"Z\", 0, scaleRange, target.scale.z, 0.1, v => target!.scale.z = v));\n }\n }\n\n protected buttonControl(name: string, id: string, click: () => void): HTMLElement {\n const button = document.createElement(\"button\");\n button.innerText = id;\n button.setAttribute(\"title\", name);\n button.addEventListener(\"click\", click);\n return button;\n }\n\n protected selectControl(name: string, id: string, options: string[], change: (v: string) => void): HTMLElement {\n const label = document.createElement(\"label\");\n label.innerText = id;\n label.setAttribute(\"title\", name);\n\n const select = document.createElement(\"select\");\n options.forEach(o => {\n const opt = document.createElement(\"option\");\n opt.value = o;\n opt.innerText = o;\n select.append(opt);\n });\n select.addEventListener(\"change\", e => {\n change(options[select.selectedIndex]);\n });\n select.selectedIndex = 0;\n label.append(select);\n label.append(document.createElement(\"br\"));\n return label;\n }\n\n protected toggleControl(name: string, id: string, val: boolean, change: (v: boolean) => void): HTMLElement {\n const label = document.createElement(\"label\");\n label.innerText = id;\n label.setAttribute(\"title\", name);\n\n const toggle = document.createElement(\"input\");\n toggle.setAttribute(\"type\", \"checkbox\");\n toggle.checked = val; //TODO: instance\n toggle.addEventListener(\"change\", e => {\n change(toggle.checked);\n });\n label.append(toggle);\n label.append(document.createElement(\"br\"));\n return label;\n }\n\n protected rangeControl(name: string, id: string, min: number, max: number, val: number, step: number, change: (v: number) => void): HTMLElement {\n const label = document.createElement(\"label\");\n const labelText = document.createElement(\"span\");\n label.append(labelText);\n label.setAttribute(\"title\", name);\n labelText.style.width = \"18%\";\n labelText.style.display = \"inline-block\";\n labelText.innerText = `${ id } (${ val })`;\n\n const range = document.createElement(\"input\");\n range.setAttribute(\"type\", \"range\");\n range.style.width = \"80%\";\n range.max = `${ max }`;\n range.min = `${ min }`;\n range.step = `${ step }`;\n range.value = `${ val }`;\n const onChange = () => {\n change(parseFloat(range.value));\n labelText.innerText = `${ id } (${ range.value })`\n };\n // range.addEventListener(\"change\", onChange);\n range.addEventListener(\"input\", onChange);\n range.addEventListener(\"wheel\", e => {\n e.preventDefault();\n if (e.deltaY < 0) {\n range.value = `${ parseFloat(range.value) + step }`;\n onChange();\n } else if (e.deltaY > 0) {\n range.value = `${ parseFloat(range.value) - step }`;\n onChange();\n }\n })\n label.append(range);\n label.append(document.createElement(\"br\"));\n return label;\n }\n\n protected separator(name?: string): HTMLElement {\n const span = document.createElement(\"span\");\n if (name) {\n span.innerText = name;\n }\n span.prepend(document.createElement(\"br\"));\n span.append(document.createElement(\"br\"));\n return span;\n }\n\n}\n","import { MineRenderScene } from \"../renderer/MineRenderScene\";\nimport { Renderer } from \"../renderer/Renderer\";\n\nexport class SceneStatsDisplay {\n\n readonly statsContainer: HTMLDivElement;\n\n private readonly lines: StatLine[] = [];\n\n constructor(readonly renderer: Renderer) {\n this.statsContainer = document.createElement(\"div\");\n\n this.init();\n }\n\n protected init() {\n this.statsContainer.classList.add(\"minerender-stats\");\n\n setInterval(() => {\n for (let line of this.lines) {\n line.update();\n }\n }, 1000);\n }\n\n appendTo(el: HTMLElement) {\n el.append(this.statsContainer);\n }\n\n add(line?: StatLine) {\n if (typeof line !== \"undefined\") {\n this.lines.push(line);\n this.statsContainer.append(line.wrapper);\n }\n this.statsContainer.append(document.createElement(\"br\"));\n }\n\n\n\n}\n\nclass StatLine {\n\n readonly wrapper: HTMLSpanElement;\n readonly element: HTMLSpanElement;\n\n value: number = 0;\n\n constructor(readonly key: string, readonly shortName: string, readonly longName: string, readonly valueProvider: () => number) {\n this.wrapper = document.createElement(\"span\");\n this.wrapper.classList.add(\"minerender-stat-wrapper\");\n this.wrapper.title = longName;\n\n this.element = document.createElement(\"span\");\n this.element.classList.add(\"minerender-stat\");\n this.element.id = \"minerender-stat-\" + key;\n this.element.dataset[\"stat\"] = key;\n\n this.wrapper.append(shortName);\n this.wrapper.append(this.element);\n }\n\n update() {\n this.value = this.valueProvider();\n this.element.innerText = `${ this.value }`;\n }\n\n}\n","import { InstanceReference } from \"./InstanceReference\";\nimport { SceneObject } from \"../renderer/SceneObject\";\nimport { Maybe } from \"../util/util\";\nimport { prefix } from \"../util/log\";\n\nconst p = prefix(\"InstanceManager\");\n\nexport class InstanceManager {\n\n public readonly isInstanceManager: true = true;\n\n protected readonly instanceCache: { [key: string]: Promise<InstanceReference<SceneObject>>; } = {};\n\n constructor() {\n }\n\n public async get<T extends SceneObject>(key: string): Promise<Maybe<InstanceReference<T>>> {\n if (key in this.instanceCache) {\n console.debug(p, \"key in cache\", key)\n // create next instance of existing object\n return (await this.instanceCache[key]).nextInstance() as InstanceReference<T>;\n }\n return undefined;\n }\n\n public async getOrCreate<T extends SceneObject>(key: string, supplier: () => T | Promise<T>): Promise<InstanceReference<T>> {\n if (key in this.instanceCache) {\n return await (this.get<T>(key)) as InstanceReference<T>;\n }\n console.debug(p, \"key not in cache\", key)\n this.instanceCache[key] = new Promise<InstanceReference<SceneObject>>(async (resolve) => {\n const obj = await supplier();\n const instance = obj.nextInstance();\n // this.instanceCache[key] = Promise.resolve(instance);\n resolve(instance);\n })\n return await this.instanceCache[key] as InstanceReference<T>;\n }\n\n public reset() {\n for (let instanceCacheKey in this.instanceCache) {\n delete this.instanceCache[instanceCacheKey];\n }\n }\n\n\n}\n\nexport function isInstanceManager(obj: any): obj is InstanceManager {\n return (<InstanceManager>obj).isInstanceManager;\n}\n","import { InstanceReference } from \"./InstanceReference\";\nimport { MineRenderError } from \"../error/MineRenderError\";\nimport { Euler, Matrix4, Vector3 } from \"three\";\nimport { isInstancedMesh } from \"../util/three\";\nimport { SceneObject } from \"../renderer/SceneObject\";\n\nexport interface Instanceable {\n\n nextInstance(): InstanceReference<SceneObject>;\n\n getMatrixAt(index: number, matrix?: Matrix4): Matrix4;\n\n setMatrixAt(index: number, matrix: Matrix4): void;\n\n setPositionRotationScaleAt(index: number, position?: Vector3, rotation?: Euler, scale?: Vector3): void;\n\n setPositionAt(index: number, position: Vector3): void;\n\n getPositionAt(index: number, vector?: Vector3): Vector3;\n\n setRotationAt(index: number, rotation: Euler): void;\n\n getRotationAt(index: number, euler?: Euler): Euler;\n\n setScaleAt(index: number, scale: Vector3): void;\n\n getScaleAt(index: number, vector?: Vector3): Vector3;\n\n}\n\nexport function isInstanceable(obj: any): obj is Instanceable {\n return 'nextInstance' in obj;\n}\n","export enum DisplayPosition {\n THIRDPERSON_RIGHTHAND = \"thirdperson_righthand\",\n THIRDPERSON_LEFTHAND = \"thirdperson_lefthand\",\n FIRSTPERSON_RIGHTHAND = \"firstperson_righthand\",\n FIRSTPERSON_LEFTHAND = \"firstperson_lefthand\",\n GUI = \"gui\",\n HEAD = \"head\",\n GROUND = \"ground\",\n FIXED = \"fixed\",\n}\n\nexport const DISPLAY_POSITIONS = Object.values(DisplayPosition);\n","export enum GuiLight {\n FRONT=\"front\",\n SIDE=\"side\"\n}\n","import { ModelElement } from \"./ModelElement\";\nimport { DisplayPosition } from \"./DisplayPosition\";\nimport { GuiLight } from \"./GuiLight\";\nimport { MinecraftAsset } from \"../MinecraftAsset\";\nimport { ImageInfo } from \"../image/ImageLoader\";\n\nexport const ITEM_GENERATED = \"item/generated\";\nexport const BUILTIN_GENERATED = \"builtin/generated\";\nexport const BUILTIN_ENTITY = \"builtin/entity\";\n\nexport const DEFAULT_ELEMENTS: ModelElement[] = []\n\nexport interface Model extends MinecraftAsset {\n textures?: IModelTextures;\n parent?: string;\n display?: ModelDisplay;\n elements?: ModelElement[];\n hierarchy?: string[];\n}\n\nexport interface BlockModel extends Model {\n textures?: BlockModelTextures;\n ambientocclusion?: boolean;\n}\n\nexport interface ItemModel extends Model {\n textures?: ItemModelTextures;\n gui_light?: GuiLight;\n}\n\nexport interface TextureAsset extends MinecraftAsset, ImageInfo {\n}\n\nexport interface ModelDisplay {\n position?: DisplayPosition;\n translation?: TripleArray;\n rotation?: TripleArray;\n scale?: TripleArray;\n}\n\nexport interface IModelTextures {\n [variable: string]: string;\n}\n\nexport interface BlockModelTextures extends IModelTextures {\n particle: string;\n}\n\nexport interface ItemModelTextures extends BlockModelTextures {\n /*layerN: number*/\n}\n\nexport type DoubleArray<T = number> = [T, T];\nexport type TripleArray<T = number> = [T, T, T];\nexport type QuadArray<T = number> = [T, T, T, T];\n\nexport function isDoubleArray(obj: any): obj is DoubleArray {\n return Array.isArray(obj) && obj.length === 2;\n}\n\nexport function isTripleArray(obj: any): obj is TripleArray {\n return Array.isArray(obj) && obj.length === 3;\n}\n\nexport function isQuadArray(obj: any): obj is QuadArray {\n return Array.isArray(obj) && obj.length === 4;\n}\n","import { SceneObject } from \"../../renderer/SceneObject\";\nimport { Model, TextureAsset } from \"../Model\";\nimport { Materials } from \"../../Materials\";\nimport { Maybe, toRadians } from \"../../util/util\";\nimport { UVMapper } from \"../../UVMapper\";\nimport { TextureAtlas } from \"../../texture/TextureAtlas\";\nimport { BoxGeometry, BoxHelper, BufferAttribute, EdgesGeometry, InstancedMesh, LineBasicMaterial, LineSegments, Material, Matrix4, Mesh, MeshBasicMaterial, MeshStandardMaterial, ShaderMaterial } from \"three\";\nimport { mergeBufferGeometries } from \"../../three/BufferGeometryUtils\";\nimport { SceneObjectOptions } from \"../../renderer/SceneObjectOptions\";\nimport { addBox3WireframeToObject, addWireframeToMesh, addWireframeToObject, applyElementRotation } from \"../../util/model\";\nimport { Ticker } from \"../../Ticker\";\nimport merge from \"ts-deepmerge\";\nimport { BufferGeometry } from \"three/src/core/BufferGeometry\";\nimport { BlockObject } from \"../block/scene/BlockObject\";\nimport { prefix } from \"../../util/log\";\n\n\nconst p = prefix(\"ModelObject\");\n\n//TODO: might want to abstract this out into a generic model, and create a separate class for Block models\nexport class ModelObject extends SceneObject {\n\n public readonly isModelObject: true = true;\n\n public static readonly DEFAULT_OPTIONS: ModelObjectOptions = merge({}, SceneObject.DEFAULT_OPTIONS, <ModelObjectOptions>{});\n public readonly options: ModelObjectOptions;\n\n private atlas?: TextureAtlas;\n\n public blockParent: Maybe<BlockObject>;\n\n private meshesCreated: boolean = false;\n\n constructor(readonly originalModel: Model, options?: Partial<ModelObjectOptions>) {\n super(options);\n this.options = merge({}, ModelObject.DEFAULT_OPTIONS, options ?? {});\n console.log(\"ModelObject options\", this.options);\n }\n\n async init(): Promise<void> {\n // load textures first so we have the updated UV coordinates from the atlas\n await this.loadTextures();\n\n this.createMeshes();\n this.applyTextures();\n }\n\n dispose() {\n super.dispose();\n this.atlas?.dispose();\n }\n\n public get textureAtlas(): Maybe<TextureAtlas> {\n return this.atlas;\n }\n\n //TODO: support for replacing textures\n\n protected async loadTextures(): Promise<void> {\n this.atlas = await UVMapper.getAtlas(this.originalModel);\n }\n\n\n protected createMeshes(force: boolean = false) {\n if (this.meshesCreated && !force) return;\n\n const mat = Materials.MISSING_TEXTURE;\n\n let allGeos: BufferGeometry[] = [];\n\n if (this.atlas) {\n if (this.atlas.model.elements) {\n this.atlas.model.elements?.forEach(el => {\n const elGeo = this._getBoxGeometryFromElement(el).clone();\n\n // elGeo.applyMatrix4(new THREE.Matrix4().makeTranslation(-8,-8,-8));\n\n\n elGeo.applyMatrix4(new Matrix4().makeTranslation((el.to[0] - el.from[0]) / 2, (el.to[1] - el.from[1]) / 2, (el.to[2] - el.from[2]) / 2));\n elGeo.applyMatrix4(new Matrix4().makeTranslation(el.from[0], el.from[1], el.from[2]));\n\n if (el.rotation) {\n applyElementRotation(el.rotation, elGeo);\n }\n\n\n elGeo.applyMatrix4(new Matrix4().makeTranslation(-8, -8, -8));\n\n if (this.options.mergeMeshes) {\n allGeos.push(elGeo);\n } else {\n const mesh = this.createAndAddMesh(undefined, undefined, elGeo, mat);\n if (this.options.wireframe) {\n addWireframeToMesh(elGeo, mesh);\n }\n }\n });\n } else {\n console.debug(p, this.atlas.model, \"has no elements\")\n }\n } else {\n console.debug(p, \"Missing atlas for\", this);\n }\n\n if (this.options.mergeMeshes) {\n let combinedGeo: BufferGeometry;\n if (allGeos.length > 0) {\n // if (this.options.wireframe) {\n // allGeos.push(new BoxGeometry(16, 16, 16, 1, 1, 1))\n // }\n\n combinedGeo = mergeBufferGeometries(allGeos);\n } else {\n combinedGeo = new BoxGeometry(16, 16, 16);\n }\n combinedGeo.computeBoundingBox();\n // combinedGeo.translate(-8, -8, -8);\n // TODO: cache the combined geometry\n let mesh: Mesh;\n if (this.options.instanceMeshes) {\n mesh = this.createInstancedMesh(undefined, combinedGeo, mat, this.options.maxInstanceCount || 50);\n this.add(mesh);\n this._isInstanced = true;\n //TODO\n } else {\n mesh = this.createAndAddMesh(undefined, undefined, combinedGeo, mat)\n }\n if (this.options.wireframe) {\n addWireframeToMesh(combinedGeo, mesh, 0x0000ff, 4);\n addBox3WireframeToObject(combinedGeo.boundingBox!, mesh, 0x00ffff, 3);\n }\n }\n\n if (this.options.wireframe) {\n addWireframeToObject(this, 0x00ff00, 3)\n }\n\n this.meshesCreated = true;\n }\n\n\n protected applyTextures() {\n // if (this.atlas!.model.textures) {\n // for (let textureKey in this.atlas!.model.textures) {\n // let asset = this.textureMap[textureKey];\n // if (asset) {\n //TODO: transparency\n if (this.atlas) {\n let mat = Materials.createShadedCanvasMaterial(this.atlas.image!.canvas! as HTMLCanvasElement, this.atlas.hasTransparency, false/*TODO: get this from render options*/);\n this.iterateAllMeshes(mesh => {\n mesh.material = mat;\n });\n\n //TODO: move this somewhere else\n //TODO: this seems to be ticking way too fast atm\n if (this.atlas.hasAnimation) {\n if (typeof this.atlas.ticker === \"undefined\") { //TODO: fix missing texture update for reused atlas\n this.atlas.ticker = Ticker.add(() => {\n for (let key in this.atlas!.animatorFunctions) {\n this.atlas!.animatorFunctions[key]();\n }\n Materials.needsUpdate(mat);\n });\n }\n }\n }\n // }\n // }\n // }\n }\n\n\n}\n\nexport interface ModelObjectOptions extends SceneObjectOptions {\n\n}\n\nexport function isModelObject(obj: any): obj is ModelObject {\n return (<ModelObject>obj).isModelObject;\n}\n","/// https://github.com/mrdoob/three.js/blob/dev/examples/jsm/utils/BufferGeometryUtils.js\n\nimport {\n BufferAttribute,\n BufferGeometry,\n Float32BufferAttribute,\n InterleavedBuffer,\n InterleavedBufferAttribute,\n TriangleFanDrawMode,\n TriangleStripDrawMode,\n TrianglesDrawMode,\n Vector3\n} from 'three';\n\n\nfunction computeTangents(geometry) {\n\n geometry.computeTangents();\n console.warn('THREE.BufferGeometryUtils: .computeTangents() has been removed. Use BufferGeometry.computeTangents() instead.');\n\n}\n\n/**\n * @param {Array<BufferGeometry>} geometries\n * @param {Boolean} useGroups\n * @return {BufferGeometry}\n */\nfunction mergeBufferGeometries(geometries, useGroups = false) {\n\n const isIndexed = geometries[0].index !== null;\n\n const attributesUsed = new Set(Object.keys(geometries[0].attributes));\n const morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes));\n\n const attributes = {};\n const morphAttributes = {};\n\n const morphTargetsRelative = geometries[0].morphTargetsRelative;\n\n const mergedGeometry = new BufferGeometry();\n\n let offset = 0;\n\n for (let i = 0; i < geometries.length; ++i) {\n\n const geometry = geometries[i];\n let attributesCount = 0;\n\n // ensure that all geometries are indexed, or none\n\n if (isIndexed !== (geometry.index !== null)) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.');\n return null;\n\n }\n\n // gather attributes, exit early if they're different\n\n for (const name in geometry.attributes) {\n\n if (!attributesUsed.has(name)) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.');\n return null;\n\n }\n\n if (attributes[name] === undefined) attributes[name] = [];\n\n attributes[name].push(geometry.attributes[name]);\n\n attributesCount++;\n\n }\n\n // ensure geometries have the same number of attributes\n\n if (attributesCount !== attributesUsed.size) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.');\n return null;\n\n }\n\n // gather morph attributes, exit early if they're different\n\n if (morphTargetsRelative !== geometry.morphTargetsRelative) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.');\n return null;\n\n }\n\n for (const name in geometry.morphAttributes) {\n\n if (!morphAttributesUsed.has(name)) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. .morphAttributes must be consistent throughout all geometries.');\n return null;\n\n }\n\n if (morphAttributes[name] === undefined) morphAttributes[name] = [];\n\n morphAttributes[name].push(geometry.morphAttributes[name]);\n\n }\n\n // gather .userData\n\n mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];\n mergedGeometry.userData.mergedUserData.push(geometry.userData);\n\n if (useGroups) {\n\n let count;\n\n if (isIndexed) {\n\n count = geometry.index.count;\n\n } else if (geometry.attributes.position !== undefined) {\n\n count = geometry.attributes.position.count;\n\n } else {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute');\n return null;\n\n }\n\n mergedGeometry.addGroup(offset, count, i);\n\n offset += count;\n\n }\n\n }\n\n // merge indices\n\n if (isIndexed) {\n\n let indexOffset = 0;\n const mergedIndex = [];\n\n for (let i = 0; i < geometries.length; ++i) {\n\n const index = geometries[i].index;\n\n for (let j = 0; j < index.count; ++j) {\n\n mergedIndex.push(index.getX(j) + indexOffset);\n\n }\n\n indexOffset += geometries[i].attributes.position.count;\n\n }\n\n mergedGeometry.setIndex(mergedIndex);\n\n }\n\n // merge attributes\n\n for (const name in attributes) {\n\n const mergedAttribute = mergeBufferAttributes(attributes[name]);\n\n if (!mergedAttribute) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the ' + name + ' attribute.');\n return null;\n\n }\n\n mergedGeometry.setAttribute(name, mergedAttribute);\n\n }\n\n // merge morph attributes\n\n for (const name in morphAttributes) {\n\n const numMorphTargets = morphAttributes[name][0].length;\n\n if (numMorphTargets === 0) break;\n\n mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n mergedGeometry.morphAttributes[name] = [];\n\n for (let i = 0; i < numMorphTargets; ++i) {\n\n const morphAttributesToMerge = [];\n\n for (let j = 0; j < morphAttributes[name].length; ++j) {\n\n morphAttributesToMerge.push(morphAttributes[name][j][i]);\n\n }\n\n const mergedMorphAttribute = mergeBufferAttributes(morphAttributesToMerge);\n\n if (!mergedMorphAttribute) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the ' + name + ' morphAttribute.');\n return null;\n\n }\n\n mergedGeometry.morphAttributes[name].push(mergedMorphAttribute);\n\n }\n\n }\n\n return mergedGeometry;\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {BufferAttribute}\n */\nfunction mergeBufferAttributes(attributes) {\n\n let TypedArray;\n let itemSize;\n let normalized;\n let arrayLength = 0;\n\n for (let i = 0; i < attributes.length; ++i) {\n\n const attribute = attributes[i];\n\n if (attribute.isInterleavedBufferAttribute) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. InterleavedBufferAttributes are not supported.');\n return null;\n\n }\n\n if (TypedArray === undefined) TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.');\n return null;\n\n }\n\n if (itemSize === undefined) itemSize = attribute.itemSize;\n if (itemSize !== attribute.itemSize) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.');\n return null;\n\n }\n\n if (normalized === undefined) normalized = attribute.normalized;\n if (normalized !== attribute.normalized) {\n\n console.error('THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.');\n return null;\n\n }\n\n arrayLength += attribute.array.length;\n\n }\n\n const array = new TypedArray(arrayLength);\n let offset = 0;\n\n for (let i = 0; i < attributes.length; ++i) {\n\n array.set(attributes[i].array, offset);\n\n offset += attributes[i].array.length;\n\n }\n\n return new BufferAttribute(array, itemSize, normalized);\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {Array<InterleavedBufferAttribute>}\n */\nfunction interleaveAttributes(attributes) {\n\n // Interleaves the provided attributes into an InterleavedBuffer and returns\n // a set of InterleavedBufferAttributes for each attribute\n let TypedArray;\n let arrayLength = 0;\n let stride = 0;\n\n // calculate the the length and type of the interleavedBuffer\n for (let i = 0, l = attributes.length; i < l; ++i) {\n\n const attribute = attributes[i];\n\n if (TypedArray === undefined) TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n\n console.error('AttributeBuffers of different types cannot be interleaved');\n return null;\n\n }\n\n arrayLength += attribute.array.length;\n stride += attribute.itemSize;\n\n }\n\n // Create the set of buffer attributes\n const interleavedBuffer = new InterleavedBuffer(new TypedArray(arrayLength), stride);\n let offset = 0;\n const res = [];\n const getters = ['getX', 'getY', 'getZ', 'getW'];\n const setters = ['setX', 'setY', 'setZ', 'setW'];\n\n for (let j = 0, l = attributes.length; j < l; j++) {\n\n const attribute = attributes[j];\n const itemSize = attribute.itemSize;\n const count = attribute.count;\n const iba = new InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, attribute.normalized);\n res.push(iba);\n\n offset += itemSize;\n\n // Move the data for each attribute into the new interleavedBuffer\n // at the appropriate offset\n for (let c = 0; c < count; c++) {\n\n for (let k = 0; k < itemSize; k++) {\n\n iba[setters[k]](c, attribute[getters[k]](c));\n\n }\n\n }\n\n }\n\n return res;\n\n}\n\n/**\n * @param {Array<BufferGeometry>} geometry\n * @return {number}\n */\nfunction estimateBytesUsed(geometry) {\n\n // Return the estimated memory used by this geometry in bytes\n // Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n // for InterleavedBufferAttributes.\n let mem = 0;\n for (const name in geometry.attributes) {\n\n const attr = geometry.getAttribute(name);\n mem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n }\n\n const indices = geometry.getIndex();\n mem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n return mem;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} tolerance\n * @return {BufferGeometry>}\n */\nfunction mergeVertices(geometry, tolerance = 1e-4) {\n\n tolerance = Math.max(tolerance, Number.EPSILON);\n\n // Generate an index buffer if the geometry doesn't have one, or optimize it\n // if it's already available.\n const hashToIndex = {};\n const indices = geometry.getIndex();\n const positions = geometry.getAttribute('position');\n const vertexCount = indices ? indices.count : positions.count;\n\n // next value for triangle indices\n let nextIndex = 0;\n\n // attributes and new attribute arrays\n const attributeNames = Object.keys(geometry.attributes);\n const attrArrays = {};\n const morphAttrsArrays = {};\n const newIndices = [];\n const getters = ['getX', 'getY', 'getZ', 'getW'];\n\n // initialize the arrays\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n\n const name = attributeNames[i];\n\n attrArrays[name] = [];\n\n const morphAttr = geometry.morphAttributes[name];\n if (morphAttr) {\n\n morphAttrsArrays[name] = new Array(morphAttr.length).fill().map(() => []);\n\n }\n\n }\n\n // convert the error tolerance to an amount of decimal places to truncate to\n const decimalShift = Math.log10(1 / tolerance);\n const shiftMultiplier = Math.pow(10, decimalShift);\n for (let i = 0; i < vertexCount; i++) {\n\n const index = indices ? indices.getX(i) : i;\n\n // Generate a hash for the vertex attributes at the current index 'i'\n let hash = '';\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const itemSize = attribute.itemSize;\n\n for (let k = 0; k < itemSize; k++) {\n\n // double tilde truncates the decimal value\n hash += `${ ~~(attribute[getters[k]](index) * shiftMultiplier) },`;\n\n }\n\n }\n\n // Add another reference to the vertex if it's already\n // used by another index\n if (hash in hashToIndex) {\n\n newIndices.push(hashToIndex[hash]);\n\n } else {\n\n // copy data to the new index in the attribute arrays\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const morphAttr = geometry.morphAttributes[name];\n const itemSize = attribute.itemSize;\n const newarray = attrArrays[name];\n const newMorphArrays = morphAttrsArrays[name];\n\n for (let k = 0; k < itemSize; k++) {\n\n const getterFunc = getters[k];\n newarray.push(attribute[getterFunc](index));\n\n if (morphAttr) {\n\n for (let m = 0, ml = morphAttr.length; m < ml; m++) {\n\n newMorphArrays[m].push(morphAttr[m][getterFunc](index));\n\n }\n\n }\n\n }\n\n }\n\n hashToIndex[hash] = nextIndex;\n newIndices.push(nextIndex);\n nextIndex++;\n\n }\n\n }\n\n // Generate typed arrays from new attribute arrays and update\n // the attributeBuffers\n const result = geometry.clone();\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n\n const name = attributeNames[i];\n const oldAttribute = geometry.getAttribute(name);\n\n const buffer = new oldAttribute.array.constructor(attrArrays[name]);\n const attribute = new BufferAttribute(buffer, oldAttribute.itemSize, oldAttribute.normalized);\n\n result.setAttribute(name, attribute);\n\n // Update the attribute arrays\n if (name in morphAttrsArrays) {\n\n for (let j = 0; j < morphAttrsArrays[name].length; j++) {\n\n const oldMorphAttribute = geometry.morphAttributes[name][j];\n\n const buffer = new oldMorphAttribute.array.constructor(morphAttrsArrays[name][j]);\n const morphAttribute = new BufferAttribute(buffer, oldMorphAttribute.itemSize, oldMorphAttribute.normalized);\n result.morphAttributes[name][j] = morphAttribute;\n\n }\n\n }\n\n }\n\n // indices\n\n result.setIndex(newIndices);\n\n return result;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} drawMode\n * @return {BufferGeometry>}\n */\nfunction toTrianglesDrawMode(geometry, drawMode) {\n\n if (drawMode === TrianglesDrawMode) {\n\n console.warn('THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.');\n return geometry;\n\n }\n\n if (drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode) {\n\n let index = geometry.getIndex();\n\n // generate index if not present\n\n if (index === null) {\n\n const indices = [];\n\n const position = geometry.getAttribute('position');\n\n if (position !== undefined) {\n\n for (let i = 0; i < position.count; i++) {\n\n indices.push(i);\n\n }\n\n geometry.setIndex(indices);\n index = geometry.getIndex();\n\n } else {\n\n console.error('THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.');\n return geometry;\n\n }\n\n }\n\n //\n\n const numberOfTriangles = index.count - 2;\n const newIndices = [];\n\n if (drawMode === TriangleFanDrawMode) {\n\n // gl.TRIANGLE_FAN\n\n for (let i = 1; i <= numberOfTriangles; i++) {\n\n newIndices.push(index.getX(0));\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n\n }\n\n } else {\n\n // gl.TRIANGLE_STRIP\n\n for (let i = 0; i < numberOfTriangles; i++) {\n\n if (i % 2 === 0) {\n\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i + 2));\n\n } else {\n\n newIndices.push(index.getX(i + 2));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i));\n\n }\n\n }\n\n }\n\n if ((newIndices.length / 3) !== numberOfTriangles) {\n\n console.error('THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.');\n\n }\n\n // build final geometry\n\n const newGeometry = geometry.clone();\n newGeometry.setIndex(newIndices);\n newGeometry.clearGroups();\n\n return newGeometry;\n\n } else {\n\n console.error('THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode);\n return geometry;\n\n }\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n * Helpful for Raytracing or Decals.\n * @param {Mesh | Line | Points} object An instance of Mesh, Line or Points.\n * @return {Object} An Object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes(object) {\n\n if (object.geometry.isBufferGeometry !== true) {\n\n console.error('THREE.BufferGeometryUtils: Geometry is not of type BufferGeometry.');\n return null;\n\n }\n\n const _vA = new Vector3();\n const _vB = new Vector3();\n const _vC = new Vector3();\n\n const _tempA = new Vector3();\n const _tempB = new Vector3();\n const _tempC = new Vector3();\n\n const _morphA = new Vector3();\n const _morphB = new Vector3();\n const _morphC = new Vector3();\n\n function _calculateMorphedAttributeData(\n object,\n material,\n attribute,\n morphAttribute,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedAttributeArray\n ) {\n\n _vA.fromBufferAttribute(attribute, a);\n _vB.fromBufferAttribute(attribute, b);\n _vC.fromBufferAttribute(attribute, c);\n\n const morphInfluences = object.morphTargetInfluences;\n\n if (material.morphTargets && morphAttribute && morphInfluences) {\n\n _morphA.set(0, 0, 0);\n _morphB.set(0, 0, 0);\n _morphC.set(0, 0, 0);\n\n for (let i = 0, il = morphAttribute.length; i < il; i++) {\n\n const influence = morphInfluences[i];\n const morph = morphAttribute[i];\n\n if (influence === 0) continue;\n\n _tempA.fromBufferAttribute(morph, a);\n _tempB.fromBufferAttribute(morph, b);\n _tempC.fromBufferAttribute(morph, c);\n\n if (morphTargetsRelative) {\n\n _morphA.addScaledVector(_tempA, influence);\n _morphB.addScaledVector(_tempB, influence);\n _morphC.addScaledVector(_tempC, influence);\n\n } else {\n\n _morphA.addScaledVector(_tempA.sub(_vA), influence);\n _morphB.addScaledVector(_tempB.sub(_vB), influence);\n _morphC.addScaledVector(_tempC.sub(_vC), influence);\n\n }\n\n }\n\n _vA.add(_morphA);\n _vB.add(_morphB);\n _vC.add(_morphC);\n\n }\n\n if (object.isSkinnedMesh) {\n\n object.boneTransform(a, _vA);\n object.boneTransform(b, _vB);\n object.boneTransform(c, _vC);\n\n }\n\n modifiedAttributeArray[a * 3 + 0] = _vA.x;\n modifiedAttributeArray[a * 3 + 1] = _vA.y;\n modifiedAttributeArray[a * 3 + 2] = _vA.z;\n modifiedAttributeArray[b * 3 + 0] = _vB.x;\n modifiedAttributeArray[b * 3 + 1] = _vB.y;\n modifiedAttributeArray[b * 3 + 2] = _vB.z;\n modifiedAttributeArray[c * 3 + 0] = _vC.x;\n modifiedAttributeArray[c * 3 + 1] = _vC.y;\n modifiedAttributeArray[c * 3 + 2] = _vC.z;\n\n }\n\n const geometry = object.geometry;\n const material = object.material;\n\n let a, b, c;\n const index = geometry.index;\n const positionAttribute = geometry.attributes.position;\n const morphPosition = geometry.morphAttributes.position;\n const morphTargetsRelative = geometry.morphTargetsRelative;\n const normalAttribute = geometry.attributes.normal;\n const morphNormal = geometry.morphAttributes.position;\n\n const groups = geometry.groups;\n const drawRange = geometry.drawRange;\n let i, j, il, jl;\n let group, groupMaterial;\n let start, end;\n\n const modifiedPosition = new Float32Array(positionAttribute.count * positionAttribute.itemSize);\n const modifiedNormal = new Float32Array(normalAttribute.count * normalAttribute.itemSize);\n\n if (index !== null) {\n\n // indexed buffer geometry\n\n if (Array.isArray(material)) {\n\n for (i = 0, il = groups.length; i < il; i++) {\n\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n\n start = Math.max(group.start, drawRange.start);\n end = Math.min((group.start + group.count), (drawRange.start + drawRange.count));\n\n for (j = start, jl = end; j < jl; j += 3) {\n\n a = index.getX(j);\n b = index.getX(j + 1);\n c = index.getX(j + 2);\n\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a, b, c,\n modifiedPosition\n );\n\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a, b, c,\n modifiedNormal\n );\n\n }\n\n }\n\n } else {\n\n start = Math.max(0, drawRange.start);\n end = Math.min(index.count, (drawRange.start + drawRange.count));\n\n for (i = start, il = end; i < il; i += 3) {\n\n a = index.getX(i);\n b = index.getX(i + 1);\n c = index.getX(i + 2);\n\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a, b, c,\n modifiedPosition\n );\n\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a, b, c,\n modifiedNormal\n );\n\n }\n\n }\n\n } else if (positionAttribute !== undefined) {\n\n // non-indexed buffer geometry\n\n if (Array.isArray(material)) {\n\n for (i = 0, il = groups.length; i < il; i++) {\n\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n\n start = Math.max(group.start, drawRange.start);\n end = Math.min((group.start + group.count), (drawRange.start + drawRange.count));\n\n for (j = start, jl = end; j < jl; j += 3) {\n\n a = j;\n b = j + 1;\n c = j + 2;\n\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a, b, c,\n modifiedPosition\n );\n\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a, b, c,\n modifiedNormal\n );\n\n }\n\n }\n\n } else {\n\n start = Math.max(0, drawRange.start);\n end = Math.min(positionAttribute.count, (drawRange.start + drawRange.count));\n\n for (i = start, il = end; i < il; i += 3) {\n\n a = i;\n b = i + 1;\n c = i + 2;\n\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a, b, c,\n modifiedPosition\n );\n\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a, b, c,\n modifiedNormal\n );\n\n }\n\n }\n\n }\n\n const morphedPositionAttribute = new Float32BufferAttribute(modifiedPosition, 3);\n const morphedNormalAttribute = new Float32BufferAttribute(modifiedNormal, 3);\n\n return {\n\n positionAttribute: positionAttribute,\n normalAttribute: normalAttribute,\n morphedPositionAttribute: morphedPositionAttribute,\n morphedNormalAttribute: morphedNormalAttribute\n\n };\n\n}\n\n\nexport {\n computeTangents,\n mergeBufferGeometries,\n mergeBufferAttributes,\n interleaveAttributes,\n estimateBytesUsed,\n mergeVertices,\n toTrianglesDrawMode,\n computeMorphedAttributes,\n};\n","import { SceneObject } from \"../../../renderer/SceneObject\";\nimport { BlockState, BlockStateVariant, BlockStateVariants, MultipartCondition } from \"../BlockState\";\nimport { SceneObjectOptions } from \"../../../renderer/SceneObjectOptions\";\nimport { isModelObject, ModelObject, ModelObjectOptions } from \"../../scene/ModelObject\";\nimport { Caching } from \"../../../cache/Caching\";\nimport { Models } from \"../../../assets/Models\";\nimport merge from \"ts-deepmerge\";\nimport { Euler, Matrix4, Vector3 } from \"three\";\nimport { clampRotationDegrees, Maybe, toRadians } from \"../../../util/util\";\nimport { MineRenderError } from \"../../../error/MineRenderError\";\nimport { BlockStateProperties, BlockStatePropertyDefaults } from \"../BlockStateProperties\";\nimport { BlockStates } from \"../../../assets/BlockStates\";\nimport { InstanceReference, isInstanceReference } from \"../../../instance/InstanceReference\";\nimport { AssetKey } from \"../../../assets/AssetKey\";\nimport { prefix } from \"../../../util/log\";\n\nconst p = prefix(\"BlockObject\");\n\nexport class BlockObject extends SceneObject {\n\n public readonly isBlockObject: true = true;\n\n public static readonly DEFAULT_OPTIONS: BlockObjectOptions = merge({}, ModelObject.DEFAULT_OPTIONS, <BlockObjectOptions>{\n applyDefaultState: true\n });\n public readonly options: BlockObjectOptions;\n\n private _previousState: BlockStateProperties = {};\n private _state: BlockStateProperties = {};\n private _variant: Maybe<BlockStateVariant> = undefined;\n\n private _instanceState: BlockStateProperties[] = [];\n private _instanceVariant: BlockStateVariant[][] = [];\n private _instanceModel: (ModelObject | InstanceReference<ModelObject>)[] = [];\n\n private _variants: BlockStateVariant[] = [];\n private _models: (ModelObject | InstanceReference<ModelObject>)[] = [];\n\n constructor(readonly blockState: BlockState, options?: Partial<BlockObjectOptions>) {\n super(options);\n this.options = merge({}, BlockObject.DEFAULT_OPTIONS, options ?? {});\n //TODO\n }\n\n async init(): Promise<void> {\n if (this.options.applyDefaultState) {\n const defaultState = this.blockState.key ? BlockStates.getDefaultState(this.blockState.key) : undefined;\n if (defaultState && Object.keys(defaultState).length > 0) { // use defined state\n const state = {};\n for (let k in defaultState) {\n state[k] = defaultState[k].default;\n }\n await this.setState(state);\n } else { // fallback to guessing from blockState definition\n if (this.blockState.variants) {\n await this.setState(Object.keys(this.blockState.variants)[0]);\n } else if (this.blockState.multipart) {\n for (let part of this.blockState.multipart) {\n if (part.when && !(\"OR\" in part.when)) {\n const k = Object.keys(part.when)[0];\n if (k) {\n await this.setState(k, part.when[k].split(\"|\")[0]);\n break;\n }\n }\n }\n }\n }\n } else {\n await this.recreateModels();\n }\n //TODO\n }\n\n dispose() {\n super.dispose();\n }\n\n removeFromScene() {\n for (let model of this._models) {\n if (isModelObject(model)) {\n model.removeFromScene();\n } else if (isInstanceReference(model)) {\n model.setScale(new Vector3(0, 0, 0));\n }\n }\n super.removeFromScene();\n }\n\n public get state(): { [key: string]: string; } {\n return this._state;\n }\n\n nextInstance(): InstanceReference<SceneObject> {\n\n const ref = super.nextInstance();\n for (let child of this.children) {\n if (isModelObject(child)) {\n child._instanceCounter = this.instanceCounter;\n }\n }\n return ref;\n }\n\n protected async mapStateToVariant(state: BlockStateProperties): Promise<BlockStateVariant[]> {\n const out: BlockStateVariant[] = [];\n if (this.blockState.variants) {\n if (Object.keys(this.blockState.variants).length === 1 && \"\" in this.blockState.variants) { // default variant\n out.push(this.getSingleVariant(this.blockState.variants[\"\"]));\n } else {\n for (let variantKey in this.blockState.variants) {\n const split = variantKey.split(\",\");\n let matches = true;\n for (let s of split) {\n const [k, v] = s.split(\"=\");\n if (`${ state[k] }` !== `${ v }`) {\n matches = false;\n break;\n }\n }\n if (matches) {\n const variants = this.blockState.variants[variantKey];\n out.push(this.getSingleVariant(variants));\n }\n }\n }\n } else if (this.blockState.multipart) {\n for (let part of this.blockState.multipart) {\n if (!part.apply) {\n console.debug(p, \"Missing apply for blockState part\", part);\n continue;\n }\n if (!part.when) { // no condition -> always apply\n out.push(this.getSingleVariant(part.apply));\n } else {\n let matches = true;\n // TODO: apparently AND is a thing too (https://yeleha.co/31Jec6P)\n if (\"OR\" in part.when) {\n const or = part.when.OR as MultipartCondition[];\n let anyMatch = false;\n for (let o of or) {\n for (let k in o) {\n const split = o[k].split(\"|\");\n let m = false;\n for (let s of split) {\n if (`${ state[k] }` === `${ s }`) {\n m = true;\n break;\n }\n }\n if (m) {\n anyMatch = true;\n break;\n }\n }\n }\n if (!anyMatch) {\n matches = false;\n }\n } else {\n for (let k in part.when) {\n const split = part.when[k].split(\"|\");\n let m = false;\n for (let s of split) {\n if (`${ state[k] }` === `${ s }`) {\n m = true;\n break;\n }\n }\n if (!m) { // none of the possible values match\n matches = false;\n break;\n }\n }\n }\n if (matches) {\n const variants = part.apply;\n out.push(this.getSingleVariant(variants));\n }\n }\n }\n }\n\n return out;\n }\n\n public async recreateModels(): Promise<void> {\n //TODO: change this to create models once, and then modify rotations when updating the state\n\n // Copy current instance info\n const instanceInfo: Matrix4[] = [];\n if (this.isInstanced) {\n for (let i = 0; i < this.instanceCounter; i++) {\n instanceInfo[i] = this.getMatrixAt(i);\n }\n }\n\n // Remove all children\n // this.disposeAndRemoveAllChildren(); //TODO: just removes all children of all instances atm...\n\n // TODO: try to reuse models instead of just removing them and creating new ones\n for (let model of this._models) {\n if (isInstanceReference(model)) {\n model.setScale(new Vector3(0, 0, 0));//TODO\n } else {\n model.dispose();\n }\n }\n while (this._models.length > 0) {\n this._models.shift();\n }\n\n\n //TODO: might want to preload all possible states & cache their data\n //TODO: make sure to only instance stuff with different rotations together; i.e. not those with different multipart settings, or different models\n\n /*\n if (this.isInstanced) {\n //TODO: only map once per state\n for (let i = 0; i < this.instanceCounter; i++) {\n this._instanceVariant[i] = await this.mapStateToVariant(this._instanceState[i]);\n for (let variant of this._instanceVariant[i]) {\n this._instanceModel[i] = await this.createVariant(variant);\n }\n }\n //TODO: actually create\n //TODO: group by model\n this._isInstanced = true;\n } else {\n */\n const variantsToCreate = await this.mapStateToVariant(this.state);\n this._variants = variantsToCreate;\n for (let blockStateVariant of variantsToCreate) {\n this._models.push(await this.createVariant(blockStateVariant));\n }\n /*\n }\n\n */\n\n // console.log(instanceInfo);\n // // Re-apply instances\n // if (instanceInfo.length>0) {\n // for (let i = 0; i < instanceInfo.length; i++) {\n // this.setMatrixAt(i, instanceInfo[i]);\n // }\n // }\n }\n\n protected getSingleVariant(variants: BlockStateVariant | BlockStateVariant[]) {\n if (Array.isArray(variants)) {\n //TODO: randomizer option / weights\n return (<BlockStateVariant[]>variants)[0];\n } else {\n return variants as BlockStateVariant;\n }\n }\n\n // @deprecated\n protected async createAVariant(variants: BlockStateVariant | BlockStateVariant[], instanceInfo: Matrix4[]) {\n const variant = this.getSingleVariant(variants);\n await this.createVariant(variant);\n }\n\n protected async createVariant(variant: BlockStateVariant): Promise<ModelObject | InstanceReference<ModelObject>> {\n //TODO: uvlock\n //TODO: default state?\n const model = await Models.getMerged(AssetKey.parse(\"models\", variant.model!));\n const obj: ModelObject | InstanceReference<ModelObject> = await this.scene.addModel(model!, this.options);\n /*\n const obj = new ModelObject(model!, this.options);\n await obj.init();\n */\n if (isInstanceReference(obj) || (<ModelObject>obj).isInstanced) {\n this._isInstanced = true;\n this._instanceCounter = 1;//TODO: BlockObject itself isn't technically instanced, but needs the id for the get/setMatrix calls to work properly\n /*\n if (isInstanceReference(obj)) {\n this._instanceCounter = obj.index;\n } else {\n this._instanceCounter = (<ModelObject>obj).instanceCounter;\n }\n */\n }\n\n\n /*\n // Re-apply instance info as a base\n if (instanceInfo.length > 0) {\n for (let i = 0; i < instanceInfo.length; i++) {\n obj.setMatrixAt(i, instanceInfo[i]);\n }\n }\n */\n\n let rotation = new Euler(0, 0, 0);\n if (typeof variant.x !== \"undefined\") {\n // obj.rotation.x = toRadians(variant.x);\n // obj.rotation.set(obj.rotation.x + toRadians(variant.x), obj.rotation.y, obj.rotation.z);\n // for (let child of obj.children) {\n // // applyGenericRotation(Axis.X, variant.x, child);\n // child.rotation.x = toRadians(variant.x);\n // }\n // this.setRotationAt(0, new Euler(variant.x, 0, 0));\n rotation.x = toRadians(clampRotationDegrees(variant.x));\n }\n if (typeof variant.y !== \"undefined\") {\n // obj.rotation.y = toRadians(variant.y);\n // obj.rotation.set(obj.rotation.x, obj.rotation.y + toRadians(variant.y), obj.rotation.z);\n // for (let child of obj.children) {\n // // applyGenericRotation(Axis.Y, variant.y, child);\n // child.rotation.y = toRadians(variant.y);\n // }\n // this.setRotationAt(0, new Euler(0, variant.y, 0));\n // Y-Rotations are weird...\n if(typeof variant.x!==\"undefined\"){\n rotation.y = toRadians(clampRotationDegrees(variant.y));\n }else{\n rotation.y = toRadians(clampRotationDegrees(360-variant.y));\n }\n }\n // console.log(obj.isInstanced);\n obj.setRotation(rotation);\n setTimeout(() => {\n obj.setRotation(rotation)\n }, 150);//TODO\n console.log(obj)\n\n /*\n this.add(obj);\n\n if (this.options.wireframe) {\n addWireframeToObject(this, 0xff0000, 2)\n }\n */\n return obj;\n }\n\n public async resetState() {\n this._previousState = this._state;\n this._state = {};\n await this.recreateModels();\n }\n\n // TODO: support state per instance\n public async setState(string: string);\n public async setState(state: BlockStateProperties);\n public async setState(key: string, value: string);\n public async setState(stringOrKeyOrState: string | BlockStateProperties, value?: string) {\n this._setState(stringOrKeyOrState, value);\n await this.recreateModels();\n }\n\n protected _setState(stringOrKeyOrState: string | BlockStateProperties, value?: string): void {\n this._previousState = this._state;\n if (typeof value === \"undefined\") { // a=b,c=d,... or state object\n if (typeof stringOrKeyOrState === \"string\") {\n if (stringOrKeyOrState === \"\") return;\n const split = stringOrKeyOrState.split(\",\");\n for (let s of split) {\n let [k, v] = s.split(\"=\");\n this._setState(k, v);\n }\n } else if (typeof stringOrKeyOrState === \"object\") {\n for (let k in stringOrKeyOrState) {\n this._state[k] = stringOrKeyOrState[k];\n }\n }\n } else {\n this._state[stringOrKeyOrState as string] = value;\n }\n }\n\n /*\n public async setStateAt(index: number, string: string);\n public async setStateAt(index: number, state: BlockStateProperties);\n public async setStateAt(index: number, key: string, value: string);\n public async setStateAt(index: number, stringOrKeyOrState: string | BlockStateProperties, value?: string);\n public async setStateAt(index: number, stringOrKeyOrState: string | BlockStateProperties, value?: string) {\n this._setStateAt(index, stringOrKeyOrState, value);\n await this.recreateModels();\n }\n\n protected _setStateAt(index: number, stringOrKeyOrState: string | BlockStateProperties, value?: string): void {\n if (!this._instanceState[index]) this._instanceState[index] = {};\n if (typeof value === \"undefined\") { // a=b,c=d,... or state object\n if (typeof stringOrKeyOrState === \"string\") {\n if (stringOrKeyOrState === \"\") return;\n const split = stringOrKeyOrState.split(\",\");\n for (let s of split) {\n let [k, v] = s.split(\"=\");\n this._setStateAt(index, k, v);\n }\n } else if (typeof stringOrKeyOrState === \"object\") {\n for (let k in stringOrKeyOrState) {\n this._instanceState[index][k] = stringOrKeyOrState[k];\n }\n }\n } else {\n this._instanceState[index][stringOrKeyOrState as string] = value;\n }\n }\n\n _getStateAt(index: number): BlockStateProperties {\n return this._instanceState[index];\n }\n\n */\n\n setPositionRotationScaleAt(index: number, position?: Vector3, rotation?: Euler, scale?: Vector3) {\n super.setPositionRotationScaleAt(index, position, rotation, scale);\n }\n\n getMatrixAt(index: number, matrix: Matrix4 = new Matrix4()): Matrix4 {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n const child = this._models[0];\n if (child && isModelObject(child)) {\n child.getMatrixAt(index, matrix);\n } else if (child && isInstanceReference(child)) {\n child.getMatrix(matrix);\n }\n /*\n console.log(this.children)\n const child = this.children[0];\n if (child && isModelObject(child)) {\n if (!child.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n child.getMatrixAt(index, matrix);\n }\n return matrix;\n */\n // return super.getMatrixAt(0, matrix);\n return matrix;\n }\n\n setMatrixAt(index: number, matrix: Matrix4) {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n // const child = this._models[0];\n for(let child of this._models) {\n if (child && isModelObject(child)) {\n child.setMatrixAt(index, matrix);\n } else if (child && isInstanceReference(child)) {\n child.setMatrix(matrix);\n }\n }\n /*\n console.log(this.children)\n for (let child of this.children) {\n if (isModelObject(child)) {\n if (!child.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n child.setMatrixAt(index, matrix);\n }\n }\n */\n }\n\n setPosition(position: Vector3) {\n super.setPosition(position);\n for (let model of this._models) {\n model.setPosition(position);\n }\n }\n\n //TODO: should override rotation + scale methods\n\n //TODO\n\n}\n\nexport interface BlockObjectOptions extends ModelObjectOptions {\n applyDefaultState: boolean;\n}\n\nexport function isBlockObject(obj: any): obj is BlockObject {\n return (<BlockObject>obj).isBlockObject;\n}\n","import { MultiBlockStructure } from \"./MultiBlockStructure\";\n\nexport class SchematicParser {\n\n public static async parse(): Promise<MultiBlockStructure> {\n //TODO\n // @ts-ignore\n return Promise.resolve({ });\n }\n\n}\n","import { MultiBlockBlock, MultiBlockStructure } from \"./MultiBlockStructure\";\nimport { TripleArray } from \"../Model\";\nimport type { NBT } from \"prismarine-nbt\";\nimport { MineRenderError } from \"../../error/MineRenderError\";\nimport { BlockStateProperties } from \"../block/BlockStateProperties\";\n\nexport class StructureParser {\n\n public static async parse(_nbt: NBT, paletteIndex?: number): Promise<MultiBlockStructure> {\n const nbt = _nbt.value as unknown as StructureNBT;\n\n let palette: Palette;\n if (\"palette\" in nbt) {\n palette = nbt.palette!;\n } else if (\"palettes\" in nbt) {\n palette = nbt.palettes![paletteIndex ?? 0];\n } else {\n throw new MineRenderError(\"Structure does not have palette(s)\");\n }\n\n const blocks: MultiBlockBlock[] =\n nbt.blocks.value.value.map(block => {\n const state = palette.value.value[block.state.value];\n if (state.Name.value === \"minecraft:air\") return undefined;\n\n const props: BlockStateProperties = {};\n for (let k in state.Properties?.value) {\n props[k] = state.Properties.value[k].value;\n }\n return <MultiBlockBlock>{\n type: state.Name.value,\n properties: props,\n position: block.pos.value.value,\n nbt: block.nbt\n }\n }).filter(m => typeof m !== \"undefined\") as MultiBlockBlock[] ;\n return {\n blocks: blocks,\n size: nbt.size.value.value\n }\n }\n\n}\n\nexport interface StructureNBT {\n DataVersion: {\n type: \"int\";\n value: number;\n }\n size: {\n type: \"list\";\n value: {\n type: \"int\";\n value: TripleArray;\n }\n }\n palette?: Palette;\n palettes?: Palette[];\n blocks: {\n type: \"list\";\n value: {\n type: \"compound\";\n value: BlockEntry[];\n }\n }\n entities: {};//TODO\n}\n\ninterface Palette {\n type: \"list\";\n value: {\n type: \"compound\";\n value: PaletteEntry[]\n }\n}\n\ninterface PaletteEntry {\n Name: {\n type: \"string\";\n value: string;\n }\n Properties: {\n type: \"compound\";\n value: { [property: string]: PalettePropertyValue; };\n }\n}\n\ninterface PalettePropertyValue {\n type: string;\n value: string;\n}\n\ninterface BlockEntry {\n pos: {\n type: \"list\";\n value: {\n type: \"int\";\n value: TripleArray;\n }\n }\n state: {\n type: \"int\";\n value: number;\n }\n nbt: {\n type: \"compound\";\n value: any;\n }\n}\n","import { Event, Object3D, Scene } from \"three\";\nimport {isSceneObject, SceneObject} from \"./SceneObject\";\nimport merge from \"ts-deepmerge\";\nimport { Model } from \"../model/Model\";\nimport { ModelObject, ModelObjectOptions } from \"../model/scene/ModelObject\";\nimport { InstanceReference } from \"../instance/InstanceReference\";\nimport { SceneStats } from \"../SceneStats\";\nimport { SSAOPassOUTPUT } from \"three/examples/jsm/postprocessing/SSAOPass\";\nimport { BasicMinecraftAsset, MinecraftAsset } from \"../MinecraftAsset\";\nimport { SceneObjectOptions } from \"./SceneObjectOptions\";\nimport { BlockState } from \"../model/block/BlockState\";\nimport { BlockObject, BlockObjectOptions, isBlockObject } from \"../model/block/scene/BlockObject\";\nimport { InstanceManager } from \"../instance/InstanceManager\";\nimport { DeepPartial, sleep } from \"../util/util\";\nimport { SkinObject, SkinObjectOptions } from \"../skin/scene/SkinObject\";\nimport { EntityObject, EntityObjectOptions } from \"../entity/scene/EntityObject\";\nimport { EntityModel } from \"../entity/EntityModel\";\nimport { AssetKey, isAssetKey } from \"../assets/AssetKey\";\n\nexport class MineRenderScene extends Scene {\n\n public readonly isMineRenderScene: true = true;\n\n public static readonly DEFAULT_OPTIONS: MineRenderSceneOptions = merge({}, <MineRenderSceneOptions>{});\n public readonly options: MineRenderSceneOptions;\n\n readonly stats: SceneStats = new SceneStats();\n protected readonly instanceManager: InstanceManager = new InstanceManager();\n\n public dirty: boolean = true;\n\n private readonly observedObjects = new Set<Object3D>();\n private readonly onObjectChange = (event: Event) => {\n if (event.target?.parent === this) {\n this.dirty = true;\n }\n };\n\n constructor(options?: DeepPartial<MineRenderSceneOptions>) {\n super();\n this.options = merge({}, MineRenderScene.DEFAULT_OPTIONS, options ?? {});\n }\n\n add(...objects: Object3D[]): this {\n for (const object of objects) {\n this.dirty = true;\n try {\n super.add(object);\n } finally {\n // Added handlers may remove or reparent the object before add returns.\n if (object?.isObject3D && object !== this) {\n this.updateObjectRegistration(object, object.parent === this);\n }\n }\n }\n return this;\n }\n\n remove(...objects: Object3D[]): this {\n for (const object of objects) {\n if (!this.children.includes(object)) continue;\n this.dirty = true;\n this.updateObjectRegistration(object, false);\n try {\n super.remove(object);\n } finally {\n // Removed handlers may add the object back to this scene.\n this.updateObjectRegistration(object, object.parent === this);\n }\n }\n return this;\n }\n\n private updateObjectRegistration(object: Object3D, attached: boolean) {\n if (this.observedObjects.has(object) === attached) return;\n if (attached) {\n this.observedObjects.add(object);\n object.addEventListener('change', this.onObjectChange);\n } else {\n this.observedObjects.delete(object);\n object.removeEventListener('change', this.onObjectChange);\n }\n const change = attached ? 1 : -1;\n this.stats.objectCount += change;\n if (isSceneObject(object)) {\n this.stats.sceneObjectCount += change;\n }\n }\n\n public async initAndAdd(...object: SceneObject[]): Promise<this> {\n this.dirty = true;\n for (let obj of object) {\n await obj.init();\n }\n return this.add(...object);\n }\n\n async addSceneObject<A extends BasicMinecraftAsset, T extends SceneObject, O extends SceneObjectOptions>(asset: A, objectSupplier: () => T | Promise<T>, _options?: Partial<O>, parent: Object3D = this): Promise<T | InstanceReference<T>> {\n console.log(\"addSceneObject\", asset)\n console.log(\"parent\", parent)\n console.log(_options);\n this.dirty = true;\n // console.log(this.instanceManager)\n //TODO: we need a way to call objectSupplier in the instance supplier below\n // but we also need to get the options that have been merged with the defaults properly\n // so maybe to the option merging _somewhere_ else, not in the object constructor\n const obj = await objectSupplier();\n if (obj?.options?.instanceMeshes && asset.key && (<AssetKey>asset.key)?.assetType === \"models\"/*TODO*/) {\n console.log(\"instanceMeshes + key\")\n // check for existing instances\n const key = asset.key.serialize();\n return this.instanceManager.getOrCreate(key, async () => {\n // const obj = await objectSupplier();\n obj.scene = this;\n await obj.init();\n parent.add(obj);\n // await sleep(500)//TODO\n return obj;\n });\n } else {\n // const obj = await objectSupplier();\n console.log(\"!instanceMeshes | !key\")\n obj.scene = this;\n // await this.initAndAdd(obj);\n await obj.init();\n if (!isBlockObject(obj)) { //TODO: adding block objects slows things down (since each block has its own)\n parent.add(obj);\n }\n // await sleep(500)//TODO\n return obj;\n }\n }\n\n public async addModel(model: Model, options?: Partial<ModelObjectOptions>, parent: Object3D = this): Promise<ModelObject | InstanceReference<ModelObject>> {\n return this.addSceneObject<Model, ModelObject, ModelObjectOptions>(model, () => new ModelObject(model, options), options, parent);\n }\n\n public async addBlock(blockState: BlockState, options?: Partial<BlockObjectOptions>, parent: Object3D = this): Promise<BlockObject | InstanceReference<BlockObject>> {\n return this.addSceneObject<BlockState, BlockObject, BlockObjectOptions>(blockState, () => new BlockObject(blockState, options), options, parent);\n }\n\n public async addSkin(skin?: string, options?: Partial<SkinObjectOptions>, parent: Object3D = this): Promise<SkinObject> {\n this.dirty = true;\n const obj = new SkinObject(options);\n obj.scene = this;\n await obj.init();\n if (skin) {\n obj.setSkinTexture(skin);\n }\n parent.add(obj);\n return obj;\n }\n\n public async addEntity(entity: EntityModel, options?: Partial<EntityObjectOptions>, parent: Object3D = this): Promise<EntityObject | InstanceReference<EntityObject>> {\n return this.addSceneObject<EntityModel, EntityObject, BlockObjectOptions>(entity, () => new EntityObject(entity, options), options, parent);\n }\n\n}\n\nexport interface MineRenderSceneOptions {\n\n}\n\n\nexport function isMineRenderScene(obj: any): obj is MineRenderScene {\n return (<MineRenderScene>obj).isMineRenderScene;\n}\n","export enum SkinPart {\n HEAD = \"head\",\n BODY = \"body\",\n RIGHT_ARM = \"rightArm\",\n LEFT_ARM = \"leftArm\",\n RIGHT_LEG = \"rightLeg\",\n LEFT_LEG = \"leftLeg\",\n\n HAT = \"hat\",\n JACKET = \"jacket\",\n RIGHT_SLEEVE = \"rightSleeve\",\n LEFT_SLEEVE = \"leftSleeve\",\n RIGHT_TROUSERS = \"rightTrousers\",\n LEFT_TROUSERS = \"leftTrousers\",\n\n CAPE = \"cape\"\n}\n\nexport const SKIN_PARTS: SkinPart[] = Object.values(SkinPart);\n","import { SkinPart } from \"./SkinPart\";\nimport { ModelFaces } from \"../model/ModelElement\";\n\n\nexport type SkinTextureCoordinates = Record<SkinPart, ModelFaces>;\n\n// up and down UVs are weird\n// so they're flipped on X - u0 is u1, u1 is u0\n// up seems to also be flipped on Y - v0 is v1, v1 is v0\n\nconst baseSkinCoordinates: SkinTextureCoordinates = {\n head: {\n east: { // left\n uv: [\n 0,\n 8,\n 8,\n 16\n ]\n },\n west: { // right\n uv: [\n 16,\n 8,\n 24,\n 16\n ]\n },\n north: { // front\n uv: [\n 8,\n 8,\n 16,\n 16\n ]\n },\n south: { // back\n uv: [\n 24,\n 8,\n 32,\n 16\n ]\n },\n up: { // top\n uv: [\n 16,\n 8,\n 8,\n 0\n ]\n },\n down: { // bottom\n uv: [\n 24,\n 0,\n 16,\n 8\n ]\n }\n },\n body: {\n east: {\n uv: [\n 16,\n 20,\n 20,\n 32\n ]\n },\n west: {\n uv: [\n 28,\n 20,\n 32,\n 32\n ]\n },\n north: {\n uv: [\n 20,\n 20,\n 28,\n 32\n ]\n },\n south: {\n uv: [\n 32,\n 20,\n 40,\n 32\n ]\n },\n up: {\n uv: [\n 28,\n 20,\n 20,\n 16\n ]\n },\n down: {\n uv: [\n 36,\n 16,\n 28,\n 20\n ]\n }\n },\n leftArm: {\n east: {\n uv: [\n 32,\n 52,\n 36,\n 64\n ]\n },\n west: {\n uv: [\n 40,\n 52,\n 44,\n 64\n ]\n },\n north: {\n uv: [\n 36,\n 52,\n 40,\n 64\n ]\n },\n south: {\n uv: [\n 44,\n 52,\n 48,\n 64\n ]\n },\n up: {\n uv: [\n 40,\n 52,\n 36,\n 48\n ]\n },\n down: {\n uv: [\n 44,\n 48,\n 40,\n 52\n ]\n }\n },\n rightArm: {\n east: {\n uv: [\n 40,\n 20,\n 44,\n 32\n ],\n\n },\n west: {\n uv: [\n 48,\n 20,\n 52,\n 32\n ],\n\n },\n north: {\n uv: [\n 44,\n 20,\n 48,\n 32\n ],\n\n },\n south: {\n uv: [\n 52,\n 20,\n 56,\n 32\n ],\n\n },\n up: {\n uv: [\n 48,\n 20,\n 44,\n 16\n ],\n\n },\n down: {\n uv: [\n 52,\n 16,\n 48,\n 20\n ],\n\n\n }\n },\n leftLeg: {\n east: {\n uv: [\n 16,\n 52,\n 20,\n 64\n ]\n },\n west: {\n uv: [\n 24,\n 52,\n 28,\n 64\n ]\n },\n north: {\n uv: [\n 20,\n 52,\n 24,\n 64\n ]\n },\n south: {\n uv: [\n 28,\n 52,\n 32,\n 64\n ]\n },\n up: {\n uv: [\n 24,\n 52,\n 20,\n 48\n ]\n },\n down: {\n uv: [\n 28,\n 48,\n 24,\n 52\n ],\n rotation: 180\n }\n },\n rightLeg: {\n east: {\n uv: [\n 0,\n 20,\n 4,\n 32\n ],\n\n },\n west: {\n uv: [\n 8,\n 20,\n 12,\n 32\n ]\n },\n north: {\n uv: [\n 4,\n 20,\n 8,\n 32\n ],\n\n },\n south: {\n uv: [\n 12,\n 20,\n 16,\n 32\n ],\n\n },\n up: {\n uv: [\n 8,\n 20,\n 4,\n 16\n ],\n\n },\n down: {\n uv: [\n 12,\n 16,\n 8,\n 20\n ],\n\n\n }\n },\n hat: {\n east: {\n uv: [\n 32,\n 8,\n 40,\n 16\n ]\n },\n west: {\n uv: [\n 48,\n 8,\n 56,\n 16\n ]\n },\n north: {\n uv: [\n 40,\n 8,\n 48,\n 16\n ]\n },\n south: {\n uv: [\n 56,\n 8,\n 64,\n 16\n ]\n },\n up: {\n uv: [\n 48,\n 8,\n 40,\n 0\n ]\n },\n down: {\n uv: [\n 56,\n 0,\n 48,\n 8\n ],\n rotation: 180\n }\n },\n jacket: {\n east: {\n uv: [\n 16,\n 36,\n 20,\n 48\n ]\n },\n west: {\n uv: [\n 28,\n 36,\n 32,\n 48\n ]\n },\n north: {\n uv: [\n 20,\n 36,\n 28,\n 48\n ]\n },\n south: {\n uv: [\n 32,\n 36,\n 40,\n 48\n ]\n },\n up: {\n uv: [\n 28,\n 36,\n 20,\n 32\n ]\n },\n down: {\n uv: [\n 36,\n 32,\n 28,\n 36\n ],\n rotation: 180\n }\n },\n leftSleeve: {\n east: {\n uv: [\n 48,\n 52,\n 52,\n 64\n ]\n },\n west: {\n uv: [\n 56,\n 52,\n 60,\n 64\n ]\n },\n north: {\n uv: [\n 52,\n 52,\n 56,\n 64\n ]\n },\n south: {\n uv: [\n 60,\n 52,\n 64,\n 64\n ]\n },\n up: {\n uv: [\n 56,\n 52,\n 52,\n 48\n ]\n },\n down: {\n uv: [\n 60,\n 48,\n 56,\n 52\n ],\n rotation: 180\n }\n },\n rightSleeve: {\n east: {\n uv: [\n 40,\n 36,\n 44,\n 48\n ]\n },\n west: {\n uv: [\n 48,\n 36,\n 52,\n 48\n ]\n },\n north: {\n uv: [\n 44,\n 36,\n 48,\n 48\n ]\n },\n south: {\n uv: [\n 52,\n 36,\n 56,\n 48\n ]\n },\n up: {\n uv: [\n 48,\n 36,\n 44,\n 32\n ]\n },\n down: {\n uv: [\n 52,\n 32,\n 48,\n 36\n ],\n rotation: 180\n }\n },\n leftTrousers: {\n east: {\n uv: [\n 0,\n 52,\n 4,\n 64\n ]\n },\n west: {\n uv: [\n 8,\n 52,\n 12,\n 64\n ]\n },\n north: {\n uv: [\n 4,\n 52,\n 8,\n 64\n ]\n },\n south: {\n uv: [\n 12,\n 52,\n 16,\n 64\n ]\n },\n up: {\n uv: [\n 8,\n 52,\n 4,\n 48\n ]\n },\n down: {\n uv: [\n 12,\n 48,\n 8,\n 52\n ]\n }\n },\n rightTrousers: {\n east: {\n uv: [\n 0,\n 36,\n 4,\n 48\n ]\n },\n west: {\n uv: [\n 8,\n 36,\n 12,\n 48\n ]\n },\n north: {\n uv: [\n 4,\n 36,\n 8,\n 48\n ]\n },\n south: {\n uv: [\n 12,\n 36,\n 16,\n 48\n ]\n },\n up: {\n uv: [\n 4,\n 36,\n 8,\n 32\n ]\n },\n down: {\n uv: [\n 8,\n 32,\n 12,\n 36\n ],\n rotation: 180\n }\n },\n cape: {//TODO\n east: {\n uv: [\n 0,\n 36,\n 4,\n 48\n ]\n },\n west: {\n uv: [\n 8,\n 36,\n 12,\n 48\n ]\n },\n north: {\n uv: [\n 4,\n 36,\n 8,\n 48\n ]\n },\n south: {\n uv: [\n 12,\n 36,\n 16,\n 48\n ]\n },\n up: {\n uv: [\n 4,\n 32,\n 8,\n 36\n ]\n },\n down: {\n uv: [\n 8,\n 32,\n 12,\n 36\n ],\n rotation: 180\n }\n }\n}\n\n\nexport const classicSkinTextureCoordinates: Readonly<SkinTextureCoordinates> = {\n ...baseSkinCoordinates\n};\n\n//TODO\nexport const slimSkinTextureCoordinates: Readonly<SkinTextureCoordinates> = {...baseSkinCoordinates} /*merge(baseSkinCoordinates, <SkinTextureCoordinates>{\n rightArm: {\n west: {\n x: 39\n },\n south: {\n w: 3\n },\n north: {\n x: 43,\n w: 3\n },\n up: {\n w: 3\n },\n down: {\n x: 39,\n w: 3\n }\n },\n leftArm: {\n west: {\n x: 47\n },\n south: {\n w: 3\n },\n north: {\n x: 51,\n w: 3\n },\n up: {\n w: 3\n },\n down: {\n x: 47,\n w: 3\n }\n },\n\n rightSleeve: {\n west: {\n x: 55\n },\n south: {\n w: 3\n },\n north: {\n x: 59,\n w: 3\n },\n up: {\n w: 3\n },\n down: {\n x: 55,\n w: 3\n }\n },\n leftSleeve: {\n west: {\n x: 47\n },\n south: {\n w: 3\n },\n north: {\n x: 51,\n w: 3\n },\n up: {\n w: 3\n },\n down: {\n x: 47,\n w: 3\n }\n }\n});\n*/\n","import { SkinPart } from \"./SkinPart\";\nimport { TripleArray } from \"../model/Model\";\nimport merge from \"ts-deepmerge\";\n\nexport type SkinGeometries = Record<SkinPart, TripleArray>;\n\nconst box8inner: TripleArray = [8, 8, 8];\nconst box8outer: TripleArray = [8.504, 8.504, 8.504];\n\nconst box8_12_4inner: TripleArray = [8, 12, 4];\nconst box8_12_4outer: TripleArray = [8.504, 12.504, 4.504];\n\nconst box4_12_4inner: TripleArray = [4, 12, 4];\nconst box4_12_4outer: TripleArray = [4.504, 12.504, 4.504];\n\nconst box3_12_4inner: TripleArray = [3, 12, 4];\nconst box3_12_4outer: TripleArray = [3.504, 12.504, 4.504];\n\nconst box4_12_3inner: TripleArray = [4, 12, 3];\nconst box4_12_3outer: TripleArray = [4.504, 12.504, 3.504];\n\nconst box10_16_1: TripleArray = [10, 16, 1];\n\nconst baseSkinGeometries: SkinGeometries = {\n head: box8inner,\n hat: box8outer,\n\n body: box8_12_4inner,\n jacket: box8_12_4outer,\n\n leftArm: box4_12_4inner,\n leftSleeve: box4_12_4outer,\n\n rightArm: box4_12_4inner,\n rightSleeve: box4_12_4outer,\n\n leftLeg: box4_12_4inner,\n leftTrousers: box4_12_4outer,\n\n rightLeg: box4_12_4inner,\n rightTrousers: box4_12_4outer,\n\n cape: box10_16_1\n}\n\nexport const classicSkinGeometries: SkinGeometries = {...{}, ...baseSkinGeometries};\nexport const slimSkinGeometries: SkinGeometries = {\n ...{}, ...baseSkinGeometries, ...{\n leftArm: box3_12_4inner,\n leftSleeve: box3_12_4outer,\n\n rightArm: box3_12_4inner,\n rightSleeve: box3_12_4outer,\n }\n};\n","import { SceneObject } from \"../../renderer/SceneObject\";\nimport { BoxGeometry } from \"three\";\nimport { SKIN_PARTS, SkinPart } from \"../SkinPart\";\nimport { classicSkinTextureCoordinates, SkinTextureCoordinates, slimSkinTextureCoordinates } from \"../SkinTextureCoordinates\";\nimport { classicSkinGeometries, SkinGeometries, slimSkinGeometries } from \"../SkinGeometries\";\nimport { Axis } from \"../../Axis\";\nimport { Materials } from \"../../Materials\";\nimport { ModelObjectOptions } from \"../../model/scene/ModelObject\";\nimport merge from \"ts-deepmerge\";\nimport { SceneObjectOptions } from \"../../renderer/SceneObjectOptions\";\nimport { DeepPartial } from \"../../util/util\";\n\nexport class SkinObject extends SceneObject {\n\n public readonly options: SkinObjectOptions;\n\n private slim: boolean = false;\n private legacy: boolean = false;\n\n private skinTextureSrc?: string;\n private skinTextureWidth: number = 64;\n private skinTextureHeight: number = 64;\n\n private capeTextureSrc?: string;\n\n\n constructor(options?: DeepPartial<SkinObjectOptions>) {\n super();\n this.options = merge({}, SceneObject.DEFAULT_OPTIONS, options ?? {});\n }\n\n async init(): Promise<void> {\n this.createMeshes();\n }\n\n protected removeMeshes(): void {\n\n }\n\n protected createMeshes() {\n console.log(\"#createMeshes\")\n const mat = Materials.MISSING_TEXTURE;\n\n {\n const headGroup = this.createAndAddGroup(\"head\", 0, 28, 0, Axis.Y, -4);\n\n const headGeo = this.getBoxGeometry(SkinPart.HEAD);\n const head = this.createAndAddMesh(\"head\", headGroup, headGeo, mat, Axis.Y, 4);\n\n if (!this.legacy) {\n const hatGeo = this.getBoxGeometry(SkinPart.HAT);\n const hat = this.createAndAddMesh(\"hat\", headGroup, hatGeo, mat, Axis.Y, 4);\n }\n }\n\n {\n const bodyGroup = this.createAndAddGroup(\"body\", 0, 18, 0);\n\n const bodyGeo = this.getBoxGeometry(SkinPart.BODY);\n const body = this.createAndAddMesh(\"body\", bodyGroup, bodyGeo, mat);\n\n const jacketGeo = this.getBoxGeometry(SkinPart.JACKET);\n const jacket = this.createAndAddMesh(\"jacket\", bodyGroup, jacketGeo, mat);\n }\n\n {\n {\n const leftArmGroup = this.createAndAddGroup(\"leftArm\", this.slim ? -5.5 : -6, 18, 0, Axis.Y, 4);\n\n const leftArmGeo = this.getBoxGeometry(SkinPart.LEFT_ARM);\n const leftArm = this.createAndAddMesh(\"leftArm\", leftArmGroup, leftArmGeo, mat, Axis.Y, -4);\n\n const leftSleeveGeo = this.getBoxGeometry(SkinPart.LEFT_SLEEVE);\n const leftSleeve = this.createAndAddMesh(\"leftSleeve\", leftArmGroup, leftSleeveGeo, mat, Axis.Y, -4);\n }\n {\n const rightArmGroup = this.createAndAddGroup(\"rightArm\", this.slim ? 5.5 : 6, 18, 0, Axis.Y, 4);\n\n const rightArmGeo = this.getBoxGeometry(SkinPart.RIGHT_ARM);\n const rightArm = this.createAndAddMesh(\"rightArm\", rightArmGroup, rightArmGeo, mat, Axis.Y, -4);\n\n const rightSleeveGeo = this.getBoxGeometry(SkinPart.RIGHT_SLEEVE);\n const rightSleeve = this.createAndAddMesh(\"rightSleeve\", rightArmGroup, rightSleeveGeo, mat, Axis.Y, -4);\n }\n }\n\n {\n {\n const leftLegGroup = this.createAndAddGroup(\"leftLeg\", -2, 6, 0, Axis.Y, 4);\n\n const leftLegGeo = this.getBoxGeometry(SkinPart.LEFT_LEG);\n const leftLeg = this.createAndAddMesh(\"leftLeg\", leftLegGroup, leftLegGeo, mat, Axis.Y, -4);\n\n const leftTrousersGeo = this.getBoxGeometry(SkinPart.LEFT_TROUSERS);\n const leftTrousers = this.createAndAddMesh(\"leftTrousers\", leftLegGroup, leftTrousersGeo, mat, Axis.Y, -4);\n }\n {\n const rightLegGroup = this.createAndAddGroup(\"rightLeg\", 2, 6, 0, Axis.Y, 4);\n\n const rightLegGeo = this.getBoxGeometry(SkinPart.RIGHT_LEG);\n const rightLeg = this.createAndAddMesh(\"rightLeg\", rightLegGroup, rightLegGeo, mat, Axis.Y, -4);\n\n const rightTrousersGeo = this.getBoxGeometry(SkinPart.RIGHT_TROUSERS);\n const rightTrousers = this.createAndAddMesh(\"rightTrousers\", rightLegGroup, rightTrousersGeo, mat, Axis.Y, -4);\n }\n }\n\n console.log(\"#createMeshes done\")\n\n //TODO: cape\n }\n\n\n public setSkinTexture(src: string): void {\n if (typeof src === \"undefined\") return;\n\n this.skinTextureSrc = src;\n\n //TODO: detect variant\n\n //TODO\n const mat = Materials.getImage({\n texture: {src: src},\n transparent: true\n });\n for (let part of SKIN_PARTS) {\n let mesh = this.getMeshByName(part);\n if (mesh) {\n mesh.material = mat;\n }\n }\n }\n\n //TODO: cape\n\n public setSlim(slim: boolean): void {\n console.log(\"#setSlim\")\n const changed = slim !== this.slim;\n this.slim = slim;\n\n if (changed) {\n //TODO: update geometries and mesh positions\n // for (let child of this.children) {\n // this.remove(child);\n // }\n this.createMeshes();\n }\n\n if (changed) {\n if (this.skinTextureSrc) {\n this.setSkinTexture(this.skinTextureSrc);\n }\n }\n\n console.log(\"#setSlim done\");\n }\n\n public setLegacy(legacy: boolean): void {\n if (legacy !== this.legacy) {\n //TODO: update geometries and mesh positions\n }\n this.legacy = legacy;\n }\n\n //TODO: layer toggles\n\n\n protected getBoxGeometry(part: SkinPart): BoxGeometry {\n //TODO support for 64x32 dimensions\n console.log(\"slim\", this.slim)\n const coordinates: SkinTextureCoordinates = this.slim ? slimSkinTextureCoordinates : classicSkinTextureCoordinates;\n const geometries: SkinGeometries = this.slim ? slimSkinGeometries : classicSkinGeometries;\n return this._getBoxGeometryFromDimensions(geometries[part], coordinates[part], [64, 64], [this.skinTextureWidth, this.skinTextureHeight]);\n }\n\n\n}\n\nexport interface SkinObjectOptions extends SceneObjectOptions {\n\n}\n","import { AxesHelper, Camera, EventDispatcher, GridHelper, LinearEncoding, OrthographicCamera, PCFSoftShadowMap, PerspectiveCamera, Scene, sRGBEncoding, TextureEncoding, Vector3, warn, WebGLRenderer } from \"three\";\nimport {MineRenderScene} from \"./MineRenderScene\";\nimport merge from \"ts-deepmerge\";\nimport Stats from \"stats.js\";\nimport { BloomEffect, EffectComposer, RenderPass, SSAOEffect, } from \"postprocessing\";\nimport {DeepPartial, isVector3, Maybe} from \"../util/util\";\nimport {isTripleArray, TripleArray} from \"../model/Model\";\nimport {isOrthographicCamera, isPerspectiveCamera} from \"../util/three\";\nimport { Disposable } from \"../Disposable\";\nimport { OrbitControls } from \"../three/OrbitControls\";\n\nexport class Renderer implements Disposable {\n\n public static readonly DEFAULT_OPTIONS: RendererOptions = merge({}, <RendererOptions>{\n camera: {\n type: \"perspective\",\n near: 1,\n far: 5000,\n perspective: {\n aspect: undefined,\n fov: 50,\n },\n orthographic: {\n left: undefined,\n right: undefined,\n top: undefined,\n bottom: undefined\n },\n position: new Vector3(50, 50, 50),\n lookingAt: new Vector3(0, 0, 0)\n },\n render: {\n fpsLimit: 60,\n stats: false,\n antialias: true,\n shade: true,\n autoResize: true,\n renderAlways: false\n },\n composer: {\n enabled: true\n },\n controls: {\n enabled: false\n },\n debug: {\n grid: false,\n axes: false\n }\n });\n public readonly options: RendererOptions;\n\n protected _element?: HTMLElement;\n\n protected _scene: MineRenderScene;\n protected _camera: Camera;\n protected _renderer: WebGLRenderer;\n protected _composer: EffectComposer;\n protected _controls?: OrbitControls;\n\n protected _stats?: Stats;\n\n protected _dirty: boolean = true;\n\n protected _animationLoop;\n protected _fpsTimer;\n protected _animationTimer?: NodeJS.Timeout = undefined;\n protected _animationFrame?: number = undefined;\n protected _resizeListener?: () => void = undefined;\n\n private _disposed: boolean = false;\n private readonly _debugHelpers: Array<GridHelper | AxesHelper> = [];\n private readonly _eventDispatchers = new Map<EventDispatcher, Set<string>>();\n private readonly _changeListener = () => {\n this._dirty = true;\n };\n\n constructor(options?: DeepPartial<RendererOptions>) {\n this.options = merge({}, Renderer.DEFAULT_OPTIONS, options ?? {});\n\n this._animationLoop = this.animate.bind(this);\n this._fpsTimer = this.options.render.fpsLimit > 0 ? (1000 / this.options.render.fpsLimit) : undefined;\n\n this._scene = this.createScene();\n this._camera = this.createCamera();\n this._renderer = this.createRenderer();\n this._composer = this.createComposer();\n\n if (this.options.render.stats) {\n this._stats = new Stats();\n\n document.body.appendChild(this._stats.dom);//TODO\n }\n\n this.init();\n this._controls = this.createControls();\n }\n\n //<editor-fold desc=\"INIT\">\n\n protected createScene(): MineRenderScene {\n return new MineRenderScene();\n }\n\n protected createCamera(): Camera {\n switch (this.options.camera.type) {\n case \"perspective\":\n default:\n return new PerspectiveCamera(\n this.options.camera.perspective.fov,\n this.options.camera.perspective.aspect ?? (this.viewWidth / this.viewHeight),\n this.options.camera.near,\n this.options.camera.far\n );\n case \"orthographic\":\n return new OrthographicCamera(\n this.options.camera.orthographic.left ?? (this.viewWidth / -2),\n this.options.camera.orthographic.right ?? (this.viewWidth / 2),\n this.options.camera.orthographic.top ?? (this.viewHeight / 2),\n this.options.camera.orthographic.bottom ?? (this.viewHeight / -2),\n this.options.camera.near,\n this.options.camera.far\n )\n\n }\n\n }\n\n protected createRenderer(): WebGLRenderer {\n const renderer = new WebGLRenderer({\n antialias: this.options.render.antialias,\n alpha: true,\n powerPreference: \"high-performance\",\n depth: true\n });\n\n renderer.setClearColor(0x000000, 0);\n\n renderer.shadowMap.enabled = true;\n renderer.shadowMap.type = PCFSoftShadowMap;\n\n // supposedly the default is already LinearEncoding, but not doing this renders the scene way too bright\n renderer.outputEncoding = LinearEncoding;\n\n // renderer.setPixelRatio(window.devicePixelRatio);\n renderer.setSize(this.viewWidth, this.viewHeight);\n\n return renderer;\n }\n\n protected createComposer(): EffectComposer {\n const composer = new EffectComposer(this.renderer);\n if (!this.options.composer.enabled) return composer;\n\n composer.setSize(this.viewWidth, this.viewHeight);\n //TODO: options\n\n //TODO: compser seems to cause skin objects to appear way too bright\n\n // // This one just tanks completely down to ~2fps (in structures at least, works pretty well for simpler stuff)\n // const ssaaPass = new SSAARenderPass(this.scene, this.camera, 0x000000, 0);//TODO: options\n // ssaaPass.unbiased = true;\n // composer.addPass(ssaaPass);\n\n\n composer.addPass(new RenderPass(this.scene, this.camera));\n\n // composer.addPass(new EffectPass(this.camera, new SSAOEffect(this.camera)))\n\n\n // composer.addPass(new SMAAPass(this.viewWidth, this.viewHeight));\n\n\n //\n // Makes movement sluggish\n // const ssaoPass = new SSAOPass(this.scene, this.camera, this.viewWidth, this.viewHeight);\n // composer.addPass(ssaoPass);\n\n // const saoPass = new SAOPass(this.scene, this.camera);\n // composer.addPass(saoPass);\n\n\n //\n // //\n // const shaderPass1 = new ShaderPass(CopyShader);\n // shaderPass1.renderToScreen = true;\n // composer.addPass(shaderPass1);\n\n return composer;\n }\n\n protected createControls(): Maybe<OrbitControls> {\n if (!this.options.controls?.enabled) return undefined;\n\n // OrbitControls updates the camera around the origin during construction.\n const position = this.camera.position.clone();\n const controls = new OrbitControls(this.camera, this.renderer.domElement);\n this.camera.position.copy(position);\n\n const target = this.options.camera.lookingAt;\n if (isVector3(target)) {\n controls.target.copy(target);\n } else if (isTripleArray(target)) {\n controls.target.set(target[0], target[1], target[2]);\n }\n controls.update();\n controls.saveState();\n this.registerEventDispatcher(controls);\n return controls;\n }\n\n //</editor-fold>\n\n public init() {\n if (this._disposed) return;\n\n if (typeof window[\"__THREE_DEVTOOLS__\"] !== 'undefined') {\n window[\"__THREE_DEVTOOLS__\"].dispatchEvent(new CustomEvent('observe', {detail: this.scene}));\n }\n\n /// DEBUG\n if (this.options.debug.grid) {\n const gridHelper = new GridHelper(128, 16);\n this._debugHelpers.push(gridHelper);\n this.scene.add(gridHelper);\n\n const gridHelper2 = new GridHelper(128, 16);\n this._debugHelpers.push(gridHelper2);\n gridHelper2.rotation.x = 90 * (Math.PI / 180)\n this.scene.add(gridHelper2);\n\n const gridHelper3 = new GridHelper(128, 16);\n this._debugHelpers.push(gridHelper3);\n gridHelper3.rotation.z = 90 * (Math.PI / 180)\n this.scene.add(gridHelper3);\n }\n if (this.options.debug.axes) {\n const axesHelper = new AxesHelper(64);\n this._debugHelpers.push(axesHelper);\n this.scene.add(axesHelper);\n }\n\n /// CAMERA\n if (this.options.camera.position) {\n if (isVector3(this.options.camera.position)) {\n this.camera.position.set(this.options.camera.position.x, this.options.camera.position.y, this.options.camera.position.z);\n } else if (isTripleArray(this.options.camera.position)) {\n this.camera.position.set(this.options.camera.position[0], this.options.camera.position[1], this.options.camera.position[2]);\n }\n }\n if (this.options.camera.lookingAt) {\n if (isVector3(this.options.camera.lookingAt)) {\n this.camera.lookAt(this.options.camera.lookingAt);\n } else if (isTripleArray(this.options.camera.lookingAt)) {\n this.camera.lookAt(this.options.camera.lookingAt[0], this.options.camera.lookingAt[1], this.options.camera.lookingAt[2]);\n }\n }\n\n if (this.options.render.autoResize && !this._resizeListener) {\n this._resizeListener = () => {\n this.resize(this.viewWidth, this.viewHeight);\n };\n window.addEventListener('resize', this._resizeListener);\n }\n }\n\n public get element(): Maybe<HTMLElement> {\n return this._element;\n }\n\n public appendTo(element: HTMLElement): void {\n if (this._disposed) return;\n\n this._element = element;\n this._element.appendChild(this.renderer.domElement);\n if (this.viewWidth == 0) {\n console.warn('0 element width');\n }\n if (this.viewHeight == 0) {\n console.warn('0 element height');\n }\n this.resize(this.viewWidth, this.viewHeight);\n }\n\n /**\n * Redraws when the dispatcher emits the selected event. Registering the same pair twice has no effect.\n * The renderer removes its listener on disposal; the caller retains ownership of the dispatcher.\n */\n public registerEventDispatcher(dispatcher: EventDispatcher, changeEvent: string = 'change') {\n if (this._disposed) return;\n\n let events = this._eventDispatchers.get(dispatcher);\n if (!events) {\n events = new Set<string>();\n this._eventDispatchers.set(dispatcher, events);\n }\n if (events.has(changeEvent)) return;\n\n events.add(changeEvent);\n dispatcher.addEventListener(changeEvent, this._changeListener);\n }\n\n public resize(width: number, height: number) {\n if (this._disposed) return;\n\n if (isPerspectiveCamera(this.camera)) {\n this.camera.aspect = width / height;\n this.camera.updateProjectionMatrix();\n } else if (isOrthographicCamera(this.camera)) {\n this.camera.left = width / -2;\n this.camera.right = width / 2;\n this.camera.top = height / 2;\n this.camera.bottom = height / -2;\n this.camera.updateProjectionMatrix();\n }\n\n this.renderer.setSize(width, height);\n this.composer.setSize(width, height);\n this._dirty = true;\n }\n\n //<editor-fold desc=\"RENDER\">\n\n public get dirty(): boolean {\n return this._dirty || this.scene.dirty;\n }\n\n public set dirty(dirty: boolean) {\n this._dirty = dirty;\n this.scene.dirty = dirty;\n }\n\n public start() {\n if (this._disposed) return;\n\n this.stop();\n this.renderer.setAnimationLoop(this._animationLoop);\n }\n\n public stop() {\n if (this._disposed) return;\n\n this.renderer.setAnimationLoop(null);\n\n //TODO: remove below\n if (this._animationTimer)\n clearTimeout(this._animationTimer);\n this._animationTimer = undefined;\n\n if (this._animationFrame)\n cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n\n /**\n * Stops rendering and releases owned resources. Repeated calls have no effect, and a disposed\n * renderer cannot be restarted. Scene objects are detached; shared assets and caller-owned\n * controls must be managed by their owners.\n */\n public dispose(): void {\n if (this._disposed) return;\n\n this.stop();\n this._disposed = true;\n\n if (this._resizeListener) {\n window.removeEventListener('resize', this._resizeListener);\n this._resizeListener = undefined;\n }\n for (const [dispatcher, events] of this._eventDispatchers) {\n for (const event of events) {\n dispatcher.removeEventListener(event, this._changeListener);\n }\n }\n this._eventDispatchers.clear();\n\n this._stats?.dom.remove();\n this._stats = undefined;\n this.renderer.domElement.remove();\n this._element = undefined;\n\n if (this._controls) {\n const controls = this._controls;\n this._controls = undefined;\n controls.enabled = false;\n controls.dispose();\n }\n\n this.scene.clear();\n for (const helper of this._debugHelpers) {\n helper.geometry.dispose();\n const materials = Array.isArray(helper.material) ? helper.material : [helper.material];\n for (const material of materials) {\n material.dispose();\n }\n }\n this._debugHelpers.length = 0;\n\n this.composer.dispose();\n this.renderer.dispose();\n this.renderer.forceContextLoss();\n }\n\n private animate(t?: number): void {\n if (this._disposed) return;\n\n // if (this.options.render.fpsLimit === 0) {\n // this._animationFrame = requestAnimationFrame(this._animationLoop);\n // } else {\n // this._animationTimer = setTimeout(() => {\n // this._animationFrame = requestAnimationFrame(this._animationLoop);\n // }, this._fpsTimer);\n // }\n\n if (this._stats) {\n this._stats.begin();\n }\n\n // Damping and auto-rotation can make a previously clean scene need another frame.\n if (this._controls?.enabled) {\n this._controls.update();\n }\n if (this._disposed) return;\n\n if (this.dirty || this.options.render.renderAlways) {\n if (this.options.composer.enabled) {\n this.composer.render();\n } else {\n this.renderer.render(this.scene, this.camera);\n }\n }\n\n this.dirty = false;\n\n if (this._stats) {\n this._stats.end();\n }\n\n }\n\n //</editor-fold>\n\n public toImage(): string {\n //TODO: mime type, trim transparent pixels\n return this.renderer.domElement.toDataURL();\n }\n\n ///\n\n protected get attachedToBody() {\n return this.element === document.body;\n }\n\n protected get viewWidth() {\n return this.attachedToBody ? window.innerWidth : this.element?.offsetWidth || 0;\n }\n\n protected get viewHeight() {\n return this.attachedToBody ? window.innerHeight : this.element?.offsetHeight || 0;\n }\n\n public get scene(): MineRenderScene {\n return this._scene;\n }\n\n public get camera(): Camera {\n return this._camera;\n }\n\n public get renderer(): WebGLRenderer {\n return this._renderer;\n }\n\n public get composer(): EffectComposer {\n return this._composer;\n }\n\n /** Renderer-owned controls, or undefined when disabled at construction or after disposal. */\n public get controls(): Maybe<OrbitControls> {\n return this._controls;\n }\n\n ///\n\n\n}\n\nexport interface RendererOptions {\n camera: CameraOptions;\n render: RenderOptions;\n composer: ComposerOptions;\n controls?: ControlsOptions;\n debug: DebugOptions;\n}\n\nexport interface CameraOptions {\n type: \"perspective\" | \"orthographic\";\n near: number;\n far: number;\n perspective: {\n aspect: undefined | number;\n fov: number;\n }\n orthographic: {\n left: undefined | number;\n right: undefined | number;\n top: undefined | number;\n bottom: undefined | number;\n }\n position: Vector3 | TripleArray;\n lookingAt: Vector3 | TripleArray;\n}\n\nexport interface RenderOptions {\n fpsLimit: number;\n stats: boolean;\n antialias: boolean;\n shade: boolean;\n autoResize: boolean;\n renderAlways: boolean;\n}\n\nexport interface ComposerOptions {\n enabled: boolean;\n}\n\nexport interface ControlsOptions {\n enabled: boolean;\n}\n\nexport interface DebugOptions {\n grid: boolean;\n axes: boolean;\n}\n","/// https://github.com/mrdoob/three.js/blob/dev/examples/jsm/controls/OrbitControls.js\n\nimport {\n EventDispatcher,\n MOUSE,\n Quaternion,\n Spherical,\n TOUCH,\n Vector2,\n Vector3\n} from 'three';\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one-finger move\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move\n\nconst _changeEvent = { type: 'change' };\nconst _startEvent = { type: 'start' };\nconst _endEvent = { type: 'end' };\n\nclass OrbitControls extends EventDispatcher {\n\n constructor( object, domElement ) {\n\n super();\n\n if ( domElement === undefined ) console.warn( 'THREE.OrbitControls: The second parameter \"domElement\" is now mandatory.' );\n if ( domElement === document ) console.error( 'THREE.OrbitControls: \"document\" should not be used as the target \"domElement\". Please use \"renderer.domElement\" instead.' );\n\n this.object = object;\n this.domElement = domElement;\n this.domElement.style.touchAction = 'none'; // disable touch scroll\n\n // Set to false to disable this control\n this.enabled = true;\n\n // \"target\" sets the location of focus, where the object orbits around\n this.target = new Vector3();\n\n // How far you can dolly in and out ( PerspectiveCamera only )\n this.minDistance = 0;\n this.maxDistance = Infinity;\n\n // How far you can zoom in and out ( OrthographicCamera only )\n this.minZoom = 0;\n this.maxZoom = Infinity;\n\n // How far you can orbit vertically, upper and lower limits.\n // Range is 0 to Math.PI radians.\n this.minPolarAngle = 0; // radians\n this.maxPolarAngle = Math.PI; // radians\n\n // How far you can orbit horizontally, upper and lower limits.\n // If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\n this.minAzimuthAngle = - Infinity; // radians\n this.maxAzimuthAngle = Infinity; // radians\n\n // Set to true to enable damping (inertia)\n // If damping is enabled, you must call controls.update() in your animation loop\n this.enableDamping = false;\n this.dampingFactor = 0.05;\n\n // This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n // Set to false to disable zooming\n this.enableZoom = true;\n this.zoomSpeed = 1.0;\n\n // Set to false to disable rotating\n this.enableRotate = true;\n this.rotateSpeed = 1.0;\n\n // Set to false to disable panning\n this.enablePan = true;\n this.panSpeed = 1.0;\n this.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up\n this.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n // Set to true to automatically rotate around the target\n // If auto-rotate is enabled, you must call controls.update() in your animation loop\n this.autoRotate = false;\n this.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60\n\n // The four arrow keys\n this.keys = { LEFT: 'ArrowLeft', UP: 'ArrowUp', RIGHT: 'ArrowRight', BOTTOM: 'ArrowDown' };\n\n // Mouse buttons\n this.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\n\n // Touch fingers\n this.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n\n // for reset\n this.target0 = this.target.clone();\n this.position0 = this.object.position.clone();\n this.zoom0 = this.object.zoom;\n\n // the target DOM element for key events\n this._domElementKeyEvents = null;\n\n //\n // public methods\n //\n\n this.getPolarAngle = function () {\n\n return spherical.phi;\n\n };\n\n this.getAzimuthalAngle = function () {\n\n return spherical.theta;\n\n };\n\n this.getDistance = function () {\n\n return this.object.position.distanceTo( this.target );\n\n };\n\n // typescript compile doesn't like this for reasons\n // this.listenToKeyEvents = function ( domElement ) {\n //\n // domElement.addEventListener( 'keydown', onKeyDown );\n // this._domElementKeyEvents = domElement;\n //\n // };\n\n this.saveState = function () {\n\n scope.target0.copy( scope.target );\n scope.position0.copy( scope.object.position );\n scope.zoom0 = scope.object.zoom;\n\n };\n\n this.reset = function () {\n\n scope.target.copy( scope.target0 );\n scope.object.position.copy( scope.position0 );\n scope.object.zoom = scope.zoom0;\n\n scope.object.updateProjectionMatrix();\n scope.dispatchEvent( _changeEvent );\n\n scope.update();\n\n state = STATE.NONE;\n\n };\n\n // this method is exposed, but perhaps it would be better if we can make it private...\n this.update = function () {\n\n const offset = new Vector3();\n\n // so camera.up is the orbit axis\n const quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) );\n const quatInverse = quat.clone().invert();\n\n const lastPosition = new Vector3();\n const lastQuaternion = new Quaternion();\n\n const twoPI = 2 * Math.PI;\n\n return function update() {\n\n const position = scope.object.position;\n\n offset.copy( position ).sub( scope.target );\n\n // rotate offset to \"y-axis-is-up\" space\n offset.applyQuaternion( quat );\n\n // angle from z-axis around y-axis\n spherical.setFromVector3( offset );\n\n if ( scope.autoRotate && state === STATE.NONE ) {\n\n rotateLeft( getAutoRotationAngle() );\n\n }\n\n if ( scope.enableDamping ) {\n\n spherical.theta += sphericalDelta.theta * scope.dampingFactor;\n spherical.phi += sphericalDelta.phi * scope.dampingFactor;\n\n } else {\n\n spherical.theta += sphericalDelta.theta;\n spherical.phi += sphericalDelta.phi;\n\n }\n\n // restrict theta to be between desired limits\n\n let min = scope.minAzimuthAngle;\n let max = scope.maxAzimuthAngle;\n\n if ( isFinite( min ) && isFinite( max ) ) {\n\n if ( min < - Math.PI ) min += twoPI; else if ( min > Math.PI ) min -= twoPI;\n\n if ( max < - Math.PI ) max += twoPI; else if ( max > Math.PI ) max -= twoPI;\n\n if ( min <= max ) {\n\n spherical.theta = Math.max( min, Math.min( max, spherical.theta ) );\n\n } else {\n\n spherical.theta = ( spherical.theta > ( min + max ) / 2 ) ?\n Math.max( min, spherical.theta ) :\n Math.min( max, spherical.theta );\n\n }\n\n }\n\n // restrict phi to be between desired limits\n spherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n spherical.makeSafe();\n\n\n spherical.radius *= scale;\n\n // restrict radius to be between desired limits\n spherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n // move target to panned location\n\n if ( scope.enableDamping === true ) {\n\n scope.target.addScaledVector( panOffset, scope.dampingFactor );\n\n } else {\n\n scope.target.add( panOffset );\n\n }\n\n offset.setFromSpherical( spherical );\n\n // rotate offset back to \"camera-up-vector-is-up\" space\n offset.applyQuaternion( quatInverse );\n\n position.copy( scope.target ).add( offset );\n\n scope.object.lookAt( scope.target );\n\n if ( scope.enableDamping === true ) {\n\n sphericalDelta.theta *= ( 1 - scope.dampingFactor );\n sphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n panOffset.multiplyScalar( 1 - scope.dampingFactor );\n\n } else {\n\n sphericalDelta.set( 0, 0, 0 );\n\n panOffset.set( 0, 0, 0 );\n\n }\n\n scale = 1;\n\n // update condition is:\n // min(camera displacement, camera rotation in radians)^2 > EPS\n // using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n if ( zoomChanged ||\n lastPosition.distanceToSquared( scope.object.position ) > EPS ||\n 8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n scope.dispatchEvent( _changeEvent );\n\n lastPosition.copy( scope.object.position );\n lastQuaternion.copy( scope.object.quaternion );\n zoomChanged = false;\n\n return true;\n\n }\n\n return false;\n\n };\n\n }();\n\n this.dispose = function () {\n\n scope.domElement.removeEventListener( 'contextmenu', onContextMenu );\n\n scope.domElement.removeEventListener( 'pointerdown', onPointerDown );\n scope.domElement.removeEventListener( 'pointercancel', onPointerCancel );\n scope.domElement.removeEventListener( 'wheel', onMouseWheel );\n\n scope.domElement.removeEventListener( 'pointermove', onPointerMove );\n scope.domElement.removeEventListener( 'pointerup', onPointerUp );\n\n\n if ( scope._domElementKeyEvents !== null ) {\n\n scope._domElementKeyEvents.removeEventListener( 'keydown', onKeyDown );\n\n }\n\n //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n };\n\n //\n // internals\n //\n\n const scope = this;\n\n const STATE = {\n NONE: - 1,\n ROTATE: 0,\n DOLLY: 1,\n PAN: 2,\n TOUCH_ROTATE: 3,\n TOUCH_PAN: 4,\n TOUCH_DOLLY_PAN: 5,\n TOUCH_DOLLY_ROTATE: 6\n };\n\n let state = STATE.NONE;\n\n const EPS = 0.000001;\n\n // current position in spherical coordinates\n const spherical = new Spherical();\n const sphericalDelta = new Spherical();\n\n let scale = 1;\n const panOffset = new Vector3();\n let zoomChanged = false;\n\n const rotateStart = new Vector2();\n const rotateEnd = new Vector2();\n const rotateDelta = new Vector2();\n\n const panStart = new Vector2();\n const panEnd = new Vector2();\n const panDelta = new Vector2();\n\n const dollyStart = new Vector2();\n const dollyEnd = new Vector2();\n const dollyDelta = new Vector2();\n\n const pointers = [];\n const pointerPositions = {};\n\n function getAutoRotationAngle() {\n\n return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n }\n\n function getZoomScale() {\n\n return Math.pow( 0.95, scope.zoomSpeed );\n\n }\n\n function rotateLeft( angle ) {\n\n sphericalDelta.theta -= angle;\n\n }\n\n function rotateUp( angle ) {\n\n sphericalDelta.phi -= angle;\n\n }\n\n const panLeft = function () {\n\n const v = new Vector3();\n\n return function panLeft( distance, objectMatrix ) {\n\n v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n v.multiplyScalar( - distance );\n\n panOffset.add( v );\n\n };\n\n }();\n\n const panUp = function () {\n\n const v = new Vector3();\n\n return function panUp( distance, objectMatrix ) {\n\n if ( scope.screenSpacePanning === true ) {\n\n v.setFromMatrixColumn( objectMatrix, 1 );\n\n } else {\n\n v.setFromMatrixColumn( objectMatrix, 0 );\n v.crossVectors( scope.object.up, v );\n\n }\n\n v.multiplyScalar( distance );\n\n panOffset.add( v );\n\n };\n\n }();\n\n // deltaX and deltaY are in pixels; right and down are positive\n const pan = function () {\n\n const offset = new Vector3();\n\n return function pan( deltaX, deltaY ) {\n\n const element = scope.domElement;\n\n if ( scope.object.isPerspectiveCamera ) {\n\n // perspective\n const position = scope.object.position;\n offset.copy( position ).sub( scope.target );\n let targetDistance = offset.length();\n\n // half of the fov is center to top of screen\n targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n // we use only clientHeight here so aspect ratio does not distort speed\n panLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n panUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n } else if ( scope.object.isOrthographicCamera ) {\n\n // orthographic\n panLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n panUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n } else {\n\n // camera neither orthographic nor perspective\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n scope.enablePan = false;\n\n }\n\n };\n\n }();\n\n function dollyOut( dollyScale ) {\n\n if ( scope.object.isPerspectiveCamera ) {\n\n scale /= dollyScale;\n\n } else if ( scope.object.isOrthographicCamera ) {\n\n scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n scope.object.updateProjectionMatrix();\n zoomChanged = true;\n\n } else {\n\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n scope.enableZoom = false;\n\n }\n\n }\n\n function dollyIn( dollyScale ) {\n\n if ( scope.object.isPerspectiveCamera ) {\n\n scale *= dollyScale;\n\n } else if ( scope.object.isOrthographicCamera ) {\n\n scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n scope.object.updateProjectionMatrix();\n zoomChanged = true;\n\n } else {\n\n console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n scope.enableZoom = false;\n\n }\n\n }\n\n //\n // event callbacks - update the object state\n //\n\n function handleMouseDownRotate( event ) {\n\n rotateStart.set( event.clientX, event.clientY );\n\n }\n\n function handleMouseDownDolly( event ) {\n\n dollyStart.set( event.clientX, event.clientY );\n\n }\n\n function handleMouseDownPan( event ) {\n\n panStart.set( event.clientX, event.clientY );\n\n }\n\n function handleMouseMoveRotate( event ) {\n\n rotateEnd.set( event.clientX, event.clientY );\n\n rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n const element = scope.domElement;\n\n rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n rotateStart.copy( rotateEnd );\n\n scope.update();\n\n }\n\n function handleMouseMoveDolly( event ) {\n\n dollyEnd.set( event.clientX, event.clientY );\n\n dollyDelta.subVectors( dollyEnd, dollyStart );\n\n if ( dollyDelta.y > 0 ) {\n\n dollyOut( getZoomScale() );\n\n } else if ( dollyDelta.y < 0 ) {\n\n dollyIn( getZoomScale() );\n\n }\n\n dollyStart.copy( dollyEnd );\n\n scope.update();\n\n }\n\n function handleMouseMovePan( event ) {\n\n panEnd.set( event.clientX, event.clientY );\n\n panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n pan( panDelta.x, panDelta.y );\n\n panStart.copy( panEnd );\n\n scope.update();\n\n }\n\n function handleMouseUp( /*event*/ ) {\n\n // no-op\n\n }\n\n function handleMouseWheel( event ) {\n\n if ( event.deltaY < 0 ) {\n\n dollyIn( getZoomScale() );\n\n } else if ( event.deltaY > 0 ) {\n\n dollyOut( getZoomScale() );\n\n }\n\n scope.update();\n\n }\n\n function handleKeyDown( event ) {\n\n let needsUpdate = false;\n\n switch ( event.code ) {\n\n case scope.keys.UP:\n pan( 0, scope.keyPanSpeed );\n needsUpdate = true;\n break;\n\n case scope.keys.BOTTOM:\n pan( 0, - scope.keyPanSpeed );\n needsUpdate = true;\n break;\n\n case scope.keys.LEFT:\n pan( scope.keyPanSpeed, 0 );\n needsUpdate = true;\n break;\n\n case scope.keys.RIGHT:\n pan( - scope.keyPanSpeed, 0 );\n needsUpdate = true;\n break;\n\n }\n\n if ( needsUpdate ) {\n\n // prevent the browser from scrolling on cursor keys\n event.preventDefault();\n\n scope.update();\n\n }\n\n\n }\n\n function handleTouchStartRotate() {\n\n if ( pointers.length === 1 ) {\n\n rotateStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );\n\n } else {\n\n const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );\n const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );\n\n rotateStart.set( x, y );\n\n }\n\n }\n\n function handleTouchStartPan() {\n\n if ( pointers.length === 1 ) {\n\n panStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );\n\n } else {\n\n const x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );\n const y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );\n\n panStart.set( x, y );\n\n }\n\n }\n\n function handleTouchStartDolly() {\n\n const dx = pointers[ 0 ].pageX - pointers[ 1 ].pageX;\n const dy = pointers[ 0 ].pageY - pointers[ 1 ].pageY;\n\n const distance = Math.sqrt( dx * dx + dy * dy );\n\n dollyStart.set( 0, distance );\n\n }\n\n function handleTouchStartDollyPan() {\n\n if ( scope.enableZoom ) handleTouchStartDolly();\n\n if ( scope.enablePan ) handleTouchStartPan();\n\n }\n\n function handleTouchStartDollyRotate() {\n\n if ( scope.enableZoom ) handleTouchStartDolly();\n\n if ( scope.enableRotate ) handleTouchStartRotate();\n\n }\n\n function handleTouchMoveRotate( event ) {\n\n if ( pointers.length == 1 ) {\n\n rotateEnd.set( event.pageX, event.pageY );\n\n } else {\n\n const position = getSecondPointerPosition( event );\n\n const x = 0.5 * ( event.pageX + position.x );\n const y = 0.5 * ( event.pageY + position.y );\n\n rotateEnd.set( x, y );\n\n }\n\n rotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n const element = scope.domElement;\n\n rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n rotateStart.copy( rotateEnd );\n\n }\n\n function handleTouchMovePan( event ) {\n\n if ( pointers.length === 1 ) {\n\n panEnd.set( event.pageX, event.pageY );\n\n } else {\n\n const position = getSecondPointerPosition( event );\n\n const x = 0.5 * ( event.pageX + position.x );\n const y = 0.5 * ( event.pageY + position.y );\n\n panEnd.set( x, y );\n\n }\n\n panDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n pan( panDelta.x, panDelta.y );\n\n panStart.copy( panEnd );\n\n }\n\n function handleTouchMoveDolly( event ) {\n\n const position = getSecondPointerPosition( event );\n\n const dx = event.pageX - position.x;\n const dy = event.pageY - position.y;\n\n const distance = Math.sqrt( dx * dx + dy * dy );\n\n dollyEnd.set( 0, distance );\n\n dollyDelta.set( 0, Math.pow( dollyEnd.y / dollyStart.y, scope.zoomSpeed ) );\n\n dollyOut( dollyDelta.y );\n\n dollyStart.copy( dollyEnd );\n\n }\n\n function handleTouchMoveDollyPan( event ) {\n\n if ( scope.enableZoom ) handleTouchMoveDolly( event );\n\n if ( scope.enablePan ) handleTouchMovePan( event );\n\n }\n\n function handleTouchMoveDollyRotate( event ) {\n\n if ( scope.enableZoom ) handleTouchMoveDolly( event );\n\n if ( scope.enableRotate ) handleTouchMoveRotate( event );\n\n }\n\n function handleTouchEnd( /*event*/ ) {\n\n // no-op\n\n }\n\n //\n // event handlers - FSM: listen for events and reset state\n //\n\n function onPointerDown( event ) {\n\n if ( scope.enabled === false ) return;\n\n if ( pointers.length === 0 ) {\n\n scope.domElement.setPointerCapture( event.pointerId );\n\n scope.domElement.addEventListener( 'pointermove', onPointerMove );\n scope.domElement.addEventListener( 'pointerup', onPointerUp );\n\n }\n\n //\n\n addPointer( event );\n\n if ( event.pointerType === 'touch' ) {\n\n onTouchStart( event );\n\n } else {\n\n onMouseDown( event );\n\n }\n\n }\n\n function onPointerMove( event ) {\n\n if ( scope.enabled === false ) return;\n\n if ( event.pointerType === 'touch' ) {\n\n onTouchMove( event );\n\n } else {\n\n onMouseMove( event );\n\n }\n\n }\n\n function onPointerUp( event ) {\n\n if ( scope.enabled === false ) return;\n\n if ( event.pointerType === 'touch' ) {\n\n onTouchEnd();\n\n } else {\n\n onMouseUp( event );\n\n }\n\n removePointer( event );\n\n //\n\n if ( pointers.length === 0 ) {\n\n scope.domElement.releasePointerCapture( event.pointerId );\n\n scope.domElement.removeEventListener( 'pointermove', onPointerMove );\n scope.domElement.removeEventListener( 'pointerup', onPointerUp );\n\n }\n\n }\n\n function onPointerCancel( event ) {\n\n removePointer( event );\n\n }\n\n function onMouseDown( event ) {\n\n let mouseAction;\n\n switch ( event.button ) {\n\n case 0:\n\n mouseAction = scope.mouseButtons.LEFT;\n break;\n\n case 1:\n\n mouseAction = scope.mouseButtons.MIDDLE;\n break;\n\n case 2:\n\n mouseAction = scope.mouseButtons.RIGHT;\n break;\n\n default:\n\n mouseAction = - 1;\n\n }\n\n switch ( mouseAction ) {\n\n case MOUSE.DOLLY:\n\n if ( scope.enableZoom === false ) return;\n\n handleMouseDownDolly( event );\n\n state = STATE.DOLLY;\n\n break;\n\n case MOUSE.ROTATE:\n\n if ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n if ( scope.enablePan === false ) return;\n\n handleMouseDownPan( event );\n\n state = STATE.PAN;\n\n } else {\n\n if ( scope.enableRotate === false ) return;\n\n handleMouseDownRotate( event );\n\n state = STATE.ROTATE;\n\n }\n\n break;\n\n case MOUSE.PAN:\n\n if ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n if ( scope.enableRotate === false ) return;\n\n handleMouseDownRotate( event );\n\n state = STATE.ROTATE;\n\n } else {\n\n if ( scope.enablePan === false ) return;\n\n handleMouseDownPan( event );\n\n state = STATE.PAN;\n\n }\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n if ( state !== STATE.NONE ) {\n\n scope.dispatchEvent( _startEvent );\n\n }\n\n }\n\n function onMouseMove( event ) {\n\n if ( scope.enabled === false ) return;\n\n switch ( state ) {\n\n case STATE.ROTATE:\n\n if ( scope.enableRotate === false ) return;\n\n handleMouseMoveRotate( event );\n\n break;\n\n case STATE.DOLLY:\n\n if ( scope.enableZoom === false ) return;\n\n handleMouseMoveDolly( event );\n\n break;\n\n case STATE.PAN:\n\n if ( scope.enablePan === false ) return;\n\n handleMouseMovePan( event );\n\n break;\n\n }\n\n }\n\n function onMouseUp( event ) {\n\n handleMouseUp( event );\n\n scope.dispatchEvent( _endEvent );\n\n state = STATE.NONE;\n\n }\n\n function onMouseWheel( event ) {\n\n if ( scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE ) return;\n\n event.preventDefault();\n\n scope.dispatchEvent( _startEvent );\n\n handleMouseWheel( event );\n\n scope.dispatchEvent( _endEvent );\n\n }\n\n function onKeyDown( event ) {\n\n if ( scope.enabled === false || scope.enablePan === false ) return;\n\n handleKeyDown( event );\n\n }\n\n function onTouchStart( event ) {\n\n trackPointer( event );\n\n switch ( pointers.length ) {\n\n case 1:\n\n switch ( scope.touches.ONE ) {\n\n case TOUCH.ROTATE:\n\n if ( scope.enableRotate === false ) return;\n\n handleTouchStartRotate();\n\n state = STATE.TOUCH_ROTATE;\n\n break;\n\n case TOUCH.PAN:\n\n if ( scope.enablePan === false ) return;\n\n handleTouchStartPan();\n\n state = STATE.TOUCH_PAN;\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n break;\n\n case 2:\n\n switch ( scope.touches.TWO ) {\n\n case TOUCH.DOLLY_PAN:\n\n if ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n handleTouchStartDollyPan();\n\n state = STATE.TOUCH_DOLLY_PAN;\n\n break;\n\n case TOUCH.DOLLY_ROTATE:\n\n if ( scope.enableZoom === false && scope.enableRotate === false ) return;\n\n handleTouchStartDollyRotate();\n\n state = STATE.TOUCH_DOLLY_ROTATE;\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n if ( state !== STATE.NONE ) {\n\n scope.dispatchEvent( _startEvent );\n\n }\n\n }\n\n function onTouchMove( event ) {\n\n trackPointer( event );\n\n switch ( state ) {\n\n case STATE.TOUCH_ROTATE:\n\n if ( scope.enableRotate === false ) return;\n\n handleTouchMoveRotate( event );\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_PAN:\n\n if ( scope.enablePan === false ) return;\n\n handleTouchMovePan( event );\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_DOLLY_PAN:\n\n if ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n handleTouchMoveDollyPan( event );\n\n scope.update();\n\n break;\n\n case STATE.TOUCH_DOLLY_ROTATE:\n\n if ( scope.enableZoom === false && scope.enableRotate === false ) return;\n\n handleTouchMoveDollyRotate( event );\n\n scope.update();\n\n break;\n\n default:\n\n state = STATE.NONE;\n\n }\n\n }\n\n function onTouchEnd( event ) {\n\n handleTouchEnd( event );\n\n scope.dispatchEvent( _endEvent );\n\n state = STATE.NONE;\n\n }\n\n function onContextMenu( event ) {\n\n if ( scope.enabled === false ) return;\n\n event.preventDefault();\n\n }\n\n function addPointer( event ) {\n\n pointers.push( event );\n\n }\n\n function removePointer( event ) {\n\n delete pointerPositions[ event.pointerId ];\n\n for ( let i = 0; i < pointers.length; i ++ ) {\n\n if ( pointers[ i ].pointerId == event.pointerId ) {\n\n pointers.splice( i, 1 );\n return;\n\n }\n\n }\n\n }\n\n function trackPointer( event ) {\n\n let position = pointerPositions[ event.pointerId ];\n\n if ( position === undefined ) {\n\n position = new Vector2();\n pointerPositions[ event.pointerId ] = position;\n\n }\n\n position.set( event.pageX, event.pageY );\n\n }\n\n function getSecondPointerPosition( event ) {\n\n const pointer = ( event.pointerId === pointers[ 0 ].pointerId ) ? pointers[ 1 ] : pointers[ 0 ];\n\n return pointerPositions[ pointer.pointerId ];\n\n }\n\n //\n\n scope.domElement.addEventListener( 'contextmenu', onContextMenu );\n\n scope.domElement.addEventListener( 'pointerdown', onPointerDown );\n scope.domElement.addEventListener( 'pointercancel', onPointerCancel );\n scope.domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } );\n\n // force an update at start\n\n this.update();\n\n }\n\n}\n\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n// This is very similar to OrbitControls, another set of touch behavior\n//\n// Orbit - right mouse, or left mouse + ctrl/meta/shiftKey / touch: two-finger rotate\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - left mouse, or arrow keys / touch: one-finger move\n\nclass MapControls extends OrbitControls {\n\n constructor( object, domElement ) {\n\n super( object, domElement );\n\n this.screenSpacePanning = false; // pan orthogonal to world-space direction camera.up\n\n this.mouseButtons.LEFT = MOUSE.PAN;\n this.mouseButtons.RIGHT = MOUSE.ROTATE;\n\n this.touches.ONE = TOUCH.PAN;\n this.touches.TWO = TOUCH.DOLLY_ROTATE;\n\n }\n\n}\n\nexport { OrbitControls, MapControls };\n","import { Requests } from \"../request/Requests\";\nimport { Maybe } from \"../util/util\";\n\n//TODO: cache stuff\nexport class Skins {\n\n\n //<editor-fold desc=\"Skins\">\n\n static async fromUuidOrUsername(uuidOrUsername: string): Promise<Maybe<string>> {\n if (uuidOrUsername.length === 32 || uuidOrUsername.length === 36) {\n return this.fromUuid(uuidOrUsername);\n }\n return this.fromUsername(uuidOrUsername);\n }\n\n static async fromUuid(uuid: string): Promise<Maybe<string>> {\n // return this.getProfile(uuid).then(profile => {\n // if (profile) {\n // return profile.decoded.textures.SKIN?.url;\n // }\n // return undefined;\n // })\n return this.getSkinProxySkinUrl(uuid);\n }\n\n static async fromUsername(username: string): Promise<Maybe<string>> {\n return this.usernameToUuid(username).then(uuid => {\n if (uuid) {\n return this.fromUuid(uuid);\n }\n return undefined;\n })\n }\n\n static async fromMineSkin(mineskinId: string): Promise<Maybe<string>> {\n return this.getMineSkin(mineskinId).then(mineskin => {\n if (mineskin) {\n return mineskin[\"data\"][\"texture\"][\"value\"][\"urls\"][\"skins\"];\n }\n return undefined;\n })\n }\n\n //</editor-fold>\n\n\n //<editor-fold desc=\"Capes\">\n\n static async capeFromUuidOrUsername(uuidOrUsername: string): Promise<Maybe<string>> {\n if (uuidOrUsername.length === 32 || uuidOrUsername.length === 36) {\n return this.capeFromUuid(uuidOrUsername);\n }\n return this.capeFromUsername(uuidOrUsername);\n }\n\n static async capeFromUuid(uuid: string): Promise<Maybe<string>> {\n // return this.getProfile(uuid).then(profile => {\n // if (profile) {\n // return profile.decoded.textures.CAPE?.url;\n // }\n // return undefined;\n // })\n return this.getSkinProxyCapeUrl(uuid);\n }\n\n static async capeFromUsername(username: string): Promise<Maybe<string>> {\n return this.usernameToUuid(username).then(uuid => {\n if (uuid) {\n return this.capeFromUuid(uuid);\n }\n return undefined;\n })\n }\n\n static async capeFromCapesDev(uuid: string, capeType: string = \"minecraft\"): Promise<Maybe<string>> {\n return this.getCapesDev(uuid, capeType).then(cape => {\n if (cape) {\n //TODO: support for animated\n return cape?.stillImageUrl;\n }\n return undefined;\n })\n }\n\n //</editor-fold>\n\n\n //<editor-fold desc=\"Helpers\">\n\n private static async usernameToUuid(username: string): Promise<Maybe<string>> {\n return this.usernameToUuidSkinProxy(username);\n }\n\n private static async usernameToUuidSkinProxy(username: string): Promise<Maybe<string>> {\n return Requests.genericRequest({\n baseURL: 'https://minecraft-skin-proxy.inventive.workers.dev',\n url: '/uuid/' + username\n }).then(res => {\n if (res.status === 200) {\n return res.data[\"id\"];\n }\n return undefined;\n }).catch(err => {\n console.warn(err);\n return undefined;\n })\n }\n\n private static async usernameToUuidMineTools(username: string): Promise<Maybe<string>> {\n return Requests.genericRequest({\n baseURL: 'https://api.minetools.eu',\n url: '/uuid/' + username\n }).then(res => {\n if (res.status === 200) {\n return res.data[\"id\"];\n }\n return undefined;\n }).catch(err => {\n console.warn(err);\n return undefined;\n })\n }\n\n private static async getProfileFromMinetools(uuid: string): Promise<Maybe<any>> {\n return Requests.genericRequest({\n baseURL: 'https://api.minetools.eu',\n url: '/profile/' + uuid\n }).then(res => {\n if (res.status === 200) {\n return res.data;\n }\n })\n }\n\n private static async getMineSkin(mineskinId: string): Promise<Maybe<any>> {\n return Requests.genericRequest({\n baseURL: 'https://api.mineskin.org',\n url: '/get/uuid/' + mineskinId\n }).then(res => {\n if (res.status === 200) {\n return res.data;\n }\n return undefined;\n }).catch(err => {\n console.warn(err);\n return undefined;\n })\n }\n\n private static async getCapesDev(uuid: string, type: string = 'all'): Promise<Maybe<any>> {\n return Requests.genericRequest({\n baseURL: 'https://api.capes.dev',\n url: '/load/' + uuid + '/' + type\n }).then(res => {\n if (res.status === 200) {\n return res.data;\n }\n return undefined;\n }).catch(err => {\n console.warn(err);\n return undefined;\n })\n }\n\n private static getCrafatarSkinUrl(uuid: string): string {\n return \"https://crafatar.com/skins/\" + uuid;\n }\n\n private static getCrafatarCapeUrl(uuid: string): string {\n return \"https://crafatar.com/capes/\" + uuid;\n }\n\n private static getMcHeadsSkinUrl(uuid: string): string {\n return \"https://mc-heads.net/skin/\" + uuid;\n }\n\n private static getMineSkinPlayerSkinUrl(uuid: string): string {\n return \"https://mineskin.org/skin/player/\" + uuid;\n }\n\n private static getSkinProxySkinUrl(uuid: string): string {\n return \"https://minecraft-skin-proxy.inventive.workers.dev/skin/\" + uuid;\n }\n\n private static getSkinProxyCapeUrl(uuid: string): string {\n return \"https://minecraft-skin-proxy.inventive.workers.dev/cape/\" + uuid;\n }\n\n //</editor-fold>\n\n\n}\n","import { Block } from \"../model/block/Block\";\nimport { BlockObject, isBlockObject } from \"../model/block/scene/BlockObject\";\nimport { Box3, Object3D, Vector3 } from \"three\";\nimport { Maybe } from \"../util/util\";\nimport { BlockInfo } from \"./BlockInfo\";\nimport { MineRenderScene } from \"../renderer/MineRenderScene\";\nimport { BlockStates } from \"../assets/BlockStates\";\nimport { AssetKey } from \"../assets/AssetKey\";\nimport { MineRenderWorld } from \"./MineRenderWorld\";\nimport { isTripleArray, TripleArray } from \"../model/Model\";\nimport { addBox3WireframeToObject } from \"../util/model\";\nimport { prefix } from \"../util/log\";\n\nconst p = prefix(\"Chunk\");\n\nexport class Chunk {\n\n public readonly scene: MineRenderScene; //TODO: should probably be the world\n\n public readonly x: number;\n public readonly y: number;\n public readonly z: number;\n\n private readonly _blocks: BlockInfo[] = [];\n\n private readonly _anchor: Object3D;\n\n constructor(scene: MineRenderScene, x: number, y: number, z: number) {\n this.scene = scene;\n this.x = x;\n this.y = y;\n this.z = z;\n\n //TODO: option to visualize chunks\n let anchor = new Object3D();\n this._anchor = anchor;\n scene.add(anchor)\n anchor.position.set((this.x * 256) + 128 - 8, (this.y * 256) + 128 - 8, (this.z * 256) + 128 - 8);\n addBox3WireframeToObject(\n new Box3(new Vector3(0, 0, 0), new Vector3(256, 256, 256)),\n anchor,\n 0xffff00,\n 4);\n }\n\n public getBlockAt(x: number, y: number, z: number): Maybe<BlockInfo>;\n public getBlockAt(pos: Vector3): Maybe<BlockInfo>;\n public getBlockAt(pos: TripleArray): Maybe<BlockInfo>;\n public getBlockAt(posOrX: number | Vector3 | TripleArray, y?: number, z?: number): Maybe<BlockInfo> {\n if (typeof posOrX == \"number\") {\n return this.getBlockAt(new Vector3(posOrX, y, z));\n }\n if (isTripleArray(posOrX)) {\n return this.getBlockAt(new Vector3(posOrX[0], posOrX[1], posOrX[2]))\n }\n const pos: Vector3 = this.worldPosToChunkPos(posOrX);\n const index = Chunk.chunkPosToBlockIndex(pos);\n return this._blocks[index];\n }\n\n /**\n * Set block at a _world_ position\n */\n public async setBlockAt(x: number, y: number, z: number, block: Maybe<Block>): Promise<Maybe<BlockInfo>>;\n public async setBlockAt(pos: Vector3, block: Maybe<Block>): Promise<Maybe<BlockInfo>>;\n public async setBlockAt(pos: TripleArray, block: Maybe<Block>): Promise<Maybe<BlockInfo>>;\n public async setBlockAt(posOrX: number | Vector3 | TripleArray, yOrBlock?: number | Block, z?: number, block?: Block): Promise<Maybe<BlockInfo>> {\n if (typeof posOrX == \"number\") {\n return this.setBlockAt(new Vector3(posOrX, yOrBlock as number, z), block as Block);\n }\n if (isTripleArray(posOrX)) {\n return this.setBlockAt(new Vector3(posOrX[0], posOrX[1], posOrX[2]), yOrBlock as Block);\n }\n const worldPos: Vector3 = posOrX;\n const pos: Vector3 = this.worldPosToChunkPos(worldPos);\n block = yOrBlock as Block;\n\n return this.setBlockInChunkAt(pos, block, worldPos);\n }\n\n /**\n * Set block at a _chunk_ position (0-16)\n */\n public async setBlockInChunkAt(pos: Vector3, block?: Block, worldPos?: Vector3): Promise<Maybe<BlockInfo>> {\n if (typeof worldPos === \"undefined\") {\n worldPos = this.chunkPosToWorldPos(pos);\n }\n\n const index = Chunk.chunkPosToBlockIndex(pos);\n const current = this._blocks[index];\n if (typeof current !== \"undefined\") {\n console.debug(p, \"deleting existing block at\", pos, worldPos, index);\n // current.object.setScale(new Vector3(0, 0, 0));//TODO\n current.object.removeFromScene();\n delete this._blocks[index];\n }\n\n if (typeof block === \"undefined\" || typeof block.type === \"undefined\" || block.type === \"air\") return undefined; // only delete block\n\n const blockState = await BlockStates.get(AssetKey.parse(\"blockstates\", block.type));\n if (blockState) {\n const blockObject: BlockObject = await this.scene.addBlock(blockState, {\n mergeMeshes: true,\n instanceMeshes: true,\n wireframe: true,\n maxInstanceCount: 2000 //TODO: setting this to high kills FPS; increase on demand somehow?\n }) as BlockObject;//TODO\n if (block.properties) {\n await blockObject.setState(block.properties);\n }\n\n const scenePos = MineRenderWorld.worldToScenePosition(worldPos);\n blockObject.setPosition(scenePos);\n\n this._blocks[index] = {\n block: block,\n object: blockObject as BlockObject\n }\n return this._blocks[index];\n }\n return undefined;\n }\n\n public async clear(): Promise<void> {\n let promises: Promise<any>[] = [];\n let pos = new Vector3();\n for (let x = 0; x < 16; x++) {\n for (let z = 0; z < 16; z++) {\n for (let y = 0; y < 16; y++) {\n promises.push(this.setBlockInChunkAt(pos.set(x,y,z), undefined));\n }\n }\n }\n return Promise.all(promises).then(ignored => {\n });\n }\n\n public async dispose(): Promise<void> {\n await this.clear();\n this.scene.remove(this._anchor);\n }\n\n static chunkPosToBlockIndex(pos: Vector3): number {\n return (pos.y * 16 * 16) + (pos.z * 16) + pos.x;\n }\n\n worldPosToChunkPos(pos: Vector3): Vector3 {\n return new Vector3(\n pos.x - (this.x * 16),\n pos.y - (this.y * 16),\n pos.z - (this.z * 16)\n )\n }\n\n chunkPosToWorldPos(pos: Vector3): Vector3 {\n return new Vector3(\n (this.x * 16) + pos.x,\n (this.y * 16) + pos.y,\n (this.z * 16) + pos.z\n );\n }\n\n}\n","import { MineRenderScene } from \"../renderer/MineRenderScene\";\nimport { Block } from \"../model/block/Block\";\nimport { BlockObject } from \"../model/block/scene/BlockObject\";\nimport { Vector3 } from \"three\";\nimport { isTripleArray, TripleArray } from \"../model/Model\";\nimport { isVector3, Maybe } from \"../util/util\";\nimport { Chunk } from \"./Chunk\";\nimport { BlockInfo } from \"./BlockInfo\";\nimport { MultiBlockBlock, MultiBlockStructure } from \"../model/multiblock/MultiBlockStructure\";\nimport { BatchedExecutor } from \"../util/BatchedExecutor\";\nimport { AssetKey } from \"../assets/AssetKey\";\nimport { BlockStates } from \"../assets/BlockStates\";\n\n//TODO: maybe make this an Object3D to add children\nexport class MineRenderWorld {\n\n public readonly scene: MineRenderScene;\n\n private _size: number = 4; //TODO: expandable\n private _blockSize: number = this._size * 16;\n\n private readonly _chunks: Map<string,Chunk> = new Map<string, Chunk>();\n\n constructor(scene: MineRenderScene) {\n this.scene = scene;\n }\n\n public getBlockAt(x: number, y: number, z: number): Maybe<BlockInfo>;\n public getBlockAt(pos: Vector3): Maybe<BlockInfo>;\n public getBlockAt(pos: TripleArray): Maybe<BlockInfo>;\n public getBlockAt(posOrX: number | Vector3 | TripleArray, y?: number, z?: number): Maybe<BlockInfo> {\n if (typeof posOrX == \"number\") {\n return this.getBlockAt(new Vector3(posOrX, y, z));\n }\n if (isTripleArray(posOrX)) {\n return this.getBlockAt(new Vector3(posOrX[0], posOrX[1], posOrX[2]))\n }\n const chunk = this.getChunkAt(posOrX);\n if (typeof chunk === \"undefined\") {\n return undefined;\n }\n this.validatePosBounds(posOrX);\n return chunk.getBlockAt(posOrX);\n }\n\n public async setBlockAt(x: number, y: number, z: number, block: Block): Promise<Maybe<BlockInfo>>;\n public async setBlockAt(pos: Vector3, block: Block): Promise<Maybe<BlockInfo>>;\n public async setBlockAt(pos: TripleArray, block: Block): Promise<Maybe<BlockInfo>>;\n public async setBlockAt(posOrX: number | Vector3 | TripleArray, yOrBlock?: number | Block, z?: number, block?: Block): Promise<Maybe<BlockInfo>> {\n if (typeof posOrX == \"number\") {\n return this.setBlockAt(new Vector3(posOrX, yOrBlock as number, z), block as Block);\n }\n if (isTripleArray(posOrX)) {\n return this.setBlockAt(new Vector3(posOrX[0], posOrX[1], posOrX[2]), yOrBlock as Block);\n }\n this.validatePosBounds(posOrX);\n const chunk = this.getOrCreateChunkAt(posOrX);\n return chunk.setBlockAt(posOrX, yOrBlock as Block);\n }\n\n\n public async placeMultiBlock(multiblock: MultiBlockStructure, useBatches: boolean = true, executor: BatchedExecutor = new BatchedExecutor()): Promise<void> {\n // preload blockstates\n const keys = new Set<AssetKey>(multiblock.blocks.map(block => AssetKey.parse(\"blockstates\", block.type)));\n await BlockStates.getAll(keys);\n\n const place = async (block: MultiBlockBlock) => {\n if (useBatches && typeof executor !== \"undefined\") {\n await new Promise((resolve, reject) => {\n executor.submit(() => {\n this.setBlockAt(block.position, block).then(resolve).catch(reject)\n })\n });\n } else {\n await this.setBlockAt(block.position, block);\n }\n }\n for (let block of multiblock.blocks) {\n await place(block);\n }\n }\n\n\n public async clear(): Promise<void> {\n console.log(\"CHUNKS\",this._chunks)\n\n for (let chunk of this._chunks.values()) {\n console.log(\"dispose chunk\",chunk)\n await chunk?.dispose();\n }\n this._chunks.clear();\n }\n\n private getOrCreateChunkAt(pos: Vector3): Chunk {\n const key = this.worldPosToChunkKey(pos);\n let chunk = this._chunks.get(key);\n if (typeof chunk === \"undefined\") {\n chunk = new Chunk(this.scene, Math.floor(pos.x / 16), Math.floor(pos.y / 16), Math.floor(pos.z / 16));\n this._chunks.set(key, chunk);\n }\n return chunk;\n }\n\n public getChunkAt(pos: Vector3): Maybe<Chunk> {\n const index = this.worldPosToChunkIndex(pos);\n return this._chunks[index];\n }\n\n\n static worldToScenePosition(pos: Vector3): Vector3 {\n return new Vector3(\n pos.x * 16.0,\n pos.y * 16.0,\n pos.z * 16.0\n );\n }\n\n static sceneToWorldPosition(pos: Vector3): Vector3 {\n return new Vector3(\n pos.x / 16.0,\n pos.y / 16.0,\n pos.z / 16.0\n );\n }\n\n worldPosToChunkIndex(pos: Vector3): number {\n const chunkX = Math.floor(pos.x / 16);\n const chunkY = Math.floor(pos.y / 16);\n const chunkZ = Math.floor(pos.z / 16);\n return (chunkZ * this._size * this._size) + (chunkY * this._size) + chunkX;\n }\n\n worldPosToChunkKey(pos: Vector3): string {\n const chunkX = Math.floor(pos.x / 16);\n const chunkY = Math.floor(pos.y / 16);\n const chunkZ = Math.floor(pos.z / 16);\n return `${chunkX}_${chunkY}_${chunkZ}`;\n }\n\n validatePosBounds(pos: Vector3): void {\n if (pos.x < 0) throw new Error(\"x<0\");\n if (pos.y < 0) throw new Error(\"y<0\");\n if (pos.z < 0) throw new Error(\"z<0\");\n if (pos.x > this._blockSize) throw new Error(\"x>\" + this._blockSize);\n if (pos.y > this._blockSize) throw new Error(\"y>\" + this._blockSize);\n if (pos.z > this._blockSize) throw new Error(\"z>\" + this._blockSize);\n }\n\n}\n"],"mappings":"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","names":["merge","Axis","CubeFace","CubeFaceIndex","Texture","createCanvas","Time","prefix","BoxGeometry","Vector3","Vector3","BoxGeometry","Time","Buffer","p","createCanvas","Buffer","Texture","Mesh","Mesh","Float32BufferAttribute","split","p","merge","p","AssetParser","Memoize","Memoize","import_ts_deepmerge","p","merge","p","import_ts_deepmerge","p","merge","createCanvas","p","Float32BufferAttribute","_a","Memoize","Memoize","Matrix4","Mesh","Object3D","Quaternion","Vector3","import_ts_deepmerge","p","Object3D","merge","Mesh","Matrix4","Vector3","Quaternion","import_ts_deepmerge","Object3D","THREE","merge","Object3D","Vector2","p","Vector2","p","DisplayPosition","GuiLight","BoxGeometry","Matrix4","BufferAttribute","Float32BufferAttribute","Vector3","buffer","object","material","morphTargetsRelative","a","b","c","i","il","import_ts_deepmerge","p","merge","Matrix4","BoxGeometry","import_ts_deepmerge","Euler","Matrix4","Vector3","p","merge","Vector3","Euler","Matrix4","Scene","import_ts_deepmerge","SkinPart","import_ts_deepmerge","merge","Scene","merge","AxesHelper","Vector3","import_ts_deepmerge","Quaternion","Vector2","Vector3","panLeft","panUp","pan","merge","AxesHelper","changeEvent","Vector3","Box3","Object3D","Vector3","Vector3","Vector3","p","Object3D","Box3","Vector3"]}