Ejemplo n.º 1
0
def renderGL(w, h, func, data):
    # TODO store original GL context and restore it afterwards?
    startGL()
    fbid = GL.glGenFramebuffers(1)
    GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, fbid)
    dbid = GL.glGenRenderbuffers(1)
    GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, dbid)
    GL.glRenderbufferStorage(GL.GL_RENDERBUFFER, GL.GL_DEPTH_COMPONENT, w, h)
    tid = GL.glGenTextures(1)
    GL.glBindTexture(GL.GL_TEXTURE_2D, tid)
    GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER,
                       GL.GL_LINEAR)
    GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER,
                       GL.GL_LINEAR)
    GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB, w, h, 0, GL.GL_RGB,
                    GL.GL_UNSIGNED_BYTE, None)
    GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0,
                              GL.GL_TEXTURE_2D, tid, 0)
    GL.glFramebufferRenderbuffer(GL.GL_FRAMEBUFFER, GL.GL_DEPTH_ATTACHMENT,
                                 GL.GL_RENDERBUFFER, dbid)
    assert GL.glCheckFramebufferStatus(
        GL.GL_FRAMEBUFFER) == GL.GL_FRAMEBUFFER_COMPLETE, 'GL error'
    GL.glViewport(0, 0, w, h)
    if isinstance(data, tuple): func(*data)
    else: func(data)
    data = GL.glReadPixels(0, 0, w, h, GL.GL_RGB, GL.GL_UNSIGNED_BYTE)
    GL.glBindTexture(GL.GL_TEXTURE_2D, 0)
    GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, 0)
    GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
    GL.glDeleteTextures([tid])
    GL.glDeleteFramebuffers(1, [fbid])
    GL.glDeleteRenderbuffers(1, [dbid])
    return np.fromstring(data, dtype=np.uint8).reshape(h, w, 3)
Ejemplo n.º 2
0
 def __init__(self, width, height):
     self.render_framebuffer_id = GL.glGenFramebuffers(1)
     GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.render_framebuffer_id)
     #
     self.depth_buffer_id = GL.glGenRenderbuffers(1)
     GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, self.depth_buffer_id)
     GL.glRenderbufferStorageMultisample(GL.GL_RENDERBUFFER, 4,
                                         GL.GL_DEPTH_COMPONENT, width,
                                         height)
     GL.glFramebufferRenderbuffer(GL.GL_FRAMEBUFFER, GL.GL_DEPTH_ATTACHMENT,
                                  GL.GL_RENDERBUFFER, self.depth_buffer_id)
     #
     self.render_texture_id = GL.glGenTextures(1)
     GL.glBindTexture(GL.GL_TEXTURE_2D_MULTISAMPLE, self.render_texture_id)
     GL.glTexImage2DMultisample(GL.GL_TEXTURE_2D_MULTISAMPLE, 4,
                                GL.GL_RGBA8, width, height, True)
     GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0,
                               GL.GL_TEXTURE_2D_MULTISAMPLE,
                               self.render_texture_id, 0)
     #
     self.resolve_framebuffer_id = GL.glGenFramebuffers(1)
     GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.resolve_framebuffer_id)
     #
     self.resolve_texture_id = GL.glGenTextures(1)
     GL.glBindTexture(GL.GL_TEXTURE_2D, self.resolve_texture_id)
     GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER,
                        GL.GL_LINEAR)
     GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAX_LEVEL, 0)
     GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA8, width, height, 0,
                     GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, None)
     GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0,
                               GL.GL_TEXTURE_2D, self.resolve_texture_id, 0)
     status = GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER)
     assert status == GL.GL_FRAMEBUFFER_COMPLETE
Ejemplo n.º 3
0
 def _create_framebuffer(self):
     """
     Make sure opengl context is bound before calling this method
     """
     fb = GL.glGenFramebuffers(1)
     GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, fb)
     self.texture = GL.glGenTextures(1)
     GL.glBindTexture(GL.GL_TEXTURE_2D, self.texture)
     GL.glTexImage2D(
         GL.GL_TEXTURE_2D,  # target
         0,
         GL.GL_RGBA,
         self.fb_size[0],
         self.fb_size[1],
         0,
         GL.GL_RGBA,
         GL.GL_UNSIGNED_BYTE,
         None,
     )
     GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST)
     GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST)
     GL.glFramebufferTexture(
         GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0, self.texture, 0
     )
     GL.glDrawBuffers(1, [GL.GL_COLOR_ATTACHMENT0])
     if GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER) != GL.GL_FRAMEBUFFER_COMPLETE:
         raise Exception("Incomplete framebuffer")
     GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
     return fb
Ejemplo n.º 4
0
    def _init_framebuffer_object(self):
        """
        returns a Framebuffer Object to support offscreen rendering.
        http://learnopengl.com/#!Advanced-OpenGL/Framebuffers
        """
        fbo = gl.glGenFramebuffers(1)
        gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, fbo)

        rbo = gl.glGenRenderbuffers(1)
        gl.glBindRenderbuffer(gl.GL_RENDERBUFFER, rbo)
        gl.glRenderbufferStorage(gl.GL_RENDERBUFFER, gl.GL_RGBA,
                                 self.init_width, self.init_height)
        gl.glFramebufferRenderbuffer(gl.GL_FRAMEBUFFER,
                                     gl.GL_COLOR_ATTACHMENT0,
                                     gl.GL_RENDERBUFFER, rbo)
        gl.glBindRenderbuffer(gl.GL_RENDERBUFFER, 0)
        gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, 0)
        fbo_status = gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER)

        if fbo_status != gl.GL_FRAMEBUFFER_COMPLETE:
            gl.glDeleteFramebuffers([fbo])
            glfw.terminate()
            raise Exception('Framebuffer failed status check: %s' % fbo_status)

        self._fbo = fbo
        self._rbo = rbo
Ejemplo n.º 5
0
    def __init__(self):
        self.__depthMapFbo = gl.glGenFramebuffers(1)

        self.__shadowW_i = 1024 * 4
        self.__shadowH_i = 1024 * 4

        self.__program = self._getProgram()

        self.__depthMapTex = gl.glGenTextures(1)
        gl.glBindTexture(gl.GL_TEXTURE_2D, self.__depthMapTex)
        gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_DEPTH_COMPONENT, self.__shadowW_i, self.__shadowH_i, 0,
                        gl.GL_DEPTH_COMPONENT, gl.GL_FLOAT, None)

        gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_NEAREST)
        gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)
        gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_CLAMP_TO_BORDER)
        gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_T, gl.GL_CLAMP_TO_BORDER)
        # gl.glTexParameterfv(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_BORDER_COLOR, (1.0, 1.0, 1.0, 1.0))

        gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, self.__depthMapFbo)
        gl.glFramebufferTexture2D(gl.GL_FRAMEBUFFER, gl.GL_DEPTH_ATTACHMENT, gl.GL_TEXTURE_2D, self.__depthMapTex, 0)
        gl.glDrawBuffer(gl.GL_NONE)
        gl.glReadBuffer(gl.GL_NONE)

        if gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER) != gl.GL_FRAMEBUFFER_COMPLETE:
            print( "ERROR::FRAMEBUFFER:: Framebuffer is not complete!" )
        gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, 0)
Ejemplo n.º 6
0
 def check_status(self):
     status = gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER)
     if status == gl.GL_FRAMEBUFFER_COMPLETE:
         return True
     else:
         print("Render target error: " + str(status))
         return False
Ejemplo n.º 7
0
    def _init_framebuffer_object(self):
        """
        returns a Framebuffer Object to support offscreen rendering.
        http://learnopengl.com/#!Advanced-OpenGL/Framebuffers
        """
        fbo = gl.glGenFramebuffers(1)
        gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, fbo)

        rbo = gl.glGenRenderbuffers(1)
        gl.glBindRenderbuffer(gl.GL_RENDERBUFFER, rbo)
        gl.glRenderbufferStorage(
            gl.GL_RENDERBUFFER,
            gl.GL_RGBA,
            self.init_width,
            self.init_height
        )
        gl.glFramebufferRenderbuffer(
            gl.GL_FRAMEBUFFER, gl.GL_COLOR_ATTACHMENT0, gl.GL_RENDERBUFFER, rbo)
        gl.glBindRenderbuffer(gl.GL_RENDERBUFFER, 0)
        gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, 0)
        fbo_status = gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER)

        if fbo_status != gl.GL_FRAMEBUFFER_COMPLETE:
            gl.glDeleteFramebuffers([fbo])
            glfw.terminate()
            raise Exception('Framebuffer failed status check: %s' % fbo_status)

        self._fbo = fbo
        self._rbo = rbo
Ejemplo n.º 8
0
	def paintEvent(self, event):	
		# On OS X, when using QGLWidget, it is possible that the opengl draw framebuffer is not
		# completely constructed before entering paint event.
		# We just omit all paint event before framebuffer is fully initialized.
		if GL.glCheckFramebufferStatus(GL.GL_DRAW_FRAMEBUFFER) != GL.GL_FRAMEBUFFER_COMPLETE:
			return
			
		# Need this to make sure we are drawing on the correct GL context	
		self.makeCurrent()
		
		# Compile and link shaders only when OpenGL draw framebuffer is constructed
		if not self.programCompiled:
			self.vertexShader = shaders.compileShader(VERTEX_SHADER, GL.GL_VERTEX_SHADER)
			self.fragmentShader = shaders.compileShader(FRAGMENT_SHADER, GL.GL_FRAGMENT_SHADER)
			self.fragmentMarkerShader = shaders.compileShader(	FRAGMENT_MARKER_SHADER, GL.GL_FRAGMENT_SHADER)
			self.shader = shaders.compileProgram(self.vertexShader, self.fragmentShader)
			self.markerShader = shaders.compileProgram(self.vertexShader, self.fragmentMarkerShader)
			self.programCompiled = True
	
		GL.glShadeModel(GL.GL_FLAT)
		GL.glEnable(GL.GL_DEPTH_TEST)

		GL.glEnable(GL.GL_POINT_SMOOTH)
		GL.glHint(GL.GL_POINT_SMOOTH_HINT, GL.GL_NICEST)
		GL.glEnable(GL.GL_LINE_SMOOTH)
		GL.glHint(GL.GL_LINE_SMOOTH_HINT, GL.GL_NICEST)
		GL.glEnable(GL.GL_BLEND)
		GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA)
		
		tv = math.tan(self.screen.parameterDialog.getVerticalFOV() * 0.5 / 180 * math.pi)
		th = math.tan(self.screen.parameterDialog.getHorizontalFOV() * 0.5 / 180 * math.pi)
		viewport_width = self.width()
		viewport_height = int(viewport_width * (tv / th))
		GL.glViewport((self.width() - viewport_width) / 2, (self.height() - viewport_height) / 2, viewport_width, viewport_height)
		
		GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
		
		self.updateCamera()				
		self.drawCoords()
		# self.drawCones()
		self.drawMarkers()
		self.drawGroups()
		
		GL.glDisable(GL.GL_CULL_FACE)
		GL.glDisable(GL.GL_DEPTH_TEST)
		
		GL.glPointSize(5)
		self.openGLDraw(self.shader, GL.GL_LINES, self.testVertexBuffer, self.testColorBuffer)
		
		painter = QtGui.QPainter(self)
		if len(self.mouseRect) > 0:
			painter.setPen(QtGui.QColor(0, 200, 50, 100))
			left = min(self.mouseRect[0].x(), self.mouseRect[1].x())
			top = min(self.mouseRect[0].y(), self.mouseRect[1].y())
			width = max(self.mouseRect[0].x(), self.mouseRect[1].x()) - left
			height = max(self.mouseRect[0].y(), self.mouseRect[1].y()) - top
			rect = QtCore.QRect(left, top, width, height)
			painter.drawRect(rect)
		painter.end()
