#!/usr/bin/python3 from settings import * import moderngl as mgl import pygame as pg import sys from shader_program import ShaderProgram from scene import Scene from player import Player from textures import Textures class VoxelEngine: def __init__(self): pg.init() pg.display.gl_set_attribute(pg.GL_CONTEXT_MAJOR_VERSION, 3) pg.display.gl_set_attribute(pg.GL_CONTEXT_MINOR_VERSION, 3) pg.display.gl_set_attribute(pg.GL_CONTEXT_PROFILE_MASK, pg.GL_CONTEXT_PROFILE_CORE) pg.display.gl_set_attribute(pg.GL_DEPTH_SIZE, 24) pg.display.set_mode(WIN_RES, flags=pg.OPENGL | pg.DOUBLEBUF) self.ctx = mgl.create_context() self.ctx.enable(flags=mgl.DEPTH_TEST | mgl.CULL_FACE | mgl.BLEND) self.ctx.gc_mode = "auto" self.clock = pg.time.Clock() self.delta_time = 0 self.time = 0 pg.event.set_grab(True) pg.mouse.set_visible(False) self.on_init() self.running = True def on_init(self): self.textures = Textures(self) self.player = Player(self) self.shader_program = ShaderProgram(self) self.scene = Scene(self) def update(self): self.player.update() self.shader_program.update() self.scene.update() self.delta_time = self.clock.tick() self.time = pg.time.get_ticks() * 0.001 pg.display.set_caption(f"{self.clock.get_fps() :.0f}") def render(self): self.ctx.clear(color=BG_COLOR) self.scene.render() pg.display.flip() def handle_events(self): for event in pg.event.get(): if event.type == pg.QUIT or (event.type == pg.KEYDOWN and event.key == pg.K_ESCAPE): self.running = False def run(self): while self.running: self.handle_events() self.update() self.render() pg.quit() sys.exit() if __name__ == "__main__": app = VoxelEngine() app.run()