1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
package net.tylermurphy.Minecraft.Util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import net.tylermurphy.Minecraft.Chunk.Chunk;
import net.tylermurphy.Minecraft.Scene.World;
import org.joml.Vector2i;
public class ChunkLoader {
private static final ArrayList<Vector2i> keys_to_be_removed = new ArrayList<>();
private static final HashMap<String, Data> loaded_regions = new HashMap<>();
public static void run() {
try {
int cx,cz;
cx = (int) ((World.player.getTransform().getGlobalPosition().x)/16);
cz = (int) ((World.player.getTransform().getGlobalPosition().z)/16);
keys_to_be_removed.clear();
for(Chunk c : World.getChunks()) {
if(c.gridX < cx-World.renderDistance || c.gridX > cx+World.renderDistance || c.gridZ < cz-World.renderDistance || c.gridZ > cz+World.renderDistance) {
int x = c.gridX; int z = c.gridZ;
int regionX = x > 0 ? x / 16 : (x - 16) / 16;
int regionZ = z > 0 ? z / 16 : (z - 16) / 16;
Data region = loaded_regions.get(getRegionKey(regionX,regionZ));
byte[] data = ResourceManager.flattenArray(c.cubes);
region.BYTE_ARRAYS.put(getChunkKey(x,z), data);
loaded_regions.put(getRegionKey(regionX,regionZ), region);
if(c.renderable() != null)
c.renderable().getMesh().delete();
c.deleteRenderable();
if(c.transparentRenderable() != null)
c.transparentRenderable().getMesh().delete();
c.deleteTransparentRenderable();
c.cubes = null;
keys_to_be_removed.add(new Vector2i(c.gridX, c.gridZ));
}
}
for(Vector2i pos : keys_to_be_removed) {
World.removeChunk(pos.x, pos.y);
}
for(int x=cx-World.renderDistance; x<cx+World.renderDistance;x++) {
for(int z=cz-World.renderDistance; z<cz+World.renderDistance;z++) {
if(World.getChunkUnsafe(x, z) != null) continue;
Chunk chunk = loadChunk(x, z);
chunk.initialize();
World.addChunk(chunk);
update(x+1,z);
update(x-1,z);
update(x,z+1);
update(x,z-1);
}
}
}catch(Exception e) {
e.printStackTrace();
}
}
public static void save() {
for(Chunk c : World.getChunks()) {
int x = c.gridX; int z = c.gridZ;
int regionX = x > 0 ? x / 16 : (x - 16) / 16;
int regionZ = z > 0 ? z / 16 : (z - 16) / 16;
Data region = loaded_regions.get(getRegionKey(regionX,regionZ));
byte[] data = ResourceManager.flattenArray(c.cubes);
region.BYTE_ARRAYS.put(getChunkKey(x,z), data);
loaded_regions.put(getRegionKey(regionX,regionZ), region);
}
for(Map.Entry<String, Data> entry : loaded_regions.entrySet()) {
ResourceManager.saveObject("region/", entry.getKey(), entry.getValue());
}
}
private static void update(int x, int z) {
Chunk c = World.getChunkUnsafe(x, z);
if(c != null) c.updateMesh();
}
private static Chunk loadChunk(int gridX, int gridZ) {
int regionX = gridX > 0 ? gridX / 16 : (gridX - 16) / 16;
int regionZ = gridZ > 0 ? gridZ / 16 : (gridZ - 16) / 16;
Data region;
if(!loaded_regions.containsKey(getRegionKey(regionX,regionZ))) {
Object reg = ResourceManager.loadObject("region/", getRegionKey(regionX,regionZ));
if(reg == null) region = new Data();
else region = (Data)reg;
loaded_regions.put(getRegionKey(regionX,regionZ), region);
} else region = loaded_regions.get(getRegionKey(regionX,regionZ));
if(region.BYTE_ARRAYS.containsKey(getChunkKey(gridX,gridZ))) {
byte[] data = region.BYTE_ARRAYS.get(getChunkKey(gridX,gridZ));
Chunk chunk = new Chunk(gridX,gridZ,true);
chunk.cubes = ResourceManager.expandArray(data);
return chunk;
} else {
return new Chunk(gridX,gridZ,true);
}
}
public static String getRegionKey(int regionX, int regionZ) {
return regionX+"x"+regionZ+"z.region";
}
public static String getChunkKey(int gridX, int gridZ) {
return gridX+"x"+gridZ+"z";
}
}
|