Ejemplo n.º 9
0
    def __init__(self, bufferFormats, width, height):
        if len(bufferFormats) > 6:
            raise RuntimeError("Number of attachement to buffer too high: " +
                               str(len(bufferFormats)))

        # Create the frame buffer.
        self.textures_ = []
        self.fbo_ = GL.glGenFramebuffers(1)
        GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.fbo_)

        self.colorAttList_ = [
            GL.GL_COLOR_ATTACHMENT0, GL.GL_COLOR_ATTACHMENT1,
            GL.GL_COLOR_ATTACHMENT2, GL.GL_COLOR_ATTACHMENT3,
            GL.GL_COLOR_ATTACHMENT4, GL.GL_COLOR_ATTACHMENT5,
            GL.GL_COLOR_ATTACHMENT6
        ]
        self.formatDict_ = {
            GL.GL_RGBA32F: (GL.GL_RGBA, GL.GL_FLOAT),
            GL.GL_RGBA: (GL.GL_RGBA, GL.GL_UNSIGNED_BYTE),
            GL.GL_R32I: (GL.GL_RED_INTEGER, GL.GL_INT),
            GL.GL_RGBA32I: (GL.GL_RGBA_INTEGER, GL.GL_INT)
        }

        # Create the textures of the frame buffer.
        for it, currFormat in enumerate(bufferFormats):
            if not (currFormat in self.formatDict_):
                raise RuntimeError(
                    "The texture format is not in the dictionary: " +
                    str(currFormat))
            myFormat = self.formatDict_[currFormat]
            texture = GL.glGenTextures(1)
            GL.glBindTexture(GL.GL_TEXTURE_2D, texture)
            GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER,
                               GL.GL_NEAREST)
            GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER,
                               GL.GL_NEAREST)
            GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, currFormat, width, height, 0,
                            myFormat[0], myFormat[1], None)
            GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER,
                                      self.colorAttList_[it], GL.GL_TEXTURE_2D,
                                      texture, 0)
            self.textures_.append(texture)

        # Creaet the render buffer.
        self.rbo_ = GL.glGenRenderbuffers(1)
        GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, self.rbo_)
        GL.glRenderbufferStorage(GL.GL_RENDERBUFFER, GL.GL_DEPTH24_STENCIL8,
                                 width, height)
        GL.glFramebufferRenderbuffer(GL.GL_FRAMEBUFFER,
                                     GL.GL_DEPTH_STENCIL_ATTACHMENT,
                                     GL.GL_RENDERBUFFER, self.rbo_)

        # Check if the frame buffer was created properly.
        if not GL.glCheckFramebufferStatus(
                GL.GL_FRAMEBUFFER) == GL.GL_FRAMEBUFFER_COMPLETE:
            raise RuntimeError("Bind frame buffer failed")
        GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
        GL.glBindTexture(GL.GL_TEXTURE_2D, 0)
        GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, 0)
Ejemplo n.º 10
0
def _configure_screen_frame_buffer(texture_object):
    frame_buffer_object = GL.glGenFramebuffers(1)
    GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, frame_buffer_object)
    GL.glFramebufferTexture(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0, texture_object, 0)
    GL.glDrawBuffers(1, [GL.GL_COLOR_ATTACHMENT0])
    assert GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER) == GL.GL_FRAMEBUFFER_COMPLETE
    GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
    return frame_buffer_object
Ejemplo n.º 11
0
 def check_status(self):
     status = gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER)
     if status == gl.GL_FRAMEBUFFER_COMPLETE:
         print("Framebuffer complete")
         return True
     else:
         print("Render target error: " + str(status))
         return False
Ejemplo n.º 12
0
    def paintGL(self):
        """Paint the scene."""
        # pass if the framebuffer isn't complete yet or if not initialized
        if not (gl.glCheckFramebufferStatus(
                gl.GL_FRAMEBUFFER) == gl.GL_FRAMEBUFFER_COMPLETE
                and self.isVisible() and self.initialized):
            return

        gl.glClearColor(0, 0, 0, 0)
        gl.glClear(gl.GL_COLOR_BUFFER_BIT)
        # Set the viewport and clear the framebuffer

        # --- Draw the ND in its viewport ----
        gl.glViewport(*self.ndviewport)
        self.color_shader.use()
        self.arcs.draw()

        self.ownship.draw()
        self.mask.draw()
        self.edge.draw()

        self.ticks.draw()

        # Select the text shader
        self.text_shader.use()
        self.font.use()
        self.font.set_block_size((0, 0))
        self.globaldata.set_vertex_modifiers(VERTEX_IS_GLXY, True)
        self.ticklbls.draw()

        self.globaldata.set_vertex_modifiers(VERTEX_IS_GLXY, False)
        self.spdlabel_text.draw()
        self.spdlabel_val.draw()

        # --- Draw the MCP in its viewport ---
        gl.glViewport(*self.mcpviewport)
        self.mcp_tex_shader.use()
        gl.glActiveTexture(gl.GL_TEXTURE0 + 0)
        gl.glBindTexture(gl.GL_TEXTURE_2D, self.mcp_texture)
        self.mcp.draw()

        gl.glBindTexture(gl.GL_TEXTURE_2D, self.btn_tex)
        self.btn_leds.draw()

        if self.updownpos is not None:
            self.mcp_col_shader.use()
            gl.glVertexAttrib2f(2, *self.updownpos)
            self.updown.draw()
            gl.glVertexAttrib2f(2, 0.0, 0.0)

        self.mcp_txt_shader.use()
        gl.glActiveTexture(gl.GL_TEXTURE0 + 0)
        gl.glBindTexture(gl.GL_TEXTURE_2D_ARRAY, self.lcd_tex)
        self.mcp_text.draw()

        # Unbind everything
        RenderObject.unbind_all()
        gl.glUseProgram(0)
Ejemplo n.º 13
0
    def paintGL(self):
        if GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER) == 33305:
            return
        
        GL.glClear(GL.GL_COLOR_BUFFER_BIT)
        
        if not self.texture:
            return
            
        if not self.shader:
            self.compileShaders()

        if not self.vbo:
            self.vbo = GL.glGenBuffers(1)

        shaders.glUseProgram(self.shader)
               
        GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self.vbo)
        vertices = numpy.array(
            [-self.scale + self.cx, -self.scale + self.cy ,
             self.scale + self.cx, -self.scale + self.cy,
             self.scale + self.cx, self.scale + self.cy,
             -self.scale + self.cx, self.scale + self.cy,
            0,0,1,0,1,1,0,1], dtype = numpy.float32)
      
        GL.glBufferData(GL.GL_ARRAY_BUFFER, 64, vertices, GL.GL_STATIC_DRAW)
        
        loc = GL.glGetAttribLocation(self.shader, "positionIn")
        GL.glEnableVertexAttribArray(loc)
        GL.glVertexAttribPointer(loc, 2, GL.GL_FLOAT, 0, 8, c_void_p(0))
        
        loc = GL.glGetAttribLocation(self.shader, "texIn")
        GL.glEnableVertexAttribArray(loc)
        GL.glVertexAttribPointer(loc, 2, GL.GL_FLOAT, 0, 8, c_void_p(32))
              
        def _uniformLoc(name):
            return GL.glGetUniformLocation(self.shader,name)
        GL.glUniform1f(_uniformLoc("g"), self.gamma);
        GL.glUniform1f(_uniformLoc("m"), math.pow(2, self.exposure + 2.47393))
        GL.glUniform1f(_uniformLoc("s"), math.pow(2, -3.5 * self.gamma))
        GL.glUniform1i(_uniformLoc("hdr_mode"), self.hdr_mode);
        GL.glUniform1i(_uniformLoc("texture"), 0);
        GL.glActiveTexture(GL.GL_TEXTURE0);
        GL.glBindTexture(GL.GL_TEXTURE_2D, self.texture)

        GL.glDrawArrays(GL.GL_QUADS, 0, 4);

        GL.glBindTexture(GL.GL_TEXTURE_2D, 0)
        loc = GL.glGetAttribLocation(self.shader, "positionIn")
        GL.glDisableVertexAttribArray(loc)
        loc = GL.glGetAttribLocation(self.shader, "texIn")
        GL.glDisableVertexAttribArray(loc)
        GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0)
        shaders.glUseProgram(0)
        
        if self.rightBtnDown:
            self.renderPixelInfo()
Ejemplo n.º 14
0
    def setup_fb(self, width, height):
        '''Sets up FrameBuffer that will be used as container
           for 1 pass of rendering'''
        # Clean up old FB and Texture
        if self.fb_texture is not None and \
            GL.glIsTexture(self.fb_texture):
            GL.glDeleteTextures([self.fb_texture])
        if self.fbo is not None and GL.glIsFramebuffer(self.fbo):
            GL.glDeleteFramebuffers(1, [self.fbo])

        # initialize FrameBuffer
        self.fbo = GL.glGenFramebuffers(1)
        GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.fbo)

        depthbuffer = GL.glGenRenderbuffers(1)
        GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, depthbuffer)
        GL.glRenderbufferStorage(GL.GL_RENDERBUFFER, GL.GL_DEPTH_COMPONENT32F,
                                 width, height)
        GL.glFramebufferRenderbuffer(GL.GL_FRAMEBUFFER, GL.GL_DEPTH_ATTACHMENT,
                                     GL.GL_RENDERBUFFER, depthbuffer)
        # end of FrameBuffer initialization

        # generate the texture we render to, and set parameters
        self.fb_texture = GL.glGenTextures(1)  # create target texture
        # bind to new texture, all future texture functions will modify this
        # particular one
        GL.glBindTexture(GL.GL_TEXTURE_2D, self.fb_texture)
        # set how our texture behaves on x,y boundaries
        GL.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S,
                           GL.GL_REPEAT)
        GL.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T,
                           GL.GL_REPEAT)
        # set how our texture is filtered
        GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER,
                           GL.GL_LINEAR)
        GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER,
                           GL.GL_LINEAR)

        # occupy width x height texture memory, (None at the end == empty
        # image)
        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, width, height, 0,
                        GL.GL_RGBA, GL.GL_FLOAT, None)

        # --- end texture init

        # Set "fb_texture" as our colour attachement #0
        GL.glFramebufferTexture2D(
            GL.GL_FRAMEBUFFER,
            GL.GL_COLOR_ATTACHMENT0,
            GL.GL_TEXTURE_2D,
            self.fb_texture,
            0  # mipmap level, normally 0
        )

        # verify that everything went well
        status = GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER)
        assert status == GL.GL_FRAMEBUFFER_COMPLETE, status
