Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorJoshua Leung <aligorith@gmail.com>2009-05-28 05:57:29 +0400
committerJoshua Leung <aligorith@gmail.com>2009-05-28 05:57:29 +0400
commit4512be4b6cce1333c875380b67695e410e9f58c3 (patch)
tree45ffc8a4db3a8d3e8b6c171add0252f28467c8d2 /source
parent5936032f661395f18bcc15c3dba73e8b6f5e963b (diff)
2.5 - Fixes for animating enum values
Interpolation between keyframes for enum values (and booleans) can only be constant now. TODO: A way to do this for modifiers is still needed.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/fcurve.c58
-rw-r--r--source/blender/blenkernel/intern/ipo.c2
-rw-r--r--source/blender/editors/animation/keyframing.c19
-rw-r--r--source/blender/editors/space_graph/graph_draw.c2
-rw-r--r--source/blender/makesdna/DNA_anim_types.h4
5 files changed, 61 insertions, 24 deletions
diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c
index fed5ffc2ebd..ad8115ba9aa 100644
--- a/source/blender/blenkernel/intern/fcurve.c
+++ b/source/blender/blenkernel/intern/fcurve.c
@@ -164,7 +164,7 @@ FCurve *list_find_fcurve (ListBase *list, const char rna_path[], const int array
/* check paths of curves, then array indices... */
for (fcu= list->first; fcu; fcu= fcu->next) {
/* simple string-compare (this assumes that they have the same root...) */
- if (strcmp(fcu->rna_path, rna_path) == 0) {
+ if (fcu->rna_path && !strcmp(fcu->rna_path, rna_path)) {
/* now check indicies */
if (fcu->array_index == array_index)
return fcu;
@@ -1048,17 +1048,22 @@ static float fcurve_eval_keyframes (FCurve *fcu, BezTriple *bezts, float evaltim
lastbezt= prevbezt + a;
/* evaluation time at or past endpoints? */
- if (prevbezt->vec[1][0] >= evaltime) {
+ if (prevbezt->vec[1][0] >= evaltime)
+ {
/* before or on first keyframe */
- if ((fcu->extend == FCURVE_EXTRAPOLATE_LINEAR) && (prevbezt->ipo != BEZT_IPO_CONST)) {
+ if ( (fcu->extend == FCURVE_EXTRAPOLATE_LINEAR) && (prevbezt->ipo != BEZT_IPO_CONST) &&
+ !(fcu->flag & FCURVE_DISCRETE_VALUES) )
+ {
/* linear or bezier interpolation */
- if (prevbezt->ipo==BEZT_IPO_LIN) {
+ if (prevbezt->ipo==BEZT_IPO_LIN)
+ {
/* Use the next center point instead of our own handle for
* linear interpolated extrapolate
*/
if (fcu->totvert == 1)
cvalue= prevbezt->vec[1][1];
- else {
+ else
+ {
bezt = prevbezt+1;
dx= prevbezt->vec[1][0] - evaltime;
fac= bezt->vec[1][0] - prevbezt->vec[1][0];
@@ -1072,7 +1077,8 @@ static float fcurve_eval_keyframes (FCurve *fcu, BezTriple *bezts, float evaltim
cvalue= prevbezt->vec[1][1];
}
}
- else {
+ else
+ {
/* Use the first handle (earlier) of first BezTriple to calculate the
* gradient and thus the value of the curve at evaltime
*/
@@ -1088,24 +1094,30 @@ static float fcurve_eval_keyframes (FCurve *fcu, BezTriple *bezts, float evaltim
cvalue= prevbezt->vec[1][1];
}
}
- else {
+ else
+ {
/* constant (BEZT_IPO_HORIZ) extrapolation or constant interpolation,
* so just extend first keyframe's value
*/
cvalue= prevbezt->vec[1][1];
}
}
- else if (lastbezt->vec[1][0] <= evaltime) {
+ else if (lastbezt->vec[1][0] <= evaltime)
+ {
/* after or on last keyframe */
- if ((fcu->extend == FCURVE_EXTRAPOLATE_LINEAR) && (lastbezt->ipo != BEZT_IPO_CONST)) {
+ if ( (fcu->extend == FCURVE_EXTRAPOLATE_LINEAR) && (lastbezt->ipo != BEZT_IPO_CONST) &&
+ !(fcu->flag & FCURVE_DISCRETE_VALUES) )
+ {
/* linear or bezier interpolation */
- if (lastbezt->ipo==BEZT_IPO_LIN) {
+ if (lastbezt->ipo==BEZT_IPO_LIN)
+ {
/* Use the next center point instead of our own handle for
* linear interpolated extrapolate
*/
if (fcu->totvert == 1)
cvalue= lastbezt->vec[1][1];
- else {
+ else
+ {
prevbezt = lastbezt - 1;
dx= evaltime - lastbezt->vec[1][0];
fac= lastbezt->vec[1][0] - prevbezt->vec[1][0];
@@ -1119,7 +1131,8 @@ static float fcurve_eval_keyframes (FCurve *fcu, BezTriple *bezts, float evaltim
cvalue= lastbezt->vec[1][1];
}
}
- else {
+ else
+ {
/* Use the gradient of the second handle (later) of last BezTriple to calculate the
* gradient and thus the value of the curve at evaltime
*/
@@ -1135,24 +1148,30 @@ static float fcurve_eval_keyframes (FCurve *fcu, BezTriple *bezts, float evaltim
cvalue= lastbezt->vec[1][1];
}
}
- else {
+ else
+ {
/* constant (BEZT_IPO_HORIZ) extrapolation or constant interpolation,
* so just extend last keyframe's value
*/
cvalue= lastbezt->vec[1][1];
}
}
- else {
+ else
+ {
/* evaltime occurs somewhere in the middle of the curve */
- for (a=0; prevbezt && bezt && (a < fcu->totvert-1); a++, prevbezt=bezt, bezt++) {
+ for (a=0; prevbezt && bezt && (a < fcu->totvert-1); a++, prevbezt=bezt, bezt++)
+ {
/* evaltime occurs within the interval defined by these two keyframes */
- if ((prevbezt->vec[1][0] <= evaltime) && (bezt->vec[1][0] >= evaltime)) {
+ if ((prevbezt->vec[1][0] <= evaltime) && (bezt->vec[1][0] >= evaltime))
+ {
/* value depends on interpolation mode */
- if (prevbezt->ipo == BEZT_IPO_CONST) {
+ if ((prevbezt->ipo == BEZT_IPO_CONST) || (fcu->flag & FCURVE_DISCRETE_VALUES))
+ {
/* constant (evaltime not relevant, so no interpolation needed) */
cvalue= prevbezt->vec[1][1];
}
- else if (prevbezt->ipo == BEZT_IPO_LIN) {
+ else if (prevbezt->ipo == BEZT_IPO_LIN)
+ {
/* linear - interpolate between values of the two keyframes */
fac= bezt->vec[1][0] - prevbezt->vec[1][0];
@@ -1164,7 +1183,8 @@ static float fcurve_eval_keyframes (FCurve *fcu, BezTriple *bezts, float evaltim
else
cvalue= prevbezt->vec[1][1];
}
- else {
+ else
+ {
/* bezier interpolation */
/* v1,v2 are the first keyframe and its 2nd handle */
v1[0]= prevbezt->vec[1][0];
diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c
index 6a01311f6fc..9c5560be8f3 100644
--- a/source/blender/blenkernel/intern/ipo.c
+++ b/source/blender/blenkernel/intern/ipo.c
@@ -1169,7 +1169,7 @@ static void icu_to_fcurves (ListBase *groups, ListBase *list, IpoCurve *icu, cha
if (G.f & G_DEBUG) printf("\tconvert bitflag ipocurve, totbits = %d \n", totbits);
/* add the 'only int values' flag */
- fcu->flag |= FCURVE_INT_VALUES;
+ fcu->flag |= (FCURVE_INT_VALUES|FCURVE_DISCRETE_VALUES);
/* for each bit we have to remap + check for:
* 1) we need to make copy the existing F-Curve data (fcu -> fcurve),
diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c
index 9a40fb44f47..4a5f9efa968 100644
--- a/source/blender/editors/animation/keyframing.c
+++ b/source/blender/editors/animation/keyframing.c
@@ -728,8 +728,23 @@ short insert_keyframe (ID *id, bAction *act, const char group[], const char rna_
float curval= 0.0f;
/* set additional flags for the F-Curve (i.e. only integer values) */
- if (RNA_property_type(prop) != PROP_FLOAT)
- fcu->flag |= FCURVE_INT_VALUES;
+ fcu->flag &= ~(FCURVE_INT_VALUES|FCURVE_DISCRETE_VALUES);
+ switch (RNA_property_type(prop)) {
+ case PROP_FLOAT:
+ /* do nothing */
+ break;
+ case PROP_INT:
+ /* do integer (only 'whole' numbers) interpolation between all points */
+ fcu->flag |= FCURVE_INT_VALUES;
+ break;
+ default:
+ /* do 'discrete' (i.e. enum, boolean values which cannot take any intermediate
+ * values at all) interpolation between all points
+ * - however, we must also ensure that evaluated values are only integers still
+ */
+ fcu->flag |= (FCURVE_DISCRETE_VALUES|FCURVE_INT_VALUES);
+ break;
+ }
/* apply special time tweaking */
// XXX check on this stuff...
diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c
index f6d9406e7da..acf712d0147 100644
--- a/source/blender/editors/space_graph/graph_draw.c
+++ b/source/blender/editors/space_graph/graph_draw.c
@@ -748,7 +748,7 @@ void graph_draw_ghost_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, Vie
FCurve *fcu;
/* draw with thick dotted lines */
- setlinestyle(1);
+ setlinestyle(10);
glLineWidth(3.0f);
/* anti-aliased lines for less jagged appearance */
diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h
index f30cd63242a..bf6b9bed5a1 100644
--- a/source/blender/makesdna/DNA_anim_types.h
+++ b/source/blender/makesdna/DNA_anim_types.h
@@ -321,8 +321,10 @@ enum {
/* skip evaluation, as RNA-path cannot be resolved (similar to muting, but cannot be set by user) */
FCURVE_DISABLED = (1<<10),
- /* curve can only have whole-number values (int or boolean types) */
+ /* curve can only have whole-number values (integer types) */
FCURVE_INT_VALUES = (1<<11),
+ /* curve can only have certain discrete-number values (no interpolation at all, for enums/booleans) */
+ FCURVE_DISCRETE_VALUES = (1<<12),
} eFCurve_Flags;
/* extrapolation modes (only simple value 'extending') */