[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