54 lines
No EOL
1.4 KiB
Python
54 lines
No EOL
1.4 KiB
Python
#!/usr/bin/python3
|
|
|
|
from settings import *
|
|
from mesh.chunk import ChunkMesh
|
|
|
|
|
|
class Chunk:
|
|
def __init__(self, world, position):
|
|
self.app = world.app
|
|
self.world = world
|
|
self.position = position
|
|
self.m_model = self.get_model_matrix()
|
|
self.voxels: numpy.array = None
|
|
self.mesh: ChunkMesh = None
|
|
self.is_empty = True
|
|
|
|
def get_model_matrix(self):
|
|
m_model = glm.translate(glm.mat4(), glm.vec3(self.position) * CHUNK_SIZE)
|
|
return m_model
|
|
|
|
def set_uniform(self):
|
|
self.mesh.program["m_model"].write(self.m_model)
|
|
|
|
def build_mesh(self):
|
|
self.mesh = ChunkMesh(self)
|
|
|
|
def render(self):
|
|
self.set_uniform()
|
|
self.mesh.render()
|
|
|
|
def build_voxels(self):
|
|
# empty chunk
|
|
voxels = numpy.zeros(CHUNK_VOL, dtype="uint8")
|
|
|
|
# fill chunk
|
|
cx, cy, cz = glm.ivec3(self.position) * CHUNK_SIZE
|
|
|
|
# fill chunk
|
|
for x in range(CHUNK_SIZE):
|
|
for z in range(CHUNK_SIZE):
|
|
wx = x + cx
|
|
wz = z + cz
|
|
world_height = int(glm.simplex(glm.vec2(wx, wz) * 0.01) * 32 + 32)
|
|
local_height = min(world_height - cy, CHUNK_SIZE)
|
|
|
|
for y in range(local_height):
|
|
wy = y + cy
|
|
|
|
voxels[x + CHUNK_SIZE * z + CHUNK_AREA * y] = wy + 1
|
|
|
|
if numpy.any(voxels):
|
|
self.is_empty = False
|
|
|
|
return voxels |