Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'space_view3d_math_vis/draw.py')
-rw-r--r--space_view3d_math_vis/draw.py232
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..9d3b436e
--- /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 = 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
+ draw_matrix(mat)