From b770e7452c11cf0acdccf824c9c9304e9de3f08b Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Sat, 21 Sep 2019 18:19:22 +0200 Subject: Extract GL moments, particle buffers and add texture buffer --- utility/particles.py | 50 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 6 deletions(-) (limited to 'utility/particles.py') diff --git a/utility/particles.py b/utility/particles.py index a7ef777..4b770bd 100644 --- a/utility/particles.py +++ b/utility/particles.py @@ -3,16 +3,23 @@ mf = cl.mem_flags import numpy +from mako.template import Template +from pathlib import Path + import OpenGL.GL as gl from OpenGL.arrays import vbo class Particles: - def __init__(self, context, queue, float_type, grid): - self.context = context + def __init__(self, lattice, moments, grid): + self.lattice = lattice + self.context = self.lattice.context + self.queue = self.lattice.queue + self.float_type = self.lattice.memory.float_type + self.moments = moments self.count = len(grid) - self.np_particles = numpy.ndarray(shape=(self.count, 4), dtype=float_type) - self.np_init_particles = numpy.ndarray(shape=(self.count, 4), dtype=float_type) + self.np_particles = numpy.ndarray(shape=(self.count, 4), dtype=self.float_type) + self.np_init_particles = numpy.ndarray(shape=(self.count, 4), dtype=self.float_type) if len(grid[0,:]) == 2: self.np_particles[:,0:2] = grid @@ -28,5 +35,36 @@ class Particles: self.gl_particles.bind() self.cl_gl_particles = cl.GLBuffer(self.context, mf.READ_WRITE, int(self.gl_particles)) - self.cl_init_particles = cl.Buffer(context, mf.READ_ONLY, size=self.count * 4*numpy.float32(0).nbytes) - cl.enqueue_copy(queue, self.cl_init_particles, self.np_init_particles).wait(); + self.cl_init_particles = cl.Buffer(self.context, mf.READ_ONLY, size=self.count * 4*numpy.float32(0).nbytes) + cl.enqueue_copy(self.queue, self.cl_init_particles, self.np_init_particles).wait(); + + self.build_kernel() + + def build_kernel(self): + program_src = Template(filename = str(Path(__file__).parent/'../template/particles.mako')).render( + descriptor = self.lattice.descriptor, + geometry = self.lattice.geometry, + memory = self.lattice.memory, + float_type = self.float_type, + ) + self.program = cl.Program(self.lattice.context, program_src).build(self.lattice.compiler_args) + + def bind(self): + gl.glEnableClientState(gl.GL_VERTEX_ARRAY) + self.gl_particles.bind() + gl.glVertexPointer(4, gl.GL_FLOAT, 0, self.gl_particles) + + def update(self, aging = False): + cl.enqueue_acquire_gl_objects(self.queue, [self.cl_gl_particles]) + + if aging: + age = numpy.float32(0.000006) + else: + age = numpy.float32(0.0) + + self.program.update_particles( + self.queue, (self.count,1), None, + self.moments.cl_gl_moments, + self.lattice.memory.cl_material, + self.cl_gl_particles, self.cl_init_particles, + age) -- cgit v1.2.3