render all block entities from the dumped vanilla models with decompiled renderer poses, drop the cem block-entity path

This commit is contained in:
MineTec committed 2026-11-04 15:13:55 +01:00
1 parent c66ebaa942
commit 022b080fce
14 files changed
+659 -567

No files matched your search

+43
View File
@@ -156,6 +156,29 @@ public class VanillaModelDump {
failed.add(name + " (layer: " + t + ")");
}
}
// Block-entity models posed by their own setupAnim with the static state the vanilla
// BlockEntityRenderer uses ("posed/<layer>"): skulls at animation 0 (dragon jaw, piglin ears), banner
// flags at wave phase 0 (item/static pose), the lectern's open book (LecternRenderer.BOOK_STATE).
// Rest-pose-only models (chest, bell, shulker box, pot, conduit) use "layer/<layer>" directly.
posedBlockEntity(out, failed, set, net.minecraft.client.model.geom.ModelLayers.DRAGON_SKULL,
m -> new net.minecraft.client.model.object.skull.DragonHeadModel(m),
new net.minecraft.client.model.object.skull.SkullModelBase.State());
posedBlockEntity(out, failed, set, net.minecraft.client.model.geom.ModelLayers.PIGLIN_HEAD,
m -> new net.minecraft.client.model.object.skull.PiglinHeadModel(m),
new net.minecraft.client.model.object.skull.SkullModelBase.State());
posedBlockEntity(out, failed, set, net.minecraft.client.model.geom.ModelLayers.STANDING_BANNER_FLAG,
m -> new net.minecraft.client.model.object.banner.BannerFlagModel(m), 0.0F);
posedBlockEntity(out, failed, set, net.minecraft.client.model.geom.ModelLayers.WALL_BANNER_FLAG,
m -> new net.minecraft.client.model.object.banner.BannerFlagModel(m), 0.0F);
try {
Field bookState = Class.forName("net.minecraft.client.renderer.blockentity.LecternRenderer")
.getDeclaredField("BOOK_STATE");
bookState.setAccessible(true);
posedBlockEntity(out, failed, set, net.minecraft.client.model.geom.ModelLayers.BOOK,
m -> new net.minecraft.client.model.object.book.BookModel(m), bookState.get(null));
} catch (ReflectiveOperationException e) {
failed.add("posed/book (" + e + ")");
}
JsonObject root = new JsonObject();
root.addProperty("version", SharedConstants.getCurrentVersion().name());
JsonObject models = new JsonObject();
@@ -171,6 +194,26 @@ public class VanillaModelDump {
for (String f : failed) System.out.println("FAILED " + f);
}
/** One block-entity model posed with {@code state} (see main), stored as {@code posed/<model>#<layer>}. */
static void posedBlockEntity(
Map<String, JsonObject> out,
List<String> failed,
EntityModelSet set,
ModelLayerLocation loc,
java.util.function.Function<ModelPart, Model<?>> factory,
Object state) {
String name = "posed/" + loc.model().getPath() + "#" + loc.layer();
try {
JsonObject jem = dump(factory.apply(set.bakeLayer(loc)), state, name, failed);
if (jem == null) return;
JsonObject entry = new JsonObject();
entry.addProperty("model", new Gson().toJson(jem));
out.put(name, entry);
} catch (Throwable t) {
failed.add(name + " (" + t + ")");
}
}
/**
* Small, name-based tweaks so the default render state shows the typical idle look: illagers stand
* with crossed arms (their peaceful pose) instead of the empty-handed "neutral" pose.