Source code for pyunity.window.glfwWindow
"""Class to create a window using GLFW."""
import glfw
from ..errors import *
[docs]class Window:
"""
A window provider that uses GLFW.
Raises
------
PyUnityException
If the window creation fails
"""
def __init__(self, config, name, resize):
self.config = config
self.resize = resize
glfw.init()
# glfw.window_hint(glfw.RESIZABLE, glfw.FALSE)
self.window = glfw.create_window(*config.size, name, None, None)
if not self.window:
glfw.terminate()
raise PyUnityException("Cannot open GLFW window")
glfw.make_context_current(self.window)
self.resize = resize
glfw.set_framebuffer_size_callback(
self.window, self.framebuffer_size_callback)
glfw.set_key_callback(self.window, self.key_callback)
self.keys = {
"up": [0 for i in range(glfw.KEY_LAST)],
"down": [0 for i in range(glfw.KEY_LAST)],
"pressed": [0 for i in range(glfw.KEY_LAST)],
}
self.released = (False, None)
def framebuffer_size_callback(self, window, width, height):
# if window != self.window:
# return
self.resize(width, height)
self.update_func()
glfw.swap_buffers(self.window)
def key_callback(self, window, key, scancode, action, mods):
# if window != self.window:
# return
if action == glfw.PRESS:
self.keys["up"][key] = 0
self.keys["down"][key] = 1
self.keys["pressed"][key] = 1
elif action == glfw.REPEAT:
self.keys["up"][key] = 0
self.keys["down"][key] = 0
self.keys["pressed"][key] = 1
else:
self.keys["up"][key] = 1
self.keys["down"][key] = 0
self.keys["pressed"][key] = 0
self.released = (True, key)
def check_quit(self):
alt_pressed = glfw.get_key(self.window, glfw.KEY_LEFT_ALT) or glfw.get_key(
self.window, glfw.KEY_RIGHT_ALT)
if glfw.get_key(self.window, glfw.KEY_ESCAPE) or (alt_pressed and glfw.get_key(self.window, glfw.KEY_F4)):
glfw.set_window_should_close(self.window, 1)
[docs] def start(self, update_func):
"""
Start the main loop of the window.
Parameters
----------
update_func : function
The function that calls the OpenGL calls.
"""
self.update_func = update_func
last = glfw.get_time()
while not glfw.window_should_close(self.window):
glfw.poll_events()
self.check_quit()
if self.released[0]:
self.keys["up"][self.released[1]] = 0
self.released = (False, None)
self.update_func()
glfw.swap_buffers(self.window)
while (glfw.get_time() < last + 1 / self.config.fps):
pass
last += 1 / self.config.fps
glfw.terminate()
def get_keys(self):
return self.keys["pressed"]
def get_keys_down(self):
return self.keys["down"]
def get_keys_up(self):
return self.keys["up"]