minerender 2.1.0-alpha.12 → 2.1.0-alpha.14

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.
@@ -14,7 +14,7 @@ interface AnimatorFunction {
14
14
  }
15
15
 
16
16
  declare enum Axis {
17
- X = "X",
17
+ X = "x",
18
18
  Y = "y",
19
19
  Z = "z"
20
20
  }
@@ -670,6 +670,11 @@ declare class AssetLoader {
670
670
  static getAll<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser | string): Promise<T[]>;
671
671
  /** Returns the first defined result in source-priority order, without merging assets. */
672
672
  static get<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser | string): Promise<Maybe<T>>;
673
+ /** Tries each path within a source before considering lower-priority sources. */
674
+ static getFirst<T extends MinecraftAsset>(keys: readonly AssetKey[], parser: AssetParser | string): Promise<Maybe<{
675
+ key: AssetKey;
676
+ asset: T;
677
+ }>>;
673
678
  }
674
679
 
675
680
  interface BlockState extends MinecraftAsset {
@@ -695,7 +700,7 @@ interface MultipartCondition {
695
700
  [key: string]: string;
696
701
  }
697
702
 
698
- declare const DEFAULT_ROOT = "https://assets.mcasset.cloud/1.17.1";
703
+ declare const DEFAULT_ROOT = "https://assets.mcasset.cloud/1.21.11";
699
704
  declare const DEFAULT_NAMESPACE = "minecraft";
700
705
  declare class Assets {
701
706
  /**
@@ -760,6 +765,8 @@ declare class Models {
760
765
  private static get PERSISTENT_CACHE();
761
766
  static getItemList(): Promise<string[]>;
762
767
  static loadAndMerge(key: AssetKey): Promise<Maybe<Model>>;
768
+ private static getItemModel;
769
+ private static defaultItemModel;
763
770
  static getRaw(key: AssetKey): Promise<Maybe<Model>>;
764
771
  static getMerged(key: AssetKey): Promise<Maybe<Model>>;
765
772
  static get(key: AssetKey): Promise<Maybe<Model>>;
@@ -14,7 +14,7 @@ interface AnimatorFunction {
14
14
  }
15
15
 
16
16
  declare enum Axis {
17
- X = "X",
17
+ X = "x",
18
18
  Y = "y",
19
19
  Z = "z"
20
20
  }
@@ -670,6 +670,11 @@ declare class AssetLoader {
670
670
  static getAll<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser | string): Promise<T[]>;
671
671
  /** Returns the first defined result in source-priority order, without merging assets. */
672
672
  static get<T extends MinecraftAsset>(key: AssetKey, parser: AssetParser | string): Promise<Maybe<T>>;
673
+ /** Tries each path within a source before considering lower-priority sources. */
674
+ static getFirst<T extends MinecraftAsset>(keys: readonly AssetKey[], parser: AssetParser | string): Promise<Maybe<{
675
+ key: AssetKey;
676
+ asset: T;
677
+ }>>;
673
678
  }
674
679
 
675
680
  interface BlockState extends MinecraftAsset {
@@ -695,7 +700,7 @@ interface MultipartCondition {
695
700
  [key: string]: string;
696
701
  }
697
702
 
698
- declare const DEFAULT_ROOT = "https://assets.mcasset.cloud/1.17.1";
703
+ declare const DEFAULT_ROOT = "https://assets.mcasset.cloud/1.21.11";
699
704
  declare const DEFAULT_NAMESPACE = "minecraft";
700
705
  declare class Assets {
701
706
  /**
@@ -760,6 +765,8 @@ declare class Models {
760
765
  private static get PERSISTENT_CACHE();
761
766
  static getItemList(): Promise<string[]>;
762
767
  static loadAndMerge(key: AssetKey): Promise<Maybe<Model>>;
768
+ private static getItemModel;
769
+ private static defaultItemModel;
763
770
  static getRaw(key: AssetKey): Promise<Maybe<Model>>;
764
771
  static getMerged(key: AssetKey): Promise<Maybe<Model>>;
765
772
  static get(key: AssetKey): Promise<Maybe<Model>>;
@@ -434,7 +434,7 @@ registerBrowserEnv();
434
434
  // src/Axis.ts
435
435
  var import_three = require("three");
436
436
  var Axis = /* @__PURE__ */ ((Axis3) => {
437
- Axis3["X"] = "X";
437
+ Axis3["X"] = "x";
438
438
  Axis3["Y"] = "y";
439
439
  Axis3["Z"] = "z";
440
440
  return Axis3;
@@ -442,7 +442,7 @@ var Axis = /* @__PURE__ */ ((Axis3) => {
442
442
  var AXES = Object.values(Axis);
443
443
  function axisToVec3(axis) {
444
444
  switch (axis) {
445
- case "X" /* X */:
445
+ case "x" /* X */:
446
446
  return new import_three.Vector3(1, 0, 0);
447
447
  case "y" /* Y */:
448
448
  return new import_three.Vector3(0, 1, 0);
@@ -1295,7 +1295,7 @@ var AssetKey = class _AssetKey extends BasicAssetKey {
1295
1295
  }
1296
1296
  toString() {
1297
1297
  let a = [
1298
- typeof this.root !== "undefined" || AssetLoader.ROOT !== DEFAULT_ROOT ? this.root ?? AssetLoader.ROOT : "__root__",
1298
+ this.root ?? AssetLoader.ROOT,
1299
1299
  this.rootType ?? "__rootType__",
1300
1300
  this.assetType ?? "__assetType__",
1301
1301
  this.type ?? "__type__",
@@ -1332,9 +1332,9 @@ var ModelMerger = class {
1332
1332
  const models = await this.collectAllParents(model);
1333
1333
  let merged = {};
1334
1334
  for (let parentModel of models) {
1335
- merged = (0, import_ts_deepmerge.default)(merged, parentModel);
1335
+ merged = import_ts_deepmerge.default.withOptions({ mergeArrays: false }, merged, parentModel);
1336
1336
  }
1337
- merged = (0, import_ts_deepmerge.default)(merged, model);
1337
+ merged = import_ts_deepmerge.default.withOptions({ mergeArrays: false }, merged, model);
1338
1338
  merged.hierarchy = models.map((m) => m.parent).filter((p12) => `${p12}`);
1339
1339
  merged.hierarchy.push(`${merged.parent}`);
1340
1340
  return merged;
@@ -1345,6 +1345,7 @@ var ModelMerger = class {
1345
1345
  }
1346
1346
  const models = [];
1347
1347
  const parentKey = AssetKey.parse("models", model.parent);
1348
+ parentKey.root = model.key?.root;
1348
1349
  const parentModel = await Models.getRaw(parentKey);
1349
1350
  if (parentModel) {
1350
1351
  models.unshift(parentModel);
@@ -1374,26 +1375,58 @@ var Models = class _Models {
1374
1375
  return this._persistentCache ?? (this._persistentCache = PersistentCache.open("minerender-models"));
1375
1376
  }
1376
1377
  static async getItemList() {
1377
- const key = new AssetKey(
1378
- DEFAULT_NAMESPACE,
1379
- "_list",
1380
- "models",
1381
- "item",
1382
- "assets",
1383
- ".json",
1384
- DEFAULT_ROOT
1385
- );
1386
- return Caching.listAssetCache.get(key.serialize(), () => {
1387
- return AssetLoader.get(key, "list" /* LIST */);
1378
+ const key = new AssetKey(DEFAULT_NAMESPACE, "_list", "items");
1379
+ const legacyKey = new AssetKey(DEFAULT_NAMESPACE, "_list", "models", "item");
1380
+ return Caching.listAssetCache.get(key.serialize(), async () => {
1381
+ return (await AssetLoader.getFirst([key, legacyKey], "list" /* LIST */))?.asset;
1388
1382
  }).then((r) => r?.files ?? []);
1389
1383
  }
1390
1384
  static async loadAndMerge(key) {
1391
- const model = await this.getRaw(key);
1385
+ const model = key.type === "item" ? await this.getItemModel(key) : await this.getRaw(key);
1392
1386
  if (!model) {
1393
1387
  return void 0;
1394
1388
  }
1395
1389
  return ModelMerger.mergeWithParents(model);
1396
1390
  }
1391
+ static async getItemModel(key) {
1392
+ const itemKey = new AssetKey(key.namespace, key.path, "items", void 0, key.rootType, ".json", key.root);
1393
+ const model = await this.PERSISTENT_CACHE.getOrLoad(itemKey.serialize(), async () => {
1394
+ const result = await AssetLoader.getFirst([itemKey, key], "json" /* JSON */);
1395
+ if (!result) return void 0;
1396
+ if (result.key.assetType !== "items") return { ...result.asset, key };
1397
+ const reference = this.defaultItemModel(result.asset.model, key);
1398
+ const modelKey = AssetKey.parse("models", reference);
1399
+ modelKey.root = key.root;
1400
+ const model2 = await this.getRaw(modelKey);
1401
+ if (!model2) throw new Error(`Item ${key.toNamespacedString()} references missing model ${reference}`);
1402
+ return model2;
1403
+ });
1404
+ return model ? { ...model, key: Object.assign(new AssetKey("", ""), model.key) } : void 0;
1405
+ }
1406
+ // Item previews use the GUI context, false conditions, and zero numeric properties.
1407
+ static defaultItemModel(node, key) {
1408
+ if (!node || typeof node.type !== "string") {
1409
+ throw new Error(`Unsupported item model definition for ${key.toNamespacedString()}`);
1410
+ }
1411
+ switch (node.type.replace(/^minecraft:/, "")) {
1412
+ case "model":
1413
+ if (typeof node.model === "string" && node.model) return node.model;
1414
+ break;
1415
+ case "condition":
1416
+ return this.defaultItemModel(node.on_false, key);
1417
+ case "select": {
1418
+ const selected = node.property?.replace(/^minecraft:/, "") === "display_context" ? node.cases?.find((entry) => Array.isArray(entry.when) ? entry.when.includes("gui") : entry.when === "gui")?.model : void 0;
1419
+ return this.defaultItemModel(selected ?? node.fallback, key);
1420
+ }
1421
+ case "range_dispatch": {
1422
+ const selected = node.entries?.reduce((match, entry) => {
1423
+ return entry.threshold <= 0 && (!match || entry.threshold >= match.threshold) ? entry : match;
1424
+ }, void 0);
1425
+ return this.defaultItemModel(selected?.model ?? node.fallback, key);
1426
+ }
1427
+ }
1428
+ throw new Error(`Unsupported item model ${node?.type ?? "definition"} for ${key.toNamespacedString()}`);
1429
+ }
1397
1430
  static async getRaw(key) {
1398
1431
  if (!key.assetType) {
1399
1432
  key.assetType = "models";
@@ -1500,7 +1533,7 @@ var DefaultBlockStates = class {
1500
1533
  };
1501
1534
 
1502
1535
  // src/assets/Assets.ts
1503
- var DEFAULT_ROOT = "https://assets.mcasset.cloud/1.17.1";
1536
+ var DEFAULT_ROOT = "https://assets.mcasset.cloud/1.21.11";
1504
1537
  var DEFAULT_NAMESPACE = "minecraft";
1505
1538
  var Assets = class {
1506
1539
  /**
@@ -1561,7 +1594,7 @@ function applyElementRotation(rotation, geometry) {
1561
1594
  const origin = new import_three7.Vector3(rotation.origin[0], rotation.origin[1], rotation.origin[2]);
1562
1595
  geometry.translate(-origin.x, -origin.y, -origin.z);
1563
1596
  switch (rotation.axis) {
1564
- case "X" /* X */:
1597
+ case "x" /* X */:
1565
1598
  geometry.rotateX(toRadians(rotation.angle));
1566
1599
  break;
1567
1600
  case "y" /* Y */:
@@ -1592,7 +1625,7 @@ function applyModelPartRotation(modelPart, geometry) {
1592
1625
  }
1593
1626
  function applyGenericRotation(axis, rotation, obj) {
1594
1627
  switch (axis) {
1595
- case "X" /* X */:
1628
+ case "x" /* X */:
1596
1629
  obj.rotateOnAxis(new import_three7.Vector3(1, 0, 0), toRadians(rotation));
1597
1630
  break;
1598
1631
  case "y" /* Y */:
@@ -1918,11 +1951,29 @@ var _AssetLoader = class _AssetLoader {
1918
1951
  }
1919
1952
  /** Returns the first defined result in source-priority order, without merging assets. */
1920
1953
  static async get(key, parser) {
1954
+ const keys = [key];
1955
+ if (key.rootType === "data" && (key.assetType === "structure" || key.assetType === "structures")) {
1956
+ keys.push(new AssetKey(
1957
+ key.namespace,
1958
+ key.path,
1959
+ key.assetType === "structure" ? "structures" : "structure",
1960
+ key.type,
1961
+ key.rootType,
1962
+ key.extension,
1963
+ key.root
1964
+ ));
1965
+ }
1966
+ return (await this.getFirst(keys, parser))?.asset;
1967
+ }
1968
+ /** Tries each path within a source before considering lower-priority sources. */
1969
+ static async getFirst(keys, parser) {
1921
1970
  const sources = [...this._SOURCES];
1922
1971
  for (const source of sources) {
1923
- const result = await source.source.get(key, parser);
1924
- if (result !== void 0) {
1925
- return result;
1972
+ for (const key of keys) {
1973
+ const result = await source.source.get(key, parser);
1974
+ if (result !== void 0) {
1975
+ return { key, asset: result };
1976
+ }
1926
1977
  }
1927
1978
  }
1928
1979
  return void 0;
@@ -2452,17 +2503,13 @@ var UVMapper = class {
2452
2503
  this.setCubeFaceUvInArray(uv, faceIndex * 4, [0, 1, 8 / size, (size - 8) / size]);
2453
2504
  continue;
2454
2505
  }
2506
+ if (!face.texture) continue;
2455
2507
  if (!face.uv) {
2456
2508
  face.uv = this.getFallbackUv(element, faceName);
2457
2509
  }
2458
- let faceTexture = face.texture;
2459
- let texPosition;
2460
- let texSize;
2461
- if (faceTexture) {
2462
- faceTexture = faceTexture.substr(1);
2463
- texPosition = positions[faceTexture] || [0, 0];
2464
- texSize = sizes[faceTexture] || [16, 16];
2465
- }
2510
+ const faceTexture = face.texture.substr(1);
2511
+ const texPosition = positions[faceTexture] || [0, 0];
2512
+ const texSize = sizes[faceTexture] || [16, 16];
2466
2513
  let texPosV = new import_three8.Vector2(texPosition[0], texPosition[1]);
2467
2514
  const [tl, tr, bl, br] = this.expandAndRotateMcUvs(face.uv, face.rotation, texSize[0], texSize[1]);
2468
2515
  tl.add(texPosV);