Skip to content
Snippets Groups Projects
Commit 215006e5 authored by Alexander Gavrilov's avatar Alexander Gavrilov
Browse files

Rigify: improve widget placement, widget generation and make_driver.

- Take into account the custom shape settings of the bone when
  creating and placing the custom widget object.
- Change write_widget to wrap the generated list text and fix
  undefined variable errors if there are no verts/edges/faces.
- Automatically look up string to bone in self.make_driver().
parent 42508e18
No related branches found
No related tags found
No related merge requests found
...@@ -286,4 +286,6 @@ class MechanismUtilityMixin(object): ...@@ -286,4 +286,6 @@ class MechanismUtilityMixin(object):
def make_driver(self, owner, prop, **args): def make_driver(self, owner, prop, **args):
assert(self.obj.mode == 'OBJECT') assert(self.obj.mode == 'OBJECT')
if isinstance(owner, str):
owner = self.obj.pose.bones[owner]
return make_driver(owner, prop, target_id=self.obj, **args) return make_driver(owner, prop, target_id=self.obj, **args)
...@@ -36,9 +36,16 @@ def obj_to_bone(obj, rig, bone_name): ...@@ -36,9 +36,16 @@ def obj_to_bone(obj, rig, bone_name):
if bpy.context.mode == 'EDIT_ARMATURE': if bpy.context.mode == 'EDIT_ARMATURE':
raise MetarigError("obj_to_bone(): does not work while in edit mode") raise MetarigError("obj_to_bone(): does not work while in edit mode")
bone = rig.data.bones[bone_name] bone = rig.pose.bones[bone_name]
scale = bone.custom_shape_scale
mat = rig.matrix_world @ bone.matrix_local if bone.use_custom_shape_bone_size:
scale *= bone.length
if bone.custom_shape_transform:
bone = bone.custom_shape_transform
mat = rig.matrix_world @ bone.bone.matrix_local
obj.location = mat.to_translation() obj.location = mat.to_translation()
...@@ -47,7 +54,7 @@ def obj_to_bone(obj, rig, bone_name): ...@@ -47,7 +54,7 @@ def obj_to_bone(obj, rig, bone_name):
scl = mat.to_scale() scl = mat.to_scale()
scl_avg = (scl[0] + scl[1] + scl[2]) / 3 scl_avg = (scl[0] + scl[1] + scl[2]) / 3
obj.scale = (bone.length * scl_avg), (bone.length * scl_avg), (bone.length * scl_avg) obj.scale = (scale * scl_avg), (scale * scl_avg), (scale * scl_avg)
def create_widget(rig, bone_name, bone_transform_name=None): def create_widget(rig, bone_name, bone_transform_name=None):
...@@ -133,28 +140,28 @@ def write_widget(obj): ...@@ -133,28 +140,28 @@ def write_widget(obj):
script += " if obj != None:\n" script += " if obj != None:\n"
# Vertices # Vertices
if len(obj.data.vertices) > 0: 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"
# Edges # Edges
if len(obj.data.edges) > 0: script += " edges = ["
script += " edges = [" for i, e in enumerate(obj.data.edges):
for e in obj.data.edges: script += "(" + str(e.vertices[0]) + ", " + str(e.vertices[1]) + "),"
script += "(" + str(e.vertices[0]) + ", " + str(e.vertices[1]) + "), " script += "\n " if i % 10 == 9 else " "
script += "]\n" script += "]\n"
# Faces # Faces
if len(obj.data.polygons) > 0: script += " faces = ["
script += " faces = [" for i, f in enumerate(obj.data.polygons):
for f in obj.data.polygons: script += "("
script += "(" for v in f.vertices:
for v in f.vertices: script += str(v) + ", "
script += str(v) + ", " script += "),"
script += "), " 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"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment