Files
Fable3D/my3dengine/UI.py
2026-02-04 21:31:57 +01:00

64 lines
2.0 KiB
Python

import my3dengine as m3d
from OpenGL.GL import *
import numpy as np
from .shader import create_ui_shader
import ctypes
class UI:
def __init__(self, window_width, window_height):
self.w = window_width
self.h = window_height
self.shader = create_ui_shader()
self.vao = glGenVertexArrays(1)
self.vbo = glGenBuffers(1)
glBindVertexArray(self.vao)
glBindBuffer(GL_ARRAY_BUFFER, self.vbo)
# Bufor na max 6 wierzchołków * 2 float (x,y)
glBufferData(GL_ARRAY_BUFFER, 6 * 2 * 4, None, GL_DYNAMIC_DRAW)
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * 4, ctypes.c_void_p(0))
glEnableVertexAttribArray(0)
glBindBuffer(GL_ARRAY_BUFFER, 0)
glBindVertexArray(0)
self.rects = [] # lista prostokątów do narysowania
def rect(self, x, y, width, height, color):
# dodaj prostokąt do listy, nie rysuj od razu
self.rects.append((x, y, width, height, color))
def draw(self):
glUseProgram(self.shader)
glBindVertexArray(self.vao)
loc_color = glGetUniformLocation(self.shader, "uColor")
loc_win = glGetUniformLocation(self.shader, "uWindowSize")
glUniform2f(loc_win, self.w, self.h)
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
for x, y, w, h, color in self.rects:
vertices = np.array([
x, y,
x + w, y,
x, y + h,
x + w, y,
x + w, y + h,
x, y + h,
], dtype=np.float32)
glBindBuffer(GL_ARRAY_BUFFER, self.vbo)
glBufferSubData(GL_ARRAY_BUFFER, 0, vertices.nbytes, vertices)
glBindBuffer(GL_ARRAY_BUFFER, 0)
glUniform4fv(loc_color, 1, color)
glDrawArrays(GL_TRIANGLES, 0, 6)
glBindVertexArray(0)
glUseProgram(0)
self.rects.clear() # po narysowaniu czyścimy listę