From 4e5f900766519cd878067e2ba121231a35fded40 Mon Sep 17 00:00:00 2001 From: Maik Marschner Date: Sat, 6 Apr 2024 20:19:35 +0200 Subject: [PATCH] Re-implement dragon head model with BoxModelBuilder and fix incorrect dimensions and jaw angle. --- .../se/llbit/chunky/entity/SkullEntity.java | 243 ++++-------------- 1 file changed, 43 insertions(+), 200 deletions(-) diff --git a/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java b/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java index a9660df22..9800b64b2 100644 --- a/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java +++ b/chunky/src/java/se/llbit/chunky/entity/SkullEntity.java @@ -25,7 +25,10 @@ import se.llbit.chunky.world.material.TextureMaterial; import se.llbit.json.JsonObject; import se.llbit.json.JsonValue; -import se.llbit.math.*; +import se.llbit.math.Quad; +import se.llbit.math.QuickMath; +import se.llbit.math.Transform; +import se.llbit.math.Vector3; import se.llbit.math.primitive.Box; import se.llbit.math.primitive.Primitive; @@ -51,205 +54,45 @@ public enum Kind { //#region Dragon head //String dragonHeadJson = "{\"elements\":[{\"from\":[2,0,2],\"to\":[14,12,14],\"faces\":{\"up\":{\"uv\":[8,2.875,9,1.875],\"texture\":\"entity/enderdragon/dragon\"},\"down\":{\"uv\":[8.9375,1.875,10,2.875],\"texture\":\"entity/enderdragon/dragon\"},\"east\":{\"uv\":[7,2.875,8,3.875],\"texture\":\"entity/enderdragon/dragon\"},\"west\":{\"uv\":[9,2.875,10,3.875],\"texture\":\"entity/enderdragon/dragon\"},\"north\":{\"uv\":[8,2.875,9,3.875],\"texture\":\"entity/enderdragon/dragon\"},\"south\":{\"uv\":[10,2.875,11,3.875],\"texture\":\"entity/enderdragon/dragon\"}}},{\"from\":[4,3,-8],\"to\":[12,6.5,3],\"faces\":{\"up\":{\"uv\":[12.75,3.75,12,2.75],\"texture\":\"entity/enderdragon/dragon\"},\"down\":{\"uv\":[12.8125,2.6875,13.4375,3.625],\"texture\":\"entity/enderdragon/dragon\"},\"east\":{\"uv\":[11,3.75,12.0625,4.0625],\"texture\":\"entity/enderdragon/dragon\"},\"west\":{\"uv\":[12.75,3.75,13.75,4.0625],\"texture\":\"entity/enderdragon/dragon\"},\"north\":{\"uv\":[12,3.75,12.75,4.0625],\"texture\":\"entity/enderdragon/dragon\"},\"south\":{\"uv\":[13.75,3.75,14.5,4.0625],\"texture\":\"entity/enderdragon/dragon\"}}},{\"from\":[4,0,-8],\"to\":[12,2.5,3],\"faces\":{\"up\":{\"uv\":[12.75,5.0625,12,4.0625],\"texture\":\"entity/enderdragon/dragon\"},\"down\":{\"uv\":[13.5,4.0625,12.75,5.0625],\"texture\":\"entity/enderdragon/dragon\"},\"east\":{\"uv\":[11,5.0625,12,5.3125],\"texture\":\"entity/enderdragon/dragon\"},\"west\":{\"uv\":[12.75,5.0625,13.75,5.3125],\"texture\":\"entity/enderdragon/dragon\"},\"north\":{\"uv\":[12,5.0625,12.75,5.3125],\"texture\":\"entity/enderdragon/dragon\"},\"south\":{\"uv\":[13.75,5.0625,14.5,5.3125],\"texture\":\"entity/enderdragon/dragon\"}}},{\"from\":[10.3,12,6.6],\"to\":[11.7,15,10.9],\"faces\":{\"up\":{\"uv\":[0.375,0.375,0.5,0],\"texture\":\"entity/enderdragon/dragon\"},\"east\":{\"uv\":[0.875,0.625,0.5,0.375],\"texture\":\"entity/enderdragon/dragon\"},\"west\":{\"uv\":[0.375,0.375,0,0.625],\"texture\":\"entity/enderdragon/dragon\"},\"north\":{\"uv\":[0.5,0.375,0.375,0.625],\"texture\":\"entity/enderdragon/dragon\"},\"south\":{\"uv\":[1,0.375,0.875,0.625],\"texture\":\"entity/enderdragon/dragon\"}}},{\"from\":[4.3,12,6.6],\"to\":[5.7,15,10.9],\"faces\":{\"up\":{\"uv\":[0.5,0.375,0.375,0],\"texture\":\"entity/enderdragon/dragon\"},\"east\":{\"uv\":[0,0.375,0.375,0.625],\"texture\":\"entity/enderdragon/dragon\"},\"west\":{\"uv\":[0.5,0.375,0.875,0.625],\"texture\":\"entity/enderdragon/dragon\"},\"north\":{\"uv\":[0.375,0.375,0.5,0.625],\"texture\":\"entity/enderdragon/dragon\"},\"south\":{\"uv\":[0.875,0.375,1,0.625],\"texture\":\"entity/enderdragon/dragon\"}}},{\"from\":[10.3,6.5,-5],\"to\":[11.7,8,-2],\"faces\":{\"up\":{\"uv\":[7.375,0,7.25,0.25],\"texture\":\"entity/enderdragon/dragon\"},\"east\":{\"uv\":[7.625,0.25,7.375,0.375],\"texture\":\"entity/enderdragon/dragon\"},\"west\":{\"uv\":[7.25,0.25,7,0.375],\"texture\":\"entity/enderdragon/dragon\"},\"north\":{\"uv\":[7.375,0.25,7.25,0.375],\"texture\":\"entity/enderdragon/dragon\"},\"south\":{\"uv\":[7.75,0.25,7.625,0.375],\"texture\":\"entity/enderdragon/dragon\"}}},{\"from\":[4.3,6.5,-5],\"to\":[5.7,8,-2],\"faces\":{\"up\":{\"uv\":[7.25,0,7.375,0.25],\"texture\":\"entity/enderdragon/dragon\"},\"east\":{\"uv\":[7,0.25,7.25,0.375],\"texture\":\"entity/enderdragon/dragon\"},\"west\":{\"uv\":[7.375,0.25,7.625,0.375],\"texture\":\"entity/enderdragon/dragon\"},\"north\":{\"uv\":[7.25,0.25,7.375,0.375],\"texture\":\"entity/enderdragon/dragon\"},\"south\":{\"uv\":[7.625,0.25,7.75,0.375],\"texture\":\"entity/enderdragon/dragon\"}}}]}"; - private static final Quad[] dragonHead = { - // face - new Quad( - new Vector3(2 / 16.0, 12 / 16.0, 14 / 16.0), - new Vector3(14 / 16.0, 12 / 16.0, 14 / 16.0), - new Vector3(2 / 16.0, 12 / 16.0, 2 / 16.0), - new Vector4(8 / 16.0, 9 / 16.0, 14.125 / 16.0, 13.125 / 16.0)), - new Quad( - new Vector3(2 / 16.0, 0, 2 / 16.0), - new Vector3(14 / 16.0, 0, 2 / 16.0), - new Vector3(2 / 16.0, 0, 14 / 16.0), - new Vector4(8.9375 / 16.0, 10 / 16.0, 13.125 / 16.0, 14.125 / 16.0)), - new Quad( - new Vector3(14 / 16.0, 0, 14 / 16.0), - new Vector3(14 / 16.0, 0, 2 / 16.0), - new Vector3(14 / 16.0, 12 / 16.0, 14 / 16.0), - new Vector4(7 / 16.0, 8 / 16.0, 12.125 / 16.0, 13.125 / 16.0)), - new Quad( - new Vector3(2 / 16.0, 0, 2 / 16.0), - new Vector3(2 / 16.0, 0, 14 / 16.0), - new Vector3(2 / 16.0, 12 / 16.0, 2 / 16.0), - new Vector4(9 / 16.0, 10 / 16.0, 12.125 / 16.0, 13.125 / 16.0)), - new Quad( - new Vector3(14 / 16.0, 0, 2 / 16.0), - new Vector3(2 / 16.0, 0, 2 / 16.0), - new Vector3(14 / 16.0, 12 / 16.0, 2 / 16.0), - new Vector4(8 / 16.0, 9 / 16.0, 12.125 / 16.0, 13.125 / 16.0)), - new Quad( - new Vector3(2 / 16.0, 0, 14 / 16.0), - new Vector3(14 / 16.0, 0, 14 / 16.0), - new Vector3(2 / 16.0, 12 / 16.0, 14 / 16.0), - new Vector4(10 / 16.0, 11 / 16.0, 12.125 / 16.0, 13.125 / 16.0)), - // mouth_upper - new Quad( - new Vector3(4 / 16.0, 6.5 / 16.0, 3 / 16.0), - new Vector3(12 / 16.0, 6.5 / 16.0, 3 / 16.0), - new Vector3(4 / 16.0, 6.5 / 16.0, -8 / 16.0), - new Vector4(12.75 / 16.0, 12 / 16.0, 13.25 / 16.0, 12.25 / 16.0)), - new Quad( - new Vector3(4 / 16.0, 3 / 16.0, -8 / 16.0), - new Vector3(12 / 16.0, 3 / 16.0, -8 / 16.0), - new Vector3(4 / 16.0, 3 / 16.0, 3 / 16.0), - new Vector4(12.8125 / 16.0, 13.4375 / 16.0, 12.375 / 16.0, 13.3125 / 16.0)), - new Quad( - new Vector3(12 / 16.0, 3 / 16.0, 3 / 16.0), - new Vector3(12 / 16.0, 3 / 16.0, -8 / 16.0), - new Vector3(12 / 16.0, 6.5 / 16.0, 3 / 16.0), - new Vector4(11 / 16.0, 12.0625 / 16.0, 11.9375 / 16.0, 12.25 / 16.0)), - new Quad( - new Vector3(4 / 16.0, 3 / 16.0, -8 / 16.0), - new Vector3(4 / 16.0, 3 / 16.0, 3 / 16.0), - new Vector3(4 / 16.0, 6.5 / 16.0, -8 / 16.0), - new Vector4(12.75 / 16.0, 13.75 / 16.0, 11.9375 / 16.0, 12.25 / 16.0)), - new Quad( - new Vector3(12 / 16.0, 3 / 16.0, -8 / 16.0), - new Vector3(4 / 16.0, 3 / 16.0, -8 / 16.0), - new Vector3(12 / 16.0, 6.5 / 16.0, -8 / 16.0), - new Vector4(12 / 16.0, 12.75 / 16.0, 11.9375 / 16.0, 12.25 / 16.0)), - new Quad( - new Vector3(4 / 16.0, 3 / 16.0, 3 / 16.0), - new Vector3(12 / 16.0, 3 / 16.0, 3 / 16.0), - new Vector3(4 / 16.0, 6.5 / 16.0, 3 / 16.0), - new Vector4(13.75 / 16.0, 14.5 / 16.0, 11.9375 / 16.0, 12.25 / 16.0)), - // mouth_lower - new Quad( - new Vector3(4 / 16.0, 2.5 / 16.0, 3 / 16.0), - new Vector3(12 / 16.0, 2.5 / 16.0, 3 / 16.0), - new Vector3(4 / 16.0, 2.5 / 16.0, -8 / 16.0), - new Vector4(12.75 / 16.0, 12 / 16.0, 11.9375 / 16.0, 10.9375 / 16.0)), - new Quad( - new Vector3(4 / 16.0, 0, -8 / 16.0), - new Vector3(12 / 16.0, 0, -8 / 16.0), - new Vector3(4 / 16.0, 0, 3 / 16.0), - new Vector4(13.5 / 16.0, 12.75 / 16.0, 10.9375 / 16.0, 11.9375 / 16.0)), - new Quad( - new Vector3(12 / 16.0, 0, 3 / 16.0), - new Vector3(12 / 16.0, 0, -8 / 16.0), - new Vector3(12 / 16.0, 2.5 / 16.0, 3 / 16.0), - new Vector4(11 / 16.0, 12 / 16.0, 10.6875 / 16.0, 10.9375 / 16.0)), - new Quad( - new Vector3(4 / 16.0, 0, -8 / 16.0), - new Vector3(4 / 16.0, 0, 3 / 16.0), - new Vector3(4 / 16.0, 2.5 / 16.0, -8 / 16.0), - new Vector4(12.75 / 16.0, 13.75 / 16.0, 10.6875 / 16.0, 10.9375 / 16.0)), - new Quad( - new Vector3(12 / 16.0, 0, -8 / 16.0), - new Vector3(4 / 16.0, 0, -8 / 16.0), - new Vector3(12 / 16.0, 2.5 / 16.0, -8 / 16.0), - new Vector4(12 / 16.0, 12.75 / 16.0, 10.6875 / 16.0, 10.9375 / 16.0)), - new Quad( - new Vector3(4 / 16.0, 0, 3 / 16.0), - new Vector3(12 / 16.0, 0, 3 / 16.0), - new Vector3(4 / 16.0, 2.5 / 16.0, 3 / 16.0), - new Vector4(13.75 / 16.0, 14.5 / 16.0, 10.6875 / 16.0, 10.9375 / 16.0)), - // ear_right - new Quad( - new Vector3(10.3 / 16.0, 15 / 16.0, 10.9 / 16.0), - new Vector3(11.7 / 16.0, 15 / 16.0, 10.9 / 16.0), - new Vector3(10.3 / 16.0, 15 / 16.0, 6.6 / 16.0), - new Vector4(0.375 / 16.0, 0.5 / 16.0, 16 / 16.0, 15.625 / 16.0)), - new Quad( - new Vector3(11.7 / 16.0, 12 / 16.0, 10.9 / 16.0), - new Vector3(11.7 / 16.0, 12 / 16.0, 6.6 / 16.0), - new Vector3(11.7 / 16.0, 15 / 16.0, 10.9 / 16.0), - new Vector4(0.875 / 16.0, 0.5 / 16.0, 15.625 / 16.0, 15.375 / 16.0)), - new Quad( - new Vector3(10.3 / 16.0, 12 / 16.0, 6.6 / 16.0), - new Vector3(10.3 / 16.0, 12 / 16.0, 10.9 / 16.0), - new Vector3(10.3 / 16.0, 15 / 16.0, 6.6 / 16.0), - new Vector4(0.375 / 16.0, 0, 15.375 / 16.0, 15.625 / 16.0)), - new Quad( - new Vector3(11.7 / 16.0, 12 / 16.0, 6.6 / 16.0), - new Vector3(10.3 / 16.0, 12 / 16.0, 6.6 / 16.0), - new Vector3(11.7 / 16.0, 15 / 16.0, 6.6 / 16.0), - new Vector4(0.5 / 16.0, 0.375 / 16.0, 15.375 / 16.0, 15.625 / 16.0)), - new Quad( - new Vector3(10.3 / 16.0, 12 / 16.0, 10.9 / 16.0), - new Vector3(11.7 / 16.0, 12 / 16.0, 10.9 / 16.0), - new Vector3(10.3 / 16.0, 15 / 16.0, 10.9 / 16.0), - new Vector4(1 / 16.0, 0.875 / 16.0, 15.375 / 16.0, 15.625 / 16.0)), - // ear_left - new Quad( - new Vector3(4.3 / 16.0, 15 / 16.0, 10.9 / 16.0), - new Vector3(5.7 / 16.0, 15 / 16.0, 10.9 / 16.0), - new Vector3(4.3 / 16.0, 15 / 16.0, 6.6 / 16.0), - new Vector4(0.5 / 16.0, 0.375 / 16.0, 16 / 16.0, 15.625 / 16.0)), - new Quad( - new Vector3(5.7 / 16.0, 12 / 16.0, 10.9 / 16.0), - new Vector3(5.7 / 16.0, 12 / 16.0, 6.6 / 16.0), - new Vector3(5.7 / 16.0, 15 / 16.0, 10.9 / 16.0), - new Vector4(0, 0.375 / 16.0, 15.375 / 16.0, 15.625 / 16.0)), - new Quad( - new Vector3(4.3 / 16.0, 12 / 16.0, 6.6 / 16.0), - new Vector3(4.3 / 16.0, 12 / 16.0, 10.9 / 16.0), - new Vector3(4.3 / 16.0, 15 / 16.0, 6.6 / 16.0), - new Vector4(0.5 / 16.0, 0.875 / 16.0, 15.375 / 16.0, 15.625 / 16.0)), - new Quad( - new Vector3(5.7 / 16.0, 12 / 16.0, 6.6 / 16.0), - new Vector3(4.3 / 16.0, 12 / 16.0, 6.6 / 16.0), - new Vector3(5.7 / 16.0, 15 / 16.0, 6.6 / 16.0), - new Vector4(0.375 / 16.0, 0.5 / 16.0, 15.375 / 16.0, 15.625 / 16.0)), - new Quad( - new Vector3(4.3 / 16.0, 12 / 16.0, 10.9 / 16.0), - new Vector3(5.7 / 16.0, 12 / 16.0, 10.9 / 16.0), - new Vector3(4.3 / 16.0, 15 / 16.0, 10.9 / 16.0), - new Vector4(0.875 / 16.0, 1 / 16.0, 15.375 / 16.0, 15.625 / 16.0)), - // nose right - new Quad( - new Vector3(10.3 / 16.0, 8 / 16.0, -2 / 16.0), - new Vector3(11.7 / 16.0, 8 / 16.0, -2 / 16.0), - new Vector3(10.3 / 16.0, 8 / 16.0, -5 / 16.0), - new Vector4(7.375 / 16.0, 7.25 / 16.0, 15.75 / 16.0, 16 / 16.0)), - new Quad( - new Vector3(11.7 / 16.0, 6.5 / 16.0, -2 / 16.0), - new Vector3(11.7 / 16.0, 6.5 / 16.0, -5 / 16.0), - new Vector3(11.7 / 16.0, 8 / 16.0, -2 / 16.0), - new Vector4(7.625 / 16.0, 7.375 / 16.0, 15.625 / 16.0, 15.75 / 16.0)), - new Quad( - new Vector3(10.3 / 16.0, 6.5 / 16.0, -5 / 16.0), - new Vector3(10.3 / 16.0, 6.5 / 16.0, -2 / 16.0), - new Vector3(10.3 / 16.0, 8 / 16.0, -5 / 16.0), - new Vector4(7.25 / 16.0, 7 / 16.0, 15.625 / 16.0, 15.75 / 16.0)), - new Quad( - new Vector3(11.7 / 16.0, 6.5 / 16.0, -5 / 16.0), - new Vector3(10.3 / 16.0, 6.5 / 16.0, -5 / 16.0), - new Vector3(11.7 / 16.0, 8 / 16.0, -5 / 16.0), - new Vector4(7.375 / 16.0, 7.25 / 16.0, 15.625 / 16.0, 15.75 / 16.0)), - new Quad( - new Vector3(10.3 / 16.0, 6.5 / 16.0, -2 / 16.0), - new Vector3(11.7 / 16.0, 6.5 / 16.0, -2 / 16.0), - new Vector3(10.3 / 16.0, 8 / 16.0, -2 / 16.0), - new Vector4(7.75 / 16.0, 7.625 / 16.0, 15.625 / 16.0, 15.75 / 16.0)), - // nose_left - new Quad( - new Vector3(4.3 / 16.0, 8 / 16.0, -2 / 16.0), - new Vector3(5.7 / 16.0, 8 / 16.0, -2 / 16.0), - new Vector3(4.3 / 16.0, 8 / 16.0, -5 / 16.0), - new Vector4(7.25 / 16.0, 7.375 / 16.0, 15.75 / 16.0, 16 / 16.0)), - new Quad( - new Vector3(5.7 / 16.0, 6.5 / 16.0, -2 / 16.0), - new Vector3(5.7 / 16.0, 6.5 / 16.0, -5 / 16.0), - new Vector3(5.7 / 16.0, 8 / 16.0, -2 / 16.0), - new Vector4(7 / 16.0, 7.25 / 16.0, 15.625 / 16.0, 15.75 / 16.0)), - new Quad( - new Vector3(4.3 / 16.0, 6.5 / 16.0, -5 / 16.0), - new Vector3(4.3 / 16.0, 6.5 / 16.0, -2 / 16.0), - new Vector3(4.3 / 16.0, 8 / 16.0, -5 / 16.0), - new Vector4(7.375 / 16.0, 7.625 / 16.0, 15.625 / 16.0, 15.75 / 16.0)), - new Quad( - new Vector3(5.7 / 16.0, 6.5 / 16.0, -5 / 16.0), - new Vector3(4.3 / 16.0, 6.5 / 16.0, -5 / 16.0), - new Vector3(5.7 / 16.0, 8 / 16.0, -5 / 16.0), - new Vector4(7.25 / 16.0, 7.375 / 16.0, 15.625 / 16.0, 15.75 / 16.0)), - new Quad( - new Vector3(4.3 / 16.0, 6.5 / 16.0, -2 / 16.0), - new Vector3(5.7 / 16.0, 6.5 / 16.0, -2 / 16.0), - new Vector3(4.3 / 16.0, 8 / 16.0, -2 / 16.0), - new Vector4(7.625 / 16.0, 7.75 / 16.0, 15.625 / 16.0, 15.75 / 16.0)), - }; + private static final Quad[] dragonHead = new BoxModelBuilder() + // head + .addBox(new Vector3(2 / 16., 0, 2 / 16.), new Vector3(14 / 16., 12 / 16., 14 / 16.), box -> + box.withBoxTextureDimensions(16, 16, 16) + .forTextureSize(Texture.dragon, 256, 256).atUVCoordinates(112, 30) + .addTopFace().addBottomFace().addFrontFace().addBackFace().addLeftFace().addRightFace()) + // jaw + .addBox(new Vector3(3.5 / 16., 3 / 16., -8.5 / 16.), new Vector3(12.5 / 16., 6.75 / 16., 3.5 / 16.), box -> + box.withBoxTextureDimensions(12, 5, 16) + .forTextureSize(Texture.dragon, 256, 256).atUVCoordinates(176, 44) + .addTopFace().addBottomFace(UVMapHelper.Side::flipY).addFrontFace().addBackFace().addLeftFace().addRightFace()) + .addBox(new Vector3(3.5 / 16., 0 / 16., -8.5 / 16.), new Vector3(12.5 / 16., 3 / 16., 3.5 / 16.), box -> + box.withBoxTextureDimensions(12, 4, 16) + .forTextureSize(Texture.dragon, 256, 256).atUVCoordinates(176, 65) + .addTopFace().addBottomFace().addFrontFace().addBackFace().addLeftFace().addRightFace() + .transform(Transform.NONE + .translate(0, 0.5 - 3 / 16., 0.5 - 3.5 / 16.) + .rotateX(Math.toRadians(-11.25)) + .translate(0, -0.5 + 3 / 16., -0.5 + 3.5 / 16.) + )) + // ears + .addBox(new Vector3(10.3 / 16., 12 / 16., 6.6 / 16.), new Vector3(11.7 / 16., 15 / 16., 10.9 / 16.), box -> + box.withBoxTextureDimensions(2, 4, 6) + .forTextureSize(Texture.dragon, 256, 256).atUVCoordinates(0, 0) + .addTopFace().addFrontFace().addBackFace().addLeftFace().addRightFace().flipX().mirrorX()) + .addBox(new Vector3(4.3 / 16., 12 / 16., 6.6 / 16.), new Vector3(5.7 / 16., 15 / 16., 10.9 / 16.), box -> + box.withBoxTextureDimensions(2, 4, 6) + .forTextureSize(Texture.dragon, 256, 256).atUVCoordinates(0, 0) + .addTopFace().addFrontFace().addBackFace().addLeftFace().addRightFace().flipX()) + // nose + .addBox(new Vector3(10.25 / 16., 6.5 / 16., -7 / 16.), new Vector3(11.75 / 16., 8 / 16., -4 / 16.), box -> + box.withBoxTextureDimensions(2, 2, 4) + .forTextureSize(Texture.dragon, 256, 256).atUVCoordinates(112, 0) + .addTopFace().addFrontFace().addBackFace().addLeftFace().addRightFace().mirrorX()) + .addBox(new Vector3(4.25 / 16., 6.5 / 16., -7 / 16.), new Vector3(5.75 / 16., 8 / 16., -4 / 16.), box -> + box.withBoxTextureDimensions(2, 2, 4) + .forTextureSize(Texture.dragon, 256, 256).atUVCoordinates(112, 0) + .addTopFace().addFrontFace().addBackFace().addLeftFace().addRightFace()) + .toQuads(); //#endregion //#region Piglin head