minerender 2.1.0-alpha.32 → 2.1.0-alpha.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bundle.js CHANGED
@@ -81078,26 +81078,40 @@ ${key}` : key;
81078
81078
  };
81079
81079
  return collect("");
81080
81080
  }
81081
- static async getEntity(modelKey, textureKey, options) {
81081
+ static async getModelFile(modelKey) {
81082
81082
  const path = isAssetKey(modelKey) ? modelKey.getFullPath() : modelKey.path;
81083
81083
  const key = new AssetKey(modelKey.namespace, path, void 0, void 0, "entity-models", ".json");
81084
- const model = await Caching.entityModelCache.get(key.serialize(), () => AssetLoader.get(key, "json" /* JSON */));
81084
+ return Caching.entityModelCache.get(key.serialize(), () => AssetLoader.get(key, "json" /* JSON */));
81085
+ }
81086
+ static async getLayerList(modelKey) {
81087
+ return Object.keys((await this.getModelFile(modelKey))?.layers ?? {});
81088
+ }
81089
+ static async getEntity(modelKey, textureKey, options) {
81090
+ const model = await this.getModelFile(modelKey);
81085
81091
  if (!model) return void 0;
81086
- const layerName = options?.layer ?? "main";
81087
- const layer = model.layers[layerName];
81088
- if (!layer) {
81089
- throw new MineRenderError(`Entity ${model.id} has no layer "${layerName}". Available layers: ${Object.keys(model.layers).join(", ")}`);
81090
- }
81091
- let texture;
81092
- if (textureKey) {
81093
- const path2 = isAssetKey(textureKey) ? textureKey.getFullPath() : textureKey.path;
81094
- texture = isAssetKey(textureKey) && textureKey.assetType === "textures" && path2.startsWith("entity/") ? textureKey : new AssetKey(textureKey.namespace, path2, "textures", "entity", "assets", ".png", isAssetKey(textureKey) ? textureKey.root : void 0);
81095
- } else if (layer.textureLocation !== void 0) {
81096
- texture = AssetKey.parse("textures", layer.textureLocation.replace(/^([^:]+:)?textures\//, "$1"));
81097
- } else {
81098
- texture = await this.resolveTexture(modelKey);
81099
- }
81100
- return { key: textureKey ?? modelKey, texture, layer, id: model.id };
81092
+ const names = [...new Set(options?.layers ?? [options?.layer ?? "main"])];
81093
+ if (names.length === 0) throw new MineRenderError(`Entity ${model.id} requires at least one layer`);
81094
+ const selected = names.map((name2) => {
81095
+ const layer = model.layers[name2];
81096
+ if (!layer) {
81097
+ throw new MineRenderError(`Entity ${model.id} has no layer "${name2}". Available layers: ${Object.keys(model.layers).join(", ")}`);
81098
+ }
81099
+ return { name: name2, layer };
81100
+ });
81101
+ const layers = Object.fromEntries(await Promise.all(selected.map(async ({ name: name2, layer }, index) => {
81102
+ const override = options?.textures?.[name2] ?? (index === 0 ? textureKey : void 0);
81103
+ let texture;
81104
+ if (override) {
81105
+ const path = isAssetKey(override) ? override.getFullPath() : override.path;
81106
+ texture = isAssetKey(override) && override.assetType === "textures" && path.startsWith("entity/") ? override : new AssetKey(override.namespace, path, "textures", "entity", "assets", ".png", isAssetKey(override) ? override.root : void 0);
81107
+ } else if (layer.textureLocation !== void 0) {
81108
+ texture = AssetKey.parse("textures", layer.textureLocation.replace(/^([^:]+:)?textures\//, "$1"));
81109
+ } else {
81110
+ texture = await this.resolveTexture(modelKey);
81111
+ }
81112
+ return [name2, { key: override ?? modelKey, texture, layer }];
81113
+ })));
81114
+ return { ...layers[names[0]], id: model.id, layers };
81101
81115
  }
81102
81116
  static async resolveTexture(modelKey) {
81103
81117
  const path = isAssetKey(modelKey) ? modelKey.getFullPath() : modelKey.path;
@@ -81621,9 +81635,21 @@ ${key}` : key;
81621
81635
  dispose() {
81622
81636
  super.dispose();
81623
81637
  }
