DKL9 GitList
Repositories
DKL9 home
voxels
Code
Commits
Branches
Tags
Search
Tree:
396b134
Branches
Tags
master
voxels
entity.py
Big code cleanup and better arrow keys
dkl9
commited
396b134
at 2025-179 22:38:38
entity.py
Blame
History
Raw
from libs import * from raycast import intersect_tri import types draw_modes = types.SimpleNamespace() draw_modes.TRI_STRIP = GL_TRIANGLE_STRIP draw_modes.TRI_FAN = GL_TRIANGLE_FAN draw_modes.TRIS = GL_TRIANGLES draw_modes.LINE_STRIP = GL_LINE_STRIP draw_modes.LINES = GL_LINES class Entity: def __init__(self, verts, col, pos, **kwargs): self.verts = vec(verts) self.hud = kwargs.get("hud", False) self.col = vec(col) refl = [1.0, 0.0, 0.0, 1.0] if self.hud else [0.5, 0.5, 0.0, 32.0] self.refls = vec(kwargs.get("refls", refl)) self.pos = vec(pos) self.draw_mode = kwargs.get("mode", GL_TRIANGLE_STRIP) self.orient = np.identity(4, dtype=FLOAT) self.onclick = lambda s, b, n, h: print(f"{h}:{b} on {s}:{n}") self.vao = None self.vbos = [[None, 0] for _ in VERTEX_ATTRS] def mat_list(self): return np.repeat(vec([[self.col], [self.refls]]), len(self.verts), 1) def norm_list(self): l = [] match self.draw_mode: case draw_modes.TRI_STRIP | draw_modes.TRI_FAN: l.append(norm_tri(self.verts[:3])) for i in range(1, len(self.verts) - 1): l.append(norm_tri(self.verts[i - 1:i + 2])) l.append(norm_tri(self.verts[-3:])) case draw_modes.TRIS: for i in range(0, len(self.verts), 3): for _ in range(3): l.append(norm_tri(self.verts[i:i + 3])) case draw_modes.LINE_STRIP | draw_modes.LINES: for _ in range(len(self.verts)): l.append([1, 0, 0]) case _: raise NotImplementedError return (self.orient[:3, :3] @ vec(l).T).T def build_vao(self): self.vao = glGenVertexArrays(1) glBindVertexArray(self.vao) for i in range(len(VERTEX_ATTRS)): self.vbos[i][0] = glGenBuffers(1) l = update_attr(self, i) glEnableVertexAttribArray(i) glVertexAttribPointer(i, l.shape[1], GL_FLOAT, GL_FALSE, 0, None) def translate(self): m = np.identity(4, dtype=FLOAT) m[:3, 3] = self.pos return m def rotate(self, theta, axis): x, y, z = axis c, s = np.cos(theta), np.sin(theta) t = 1 - c self.orient = vec([ [t*x*x + c, t*x*y - s*z, t*x*z + s*y, 0], [t*x*y + s*z, t*y*y + c, t*y*z - s*x, 0], [t*x*z - s*y, t*y*z + s*x, t*z*z + c, 0], [0, 0, 0, 1] ]) @ self.orient def click(self, button, face, hand=1): return self.onclick(self, button, face, hand) def raycast(self, ro, rd): if self.hud or self.draw_mode == GL_LINES: return elif self.draw_mode == GL_TRIANGLE_STRIP: ir = range(len(self.verts) - 2) tl = ((i, self.verts[i:i + 3]) for i in ir) elif self.draw_mode == GL_TRIANGLES: ir = range(len(self.verts) // 3) tl = ((i, self.verts[3 * i:3 * (i + 1)]) for i in ir) else: raise NotImplementedError d, n = None, None for (i, t) in tl: t = np.dot(t, self.orient[:3, :3].T) + self.pos r = intersect_tri(ro, rd, t) if r and (d is None or r < d): d, n = r, i return d, n