[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12816] trunk/blender/source/blender: == NLA - Scale Related Fixes ==

Joshua Leung aligorith at gmail.com
Fri Dec 7 11:50:02 CET 2007


Revision: 12816
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12816
Author:   aligorith
Date:     2007-12-07 11:50:02 +0100 (Fri, 07 Dec 2007)

Log Message:
-----------
== NLA - Scale Related Fixes ==

* Old files now get initialised with the correct scale. The wrong calculation was being used

* Added a new tool to Alt-S menu: "Apply Scale"
This tool causes all the keyframes in the active strip to be moved to their NLA-scaled times, the scale to be set to 1.0, and the frame ranges recalculated accordingly (to remove any nasty weird errors)

* Scale field now draws red when the action-range is < 1, and the tooltip in this case instructs the user how to fix this (by using "Apply Scale"). 

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/action.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/src/drawnla.c
    trunk/blender/source/blender/src/editnla.c
    trunk/blender/source/blender/src/header_nla.c

Modified: trunk/blender/source/blender/blenkernel/intern/action.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/action.c	2007-12-07 10:37:07 UTC (rev 12815)
+++ trunk/blender/source/blender/blenkernel/intern/action.c	2007-12-07 10:50:02 UTC (rev 12816)
@@ -443,7 +443,6 @@
 	length = repeat * scale * actlength;
 	
 	/* invert = convert action-strip time to global time */
-	// FIXME?
 	if (invert)
 		return length*(cframe - strip->actstart)/(repeat*actlength) + strip->start;
 	else

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2007-12-07 10:37:07 UTC (rev 12815)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2007-12-07 10:50:02 UTC (rev 12816)
@@ -7211,8 +7211,7 @@
 				if (length == 0.0f) length= 1.0f;
 				actlength = strip->actend-strip->actstart;
 				
-				// right calculation? 
-				strip->scale = actlength / (length * repeat);
+				strip->scale = length / (repeat * actlength);
 				if (strip->scale == 0.0f) strip->scale= 1.0f;
 			}	
 		}

Modified: trunk/blender/source/blender/src/drawnla.c
===================================================================
--- trunk/blender/source/blender/src/drawnla.c	2007-12-07 10:37:07 UTC (rev 12815)
+++ trunk/blender/source/blender/src/drawnla.c	2007-12-07 10:50:02 UTC (rev 12816)
@@ -639,7 +639,13 @@
 	uiBlockBeginAlign(block);
 		// FIXME: repeat and scale are too cramped!
 	uiDefButF(block, NUM, B_NLA_SCALE, "Repeat:", 	160,100,75,19, &strip->repeat, 0.001, 1000.0f, 100, 0, "Number of times the action should repeat");
-	uiDefButF(block, NUM, B_NLA_SCALE, "Scale:", 	235,100,75,19, &strip->scale, 0.001, 10000.0f, 100, 0, "Amount the action should be scaled by");
+	if ((strip->actend - strip->actstart) < 1.0f) {
+		uiBlockSetCol(block, TH_REDALERT);
+		uiDefButF(block, NUM, B_NLA_SCALE, "Scale:", 	235,100,75,19, &strip->scale, 0.001, 1000.0f, 100, 0, "Please run Alt-S to fix up this error");
+		uiBlockSetCol(block, TH_AUTO);
+	}
+	else
+		uiDefButF(block, NUM, B_NLA_SCALE, "Scale:", 	235,100,75,19, &strip->scale, 0.001, 1000.0f, 100, 0, "Amount the action should be scaled by");
 	but= uiDefButC(block, TEX, B_NLA_PANEL, "OffsBone:", 160,80,150,19, strip->offs_bone, 0, 31.0f, 0, 0, "Name of Bone that defines offset for repeat");
 	uiButSetCompleteFunc(but, autocomplete_bone, (void *)ob);
 	uiDefButBitS(block, TOG, ACTSTRIP_HOLDLASTFRAME, B_NLA_PANEL, "Hold",	160,60,75,19, &strip->flag, 0, 0, 0, 0, "Toggles whether to continue displaying the last frame past the end of the strip");