Ejemplo n.º 15
0
    def paintGL(self):
        """Paint the scene."""
        # pass if the framebuffer isn't complete yet or if not initialized
        if not (gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER) == gl.GL_FRAMEBUFFER_COMPLETE and self.isVisible() and self.initialized):
            return

        gl.glClearColor(0, 0, 0, 0)
        gl.glClear(gl.GL_COLOR_BUFFER_BIT)
        # Set the viewport and clear the framebuffer

        # --- Draw the ND in its viewport ----
        gl.glViewport(*self.ndviewport)
        self.color_shader.use()
        self.arcs.draw()

        self.ownship.draw()
        self.mask.draw()
        self.edge.draw()

        self.ticks.draw()

        # Select the text shader
        self.text_shader.use()
        self.font.use()
        self.font.set_block_size((0, 0))
        self.globaldata.set_vertex_modifiers(VERTEX_IS_GLXY, True)
        self.ticklbls.draw()

        self.globaldata.set_vertex_modifiers(VERTEX_IS_GLXY, False)
        self.spdlabel_text.draw()
        self.spdlabel_val.draw()

        # --- Draw the MCP in its viewport ---
        gl.glViewport(*self.mcpviewport)
        self.mcp_tex_shader.use()
        gl.glActiveTexture(gl.GL_TEXTURE0 + 0)
        gl.glBindTexture(gl.GL_TEXTURE_2D, self.mcp_texture)
        self.mcp.draw()

        gl.glBindTexture(gl.GL_TEXTURE_2D, self.btn_tex)
        self.btn_leds.draw()

        if self.updownpos is not None:
            self.mcp_col_shader.use()
            gl.glVertexAttrib2f(2, *self.updownpos)
            self.updown.draw()
            gl.glVertexAttrib2f(2, 0.0, 0.0)

        self.mcp_txt_shader.use()
        gl.glActiveTexture(gl.GL_TEXTURE0 + 0)
        gl.glBindTexture(gl.GL_TEXTURE_2D_ARRAY, self.lcd_tex)
        self.mcp_text.draw()

        # Unbind everything
        RenderObject.unbind_all()
        gl.glUseProgram(0)
Ejemplo n.º 16
0
    def setup_framebuffer(self):
        """
        Set up RGB, surface normal, depth and segmentation framebuffers for the renderer
        """
        self.fbo = GL.glGenFramebuffers(1)
        self.color_tex_rgb = GL.glGenTextures(1)
        self.color_tex_normal = GL.glGenTextures(1)
        self.color_tex_semantics = GL.glGenTextures(1)
        self.color_tex_3d = GL.glGenTextures(1)
        self.depth_tex = GL.glGenTextures(1)

        GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex_rgb)
        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, self.width,
                        self.height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, None)

        GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex_normal)
        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, self.width,
                        self.height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, None)

        GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex_semantics)
        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, self.width,
                        self.height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, None)

        GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex_3d)
        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, self.width,
                        self.height, 0, GL.GL_RGBA, GL.GL_FLOAT, None)

        GL.glBindTexture(GL.GL_TEXTURE_2D, self.depth_tex)

        GL.glTexImage2D.wrappedOperation(GL.GL_TEXTURE_2D, 0,
                                         GL.GL_DEPTH24_STENCIL8, self.width,
                                         self.height, 0, GL.GL_DEPTH_STENCIL,
                                         GL.GL_UNSIGNED_INT_24_8, None)

        GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.fbo)
        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0,
                                  GL.GL_TEXTURE_2D, self.color_tex_rgb, 0)
        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT1,
                                  GL.GL_TEXTURE_2D, self.color_tex_normal, 0)
        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT2,
                                  GL.GL_TEXTURE_2D, self.color_tex_semantics,
                                  0)
        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT3,
                                  GL.GL_TEXTURE_2D, self.color_tex_3d, 0)
        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER,
                                  GL.GL_DEPTH_STENCIL_ATTACHMENT,
                                  GL.GL_TEXTURE_2D, self.depth_tex, 0)
        GL.glViewport(0, 0, self.width, self.height)
        GL.glDrawBuffers(4, [
            GL.GL_COLOR_ATTACHMENT0, GL.GL_COLOR_ATTACHMENT1,
            GL.GL_COLOR_ATTACHMENT2, GL.GL_COLOR_ATTACHMENT3
        ])

        assert GL.glCheckFramebufferStatus(
            GL.GL_FRAMEBUFFER) == GL.GL_FRAMEBUFFER_COMPLETE
Ejemplo n.º 17
0
 def paintGL(self):
     if 'glCheckFramebufferStatus' in GL.__dict__:
         if GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER) != GL.GL_FRAMEBUFFER_COMPLETE:
             return
     GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
     GL.glLoadIdentity()
     GL.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, (1, 1, 1, 0.25))
     GL.glTranslated(0.0, 0.0, -10.0)
     GL.glRotated(self.xRot / 16.0, 1.0, 0.0, 0.0)
     GL.glRotated(self.yRot / 16.0, 0.0, 1.0, 0.0)
     GL.glRotated(self.zRot / 16.0, 0.0, 0.0, 1.0)
     GL.glCallList(self.objects)
Ejemplo n.º 18
0
    def __init__(self, size):
        self.size = size
        self.fbo = FBO()
        self.color_tex = Texture()
        self.depth_tex = Texture()
        w, h = size

        with self.color_tex:
            gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA32F, w, h, 0,
                            gl.GL_RGBA, gl.GL_FLOAT, None)

        with self.depth_tex:
            gl.glTexImage2D.wrappedOperation(gl.GL_TEXTURE_2D, 0,
                                             gl.GL_DEPTH24_STENCIL8, w, h, 0,
                                             gl.GL_DEPTH_STENCIL,
                                             gl.GL_UNSIGNED_INT_24_8, None)

        with self.fbo:
            gl.glFramebufferTexture2D(gl.GL_FRAMEBUFFER,
                                      gl.GL_COLOR_ATTACHMENT0,
                                      gl.GL_TEXTURE_2D, self.color_tex, 0)
            gl.glFramebufferTexture2D(gl.GL_FRAMEBUFFER,
                                      gl.GL_DEPTH_STENCIL_ATTACHMENT,
                                      gl.GL_TEXTURE_2D, self.depth_tex, 0)
            gl.glViewport(0, 0, w, h)
            assert gl.glCheckFramebufferStatus(
                gl.GL_FRAMEBUFFER) == gl.GL_FRAMEBUFFER_COMPLETE

        self.shader = Shader(vp_code='''
      #version 130
      uniform mat4 MVP;
      uniform mat4 MV;
      in vec4 data;
      out vec4 aData;

      void main() {
        aData = data;
        gl_Position = MVP * gl_Vertex;
      }
    ''',
                             fp_code='''
      #version 130
      in vec4 aData;
      out vec4 fragColor;
      void main() {
        fragColor = aData;
      }
    ''')

        self.fovy = 10.0
        self.aspect = 1.0 * w / h
        self.znear, self.zfar = 0.01, 100.0
Ejemplo n.º 19
0
def _checkBoundFramebuffer():
    status = gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER)
    if status == gl.GL_FRAMEBUFFER_COMPLETE:
        return
    elif status == gl.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
        raise Exception("GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT")
    elif status == gl.GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
        raise Exception("GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS")
    elif status == gl.GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
        raise Exception("GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT")
    elif status == gl.GL_FRAMEBUFFER_UNSUPPORTED:
        raise Exception("GL_FRAMEBUFFER_UNSUPPORTED")
    else:
        raise Exception(status)
Ejemplo n.º 20
0
 def paintGL(self):
     if 'glCheckFramebufferStatus' in GL.__dict__:
         if GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER) != GL.GL_FRAMEBUFFER_COMPLETE:
             return
     GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
     GL.glLoadIdentity()
     GL.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, (20, -10, -20, 0))
     GL.glLightfv(GL.GL_LIGHT1, GL.GL_DIFFUSE, (0.25, 0.25, 0.25, 1))
     GL.glLightfv(GL.GL_LIGHT1, GL.GL_POSITION, (-10, -5, -20, 0))
     GL.glTranslated(0.0, 0.0, -10.0)
     GL.glRotated(self.xRot / 16.0, 1.0, 0.0, 0.0)
     GL.glRotated(self.yRot / 16.0, 0.0, 1.0, 0.0)
     GL.glRotated(self.zRot / 16.0, 0.0, 0.0, 1.0)
     GL.glCallList(self.objects[self.index])
Ejemplo n.º 21
0
    def __setup(self, width: int, height: int) -> None:
        if self.__is_setup:
            self.__teardown()

        self.__is_setup = True

        self.__fbo = GL.glGenFramebuffers(1)
        if self.__debug_name is not None:
            GL.glObjectLabel(GL.GL_FRAMEBUFFER, self.__fbo, -1,
                             self.__debug_name)

        self.__info_tex = Texture(debug_name=self.__debug_name)

        self.__i8_texture(self.__info_tex, GL.GL_RG8UI, GL.GL_RG_INTEGER,
                          width, height)

        with self:

            GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER,
                                      GL.GL_COLOR_ATTACHMENT0,
                                      GL.GL_TEXTURE_2D, self.__info_tex.v, 0)

            GL.glDrawBuffers([GL.GL_COLOR_ATTACHMENT0])

            status = GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER)

            if status != GL.GL_FRAMEBUFFER_COMPLETE:
                lut = [
                    GL.GL_FRAMEBUFFER_UNDEFINED,
                    GL.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
                    GL.GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT,
                    GL.GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER,
                    GL.GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER,
                    GL.GL_FRAMEBUFFER_UNSUPPORTED,
                    GL.GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE,
                    GL.GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS
                ]

                # Find the magic constant name
                for i in lut:
                    if status == int(i):
                        result = i
                        break
                else:
                    result = "unknown %d" % status

                print("Error, could not create framebuffer. Status: %s" %
                      str(result))
                assert False
