code: def new_explosion(self):
      n = len(self.data)
      color = np.random.uniform(0.1, 0.9, 4).astype(np.float32)
      color[3] = 1.0 / n**0.08
      loc = gl.glGetUniformLocation(self.program, "color")
      gl.glUniform4f(loc, *color)
  
      center = np.random.uniform(-0.5, 0.5, 3)
      loc = gl.glGetUniformLocation(self.program, "center")
      gl.glUniform3f(loc, *center)
  
      self.data["lifetime"] = np.random.normal(2.0, 0.5, (n,))
      self.data["start"] = np.random.normal(0.0, 0.2, (n, 3))
      self.data["end"] = np.random.normal(0.0, 1.2, (n, 3))
      gl.glBufferData(gl.GL_ARRAY_BUFFER, self.data, gl.GL_DYNAMIC_DRAW)
  
file_path: vispy/examples/gloo/gl/fireworks.py
imports: import numpy
  from vispy import app
  from vispy.gloo import gl
label_desc: Use image node_id 6 for calling the Canvas obj's underlying member method code with example usage: obj.new_explosion() without return types