docs: def drawControllers(self):
          "Purpose: Draw all of the controllers as X/Y/Z lines"
          # don't draw controllers if somebody else has input focus
          if self.m_pHMD.isInputFocusCapturedByAnotherProcess():
              return
          vertdataarray = list()
          self.m_uiControllerVertcount = 0
          self.m_iTrackedControllerCount = 0
      
          for unTrackedDevice in range(openvr.k_unTrackedDeviceIndex_Hmd + 1, openvr.k_unMaxTrackedDeviceCount):
              if not self.m_pHMD.isTrackedDeviceConnected( unTrackedDevice ):
                  continue
              if self.m_pHMD.getTrackedDeviceClass( unTrackedDevice ) != openvr.TrackedDeviceClass_Controller:
                  continue
              self.m_iTrackedControllerCount += 1
              if not self.m_rTrackedDevicePose[ unTrackedDevice ].bPoseIsValid:
                  continue
              mat = self.m_rmat4DevicePose[unTrackedDevice]
              center = mat * Vector4( 0, 0, 0, 1 )
              for i in range(3):
                  color = Vector4( 0, 0, 0 )
                  point = Vector4( 0, 0, 0, 1 )
                  point[i] += 0.05  # offset in X, Y, Z
                  color[i] = 1.0  # R, G, B
                  point = mat * point
                  vertdataarray.append( center.x )
                  vertdataarray.append( center.y )
                  vertdataarray.append( center.z )
                  vertdataarray.append( color.x )
                  vertdataarray.append( color.y )
                  vertdataarray.append( color.z )
                  vertdataarray.append( point.x )
                  vertdataarray.append( point.y )
                  vertdataarray.append( point.z )
                  vertdataarray.append( color.x )
                  vertdataarray.append( color.y )
                  vertdataarray.append( color.z )
                  self.m_uiControllerVertcount += 2
              start = mat * Vector4( 0, 0, -0.02, 1 )
              end = mat * Vector4( 0, 0, -39., 1 )
              color = Vector3( .92, .92, .71 )
              vertdataarray.append( start.x )
              vertdataarray.append( start.y )
              vertdataarray.append( start.z )
              vertdataarray.append( color.x )
              vertdataarray.append( color.y )
              vertdataarray.append( color.z )
              vertdataarray.append( end.x )
              vertdataarray.append( end.y )
              vertdataarray.append( end.z )
              vertdataarray.append( color.x )
              vertdataarray.append( color.y )
              vertdataarray.append( color.z )
              self.m_uiControllerVertcount += 2
          # Setup the VAO the first time through.
          if self.m_unControllerVAO == 0:        
              self.m_unControllerVAO = glGenVertexArrays(1)
              glBindVertexArray( self.m_unControllerVAO )
              self.m_glControllerVertBuffer = glGenBuffers(1)
              glBindBuffer( GL_ARRAY_BUFFER, self.m_glControllerVertBuffer )
              stride = 2 * 3 * sizeof( ctypes.c_float )
              offset = 0
              glEnableVertexAttribArray( 0 )
              glVertexAttribPointer( 0, 3, GL_FLOAT, False, stride, offset)
              offset += sizeof( Vector3 )
              glEnableVertexAttribArray( 1 )
              glVertexAttribPointer( 1, 3, GL_FLOAT, False, stride, offset)
              glBindVertexArray( 0 )
          glBindBuffer( GL_ARRAY_BUFFER, self.m_glControllerVertBuffer )
          # set vertex data if we have some
          if len(vertdataarray) > 0:
              #$ TODO: Use glBufferSubData for this...
              glBufferData( GL_ARRAY_BUFFER, sizeof(float) * vertdataarray.size(), vertdataarray[0], GL_STREAM_DRAW )