gpu_particle_burst_03.py Diff#

gpu_particle_burst_03.py#
--- /home/docs/checkouts/readthedocs.org/user_builds/arcade-library/checkouts/latest/doc/tutorials/gpu_particle_burst/gpu_particle_burst_02.py
+++ /home/docs/checkouts/readthedocs.org/user_builds/arcade-library/checkouts/latest/doc/tutorials/gpu_particle_burst/gpu_particle_burst_03.py
@@ -1,6 +1,8 @@
 """
 Example showing how to create particle explosions via the GPU.
 """
+import random
+import time
 from array import array
 from dataclasses import dataclass
 import arcade
@@ -10,12 +12,15 @@
 SCREEN_HEIGHT = 768
 SCREEN_TITLE = "GPU Particle Explosion"
 
+PARTICLE_COUNT = 300
+
 
 @dataclass
 class Burst:
     """ Track for each burst. """
     buffer: arcade.gl.Buffer
     vao: arcade.gl.Geometry
+    start_time: float
 
 
 class MyWindow(arcade.Window):
@@ -42,6 +47,9 @@
         # Loop through each burst
         for burst in self.burst_list:
 
+            # Set the uniform data
+            self.program['time'] = time.time() - burst.start_time
+
             # Render the burst
             burst.vao.render(self.program, mode=self.ctx.POINTS)
 
@@ -54,8 +62,13 @@
 
         def _gen_initial_data(initial_x, initial_y):
             """ Generate data for each particle """
-            yield initial_x
-            yield initial_y
+            for i in range(PARTICLE_COUNT):
+                dx = random.uniform(-.2, .2)
+                dy = random.uniform(-.2, .2)
+                yield initial_x
+                yield initial_y
+                yield dx
+                yield dy
 
         # Recalculate the coordinates from pixels to the OpenGL system with
         # 0, 0 at the center.
@@ -70,13 +83,13 @@
 
         # Create a buffer description that says how the buffer data is formatted.
         buffer_description = arcade.gl.BufferDescription(buffer,
-                                                         '2f',
-                                                         ['in_pos'])
+                                                         '2f 2f',
+                                                         ['in_pos', 'in_vel'])
         # Create our Vertex Attribute Object
         vao = self.ctx.geometry([buffer_description])
 
         # Create the Burst object and add it to the list of bursts
-        burst = Burst(buffer=buffer, vao=vao)
+        burst = Burst(buffer=buffer, vao=vao, start_time=time.time())
         self.burst_list.append(burst)