Ejemplo n.º 22
0
    def __init__(self):
        self.__fbo = gl.glGenFramebuffers(1)
        self.__depthCubeMap = gl.glGenTextures(1)
        self.__width = 1024
        self.__height = 1024

        gl.glBindTexture(gl.GL_TEXTURE_2D, self.__depthCubeMap)
        gl.glActiveTexture(gl.GL_TEXTURE0 + self.__depthCubeMap)
        for i in range(6):
            gl.glTexImage2D(gl.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
                            gl.GL_DEPTH_COMPONENT, self.__width, self.__height,
                            0, gl.GL_DEPTH_COMPONENT, gl.GL_FLOAT, None)

        gl.glTexParameteri(gl.GL_TEXTURE_CUBE_MAP, gl.GL_TEXTURE_MAG_FILTER,
                           gl.GL_NEAREST)
        gl.glTexParameteri(gl.GL_TEXTURE_CUBE_MAP, gl.GL_TEXTURE_MIN_FILTER,
                           gl.GL_NEAREST)
        gl.glTexParameteri(gl.GL_TEXTURE_CUBE_MAP, gl.GL_TEXTURE_WRAP_S,
                           gl.GL_CLAMP_TO_EDGE)
        gl.glTexParameteri(gl.GL_TEXTURE_CUBE_MAP, gl.GL_TEXTURE_WRAP_T,
                           gl.GL_CLAMP_TO_EDGE)
        gl.glTexParameteri(gl.GL_TEXTURE_CUBE_MAP, gl.GL_TEXTURE_WRAP_R,
                           gl.GL_CLAMP_TO_EDGE)

        gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, self.__fbo)
        gl.glFramebufferTexture(gl.GL_FRAMEBUFFER, gl.GL_DEPTH_ATTACHMENT,
                                self.__depthCubeMap, 0)
        gl.glDrawBuffer(gl.GL_NONE)
        gl.glReadBuffer(gl.GL_NONE)

        if gl.glCheckFramebufferStatus(
                gl.GL_FRAMEBUFFER) != gl.GL_FRAMEBUFFER_COMPLETE:
            raise Exception(
                "ERROR::FRAMEBUFFER:: Framebuffer is not complete! -> {:02X}".
                format(gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER)))
        gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, 0)
Ejemplo n.º 23
0
    def resize(self, width, height):
        '''Resize to new width and height.

        For safety, this actually destroys and recreates the framebuffer and
        all attachments.
        '''
        #Check to make sure we actually changed something.
        if self.width == width and self.height == height: return
        # print(width, height)

        self.delete()

        self.width = width
        self.height = height

        self.id = GL.glGenFramebuffers(1)
        self.bind()

        self.texture = Texture((self.width, self.height), **self.textureKwargs)
        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0,
                                  self.texture.target, self.texture.id, 0)

        if self.depth:
            if self._depthTexture:
                self.depthTexture = Texture((self.width, self.height),
                                            **self.depthTextureKwargs)
                GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER,
                                          GL.GL_DEPTH_ATTACHMENT,
                                          self.depthTexture.target,
                                          self.depthTexture.id, 0)
            else:
                self.depthId = GL.glGenRenderbuffers(1)
                GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, self.depthId)
                GL.glRenderbufferStorage(GL.GL_RENDERBUFFER, self.depthType,
                                         self.width, self.height)
                GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, 0)
                GL.glFramebufferRenderbuffer(GL.GL_FRAMEBUFFER,
                                             GL.GL_DEPTH_ATTACHMENT,
                                             GL.GL_RENDERBUFFER, self.depthId)

        status = GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER)
        if status != GL.GL_FRAMEBUFFER_COMPLETE:
            errs = dict((int(globals()[item]), item) for item in globals()
                        if 'GL_FRAMEBUFFER_' in item)
            raise RuntimeError("Framebuffer status: %s" %
                               errs.get(status, status))

        self.aspect = self.width / self.height
Ejemplo n.º 24
0
    def create_render_target(self):
        render_texture = GL.glGenTextures(1)
        GL.glBindTexture(GL.GL_TEXTURE_2D, render_texture)
        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB, self.width(), self.height(), 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, None)
        GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST)
        GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST)

        fbo = GL.glGenFramebuffers(1)
        GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, fbo)

        GL.glFramebufferTexture(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0, render_texture, 0)

        if GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER) != GL.GL_FRAMEBUFFER_COMPLETE:
            raise Exception("Framebuffer creation failed")

        GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
        return fbo, render_texture
Ejemplo n.º 25
0
    def init_img_fb(self):
        """
        Create 2 framebuffers to use for swapping image to texture for post
        processing shaders
        """
        for name in self.fb_ids:
            self.fb_ids[name] = gl.glGenFramebuffers(1)
            gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, self.fb_ids[name])
            gl.glFramebufferTexture2D(
                gl.GL_FRAMEBUFFER, gl.GL_COLOR_ATTACHMENT0, gl.GL_TEXTURE_2D,
                self.texture_ids[self.fb_texture_map[name]], 0)

            assert (gl.GL_FRAMEBUFFER_COMPLETE == gl.glCheckFramebufferStatus(
                gl.GL_FRAMEBUFFER)), (
                    "Frame buffer %s isn't completely initialized" % (name))

        gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, 0)
Ejemplo n.º 26
0
    def __init__(self, width, height, attachments, pixel_format=GL.GL_RGBA16F):
        """ Initialise an FBO given a width and height. """

        # Create and initialise an FBO with colour attachments of
        # the appropriate size.
        self.__fbo = GL.glGenFramebuffers(1)
        self.__textures = {}
        GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.__fbo)
        for attachment in attachments:
            texture = Texture.blank(width, height, pixel_format)
            GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER,
                                      attachment,
                                      GL.GL_TEXTURE_2D,
                                      texture.get_texture(),
                                      0)
            self.__textures[attachment] = texture
        assert GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER) == GL.GL_FRAMEBUFFER_COMPLETE
Ejemplo n.º 27
0
 def check_status(self):
     """
     Checks the completeness of the FBO
     """
     status = GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER)
     incomplete_states = {
         GL.GL_FRAMEBUFFER_UNSUPPORTED: "Framebuffer unsupported. Try another format.",
         GL.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: "Framebuffer incomplete attachment",
         GL.GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: "Framebuffer missing attachment",
         GL.GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: "Framebuffer unsupported dimension.",
         GL.GL_FRAMEBUFFER_INCOMPLETE_FORMATS: "Framebuffer incoplete formats.",
         GL.GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER: "Framebuffer incomplete draw buffer.",
         GL.GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER: "Framebuffer incomplete read buffer",
     }
     if status == GL.GL_FRAMEBUFFER_COMPLETE:
         return
     s = incomplete_states.get(status, "Unknown error")
     raise FBOError(s)
Ejemplo n.º 28
0
    def bind(self, clear=True):
        self.viewport = tuple(GL.glGetIntegerv(GL.GL_VIEWPORT))
        if not self.initialized:
            GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.fb_id)
            GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, self.rb_id)
            GL.glRenderbufferStorage(
                GL.GL_RENDERBUFFER,
                GL.GL_DEPTH_COMPONENT32F,
                self.viewport[2],
                self.viewport[3],
            )
            GL.glFramebufferRenderbuffer(
                GL.GL_FRAMEBUFFER,
                GL.GL_DEPTH_ATTACHMENT,
                GL.GL_RENDERBUFFER,
                self.rb_id,
            )

            GL.glFramebufferTexture2D(
                GL.GL_FRAMEBUFFER,
                GL.GL_COLOR_ATTACHMENT0,
                GL.GL_TEXTURE_2D,
                self.fb_tex.texture_name,
                0,  # mipmap level, normally 0
            )
            GL.glFramebufferTexture2D(
                GL.GL_FRAMEBUFFER,
                GL.GL_DEPTH_ATTACHMENT,
                GL.GL_TEXTURE_2D,
                self.db_tex.texture_name,
                0,  # mipmap level, normally 0
            )
            status = GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER)
            if status != GL.GL_FRAMEBUFFER_COMPLETE:
                raise RuntimeError
            self.initialized = True
        GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.fb_id)
        if clear:
            GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
        yield
        GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
Ejemplo n.º 29
0
    def paintGL(self):
        """Paint the scene."""
        # pass if the framebuffer isn't complete yet or if not initialized
        if not (gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER) == gl.GL_FRAMEBUFFER_COMPLETE and self.isVisible()):
            return

        # Set the viewport and clear the framebuffer
        gl.glViewport(*self.viewport)
        gl.glClear(gl.GL_COLOR_BUFFER_BIT)
        gl.glVertexAttrib1f(ATTRIB_OFFSETY, 0.0)

        self.color_shader.use()

        self.fixed.draw()

        gl.glEnable(gl.GL_CLIP_DISTANCE0)
        gl.glEnable(gl.GL_CLIP_DISTANCE1)
        gl.glVertexAttrib1f(ATTRIB_OFFSETY, self.y_offset)
        self.scale.draw()

        self.text_shader.use()
        self.font.use()
        self.font.set_char_size(self.scaletxt.char_size)
        self.font.set_block_size(self.scaletxt.block_size)
        self.scaletxt.draw()

        gl.glDisable(gl.GL_CLIP_DISTANCE1)
        self.font.set_char_size(self.aclbls.char_size)
        self.font.set_block_size(self.aclbls.block_size)
        self.aclbls.draw()
        gl.glDisable(gl.GL_CLIP_DISTANCE0)

        gl.glVertexAttrib1f(ATTRIB_OFFSETY, 0.0)
        self.font.set_char_size(self.rwylbl.char_size)
        self.font.set_block_size(self.rwylbl.block_size)
        self.rwylbl.draw()
        self.timelbl.draw()
        # Unbind everything
        RenderObject.unbind_all()
        gl.glUseProgram(0)
Ejemplo n.º 30
0
    def genShadowMap(self) -> None:
        self.__depthMapFbo = gl.glGenFramebuffers(1);

        self.depthMapTex = gl.glGenTextures(1);
        gl.glBindTexture(gl.GL_TEXTURE_2D, self.depthMapTex);
        gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_DEPTH_COMPONENT, self.__shadowW_i, self.__shadowH_i, 0,
                        gl.GL_DEPTH_COMPONENT, gl.GL_FLOAT, None);

        gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_NEAREST);
        gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST);
        gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_CLAMP_TO_BORDER);
        gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_T, gl.GL_CLAMP_TO_BORDER);
        # gl.glTexParameterfv(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_BORDER_COLOR, (1.0, 1.0, 1.0, 1.0));

        gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, self.__depthMapFbo);
        gl.glFramebufferTexture2D(gl.GL_FRAMEBUFFER, gl.GL_DEPTH_ATTACHMENT, gl.GL_TEXTURE_2D, self.depthMapTex, 0);
        gl.glDrawBuffer(gl.GL_NONE);
        gl.glReadBuffer(gl.GL_NONE);

        if gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER) != gl.GL_FRAMEBUFFER_COMPLETE:
            print("ERROR::FRAMEBUFFER:: Framebuffer is not complete!");
        gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, 0);
