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 keys_to_be_removed = new ArrayList<>(); private static final HashMap 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 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 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"; } }