Ejemplo n.º 1
0
class btvizGL:
    running = True

    leftMouseDown = False
    rotate = False
    mouseXY = [0, 0]
    camera = None

    index = GL.GLuint()
    lists = []

    poly = False
    scalefactor = 100

    root = [0, 0, 0]
    displaysize = (0, 0)

    animate = False
    imagecount = 0
    filename = None
    axis = 'z'

    rotation = 0

    showStats = True

    graph = False

    backgroundColour = [0, 0, 0]

    Neuron = None
    Graph = None

    gb = None

    def drawLine(self, parent, child, color, linewidth):
        GL.glLineWidth(linewidth)
        GL.glColor3f(color[0], color[1], color[2])
        GL.glBegin(GL.GL_LINES)
        GL.glVertex3f(parent[0], parent[1], parent[2])
        GL.glVertex3f(child[0], child[1], child[2])
        GL.glEnd()

    def RenderText(self, text, x, y):
        GL.glColor3f(1.0, 0.0, 0.0)
        GL.glWindowPos2f(x, y)
        GLUT.glutBitmapString(GLUT.GLUT_BITMAP_HELVETICA_10, text)

    def initGL(self, multisample):
        GL.glShadeModel(GL.GL_SMOOTH)

        GL.glColorMaterial(GL.GL_FRONT_AND_BACK, GL.GL_AMBIENT_AND_DIFFUSE)

        GL.glClearColor(self.backgroundColour[0], self.backgroundColour[1],
                        self.backgroundColour[2], 1)

        GL.glDepthFunc(GL.GL_LEQUAL)
        GL.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST)

        GL.glEnable(GL.GL_DEPTH_TEST)
        GL.glEnable(GL.GL_CULL_FACE)

        if multisample:
            GL.glEnable(GL.GL_MULTISAMPLE)

        self.camera = camera(self.root)

    def display(self):
        GL.glMatrixMode(GL.GL_MODELVIEW)
        GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
        GL.glLoadIdentity()

        self.camera.update()

        self.drawObjects()

        if self.showStats:
            self.drawText()
        GLUT.glutSwapBuffers()

        if self.Animate:
            self.SaveImage(self.imagecount)
            self.imagecount += 1
            self.camera.phi += 1
            if self.imagecount == 360:

                filenames = listdir('captures/images/')
                filenames = [int(x.split(".")[0]) for x in filenames]
                filenames.sort()
                filenames = [str(x) + ".bmp" for x in filenames]

                with imageio.get_writer('captures/animations/' +
                                        self.filename + '.gif',
                                        mode='I',
                                        fps=30) as writer:
                    from os import remove
                    for filename in filenames:
                        image = imageio.imread('captures/images/' + filename)
                        writer.append_data(image)
                        remove('captures/images/' + filename)
                    GLUT.glutSetOption(GLUT.GLUT_ACTION_ON_WINDOW_CLOSE,
                                       GLUT.GLUT_ACTION_GLUTMAINLOOP_RETURNS)
                    self.running = False
            GLUT.glutPostRedisplay()

    def drawObjects(self):
        if self.poly:
            if self.graph:
                self.gb.determineVisGraphPlanes(self.camera.phi,
                                                self.camera.theta)

            if self.animate:
                if self.axis is 'x':
                    GL.glRotate(self.rotation, 1, 0, 0)
                if self.axis is 'y':
                    GL.glRotate(self.rotation, 0, 0, 1)
                if self.axis is 'z':
                    GL.glRotate(self.rotation, 0, 1, 0)
                self.rotation += 1

            GL.glCallList(self.Neuron)

        else:
            if len(self.vertices_gl) > 0:
                GL.glPushMatrix()
                self.vertices_gl.bind()

                GL.glEnableClientState(GL.GL_VERTEX_ARRAY)
                GL.glVertexPointer(3, GLUT.GL_FLOAT, 0, self.vertices_gl)

                self.colors_gl.bind()
                GL.glEnableClientState(GL.GL_COLOR_ARRAY)
                GL.glColorPointer(3, GLUT.GL_FLOAT, 0, self.colors_gl)

                GL.glDrawArrays(GL.GL_LINES, 0, len(self.vertices_gl))
                GL.glPopMatrix()

    def drawText(self):
        self.RenderText(
            ('CamPos %f,%f,%f') %
            (self.camera.pos[0], self.camera.pos[1], self.camera.pos[2]), 10,
            575)
        self.RenderText(
            ('theta %f, phi %f') % (self.camera.theta, self.camera.phi), 10,
            555)
        self.RenderText(('radius %f') % (self.camera.rad), 10, 495)
        self.RenderText(
            ('CentrePos %f,%f,%f') %
            (self.camera.focus[0], self.camera.focus[1], self.camera.focus[2]),
            10, 515)
        self.RenderText(
            ('MousePos %f,%f') % (self.mouseXY[0], self.mouseXY[1]), 10, 535)
        self.RenderText(('rotate ' + self.rotate.__str__()), 10, 475)

    def reshape(self, width, height):

        if height == 0:
            height = 1
        aspect = width / height

        GL.glViewport(0, 0, width, height)
        GL.glMatrixMode(GL.GL_PROJECTION)
        GL.glLoadIdentity()
        GLU.gluPerspective(90, aspect, 0.01, 100)

    def mouse(self, button, state, x, y):
        self.rotate = False
        if button == GLUT.GLUT_LEFT_BUTTON and state == GLUT.GLUT_DOWN:
            self.leftMouseDown = True
            self.mouseXY = [x, y]
            self.rotate = True
        elif button == GLUT.GLUT_LEFT_BUTTON and state == GLUT.GLUT_UP:
            self.leftMouseDown = False

    def mouseMove(self, x, y):

        if (self.rotate):
            self.camera.phi += (x - self.mouseXY[0]) * 0.1

            if self.camera.phi > 180:
                self.camera.phi = self.camera.phi - 360
            elif self.camera.phi < -180:
                self.camera.phi = self.camera.phi + 360

            self.camera.theta = self.clamp(
                self.camera.theta + (y - self.mouseXY[1]) * 0.1, -89.999,
                89.999)
        self.mouseXY = [x, y]
        GLUT.glutPostRedisplay()

    def clamp(self, n, minn, maxn):
        return max(min(maxn, n), minn)

    def mouseWheel(self, wheel, direction, x, y):
        if direction > 0:
            self.camera.rad = max(0.1, self.camera.rad - 0.1)
        elif direction < 0:
            self.camera.rad = min(100, self.camera.rad + 0.1)

        GLUT.glutPostRedisplay()

    def keyDown(self, key, x, y):
        '''
        if key == 'w':
            self.camera.forward = True

        if key == 's':
            self.camera.backward = True

        if key == 'a':
            self.camera.left = True

        if key == 'd':
            self.camera.right = True
        '''
        if key == 'q':
            self.camera.up = True

        if key == 'e':
            self.camera.down = True

        GLUT.glutPostRedisplay()

    def keyUp(self, key, x, y):
        '''
        if key == 'w':
            self.camera.forward = False

        if key == 's':
            self.camera.backward = False

        if key == 'a':
            self.camera.left = False

        if key == 'd':
            self.camera.right = False
        '''
        if key == 'q':
            self.camera.up = False

        if key == 'e':
            self.camera.down = False

        if key == 'r':
            self.camera.focus = self.root
            self.camera.phi = 0
            self.camera.theta = 0

        if key == 'p':
            self.SaveImage(0)

        if key == 'h':
            self.showStats = not self.showStats

        if key == 'g':
            self.graph = not self.graph

        if key == 'q':
            self.running = False

        GLUT.glutPostRedisplay()

    def SaveImage(self, index):

        buff = GL.glReadPixels(0, 0, self.displaysize[0], self.displaysize[1],
                               GL.GL_RGB, GLUT.GL_UNSIGNED_BYTE)
        image = Image.frombytes(mode="RGB",
                                size=(self.displaysize[0],
                                      self.displaysize[1]),
                                data=buff)
        image = image.transpose(Image.FLIP_TOP_BOTTOM)
        image.save('captures/images/' + str(index) + '.bmp')

    def Animate(self,
                neuronObject,
                filename,
                displaysize=(800, 600),
                radius=5,
                poly=True,
                axis='z',
                graph=False):

        self.Animate = True
        self.filename = filename
        self.axis = axis
        self.showStats = False
        self.main(neuronObject, displaysize, radius, poly, False, True, graph)

    def Plot(self,
             neuronObject,
             displaysize=(800, 600),
             radius=5,
             poly=True,
             fast=False,
             multisample=True,
             graph=True):
        self.Animate = False
        self.showStats = True
        self.main(neuronObject, displaysize, radius, poly, fast, multisample,
                  graph)

    def main(self,
             neuronObject,
             displaysize=(800, 600),
             radius=5,
             poly=True,
             fast=False,
             multisample=True,
             graph=True):

        self.poly = poly
        self.displaysize = displaysize
        self.graph = graph

        title = 'btmorph OpenGL Viewer'

        GLUT.glutInit(sys.argv)
        if multisample:
            GLUT.glutInitDisplayMode(GLUT.GLUT_RGBA | GLUT.GLUT_DOUBLE)
        else:
            GLUT.glutInitDisplayMode(GLUT.GLUT_RGBA | GLUT.GLUT_DOUBLE
                                     | GLUT.GLUT_MULTISAMPLE)
        GLUT.glutInitWindowSize(self.displaysize[0], self.displaysize[1])
        GLUT.glutInitWindowPosition(50, 50)
        GLUT.glutCreateWindow(title)
        GLUT.glutDisplayFunc(self.display)
        GLUT.glutReshapeFunc(self.reshape)
        GLUT.glutMouseFunc(self.mouse)
        GLUT.glutMotionFunc(self.mouseMove)
        GLUT.glutMouseWheelFunc(self.mouseWheel)
        GLUT.glutKeyboardFunc(self.keyDown)
        GLUT.glutKeyboardUpFunc(self.keyUp)

        mb = modelbuilder()
        self.root, self.vertices_gl, self.colors_gl, self.Neuron = \
            mb.build(neuronObject, self.poly, 100, fast)
        if graph:
            self.gb = graphbuilder()
            self.Graph, mid = \
                self.gb.build(neuronObject, scalefactor=100)

        self.initGL(multisample)
        self.camera.rad = radius
        self.camera.focus = mid

        while self.running:
            GLUT.glutMainLoopEvent()

        GLUT.glutDestroyWindow(GLUT.glutGetWindow())
