Skip to content
Snippets Groups Projects
draw.py 7.11 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 #####
    
    # <pep8 compliant>
    
    
    import bpy
    import blf
    
    from . import utils
    from mathutils import Vector, Matrix
    
    SpaceView3D = bpy.types.SpaceView3D
    callback_handle = []
    
    
    def tag_redraw_all_view3d():
        context = bpy.context
    
        # Py cant access notifers
        for window in context.window_manager.windows:
            for area in window.screen.areas:
                if area.type == 'VIEW_3D':
                    for region in area.regions:
                        if region.type == 'WINDOW':
                            region.tag_redraw()
    
    Campbell Barton's avatar
    Campbell Barton committed
    
    
    def callback_enable():
        if callback_handle:
            return
    
        handle_pixel = SpaceView3D.draw_handler_add(draw_callback_px, (), 'WINDOW', 'POST_PIXEL')
        handle_view = SpaceView3D.draw_handler_add(draw_callback_view, (), 'WINDOW', 'POST_VIEW')
        callback_handle[:] = handle_pixel, handle_view
    
        tag_redraw_all_view3d()
    
    
    def callback_disable():
        if not callback_handle:
            return
    
        handle_pixel, handle_view = callback_handle
        SpaceView3D.draw_handler_remove(handle_pixel, 'WINDOW')
        SpaceView3D.draw_handler_remove(handle_view, 'WINDOW')
        callback_handle[:] = []
    
        tag_redraw_all_view3d()
    
    
    def draw_callback_px():
        context = bpy.context
    
    
        from bgl import glColor3f
    
    Campbell Barton's avatar
    Campbell Barton committed
        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
    
    Campbell Barton's avatar
    Campbell Barton committed
    
    
        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):
    
    Campbell Barton's avatar
    Campbell Barton committed
            vec_4d = perspective_matrix * vec.to_4d()
    
            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])
    
    Campbell Barton's avatar
    Campbell Barton committed
    
    
        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():
        context = bpy.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))
    
    Campbell Barton's avatar
    Campbell Barton committed
        z_n = Vector((0.0, 0.0, -1.0))
    
        bb = [Vector() for i in range(8)]
    
        def draw_matrix(mat):
    
    Campbell Barton's avatar
    Campbell Barton committed
    
    
            glLineWidth(2.0)
    
    Campbell Barton's avatar
    Campbell Barton committed
    
    
            # x
            glColor3f(1.0, 0.2, 0.2)
            glBegin(GL_LINES)
            glVertex3f(*(zero_tx))
    
            glEnd()
    
            glColor3f(0.6, 0.0, 0.0)
            glBegin(GL_LINES)
            glVertex3f(*(zero_tx))
    
            glEnd()
    
            # y
            glColor3f(0.2, 1.0, 0.2)
            glBegin(GL_LINES)
            glVertex3f(*(zero_tx))
    
            glEnd()
    
            glColor3f(0.0, 0.6, 0.0)
            glBegin(GL_LINES)
            glVertex3f(*(zero_tx))
    
    Campbell Barton's avatar
    Campbell Barton committed
    
    
            # z
            glColor3f(0.2, 0.2, 1.0)
            glBegin(GL_LINES)
            glVertex3f(*(zero_tx))
    
            glEnd()
    
            glColor3f(0.0, 0.0, 0.6)
            glBegin(GL_LINES)
            glVertex3f(*(zero_tx))
    
    Campbell Barton's avatar
    Campbell Barton committed
    
    
            # 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
    
    Campbell Barton's avatar
    Campbell Barton committed
                        bb[i] = mat * bb[i]
    
                        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])
    
    Campbell Barton's avatar
    Campbell Barton committed
    
    
            glVertex3f(*bb[2])
            glVertex3f(*bb[6])
    
    Campbell Barton's avatar
    Campbell Barton committed
    
    
            glVertex3f(*bb[3])
            glVertex3f(*bb[7])
            glEnd()
            glDisable(GL_LINE_STIPPLE)
    
    
    Campbell Barton's avatar
    Campbell Barton committed
        ########
    
        # points
        if data_vector:
    
    Campbell Barton's avatar
    Campbell Barton committed
            glPointSize(3.0)
    
            glBegin(GL_POINTS)
            glColor3f(0.5, 0.5, 1)
            for key, vec in data_vector.items():
    
                glVertex3f(*vec.to_3d())
    
    Campbell Barton's avatar
    Campbell Barton committed
            glEnd()
    
    Campbell Barton's avatar
    Campbell Barton committed
        #######
    
        # 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)
    
    Campbell Barton's avatar
    Campbell Barton committed
                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.translation = 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.translation = loc
    
    Guillermo S. Romero's avatar
    Guillermo S. Romero committed
                draw_matrix(mat)