class_docstr: Example of a very simple GL-line visual.
  
  This shows the minimal set of methods that need to be reimplemented to 
  make a new visual class.
code: def __init__(self, pos=None, color=(1, 1, 1, 1)):
      vcode = """
          attribute vec2 a_pos;
          
          void main() {
              gl_Position = $transform(vec4(a_pos, 0., 1.)); 
              gl_PointSize = 10.;
          }
          """
  
      fcode = """
          void main() {
              gl_FragColor = $color;
          }
          """
  
      visuals.Visual.__init__(self, vcode=vcode, fcode=fcode)
  
      self.pos_buf = gloo.VertexBuffer()
  
      # The Visual superclass contains a MultiProgram, which is an object
      # that behaves like a normal shader program (you can assign shader
      # code, upload values, set template variables, etc.) but internally
      # manages multiple ModularProgram instances, one per view.
  
      # The MultiProgram is accessed via the `shared_program` property, so
      # the following modifications to the program will be applied to all
      # views:
      self.shared_program["a_pos"] = self.pos_buf
      self.shared_program.frag["color"] = color
  
      self._need_upload = False
  
      # Visual keeps track of draw mode, index buffer, and GL state. These
      # are shared between all views.
      self._draw_mode = "line_strip"
      self.set_gl_state("translucent", depth_test=False)
  
      if pos is not None:
          self.set_data(pos)
  
imports: import sys
  import numpy
  from vispy import app, gloo, visuals
  from vispy.visuals.filters import Clipper, ColorFilter
  from vispy.visuals.shaders import MultiProgram
  from vispy.visuals.collections import PointCollection
  from vispy.visuals.transforms import STTransform
  from vispy.scene import SceneCanvas
  from vispy.scene.visuals import create_visual_node
label_desc: Use image node_id 1 to create a new LineVisual object from inherited base classes: visuals with example: obj = LineVisual(pos, color)