73 lines
2.0 KiB
Python
73 lines
2.0 KiB
Python
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||
|
|
|
||
|
|
import bpy, re
|
||
|
|
from mathutils import Vector
|
||
|
|
from ...utils import org, strip_org, make_mechanism_name, make_deformer_name
|
||
|
|
from ...utils import MetarigError
|
||
|
|
|
||
|
|
bilateral_suffixes = ['.L','.R']
|
||
|
|
|
||
|
|
def orient_bone( cls, eb, axis, scale = 1.0, reverse = False ):
|
||
|
|
v = Vector((0,0,0))
|
||
|
|
|
||
|
|
setattr(v,axis,scale)
|
||
|
|
|
||
|
|
if reverse:
|
||
|
|
tail_vec = v @ cls.obj.matrix_world
|
||
|
|
eb.head[:] = eb.tail
|
||
|
|
eb.tail[:] = eb.head + tail_vec
|
||
|
|
else:
|
||
|
|
tail_vec = v @ cls.obj.matrix_world
|
||
|
|
eb.tail[:] = eb.head + tail_vec
|
||
|
|
|
||
|
|
eb.roll = 0.0
|
||
|
|
|
||
|
|
def make_constraint( cls, bone, constraint ):
|
||
|
|
bpy.ops.object.mode_set(mode = 'OBJECT')
|
||
|
|
pb = cls.obj.pose.bones
|
||
|
|
|
||
|
|
owner_pb = pb[bone]
|
||
|
|
const = owner_pb.constraints.new( constraint['constraint'] )
|
||
|
|
|
||
|
|
constraint['target'] = cls.obj
|
||
|
|
|
||
|
|
# filter constraint props to those that actually exist in the current
|
||
|
|
# type of constraint, then assign values to each
|
||
|
|
for p in [ k for k in constraint.keys() if k in dir(const) ]:
|
||
|
|
if p in dir( const ):
|
||
|
|
setattr( const, p, constraint[p] )
|
||
|
|
else:
|
||
|
|
raise MetarigError(
|
||
|
|
"RIGIFY ERROR: property %s does not exist in %s constraint" % (
|
||
|
|
p, constraint['constraint']
|
||
|
|
))
|
||
|
|
|
||
|
|
def get_bone_name( name, btype, suffix = '' ):
|
||
|
|
# RE pattern match right or left parts
|
||
|
|
# match the letter "L" (or "R"), followed by an optional dot (".")
|
||
|
|
# and 0 or more digits at the end of the the string
|
||
|
|
pattern = r'^(\S+)(\.\S+)$'
|
||
|
|
|
||
|
|
name = strip_org( name )
|
||
|
|
|
||
|
|
types = {
|
||
|
|
'mch' : make_mechanism_name( name ),
|
||
|
|
'org' : org( name ),
|
||
|
|
'def' : make_deformer_name( name ),
|
||
|
|
'ctrl' : name
|
||
|
|
}
|
||
|
|
|
||
|
|
name = types[btype]
|
||
|
|
|
||
|
|
if suffix:
|
||
|
|
results = re.match( pattern, name )
|
||
|
|
bname, addition = ('','')
|
||
|
|
|
||
|
|
if results:
|
||
|
|
bname, addition = results.groups()
|
||
|
|
name = bname + "_" + suffix + addition
|
||
|
|
else:
|
||
|
|
name = name + "_" + suffix
|
||
|
|
|
||
|
|
return name
|