Skip to content

Commit a78af4b

Browse files
committed
3D chunking
1 parent 51f06e1 commit a78af4b

File tree

6 files changed

+80
-61
lines changed

6 files changed

+80
-61
lines changed

src/core/src/com/ru/tgra/ourcraft/GameManager.java

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class GameManager
1212

1313
public static WorldGenerator worldGenerator;
1414
public static Block.BlockType[][][] worldBlocks;
15-
public static Chunk[][] chunks;
15+
public static Chunk[][][] chunks;
1616

1717
public static boolean mainMenu;
1818
public static boolean loaded;
@@ -48,8 +48,9 @@ public static void createWorld()
4848

4949
public static void drawWorld()
5050
{
51-
int chunkX = (int) player.getPosition().x / Settings.chunkWidth;
52-
int chunkY = (int) player.getPosition().z / Settings.chunkHeight;
51+
int chunkX = MathUtils.getChunkX((int) player.getPosition().x, Settings.chunkX);
52+
int chunkY = MathUtils.getChunkX((int) player.getPosition().y, Settings.chunkY);
53+
int chunkZ = MathUtils.getChunkX((int) player.getPosition().z, Settings.chunkZ);
5354

5455
int startX = chunkX - Settings.chunkDrawRadius;
5556
startX = (startX < 0 ? 0 : startX);
@@ -63,11 +64,20 @@ public static void drawWorld()
6364
int endY = chunkY + Settings.chunkDrawRadius;
6465
endY = (chunks[0].length-1 < endY ? chunks[0].length-1 : endY);
6566

67+
int startZ = chunkZ - Settings.chunkDrawRadius;
68+
startZ = (startZ < 0 ? 0 : startZ);
69+
70+
int endZ = chunkZ + Settings.chunkDrawRadius;
71+
endZ = (chunks[0][0].length-1 < endZ ? chunks[0][0].length-1 : endZ);
72+
6673
for (int x = startX; x <= endX; x++)
6774
{
6875
for (int y = startY; y <= endY; y++)
6976
{
70-
chunks[x][y].drawBlocks();
77+
for (int z = startZ; z <= endZ; z++)
78+
{
79+
chunks[x][y][z].drawBlocks();
80+
}
7181
}
7282
}
7383
}
@@ -88,8 +98,9 @@ public static void addBlock(Point3D pos, Block.BlockType type)
8898
return;
8999
}
90100

91-
int chunkX = MathUtils.getChunkX(x, Settings.chunkWidth);
92-
int chunkY = MathUtils.getChunkY(z, Settings.chunkHeight);
101+
int chunkX = MathUtils.getChunkX(x, Settings.chunkX);
102+
int chunkY = MathUtils.getChunkY(y, Settings.chunkY);
103+
int chunkZ = MathUtils.getChunkZ(z, Settings.chunkZ);
93104

94105
setWorldBlocksBlock(pos, type);
95106

@@ -100,12 +111,13 @@ public static void addBlock(Point3D pos, Block.BlockType type)
100111
BlockUtils.createBlockMask(x, y, z, worldBlocks),
101112
type,
102113
chunkX,
103-
chunkY
114+
chunkY,
115+
chunkZ
104116
);
105117

106118
redoMasksForAdjacentBlocks(block);
107119

108-
chunks[block.getChunkX()][block.getChunkY()].addBlock(block);
120+
chunks[block.getChunkX()][block.getChunkY()][block.getChunkZ()].addBlock(block);
109121

110122
AudioManager.playPlaceBlock();
111123
}
@@ -121,22 +133,12 @@ public static void removeBlocks()
121133
{
122134
setWorldBlocksBlock(block.getPosition(), Block.BlockType.EMPTY);
123135
redoMasksForAdjacentBlocks(block);
124-
chunks[block.getChunkX()][block.getChunkY()].removeBlock(block.getID());
136+
chunks[block.getChunkX()][block.getChunkY()][block.getChunkZ()].removeBlock(block.getID());
125137
}
126138

