minerender 2.1.0-alpha.134 → 2.1.0-alpha.136

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 (37) hide show
  1. package/dist/browser/esm/assets/AssetDefaults.mjs +8 -0
  2. package/dist/browser/esm/assets/AssetDefaults.mjs.map +1 -0
  3. package/dist/browser/esm/assets/AssetKey.mjs +1 -1
  4. package/dist/browser/esm/assets/AssetKey.mjs.map +1 -1
  5. package/dist/browser/esm/assets/AssetLoader.mjs +1 -1
  6. package/dist/browser/esm/assets/AssetLoader.mjs.map +1 -1
  7. package/dist/browser/esm/assets/Assets.mjs +1 -5
  8. package/dist/browser/esm/assets/Assets.mjs.map +1 -1
  9. package/dist/browser/esm/assets/BlockStates.mjs +1 -1
  10. package/dist/browser/esm/assets/BlockStates.mjs.map +1 -1
  11. package/dist/browser/esm/assets/Entities.mjs +1 -1
  12. package/dist/browser/esm/assets/Entities.mjs.map +1 -1
  13. package/dist/browser/esm/assets/Models.mjs +1 -1
  14. package/dist/browser/esm/assets/Models.mjs.map +1 -1
  15. package/dist/browser/esm/assets/_fonts/Unihex.mjs +1 -1
  16. package/dist/browser/esm/assets/_fonts/Unihex.mjs.map +1 -1
  17. package/dist/browser/esm/assets/index.mjs +1 -0
  18. package/dist/browser/esm/assets/index.mjs.map +1 -1
  19. package/dist/browser/esm/assets/source/HostedAssetSource.mjs +1 -1
  20. package/dist/browser/esm/assets/source/HostedAssetSource.mjs.map +1 -1
  21. package/dist/browser/esm/index.browser.d.mts +3 -2
  22. package/dist/browser/esm/nbt/NBTHelper.mjs +5 -2
  23. package/dist/browser/esm/nbt/NBTHelper.mjs.map +1 -1
  24. package/dist/browser/esm/world/_culling/BlockCulling.mjs +1 -1
  25. package/dist/browser/esm/world/_culling/BlockCulling.mjs.map +1 -1
  26. package/dist/browser/index.d.ts +3 -2
  27. package/dist/browser/index.js +2712 -2705
  28. package/dist/browser/index.js.map +1 -1
  29. package/dist/bundle.js +7812 -7802
  30. package/dist/bundle.js.map +1 -1
  31. package/dist/node/index.d.mts +3 -2
  32. package/dist/node/index.d.ts +3 -2
  33. package/dist/node/index.js +2738 -2731
  34. package/dist/node/index.js.map +1 -1
  35. package/dist/node/index.mjs +2720 -2713
  36. package/dist/node/index.mjs.map +1 -1
  37. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/assets/source/HostedAssetSource.ts"],"sourcesContent":["import { AssetLoadError, AssetSource } from \"./AssetSource\";\nimport { BlockState, Model, TextureAsset } from \"../../model\";\nimport type { RequestConfig, RequestResponse } from \"../../request\";\nimport { Maybe, prefix } from \"../../util\";\nimport { MinecraftTextureMeta } from \"../../MinecraftTextureMeta\";\nimport { NBTAsset, NBTHelper } from \"../../nbt\";\nimport { ImageLoader } from \"../../image\";\nimport { ListAsset } from \"../../ListAsset\";\nimport { MinecraftAsset } from \"../../MinecraftAsset\";\nimport { AssetKey } from \"../AssetKey\";\nimport { DEFAULT_NAMESPACE } from \"../Assets\";\nimport { RequestError, Requests } from \"../../request\";\nimport { AssetLoader } from \"../AssetLoader\";\nimport { AssetParser } from \"./parser\";\nimport { ResponseParser } from \"./parser\";\nimport { merge } from \"../../util/_internal/merge\";\n\nconst BINARY_TIMEOUT = 60_000;\n\nconst p = prefix(\"HostedAssetSource\");\n\nconst DEFAULT_OPTIONS: HostedAssetSourceOptions = {\n retryDefaults: true\n}\n\n/** Loads assets over HTTP from a Minecraft directory tree rooted at the constructor's URL. */\nexport class HostedAssetSource extends AssetSource {\n\n static readonly MODEL: ResponseParser<Model> = {\n config(request: RequestConfig) {\n },\n parse(response: RequestResponse): Maybe<Model> {\n return response.data as Model;\n }\n }\n static readonly BLOCKSTATE: ResponseParser<BlockState> = {\n config(request: RequestConfig) {\n },\n parse(response: RequestResponse): Maybe<BlockState> {\n return response.data as BlockState;\n }\n }\n static readonly META: ResponseParser<MinecraftTextureMeta> = {\n config(request: RequestConfig) {\n // request.responseType = \"arraybuffer\";\n },\n parse(response: RequestResponse): Maybe<MinecraftTextureMeta> {\n return response.data as MinecraftTextureMeta;\n }\n }\n static readonly NBT: ResponseParser<NBTAsset> = {\n config(request: RequestConfig) {\n request.responseType = \"arraybuffer\";\n },\n parse(response: RequestResponse): Promise<Maybe<NBTAsset>> {\n return NBTHelper.fromBuffer(response.data);\n }\n }\n static readonly IMAGE: ResponseParser<TextureAsset> = {\n config(request: RequestConfig) {\n request.responseType = \"arraybuffer\";\n },\n async parse(response: RequestResponse): Promise<Maybe<TextureAsset>> {\n return await ImageLoader.processResponse(response) as TextureAsset;\n }\n }\n static readonly LIST: ResponseParser<ListAsset> = {\n config(request: RequestConfig) {\n },\n parse(response: RequestResponse): Maybe<ListAsset> {\n return response.data as ListAsset;\n }\n }\n static readonly JSON: ResponseParser<any> = {\n config(request: RequestConfig) {\n },\n parse(response: RequestResponse): Maybe<any> {\n return response.data;\n }\n }\n static readonly BINARY: ResponseParser<BinaryAsset> = {\n config(request: RequestConfig) {\n request.timeout = BINARY_TIMEOUT;\n request.responseType = \"arraybuffer\";\n },\n parse(response: RequestResponse): BinaryAsset {\n return { data: new Uint8Array(response.data as ArrayBuffer) };\n }\n }\n\n static readonly PARSER_MAP: Map<AssetParser, ResponseParser<any>> = new Map<AssetParser, ResponseParser<any>>([\n [AssetParser.MODEL, HostedAssetSource.MODEL],\n [AssetParser.BLOCKSTATE, HostedAssetSource.BLOCKSTATE],\n [AssetParser.META, HostedAssetSource.META],\n [AssetParser.NBT, HostedAssetSource.NBT],\n [AssetParser.IMAGE, HostedAssetSource.IMAGE],\n [AssetParser.LIST, HostedAssetSource.LIST],\n [AssetParser.JSON, HostedAssetSource.JSON],\n [AssetParser.BINARY, HostedAssetSource.BINARY],\n ]);\n\n /** Retries missing assets with the `minecraft` namespace and default root. Other failures reject. */\n public async loadOrRetryWithDefaults<T extends MinecraftAsset>(key: AssetKey, parser: ResponseParser<T>): Promise<Maybe<T>> {\n const direct = await this.load<T>(key, parser);\n if (typeof direct !== \"undefined\") {\n return direct;\n }\n if (key.namespace !== DEFAULT_NAMESPACE) {\n console.info(p, \"Retrying\", key, \"with default namespace\");\n // Try on the same host but with default minecraft: namespace\n const namespaceKey = new AssetKey(DEFAULT_NAMESPACE, key.path, key.assetType, key.type, key.rootType, key.extension, key.root);\n const namespaced = await this.load<T>(namespaceKey, parser);\n if (typeof namespaced !== \"undefined\") {\n return namespaced;\n }\n if ((typeof key.root !== \"undefined\" && key.root !== AssetLoader.ROOT) || (typeof this.root !== \"undefined\" && this.root !== AssetLoader.ROOT)) {\n console.info(p, \"Retrying\", key, \"with default root+namespace\");\n // Try both defaults\n const namespacedRootedKey = new AssetKey(DEFAULT_NAMESPACE, key.path, key.assetType, key.type, key.rootType, key.extension, AssetLoader.ROOT);\n const namespacedRooted = await this.load<T>(namespacedRootedKey, parser);\n if (typeof namespacedRooted !== \"undefined\") {\n return namespacedRooted;\n }\n }\n } else if ((typeof key.root !== \"undefined\" && key.root !== AssetLoader.ROOT) || (typeof this.root !== \"undefined\" && this.root !== AssetLoader.ROOT)) {\n console.info(p, \"Retrying\", key, \"with default root\");\n // Try on default root\n const rootKey = new AssetKey(key.namespace, key.path, key.assetType, key.type, key.rootType, key.extension, AssetLoader.ROOT);\n const rooted = await this.load<T>(rootKey, parser);\n if (typeof rooted !== \"undefined\") {\n return rooted;\n }\n }\n return undefined;\n }\n\n\n protected async load<T extends MinecraftAsset>(key: AssetKey, parser: ResponseParser<T>): Promise<Maybe<T>> {\n console.info(p, \"Loading\", key);\n const url = `${ this.assetBasePath(key) }${ key.type !== undefined ? key.type + '/' : '' }${ key.path }${ key.extension }`;\n console.debug(p, url);\n const request: RequestConfig = { url };\n try {\n parser.config(request);\n let response: RequestResponse;\n try {\n response = await Requests.mcAssetRequest(request);\n } catch (cause) {\n // HTTP 404 is the only request failure that permits source fallback.\n if (cause instanceof RequestError && cause.response?.status === 404) {\n return undefined;\n }\n throw cause;\n }\n if (response.data === undefined) {\n throw new Error(\"Asset response has no data\");\n }\n return await parser.parse(response);\n } catch (cause) {\n throw new AssetLoadError(this, key, request.url, cause);\n }\n }\n\n public assetBasePath(key: AssetKey) {\n return `${ key.root ?? this.root ?? AssetLoader.ROOT }/${ key.rootType !== undefined ? key.rootType + '/' : '' }${ key.namespace !== undefined ? key.namespace + '/' : '' }${ key.assetType !== undefined ? key.assetType + '/' : '' }`;\n }\n\n private readonly _root: string;\n private readonly _options: HostedAssetSourceOptions;\n\n /**\n * Creates a hosted source for {@link AssetLoader.addSource}.\n * Set `options.retryDefaults` to `false` to restrict lookups to the requested namespace and root.\n */\n public constructor(root: string, options?: Partial<HostedAssetSourceOptions>) {\n super();\n this._root = root;\n this._options = merge({}, DEFAULT_OPTIONS, options ?? {});\n }\n\n public get root(): string {\n return this._root;\n }\n\n public get cacheId(): string {\n return `hosted:${this._root}`;\n }\n\n public get options(): HostedAssetSourceOptions {\n return this._options;\n }\n\n public get<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser): Promise<Maybe<T>> {\n const responseParser = HostedAssetSource.PARSER_MAP.get(parser) as ResponseParser<T>;\n if (this.options.retryDefaults && !(key.rootType === undefined && key.namespace === \"minerender-data\")) {\n return this.loadOrRetryWithDefaults(key, responseParser);\n }\n return this.load(key, responseParser);\n }\n\n}\n\ninterface HostedAssetSourceOptions {\n retryDefaults: boolean;\n}\n\n/** Encoded asset bytes loaded without JSON or image decoding. */\nexport interface BinaryAsset extends MinecraftAsset {\n data: Uint8Array;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../src/assets/source/HostedAssetSource.ts"],"sourcesContent":["import { AssetLoadError, AssetSource } from \"./AssetSource\";\nimport { BlockState, Model, TextureAsset } from \"../../model\";\nimport type { RequestConfig, RequestResponse } from \"../../request\";\nimport { Maybe, prefix } from \"../../util\";\nimport { MinecraftTextureMeta } from \"../../MinecraftTextureMeta\";\nimport { NBTAsset, NBTHelper } from \"../../nbt\";\nimport { ImageLoader } from \"../../image\";\nimport { ListAsset } from \"../../ListAsset\";\nimport { MinecraftAsset } from \"../../MinecraftAsset\";\nimport { AssetKey } from \"../AssetKey\";\nimport { DEFAULT_NAMESPACE } from \"../AssetDefaults\";\nimport { RequestError, Requests } from \"../../request\";\nimport { AssetLoader } from \"../AssetLoader\";\nimport { AssetParser } from \"./parser\";\nimport { ResponseParser } from \"./parser\";\nimport { merge } from \"../../util/_internal/merge\";\n\nconst BINARY_TIMEOUT = 60_000;\n\nconst p = prefix(\"HostedAssetSource\");\n\nconst DEFAULT_OPTIONS: HostedAssetSourceOptions = {\n retryDefaults: true\n}\n\n/** Loads assets over HTTP from a Minecraft directory tree rooted at the constructor's URL. */\nexport class HostedAssetSource extends AssetSource {\n\n static readonly MODEL: ResponseParser<Model> = {\n config(request: RequestConfig) {\n },\n parse(response: RequestResponse): Maybe<Model> {\n return response.data as Model;\n }\n }\n static readonly BLOCKSTATE: ResponseParser<BlockState> = {\n config(request: RequestConfig) {\n },\n parse(response: RequestResponse): Maybe<BlockState> {\n return response.data as BlockState;\n }\n }\n static readonly META: ResponseParser<MinecraftTextureMeta> = {\n config(request: RequestConfig) {\n // request.responseType = \"arraybuffer\";\n },\n parse(response: RequestResponse): Maybe<MinecraftTextureMeta> {\n return response.data as MinecraftTextureMeta;\n }\n }\n static readonly NBT: ResponseParser<NBTAsset> = {\n config(request: RequestConfig) {\n request.responseType = \"arraybuffer\";\n },\n parse(response: RequestResponse): Promise<Maybe<NBTAsset>> {\n return NBTHelper.fromBuffer(response.data);\n }\n }\n static readonly IMAGE: ResponseParser<TextureAsset> = {\n config(request: RequestConfig) {\n request.responseType = \"arraybuffer\";\n },\n async parse(response: RequestResponse): Promise<Maybe<TextureAsset>> {\n return await ImageLoader.processResponse(response) as TextureAsset;\n }\n }\n static readonly LIST: ResponseParser<ListAsset> = {\n config(request: RequestConfig) {\n },\n parse(response: RequestResponse): Maybe<ListAsset> {\n return response.data as ListAsset;\n }\n }\n static readonly JSON: ResponseParser<any> = {\n config(request: RequestConfig) {\n },\n parse(response: RequestResponse): Maybe<any> {\n return response.data;\n }\n }\n static readonly BINARY: ResponseParser<BinaryAsset> = {\n config(request: RequestConfig) {\n request.timeout = BINARY_TIMEOUT;\n request.responseType = \"arraybuffer\";\n },\n parse(response: RequestResponse): BinaryAsset {\n return { data: new Uint8Array(response.data as ArrayBuffer) };\n }\n }\n\n static readonly PARSER_MAP: Map<AssetParser, ResponseParser<any>> = new Map<AssetParser, ResponseParser<any>>([\n [AssetParser.MODEL, HostedAssetSource.MODEL],\n [AssetParser.BLOCKSTATE, HostedAssetSource.BLOCKSTATE],\n [AssetParser.META, HostedAssetSource.META],\n [AssetParser.NBT, HostedAssetSource.NBT],\n [AssetParser.IMAGE, HostedAssetSource.IMAGE],\n [AssetParser.LIST, HostedAssetSource.LIST],\n [AssetParser.JSON, HostedAssetSource.JSON],\n [AssetParser.BINARY, HostedAssetSource.BINARY],\n ]);\n\n /** Retries missing assets with the `minecraft` namespace and default root. Other failures reject. */\n public async loadOrRetryWithDefaults<T extends MinecraftAsset>(key: AssetKey, parser: ResponseParser<T>): Promise<Maybe<T>> {\n const direct = await this.load<T>(key, parser);\n if (typeof direct !== \"undefined\") {\n return direct;\n }\n if (key.namespace !== DEFAULT_NAMESPACE) {\n console.info(p, \"Retrying\", key, \"with default namespace\");\n // Try on the same host but with default minecraft: namespace\n const namespaceKey = new AssetKey(DEFAULT_NAMESPACE, key.path, key.assetType, key.type, key.rootType, key.extension, key.root);\n const namespaced = await this.load<T>(namespaceKey, parser);\n if (typeof namespaced !== \"undefined\") {\n return namespaced;\n }\n if ((typeof key.root !== \"undefined\" && key.root !== AssetLoader.ROOT) || (typeof this.root !== \"undefined\" && this.root !== AssetLoader.ROOT)) {\n console.info(p, \"Retrying\", key, \"with default root+namespace\");\n // Try both defaults\n const namespacedRootedKey = new AssetKey(DEFAULT_NAMESPACE, key.path, key.assetType, key.type, key.rootType, key.extension, AssetLoader.ROOT);\n const namespacedRooted = await this.load<T>(namespacedRootedKey, parser);\n if (typeof namespacedRooted !== \"undefined\") {\n return namespacedRooted;\n }\n }\n } else if ((typeof key.root !== \"undefined\" && key.root !== AssetLoader.ROOT) || (typeof this.root !== \"undefined\" && this.root !== AssetLoader.ROOT)) {\n console.info(p, \"Retrying\", key, \"with default root\");\n // Try on default root\n const rootKey = new AssetKey(key.namespace, key.path, key.assetType, key.type, key.rootType, key.extension, AssetLoader.ROOT);\n const rooted = await this.load<T>(rootKey, parser);\n if (typeof rooted !== \"undefined\") {\n return rooted;\n }\n }\n return undefined;\n }\n\n\n protected async load<T extends MinecraftAsset>(key: AssetKey, parser: ResponseParser<T>): Promise<Maybe<T>> {\n console.info(p, \"Loading\", key);\n const url = `${ this.assetBasePath(key) }${ key.type !== undefined ? key.type + '/' : '' }${ key.path }${ key.extension }`;\n console.debug(p, url);\n const request: RequestConfig = { url };\n try {\n parser.config(request);\n let response: RequestResponse;\n try {\n response = await Requests.mcAssetRequest(request);\n } catch (cause) {\n // HTTP 404 is the only request failure that permits source fallback.\n if (cause instanceof RequestError && cause.response?.status === 404) {\n return undefined;\n }\n throw cause;\n }\n if (response.data === undefined) {\n throw new Error(\"Asset response has no data\");\n }\n return await parser.parse(response);\n } catch (cause) {\n throw new AssetLoadError(this, key, request.url, cause);\n }\n }\n\n public assetBasePath(key: AssetKey) {\n return `${ key.root ?? this.root ?? AssetLoader.ROOT }/${ key.rootType !== undefined ? key.rootType + '/' : '' }${ key.namespace !== undefined ? key.namespace + '/' : '' }${ key.assetType !== undefined ? key.assetType + '/' : '' }`;\n }\n\n private readonly _root: string;\n private readonly _options: HostedAssetSourceOptions;\n\n /**\n * Creates a hosted source for {@link AssetLoader.addSource}.\n * Set `options.retryDefaults` to `false` to restrict lookups to the requested namespace and root.\n */\n public constructor(root: string, options?: Partial<HostedAssetSourceOptions>) {\n super();\n this._root = root;\n this._options = merge({}, DEFAULT_OPTIONS, options ?? {});\n }\n\n public get root(): string {\n return this._root;\n }\n\n public get cacheId(): string {\n return `hosted:${this._root}`;\n }\n\n public get options(): HostedAssetSourceOptions {\n return this._options;\n }\n\n public get<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser): Promise<Maybe<T>> {\n const responseParser = HostedAssetSource.PARSER_MAP.get(parser) as ResponseParser<T>;\n if (this.options.retryDefaults && !(key.rootType === undefined && key.namespace === \"minerender-data\")) {\n return this.loadOrRetryWithDefaults(key, responseParser);\n }\n return this.load(key, responseParser);\n }\n\n}\n\ninterface HostedAssetSourceOptions {\n retryDefaults: boolean;\n}\n\n/** Encoded asset bytes loaded without JSON or image decoding. */\nexport interface BinaryAsset extends MinecraftAsset {\n data: Uint8Array;\n}\n"],"mappings":"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","names":[]}
