--global-fix
This commit is contained in:
63
my3dengine/UI.py
Normal file
63
my3dengine/UI.py
Normal file
@@ -0,0 +1,63 @@
|
||||
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ę
|
||||
Reference in New Issue
Block a user