81624
- get textureKey() {
81625
- if (this.entity.texture) return this.entity.texture;
81626
- const key = this.entity.key;
81638
+ getLayerGroup(name2) {
81639
+ return super.getGroupByName(`layer:${name2}`);
81640
+ }
81641
+ getGroupByName(name2, layerName) {
81642
+ return layerName === void 0 ? super.getGroupByName(name2) : this.getLayerGroup(layerName)?.getObjectByName(`group:${name2}`);
81643
+ }
81644
+ getMeshByName(name2, layerName) {
81645
+ return layerName === void 0 ? super.getMeshByName(name2) : this.getLayerGroup(layerName)?.getObjectByName(`mesh:${name2}`);
81646
+ }
81647
+ get entityLayers() {
81648
+ return this.entity.layers ?? { main: this.entity };
81649
+ }
81650
+ getTextureKey(layer) {
81651
+ if (layer.texture) return layer.texture;
81652
+ const key = layer.key;
81627
81653
  return new AssetKey(
81628
81654
  key.namespace,
81629
81655
  isAssetKey(key) ? key.getFullPath() : key.path,
@@ -81633,18 +81659,22 @@ ${key}` : key;
81633
81659
  ".png"
81634
81660
  );
81635
81661
  }
81636
- async loadTextures() {
81637
- this.imageData = await ModelTextures.get(this.textureKey);
81662
+ async loadTextures(layer = this.entity) {
81663
+ return ModelTextures.get(this.getTextureKey(layer));
81638
81664
  }
81639
81665
  createMeshes(force = false) {
81640
81666
  if (this.meshesCreated && !force) return;
81641
81667
  const modelRoot = new Object3D();
81642
81668
  if (this.options.flip) modelRoot.scale.set(-1, -1, 1);
81643
81669
  this.add(modelRoot);
81644
- this.createPart("root", this.entity.layer.root, modelRoot, this.entity.layer.texture, Materials.MISSING_TEXTURE);
81670
+ Object.entries(this.entityLayers).forEach(([name2, layer], index) => {
81671
+ const group = this.createGroup(`layer:${name2}`);
81672
+ modelRoot.add(group);
81673
+ this.createPart("root", layer.layer.root, group, layer.layer.texture, Materials.MISSING_TEXTURE, index);
81674
+ });
81645
81675
  this.meshesCreated = true;
81646
81676
  }
81647
- createPart(name2, part, parent, textureSize, material) {
81677
+ createPart(name2, part, parent, textureSize, material, renderOrder) {
81648
81678
  const anchor = this.createGroup(name2);
81649
81679
  anchor.position.fromArray(part.pose.offset);
81650
81680
  anchor.rotation.set(...part.pose.rotation, "ZYX");
@@ -81664,30 +81694,31 @@ ${key}` : key;
81664
81694
  ).clone();
81665
81695
  geometry.translate(cube.origin[0] + width / 2, cube.origin[1] + height / 2, cube.origin[2] + depth / 2);
81666
81696
  const mesh = this.createMesh(name2, geometry, material);
81697
+ mesh.renderOrder = renderOrder;
81667
81698
  anchor.add(mesh);
81668
81699
  if (this.options.wireframe) addWireframeToMesh(geometry, mesh);
81669
81700
  }
81670
81701
  for (const [childName, child] of Object.entries(part.children)) {
81671
- this.createPart(childName, child, anchor, size, material);
81702
+ this.createPart(childName, child, anchor, size, material, renderOrder);
81672
81703
  }
81673
81704
  }
81674
81705
  async applyTextures() {
81675
- const assetKeyStr = this.textureKey.serialize();
81676
- const keyStr = `entity:${assetKeyStr}`;
81677
- let mat = Caching.materialCache.getIfPresent(keyStr);
81678
- if (!mat) {
81679
- const pending = this.loadTextures();
81680
- const cachedAsset = Caching.textureAssetCache.getIfPresent(assetKeyStr);
81681
- await pending;
81682
- if (!this.imageData) return;
81683
- const canvas = this.imageData.data.canvas;
81684
- const createMaterial = () => Materials.createBasicCanvasMaterial(canvas);
81685
- mat = cachedAsset && Caching.textureAssetCache.getIfPresent(assetKeyStr) === cachedAsset ? Caching.materialCache.get(keyStr, createMaterial) : createMaterial();
81686
- this.imageData = void 0;
81687
- }
81688
- this.iterateAllMeshes((mesh) => {
81689
- mesh.material = mat;
81690
- });
81706
+ await Promise.all(Object.entries(this.entityLayers).map(async ([name2, layer]) => {
81707
+ const assetKeyStr = this.getTextureKey(layer).serialize();
81708
+ const keyStr = `entity:${assetKeyStr}`;
81709
+ let mat = Caching.materialCache.getIfPresent(keyStr);
81710
+ if (!mat) {
81711
+ const cachedAsset = Caching.textureAssetCache.getIfPresent(assetKeyStr);
81712
+ const imageData = await this.loadTextures(layer);
81713
+ if (!imageData) return;
81714
+ const canvas = imageData.data.canvas;
81715
+ const createMaterial = () => Materials.createBasicCanvasMaterial(canvas);
81716
+ mat = cachedAsset && Caching.textureAssetCache.getIfPresent(assetKeyStr) === cachedAsset ? Caching.materialCache.get(keyStr, createMaterial) : createMaterial();
81717
+ }
81718
+ this.getLayerGroup(name2)?.traverse((object) => {
81719
+ if (isMesh(object)) object.material = mat;
81720
+ });
81721
+ }));
81691
81722
  this.notifyDirty();
81692
81723
  }
81693
81724
  };