from libs import * import argparse import display from mapgen import MapGen from player import Player TEX_PARAMS = [ ("debug", 0.1, (0.5, 0.5)), ("sky", 0.15, (0.15, 0.1)), ("stone", 0.1, (0.2, 0.3)), ("grass", 0.15, (0.15, 0.12)), ("bark", 0.2, (0.04, 0.25)), ("leaves", 0.4, (0.2, 0.3)), ] def debug_mode(mg, cam): pass def in_view(wr, cam): rwrc = wr.pos + wr.r / 2 - cam.pos close = np.linalg.norm(rwrc) < conf["view-dist"] ld = cam.looking() cv = rwrc + 8 * ld frust = np.dot(cv, ld) / np.linalg.norm(cv) > 0.5 return close and frust def main(): parser = argparse.ArgumentParser() for (k, v) in conf.items(): parser.add_argument(f"-{k[0]}", f"--{k}", type=type(v)) args = parser.parse_args() for k in conf: v = getattr(args, k.replace("-", "_")) if v is not None: conf[k] = v display.init_display() glUniform4fv(UNIFORMS["lightPos"][2], 1, vec([*LIGHT_POS, 100])) mg = MapGen() tr = conf["tex-res"] for (i, p) in enumerate(TEX_PARAMS): v = [0.2, 0.2, 0.0] if i == 0 else [p[1]] * 3 m = [1 - 1.5 * p[1]] * 3 display.load_texture(i + 1, mg.make_texture( p[0], (tr, tr), m, v, np.multiply(tr, p[2]) )) clock = pygame.time.Clock() cam = Player(speed=6/conf["fps"]) cam.pos = [4, 8, 4] cam.set_focus(True) while True: scene = list(filter(lambda wr: in_view(wr, cam), mg.regions.values())) for wr in scene: if wr.dirty: wr.remesh() for i in range(len(VERTEX_ATTRS)): update_attr(wr, i) for ev in pygame.event.get(): match ev.type: case pygame.QUIT: pygame.quit() return case pygame.KEYUP: match ev.unicode: case "q": pygame.quit() return case "d": debug_mode(mg, cam) cam.handle_event(ev, mg, scene) cam.update_motion(pygame.key.get_pressed(), mg) cam.update_pos() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) for ent in scene: cam.draw(ent) perf = clock.get_fps() / conf["fps"] cam.draw_hud(scene, perf) pygame.display.flip() clock.tick(conf["fps"]) main()