MandelBulb-Python/mandelbulb/main.py
2022-08-19 19:28:22 +02:00

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)