playscii/grid.py

106 lines
2.8 KiB
Python

import numpy as np
from renderable_line import LineRenderable
# grid that displays as guide for Cursor
AXIS_COLOR = (0.8, 0.8, 0.8, 0.5)
BASE_COLOR = (0.5, 0.5, 0.5, 0.25)
EXTENTS_COLOR = (0, 0, 0, 1)
class Grid(LineRenderable):
visible = True
draw_axes = False
def get_tile_size(self):
"Returns (width, height) grid size in tiles."
return 1, 1
def build_geo(self):
"build vert, element, and color arrays"
w, h = self.get_tile_size()
# frame
v = [(0, 0), (w, 0), (0, -h), (w, -h)]
e = [0, 1, 1, 3, 3, 2, 2, 0]
color = EXTENTS_COLOR
c = color * 4
index = 4
# axes - Y and X
if self.draw_axes:
v += [(w / 2, -h), (w / 2, 0), (0, -h / 2), (w, -h / 2)]
e += [4, 5, 6, 7]
color = AXIS_COLOR
c += color * 4
index = 8
# vertical lines
color = BASE_COLOR
for x in range(1, w):
# skip middle line
if not self.draw_axes or x != w / 2:
v += [(x, -h), (x, 0)]
e += [index, index + 1]
c += color * 2
index += 2
for y in range(1, h):
if not self.draw_axes or y != h / 2:
v += [(0, -y), (w, -y)]
e += [index, index + 1]
c += color * 2
index += 2
self.vert_array = np.array(v, dtype=np.float32)
self.elem_array = np.array(e, dtype=np.uint32)
self.color_array = np.array(c, dtype=np.float32)
def reset_loc(self):
self.x = 0
self.y = 0
self.z = 0
def reset(self):
"macro for convenience - rescale, reposition, update renderable"
self.build_geo()
self.reset_loc()
self.rebind_buffers()
def update(self):
pass
def get_projection_matrix(self):
return self.app.camera.projection_matrix
def get_view_matrix(self):
return self.app.camera.view_matrix
class ArtGrid(Grid):
def reset_loc(self):
self.x, self.y = 0, 0
self.z = self.app.ui.active_art.layers_z[self.app.ui.active_art.active_layer]
def reset(self):
self.quad_size_ref = self.app.ui.active_art
Grid.reset(self)
def get_tile_size(self):
return self.app.ui.active_art.width, self.app.ui.active_art.height
class GameGrid(Grid):
draw_axes = True
base_size = 800
def get_tile_size(self):
# TODO: dynamically adjust bounds based on furthest away objects?
return self.base_size, self.base_size
def set_base_size(self, new_size):
self.base_size = new_size
self.reset()
def reset_loc(self):
# center of grid at world zero
qw, qh = self.get_quad_size()
self.x = qw * -(self.base_size / 2)
self.y = qh * (self.base_size / 2)
self.z = 0