docs: def change_attributes(self, bounds, radii, colors):
          """Reinitialize the buffers, to accomodate the new
          attributes. This is used to change the number of cylinders to
          be displayed.
  
          """
          
          self.n_cylinders = len(bounds)
          self.is_empty = True if self.n_cylinders == 0 else False
          
          if self.is_empty:
              self.bounds = bounds
              self.radii = radii
              self.colors = colors
              return # Do nothing
          
          # We pass the starting position 8 times, and each of these has
          # a mapping to the bounding box corner.
          self.bounds = np.array(bounds, dtype='float32')
          vertices, directions = self._gen_bounds(self.bounds) 
          
          self.radii = np.array(radii, dtype='float32')
          prim_radii = self._gen_radii(self.radii)
  
          self.colors = np.array(colors, dtype='uint8')
          prim_colors = self._gen_colors(self.colors)
         
          local = np.array([
             # First face -- front
            0.0, 0.0, 0.0,
            0.0, 1.0, 0.0, 
            1.0, 1.0, 0.0,
          
            0.0, 0.0, 0.0,
            1.0, 1.0, 0.0,
            1.0, 0.0, 0.0,
  
            # Second face -- back
            0.0, 0.0, 1.0,
            0.0, 1.0, 1.0, 
            1.0, 1.0, 1.0,
  
            0.0, 0.0, 1.0,
            1.0, 1.0, 1.0,
            1.0, 0.0, 1.0,
            
            # Third face -- left
            0.0, 0.0, 0.0,
            0.0, 0.0, 1.0, 
            0.0, 1.0, 1.0,
  
            0.0, 0.0, 0.0,
            0.0, 1.0, 1.0,
            0.0, 1.0, 0.0,
  
            # Fourth face -- right
            1.0, 0.0, 0.0,
            1.0, 0.0, 1.0, 
            1.0, 1.0, 1.0,
  
            1.0, 0.0, 0.0,
            1.0, 1.0, 1.0,
            1.0, 1.0, 0.0,
  
            # Fifth face -- up
            0.0, 1.0, 0.0,
            0.0, 1.0, 1.0,
            1.0, 1.0, 1.0,
  
            0.0, 1.0, 0.0,
            1.0, 1.0, 1.0,
            1.0, 1.0, 0.0,
            
            # Sixth face -- down
            0.0, 0.0, 0.0,
            0.0, 0.0, 1.0,
            1.0, 0.0, 1.0,
  
            0.0, 0.0, 0.0,
            1.0, 0.0, 1.0,
            1.0, 0.0, 0.0,
            
          ]).astype('float32')
          
          local = np.tile(local, self.n_cylinders)
          
          self._verts_vbo = VertexBuffer(vertices,GL_DYNAMIC_DRAW)
          self._directions_vbo = VertexBuffer(directions, GL_DYNAMIC_DRAW)
          
          self._local_vbo = VertexBuffer(local,GL_DYNAMIC_DRAW)
          self._color_vbo = VertexBuffer(prim_colors, GL_DYNAMIC_DRAW)
          self._radii_vbo = VertexBuffer(prim_radii, GL_DYNAMIC_DRAW)