diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/world/World.java b/src/main/java/de/bixilon/minosoft/game/datatypes/world/World.java index c3c470fbb..af8c25d69 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/world/World.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/world/World.java @@ -79,14 +79,14 @@ public class World { public void setChunk(ChunkLocation location, Chunk chunk) { chunks.put(location, chunk); - MainWindow.getRenderer().prepareChunk(location, chunk); + MainWindow.getRenderer().queueChunk(location, chunk); } public void setChunks(HashMap chunkMap) { for (Map.Entry set : chunkMap.entrySet()) { chunks.put(set.getKey(), set.getValue()); } - MainWindow.getRenderer().prepareChunkBulk(chunkMap); + MainWindow.getRenderer().queueChunkBulk(chunkMap); } public boolean isHardcore() { diff --git a/src/main/java/de/bixilon/minosoft/render/WorldRenderer.java b/src/main/java/de/bixilon/minosoft/render/WorldRenderer.java index 6417b6836..bde4ba121 100644 --- a/src/main/java/de/bixilon/minosoft/render/WorldRenderer.java +++ b/src/main/java/de/bixilon/minosoft/render/WorldRenderer.java @@ -20,10 +20,10 @@ import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.render.blockModels.BlockModelLoader; import de.bixilon.minosoft.render.blockModels.Face.Face; import de.bixilon.minosoft.render.blockModels.Face.FaceOrientation; +import javafx.util.Pair; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; +import java.util.*; +import java.util.concurrent.LinkedBlockingQueue; import static de.bixilon.minosoft.render.blockModels.Face.RenderConstants.faceDir; import static org.lwjgl.opengl.GL11.*; @@ -32,21 +32,41 @@ public class WorldRenderer { private final HashMap> faces; private BlockModelLoader modelLoader; + private LinkedBlockingQueue> queuedChunks; + Thread chunkLoadThread; + public WorldRenderer() { faces = new HashMap<>(); } public void init() { + queuedChunks = new LinkedBlockingQueue<>(); + chunkLoadThread = new Thread(() -> { + while (true) { + try { + Pair current = queuedChunks.take(); + prepareChunk(current.getKey(), current.getValue()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }); + chunkLoadThread.setName(String.format("%d/ChunkLoading", 0)); // TODO: connection ID + chunkLoadThread.start(); modelLoader = new BlockModelLoader(); Log.info("Finished loading textures"); } - public void prepareChunkBulk(HashMap chunks) { + public void queueChunkBulk(HashMap chunks) { for (Map.Entry set : chunks.entrySet()) { - prepareChunk(set.getKey(), set.getValue()); + queueChunk(set.getKey(), set.getValue()); } } + public void queueChunk(ChunkLocation location, Chunk chunk) { + queuedChunks.add(new Pair<>(location, chunk)); + } + public void prepareChunk(ChunkLocation location, Chunk chunk) { int xOffset = location.getX() * 16; int zOffset = location.getZ() * 16; @@ -61,8 +81,9 @@ public class WorldRenderer { } public void prepareBlock(BlockPosition position, Block block) { - if (block.equals(Blocks.nullBlock)) + if (block.equals(Blocks.nullBlock)) { faces.put(position, null); + } HashMap adjacentBlocks = new HashMap<>(); for (FaceOrientation orientation : FaceOrientation.values()) { diff --git a/src/main/java/de/bixilon/minosoft/render/blockModels/BlockModel.java b/src/main/java/de/bixilon/minosoft/render/blockModels/BlockModel.java index a803e25af..47e9d7c02 100644 --- a/src/main/java/de/bixilon/minosoft/render/blockModels/BlockModel.java +++ b/src/main/java/de/bixilon/minosoft/render/blockModels/BlockModel.java @@ -134,7 +134,7 @@ public class BlockModel { } } - private void applyConfigurationTextures(HashSet subBlocks, String mod, TextureLoader loader) { + public static void applyConfigurationTextures(HashSet subBlocks, String mod, TextureLoader loader) { for (SubBlock subBlock : subBlocks) { subBlock.applyTextures(mod, loader); } diff --git a/src/main/java/de/bixilon/minosoft/render/blockModels/FireModel.java b/src/main/java/de/bixilon/minosoft/render/blockModels/FireModel.java index 50ca8bf18..11f9edec0 100644 --- a/src/main/java/de/bixilon/minosoft/render/blockModels/FireModel.java +++ b/src/main/java/de/bixilon/minosoft/render/blockModels/FireModel.java @@ -20,7 +20,9 @@ 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.blockModels.subBlocks.SubBlock; +import de.bixilon.minosoft.render.texture.TextureLoader; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -74,4 +76,28 @@ public class FireModel extends BlockModel { public boolean isFull() { return false; } + + @Override + public HashSet getAllTextures() { + HashSet result = new HashSet<>(); + result.addAll(getTextures(floor)); + result.addAll(getTextures(side)); + result.addAll(getTextures(up)); + return result; + } + + private HashSet getTextures(HashSet subBlocks) { + HashSet result = new HashSet<>(); + for (SubBlock subBlock : subBlocks) { + result.addAll(subBlock.getTextures()); + } + return result; + } + + @Override + public void applyTextures(String mod, TextureLoader loader) { + applyConfigurationTextures(floor, mod, loader); + applyConfigurationTextures(side, mod, loader); + applyConfigurationTextures(up, mod, loader); + } } 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 8d36d872d..2a656586a 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 @@ -139,7 +139,8 @@ public class SubBlock { public HashSet getFacesSimple(BlockRotation rotation) { HashSet result = new HashSet<>(); for (FaceOrientation orientation : FaceOrientation.values()) { - result.add(prepareFace(orientation, rotation, new HashMap<>())); + result.add(new Face(textureCoordinates.get(orientation), uv.get(orientation), + cuboid.getFacePositions(orientation, rotation))); } return result; } diff --git a/src/main/resources/assets/mapping/blockModels/minecraft.json b/src/main/resources/assets/mapping/blockModels/minecraft.json index 1f5d6c4dd..a037cd21e 100644 --- a/src/main/resources/assets/mapping/blockModels/minecraft.json +++ b/src/main/resources/assets/mapping/blockModels/minecraft.json @@ -445,38 +445,6 @@ } ] }, - "sticky_piston": { - "states": [ - { - "properties": { - "extended": "true" - }, - "blockModel": "piston_extended" - }, - { - "properties": { - "extended": "false" - }, - "blockModel": "sticky_piston" - } - ] - }, - "piston": { - "states": [ - { - "properties": { - "extended": "true" - }, - "blockModel": "piston_extended" - }, - { - "properties": { - "extended": "false" - }, - "blockModel": "piston" - } - ] - }, "cobweb": { "blockModel": "cobweb" }, @@ -662,11 +630,43 @@ }, "fire": { "type": "fire", - "floor": "fire_floor_0", + "floor": "fire_floor0", "side": "fire_side0", - "up": "fire_up_0" + "up": "fire_up0" } }, + "sticky_piston": { + "states": [ + { + "properties": { + "extended": "true" + }, + "blockModel": "piston_extended" + }, + { + "properties": { + "extended": "false" + }, + "blockModel": "sticky_piston" + } + ] + }, + "piston": { + "states": [ + { + "properties": { + "extended": "true" + }, + "blockModel": "piston_extended" + }, + { + "properties": { + "extended": "false" + }, + "blockModel": "piston" + } + ] + }, "tinted_textures": { "block/grass_block_top": [0,1,0], "block/grass": [0,1,0]