minerender 2.1.0-alpha.10 → 2.1.0-alpha.12

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.
@@ -32,8 +32,8 @@ var require_dist = __commonJS({
32
32
  __assign = Object.assign || function(t) {
33
33
  for (var s, i = 1, n = arguments.length; i < n; i++) {
34
34
  s = arguments[i];
35
- for (var p13 in s) if (Object.prototype.hasOwnProperty.call(s, p13))
36
- t[p13] = s[p13];
35
+ for (var p12 in s) if (Object.prototype.hasOwnProperty.call(s, p12))
36
+ t[p12] = s[p12];
37
37
  }
38
38
  return t;
39
39
  };
@@ -705,10 +705,10 @@ var WrappedImage = class {
705
705
  return this.animated ? this.width : this.height;
706
706
  }
707
707
  get frameCount() {
708
- return this.height / this.width;
708
+ return this.height / this.frameHeight;
709
709
  }
710
710
  getFrameY(frame) {
711
- return this.height / this.frameCount * Math.max(0, Math.min(this.frameCount, frame));
711
+ return this.frameHeight * Math.max(0, Math.min(this.frameCount - 1, frame));
712
712
  }
713
713
  getSectionData(sx, sy, sw, sh) {
714
714
  return this.dta.data.getImageData(sx, sy, sw, sh);
@@ -718,7 +718,7 @@ var WrappedImage = class {
718
718
  }
719
719
  getFrameSectionData(frame) {
720
720
  const y = this.getFrameY(frame);
721
- return this.getSectionData(0, y, this.width, this.width + y);
721
+ return this.getSectionData(0, y, this.frameWidth, this.frameHeight);
722
722
  }
723
723
  };
724
724
 
@@ -1152,12 +1152,12 @@ var AssetKey = class _AssetKey extends BasicAssetKey {
1152
1152
  return a.join("/");
1153
1153
  }
1154
1154
  getFullPath() {
1155
- let p13 = [];
1155
+ let p12 = [];
1156
1156
  if (this.type) {
1157
- p13.push(this.type);
1157
+ p12.push(this.type);
1158
1158
  }
1159
- p13.push(this.path);
1160
- return p13.join("/");
1159
+ p12.push(this.path);
1160
+ return p12.join("/");
1161
1161
  }
1162
1162
  toNamespacedString() {
1163
1163
  return this.namespace + ":" + this.getFullPath();
@@ -1182,7 +1182,7 @@ var ModelMerger = class {
1182
1182
  merged = (0, import_ts_deepmerge.default)(merged, parentModel);
1183
1183
  }
1184
1184
  merged = (0, import_ts_deepmerge.default)(merged, model);
1185
- merged.hierarchy = models.map((m) => m.parent).filter((p13) => `${p13}`);
1185
+ merged.hierarchy = models.map((m) => m.parent).filter((p12) => `${p12}`);
1186
1186
  merged.hierarchy.push(`${merged.parent}`);
1187
1187
  return merged;
1188
1188
  }
@@ -1369,6 +1369,16 @@ var AssetSource = class {
1369
1369
  constructor() {
1370
1370
  }
1371
1371
  };
1372
+ var AssetLoadError = class extends Error {
1373
+ constructor(source, key, path, cause) {
1374
+ super(`Failed to load ${key.toNamespacedString()} from ${path}${cause instanceof Error ? `: ${cause.message}` : ""}`);
1375
+ this.source = source;
1376
+ this.key = key;
1377
+ this.path = path;
1378
+ this.cause = cause;
1379
+ this.name = "AssetLoadError";
1380
+ }
1381
+ };
1372
1382
 
1373
1383
  // src/util/BatchedExecutor.ts
1374
1384
  var BatchedExecutor = class {
@@ -1623,31 +1633,25 @@ var HostedAssetSource = class _HostedAssetSource extends AssetSource {
1623
1633
  console.info(p3, "Loading", key);
1624
1634
  const url = `${this.assetBasePath(key)}${key.type !== void 0 ? key.type + "/" : ""}${key.path}${key.extension}`;
1625
1635
  console.debug(p3, url);
1626
- let req = {
1627
- url
1628
- };
1629
- parser.config(req);
1630
- return await Requests.mcAssetRequest(req).then((response) => {
1631
- if (response && response.data) {
1632
- try {
1633
- return parser.parse(response);
1634
- } catch (e) {
1635
- console.warn("Parser failed to process response", response, e);
1636
- throw e;
1637
- }
1638
- }
1639
- return void 0;
1640
- }).catch((err) => {
1641
- if (err.response) {
1642
- let response = err.response;
1643
- if (response.status === 404) {
1644
- console.debug(p3, key, "not found");
1636
+ const request = { url };
1637
+ try {
1638
+ parser.config(request);
1639
+ let response;
1640
+ try {
1641
+ response = await Requests.mcAssetRequest(request);
1642
+ } catch (cause) {
1643
+ if (cause instanceof RequestError && cause.response?.status === 404) {
1645
1644
  return void 0;
1646
1645
  }
1646
+ throw cause;
1647
1647
  }
1648
- console.debug(p3, "Failed to load", key, err?.message);
1649
- return void 0;
1650
- });
1648
+ if (response.data === void 0) {
1649
+ throw new Error("Asset response has no data");
1650
+ }
1651
+ return await parser.parse(response);
1652
+ } catch (cause) {
1653
+ throw new AssetLoadError(this, key, request.url, cause);
1654
+ }
1651
1655
  }
1652
1656
  assetBasePath(key) {
1653
1657
  return `${key.root ?? this.root ?? AssetLoader.ROOT}/${key.rootType !== void 0 ? key.rootType + "/" : ""}${key.namespace !== void 0 ? key.namespace + "/" : ""}${key.assetType !== void 0 ? key.assetType + "/" : ""}`;
@@ -1693,7 +1697,6 @@ var BrowserArchiveProxy = class {
1693
1697
  };
1694
1698
 
1695
1699
  // src/assets/source/archive/ArchiveAssetSource.ts
1696
- var p4 = prefix("ArchiveAssetSource");
1697
1700
  var ArchiveAssetSource = class _ArchiveAssetSource extends AssetSource {
1698
1701
  constructor(archiveProxy) {
1699
1702
  super();
@@ -1712,74 +1715,31 @@ var ArchiveAssetSource = class _ArchiveAssetSource extends AssetSource {
1712
1715
  }
1713
1716
  async get(key, parser) {
1714
1717
  const responseParser = HostedAssetSource.PARSER_MAP.get(parser);
1715
- console.log("ArchiveAssetSource.get", key, parser);
1716
- let entries = await this.getEntries();
1717
- const path = `${this.assetBasePath(key)}${key.type !== void 0 ? key.type + "/" : ""}${key.path}${key.extension}`;
1718
- console.log(path);
1719
- const entry = await this.getEntry(path);
1720
- console.log(entry);
1721
- if (!entry) {
1722
- return void 0;
1723
- }
1724
- let blob = await entry.getData();
1725
- const url = URL.createObjectURL(blob);
1726
- console.log(url);
1727
- let req = {
1728
- url
1729
- };
1730
- responseParser.config(req);
1731
- return Requests.genericRequest(req).then((response) => {
1732
- if (response && response.data) {
1733
- try {
1734
- return responseParser.parse(response);
1735
- } catch (e) {
1736
- console.warn("Parser failed to process response", response, e);
1737
- throw e;
1738
- }
1739
- }
1740
- return void 0;
1741
- }).catch((err) => {
1742
- if (err.response) {
1743
- let response = err.response;
1744
- if (response.status === 404) {
1745
- console.debug(p4, key, "not found");
1746
- return void 0;
1747
- }
1748
- }
1749
- console.debug(p4, "Failed to load", key, err?.message);
1750
- return void 0;
1751
- });
1718
+ return this.load(key, responseParser);
1752
1719
  }
1753
- //TODO: abstract this
1754
1720
  async load(key, parser) {
1755
- console.info(p4, "Loading", key);
1756
- const url = `${this.assetBasePath(key)}${key.type !== void 0 ? key.type + "/" : ""}${key.path}${key.extension}`;
1757
- console.debug(p4, url);
1758
- let req = {
1759
- url
1760
- };
1761
- parser.config(req);
1762
- return await Requests.genericRequest(req).then((response) => {
1763
- if (response && response.data) {
1764
- try {
1765
- return parser.parse(response);
1766
- } catch (e) {
1767
- console.warn("Parser failed to process response", response, e);
1768
- throw e;
1769
- }
1721
+ const path = `${this.assetBasePath(key)}${key.type !== void 0 ? key.type + "/" : ""}${key.path}${key.extension}`;
1722
+ let url;
1723
+ try {
1724
+ const entry = await this.getEntry(path);
1725
+ if (!entry) {
1726
+ return void 0;
1770
1727
  }
1771
- return void 0;
1772
- }).catch((err) => {
1773
- if (err.response) {
1774
- let response = err.response;
1775
- if (response.status === 404) {
1776
- console.debug(p4, key, "not found");
1777
- return void 0;
1778
- }
1728
+ url = URL.createObjectURL(await entry.getData());
1729
+ const request = { url };
1730
+ parser.config(request);
1731
+ const response = await Requests.genericRequest(request);
1732
+ if (response.data === void 0) {
1733
+ throw new Error("Asset response has no data");
1779
1734
  }
1780
- console.debug(p4, "Failed to load", key, err?.message);
1781
- return void 0;
1782
- });
1735
+ return await parser.parse(response);
1736
+ } catch (cause) {
1737
+ throw new AssetLoadError(this, key, path, cause);
1738
+ } finally {
1739
+ if (url !== void 0) {
1740
+ URL.revokeObjectURL(url);
1741
+ }
1742
+ }
1783
1743
  }
1784
1744
  assetBasePath(key) {
1785
1745
  return `${key.rootType !== void 0 ? key.rootType + "/" : ""}${key.namespace !== void 0 ? key.namespace + "/" : ""}${key.assetType !== void 0 ? key.assetType + "/" : ""}`;
@@ -1787,7 +1747,7 @@ var ArchiveAssetSource = class _ArchiveAssetSource extends AssetSource {
1787
1747
  };
1788
1748
 
1789
1749
  // src/assets/AssetLoader.ts
1790
- var p5 = prefix("AssetLoader");
1750
+ var p4 = prefix("AssetLoader");
1791
1751
  var AssetLoader = class {
1792
1752
  static {
1793
1753
  this.ROOT = DEFAULT_ROOT;
@@ -1799,11 +1759,11 @@ var AssetLoader = class {
1799
1759
  if (override) {
1800
1760
  const existing = this.removeSource(key);
1801
1761
  if (existing) {
1802
- console.log(p5, "Removed existing AssetSource", key);
1762
+ console.log(p4, "Removed existing AssetSource", key);
1803
1763
  }
1804
1764
  }
1805
1765
  this._SOURCES.unshift({ key, source });
1806
- console.log(p5, "Added AssetSource", key);
1766
+ console.log(p4, "Added AssetSource", key);
1807
1767
  }
1808
1768
  static removeSource(key) {
1809
1769
  const index = this._SOURCES.findIndex((s) => s.key === key);
@@ -2067,7 +2027,7 @@ var ModelGenerator = class {
2067
2027
  };
2068
2028
 
2069
2029
  // src/UVMapper.ts
2070
- var p6 = prefix("UVMapper");
2030
+ var p5 = prefix("UVMapper");
2071
2031
  var DEFAULT_UV = [0, 0, 16, 16];
2072
2032
  var X = 0;
2073
2033
  var Y = 1;
@@ -2244,7 +2204,7 @@ var UVMapper = class {
2244
2204
  const metaMap = {};
2245
2205
  const model = { ...originalModel };
2246
2206
  const isItemModel = !("elements" in model);
2247
- console.debug(p6, "Creating Atlas for", model.key);
2207
+ console.debug(p5, "Creating Atlas for", model.key);
2248
2208
  if (model.textures) {
2249
2209
  const promises = [];
2250
2210
  const uniqueTextureNames = [];
@@ -2258,7 +2218,7 @@ var UVMapper = class {
2258
2218
  const assetKey = AssetKey.parse("textures", textureValue, model.key);
2259
2219
  promises.push(ModelTextures.get(assetKey).then((asset) => {
2260
2220
  if (!asset) {
2261
- console.warn(p6, "Missing texture", assetKey);
2221
+ console.warn(p5, "Missing texture", assetKey);
2262
2222
  return;
2263
2223
  }
2264
2224
  textureMap[textureKey] = new WrappedImage(asset);
@@ -2270,7 +2230,7 @@ var UVMapper = class {
2270
2230
  }
2271
2231
  await Promise.all(promises);
2272
2232
  const textureCount = uniqueTextureNames.length;
2273
- console.debug(p6, "Creating Atlas for", textureCount, "textures");
2233
+ console.debug(p5, "Creating Atlas for", textureCount, "textures");
2274
2234
  this.fillMissingTextureKeys(model.textures, textureMap);
2275
2235
  this.fillMissingTextureKeys(model.textures, metaMap);
2276
2236
  const sizes = {};
@@ -2290,7 +2250,7 @@ var UVMapper = class {
2290
2250
  this.fillMissingTextureKeys(model.textures, sizes);
2291
2251
  const s = Math.ceil(Math.sqrt(textureCount + 1));
2292
2252
  const size = Math.ceil(s * maxWidth);
2293
- console.debug(p6, "Atlas size:", size);
2253
+ console.debug(p5, "Atlas size:", size);
2294
2254
  const squaredSize = size * size;
2295
2255
  const missing = await ImageLoader.getData("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQMAAACQp+OdAAAABlBMVEX/AP8AAACfphTyAAAAFUlEQVQoz2MIhQKGVVAwKjIqQrwIAHRz/wFI17TEAAAAAElFTkSuQmCC");
2296
2256
  const empty = await ImageLoader.getData("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQMAAACQp+OdAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAA5JREFUKM9jGAWjgAIAAAJAAAFSSwuTAAAAAElFTkSuQmCC");
@@ -2345,10 +2305,10 @@ var UVMapper = class {
2345
2305
  }
2346
2306
  }
2347
2307
  const atlasImageData = image.toDataURL();
2348
- console.log(p6, "Atlas Image for", model.key, atlasImageData);
2308
+ console.log(p5, "Atlas Image for", model.key, atlasImageData);
2349
2309
  this.fillMissingTextureKeys(model.textures, positions);
2350
2310
  if (isItemModel) {
2351
- console.debug(p6, "Generating item model for", model);
2311
+ console.debug(p5, "Generating item model for", model);
2352
2312
  model.elements = [];
2353
2313
  for (let layerName of ModelGenerator.ITEM_LAYERS) {
2354
2314
  const textureImage = textureMap[layerName];
@@ -2356,7 +2316,7 @@ var UVMapper = class {
2356
2316
  model.elements.push(...ModelGenerator.generateItemModel(textureImage.data, layerName));
2357
2317
  }
2358
2318
  }
2359
- console.debug(p6, "Item model elements", model.elements);
2319
+ console.debug(p5, "Item model elements", model.elements);
2360
2320
  }
2361
2321
  if (!model.elements) {
2362
2322
  }
@@ -2416,7 +2376,7 @@ var UVMapper = class {
2416
2376
  hasTransparency
2417
2377
  );
2418
2378
  } else {
2419
- console.warn(p6, "Model does not have any textures", model);
2379
+ console.warn(p5, "Model does not have any textures", model);
2420
2380
  }
2421
2381
  return void 0;
2422
2382
  }
@@ -2677,7 +2637,7 @@ var MineRenderError = class _MineRenderError extends Error {
2677
2637
 
2678
2638
  // src/renderer/SceneObject.ts
2679
2639
  var import_ts_deepmerge3 = __toESM(require_dist());
2680
- var p7 = prefix("SceneObject");
2640
+ var p6 = prefix("SceneObject");
2681
2641
  var SceneObject = class _SceneObject extends Object3D2 {
2682
2642
  constructor(options) {
2683
2643
  super();
@@ -2864,9 +2824,9 @@ var SceneObject = class _SceneObject extends Object3D2 {
2864
2824
  if (!this.isInstanced) throw new MineRenderError("Object is not instanced");
2865
2825
  const i = this._instanceCounter++;
2866
2826
  this.setMatrixAt(i, new Matrix42());
2867
- console.debug(p7, "nextInstance " + i);
2827
+ console.debug(p6, "nextInstance " + i);
2868
2828
  if (i === this.options.maxInstanceCount) {
2869
- console.warn(p7, "Max instance count reached for " + this);
2829
+ console.warn(p6, "Max instance count reached for " + this);
2870
2830
  }
2871
2831
  if (this.scene) {
2872
2832
  this.scene.stats.instanceCount++;
@@ -3143,7 +3103,7 @@ var GuiObject = class extends SceneObject {
3143
3103
 
3144
3104
  // src/inspector/SceneInspector.ts
3145
3105
  import { Raycaster, Vector2 as Vector22 } from "three";
3146
- var p8 = prefix("SceneInspector");
3106
+ var p7 = prefix("SceneInspector");
3147
3107
  var help = "<span>Ctrl+Click to Select<br/></span><br/>";
3148
3108
  var SceneInspector = class {
3149
3109
  constructor(renderer) {
@@ -3212,7 +3172,7 @@ var SceneInspector = class {
3212
3172
  }
3213
3173
  selectObject(targetObject, targetIntersection) {
3214
3174
  this.selectedObject = targetObject;
3215
- console.log(p8, "selected", targetObject);
3175
+ console.log(p7, "selected", targetObject);
3216
3176
  this.redraw(targetObject, targetIntersection);
3217
3177
  }
3218
3178
  redraw(targetObject, targetIntersection) {
@@ -3510,7 +3470,7 @@ var SceneStatsDisplay = class {
3510
3470
  };
3511
3471
 
3512
3472
  // src/instance/InstanceManager.ts
3513
- var p9 = prefix("InstanceManager");
3473
+ var p8 = prefix("InstanceManager");
3514
3474
  var InstanceManager = class {
3515
3475
  constructor() {
3516
3476
  this.isInstanceManager = true;
@@ -3518,7 +3478,7 @@ var InstanceManager = class {
3518
3478
  }
3519
3479
  async get(key) {
3520
3480
  if (key in this.instanceCache) {
3521
- console.debug(p9, "key in cache", key);
3481
+ console.debug(p8, "key in cache", key);
3522
3482
  return (await this.instanceCache[key]).nextInstance();
3523
3483
  }
3524
3484
  return void 0;
@@ -3527,13 +3487,17 @@ var InstanceManager = class {
3527
3487
  if (key in this.instanceCache) {
3528
3488
  return await this.get(key);
3529
3489
  }
3530
- console.debug(p9, "key not in cache", key);
3531
- this.instanceCache[key] = new Promise(async (resolve) => {
3532
- const obj = await supplier();
3533
- const instance = obj.nextInstance();
3534
- resolve(instance);
3535
- });
3536
- return await this.instanceCache[key];
3490
+ console.debug(p8, "key not in cache", key);
3491
+ const pending = Promise.resolve().then(supplier).then((obj) => obj.nextInstance());
3492
+ this.instanceCache[key] = pending;
3493
+ try {
3494
+ return await pending;
3495
+ } catch (error) {
3496
+ if (this.instanceCache[key] === pending) {
3497
+ delete this.instanceCache[key];
3498
+ }
3499
+ throw error;
3500
+ }
3537
3501
  }
3538
3502
  reset() {
3539
3503
  for (let instanceCacheKey in this.instanceCache) {
@@ -4133,7 +4097,7 @@ function computeMorphedAttributes(object) {
4133
4097
 
4134
4098
  // src/model/scene/ModelObject.ts
4135
4099
  var import_ts_deepmerge5 = __toESM(require_dist());
4136
- var p10 = prefix("ModelObject");
4100
+ var p9 = prefix("ModelObject");
4137
4101
  var ModelObject = class _ModelObject extends SceneObject {
4138
4102
  constructor(originalModel, options) {
4139
4103
  super(options);
@@ -4186,10 +4150,10 @@ var ModelObject = class _ModelObject extends SceneObject {
4186
4150
  }
4187
4151
  });
4188
4152
  } else {
4189
- console.debug(p10, this.atlas.model, "has no elements");
4153
+ console.debug(p9, this.atlas.model, "has no elements");
4190
4154
  }
4191
4155
  } else {
4192
- console.debug(p10, "Missing atlas for", this);
4156
+ console.debug(p9, "Missing atlas for", this);
4193
4157
  }
4194
4158
  if (this.options.mergeMeshes) {
4195
4159
  let combinedGeo;
@@ -4248,7 +4212,7 @@ function isModelObject(obj) {
4248
4212
  // src/model/block/scene/BlockObject.ts
4249
4213
  var import_ts_deepmerge6 = __toESM(require_dist());
4250
4214
  import { Euler as Euler3, Matrix4 as Matrix46, Vector3 as Vector36 } from "three";
4251
- var p11 = prefix("BlockObject");
4215
+ var p10 = prefix("BlockObject");
4252
4216
  var BlockObject = class _BlockObject extends SceneObject {
4253
4217
  constructor(blockState, options) {
4254
4218
  super(options);
@@ -4271,7 +4235,7 @@ var BlockObject = class _BlockObject extends SceneObject {
4271
4235
  }
4272
4236
  async init() {
4273
4237
  if (this.options.applyDefaultState) {
4274
- const defaultState = this.blockState.key ? BlockStates.getDefaultState(this.blockState.key) : void 0;
4238
+ const defaultState = this.blockState.key ? await BlockStates.getDefaultState(this.blockState.key) : void 0;
4275
4239
  if (defaultState && Object.keys(defaultState).length > 0) {
4276
4240
  const state = {};
4277
4241
  for (let k in defaultState) {
@@ -4347,7 +4311,7 @@ var BlockObject = class _BlockObject extends SceneObject {
4347
4311
  } else if (this.blockState.multipart) {
4348
4312
  for (let part of this.blockState.multipart) {
4349
4313
  if (!part.apply) {
4350
- console.debug(p11, "Missing apply for blockState part", part);
4314
+ console.debug(p10, "Missing apply for blockState part", part);
4351
4315
  continue;
4352
4316
  }
4353
4317
  if (!part.when) {
@@ -6814,7 +6778,7 @@ var MineRenderWorld = class {
6814
6778
  };
6815
6779
 
6816
6780
  // src/world/Chunk.ts
6817
- var p12 = prefix("Chunk");
6781
+ var p11 = prefix("Chunk");
6818
6782
  var Chunk = class _Chunk {
6819
6783
  constructor(scene, x, y, z) {
6820
6784
  this._blocks = [];
@@ -6866,7 +6830,7 @@ var Chunk = class _Chunk {
6866
6830
  const index = _Chunk.chunkPosToBlockIndex(pos);
6867
6831
  const current = this._blocks[index];
6868
6832
  if (typeof current !== "undefined") {
6869
- console.debug(p12, "deleting existing block at", pos, worldPos, index);
6833
+ console.debug(p11, "deleting existing block at", pos, worldPos, index);
6870
6834
  current.object.removeFromScene();
6871
6835
  delete this._blocks[index];
6872
6836
  }
@@ -6932,6 +6896,7 @@ export {
6932
6896
  AXES,
6933
6897
  ArchiveAssetSource,
6934
6898
  AssetKey,
6899
+ AssetLoadError,
6935
6900
  AssetLoader,
6936
6901
  AssetParser,
6937
6902
  AssetSource,