127139
blocksToRemove.clear();
128140
}
129141

130-
public static Block getBlock(int x, int y, int z)
131-
{
132-
int chunkX = MathUtils.getChunkX(x, Settings.chunkWidth);
133-
int chunkY = MathUtils.getChunkY(z, Settings.chunkHeight);
134-
135-
int ID = MathUtils.cartesianHash(x, y, z);
136-
137-
return chunks[chunkX][chunkY].getBlock(ID);
138-
}
139-
140142
private static void createTorch()
141143
{
142144
torch = new Torch();
@@ -226,19 +228,20 @@ private static void redoBlock(int x, int y, int z)
226228

227229
CubeMask mask = BlockUtils.createBlockMask(x, y, z, worldBlocks);
228230

229-
int chunkX = MathUtils.getChunkX(x, Settings.chunkWidth);
230-
int chunkY = MathUtils.getChunkY(z, Settings.chunkHeight);
231+
int chunkX = MathUtils.getChunkX(x, Settings.chunkX);
232+
int chunkY = MathUtils.getChunkY(y, Settings.chunkY);
233+
int chunkZ = MathUtils.getChunkZ(z, Settings.chunkZ);
231234

232235
int ID = MathUtils.cartesianHash(x, y, z);
233236

234237
if (mask.isInvisible())
235238
{
236-
chunks[chunkX][chunkY].removeBlock(ID);
239+
chunks[chunkX][chunkY][chunkZ].removeBlock(ID);
237240
}
238241
else
239242
{
240-
chunks[chunkX][chunkY].assertBlock(ID, x, y, z, worldBlocks[x][y][z]);
241-
chunks[chunkX][chunkY].setBlockMask(ID, mask);
243+
chunks[chunkX][chunkY][chunkZ].assertBlock(ID, x, y, z, worldBlocks[x][y][z]);
244+
chunks[chunkX][chunkY][chunkZ].setBlockMask(ID, mask);
242245
}
243246
}
244247
}

src/core/src/com/ru/tgra/ourcraft/Settings.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@ public class Settings
1616
public static final int worldX = 512;
1717
public static final int worldZ = 512;
1818
public static final int worldY = 128;
19+
public static final int worldScale = 128;
1920
public static final int worldFeatureSize = 8;
2021
public static final int worldSmoothness = 16;
2122
public static final int cavernMinHeight = 3;
2223
public static final int cavernMaxHeight = 6;
23-
public static final int chunkWidth = 16;
24-
public static final int chunkHeight = 16;
24+
public static final int chunkX = 16;
25+
public static final int chunkY = 16;
26+
public static final int chunkZ = 16;
2527
public static final Vector3D blockSize = new Vector3D(1f, 1f, 1f);
2628
public static final Vector3D torchSize = new Vector3D(0.1f, 0.5f, 0.1f);
2729
public static final float dayNightCycleSpeed = 0.01f;

src/core/src/com/ru/tgra/ourcraft/models/Chunk.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.ru.tgra.ourcraft.models;
22

3+
import com.ru.tgra.ourcraft.GameManager;
34
import com.ru.tgra.ourcraft.Settings;
45
import com.ru.tgra.ourcraft.objects.Block;
56
import com.ru.tgra.ourcraft.objects.Torch;
@@ -12,12 +13,14 @@ public class Chunk
1213
private Map<Integer, Block> blockMap;
1314
private int chunkX;
1415
private int chunkY;
16+
private int chunkZ;
1517

16-
public Chunk(Map<Integer, Block> blockMap, int chunkX, int chunkY)
18+
public Chunk(Map<Integer, Block> blockMap, int chunkX, int chunkY, int chunkZ)
1719
{
1820
this.blockMap = blockMap;
1921
this.chunkX = chunkX;
2022
this.chunkY = chunkY;
23+
this.chunkZ = chunkZ;
2124
}
2225

