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 )
Purpose: Draw all of the controllers as X/Y/Z lines