minerender 2.1.0-beta.6 → 2.1.0-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/browser/esm/Materials.mjs +3 -1
  2. package/dist/browser/esm/Materials.mjs.map +1 -1
  3. package/dist/browser/esm/Ticker.mjs +3 -1
  4. package/dist/browser/esm/Ticker.mjs.map +1 -1
  5. package/dist/browser/esm/UVMapper.mjs +9 -9
  6. package/dist/browser/esm/UVMapper.mjs.map +1 -1
  7. package/dist/browser/esm/assets/AssetDefaults.mjs +8 -0
  8. package/dist/browser/esm/assets/AssetDefaults.mjs.map +1 -0
  9. package/dist/browser/esm/assets/AssetKey.mjs +1 -1
  10. package/dist/browser/esm/assets/AssetKey.mjs.map +1 -1
  11. package/dist/browser/esm/assets/AssetLoader.mjs +5 -5
  12. package/dist/browser/esm/assets/AssetLoader.mjs.map +1 -1
  13. package/dist/browser/esm/assets/Assets.mjs +1 -5
  14. package/dist/browser/esm/assets/Assets.mjs.map +1 -1
  15. package/dist/browser/esm/assets/BlockEntities.mjs +3 -1
  16. package/dist/browser/esm/assets/BlockEntities.mjs.map +1 -1
  17. package/dist/browser/esm/assets/BlockStates.mjs +1 -1
  18. package/dist/browser/esm/assets/BlockStates.mjs.map +1 -1
  19. package/dist/browser/esm/assets/Entities.mjs +1 -1
  20. package/dist/browser/esm/assets/Entities.mjs.map +1 -1
  21. package/dist/browser/esm/assets/Models.mjs +1 -1
  22. package/dist/browser/esm/assets/Models.mjs.map +1 -1
  23. package/dist/browser/esm/assets/_fonts/Unihex.mjs +5 -3
  24. package/dist/browser/esm/assets/_fonts/Unihex.mjs.map +1 -1
  25. package/dist/browser/esm/assets/index.mjs +1 -0
  26. package/dist/browser/esm/assets/index.mjs.map +1 -1
  27. package/dist/browser/esm/assets/source/HostedAssetSource.mjs +7 -8
  28. package/dist/browser/esm/assets/source/HostedAssetSource.mjs.map +1 -1
  29. package/dist/browser/esm/env/browser/BrowserCache.mjs +3 -3
  30. package/dist/browser/esm/env/browser/BrowserCache.mjs.map +1 -1
  31. package/dist/browser/esm/image/ImageLoader.mjs +3 -3
  32. package/dist/browser/esm/image/ImageLoader.mjs.map +1 -1
  33. package/dist/browser/esm/index.browser.d.mts +64 -11
  34. package/dist/browser/esm/inspector/SceneInspector.mjs +3 -3
  35. package/dist/browser/esm/inspector/SceneInspector.mjs.map +1 -1
  36. package/dist/browser/esm/instance/InstanceManager.mjs +4 -4
  37. package/dist/browser/esm/instance/InstanceManager.mjs.map +1 -1
  38. package/dist/browser/esm/model/block/scene/BlockObject.mjs +3 -1
  39. package/dist/browser/esm/model/block/scene/BlockObject.mjs.map +1 -1
  40. package/dist/browser/esm/model/multiblock/StructureParser.mjs +7 -4
  41. package/dist/browser/esm/model/multiblock/StructureParser.mjs.map +1 -1
  42. package/dist/browser/esm/model/scene/ModelObject.mjs +4 -4
  43. package/dist/browser/esm/model/scene/ModelObject.mjs.map +1 -1
  44. package/dist/browser/esm/nbt/NBTHelper.mjs +5 -2
  45. package/dist/browser/esm/nbt/NBTHelper.mjs.map +1 -1
  46. package/dist/browser/esm/renderer/Renderer.mjs +4 -2
  47. package/dist/browser/esm/renderer/Renderer.mjs.map +1 -1
  48. package/dist/browser/esm/renderer/SceneObject.mjs +0 -6
  49. package/dist/browser/esm/renderer/SceneObject.mjs.map +1 -1
  50. package/dist/browser/esm/request/Requests.mjs +3 -3
  51. package/dist/browser/esm/request/Requests.mjs.map +1 -1
  52. package/dist/browser/esm/skin/Skins.mjs +6 -4
  53. package/dist/browser/esm/skin/Skins.mjs.map +1 -1
  54. package/dist/browser/esm/texture/TextureLoader.mjs +4 -2
  55. package/dist/browser/esm/texture/TextureLoader.mjs.map +1 -1
  56. package/dist/browser/esm/util/log.mjs +75 -0
  57. package/dist/browser/esm/util/log.mjs.map +1 -1
  58. package/dist/browser/esm/util/performance.mjs.map +1 -1
  59. package/dist/browser/esm/world/Chunk.mjs +8 -5
  60. package/dist/browser/esm/world/Chunk.mjs.map +1 -1
  61. package/dist/browser/esm/world/MineRenderWorld.mjs +96 -54
  62. package/dist/browser/esm/world/MineRenderWorld.mjs.map +1 -1
  63. package/dist/browser/esm/world/WorldStreamer.mjs +21 -20
  64. package/dist/browser/esm/world/WorldStreamer.mjs.map +1 -1
  65. package/dist/browser/esm/world/_culling/BlockCulling.mjs +1 -1
  66. package/dist/browser/esm/world/_culling/BlockCulling.mjs.map +1 -1
  67. package/dist/browser/esm/world/_entities/WorldEntities.mjs +3 -1
  68. package/dist/browser/esm/world/_entities/WorldEntities.mjs.map +1 -1
  69. package/dist/browser/index.d.ts +64 -11
  70. package/dist/browser/index.js +3071 -2956
  71. package/dist/browser/index.js.map +1 -1
  72. package/dist/bundle.js +6095 -5975
  73. package/dist/bundle.js.map +1 -1
  74. package/dist/node/index.d.mts +64 -11
  75. package/dist/node/index.d.ts +64 -11
  76. package/dist/node/index.js +3095 -2978
  77. package/dist/node/index.js.map +1 -1
  78. package/dist/node/index.mjs +3087 -2971
  79. package/dist/node/index.mjs.map +1 -1
  80. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/model/block/scene/BlockObject.ts"],"sourcesContent":["import { SceneObject } from \"../../../renderer/SceneObject\";\nimport { BlockState, BlockStateVariant } from \"../BlockState\";\nimport { SceneObjectOptions } from \"../../../renderer/SceneObjectOptions\";\nimport { isModelObject, ModelObject, ModelObjectOptions } from \"../../scene/ModelObject\";\nimport { Caching } from \"../../../cache/Caching\";\nimport { Models } from \"../../../assets/Models\";\nimport { merge } from \"../../../util/_internal/merge\";\nimport { Euler, Matrix4, Quaternion, Vector3 } from \"three\";\nimport { Maybe } from \"../../../util/util\";\nimport { MineRenderError } from \"../../../error/MineRenderError\";\nimport { BlockStateProperties, BlockStatePropertyDefaults } from \"../BlockStateProperties\";\nimport { InstanceReference, isInstanceReference } from \"../../../instance/InstanceReference\";\nimport { AssetKey, BasicAssetKey } from \"../../../assets/AssetKey\";\nimport { BlockTints } from \"../BlockTints\";\nimport { ModelCulling } from \"../../ModelCulling\";\nimport { BlockStateResolver } from \"../BlockStateResolver\";\nimport { FluidKind, FluidRules, FluidSampler, resolveBlockFluidState } from \"../../fluid/FluidGeometry\";\nimport { MineRenderData } from \"../../../assets/MineRenderData\";\nimport { BlockEntities, ResolvedBlockEntity } from \"../../../assets/BlockEntities\";\nimport { Entities } from \"../../../assets/Entities\";\nimport type { EntityObject } from \"../../../entity/scene/EntityObject\";\nimport { Biomes } from \"../../../assets/Biomes\";\nimport type { TripleArray } from \"../../Model\";\n\n/** Controls the model parts selected by a blockstate. Create it through {@link MineRenderScene.addBlock}. */\nexport class BlockObject extends SceneObject {\n\n public readonly isBlockObject: true = true;\n\n public static readonly DEFAULT_OPTIONS: BlockObjectOptions = merge({}, ModelObject.DEFAULT_OPTIONS, <BlockObjectOptions>{\n applyDefaultState: true\n });\n public readonly options: BlockObjectOptions;\n private readonly variantPosition?: TripleArray;\n\n private _previousState: BlockStateProperties = {};\n private _state: BlockStateProperties = {};\n private _variant: Maybe<BlockStateVariant> = undefined;\n\n private _instanceState: BlockStateProperties[] = [];\n private _instanceVariant: BlockStateVariant[][] = [];\n private _instanceModel: (ModelObject | InstanceReference<ModelObject>)[] = [];\n\n private _variants: BlockStateVariant[] = [];\n private _models: (ModelObject | InstanceReference<ModelObject>)[] = [];\n private _cullMask = 0;\n private _fluidKey?: string;\n private _fluidRules: FluidRules = {};\n private _fluidSampler?: FluidSampler;\n private readonly biomePosition?: TripleArray;\n private waterTint?: number;\n private _fluidModel?: ModelObject | InstanceReference<ModelObject>;\n private _entities: EntityObject[] = [];\n private _entityPlacement = new Matrix4();\n private _entityGeneration = 0;\n\n constructor(readonly blockState: BlockState, options?: Partial<BlockObjectOptions>) {\n super(options);\n this.options = merge({}, BlockObject.DEFAULT_OPTIONS, options ?? {});\n this.variantPosition = options?.variantPosition ? [...options.variantPosition] : undefined;\n this.biomePosition = options?.biomePosition ? [...options.biomePosition] : undefined;\n //TODO\n }\n\n async init(): Promise<void> {\n this._fluidRules = await MineRenderData.get(\"fluids\", this.blockState.key?.root);\n if (this.options.applyDefaultState) {\n this._setState(await BlockStateResolver.defaults(this.blockState));\n }\n if (this.options.initialState !== undefined) this._setState(this.options.initialState);\n await this.recreateModels();\n //TODO\n }\n\n dispose() {\n this.clearModels();\n super.dispose();\n }\n\n removeFromScene() {\n this.clearModels();\n super.removeFromScene();\n }\n\n private clearModels() {\n this.removeModels(this._models.splice(0));\n this._entityGeneration++;\n this.removeEntities(this._entities.splice(0));\n this._fluidKey = undefined;\n this._fluidModel = undefined;\n this._isInstanced = false;\n this._instanceCounter = 0;\n }\n\n private removeModels(models: (ModelObject | InstanceReference<ModelObject>)[]) {\n for (const model of models) {\n model.removeFromScene();\n if (!isInstanceReference(model)) model.dispose();\n }\n }\n\n private removeEntities(entities: EntityObject[]) {\n for (const entity of entities) {\n entity.removeFromScene();\n entity.dispose();\n }\n }\n\n /** Entity models drawn for this block instead of its block model; they are scene children, unlike the block. */\n public get blockEntities(): readonly EntityObject[] {\n return this._entities;\n }\n\n /** Model placements drawn for this block, including its fluid surface. */\n public get models(): readonly (ModelObject | InstanceReference<ModelObject>)[] {\n return this._models;\n }\n\n /** Sets visibility for this block's model instances and block entities. */\n public setVisible(visible: boolean): void {\n this.visible = visible;\n for (const model of this._models) {\n if (isInstanceReference(model)) {\n model.setVisible(visible);\n } else {\n model.visible = visible;\n }\n }\n for (const entity of this._entities) {\n entity.visible = visible;\n }\n this.notifyDirty();\n }\n\n /**\n * Draws the block through the dataset's block-entity index. Returns false, leaving nothing behind,\n * when the block is not listed or one of its models cannot be loaded.\n */\n private async createBlockEntities(): Promise<boolean> {\n const key = this.blockState.key;\n if (!key || this.options.displayPosition) return false;\n const generation = this._entityGeneration;\n const created: EntityObject[] = [];\n let resolved: Maybe<ResolvedBlockEntity>;\n try {\n resolved = BlockEntities.resolve(await BlockEntities.getIndex(key.root), key.toNamespacedString(), this.state);\n if (!resolved) return false;\n for (const part of resolved.parts) {\n const [namespace, path] = part.model.includes(\":\") ? part.model.split(\":\") : [key.namespace, part.model];\n const texture = part.textureLocation === undefined ? undefined\n : AssetKey.parse(\"textures\", part.textureLocation.replace(/^([^:]+:)?textures\\//, \"$1\"));\n if (texture) texture.root = key.root;\n const entity = await Entities.getEntity(new BasicAssetKey(namespace, path), texture, { layer: part.layer });\n if (!entity) throw new MineRenderError(`Missing entity model ${part.model}`);\n created.push(await this.scene.addEntity(entity, { wireframe: this.options.wireframe }) as EntityObject);\n }\n } catch (error) {\n console.warn(`Could not draw block entity ${key.toNamespacedString()}, using its block model`, error);\n this.removeEntities(created);\n return false;\n }\n // The block was cleared while the models loaded.\n if (generation !== this._entityGeneration) {\n this.removeEntities(created);\n return true;\n }\n BlockEntities.matrix(resolved, this._entityPlacement);\n this._entities = created;\n this.placeEntities();\n this.setVisible(this.visible);\n return true;\n }\n\n private placeEntities() {\n // Block models are centred on the block position; entity transforms use the block's 0..16 space.\n const matrix = new Matrix4().makeTranslation(this.position.x - 8, this.position.y - 8, this.position.z - 8).multiply(this._entityPlacement);\n for (const entity of this._entities) {\n matrix.decompose(entity.position, entity.quaternion, entity.scale);\n }\n }\n\n public get isOccluding(): boolean {\n if (!this.visible) {\n return false;\n }\n return this._models.some(model => {\n const object = isInstanceReference(model) ? model.instanceable : model;\n return object.isOpaqueFullCube && this.getModelCullMask(model, 63) === 63;\n });\n }\n\n private getModelMatrix(model: ModelObject | InstanceReference<ModelObject>): Matrix4 {\n if (isInstanceReference(model)) return model.getMatrix();\n if (model.matrixAutoUpdate) model.updateMatrix();\n return model.matrix.clone();\n }\n\n private getModelCullMask(model: ModelObject | InstanceReference<ModelObject>, worldMask: number): number {\n const object = isInstanceReference(model) ? model.instanceable : model;\n if (object.options.displayPosition) return 0;\n const position = new Vector3();\n const rotation = new Quaternion();\n const scale = new Vector3();\n this.getModelMatrix(model).decompose(position, rotation, scale);\n if (position.distanceToSquared(this.position) > 1e-10\n || scale.distanceToSquared(new Vector3(1, 1, 1)) > 1e-10) return 0;\n return ModelCulling.toLocalMask(worldMask, new Euler().setFromQuaternion(rotation));\n }\n\n /** World-space face mask currently applied to this block. */\n public get cullMask(): number {\n return this._cullMask;\n }\n\n public async setCullMask(worldMask: number): Promise<void> {\n worldMask &= 63;\n const replacements: (ModelObject | InstanceReference<ModelObject>)[] = [];\n try {\n for (const model of this._models) {\n if (model === this._fluidModel) {\n replacements.push(model);\n continue;\n }\n const object = isInstanceReference(model) ? model.instanceable : model;\n const cullMask = this.getModelCullMask(model, worldMask);\n if (cullMask === (object.options.cullMask ?? 0)) {\n replacements.push(model);\n continue;\n }\n const matrix = this.getModelMatrix(model);\n const replacement = await this.scene.addModel(object.originalModel, { ...object.options, cullMask });\n replacements.push(replacement);\n if (isInstanceReference(replacement)) {\n replacement.setMatrix(matrix);\n } else {\n replacement.matrix.copy(matrix);\n replacement.matrixWorldNeedsUpdate = true;\n matrix.decompose(replacement.position, replacement.quaternion, replacement.scale);\n replacement.matrixAutoUpdate = object.matrixAutoUpdate;\n replacement.visible = object.visible;\n }\n }\n } catch (error) {\n this.removeModels(replacements.filter(model => !this._models.includes(model)));\n throw error;\n }\n const previous = this._models;\n this._models = replacements;\n this._cullMask = worldMask;\n this.removeModels(previous.filter(model => !replacements.includes(model)));\n if (!this.visible) {\n this.setVisible(false);\n }\n this.notifyDirty();\n }\n\n /** Selected property values. Use {@link setState} to change properties and rebuild the rendered models. */\n public get state(): { [key: string]: string; } {\n return this._state;\n }\n\n public get fluidKind(): FluidKind | undefined {\n return resolveBlockFluidState(this.blockState.key, this.state, this._fluidRules)?.kind;\n }\n\n public get fluidLevel(): number {\n return resolveBlockFluidState(this.blockState.key, this.state, this._fluidRules)?.level ?? 0;\n }\n\n /** Refreshes fluid surfaces from relative neighbors; standalone previews use air around the block. */\n public async updateFluid(sample?: FluidSampler): Promise<void> {\n const kind = this.fluidKind;\n if (!kind) return;\n const { FluidModelObject, sampleFluid } = await import(\"../../fluid/FluidModelObject\");\n this._fluidSampler = sample;\n const surface = sampleFluid(kind, (x, y, z) => x === 0 && y === 0 && z === 0\n ? { fluid: kind, level: this.fluidLevel } : sample?.(x, y, z) ?? {});\n const tint = this.options.tints?.[0] ?? this.waterTint;\n const fluidKey = `${surface.key}|${tint ?? \"default\"}`;\n if (this._fluidKey === fluidKey) return;\n const key = new AssetKey(\"minecraft\", `${kind}/${surface.key}`, \"models\", \"fluid\", \"assets\", \".json\", this.blockState.key?.root);\n const replacement = await this.scene.addSceneObject({ key },\n () => new FluidModelObject(kind, surface.sample, this.blockState.key, {\n ...this.options, tints: tint === undefined ? this.options.tints : { ...this.options.tints, 0: tint }\n }));\n const previous = this._fluidModel;\n const matrix = previous ? this.getModelMatrix(previous) : new Matrix4().makeTranslation(...this.position.toArray());\n if (isInstanceReference(replacement)) replacement.setMatrix(matrix);\n else matrix.decompose(replacement.position, replacement.quaternion, replacement.scale);\n this._models = this._models.filter(model => model !== previous);\n this._models.push(replacement);\n this._fluidModel = replacement;\n this._fluidKey = fluidKey;\n this._isInstanced ||= isInstanceReference(replacement);\n this._instanceCounter = this._isInstanced ? 1 : 0;\n if (previous) this.removeModels([previous]);\n if (!this.visible) {\n this.setVisible(false);\n }\n this.notifyDirty();\n }\n\n nextInstance(): InstanceReference<SceneObject> {\n\n const ref = super.nextInstance();\n for (let child of this.children) {\n if (isModelObject(child)) {\n child._instanceCounter = this.instanceCounter;\n }\n }\n return ref;\n }\n\n protected async mapStateToVariant(state: BlockStateProperties): Promise<BlockStateVariant[]> {\n return BlockStateResolver.select(this.blockState, state, variants => this.getSingleVariant(variants));\n }\n\n public async recreateModels(): Promise<void> {\n //TODO: change this to create models once, and then modify rotations when updating the state\n\n // Remove all children\n // this.disposeAndRemoveAllChildren(); //TODO: just removes all children of all instances atm...\n\n // TODO: try to reuse models instead of just removing them and creating new ones\n this.clearModels();\n\n this.waterTint = this.fluidKind === \"water\" && this.options.biome && this.options.tints?.[0] === undefined\n ? await Biomes.getColor(this.options.biome, \"water\", this.blockState.key) : undefined;\n\n if (resolveBlockFluidState(this.blockState.key, this.state, this._fluidRules)?.renderModel === false) {\n await this.updateFluid(this._fluidSampler);\n return;\n }\n\n\n //TODO: might want to preload all possible states & cache their data\n //TODO: make sure to only instance stuff with different rotations together; i.e. not those with different multipart settings, or different models\n\n /*\n if (this.isInstanced) {\n //TODO: only map once per state\n for (let i = 0; i < this.instanceCounter; i++) {\n this._instanceVariant[i] = await this.mapStateToVariant(this._instanceState[i]);\n for (let variant of this._instanceVariant[i]) {\n this._instanceModel[i] = await this.createVariant(variant);\n }\n }\n //TODO: actually create\n //TODO: group by model\n this._isInstanced = true;\n } else {\n */\n const hasEntities = await this.createBlockEntities();\n const variantsToCreate = await this.mapStateToVariant(this.state);\n this._variants = variantsToCreate;\n for (let blockStateVariant of variantsToCreate) {\n // A block entity replaces only block models without geometry (a chest); a bell keeps its frame.\n if (hasEntities && !await this.hasGeometry(blockStateVariant)) continue;\n this._models.push(await this.createVariant(blockStateVariant));\n }\n await this.updateFluid(this._fluidSampler);\n this.setVisible(this.visible);\n /*\n }\n\n */\n\n }\n\n private async hasGeometry(variant: BlockStateVariant): Promise<boolean> {\n const modelKey = AssetKey.parse(\"models\", variant.model!);\n modelKey.root = this.blockState.key?.root;\n return !!(await Models.getMerged(modelKey))?.elements?.length;\n }\n\n protected getSingleVariant(variants: BlockStateVariant | BlockStateVariant[]): BlockStateVariant {\n return BlockStateResolver.choose(variants, this.variantPosition);\n }\n\n // @deprecated\n protected async createAVariant(variants: BlockStateVariant | BlockStateVariant[], instanceInfo: Matrix4[]) {\n const variant = this.getSingleVariant(variants);\n await this.createVariant(variant);\n }\n\n protected async createVariant(variant: BlockStateVariant): Promise<ModelObject | InstanceReference<ModelObject>> {\n const rotation = BlockStateResolver.rotation(variant);\n\n // The model and its textures must come from the same asset root as the blockstate.\n const modelKey = AssetKey.parse(\"models\", variant.model!);\n modelKey.root = this.blockState.key?.root;\n const model = await Models.getMerged(modelKey);\n const options: Partial<ModelObjectOptions> = {\n ...this.options,\n tints: model ? await BlockTints.get(this.blockState.key, this.state, model, this.options.tints,\n () => BlockTints.getBiomeColor(this.blockState.key, this.options.biome, this.biomePosition)) : this.options.tints,\n uvLockRotation: variant.uvlock && (rotation.x !== 0 || rotation.y !== 0)\n ? [rotation.x, rotation.y, rotation.z] : undefined,\n cullMask: this.options.displayPosition ? 0 : ModelCulling.toLocalMask(this._cullMask, rotation)\n };\n const obj = await this.scene.addModel(model!, options);\n if (isInstanceReference(obj) || (<ModelObject>obj).isInstanced) {\n this._isInstanced = true;\n this._instanceCounter = 1;//TODO: BlockObject itself isn't technically instanced, but needs the id for the get/setMatrix calls to work properly\n }\n obj.setRotation(rotation);\n obj.setPosition(this.position);\n return obj;\n }\n\n /** Clears selected properties and rebuilds models without reapplying property defaults. */\n public async resetState() {\n this._previousState = this._state;\n this._state = {};\n await this.recreateModels();\n }\n\n // TODO: support state per instance\n /**\n * Updates properties and rebuilds the selected models.\n * Accepts `\"facing=north,open=true\"`, a property object, or a key and value.\n * Properties omitted from the call keep their current values.\n */\n public async setState(string: string);\n public async setState(state: BlockStateProperties);\n public async setState(key: string, value: string);\n public async setState(stringOrKeyOrState: string | BlockStateProperties, value?: string) {\n this._setState(stringOrKeyOrState, value);\n await this.recreateModels();\n }\n\n protected _setState(stringOrKeyOrState: string | BlockStateProperties, value?: string): void {\n this._previousState = this._state;\n if (typeof value === \"undefined\") { // a=b,c=d,... or state object\n if (typeof stringOrKeyOrState === \"string\") {\n if (stringOrKeyOrState === \"\") return;\n const split = stringOrKeyOrState.split(\",\");\n for (let s of split) {\n let [k, v] = s.split(\"=\");\n this._setState(k, v);\n }\n } else if (typeof stringOrKeyOrState === \"object\") {\n for (let k in stringOrKeyOrState) {\n this._state[k] = stringOrKeyOrState[k];\n }\n }\n } else {\n this._state[stringOrKeyOrState as string] = value;\n }\n }\n\n /*\n public async setStateAt(index: number, string: string);\n public async setStateAt(index: number, state: BlockStateProperties);\n public async setStateAt(index: number, key: string, value: string);\n public async setStateAt(index: number, stringOrKeyOrState: string | BlockStateProperties, value?: string);\n public async setStateAt(index: number, stringOrKeyOrState: string | BlockStateProperties, value?: string) {\n this._setStateAt(index, stringOrKeyOrState, value);\n await this.recreateModels();\n }\n\n protected _setStateAt(index: number, stringOrKeyOrState: string | BlockStateProperties, value?: string): void {\n if (!this._instanceState[index]) this._instanceState[index] = {};\n if (typeof value === \"undefined\") { // a=b,c=d,... or state object\n if (typeof stringOrKeyOrState === \"string\") {\n if (stringOrKeyOrState === \"\") return;\n const split = stringOrKeyOrState.split(\",\");\n for (let s of split) {\n let [k, v] = s.split(\"=\");\n this._setStateAt(index, k, v);\n }\n } else if (typeof stringOrKeyOrState === \"object\") {\n for (let k in stringOrKeyOrState) {\n this._instanceState[index][k] = stringOrKeyOrState[k];\n }\n }\n } else {\n this._instanceState[index][stringOrKeyOrState as string] = value;\n }\n }\n\n _getStateAt(index: number): BlockStateProperties {\n return this._instanceState[index];\n }\n\n */\n\n setPositionRotationScaleAt(index: number, position?: Vector3, rotation?: Euler, scale?: Vector3) {\n super.setPositionRotationScaleAt(index, position, rotation, scale);\n }\n\n getMatrixAt(index: number, matrix: Matrix4 = new Matrix4()): Matrix4 {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n const child = this._models[0];\n if (child && isModelObject(child)) {\n child.getMatrixAt(index, matrix);\n } else if (child && isInstanceReference(child)) {\n child.getMatrix(matrix);\n }\n /*\n const child = this.children[0];\n if (child && isModelObject(child)) {\n if (!child.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n child.getMatrixAt(index, matrix);\n }\n return matrix;\n */\n // return super.getMatrixAt(0, matrix);\n return matrix;\n }\n\n setMatrixAt(index: number, matrix: Matrix4) {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n // const child = this._models[0];\n for(let child of this._models) {\n if (child && isModelObject(child)) {\n child.setMatrixAt(index, matrix);\n } else if (child && isInstanceReference(child)) {\n child.setMatrix(matrix);\n }\n }\n /*\n for (let child of this.children) {\n if (isModelObject(child)) {\n if (!child.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n child.setMatrixAt(index, matrix);\n }\n }\n */\n }\n\n setPosition(position: Vector3) {\n this.position.copy(position);\n // Each part keeps its own variant rotation when the block moves.\n for (let model of this._models) {\n model.setPosition(position);\n }\n this.placeEntities();\n this.notifyDirty();\n }\n\n //TODO: should override rotation + scale methods\n\n //TODO\n\n}\n\n/** Block settings passed to `scene.addBlock(blockState, options)` or the BlockObject constructor. */\nexport interface BlockObjectOptions extends ModelObjectOptions {\n /** Loads vanilla property defaults before applying `initialState`. Defaults to `true`. */\n applyDefaultState: boolean;\n /** Properties applied before model creation, overriding defaults when applyDefaultState is enabled. */\n initialState?: BlockStateProperties;\n /** Absolute block coordinates for repeatable variants, copied at construction. Omit for random previews. */\n variantPosition?: TripleArray;\n /** Saved biome ID used for automatic grass, foliage, and water colors. */\n biome?: string;\n /** World block coordinates used by biome grass modifiers. Copied at construction; defaults to the origin. */\n biomePosition?: TripleArray;\n}\n\nexport function isBlockObject(obj: any): obj is BlockObject {\n return (<BlockObject>obj).isBlockObject;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/model/block/scene/BlockObject.ts"],"sourcesContent":["import { SceneObject } from \"../../../renderer/SceneObject\";\nimport { BlockState, BlockStateVariant } from \"../BlockState\";\nimport { SceneObjectOptions } from \"../../../renderer/SceneObjectOptions\";\nimport { isModelObject, ModelObject, ModelObjectOptions } from \"../../scene/ModelObject\";\nimport { Caching } from \"../../../cache/Caching\";\nimport { Models } from \"../../../assets/Models\";\nimport { merge } from \"../../../util/_internal/merge\";\nimport { Euler, Matrix4, Quaternion, Vector3 } from \"three\";\nimport { Maybe } from \"../../../util/util\";\nimport { MineRenderError } from \"../../../error/MineRenderError\";\nimport { BlockStateProperties, BlockStatePropertyDefaults } from \"../BlockStateProperties\";\nimport { InstanceReference, isInstanceReference } from \"../../../instance/InstanceReference\";\nimport { AssetKey, BasicAssetKey } from \"../../../assets/AssetKey\";\nimport { BlockTints } from \"../BlockTints\";\nimport { ModelCulling } from \"../../ModelCulling\";\nimport { BlockStateResolver } from \"../BlockStateResolver\";\nimport { FluidKind, FluidRules, FluidSampler, resolveBlockFluidState } from \"../../fluid/FluidGeometry\";\nimport { MineRenderData } from \"../../../assets/MineRenderData\";\nimport { BlockEntities, ResolvedBlockEntity } from \"../../../assets/BlockEntities\";\nimport { Entities } from \"../../../assets/Entities\";\nimport type { EntityObject } from \"../../../entity/scene/EntityObject\";\nimport { Biomes } from \"../../../assets/Biomes\";\nimport type { TripleArray } from \"../../Model\";\nimport { logger } from \"../../../util/log\";\n\nconst log = logger(\"BlockObject\");\n\n/** Controls the model parts selected by a blockstate. Create it through {@link MineRenderScene.addBlock}. */\nexport class BlockObject extends SceneObject {\n\n public readonly isBlockObject: true = true;\n\n public static readonly DEFAULT_OPTIONS: BlockObjectOptions = merge({}, ModelObject.DEFAULT_OPTIONS, <BlockObjectOptions>{\n applyDefaultState: true\n });\n public readonly options: BlockObjectOptions;\n private readonly variantPosition?: TripleArray;\n\n private _previousState: BlockStateProperties = {};\n private _state: BlockStateProperties = {};\n private _variant: Maybe<BlockStateVariant> = undefined;\n\n private _instanceState: BlockStateProperties[] = [];\n private _instanceVariant: BlockStateVariant[][] = [];\n private _instanceModel: (ModelObject | InstanceReference<ModelObject>)[] = [];\n\n private _variants: BlockStateVariant[] = [];\n private _models: (ModelObject | InstanceReference<ModelObject>)[] = [];\n private _cullMask = 0;\n private _fluidKey?: string;\n private _fluidRules: FluidRules = {};\n private _fluidSampler?: FluidSampler;\n private readonly biomePosition?: TripleArray;\n private waterTint?: number;\n private _fluidModel?: ModelObject | InstanceReference<ModelObject>;\n private _entities: EntityObject[] = [];\n private _entityPlacement = new Matrix4();\n private _entityGeneration = 0;\n\n constructor(readonly blockState: BlockState, options?: Partial<BlockObjectOptions>) {\n super(options);\n this.options = merge({}, BlockObject.DEFAULT_OPTIONS, options ?? {});\n this.variantPosition = options?.variantPosition ? [...options.variantPosition] : undefined;\n this.biomePosition = options?.biomePosition ? [...options.biomePosition] : undefined;\n //TODO\n }\n\n async init(): Promise<void> {\n this._fluidRules = await MineRenderData.get(\"fluids\", this.blockState.key?.root);\n if (this.options.applyDefaultState) {\n this._setState(await BlockStateResolver.defaults(this.blockState));\n }\n if (this.options.initialState !== undefined) this._setState(this.options.initialState);\n await this.recreateModels();\n //TODO\n }\n\n dispose() {\n this.clearModels();\n super.dispose();\n }\n\n removeFromScene() {\n this.clearModels();\n super.removeFromScene();\n }\n\n private clearModels() {\n this.removeModels(this._models.splice(0));\n this._entityGeneration++;\n this.removeEntities(this._entities.splice(0));\n this._fluidKey = undefined;\n this._fluidModel = undefined;\n this._isInstanced = false;\n this._instanceCounter = 0;\n }\n\n private removeModels(models: (ModelObject | InstanceReference<ModelObject>)[]) {\n for (const model of models) {\n model.removeFromScene();\n if (!isInstanceReference(model)) model.dispose();\n }\n }\n\n private removeEntities(entities: EntityObject[]) {\n for (const entity of entities) {\n entity.removeFromScene();\n entity.dispose();\n }\n }\n\n /** Entity models drawn for this block instead of its block model; they are scene children, unlike the block. */\n public get blockEntities(): readonly EntityObject[] {\n return this._entities;\n }\n\n /** Model placements drawn for this block, including its fluid surface. */\n public get models(): readonly (ModelObject | InstanceReference<ModelObject>)[] {\n return this._models;\n }\n\n /** Sets visibility for this block's model instances and block entities. */\n public setVisible(visible: boolean): void {\n this.visible = visible;\n for (const model of this._models) {\n if (isInstanceReference(model)) {\n model.setVisible(visible);\n } else {\n model.visible = visible;\n }\n }\n for (const entity of this._entities) {\n entity.visible = visible;\n }\n this.notifyDirty();\n }\n\n /**\n * Draws the block through the dataset's block-entity index. Returns false, leaving nothing behind,\n * when the block is not listed or one of its models cannot be loaded.\n */\n private async createBlockEntities(): Promise<boolean> {\n const key = this.blockState.key;\n if (!key || this.options.displayPosition) return false;\n const generation = this._entityGeneration;\n const created: EntityObject[] = [];\n let resolved: Maybe<ResolvedBlockEntity>;\n try {\n resolved = BlockEntities.resolve(await BlockEntities.getIndex(key.root), key.toNamespacedString(), this.state);\n if (!resolved) return false;\n for (const part of resolved.parts) {\n const [namespace, path] = part.model.includes(\":\") ? part.model.split(\":\") : [key.namespace, part.model];\n const texture = part.textureLocation === undefined ? undefined\n : AssetKey.parse(\"textures\", part.textureLocation.replace(/^([^:]+:)?textures\\//, \"$1\"));\n if (texture) texture.root = key.root;\n const entity = await Entities.getEntity(new BasicAssetKey(namespace, path), texture, { layer: part.layer });\n if (!entity) throw new MineRenderError(`Missing entity model ${part.model}`);\n created.push(await this.scene.addEntity(entity, { wireframe: this.options.wireframe }) as EntityObject);\n }\n } catch (error) {\n log.warn(`Could not draw block entity ${key.toNamespacedString()}, using its block model`, error);\n this.removeEntities(created);\n return false;\n }\n // The block was cleared while the models loaded.\n if (generation !== this._entityGeneration) {\n this.removeEntities(created);\n return true;\n }\n BlockEntities.matrix(resolved, this._entityPlacement);\n this._entities = created;\n this.placeEntities();\n this.setVisible(this.visible);\n return true;\n }\n\n private placeEntities() {\n // Block models are centred on the block position; entity transforms use the block's 0..16 space.\n const matrix = new Matrix4().makeTranslation(this.position.x - 8, this.position.y - 8, this.position.z - 8).multiply(this._entityPlacement);\n for (const entity of this._entities) {\n matrix.decompose(entity.position, entity.quaternion, entity.scale);\n }\n }\n\n public get isOccluding(): boolean {\n if (!this.visible) {\n return false;\n }\n return this._models.some(model => {\n const object = isInstanceReference(model) ? model.instanceable : model;\n return object.isOpaqueFullCube && this.getModelCullMask(model, 63) === 63;\n });\n }\n\n private getModelMatrix(model: ModelObject | InstanceReference<ModelObject>): Matrix4 {\n if (isInstanceReference(model)) return model.getMatrix();\n if (model.matrixAutoUpdate) model.updateMatrix();\n return model.matrix.clone();\n }\n\n private getModelCullMask(model: ModelObject | InstanceReference<ModelObject>, worldMask: number): number {\n const object = isInstanceReference(model) ? model.instanceable : model;\n if (object.options.displayPosition) return 0;\n const position = new Vector3();\n const rotation = new Quaternion();\n const scale = new Vector3();\n this.getModelMatrix(model).decompose(position, rotation, scale);\n if (position.distanceToSquared(this.position) > 1e-10\n || scale.distanceToSquared(new Vector3(1, 1, 1)) > 1e-10) return 0;\n return ModelCulling.toLocalMask(worldMask, new Euler().setFromQuaternion(rotation));\n }\n\n /** World-space face mask currently applied to this block. */\n public get cullMask(): number {\n return this._cullMask;\n }\n\n public async setCullMask(worldMask: number): Promise<void> {\n worldMask &= 63;\n const replacements: (ModelObject | InstanceReference<ModelObject>)[] = [];\n try {\n for (const model of this._models) {\n if (model === this._fluidModel) {\n replacements.push(model);\n continue;\n }\n const object = isInstanceReference(model) ? model.instanceable : model;\n const cullMask = this.getModelCullMask(model, worldMask);\n if (cullMask === (object.options.cullMask ?? 0)) {\n replacements.push(model);\n continue;\n }\n const matrix = this.getModelMatrix(model);\n const replacement = await this.scene.addModel(object.originalModel, { ...object.options, cullMask });\n replacements.push(replacement);\n if (isInstanceReference(replacement)) {\n replacement.setMatrix(matrix);\n } else {\n replacement.matrix.copy(matrix);\n replacement.matrixWorldNeedsUpdate = true;\n matrix.decompose(replacement.position, replacement.quaternion, replacement.scale);\n replacement.matrixAutoUpdate = object.matrixAutoUpdate;\n replacement.visible = object.visible;\n }\n }\n } catch (error) {\n this.removeModels(replacements.filter(model => !this._models.includes(model)));\n throw error;\n }\n const previous = this._models;\n this._models = replacements;\n this._cullMask = worldMask;\n this.removeModels(previous.filter(model => !replacements.includes(model)));\n if (!this.visible) {\n this.setVisible(false);\n }\n this.notifyDirty();\n }\n\n /** Selected property values. Use {@link setState} to change properties and rebuild the rendered models. */\n public get state(): { [key: string]: string; } {\n return this._state;\n }\n\n public get fluidKind(): FluidKind | undefined {\n return resolveBlockFluidState(this.blockState.key, this.state, this._fluidRules)?.kind;\n }\n\n public get fluidLevel(): number {\n return resolveBlockFluidState(this.blockState.key, this.state, this._fluidRules)?.level ?? 0;\n }\n\n /** Refreshes fluid surfaces from relative neighbors; standalone previews use air around the block. */\n public async updateFluid(sample?: FluidSampler): Promise<void> {\n const kind = this.fluidKind;\n if (!kind) return;\n const { FluidModelObject, sampleFluid } = await import(\"../../fluid/FluidModelObject\");\n this._fluidSampler = sample;\n const surface = sampleFluid(kind, (x, y, z) => x === 0 && y === 0 && z === 0\n ? { fluid: kind, level: this.fluidLevel } : sample?.(x, y, z) ?? {});\n const tint = this.options.tints?.[0] ?? this.waterTint;\n const fluidKey = `${surface.key}|${tint ?? \"default\"}`;\n if (this._fluidKey === fluidKey) return;\n const key = new AssetKey(\"minecraft\", `${kind}/${surface.key}`, \"models\", \"fluid\", \"assets\", \".json\", this.blockState.key?.root);\n const replacement = await this.scene.addSceneObject({ key },\n () => new FluidModelObject(kind, surface.sample, this.blockState.key, {\n ...this.options, tints: tint === undefined ? this.options.tints : { ...this.options.tints, 0: tint }\n }));\n const previous = this._fluidModel;\n const matrix = previous ? this.getModelMatrix(previous) : new Matrix4().makeTranslation(...this.position.toArray());\n if (isInstanceReference(replacement)) replacement.setMatrix(matrix);\n else matrix.decompose(replacement.position, replacement.quaternion, replacement.scale);\n this._models = this._models.filter(model => model !== previous);\n this._models.push(replacement);\n this._fluidModel = replacement;\n this._fluidKey = fluidKey;\n this._isInstanced ||= isInstanceReference(replacement);\n this._instanceCounter = this._isInstanced ? 1 : 0;\n if (previous) this.removeModels([previous]);\n if (!this.visible) {\n this.setVisible(false);\n }\n this.notifyDirty();\n }\n\n nextInstance(): InstanceReference<SceneObject> {\n\n const ref = super.nextInstance();\n for (let child of this.children) {\n if (isModelObject(child)) {\n child._instanceCounter = this.instanceCounter;\n }\n }\n return ref;\n }\n\n protected async mapStateToVariant(state: BlockStateProperties): Promise<BlockStateVariant[]> {\n return BlockStateResolver.select(this.blockState, state, variants => this.getSingleVariant(variants));\n }\n\n public async recreateModels(): Promise<void> {\n //TODO: change this to create models once, and then modify rotations when updating the state\n\n // Remove all children\n // this.disposeAndRemoveAllChildren(); //TODO: just removes all children of all instances atm...\n\n // TODO: try to reuse models instead of just removing them and creating new ones\n this.clearModels();\n\n this.waterTint = this.fluidKind === \"water\" && this.options.biome && this.options.tints?.[0] === undefined\n ? await Biomes.getColor(this.options.biome, \"water\", this.blockState.key) : undefined;\n\n if (resolveBlockFluidState(this.blockState.key, this.state, this._fluidRules)?.renderModel === false) {\n await this.updateFluid(this._fluidSampler);\n return;\n }\n\n\n //TODO: might want to preload all possible states & cache their data\n //TODO: make sure to only instance stuff with different rotations together; i.e. not those with different multipart settings, or different models\n\n /*\n if (this.isInstanced) {\n //TODO: only map once per state\n for (let i = 0; i < this.instanceCounter; i++) {\n this._instanceVariant[i] = await this.mapStateToVariant(this._instanceState[i]);\n for (let variant of this._instanceVariant[i]) {\n this._instanceModel[i] = await this.createVariant(variant);\n }\n }\n //TODO: actually create\n //TODO: group by model\n this._isInstanced = true;\n } else {\n */\n const hasEntities = await this.createBlockEntities();\n const variantsToCreate = await this.mapStateToVariant(this.state);\n this._variants = variantsToCreate;\n for (let blockStateVariant of variantsToCreate) {\n // A block entity replaces only block models without geometry (a chest); a bell keeps its frame.\n if (hasEntities && !await this.hasGeometry(blockStateVariant)) continue;\n this._models.push(await this.createVariant(blockStateVariant));\n }\n await this.updateFluid(this._fluidSampler);\n this.setVisible(this.visible);\n /*\n }\n\n */\n\n }\n\n private async hasGeometry(variant: BlockStateVariant): Promise<boolean> {\n const modelKey = AssetKey.parse(\"models\", variant.model!);\n modelKey.root = this.blockState.key?.root;\n return !!(await Models.getMerged(modelKey))?.elements?.length;\n }\n\n protected getSingleVariant(variants: BlockStateVariant | BlockStateVariant[]): BlockStateVariant {\n return BlockStateResolver.choose(variants, this.variantPosition);\n }\n\n // @deprecated\n protected async createAVariant(variants: BlockStateVariant | BlockStateVariant[], instanceInfo: Matrix4[]) {\n const variant = this.getSingleVariant(variants);\n await this.createVariant(variant);\n }\n\n protected async createVariant(variant: BlockStateVariant): Promise<ModelObject | InstanceReference<ModelObject>> {\n const rotation = BlockStateResolver.rotation(variant);\n\n // The model and its textures must come from the same asset root as the blockstate.\n const modelKey = AssetKey.parse(\"models\", variant.model!);\n modelKey.root = this.blockState.key?.root;\n const model = await Models.getMerged(modelKey);\n const options: Partial<ModelObjectOptions> = {\n ...this.options,\n tints: model ? await BlockTints.get(this.blockState.key, this.state, model, this.options.tints,\n () => BlockTints.getBiomeColor(this.blockState.key, this.options.biome, this.biomePosition)) : this.options.tints,\n uvLockRotation: variant.uvlock && (rotation.x !== 0 || rotation.y !== 0)\n ? [rotation.x, rotation.y, rotation.z] : undefined,\n cullMask: this.options.displayPosition ? 0 : ModelCulling.toLocalMask(this._cullMask, rotation)\n };\n const obj = await this.scene.addModel(model!, options);\n if (isInstanceReference(obj) || (<ModelObject>obj).isInstanced) {\n this._isInstanced = true;\n this._instanceCounter = 1;//TODO: BlockObject itself isn't technically instanced, but needs the id for the get/setMatrix calls to work properly\n }\n obj.setRotation(rotation);\n obj.setPosition(this.position);\n return obj;\n }\n\n /** Clears selected properties and rebuilds models without reapplying property defaults. */\n public async resetState() {\n this._previousState = this._state;\n this._state = {};\n await this.recreateModels();\n }\n\n // TODO: support state per instance\n /**\n * Updates properties and rebuilds the selected models.\n * Accepts `\"facing=north,open=true\"`, a property object, or a key and value.\n * Properties omitted from the call keep their current values.\n */\n public async setState(string: string);\n public async setState(state: BlockStateProperties);\n public async setState(key: string, value: string);\n public async setState(stringOrKeyOrState: string | BlockStateProperties, value?: string) {\n this._setState(stringOrKeyOrState, value);\n await this.recreateModels();\n }\n\n protected _setState(stringOrKeyOrState: string | BlockStateProperties, value?: string): void {\n this._previousState = this._state;\n if (typeof value === \"undefined\") { // a=b,c=d,... or state object\n if (typeof stringOrKeyOrState === \"string\") {\n if (stringOrKeyOrState === \"\") return;\n const split = stringOrKeyOrState.split(\",\");\n for (let s of split) {\n let [k, v] = s.split(\"=\");\n this._setState(k, v);\n }\n } else if (typeof stringOrKeyOrState === \"object\") {\n for (let k in stringOrKeyOrState) {\n this._state[k] = stringOrKeyOrState[k];\n }\n }\n } else {\n this._state[stringOrKeyOrState as string] = value;\n }\n }\n\n /*\n public async setStateAt(index: number, string: string);\n public async setStateAt(index: number, state: BlockStateProperties);\n public async setStateAt(index: number, key: string, value: string);\n public async setStateAt(index: number, stringOrKeyOrState: string | BlockStateProperties, value?: string);\n public async setStateAt(index: number, stringOrKeyOrState: string | BlockStateProperties, value?: string) {\n this._setStateAt(index, stringOrKeyOrState, value);\n await this.recreateModels();\n }\n\n protected _setStateAt(index: number, stringOrKeyOrState: string | BlockStateProperties, value?: string): void {\n if (!this._instanceState[index]) this._instanceState[index] = {};\n if (typeof value === \"undefined\") { // a=b,c=d,... or state object\n if (typeof stringOrKeyOrState === \"string\") {\n if (stringOrKeyOrState === \"\") return;\n const split = stringOrKeyOrState.split(\",\");\n for (let s of split) {\n let [k, v] = s.split(\"=\");\n this._setStateAt(index, k, v);\n }\n } else if (typeof stringOrKeyOrState === \"object\") {\n for (let k in stringOrKeyOrState) {\n this._instanceState[index][k] = stringOrKeyOrState[k];\n }\n }\n } else {\n this._instanceState[index][stringOrKeyOrState as string] = value;\n }\n }\n\n _getStateAt(index: number): BlockStateProperties {\n return this._instanceState[index];\n }\n\n */\n\n setPositionRotationScaleAt(index: number, position?: Vector3, rotation?: Euler, scale?: Vector3) {\n super.setPositionRotationScaleAt(index, position, rotation, scale);\n }\n\n getMatrixAt(index: number, matrix: Matrix4 = new Matrix4()): Matrix4 {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n const child = this._models[0];\n if (child && isModelObject(child)) {\n child.getMatrixAt(index, matrix);\n } else if (child && isInstanceReference(child)) {\n child.getMatrix(matrix);\n }\n /*\n const child = this.children[0];\n if (child && isModelObject(child)) {\n if (!child.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n child.getMatrixAt(index, matrix);\n }\n return matrix;\n */\n // return super.getMatrixAt(0, matrix);\n return matrix;\n }\n\n setMatrixAt(index: number, matrix: Matrix4) {\n if (!this.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n // const child = this._models[0];\n for(let child of this._models) {\n if (child && isModelObject(child)) {\n child.setMatrixAt(index, matrix);\n } else if (child && isInstanceReference(child)) {\n child.setMatrix(matrix);\n }\n }\n /*\n for (let child of this.children) {\n if (isModelObject(child)) {\n if (!child.isInstanced) throw new MineRenderError(\"Object is not instanced\");\n child.setMatrixAt(index, matrix);\n }\n }\n */\n }\n\n setPosition(position: Vector3) {\n this.position.copy(position);\n // Each part keeps its own variant rotation when the block moves.\n for (let model of this._models) {\n model.setPosition(position);\n }\n this.placeEntities();\n this.notifyDirty();\n }\n\n //TODO: should override rotation + scale methods\n\n //TODO\n\n}\n\n/** Block settings passed to `scene.addBlock(blockState, options)` or the BlockObject constructor. */\nexport interface BlockObjectOptions extends ModelObjectOptions {\n /** Loads vanilla property defaults before applying `initialState`. Defaults to `true`. */\n applyDefaultState: boolean;\n /** Properties applied before model creation, overriding defaults when applyDefaultState is enabled. */\n initialState?: BlockStateProperties;\n /** Absolute block coordinates for repeatable variants, copied at construction. Omit for random previews. */\n variantPosition?: TripleArray;\n /** Saved biome ID used for automatic grass, foliage, and water colors. */\n biome?: string;\n /** World block coordinates used by biome grass modifiers. Copied at construction; defaults to the origin. */\n biomePosition?: TripleArray;\n}\n\nexport function isBlockObject(obj: any): obj is BlockObject {\n return (<BlockObject>obj).isBlockObject;\n}\n"],"mappings":"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","names":[]}