2326
public void drawBlocks()
@@ -67,7 +70,8 @@ public void assertBlock(int ID, int x, int y, int z, Block.BlockType type)
6770
new CubeMask(),
6871
type,
6972
chunkX,
70-
chunkY
73+
chunkY,
74+
chunkZ
7175
);
7276

7377
addBlock(block);

src/core/src/com/ru/tgra/ourcraft/objects/Block.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,15 @@ public enum TargetFace
5454
protected float distanceFromPlayer;
5555
protected int chunkX;
5656
protected int chunkY;
57+
protected int chunkZ;
5758
protected TargetFace targetFace;
5859

5960
protected Point3D leftBottom;
6061
protected Point3D rightTop;
6162

6263
private float grassTimer;
6364

64-
public Block(int ID, Point3D position, Vector3D scale, CubeMask mask, BlockType type, int chunkX, int chunkY)
65+
public Block(int ID, Point3D position, Vector3D scale, CubeMask mask, BlockType type, int chunkX, int chunkY, int chunkZ)
6566
{
6667
super();
6768

@@ -72,6 +73,7 @@ public Block(int ID, Point3D position, Vector3D scale, CubeMask mask, BlockType
7273
blockType = type;
7374
this.chunkX = chunkX;
7475
this.chunkY = chunkY;
76+
this.chunkZ = chunkZ;
7577

7678
renderMask = new CubeMask(mask);
7779
minimapMask = new CubeMask(false, false, false, false, true, false);
@@ -244,6 +246,11 @@ public int getChunkY()
244246
return chunkY;
245247
}
246248

249+
public int getChunkZ()
250+
{
251+
return chunkZ;
252+
}
253+
247254
public TargetFace getTargetFace()
248255
{
249256
return targetFace;

src/core/src/com/ru/tgra/ourcraft/utilities/MathUtils.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,19 @@ public static int cartesianHash(int x, int y, int z)
3838
return x + (y << 10) + (z << 20);
3939
}
4040

41-
public static int getChunkX(int x, int chunkWidth)
41+
public static int getChunkX(int x, int chunkX)
4242
{
43-
return (x / chunkWidth);
43+
return (x / chunkX);
4444
}
4545

46-
public static int getChunkY(int y, int chunkHeight)
46+
public static int getChunkY(int y, int chunkY)
4747
{
48-
return (y / chunkHeight);
48+
return (y / chunkY);
49+
}
50+
51+
public static int getChunkZ(int z, int chunkZ)
52+
{
53+
return (z / chunkZ);
4954
}
5055

5156
public static float lerp(float a, float b, float t)

src/core/src/com/ru/tgra/ourcraft/utilities/WorldGenerator.java

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
public class WorldGenerator
1414
{
1515
private Block.BlockType[][][] worldBlocks;
16-
private Chunk[][] chunks;
16+
private Chunk[][][] chunks;
1717
private OpenSimplexNoise noise;
1818
private int[][] overworldHeightMap;
1919
private int maxX;
@@ -34,21 +34,12 @@ public WorldGenerator()
3434
maxZ = Settings.worldZ;
3535
}
3636

37-
public void generateWorld()
38-
{
39-
System.out.println("Lowest Y: " + lowestY);
40-
System.out.println("Highest Y: " + highestY);
41-
System.out.println("Chunks X: " + chunks.length);
42-
System.out.println("Chunks Y: " + chunks[0].length);
43-
System.out.println("Chunks: " + (chunks.length * chunks[0].length));
44-
}
45-
4637
public Block.BlockType[][][] getWorldBlocks()
4738
{
4839
return worldBlocks;
4940
}
5041

51-
public Chunk[][] getChunks()
42+
public Chunk[][][] getChunks()
5243
{
5344
return chunks;
5445
}
@@ -90,7 +81,7 @@ public void smoothenOverworldHeightMap()
9081

9182
private void generateHeightMap(int[][] heightmap)
9283
{
93-
float scalar = Settings.worldY / 2;
84+
float scalar = Settings.worldScale / 2;
9485

9586
noise = new OpenSimplexNoise(new Date().getTime());
9687

@@ -230,16 +221,20 @@ public void generateChunks()
230221
{
231222
long startTime = System.nanoTime();
232223

233-
int chunkX = Settings.worldX / Settings.chunkWidth;
234-
int chunkY = Settings.worldZ / Settings.chunkHeight;
224+
int chunkX = Settings.worldX / Settings.chunkX;
225+
int chunkY = Settings.worldY / Settings.chunkY;
226+
int chunkZ = Settings.worldZ / Settings.chunkZ;
235227

236-
chunks = new Chunk[chunkX][chunkY];
228+
chunks = new Chunk[chunkX][chunkY][chunkZ];
237229

238-
for (int x = 0; x < Settings.worldX; x += Settings.chunkWidth)
230+
for (int x = 0; x < Settings.worldX; x += Settings.chunkX)
239231
{
240-
for (int y = 0; y < Settings.worldZ; y += Settings.chunkHeight)
232+
for (int y = 0; y < Settings.worldY; y += Settings.chunkY)
241233
{
242-
createChunk(x, y);
234+
for (int z = 0; z < Settings.worldZ; z += Settings.chunkZ)
235+
{
236+
createChunk(x, y, z);
237+
}
243238
}
244239
}
245240

@@ -251,15 +246,15 @@ public void generateChunks()
251246
System.out.println("\nWorld generated in " + totalTime / million + "ms\n");
252247
}
253248

254-
private void createChunk(int startX, int startZ)
249+
private void createChunk(int startX, int startY, int startZ)
255250
{
256251
Map<Integer, Block> blockMap = new HashMap<>();
257252

258-
for (int x = startX; x < (startX + Settings.chunkWidth); x++)
253+
for (int x = startX; x < (startX + Settings.chunkX); x++)
259254
{
260-
for (int y = 0; y < maxY; y++)
255+
for (int y = startY; y < (startY + Settings.chunkY); y++)
261256
{
262-
for (int z = startZ; z < (startZ + Settings.chunkHeight); z++)
257+
for (int z = startZ; z < (startZ + Settings.chunkZ); z++)
263258
{
264259
if (worldBlocks[x][y][z] != Block.BlockType.EMPTY && worldBlocks[x][y][z] != null)
265260
{
@@ -270,8 +265,9 @@ private void createChunk(int startX, int startZ)
270265
Point3D position = new Point3D(x, y, z);
271266
int ID = MathUtils.cartesianHash(x, y, z);
272267

273-
int chunkX = MathUtils.getChunkX(x, Settings.chunkWidth);
274-
int chunkY = MathUtils.getChunkY(z, Settings.chunkHeight);
268+
int chunkX = MathUtils.getChunkX(x, Settings.chunkX);
269+
int chunkY = MathUtils.getChunkY(y, Settings.chunkY);
270+
int chunkZ = MathUtils.getChunkZ(z, Settings.chunkZ);
275271

276272
Block block = new Block
277273
(
@@ -281,7 +277,8 @@ private void createChunk(int startX, int startZ)
281277
mask,
282278
worldBlocks[x][y][z],
283279
chunkX,
284-
chunkY
280+
chunkY,
281+
chunkZ
285282
);
286283

287284
blockMap.put(ID, block);
@@ -291,10 +288,11 @@ private void createChunk(int startX, int startZ)
291288
}
292289
}
293290

294-
int chunkX = startX / Settings.chunkWidth;
295-
int chunkY = startZ / Settings.chunkHeight;
291+
int chunkX = startX / Settings.chunkX;
292+
int chunkY = startY / Settings.chunkY;
293+
int chunkZ = startZ / Settings.chunkZ;
296294

297-
chunks[chunkX][chunkY] = new Chunk(blockMap, chunkX, chunkY);
295+
chunks[chunkX][chunkY][chunkZ] = new Chunk(blockMap, chunkX, chunkY, chunkZ);
298296
}
299297

300298
public void createStone()

0 commit comments

Comments
 (0)