Skip to content
__init__.py 4.21 KiB
Newer Older
Dalai Felinto's avatar
Dalai Felinto committed

TODO = True

from mathutils import (
        Matrix,
        Vector,
        )

Dalai Felinto's avatar
Dalai Felinto committed

# ############################################################
# Data structs
# ############################################################

def HMD(display_backend):
    """
    return the head mounted display device class
    (defined in another file)

    :param display_backend: asdasd
    :type display_backend: str
    """
    from .oculus import Oculus
    from .debug import Debug

    displays = {
            'OCULUS':Oculus,
            'DEBUG':Debug,
            }

    if display_backend not in displays:
        assert False, "Display Backend \"{0}\" not implemented".format(display_backend)

    return displays[display_backend]()


# ############################################################
# Data structs
# ############################################################

Dalai Felinto's avatar
Dalai Felinto committed
class HMD_Data:
    status = None
    projection_matrix = Matrix.Identity(4)
    modelview_matrix = Matrix.Identity(4)
Dalai Felinto's avatar
Dalai Felinto committed
    interpupillary_distance = Vector((0.0, 0.0))
    width = 0
    height = 0
    framebuffer_object = 0
    color_object = 0
# ############################################################
# Base class inherited by HMD devices
# ############################################################

class HMD_Base:
Dalai Felinto's avatar
Dalai Felinto committed
    __slots__ = {
        "_color_object",
        "_current_eye",
        "_framebuffer_object",
        "_height",
        "_interpupillary_distance",
        "_modelview_matrix",
        "_name",
        "_offscreen_object",
        "_projection_matrix",
        "_width",
    def __init__(self, name):
        self._name = name
        self._current_eye = 0
Dalai Felinto's avatar
Dalai Felinto committed
        self._width = 0
        self._height = 0
        self._projection_matrix = [Matrix.Identity(4), Matrix.Identity(4)]
        self._modelview_matrix = [Matrix.Identity(4), Matrix.Identity(4)]
        self._interpupillary_distance = Vector((0.0, 0.0))
        self._framebuffer_object = [0, 0]
        self._color_object = [0, 0]
        self._offscreen_object = [None, None]
    def width(self):
        return self._width
Dalai Felinto's avatar
Dalai Felinto committed

    @property
    def height(self):
        return self._height
Dalai Felinto's avatar
Dalai Felinto committed

    @property
    def offscreen_object(self):
        return self._offscreen_object[self._current_eye]
Dalai Felinto's avatar
Dalai Felinto committed

    @property
    def framebuffer_object(self):
        return self._framebuffer_object[self._current_eye]
Dalai Felinto's avatar
Dalai Felinto committed

    @property
    def color_object(self):
        return self._color_object[self._current_eye]
Dalai Felinto's avatar
Dalai Felinto committed

    @property
    def projection_matrix(self):
        return self._projection_matrix[self._current_eye]
Dalai Felinto's avatar
Dalai Felinto committed

    @property
    def modelview_matrix(self):
        return self._modelview_matrix[self._current_eye]

    def setEye(self, eye):
        self._current_eye = int(bool(eye))
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
        """
        assert False, "isConnected() not implemented for the \"{0}\" device".format(self._name)
Dalai Felinto's avatar
Dalai Felinto committed

    def init(self):
        """
        Initialize device

        :return: return True if the device was properly initialized
        :rtype: bool
        """
            for i in range(2):
                self._offscreen_object[i] = gpu.offscreen_object_create(self._width, self._height)
                self._framebuffer_object[i] = self._offscreen_object[i].framebuffer_object
                self._color_object[i] = self._offscreen_object[i].color_object

        except Exception as E:
            print(E)
            return False

        else:
            return True
Dalai Felinto's avatar
Dalai Felinto committed

    def loop(self, context):
Dalai Felinto's avatar
Dalai Felinto committed
        """
        Get fresh tracking data
        """
        self.updateMatrices(context)
Dalai Felinto's avatar
Dalai Felinto committed

    def frameReady(self):
        """
        The frame is ready to be sent to the device
Dalai Felinto's avatar
Dalai Felinto committed
        """
        assert False, "frameReady() not implemented for the \"{0}\" device".format(self._name)
Dalai Felinto's avatar
Dalai Felinto committed

    def quit(self):
        """
        Garbage collection
        """
            for i in range(2):
                gpu.offscreen_object_free(self._offscreen_object[i])

        except Exception as E:
            print(E)
Dalai Felinto's avatar
Dalai Felinto committed

    def updateMatrices(self, context):
        """
        Update OpenGL drawing matrices
        """
        TODO