aboutsummaryrefslogtreecommitdiff
path: root/ldc_3d_gl_interop.py
diff options
context:
space:
mode:
Diffstat (limited to 'ldc_3d_gl_interop.py')
-rw-r--r--ldc_3d_gl_interop.py99
1 files changed, 27 insertions, 72 deletions
diff --git a/ldc_3d_gl_interop.py b/ldc_3d_gl_interop.py
index 4065881..575dc72 100644
--- a/ldc_3d_gl_interop.py
+++ b/ldc_3d_gl_interop.py
@@ -12,7 +12,8 @@ from OpenGL.GLUT import *
from OpenGL.GL import shaders
-from pyrr import matrix44, quaternion
+from utility.projection import Projection, Rotation
+from utility.mouse import MouseDragMonitor, MouseScrollMonitor
lattice_x = 64
lattice_y = 96
@@ -51,39 +52,6 @@ boundary = Template("""
"lid_speed": lid_speed
})
-def get_projection(width, height):
- world_width = lattice_x
- world_height = world_width / width * height
-
- projection = matrix44.create_perspective_projection(45.0, width/height, 0.1, 1000.0)
- look = matrix44.create_look_at(
- eye = [0, -2*lattice_y, 0],
- target = [0, 0, 0],
- up = [0, 0, -1])
-
- point_size = 1
-
- return numpy.matmul(look, projection), point_size
-
-class Rotation:
- def __init__(self, shift, x = numpy.pi, z = numpy.pi):
- self.shift = shift
- self.rotation_x = x
- self.rotation_z = z
-
- def update(self, x, z):
- self.rotation_x += x
- self.rotation_z += z
-
- def get(self):
- qx = quaternion.Quaternion(quaternion.create_from_eulers([self.rotation_x,0,0]))
- qz = quaternion.Quaternion(quaternion.create_from_eulers([0,0,self.rotation_z]))
- rotation = qz.cross(qx)
- return numpy.matmul(
- matrix44.create_from_translation(self.shift),
- matrix44.create_from_quaternion(rotation)
- )
-
def glut_window(fullscreen = False):
glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
@@ -148,15 +116,19 @@ fragment_shader = shaders.compileShader("""
in vec3 color;
+layout(location = 0) out vec4 frag_color;
+
void main(){
- gl_FragColor = vec4(color.xyz, 0.0);
+ frag_color = vec4(color.xyz, 0.0);
}""", GL_FRAGMENT_SHADER)
particle_program = shaders.compileProgram(particle_shader, fragment_shader)
-projection_id = shaders.glGetUniformLocation(particle_program, 'projection')
-rotation_id = shaders.glGetUniformLocation(particle_program, 'rotation')
+particle_projection_id = shaders.glGetUniformLocation(particle_program, 'projection')
+particle_rotation_id = shaders.glGetUniformLocation(particle_program, 'rotation')
geometry_program = shaders.compileProgram(vertex_shader, fragment_shader)
+geometry_projection_id = shaders.glGetUniformLocation(geometry_program, 'projection')
+geometry_rotation_id = shaders.glGetUniformLocation(geometry_program, 'rotation')
lattice = Lattice(
descriptor = D3Q19,
@@ -172,15 +144,14 @@ lattice.apply_material_map(
lattice.sync_material()
particles = Particles(
- lattice.context,
- lattice.queue,
- lattice.memory.float_type,
+ lattice,
numpy.mgrid[
8*lattice.geometry.size_x//10:9*lattice.geometry.size_x//10:10j,
lattice.geometry.size_y//10:9*lattice.geometry.size_y//10:particle_count/100j,
8*lattice.geometry.size_z//10:9*lattice.geometry.size_z//10:10j,
].reshape(3,-1).T)
+projection = Projection(distance = 2*lattice_x)
rotation = Rotation([-lattice_x/2, -lattice_y/2, -lattice_z/2])
cube_vertices, cube_edges = lattice.geometry.wireframe()
@@ -189,31 +160,28 @@ def on_display():
for i in range(0,updates_per_frame):
lattice.evolve()
- lattice.collect_gl_moments()
+ lattice.update_moments()
for i in range(0,updates_per_frame):
- lattice.update_gl_particles(particles, aging = True)
+ particles.update(aging = True)
lattice.sync()
glClear(GL_COLOR_BUFFER_BIT)
- glEnableClientState(GL_VERTEX_ARRAY)
-
- particles.gl_particles.bind()
shaders.glUseProgram(particle_program)
- glUniformMatrix4fv(projection_id, 1, False, numpy.ascontiguousarray(projection))
- glUniformMatrix4fv(rotation_id, 1, False, numpy.ascontiguousarray(rotation.get()))
- glVertexPointer(4, GL_FLOAT, 0, particles.gl_particles)
+ glUniformMatrix4fv(particle_projection_id, 1, False, numpy.ascontiguousarray(projection.get()))
+ glUniformMatrix4fv(particle_rotation_id, 1, False, numpy.ascontiguousarray(rotation.get()))
+ particles.bind()
glEnable(GL_POINT_SMOOTH)
- glPointSize(point_size)
+ glPointSize(1)
glDrawArrays(GL_POINTS, 0, particles.count)
shaders.glUseProgram(geometry_program)
- glUniformMatrix4fv(projection_id, 1, False, numpy.ascontiguousarray(projection))
- glUniformMatrix4fv(rotation_id, 1, False, numpy.ascontiguousarray(rotation.get()))
+ glUniformMatrix4fv(geometry_projection_id, 1, False, numpy.ascontiguousarray(projection.get()))
+ glUniformMatrix4fv(geometry_rotation_id, 1, False, numpy.ascontiguousarray(rotation.get()))
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
- glLineWidth(2*point_size)
+ glLineWidth(2)
glBegin(GL_LINES)
for i, j in cube_edges:
glVertex3fv(cube_vertices[i])
@@ -222,32 +190,19 @@ def on_display():
glutSwapBuffers()
-def on_reshape(width, height):
- global projection, point_size
- glViewport(0,0,width,height)
- projection, point_size = get_projection(width, height)
-
-def on_keyboard(key, x, y):
- global rotation
-
- x = {
- b'w': -numpy.pi/10,
- b's': numpy.pi/10
- }.get(key, 0.0)
- z = {
- b'a': numpy.pi/10,
- b'd': -numpy.pi/10
- }.get(key, 0.0)
-
- rotation.update(x,z)
+mouse_monitors = [
+ MouseDragMonitor(GLUT_LEFT_BUTTON, lambda dx, dy: rotation.update(0.005*dy, 0.005*dx)),
+ MouseScrollMonitor(lambda zoom: projection.update_distance(5*zoom))
+]
def on_timer(t):
glutTimerFunc(t, on_timer, t)
glutPostRedisplay()
glutDisplayFunc(on_display)
-glutReshapeFunc(on_reshape)
-glutKeyboardFunc(on_keyboard)
+glutReshapeFunc(lambda w, h: projection.update_ratio(w, h))
+glutMouseFunc(lambda *args: list(map(lambda m: m.on_mouse(*args), mouse_monitors)))
+glutMotionFunc(lambda *args: list(map(lambda m: m.on_mouse_move(*args), mouse_monitors)))
glutTimerFunc(10, on_timer, 10)
glutMainLoop()