[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27899] branches/render25: FCurve Py/ RNA API for adding and removing points fcu.keyframe_points.add()/remove()

Campbell Barton ideasman42 at gmail.com
Wed Mar 31 12:40:51 CEST 2010


Revision: 27899
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27899
Author:   campbellbarton
Date:     2010-03-31 12:40:51 +0200 (Wed, 31 Mar 2010)

Log Message:
-----------
FCurve Py/RNA API for adding and removing points fcu.keyframe_points.add()/remove()
 mostly rewritten but some parts taken from [#21313] Added API Function to manage F-Curve. By Anthony Hinsinger (atoy40)

Armature NLA baking function, very simple but not in any menu's yet.
- bakes armatures only
- bakes loc/scale/rot
- supports different rotation types
- cleans up unneeded points after.

Modified Paths:
--------------
    branches/render25/release/scripts/io/import_anim_bvh.py
    branches/render25/release/scripts/io/import_scene_3ds.py
    branches/render25/release/scripts/io/import_scene_obj.py
    branches/render25/release/scripts/op/add_mesh_torus.py
    branches/render25/source/blender/makesrna/intern/rna_fcurve.c
    branches/render25/source/blender/makesrna/intern/rna_pose.c

Added Paths:
-----------
    branches/render25/release/scripts/op/nla.py

Modified: branches/render25/release/scripts/io/import_anim_bvh.py
===================================================================
--- branches/render25/release/scripts/io/import_anim_bvh.py	2010-03-31 08:33:43 UTC (rev 27898)
+++ branches/render25/release/scripts/io/import_anim_bvh.py	2010-03-31 10:40:51 UTC (rev 27899)
@@ -609,7 +609,8 @@
         return {'RUNNING_MODAL'}
 
 
-menu_func = lambda self, context: self.layout.operator(BvhImporter.bl_idname, text="Motion Capture (.bvh)")
+def menu_func(self, context):
+    self.layout.operator(BvhImporter.bl_idname, text="Motion Capture (.bvh)")
 
 
 def register():

Modified: branches/render25/release/scripts/io/import_scene_3ds.py
===================================================================
--- branches/render25/release/scripts/io/import_scene_3ds.py	2010-03-31 08:33:43 UTC (rev 27898)
+++ branches/render25/release/scripts/io/import_scene_3ds.py	2010-03-31 10:40:51 UTC (rev 27899)
@@ -1030,9 +1030,9 @@
         return {'RUNNING_MODAL'}
 
 
-menu_func = lambda self, context: self.layout.operator(IMPORT_OT_autodesk_3ds.bl_idname, text="3D Studio (.3ds)")
+def menu_func(self, context):
+    self.layout.operator(IMPORT_OT_autodesk_3ds.bl_idname, text="3D Studio (.3ds)")
 
-
 def register():
     bpy.types.register(IMPORT_OT_autodesk_3ds)
     bpy.types.INFO_MT_file_import.append(menu_func)

Modified: branches/render25/release/scripts/io/import_scene_obj.py
===================================================================
--- branches/render25/release/scripts/io/import_scene_obj.py	2010-03-31 08:33:43 UTC (rev 27898)
+++ branches/render25/release/scripts/io/import_scene_obj.py	2010-03-31 10:40:51 UTC (rev 27899)
@@ -1621,7 +1621,8 @@
         return {'RUNNING_MODAL'}
 
 
-menu_func = lambda self, context: self.layout.operator(IMPORT_OT_obj.bl_idname, text="Wavefront (.obj)")
+def menu_func(self, context):
+    self.layout.operator(IMPORT_OT_obj.bl_idname, text="Wavefront (.obj)")
 
 
 def register():

Modified: branches/render25/release/scripts/op/add_mesh_torus.py
===================================================================
--- branches/render25/release/scripts/op/add_mesh_torus.py	2010-03-31 08:33:43 UTC (rev 27898)
+++ branches/render25/release/scripts/op/add_mesh_torus.py	2010-03-31 10:40:51 UTC (rev 27899)
@@ -154,9 +154,8 @@
         return {'FINISHED'}
 
 
-# Add to the menu
-menu_func = (lambda self, context: self.layout.operator(AddTorus.bl_idname,
-                                        text="Torus", icon='MESH_DONUT'))
+def menu_func(self, context):
+    self.layout.operator(AddTorus.bl_idname, text="Torus", icon='MESH_DONUT')
 
 
 def register():

Added: branches/render25/release/scripts/op/nla.py
===================================================================
--- branches/render25/release/scripts/op/nla.py	                        (rev 0)
+++ branches/render25/release/scripts/op/nla.py	2010-03-31 10:40:51 UTC (rev 27899)
@@ -0,0 +1,189 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import bpy
+
+def pose_info():
+    from Mathutils import Matrix
+
+    info = {}
+
+    obj = bpy.context.object
+    pose = obj.pose
+
+    pose_items = pose.bones.items()
+
+    for name, pbone in pose_items:
+        binfo = {}
+        bone = pbone.bone
+
+        binfo["parent"] = getattr(bone.parent, "name", None)
+        binfo["bone"] = bone
+        binfo["pbone"] = pbone
+        binfo["matrix_local"] = bone.matrix_local.copy()
+        try:
+            binfo["matrix_local_inv"] = binfo["matrix_local"].copy().invert()
+        except:
+            binfo["matrix_local_inv"] = Matrix()
+        
+        binfo["matrix"] = bone.matrix.copy()
+        binfo["matrix_pose"] = pbone.matrix.copy()
+        try:
+            binfo["matrix_pose_inv"] = binfo["matrix_pose"].copy().invert()
+        except:
+            binfo["matrix_pose_inv"] = Matrix()
+        
+        print(binfo["matrix_pose"])
+        info[name] = binfo
+
+    for name, pbone in pose_items:
+        binfo = info[name]
+        binfo_parent = binfo.get("parent", None)
+        if binfo_parent:
+            binfo_parent = info[binfo_parent]
+        
+        matrix = binfo["matrix_pose"]
+        rest_matrix = binfo["matrix_local"]
+
+        if binfo_parent:
+            matrix= binfo_parent["matrix_pose_inv"] * matrix
+            rest_matrix= binfo_parent["matrix_local_inv"] * rest_matrix
+
+        matrix = rest_matrix.copy().invert() * matrix
+
+        binfo["matrix_key"] = matrix.copy()
+
+    return info
+
+
+def bake(start_frame, end_frame, step=1, only_selected=False):
+    # import nla; reload(nla); nla.bake()
+
+    scene = bpy.context.scene
+    obj = bpy.context.object
+    pose = obj.pose
+
+    info_ls = []
+    
+    frame_range = range(start_frame, end_frame + 1, step)
+
+    # could spped this up by applying steps here too...
+    for f in frame_range:
+        scene.set_frame(f)
+        
+        info = pose_info()
+        info_ls.append(info)
+        f += 1
+
+    action = bpy.data.actions.new("Action")
+
+    bpy.context.object.animation_data.action = action
+
+    pose_items = pose.bones.items()
+
+    for name, pbone in pose_items:
+        if only_selected and not pbone.selected:
+            continue
+
+        for f in frame_range:
+            matrix = info_ls[int((f-start_frame) / step)][name]["matrix_key"]
+
+            #pbone.location = matrix.translation_part()
+            #pbone.rotation_quaternion = matrix.to_quat()
+            pbone.matrix_local = [f for v in matrix for f in v]
+            
+            pbone.keyframe_insert("location", -1, f)
+            
+            rotation_mode = pbone.rotation_mode
+            
+            if rotation_mode == 'QUATERNION':
+                pbone.keyframe_insert("rotation_quaternion", -1, f)
+            elif rotation_mode == 'AXIS_ANGLE':
+                pbone.keyframe_insert("rotation_axis_angle", -1, f)
+            else: # euler, XYZ, ZXY etc
+                pbone.keyframe_insert("rotation_euler", -1, f)
+
+            pbone.keyframe_insert("scale", -1, f)
+    
+    return action
+
+
+from bpy.props import *
+
+
+class BakeAction(bpy.types.Operator):
+    '''Add a torus mesh'''
+    bl_idname = "nla.bake"
+    bl_label = "Bake Action"
+    bl_options = {'REGISTER', 'UNDO'}
+
+    start_frame = IntProperty(name="Start Frame",
+            description="Start frame for baking",
+            default=1, min=1, max=300000)
+    end_frame = IntProperty(name="End Frame",
+            description="End frame for baking",
+            default=250, min=1, max=300000)
+    step = IntProperty(name="Frame Step",
+            description="Frame Step",
+            default=1, min=1, max=120)
+    only_selected = BoolProperty(name="Only Selected",
+            default=True)
+
+    def execute(self, context):
+        props = self.properties
+
+        action = bake(props.start_frame, props.end_frame, props.step, props.only_selected)
+        
+        # basic cleanup, could move elsewhere
+        for fcu in action.fcurves:
+            keyframe_points = fcu.keyframe_points
+            i = 1
+            while i < len(fcu.keyframe_points) - 1:
+                val_prev = keyframe_points[i - 1].co[1]
+                val_next = keyframe_points[i + 1].co[1]
+                val = keyframe_points[i].co[1]
+
+                if abs(val - val_prev) + abs(val - val_next) < 0.0001:
+                    keyframe_points.remove(keyframe_points[i])
+                else:
+                    i += 1
+
+        return {'FINISHED'}
+
+    def invoke(self, context, event):
+        wm = context.manager
+        return wm.invoke_props_dialog(self)
+
+
+#def menu_func(self, context):
+#    self.layout.operator(BakeAction.bl_idname, text="Bake Armature Action")
+
+
+def register():
+    bpy.types.register(BakeAction)
+    # bpy.types.INFO_MT_mesh_add.append(menu_func)
+
+
+def unregister():
+    bpy.types.unregister(BakeAction)
+    # bpy.types.INFO_MT_mesh_add.remove(menu_func)
+
+if __name__ == "__main__":
+    register()
\ No newline at end of file

Modified: branches/render25/source/blender/makesrna/intern/rna_fcurve.c
===================================================================
--- branches/render25/source/blender/makesrna/intern/rna_fcurve.c	2010-03-31 08:33:43 UTC (rev 27898)
+++ branches/render25/source/blender/makesrna/intern/rna_fcurve.c	2010-03-31 10:40:51 UTC (rev 27899)
@@ -41,6 +41,9 @@
 
 #include "WM_types.h"
 
+#include "ED_keyframing.h"
+#include "ED_keyframes_edit.h"
+
 EnumPropertyItem fmodifier_type_items[] = {
 	{FMODIFIER_TYPE_NULL, "NULL", 0, "Invalid", ""},
 	{FMODIFIER_TYPE_GENERATOR, "GENERATOR", 0, "Generator", ""},
@@ -461,6 +464,31 @@
 	*max= MAXFRAMEF;
 }
 
+static BezTriple *rna_FKeyframe_points_add(FCurve *fcu, float frame, float value, int do_replace, int do_needed, int do_fast)
+{
+	int index;
+	int flag= 0;
+
+	if(do_replace) flag |= INSERTKEY_REPLACE;
+	if(do_needed) flag |= INSERTKEY_NEEDED;
+	if(do_fast) flag |= INSERTKEY_FAST;
+
+
+	index= insert_vert_fcurve(fcu, frame, value, flag);
+	return index >= 0 ? fcu->bezt + index : NULL;
+}
+
+static void rna_FKeyframe_points_remove(FCurve *fcu, ReportList *reports, BezTriple *bezt, int do_fast)
+{
+	int index= (int)(bezt - fcu->bezt);
+	if (index < 0 || index >= fcu->totvert) {
+		BKE_report(reports, RPT_ERROR, "bezier not in fcurve.");
+		return;
+	}
+
+	delete_fcurve_key(fcu, index, !do_fast);
+}
+
 #else
 
 static void rna_def_fmodifier_generator(BlenderRNA *brna)
@@ -1144,7 +1172,6 @@
 	RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
 }
 
-
 static void rna_def_fcurve_modifiers(BlenderRNA *brna, PropertyRNA *cprop)
 {
 	/* add modifiers */
@@ -1189,6 +1216,44 @@

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list