DKL9 GitList
Repositories
DKL9 home
voxels
Code
Commits
Branches
Tags
Search
Tree:
b5dd445
Branches
Tags
master
voxels
player.py
Faster raycast, better mapgen and much better HUD
dkl9
commited
b5dd445
at 2025-174 14:21:36
player.py
Blame
History
Raw
from libs import * import camera import entity import mesh ARROWS = [pygame.K_RIGHT, pygame.K_LEFT, pygame.K_SPACE, pygame.K_LSHIFT, pygame.K_UP, pygame.K_DOWN] def reshape(w, h): glViewport(0, 0, w, h) return (w, h) class Player(camera.Camera): def __init__(self, **kwargs): super().__init__(**kwargs) self.sensitivity = kwargs.get("sensitivity", 0.005) self.rv = vec([0, 0, 0]) self.speed = kwargs.get("speed", 0.05) self.hud = { "skybox": mesh.SquareMesh(), "shl": mesh.SquareMesh(), "crosshair": entity.Entity( [[-0.03, 0.0, 0.0], [0.03, 0.0, 0.0], [0.0, -0.03, 0.0], [0.0, 0.03, 0.0]], [1.0, 1.0, 1.0, 1.0], [0.0, 0.0, 0.0], mode=GL_LINES, hud=True ), "fps": entity.Entity( [[0.0, 0.0, 0.0], [0.1, 0.0, 0.0], [0.0, -0.1, 0.0], [0.1, -0.1, 0.0]], YELLOW, [-1.0, 1.0, 0.0], mode=GL_TRIANGLE_STRIP, hud=True ), } offset = [0, 0, 20] for d in range(3): roll_vec3(offset, 1) for s in range(2): self.hud["skybox"].add_sq((d + 1) * (-1) ** s, 40, (-1) ** s * vec(offset), 2) self.hud["shl"].draw_mode = GL_LINE_STRIP self.hud["shl"].add_sq(2, 0.96, [0, 0, 0], 2) self.hud["shl"].verts[:] = self.hud["shl"].verts[[0, 1, 3, 2, 0, 3]] def set_focus(self, f): pygame.event.set_grab(f) pygame.mouse.set_visible(not f) pygame.mouse.set_pos([self.viewport[0] / 2, self.viewport[1] / 2]) self.hud["crosshair"].pos[0] = 2 * (not f) def get_focus(self): return not pygame.mouse.get_visible() def mouse_move(self, dx, dy): self.theta = (self.theta - self.sensitivity * dx) % (2 * np.pi) self.phi = min(np.pi / 2, max(-np.pi / 2, self.phi + self.sensitivity * dy)) def update_motion(self, pk): self.rv = vec([pk[a] - pk[b] for (a, b) in zip(ARROWS[::2], ARROWS[1::2])]) def vdof(self): l = self.looking() l[1] = 0 u = self.up() return vec([np.cross(l, u), u, l]) def update_pos(self): self.pos += self.speed * self.vdof() @ self.rv.T def handle_event(self, ev, scene): match ev.type: case pygame.KEYUP | pygame.KEYDOWN: if ev.unicode == "\x1b" and ev.type == pygame.KEYUP: self.set_focus(False) elif ev.key in ARROWS: self.update_motion(pygame.key.get_pressed()) case pygame.MOUSEMOTION if self.get_focus(): self.mouse_move(ev.rel[0], -ev.rel[1]) case pygame.MOUSEBUTTONUP if ev.button == 1: self.set_focus(True) case pygame.MOUSEBUTTONDOWN if self.get_focus(): t, n = self.target(scene) if t: t.click(ev.button, n) case pygame.WINDOWSIZECHANGED | pygame.WINDOWRESIZED: self.viewport = reshape(ev.x, ev.y) def draw_hud(self, loc_mvp, wr, perf): self.hud["skybox"].pos = self.pos c, ap = self.target([wr]) if c: self.hud["shl"].pos = ap[1] + axis2offset(ap[0], 0.52) self.hud["shl"].orient[:3, :3] = np.sign(ap[0]) * np.roll(np.identity(3), abs(ap[0]) + 1, 0) else: self.hud["shl"].pos = vec([0, 0, 0]) self.hud["fps"].col = GREEN if 0.9 < perf < 1.1 else YELLOW if perf > 0.5 else RED self.hud["fps"].update_attr(1) for ent in self.hud.values(): self.draw(ent, loc_mvp)