[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [2975] contrib/py/scripts/addons/ io_import_lipSync_Importer.py: -adds support to armatures (code by dalai)
yousef harfoush
bat3a at msn.com
Thu Feb 9 21:09:28 CET 2012
Revision: 2975
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=2975
Author: bat3a
Date: 2012-02-09 20:09:25 +0000 (Thu, 09 Feb 2012)
Log Message:
-----------
-adds support to armatures (code by dalai)
-code refactor and cleanup
Modified Paths:
--------------
contrib/py/scripts/addons/io_import_lipSync_Importer.py
Modified: contrib/py/scripts/addons/io_import_lipSync_Importer.py
===================================================================
--- contrib/py/scripts/addons/io_import_lipSync_Importer.py 2012-02-08 04:38:51 UTC (rev 2974)
+++ contrib/py/scripts/addons/io_import_lipSync_Importer.py 2012-02-09 20:09:25 UTC (rev 2975)
@@ -19,8 +19,8 @@
bl_info = {
"name": "LipSync Importer & Blinker",
"author": "Yousef Harfoush - bat3a ;)",
- "version": (0, 4, 0),
- "blender": (2, 5, 9),
+ "version": (0, 5, 0),
+ "blender": (2, 6, 2),
"location": "3D window > Tool Shelf",
"description": "Plot Moho (Papagayo, Jlipsync, Yolo) file to frames and adds automatic blinking",
"warning": "",
@@ -34,8 +34,8 @@
from bpy.props import *
from bpy.props import IntProperty, FloatProperty, StringProperty
-global phnmlst
-phnmlst="nothing"
+global lastPhoneme
+lastPhoneme="nothing"
# truning off relative path - it causes an error if it was true
if bpy.context.user_preferences.filepaths.use_relative_paths == True:
@@ -47,33 +47,112 @@
scn = bpy.context.scene
obj = bpy.context.object
- global blink, blinkphnm
+ if scn.regMenuTypes.enumBlinkTypes == '0':
+ modifier = 0
+ elif scn.regMenuTypes.enumBlinkTypes == '1':
+ modifier = scn.blinkMod
+
+ #creating keys with blinkNm count
+ for y in range(scn.blinkNm):
+ frame = y * scn.blinkSp + int(random()*modifier)
+ createShapekey('blink', frame)
- blink="off"
- blinkphnm=-1
+# -----------code contributed by dalai felinto adds armature support modified by me-------------------
- sk=len(obj.data.shape_keys.key_blocks)
+bone_keys = {
+"AI": ('location', 0),
+"E": ('location', 1),
+"FV": ('location', 2),
+"L": ('rotation_euler', 0),
+"MBP": ('rotation_euler', 1),
+"O": ('rotation_euler', 2),
+"U": ('scale', 0),
+"WQ": ('scale', 1),
+"etc": ('scale', 2),
+"rest": ('ik_stretch', -1)
+}
- # searching for blink shapekey index
- for x in range(sk):
- obj.active_shape_key_index = x
- if obj.active_shape_key.name=="blink": blink="on"; blinkphnm=x
+def lipsyncerBone():
+ # reading imported file & creating keys
+ object = bpy.context.object
+ scene = bpy.context.scene
+ bone = bpy.context.active_pose_bone
+
+ resetBoneScale(bone)
+
+ f=open(scene.fpath) # importing file
+ f.readline() # reading the 1st line that we don"t need
+
+ for line in f:
+ # removing new lines
+ lsta = re.split("\n+", line)
- if blinkphnm!=-1:
-
- if scn.remnuTypes.enumBlinks == '0':
- modifier = 0
- elif scn.remnuTypes.enumBlinks == '1':
- modifier = scn.blinkMod
+ # building a list of frames & shapes indexes
+ lst = re.split(":? ", lsta[0])# making a list of a frame & number
+ frame = int(lst[0])
- #creating keys with blinkNm count
- for y in range(scn.blinkNm):
-
- blinkfrm = y * scn.blinkSp + int(random()*modifier)
-
- crtkey(blinkphnm, blinkfrm)
+ for key,attribute in bone_keys.items():
+ if lst[1] == key:
+ createBoneKeys(key, bone, attribute, frame)
+def resetBoneScale(bone):
+ # set the attributes used by papagayo to 0.0
+ for attribute,index in bone_keys.values():
+ if index != -1:
+ #bone.location[0] = 0.0
+ exec("bone.%s[%d] = %f" % (attribute, index, 0.0))
+ else:
+ exec("bone.%s = %f" % (attribute, 0.0))
+def addBoneKey(bone, data_path, index=-1, value=None, frame=bpy.context.scene.frame_current, group=""):
+ # set a value and keyframe for the bone
+ # it assumes the 'bone' variable was defined before
+ # and it's the current selected bone
+
+ if value != None:
+ if index != -1:
+ # bone.location[0] = 0.0
+ exec("bone.%s[%d] = %f" % (data_path, index, value))
+ else:
+ exec("bone.%s = %f" % (data_path, value))
+
+ # bone.keyframe_insert("location", 0, 10.0, "Lipsync")
+ exec('bone.keyframe_insert("%s", %d, %f, "%s")' % (data_path, index, frame, group))
+
+# creating keys with offset and eases for a phonem @ the Skframe
+def createBoneKeys(phoneme, bone, attribute, frame):
+ global lastPhoneme
+
+ scene = bpy.context.scene
+ object = bpy.context.object
+
+ offst = scene.offset # offset value
+ skVlu = scene.skscale # shape key value
+
+ #in case of Papagayo format
+ if scene.regMenuTypes.enumFileTypes == '0' :
+ frmIn = scene.easeIn # ease in value
+ frmOut = scene.easeOut # ease out value
+ hldIn = scene.holdGap # holding time value
+
+ #in case of Jlipsync format or Yolo
+ elif scene.regMenuTypes.enumFileTypes == '1' :
+ frmIn = 1
+ frmOut = 1
+ hldIn = 0
+
+ # inserting the In key only when phonem change or when blinking
+ if lastPhoneme!=phoneme or eval(scene.regMenuTypes.enumModeTypes) == 1:
+ addBoneKey(bone, attribute[0], attribute[1], 0.0, offst+frame-frmIn, "Lipsync")
+
+ addBoneKey(bone, attribute[0], attribute[1], skVlu, offst+frame, "Lipsync")
+ addBoneKey(bone, attribute[0], attribute[1], skVlu, offst+frame+hldIn, "Lipsync")
+ addBoneKey(bone, attribute[0], attribute[1], 0.0, offst+frame+hldIn+frmOut, "Lipsync")
+
+ lastPhoneme=phoneme
+
+# -------------------------------------------------------------------------------
+
# reading imported file & creating keys
def lipsyncer():
@@ -89,85 +168,57 @@
lsta = re.split("\n+", line)
# building a list of frames & shapes indexes
- lst = re.split(":? ", lsta[0])# making a list of a frame number &
- frm = int(lst[0])
+ lst = re.split(":? ", lsta[0])# making a list of a frame & number
+ frame = int(lst[0])
- sk=len(obj.data.shape_keys.key_blocks)
- for x in range(sk):
- obj.active_shape_key_index = x
- oask=obj.active_shape_key.name
- if lst[1]==oask: crtkey(x, frm)
+ for key in obj.data.shape_keys.key_blocks:
+ if lst[1] == key.name:
+ createShapekey(key.name, frame)
-# retargetting?? ------WIP
-def retargeter():
+# creating keys with offset and eases for a phonem @ the frame
+def createShapekey(phoneme, frame):
- scn = bpy.context.scene
-
- f=open(scn.fpath) # importing file
- f.readline() # reading the 1st line that we don"t need
+ global lastPhoneme
- for line in f:
- # removing new lines
- lsta = re.split("\n+", line)
-
- # building a list of frames & shapes indexes
- lst = re.split(":? ", lsta[0])# making a list of a frame number &
- frm = int(lst[0])
-
- sk=len(obj.data.shape_keys.key_blocks)
-
- for x in range(sk):
- obj.active_shape_key_index = x
- oask=obj.active_shape_key.name
- if lst[1]==oask: crtkey(x, frm)
-
-# creating keys with offset and eases for a phonem @ the Skframe
-def crtkey(phoneme, Skframe):
-
- global phnmlst
-
scn = bpy.context.scene
obj = bpy.context.object
- objSK=obj.data.shape_keys
+ objSK = obj.data.shape_keys
- #setting the active shape key to phonem
- obj.active_shape_key_index=phoneme
-
offst = scn.offset # offset value
skVlu = scn.skscale # shape key value
#in case of Papagayo format
- if scn.remnuTypes.enumFiles == '0' :
+ if scn.regMenuTypes.enumFileTypes == '0' :
frmIn = scn.easeIn # ease in value
frmOut = scn.easeOut # ease out value
hldIn = scn.holdGap # holding time value
#in case of Jlipsync format or Yolo
- elif scn.remnuTypes.enumFiles == '1' :
+ elif scn.regMenuTypes.enumFileTypes == '1' :
frmIn = 1
frmOut = 1
hldIn = 0
# inserting the In key only when phonem change or when blinking
- if phnmlst!=phoneme or eval(scn.mnuFunc) == 1:
- obj.active_shape_key.value=0.0
+ if lastPhoneme!=phoneme or eval(scn.regMenuTypes.enumModeTypes) == 1:
+ objSK.key_blocks[phoneme].value=0.0
objSK.key_blocks[phoneme].keyframe_insert("value",
- -1, offst+Skframe-frmIn, "Lipsync")
+ -1, offst+frame-frmIn, "Lipsync")
- obj.active_shape_key.value=skVlu
+ objSK.key_blocks[phoneme].value=skVlu
objSK.key_blocks[phoneme].keyframe_insert("value",
- -1, offst+Skframe, "Lipsync")
+ -1, offst+frame, "Lipsync")
- obj.active_shape_key.value=skVlu
+ objSK.key_blocks[phoneme].value=skVlu
objSK.key_blocks[phoneme].keyframe_insert("value",
- -1, offst+Skframe+hldIn, "Lipsync")
+ -1, offst+frame+hldIn, "Lipsync")
- obj.active_shape_key.value=0.0
+ objSK.key_blocks[phoneme].value=0.0
objSK.key_blocks[phoneme].keyframe_insert("value",
- -1, offst+Skframe+hldIn+frmOut, "Lipsync")
+ -1, offst+frame+hldIn+frmOut, "Lipsync")
- phnmlst=phoneme
-
+ lastPhoneme = phoneme
+
# lipsyncer operation start
class btn_lipsyncer(bpy.types.Operator):
bl_idname = 'lipsync.go'
@@ -177,149 +228,166 @@
def execute(self, context):
scn = context.scene
- obj = context.object
+ obj = context.active_object
- # testing if a mesh object with shape keys is selected
- if obj!=None and obj.type=="MESH":
- if obj.data.shape_keys!=None:
- if scn.fpath!='': lipsyncer()
- else: print ("select a Moho file")
- else: print("add shape keys PLEASE")
- else: print ("Object is not mesh or not selected ")
+ # testing if object is valid
+ if obj!=None:
+ if obj.type=="MESH":
+ if obj.data.shape_keys!=None:
+ if scn.fpath!='': lipsyncer()
+ else: print ("select a Moho file")
+ else: print("No shape keys")
+
+ elif obj.type=="ARMATURE":
+ if 1:#XXX add prop test
+ if scn.fpath!='': lipsyncerBone()
+ else: print ("select a Moho file")
+ else: print("Create Pose properties")
+
+ else: print ("Object is not a mesh ot bone")
+ else: print ("Select object")
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list