109 lines
No EOL
2.9 KiB
Python
109 lines
No EOL
2.9 KiB
Python
import moderngl_window as mglw
|
|
from tools import *
|
|
from camera import Camera
|
|
from time import sleep
|
|
|
|
print(__name__)
|
|
|
|
class App(mglw.WindowConfig):
|
|
window_size = 1600, 900
|
|
ro = 0, -0.5, -1.5
|
|
ro = mult_ext_tuples(1, ro)
|
|
rc = 0, -1, 2
|
|
u_mouse = 0, 0
|
|
forward = False
|
|
backward = False
|
|
resource_dir = 'resources/programs'
|
|
cam = Camera(vec3(*rc), 0, 0)
|
|
|
|
mouse_pressed = False
|
|
|
|
|
|
def __init__(self, **kwargs):
|
|
super().__init__(**kwargs)
|
|
self.quad = mglw.geometry.quad_fs()
|
|
self.program = self.load_program(vertex_shader='vertex.glsl', fragment_shader='fragment.glsl')
|
|
# uniforms
|
|
self.set_uniform('u_resolution', self.window_size)
|
|
self.set_uniform('ro', self.ro)
|
|
self.set_uniform('rc', self.rc)
|
|
#self.set_uniform('u_mouse', self.u_mouse)
|
|
self.set_uniform('cam', mat3ToTuple(np.eye(3)))
|
|
|
|
def set_uniform(self, u_name, u_value):
|
|
try:
|
|
self.program[u_name] = u_value
|
|
except KeyError:
|
|
None
|
|
print(f'{u_name} not used in shader')
|
|
|
|
|
|
|
|
def moove(self):
|
|
x, y, z = tuple(self.cam.r1_temp)
|
|
x = -x
|
|
y = -y
|
|
if self.forward:
|
|
self.ro = add_tuples(self.ro, mult_ext_tuples(0.1, (x, y, z)))
|
|
|
|
if self.backward:
|
|
self.ro = add_tuples(self.ro, mult_ext_tuples(-0.1, (x, y, z)))
|
|
|
|
|
|
def cam_render(self):
|
|
angles = self.cam.mouseToAngle(vec2(*self.u_mouse), vec2(*self.window_size))
|
|
self.cam.camPhi, self.cam.camTheta = -angles[0]*4, angles[1]*2
|
|
self.cam.update()
|
|
|
|
def render(self, time, frame_time):
|
|
self.ctx.clear()
|
|
#self.program['u_time'] = time
|
|
self.quad.render(self.program)
|
|
self.set_uniform('cam', mat3ToTuple(self.cam.camMat))
|
|
|
|
if self.mouse_pressed:
|
|
self.cam_render()
|
|
|
|
if self.forward or self.backward:
|
|
self.moove()
|
|
|
|
self.set_uniform('ro', self.ro)
|
|
|
|
|
|
sleep(0)
|
|
|
|
|
|
|
|
def mouse_drag_event(self, x: int, y: int, dx: int, dy: int):
|
|
self.u_mouse = x, y
|
|
self.mouse_pressed = True
|
|
|
|
def mouse_release_event(self, x: int, y: int, button: int):
|
|
self.mouse_pressed = False
|
|
self.cam.camThetaBase += self.cam.camTheta
|
|
self.cam.camPhiBase += self.cam.camPhi
|
|
|
|
|
|
|
|
def key_event(self, key, action, modifiers):
|
|
|
|
match key:
|
|
case self.wnd.keys.UP:
|
|
if action == self.wnd.keys.ACTION_PRESS:
|
|
self.forward = True
|
|
elif action == self.wnd.keys.ACTION_RELEASE:
|
|
self.forward = False
|
|
|
|
case self.wnd.keys.DOWN:
|
|
if action == self.wnd.keys.ACTION_PRESS:
|
|
self.backward = True
|
|
elif action == self.wnd.keys.ACTION_RELEASE:
|
|
self.backward = False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
mglw.run_window_config(App) |