From ac8e57c3d45dac7533f5df83fb8d7e0581fd9554 Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 18 Aug 2020 22:40:33 +0200 Subject: [PATCH] added support for vertically flipped blocks --- .../blockModels/BlockConfiguration.java | 1 + .../render/blockModels/Face/Face.java | 11 +++++--- .../blockModels/subBlocks/SubBlock.java | 26 ++++++++++++++++--- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/render/blockModels/BlockConfiguration.java b/src/main/java/de/bixilon/minosoft/render/blockModels/BlockConfiguration.java index c2e73e772..de2ab43e5 100644 --- a/src/main/java/de/bixilon/minosoft/render/blockModels/BlockConfiguration.java +++ b/src/main/java/de/bixilon/minosoft/render/blockModels/BlockConfiguration.java @@ -23,6 +23,7 @@ public class BlockConfiguration { BlockRotation rotation; HashSet blockProperties; + public BlockConfiguration(String config) { blockProperties = new HashSet<>(); for (String configuration : config.split(",")) { diff --git a/src/main/java/de/bixilon/minosoft/render/blockModels/Face/Face.java b/src/main/java/de/bixilon/minosoft/render/blockModels/Face/Face.java index 38faa0d41..a7d3710d9 100644 --- a/src/main/java/de/bixilon/minosoft/render/blockModels/Face/Face.java +++ b/src/main/java/de/bixilon/minosoft/render/blockModels/Face/Face.java @@ -14,7 +14,6 @@ package de.bixilon.minosoft.render.blockModels.Face; import de.bixilon.minosoft.game.datatypes.world.BlockPosition; -import de.bixilon.minosoft.render.blockModels.subBlocks.Cuboid; import de.bixilon.minosoft.render.blockModels.subBlocks.SubBlockPosition; import de.bixilon.minosoft.render.texture.InFaceUV; import javafx.util.Pair; @@ -23,14 +22,18 @@ public class Face { SubBlockPosition[] positions; InFaceUV uv; - public Face(FaceOrientation orientation, Pair texture, InFaceUV uv, Cuboid cuboid) { - positions = cuboid.getFacePositions(orientation); + public Face(Pair texture, InFaceUV uv, SubBlockPosition[] facePositions) { + positions = facePositions; this.uv = uv; this.uv.prepare(texture); } + public Face() { + positions = new SubBlockPosition[]{}; + } + public void draw(BlockPosition pos) { - for (int i = 0; i < 4; i++) { + for (int i = 0; i < positions.length; i++) { uv.draw(i); positions[i].draw(pos); } diff --git a/src/main/java/de/bixilon/minosoft/render/blockModels/subBlocks/SubBlock.java b/src/main/java/de/bixilon/minosoft/render/blockModels/subBlocks/SubBlock.java index f7552e3e7..3e88434b0 100644 --- a/src/main/java/de/bixilon/minosoft/render/blockModels/subBlocks/SubBlock.java +++ b/src/main/java/de/bixilon/minosoft/render/blockModels/subBlocks/SubBlock.java @@ -15,6 +15,7 @@ package de.bixilon.minosoft.render.blockModels.subBlocks; import com.google.gson.JsonObject; import de.bixilon.minosoft.game.datatypes.objectLoader.blocks.Block; +import de.bixilon.minosoft.game.datatypes.objectLoader.blocks.BlockRotation; import de.bixilon.minosoft.render.blockModels.Face.Face; import de.bixilon.minosoft.render.blockModels.Face.FaceOrientation; import de.bixilon.minosoft.render.texture.InFaceUV; @@ -110,14 +111,33 @@ public class SubBlock { if (!textureCoordinates.containsKey(orientation)) { continue; } - if (!(adjacentBlocks.get(orientation) && cullFaceTextures.get(orientation))) { - result.add(new Face(orientation, textureCoordinates.get(orientation), - uv.get(orientation), cuboid)); + if (block.getRotation().equals(BlockRotation.DOWN)) { + if (orientation.equals(FaceOrientation.DOWN)) { + result.add(prepareFace(FaceOrientation.DOWN, FaceOrientation.UP, + adjacentBlocks)); + continue; + } + if (orientation.equals(FaceOrientation.UP)) { + result.add(prepareFace(FaceOrientation.UP, FaceOrientation.DOWN, + adjacentBlocks)); + continue; + } + } + result.add(prepareFace(orientation, orientation, adjacentBlocks)); } return result; } + private Face prepareFace(FaceOrientation textureDirection, FaceOrientation faceDirection, + HashMap adjacentBlocks) { + if (adjacentBlocks.get(faceDirection) && !cullFaceTextures.get(faceDirection)) { + return new Face(); + } + return new Face(textureCoordinates.get(textureDirection), uv.get(textureDirection), + cuboid.getFacePositions(faceDirection)); + } + public boolean isFull() { return isFull; }