Ejemplo n.º 31
0
    def attach(self, target: int,
               attachment: Union[GlTexture2D, GlTextureRectangle,
                                 GlRenderbuffer]):
        """ attach Texture or Renderbuffer to given attachment target.

        Args:
          target: attachment target, e.g., GL_COLOR_ATTACHMENT0, GL_DEPTH_STENCIL_ATTACHMENT, ...
          attachment: texture or renderbuffer to attach.
    """

        if isinstance(attachment, (GlTexture2D, GlTextureRectangle)):
            texture_target = None
            if isinstance(attachment, GlTexture2D):
                texture_target = gl.GL_TEXTURE_2D
            if isinstance(attachment, GlTextureRectangle):
                texture_target = gl.GL_TEXTURE_RECTANGLE

            gl.glBindFramebuffer(self._target, self._id)
            gl.glFramebufferTexture2D(self._target, target, texture_target,
                                      attachment.id, 0)
            gl.glBindFramebuffer(self._target, 0)

        elif isinstance(attachment, GlRenderbuffer):
            gl.glBindFramebuffer(self._target, self._id)
            gl.glFramebufferRenderbuffer(self._target, target,
                                         gl.GL_RENDERBUFFER, attachment.id)
            gl.glBindFramebuffer(self._target, 0)
        else:
            raise ValueError(
                "texture should be GlTexture2D, GlTextureRectangle or GlRenderbuffer."
            )

        self._attachments[target] = attachment
        gl.glBindFramebuffer(self._target, self._id)
        self._valid = gl.glCheckFramebufferStatus(
            self._target) == gl.GL_FRAMEBUFFER_COMPLETE

        gl.glBindFramebuffer(self._target, 0)
Ejemplo n.º 32
0
    def _initFBO(self):
        self.fboWidth = self.width
        self.fboHeight = self.height

        # Create three Render buffers. One for color one for XYZW one for depth_component
        self.renderBuffers = GL.glGenRenderbuffers(3)

        # initialize storage for the render buffers
        for i in range(2):
            GL.glBindRenderbuffer(GL.GL_RENDERBUFFER,self.renderBuffers[i])
            GL.glRenderbufferStorage(GL.GL_RENDERBUFFER,GL.GL_RGBA32F,self.fboWidth,self.fboHeight)
            GL.glBindRenderbuffer(GL.GL_RENDERBUFFER,0)

        GL.glBindRenderbuffer(GL.GL_RENDERBUFFER,self.renderBuffers[2])
        GL.glRenderbufferStorage(GL.GL_RENDERBUFFER,GL.GL_DEPTH_COMPONENT,self.fboWidth,self.fboHeight)
        GL.glBindRenderbuffer(GL.GL_RENDERBUFFER,0)
        
            
        self.fbo = GL.glGenFramebuffers(1)
        # bind buffer and populate with RenderBuffers
        GL.glBindFramebuffer(GL.GL_FRAMEBUFFER,self.fbo)

        self.renderBufferAt = [GL.GL_COLOR_ATTACHMENT0,GL.GL_COLOR_ATTACHMENT1]

        GL.glFramebufferRenderbuffer(GL.GL_FRAMEBUFFER,self.renderBufferAt[0],GL.GL_RENDERBUFFER,self.renderBuffers[0])
        GL.glFramebufferRenderbuffer(GL.GL_FRAMEBUFFER,self.renderBufferAt[1],GL.GL_RENDERBUFFER,self.renderBuffers[1])
        
        GL.glFramebufferRenderbuffer(GL.GL_FRAMEBUFFER,GL.GL_DEPTH_ATTACHMENT,GL.GL_RENDERBUFFER,self.renderBuffers[2])
        
        # make sure that the new FBO  is complete
        status = GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER)
        if status != GL.GL_FRAMEBUFFER_COMPLETE:
            raise StandardError("Failed to properly setup FBO. OpenGL returned FBO status: ",status)

        #unbind FBO
        GL.glBindFramebuffer(GL.GL_FRAMEBUFFER,0)
        print "FBO initialized correctly."
Ejemplo n.º 33
0
    def paintGL(self):
        """Paint the scene."""
        # pass if the framebuffer isn't complete yet or if not initialized
        if not (gl.glCheckFramebufferStatus(
                gl.GL_FRAMEBUFFER) == gl.GL_FRAMEBUFFER_COMPLETE
                and self.initialized and self.isVisible()):
            return

        # Set the viewport and clear the framebuffer
        gl.glViewport(*self.viewport)
        gl.glClear(gl.GL_COLOR_BUFFER_BIT)

        # Send the (possibly) updated global uniforms to the buffer
        self.globaldata.set_vertex_scale_type(VERTEX_IS_LATLON)

        # --- DRAW THE MAP AND COASTLINES ---------------------------------------------
        # Map and coastlines: don't wrap around in the shader
        self.globaldata.enable_wrap(False)

        if self.show_map:
            # Select the texture shader
            self.texture_shader.use()

            # Draw map texture
            gl.glActiveTexture(gl.GL_TEXTURE0 + 0)
            gl.glBindTexture(gl.GL_TEXTURE_2D, self.map_texture)
            self.map.draw()

        # Select the non-textured shader
        self.color_shader.use()

        # Draw coastlines
        if self.show_coast:
            if self.wrapdir == 0:
                # Normal case, no wrap around
                self.coastlines.draw(first_vertex=0,
                                     vertex_count=self.vcount_coast)
            else:
                self.coastlines.bind()
                wrapindex = np.uint32(self.coastindices[int(self.wraplon) +
                                                        180])
                if self.wrapdir == 1:
                    gl.glVertexAttrib1f(ATTRIB_LON, 360.0)
                    self.coastlines.draw(first_vertex=0,
                                         vertex_count=wrapindex)
                    gl.glVertexAttrib1f(ATTRIB_LON, 0.0)
                    self.coastlines.draw(first_vertex=wrapindex,
                                         vertex_count=self.vcount_coast -
                                         wrapindex)
                else:
                    gl.glVertexAttrib1f(ATTRIB_LON, -360.0)
                    self.coastlines.draw(first_vertex=wrapindex,
                                         vertex_count=self.vcount_coast -
                                         wrapindex)
                    gl.glVertexAttrib1f(ATTRIB_LON, 0.0)
                    self.coastlines.draw(first_vertex=0,
                                         vertex_count=wrapindex)

        # --- DRAW PREVIEW SHAPE (WHEN AVAILABLE) -----------------------------
        self.polyprev.draw()

        # --- DRAW CUSTOM SHAPES (WHEN AVAILABLE) -----------------------------
        self.allpolys.draw()

        # --- DRAW THE SELECTED AIRCRAFT ROUTE (WHEN AVAILABLE) ---------------
        if self.show_traf:
            self.route.draw()
            self.cpalines.draw()

        # --- DRAW AIRPORT DETAILS (RUNWAYS, TAXIWAYS, PAVEMENTS) -------------
        self.runways.draw()
        self.thresholds.draw()
        if self.zoom >= 1.0:
            for idx in self.apt_inrange:
                self.taxiways.draw(first_vertex=idx[0], vertex_count=idx[1])
                self.pavement.draw(first_vertex=idx[2], vertex_count=idx[3])

        # --- DRAW THE INSTANCED AIRCRAFT SHAPES ------------------------------
        # update wrap longitude and direction for the instanced objects
        self.globaldata.enable_wrap(True)

        # PZ circles only when they are bigger than the A/C symbols
        if self.naircraft > 0 and self.show_traf and self.show_pz and self.zoom >= 0.15:
            self.globaldata.set_vertex_scale_type(VERTEX_IS_METERS)
            self.protectedzone.draw(n_instances=self.naircraft)

        self.globaldata.set_vertex_scale_type(VERTEX_IS_SCREEN)

        # Draw traffic symbols
        if self.naircraft > 0 and self.show_traf:
            self.ac_symbol.draw(n_instances=self.naircraft)

        if self.zoom >= 0.5:
            nairports = self.nairports[2]
        elif self.zoom >= 0.25:
            nairports = self.nairports[1]
        else:
            nairports = self.nairports[0]

        if self.zoom >= 3:
            nwaypoints = self.nwaypoints
        else:
            nwaypoints = self.nnavaids

        # Draw waypoint symbols
        if self.show_wpt:
            self.waypoints.bind()
            gl.glVertexAttrib4Nub(ATTRIB_COLOR, *(lightblue3 + (255, )))
            self.waypoints.draw(n_instances=nwaypoints)

        # Draw airport symbols
        if self.show_apt:
            self.airports.bind()
            gl.glVertexAttrib4Nub(ATTRIB_COLOR, *(lightblue3 + (255, )))
            self.airports.draw(n_instances=nairports)

        if self.do_text:
            self.text_shader.use()
            self.font.use()

            if self.show_apt:
                self.font.set_char_size(self.aptlabels.char_size)
                self.font.set_block_size(self.aptlabels.block_size)
                self.aptlabels.bind()
                gl.glVertexAttrib4Nub(ATTRIB_COLOR, *(lightblue4 + (255, )))
                self.aptlabels.draw(n_instances=nairports)
            if self.show_wpt:
                self.font.set_char_size(self.wptlabels.char_size)
                self.font.set_block_size(self.wptlabels.block_size)
                self.wptlabels.bind()
                gl.glVertexAttrib4Nub(ATTRIB_COLOR, *(lightblue4 + (255, )))
                self.wptlabels.draw(n_instances=nwaypoints)

            if self.show_traf and self.route.vertex_count > 1:
                gl.glVertexAttrib4Nub(ATTRIB_COLOR, *(magenta + (255, )))
                self.font.set_char_size(self.routelbl.char_size)
                self.font.set_block_size(self.routelbl.block_size)
                self.routelbl.draw()

            if self.naircraft > 0 and self.show_traf and self.show_lbl:
                self.font.set_char_size(self.aclabels.char_size)
                self.font.set_block_size(self.aclabels.block_size)
                self.aclabels.draw(n_instances=self.naircraft)

        # SSD
        if self.ssd_all or len(self.ssd_ownship) > 0:
            self.ssd_shader.use()
            gl.glUniform3f(self.ssd_shader.loc_vlimits, 4e4, 25e4, 500.0)
            gl.glUniform1i(self.ssd_shader.loc_nac, self.naircraft)
            if self.ssd_all:
                self.ssd.draw(first_vertex=0,
                              vertex_count=self.naircraft,
                              n_instances=self.naircraft)
            else:
                self.ssd.draw(first_vertex=self.ssd_ownship[-1],
                              vertex_count=1,
                              n_instances=self.naircraft)

        # Unbind everything
        RenderObject.unbind_all()
        gl.glUseProgram(0)
