diff options
Diffstat (limited to 'space_view3d_math_vis/draw.py')
-rw-r--r-- | space_view3d_math_vis/draw.py | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/space_view3d_math_vis/draw.py b/space_view3d_math_vis/draw.py new file mode 100644 index 00000000..dd544d38 --- /dev/null +++ b/space_view3d_math_vis/draw.py @@ -0,0 +1,232 @@ +#====================== 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 = vec.to_4d() + 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 = mat * zero + + glLineWidth(2.0) + + # x + glColor3f(1.0, 0.2, 0.2) + glBegin(GL_LINES) + glVertex3f(*(zero_tx)) + glVertex3f(*(mat * x_p)) + glEnd() + + glColor3f(0.6, 0.0, 0.0) + glBegin(GL_LINES) + glVertex3f(*(zero_tx)) + glVertex3f(*(mat * x_n)) + glEnd() + + # y + glColor3f(0.2, 1.0, 0.2) + glBegin(GL_LINES) + glVertex3f(*(zero_tx)) + glVertex3f(*(mat * y_p)) + glEnd() + + glColor3f(0.0, 0.6, 0.0) + glBegin(GL_LINES) + glVertex3f(*(zero_tx)) + glVertex3f(*(mat * y_n)) + glEnd() + + # z + glColor3f(0.2, 0.2, 1.0) + glBegin(GL_LINES) + glVertex3f(*(zero_tx)) + glVertex3f(*(mat * z_p)) + glEnd() + + glColor3f(0.0, 0.0, 0.6) + glBegin(GL_LINES) + glVertex3f(*(zero_tx)) + glVertex3f(*(mat * z_n)) + 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 + draw_matrix(mat) |