minerender 2.1.0-beta.5 → 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 +6 -3
- 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/Fonts.mjs +31 -4
- package/dist/browser/esm/assets/Fonts.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 +168 -0
- package/dist/browser/esm/assets/_fonts/Unihex.mjs.map +1 -0
- 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 +19 -9
- package/dist/browser/esm/assets/source/HostedAssetSource.mjs.map +1 -1
- package/dist/browser/esm/assets/source/parser/AssetParsers.mjs +1 -0
- package/dist/browser/esm/assets/source/parser/AssetParsers.mjs.map +1 -1
- package/dist/browser/esm/cache/Caching.mjs +2 -0
- package/dist/browser/esm/cache/Caching.mjs.map +1 -1
- package/dist/browser/esm/entity/scene/EntityAnimationPlayer.mjs +62 -11
- package/dist/browser/esm/entity/scene/EntityAnimationPlayer.mjs.map +1 -1
- package/dist/browser/esm/entity/scene/EntityObject.mjs +53 -20
- package/dist/browser/esm/entity/scene/EntityObject.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/env/browser/section.worker.mjs +5 -3
- package/dist/browser/esm/env/browser/section.worker.mjs.map +1 -1
- package/dist/browser/esm/gui/GuiText.mjs +4 -3
- package/dist/browser/esm/gui/GuiText.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 +115 -20
- 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 +8 -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/model.mjs +7 -7
- package/dist/browser/esm/util/model.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/SectionGeometry.mjs +5 -3
- package/dist/browser/esm/world/SectionGeometry.mjs.map +1 -1
- package/dist/browser/esm/world/SectionMesh.mjs +4 -0
- package/dist/browser/esm/world/SectionMesh.mjs.map +1 -1
- package/dist/browser/esm/world/SectionModels.mjs +2 -2
- package/dist/browser/esm/world/SectionModels.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 +115 -20
- package/dist/browser/index.js +3449 -3025
- package/dist/browser/index.js.map +1 -1
- package/dist/bundle.js +13217 -12745
- package/dist/bundle.js.map +1 -1
- package/dist/node/index.d.mts +115 -20
- package/dist/node/index.d.ts +115 -20
- package/dist/node/index.js +3477 -3046
- package/dist/node/index.js.map +1 -1
- package/dist/node/index.mjs +3456 -3027
- package/dist/node/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/model/scene/ModelObject.ts"],"sourcesContent":["import { SceneObject } from \"../../renderer/SceneObject\";\nimport { ItemModel, Model, TextureAsset, TripleArray } from \"../Model\";\nimport { Materials } from \"../../Materials\";\nimport { Maybe, toRadians } from \"../../util/util\";\nimport { UVMapper } from \"../../UVMapper\";\nimport { TextureAtlas } from \"../../texture/TextureAtlas\";\nimport { BoxGeometry, BoxHelper, BufferAttribute, Color, DoubleSide, EdgesGeometry, Euler, FrontSide, InstancedMesh, LineBasicMaterial, LineSegments, Material, Matrix4, Mesh, MeshBasicMaterial, MeshStandardMaterial, ShaderMaterial } from \"three\";\nimport { mergeBufferGeometries } from \"../../three/BufferGeometryUtils\";\nimport { SceneObjectOptions } from \"../../renderer/SceneObjectOptions\";\nimport { addBox3WireframeToObject, addWireframeToMesh, addWireframeToObject, applyElementRotation } from \"../../util/model\";\nimport { merge } from \"../../util/_internal/merge\";\nimport type { BufferGeometry, Texture } from \"three\";\nimport { BlockObject } from \"../block/scene/BlockObject\";\nimport { prefix } from \"../../util/log\";\nimport { CUBE_FACES } from \"../../CubeFace\";\nimport { DisplayPosition } from \"../DisplayPosition\";\nimport { DisplayTransforms } from \"../DisplayTransforms\";\nimport { ModelCulling } from \"../ModelCulling\";\nimport type { MineRenderScene } from \"../../renderer/MineRenderScene\";\nimport { SpecialItems } from \"../SpecialItems\";\nimport { EntityObject } from \"../../entity/scene/EntityObject\";\nimport { GuiLight } from \"../GuiLight\";\nimport { ItemTints } from \"../ItemTints\";\nimport { ItemGlint } from \"../ItemGlint\";\n\n\nconst p = prefix(\"ModelObject\");\n\n//TODO: might want to abstract this out into a generic model, and create a separate class for Block models\n/** Builds render geometry from a merged Java model. Create it through {@link MineRenderScene.addModel}. */\nexport class ModelObject extends SceneObject {\n\n public readonly isModelObject: true = true;\n\n public static readonly DEFAULT_OPTIONS: ModelObjectOptions = merge({}, SceneObject.DEFAULT_OPTIONS, <ModelObjectOptions>{});\n public readonly options: ModelObjectOptions;\n\n protected atlas?: TextureAtlas;\n private atlasMaterial?: Material;\n private atlasTexture?: Texture;\n private unsubscribeAtlas?: () => void;\n private readonly specialMaterials = new Map<Material, Material>();\n private readonly geometries = new Set<BufferGeometry>();\n private readonly hasGlint: boolean;\n private glint?: ItemGlint;\n\n public blockParent: Maybe<BlockObject>;\n\n private meshesCreated: boolean = false;\n\n constructor(readonly originalModel: Model, options?: Partial<ModelObjectOptions>) {\n super(options);\n this.options = merge({}, ModelObject.DEFAULT_OPTIONS, options ?? {});\n const item = originalModel as ItemModel;\n const specialType = item.special?.type.replace(/^minecraft:/, \"\");\n this.hasGlint = !item.parts && (!item.special || specialType === \"shield\" || specialType === \"trident\") && ItemGlint.enabled(item.components, item.itemId);\n if (item.special || item.parts || this.hasGlint) this.options.instanceMeshes = false;\n if (this.options.tints) this.options.tints = { ...this.options.tints };\n this.addEventListener(\"added\", () => this.updateAnimationSubscription());\n this.addEventListener(\"removed\", () => this.updateAnimationSubscription());\n }\n\n async init(): Promise<void> {\n const parts = (this.originalModel as ItemModel).parts;\n if (parts) {\n try {\n for (const part of parts) {\n const object = new ModelObject(part, { ...this.options, instanceMeshes: false });\n this.add(object);\n await object.init();\n }\n let order = 0;\n this.iterateAllMeshes(mesh => {\n mesh.renderOrder = order++;\n // Keep composite children in one render pass so their declared order is retained.\n for (const material of Array.isArray(mesh.material) ? mesh.material : [mesh.material]) {\n material.transparent = true;\n }\n });\n } catch (error) {\n this.disposeAndRemoveAllChildren();\n throw error;\n }\n this.notifyDirty();\n return;\n }\n this.options.tints = await ItemTints.get(this.originalModel, this.options.tints);\n const special = (this.originalModel as ItemModel).special;\n if (special) {\n const parts = await SpecialItems.getParts(special, this.originalModel.key?.root, (this.originalModel as ItemModel).components);\n // A separate display node preserves zero scales without decomposing a singular matrix.\n // Use SceneObject so disposal reaches the parts.\n const display = new SceneObject();\n if (this.options.displayPosition) {\n const transform = DisplayTransforms.getTransform(this.originalModel.display, this.options.displayPosition);\n display.position.copy(transform.position);\n display.quaternion.copy(transform.quaternion);\n display.scale.copy(transform.scale);\n }\n this.add(display);\n const offset = new Matrix4().makeTranslation(-8, -8, -8);\n try {\n const targets: { mesh: Mesh; parent?: Mesh }[] = [];\n for (const part of parts) {\n const object = new EntityObject(part.model, { flip: false, wireframe: this.options.wireframe, tints: part.tints, faces: part.faces });\n object.matrix.multiplyMatrices(offset, part.transform).decompose(object.position, object.quaternion, object.scale);\n display.add(object);\n await object.init(part.material);\n object.iterateAllMeshes(mesh => {\n const source = mesh.material as MeshBasicMaterial;\n let material = this.specialMaterials.get(source);\n if (!material) {\n const front = this.options.displayPosition === DisplayPosition.GUI &&\n (this.originalModel as ItemModel).gui_light === GuiLight.FRONT;\n material = SpecialItems.createMaterial(source, !front);\n // Entity geometry already contains the inward faces used by vanilla's translucent draw.\n if (part.material) material.side = FrontSide;\n this.specialMaterials.set(source, material);\n }\n mesh.material = material;\n });\n for (const [name, rotation] of Object.entries(part.rotations)) {\n object.getGroupByName(name)?.rotation.set(...rotation, \"ZYX\");\n }\n for (const [name, position] of Object.entries(part.positions ?? {})) {\n object.getGroupByName(name)?.position.set(...position);\n }\n if (this.hasGlint) {\n if (special.type === \"shield\" || special.type === \"minecraft:shield\") {\n const mesh = object.getMeshByName(\"plate\", \"main\")!;\n const layers = Object.keys(part.model.layers!);\n if (part.model.layers!.pattern_base) targets.push({ mesh: object.getMeshByName(\"handle\", \"main\")! });\n // Follow the final plate draw so GUI and composite ordering keeps glint above the patterns.\n targets.push({ mesh, parent: object.getMeshByName(\"plate\", layers[layers.length - 1])! });\n } else {\n object.iterateAllMeshes(mesh => targets.push({ mesh }));\n }\n }\n }\n if (targets.length) {\n this.glint = await ItemGlint.create(this, undefined, this.originalModel.key?.root, targets);\n this.updateAnimationSubscription();\n }\n } catch (error) {\n this.disposeAndRemoveAllChildren();\n throw error;\n }\n this.notifyDirty();\n return;\n }\n try {\n // Load the atlas before creating geometry so every pass uses the mapped UVs.\n await this.loadTextures();\n this.createMeshes();\n this.applyTextures();\n if (this.hasGlint && this.atlasTexture) {\n this.glint = await ItemGlint.create(this, this.atlasTexture, this.originalModel.key?.root);\n this.updateAnimationSubscription();\n }\n } catch (error) {\n this.disposeAndRemoveAllChildren();\n throw error;\n }\n }\n\n public get textureAtlas(): Maybe<TextureAtlas> {\n return this.atlas;\n }\n\n public get isOpaqueFullCube(): boolean {\n return !this.options.displayPosition && ModelCulling.isOpaqueFullCube(this.atlas);\n }\n\n //TODO: support for replacing textures\n\n protected async loadTextures(): Promise<void> {\n this.atlas = await UVMapper.getAtlas(this.originalModel);\n }\n\n\n protected createMeshes(force: boolean = false) {\n if (this.meshesCreated && !force) return;\n\n const mat = Materials.MISSING_TEXTURE;\n const displayTransform = this.options.displayPosition\n ? DisplayTransforms.getMatrix(this.originalModel.display, this.options.displayPosition) : undefined;\n\n let allGeos: BufferGeometry[] = [];\n\n if (this.atlas) {\n if (this.atlas.model.elements) {\n this.atlas.model.elements?.forEach(el => {\n const elGeo = this._getBoxGeometryFromElement(el).clone();\n this.geometries.add(elGeo);\n if (this.options.cullMask) {\n const indices = Array.from(elGeo.getIndex()!.array);\n elGeo.setIndex(indices.filter((_, index) => {\n const face = CUBE_FACES[Math.floor(index / 6)];\n const direction = CUBE_FACES.findIndex(name => name === el.faces[face]?.cullface);\n return direction < 0 || !(this.options.cullMask! & (1 << direction));\n }));\n elGeo.clearGroups();\n }\n if (this.options.uvLockRotation) {\n UVMapper.lockUvs(elGeo, el.faces, this.atlas!, new Euler(...this.options.uvLockRotation));\n }\n UVMapper.setAtlasUvBounds(elGeo, el.faces, this.atlas!);\n if (this.options.tints) {\n const colors = new Float32Array(elGeo.getAttribute(\"position\").count * 3).fill(1);\n for (const [faceIndex, faceName] of CUBE_FACES.entries()) {\n const tintIndex = el.faces[faceName]?.tintindex;\n if (tintIndex === undefined || tintIndex < 0) continue;\n const tint = this.options.tints[tintIndex];\n if (tint === undefined) continue;\n const color = new Color(tint);\n for (let vertex = 0; vertex < 4; vertex++) {\n color.toArray(colors, (faceIndex * 4 + vertex) * 3);\n }\n }\n elGeo.setAttribute(\"color\", new BufferAttribute(colors, 3));\n }\n\n // elGeo.applyMatrix4(new THREE.Matrix4().makeTranslation(-8,-8,-8));\n\n\n elGeo.applyMatrix4(new Matrix4().makeTranslation((el.to[0] - el.from[0]) / 2, (el.to[1] - el.from[1]) / 2, (el.to[2] - el.from[2]) / 2));\n elGeo.applyMatrix4(new Matrix4().makeTranslation(el.from[0], el.from[1], el.from[2]));\n\n if (el.rotation) {\n applyElementRotation(el.rotation, elGeo);\n }\n if (this.hasGlint) ItemGlint.mapUvs(elGeo, el.faces, this.atlas!, (this.originalModel as ItemModel).itemId, this.options.displayPosition);\n\n elGeo.applyMatrix4(new Matrix4().makeTranslation(-8, -8, -8));\n if (displayTransform) DisplayTransforms.apply(elGeo, displayTransform);\n\n if (this.options.mergeMeshes) {\n allGeos.push(elGeo);\n } else {\n const mesh = this.createAndAddMesh(undefined, undefined, elGeo, mat);\n if (this.options.wireframe) {\n addWireframeToMesh(elGeo, mesh);\n }\n }\n });\n } else {\n console.debug(p, this.atlas.model, \"has no elements\")\n }\n } else {\n console.debug(p, \"Missing atlas for\", this);\n }\n\n if (this.options.mergeMeshes) {\n let combinedGeo: BufferGeometry;\n if (allGeos.length > 0) {\n // if (this.options.wireframe) {\n // allGeos.push(new BoxGeometry(16, 16, 16, 1, 1, 1))\n // }\n\n combinedGeo = mergeBufferGeometries(allGeos);\n for (const geometry of allGeos) {\n this.geometries.delete(geometry);\n }\n } else {\n combinedGeo = new BoxGeometry(16, 16, 16);\n if (displayTransform) DisplayTransforms.apply(combinedGeo, displayTransform);\n }\n this.geometries.add(combinedGeo);\n combinedGeo.computeBoundingBox();\n // combinedGeo.translate(-8, -8, -8);\n // TODO: cache the combined geometry\n let mesh: Mesh;\n if (this.options.instanceMeshes) {\n mesh = this.createInstancedMesh(undefined, combinedGeo, mat, this.options.maxInstanceCount || 50);\n this.add(mesh);\n this._isInstanced = true;\n //TODO\n } else {\n mesh = this.createAndAddMesh(undefined, undefined, combinedGeo, mat)\n }\n if (this.options.wireframe) {\n addWireframeToMesh(combinedGeo, mesh, 0x0000ff, 4);\n addBox3WireframeToObject(combinedGeo.boundingBox!, mesh, 0x00ffff, 3);\n }\n }\n\n if (this.options.wireframe) {\n addWireframeToObject(this, 0x00ff00, 3)\n }\n\n this.meshesCreated = true;\n }\n\n\n protected applyTextures() {\n if (this.atlas) {\n const mat = Materials.createShadedCanvasMaterial(this.atlas.image.canvas as HTMLCanvasElement, this.atlas.hasTranslucency, false, true);\n mat.side = this.atlas.hasTransparency ? DoubleSide : FrontSide;\n this.atlasMaterial = mat;\n this.atlasTexture = (mat as ShaderMaterial).uniforms?.map?.value ?? (mat as MeshBasicMaterial).map;\n if (this.options.displayPosition === DisplayPosition.GUI &&\n (this.originalModel as ItemModel).gui_light === GuiLight.FRONT && (mat as ShaderMaterial).uniforms?.SHADE) {\n (mat as ShaderMaterial).uniforms.SHADE.value = false;\n }\n this.iterateAllMeshes(mesh => {\n if (mesh.geometry.hasAttribute(\"color\")) mat.vertexColors = true;\n mesh.material = mat;\n });\n this.updateAnimationSubscription();\n }\n }\n\n private updateAnimationSubscription(): void {\n let root: ModelObject = this;\n while (root.parent && isModelObject(root.parent)) root = root.parent;\n const active = !!root.parent && (!this.isInstanced || this.instanceCounter > 0);\n this.glint?.updateSubscription(active);\n if (active && this.atlas?.hasAnimation && this.atlasTexture) {\n if (!this.unsubscribeAtlas) {\n this.atlasTexture.needsUpdate = true;\n this.unsubscribeAtlas = this.atlas.subscribe(() => {\n this.atlasTexture!.needsUpdate = true;\n this.traverseAncestors(parent => {\n if ((parent as MineRenderScene).isMineRenderScene) (parent as MineRenderScene).dirty = true;\n });\n this.notifyDirty();\n });\n }\n } else {\n this.unsubscribeAtlas?.();\n this.unsubscribeAtlas = undefined;\n }\n for (const child of this.children) {\n if (isModelObject(child)) child.updateAnimationSubscription();\n }\n }\n\n nextInstance() {\n const reference = super.nextInstance();\n this.updateAnimationSubscription();\n return reference;\n }\n\n removeInstanceAt(index: number): void {\n super.removeInstanceAt(index);\n this.updateAnimationSubscription();\n }\n\n public disposeAndRemoveAllChildren(): void {\n this.glint?.dispose();\n this.glint = undefined;\n this.unsubscribeAtlas?.();\n this.unsubscribeAtlas = undefined;\n this.atlasTexture?.dispose();\n this.atlasMaterial?.dispose();\n this.atlasTexture = undefined;\n this.atlasMaterial = undefined;\n for (const material of this.specialMaterials.values()) material.dispose();\n this.specialMaterials.clear();\n for (const geometry of this.geometries) geometry.dispose();\n this.geometries.clear();\n super.disposeAndRemoveAllChildren();\n }\n\n}\n\n/** Model settings passed to `scene.addModel(model, options)` or the ModelObject constructor. */\nexport interface ModelObjectOptions extends SceneObjectOptions {\n /** Minecraft display pose applied around the model center, before scene transforms. */\n displayPosition?: DisplayPosition;\n /** Quarter-turn block rotation in radians to compensate when locking UVs. */\n uvLockRotation?: TripleArray;\n /** sRGB 0xRRGGBB colors by face tint index, overriding automatic item or block preview colors. */\n tints?: Record<number, number>;\n /** Hidden neighbor directions in CUBE_FACES order, before the model's block rotation. */\n cullMask?: number;\n}\n\nexport function isModelObject(obj: any): obj is ModelObject {\n return (<ModelObject>obj).isModelObject;\n}\n"],"mappings":"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","names":["parts"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/model/scene/ModelObject.ts"],"sourcesContent":["import { SceneObject } from \"../../renderer/SceneObject\";\nimport { ItemModel, Model, TextureAsset, TripleArray } from \"../Model\";\nimport { Materials } from \"../../Materials\";\nimport { Maybe, toRadians } from \"../../util/util\";\nimport { UVMapper } from \"../../UVMapper\";\nimport { TextureAtlas } from \"../../texture/TextureAtlas\";\nimport { BoxGeometry, BoxHelper, BufferAttribute, Color, DoubleSide, EdgesGeometry, Euler, FrontSide, InstancedMesh, LineBasicMaterial, LineSegments, Material, Matrix4, Mesh, MeshBasicMaterial, MeshStandardMaterial, ShaderMaterial } from \"three\";\nimport { mergeBufferGeometries } from \"../../three/BufferGeometryUtils\";\nimport { SceneObjectOptions } from \"../../renderer/SceneObjectOptions\";\nimport { addBox3WireframeToObject, addWireframeToMesh, addWireframeToObject, applyElementRotation } from \"../../util/model\";\nimport { merge } from \"../../util/_internal/merge\";\nimport type { BufferGeometry, Texture } from \"three\";\nimport { BlockObject } from \"../block/scene/BlockObject\";\nimport { logger } from \"../../util/log\";\nimport { CUBE_FACES } from \"../../CubeFace\";\nimport { DisplayPosition } from \"../DisplayPosition\";\nimport { DisplayTransforms } from \"../DisplayTransforms\";\nimport { ModelCulling } from \"../ModelCulling\";\nimport type { MineRenderScene } from \"../../renderer/MineRenderScene\";\nimport { SpecialItems } from \"../SpecialItems\";\nimport { EntityObject } from \"../../entity/scene/EntityObject\";\nimport { GuiLight } from \"../GuiLight\";\nimport { ItemTints } from \"../ItemTints\";\nimport { ItemGlint } from \"../ItemGlint\";\n\n\nconst log = logger(\"ModelObject\");\n\n//TODO: might want to abstract this out into a generic model, and create a separate class for Block models\n/** Builds render geometry from a merged Java model. Create it through {@link MineRenderScene.addModel}. */\nexport class ModelObject extends SceneObject {\n\n public readonly isModelObject: true = true;\n\n public static readonly DEFAULT_OPTIONS: ModelObjectOptions = merge({}, SceneObject.DEFAULT_OPTIONS, <ModelObjectOptions>{});\n public readonly options: ModelObjectOptions;\n\n protected atlas?: TextureAtlas;\n private atlasMaterial?: Material;\n private atlasTexture?: Texture;\n private unsubscribeAtlas?: () => void;\n private readonly specialMaterials = new Map<Material, Material>();\n private readonly geometries = new Set<BufferGeometry>();\n private readonly hasGlint: boolean;\n private glint?: ItemGlint;\n\n public blockParent: Maybe<BlockObject>;\n\n private meshesCreated: boolean = false;\n\n constructor(readonly originalModel: Model, options?: Partial<ModelObjectOptions>) {\n super(options);\n this.options = merge({}, ModelObject.DEFAULT_OPTIONS, options ?? {});\n const item = originalModel as ItemModel;\n const specialType = item.special?.type.replace(/^minecraft:/, \"\");\n this.hasGlint = !item.parts && (!item.special || specialType === \"shield\" || specialType === \"trident\") && ItemGlint.enabled(item.components, item.itemId);\n if (item.special || item.parts || this.hasGlint) this.options.instanceMeshes = false;\n if (this.options.tints) this.options.tints = { ...this.options.tints };\n this.addEventListener(\"added\", () => this.updateAnimationSubscription());\n this.addEventListener(\"removed\", () => this.updateAnimationSubscription());\n }\n\n async init(): Promise<void> {\n const parts = (this.originalModel as ItemModel).parts;\n if (parts) {\n try {\n for (const part of parts) {\n const object = new ModelObject(part, { ...this.options, instanceMeshes: false });\n this.add(object);\n await object.init();\n }\n let order = 0;\n this.iterateAllMeshes(mesh => {\n mesh.renderOrder = order++;\n // Keep composite children in one render pass so their declared order is retained.\n for (const material of Array.isArray(mesh.material) ? mesh.material : [mesh.material]) {\n material.transparent = true;\n }\n });\n } catch (error) {\n this.disposeAndRemoveAllChildren();\n throw error;\n }\n this.notifyDirty();\n return;\n }\n this.options.tints = await ItemTints.get(this.originalModel, this.options.tints);\n const special = (this.originalModel as ItemModel).special;\n if (special) {\n const parts = await SpecialItems.getParts(special, this.originalModel.key?.root, (this.originalModel as ItemModel).components);\n // A separate display node preserves zero scales without decomposing a singular matrix.\n // Use SceneObject so disposal reaches the parts.\n const display = new SceneObject();\n if (this.options.displayPosition) {\n const transform = DisplayTransforms.getTransform(this.originalModel.display, this.options.displayPosition);\n display.position.copy(transform.position);\n display.quaternion.copy(transform.quaternion);\n display.scale.copy(transform.scale);\n }\n this.add(display);\n const offset = new Matrix4().makeTranslation(-8, -8, -8);\n try {\n const targets: { mesh: Mesh; parent?: Mesh }[] = [];\n for (const part of parts) {\n const object = new EntityObject(part.model, { flip: false, wireframe: this.options.wireframe, tints: part.tints, faces: part.faces });\n object.matrix.multiplyMatrices(offset, part.transform).decompose(object.position, object.quaternion, object.scale);\n display.add(object);\n await object.init(part.material);\n object.iterateAllMeshes(mesh => {\n const source = mesh.material as MeshBasicMaterial;\n let material = this.specialMaterials.get(source);\n if (!material) {\n const front = this.options.displayPosition === DisplayPosition.GUI &&\n (this.originalModel as ItemModel).gui_light === GuiLight.FRONT;\n material = SpecialItems.createMaterial(source, !front);\n // Entity geometry already contains the inward faces used by vanilla's translucent draw.\n if (part.material) material.side = FrontSide;\n this.specialMaterials.set(source, material);\n }\n mesh.material = material;\n });\n for (const [name, rotation] of Object.entries(part.rotations)) {\n object.getGroupByName(name)?.rotation.set(...rotation, \"ZYX\");\n }\n for (const [name, position] of Object.entries(part.positions ?? {})) {\n object.getGroupByName(name)?.position.set(...position);\n }\n if (this.hasGlint) {\n if (special.type === \"shield\" || special.type === \"minecraft:shield\") {\n const mesh = object.getMeshByName(\"plate\", \"main\")!;\n const layers = Object.keys(part.model.layers!);\n if (part.model.layers!.pattern_base) targets.push({ mesh: object.getMeshByName(\"handle\", \"main\")! });\n // Follow the final plate draw so GUI and composite ordering keeps glint above the patterns.\n targets.push({ mesh, parent: object.getMeshByName(\"plate\", layers[layers.length - 1])! });\n } else {\n object.iterateAllMeshes(mesh => targets.push({ mesh }));\n }\n }\n }\n if (targets.length) {\n this.glint = await ItemGlint.create(this, undefined, this.originalModel.key?.root, targets);\n this.updateAnimationSubscription();\n }\n } catch (error) {\n this.disposeAndRemoveAllChildren();\n throw error;\n }\n this.notifyDirty();\n return;\n }\n try {\n // Load the atlas before creating geometry so every pass uses the mapped UVs.\n await this.loadTextures();\n this.createMeshes();\n this.applyTextures();\n if (this.hasGlint && this.atlasTexture) {\n this.glint = await ItemGlint.create(this, this.atlasTexture, this.originalModel.key?.root);\n this.updateAnimationSubscription();\n }\n } catch (error) {\n this.disposeAndRemoveAllChildren();\n throw error;\n }\n }\n\n public get textureAtlas(): Maybe<TextureAtlas> {\n return this.atlas;\n }\n\n public get isOpaqueFullCube(): boolean {\n return !this.options.displayPosition && ModelCulling.isOpaqueFullCube(this.atlas);\n }\n\n //TODO: support for replacing textures\n\n protected async loadTextures(): Promise<void> {\n this.atlas = await UVMapper.getAtlas(this.originalModel);\n }\n\n\n protected createMeshes(force: boolean = false) {\n if (this.meshesCreated && !force) return;\n\n const mat = Materials.MISSING_TEXTURE;\n const displayTransform = this.options.displayPosition\n ? DisplayTransforms.getMatrix(this.originalModel.display, this.options.displayPosition) : undefined;\n\n let allGeos: BufferGeometry[] = [];\n\n if (this.atlas) {\n if (this.atlas.model.elements) {\n this.atlas.model.elements?.forEach(el => {\n const elGeo = this._getBoxGeometryFromElement(el).clone();\n this.geometries.add(elGeo);\n elGeo.setAttribute(\"shade\", new BufferAttribute(\n new Float32Array(elGeo.getAttribute(\"position\").count).fill(!(this.originalModel as ItemModel).itemId && el.shade === false ? 0 : 1), 1));\n if (this.options.cullMask) {\n const indices = Array.from(elGeo.getIndex()!.array);\n elGeo.setIndex(indices.filter((_, index) => {\n const face = CUBE_FACES[Math.floor(index / 6)];\n const direction = CUBE_FACES.findIndex(name => name === el.faces[face]?.cullface);\n return direction < 0 || !(this.options.cullMask! & (1 << direction));\n }));\n elGeo.clearGroups();\n }\n if (this.options.uvLockRotation) {\n UVMapper.lockUvs(elGeo, el.faces, this.atlas!, new Euler(...this.options.uvLockRotation));\n }\n UVMapper.setAtlasUvBounds(elGeo, el.faces, this.atlas!);\n if (this.options.tints) {\n const colors = new Float32Array(elGeo.getAttribute(\"position\").count * 3).fill(1);\n for (const [faceIndex, faceName] of CUBE_FACES.entries()) {\n const tintIndex = el.faces[faceName]?.tintindex;\n if (tintIndex === undefined || tintIndex < 0) continue;\n const tint = this.options.tints[tintIndex];\n if (tint === undefined) continue;\n const color = new Color(tint);\n for (let vertex = 0; vertex < 4; vertex++) {\n color.toArray(colors, (faceIndex * 4 + vertex) * 3);\n }\n }\n elGeo.setAttribute(\"color\", new BufferAttribute(colors, 3));\n }\n\n // elGeo.applyMatrix4(new THREE.Matrix4().makeTranslation(-8,-8,-8));\n\n\n elGeo.applyMatrix4(new Matrix4().makeTranslation((el.to[0] - el.from[0]) / 2, (el.to[1] - el.from[1]) / 2, (el.to[2] - el.from[2]) / 2));\n elGeo.applyMatrix4(new Matrix4().makeTranslation(el.from[0], el.from[1], el.from[2]));\n\n if (el.rotation) {\n applyElementRotation(el.rotation, elGeo);\n }\n if (this.hasGlint) ItemGlint.mapUvs(elGeo, el.faces, this.atlas!, (this.originalModel as ItemModel).itemId, this.options.displayPosition);\n\n elGeo.applyMatrix4(new Matrix4().makeTranslation(-8, -8, -8));\n if (displayTransform) DisplayTransforms.apply(elGeo, displayTransform);\n\n if (this.options.mergeMeshes) {\n allGeos.push(elGeo);\n } else {\n const mesh = this.createAndAddMesh(undefined, undefined, elGeo, mat);\n if (this.options.wireframe) {\n addWireframeToMesh(elGeo, mesh);\n }\n }\n });\n } else {\n log.debug(this.atlas.model, \"has no elements\")\n }\n } else {\n log.debug(\"Missing atlas for\", this);\n }\n\n if (this.options.mergeMeshes) {\n let combinedGeo: BufferGeometry;\n if (allGeos.length > 0) {\n // if (this.options.wireframe) {\n // allGeos.push(new BoxGeometry(16, 16, 16, 1, 1, 1))\n // }\n\n combinedGeo = mergeBufferGeometries(allGeos);\n for (const geometry of allGeos) {\n this.geometries.delete(geometry);\n }\n } else {\n combinedGeo = new BoxGeometry(16, 16, 16);\n if (displayTransform) DisplayTransforms.apply(combinedGeo, displayTransform);\n }\n this.geometries.add(combinedGeo);\n combinedGeo.computeBoundingBox();\n // combinedGeo.translate(-8, -8, -8);\n // TODO: cache the combined geometry\n let mesh: Mesh;\n if (this.options.instanceMeshes) {\n mesh = this.createInstancedMesh(undefined, combinedGeo, mat, this.options.maxInstanceCount || 50);\n this.add(mesh);\n this._isInstanced = true;\n //TODO\n } else {\n mesh = this.createAndAddMesh(undefined, undefined, combinedGeo, mat)\n }\n if (this.options.wireframe) {\n addWireframeToMesh(combinedGeo, mesh, 0x0000ff, 4);\n addBox3WireframeToObject(combinedGeo.boundingBox!, mesh, 0x00ffff, 3);\n }\n }\n\n if (this.options.wireframe) {\n addWireframeToObject(this, 0x00ff00, 3)\n }\n\n this.meshesCreated = true;\n }\n\n\n protected applyTextures() {\n if (this.atlas) {\n const mat = Materials.createShadedCanvasMaterial(this.atlas.image.canvas as HTMLCanvasElement, this.atlas.hasTranslucency, false, true);\n mat.side = this.atlas.hasTransparency ? DoubleSide : FrontSide;\n this.atlasMaterial = mat;\n this.atlasTexture = (mat as ShaderMaterial).uniforms?.map?.value ?? (mat as MeshBasicMaterial).map;\n if (this.options.displayPosition === DisplayPosition.GUI &&\n (this.originalModel as ItemModel).gui_light === GuiLight.FRONT && (mat as ShaderMaterial).uniforms?.SHADE) {\n (mat as ShaderMaterial).uniforms.SHADE.value = false;\n }\n this.iterateAllMeshes(mesh => {\n if (mesh.geometry.hasAttribute(\"color\")) mat.vertexColors = true;\n mesh.material = mat;\n });\n this.updateAnimationSubscription();\n }\n }\n\n private updateAnimationSubscription(): void {\n let root: ModelObject = this;\n while (root.parent && isModelObject(root.parent)) root = root.parent;\n const active = !!root.parent && (!this.isInstanced || this.instanceCounter > 0);\n this.glint?.updateSubscription(active);\n if (active && this.atlas?.hasAnimation && this.atlasTexture) {\n if (!this.unsubscribeAtlas) {\n this.atlasTexture.needsUpdate = true;\n this.unsubscribeAtlas = this.atlas.subscribe(() => {\n this.atlasTexture!.needsUpdate = true;\n this.traverseAncestors(parent => {\n if ((parent as MineRenderScene).isMineRenderScene) (parent as MineRenderScene).dirty = true;\n });\n this.notifyDirty();\n });\n }\n } else {\n this.unsubscribeAtlas?.();\n this.unsubscribeAtlas = undefined;\n }\n for (const child of this.children) {\n if (isModelObject(child)) child.updateAnimationSubscription();\n }\n }\n\n nextInstance() {\n const reference = super.nextInstance();\n this.updateAnimationSubscription();\n return reference;\n }\n\n removeInstanceAt(index: number): void {\n super.removeInstanceAt(index);\n this.updateAnimationSubscription();\n }\n\n public disposeAndRemoveAllChildren(): void {\n this.glint?.dispose();\n this.glint = undefined;\n this.unsubscribeAtlas?.();\n this.unsubscribeAtlas = undefined;\n this.atlasTexture?.dispose();\n this.atlasMaterial?.dispose();\n this.atlasTexture = undefined;\n this.atlasMaterial = undefined;\n for (const material of this.specialMaterials.values()) material.dispose();\n this.specialMaterials.clear();\n for (const geometry of this.geometries) geometry.dispose();\n this.geometries.clear();\n super.disposeAndRemoveAllChildren();\n }\n\n}\n\n/** Model settings passed to `scene.addModel(model, options)` or the ModelObject constructor. */\nexport interface ModelObjectOptions extends SceneObjectOptions {\n /** Minecraft display pose applied around the model center, before scene transforms. */\n displayPosition?: DisplayPosition;\n /** Quarter-turn block rotation in radians to compensate when locking UVs. */\n uvLockRotation?: TripleArray;\n /** sRGB 0xRRGGBB colors by face tint index, overriding automatic item or block preview colors. */\n tints?: Record<number, number>;\n /** Hidden neighbor directions in CUBE_FACES order, before the model's block rotation. */\n cullMask?: number;\n}\n\nexport function isModelObject(obj: any): obj is ModelObject {\n return (<ModelObject>obj).isModelObject;\n}\n"],"mappings":"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","names":["parts"]}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
// src/nbt/NBTHelper.ts
|
|
2
|
+
function commonJsExports(module) {
|
|
3
|
+
return module.default ?? module;
|
|
4
|
+
}
|
|
2
5
|
var NBTHelper = class {
|
|
3
6
|
/** Parses NBT bytes and preserves format and compression metadata. Omit `format` for automatic detection. */
|
|
4
7
|
static async fromBuffer(data, format) {
|
|
5
|
-
const { Buffer } = await import("buffer");
|
|
8
|
+
const { Buffer } = commonJsExports(await import("buffer"));
|
|
6
9
|
const buffer = Buffer.from(data instanceof Uint8Array ? data : new Uint8Array(data));
|
|
7
|
-
const prismarineNbt = await import("prismarine-nbt");
|
|
10
|
+
const prismarineNbt = commonJsExports(await import("prismarine-nbt"));
|
|
8
11
|
const { parsed, type, metadata } = await prismarineNbt.parse(buffer, format);
|
|
9
12
|
return Object.assign(parsed, {
|
|
10
13
|
format: type,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/nbt/NBTHelper.ts"],"sourcesContent":["import type { Metadata, NBT, NBTFormat } from \"prismarine-nbt\";\nimport { MinecraftAsset } from \"../MinecraftAsset\";\n\n/** Decodes Named Binary Tag (NBT) data for structure and world parsers. */\nexport class NBTHelper {\n\n /** Parses NBT bytes and preserves format and compression metadata. Omit `format` for automatic detection. */\n public static async fromBuffer(data: Uint8Array | ArrayBuffer, format?: NBTFormat): Promise<NBTAsset> {\n const { Buffer } = await import(\"buffer\");\n const buffer = Buffer.from(data instanceof Uint8Array ? data : new Uint8Array(data));\n const prismarineNbt = await import(\"prismarine-nbt\");\n const { parsed, type, metadata } = await prismarineNbt.parse(buffer, format);\n return Object.assign(parsed, {\n format: type,\n metadata,\n compression: buffer[0] === 0x1f && buffer[1] === 0x8b ? \"gzip\" as const : \"none\" as const\n });\n }\n\n}\n\n/** Decoded NBT with the source format and parser metadata attached. */\nexport interface NBTAsset extends MinecraftAsset, NBT {\n format?: NBTFormat;\n metadata?: Metadata;\n compression?: \"gzip\" | \"none\";\n}\n"],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../../../../src/nbt/NBTHelper.ts"],"sourcesContent":["import type { Metadata, NBT, NBTFormat } from \"prismarine-nbt\";\nimport { MinecraftAsset } from \"../MinecraftAsset\";\n\n// Code-split bundles, such as Vite's dev pre-bundling, expose a CommonJS module's exports only as `default`.\nfunction commonJsExports<T extends object>(module: T): T {\n return (module as { default?: T }).default ?? module;\n}\n\n/** Decodes Named Binary Tag (NBT) data for structure and world parsers. */\nexport class NBTHelper {\n\n /** Parses NBT bytes and preserves format and compression metadata. Omit `format` for automatic detection. */\n public static async fromBuffer(data: Uint8Array | ArrayBuffer, format?: NBTFormat): Promise<NBTAsset> {\n const { Buffer } = commonJsExports(await import(\"buffer\"));\n const buffer = Buffer.from(data instanceof Uint8Array ? data : new Uint8Array(data));\n const prismarineNbt = commonJsExports(await import(\"prismarine-nbt\"));\n const { parsed, type, metadata } = await prismarineNbt.parse(buffer, format);\n return Object.assign(parsed, {\n format: type,\n metadata,\n compression: buffer[0] === 0x1f && buffer[1] === 0x8b ? \"gzip\" as const : \"none\" as const\n });\n }\n\n}\n\n/** Decoded NBT with the source format and parser metadata attached. */\nexport interface NBTAsset extends MinecraftAsset, NBT {\n format?: NBTFormat;\n metadata?: Metadata;\n compression?: \"gzip\" | \"none\";\n}\n"],"mappings":";AAIA,SAAS,gBAAkC,QAAc;AACrD,SAAQ,OAA2B,WAAW;AAClD;AAGO,IAAM,YAAN,MAAgB;AAAA;AAAA,EAGnB,aAAoB,WAAW,MAAgC,QAAuC;AAClG,UAAM,EAAE,OAAO,IAAI,gBAAgB,MAAM,OAAO,QAAQ,CAAC;AACzD,UAAM,SAAS,OAAO,KAAK,gBAAgB,aAAa,OAAO,IAAI,WAAW,IAAI,CAAC;AACnF,UAAM,gBAAgB,gBAAgB,MAAM,OAAO,gBAAgB,CAAC;AACpE,UAAM,EAAE,QAAQ,MAAM,SAAS,IAAI,MAAM,cAAc,MAAM,QAAQ,MAAM;AAC3E,WAAO,OAAO,OAAO,QAAQ;AAAA,MACzB,QAAQ;AAAA,MACR;AAAA,MACA,aAAa,OAAO,CAAC,MAAM,MAAQ,OAAO,CAAC,MAAM,MAAO,SAAkB;AAAA,IAC9E,CAAC;AAAA,EACL;AAEJ;","names":[]}
|
|
@@ -12,6 +12,8 @@ import { FlyControls, isFlyControls } from "./FlyControls.mjs";
|
|
|
12
12
|
import { SceneExporter } from "../export/SceneExporter.mjs";
|
|
13
13
|
import { trimCanvas } from "../canvas/trimCanvas.mjs";
|
|
14
14
|
import { VideoExporter } from "../export/VideoExporter.mjs";
|
|
15
|
+
import { logger } from "../util/log.mjs";
|
|
16
|
+
var log = logger("Renderer");
|
|
15
17
|
var _Renderer = class _Renderer {
|
|
16
18
|
constructor(options, surface) {
|
|
17
19
|
this._width = 0;
|
|
@@ -256,10 +258,10 @@ var _Renderer = class _Renderer {
|
|
|
256
258
|
this._element = element;
|
|
257
259
|
this._element.appendChild(this.renderer.domElement);
|
|
258
260
|
if (this.viewWidth == 0) {
|
|
259
|
-
|
|
261
|
+
log.warn("0 element width");
|
|
260
262
|
}
|
|
261
263
|
if (this.viewHeight == 0) {
|
|
262
|
-
|
|
264
|
+
log.warn("0 element height");
|
|
263
265
|
}
|
|
264
266
|
this.resize(this.viewWidth, this.viewHeight);
|
|
265
267
|
}
|
|
@@ -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":"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","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) {
|