[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18648] branches/blender2.5/blender/source /blender/editors/animation/keyframing.c: Animato - Insert Keyframe for PoseChannels

Joshua Leung aligorith at gmail.com
Sat Jan 24 11:58:36 CET 2009


Revision: 18648
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18648
Author:   aligorith
Date:     2009-01-24 11:58:34 +0100 (Sat, 24 Jan 2009)

Log Message:
-----------
Animato - Insert Keyframe for PoseChannels

Added temporary entries to the quick-hack insert-keyframe operator menu. Action Editor doesn't get refreshed properly yet though.

Proper keyingsets will be coming/remimplemented tomorrow or later this week.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/animation/keyframing.c

Modified: branches/blender2.5/blender/source/blender/editors/animation/keyframing.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/keyframing.c	2009-01-24 10:19:29 UTC (rev 18647)
+++ branches/blender2.5/blender/source/blender/editors/animation/keyframing.c	2009-01-24 10:58:34 UTC (rev 18648)
@@ -15,6 +15,7 @@
 
 #include "DNA_anim_types.h"
 #include "DNA_action_types.h"
+#include "DNA_armature_types.h"
 #include "DNA_constraint_types.h"
 #include "DNA_key_types.h"
 #include "DNA_object_types.h"
@@ -2009,7 +2010,7 @@
 /* Insert Key Operator ------------------------ */
 
 /* XXX WARNING:
- * This is currently just a basic operator, which work in 3d-view context on objects only
+ * This is currently just a basic operator, which work in 3d-view context on objects/bones only
  * and will insert keyframes for a few settings only. This is until it becomes clear how
  * to separate (or not) the process for RNA-path creation between context + keyingsets.
  * 
@@ -2019,10 +2020,13 @@
 /* defines for basic insert-key testing operator  */
 	// XXX this will definitely be replaced
 EnumPropertyItem prop_insertkey_types[] = {
-	{0, "LOC", "Location", ""},
-	{1, "ROT", "Rotation", ""},
-	{2, "SCALE", "Scale", ""},
+	{0, "OBLOC", "Object Location", ""},
+	{1, "OBROT", "Object Rotation", ""},
+	{2, "OBSCALE", "Object Scale", ""},
 	{3, "MAT_COL", "Active Material - Color", ""},
+	{4, "PCHANLOC", "Pose-Channel Location", ""},
+	{5, "PCHANROT", "Pose-Channel Rotation", ""},
+	{6, "PCHANSCALE", "Pose-Channel Scale", ""},
 	{0, NULL, NULL, NULL}
 };
  
@@ -2040,33 +2044,73 @@
 		short success= 0;
 		
 		/* check which keyframing mode chosen for this object */
-		switch (mode) {
-			case 3: /* color of active material */
+		if (mode < 4) {
+			/* object-based keyframes */
+			switch (mode) {
+			case 3: /* color of active material (only for geometry...) */
 				// NOTE: this is just a demo... but ideally we'd go through materials instead of active one only so reference stays same
 				success+= insertkey(id, "active_material.diffuse_color", 0, cfra, 0);
 				success+= insertkey(id, "active_material.diffuse_color", 1, cfra, 0);
 				success+= insertkey(id, "active_material.diffuse_color", 2, cfra, 0);
 				break;
-			case 2: /* scale */
+			case 2: /* object scale */
 				success+= insertkey(id, "scale", 0, cfra, 0);
 				success+= insertkey(id, "scale", 1, cfra, 0);
 				success+= insertkey(id, "scale", 2, cfra, 0);
 				break;
-			case 1: /* rotation */
+			case 1: /* object rotation */
 				success+= insertkey(id, "rotation", 0, cfra, 0);
 				success+= insertkey(id, "rotation", 1, cfra, 0);
 				success+= insertkey(id, "rotation", 2, cfra, 0);
 				break;
-			default: /* location */
+			default: /* object location */
 				success+= insertkey(id, "location", 0, cfra, 0);
 				success+= insertkey(id, "location", 1, cfra, 0);
 				success+= insertkey(id, "location", 2, cfra, 0);
 				break;
+			}
+			
+			ob->recalc |= OB_RECALC_OB;
 		}
+		else if ((ob->pose) && (ob->flag & OB_POSEMODE)) {
+			/* PoseChannel based keyframes */
+			bPoseChannel *pchan;
+			
+			for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+				/* only if selected */
+				if ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED)) {
+					char buf[512];
+					
+					switch (mode) {
+					case 6: /* pchan scale */
+						sprintf(buf, "pose.pose_channels[\"%s\"].scale", pchan->name);
+						success+= insertkey(id, buf, 0, cfra, 0);
+						success+= insertkey(id, buf, 1, cfra, 0);
+						success+= insertkey(id, buf, 2, cfra, 0);
+						break;
+					case 5: /* pchan rotation */
+						sprintf(buf, "pose.pose_channels[\"%s\"].rotation", pchan->name);
+						success+= insertkey(id, buf, 0, cfra, 0);
+						success+= insertkey(id, buf, 1, cfra, 0);
+						success+= insertkey(id, buf, 2, cfra, 0);
+						success+= insertkey(id, buf, 3, cfra, 0);
+						break;
+					default: /* pchan location */
+						sprintf(buf, "pose.pose_channels[\"%s\"].location", pchan->name);
+						success+= insertkey(id, buf, 0, cfra, 0);
+						success+= insertkey(id, buf, 1, cfra, 0);
+						success+= insertkey(id, buf, 2, cfra, 0);
+						break;
+					}
+				}
+			}
+			
+			ob->recalc |= OB_RECALC_OB;
+		}
 		
 		printf("Ob '%s' - Successfully added %d Keyframes \n", id->name+2, success);
 		
-		ob->recalc |= OB_RECALC_OB;
+		
 	}
 	CTX_DATA_END;
 	





More information about the Bf-blender-cvs mailing list