Skip to content
debug.py 8.05 KiB
Newer Older
Dalai Felinto's avatar
Dalai Felinto committed
"""
Debug
=====

Debug device for testing
"""

from . import HMD_Base, HMD_Data
Dalai Felinto's avatar
Dalai Felinto committed

Dalai Felinto's avatar
Dalai Felinto committed
VERBOSE = False

def print_debug(*args):
    if VERBOSE:
        print("Debug: {0}".format(*args))


class Debug(HMD_Base):
Dalai Felinto's avatar
Dalai Felinto committed
    def __init__(self):
        super(Debug, self).__init__('Debug')
Dalai Felinto's avatar
Dalai Felinto committed

    @property
    def texture(self):
        return self._fbo._gl_data.color_tex

Dalai Felinto's avatar
Dalai Felinto committed
    def isConnected(self):
        """
        Check if device is connected

        :return: return True if the device is connected
        :rtype: bool
        """
Dalai Felinto's avatar
Dalai Felinto committed
        print_debug('isConnected()')
Dalai Felinto's avatar
Dalai Felinto committed
        return True

    def init(self):
        """
        Initialize device

        :return: return True if the device was properly initialized
        :rtype: bool
        """
Dalai Felinto's avatar
Dalai Felinto committed
        print_debug('init()')

Dalai Felinto's avatar
Dalai Felinto committed
        self._width = 1024
Dalai Felinto's avatar
Dalai Felinto committed
        self._height = 512

Dalai Felinto's avatar
Dalai Felinto committed
        self._fbo = FBO(self._width, self._height)


Dalai Felinto's avatar
Dalai Felinto committed
        return True

    def loop(self):
        """
        Get fresh tracking data
        """
Dalai Felinto's avatar
Dalai Felinto committed
        print_debug('loop()')
Dalai Felinto's avatar
Dalai Felinto committed

    def frameReady(self):
        """
        The frame is ready to be send to the device
        """
        self._fbo.run()
Dalai Felinto's avatar
Dalai Felinto committed
        print_debug('frameReady()')
Dalai Felinto's avatar
Dalai Felinto committed

    def quit(self):
        """
        Garbage collection
        """
        self._fbo.delete()
Dalai Felinto's avatar
Dalai Felinto committed
        print_debug('quit()')
Dalai Felinto's avatar
Dalai Felinto committed

from bgl import *


global _time
_time = 0

# ##################
# Data struct
# ##################

class GLdata:
    def __init__(self):
        self.color_tex = -1
        self.fb = -1
        self.rb = -1
Dalai Felinto's avatar
Dalai Felinto committed
        self.width = 0
        self.height = 0


# ##################
# OpenGL generic routines
# ##################

def view_setup():
    glMatrixMode(GL_PROJECTION)
    glPushMatrix()
    glLoadIdentity()

    glMatrixMode(GL_TEXTURE)
    glPushMatrix()
    glLoadIdentity()

    glMatrixMode(GL_MODELVIEW)
    glPushMatrix()
    glLoadIdentity()

    glOrtho(-1, 1, -1, 1, -20, 20)
    gluLookAt(0.0, 0.0, 1.0, 0.0,0.0,0.0, 0.0,1.0,0.0)


    # Get texture info
    glMatrixMode(GL_PROJECTION)
    glPopMatrix()

    glMatrixMode(GL_TEXTURE)
    glPopMatrix()

    glMatrixMode(GL_MODELVIEW)
    glPopMatrix()


# ##################
# FBO related routines
# ##################

class FBO:
    __slots__ = {
            "_gl_data",
            }

Dalai Felinto's avatar
Dalai Felinto committed
    def __init__(self, width, height):

        # initialize opengl data
        self._gl_data = GLdata()

        # initialize fbo
Dalai Felinto's avatar
Dalai Felinto committed
        self.setup(width, height)
Dalai Felinto's avatar
Dalai Felinto committed
    def setup(self, width, height):
        gl_data = self._gl_data
Dalai Felinto's avatar
Dalai Felinto committed
        gl_data.width = width
        gl_data.height = height

        id_buf = Buffer(GL_INT, 1)

        act_fbo = Buffer(GL_INT, 1)
        glGetIntegerv(GL_FRAMEBUFFER, act_fbo)

        act_tex = Buffer(GL_INT, 1)
        glGetIntegerv(GL_ACTIVE_TEXTURE, act_tex)

Dalai Felinto's avatar
Dalai Felinto committed
        #RGBA8 2D texture, 24 bit depth texture, width x height
        glGenTextures(1, id_buf)
        gl_data.color_tex = id_buf.to_list()[0]

        glBindTexture(GL_TEXTURE_2D, gl_data.color_tex)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)

        # NULL means reserve texture memory, but texels are undefined
Dalai Felinto's avatar
Dalai Felinto committed
        null_buffer = Buffer(GL_BYTE, [(gl_data.width + 1) * (gl_data.height + 1) * 4])
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, gl_data.width, gl_data.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, null_buffer)

        glBindTexture(GL_TEXTURE_2D, act_tex[0])

        glGenFramebuffers(1, id_buf)
        gl_data.fb = id_buf.to_list()[0]
        glBindFramebuffer(GL_FRAMEBUFFER, gl_data.fb)

        # Attach 2D texture to this FBO
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl_data.color_tex, 0)

        glGenRenderbuffers(1, id_buf)
        gl_data.depth_rb = id_buf.to_list()[0]
        glBindRenderbuffer(GL_RENDERBUFFER, gl_data.depth_rb)
