Skip to content
Snippets Groups Projects
draw.py 6.39 KiB
Newer Older
  • Learn to ignore specific revisions
  • #====================== BEGIN GPL LICENSE BLOCK ======================
    #
    #  This program is free software; you can redistribute it and/or
    #  modify it under the terms of the GNU General Public License
    #  as published by the Free Software Foundation; either version 2
    #  of the License, or (at your option) any later version.
    #
    #  This program is distributed in the hope that it will be useful,
    #  but WITHOUT ANY WARRANTY; without even the implied warranty of
    #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #  GNU General Public License for more details.
    #
    #  You should have received a copy of the GNU General Public License
    #  along with this program; if not, write to the Free Software Foundation,
    #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    #
    #======================= END GPL LICENSE BLOCK ========================
    
    import bpy
    import blf
    
    from . import utils
    from mathutils import Vector, Matrix
    
    callbacks = {}
    
    def callbacks_clear():
        for region, handle_pixel, handle_view in callbacks.values():
            region.callback_remove(handle_pixel)
            region.callback_remove(handle_view)
        callbacks.clear()
    
    
    def draw_callback_px(self, context):
        from bgl import glColor3f
        font_id = 0 # XXX, need to find out how best to get this.
        blf.size(font_id, 12, 72)
    
        data_matrix, data_quat, data_euler, data_vector, data_vector_array = utils.console_math_data()
    
        if not data_matrix and not data_quat and not data_euler and not data_vector and not data_vector_array:
    
            # draw some text
            glColor3f(1.0, 0.0, 0.0)
            blf.position(font_id, 180, 10, 0)
            blf.draw(font_id, "Python Console has no mathutils definitions")
            return
    
        glColor3f(1.0, 1.0, 1.0)
    
        region = context.region
        region3d = context.space_data.region_3d
        
        region_mid_width = region.width / 2.0
        region_mid_height = region.height / 2.0
    
        # vars for projection
        perspective_matrix = region3d.perspective_matrix.copy()
    
        def draw_text(text, vec):
            vec_4d = Vector((vec.x, vec.y, vec.z, 1.0))
            vec_4d *= perspective_matrix
            if vec_4d.w > 0.0:
                x = region_mid_width + region_mid_width * (vec_4d.x / vec_4d.w)
                y = region_mid_height + region_mid_height * (vec_4d.y / vec_4d.w)
    
                blf.position(font_id, x + 3.0, y - 4.0, 0.0)
                blf.draw(font_id, text)
    
        # points
        if data_vector:
            for key, vec in data_vector.items():
                draw_text(key, vec)
    
        # lines
        if data_vector_array:
            for key, vec in data_vector_array.items():
                draw_text(key, vec[0])
    
        # matrix
        if data_matrix:
            for key, mat in data_matrix.items():
                draw_text(key, mat[3])
        
        if data_quat:
            loc = context.scene.cursor_location.copy()
            for key, mat in data_quat.items():
                draw_text(key, loc)
    
        if data_euler:
            loc = context.scene.cursor_location.copy()
            for key, mat in data_euler.items():
                draw_text(key, loc)
    
    
    def draw_callback_view(self, context):
        from bgl import glEnable, glDisable, glColor3f, glVertex3f, glPointSize, glLineWidth, glBegin, glEnd, glLineStipple, GL_POINTS, GL_LINE_STRIP, GL_LINES, GL_LINE_STIPPLE
    
        data_matrix, data_quat, data_euler, data_vector, data_vector_array = utils.console_math_data()
    
    
        # draw_matrix vars
        zero = Vector((0.0, 0.0, 0.0))
        x_p = Vector((1.0, 0.0, 0.0))
        x_n = Vector((-1.0, 0.0, 0.0))
        y_p = Vector((0.0, 1.0, 0.0))
        y_n = Vector((0.0, -1.0, 0.0))
        z_p = Vector((0.0, 0.0, 1.0))
        z_n = Vector((0.0, 0.0, -1.0))        
        bb = [Vector() for i in range(8)]
    
        def draw_matrix(mat):
            zero_tx = zero * mat
            
            glLineWidth(2.0)
            
            # x
            glColor3f(1.0, 0.2, 0.2)
            glBegin(GL_LINES)
            glVertex3f(*(zero_tx))
            glVertex3f(*(x_p * mat))
            glEnd()
    
            glColor3f(0.6, 0.0, 0.0)
            glBegin(GL_LINES)
            glVertex3f(*(zero_tx))
            glVertex3f(*(x_n * mat))
            glEnd()
    
            # y
            glColor3f(0.2, 1.0, 0.2)
            glBegin(GL_LINES)
            glVertex3f(*(zero_tx))
            glVertex3f(*(y_p * mat))
            glEnd()
    
            glColor3f(0.0, 0.6, 0.0)
            glBegin(GL_LINES)
            glVertex3f(*(zero_tx))
            glVertex3f(*(y_n * mat))
            glEnd()
            
            # z
            glColor3f(0.2, 0.2, 1.0)
            glBegin(GL_LINES)
            glVertex3f(*(zero_tx))
            glVertex3f(*(z_p * mat))
            glEnd()
    
            glColor3f(0.0, 0.0, 0.6)
            glBegin(GL_LINES)
            glVertex3f(*(zero_tx))
            glVertex3f(*(z_n * mat))
            glEnd()
            
            # bounding box
            i = 0
            glColor3f(1.0, 1.0, 1.0)
            for x in (-1.0, 1.0):
                for y in (-1.0, 1.0):
                    for z in (-1.0, 1.0):
                        bb[i][:] = x, y, z
                        bb[i] *= mat
                        i += 1
    
            # strip
            glLineWidth(1.0)
            glLineStipple(1, 0xAAAA)
            glEnable(GL_LINE_STIPPLE)
    
            glBegin(GL_LINE_STRIP)
            for i in 0, 1, 3, 2, 0, 4, 5, 7, 6, 4:
                glVertex3f(*bb[i])
            glEnd()
    
            # not done by the strip
            glBegin(GL_LINES)
            glVertex3f(*bb[1])
            glVertex3f(*bb[5])
            
            glVertex3f(*bb[2])
            glVertex3f(*bb[6])
            
            glVertex3f(*bb[3])
            glVertex3f(*bb[7])
            glEnd()
            glDisable(GL_LINE_STIPPLE)
    
    
        # points
        if data_vector:
            glPointSize(3.0);
            glBegin(GL_POINTS)
            glColor3f(0.5, 0.5, 1)
            for key, vec in data_vector.items():
    
                glVertex3f(*vec.to_3d())
    
            glEnd();
            glPointSize(1.0)
    
        # lines
        if data_vector_array:
            glColor3f(0.5, 0.5, 1)
            glLineWidth(2.0)
    
            for line in data_vector_array.values():
                glBegin(GL_LINE_STRIP)
                for vec in line:
                    glVertex3f(*vec)
                glEnd();
                glPointSize(1.0)
    
            glLineWidth(1.0)
    
        # matrix
        if data_matrix:
            for mat in data_matrix.values():
                draw_matrix(mat)
    
        if data_quat:
            loc = context.scene.cursor_location.copy()
            for quat in data_quat.values():
    
                mat = quat.to_matrix().to_4x4()
    
                mat[3][0:3] = loc
                draw_matrix(mat)
    
        if data_euler:
            loc = context.scene.cursor_location.copy()
            for eul in data_euler.values():
    
                mat = eul.to_matrix().to_4x4()
    
                mat[3][0:3] = loc
    
    Guillermo S. Romero's avatar
    Guillermo S. Romero committed
                draw_matrix(mat)