rna data path names which are more likely to break animations.
[blender-staging.git] / release / scripts / modules / rigify / eye_lid.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20
21 import bpy
22 from rna_prop_ui import rna_idprop_ui_prop_get
23 from math import acos
24 from mathutils import Vector
25 from rigify import RigifyError
26 from rigify_utils import copy_bone_simple
27
28 #METARIG_NAMES = ("cpy",)
29 RIG_TYPE = "eye_lid"
30
31 def mark_actions():
32     for action in bpy.data.actions:
33         action.tag = True
34
35 def get_unmarked_action():
36     for action in bpy.data.actions:
37         if action.tag != True:
38             return action
39     return None
40
41 def add_action(name=None):
42     mark_actions()
43     bpy.ops.action.new()
44     action = get_unmarked_action()
45     if name is not None:
46         action.name = name
47     return action
48
49
50 def metarig_template():
51     # generated by rigify.write_meta_rig
52     bpy.ops.object.mode_set(mode='EDIT')
53     obj = bpy.context.active_object
54     arm = obj.data
55     bone = arm.edit_bones.new('Bone')
56     bone.head[:] = 0.0000, 0.0000, 0.0000
57     bone.tail[:] = 0.0000, 0.0000, 1.0000
58     bone.roll = 0.0000
59     bone.use_connect = False
60
61     bpy.ops.object.mode_set(mode='OBJECT')
62     pbone = obj.pose.bones['Bone']
63     pbone['type'] = 'copy'
64
65
66 def metarig_definition(obj, orig_bone_name):
67     bb = obj.data.bones
68     bone = bb[orig_bone_name]
69     chain = []
70
71     try:
72         chain += [bone.parent.parent.name, bone.parent.name, bone.name]
73     except AttributeError:
74         raise RigifyError("'%s' rig type requires a chain of two parents (bone: %s)" % (RIG_TYPE, orig_bone_name))
75
76     chain += [child.name for child in bone.children_recursive_basename]
77
78     if len(chain) < 10:
79         raise RigifyError("'%s' rig type requires a chain of 10 bones (bone: %s)" % (RIG_TYPE, orig_bone_name))
80
81     chain = chain[:10]
82
83     try:
84         chain += [bb[chain[9]].children[0].name]
85         chain += [bb[chain[10]].children[0].name]
86     except IndexError:
87         raise RigifyError("'%s' rig type requires a chain of 10 bones (bone: %s)" % (RIG_TYPE, orig_bone_name))
88
89     return chain
90
91
92 def deform(obj, definitions, base_names, options):
93     bpy.ops.object.mode_set(mode='EDIT')
94
95     eb = obj.data.edit_bones
96     pb = obj.pose.bones
97
98
99     # Upper lid MCH
100     lid1  = make_lid_stretch_bone(obj, "MCH-lid", definitions[2], definitions[3], 1.0)
101     lid2  = make_lid_stretch_bone(obj, "MCH-lid", definitions[3], definitions[4], 1.0)
102     lid22 = make_lid_stretch_bone(obj, "MCH-lid", definitions[4], definitions[5], 1.0)
103     lid33 = make_lid_stretch_bone(obj, "MCH-lid", definitions[4], definitions[3], 1.0)
104     lid3  = make_lid_stretch_bone(obj, "MCH-lid", definitions[5], definitions[4], 1.0)
105     lid4  = make_lid_stretch_bone(obj, "MCH-lid", definitions[6], definitions[5], 1.0)
106
107     dlid22 = copy_bone_simple(obj.data, lid22, "MCH-lid", parent=True).name
108     dlid33 = copy_bone_simple(obj.data, lid33, "MCH-lid", parent=True).name
109     eb[dlid22].bbone_segments = 8
110     eb[dlid33].bbone_segments = 8
111
112     eb[lid1].parent = eb[definitions[2]]
113     eb[lid2].parent = eb[definitions[3]]
114     eb[lid22].parent = eb[definitions[4]]
115     eb[lid33].parent = eb[definitions[4]]
116     eb[lid3].parent = eb[definitions[5]]
117     eb[lid4].parent = eb[definitions[6]]
118
119     # Lower lid MCH
120     lid5 =  make_lid_stretch_bone(obj, "MCH-lid", definitions[6], definitions[7], 1.0)
121     lid6 =  make_lid_stretch_bone(obj, "MCH-lid", definitions[7], definitions[8], 1.0)
122     lid66 = make_lid_stretch_bone(obj, "MCH-lid", definitions[8], definitions[9], 1.0)
123     lid77 = make_lid_stretch_bone(obj, "MCH-lid", definitions[8], definitions[7], 1.0)
124     lid7 =  make_lid_stretch_bone(obj, "MCH-lid", definitions[9], definitions[8], 1.0)
125     lid8 =  make_lid_stretch_bone(obj, "MCH-lid", definitions[2], definitions[9], 1.0)
126
127     dlid66 = copy_bone_simple(obj.data, lid66, "MCH-lid", parent=True).name
128     dlid77 = copy_bone_simple(obj.data, lid77, "MCH-lid", parent=True).name
129     eb[dlid66].bbone_segments = 8
130     eb[dlid77].bbone_segments = 8
131
132     eb[lid5].parent = eb[definitions[6]]
133     eb[lid6].parent = eb[definitions[7]]
134     eb[lid66].parent = eb[definitions[8]]
135     eb[lid77].parent = eb[definitions[8]]
136     eb[lid7].parent = eb[definitions[9]]
137     eb[lid8].parent = eb[definitions[2]]
138
139     # Upper lid DEF
140     dlid1 = copy_bone_simple(obj.data, lid1, "DEF-" + base_names[definitions[2]], parent=True).name
141     dlid2 = copy_bone_simple(obj.data, lid2, "DEF-" + base_names[definitions[3]], parent=True).name
142     dlid3 = copy_bone_simple(obj.data, lid3, "DEF-" + base_names[definitions[4]], parent=True).name
143     dlid4 = copy_bone_simple(obj.data, lid4, "DEF-" + base_names[definitions[5]], parent=True).name
144
145     eb[dlid2].parent  = eb[dlid1]
146     eb[dlid22].parent = eb[dlid2]
147
148     eb[dlid3].parent  = eb[dlid4]
149     eb[dlid33].parent = eb[dlid3]
150
151     eb[dlid2].use_connect  = True
152     eb[dlid22].use_connect = True
153     eb[dlid3].use_connect  = True
154     eb[dlid33].use_connect = True
155
156     eb[dlid1].bbone_segments = 8
157     eb[dlid2].bbone_segments = 8
158     eb[dlid3].bbone_segments = 8
159     eb[dlid4].bbone_segments = 8
160
161     # Lower lid DEF
162     dlid5 = copy_bone_simple(obj.data, lid5, "DEF-" + base_names[definitions[6]], parent=True).name
163     dlid6 = copy_bone_simple(obj.data, lid6, "DEF-" + base_names[definitions[7]], parent=True).name
164     dlid7 = copy_bone_simple(obj.data, lid7, "DEF-" + base_names[definitions[8]], parent=True).name
165     dlid8 = copy_bone_simple(obj.data, lid8, "DEF-" + base_names[definitions[9]], parent=True).name
166
167     eb[dlid6].parent = eb[dlid5]
168     eb[dlid66].parent = eb[dlid6]
169
170     eb[dlid7].parent = eb[dlid8]
171     eb[dlid77].parent = eb[dlid7]
172
173     eb[dlid6].use_connect = True
174     eb[dlid66].use_connect = True
175     eb[dlid7].use_connect = True
176     eb[dlid77].use_connect = True
177
178     eb[dlid5].bbone_segments = 8
179     eb[dlid6].bbone_segments = 8
180     eb[dlid7].bbone_segments = 8
181     eb[dlid8].bbone_segments = 8
182
183
184     bpy.ops.object.mode_set(mode='OBJECT')
185
186     # Constraints
187     con = pb[dlid1].constraints.new('COPY_TRANSFORMS')
188     con.target = obj
189     con.subtarget = lid1
190
191     con = pb[dlid22].constraints.new('COPY_TRANSFORMS')
192     con.target = obj
193     con.subtarget = lid22
194
195     con = pb[dlid33].constraints.new('COPY_TRANSFORMS')
196     con.target = obj
197     con.subtarget = lid33
198
199     con = pb[dlid2].constraints.new('COPY_TRANSFORMS')
200     con.target = obj
201     con.subtarget = lid2
202
203     con = pb[dlid3].constraints.new('COPY_TRANSFORMS')
204     con.target = obj
205     con.subtarget = lid3
206
207     con = pb[dlid4].constraints.new('COPY_TRANSFORMS')
208     con.target = obj
209     con.subtarget = lid4
210
211     con = pb[dlid5].constraints.new('COPY_TRANSFORMS')
212     con.target = obj
213     con.subtarget = lid5
214
215     con = pb[dlid6].constraints.new('COPY_TRANSFORMS')
216     con.target = obj
217     con.subtarget = lid6
218
219     con = pb[dlid66].constraints.new('COPY_TRANSFORMS')
220     con.target = obj
221     con.subtarget = lid66
222
223     con = pb[dlid77].constraints.new('COPY_TRANSFORMS')
224     con.target = obj
225     con.subtarget = lid77
226
227     con = pb[dlid7].constraints.new('COPY_TRANSFORMS')
228     con.target = obj
229     con.subtarget = lid7
230
231     con = pb[dlid8].constraints.new('COPY_TRANSFORMS')
232     con.target = obj
233     con.subtarget = lid8
234
235     return (None,)
236
237
238
239
240 def control(obj, definitions, base_names, options):
241     bpy.ops.object.mode_set(mode='EDIT')
242
243     eb = obj.data.edit_bones
244     bb = obj.data.bones
245     pb = obj.pose.bones
246
247     head_e = eb[definitions[0]]
248     eye_e = eb[definitions[1]]
249
250
251     # Make eye "flower"
252     flo1 = copy_bone_simple(obj.data, definitions[1], "MCH-"+base_names[definitions[2]]+".flower", parent=True).name
253     flo2 = copy_bone_simple(obj.data, definitions[1], "MCH-"+base_names[definitions[3]]+".flower", parent=True).name
254     flo3 = copy_bone_simple(obj.data, definitions[1], "MCH-"+base_names[definitions[4]]+".flower", parent=True).name
255     flo4 = copy_bone_simple(obj.data, definitions[1], "MCH-"+base_names[definitions[5]]+".flower", parent=True).name
256     flo5 = copy_bone_simple(obj.data, definitions[1], "MCH-"+base_names[definitions[6]]+".flower", parent=True).name
257     flo6 = copy_bone_simple(obj.data, definitions[1], "MCH-"+base_names[definitions[7]]+".flower", parent=True).name
258     flo7 = copy_bone_simple(obj.data, definitions[1], "MCH-"+base_names[definitions[8]]+".flower", parent=True).name
259     flo8 = copy_bone_simple(obj.data, definitions[1], "MCH-"+base_names[definitions[9]]+".flower", parent=True).name
260
261     eb[flo1].tail = eb[definitions[2]].head
262     eb[flo2].tail = eb[definitions[3]].head
263     eb[flo3].tail = eb[definitions[4]].head
264     eb[flo4].tail = eb[definitions[5]].head
265     eb[flo5].tail = eb[definitions[6]].head
266     eb[flo6].tail = eb[definitions[7]].head
267     eb[flo7].tail = eb[definitions[8]].head
268     eb[flo8].tail = eb[definitions[9]].head
269
270
271     # Make eye lids on tips of flowers
272     flid1 = copy_bone_simple(obj.data, definitions[2], "MCH-"+base_names[definitions[2]]).name
273     flid2 = copy_bone_simple(obj.data, definitions[3], "MCH-"+base_names[definitions[3]]).name
274     flid3 = copy_bone_simple(obj.data, definitions[4], "MCH-"+base_names[definitions[4]]).name
275     flid4 = copy_bone_simple(obj.data, definitions[5], "MCH-"+base_names[definitions[5]]).name
276     flid5 = copy_bone_simple(obj.data, definitions[6], "MCH-"+base_names[definitions[6]]).name
277     flid6 = copy_bone_simple(obj.data, definitions[7], "MCH-"+base_names[definitions[7]]).name
278     flid7 = copy_bone_simple(obj.data, definitions[8], "MCH-"+base_names[definitions[8]]).name
279     flid8 = copy_bone_simple(obj.data, definitions[9], "MCH-"+base_names[definitions[9]]).name
280
281     eb[flid1].parent = eb[flo1]
282     eb[flid2].parent = eb[flo2]
283     eb[flid3].parent = eb[flo3]
284     eb[flid4].parent = eb[flo4]
285     eb[flid5].parent = eb[flo5]
286     eb[flid6].parent = eb[flo6]
287     eb[flid7].parent = eb[flo7]
288     eb[flid8].parent = eb[flo8]
289
290
291     # Make eye lid controls
292     lid1 = copy_bone_simple(obj.data, definitions[2], base_names[definitions[2]]).name
293     lid2 = copy_bone_simple(obj.data, definitions[3], base_names[definitions[3]]).name
294     lid3 = copy_bone_simple(obj.data, definitions[4], base_names[definitions[4]]).name
295     lid4 = copy_bone_simple(obj.data, definitions[5], base_names[definitions[5]]).name
296     lid5 = copy_bone_simple(obj.data, definitions[6], base_names[definitions[6]]).name
297     lid6 = copy_bone_simple(obj.data, definitions[7], base_names[definitions[7]]).name
298     lid7 = copy_bone_simple(obj.data, definitions[8], base_names[definitions[8]]).name
299     lid8 = copy_bone_simple(obj.data, definitions[9], base_names[definitions[9]]).name
300
301     size = eb[lid1].length
302     size_y = Vector(0.0, size, 0.0)
303     eb[lid1].tail = eb[lid1].head + size_y
304     eb[lid2].tail = eb[lid2].head + size_y
305     eb[lid3].tail = eb[lid3].head + size_y
306     eb[lid4].tail = eb[lid4].head + size_y
307     eb[lid5].tail = eb[lid5].head + size_y
308     eb[lid6].tail = eb[lid6].head + size_y
309     eb[lid7].tail = eb[lid7].head + size_y
310     eb[lid8].tail = eb[lid8].head + size_y
311
312     eb[lid1].roll = 0
313     eb[lid2].roll = 0
314     eb[lid3].roll = 0
315     eb[lid4].roll = 0
316     eb[lid5].roll = 0
317     eb[lid6].roll = 0
318     eb[lid7].roll = 0
319     eb[lid8].roll = 0
320
321     eb[lid1].parent = head_e
322     eb[lid2].parent = head_e
323     eb[lid3].parent = head_e
324     eb[lid4].parent = head_e
325     eb[lid5].parent = head_e
326     eb[lid6].parent = head_e
327     eb[lid7].parent = head_e
328     eb[lid8].parent = head_e
329
330     lower_lid_ctrl = copy_bone_simple(obj.data, definitions[10], base_names[definitions[10]]).name
331     upper_lid_ctrl = copy_bone_simple(obj.data, definitions[11], base_names[definitions[11]]).name
332     eb[lower_lid_ctrl].parent = head_e
333     eb[upper_lid_ctrl].parent = head_e
334     distance = (eb[lower_lid_ctrl].head - eb[upper_lid_ctrl].head).length
335
336
337     bpy.ops.object.mode_set(mode='OBJECT')
338
339     # Axis locks
340     pb[lower_lid_ctrl].lock_location = True, False, True
341     pb[upper_lid_ctrl].lock_location = True, False, True
342
343     # Add eye close action if it doesn't already exist
344     action_name = "eye_close"
345     if action_name in bpy.data.actions:
346         close_action = bpy.data.actions[action_name]
347     else:
348         close_action = add_action(name=action_name)
349
350     # Add close property (useful when making the animation in the action)
351     prop_name = "close_action"
352     prop = rna_idprop_ui_prop_get(pb[upper_lid_ctrl], prop_name, create=True)
353     pb[upper_lid_ctrl][prop_name] = 1.0
354     prop["soft_min"] = 0.0
355     prop["soft_max"] = 1.0
356     prop["min"] = 0.0
357     prop["max"] = 1.0
358
359     close_driver_path = pb[upper_lid_ctrl].path_from_id() + '["close_action"]'
360
361     # Constraints
362
363     # Flowers track lid controls
364     con = pb[flo1].constraints.new('DAMPED_TRACK')
365     con.target = obj
366     con.subtarget = lid1
367
368     con = pb[flo2].constraints.new('DAMPED_TRACK')
369     con.target = obj
370     con.subtarget = lid2
371
372     con = pb[flo3].constraints.new('DAMPED_TRACK')
373     con.target = obj
374     con.subtarget = lid3
375
376     con = pb[flo4].constraints.new('DAMPED_TRACK')
377     con.target = obj
378     con.subtarget = lid4
379
380     con = pb[flo5].constraints.new('DAMPED_TRACK')
381     con.target = obj
382     con.subtarget = lid5
383
384     con = pb[flo6].constraints.new('DAMPED_TRACK')
385     con.target = obj
386     con.subtarget = lid6
387
388     con = pb[flo7].constraints.new('DAMPED_TRACK')
389     con.target = obj
390     con.subtarget = lid7
391
392     con = pb[flo8].constraints.new('DAMPED_TRACK')
393     con.target = obj
394     con.subtarget = lid8
395
396
397     # ORG bones to flower lids
398     con = pb[definitions[2]].constraints.new('COPY_TRANSFORMS')
399     con.target = obj
400     con.subtarget = flid1
401
402     con = pb[definitions[3]].constraints.new('COPY_TRANSFORMS')
403     con.target = obj
404     con.subtarget = flid2
405
406     con = pb[definitions[4]].constraints.new('COPY_TRANSFORMS')
407     con.target = obj
408     con.subtarget = flid3
409
410     con = pb[definitions[5]].constraints.new('COPY_TRANSFORMS')
411     con.target = obj
412     con.subtarget = flid4
413
414     con = pb[definitions[6]].constraints.new('COPY_TRANSFORMS')
415     con.target = obj
416     con.subtarget = flid5
417
418     con = pb[definitions[7]].constraints.new('COPY_TRANSFORMS')
419     con.target = obj
420     con.subtarget = flid6
421
422     con = pb[definitions[8]].constraints.new('COPY_TRANSFORMS')
423     con.target = obj
424     con.subtarget = flid7
425
426     con = pb[definitions[9]].constraints.new('COPY_TRANSFORMS')
427     con.target = obj
428     con.subtarget = flid8
429
430
431     # Action constraints, upper lid
432     con = pb[lid1].constraints.new('ACTION')
433     con.target = obj
434     con.subtarget = upper_lid_ctrl
435     con.action = close_action
436     con.transform_channel = 'LOCATION_Y'
437     con.frame_start = -30
438     con.frame_end = 30
439     con.min = -distance*2
440     con.max = distance
441     con.target_space = 'LOCAL'
442     fcurve = con.driver_add("influence")
443     driver = fcurve.driver
444     driver.type = 'AVERAGE'
445     var = driver.variables.new()
446     var.targets[0].id_type = 'OBJECT'
447     var.targets[0].id = obj
448     var.targets[0].data_path = close_driver_path
449
450
451     con = pb[lid2].constraints.new('ACTION')
452     con.target = obj
453     con.subtarget = upper_lid_ctrl
454     con.action = close_action
455     con.transform_channel = 'LOCATION_Y'
456     con.frame_start = -30
457     con.frame_end = 30
458     con.min = -distance*2
459     con.max = distance
460     con.target_space = 'LOCAL'
461     fcurve = con.driver_add("influence")
462     driver = fcurve.driver
463     driver.type = 'AVERAGE'
464     var = driver.variables.new()
465     var.targets[0].id_type = 'OBJECT'
466     var.targets[0].id = obj
467     var.targets[0].data_path = close_driver_path
468
469     con = pb[lid3].constraints.new('ACTION')
470     con.target = obj
471     con.subtarget = upper_lid_ctrl
472     con.action = close_action
473     con.transform_channel = 'LOCATION_Y'
474     con.frame_start = -30
475     con.frame_end = 30
476     con.min = -distance*2
477     con.max = distance
478     con.target_space = 'LOCAL'
479     fcurve = con.driver_add("influence")
480     driver = fcurve.driver
481     driver.type = 'AVERAGE'
482     var = driver.variables.new()
483     var.targets[0].id_type = 'OBJECT'
484     var.targets[0].id = obj
485     var.targets[0].data_path = close_driver_path
486
487     con = pb[lid4].constraints.new('ACTION')
488     con.target = obj
489     con.subtarget = upper_lid_ctrl
490     con.action = close_action
491     con.transform_channel = 'LOCATION_Y'
492     con.frame_start = -30
493     con.frame_end = 30
494     con.min = -distance*2
495     con.max = distance
496     con.target_space = 'LOCAL'
497     fcurve = con.driver_add("influence")
498     driver = fcurve.driver
499     driver.type = 'AVERAGE'
500     var = driver.variables.new()
501     var.targets[0].id_type = 'OBJECT'
502     var.targets[0].id = obj
503     var.targets[0].data_path = close_driver_path
504
505     con = pb[lid5].constraints.new('ACTION')
506     con.target = obj
507     con.subtarget = upper_lid_ctrl
508     con.action = close_action
509     con.transform_channel = 'LOCATION_Y'
510     con.frame_start = -30
511     con.frame_end = 30
512     con.min = -distance*2
513     con.max = distance
514     con.target_space = 'LOCAL'
515     fcurve = con.driver_add("influence")
516     driver = fcurve.driver
517     driver.type = 'AVERAGE'
518     var = driver.variables.new()
519     var.targets[0].id_type = 'OBJECT'
520     var.targets[0].id = obj
521     var.targets[0].data_path = close_driver_path
522
523     # Action constraints, lower lid
524     con = pb[lid5].constraints.new('ACTION')
525     con.target = obj
526     con.subtarget = lower_lid_ctrl
527     con.action = close_action
528     con.transform_channel = 'LOCATION_Y'
529     con.frame_start = -30
530     con.frame_end = 30
531     con.min = -distance
532     con.max = distance*2
533     con.target_space = 'LOCAL'
534     fcurve = con.driver_add("influence")
535     driver = fcurve.driver
536     driver.type = 'AVERAGE'
537     var = driver.variables.new()
538     var.targets[0].id_type = 'OBJECT'
539     var.targets[0].id = obj
540     var.targets[0].data_path = close_driver_path
541
542     con = pb[lid6].constraints.new('ACTION')
543     con.target = obj
544     con.subtarget = lower_lid_ctrl
545     con.action = close_action
546     con.transform_channel = 'LOCATION_Y'
547     con.frame_start = -30
548     con.frame_end = 30
549     con.min = -distance
550     con.max = distance*2
551     con.target_space = 'LOCAL'
552     fcurve = con.driver_add("influence")
553     driver = fcurve.driver
554     driver.type = 'AVERAGE'
555     var = driver.variables.new()
556     var.targets[0].id_type = 'OBJECT'
557     var.targets[0].id = obj
558     var.targets[0].data_path = close_driver_path
559
560     con = pb[lid7].constraints.new('ACTION')
561     con.target = obj
562     con.subtarget = lower_lid_ctrl
563     con.action = close_action
564     con.transform_channel = 'LOCATION_Y'
565     con.frame_start = -30
566     con.frame_end = 30
567     con.min = -distance
568     con.max = distance*2
569     con.target_space = 'LOCAL'
570     fcurve = con.driver_add("influence")
571     driver = fcurve.driver
572     driver.type = 'AVERAGE'
573     var = driver.variables.new()
574     var.targets[0].id_type = 'OBJECT'
575     var.targets[0].id = obj
576     var.targets[0].data_path = close_driver_path
577
578     con = pb[lid8].constraints.new('ACTION')
579     con.target = obj
580     con.subtarget = lower_lid_ctrl
581     con.action = close_action
582     con.transform_channel = 'LOCATION_Y'
583     con.frame_start = -30
584     con.frame_end = 30
585     con.min = -distance
586     con.max = distance*2
587     con.target_space = 'LOCAL'
588     fcurve = con.driver_add("influence")
589     driver = fcurve.driver
590     driver.type = 'AVERAGE'
591     var = driver.variables.new()
592     var.targets[0].id_type = 'OBJECT'
593     var.targets[0].id = obj
594     var.targets[0].data_path = close_driver_path
595
596     con = pb[lid1].constraints.new('ACTION')
597     con.target = obj
598     con.subtarget = lower_lid_ctrl
599     con.action = close_action
600     con.transform_channel = 'LOCATION_Y'
601     con.frame_start = -30
602     con.frame_end = 30
603     con.min = -distance
604     con.max = distance*2
605     con.target_space = 'LOCAL'
606     fcurve = con.driver_add("influence")
607     driver = fcurve.driver
608     driver.type = 'AVERAGE'
609     var = driver.variables.new()
610     var.targets[0].id_type = 'OBJECT'
611     var.targets[0].id = obj
612     var.targets[0].data_path = close_driver_path
613
614
615
616
617     # Set layers
618     layer = list(bb[definitions[2]].layers)
619     bb[lid1].layers = layer
620     bb[lid2].layers = layer
621     bb[lid3].layers = layer
622     bb[lid4].layers = layer
623     bb[lid5].layers = layer
624     bb[lid6].layers = layer
625     bb[lid7].layers = layer
626     bb[lid8].layers = layer
627
628
629     return (None,)
630
631
632
633
634 def main(obj, bone_definition, base_names, options):
635     # Create control rig
636     control(obj, bone_definition, base_names, options)
637     # Create deform rig
638     deform(obj, bone_definition, base_names, options)
639
640     return (None,)
641
642
643
644
645 def make_lid_stretch_bone(obj, name, bone1, bone2, roll_alpha):
646     eb = obj.data.edit_bones
647     pb = obj.pose.bones
648
649     # Create the bone, pointing from bone1 to bone2
650     bone_e = copy_bone_simple(obj.data, bone1, name, parent=True)
651     bone_e.use_connect = False
652     bone_e.tail = eb[bone2].head
653     bone = bone_e.name
654
655     # Align the bone roll with the average direction of bone1 and bone2
656     vec = bone_e.y_axis.cross(((1.0-roll_alpha)*eb[bone1].y_axis) + (roll_alpha*eb[bone2].y_axis)).normalize()
657
658     ang = acos(vec * bone_e.x_axis)
659
660     bone_e.roll += ang
661     c1 = vec * bone_e.x_axis
662     bone_e.roll -= (ang*2)
663     c2 = vec * bone_e.x_axis
664
665     if c1 > c2:
666         bone_e.roll += (ang*2)
667
668     bpy.ops.object.mode_set(mode='OBJECT')
669     bone_p = pb[bone]
670
671     # Constrains
672     con = bone_p.constraints.new('COPY_LOCATION')
673     con.target = obj
674     con.subtarget = bone1
675
676     con = bone_p.constraints.new('DAMPED_TRACK')
677     con.target = obj
678     con.subtarget = bone2
679
680     con = bone_p.constraints.new('STRETCH_TO')
681     con.target = obj
682     con.subtarget = bone2
683     con.volume = 'NO_VOLUME'
684
685     bpy.ops.object.mode_set(mode='EDIT')
686
687     return bone