diff --git a/src/main/java/de/bixilon/minosoft/render/WorldRenderer.java b/src/main/java/de/bixilon/minosoft/render/WorldRenderer.java index 198af9b72..13043fde9 100644 --- a/src/main/java/de/bixilon/minosoft/render/WorldRenderer.java +++ b/src/main/java/de/bixilon/minosoft/render/WorldRenderer.java @@ -81,7 +81,7 @@ public class WorldRenderer { private void prepareChunk(ChunkLocation location, Chunk chunk) { // clear or create current chunk - ConcurrentHashMap chunkFaces = new ConcurrentHashMap<>(); + ConcurrentHashMap chunkFaces = new ConcurrentHashMap<>(); chunk.getNibbles().forEach(((height, chunkNibble) -> chunkFaces.put(height, getFacesForChunkNibble(location, height, chunkNibble)))); faces.put(location, chunkFaces); } @@ -90,12 +90,12 @@ public class WorldRenderer { faces.get(chunkLocation).put(sectionHeight, getFacesForChunkNibble(chunkLocation, sectionHeight, nibble)); } - private ConcurrentHashMap getFacesForChunkNibble(ChunkLocation chunkLocation, byte sectionHeight, ChunkNibble nibble) { - HashMap world = GameWindow.getConnection().getPlayer().getWorld().getAllChunks(); + private ArrayFloatList getFacesForChunkNibble(ChunkLocation chunkLocation, byte sectionHeight, ChunkNibble nibble) { + ConcurrentHashMap world = GameWindow.getConnection().getPlayer().getWorld().getAllChunks(); // clear or create current chunk nibble - ConcurrentHashMap nibbleMap = new ConcurrentHashMap<>(); + ArrayFloatList nibbleMap = new ArrayFloatList(); faces.get(chunkLocation).put(sectionHeight, nibbleMap); - HashMap nibbleBlocks = nibble.getBlocks(); + ConcurrentHashMap nibbleBlocks = nibble.getBlocks(); nibbleBlocks.forEach((location, block) -> { HashSet facesToDraw = new HashSet<>(); @@ -175,67 +175,15 @@ public class WorldRenderer { } } if (!facesToDraw.isEmpty()) { - nibbleMap.put(location, assetsLoader.getBlockModelLoader().prepare(block, facesToDraw)); + nibbleMap.addAll(assetsLoader.getBlockModelLoader().prepare(block, facesToDraw, new BlockPosition(chunkLocation, sectionHeight, location))); } - - } + }); return nibbleMap; } private void prepareBlock(BlockPosition position, Block block, boolean trustEdges) { - HashSet facesToDraw = new HashSet<>(); - - if (block != null && !block.equals(Blocks.nullBlock)) { - for (FaceOrientation orientation : FaceOrientation.values()) { - Block dependedBlock = switch (orientation) { - case DOWN -> { - if (position.getY() == RenderConstants.CHUNK_MIN_Y) { - facesToDraw.add(orientation); - yield null; - } - yield GameWindow.getConnection().getPlayer().getWorld().getBlock(new BlockPosition(position.getX(), position.getY() - 1, position.getZ())); - } - case UP -> { - if (position.getY() == RenderConstants.CHUNK_MAX_Y) { - facesToDraw.add(orientation); - yield null; - } - yield GameWindow.getConnection().getPlayer().getWorld().getBlock(new BlockPosition(position.getX(), position.getY() + 1, position.getZ())); - } - case NORTH -> GameWindow.getConnection().getPlayer().getWorld().getBlock(new BlockPosition(position.getX(), position.getY(), position.getZ() - 1)); - case SOUTH -> GameWindow.getConnection().getPlayer().getWorld().getBlock(new BlockPosition(position.getX(), position.getY(), position.getZ() + 1)); - case WEST -> GameWindow.getConnection().getPlayer().getWorld().getBlock(new BlockPosition(position.getX() - 1, position.getY(), position.getZ())); - case EAST -> GameWindow.getConnection().getPlayer().getWorld().getBlock(new BlockPosition(position.getX() + 1, position.getY(), position.getZ())); - }; - if (dependedBlock == null || !assetsLoader.getBlockModelLoader().isFull(dependedBlock)) { - facesToDraw.add(orientation); - } - } - } - ConcurrentHashMap nibbleMap = faces.get(position.getChunkLocation()).get((byte) (position.getY() / RenderConstants.SECTION_HEIGHT)); - if (facesToDraw.size() == 0) { - // remove all faces - nibbleMap.remove(position.getInChunkLocation().getChunkNibbleLocation()); - } else { - nibbleMap.put(position.getInChunkLocation().getChunkNibbleLocation(), assetsLoader.getBlockModelLoader().prepare(block, facesToDraw, position)); - } - - if (trustEdges) { - return; - } - if (position.getY() != RenderConstants.CHUNK_MIN_Y) { - // bottom - prepareBlock(new BlockPosition(position.getX(), position.getY() - 1, position.getZ()), true); - } - if (position.getY() != RenderConstants.CHUNK_MAX_Y) { - // bottom - prepareBlock(new BlockPosition(position.getX(), position.getY() + 1, position.getZ()), true); - } - prepareBlock(new BlockPosition(position.getX() + 1, position.getY(), position.getZ()), true); - prepareBlock(new BlockPosition(position.getX() - 1, position.getY(), position.getZ()), true); - prepareBlock(new BlockPosition(position.getX(), position.getY(), position.getZ() + 1), true); - prepareBlock(new BlockPosition(position.getX(), position.getY(), position.getZ() - 1), true); + // TODO } private void prepareBlock(BlockPosition position, boolean trustEdges) { diff --git a/src/main/java/de/bixilon/minosoft/render/blockModels/specialModels/CropModel.java b/src/main/java/de/bixilon/minosoft/render/blockModels/specialModels/CropModel.java index 74f65edf4..4c4a681e9 100644 --- a/src/main/java/de/bixilon/minosoft/render/blockModels/specialModels/CropModel.java +++ b/src/main/java/de/bixilon/minosoft/render/blockModels/specialModels/CropModel.java @@ -45,7 +45,6 @@ public class CropModel implements BlockModelInterface { return prepareBlockState(modelMap.get(property.name()), facesToDraw, block, position); } } - throw new RuntimeException("failed to prepare block: " + block.toString()); throw new RuntimeException("Failed to prepare block: " + block.toString()); }