import json import os from dusk.event import Event from editortool.map.mapdefs import CHUNK_WIDTH, CHUNK_HEIGHT, CHUNK_DEPTH, CHUNK_VERTEX_COUNT_MAX from editortool.map.tile import Tile from editortool.map.vertexbuffer import VertexBuffer from OpenGL.GL import * class Chunk: def __init__(self, map, x, y, z): self.map = map self.x = x self.y = y self.z = z self.current = {} self.original = {} self.onChunkData = Event() self.dirty = False self.tiles = {} self.vertexBuffer = VertexBuffer() tileIndex = 0 for tz in range(CHUNK_DEPTH): for ty in range(CHUNK_HEIGHT): for tx in range(CHUNK_WIDTH): self.tiles[tileIndex] = Tile(self, tx, ty, tz, tileIndex) tileIndex += 1 # Update vertices self.tileUpdateVertices() def tileUpdateVertices(self): self.vertexBuffer.clear() for tile in self.tiles.values(): tile.buffer(self.vertexBuffer) self.vertexBuffer.buildData() def load(self): fname = self.getFilename() if not fname or not os.path.exists(fname): self.new() return try: with open(fname, 'r') as f: data = json.load(f) if not 'shapes' in data: data['shapes'] = [] # For each tile. for tile in self.tiles.values(): tile.load(data) self.tileUpdateVertices() self.dirty = False self.onChunkData.invoke(self.current) except Exception as e: raise RuntimeError(f"Failed to load chunk file: {e}") def save(self): fname = self.getFilename() if not fname: raise ValueError("No filename specified for saving chunk.") try: with open(fname, 'w') as f: json.dump(self.current, f, indent=2) self.dirty = False except Exception as e: raise RuntimeError(f"Failed to save chunk file: {e}") def new(self): self.current = {} self.original = {} self.onChunkData.invoke(self.current) def isDirty(self): return False # return json.dumps(self.current, sort_keys=True) != json.dumps(self.original, sort_keys=True) def getFilename(self): if not self.map or not hasattr(self.map, 'getMapDirectory'): return None dir_path = self.map.getMapDirectory() if dir_path is None: return None return f"{dir_path}/{self.x}_{self.y}_{self.z}.json" def draw(self): glColor3f(0.0, 1.0, 1.0) self.vertexBuffer.draw()