Ejemplo n.º 2
0
def main():

    # declare draw method so it can be reused during resizing
    def draw():
        gl.glClearColor(0.2, 0.3, 0.3, 1.0)
        gl.glClear(gl.GL_COLOR_BUFFER_BIT)

        gl.glUseProgram(shaderProgram)

        gl.glBindVertexArray(VAO)
        gl.glDrawElements(gl.GL_TRIANGLES, 3 * indices.shape[0],
                          gl.GL_UNSIGNED_INT, None)
        gl.glBindVertexArray(0)

        glfw.swap_buffers(window)

    # declaring resize callback in main to allow access to variables
    def window_size_callback(window, width, height):
        gl.glViewport(0, 0, width, height)
        # calling draw to allow drawing while resizing
        draw()

    # glfw: initialize and configure

    glfw.init()

    glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 3)
    glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 3)
    glfw.window_hint(glfw.OPENGL_PROFILE,
                     glfw.OPENGL_CORE_PROFILE)  # No deprecated functions
    glfw.window_hint(glfw.RESIZABLE, gl.GL_TRUE)

    # checking if run on Mac OS X
    if sys.platform == 'darwin':
        glfw.window_hint(glfw.OPENGL_FORWARD_COMPAT, gl.GL_TRUE)

    # glfw window creation
    window = glfw.create_window(WIDTH, HEIGHT, 'LearnOpenGL', None,
                                None)  # tutorial: (800, 600...
    if window is None:
        glfw.terminate()
        raise Exception("ERROR: Failed to create GLFW window")

    glfw.make_context_current(window)

    glfw.set_key_callback(window, key_callback)

    width, height = glfw.get_framebuffer_size(window)
    glfw.set_window_size_callback(window, window_size_callback)

    # build and compile shader program

    # vertex shader
    vertexShader = gl.glCreateShader(gl.GL_VERTEX_SHADER)
    gl.glShaderSource(vertexShader, vertexShaderSource)
    gl.glCompileShader(vertexShader)
    if not gl.glGetShaderiv(vertexShader, gl.GL_COMPILE_STATUS):
        infoLog = gl.glGetShaderInfoLog(vertexShader).decode()
        raise Exception("ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" +
                        infoLog)

    # fragment shader
    fragmentShader = gl.glCreateShader(gl.GL_FRAGMENT_SHADER)
    gl.glShaderSource(fragmentShader, fragmentShaderSource)
    gl.glCompileShader(fragmentShader)
    if not gl.glGetShaderiv(fragmentShader, gl.GL_COMPILE_STATUS):
        infoLog = gl.glGetShaderInfoLog(fragmentShader).decode()
        raise Exception("ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" +
                        infoLog)

    # link shaders
    shaderProgram = gl.glCreateProgram()
    gl.glAttachShader(shaderProgram, vertexShader)
    gl.glAttachShader(shaderProgram, fragmentShader)
    gl.glLinkProgram(shaderProgram)
    if not gl.glGetProgramiv(shaderProgram, gl.GL_LINK_STATUS):
        infoLog = gl.glGetProgramInfoLog(shaderProgram).decode()
        raise Exception("ERROR::SHADER::PROGRAM::LINKING_FAILED\n" + infoLog)
    gl.glDeleteShader(vertexShader)
    gl.glDeleteShader(fragmentShader)

    # set up vertex data (and buffer(s)) and configure vertex attributes

    vertices = np.array(
        [
            [0.5, 0.5, 0.0],  # Left  
            [0.5, -0.5, 0.0],  # Right 
            [-0.5, -0.5, 0.0],
            [-0.5, 0.5, 0.0]
        ],  # Top   
        dtype=np.float32)

    indices = np.array(
        [
            [0, 1, 3],  # first triangle
            [1, 2, 3]
        ],  # second triangle
        dtype=np.int32)

    VBO, VAO, EBO = gl.GLuint(), gl.GLuint(), gl.GLuint()

    gl.glGenVertexArrays(1, VAO)  # 1 -> 1 buffer to be generated
    gl.glGenBuffers(1, VBO)
    gl.glGenBuffers(1, EBO)

    # bind the Vertex Array Object first, then bind and set vertex buffer(s), and then configure vertex attributes(s)

    gl.glBindVertexArray(VAO)

    gl.glBindBuffer(gl.GL_ARRAY_BUFFER,
                    VBO)  # bind = make active/current for subsequent ops
    gl.glBufferData(gl.GL_ARRAY_BUFFER, vertices, gl.GL_STATIC_DRAW)

    gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, EBO)
    gl.glBufferData(gl.GL_ELEMENT_ARRAY_BUFFER, indices, gl.GL_STATIC_DRAW)

    stride = vertices.itemsize * vertices.shape[1]
    offset = gl.ctypes.c_void_p(vertices.itemsize * 0)

    gl.glVertexAttribPointer(0, 3, gl.GL_FLOAT, gl.GL_FALSE, stride, offset)
    gl.glEnableVertexAttribArray(0)  # location = 0

    gl.glBindBuffer(gl.GL_ARRAY_BUFFER, 0)
    gl.glBindVertexArray(0)

    # to put in wireframe mode
    gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_LINE)

    # render loop
    while not glfw.window_should_close(window):
        glfw.poll_events()

        draw()

    glfw.terminate()

    return 0
