64 lines
2.0 KiB
Python
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ę
|