from OpenGL.GL import shaders from libs import * from entity import Entity from mapgen import MapGen from mesh import SquareMesh from player import Player from region import WorldRegion VS = """ #version 120 attribute vec3 position; attribute vec4 colIn; varying vec4 colOut; uniform mat4 MVP; void main() { gl_Position = MVP * vec4(position, 1.0); colOut = colIn; } """ FS = """ #version 120 varying vec4 colOut; void main() { gl_FragColor = colOut; } """ FPS = 60 def debug_mode(scene, cam): pass def click_mesh(self, button, coords): match button: case 1: self.set_voxel(coords[1]) case 2: print(f"coords {coords}") case 3: offset = axis2offset(coords[0]) self.set_voxel(coords[1] + offset, 2) if button % 2 == 1: self.update_attr(0) self.update_attr(1) def build_scene(mg): box = WorldRegion() print(f"map generated with {mg.world_natural(box)} voxels") box.remesh() box.onclick = click_mesh return [box] def main(): pygame.init() pygame.display.set_mode((640, 480), pygame.DOUBLEBUF | pygame.OPENGL | pygame.RESIZABLE) pygame.display.set_caption("OpenGL") sp = shaders.compileProgram( shaders.compileShader(VS, GL_VERTEX_SHADER), shaders.compileShader(FS, GL_FRAGMENT_SHADER) ) loc_mvp = glGetUniformLocation(sp, "MVP") glUseProgram(sp) glEnable(GL_DEPTH_TEST) glClearColor(0.1, 0.1, 0.1, 1.0) mg = MapGen() scene = build_scene(mg) clock = pygame.time.Clock() cam = Player(speed=10/FPS) cam.pos = [8, 16, 8] cam.set_focus(True) while True: for ev in pygame.event.get(): if ev.type == pygame.QUIT or ev.type == pygame.KEYUP and ev.unicode == "q": pygame.quit() return elif ev.type == pygame.KEYUP and ev.unicode == "d": debug_mode(scene, cam) cam.handle_event(ev, scene) cam.update_pos() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) for ent in scene: cam.draw(ent, loc_mvp) perf = clock.get_fps() / FPS cam.draw_hud(loc_mvp, scene[0], perf) pygame.display.flip() clock.tick(FPS) main()