summaryrefslogtreecommitdiff
path: root/txtgameengine/platform.py
diff options
context:
space:
mode:
Diffstat (limited to 'txtgameengine/platform.py')
-rw-r--r--txtgameengine/platform.py63
1 files changed, 60 insertions, 3 deletions
diff --git a/txtgameengine/platform.py b/txtgameengine/platform.py
index 0d89213..f5b8ded 100644
--- a/txtgameengine/platform.py
+++ b/txtgameengine/platform.py
@@ -1,7 +1,8 @@
import glfw
import typing
-from OpenGL import GL
+from OpenGL.GL import *
+import OpenGL.GL.shaders as shaders
if typing.TYPE_CHECKING:
from .app import TxtGameApp
@@ -20,6 +21,7 @@ class PlatformComponent:
glfw.init()
self.init_window()
glfw.make_context_current(self.window)
+ glViewport(0, 0, *self.app.size)
@staticmethod
def monotonic_time():
@@ -32,6 +34,9 @@ class PlatformComponent:
def init_window(self):
glfw.window_hint(glfw.CLIENT_API, glfw.OPENGL_API)
glfw.window_hint(glfw.RESIZABLE, glfw.FALSE)
+ glfw.window_hint(glfw.OPENGL_FORWARD_COMPAT, glfw.TRUE)
+ glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE)
+ glfw.window_hint(glfw.OPENGL_DEBUG_CONTEXT, glfw.TRUE)
glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 3)
glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 3)
self.window = glfw.create_window(
@@ -60,8 +65,60 @@ class PlatformComponent:
@staticmethod
def set_clear_color(r, g, b, a):
- GL.glClearColor(r, g, b, a)
+ glClearColor(r, g, b, a)
+
+ @staticmethod
+ def print_debug_message(source, msg_type, msg_id, severity, length, raw, user):
+ print('OPENGL ERROR', source, msg_type, msg_id, severity)
+
+ def check_debug(self):
+ assert (glGetIntegerv(GL_CONTEXT_FLAGS)
+ & GL_CONTEXT_FLAG_DEBUG_BIT) != 0
+ glDebugMessageCallback(GLDEBUGPROC(self.print_debug_message), None)
@staticmethod
def clear_background(depth_buffer=False):
- GL.glClear(GL.GL_COLOR_BUFFER_BIT | (depth_buffer and GL.GL_DEPTH_BUFFER_BIT or 0))
+ glClear(GL_COLOR_BUFFER_BIT | (
+ depth_buffer and GL_DEPTH_BUFFER_BIT or 0))
+
+
+class ShaderComponent:
+ def __init__(self, app: 'TxtGameApp'):
+ self.app = app
+
+ @staticmethod
+ def load_shaders(vertex_file, fragment_file):
+ with open(vertex_file) as fp:
+ vertex_source = fp.read()
+ with open(fragment_file) as fp:
+ fragment_source = fp.read()
+ vertex_shader = shaders.compileShader(vertex_source, GL_VERTEX_SHADER)
+ fragment_shader = shaders.compileShader(
+ fragment_source, GL_FRAGMENT_SHADER)
+ return shaders.compileProgram(vertex_shader, fragment_shader)
+
+
+class RenderComponent:
+ def __init__(self, app: 'TxtGameApp'):
+ self.app = app
+
+ @staticmethod
+ def setup_vertex_arrays():
+ arr = glGenVertexArrays(1)
+ glBindVertexArray(arr)
+
+ @staticmethod
+ def setup_triangle(arr):
+ buf = glGenBuffers(1)
+ glBindBuffer(GL_ARRAY_BUFFER, buf)
+ glBufferData(GL_ARRAY_BUFFER, arr.itemsize *
+ arr.size, arr, GL_STATIC_DRAW)
+ return buf
+
+ @staticmethod
+ def triangle(buf):
+ glEnableVertexAttribArray(0)
+ glBindBuffer(GL_ARRAY_BUFFER, buf)
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, None)
+ glDrawArrays(GL_TRIANGLES, 0, 3)
+ glDisableVertexAttribArray(0)