Skip to content
preview.py 3.03 KiB
Newer Older
Dalai Felinto's avatar
Dalai Felinto committed
"""
Viewport Preview Drawing
************************

Routines to draw in the viewport the result
that is projected in the HMD
"""

from .opengl_helper import (
        draw_rectangle,
        view_reset,
        view_setup,
        )

from bgl import *

TODO = True

Dalai Felinto's avatar
Dalai Felinto committed
class Preview:
    __slots__ = {
            "_texture",
            "_width",
            "_height",
            }

Dalai Felinto's avatar
Dalai Felinto committed
    def init(self, texture, width, height):
Dalai Felinto's avatar
Dalai Felinto committed
        """
        Initialize preview window

Dalai Felinto's avatar
Dalai Felinto committed
        :param texture: 2D Texture binding ID (bind to the Framebuffer Object)
        :type texture: bgl.GLint
Dalai Felinto's avatar
Dalai Felinto committed
        :param width: Horizontal dimension of preview window
        :type width: int
        :param height: Vertical dimension of preview window
        :type height: int
        """
        self._texture = texture
Dalai Felinto's avatar
Dalai Felinto committed
        self.update(texture, width, height)
Dalai Felinto's avatar
Dalai Felinto committed

    def quit(self):
        """
        Destroy preview window
        """
Dalai Felinto's avatar
Dalai Felinto committed

Dalai Felinto's avatar
Dalai Felinto committed
    def update(self, texture, width, height):
Dalai Felinto's avatar
Dalai Felinto committed
        """
        Resize preview window

Dalai Felinto's avatar
Dalai Felinto committed
        :param texture: 2D Texture binding ID (bind to the Framebuffer Object)
        :type texture: bgl.GLint
Dalai Felinto's avatar
Dalai Felinto committed
        :param width: Horizontal dimension of preview window
        :type width: int
        :param height: Vertical dimension of preview window
        :type height: int
        """
Dalai Felinto's avatar
Dalai Felinto committed
        self._texture = texture
Dalai Felinto's avatar
Dalai Felinto committed
        self._width = width
        self._height = height

    def _getScissor(self, viewport, offset_x, offset_y, width, height):
        """
        Fit scissor inside viewport
        """
        scissor = [0,0,0,0]

        scissor[0] = max(offset_x, viewport[0])
        scissor[1] = max(offset_y, viewport[1])
        scissor[2] = min(width, viewport[2] - (scissor[0] - viewport[0]))
        scissor[3] = min(height, viewport[3] - (scissor[1] - viewport[1]))

        return scissor

Dalai Felinto's avatar
Dalai Felinto committed
    def loop(self):
        """
        Draw in the preview window
        """
        texture = self._texture
        width = self._width
        height = self._height

        offset_x, offset_y = 100, 100 # this is window offset, not viewport offset
Dalai Felinto's avatar
Dalai Felinto committed

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

        viewport = Buffer(GL_INT, 4)
        glGetIntegerv(GL_VIEWPORT, viewport)

        glViewport(
                max(offset_x, viewport[0]),
                max(offset_x, viewport[1]),
                width,
                height,
                )

        scissor = self._getScissor(viewport, offset_x, offset_y, width, height)
        glScissor(scissor[0], scissor[1], scissor[2], scissor[3])
Dalai Felinto's avatar
Dalai Felinto committed

        glEnable(GL_DEPTH_TEST)
        glDepthFunc(GL_LESS)

        view_setup()

        glEnable(GL_TEXTURE_2D)
        glActiveTexture(GL_TEXTURE0)
        glBindTexture(GL_TEXTURE_2D, texture)

        draw_rectangle()

        glBindTexture(GL_TEXTURE_2D, act_tex[0])

        glDisable(GL_TEXTURE_2D)
        glDisable(GL_DEPTH_TEST)

        view_reset(viewport)

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