from OpenGL.GL import * from dusk.defs import ( TILE_WIDTH, TILE_HEIGHT, TILE_DEPTH, CHUNK_WIDTH, CHUNK_HEIGHT, CHUNK_DEPTH, TILE_SHAPE_NULL, TILE_SHAPE_FLOOR, TILE_SHAPE_RAMP_NORTH, TILE_SHAPE_RAMP_SOUTH, TILE_SHAPE_RAMP_EAST, TILE_SHAPE_RAMP_WEST, TILE_SHAPE_RAMP_SOUTHWEST, TILE_SHAPE_RAMP_SOUTHEAST, TILE_SHAPE_RAMP_NORTHWEST, TILE_SHAPE_RAMP_NORTHEAST ) def getItem(arr, index, default): if index < len(arr): return arr[index] return default class Tile: def __init__(self, chunk, x, y, z, tileIndex): self.shape = TILE_SHAPE_NULL self.chunk = chunk self.x = x self.y = y self.z = z self.index = tileIndex self.posX = x * TILE_WIDTH + chunk.x * CHUNK_WIDTH * TILE_WIDTH self.posY = y * TILE_HEIGHT + chunk.y * CHUNK_HEIGHT * TILE_HEIGHT self.posZ = z * TILE_DEPTH + chunk.z * CHUNK_DEPTH * TILE_DEPTH def load(self, chunkData): self.shape = getItem(chunkData['shapes'], self.index, TILE_SHAPE_NULL) def setShape(self, shape): if shape == self.shape: return self.shape = shape self.chunk.dirty = True self.chunk.tileUpdateVertices() self.chunk.onChunkData.invoke(self.chunk) def getBaseTileModel(self): vertices = [] indices = [] uvs = [] colors = [] if self.shape == TILE_SHAPE_NULL: pass elif self.shape == TILE_SHAPE_FLOOR: vertices = [ (self.posX, self.posY, self.posZ), (self.posX + TILE_WIDTH, self.posY, self.posZ), (self.posX + TILE_WIDTH, self.posY + TILE_HEIGHT, self.posZ), (self.posX, self.posY + TILE_HEIGHT, self.posZ) ] indices = [0, 1, 2, 0, 2, 3] uvs = [ (0, 0), (1, 0), (1, 1), (0, 1) ] colors = [ (255, 255, 255, 255) ] * 4 elif self.shape == TILE_SHAPE_RAMP_NORTH: vertices = [ (self.posX, self.posY, self.posZ + TILE_DEPTH), (self.posX + TILE_WIDTH, self.posY, self.posZ + TILE_DEPTH), (self.posX + TILE_WIDTH, self.posY + TILE_HEIGHT, self.posZ), (self.posX, self.posY + TILE_HEIGHT, self.posZ) ] indices = [0, 1, 2, 0, 2, 3] uvs = [ (0, 0), (1, 0), (1, 1), (0, 1) ] colors = [ (255, 0, 0, 255) ] * 4 elif self.shape == TILE_SHAPE_RAMP_SOUTH: vertices = [ (self.posX, self.posY, self.posZ), (self.posX + TILE_WIDTH, self.posY, self.posZ), (self.posX + TILE_WIDTH, self.posY + TILE_HEIGHT, self.posZ + TILE_DEPTH), (self.posX, self.posY + TILE_HEIGHT, self.posZ + TILE_DEPTH) ] indices = [0, 1, 2, 0, 2, 3] uvs = [ (0, 0), (1, 0), (1, 1), (0, 1) ] colors = [ (0, 255, 0, 255) ] * 4 elif self.shape == TILE_SHAPE_RAMP_EAST: vertices = [ (self.posX, self.posY, self.posZ), (self.posX + TILE_WIDTH, self.posY, self.posZ + TILE_DEPTH), (self.posX + TILE_WIDTH, self.posY + TILE_HEIGHT, self.posZ + TILE_DEPTH), (self.posX, self.posY + TILE_HEIGHT, self.posZ) ] indices = [0, 1, 2, 0, 2, 3] uvs = [ (0, 0), (1, 0), (1, 1), (0, 1) ] colors = [ (0, 0, 255, 255) ] * 4 elif self.shape == TILE_SHAPE_RAMP_WEST: vertices = [ (self.posX, self.posY, self.posZ + TILE_DEPTH), (self.posX + TILE_WIDTH, self.posY, self.posZ), (self.posX + TILE_WIDTH, self.posY + TILE_HEIGHT, self.posZ), (self.posX, self.posY + TILE_HEIGHT, self.posZ + TILE_DEPTH) ] indices = [0, 1, 2, 0, 2, 3] uvs = [ (0, 0), (1, 0), (1, 1), (0, 1) ] colors = [ (255, 255, 0, 255) ] * 4 elif self.shape == TILE_SHAPE_RAMP_SOUTHWEST: vertices = [ (self.posX, self.posY, self.posZ + TILE_DEPTH), (self.posX + TILE_WIDTH, self.posY, self.posZ), (self.posX + TILE_WIDTH, self.posY + TILE_HEIGHT, self.posZ + TILE_DEPTH), (self.posX, self.posY + TILE_HEIGHT, self.posZ + TILE_DEPTH) ] indices = [0, 1, 2, 0, 2, 3] uvs = [ (0, 0), (1, 0), (1, 1), (0, 1) ] colors = [ (255, 128, 0, 255) ] * 4 elif self.shape == TILE_SHAPE_RAMP_NORTHWEST: vertices = [ (self.posX, self.posY, self.posZ + TILE_DEPTH), (self.posX + TILE_WIDTH, self.posY, self.posZ + TILE_DEPTH), (self.posX + TILE_WIDTH, self.posY + TILE_HEIGHT, self.posZ), (self.posX, self.posY + TILE_HEIGHT, self.posZ + TILE_DEPTH) ] indices = [0, 1, 2, 0, 2, 3] uvs = [ (0, 0), (1, 0), (1, 1), (0, 1) ] colors = [ (128, 255, 0, 255) ] * 4 elif self.shape == TILE_SHAPE_RAMP_NORTHEAST: vertices = [ (self.posX, self.posY, self.posZ + TILE_DEPTH), (self.posX + TILE_WIDTH, self.posY, self.posZ + TILE_DEPTH), (self.posX + TILE_WIDTH, self.posY + TILE_HEIGHT, self.posZ + TILE_DEPTH), (self.posX, self.posY + TILE_HEIGHT, self.posZ) ] indices = [0, 1, 2, 0, 2, 3] uvs = [ (0, 0), (1, 0), (1, 1), (0, 1) ] colors = [ (0, 255, 128, 255) ] * 4 elif self.shape == TILE_SHAPE_RAMP_SOUTHEAST: vertices = [ (self.posX, self.posY, self.posZ), (self.posX + TILE_WIDTH, self.posY, self.posZ + TILE_DEPTH), (self.posX + TILE_WIDTH, self.posY + TILE_HEIGHT, self.posZ + TILE_DEPTH), (self.posX, self.posY + TILE_HEIGHT, self.posZ + TILE_DEPTH) ] indices = [0, 1, 2, 0, 2, 3] uvs = [ (0, 0), (1, 0), (1, 1), (0, 1) ] colors = [ (255, 128, 255, 255) ] * 4 else: # Solid black cube for unknown shape x0, y0, z0 = self.posX, self.posY, self.posZ x1, y1, z1 = self.posX + TILE_WIDTH, self.posY + TILE_HEIGHT, self.posZ + TILE_DEPTH vertices = [ (x0, y0, z0), (x1, y0, z0), (x1, y1, z0), (x0, y1, z0), # bottom (x0, y0, z1), (x1, y0, z1), (x1, y1, z1), (x0, y1, z1) # top ] indices = [ 0,1,2, 0,2,3, # bottom 4,5,6, 4,6,7, # top 0,1,5, 0,5,4, # front 2,3,7, 2,7,6, # back 1,2,6, 1,6,5, # right 3,0,4, 3,4,7 # left ] uvs = [ (0,0) ] * 8 colors = [ (0,0,0,255) ] * 8 return { 'vertices': vertices, 'indices': indices, 'uvs': uvs, 'colors': colors } def buffer(self, vertexBuffer): if self.shape == TILE_SHAPE_NULL: return # Old code: # if self.x != 0 or self.y != 0 or self.z != 0: # return # Only buffer the tile at (0,0,0) # Center tile. # x = self.posX - TILE_WIDTH / 2.0 # y = self.posY - TILE_HEIGHT / 2.0 # z = self.posZ - TILE_DEPTH / 2.0 # w = TILE_WIDTH # h = TILE_HEIGHT # d = TILE_DEPTH # # Quad on the XY plane at z # vertexBuffer.vertices.extend([ # x, y, z, # bottom left # x + w, y, z, # bottom right # x + w, y + h, z, # top right # x, y, z, # bottom left # x + w, y + h, z, # top right # x, y + h, z # top left # ]) # New code: baseData = self.getBaseTileModel() # Base data is indiced but we need to buffer unindiced data for index in baseData['indices']: verts = baseData['vertices'][index] uv = baseData['uvs'][index] color = baseData['colors'][index] vertexBuffer.vertices.extend([ verts[0] - (TILE_WIDTH / 2.0), verts[1] - (TILE_HEIGHT / 2.0), verts[2] - (TILE_DEPTH / 2.0) ]) vertexBuffer.colors.extend([ color[0] / 255.0, color[1] / 255.0, color[2] / 255.0, color[3] / 255.0 ])