222 lines
7.3 KiB
Python
222 lines
7.3 KiB
Python
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
|
|
]) |