@@ -21,13 +21,16 @@ var StructureParser = class {
21
21
  const blocks = nbt.blocks.value.value.map((block) => {
22
22
  const state = palette.value.value[block.state.value];
23
23
  if (!state) throw new MineRenderError(`Structure palette index ${block.state.value} does not exist`);
24
- if (["minecraft:air", "minecraft:cave_air", "minecraft:void_air"].includes(state.Name.value)) return void 0;
24
+ const name = (state.Name ?? state.id)?.value;
25
+ if (!name) throw new MineRenderError(`Structure palette entry ${block.state.value} has no block name`);
26
+ if (["minecraft:air", "minecraft:cave_air", "minecraft:void_air"].includes(name)) return void 0;
25
27
  const props = {};
26
- for (let k in state.Properties?.value) {
27
- props[k] = state.Properties.value[k].value;
28
+ const properties = (state.Properties ?? state.properties)?.value;
29
+ for (let k in properties) {
30
+ props[k] = properties[k].value;
28
31
  }
29
32
  return {
30
- type: state.Name.value,
33
+ type: name,
31
34
  properties: props,
32
35
  position: block.pos.value.value,
33
36
  nbt: block.nbt
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/model/multiblock/StructureParser.ts"],"sourcesContent":["import { MultiBlockBlock, MultiBlockStructure } from \"./MultiBlockStructure\";\nimport { TripleArray } from \"../Model\";\nimport type { NBT } from \"prismarine-nbt\";\nimport { MineRenderError } from \"../../error/MineRenderError\";\nimport { BlockStateProperties } from \"../block/BlockStateProperties\";\n\n/** Converts Java structure NBT into blocks and preserved entity data for world placement. */\nexport class StructureParser {\n\n /**\n * Parses decoded NBT, omitting air blocks.\n * @param _nbt - Structure data decoded by {@link NBTHelper.fromBuffer}.\n * @param paletteIndex - Palette to select when the structure has several. Defaults to 0.\n */\n public static async parse(_nbt: NBT, paletteIndex?: number): Promise<MultiBlockStructure> {\n const nbt = _nbt.value as unknown as StructureNBT;\n\n let palette: Palette;\n if (\"palette\" in nbt) {\n palette = nbt.palette!;\n } else if (\"palettes\" in nbt) {\n const selected = nbt.palettes!.value.value[paletteIndex ?? 0];\n if (!selected) throw new MineRenderError(`Structure palette ${paletteIndex ?? 0} does not exist`);\n palette = { type: \"list\", value: selected };\n } else {\n throw new MineRenderError(\"Structure does not have palette(s)\");\n }\n\n const blocks: MultiBlockBlock[] =\n nbt.blocks.value.value.map(block => {\n const state = palette.value.value[block.state.value];\n if (!state) throw new MineRenderError(`Structure palette index ${block.state.value} does not exist`);\n if ([\"minecraft:air\", \"minecraft:cave_air\", \"minecraft:void_air\"].includes(state.Name.value)) return undefined;\n\n const props: BlockStateProperties = {};\n for (let k in state.Properties?.value) {\n props[k] = state.Properties.value[k].value;\n }\n return <MultiBlockBlock>{\n type: state.Name.value,\n properties: props,\n position: block.pos.value.value,\n nbt: block.nbt\n }\n }).filter(m => typeof m !== \"undefined\") as MultiBlockBlock[] ;\n return {\n blocks: blocks,\n size: nbt.size.value.value,\n dataVersion: nbt.DataVersion?.value,\n entities: (nbt.entities?.value.value ?? []).map(entity => ({\n position: entity.pos.value.value,\n blockPosition: entity.blockPos.value.value,\n nbt: entity.nbt\n }))\n }\n }\n\n}\n\n/** Tagged NBT fields used by Java structure files. */\nexport interface StructureNBT {\n DataVersion?: {\n type: \"int\";\n value: number;\n }\n size: {\n type: \"list\";\n value: {\n type: \"int\";\n value: TripleArray;\n }\n }\n palette?: Palette;\n palettes?: {\n type: \"list\";\n value: { type: \"list\"; value: Palette[\"value\"][] };\n };\n blocks: {\n type: \"list\";\n value: {\n type: \"compound\";\n value: BlockEntry[];\n }\n }\n entities?: {\n type: \"list\";\n value: {\n type: \"compound\";\n value: {\n pos: { type: \"list\"; value: { type: \"double\"; value: TripleArray } };\n blockPos: { type: \"list\"; value: { type: \"int\"; value: TripleArray } };\n nbt: { type: \"compound\"; value: any };\n }[];\n };\n };\n}\n\ninterface Palette {\n type: \"list\";\n value: {\n type: \"compound\";\n value: PaletteEntry[]\n }\n}\n\ninterface PaletteEntry {\n Name: {\n type: \"string\";\n value: string;\n }\n Properties: {\n type: \"compound\";\n value: { [property: string]: PalettePropertyValue; };\n }\n}\n\ninterface PalettePropertyValue {\n type: string;\n value: string;\n}\n\ninterface BlockEntry {\n pos: {\n type: \"list\";\n value: {\n type: \"int\";\n value: TripleArray;\n }\n }\n state: {\n type: \"int\";\n value: number;\n }\n nbt: {\n type: \"compound\";\n value: any;\n }\n}\n"],"mappings":";AAGA,SAAS,uBAAuB;AAIzB,IAAM,kBAAN,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzB,aAAoB,MAAM,MAAW,cAAqD;AACtF,UAAM,MAAM,KAAK;AAEjB,QAAI;AACJ,QAAI,aAAa,KAAK;AAClB,gBAAU,IAAI;AAAA,IAClB,WAAW,cAAc,KAAK;AAC1B,YAAM,WAAW,IAAI,SAAU,MAAM,MAAM,gBAAgB,CAAC;AAC5D,UAAI,CAAC,SAAU,OAAM,IAAI,gBAAgB,qBAAqB,gBAAgB,CAAC,iBAAiB;AAChG,gBAAU,EAAE,MAAM,QAAQ,OAAO,SAAS;AAAA,IAC9C,OAAO;AACH,YAAM,IAAI,gBAAgB,oCAAoC;AAAA,IAClE;AAEA,UAAM,SACF,IAAI,OAAO,MAAM,MAAM,IAAI,WAAS;AAChC,YAAM,QAAQ,QAAQ,MAAM,MAAM,MAAM,MAAM,KAAK;AACnD,UAAI,CAAC,MAAO,OAAM,IAAI,gBAAgB,2BAA2B,MAAM,MAAM,KAAK,iBAAiB;AACnG,UAAI,CAAC,iBAAiB,sBAAsB,oBAAoB,EAAE,SAAS,MAAM,KAAK,KAAK,EAAG,QAAO;AAErG,YAAM,QAA8B,CAAC;AACrC,eAAS,KAAK,MAAM,YAAY,OAAO;AACnC,cAAM,CAAC,IAAI,MAAM,WAAW,MAAM,CAAC,EAAE;AAAA,MACzC;AACA,aAAwB;AAAA,QACpB,MAAM,MAAM,KAAK;AAAA,QACjB,YAAY;AAAA,QACZ,UAAU,MAAM,IAAI,MAAM;AAAA,QAC1B,KAAK,MAAM;AAAA,MACf;AAAA,IACJ,CAAC,EAAE,OAAO,OAAK,OAAO,MAAM,WAAW;AAC3C,WAAO;AAAA,MACH;AAAA,MACA,MAAM,IAAI,KAAK,MAAM;AAAA,MACrB,aAAa,IAAI,aAAa;AAAA,MAC9B,WAAW,IAAI,UAAU,MAAM,SAAS,CAAC,GAAG,IAAI,aAAW;AAAA,QACvD,UAAU,OAAO,IAAI,MAAM;AAAA,QAC3B,eAAe,OAAO,SAAS,MAAM;AAAA,QACrC,KAAK,OAAO;AAAA,MAChB,EAAE;AAAA,IACN;AAAA,EACJ;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/model/multiblock/StructureParser.ts"],"sourcesContent":["import { MultiBlockBlock, MultiBlockStructure } from \"./MultiBlockStructure\";\nimport { TripleArray } from \"../Model\";\nimport type { NBT } from \"prismarine-nbt\";\nimport { MineRenderError } from \"../../error/MineRenderError\";\nimport { BlockStateProperties } from \"../block/BlockStateProperties\";\n\n/** Converts Java structure NBT into blocks and preserved entity data for world placement. */\nexport class StructureParser {\n\n /**\n * Parses decoded NBT, omitting air blocks.\n * @param _nbt - Structure data decoded by {@link NBTHelper.fromBuffer}.\n * @param paletteIndex - Palette to select when the structure has several. Defaults to 0.\n */\n public static async parse(_nbt: NBT, paletteIndex?: number): Promise<MultiBlockStructure> {\n const nbt = _nbt.value as unknown as StructureNBT;\n\n let palette: Palette;\n if (\"palette\" in nbt) {\n palette = nbt.palette!;\n } else if (\"palettes\" in nbt) {\n const selected = nbt.palettes!.value.value[paletteIndex ?? 0];\n if (!selected) throw new MineRenderError(`Structure palette ${paletteIndex ?? 0} does not exist`);\n palette = { type: \"list\", value: selected };\n } else {\n throw new MineRenderError(\"Structure does not have palette(s)\");\n }\n\n const blocks: MultiBlockBlock[] =\n nbt.blocks.value.value.map(block => {\n const state = palette.value.value[block.state.value];\n if (!state) throw new MineRenderError(`Structure palette index ${block.state.value} does not exist`);\n const name = (state.Name ?? state.id)?.value;\n if (!name) throw new MineRenderError(`Structure palette entry ${block.state.value} has no block name`);\n if ([\"minecraft:air\", \"minecraft:cave_air\", \"minecraft:void_air\"].includes(name)) return undefined;\n\n const props: BlockStateProperties = {};\n const properties = (state.Properties ?? state.properties)?.value;\n for (let k in properties) {\n props[k] = properties[k].value;\n }\n return <MultiBlockBlock>{\n type: name,\n properties: props,\n position: block.pos.value.value,\n nbt: block.nbt\n }\n }).filter(m => typeof m !== \"undefined\") as MultiBlockBlock[] ;\n return {\n blocks: blocks,\n size: nbt.size.value.value,\n dataVersion: nbt.DataVersion?.value,\n entities: (nbt.entities?.value.value ?? []).map(entity => ({\n position: entity.pos.value.value,\n blockPosition: entity.blockPos.value.value,\n nbt: entity.nbt\n }))\n }\n }\n\n}\n\n/** Tagged NBT fields used by Java structure files. */\nexport interface StructureNBT {\n DataVersion?: {\n type: \"int\";\n value: number;\n }\n size: {\n type: \"list\";\n value: {\n type: \"int\";\n value: TripleArray;\n }\n }\n palette?: Palette;\n palettes?: {\n type: \"list\";\n value: { type: \"list\"; value: Palette[\"value\"][] };\n };\n blocks: {\n type: \"list\";\n value: {\n type: \"compound\";\n value: BlockEntry[];\n }\n }\n entities?: {\n type: \"list\";\n value: {\n type: \"compound\";\n value: {\n pos: { type: \"list\"; value: { type: \"double\"; value: TripleArray } };\n blockPos: { type: \"list\"; value: { type: \"int\"; value: TripleArray } };\n nbt: { type: \"compound\"; value: any };\n }[];\n };\n };\n}\n\ninterface Palette {\n type: \"list\";\n value: {\n type: \"compound\";\n value: PaletteEntry[]\n }\n}\n\n// Since DataVersion 5006 (26.3 snapshot 7), Minecraft saves these as `id` and `properties`; older versions use `Name` and `Properties`.\ninterface PaletteEntry {\n Name?: {\n type: \"string\";\n value: string;\n }\n id?: {\n type: \"string\";\n value: string;\n }\n Properties?: {\n type: \"compound\";\n value: { [property: string]: PalettePropertyValue; };\n }\n properties?: {\n type: \"compound\";\n value: { [property: string]: PalettePropertyValue; };\n }\n}\n\ninterface PalettePropertyValue {\n type: string;\n value: string;\n}\n\ninterface BlockEntry {\n pos: {\n type: \"list\";\n value: {\n type: \"int\";\n value: TripleArray;\n }\n }\n state: {\n type: \"int\";\n value: number;\n }\n nbt: {\n type: \"compound\";\n value: any;\n }\n}\n"],"mappings":";AAGA,SAAS,uBAAuB;AAIzB,IAAM,kBAAN,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzB,aAAoB,MAAM,MAAW,cAAqD;AACtF,UAAM,MAAM,KAAK;AAEjB,QAAI;AACJ,QAAI,aAAa,KAAK;AAClB,gBAAU,IAAI;AAAA,IAClB,WAAW,cAAc,KAAK;AAC1B,YAAM,WAAW,IAAI,SAAU,MAAM,MAAM,gBAAgB,CAAC;AAC5D,UAAI,CAAC,SAAU,OAAM,IAAI,gBAAgB,qBAAqB,gBAAgB,CAAC,iBAAiB;AAChG,gBAAU,EAAE,MAAM,QAAQ,OAAO,SAAS;AAAA,IAC9C,OAAO;AACH,YAAM,IAAI,gBAAgB,oCAAoC;AAAA,IAClE;AAEA,UAAM,SACF,IAAI,OAAO,MAAM,MAAM,IAAI,WAAS;AAChC,YAAM,QAAQ,QAAQ,MAAM,MAAM,MAAM,MAAM,KAAK;AACnD,UAAI,CAAC,MAAO,OAAM,IAAI,gBAAgB,2BAA2B,MAAM,MAAM,KAAK,iBAAiB;AACnG,YAAM,QAAQ,MAAM,QAAQ,MAAM,KAAK;AACvC,UAAI,CAAC,KAAM,OAAM,IAAI,gBAAgB,2BAA2B,MAAM,MAAM,KAAK,oBAAoB;AACrG,UAAI,CAAC,iBAAiB,sBAAsB,oBAAoB,EAAE,SAAS,IAAI,EAAG,QAAO;AAEzF,YAAM,QAA8B,CAAC;AACrC,YAAM,cAAc,MAAM,cAAc,MAAM,aAAa;AAC3D,eAAS,KAAK,YAAY;AACtB,cAAM,CAAC,IAAI,WAAW,CAAC,EAAE;AAAA,MAC7B;AACA,aAAwB;AAAA,QACpB,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,UAAU,MAAM,IAAI,MAAM;AAAA,QAC1B,KAAK,MAAM;AAAA,MACf;AAAA,IACJ,CAAC,EAAE,OAAO,OAAK,OAAO,MAAM,WAAW;AAC3C,WAAO;AAAA,MACH;AAAA,MACA,MAAM,IAAI,KAAK,MAAM;AAAA,MACrB,aAAa,IAAI,aAAa;AAAA,MAC9B,WAAW,IAAI,UAAU,MAAM,SAAS,CAAC,GAAG,IAAI,aAAW;AAAA,QACvD,UAAU,OAAO,IAAI,MAAM;AAAA,QAC3B,eAAe,OAAO,SAAS,MAAM;AAAA,QACrC,KAAK,OAAO;AAAA,MAChB,EAAE;AAAA,IACN;AAAA,EACJ;AAEJ;","names":[]}
@@ -6,7 +6,7 @@ import { BoxGeometry, BufferAttribute, Color, DoubleSide, Euler, FrontSide, Matr
6
6
  import { mergeBufferGeometries } from "../../three/BufferGeometryUtils.mjs";
7
7
  import { addBox3WireframeToObject, addWireframeToMesh, addWireframeToObject, applyElementRotation } from "../../util/model.mjs";
8
8
  import { merge } from "../../util/_internal/merge.mjs";
9
- import { prefix } from "../../util/log.mjs";
9
+ import { logger } from "../../util/log.mjs";
10
10
  import { CUBE_FACES } from "../../CubeFace.mjs";
11
11
  import { DisplayPosition } from "../DisplayPosition.mjs";
12
12
  import { DisplayTransforms } from "../DisplayTransforms.mjs";
@@ -16,7 +16,7 @@ import { EntityObject } from "../../entity/scene/EntityObject.mjs";
16
16
  import { GuiLight } from "../GuiLight.mjs";
17
17
  import { ItemTints } from "../ItemTints.mjs";
18
18
  import { ItemGlint } from "../ItemGlint.mjs";
19
- var p = prefix("ModelObject");
19
+ var log = logger("ModelObject");
20
20
  var _ModelObject = class _ModelObject extends SceneObject {
21
21
  constructor(originalModel, options) {
22
22
  super(options);
@@ -198,10 +198,10 @@ var _ModelObject = class _ModelObject extends SceneObject {
198
198
  }
199
199
  });
200
200
  } else {
201
- console.debug(p, this.atlas.model, "has no elements");
201
+ log.debug(this.atlas.model, "has no elements");
202
202
  }
203
203
  } else {
204
- console.debug(p, "Missing atlas for", this);
204
+ log.debug("Missing atlas for", this);
205
205
  }
206
206
  if (this.options.mergeMeshes) {
207
207
  let combinedGeo;
@@ -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 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 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":";AAIO,IAAM,YAAN,MAAgB;AAAA;AAAA,EAGnB,aAAoB,WAAW,MAAgC,QAAuC;AAClG,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,QAAQ;AACxC,UAAM,SAAS,OAAO,KAAK,gBAAgB,aAAa,OAAO,IAAI,WAAW,IAAI,CAAC;AACnF,UAAM,gBAAgB,MAAM,OAAO,gBAAgB;AACnD,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":[]}
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
- console.warn("0 element width");
261
+ log.warn("0 element width");
260
262
  }
261
263
  if (this.viewHeight == 0) {
262
- console.warn("0 element height");
264
+ log.warn("0 element height");
263
265
  }
264
266
  this.resize(this.viewWidth, this.viewHeight);
265
267
  }