Dalai Felinto's avatar
Dalai Felinto committed
        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, gl_data.width, gl_data.height)

        # Attach depth buffer to FBO
        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, gl_data.depth_rb)

        # Does the GPU support current FBO configuration?
        status = glCheckFramebufferStatus(GL_FRAMEBUFFER)

        glBindFramebuffer(GL_FRAMEBUFFER, act_fbo[0])

        if status == GL_FRAMEBUFFER_COMPLETE:
            print("FBO: good: {0} : {1} : {2}".format(gl_data.color_tex, gl_data.depth_rb, gl_data.fb))
        else:
            print("FBO: error", status)


    def run(self):
        """
        draw in the FBO
        """
        gl_data = self._gl_data

        act_fbo = Buffer(GL_INT, 1)
        glGetIntegerv(GL_FRAMEBUFFER, act_fbo)

        # setup
        viewport = Buffer(GL_INT, 4)
        glGetIntegerv(GL_VIEWPORT, viewport)
Dalai Felinto's avatar
Dalai Felinto committed
        glViewport(0, 0, gl_data.width, gl_data.height)

        glBindFramebuffer(GL_FRAMEBUFFER, gl_data.fb)
        glActiveTexture(GL_TEXTURE0)

        glClearColor(1.0, 1.0, 1.0, 1.0)
        glClearDepth(1.0)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

        act_tex = Buffer(GL_INT, 1)
        glGetIntegerv(GL_ACTIVE_TEXTURE, act_tex)

        glDisable(GL_DEPTH_TEST)
        glDepthFunc(GL_LESS)

        # actual drawing
        view_setup()

        glEnable(GL_TEXTURE_2D)
        glActiveTexture(GL_TEXTURE0)
        glBindTexture(GL_TEXTURE_2D, gl_data.color_tex)

        # actual drawing
        self._draw_a_quad()

        glBindTexture(GL_TEXTURE_2D, act_tex[0])

        glDisable(GL_TEXTURE_2D)
        glDisable(GL_DEPTH_TEST)

        view_reset()
        glViewport(viewport[0], viewport[1], viewport[2], viewport[3])

        # unbinding
        glBindFramebuffer(GL_FRAMEBUFFER, act_fbo[0])

        glViewport(viewport[0], viewport[1], viewport[2], viewport[3])

    def _draw_a_quad(self):
        """
        draw an animated quad on the screen
        """
        import time
        import math

        global _time

        speed = 0.01

        one = 1.0
        zer = 0.0

        _time, _int = math.modf(_time + speed)
        factor = _time * 2.0

        if factor > 1.0:
            factor = 2.0 - factor;

        one = one - factor;
        zer = factor - zer;

        glClearColor(1.0, 1.0, 1.0, 1.0)
        glClearDepth(1.0)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

        glMatrixMode(GL_PROJECTION)
        glPushMatrix()
        glLoadIdentity()
        glOrtho(-1.0, 1.0, -1.0, 1.0, 1.0, 20.0)

        glMatrixMode(GL_MODELVIEW)
        glPushMatrix()
        glLoadIdentity()
        gluLookAt(0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)

        current_color = Buffer(GL_FLOAT, 4)
        glGetFloatv(GL_CURRENT_COLOR, current_color);

        glEnable(GL_COLOR_MATERIAL)

        glBegin(GL_QUADS)
        glColor3f(one, zer, zer)
        glVertex3f(-0.75, -0.75, 0.0)
        glColor3f(zer, one, zer)
        glVertex3f( 0.75, -0.75, 0.0)
        glColor3f(zer, zer, one)
        glVertex3f( 0.75,  0.75, 0.0)
        glColor3f(one, one, zer)
        glVertex3f(-0.75,  0.75, 0.0)
        glEnd()

        glColor4fv(current_color)
        glDisable(GL_COLOR_MATERIAL)

        glMatrixMode(GL_PROJECTION)
        glPopMatrix()

        glMatrixMode(GL_MODELVIEW)
        glPopMatrix()

    def _debug_quad(self):
        viewport = Buffer(GL_INT, 4)
        glGetIntegerv(GL_VIEWPORT, viewport)
        glViewport(300, 200, 256, 256)
        glScissor(300, 200, 256, 256)

        # actual drawing
        self._draw_a_quad()

        glViewport(viewport[0], viewport[1], viewport[2], viewport[3])
        glScissor(viewport[0], viewport[1], viewport[2], viewport[3])

    def delete(self):
        """
        cleanup FBO data
        """
        gl_data = self._gl_data
        id_buf = Buffer(GL_INT, 1)

        id_buf.to_list()[0] = gl_data.color_tex
        glDeleteTextures(1, id_buf)

        id_buf.to_list()[0] = gl_data.depth_rb
        glDeleteRenderbuffers(1, id_buf)

        id_buf.to_list()[0] = gl_data.fb
        glDeleteFramebuffers(1, id_buf)

    def __del__(self):
        self.delete()