minerender 2.1.0-beta.6 → 2.1.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/esm/Materials.mjs +3 -1
- package/dist/browser/esm/Materials.mjs.map +1 -1
- package/dist/browser/esm/Ticker.mjs +3 -1
- package/dist/browser/esm/Ticker.mjs.map +1 -1
- package/dist/browser/esm/UVMapper.mjs +9 -9
- package/dist/browser/esm/UVMapper.mjs.map +1 -1
- package/dist/browser/esm/assets/AssetDefaults.mjs +8 -0
- package/dist/browser/esm/assets/AssetDefaults.mjs.map +1 -0
- package/dist/browser/esm/assets/AssetKey.mjs +1 -1
- package/dist/browser/esm/assets/AssetKey.mjs.map +1 -1
- package/dist/browser/esm/assets/AssetLoader.mjs +5 -5
- package/dist/browser/esm/assets/AssetLoader.mjs.map +1 -1
- package/dist/browser/esm/assets/Assets.mjs +1 -5
- package/dist/browser/esm/assets/Assets.mjs.map +1 -1
- package/dist/browser/esm/assets/BlockEntities.mjs +3 -1
- package/dist/browser/esm/assets/BlockEntities.mjs.map +1 -1
- package/dist/browser/esm/assets/BlockStates.mjs +1 -1
- package/dist/browser/esm/assets/BlockStates.mjs.map +1 -1
- package/dist/browser/esm/assets/Entities.mjs +1 -1
- package/dist/browser/esm/assets/Entities.mjs.map +1 -1
- package/dist/browser/esm/assets/Models.mjs +1 -1
- package/dist/browser/esm/assets/Models.mjs.map +1 -1
- package/dist/browser/esm/assets/_fonts/Unihex.mjs +5 -3
- package/dist/browser/esm/assets/_fonts/Unihex.mjs.map +1 -1
- package/dist/browser/esm/assets/index.mjs +1 -0
- package/dist/browser/esm/assets/index.mjs.map +1 -1
- package/dist/browser/esm/assets/source/HostedAssetSource.mjs +7 -8
- package/dist/browser/esm/assets/source/HostedAssetSource.mjs.map +1 -1
- package/dist/browser/esm/env/browser/BrowserCache.mjs +3 -3
- package/dist/browser/esm/env/browser/BrowserCache.mjs.map +1 -1
- package/dist/browser/esm/image/ImageLoader.mjs +3 -3
- package/dist/browser/esm/image/ImageLoader.mjs.map +1 -1
- package/dist/browser/esm/index.browser.d.mts +64 -11
- package/dist/browser/esm/inspector/SceneInspector.mjs +3 -3
- package/dist/browser/esm/inspector/SceneInspector.mjs.map +1 -1
- package/dist/browser/esm/instance/InstanceManager.mjs +4 -4
- package/dist/browser/esm/instance/InstanceManager.mjs.map +1 -1
- package/dist/browser/esm/model/block/scene/BlockObject.mjs +3 -1
- package/dist/browser/esm/model/block/scene/BlockObject.mjs.map +1 -1
- package/dist/browser/esm/model/multiblock/StructureParser.mjs +7 -4
- package/dist/browser/esm/model/multiblock/StructureParser.mjs.map +1 -1
- package/dist/browser/esm/model/scene/ModelObject.mjs +4 -4
- package/dist/browser/esm/model/scene/ModelObject.mjs.map +1 -1
- package/dist/browser/esm/nbt/NBTHelper.mjs +5 -2
- package/dist/browser/esm/nbt/NBTHelper.mjs.map +1 -1
- package/dist/browser/esm/renderer/Renderer.mjs +4 -2
- package/dist/browser/esm/renderer/Renderer.mjs.map +1 -1
- package/dist/browser/esm/renderer/SceneObject.mjs +0 -6
- package/dist/browser/esm/renderer/SceneObject.mjs.map +1 -1
- package/dist/browser/esm/request/Requests.mjs +3 -3
- package/dist/browser/esm/request/Requests.mjs.map +1 -1
- package/dist/browser/esm/skin/Skins.mjs +6 -4
- package/dist/browser/esm/skin/Skins.mjs.map +1 -1
- package/dist/browser/esm/texture/TextureLoader.mjs +4 -2
- package/dist/browser/esm/texture/TextureLoader.mjs.map +1 -1
- package/dist/browser/esm/util/log.mjs +75 -0
- package/dist/browser/esm/util/log.mjs.map +1 -1
- package/dist/browser/esm/util/performance.mjs.map +1 -1
- package/dist/browser/esm/world/Chunk.mjs +8 -5
- package/dist/browser/esm/world/Chunk.mjs.map +1 -1
- package/dist/browser/esm/world/MineRenderWorld.mjs +96 -54
- package/dist/browser/esm/world/MineRenderWorld.mjs.map +1 -1
- package/dist/browser/esm/world/WorldStreamer.mjs +21 -20
- package/dist/browser/esm/world/WorldStreamer.mjs.map +1 -1
- package/dist/browser/esm/world/_culling/BlockCulling.mjs +1 -1
- package/dist/browser/esm/world/_culling/BlockCulling.mjs.map +1 -1
- package/dist/browser/esm/world/_entities/WorldEntities.mjs +3 -1
- package/dist/browser/esm/world/_entities/WorldEntities.mjs.map +1 -1
- package/dist/browser/index.d.ts +64 -11
- package/dist/browser/index.js +3071 -2956
- package/dist/browser/index.js.map +1 -1
- package/dist/bundle.js +6095 -5975
- package/dist/bundle.js.map +1 -1
- package/dist/node/index.d.mts +64 -11
- package/dist/node/index.d.ts +64 -11
- package/dist/node/index.js +3095 -2978
- package/dist/node/index.js.map +1 -1
- package/dist/node/index.mjs +3087 -2971
- package/dist/node/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/renderer/Renderer.ts"],"sourcesContent":["import { AxesHelper, Camera, EventDispatcher, GridHelper, OrthographicCamera, PCFShadowMap, PerspectiveCamera, SRGBColorSpace, Vector3, WebGLRenderer } from \"three\";\nimport {MineRenderScene} from \"./MineRenderScene\";\nimport { merge } from \"../util/_internal/merge\";\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\";\nimport { FlyControls, isFlyControls } from \"./FlyControls\";\nimport { SceneExporter, SceneGLTFExportOptions } from \"../export/SceneExporter\";\nimport type { PLYExporterOptions } from \"three/examples/jsm/exporters/PLYExporter.js\";\nimport { trimCanvas } from \"../canvas/trimCanvas\";\nimport { VideoExporter, VideoExportOptions } from \"../export/VideoExporter\";\n\n/**\n * Renders a Minecraft scene with a camera and an optional effects composer.\n * Uses a browser canvas by default, or a caller-supplied {@link RendererSurface}.\n * Call {@link start} for browser animation or {@link renderOnce} for a single frame.\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 pixelRatio: 1,\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 mode: \"orbit\"\n },\n debug: {\n grid: false,\n axes: false\n }\n });\n public readonly options: RendererOptions;\n\n protected _element?: HTMLElement;\n\n private readonly _surface?: RendererSurface;\n private _width: number = 0;\n private _height: number = 0;\n\n protected _scene: MineRenderScene;\n protected _camera: Camera;\n protected _renderer: WebGLRenderer;\n protected _composer?: EffectComposer;\n protected _controls?: RendererControls;\n private _controlsTime?: number;\n private _orbitDistance?: number;\n\n protected _stats?: Stats;\n\n protected _dirty: boolean = true;\n\n protected _animationLoop;\n protected _frameInterval?: number;\n protected _resizeListener?: () => void = undefined;\n\n private _nextFrameTime?: number;\n private _running: boolean = false;\n private _inAnimationLoop: boolean = false;\n private _disposed: boolean = false;\n private _videoExporter?: VideoExporter;\n private readonly _frameCallbacks = new Map<FrameCallback, { previous?: number }>();\n private readonly _debugHelpers: Array<GridHelper | AxesHelper> = [];\n private readonly _eventDispatchers = new Map<EventDispatcher<any>, Set<string>>();\n private readonly _changeListener = () => {\n this._dirty = true;\n };\n\n constructor(options?: DeepPartial<RendererOptions>, surface?: RendererSurface) {\n this.options = merge({}, Renderer.DEFAULT_OPTIONS, options ?? {});\n const pixelRatio = this.options.render.pixelRatio ?? 1;\n if (!Number.isFinite(pixelRatio) || pixelRatio <= 0) {\n throw new RangeError(\"render.pixelRatio must be a finite positive number\");\n }\n this._surface = surface;\n if (surface) {\n this.validateSurfaceSize(surface.width, surface.height);\n this._width = surface.width;\n this._height = surface.height;\n }\n if (typeof document === \"undefined\") {\n if (this.options.render.stats) throw new Error(\"Renderer stats require a browser DOM\");\n if (this.options.controls?.enabled) throw new Error(\"Renderer controls require a browser DOM\");\n }\n\n this._animationLoop = (time: number) => {\n this._inAnimationLoop = true;\n try {\n this.animate(time);\n } catch (error) {\n this._videoExporter?.cancel(error);\n throw error;\n } finally {\n this._inAnimationLoop = false;\n }\n };\n this._frameInterval = 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 try {\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 } catch (error) {\n // Subclass resources are not initialized until this constructor returns.\n Renderer.prototype.dispose.call(this);\n throw error;\n }\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 if (!this._surface && typeof document === \"undefined\") {\n throw new Error(\"Renderer requires a browser canvas or an injected RendererSurface\");\n }\n const pixelRatio = this.options.render.pixelRatio ?? 1;\n this._surface?.resize?.(Math.floor(this.viewWidth * pixelRatio), Math.floor(this.viewHeight * pixelRatio));\n const renderer = new WebGLRenderer({\n canvas: this._surface?.canvas as HTMLCanvasElement | undefined,\n context: this._surface?.context,\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 = PCFShadowMap;\n\n renderer.outputColorSpace = SRGBColorSpace;\n\n if (this._surface) {\n renderer.setDrawingBufferSize(this.viewWidth, this.viewHeight, pixelRatio);\n } else {\n renderer.setPixelRatio(pixelRatio);\n renderer.setSize(this.viewWidth, this.viewHeight);\n }\n\n return renderer;\n }\n\n protected createComposer(): Maybe<EffectComposer> {\n if (!this.options.composer.enabled) return undefined;\n\n const composer = new EffectComposer(this.renderer);\n\n composer.setSize(this.viewWidth, this.viewHeight, !this._surface);\n //TODO: options\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<RendererControls> {\n if (!this.options.controls?.enabled) return undefined;\n return this.createControlsFor(this.options.controls.mode ?? \"orbit\", this.initialTarget());\n }\n\n private initialTarget(): Vector3 {\n const target = this.options.camera.lookingAt;\n if (isVector3(target)) return target.clone();\n if (isTripleArray(target)) return new Vector3(target[0], target[1], target[2]);\n return new Vector3();\n }\n\n private createControlsFor(mode: ControlsMode, target: Vector3): RendererControls {\n let controls: RendererControls;\n if (mode === \"fly\") {\n controls = new FlyControls(this.camera, this.renderer.domElement);\n controls.lookAt(target);\n controls.saveState();\n } else {\n // OrbitControls updates the camera around the origin during construction.\n const position = this.camera.position.clone();\n controls = new OrbitControls(this.camera, this.renderer.domElement);\n this.camera.position.copy(position);\n controls.target.copy(target);\n controls.update();\n controls.saveState();\n }\n this._controlsTime = undefined;\n this.registerEventDispatcher(controls);\n return controls;\n }\n\n /**\n * Replaces renderer-owned controls with the selected mode, keeping the camera where it is.\n * Switching to orbit controls targets the point the camera looks at, at the previous orbit distance.\n * The previous controls object is disposed, so its listeners and settings do not carry over.\n * Returns the new controls, or undefined when controls were disabled at construction or after disposal.\n */\n public setControlsMode(mode: ControlsMode): Maybe<RendererControls> {\n const current = this._controls;\n if (this._disposed || !current) return undefined;\n if (this.controlsMode === mode) return current;\n\n let target: Vector3;\n if (isFlyControls(current)) {\n const distance = this._orbitDistance ?? (this.camera.position.distanceTo(this.initialTarget()) || 1);\n target = new Vector3(0, 0, -distance).applyQuaternion(this.camera.quaternion).add(this.camera.position);\n } else {\n target = current.target.clone();\n this._orbitDistance = this.camera.position.distanceTo(target);\n }\n const enabled = current.enabled;\n this.disposeControls(current);\n this._controls = this.createControlsFor(mode, target);\n this._controls.enabled = enabled;\n this.dirty = true;\n return this._controls;\n }\n\n private disposeControls(controls: RendererControls): void {\n this._controls = undefined;\n this.unregisterEventDispatcher(controls);\n controls.enabled = false;\n controls.dispose();\n }\n\n /** Advances owned controls; without a frame time, flight movement does not progress. */\n private updateControls(time?: number): void {\n const controls = this._controls;\n if (!controls?.enabled) {\n this._controlsTime = undefined;\n return;\n }\n if (!isFlyControls(controls)) {\n controls.update();\n return;\n }\n const previous = this._controlsTime;\n if (time !== undefined) this._controlsTime = time;\n controls.update(time === undefined || previous === undefined ? 0 : (time - previous) / 1000);\n }\n\n //</editor-fold>\n\n public init() {\n if (this._disposed) return;\n\n if (typeof window !== \"undefined\" && 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 && typeof window !== \"undefined\") {\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 /** Attaches the canvas to an element and sizes it to that element's dimensions. */\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<any>, 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 private unregisterEventDispatcher(dispatcher: EventDispatcher<any>): void {\n const events = this._eventDispatchers.get(dispatcher);\n if (!events) return;\n for (const event of events) dispatcher.removeEventListener(event, this._changeListener);\n this._eventDispatchers.delete(dispatcher);\n }\n\n /** Updates the camera and canvas size. Width and height are in CSS pixels. */\n public resize(width: number, height: number) {\n if (this._disposed) return;\n if (this._surface) {\n this.validateSurfaceSize(width, height);\n const pixelRatio = this.renderer.getPixelRatio();\n this._surface.resize?.(Math.floor(width * pixelRatio), Math.floor(height * pixelRatio));\n }\n this._width = width;\n this._height = height;\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, !this._surface);\n this.composer?.setSize(width, height, !this._surface);\n this._dirty = true;\n }\n\n private validateSurfaceSize(width: number, height: number): void {\n const pixelRatio = this._renderer?.getPixelRatio() ?? this.options.render.pixelRatio ?? 1;\n for (const value of [width, height]) {\n if (!Number.isSafeInteger(value) || value <= 0 || !Number.isSafeInteger(Math.floor(value * pixelRatio)) || Math.floor(value * pixelRatio) <= 0) {\n throw new RangeError(\"RendererSurface dimensions must be positive integers with positive drawing-buffer dimensions\");\n }\n }\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 /**\n * Calls a synchronous animation update before each FPS-limited draw while started.\n * Subscriptions keep the scene drawing without manual dirty flags. Returns an unsubscribe function.\n * Registering the same callback twice has no effect. Image exports do not invoke callbacks.\n */\n public onFrame(callback: FrameCallback): () => void {\n if (this._disposed) return () => {};\n const subscription = this._frameCallbacks.get(callback) ?? {};\n this._frameCallbacks.set(callback, subscription);\n return () => {\n if (this._frameCallbacks.get(callback) === subscription) this._frameCallbacks.delete(callback);\n };\n }\n\n /** Starts or resumes the animation loop and registered frame callbacks. Has no effect while running. */\n public start() {\n if (this._disposed || this._running) return;\n\n this.stop();\n this._running = true;\n if (!this._inAnimationLoop) this.renderer.setAnimationLoop(this._animationLoop);\n }\n\n /** Pauses rendering and frame callbacks, and cancels video export. Call {@link start} to resume. */\n public stop() {\n if (this._disposed) return;\n\n this._videoExporter?.cancel();\n this._videoExporter = undefined;\n this._running = false;\n if (this._inAnimationLoop) {\n // Three schedules its next frame after the callback; apply loop changes after that scheduling.\n queueMicrotask(() => {\n this.renderer.setAnimationLoop(null);\n if (this._running) this.renderer.setAnimationLoop(this._animationLoop);\n });\n } else {\n this.renderer.setAnimationLoop(null);\n }\n this._nextFrameTime = undefined;\n this._controlsTime = undefined;\n for (const subscription of this._frameCallbacks.values()) subscription.previous = 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 this._frameCallbacks.clear();\n\n if (this._resizeListener && typeof window !== \"undefined\") {\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 if (!this._surface || (this._element && this.renderer.domElement.parentElement === this._element)) {\n this.renderer.domElement.remove();\n }\n this._element = undefined;\n\n if (this._controls) {\n this.disposeControls(this._controls);\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 if (!this._surface) this.renderer.forceContextLoss();\n }\n\n private animate(t: number = performance.now()): void {\n if (!this._running) return;\n\n // Damping, auto-rotation, and held movement keys can make a previously clean scene need another frame.\n this.updateControls(t);\n if (!this._running) return;\n if (!this.dirty && !this.options.render.renderAlways && !this._frameCallbacks.size && !this._videoExporter) return;\n\n const interval = this._frameInterval;\n if (interval) {\n const next = this._nextFrameTime;\n // Allow for rounded animation timestamps without losing a pending redraw.\n if (next !== undefined && t + 0.1 < next) return;\n // Keep fractional intervals, but do not catch up after idle periods or long frames.\n this._nextFrameTime = next !== undefined && t - next < interval ? next + interval : t + interval;\n }\n\n for (const [callback, subscription] of [...this._frameCallbacks]) {\n if (this._frameCallbacks.get(callback) !== subscription) continue;\n const previous = subscription.previous;\n subscription.previous = t;\n callback({ time: t / 1000, delta: previous === undefined ? 0 : (t - previous) / 1000 });\n if (!this._running) return;\n }\n this.drawFrame();\n }\n\n private drawFrame(): void {\n if (this._stats) {\n this._stats.begin();\n }\n\n if (this.options.composer.enabled && this.composer) {\n this.composer.render();\n } else {\n this.renderer.render(this.scene, this.camera);\n }\n\n this._videoExporter?.capture();\n this.dirty = false;\n\n if (this._stats) {\n this._stats.end();\n }\n\n }\n\n //</editor-fold>\n\n /** Draws a fresh frame without starting the animation loop or invoking frame callbacks. */\n public renderOnce(): void {\n if (this._disposed) throw new Error(\"Cannot render a disposed renderer\");\n this.updateControls();\n this.drawFrame();\n }\n\n /**\n * Renders a fresh frame and returns an image data URL, including while the animation loop is stopped.\n * Trimming removes transparent borders; an empty image becomes one transparent pixel.\n * MIME type support and lossy quality (0–1) follow the canvas encoder.\n */\n public toImage(trim: boolean = false, mime: string = \"image/png\", quality?: number): string {\n if (this._disposed) throw new Error(\"Cannot export an image from a disposed renderer\");\n // Read the drawing buffer in the same task as the draw, before WebGL can clear it.\n this.renderOnce();\n const canvas = trim ? trimCanvas(this.renderer.domElement) : this.renderer.domElement;\n return (canvas as HTMLCanvasElement).toDataURL(mime, quality);\n }\n\n /**\n * Records a silent browser video in real time, including frame callbacks and animated textures.\n * Keep the tab visible; browser scheduling and `render.fpsLimit` limit the capture rate.\n * The video keeps the initial drawing-buffer size and fills transparent pixels with black.\n * Temporarily starts a stopped renderer. Stop, disposal, or `options.signal` cancels the export.\n * Only one export can run at a time. Use the returned Blob's type to select a file extension.\n */\n public async toVideo(options: VideoExportOptions): Promise<Blob> {\n if (this._disposed) throw new Error(\"Cannot export a video from a disposed renderer\");\n if (this._videoExporter) throw new Error(\"A video export is already running\");\n\n const exporter = new VideoExporter(this.renderer.domElement, options);\n const wasRunning = this._running;\n try {\n try {\n if (!wasRunning) this.start();\n this._videoExporter = exporter;\n this.updateControls();\n this.drawFrame();\n } catch (error) {\n exporter.cancel(error);\n }\n return await exporter.result;\n } finally {\n if (this._videoExporter === exporter) {\n this._videoExporter = undefined;\n if (!wasRunning) this.stop();\n }\n }\n }\n\n /** Exports visible scene meshes as OBJ text, without texture images. */\n public toObj(): string {\n return SceneExporter.toObj(this.scene);\n }\n\n /** Exports visible scene meshes as PLY. Set `options.binary` for an ArrayBuffer. */\n public toPLY(options?: PLYExporterOptions): string | ArrayBuffer {\n return SceneExporter.toPLY(this.scene, options);\n }\n\n /** Exports a static textured scene in the browser. Set `options.binary` for GLB output. */\n public toGLTF(options?: SceneGLTFExportOptions): Promise<Record<string, any> | ArrayBuffer> {\n return SceneExporter.toGLTF(this.scene, options);\n }\n\n ///\n\n protected get attachedToBody() {\n return typeof document !== \"undefined\" && this.element === document.body;\n }\n\n protected get viewWidth() {\n return typeof window !== \"undefined\" && this.attachedToBody ? window.innerWidth : this.element?.offsetWidth ?? this._width;\n }\n\n protected get viewHeight() {\n return typeof window !== \"undefined\" && this.attachedToBody ? window.innerHeight : this.element?.offsetHeight ?? this._height;\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(): Maybe<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<RendererControls> {\n return this._controls;\n }\n\n /** Renderer-owned OrbitControls, or undefined in fly mode or without controls. */\n public get orbitControls(): Maybe<OrbitControls> {\n return this._controls && !isFlyControls(this._controls) ? this._controls : undefined;\n }\n\n /** Renderer-owned {@link FlyControls}, or undefined in orbit mode or without controls. */\n public get flyControls(): Maybe<FlyControls> {\n return isFlyControls(this._controls) ? this._controls : undefined;\n }\n\n /** The active renderer-owned controls mode, or undefined without controls. */\n public get controlsMode(): Maybe<ControlsMode> {\n if (!this._controls) return undefined;\n return isFlyControls(this._controls) ? \"fly\" : \"orbit\";\n }\n\n ///\n\n\n}\n\n/** Caller-owned canvas and WebGL 2 context for rendering without a browser DOM. */\nexport interface RendererSurface {\n canvas: Pick<HTMLCanvasElement, \"width\" | \"height\" | \"addEventListener\" | \"removeEventListener\">;\n context: WebGL2RenderingContext;\n /** Initial logical dimensions, before applying `render.pixelRatio`. */\n width: number;\n height: number;\n /** Resizes the native drawing buffer when assigning canvas dimensions is insufficient. */\n resize?: (drawingBufferWidth: number, drawingBufferHeight: number) => void;\n}\n\n/** Timing passed to callbacks registered with {@link Renderer.onFrame}. */\nexport interface RendererFrame {\n /** Animation-loop timestamp in seconds, relative to the browser's performance time origin. */\n readonly time: number;\n /** Seconds since this callback's previous update; zero on its first update after subscribing or starting. */\n readonly delta: number;\n}\n\n/** A synchronous scene update registered with {@link Renderer.onFrame}. */\nexport type FrameCallback = (frame: RendererFrame) => void;\n\n/** Settings for `new Renderer(options)`. Omitted values use {@link Renderer.DEFAULT_OPTIONS}. */\nexport interface RendererOptions {\n camera: CameraOptions;\n render: RenderOptions;\n composer: ComposerOptions;\n controls?: ControlsOptions;\n debug: DebugOptions;\n}\n\n/** Camera settings passed as `camera` in the Renderer constructor options. Positions use scene units. */\nexport interface CameraOptions {\n type: \"perspective\" | \"orthographic\";\n near: number;\n far: number;\n perspective: {\n aspect: undefined | number;\n /** Vertical field of view in degrees. */\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\n/** Canvas and draw-loop settings passed as `render` in the Renderer constructor options. */\nexport interface RenderOptions {\n /** Maximum draw rate (60 by default); zero or a negative value disables the limit. */\n fpsLimit: number;\n /** Drawing-buffer pixels per CSS pixel (default 1); also scales toImage() output. */\n pixelRatio?: number;\n stats: boolean;\n antialias: boolean;\n shade: boolean;\n /** Resizes to the attached element when the browser window resizes. */\n autoResize: boolean;\n /** Draws even when the scene is unchanged, while still respecting `fpsLimit`. */\n renderAlways: boolean;\n}\n\n/** Effects settings passed as `composer` in the Renderer constructor options. */\nexport interface ComposerOptions {\n enabled: boolean;\n}\n\n/** Renderer-owned camera controls: orbiting around a target, or creative-style flight. */\nexport type ControlsMode = \"orbit\" | \"fly\";\n\n/** Controls created through `controls.enabled`; narrow with `isFlyControls` or {@link Renderer.controlsMode}. */\nexport type RendererControls = OrbitControls | FlyControls;\n\n/** Set `controls: { enabled: true }` in the Renderer constructor to create owned controls. */\nexport interface ControlsOptions {\n enabled: boolean;\n /** `orbit` (default) creates OrbitControls; `fly` creates {@link FlyControls}. */\n mode?: ControlsMode;\n}\n\n/** Scene helpers enabled through `debug` in the Renderer constructor options. */\nexport interface DebugOptions {\n grid: boolean;\n axes: boolean;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/renderer/Renderer.ts"],"sourcesContent":["import { AxesHelper, Camera, EventDispatcher, GridHelper, OrthographicCamera, PCFShadowMap, PerspectiveCamera, SRGBColorSpace, Vector3, WebGLRenderer } from \"three\";\nimport {MineRenderScene} from \"./MineRenderScene\";\nimport { merge } from \"../util/_internal/merge\";\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\";\nimport { FlyControls, isFlyControls } from \"./FlyControls\";\nimport { SceneExporter, SceneGLTFExportOptions } from \"../export/SceneExporter\";\nimport type { PLYExporterOptions } from \"three/examples/jsm/exporters/PLYExporter.js\";\nimport { trimCanvas } from \"../canvas/trimCanvas\";\nimport { VideoExporter, VideoExportOptions } from \"../export/VideoExporter\";\nimport { logger } from \"../util/log\";\n\nconst log = logger(\"Renderer\");\n\n/**\n * Renders a Minecraft scene with a camera and an optional effects composer.\n * Uses a browser canvas by default, or a caller-supplied {@link RendererSurface}.\n * Call {@link start} for browser animation or {@link renderOnce} for a single frame.\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 pixelRatio: 1,\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 mode: \"orbit\"\n },\n debug: {\n grid: false,\n axes: false\n }\n });\n public readonly options: RendererOptions;\n\n protected _element?: HTMLElement;\n\n private readonly _surface?: RendererSurface;\n private _width: number = 0;\n private _height: number = 0;\n\n protected _scene: MineRenderScene;\n protected _camera: Camera;\n protected _renderer: WebGLRenderer;\n protected _composer?: EffectComposer;\n protected _controls?: RendererControls;\n private _controlsTime?: number;\n private _orbitDistance?: number;\n\n protected _stats?: Stats;\n\n protected _dirty: boolean = true;\n\n protected _animationLoop;\n protected _frameInterval?: number;\n protected _resizeListener?: () => void = undefined;\n\n private _nextFrameTime?: number;\n private _running: boolean = false;\n private _inAnimationLoop: boolean = false;\n private _disposed: boolean = false;\n private _videoExporter?: VideoExporter;\n private readonly _frameCallbacks = new Map<FrameCallback, { previous?: number }>();\n private readonly _debugHelpers: Array<GridHelper | AxesHelper> = [];\n private readonly _eventDispatchers = new Map<EventDispatcher<any>, Set<string>>();\n private readonly _changeListener = () => {\n this._dirty = true;\n };\n\n constructor(options?: DeepPartial<RendererOptions>, surface?: RendererSurface) {\n this.options = merge({}, Renderer.DEFAULT_OPTIONS, options ?? {});\n const pixelRatio = this.options.render.pixelRatio ?? 1;\n if (!Number.isFinite(pixelRatio) || pixelRatio <= 0) {\n throw new RangeError(\"render.pixelRatio must be a finite positive number\");\n }\n this._surface = surface;\n if (surface) {\n this.validateSurfaceSize(surface.width, surface.height);\n this._width = surface.width;\n this._height = surface.height;\n }\n if (typeof document === \"undefined\") {\n if (this.options.render.stats) throw new Error(\"Renderer stats require a browser DOM\");\n if (this.options.controls?.enabled) throw new Error(\"Renderer controls require a browser DOM\");\n }\n\n this._animationLoop = (time: number) => {\n this._inAnimationLoop = true;\n try {\n this.animate(time);\n } catch (error) {\n this._videoExporter?.cancel(error);\n throw error;\n } finally {\n this._inAnimationLoop = false;\n }\n };\n this._frameInterval = 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 try {\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 } catch (error) {\n // Subclass resources are not initialized until this constructor returns.\n Renderer.prototype.dispose.call(this);\n throw error;\n }\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 if (!this._surface && typeof document === \"undefined\") {\n throw new Error(\"Renderer requires a browser canvas or an injected RendererSurface\");\n }\n const pixelRatio = this.options.render.pixelRatio ?? 1;\n this._surface?.resize?.(Math.floor(this.viewWidth * pixelRatio), Math.floor(this.viewHeight * pixelRatio));\n const renderer = new WebGLRenderer({\n canvas: this._surface?.canvas as HTMLCanvasElement | undefined,\n context: this._surface?.context,\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 = PCFShadowMap;\n\n renderer.outputColorSpace = SRGBColorSpace;\n\n if (this._surface) {\n renderer.setDrawingBufferSize(this.viewWidth, this.viewHeight, pixelRatio);\n } else {\n renderer.setPixelRatio(pixelRatio);\n renderer.setSize(this.viewWidth, this.viewHeight);\n }\n\n return renderer;\n }\n\n protected createComposer(): Maybe<EffectComposer> {\n if (!this.options.composer.enabled) return undefined;\n\n const composer = new EffectComposer(this.renderer);\n\n composer.setSize(this.viewWidth, this.viewHeight, !this._surface);\n //TODO: options\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<RendererControls> {\n if (!this.options.controls?.enabled) return undefined;\n return this.createControlsFor(this.options.controls.mode ?? \"orbit\", this.initialTarget());\n }\n\n private initialTarget(): Vector3 {\n const target = this.options.camera.lookingAt;\n if (isVector3(target)) return target.clone();\n if (isTripleArray(target)) return new Vector3(target[0], target[1], target[2]);\n return new Vector3();\n }\n\n private createControlsFor(mode: ControlsMode, target: Vector3): RendererControls {\n let controls: RendererControls;\n if (mode === \"fly\") {\n controls = new FlyControls(this.camera, this.renderer.domElement);\n controls.lookAt(target);\n controls.saveState();\n } else {\n // OrbitControls updates the camera around the origin during construction.\n const position = this.camera.position.clone();\n controls = new OrbitControls(this.camera, this.renderer.domElement);\n this.camera.position.copy(position);\n controls.target.copy(target);\n controls.update();\n controls.saveState();\n }\n this._controlsTime = undefined;\n this.registerEventDispatcher(controls);\n return controls;\n }\n\n /**\n * Replaces renderer-owned controls with the selected mode, keeping the camera where it is.\n * Switching to orbit controls targets the point the camera looks at, at the previous orbit distance.\n * The previous controls object is disposed, so its listeners and settings do not carry over.\n * Returns the new controls, or undefined when controls were disabled at construction or after disposal.\n */\n public setControlsMode(mode: ControlsMode): Maybe<RendererControls> {\n const current = this._controls;\n if (this._disposed || !current) return undefined;\n if (this.controlsMode === mode) return current;\n\n let target: Vector3;\n if (isFlyControls(current)) {\n const distance = this._orbitDistance ?? (this.camera.position.distanceTo(this.initialTarget()) || 1);\n target = new Vector3(0, 0, -distance).applyQuaternion(this.camera.quaternion).add(this.camera.position);\n } else {\n target = current.target.clone();\n this._orbitDistance = this.camera.position.distanceTo(target);\n }\n const enabled = current.enabled;\n this.disposeControls(current);\n this._controls = this.createControlsFor(mode, target);\n this._controls.enabled = enabled;\n this.dirty = true;\n return this._controls;\n }\n\n private disposeControls(controls: RendererControls): void {\n this._controls = undefined;\n this.unregisterEventDispatcher(controls);\n controls.enabled = false;\n controls.dispose();\n }\n\n /** Advances owned controls; without a frame time, flight movement does not progress. */\n private updateControls(time?: number): void {\n const controls = this._controls;\n if (!controls?.enabled) {\n this._controlsTime = undefined;\n return;\n }\n if (!isFlyControls(controls)) {\n controls.update();\n return;\n }\n const previous = this._controlsTime;\n if (time !== undefined) this._controlsTime = time;\n controls.update(time === undefined || previous === undefined ? 0 : (time - previous) / 1000);\n }\n\n //</editor-fold>\n\n public init() {\n if (this._disposed) return;\n\n if (typeof window !== \"undefined\" && 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 && typeof window !== \"undefined\") {\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 /** Attaches the canvas to an element and sizes it to that element's dimensions. */\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 log.warn('0 element width');\n }\n if (this.viewHeight == 0) {\n log.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<any>, 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 private unregisterEventDispatcher(dispatcher: EventDispatcher<any>): void {\n const events = this._eventDispatchers.get(dispatcher);\n if (!events) return;\n for (const event of events) dispatcher.removeEventListener(event, this._changeListener);\n this._eventDispatchers.delete(dispatcher);\n }\n\n /** Updates the camera and canvas size. Width and height are in CSS pixels. */\n public resize(width: number, height: number) {\n if (this._disposed) return;\n if (this._surface) {\n this.validateSurfaceSize(width, height);\n const pixelRatio = this.renderer.getPixelRatio();\n this._surface.resize?.(Math.floor(width * pixelRatio), Math.floor(height * pixelRatio));\n }\n this._width = width;\n this._height = height;\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, !this._surface);\n this.composer?.setSize(width, height, !this._surface);\n this._dirty = true;\n }\n\n private validateSurfaceSize(width: number, height: number): void {\n const pixelRatio = this._renderer?.getPixelRatio() ?? this.options.render.pixelRatio ?? 1;\n for (const value of [width, height]) {\n if (!Number.isSafeInteger(value) || value <= 0 || !Number.isSafeInteger(Math.floor(value * pixelRatio)) || Math.floor(value * pixelRatio) <= 0) {\n throw new RangeError(\"RendererSurface dimensions must be positive integers with positive drawing-buffer dimensions\");\n }\n }\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 /**\n * Calls a synchronous animation update before each FPS-limited draw while started.\n * Subscriptions keep the scene drawing without manual dirty flags. Returns an unsubscribe function.\n * Registering the same callback twice has no effect. Image exports do not invoke callbacks.\n */\n public onFrame(callback: FrameCallback): () => void {\n if (this._disposed) return () => {};\n const subscription = this._frameCallbacks.get(callback) ?? {};\n this._frameCallbacks.set(callback, subscription);\n return () => {\n if (this._frameCallbacks.get(callback) === subscription) this._frameCallbacks.delete(callback);\n };\n }\n\n /** Starts or resumes the animation loop and registered frame callbacks. Has no effect while running. */\n public start() {\n if (this._disposed || this._running) return;\n\n this.stop();\n this._running = true;\n if (!this._inAnimationLoop) this.renderer.setAnimationLoop(this._animationLoop);\n }\n\n /** Pauses rendering and frame callbacks, and cancels video export. Call {@link start} to resume. */\n public stop() {\n if (this._disposed) return;\n\n this._videoExporter?.cancel();\n this._videoExporter = undefined;\n this._running = false;\n if (this._inAnimationLoop) {\n // Three schedules its next frame after the callback; apply loop changes after that scheduling.\n queueMicrotask(() => {\n this.renderer.setAnimationLoop(null);\n if (this._running) this.renderer.setAnimationLoop(this._animationLoop);\n });\n } else {\n this.renderer.setAnimationLoop(null);\n }\n this._nextFrameTime = undefined;\n this._controlsTime = undefined;\n for (const subscription of this._frameCallbacks.values()) subscription.previous = 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 this._frameCallbacks.clear();\n\n if (this._resizeListener && typeof window !== \"undefined\") {\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 if (!this._surface || (this._element && this.renderer.domElement.parentElement === this._element)) {\n this.renderer.domElement.remove();\n }\n this._element = undefined;\n\n if (this._controls) {\n this.disposeControls(this._controls);\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 if (!this._surface) this.renderer.forceContextLoss();\n }\n\n private animate(t: number = performance.now()): void {\n if (!this._running) return;\n\n // Damping, auto-rotation, and held movement keys can make a previously clean scene need another frame.\n this.updateControls(t);\n if (!this._running) return;\n if (!this.dirty && !this.options.render.renderAlways && !this._frameCallbacks.size && !this._videoExporter) return;\n\n const interval = this._frameInterval;\n if (interval) {\n const next = this._nextFrameTime;\n // Allow for rounded animation timestamps without losing a pending redraw.\n if (next !== undefined && t + 0.1 < next) return;\n // Keep fractional intervals, but do not catch up after idle periods or long frames.\n this._nextFrameTime = next !== undefined && t - next < interval ? next + interval : t + interval;\n }\n\n for (const [callback, subscription] of [...this._frameCallbacks]) {\n if (this._frameCallbacks.get(callback) !== subscription) continue;\n const previous = subscription.previous;\n subscription.previous = t;\n callback({ time: t / 1000, delta: previous === undefined ? 0 : (t - previous) / 1000 });\n if (!this._running) return;\n }\n this.drawFrame();\n }\n\n private drawFrame(): void {\n if (this._stats) {\n this._stats.begin();\n }\n\n if (this.options.composer.enabled && this.composer) {\n this.composer.render();\n } else {\n this.renderer.render(this.scene, this.camera);\n }\n\n this._videoExporter?.capture();\n this.dirty = false;\n\n if (this._stats) {\n this._stats.end();\n }\n\n }\n\n //</editor-fold>\n\n /** Draws a fresh frame without starting the animation loop or invoking frame callbacks. */\n public renderOnce(): void {\n if (this._disposed) throw new Error(\"Cannot render a disposed renderer\");\n this.updateControls();\n this.drawFrame();\n }\n\n /**\n * Renders a fresh frame and returns an image data URL, including while the animation loop is stopped.\n * Trimming removes transparent borders; an empty image becomes one transparent pixel.\n * MIME type support and lossy quality (0–1) follow the canvas encoder.\n */\n public toImage(trim: boolean = false, mime: string = \"image/png\", quality?: number): string {\n if (this._disposed) throw new Error(\"Cannot export an image from a disposed renderer\");\n // Read the drawing buffer in the same task as the draw, before WebGL can clear it.\n this.renderOnce();\n const canvas = trim ? trimCanvas(this.renderer.domElement) : this.renderer.domElement;\n return (canvas as HTMLCanvasElement).toDataURL(mime, quality);\n }\n\n /**\n * Records a silent browser video in real time, including frame callbacks and animated textures.\n * Keep the tab visible; browser scheduling and `render.fpsLimit` limit the capture rate.\n * The video keeps the initial drawing-buffer size and fills transparent pixels with black.\n * Temporarily starts a stopped renderer. Stop, disposal, or `options.signal` cancels the export.\n * Only one export can run at a time. Use the returned Blob's type to select a file extension.\n */\n public async toVideo(options: VideoExportOptions): Promise<Blob> {\n if (this._disposed) throw new Error(\"Cannot export a video from a disposed renderer\");\n if (this._videoExporter) throw new Error(\"A video export is already running\");\n\n const exporter = new VideoExporter(this.renderer.domElement, options);\n const wasRunning = this._running;\n try {\n try {\n if (!wasRunning) this.start();\n this._videoExporter = exporter;\n this.updateControls();\n this.drawFrame();\n } catch (error) {\n exporter.cancel(error);\n }\n return await exporter.result;\n } finally {\n if (this._videoExporter === exporter) {\n this._videoExporter = undefined;\n if (!wasRunning) this.stop();\n }\n }\n }\n\n /** Exports visible scene meshes as OBJ text, without texture images. */\n public toObj(): string {\n return SceneExporter.toObj(this.scene);\n }\n\n /** Exports visible scene meshes as PLY. Set `options.binary` for an ArrayBuffer. */\n public toPLY(options?: PLYExporterOptions): string | ArrayBuffer {\n return SceneExporter.toPLY(this.scene, options);\n }\n\n /** Exports a static textured scene in the browser. Set `options.binary` for GLB output. */\n public toGLTF(options?: SceneGLTFExportOptions): Promise<Record<string, any> | ArrayBuffer> {\n return SceneExporter.toGLTF(this.scene, options);\n }\n\n ///\n\n protected get attachedToBody() {\n return typeof document !== \"undefined\" && this.element === document.body;\n }\n\n protected get viewWidth() {\n return typeof window !== \"undefined\" && this.attachedToBody ? window.innerWidth : this.element?.offsetWidth ?? this._width;\n }\n\n protected get viewHeight() {\n return typeof window !== \"undefined\" && this.attachedToBody ? window.innerHeight : this.element?.offsetHeight ?? this._height;\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(): Maybe<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<RendererControls> {\n return this._controls;\n }\n\n /** Renderer-owned OrbitControls, or undefined in fly mode or without controls. */\n public get orbitControls(): Maybe<OrbitControls> {\n return this._controls && !isFlyControls(this._controls) ? this._controls : undefined;\n }\n\n /** Renderer-owned {@link FlyControls}, or undefined in orbit mode or without controls. */\n public get flyControls(): Maybe<FlyControls> {\n return isFlyControls(this._controls) ? this._controls : undefined;\n }\n\n /** The active renderer-owned controls mode, or undefined without controls. */\n public get controlsMode(): Maybe<ControlsMode> {\n if (!this._controls) return undefined;\n return isFlyControls(this._controls) ? \"fly\" : \"orbit\";\n }\n\n ///\n\n\n}\n\n/** Caller-owned canvas and WebGL 2 context for rendering without a browser DOM. */\nexport interface RendererSurface {\n canvas: Pick<HTMLCanvasElement, \"width\" | \"height\" | \"addEventListener\" | \"removeEventListener\">;\n context: WebGL2RenderingContext;\n /** Initial logical dimensions, before applying `render.pixelRatio`. */\n width: number;\n height: number;\n /** Resizes the native drawing buffer when assigning canvas dimensions is insufficient. */\n resize?: (drawingBufferWidth: number, drawingBufferHeight: number) => void;\n}\n\n/** Timing passed to callbacks registered with {@link Renderer.onFrame}. */\nexport interface RendererFrame {\n /** Animation-loop timestamp in seconds, relative to the browser's performance time origin. */\n readonly time: number;\n /** Seconds since this callback's previous update; zero on its first update after subscribing or starting. */\n readonly delta: number;\n}\n\n/** A synchronous scene update registered with {@link Renderer.onFrame}. */\nexport type FrameCallback = (frame: RendererFrame) => void;\n\n/** Settings for `new Renderer(options)`. Omitted values use {@link Renderer.DEFAULT_OPTIONS}. */\nexport interface RendererOptions {\n camera: CameraOptions;\n render: RenderOptions;\n composer: ComposerOptions;\n controls?: ControlsOptions;\n debug: DebugOptions;\n}\n\n/** Camera settings passed as `camera` in the Renderer constructor options. Positions use scene units. */\nexport interface CameraOptions {\n type: \"perspective\" | \"orthographic\";\n near: number;\n far: number;\n perspective: {\n aspect: undefined | number;\n /** Vertical field of view in degrees. */\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\n/** Canvas and draw-loop settings passed as `render` in the Renderer constructor options. */\nexport interface RenderOptions {\n /** Maximum draw rate (60 by default); zero or a negative value disables the limit. */\n fpsLimit: number;\n /** Drawing-buffer pixels per CSS pixel (default 1); also scales toImage() output. */\n pixelRatio?: number;\n stats: boolean;\n antialias: boolean;\n shade: boolean;\n /** Resizes to the attached element when the browser window resizes. */\n autoResize: boolean;\n /** Draws even when the scene is unchanged, while still respecting `fpsLimit`. */\n renderAlways: boolean;\n}\n\n/** Effects settings passed as `composer` in the Renderer constructor options. */\nexport interface ComposerOptions {\n enabled: boolean;\n}\n\n/** Renderer-owned camera controls: orbiting around a target, or creative-style flight. */\nexport type ControlsMode = \"orbit\" | \"fly\";\n\n/** Controls created through `controls.enabled`; narrow with `isFlyControls` or {@link Renderer.controlsMode}. */\nexport type RendererControls = OrbitControls | FlyControls;\n\n/** Set `controls: { enabled: true }` in the Renderer constructor to create owned controls. */\nexport interface ControlsOptions {\n enabled: boolean;\n /** `orbit` (default) creates OrbitControls; `fly` creates {@link FlyControls}. */\n mode?: ControlsMode;\n}\n\n/** Scene helpers enabled through `debug` in the Renderer constructor options. */\nexport interface DebugOptions {\n grid: boolean;\n axes: boolean;\n}\n"],"mappings":";AAAA,SAAS,YAAqC,YAAY,oBAAoB,cAAc,mBAAmB,gBAAgB,SAAS,qBAAqB;AAC7J,SAAQ,uBAAsB;AAC9B,SAAS,aAAa;AACtB,OAAO,WAAW;AAClB,SAAsB,gBAAiB,kBAA+B;AACtE,SAAqB,iBAAuB;AAC5C,SAAQ,qBAAiC;AACzC,SAAQ,sBAAsB,2BAA0B;AAExD,SAAS,qBAAqB;AAC9B,SAAS,aAAa,qBAAqB;AAC3C,SAAS,qBAA6C;AAEtD,SAAS,kBAAkB;AAC3B,SAAS,qBAAyC;AAClD,SAAS,cAAc;AAEvB,IAAM,MAAM,OAAO,UAAU;AAOtB,IAAM,YAAN,MAAM,UAA+B;AAAA,EA6ExC,YAAY,SAAwC,SAA2B;AA/B/E,SAAQ,SAAiB;AACzB,SAAQ,UAAkB;AAY1B,SAAU,SAAkB;AAI5B,SAAU,kBAA+B;AAGzC,SAAQ,WAAoB;AAC5B,SAAQ,mBAA4B;AACpC,SAAQ,YAAqB;AAE7B,SAAiB,kBAAkB,oBAAI,IAA0C;AACjF,SAAiB,gBAAgD,CAAC;AAClE,SAAiB,oBAAoB,oBAAI,IAAuC;AAChF,SAAiB,kBAAkB,MAAM;AACrC,WAAK,SAAS;AAAA,IAClB;AAGI,SAAK,UAAU,MAAM,CAAC,GAAG,UAAS,iBAAiB,WAAW,CAAC,CAAC;AAChE,UAAM,aAAa,KAAK,QAAQ,OAAO,cAAc;AACrD,QAAI,CAAC,OAAO,SAAS,UAAU,KAAK,cAAc,GAAG;AACjD,YAAM,IAAI,WAAW,oDAAoD;AAAA,IAC7E;AACA,SAAK,WAAW;AAChB,QAAI,SAAS;AACT,WAAK,oBAAoB,QAAQ,OAAO,QAAQ,MAAM;AACtD,WAAK,SAAS,QAAQ;AACtB,WAAK,UAAU,QAAQ;AAAA,IAC3B;AACA,QAAI,OAAO,aAAa,aAAa;AACjC,UAAI,KAAK,QAAQ,OAAO,MAAO,OAAM,IAAI,MAAM,sCAAsC;AACrF,UAAI,KAAK,QAAQ,UAAU,QAAS,OAAM,IAAI,MAAM,yCAAyC;AAAA,IACjG;AAEA,SAAK,iBAAiB,CAAC,SAAiB;AACpC,WAAK,mBAAmB;AACxB,UAAI;AACA,aAAK,QAAQ,IAAI;AAAA,MACrB,SAAS,OAAO;AACZ,aAAK,gBAAgB,OAAO,KAAK;AACjC,cAAM;AAAA,MACV,UAAE;AACE,aAAK,mBAAmB;AAAA,MAC5B;AAAA,IACJ;AACA,SAAK,iBAAiB,KAAK,QAAQ,OAAO,WAAW,IAAK,MAAO,KAAK,QAAQ,OAAO,WAAY;AAEjG,SAAK,SAAS,KAAK,YAAY;AAC/B,SAAK,UAAU,KAAK,aAAa;AACjC,SAAK,YAAY,KAAK,eAAe;AACrC,QAAI;AACA,WAAK,YAAY,KAAK,eAAe;AAErC,UAAI,KAAK,QAAQ,OAAO,OAAO;AAC3B,aAAK,SAAS,IAAI,MAAM;AAExB,iBAAS,KAAK,YAAY,KAAK,OAAO,GAAG;AAAA,MAC7C;AAEA,WAAK,KAAK;AACV,WAAK,YAAY,KAAK,eAAe;AAAA,IACzC,SAAS,OAAO;AAEZ,gBAAS,UAAU,QAAQ,KAAK,IAAI;AACpC,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA,EAIU,cAA+B;AACrC,WAAO,IAAI,gBAAgB;AAAA,EAC/B;AAAA,EAEU,eAAuB;AAC7B,YAAQ,KAAK,QAAQ,OAAO,MAAM;AAAA,MAC9B,KAAK;AAAA,MACL;AACI,eAAO,IAAI;AAAA,UACP,KAAK,QAAQ,OAAO,YAAY;AAAA,UAChC,KAAK,QAAQ,OAAO,YAAY,UAAW,KAAK,YAAY,KAAK;AAAA,UACjE,KAAK,QAAQ,OAAO;AAAA,UACpB,KAAK,QAAQ,OAAO;AAAA,QACxB;AAAA,MACJ,KAAK;AACD,eAAO,IAAI;AAAA,UACP,KAAK,QAAQ,OAAO,aAAa,QAAS,KAAK,YAAY;AAAA,UAC3D,KAAK,QAAQ,OAAO,aAAa,SAAU,KAAK,YAAY;AAAA,UAC5D,KAAK,QAAQ,OAAO,aAAa,OAAQ,KAAK,aAAa;AAAA,UAC3D,KAAK,QAAQ,OAAO,aAAa,UAAW,KAAK,aAAa;AAAA,UAC9D,KAAK,QAAQ,OAAO;AAAA,UACpB,KAAK,QAAQ,OAAO;AAAA,QACxB;AAAA,IAER;AAAA,EAEJ;AAAA,EAEU,iBAAgC;AACtC,QAAI,CAAC,KAAK,YAAY,OAAO,aAAa,aAAa;AACnD,YAAM,IAAI,MAAM,mEAAmE;AAAA,IACvF;AACA,UAAM,aAAa,KAAK,QAAQ,OAAO,cAAc;AACrD,SAAK,UAAU,SAAS,KAAK,MAAM,KAAK,YAAY,UAAU,GAAG,KAAK,MAAM,KAAK,aAAa,UAAU,CAAC;AACzG,UAAM,WAAW,IAAI,cAAc;AAAA,MAC/B,QAAQ,KAAK,UAAU;AAAA,MACvB,SAAS,KAAK,UAAU;AAAA,MACxB,WAAW,KAAK,QAAQ,OAAO;AAAA,MAC/B,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,OAAO;AAAA,IACX,CAAC;AAED,aAAS,cAAc,GAAU,CAAC;AAElC,aAAS,UAAU,UAAU;AAC7B,aAAS,UAAU,OAAO;AAE1B,aAAS,mBAAmB;AAE5B,QAAI,KAAK,UAAU;AACf,eAAS,qBAAqB,KAAK,WAAW,KAAK,YAAY,UAAU;AAAA,IAC7E,OAAO;AACH,eAAS,cAAc,UAAU;AACjC,eAAS,QAAQ,KAAK,WAAW,KAAK,UAAU;AAAA,IACpD;AAEA,WAAO;AAAA,EACX;AAAA,EAEU,iBAAwC;AAC9C,QAAI,CAAC,KAAK,QAAQ,SAAS,QAAS,QAAO;AAE3C,UAAM,WAAW,IAAI,eAAe,KAAK,QAAQ;AAEjD,aAAS,QAAQ,KAAK,WAAW,KAAK,YAAY,CAAC,KAAK,QAAQ;AAShE,aAAS,QAAQ,IAAI,WAAW,KAAK,OAAO,KAAK,MAAM,CAAC;AAuBxD,WAAO;AAAA,EACX;AAAA,EAEU,iBAA0C;AAChD,QAAI,CAAC,KAAK,QAAQ,UAAU,QAAS,QAAO;AAC5C,WAAO,KAAK,kBAAkB,KAAK,QAAQ,SAAS,QAAQ,SAAS,KAAK,cAAc,CAAC;AAAA,EAC7F;AAAA,EAEQ,gBAAyB;AAC7B,UAAM,SAAS,KAAK,QAAQ,OAAO;AACnC,QAAI,UAAU,MAAM,EAAG,QAAO,OAAO,MAAM;AAC3C,QAAI,cAAc,MAAM,EAAG,QAAO,IAAI,QAAQ,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAC7E,WAAO,IAAI,QAAQ;AAAA,EACvB;AAAA,EAEQ,kBAAkB,MAAoB,QAAmC;AAC7E,QAAI;AACJ,QAAI,SAAS,OAAO;AAChB,iBAAW,IAAI,YAAY,KAAK,QAAQ,KAAK,SAAS,UAAU;AAChE,eAAS,OAAO,MAAM;AACtB,eAAS,UAAU;AAAA,IACvB,OAAO;AAEH,YAAM,WAAW,KAAK,OAAO,SAAS,MAAM;AAC5C,iBAAW,IAAI,cAAc,KAAK,QAAQ,KAAK,SAAS,UAAU;AAClE,WAAK,OAAO,SAAS,KAAK,QAAQ;AAClC,eAAS,OAAO,KAAK,MAAM;AAC3B,eAAS,OAAO;AAChB,eAAS,UAAU;AAAA,IACvB;AACA,SAAK,gBAAgB;AACrB,SAAK,wBAAwB,QAAQ;AACrC,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,gBAAgB,MAA6C;AAChE,UAAM,UAAU,KAAK;AACrB,QAAI,KAAK,aAAa,CAAC,QAAS,QAAO;AACvC,QAAI,KAAK,iBAAiB,KAAM,QAAO;AAEvC,QAAI;AACJ,QAAI,cAAc,OAAO,GAAG;AACxB,YAAM,WAAW,KAAK,mBAAmB,KAAK,OAAO,SAAS,WAAW,KAAK,cAAc,CAAC,KAAK;AAClG,eAAS,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAE,gBAAgB,KAAK,OAAO,UAAU,EAAE,IAAI,KAAK,OAAO,QAAQ;AAAA,IAC1G,OAAO;AACH,eAAS,QAAQ,OAAO,MAAM;AAC9B,WAAK,iBAAiB,KAAK,OAAO,SAAS,WAAW,MAAM;AAAA,IAChE;AACA,UAAM,UAAU,QAAQ;AACxB,SAAK,gBAAgB,OAAO;AAC5B,SAAK,YAAY,KAAK,kBAAkB,MAAM,MAAM;AACpD,SAAK,UAAU,UAAU;AACzB,SAAK,QAAQ;AACb,WAAO,KAAK;AAAA,EAChB;AAAA,EAEQ,gBAAgB,UAAkC;AACtD,SAAK,YAAY;AACjB,SAAK,0BAA0B,QAAQ;AACvC,aAAS,UAAU;AACnB,aAAS,QAAQ;AAAA,EACrB;AAAA;AAAA,EAGQ,eAAe,MAAqB;AACxC,UAAM,WAAW,KAAK;AACtB,QAAI,CAAC,UAAU,SAAS;AACpB,WAAK,gBAAgB;AACrB;AAAA,IACJ;AACA,QAAI,CAAC,cAAc,QAAQ,GAAG;AAC1B,eAAS,OAAO;AAChB;AAAA,IACJ;AACA,UAAM,WAAW,KAAK;AACtB,QAAI,SAAS,OAAW,MAAK,gBAAgB;AAC7C,aAAS,OAAO,SAAS,UAAa,aAAa,SAAY,KAAK,OAAO,YAAY,GAAI;AAAA,EAC/F;AAAA;AAAA,EAIO,OAAO;AACV,QAAI,KAAK,UAAW;AAEpB,QAAI,OAAO,WAAW,eAAe,OAAO,OAAO,oBAAoB,MAAM,aAAa;AACtF,aAAO,oBAAoB,EAAE,cAAc,IAAI,YAAY,WAAW,EAAC,QAAQ,KAAK,MAAK,CAAC,CAAC;AAAA,IAC/F;AAGA,QAAI,KAAK,QAAQ,MAAM,MAAM;AACzB,YAAM,aAAa,IAAI,WAAW,KAAK,EAAE;AACzC,WAAK,cAAc,KAAK,UAAU;AAClC,WAAK,MAAM,IAAI,UAAU;AAEzB,YAAM,cAAc,IAAI,WAAW,KAAK,EAAE;AAC1C,WAAK,cAAc,KAAK,WAAW;AACnC,kBAAY,SAAS,IAAI,MAAM,KAAK,KAAK;AACzC,WAAK,MAAM,IAAI,WAAW;AAE1B,YAAM,cAAc,IAAI,WAAW,KAAK,EAAE;AAC1C,WAAK,cAAc,KAAK,WAAW;AACnC,kBAAY,SAAS,IAAI,MAAM,KAAK,KAAK;AACzC,WAAK,MAAM,IAAI,WAAW;AAAA,IAC9B;AACA,QAAI,KAAK,QAAQ,MAAM,MAAM;AACzB,YAAM,aAAa,IAAI,WAAW,EAAE;AACpC,WAAK,cAAc,KAAK,UAAU;AAClC,WAAK,MAAM,IAAI,UAAU;AAAA,IAC7B;AAGA,QAAI,KAAK,QAAQ,OAAO,UAAU;AAC9B,UAAI,UAAU,KAAK,QAAQ,OAAO,QAAQ,GAAG;AACzC,aAAK,OAAO,SAAS,IAAI,KAAK,QAAQ,OAAO,SAAS,GAAG,KAAK,QAAQ,OAAO,SAAS,GAAG,KAAK,QAAQ,OAAO,SAAS,CAAC;AAAA,MAC3H,WAAW,cAAc,KAAK,QAAQ,OAAO,QAAQ,GAAG;AACpD,aAAK,OAAO,SAAS,IAAI,KAAK,QAAQ,OAAO,SAAS,CAAC,GAAG,KAAK,QAAQ,OAAO,SAAS,CAAC,GAAG,KAAK,QAAQ,OAAO,SAAS,CAAC,CAAC;AAAA,MAC9H;AAAA,IACJ;AACA,QAAI,KAAK,QAAQ,OAAO,WAAW;AAC/B,UAAI,UAAU,KAAK,QAAQ,OAAO,SAAS,GAAG;AAC1C,aAAK,OAAO,OAAO,KAAK,QAAQ,OAAO,SAAS;AAAA,MACpD,WAAW,cAAc,KAAK,QAAQ,OAAO,SAAS,GAAG;AACrD,aAAK,OAAO,OAAO,KAAK,QAAQ,OAAO,UAAU,CAAC,GAAG,KAAK,QAAQ,OAAO,UAAU,CAAC,GAAG,KAAK,QAAQ,OAAO,UAAU,CAAC,CAAC;AAAA,MAC3H;AAAA,IACJ;AAEA,QAAI,KAAK,QAAQ,OAAO,cAAc,CAAC,KAAK,mBAAmB,OAAO,WAAW,aAAa;AAC1F,WAAK,kBAAkB,MAAM;AACzB,aAAK,OAAO,KAAK,WAAW,KAAK,UAAU;AAAA,MAC/C;AACA,aAAO,iBAAiB,UAAU,KAAK,eAAe;AAAA,IAC1D;AAAA,EACJ;AAAA,EAEA,IAAW,UAA8B;AACrC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGO,SAAS,SAA4B;AACxC,QAAI,KAAK,UAAW;AAEpB,SAAK,WAAW;AAChB,SAAK,SAAS,YAAY,KAAK,SAAS,UAAU;AAClD,QAAI,KAAK,aAAa,GAAG;AACrB,UAAI,KAAK,iBAAiB;AAAA,IAC9B;AACA,QAAI,KAAK,cAAc,GAAG;AACtB,UAAI,KAAK,kBAAkB;AAAA,IAC/B;AACA,SAAK,OAAO,KAAK,WAAW,KAAK,UAAU;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,wBAAwB,YAAkC,cAAsB,UAAU;AAC7F,QAAI,KAAK,UAAW;AAEpB,QAAI,SAAS,KAAK,kBAAkB,IAAI,UAAU;AAClD,QAAI,CAAC,QAAQ;AACT,eAAS,oBAAI,IAAY;AACzB,WAAK,kBAAkB,IAAI,YAAY,MAAM;AAAA,IACjD;AACA,QAAI,OAAO,IAAI,WAAW,EAAG;AAE7B,WAAO,IAAI,WAAW;AACtB,eAAW,iBAAiB,aAAa,KAAK,eAAe;AAAA,EACjE;AAAA,EAEQ,0BAA0B,YAAwC;AACtE,UAAM,SAAS,KAAK,kBAAkB,IAAI,UAAU;AACpD,QAAI,CAAC,OAAQ;AACb,eAAW,SAAS,OAAQ,YAAW,oBAAoB,OAAO,KAAK,eAAe;AACtF,SAAK,kBAAkB,OAAO,UAAU;AAAA,EAC5C;AAAA;AAAA,EAGO,OAAO,OAAe,QAAgB;AACzC,QAAI,KAAK,UAAW;AACpB,QAAI,KAAK,UAAU;AACf,WAAK,oBAAoB,OAAO,MAAM;AACtC,YAAM,aAAa,KAAK,SAAS,cAAc;AAC/C,WAAK,SAAS,SAAS,KAAK,MAAM,QAAQ,UAAU,GAAG,KAAK,MAAM,SAAS,UAAU,CAAC;AAAA,IAC1F;AACA,SAAK,SAAS;AACd,SAAK,UAAU;AAEf,QAAI,oBAAoB,KAAK,MAAM,GAAG;AAClC,WAAK,OAAO,SAAS,QAAQ;AAC7B,WAAK,OAAO,uBAAuB;AAAA,IACvC,WAAW,qBAAqB,KAAK,MAAM,GAAG;AAC1C,WAAK,OAAO,OAAO,QAAQ;AAC3B,WAAK,OAAO,QAAQ,QAAQ;AAC5B,WAAK,OAAO,MAAM,SAAS;AAC3B,WAAK,OAAO,SAAS,SAAS;AAC9B,WAAK,OAAO,uBAAuB;AAAA,IACvC;AAEA,SAAK,SAAS,QAAQ,OAAO,QAAQ,CAAC,KAAK,QAAQ;AACnD,SAAK,UAAU,QAAQ,OAAO,QAAQ,CAAC,KAAK,QAAQ;AACpD,SAAK,SAAS;AAAA,EAClB;AAAA,EAEQ,oBAAoB,OAAe,QAAsB;AAC7D,UAAM,aAAa,KAAK,WAAW,cAAc,KAAK,KAAK,QAAQ,OAAO,cAAc;AACxF,eAAW,SAAS,CAAC,OAAO,MAAM,GAAG;AACjC,UAAI,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,KAAK,CAAC,OAAO,cAAc,KAAK,MAAM,QAAQ,UAAU,CAAC,KAAK,KAAK,MAAM,QAAQ,UAAU,KAAK,GAAG;AAC5I,cAAM,IAAI,WAAW,8FAA8F;AAAA,MACvH;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAIA,IAAW,QAAiB;AACxB,WAAO,KAAK,UAAU,KAAK,MAAM;AAAA,EACrC;AAAA,EAEA,IAAW,MAAM,OAAgB;AAC7B,SAAK,SAAS;AACd,SAAK,MAAM,QAAQ;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,QAAQ,UAAqC;AAChD,QAAI,KAAK,UAAW,QAAO,MAAM;AAAA,IAAC;AAClC,UAAM,eAAe,KAAK,gBAAgB,IAAI,QAAQ,KAAK,CAAC;AAC5D,SAAK,gBAAgB,IAAI,UAAU,YAAY;AAC/C,WAAO,MAAM;AACT,UAAI,KAAK,gBAAgB,IAAI,QAAQ,MAAM,aAAc,MAAK,gBAAgB,OAAO,QAAQ;AAAA,IACjG;AAAA,EACJ;AAAA;AAAA,EAGO,QAAQ;AACX,QAAI,KAAK,aAAa,KAAK,SAAU;AAErC,SAAK,KAAK;AACV,SAAK,WAAW;AAChB,QAAI,CAAC,KAAK,iBAAkB,MAAK,SAAS,iBAAiB,KAAK,cAAc;AAAA,EAClF;AAAA;AAAA,EAGO,OAAO;AACV,QAAI,KAAK,UAAW;AAEpB,SAAK,gBAAgB,OAAO;AAC5B,SAAK,iBAAiB;AACtB,SAAK,WAAW;AAChB,QAAI,KAAK,kBAAkB;AAEvB,qBAAe,MAAM;AACjB,aAAK,SAAS,iBAAiB,IAAI;AACnC,YAAI,KAAK,SAAU,MAAK,SAAS,iBAAiB,KAAK,cAAc;AAAA,MACzE,CAAC;AAAA,IACL,OAAO;AACH,WAAK,SAAS,iBAAiB,IAAI;AAAA,IACvC;AACA,SAAK,iBAAiB;AACtB,SAAK,gBAAgB;AACrB,eAAW,gBAAgB,KAAK,gBAAgB,OAAO,EAAG,cAAa,WAAW;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,UAAgB;AACnB,QAAI,KAAK,UAAW;AAEpB,SAAK,KAAK;AACV,SAAK,YAAY;AACjB,SAAK,gBAAgB,MAAM;AAE3B,QAAI,KAAK,mBAAmB,OAAO,WAAW,aAAa;AACvD,aAAO,oBAAoB,UAAU,KAAK,eAAe;AACzD,WAAK,kBAAkB;AAAA,IAC3B;AACA,eAAW,CAAC,YAAY,MAAM,KAAK,KAAK,mBAAmB;AACvD,iBAAW,SAAS,QAAQ;AACxB,mBAAW,oBAAoB,OAAO,KAAK,eAAe;AAAA,MAC9D;AAAA,IACJ;AACA,SAAK,kBAAkB,MAAM;AAE7B,SAAK,QAAQ,IAAI,OAAO;AACxB,SAAK,SAAS;AACd,QAAI,CAAC,KAAK,YAAa,KAAK,YAAY,KAAK,SAAS,WAAW,kBAAkB,KAAK,UAAW;AAC/F,WAAK,SAAS,WAAW,OAAO;AAAA,IACpC;AACA,SAAK,WAAW;AAEhB,QAAI,KAAK,WAAW;AAChB,WAAK,gBAAgB,KAAK,SAAS;AAAA,IACvC;AAEA,SAAK,MAAM,MAAM;AACjB,eAAW,UAAU,KAAK,eAAe;AACrC,aAAO,SAAS,QAAQ;AACxB,YAAM,YAAY,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC,OAAO,QAAQ;AACrF,iBAAW,YAAY,WAAW;AAC9B,iBAAS,QAAQ;AAAA,MACrB;AAAA,IACJ;AACA,SAAK,cAAc,SAAS;AAE5B,SAAK,UAAU,QAAQ;AACvB,SAAK,SAAS,QAAQ;AACtB,QAAI,CAAC,KAAK,SAAU,MAAK,SAAS,iBAAiB;AAAA,EACvD;AAAA,EAEQ,QAAQ,IAAY,YAAY,IAAI,GAAS;AACjD,QAAI,CAAC,KAAK,SAAU;AAGpB,SAAK,eAAe,CAAC;AACrB,QAAI,CAAC,KAAK,SAAU;AACpB,QAAI,CAAC,KAAK,SAAS,CAAC,KAAK,QAAQ,OAAO,gBAAgB,CAAC,KAAK,gBAAgB,QAAQ,CAAC,KAAK,eAAgB;AAE5G,UAAM,WAAW,KAAK;AACtB,QAAI,UAAU;AACV,YAAM,OAAO,KAAK;AAElB,UAAI,SAAS,UAAa,IAAI,MAAM,KAAM;AAE1C,WAAK,iBAAiB,SAAS,UAAa,IAAI,OAAO,WAAW,OAAO,WAAW,IAAI;AAAA,IAC5F;AAEA,eAAW,CAAC,UAAU,YAAY,KAAK,CAAC,GAAG,KAAK,eAAe,GAAG;AAC9D,UAAI,KAAK,gBAAgB,IAAI,QAAQ,MAAM,aAAc;AACzD,YAAM,WAAW,aAAa;AAC9B,mBAAa,WAAW;AACxB,eAAS,EAAE,MAAM,IAAI,KAAM,OAAO,aAAa,SAAY,KAAK,IAAI,YAAY,IAAK,CAAC;AACtF,UAAI,CAAC,KAAK,SAAU;AAAA,IACxB;AACA,SAAK,UAAU;AAAA,EACnB;AAAA,EAEQ,YAAkB;AACtB,QAAI,KAAK,QAAQ;AACb,WAAK,OAAO,MAAM;AAAA,IACtB;AAEA,QAAI,KAAK,QAAQ,SAAS,WAAW,KAAK,UAAU;AAChD,WAAK,SAAS,OAAO;AAAA,IACzB,OAAO;AACH,WAAK,SAAS,OAAO,KAAK,OAAO,KAAK,MAAM;AAAA,IAChD;AAEA,SAAK,gBAAgB,QAAQ;AAC7B,SAAK,QAAQ;AAEb,QAAI,KAAK,QAAQ;AACb,WAAK,OAAO,IAAI;AAAA,IACpB;AAAA,EAEJ;AAAA;AAAA;AAAA,EAKO,aAAmB;AACtB,QAAI,KAAK,UAAW,OAAM,IAAI,MAAM,mCAAmC;AACvE,SAAK,eAAe;AACpB,SAAK,UAAU;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,QAAQ,OAAgB,OAAO,OAAe,aAAa,SAA0B;AACxF,QAAI,KAAK,UAAW,OAAM,IAAI,MAAM,iDAAiD;AAErF,SAAK,WAAW;AAChB,UAAM,SAAS,OAAO,WAAW,KAAK,SAAS,UAAU,IAAI,KAAK,SAAS;AAC3E,WAAQ,OAA6B,UAAU,MAAM,OAAO;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,QAAQ,SAA4C;AAC7D,QAAI,KAAK,UAAW,OAAM,IAAI,MAAM,gDAAgD;AACpF,QAAI,KAAK,eAAgB,OAAM,IAAI,MAAM,mCAAmC;AAE5E,UAAM,WAAW,IAAI,cAAc,KAAK,SAAS,YAAY,OAAO;AACpE,UAAM,aAAa,KAAK;AACxB,QAAI;AACA,UAAI;AACA,YAAI,CAAC,WAAY,MAAK,MAAM;AAC5B,aAAK,iBAAiB;AACtB,aAAK,eAAe;AACpB,aAAK,UAAU;AAAA,MACnB,SAAS,OAAO;AACZ,iBAAS,OAAO,KAAK;AAAA,MACzB;AACA,aAAO,MAAM,SAAS;AAAA,IAC1B,UAAE;AACE,UAAI,KAAK,mBAAmB,UAAU;AAClC,aAAK,iBAAiB;AACtB,YAAI,CAAC,WAAY,MAAK,KAAK;AAAA,MAC/B;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAGO,QAAgB;AACnB,WAAO,cAAc,MAAM,KAAK,KAAK;AAAA,EACzC;AAAA;AAAA,EAGO,MAAM,SAAoD;AAC7D,WAAO,cAAc,MAAM,KAAK,OAAO,OAAO;AAAA,EAClD;AAAA;AAAA,EAGO,OAAO,SAA8E;AACxF,WAAO,cAAc,OAAO,KAAK,OAAO,OAAO;AAAA,EACnD;AAAA;AAAA,EAIA,IAAc,iBAAiB;AAC3B,WAAO,OAAO,aAAa,eAAe,KAAK,YAAY,SAAS;AAAA,EACxE;AAAA,EAEA,IAAc,YAAY;AACtB,WAAO,OAAO,WAAW,eAAe,KAAK,iBAAiB,OAAO,aAAa,KAAK,SAAS,eAAe,KAAK;AAAA,EACxH;AAAA,EAEA,IAAc,aAAa;AACvB,WAAO,OAAO,WAAW,eAAe,KAAK,iBAAiB,OAAO,cAAc,KAAK,SAAS,gBAAgB,KAAK;AAAA,EAC1H;AAAA,EAEA,IAAW,QAAyB;AAChC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAW,SAAiB;AACxB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAW,WAA0B;AACjC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAW,WAAkC;AACzC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAW,WAAoC;AAC3C,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAW,gBAAsC;AAC7C,WAAO,KAAK,aAAa,CAAC,cAAc,KAAK,SAAS,IAAI,KAAK,YAAY;AAAA,EAC/E;AAAA;AAAA,EAGA,IAAW,cAAkC;AACzC,WAAO,cAAc,KAAK,SAAS,IAAI,KAAK,YAAY;AAAA,EAC5D;AAAA;AAAA,EAGA,IAAW,eAAoC;AAC3C,QAAI,CAAC,KAAK,UAAW,QAAO;AAC5B,WAAO,cAAc,KAAK,SAAS,IAAI,QAAQ;AAAA,EACnD;AAAA;AAKJ;AAhtBa,UAEc,kBAAmC,MAAM,CAAC,GAAoB;AAAA,EACjF,QAAQ;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,aAAa;AAAA,MACT,QAAQ;AAAA,MACR,KAAK;AAAA,IACT;AAAA,IACA,cAAc;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,MACL,QAAQ;AAAA,IACZ;AAAA,IACA,UAAU,IAAI,QAAQ,IAAI,IAAI,EAAE;AAAA,IAChC,WAAW,IAAI,QAAQ,GAAG,GAAG,CAAC;AAAA,EAClC;AAAA,EACA,QAAQ;AAAA,IACJ,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,WAAW;AAAA,IACX,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,cAAc;AAAA,EAClB;AAAA,EACA,UAAU;AAAA,IACN,SAAS;AAAA,EACb;AAAA,EACA,UAAU;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACH,MAAM;AAAA,IACN,MAAM;AAAA,EACV;AACJ,CAAC;AAxCE,IAAM,WAAN;","names":[]}
|
|
@@ -9,8 +9,6 @@ import { MineRenderError } from "../error/MineRenderError.mjs";
|
|
|
9
9
|
import { isMesh } from "../util/three.mjs";
|
|
10
10
|
import { isDisposable } from "../Disposable.mjs";
|
|
11
11
|
import { merge } from "../util/_internal/merge.mjs";
|
|
12
|
-
import { prefix } from "../util/log.mjs";
|
|
13
|
-
var p = prefix("SceneObject");
|
|
14
12
|
var _SceneObject = class _SceneObject extends Object3D {
|
|
15
13
|
constructor(options) {
|
|
16
14
|
super();
|
|
@@ -22,7 +20,6 @@ var _SceneObject = class _SceneObject extends Object3D {
|
|
|
22
20
|
this.freeInstanceIndices = [];
|
|
23
21
|
this.hiddenInstanceMatrices = /* @__PURE__ */ new Map();
|
|
24
22
|
this.options = merge({}, _SceneObject.DEFAULT_OPTIONS, options ?? {});
|
|
25
|
-
console.log("SceneObject options", this.options);
|
|
26
23
|
}
|
|
27
24
|
set scene(scene) {
|
|
28
25
|
if (!!this._scene) throw new MineRenderError("Scene already set");
|
|
@@ -51,7 +48,6 @@ var _SceneObject = class _SceneObject extends Object3D {
|
|
|
51
48
|
this.remove(existing);
|
|
52
49
|
}
|
|
53
50
|
}
|
|
54
|
-
console.log("add", group, group.name);
|
|
55
51
|
this.add(group);
|
|
56
52
|
this.notifyDirty();
|
|
57
53
|
return group;
|
|
@@ -91,11 +87,9 @@ var _SceneObject = class _SceneObject extends Object3D {
|
|
|
91
87
|
if (name) {
|
|
92
88
|
const existing = parent.getObjectByName(mesh.name);
|
|
93
89
|
if (existing) {
|
|
94
|
-
console.log("remove", existing.name, existing);
|
|
95
90
|
parent.remove(existing);
|
|
96
91
|
}
|
|
97
92
|
}
|
|
98
|
-
console.log("add", mesh, mesh.name);
|
|
99
93
|
parent.add(mesh);
|
|
100
94
|
}
|
|
101
95
|
createAndAddMesh(name, group, geometry, material, offsetAxis, offset = 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/renderer/SceneObject.ts"],"sourcesContent":["import { BoxGeometry, Color, EdgesGeometry, Euler, InstancedBufferAttribute, InstancedMesh, LineBasicMaterial, LineSegments, Matrix4, Mesh, Object3D, Quaternion, Scene, Vector3 } from \"three\";\nimport { ModelElement, ModelFaces } from \"../model/ModelElement\";\nimport { Geometries } from \"../Geometries\";\nimport { facesToUvArray } from \"../util/_internal/cubeUv\";\nimport { DoubleArray, TripleArray } from \"../model/Model\";\nimport { Axis, axisToVec3 } from \"../Axis\";\nimport type { BufferGeometry, Material, Object3DEventMap } from \"three\";\nimport { SkinPart } from \"../skin/SkinPart\";\nimport { changeEvent, Maybe } from \"../util/util\";\nimport { InstanceReference } from \"../instance/InstanceReference\";\nimport { MineRenderError } from \"../error/MineRenderError\";\nimport { isMesh } from \"../util/three\";\nimport { Disposable, isDisposable } from \"../Disposable\";\nimport { SceneObjectOptions } from \"./SceneObjectOptions\";\nimport { merge } from \"../util/_internal/merge\";\nimport { Instanceable } from \"../instance/Instanceable\";\nimport type { MineRenderScene } from \"./MineRenderScene\";\nimport { Transformable } from \"../Transformable\";\nimport { prefix } from \"../util/log\";\n\nconst p = prefix(\"SceneObject\");\n\n/**\n * Base for renderable Minecraft objects, with named parts and optional shared instances.\n * Use {@link notifyDirty} after changing a part directly so the renderer redraws it.\n */\nexport class SceneObject extends Object3D<Object3DEventMap & { change: {} }> 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 protected instanceMesh?: InstancedMesh;\n private readonly instanceReferences = new Map<number, InstanceReference<SceneObject>>();\n private readonly freeInstanceIndices: number[] = [];\n private readonly hiddenInstanceMatrices = new Map<number, Matrix4>();\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 /** Marks ancestor scenes for redraw and emits a `change` event. */\n public notifyDirty() {\n this.traverseAncestors(parent => {\n const scene = parent as MineRenderScene;\n if (scene.isMineRenderScene) scene.dirty = true;\n });\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 * Finds a named part, such as `head`, without the internal `group:` prefix.\n * Returns `undefined` when the group does not exist.\n */\n public getGroupByName(name: string): Maybe<Object3D> {\n return this.getObjectByName(`group:${name}`) as Object3D;\n }\n\n /**\n * Changes a named group's visibility and requests a redraw.\n * @param name - Part name without the `group:` prefix.\n * @param visible - Visibility to assign. Omit it to toggle the current value.\n * @returns The resulting visibility, or `false` if the group does not exist.\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 mesh.count = 0;\n this.instanceMesh = mesh;\n this._isInstanced = true;\n if (name) {\n mesh.name = `mesh:${name}`;\n }\n return mesh;\n }\n\n /**\n * Finds a named mesh without the internal `mesh:` prefix, or returns `undefined`.\n */\n public getMeshByName(name: string): Maybe<Mesh> {\n return this.getObjectByName(`mesh:${name}`) as Mesh;\n }\n\n /**\n * Changes a named mesh's visibility and requests a redraw.\n * @param name - Mesh name without the `mesh:` prefix.\n * @param visible - Visibility to assign. Omit it to toggle the current value.\n * @returns The resulting visibility, or `false` if the mesh does not exist.\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.traverse(obj => {\n if (isMesh(obj)) cb(obj);\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 = 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 /** Number of live placements, excluding released instance slots. */\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 /** Allocates a placement of this instanced object, reusing a released slot when available. */\n nextInstance(): InstanceReference<SceneObject> {\n const mesh = this.instanceMesh;\n if (!mesh) throw new MineRenderError(\"Object is not instanced\");\n const index = this.freeInstanceIndices.pop() ?? mesh.count;\n if (index >= mesh.instanceMatrix.count) this.growInstances(index + 1);\n const reference = this.constructInstanceReference(index);\n this.instanceReferences.set(index, reference);\n this._instanceCounter = this.instanceReferences.size;\n mesh.count = Math.max(mesh.count, index + 1);\n if (mesh.instanceColor) {\n mesh.setColorAt(index, new Color(0xffffff));\n mesh.instanceColor.needsUpdate = true;\n }\n if (this._scene) this._scene.stats.instanceCount++;\n this.setMatrixAt(index, new Matrix4());\n return reference;\n }\n\n /** Returns the live reference for a raycast hit on this object's instance mesh. */\n public getInstanceReference(mesh: Object3D, index: number): Maybe<InstanceReference<SceneObject>> {\n return mesh === this.instanceMesh ? this.instanceReferences.get(index) : undefined;\n }\n\n isInstanceActive(index: number, reference: InstanceReference<Instanceable>): boolean {\n return this.instanceReferences.get(index) === reference;\n }\n\n removeInstanceAt(index: number): void {\n if (!this.instanceReferences.has(index)) return;\n const mesh = this.instanceMesh!;\n this.hiddenInstanceMatrices.delete(index);\n this.setMatrixAt(index, new Matrix4().makeScale(0, 0, 0));\n this.instanceReferences.delete(index);\n this.freeInstanceIndices.push(index);\n this._instanceCounter = this.instanceReferences.size;\n while (mesh.count > 0 && !this.instanceReferences.has(mesh.count - 1)) mesh.count--;\n if (this._scene) this._scene.stats.instanceCount--;\n }\n\n private growInstances(required: number): void {\n const mesh = this.instanceMesh!;\n const capacity = Math.max(required, mesh.instanceMatrix.count * 2);\n const grow = (attribute: InstancedBufferAttribute, fill: number) => {\n const array = new Float32Array(capacity * attribute.itemSize).fill(fill);\n array.set(attribute.array);\n return new InstancedBufferAttribute(array, attribute.itemSize, attribute.normalized, attribute.meshPerAttribute)\n .setUsage(attribute.usage);\n };\n const matrix = grow(mesh.instanceMatrix, 0);\n const color = mesh.instanceColor ? grow(mesh.instanceColor, 1) : null;\n // Release uploaded instance buffers before replacing their attributes.\n mesh.dispose();\n mesh.instanceMatrix = matrix;\n mesh.instanceColor = color;\n }\n\n protected *activeInstanceIndices(): Iterable<number> {\n if (this.instanceMesh) {\n yield* this.instanceReferences.keys();\n } else {\n for (let i = 0; i < this.instanceCounter; i++) yield i;\n }\n }\n\n //</editor-fold>\n\n //<editor-fold desc=\"TRANSFORMATION\">\n\n getMatrixAt(index: number, matrix: Matrix4 = new Matrix4()): Matrix4 {\n if (!this.instanceReferences.has(index)) throw new MineRenderError(\"Instance is not active\");\n const hidden = this.hiddenInstanceMatrices.get(index);\n if (hidden) {\n return matrix.copy(hidden);\n }\n this.instanceMesh!.getMatrixAt(index, matrix);\n return matrix;\n }\n\n setMatrixAt(index: number, matrix: Matrix4) {\n if (!this.instanceReferences.has(index)) throw new MineRenderError(\"Instance is not active\");\n const mesh = this.instanceMesh!;\n const hidden = this.hiddenInstanceMatrices.get(index);\n if (hidden) {\n hidden.copy(matrix);\n }\n mesh.setMatrixAt(index, hidden ? new Matrix4().makeScale(0, 0, 0) : matrix);\n mesh.instanceMatrix.needsUpdate = true;\n mesh.boundingBox = null;\n mesh.boundingSphere = null;\n this.notifyDirty();\n }\n\n setInstanceVisibleAt(index: number, visible: boolean): void {\n if (!this.instanceReferences.has(index)) {\n throw new MineRenderError(\"Instance is not active\");\n }\n const hidden = this.hiddenInstanceMatrices.get(index);\n if (visible) {\n if (!hidden) {\n return;\n }\n this.hiddenInstanceMatrices.delete(index);\n this.setMatrixAt(index, hidden);\n } else {\n if (hidden) {\n return;\n }\n const matrix = this.getMatrixAt(index);\n this.hiddenInstanceMatrices.set(index, matrix);\n this.setMatrixAt(index, matrix);\n }\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 rotation = new Quaternion();\n this.getMatrixAt(index).decompose(new Vector3(), rotation, new Vector3());\n return euler.setFromQuaternion(rotation);\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 /** Updates supplied transform components. For a shared model, affects every live instance. */\n setPositionRotationScale(position?: Vector3, rotation?: Euler, scale?: Vector3): void {\n if (this.isInstanced) {\n for (const i of this.activeInstanceIndices()) {\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 /** Sets position in scene units. For a shared model, updates every live instance. */\n setPosition(position: Vector3) {\n if (this.isInstanced) {\n for (const i of this.activeInstanceIndices()) {\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(this.instanceReferences.keys().next().value ?? 0);\n } else {\n return this.position;\n }\n }\n\n /** Sets rotation in radians. For a shared model, updates every live instance. */\n setRotation(rotation: Euler) {\n if (this.isInstanced) {\n for (const i of this.activeInstanceIndices()) {\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(this.instanceReferences.keys().next().value ?? 0);\n } else {\n return this.rotation;\n }\n }\n\n /** Sets scale factors. For a shared model, updates every live instance. */\n setScale(scale: Vector3) {\n if (this.isInstanced) {\n for (const i of this.activeInstanceIndices()) {\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(this.instanceReferences.keys().next().value ?? 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 this.notifyDirty();\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 super.dispose();\n }\n\n /** Releases instance slots and removes children, disposing children that implement Disposable. */\n public disposeAndRemoveAllChildren() {\n if (this.instanceMesh) {\n if (this._scene) this._scene.stats.instanceCount -= this.instanceReferences.size;\n this.instanceReferences.clear();\n this.freeInstanceIndices.length = 0;\n this.hiddenInstanceMatrices.clear();\n this._instanceCounter = 0;\n this.instanceMesh.count = 0;\n this.instanceMesh.dispose();\n this.instanceMesh.removeFromParent();\n this.instanceMesh = undefined;\n this._isInstanced = false;\n }\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 /** Detaches the object from its parent and requests a redraw. */\n public removeFromScene() {\n this.notifyDirty();\n this.removeFromParent();\n }\n\n //</editor-fold>\n\n}\n\nexport function isSceneObject(obj: any): obj is SceneObject {\n return (<SceneObject>obj).isSceneObject;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/renderer/SceneObject.ts"],"sourcesContent":["import { BoxGeometry, Color, EdgesGeometry, Euler, InstancedBufferAttribute, InstancedMesh, LineBasicMaterial, LineSegments, Matrix4, Mesh, Object3D, Quaternion, Scene, Vector3 } from \"three\";\nimport { ModelElement, ModelFaces } from \"../model/ModelElement\";\nimport { Geometries } from \"../Geometries\";\nimport { facesToUvArray } from \"../util/_internal/cubeUv\";\nimport { DoubleArray, TripleArray } from \"../model/Model\";\nimport { Axis, axisToVec3 } from \"../Axis\";\nimport type { BufferGeometry, Material, Object3DEventMap } from \"three\";\nimport { SkinPart } from \"../skin/SkinPart\";\nimport { changeEvent, Maybe } from \"../util/util\";\nimport { InstanceReference } from \"../instance/InstanceReference\";\nimport { MineRenderError } from \"../error/MineRenderError\";\nimport { isMesh } from \"../util/three\";\nimport { Disposable, isDisposable } from \"../Disposable\";\nimport { SceneObjectOptions } from \"./SceneObjectOptions\";\nimport { merge } from \"../util/_internal/merge\";\nimport { Instanceable } from \"../instance/Instanceable\";\nimport type { MineRenderScene } from \"./MineRenderScene\";\nimport { Transformable } from \"../Transformable\";\n\n\n/**\n * Base for renderable Minecraft objects, with named parts and optional shared instances.\n * Use {@link notifyDirty} after changing a part directly so the renderer redraws it.\n */\nexport class SceneObject extends Object3D<Object3DEventMap & { change: {} }> 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 protected instanceMesh?: InstancedMesh;\n private readonly instanceReferences = new Map<number, InstanceReference<SceneObject>>();\n private readonly freeInstanceIndices: number[] = [];\n private readonly hiddenInstanceMatrices = new Map<number, Matrix4>();\n\n constructor(options?: Partial<SceneObjectOptions>) {\n super();\n this.options = merge({}, SceneObject.DEFAULT_OPTIONS, 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 /** Marks ancestor scenes for redraw and emits a `change` event. */\n public notifyDirty() {\n this.traverseAncestors(parent => {\n const scene = parent as MineRenderScene;\n if (scene.isMineRenderScene) scene.dirty = true;\n });\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 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 * Finds a named part, such as `head`, without the internal `group:` prefix.\n * Returns `undefined` when the group does not exist.\n */\n public getGroupByName(name: string): Maybe<Object3D> {\n return this.getObjectByName(`group:${name}`) as Object3D;\n }\n\n /**\n * Changes a named group's visibility and requests a redraw.\n * @param name - Part name without the `group:` prefix.\n * @param visible - Visibility to assign. Omit it to toggle the current value.\n * @returns The resulting visibility, or `false` if the group does not exist.\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 parent.remove(existing);\n }\n }\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 mesh.count = 0;\n this.instanceMesh = mesh;\n this._isInstanced = true;\n if (name) {\n mesh.name = `mesh:${name}`;\n }\n return mesh;\n }\n\n /**\n * Finds a named mesh without the internal `mesh:` prefix, or returns `undefined`.\n */\n public getMeshByName(name: string): Maybe<Mesh> {\n return this.getObjectByName(`mesh:${name}`) as Mesh;\n }\n\n /**\n * Changes a named mesh's visibility and requests a redraw.\n * @param name - Mesh name without the `mesh:` prefix.\n * @param visible - Visibility to assign. Omit it to toggle the current value.\n * @returns The resulting visibility, or `false` if the mesh does not exist.\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.traverse(obj => {\n if (isMesh(obj)) cb(obj);\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 = 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 /** Number of live placements, excluding released instance slots. */\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 /** Allocates a placement of this instanced object, reusing a released slot when available. */\n nextInstance(): InstanceReference<SceneObject> {\n const mesh = this.instanceMesh;\n if (!mesh) throw new MineRenderError(\"Object is not instanced\");\n const index = this.freeInstanceIndices.pop() ?? mesh.count;\n if (index >= mesh.instanceMatrix.count) this.growInstances(index + 1);\n const reference = this.constructInstanceReference(index);\n this.instanceReferences.set(index, reference);\n this._instanceCounter = this.instanceReferences.size;\n mesh.count = Math.max(mesh.count, index + 1);\n if (mesh.instanceColor) {\n mesh.setColorAt(index, new Color(0xffffff));\n mesh.instanceColor.needsUpdate = true;\n }\n if (this._scene) this._scene.stats.instanceCount++;\n this.setMatrixAt(index, new Matrix4());\n return reference;\n }\n\n /** Returns the live reference for a raycast hit on this object's instance mesh. */\n public getInstanceReference(mesh: Object3D, index: number): Maybe<InstanceReference<SceneObject>> {\n return mesh === this.instanceMesh ? this.instanceReferences.get(index) : undefined;\n }\n\n isInstanceActive(index: number, reference: InstanceReference<Instanceable>): boolean {\n return this.instanceReferences.get(index) === reference;\n }\n\n removeInstanceAt(index: number): void {\n if (!this.instanceReferences.has(index)) return;\n const mesh = this.instanceMesh!;\n this.hiddenInstanceMatrices.delete(index);\n this.setMatrixAt(index, new Matrix4().makeScale(0, 0, 0));\n this.instanceReferences.delete(index);\n this.freeInstanceIndices.push(index);\n this._instanceCounter = this.instanceReferences.size;\n while (mesh.count > 0 && !this.instanceReferences.has(mesh.count - 1)) mesh.count--;\n if (this._scene) this._scene.stats.instanceCount--;\n }\n\n private growInstances(required: number): void {\n const mesh = this.instanceMesh!;\n const capacity = Math.max(required, mesh.instanceMatrix.count * 2);\n const grow = (attribute: InstancedBufferAttribute, fill: number) => {\n const array = new Float32Array(capacity * attribute.itemSize).fill(fill);\n array.set(attribute.array);\n return new InstancedBufferAttribute(array, attribute.itemSize, attribute.normalized, attribute.meshPerAttribute)\n .setUsage(attribute.usage);\n };\n const matrix = grow(mesh.instanceMatrix, 0);\n const color = mesh.instanceColor ? grow(mesh.instanceColor, 1) : null;\n // Release uploaded instance buffers before replacing their attributes.\n mesh.dispose();\n mesh.instanceMatrix = matrix;\n mesh.instanceColor = color;\n }\n\n protected *activeInstanceIndices(): Iterable<number> {\n if (this.instanceMesh) {\n yield* this.instanceReferences.keys();\n } else {\n for (let i = 0; i < this.instanceCounter; i++) yield i;\n }\n }\n\n //</editor-fold>\n\n //<editor-fold desc=\"TRANSFORMATION\">\n\n getMatrixAt(index: number, matrix: Matrix4 = new Matrix4()): Matrix4 {\n if (!this.instanceReferences.has(index)) throw new MineRenderError(\"Instance is not active\");\n const hidden = this.hiddenInstanceMatrices.get(index);\n if (hidden) {\n return matrix.copy(hidden);\n }\n this.instanceMesh!.getMatrixAt(index, matrix);\n return matrix;\n }\n\n setMatrixAt(index: number, matrix: Matrix4) {\n if (!this.instanceReferences.has(index)) throw new MineRenderError(\"Instance is not active\");\n const mesh = this.instanceMesh!;\n const hidden = this.hiddenInstanceMatrices.get(index);\n if (hidden) {\n hidden.copy(matrix);\n }\n mesh.setMatrixAt(index, hidden ? new Matrix4().makeScale(0, 0, 0) : matrix);\n mesh.instanceMatrix.needsUpdate = true;\n mesh.boundingBox = null;\n mesh.boundingSphere = null;\n this.notifyDirty();\n }\n\n setInstanceVisibleAt(index: number, visible: boolean): void {\n if (!this.instanceReferences.has(index)) {\n throw new MineRenderError(\"Instance is not active\");\n }\n const hidden = this.hiddenInstanceMatrices.get(index);\n if (visible) {\n if (!hidden) {\n return;\n }\n this.hiddenInstanceMatrices.delete(index);\n this.setMatrixAt(index, hidden);\n } else {\n if (hidden) {\n return;\n }\n const matrix = this.getMatrixAt(index);\n this.hiddenInstanceMatrices.set(index, matrix);\n this.setMatrixAt(index, matrix);\n }\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 rotation = new Quaternion();\n this.getMatrixAt(index).decompose(new Vector3(), rotation, new Vector3());\n return euler.setFromQuaternion(rotation);\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 /** Updates supplied transform components. For a shared model, affects every live instance. */\n setPositionRotationScale(position?: Vector3, rotation?: Euler, scale?: Vector3): void {\n if (this.isInstanced) {\n for (const i of this.activeInstanceIndices()) {\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 /** Sets position in scene units. For a shared model, updates every live instance. */\n setPosition(position: Vector3) {\n if (this.isInstanced) {\n for (const i of this.activeInstanceIndices()) {\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(this.instanceReferences.keys().next().value ?? 0);\n } else {\n return this.position;\n }\n }\n\n /** Sets rotation in radians. For a shared model, updates every live instance. */\n setRotation(rotation: Euler) {\n if (this.isInstanced) {\n for (const i of this.activeInstanceIndices()) {\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(this.instanceReferences.keys().next().value ?? 0);\n } else {\n return this.rotation;\n }\n }\n\n /** Sets scale factors. For a shared model, updates every live instance. */\n setScale(scale: Vector3) {\n if (this.isInstanced) {\n for (const i of this.activeInstanceIndices()) {\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(this.instanceReferences.keys().next().value ?? 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 this.notifyDirty();\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 super.dispose();\n }\n\n /** Releases instance slots and removes children, disposing children that implement Disposable. */\n public disposeAndRemoveAllChildren() {\n if (this.instanceMesh) {\n if (this._scene) this._scene.stats.instanceCount -= this.instanceReferences.size;\n this.instanceReferences.clear();\n this.freeInstanceIndices.length = 0;\n this.hiddenInstanceMatrices.clear();\n this._instanceCounter = 0;\n this.instanceMesh.count = 0;\n this.instanceMesh.dispose();\n this.instanceMesh.removeFromParent();\n this.instanceMesh = undefined;\n this._isInstanced = false;\n }\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 /** Detaches the object from its parent and requests a redraw. */\n public removeFromScene() {\n this.notifyDirty();\n this.removeFromParent();\n }\n\n //</editor-fold>\n\n}\n\nexport function isSceneObject(obj: any): obj is SceneObject {\n return (<SceneObject>obj).isSceneObject;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/request/Requests.ts
|
|
2
2
|
import { JobCancelledError, JobQueue } from "jobqu";
|
|
3
|
-
import {
|
|
4
|
-
var
|
|
3
|
+
import { logger } from "../util/log.mjs";
|
|
4
|
+
var log = logger("Requests");
|
|
5
5
|
var RequestError = class extends Error {
|
|
6
6
|
constructor(message, response, cause) {
|
|
7
7
|
super(message);
|
|
@@ -80,7 +80,7 @@ var RequestQueue = class {
|
|
|
80
80
|
try {
|
|
81
81
|
return await abortable(this.queue.add(request), signal);
|
|
82
82
|
} catch (error) {
|
|
83
|
-
|
|
83
|
+
log.debug("Request failed", error);
|
|
84
84
|
const delay = this.retryDelay(error, request, retries);
|
|
85
85
|
if (delay === void 0) {
|
|
86
86
|
throw error;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/request/Requests.ts"],"sourcesContent":["import { JobCancelledError, JobQueue } from \"jobqu\";\nimport { prefix } from \"../util/log\";\n\nconst p = prefix(\"Requests\");\n\n/** Fetch settings passed to {@link Requests.genericRequest} or {@link Requests.mcAssetRequest}. */\nexport interface RequestConfig extends RequestInit {\n url: string;\n /** Prepended to relative URLs, preserving any path in the base URL. */\n baseURL?: string;\n /** Timeout per attempt in milliseconds, including body reading. Defaults to 5000; 0 disables it. */\n timeout?: number;\n /** Response-body decoding. Defaults to `json`. */\n responseType?: \"json\" | \"arraybuffer\";\n}\n\n/** A decoded response body with the HTTP status, native headers, and final URL. */\nexport interface RequestResponse<T = any> {\n data: T;\n status: number;\n statusText: string;\n headers: Headers;\n /** Final URL after redirects. */\n url: string;\n}\n\n/** An HTTP or network failure, with response details or an underlying cause when available. */\nexport class RequestError extends Error {\n constructor(message: string, readonly response?: RequestResponse<undefined>, readonly cause?: unknown) {\n super(message);\n this.name = \"RequestError\";\n }\n}\n\nasync function fetchRequest(config: RequestConfig, defaultBaseURL?: string): Promise<RequestResponse> {\n const { url, baseURL = defaultBaseURL, timeout = 5000, responseType = \"json\", signal, ...options } = config;\n const target = baseURL && !/^([a-z][a-z\\d+.-]*:|\\/\\/)/i.test(url)\n ? `${baseURL.replace(/\\/+$/, \"\")}/${url.replace(/^\\/+/, \"\")}` : url;\n const headers = new Headers(options.headers);\n if (typeof window === \"undefined\" && !headers.has(\"User-Agent\")) {\n headers.set(\"User-Agent\", \"MineRender\");\n }\n const attemptSignal = AbortSignal.any([\n ...(signal ? [signal] : []), ...(timeout === 0 ? [] : [AbortSignal.timeout(timeout)])\n ]);\n // Validate configuration before classifying Fetch TypeErrors as network failures.\n const request = new Request(target, { ...options, headers, signal: attemptSignal });\n attemptSignal.throwIfAborted();\n try {\n const response = await fetch(request);\n const result: RequestResponse<undefined> = {\n data: undefined,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n url: response.url\n };\n if (!response.ok) {\n // Release error bodies without letting cleanup hide the HTTP status.\n await response.body?.cancel().catch(() => {});\n throw new RequestError(`Request failed with status ${response.status}`, result);\n }\n const emptyBody = request.method === \"HEAD\" || response.status === 204 || response.status === 205;\n const data = responseType === \"arraybuffer\" ? await response.arrayBuffer()\n : emptyBody || response.body === null ? undefined : await response.json();\n return { ...result, data };\n } catch (error) {\n attemptSignal.throwIfAborted();\n if (/^https?:/.test(request.url) && request.redirect !== \"error\" && error instanceof TypeError) {\n throw new RequestError(\"Network request failed\", undefined, error);\n }\n throw error;\n }\n}\n\nasync function abortable<T>(promise: Promise<T>, signal?: AbortSignal | null): Promise<T> {\n if (!signal) return promise;\n let abort: () => void;\n const cancelled = new Promise<never>((_, reject) => {\n abort = () => reject(signal.reason);\n signal.addEventListener(\"abort\", abort, { once: true });\n if (signal.aborted) abort();\n });\n try {\n return await Promise.race([promise, cancelled]);\n } finally {\n signal.removeEventListener(\"abort\", abort!);\n }\n}\n\nclass RequestQueue {\n\n public baseURL?: string;\n private pendingRequests = 0;\n private readonly stopped = new AbortController();\n private readonly queue = new JobQueue<RequestConfig, RequestResponse>(\n request => fetchRequest(request, this.baseURL), { interval: 10, maxPerRun: 1, maxActive: 8 });\n\n public async request(request: RequestConfig): Promise<RequestResponse> {\n this.pendingRequests++;\n const signal = request.signal;\n try {\n for (let retries = 0; ; retries++) {\n signal?.throwIfAborted();\n try {\n return await abortable(this.queue.add(request), signal);\n } catch (error) {\n console.debug(p, \"Request failed\", error);\n const delay = this.retryDelay(error, request, retries);\n if (delay === undefined) {\n throw error;\n }\n await this.waitForRetry(delay, signal);\n }\n }\n } finally {\n if (signal?.aborted) {\n this.queue.remove(request);\n }\n this.pendingRequests--;\n }\n }\n\n private retryDelay(error: unknown, request: RequestConfig, retries: number): number | undefined {\n if (this.stopped.signal.aborted || retries >= 3 ||\n (request.method ?? \"get\").toLowerCase() !== \"get\" || request.signal?.aborted) {\n return undefined;\n }\n if (error instanceof RequestError) {\n const status = error.response?.status;\n if (status !== undefined && status !== 408 && status !== 429 && !(status >= 500 && status < 600)) return undefined;\n } else if (!(error instanceof DOMException && error.name === \"TimeoutError\")) {\n return undefined;\n }\n\n let delay = 100 * (2 ** retries);\n const retryAfter = error instanceof RequestError ? error.response?.headers.get(\"Retry-After\") : undefined;\n if (retryAfter !== undefined && retryAfter !== null) {\n const seconds = Number(retryAfter);\n if (!retryAfter.trim() || !Number.isFinite(seconds) || seconds < 0) {\n return undefined;\n }\n delay = Math.max(delay, seconds * 1000);\n }\n return delay;\n }\n\n private async waitForRetry(delay: number, signal?: AbortSignal | null): Promise<void> {\n let timer: ReturnType<typeof setTimeout>;\n const waiting = new Promise<void>(resolve => { timer = setTimeout(resolve, delay); });\n try {\n await abortable(waiting, AbortSignal.any([this.stopped.signal, ...(signal ? [signal] : [])]));\n } finally {\n clearTimeout(timer!);\n }\n }\n\n public get pendingSize(): number {\n return this.pendingRequests;\n }\n\n public end(): void {\n this.queue.end();\n this.stopped.abort(new JobCancelledError(\"ended\"));\n }\n}\n\n/** Shared Fetch queues with concurrency limits, cancellation, timeouts, and bounded retries for GET requests. */\nexport class Requests {\n\n private static genericQueue = new RequestQueue();\n private static mcAssetRequestQueue = new RequestQueue();\n\n /** Queues a general request. Set `request.signal` to cancel it and `request.timeout` to limit each attempt. */\n public static genericRequest(request: RequestConfig): Promise<RequestResponse> {\n return this.genericQueue.request(request);\n }\n\n /** Queues a request separately from general traffic, using the configured asset base URL for relative paths. */\n public static mcAssetRequest(request: RequestConfig): Promise<RequestResponse> {\n return this.mcAssetRequestQueue.request(request);\n }\n\n /** Sets the base URL for relative asset requests. Use {@link AssetLoader.setVersion} to change Minecraft versions. */\n public static setMcAssetRoot(root: string) {\n this.mcAssetRequestQueue.baseURL = root;\n }\n\n /** Counts unsettled calls, including retry delays and requests still running after shutdown. */\n public static get queueSizes() {\n return {\n generic: this.genericQueue.pendingSize,\n mcAsset: this.mcAssetRequestQueue.pendingSize\n }\n }\n\n /**\n * Permanently stops both queues and rejects waiting, retrying, and future requests.\n * Requests already running can finish. Idle queues hold no timer, so Node can exit without\n * this cleanup. See {@link shutdown}.\n */\n public static end() {\n this.genericQueue.end();\n this.mcAssetRequestQueue.end();\n }\n\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/request/Requests.ts"],"sourcesContent":["import { JobCancelledError, JobQueue } from \"jobqu\";\nimport { logger } from \"../util/log\";\n\nconst log = logger(\"Requests\");\n\n/** Fetch settings passed to {@link Requests.genericRequest} or {@link Requests.mcAssetRequest}. */\nexport interface RequestConfig extends RequestInit {\n url: string;\n /** Prepended to relative URLs, preserving any path in the base URL. */\n baseURL?: string;\n /** Timeout per attempt in milliseconds, including body reading. Defaults to 5000; 0 disables it. */\n timeout?: number;\n /** Response-body decoding. Defaults to `json`. */\n responseType?: \"json\" | \"arraybuffer\";\n}\n\n/** A decoded response body with the HTTP status, native headers, and final URL. */\nexport interface RequestResponse<T = any> {\n data: T;\n status: number;\n statusText: string;\n headers: Headers;\n /** Final URL after redirects. */\n url: string;\n}\n\n/** An HTTP or network failure, with response details or an underlying cause when available. */\nexport class RequestError extends Error {\n constructor(message: string, readonly response?: RequestResponse<undefined>, readonly cause?: unknown) {\n super(message);\n this.name = \"RequestError\";\n }\n}\n\nasync function fetchRequest(config: RequestConfig, defaultBaseURL?: string): Promise<RequestResponse> {\n const { url, baseURL = defaultBaseURL, timeout = 5000, responseType = \"json\", signal, ...options } = config;\n const target = baseURL && !/^([a-z][a-z\\d+.-]*:|\\/\\/)/i.test(url)\n ? `${baseURL.replace(/\\/+$/, \"\")}/${url.replace(/^\\/+/, \"\")}` : url;\n const headers = new Headers(options.headers);\n if (typeof window === \"undefined\" && !headers.has(\"User-Agent\")) {\n headers.set(\"User-Agent\", \"MineRender\");\n }\n const attemptSignal = AbortSignal.any([\n ...(signal ? [signal] : []), ...(timeout === 0 ? [] : [AbortSignal.timeout(timeout)])\n ]);\n // Validate configuration before classifying Fetch TypeErrors as network failures.\n const request = new Request(target, { ...options, headers, signal: attemptSignal });\n attemptSignal.throwIfAborted();\n try {\n const response = await fetch(request);\n const result: RequestResponse<undefined> = {\n data: undefined,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n url: response.url\n };\n if (!response.ok) {\n // Release error bodies without letting cleanup hide the HTTP status.\n await response.body?.cancel().catch(() => {});\n throw new RequestError(`Request failed with status ${response.status}`, result);\n }\n const emptyBody = request.method === \"HEAD\" || response.status === 204 || response.status === 205;\n const data = responseType === \"arraybuffer\" ? await response.arrayBuffer()\n : emptyBody || response.body === null ? undefined : await response.json();\n return { ...result, data };\n } catch (error) {\n attemptSignal.throwIfAborted();\n if (/^https?:/.test(request.url) && request.redirect !== \"error\" && error instanceof TypeError) {\n throw new RequestError(\"Network request failed\", undefined, error);\n }\n throw error;\n }\n}\n\nasync function abortable<T>(promise: Promise<T>, signal?: AbortSignal | null): Promise<T> {\n if (!signal) return promise;\n let abort: () => void;\n const cancelled = new Promise<never>((_, reject) => {\n abort = () => reject(signal.reason);\n signal.addEventListener(\"abort\", abort, { once: true });\n if (signal.aborted) abort();\n });\n try {\n return await Promise.race([promise, cancelled]);\n } finally {\n signal.removeEventListener(\"abort\", abort!);\n }\n}\n\nclass RequestQueue {\n\n public baseURL?: string;\n private pendingRequests = 0;\n private readonly stopped = new AbortController();\n private readonly queue = new JobQueue<RequestConfig, RequestResponse>(\n request => fetchRequest(request, this.baseURL), { interval: 10, maxPerRun: 1, maxActive: 8 });\n\n public async request(request: RequestConfig): Promise<RequestResponse> {\n this.pendingRequests++;\n const signal = request.signal;\n try {\n for (let retries = 0; ; retries++) {\n signal?.throwIfAborted();\n try {\n return await abortable(this.queue.add(request), signal);\n } catch (error) {\n log.debug(\"Request failed\", error);\n const delay = this.retryDelay(error, request, retries);\n if (delay === undefined) {\n throw error;\n }\n await this.waitForRetry(delay, signal);\n }\n }\n } finally {\n if (signal?.aborted) {\n this.queue.remove(request);\n }\n this.pendingRequests--;\n }\n }\n\n private retryDelay(error: unknown, request: RequestConfig, retries: number): number | undefined {\n if (this.stopped.signal.aborted || retries >= 3 ||\n (request.method ?? \"get\").toLowerCase() !== \"get\" || request.signal?.aborted) {\n return undefined;\n }\n if (error instanceof RequestError) {\n const status = error.response?.status;\n if (status !== undefined && status !== 408 && status !== 429 && !(status >= 500 && status < 600)) return undefined;\n } else if (!(error instanceof DOMException && error.name === \"TimeoutError\")) {\n return undefined;\n }\n\n let delay = 100 * (2 ** retries);\n const retryAfter = error instanceof RequestError ? error.response?.headers.get(\"Retry-After\") : undefined;\n if (retryAfter !== undefined && retryAfter !== null) {\n const seconds = Number(retryAfter);\n if (!retryAfter.trim() || !Number.isFinite(seconds) || seconds < 0) {\n return undefined;\n }\n delay = Math.max(delay, seconds * 1000);\n }\n return delay;\n }\n\n private async waitForRetry(delay: number, signal?: AbortSignal | null): Promise<void> {\n let timer: ReturnType<typeof setTimeout>;\n const waiting = new Promise<void>(resolve => { timer = setTimeout(resolve, delay); });\n try {\n await abortable(waiting, AbortSignal.any([this.stopped.signal, ...(signal ? [signal] : [])]));\n } finally {\n clearTimeout(timer!);\n }\n }\n\n public get pendingSize(): number {\n return this.pendingRequests;\n }\n\n public end(): void {\n this.queue.end();\n this.stopped.abort(new JobCancelledError(\"ended\"));\n }\n}\n\n/** Shared Fetch queues with concurrency limits, cancellation, timeouts, and bounded retries for GET requests. */\nexport class Requests {\n\n private static genericQueue = new RequestQueue();\n private static mcAssetRequestQueue = new RequestQueue();\n\n /** Queues a general request. Set `request.signal` to cancel it and `request.timeout` to limit each attempt. */\n public static genericRequest(request: RequestConfig): Promise<RequestResponse> {\n return this.genericQueue.request(request);\n }\n\n /** Queues a request separately from general traffic, using the configured asset base URL for relative paths. */\n public static mcAssetRequest(request: RequestConfig): Promise<RequestResponse> {\n return this.mcAssetRequestQueue.request(request);\n }\n\n /** Sets the base URL for relative asset requests. Use {@link AssetLoader.setVersion} to change Minecraft versions. */\n public static setMcAssetRoot(root: string) {\n this.mcAssetRequestQueue.baseURL = root;\n }\n\n /** Counts unsettled calls, including retry delays and requests still running after shutdown. */\n public static get queueSizes() {\n return {\n generic: this.genericQueue.pendingSize,\n mcAsset: this.mcAssetRequestQueue.pendingSize\n }\n }\n\n /**\n * Permanently stops both queues and rejects waiting, retrying, and future requests.\n * Requests already running can finish. Idle queues hold no timer, so Node can exit without\n * this cleanup. See {@link shutdown}.\n */\n public static end() {\n this.genericQueue.end();\n this.mcAssetRequestQueue.end();\n }\n\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// src/skin/Skins.ts
|
|
2
2
|
import { Requests } from "../request/Requests.mjs";
|
|
3
3
|
import { Caching } from "../cache/Caching.mjs";
|
|
4
|
+
import { logger } from "../util/log.mjs";
|
|
5
|
+
var log = logger("Skins");
|
|
4
6
|
var Skins = class {
|
|
5
7
|
//<editor-fold desc="Skins">
|
|
6
8
|
/** Returns a skin URL for {@link MineRenderScene.addSkin}, or `undefined` if name lookup fails. */
|
|
@@ -72,7 +74,7 @@ var Skins = class {
|
|
|
72
74
|
}
|
|
73
75
|
return void 0;
|
|
74
76
|
}).catch((err) => {
|
|
75
|
-
|
|
77
|
+
log.warn(err);
|
|
76
78
|
return void 0;
|
|
77
79
|
});
|
|
78
80
|
}
|
|
@@ -87,7 +89,7 @@ var Skins = class {
|
|
|
87
89
|
}
|
|
88
90
|
return void 0;
|
|
89
91
|
}).catch((err) => {
|
|
90
|
-
|
|
92
|
+
log.warn(err);
|
|
91
93
|
return void 0;
|
|
92
94
|
});
|
|
93
95
|
}
|
|
@@ -101,7 +103,7 @@ var Skins = class {
|
|
|
101
103
|
}
|
|
102
104
|
return void 0;
|
|
103
105
|
}).catch((err) => {
|
|
104
|
-
|
|
106
|
+
log.warn(err);
|
|
105
107
|
return void 0;
|
|
106
108
|
});
|
|
107
109
|
}
|
|
@@ -125,7 +127,7 @@ var Skins = class {
|
|
|
125
127
|
}
|
|
126
128
|
return void 0;
|
|
127
129
|
}).catch((err) => {
|
|
128
|
-
|
|
130
|
+
log.warn(err);
|
|
129
131
|
return void 0;
|
|
130
132
|
});
|
|
131
133
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/skin/Skins.ts"],"sourcesContent":["import { Requests } from \"../request/Requests\";\nimport { Maybe } from \"../util/util\";\nimport { Caching } from \"../cache/Caching\";\n\n//TODO: cache stuff\n/** Resolves player names, UUIDs, and service IDs to skin or cape texture URLs. */\nexport class Skins {\n\n\n //<editor-fold desc=\"Skins\">\n\n /** Returns a skin URL for {@link MineRenderScene.addSkin}, or `undefined` if name lookup fails. */\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 /** Builds a proxy URL for a UUID without downloading or checking the skin. */\n static async fromUuid(uuid: string): Promise<Maybe<string>> {\n return this.getMcProxySkinUrl(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 /** Looks up a saved MineSkin skin and returns its texture URL, or `undefined` on lookup failure. */\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 /** Resolves a player's Minecraft cape URL for {@link SkinObject.setCapeTexture}. */\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 /** Builds a proxy URL without checking whether the player has a cape. */\n static async capeFromUuid(uuid: string): Promise<Maybe<string>> {\n return this.getMcProxyCapeUrl(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 /** Returns a full static cape texture for a username or UUID. */\n static async capeFromCapesDev(player: string, capeType: string = \"minecraft\"): Promise<Maybe<string>> {\n const cape = await this.getCapesDev(player, capeType);\n return cape?.exists ? cape.imageUrls?.still?.full : undefined;\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 Caching.usernameUuidCache.get(username, () => this.usernameToUuidMcProxy(username));\n }\n\n private static async usernameToUuidMcProxy(username: string): Promise<Maybe<string>> {\n return Requests.genericRequest({\n baseURL: 'https://mcproxy.dev',\n url: '/uuid/' + username\n }).then(res => {\n if (res.status === 200) {\n return res.data[\"data\"][\"id\"];\n }\n return undefined;\n }).catch(err => {\n console.warn(err);\n return undefined;\n })\n }\n\n /** @deprecated **/\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(player: string, type: string = 'all'): Promise<Maybe<any>> {\n return Requests.genericRequest({\n baseURL: 'https://api.capes.dev',\n url: '/load/' + encodeURIComponent(player) + '/' + encodeURIComponent(type)\n }).then(res => {\n if (res.status === 200) {\n return res.data;\n }\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 /** @deprecated **/\n private static getSkinProxySkinUrl(uuid: string): string {\n return \"https://minecraft-skin-proxy.inventive.workers.dev/skin/\" + uuid;\n }\n\n /** @deprecated **/\n private static getSkinProxyCapeUrl(uuid: string): string {\n return \"https://minecraft-skin-proxy.inventive.workers.dev/cape/\" + uuid;\n }\n\n private static getMcProxySkinUrl(uuid: string): string {\n return \"https://mcproxy.dev/skin/\" + uuid;\n }\n\n private static getMcProxyCapeUrl(uuid: string): string {\n return \"https://mcproxy.dev/cape/\" + uuid;\n }\n\n //</editor-fold>\n\n\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/skin/Skins.ts"],"sourcesContent":["import { Requests } from \"../request/Requests\";\nimport { Maybe } from \"../util/util\";\nimport { Caching } from \"../cache/Caching\";\nimport { logger } from \"../util/log\";\n\nconst log = logger(\"Skins\");\n\n//TODO: cache stuff\n/** Resolves player names, UUIDs, and service IDs to skin or cape texture URLs. */\nexport class Skins {\n\n\n //<editor-fold desc=\"Skins\">\n\n /** Returns a skin URL for {@link MineRenderScene.addSkin}, or `undefined` if name lookup fails. */\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 /** Builds a proxy URL for a UUID without downloading or checking the skin. */\n static async fromUuid(uuid: string): Promise<Maybe<string>> {\n return this.getMcProxySkinUrl(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 /** Looks up a saved MineSkin skin and returns its texture URL, or `undefined` on lookup failure. */\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 /** Resolves a player's Minecraft cape URL for {@link SkinObject.setCapeTexture}. */\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 /** Builds a proxy URL without checking whether the player has a cape. */\n static async capeFromUuid(uuid: string): Promise<Maybe<string>> {\n return this.getMcProxyCapeUrl(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 /** Returns a full static cape texture for a username or UUID. */\n static async capeFromCapesDev(player: string, capeType: string = \"minecraft\"): Promise<Maybe<string>> {\n const cape = await this.getCapesDev(player, capeType);\n return cape?.exists ? cape.imageUrls?.still?.full : undefined;\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 Caching.usernameUuidCache.get(username, () => this.usernameToUuidMcProxy(username));\n }\n\n private static async usernameToUuidMcProxy(username: string): Promise<Maybe<string>> {\n return Requests.genericRequest({\n baseURL: 'https://mcproxy.dev',\n url: '/uuid/' + username\n }).then(res => {\n if (res.status === 200) {\n return res.data[\"data\"][\"id\"];\n }\n return undefined;\n }).catch(err => {\n log.warn(err);\n return undefined;\n })\n }\n\n /** @deprecated **/\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 log.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 log.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 log.warn(err);\n return undefined;\n })\n }\n\n private static async getCapesDev(player: string, type: string = 'all'): Promise<Maybe<any>> {\n return Requests.genericRequest({\n baseURL: 'https://api.capes.dev',\n url: '/load/' + encodeURIComponent(player) + '/' + encodeURIComponent(type)\n }).then(res => {\n if (res.status === 200) {\n return res.data;\n }\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 /** @deprecated **/\n private static getSkinProxySkinUrl(uuid: string): string {\n return \"https://minecraft-skin-proxy.inventive.workers.dev/skin/\" + uuid;\n }\n\n /** @deprecated **/\n private static getSkinProxyCapeUrl(uuid: string): string {\n return \"https://minecraft-skin-proxy.inventive.workers.dev/cape/\" + uuid;\n }\n\n private static getMcProxySkinUrl(uuid: string): string {\n return \"https://mcproxy.dev/skin/\" + uuid;\n }\n\n private static getMcProxyCapeUrl(uuid: string): string {\n return \"https://mcproxy.dev/cape/\" + uuid;\n }\n\n //</editor-fold>\n\n\n}\n"],"mappings":"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","names":[]}
|