Ejemplo n.º 34
0
    def paintGL(self):
        """Paint the scene."""
        # pass if the framebuffer isn't complete yet or if not initialized
        if not (gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER) == gl.GL_FRAMEBUFFER_COMPLETE and self.initialized and self.isVisible()):
            return

        # Set the viewport and clear the framebuffer
        gl.glViewport(*self.viewport)
        gl.glClear(gl.GL_COLOR_BUFFER_BIT)

        # Send the (possibly) updated global uniforms to the buffer
        self.globaldata.set_vertex_scale_type(VERTEX_IS_LATLON)

        # --- DRAW THE MAP AND COASTLINES ---------------------------------------------
        # Map and coastlines: don't wrap around in the shader
        self.globaldata.enable_wrap(False)

        if self.show_map:
            # Select the texture shader
            self.texture_shader.use()

            # Draw map texture
            gl.glActiveTexture(gl.GL_TEXTURE0 + 0)
            gl.glBindTexture(gl.GL_TEXTURE_2D, self.map_texture)
            self.map.draw()

        # Select the non-textured shader
        self.color_shader.use()

        # Draw coastlines
        if self.show_coast:
            if self.wrapdir == 0:
                # Normal case, no wrap around
                self.coastlines.draw(first_vertex=0, vertex_count=self.vcount_coast)
            else:
                self.coastlines.bind()
                wrapindex = np.uint32(self.coastindices[int(self.wraplon) + 180])
                if self.wrapdir == 1:
                    gl.glVertexAttrib1f(ATTRIB_LON, 360.0)
                    self.coastlines.draw(first_vertex=0, vertex_count=wrapindex)
                    gl.glVertexAttrib1f(ATTRIB_LON, 0.0)
                    self.coastlines.draw(first_vertex=wrapindex, vertex_count=self.vcount_coast - wrapindex)
                else:
                    gl.glVertexAttrib1f(ATTRIB_LON, -360.0)
                    self.coastlines.draw(first_vertex=wrapindex, vertex_count=self.vcount_coast - wrapindex)
                    gl.glVertexAttrib1f(ATTRIB_LON, 0.0)
                    self.coastlines.draw(first_vertex=0, vertex_count=wrapindex)

        # --- DRAW PREVIEW SHAPE (WHEN AVAILABLE) -----------------------------
        self.polyprev.draw()

        # --- DRAW CUSTOM SHAPES (WHEN AVAILABLE) -----------------------------
        self.allpolys.draw()

        # --- DRAW THE SELECTED AIRCRAFT ROUTE (WHEN AVAILABLE) ---------------
        if self.show_traf:
            self.route.draw()
            self.cpalines.draw()

        # --- DRAW AIRPORT DETAILS (RUNWAYS, TAXIWAYS, PAVEMENTS) -------------
        self.runways.draw()
        self.thresholds.draw()
        if self.zoom >= 1.0:
            for idx in self.apt_inrange:
                self.taxiways.draw(first_vertex=idx[0], vertex_count=idx[1])
                self.pavement.draw(first_vertex=idx[2], vertex_count=idx[3])

        # --- DRAW THE INSTANCED AIRCRAFT SHAPES ------------------------------
        # update wrap longitude and direction for the instanced objects
        self.globaldata.enable_wrap(True)

        # PZ circles only when they are bigger than the A/C symbols
        if self.naircraft > 0 and self.show_traf and self.show_pz and self.zoom >= 0.15:
            self.globaldata.set_vertex_scale_type(VERTEX_IS_METERS)
            self.protectedzone.draw(n_instances=self.naircraft)

        self.globaldata.set_vertex_scale_type(VERTEX_IS_SCREEN)

        # Draw traffic symbols
        if self.naircraft > 0 and self.show_traf:
            self.ac_symbol.draw(n_instances=self.naircraft)

        if self.zoom >= 0.5:
            nairports = self.nairports[2]
        elif self.zoom  >= 0.25:
            nairports = self.nairports[1]
        else:
            nairports = self.nairports[0]

        if self.zoom >= 3:
            nwaypoints = self.nwaypoints
        else:
            nwaypoints = self.nnavaids

        # Draw waypoint symbols
        if self.show_wpt:
            self.waypoints.bind()
            gl.glVertexAttrib4Nub(ATTRIB_COLOR, *(lightblue3 + (255,)))
            self.waypoints.draw(n_instances=nwaypoints)

        # Draw airport symbols
        if self.show_apt:
            self.airports.bind()
            gl.glVertexAttrib4Nub(ATTRIB_COLOR, *(lightblue3 + (255,)))
            self.airports.draw(n_instances=nairports)

        if self.do_text:
            self.text_shader.use()
            self.font.use()

            if self.show_apt:
                self.font.set_char_size(self.aptlabels.char_size)
                self.font.set_block_size(self.aptlabels.block_size)
                self.aptlabels.bind()
                gl.glVertexAttrib4Nub(ATTRIB_COLOR, *(lightblue4 + (255,)))
                self.aptlabels.draw(n_instances=nairports)
            if self.show_wpt:
                self.font.set_char_size(self.wptlabels.char_size)
                self.font.set_block_size(self.wptlabels.block_size)
                self.wptlabels.bind()
                gl.glVertexAttrib4Nub(ATTRIB_COLOR, *(lightblue4 + (255,)))
                self.wptlabels.draw(n_instances=nwaypoints)

            if self.show_traf and self.route.vertex_count > 1:
                gl.glVertexAttrib4Nub(ATTRIB_COLOR, *(magenta + (255,)))
                self.font.set_char_size(self.routelbl.char_size)
                self.font.set_block_size(self.routelbl.block_size)
                self.routelbl.draw()

            if self.naircraft > 0 and self.show_traf and self.show_lbl:
                self.font.set_char_size(self.aclabels.char_size)
                self.font.set_block_size(self.aclabels.block_size)
                self.aclabels.draw(n_instances=self.naircraft)

        # SSD
        if self.ssd_all or len(self.ssd_ownship) > 0:
            self.ssd_shader.use()
            gl.glUniform3f(self.ssd_shader.loc_vlimits, 1e4, 4e4, 200.0)
            if self.ssd_all:
                self.ssd.draw(first_vertex=0, vertex_count=self.naircraft, n_instances=self.naircraft)
            else:
                self.ssd.draw(first_vertex=self.ssd_ownship[-1], vertex_count=1, n_instances=self.naircraft)

        # Unbind everything
        RenderObject.unbind_all()
        gl.glUseProgram(0)
Ejemplo n.º 35
0
    def paintGL(self):
        """Paint the scene."""
        # pass if the framebuffer isn't complete yet or if not initialized
        if not (gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER) == gl.GL_FRAMEBUFFER_COMPLETE and self.initialized and self.isVisible()):
            return

        # Set the viewport and clear the framebuffer
        gl.glViewport(*self.viewport)
        gl.glClear(gl.GL_COLOR_BUFFER_BIT)

        # Select the non-textured shader
        self.color_shader.use()

        self.globaldata.set_vertex_modifiers(VERTEX_IS_GLXY, False)
        self.arcs.draw()

        self.globaldata.set_vertex_modifiers(VERTEX_IS_METERS, False)
        self.protectedzone.draw(n_instances=self.n_aircraft)
        self.globaldata.set_vertex_modifiers(VERTEX_IS_SCREEN, True)
        self.ac_symbol.draw(n_instances=self.n_aircraft)

        self.globaldata.set_vertex_modifiers(VERTEX_IS_SCREEN, False)
        self.waypoints.bind()
        gl.glVertexAttrib4Nub(ATTRIB_COLOR, *(lightblue2 + (255,)))
        self.waypoints.draw()
        self.airports.bind()
        gl.glVertexAttrib4Nub(ATTRIB_COLOR, *(lightblue2 + (255,)))
        self.airports.draw()

        self.text_shader.use()
        self.font.use()
        self.font.set_char_size(self.wptlabels.char_size)
        self.font.set_block_size(self.wptlabels.block_size)
        self.wptlabels.bind()
        gl.glVertexAttrib4Nub(ATTRIB_COLOR, *(lightblue3 + (255,)))
        self.wptlabels.draw(n_instances=self.waypoints.n_instances)

        self.font.set_char_size(self.aptlabels.char_size)
        self.font.set_block_size(self.aptlabels.block_size)
        self.aptlabels.bind()
        gl.glVertexAttrib4Nub(ATTRIB_COLOR, *(lightblue3 + (255,)))
        self.aptlabels.draw(n_instances=self.airports.n_instances)

        self.font.set_char_size(self.aclabels.char_size)
        self.font.set_block_size(self.aclabels.block_size)
        self.aclabels.draw(n_instances=self.n_aircraft)

        self.color_shader.use()
        self.globaldata.set_vertex_modifiers(VERTEX_IS_GLXY, False)
        self.ownship.draw()
        self.mask.draw()
        self.edge.draw()

        self.globaldata.set_vertex_modifiers(VERTEX_IS_GLXY, True)
        self.ticks.draw()

        # Select the text shader
        self.text_shader.use()
        self.font.use()
        self.font.set_block_size((0, 0))
        self.ticklbls.draw()

        self.globaldata.set_vertex_modifiers(VERTEX_IS_GLXY, False)
        self.spdlabel_text.draw()
        self.spdlabel_val.draw()

        # Unbind everything
        RenderObject.unbind_all()
        gl.glUseProgram(0)