Ejemplo n.º 3
0
def main():
    if not glfw.init():
        return -1

    if not glfw.init():
        return -1

    glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 2)
    glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 1)

    window = glfw.create_window(800, 600, "Oculus Test", None, None)

    if not window:
        glfw.terminate()

    glfw.make_context_current(window)

    glfw.swap_interval(0)

    if failure(initialize()):
        return -1

    if failure(create()):
        shutdown()
        return -1

    hmdInfo = getHmdInfo()

    for eye, fov in enumerate(hmdInfo.defaultEyeFov):
        setEyeRenderFov(eye, fov)

    texSizeLeft = calcEyeBufferSize(EYE_LEFT)
    texSizeRight = calcEyeBufferSize(EYE_RIGHT)

    bufferW = texSizeLeft[0] + texSizeRight[0]
    bufferH = max(texSizeLeft[1], texSizeRight[1])

    createTextureSwapChainGL(TEXTURE_SWAP_CHAIN0, bufferW, bufferH)

    for eye in range(EYE_COUNT):
        setEyeColorTextureSwapChain(eye, TEXTURE_SWAP_CHAIN0)

    eye_w = int(bufferW / 2)
    eye_h = bufferH
    viewports = ((0, 0, eye_w, eye_h), (eye_w, 0, eye_w, eye_h))
    for eye, vp in enumerate(viewports):
        setEyeRenderViewport(eye, vp)

    setHighQuality(True)

    fboId = GL.GLuint()
    GL.glGenFramebuffers(1, ctypes.byref(fboId))
    GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, fboId)
    depthRb_id = GL.GLuint()
    GL.glGenRenderbuffers(1, ctypes.byref(depthRb_id))
    GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, depthRb_id)
    GL.glRenderbufferStorage(GL.GL_RENDERBUFFER, GL.GL_DEPTH24_STENCIL8,
                             int(bufferW),
                             int(bufferH))  # buffer size used here!
    GL.glFramebufferRenderbuffer(GL.GL_FRAMEBUFFER, GL.GL_DEPTH_ATTACHMENT,
                                 GL.GL_RENDERBUFFER, depthRb_id)
    GL.glFramebufferRenderbuffer(GL.GL_FRAMEBUFFER, GL.GL_STENCIL_ATTACHMENT,
                                 GL.GL_RENDERBUFFER, depthRb_id)
    GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, 0)
    GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)

    mirrorFbo = GL.GLuint()
    GL.glGenFramebuffers(1, ctypes.byref(mirrorFbo))
    createMirrorTexture(800, 600, mirrorOptions=MIRROR_OPTION_DEFAULT)

    frame_index = 0

    projectionMatrix = []
    for eye in range(EYE_COUNT):
        projectionMatrix.append(getEyeProjectionMatrix(eye))

    planePose = LibOVRPose((0., 0., -2.))

    # begin application loop
    while not glfw.window_should_close(window):
        waitToBeginFrame(frame_index)

        abs_time = getPredictedDisplayTime(frame_index)

        tracking_state = getTrackingState(abs_time, True)

        calcEyePoses(tracking_state.headPose.thePose)

        beginFrame(frame_index)

        GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, fboId)

        _, swapIdx = getTextureSwapChainCurrentIndex(TEXTURE_SWAP_CHAIN0)
        _, tex_id = getTextureSwapChainBufferGL(TEXTURE_SWAP_CHAIN0, swapIdx)

        GL.glFramebufferTexture2D(GL.GL_DRAW_FRAMEBUFFER,
                                  GL.GL_COLOR_ATTACHMENT0, GL.GL_TEXTURE_2D,
                                  tex_id, 0)

        for eye in range(EYE_COUNT):
            vp = getEyeRenderViewport(eye)
            GL.glViewport(*vp)
            GL.glScissor(*vp)

            P = projectionMatrix[eye]
            MV = getEyeViewMatrix(eye)

            GL.glEnable(GL.GL_SCISSOR_TEST)
            GL.glEnable(GL.GL_DEPTH_TEST)
            GL.glMatrixMode(GL.GL_PROJECTION)
            GL.glLoadTransposeMatrixf(P)

            GL.glMatrixMode(GL.GL_MODELVIEW)
            GL.glLoadTransposeMatrixf(MV)

            GL.glClearColor(0.0, 0.0, 0.0, 1.0)
            GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)

            GL.glPushMatrix()
            GL.glMultTransposeMatrixf(planePose.modelMatrix)
            GL.glBegin(GL.GL_QUADS)
            GL.glColor3f(1.0, 0.0, 0.0)
            GL.glVertex3f(-1.0, -1.0, 0.0)
            GL.glColor3f(0.0, 1.0, 0.0)
            GL.glVertex3f(-1.0, 1.0, 0.0)
            GL.glColor3f(0.0, 0.0, 1.0)
            GL.glVertex3f(1.0, 1.0, 0.0)
            GL.glColor3f(1.0, 1.0, 1.0)
            GL.glVertex3f(1.0, -1.0, 0.0)
            GL.glEnd()
            GL.glPopMatrix()

        GL.glDisable(GL.GL_DEPTH_TEST)

        commitTextureSwapChain(TEXTURE_SWAP_CHAIN0)

        GL.glBindFramebuffer(GL.GL_DRAW_FRAMEBUFFER, 0)

        endFrame(frame_index)

        frame_index += 1

        GL.glBindFramebuffer(GL.GL_READ_FRAMEBUFFER, mirrorFbo)
        GL.glBindFramebuffer(GL.GL_DRAW_FRAMEBUFFER, 0)

        _, mirrorId = getMirrorTexture()

        GL.glFramebufferTexture2D(GL.GL_READ_FRAMEBUFFER,
                                  GL.GL_COLOR_ATTACHMENT0, GL.GL_TEXTURE_2D,
                                  mirrorId, 0)

        GL.glViewport(0, 0, 800, 600)
        GL.glScissor(0, 0, 800, 600)
        GL.glClearColor(0.0, 0.0, 0.0, 1.0)
        GL.glClear(GL.GL_COLOR_BUFFER_BIT)
        GL.glBlitFramebuffer(0, 0, 800, 600, 0, 600, 800, 0,
                             GL.GL_COLOR_BUFFER_BIT, GL.GL_NEAREST)

        GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)

        glfw.swap_buffers(window)

        updateInputState(CONTROLLER_TYPE_TOUCH)
        A = getButton(CONTROLLER_TYPE_TOUCH, BUTTON_A, 'falling')
        B = getButton(CONTROLLER_TYPE_TOUCH, BUTTON_B, 'falling')

        if A[0]:
            recenterTrackingOrigin()
        elif B[0]:
            break

        glfw.poll_events()

        _, sessionStatus = getSessionStatus()
        if sessionStatus.shouldQuit:
            break

    destroyMirrorTexture()
    destroyTextureSwapChain(TEXTURE_SWAP_CHAIN0)
    destroy()
    # shutdown()  causes access violation on exit

    return 0