render all block entities from the dumped vanilla models with decompiled renderer poses, drop the cem block-entity path
This commit is contained in:
1 parent
c66ebaa942
commit
022b080fce
14 files changed
+659
-567
No files matched your search
@@ -33,14 +33,20 @@ public class BlockEntityTestRender {
|
||||
static BlockEntityBaker beBaker;
|
||||
static DecorationBaker decoBaker;
|
||||
|
||||
static BlockEntityState be(Kind kind, int bx, int by, int bz, float yaw) {
|
||||
return new BlockEntityState(kind, bx, by, bz, yaw, ChestKind.SINGLE, 0, null, "oak",
|
||||
null, null, null, List.of(), List.of(), null, null, null);
|
||||
/** A block-entity state at (bx, 0, bz); unused fields default. */
|
||||
static BlockEntityState st(Kind kind, int bx, int bz, float yaw, String direction, boolean active, String color,
|
||||
int baseColor, String head, List<BannerPattern> pats, List<String> sherds) {
|
||||
return new BlockEntityState(kind, bx, 0, bz, yaw, direction, active, ChestKind.SINGLE, baseColor, color,
|
||||
head, null, pats, sherds, null, null);
|
||||
}
|
||||
|
||||
static BlockEntityState be(Kind kind, float yaw) {
|
||||
return st(kind, 0, 0, yaw, null, false, null, 0, null, List.of(), List.of());
|
||||
}
|
||||
|
||||
static BlockEntityState sign(Kind kind, float yaw, SignText front, SignText back) {
|
||||
return new BlockEntityState(kind, 0, 0, 0, yaw, null, 0, null, "oak",
|
||||
null, null, null, List.of(), List.of(), null, front, back);
|
||||
return new BlockEntityState(kind, 0, 0, 0, yaw, null, false, null, 0, null, null, null,
|
||||
List.of(), List.of(), front, back);
|
||||
}
|
||||
|
||||
static SignText txt(org.bukkit.DyeColor dye, boolean glow, String... lines) {
|
||||
@@ -57,7 +63,7 @@ public class BlockEntityTestRender {
|
||||
BlockModelRegistry registry = new BlockModelRegistry(reader, textures);
|
||||
BiomeTintProvider tint = new BiomeTintProvider(textures);
|
||||
CemModelLoader geo = new CemModelLoader();
|
||||
geo.load(new java.io.FileInputStream("src/main/resources/cem/cem_template_models.json"), log);
|
||||
geo.load(new java.io.FileInputStream("src/main/resources/cem/cem_template_models.json"), log); // entity fallback only
|
||||
geo.load(new java.io.FileInputStream("src/main/resources/cem/vanilla_entity_models.json"), log);
|
||||
SkinCache skins = new SkinCache();
|
||||
eu.mhsl.minecraft.pixelpics.assets.font.BitmapFont font =
|
||||
@@ -113,49 +119,86 @@ public class BlockEntityTestRender {
|
||||
chest(Kind.COPPER_CHEST, 0, 0, 0, ChestKind.LEFT, "oxidized"),
|
||||
chest(Kind.COPPER_CHEST, -1, 0, 0, ChestKind.RIGHT, "oxidized")));
|
||||
frontCam.put("copper_oxidized_double", 0f);
|
||||
scenes.put("sign", List.of(be(Kind.SIGN, 0, 0, 0, 0)));
|
||||
scenes.put("wall_sign", List.of(be(Kind.WALL_SIGN, 0, 0, 0, 0)));
|
||||
scenes.put("hanging_sign", List.of(be(Kind.HANGING_SIGN, 0, 0, 0, 0)));
|
||||
// --- sign text (calibration) --- facingDeg=180 → front (model −Z) faces the camera (north).
|
||||
// --- sign text (boards are block models, not drawn here) --- facingDeg 180 → front faces north.
|
||||
org.bukkit.DyeColor B = org.bukkit.DyeColor.BLACK;
|
||||
scenes.put("sign_text", List.of(sign(Kind.SIGN, 180,
|
||||
txt(B, false, "Hello World", "zweite Zeile", "Gruesse: AÖÜ", "ßäöü 12345"), null)));
|
||||
scenes.put("wall_sign_text", List.of(sign(Kind.WALL_SIGN, 180,
|
||||
txt(B, false, "Wall Sign", "Line 2", "Line 3", "Line 4"), null)));
|
||||
scenes.put("hanging_sign_text", List.of(sign(Kind.HANGING_SIGN, 180,
|
||||
txt(B, false, "Hanging", "sign text", "row 3", "row 4"), null)));
|
||||
scenes.put("sign_text_red", List.of(sign(Kind.SIGN, 180,
|
||||
txt(org.bukkit.DyeColor.RED, false, "RED INK", "colored", "sign text", ""), null)));
|
||||
scenes.put("sign_text_glow", List.of(sign(Kind.SIGN, 180,
|
||||
txt(org.bukkit.DyeColor.LIME, true, "GLOWING", "lime glow", "outline!", ""), null)));
|
||||
scenes.put("sign_text_front", List.of(sign(Kind.SIGN, 180,
|
||||
txt(B, false, "FRONT", "side", "", ""), txt(org.bukkit.DyeColor.BLUE, false, "BACK", "side", "", ""))));
|
||||
// View the BACK side head-on (facingDeg=0 turns the back face toward the camera).
|
||||
scenes.put("sign_view_back", List.of(sign(Kind.SIGN, 0,
|
||||
txt(B, false, "FRONTXY", "f2", "", ""), txt(org.bukkit.DyeColor.BLUE, false, "BACKXY", "b2", "", ""))));
|
||||
String[] D = {"S", "W", "N", "E"};
|
||||
for (int i = 0; i < 4; i++) {
|
||||
float yaw = i * 90;
|
||||
scenes.put("sign_text_" + D[i], List.of(sign(Kind.SIGN, yaw, txt(B, false, "Hello World", "zweite Zeile", "Gruesse: AÖÜ", "ßäöü 12345"), null)));
|
||||
frontCam.put("sign_text_" + D[i], yaw);
|
||||
}
|
||||
scenes.put("sign_text_diag", List.of(sign(Kind.SIGN, 22.5f * 3, txt(B, false, "rot 3", "67.5 deg", "", ""), null)));
|
||||
frontCam.put("sign_text_diag", 22.5f * 3);
|
||||
scenes.put("wall_sign_text", List.of(sign(Kind.WALL_SIGN, 180, txt(B, false, "Wall Sign", "Line 2", "Line 3", "Line 4"), null)));
|
||||
frontCam.put("wall_sign_text", 180f);
|
||||
scenes.put("wall_sign_text_E", List.of(sign(Kind.WALL_SIGN, 270, txt(B, false, "Wall East", "Line 2", "", ""), null)));
|
||||
frontCam.put("wall_sign_text_E", 270f);
|
||||
scenes.put("hanging_sign_text", List.of(sign(Kind.HANGING_SIGN, 180, txt(B, false, "Hanging", "sign text", "row 3", "row 4"), null)));
|
||||
frontCam.put("hanging_sign_text", 180f);
|
||||
scenes.put("sign_text_red", List.of(sign(Kind.SIGN, 180, txt(org.bukkit.DyeColor.RED, false, "RED INK", "colored", "sign text", ""), null)));
|
||||
frontCam.put("sign_text_red", 180f);
|
||||
scenes.put("sign_text_glow", List.of(sign(Kind.SIGN, 180, txt(org.bukkit.DyeColor.LIME, true, "GLOWING", "lime glow", "outline!", ""), null)));
|
||||
frontCam.put("sign_text_glow", 180f);
|
||||
// Back side viewed head-on: the camera looks at the side opposite the front.
|
||||
scenes.put("sign_view_back", List.of(sign(Kind.SIGN, 180, txt(B, false, "FRONTXY", "f2", "", ""), txt(org.bukkit.DyeColor.BLUE, false, "BACKXY", "b2", "", ""))));
|
||||
frontCam.put("sign_view_back", 0f);
|
||||
scenes.put("sign_1line", List.of(sign(Kind.SIGN, 180, txt(B, false, "", "SHOP", "", ""), null)));
|
||||
scenes.put("sign_2line", List.of(sign(Kind.SIGN, 180, txt(B, false, "", "Welcome", "home!", ""), null)));
|
||||
frontCam.put("sign_1line", 180f);
|
||||
scenes.put("sign_long", List.of(sign(Kind.SIGN, 180, txt(B, false, "a very long line here", "", "", ""), null)));
|
||||
scenes.put("banner", List.of(new BlockEntityState(Kind.BANNER, 0, 0, 0, 0, null, 0xFFCC2020, null, null, null, null, null, List.of(), List.of(), null, null, null)));
|
||||
scenes.put("banner_patterned", List.of(new BlockEntityState(Kind.BANNER, 0, 0, 0, 0, null, 0xFFFFFFFF, null, null, null, null, null,
|
||||
List.of(new BannerPattern("stripe_bottom", 0xFFCC2020), new BannerPattern("cross", 0xFF2040CC), new BannerPattern("border", 0xFF20A020)), List.of(), null, null, null)));
|
||||
scenes.put("wall_banner", List.of(new BlockEntityState(Kind.WALL_BANNER, 0, 0, 0, 0, null, 0xFF2040CC, null, null, null, null, null, List.of(), List.of(), null, null, null)));
|
||||
scenes.put("bed", List.of(
|
||||
new BlockEntityState(Kind.BED, 0, 0, 0, 0, null, 0, "red", null, BedPart.FOOT, null, null, List.of(), List.of(), null, null, null),
|
||||
new BlockEntityState(Kind.BED, 0, 0, 1, 0, null, 0, "red", null, BedPart.HEAD, null, null, List.of(), List.of(), null, null, null)));
|
||||
scenes.put("shulker_box", List.of(new BlockEntityState(Kind.SHULKER_BOX, 0, 0, 0, 0, null, 0, null, null, null, null, null, List.of(), List.of(), null, null, null)));
|
||||
scenes.put("conduit", List.of(be(Kind.CONDUIT, 0, 0, 0, 0)));
|
||||
scenes.put("decorated_pot", List.of(be(Kind.DECORATED_POT, 0, 0, 0, 0)));
|
||||
scenes.put("decorated_pot_sherds", List.of(new BlockEntityState(Kind.DECORATED_POT, 0, 0, 0, 0, null, 0, null, null, null, null, null,
|
||||
List.of(), List.of("angler_pottery_sherd", "heart_pottery_sherd", "skull_pottery_sherd", "brick"), null, null, null)));
|
||||
scenes.put("bell", List.of(be(Kind.BELL, 0, 0, 0, 0)));
|
||||
scenes.put("head_skeleton", List.of(head("skeleton")));
|
||||
scenes.put("head_zombie", List.of(head("zombie")));
|
||||
scenes.put("head_creeper", List.of(head("creeper")));
|
||||
scenes.put("head_dragon", List.of(head("dragon")));
|
||||
scenes.put("head_piglin", List.of(head("piglin")));
|
||||
scenes.put("wither_skull", List.of(headKind(Kind.HEAD, "wither_skeleton")));
|
||||
scenes.put("wall_head", List.of(headKind(Kind.WALL_HEAD, "skeleton")));
|
||||
frontCam.put("sign_long", 180f);
|
||||
// --- banners: standing (rotation 0/4/6), wall (4 facings), patterned ---
|
||||
List<BannerPattern> pats = List.of(new BannerPattern("stripe_bottom", 0xFFCC2020), new BannerPattern("cross", 0xFF2040CC), new BannerPattern("border", 0xFF20A020));
|
||||
for (float yaw : new float[] {0, 90, 135}) {
|
||||
String k = "banner_" + (int) yaw;
|
||||
scenes.put(k, List.of(st(Kind.BANNER, 0, 0, yaw, null, false, null, 0xFFCC2020, null, List.of(), List.of())));
|
||||
frontCam.put(k, yaw);
|
||||
}
|
||||
scenes.put("banner_patterned", List.of(st(Kind.BANNER, 0, 0, 0, null, false, null, 0xFFFFFFFF, null, pats, List.of())));
|
||||
frontCam.put("banner_patterned", 0f);
|
||||
scenes.put("banner_side", scenes.get("banner_patterned"));
|
||||
frontCam.put("banner_side", 90f);
|
||||
for (int i = 0; i < 4; i++) {
|
||||
scenes.put("wall_banner_" + D[i], List.of(st(Kind.WALL_BANNER, 0, 0, i * 90, null, false, null, 0xFF2040CC, null, pats, List.of())));
|
||||
frontCam.put("wall_banner_" + D[i], i * 90f);
|
||||
}
|
||||
// --- shulker boxes: 6 facings ---
|
||||
for (String d : new String[] {"up", "down", "north", "south", "east", "west"}) {
|
||||
scenes.put("shulker_" + d, List.of(st(Kind.SHULKER_BOX, 0, 0, 0, d, false, d.equals("up") ? null : "red", 0, null, List.of(), List.of())));
|
||||
frontCam.put("shulker_" + d, 0f);
|
||||
}
|
||||
scenes.put("conduit", List.of(be(Kind.CONDUIT, 0)));
|
||||
scenes.put("conduit_active", List.of(st(Kind.CONDUIT, 0, 0, 0, null, true, null, 0, null, List.of(), List.of())));
|
||||
List<String> sherds = List.of("heart_pottery_sherd", "skull_pottery_sherd", "angler_pottery_sherd", "brick");
|
||||
for (int i = 0; i < 4; i++) {
|
||||
scenes.put("pot_" + D[i], List.of(st(Kind.DECORATED_POT, 0, 0, i * 90, null, false, null, 0, null, List.of(), sherds)));
|
||||
frontCam.put("pot_" + D[i], i * 90f);
|
||||
}
|
||||
scenes.put("pot_plain", List.of(be(Kind.DECORATED_POT, 0)));
|
||||
frontCam.put("pot_plain", 0f);
|
||||
scenes.put("bell", List.of(be(Kind.BELL, 0)));
|
||||
for (int i = 0; i < 4; i++) {
|
||||
scenes.put("lectern_book_" + D[i], List.of(st(Kind.LECTERN, 0, 0, i * 90, null, true, null, 0, null, List.of(), List.of())));
|
||||
frontCam.put("lectern_book_" + D[i], i * 90f);
|
||||
}
|
||||
// --- heads: every type facing the camera (rotation 0), plus rotations and wall mounts ---
|
||||
for (String t : new String[] {"skeleton", "wither_skeleton", "zombie", "creeper", "player", "piglin", "dragon"}) {
|
||||
scenes.put("head_" + t, List.of(head(Kind.HEAD, t, 0)));
|
||||
frontCam.put("head_" + t, 0f);
|
||||
}
|
||||
scenes.put("head_dragon_side", List.of(head(Kind.HEAD, "dragon", 0)));
|
||||
frontCam.put("head_dragon_side", 90f);
|
||||
for (float yaw : new float[] {90, 157.5f, 270}) {
|
||||
scenes.put("head_creeper_" + yaw, List.of(head(Kind.HEAD, "creeper", yaw)));
|
||||
frontCam.put("head_creeper_" + yaw, yaw);
|
||||
}
|
||||
for (int i = 0; i < 4; i++) {
|
||||
scenes.put("wall_head_" + D[i], List.of(head(Kind.WALL_HEAD, "skeleton", i * 90)));
|
||||
frontCam.put("wall_head_" + D[i], i * 90f);
|
||||
}
|
||||
scenes.put("wall_dragon_N", List.of(head(Kind.WALL_HEAD, "dragon", 180)));
|
||||
frontCam.put("wall_dragon_N", 180f);
|
||||
scenes.put("wall_piglin_E", List.of(head(Kind.WALL_HEAD, "piglin", 270)));
|
||||
frontCam.put("wall_piglin_E", 270f);
|
||||
|
||||
// Decoration scenes (paintings + item frames), rendered via the same scene path.
|
||||
LinkedHashMap<String, List<DecorationState>> decoScenes = new LinkedHashMap<>();
|
||||
@@ -206,13 +249,12 @@ public class BlockEntityTestRender {
|
||||
static final Map<String, Float> frontCam = new HashMap<>();
|
||||
|
||||
static BlockEntityState chest(Kind kind, int bx, int bz, float yaw, ChestKind ck, String variant) {
|
||||
return new BlockEntityState(kind, bx, 0, bz, yaw, ck, 0, variant, null, null, null, null,
|
||||
List.of(), List.of(), null, null, null);
|
||||
return new BlockEntityState(kind, bx, 0, bz, yaw, null, false, ck, 0, variant, null, null,
|
||||
List.of(), List.of(), null, null);
|
||||
}
|
||||
|
||||
static BlockEntityState head(String type) { return headKind(Kind.HEAD, type); }
|
||||
static BlockEntityState headKind(Kind kind, String type) {
|
||||
return new BlockEntityState(kind, 0, 0, 0, 0, null, 0, null, null, null, type, null, List.of(), List.of(), null, null, null);
|
||||
static BlockEntityState head(Kind kind, String type, float yaw) {
|
||||
return st(kind, 0, 0, yaw, null, false, null, 0, type, List.of(), List.of());
|
||||
}
|
||||
|
||||
static BufferedImage renderScene(DefaultScreenRenderer renderer, WorldSnapshot world, SkyContext sky,
|
||||
|
||||
Reference in new issue
Block a user