Ejemplo n.º 36
0
    def __init__(self, width=512, height=512, gpu_id=0, render_marker=False, robot=''):
        self.render_marker = render_marker
        self.VAOs = []
        self.VBOs = []
        self.materials = []
        self.textures = []
        self.is_textured = []
        self.is_materialed = []
        self.objects = []
        self.texUnitUniform = None
        self.width = width
        self.height = height
        self.vertices = []
        self.faces = []
        self.poses_trans = []
        self.poses_rot = []
        self.instances = []
        self.extents = []
        self.robot = robot
        if len(self.robot) > 3:
            self._offset_map = self.load_offset()
        else:
            self._offset_map = None

        self.r = CppYCBRenderer.CppYCBRenderer(width, height, get_available_devices()[gpu_id])
        self.r.init()
        self.glstring = GL.glGetString(GL.GL_VERSION)
        from OpenGL.GL import shaders
        
        self.shaders = shaders
        self.colors = [[0.9, 0, 0], [0.6, 0, 0], [0.3, 0, 0], [0.3, 0, 0], [0.3, 0, 0], [0.3, 0, 0], [0.3, 0, 0]]
        self.lightcolor = [1, 1, 1]

        cur_dir = os.path.dirname(os.path.abspath(__file__))
        vertexShader = self.shaders.compileShader(
                            open(os.path.join(cur_dir, 'shaders/vert.shader')).readlines(), GL.GL_VERTEX_SHADER)

        fragmentShader = self.shaders.compileShader(
                            open(os.path.join(cur_dir,'shaders/frag.shader')).readlines(), GL.GL_FRAGMENT_SHADER)

        vertexShader_textureMat = self.shaders.compileShader(
                            open(os.path.join(cur_dir,'shaders/vert_blinnphong.shader')).readlines(), GL.GL_VERTEX_SHADER)

        fragmentShader_textureMat = self.shaders.compileShader(
                            open(os.path.join(cur_dir,'shaders/frag_blinnphong.shader')).readlines(), GL.GL_FRAGMENT_SHADER)

        vertexShader_textureless = self.shaders.compileShader(
                            open(os.path.join(cur_dir,'shaders/vert_textureless.shader')).readlines(), GL.GL_VERTEX_SHADER)

        fragmentShader_textureless = self.shaders.compileShader(
                            open(os.path.join(cur_dir,'shaders/frag_textureless.shader')).readlines(), GL.GL_FRAGMENT_SHADER)

        #try with the easiest shader first, and then look at Gl apply material
        vertexShader_material = self.shaders.compileShader(
                            open(os.path.join(cur_dir,'shaders/vert_mat.shader')).readlines(), GL.GL_VERTEX_SHADER)

        fragmentShader_material = self.shaders.compileShader(
                            open(os.path.join(cur_dir,'shaders/frag_mat.shader')).readlines(), GL.GL_FRAGMENT_SHADER)

        vertexShader_simple = self.shaders.compileShader(
                            open(os.path.join(cur_dir,'shaders/vert_simple.shader')).readlines(), GL.GL_VERTEX_SHADER)

        fragmentShader_simple = self.shaders.compileShader(
                            open(os.path.join(cur_dir,'shaders/frag_simple.shader')).readlines(), GL.GL_FRAGMENT_SHADER)

        self.shaderProgram = self.shaders.compileProgram(vertexShader, fragmentShader)
        self.shaderProgram_textureless = self.shaders.compileProgram(vertexShader_textureless, fragmentShader_textureless)
        self.shaderProgram_simple = self.shaders.compileProgram(vertexShader_simple, fragmentShader_simple)
        self.shaderProgram_material = self.shaders.compileProgram(vertexShader_material, fragmentShader_material) 
        self.shaderProgram_textureMat = self.shaders.compileProgram(vertexShader_textureMat, fragmentShader_textureMat)

        self.texUnitUniform_textureMat = GL.glGetUniformLocation(self.shaderProgram_textureMat, 'texUnit')

        self.lightpos = [0, 0, 0]

        self.fbo = GL.glGenFramebuffers(1)
        self.color_tex = GL.glGenTextures(1)
        self.color_tex_2 = GL.glGenTextures(1)
        self.color_tex_3 = GL.glGenTextures(1)
        self.color_tex_4 = GL.glGenTextures(1)
        self.color_tex_5 = GL.glGenTextures(1)

        self.depth_tex = GL.glGenTextures(1)

        GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex)
        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, self.width, self.height, 0,
                        GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, None)

        GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex_2)
        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, self.width, self.height, 0,
                        GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, None)

        GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex_3)
        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, self.width, self.height, 0,
                        GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, None)

        GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex_4)
        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, self.width, self.height, 0,
                        GL.GL_RGBA, GL.GL_FLOAT, None)

        GL.glBindTexture(GL.GL_TEXTURE_2D, self.color_tex_5)
        GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F, self.width, self.height, 0,
                        GL.GL_RGBA, GL.GL_FLOAT, None)

        GL.glBindTexture(GL.GL_TEXTURE_2D, self.depth_tex)

        GL.glTexImage2D.wrappedOperation(
            GL.GL_TEXTURE_2D, 0, GL.GL_DEPTH24_STENCIL8, self.width, self.height, 0,
            GL.GL_DEPTH_STENCIL, GL.GL_UNSIGNED_INT_24_8, None)

        GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.fbo)
        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0, GL.GL_TEXTURE_2D, self.color_tex, 0)
        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT1, GL.GL_TEXTURE_2D, self.color_tex_2, 0)
        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT2, GL.GL_TEXTURE_2D, self.color_tex_3, 0)
        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT3, GL.GL_TEXTURE_2D, self.color_tex_4, 0)
        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT4, GL.GL_TEXTURE_2D, self.color_tex_5, 0)
        GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER, GL.GL_DEPTH_STENCIL_ATTACHMENT, GL.GL_TEXTURE_2D, self.depth_tex, 0)
        GL.glViewport(0, 0, self.width, self.height)
        GL.glDrawBuffers(5, [GL.GL_COLOR_ATTACHMENT0, GL.GL_COLOR_ATTACHMENT1,
                             GL.GL_COLOR_ATTACHMENT2, GL.GL_COLOR_ATTACHMENT3, GL.GL_COLOR_ATTACHMENT4])

        assert GL.glCheckFramebufferStatus(
            GL.GL_FRAMEBUFFER) == GL.GL_FRAMEBUFFER_COMPLETE

        self.fov = 20
        self.camera = [1, 0, 0]
        self.target = [0, 0, 0]
        self.up = [0, 0, 1]
        P = perspective(self.fov, float(self.width) /
                        float(self.height), 0.01, 100)
        V = lookat(
            self.camera,
            self.target, up=self.up)

        self.V = np.ascontiguousarray(V, np.float32)
        self.P = np.ascontiguousarray(P, np.float32)
        self.grid = self.generate_grid()
        #added mouse interaction
        self.is_rotating = False
Ejemplo n.º 37
0
    def paintGL(self):
        """Paint the scene."""
        # clear the color and depth buffer
        gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)

        # initialize FrameBuffer
        fbo = gl.glGenFramebuffers(1)
        gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, fbo)

        depthbuffer = gl.glGenRenderbuffers(1)
        gl.glBindRenderbuffer(gl.GL_RENDERBUFFER, depthbuffer)
        gl.glRenderbufferStorage(gl.GL_RENDERBUFFER, gl.GL_DEPTH_COMPONENT24,
                                 self.width, self.height)
        gl.glFramebufferRenderbuffer(
            gl.GL_FRAMEBUFFER, gl.GL_DEPTH_ATTACHMENT, gl.GL_RENDERBUFFER,
            depthbuffer
        )
        # --- end FB init

        # generate the texture we render to, and set parameters
        renderedTexture = gl.glGenTextures(1)   # create target texture
        # bind to new texture, all future texture functions will modify this
        # particular one
        gl.glBindTexture(gl.GL_TEXTURE_2D, renderedTexture)
        # set how our texture behaves on x,y boundaries
        gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_REPEAT)
        gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_T, gl.GL_REPEAT)
        # set how our texture is filtered
        gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR)
        gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR)

        # occupy width x height texture memory, (None at the end == empty
        # image)
        gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, self.width,
                        self.height, 0, gl.GL_RGBA, gl.GL_UNSIGNED_INT, None)

        # --- end texture init

        # Set "renderedTexture" as our colour attachement #0
        gl.glFramebufferTexture2D(
            gl.GL_FRAMEBUFFER, gl.GL_COLOR_ATTACHMENT0, gl.GL_TEXTURE_2D,
            renderedTexture,
            0 # mipmap level, normally 0
        )

        status = gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER)
        assert status == gl.GL_FRAMEBUFFER_COMPLETE, status

        # bind to fb
        gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, fbo)
        # viewport is shared with the main context
        gl.glViewport(0, 0, self.width, self.height)
        #  Clear the screen
        gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
        # --- at this point everything should be set, draw away

        # THIS IS DRAWING PART
        # bind the VBO
        self.vbo.bind()
        # tell OpenGL that the VBO contains an array of vertices
        # prepare the shader
        gl.glEnableVertexAttribArray(0)
        # these vertices contain 2 single precision coordinates
        gl.glVertexAttribPointer(0, 2, gl.GL_FLOAT, gl.GL_FALSE, 0, None)
        gl.glUseProgram(self.shaders_program)
        # draw "count" points from the VBO
        gl.glDrawArrays(gl.GL_LINE_STRIP, 0, len(self.data))
        # END OF DRAWING PART

        debug_buffer = gl.glReadPixels(0, 0, self.width, self.height, gl.GL_RGB,
                                       gl.GL_UNSIGNED_BYTE)
        image = Image.frombytes(mode="RGB", size=(self.width, self.height),
                                data=debug_buffer)
        image = image.transpose(Image.FLIP_TOP_BOTTOM)
        image.save("/tmp/foo.jpg")

        gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, 0) # unbind FB
        gl.glBindTexture(gl.GL_TEXTURE_2D, renderedTexture) # bind to result ??

        # THIS IS DRAWING PART II
        # vertex arrays must be enabled using glEnableClientState
        gl.glEnable(gl.GL_TEXTURE_2D)  # ???

        texId = gl.glGetUniformLocation(self.my_shaders_program, "renderedTexture")

        gl.glUseProgram(self.my_shaders_program)
        # HOW TO DRAW TEXTURE
        gl.glActiveTexture(gl.GL_TEXTURE0);
        gl.glBindTexture(gl.GL_TEXTURE_2D, renderedTexture) # bind to result ??
        # Set our "renderedTexture" sampler to user Texture Unit 0
        gl.glUniform1i(texId, 0);
        gl.glBegin(gl.GL_QUADS)
        gl.glVertex3f(-1.0,-1.0, 0.0)
        gl.glVertex3f( 1.0,-1.0, 0.0)
        gl.glVertex3f( 1.0, 1.0, 0.0)
        gl.glVertex3f(-1.0, 1.0, 0.0)
        gl.glEnd()
