Added actual storage capabilities to ChunkData

Also a block can be changed at (0; 0; 0) by pressing G
This commit is contained in:
OLEGSHA 2020-07-29 21:48:06 +03:00
parent 3e0f17c959
commit ed9a52c7a5
6 changed files with 66 additions and 17 deletions

View File

@ -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;
}
}

View File

@ -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(

View File

@ -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<ChunkRender> chunks = new ArrayList<>();
private final Map<ChunkData, ChunkRender> 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<ChunkRender> 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);
}
}

View File

@ -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) {

View File

@ -24,6 +24,14 @@ public class BlockDataRegistry {
private static final Map<String, BlockData> 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);
}

View File

@ -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();