@@ -913,6 +913,9 @@ declare class MinecraftFaceUV {
913
913
  */
914
914
  declare function shutdown(): void;
915
915
 
916
+ declare const DEFAULT_ROOT = "https://assets.mcasset.cloud/1.21.11";
917
+ declare const DEFAULT_NAMESPACE = "minecraft";
918
+
916
919
  /** Runs queued tasks in bounded batches. Idle executors do not keep a timer running. */
917
920
  declare class BatchedExecutor {
918
921
  readonly interval: number;
@@ -1057,8 +1060,6 @@ type MultipartCondition = Record<string, string> | {
1057
1060
  AND: MultipartCondition[];
1058
1061
  };
1059
1062
 
1060
- declare const DEFAULT_ROOT = "https://assets.mcasset.cloud/1.21.11";
1061
- declare const DEFAULT_NAMESPACE = "minecraft";
1062
1063
  /** Convenience accessors for model and blockstate loading. */
1063
1064
  declare class Assets {
1064
1065
  /**
@@ -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":[]}
@@ -1,5 +1,5 @@
1
1
  // src/world/_culling/BlockCulling.ts
2
- import { DEFAULT_NAMESPACE } from "../../assets/Assets.mjs";
2
+ import { DEFAULT_NAMESPACE } from "../../assets/AssetDefaults.mjs";
3
3
  import { MineRenderData } from "../../assets/MineRenderData.mjs";
4
4
  import { CUBE_FACES, CubeFace } from "../../CubeFace.mjs";
5
5
  async function loadBlockCulling(root) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/world/_culling/BlockCulling.ts"],"sourcesContent":["import { DEFAULT_NAMESPACE } from \"../../assets/Assets\";\nimport { MineRenderData, MineRenderDatasets } from \"../../assets/MineRenderData\";\nimport { CUBE_FACES, CubeFace } from \"../../CubeFace\";\nimport type { Block } from \"../../model/block/Block\";\nimport type { Maybe } from \"../../util/util\";\n\nexport type BlockCullingData = MineRenderDatasets[\"blockCulling\"];\nexport type BlockCullingRule = BlockCullingData[\"profiles\"][number];\ntype CullingBlock = Pick<Block, \"type\" | \"properties\">;\n\n/** Loads vanilla's neighbor face rules, if the selected version publishes them. */\nexport async function loadBlockCulling(root?: string): Promise<Maybe<BlockCullingData>> {\n const { manifest } = await MineRenderData.resolve(root);\n return manifest.datasets.blockCulling ? MineRenderData.get(\"blockCulling\", root) : undefined;\n}\n\n/** The rule of a block type, or `undefined` when the block hides no faces this way. */\nexport function blockCullingRule(data: BlockCullingData, type: string): Maybe<BlockCullingRule> {\n if (!type.includes(\":\")) type = `${DEFAULT_NAMESPACE}:${type}`;\n return Object.prototype.hasOwnProperty.call(data.blocks, type) ? data.profiles[data.blocks[type]] : undefined;\n}\n\n/** `face` indexes CUBE_FACES. Occlusion by opaque cubes is a separate check. */\nexport function skipsBlockFace(data: BlockCullingData, rule: BlockCullingRule, block: CullingBlock, neighbor: CullingBlock, face: number): boolean {\n const type = block.type.includes(\":\") ? block.type : `${DEFAULT_NAMESPACE}:${block.type}`;\n const other = neighbor.type.includes(\":\") ? neighbor.type : `${DEFAULT_NAMESPACE}:${neighbor.type}`;\n const same = type === other;\n const vertical = CUBE_FACES[face] === CubeFace.UP || CUBE_FACES[face] === CubeFace.DOWN;\n switch (rule.type) {\n case \"same_block\": return same;\n case \"same_block_vertical\": return same && vertical;\n case \"connected\": {\n if (vertical) return same;\n const group = rule.group ? data.groups?.[rule.group] : undefined;\n return (same || !!group?.includes(type) && group.includes(other))\n && String(block.properties?.[CUBE_FACES[face]]) === \"true\"\n && String(neighbor.properties?.[CUBE_FACES[face ^ 1]]) === \"true\";\n }\n default: return false;\n }\n}\n"],"mappings":";AAAA,SAAS,yBAAyB;AAClC,SAAS,sBAA0C;AACnD,SAAS,YAAY,gBAAgB;AASrC,eAAsB,iBAAiB,MAAiD;AACpF,QAAM,EAAE,SAAS,IAAI,MAAM,eAAe,QAAQ,IAAI;AACtD,SAAO,SAAS,SAAS,eAAe,eAAe,IAAI,gBAAgB,IAAI,IAAI;AACvF;AAGO,SAAS,iBAAiB,MAAwB,MAAuC;AAC5F,MAAI,CAAC,KAAK,SAAS,GAAG,EAAG,QAAO,GAAG,iBAAiB,IAAI,IAAI;AAC5D,SAAO,OAAO,UAAU,eAAe,KAAK,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,KAAK,OAAO,IAAI,CAAC,IAAI;AACxG;AAGO,SAAS,eAAe,MAAwB,MAAwB,OAAqB,UAAwB,MAAuB;AAC/I,QAAM,OAAO,MAAM,KAAK,SAAS,GAAG,IAAI,MAAM,OAAO,GAAG,iBAAiB,IAAI,MAAM,IAAI;AACvF,QAAM,QAAQ,SAAS,KAAK,SAAS,GAAG,IAAI,SAAS,OAAO,GAAG,iBAAiB,IAAI,SAAS,IAAI;AACjG,QAAM,OAAO,SAAS;AACtB,QAAM,WAAW,WAAW,IAAI,MAAM,SAAS,MAAM,WAAW,IAAI,MAAM,SAAS;AACnF,UAAQ,KAAK,MAAM;AAAA,IACf,KAAK;AAAc,aAAO;AAAA,IAC1B,KAAK;AAAuB,aAAO,QAAQ;AAAA,IAC3C,KAAK,aAAa;AACd,UAAI,SAAU,QAAO;AACrB,YAAM,QAAQ,KAAK,QAAQ,KAAK,SAAS,KAAK,KAAK,IAAI;AACvD,cAAQ,QAAQ,CAAC,CAAC,OAAO,SAAS,IAAI,KAAK,MAAM,SAAS,KAAK,MACxD,OAAO,MAAM,aAAa,WAAW,IAAI,CAAC,CAAC,MAAM,UACjD,OAAO,SAAS,aAAa,WAAW,OAAO,CAAC,CAAC,CAAC,MAAM;AAAA,IACnE;AAAA,IACA;AAAS,aAAO;AAAA,EACpB;AACJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../src/world/_culling/BlockCulling.ts"],"sourcesContent":["import { DEFAULT_NAMESPACE } from \"../../assets/AssetDefaults\";\nimport { MineRenderData, MineRenderDatasets } from \"../../assets/MineRenderData\";\nimport { CUBE_FACES, CubeFace } from \"../../CubeFace\";\nimport type { Block } from \"../../model/block/Block\";\nimport type { Maybe } from \"../../util/util\";\n\nexport type BlockCullingData = MineRenderDatasets[\"blockCulling\"];\nexport type BlockCullingRule = BlockCullingData[\"profiles\"][number];\ntype CullingBlock = Pick<Block, \"type\" | \"properties\">;\n\n/** Loads vanilla's neighbor face rules, if the selected version publishes them. */\nexport async function loadBlockCulling(root?: string): Promise<Maybe<BlockCullingData>> {\n const { manifest } = await MineRenderData.resolve(root);\n return manifest.datasets.blockCulling ? MineRenderData.get(\"blockCulling\", root) : undefined;\n}\n\n/** The rule of a block type, or `undefined` when the block hides no faces this way. */\nexport function blockCullingRule(data: BlockCullingData, type: string): Maybe<BlockCullingRule> {\n if (!type.includes(\":\")) type = `${DEFAULT_NAMESPACE}:${type}`;\n return Object.prototype.hasOwnProperty.call(data.blocks, type) ? data.profiles[data.blocks[type]] : undefined;\n}\n\n/** `face` indexes CUBE_FACES. Occlusion by opaque cubes is a separate check. */\nexport function skipsBlockFace(data: BlockCullingData, rule: BlockCullingRule, block: CullingBlock, neighbor: CullingBlock, face: number): boolean {\n const type = block.type.includes(\":\") ? block.type : `${DEFAULT_NAMESPACE}:${block.type}`;\n const other = neighbor.type.includes(\":\") ? neighbor.type : `${DEFAULT_NAMESPACE}:${neighbor.type}`;\n const same = type === other;\n const vertical = CUBE_FACES[face] === CubeFace.UP || CUBE_FACES[face] === CubeFace.DOWN;\n switch (rule.type) {\n case \"same_block\": return same;\n case \"same_block_vertical\": return same && vertical;\n case \"connected\": {\n if (vertical) return same;\n const group = rule.group ? data.groups?.[rule.group] : undefined;\n return (same || !!group?.includes(type) && group.includes(other))\n && String(block.properties?.[CUBE_FACES[face]]) === \"true\"\n && String(neighbor.properties?.[CUBE_FACES[face ^ 1]]) === \"true\";\n }\n default: return false;\n }\n}\n"],"mappings":";AAAA,SAAS,yBAAyB;AAClC,SAAS,sBAA0C;AACnD,SAAS,YAAY,gBAAgB;AASrC,eAAsB,iBAAiB,MAAiD;AACpF,QAAM,EAAE,SAAS,IAAI,MAAM,eAAe,QAAQ,IAAI;AACtD,SAAO,SAAS,SAAS,eAAe,eAAe,IAAI,gBAAgB,IAAI,IAAI;AACvF;AAGO,SAAS,iBAAiB,MAAwB,MAAuC;AAC5F,MAAI,CAAC,KAAK,SAAS,GAAG,EAAG,QAAO,GAAG,iBAAiB,IAAI,IAAI;AAC5D,SAAO,OAAO,UAAU,eAAe,KAAK,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,KAAK,OAAO,IAAI,CAAC,IAAI;AACxG;AAGO,SAAS,eAAe,MAAwB,MAAwB,OAAqB,UAAwB,MAAuB;AAC/I,QAAM,OAAO,MAAM,KAAK,SAAS,GAAG,IAAI,MAAM,OAAO,GAAG,iBAAiB,IAAI,MAAM,IAAI;AACvF,QAAM,QAAQ,SAAS,KAAK,SAAS,GAAG,IAAI,SAAS,OAAO,GAAG,iBAAiB,IAAI,SAAS,IAAI;AACjG,QAAM,OAAO,SAAS;AACtB,QAAM,WAAW,WAAW,IAAI,MAAM,SAAS,MAAM,WAAW,IAAI,MAAM,SAAS;AACnF,UAAQ,KAAK,MAAM;AAAA,IACf,KAAK;AAAc,aAAO;AAAA,IAC1B,KAAK;AAAuB,aAAO,QAAQ;AAAA,IAC3C,KAAK,aAAa;AACd,UAAI,SAAU,QAAO;AACrB,YAAM,QAAQ,KAAK,QAAQ,KAAK,SAAS,KAAK,KAAK,IAAI;AACvD,cAAQ,QAAQ,CAAC,CAAC,OAAO,SAAS,IAAI,KAAK,MAAM,SAAS,KAAK,MACxD,OAAO,MAAM,aAAa,WAAW,IAAI,CAAC,CAAC,MAAM,UACjD,OAAO,SAAS,aAAa,WAAW,OAAO,CAAC,CAAC,CAAC,MAAM;AAAA,IACnE;AAAA,IACA;AAAS,aAAO;AAAA,EACpB;AACJ;","names":[]}
@@ -913,6 +913,9 @@ declare class MinecraftFaceUV {
913
913
  */
914
914
  declare function shutdown(): void;
915
915
 
916
+ declare const DEFAULT_ROOT = "https://assets.mcasset.cloud/1.21.11";
917
+ declare const DEFAULT_NAMESPACE = "minecraft";
918
+
916
919
  /** Runs queued tasks in bounded batches. Idle executors do not keep a timer running. */
917
920
  declare class BatchedExecutor {
918
921
  readonly interval: number;
@@ -1057,8 +1060,6 @@ type MultipartCondition = Record<string, string> | {
1057
1060
  AND: MultipartCondition[];
1058
1061
  };
1059
1062
 
1060
- declare const DEFAULT_ROOT = "https://assets.mcasset.cloud/1.21.11";
1061
- declare const DEFAULT_NAMESPACE = "minecraft";
1062
1063
  /** Convenience accessors for model and blockstate loading. */
1063
1064
  declare class Assets {
1064
1065
  /**