Changeset View
Changeset View
Standalone View
Standalone View
rigify/utils/widgets.py
| Show All 15 Lines | |||||
| # | # | ||||
| #======================= END GPL LICENSE BLOCK ======================== | #======================= END GPL LICENSE BLOCK ======================== | ||||
| # <pep8 compliant> | # <pep8 compliant> | ||||
| import bpy | import bpy | ||||
| import math | import math | ||||
| from mathutils import Matrix | |||||
| from .errors import MetarigError | from .errors import MetarigError | ||||
| from .collections import ensure_widget_collection | from .collections import ensure_widget_collection | ||||
| WGT_PREFIX = "WGT-" # Prefix for widget objects | WGT_PREFIX = "WGT-" # Prefix for widget objects | ||||
| #============================================= | #============================================= | ||||
| # Widget creation | # Widget creation | ||||
| #============================================= | #============================================= | ||||
| ▲ Show 20 Lines • Show All 95 Lines • ▼ Show 20 Lines | while i < (number_verts): | ||||
| i += 1 | i += 1 | ||||
| edges.append((0, number_verts - 1)) | edges.append((0, number_verts - 1)) | ||||
| return verts, edges | return verts, edges | ||||
| def adjust_widget_axis(obj, axis='y', offset=0.0): | |||||
| mesh = obj.data | |||||
| if axis[0] == '-': | |||||
| s = -1.0 | |||||
| axis = axis[1] | |||||
| else: | |||||
| s = 1.0 | |||||
| trans_matrix = Matrix.Translation((0.0, offset, 0.0)) | |||||
| rot_matrix = Matrix.Diagonal((1.0, s, 1.0, 1.0)) | |||||
| if axis == "x": | |||||
| rot_matrix = Matrix.Rotation(-s*math.pi/2, 4, 'Z') | |||||
| trans_matrix = Matrix.Translation((offset, 0.0, 0.0)) | |||||
| elif axis == "z": | |||||
| rot_matrix = Matrix.Rotation(s*math.pi/2, 4, 'X') | |||||
| trans_matrix = Matrix.Translation((0.0, 0.0, offset)) | |||||
| matrix = trans_matrix @ rot_matrix | |||||
| for vert in mesh.vertices: | |||||
| vert.co = matrix @ vert.co | |||||
| def write_widget(obj): | def write_widget(obj): | ||||
| """ Write a mesh object as a python script for widget use. | """ Write a mesh object as a python script for widget use. | ||||
| """ | """ | ||||
| script = "" | script = "" | ||||
| script += "def create_thing_widget(rig, bone_name, size=1.0, bone_transform_name=None):\n" | script += "def create_thing_widget(rig, bone_name, size=1.0, bone_transform_name=None):\n" | ||||
| script += " obj = create_widget(rig, bone_name, bone_transform_name)\n" | script += " obj = create_widget(rig, bone_name, bone_transform_name)\n" | ||||
| script += " if obj != None:\n" | script += " if obj is not None:\n" | ||||
| # Vertices | # Vertices | ||||
| script += " verts = [" | script += " verts = [" | ||||
| for v in obj.data.vertices: | for v in obj.data.vertices: | ||||
| script += "(" + str(v.co[0]) + "*size, " + str(v.co[1]) + "*size, " + str(v.co[2]) + "*size)," | script += "(" + str(v.co[0]) + "*size, " + str(v.co[1]) + "*size, " + str(v.co[2]) + "*size)," | ||||
| script += "\n " | script += "\n " | ||||
| script += "]\n" | script += "]\n" | ||||
| Show All 13 Lines | for i, f in enumerate(obj.data.polygons): | ||||
| script += ")," | script += ")," | ||||
| script += "\n " if i % 10 == 9 else " " | script += "\n " if i % 10 == 9 else " " | ||||
| script += "]\n" | script += "]\n" | ||||
| # Build mesh | # Build mesh | ||||
| script += "\n mesh = obj.data\n" | script += "\n mesh = obj.data\n" | ||||
| script += " mesh.from_pydata(verts, edges, faces)\n" | script += " mesh.from_pydata(verts, edges, faces)\n" | ||||
| script += " mesh.update()\n" | script += " mesh.update()\n" | ||||
| script += " mesh.update()\n" | |||||
| script += " return obj\n" | script += " return obj\n" | ||||
| script += " else:\n" | script += " else:\n" | ||||
| script += " return None\n" | script += " return None\n" | ||||
| return script | return script | ||||