Modified: trunk/blender/source/blender/src/editnla.c
===================================================================
--- trunk/blender/source/blender/src/editnla.c	2007-12-07 10:37:07 UTC (rev 12815)
+++ trunk/blender/source/blender/src/editnla.c	2007-12-07 10:50:02 UTC (rev 12816)
@@ -199,11 +199,11 @@
 				calc_action_range(strip->act, &actstart, &actend, 1);
 				
 				if ((strip->actstart!=actstart) || (strip->actend!=actend)) {		
-					float offset;
+					float offset = strip->scale * (actstart - strip->actstart);
+					float actlen = actend - actstart;
 					
-					offset= strip->scale * (actstart - strip->actstart);
 					strip->start += offset;
-					strip->end = strip->scale * strip->repeat * (actend-actstart) + strip->start;
+					strip->end = (strip->scale * strip->repeat * actlen) + strip->start;
 					
 					strip->actstart= actstart;
 					strip->actend= actend;
@@ -372,15 +372,41 @@
 		
 		for (strip = base->object->nlastrips.last; strip; strip=strip->prev) {
 			if (strip->flag & ACTSTRIP_SELECT) {
-				if(val==2) {
-					calc_action_range(strip->act, &strip->actstart, &strip->actend, 1);
+				switch (val) {
+					case 1:
+					{
+						/* clear scaling - reset to 1.0 without touching keys */
+						float actlen= (strip->actend - strip->actstart);
+						
+						strip->scale= 1.0f;
+						strip->end= (strip->repeat * actlen) + strip->start;
+					}
+						break;
+					case 2:
+					{
+						/* reset action-range */
+						calc_action_range(strip->act, &strip->actstart, &strip->actend, 1);
+					}
+						break;
+					case 3:
+					{
+						/* apply scale to keys - scale is reset to 1.0f, but keys stay at the same times */
+						bActionChannel *achan;
+						
+						if (strip->act) {
+							for (achan= strip->act->chanbase.first; achan; achan= achan->next) {
+								actstrip_map_ipo_keys(base->object, achan->ipo, 0, 0);
+							}
+							
+							/* now we can reset scale */
+							calc_action_range(strip->act, &strip->actstart, &strip->actend, 1);
+							strip->scale= 1.0f;
+							strip->end = (strip->repeat * (strip->actend - strip->actstart)) + strip->start;
+						}
+					}
+						break;
 				}
-				else if(val==1) {
-					float mapping= (strip->actend - strip->actstart)/(strip->end - strip->start);
-					
-					strip->end= strip->start + mapping*(strip->end - strip->start);
-				}
-				base->object->ctime= -1234567.0f;	// eveil! 
+				base->object->ctime= -1234567.0f;	// evil! 
 				DAG_object_flush_update(G.scene, base->object, OB_RECALC_OB|OB_RECALC_DATA);
 			}
 		}
@@ -1850,14 +1876,12 @@
 				break;
 				
 			case SKEY:
-				if(G.qual==LR_ALTKEY) {
-					val= pupmenu("Action Strip Scale%t|Clear Strip Scale%x1|Remap Start/End%x2");
-					if(val==1)
-						reset_action_strips(1);
-					else if(val==2)
-						reset_action_strips(2);
+				if (G.qual==LR_ALTKEY) {
+					val= pupmenu("Action Strip Scale%t|Reset Strip Scale%x1|Remap Action Start/End%x2|Apply Scale%x3");
+					if (val > 0)
+						reset_action_strips(val);
 				}
-				else if(G.qual & LR_SHIFTKEY) {
+				else if (G.qual & LR_SHIFTKEY) {
 					if (snla->flag & SNLA_DRAWTIME)
 						val= pupmenu("Snap To%t|Nearest Second%x3|Current Time%x2");
 					else

Modified: trunk/blender/source/blender/src/header_nla.c
===================================================================
--- trunk/blender/source/blender/src/header_nla.c	2007-12-07 10:37:07 UTC (rev 12815)
+++ trunk/blender/source/blender/src/header_nla.c	2007-12-07 10:50:02 UTC (rev 12816)
@@ -331,7 +331,7 @@
 	case 7: /* Move Down */
 		shift_nlastrips_down();
 		break;
-	case 8:	/* size */
+	case 8:	/* reset scale */
 		reset_action_strips(1);
 		break;
 	case 9:	/* reset start/end of action */
@@ -340,6 +340,9 @@
 	case 10: /* add new action as new action strip */
 		add_empty_nlablock();
 		break;
+	case 11: /* apply scale */
+		reset_action_strips(3);
+		break;
 	}
 }
 
@@ -353,10 +356,11 @@
 
 	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Strip Properties...|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
 	uiDefIconTextBlockBut(block, nla_strip_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 20, "");
-	uiDefIconTextBlockBut(block, nla_strip_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap To Frame", 0, yco-=20, 120, 20, "");
+	uiDefIconTextBlockBut(block, nla_strip_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 20, "");
 	
-	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Strip Size|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
+	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Strip Scale|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
 	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Action Start/End|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
+	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Strip Scaling|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
 	
 	uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 	





More information about the Bf-blender-cvs mailing list