From ed9a52c7a519442799e85517d20503d9504291a0 Mon Sep 17 00:00:00 2001 From: OLEGSHA Date: Wed, 29 Jul 2020 21:48:06 +0300 Subject: [PATCH] Added actual storage capabilities to ChunkData Also a block can be changed at (0; 0; 0) by pressing G --- .../client/graphics/world/LayerWorld.java | 15 +++++++++++++ .../optica/client/world/ChunkRender.java | 12 ++++++++++- .../optica/client/world/WorldRender.java | 21 +++++++++++++++---- .../client/world/renders/BlockRenders.java | 12 +++++------ .../common/block/BlockDataRegistry.java | 8 +++++++ .../optica/common/world/ChunkData.java | 15 +++++++------ 6 files changed, 66 insertions(+), 17 deletions(-) diff --git a/src/main/java/ru/windcorp/optica/client/graphics/world/LayerWorld.java b/src/main/java/ru/windcorp/optica/client/graphics/world/LayerWorld.java index ec6a41a..e086e60 100644 --- a/src/main/java/ru/windcorp/optica/client/graphics/world/LayerWorld.java +++ b/src/main/java/ru/windcorp/optica/client/graphics/world/LayerWorld.java @@ -29,6 +29,8 @@ import ru.windcorp.optica.client.graphics.backend.GraphicsInterface; import ru.windcorp.optica.client.graphics.input.CursorMoveEvent; import ru.windcorp.optica.client.graphics.input.KeyEvent; import ru.windcorp.optica.client.world.WorldRender; +import ru.windcorp.optica.common.block.BlockData; +import ru.windcorp.optica.common.block.BlockDataRegistry; import ru.windcorp.optica.common.world.WorldData; public class LayerWorld extends Layer { @@ -129,6 +131,19 @@ public class LayerWorld extends Layer { flag = !flag; break; + + case GLFW.GLFW_KEY_G: + if (!event.isPress()) return; + + BlockData[][][] data = world.getData().getChunk(0, 0, 0).tmp_getBlocks(); + if (data[0][0][0].getId().equals("Test:Stone")) { + data[0][0][0] = BlockDataRegistry.get("Test:Glass"); + } else { + data[0][0][0] = BlockDataRegistry.get("Test:Stone"); + } + world.getChunk(0, 0, 0).markForUpdate(); + + break; } } diff --git a/src/main/java/ru/windcorp/optica/client/world/ChunkRender.java b/src/main/java/ru/windcorp/optica/client/world/ChunkRender.java index 7282de5..1e166b0 100644 --- a/src/main/java/ru/windcorp/optica/client/world/ChunkRender.java +++ b/src/main/java/ru/windcorp/optica/client/world/ChunkRender.java @@ -40,6 +40,7 @@ public class ChunkRender { private final WorldRender world; private final ChunkData data; + private boolean needsUpdate; private Model model = null; public ChunkRender(WorldRender world, ChunkData data) { @@ -55,6 +56,14 @@ public class ChunkRender { return data; } + public void markForUpdate() { + this.needsUpdate = true; + } + + public boolean needsUpdate() { + return needsUpdate; + } + public BlockRender getBlock(int xInChunk, int yInChunk, int zInChunk) { return BlockRenders.get( getData().getBlock(xInChunk, yInChunk, zInChunk).getId() @@ -62,7 +71,7 @@ public class ChunkRender { } public void render(WorldRenderer renderer) { - if (model == null) { + if (model == null || needsUpdate()) { buildModel(); } @@ -122,6 +131,7 @@ public class ChunkRender { } model = new StaticModel(builder); + needsUpdate = false; } private boolean tryToForwardToOptimizers( diff --git a/src/main/java/ru/windcorp/optica/client/world/WorldRender.java b/src/main/java/ru/windcorp/optica/client/world/WorldRender.java index 505c057..46efe7c 100644 --- a/src/main/java/ru/windcorp/optica/client/world/WorldRender.java +++ b/src/main/java/ru/windcorp/optica/client/world/WorldRender.java @@ -17,8 +17,9 @@ *******************************************************************************/ package ru.windcorp.optica.client.world; -import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import ru.windcorp.optica.client.graphics.world.WorldRenderer; import ru.windcorp.optica.common.world.ChunkData; @@ -28,13 +29,13 @@ public class WorldRender { private final WorldData data; - private final Collection chunks = new ArrayList<>(); + private final Map chunks = new HashMap<>(); public WorldRender(WorldData data) { this.data = data; for (ChunkData chunkData : data.getChunks()) { - chunks.add(new ChunkRender(this, chunkData)); + chunks.put(chunkData, new ChunkRender(this, chunkData)); } } @@ -42,10 +43,22 @@ public class WorldRender { return data; } + public ChunkRender getChunk(ChunkData chunkData) { + return chunks.get(chunkData); + } + + public ChunkRender getChunk(int x, int y, int z) { + return chunks.get(getData().getChunk(x, y, z)); + } + + public Collection getChunks() { + return chunks.values(); + } + public void render(WorldRenderer renderer) { renderer.pushWorldTransform().rotateX(-Math.PI / 2); - for (ChunkRender chunk : chunks) { + for (ChunkRender chunk : getChunks()) { chunk.render(renderer); } } diff --git a/src/main/java/ru/windcorp/optica/client/world/renders/BlockRenders.java b/src/main/java/ru/windcorp/optica/client/world/renders/BlockRenders.java index 75be839..d8d58fe 100644 --- a/src/main/java/ru/windcorp/optica/client/world/renders/BlockRenders.java +++ b/src/main/java/ru/windcorp/optica/client/world/renders/BlockRenders.java @@ -40,14 +40,14 @@ public class BlockRenders { private BlockRenders() {} static { - register(new BlockRenderOpaqueCube("Grass", "Test", grassTop, dirtT, grassSide, grassSide, grassSide, grassSide)); - register(new BlockRenderOpaqueCube("Dirt", "Test", dirtT, dirtT, dirtT, dirtT, dirtT, dirtT)); - register(new BlockRenderOpaqueCube("Stone", "Test", stoneT, stoneT, stoneT, stoneT, stoneT, stoneT)); + register(new BlockRenderOpaqueCube("Test", "Grass", grassTop, dirtT, grassSide, grassSide, grassSide, grassSide)); + register(new BlockRenderOpaqueCube("Test", "Dirt", dirtT, dirtT, dirtT, dirtT, dirtT, dirtT)); + register(new BlockRenderOpaqueCube("Test", "Stone", stoneT, stoneT, stoneT, stoneT, stoneT, stoneT)); - register(new BlockRenderOpaqueCube("Compass", "Test", qtex("compass"), qtex("compass"), qtex("side_north"), qtex("side_south"), qtex("side_east"), qtex("side_west"))); + register(new BlockRenderOpaqueCube("Test", "Compass", qtex("compass"), qtex("compass"), qtex("side_north"), qtex("side_south"), qtex("side_east"), qtex("side_west"))); - register(new BlockRenderNone("Air", "Test")); - register(new BlockRenderTransparentCube("Glass", "Test", glassT, glassT, glassT, glassT, glassT, glassT)); + register(new BlockRenderNone("Test", "Air")); + register(new BlockRenderTransparentCube("Test", "Glass", glassT, glassT, glassT, glassT, glassT, glassT)); } public static BlockRender get(String name) { diff --git a/src/main/java/ru/windcorp/optica/common/block/BlockDataRegistry.java b/src/main/java/ru/windcorp/optica/common/block/BlockDataRegistry.java index 0363fc7..cb6691c 100644 --- a/src/main/java/ru/windcorp/optica/common/block/BlockDataRegistry.java +++ b/src/main/java/ru/windcorp/optica/common/block/BlockDataRegistry.java @@ -24,6 +24,14 @@ public class BlockDataRegistry { private static final Map REGISTRY = new HashMap<>(); + static { + register(new BlockData("Test", "Grass")); + register(new BlockData("Test", "Dirt")); + register(new BlockData("Test", "Stone")); + register(new BlockData("Test", "Air")); + register(new BlockData("Test", "Glass")); + } + public static BlockData get(String name) { return REGISTRY.get(name); } diff --git a/src/main/java/ru/windcorp/optica/common/world/ChunkData.java b/src/main/java/ru/windcorp/optica/common/world/ChunkData.java index ca5f363..a03efae 100644 --- a/src/main/java/ru/windcorp/optica/common/world/ChunkData.java +++ b/src/main/java/ru/windcorp/optica/common/world/ChunkData.java @@ -19,6 +19,7 @@ package ru.windcorp.optica.common.world; import glm.vec._3.i.Vec3i; import ru.windcorp.optica.common.block.BlockData; +import ru.windcorp.optica.common.block.BlockDataRegistry; public class ChunkData { @@ -32,12 +33,10 @@ public class ChunkData { [BLOCKS_PER_CHUNK] [BLOCKS_PER_CHUNK]; - private final BlockData grass = new BlockData("Grass", "Test"); - private final BlockData dirt = new BlockData("Dirt", "Test"); - private final BlockData stone = new BlockData("Stone", "Test"); - private final BlockData air = new BlockData("Air", "Test"); -// private final BlockData glass = new BlockData("Glass", "Test"); -// private final BlockData compass = new BlockData("Compass", "Test"); + private final BlockData grass = BlockDataRegistry.get("Test:Grass"); + private final BlockData dirt = BlockDataRegistry.get("Test:Dirt"); + private final BlockData stone = BlockDataRegistry.get("Test:Stone"); + private final BlockData air = BlockDataRegistry.get("Test:Air"); public ChunkData(int x, int y, int z) { this.x = x; @@ -47,6 +46,10 @@ public class ChunkData { tmp_generate(); } + public BlockData[][][] tmp_getBlocks() { + return blocks; + } + private void tmp_generate() { Vec3i aPoint = new Vec3i(5, 0, BLOCKS_PER_CHUNK + BLOCKS_PER_CHUNK/2); Vec3i pos = new Vec3i();