Ejemplo n.º 38
0
    def paintGL(self):
        """Paint the scene."""
        # pass if the framebuffer isn't complete yet or if not initialized
        if not (gl.glCheckFramebufferStatus(
                gl.GL_FRAMEBUFFER) == gl.GL_FRAMEBUFFER_COMPLETE
                and self.initialized and self.isVisible()):
            return

        # Get data for active node
        actdata = bs.net.get_nodedata()

        # Set the viewport and clear the framebuffer
        gl.glViewport(*self.viewport)
        gl.glClear(gl.GL_COLOR_BUFFER_BIT)

        # Send the (possibly) updated global uniforms to the buffer
        self.shaderset.set_vertex_scale_type(VERTEX_IS_LATLON)

        # --- DRAW THE MAP AND COASTLINES ---------------------------------------------
        # Map and coastlines: don't wrap around in the shader
        self.shaderset.enable_wrap(False)

        if actdata.show_map:
            # Select the texture shader
            # self.texture_shader.use()

            # Draw map texture
            # self.map_texture.bind()
            self.map.draw()

        # Select the non-textured shader
        # self.color_shader.use()

        # Draw coastlines
        if actdata.show_coast:
            if self.wrapdir == 0:
                # Normal case, no wrap around
                self.coastlines.draw(first_vertex=0,
                                     vertex_count=self.vcount_coast)
            else:
                self.coastlines.bind()
                wrapindex = np.uint32(self.coastindices[int(self.wraplon) +
                                                        180])
                if self.wrapdir == 1:
                    gl.glVertexAttrib1f(self.coastlines.lon.loc, 360.0)
                    self.coastlines.draw(first_vertex=0,
                                         vertex_count=wrapindex)
                    gl.glVertexAttrib1f(self.coastlines.lon.loc, 0.0)
                    self.coastlines.draw(first_vertex=wrapindex,
                                         vertex_count=self.vcount_coast -
                                         wrapindex)
                else:
                    gl.glVertexAttrib1f(self.coastlines.lon.loc, -360.0)
                    self.coastlines.draw(first_vertex=wrapindex,
                                         vertex_count=self.vcount_coast -
                                         wrapindex)
                    gl.glVertexAttrib1f(self.coastlines.lon.loc, 0.0)
                    self.coastlines.draw(first_vertex=0,
                                         vertex_count=wrapindex)

        # --- DRAW PREVIEW SHAPE (WHEN AVAILABLE) -----------------------------
        self.polyprev.draw()

        # --- DRAW CUSTOM SHAPES (WHEN AVAILABLE) -----------------------------
        if actdata.show_poly > 0:
            self.allpolys.draw()
            if actdata.show_poly > 1:
                self.allpfill.draw()

        # --- DRAW THE SELECTED AIRCRAFT ROUTE (WHEN AVAILABLE) ---------------
        if actdata.show_traf:
            self.route.draw()
            self.cpalines.draw()
            self.traillines.draw()

        # --- DRAW AIRPORT DETAILS (RUNWAYS, TAXIWAYS, PAVEMENTS) -------------
        self.runways.draw()
        self.thresholds.draw()

        if self.zoom >= 1.0:
            for idx in self.apt_inrange:
                self.taxiways.draw(first_vertex=idx[0], vertex_count=idx[1])
                self.pavement.draw(first_vertex=idx[2], vertex_count=idx[3])

        # --- DRAW THE INSTANCED AIRCRAFT SHAPES ------------------------------
        # update wrap longitude and direction for the instanced objects
        self.shaderset.enable_wrap(True)

        # PZ circles only when they are bigger than the A/C symbols
        if self.naircraft > 0 and actdata.show_traf and actdata.show_pz and self.zoom >= 0.15:
            self.shaderset.set_vertex_scale_type(VERTEX_IS_METERS)
            self.protectedzone.draw(n_instances=self.naircraft)

        self.shaderset.set_vertex_scale_type(VERTEX_IS_SCREEN)

        # Draw traffic symbols
        if self.naircraft > 0 and actdata.show_traf:
            if self.routelbl.n_instances:
                self.rwaypoints.draw(n_instances=self.routelbl.n_instances)
            self.ac_symbol.draw(n_instances=self.naircraft)

        if self.zoom >= 0.5 and actdata.show_apt == 1 or actdata.show_apt == 2:
            nairports = self.nairports[2]
        elif self.zoom >= 0.25 and actdata.show_apt == 1 or actdata.show_apt == 3:
            nairports = self.nairports[1]
        else:
            nairports = self.nairports[0]

        if self.zoom >= 3 and actdata.show_wpt == 1 or actdata.show_wpt == 2:
            nwaypoints = self.nwaypoints
        else:
            nwaypoints = self.nnavaids

        # Draw waypoint symbols
        if actdata.show_wpt:
            self.waypoints.draw(n_instances=nwaypoints)
            if self.ncustwpts > 0:
                self.customwp.draw(n_instances=self.ncustwpts)

        # Draw airport symbols
        if actdata.show_apt:
            self.airports.draw(n_instances=nairports)

        # Text rendering
        self.text_shader.use()
        self.font.use()

        if actdata.show_apt:
            self.font.set_char_size(self.aptlabels.char_size)
            self.font.set_block_size(self.aptlabels.block_size)
            self.aptlabels.draw(n_instances=nairports)
        if actdata.show_wpt:
            self.font.set_char_size(self.wptlabels.char_size)
            self.font.set_block_size(self.wptlabels.block_size)
            self.wptlabels.draw(n_instances=nwaypoints)
            if self.ncustwpts > 0:
                self.font.set_char_size(self.customwplbl.char_size)
                self.font.set_block_size(self.customwplbl.block_size)
                self.customwplbl.draw(n_instances=self.ncustwpts)

        if actdata.show_traf and self.route.vertex_count > 1:
            self.font.set_char_size(self.routelbl.char_size)
            self.font.set_block_size(self.routelbl.block_size)
            self.routelbl.draw()

        if self.naircraft > 0 and actdata.show_traf and actdata.show_lbl:
            self.font.set_char_size(self.aclabels.char_size)
            self.font.set_block_size(self.aclabels.block_size)
            self.aclabels.draw(n_instances=self.naircraft)

        # SSD
        if actdata.ssd_all or actdata.ssd_conflicts or len(
                actdata.ssd_ownship) > 0:
            self.ssd_shader.use()
            gl.glUniform3f(self.ssd_shader.Vlimits.loc, self.asas_vmin**2,
                           self.asas_vmax**2, self.asas_vmax)
            gl.glUniform1i(self.ssd_shader.n_ac.loc, self.naircraft)
            self.ssd.draw(vertex_count=self.naircraft,
                          n_instances=self.naircraft)
            gl.glEnableVertexAttribArray(loc)
            gl.glVertexAttribPointer(loc, 4, gl.GL_FLOAT, False, color.strides[0], ctypes.c_void_p(0))

        position_buffer_small = VertexBufferObject()
        with position_buffer_small:
            gl.glBufferData(gl.GL_ARRAY_BUFFER, position_small.nbytes, position_small, gl.GL_STATIC_DRAW)
            loc = gl.glGetAttribLocation(gl_program, 'position')
            gl.glEnableVertexAttribArray(loc)
            gl.glVertexAttribPointer(loc, 2, gl.GL_FLOAT, False, position_small.strides[0], ctypes.c_void_p(0))

        gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, indices_buffer_small.handle)

    gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, 0)

    framebuffer = Framebuffer()
    assert gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER) == gl.GL_FRAMEBUFFER_COMPLETE

    color_tex = gl.glGenTextures(1)
    # gl.glActiveTexture(gl.GL_TEXTURE1)
    gl.glBindTexture(gl.GL_TEXTURE_2D, color_tex)
    gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, width_2, height_2, 0, gl.GL_RGBA,
                    gl.GL_UNSIGNED_BYTE, None)

    depth_tex = gl.glGenTextures(1)
    # gl.glActiveTexture(gl.GL_TEXTURE2)
    gl.glBindTexture(gl.GL_TEXTURE_2D, depth_tex)
    gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_DEPTH_COMPONENT, width_2, height_2, 0, gl.GL_DEPTH_COMPONENT,
                    gl.GL_FLOAT, None)
    # gl.glActiveTexture(gl.GL_TEXTURE0)

    gl.glBindTexture(gl.GL_TEXTURE_2D, 0)
Ejemplo n.º 40
0
 def init_gl(self):
     # Set up framebuffer and render textures
     self.fb = GL.glGenFramebuffers(1)
     GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.fb)
     self.depth_buffer = GL.glGenRenderbuffers(1)
     GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, self.depth_buffer)
     if self.multisample > 0:
         GL.glRenderbufferStorageMultisample(GL.GL_RENDERBUFFER,
                                             self.multisample,
                                             GL.GL_DEPTH24_STENCIL8,
                                             self.width, self.height)
     else:
         GL.glRenderbufferStorage(GL.GL_RENDERBUFFER,
                                  GL.GL_DEPTH24_STENCIL8, self.width,
                                  self.height)
     GL.glFramebufferRenderbuffer(GL.GL_FRAMEBUFFER,
                                  GL.GL_DEPTH_STENCIL_ATTACHMENT,
                                  GL.GL_RENDERBUFFER, self.depth_buffer)
     self.texture_id = int(GL.glGenTextures(1))
     if self.multisample > 0:
         GL.glBindTexture(GL.GL_TEXTURE_2D_MULTISAMPLE, self.texture_id)
         GL.glTexImage2DMultisample(GL.GL_TEXTURE_2D_MULTISAMPLE,
                                    self.multisample, GL.GL_RGBA8,
                                    self.width, self.height, True)
         GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER,
                                   GL.GL_COLOR_ATTACHMENT0,
                                   GL.GL_TEXTURE_2D_MULTISAMPLE,
                                   self.texture_id, 0)
     else:
         GL.glBindTexture(GL.GL_TEXTURE_2D, self.texture_id)
         GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA8, self.width,
                         self.height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE,
                         None)
         GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER,
                            GL.GL_LINEAR)
         GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER,
                            GL.GL_LINEAR)
         GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S,
                            GL.GL_CLAMP_TO_EDGE)
         GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T,
                            GL.GL_CLAMP_TO_EDGE)
         GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAX_LEVEL, 0)
         GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER,
                                   GL.GL_COLOR_ATTACHMENT0,
                                   GL.GL_TEXTURE_2D, self.texture_id, 0)
     status = GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER)
     if status != GL.GL_FRAMEBUFFER_COMPLETE:
         GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
         raise Exception("Incomplete framebuffer")
     # Resolver framebuffer in case of multisample antialiasing
     if self.multisample > 0:
         self.resolve_fb = GL.glGenFramebuffers(1)
         GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.resolve_fb)
         self.resolve_texture_id = int(GL.glGenTextures(1))
         GL.glBindTexture(GL.GL_TEXTURE_2D, self.resolve_texture_id)
         GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER,
                            GL.GL_LINEAR)
         GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER,
                            GL.GL_LINEAR)
         GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S,
                            GL.GL_CLAMP_TO_EDGE)
         GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T,
                            GL.GL_CLAMP_TO_EDGE)
         GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAX_LEVEL, 0)
         GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA8, self.width,
                         self.height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE,
                         None)
         GL.glFramebufferTexture2D(GL.GL_FRAMEBUFFER,
                                   GL.GL_COLOR_ATTACHMENT0,
                                   GL.GL_TEXTURE_2D,
                                   self.resolve_texture_id, 0)
         status = GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER)
         if status != GL.GL_FRAMEBUFFER_COMPLETE:
             GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
             raise Exception("Incomplete framebuffer")
     GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
     # OpenVR texture data
     self.texture = openvr.Texture_t()
     if self.multisample > 0:
         self.texture.handle = self.resolve_texture_id
     else:
         self.texture.handle = self.texture_id
     self.texture.eType = openvr.TextureType_OpenGL
     self.texture.eColorSpace = openvr.ColorSpace_Gamma
## Poor filtering. Needed !
#gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST)
#gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_NEAREST)

### Set "renderedTexture" as our colour attachement #0
gl.glFramebufferTexture2D(gl.GL_FRAMEBUFFER, gl.GL_COLOR_ATTACHMENT0, gl.GL_TEXTURE_2D,renderedTexture, 0);

## Set the list of draw buffers.
## GLenum DrawBuffers[1] = {gl.GL_COLOR_ATTACHMENT0};
DrawBuffers_type = gl.GLenum * 1 
DrawBuffers = DrawBuffers_type(gl.GL_COLOR_ATTACHMENT0)
gl.glDrawBuffers(1, DrawBuffers); # "1" is the size of DrawBuffers


# Always check that our framebuffer is ok
if gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER) != gl.GL_FRAMEBUFFER_COMPLETE:
    raise Exception("framebuffer failed check")


# Render to our framebuffer
gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, framebuffer);
gl.glViewport(0,0,w,h); # Render on the whole framebuffer, complete from the lower left corner to the upper right

#-------------------------------------------------------------------------------
# rendering test code
import time
from neurodot_present.common import Quad
q = Quad((0.5,0.5),(0.5,0.75),(0.75,0.5),(0.75,0.75))

#prepare rendering model
gl.glClear(gl.GL_COLOR_BUFFER_BIT)