106 lines
2.8 KiB
Python
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
|