[Bf-blender-cvs] [198ca57] master: Graph editor:

Antony Riakiotakis noreply at git.blender.org
Mon Apr 13 15:58:06 CEST 2015


Commit: 198ca57ae48fb6860fd82c04e5f1f0a41a5612da
Author: Antony Riakiotakis
Date:   Mon Apr 13 15:57:46 2015 +0200
Branches: master
https://developer.blender.org/rB198ca57ae48fb6860fd82c04e5f1f0a41a5612da

Graph editor:

Normalization feature now uses the full range of the data instead of
just one semiaxis for the maximum size.

===================================================================

M	source/blender/editors/animation/anim_draw.c
M	source/blender/editors/include/ED_anim_api.h
M	source/blender/editors/space_graph/graph_draw.c
M	source/blender/editors/space_graph/graph_edit.c
M	source/blender/editors/space_graph/graph_select.c
M	source/blender/editors/transform/transform_conversions.c
M	source/blender/makesdna/DNA_anim_types.h

===================================================================

diff --git a/source/blender/editors/animation/anim_draw.c b/source/blender/editors/animation/anim_draw.c
index ed294d7..6d0086c 100644
--- a/source/blender/editors/animation/anim_draw.c
+++ b/source/blender/editors/animation/anim_draw.c
@@ -267,19 +267,26 @@ short ANIM_get_normalization_flags(bAnimContext *ac)
 	return 0;
 }
 
-static float normalization_factor_get(Scene *scene, FCurve *fcu, short flag)
+static float normalization_factor_get(Scene *scene, FCurve *fcu, short flag, float *r_offset)
 {
-	float factor = 1.0f;
+	float factor = 1.0f, offset = 0.0f;
 
 	if (flag & ANIM_UNITCONV_RESTORE) {
+		if (r_offset)
+			*r_offset = fcu->prev_offset;
+
 		return 1.0f / fcu->prev_norm_factor;
 	}
 
 	if (flag & ANIM_UNITCONV_NORMALIZE_FREEZE) {
+		if (r_offset)
+			*r_offset = fcu->prev_offset;
 		return fcu->prev_norm_factor;
 	}
 
 	if (G.moving & G_TRANSFORM_FCURVES) {
+		if (r_offset)
+			*r_offset = fcu->prev_offset;
 		return fcu->prev_norm_factor;
 	}
 
@@ -288,6 +295,8 @@ static float normalization_factor_get(Scene *scene, FCurve *fcu, short flag)
 		BezTriple *bezt;
 		int i;
 		float max_coord = -FLT_MAX;
+		float min_coord = FLT_MAX;
+		float range;
 
 		if (fcu->totvert < 1) {
 			return 1.0f;
@@ -296,35 +305,55 @@ static float normalization_factor_get(Scene *scene, FCurve *fcu, short flag)
 		if (PRVRANGEON) {
 			for (i = 0, bezt = fcu->bezt; i < fcu->totvert; i++, bezt++) {
 				if (IN_RANGE_INCL(bezt->vec[1][0], scene->r.psfra, scene->r.pefra)) {
-					max_coord = max_ff(max_coord, fabsf(bezt->vec[0][1]));
-					max_coord = max_ff(max_coord, fabsf(bezt->vec[1][1]));
-					max_coord = max_ff(max_coord, fabsf(bezt->vec[2][1]));
+					max_coord = max_ff(max_coord, bezt->vec[0][1]);
+					max_coord = max_ff(max_coord, bezt->vec[1][1]);
+					max_coord = max_ff(max_coord, bezt->vec[2][1]);
+
+					min_coord = min_ff(min_coord, bezt->vec[0][1]);
+					min_coord = min_ff(min_coord, bezt->vec[1][1]);
+					min_coord = min_ff(min_coord, bezt->vec[2][1]);
 				}
 			}
 		}
 		else {
 			for (i = 0, bezt = fcu->bezt; i < fcu->totvert; i++, bezt++) {
-				max_coord = max_ff(max_coord, fabsf(bezt->vec[0][1]));
-				max_coord = max_ff(max_coord, fabsf(bezt->vec[1][1]));
-				max_coord = max_ff(max_coord, fabsf(bezt->vec[2][1]));
+				max_coord = max_ff(max_coord, bezt->vec[0][1]);
+				max_coord = max_ff(max_coord, bezt->vec[1][1]);
+				max_coord = max_ff(max_coord, bezt->vec[2][1]);
+
+				min_coord = min_ff(min_coord, bezt->vec[0][1]);
+				min_coord = min_ff(min_coord, bezt->vec[1][1]);
+				min_coord = min_ff(min_coord, bezt->vec[2][1]);
 			}
 		}
 
-		if (max_coord > FLT_EPSILON) {
-			factor = 1.0f / max_coord;
+		range = max_coord - min_coord;
+
+		if (range > FLT_EPSILON) {
+			factor = 1.0f / range;
 		}
+		offset = -min_coord - range / 2.0f;
 	}
+
+	if (r_offset) {
+		*r_offset = offset;
+	}
+
 	fcu->prev_norm_factor = factor;
+	fcu->prev_offset = offset;
 	return factor;
 }
 
 /* Get unit conversion factor for given ID + F-Curve */
-float ANIM_unit_mapping_get_factor(Scene *scene, ID *id, FCurve *fcu, short flag)
+float ANIM_unit_mapping_get_factor(Scene *scene, ID *id, FCurve *fcu, short flag, float *r_offset)
 {
 	if (flag & ANIM_UNITCONV_NORMALIZE) {
-		return normalization_factor_get(scene, fcu, flag);
+		return normalization_factor_get(scene, fcu, flag, r_offset);
 	}
 
+	if (r_offset)
+		*r_offset = 0.0f;
+
 	/* sanity checks */
 	if (id && fcu && fcu->rna_path) {
 		PointerRNA ptr, id_ptr;
diff --git a/source/blender/editors/include/ED_anim_api.h b/source/blender/editors/include/ED_anim_api.h
index 9dea66ad..73f2898 100644
--- a/source/blender/editors/include/ED_anim_api.h
+++ b/source/blender/editors/include/ED_anim_api.h
@@ -617,7 +617,7 @@ typedef enum eAnimUnitConv_Flags {
 short ANIM_get_normalization_flags(bAnimContext *ac);
 
 /* Get unit conversion factor for given ID + F-Curve */
-float ANIM_unit_mapping_get_factor(struct Scene *scene, struct ID *id, struct FCurve *fcu, short flag);
+float ANIM_unit_mapping_get_factor(struct Scene *scene, struct ID *id, struct FCurve *fcu, short flag, float *r_offset);
 
 /* ------------- Utility macros ----------------------- */
 
diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c
index 0313ce4..87e7cab 100644
--- a/source/blender/editors/space_graph/graph_draw.c
+++ b/source/blender/editors/space_graph/graph_draw.c
@@ -481,7 +481,7 @@ static void draw_fcurve_curve(bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d
 	ChannelDriver *driver;
 	float samplefreq;
 	float stime, etime;
-	float unitFac;
+	float unitFac, offset;
 	float dx, dy;
 	short mapping_flag = ANIM_get_normalization_flags(ac);
 	int i, n;
@@ -498,7 +498,7 @@ static void draw_fcurve_curve(bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d
 	fcu->driver = NULL;
 	
 	/* compute unit correction factor */
-	unitFac = ANIM_unit_mapping_get_factor(ac->scene, id, fcu, mapping_flag);
+	unitFac = ANIM_unit_mapping_get_factor(ac->scene, id, fcu, mapping_flag, &offset);
 	
 	/* Note about sampling frequency:
 	 *  Ideally, this is chosen such that we have 1-2 pixels = 1 segment
@@ -550,7 +550,7 @@ static void draw_fcurve_curve(bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d
 	n = (etime - stime) / samplefreq + 0.5f;
 	for (i = 0; i <= n; i++) {
 		float ctime = stime + i * samplefreq;
-		glVertex2f(ctime, evaluate_fcurve(fcu, ctime) * unitFac);
+		glVertex2f(ctime, (evaluate_fcurve(fcu, ctime) + offset) * unitFac);
 	}
 	
 	glEnd();
@@ -566,13 +566,14 @@ static void draw_fcurve_curve_samples(bAnimContext *ac, ID *id, FCurve *fcu, Vie
 	FPoint *fpt = prevfpt + 1;
 	float fac, v[2];
 	int b = fcu->totvert - 1;
-	float unit_scale;
+	float unit_scale, offset;
 	short mapping_flag = ANIM_get_normalization_flags(ac);
 
 	/* apply unit mapping */
 	glPushMatrix();
-	unit_scale = ANIM_unit_mapping_get_factor(ac->scene, id, fcu, mapping_flag);
+	unit_scale = ANIM_unit_mapping_get_factor(ac->scene, id, fcu, mapping_flag, &offset);
 	glScalef(1.0f, unit_scale, 1.0f);
+	glTranslatef(0.0f, offset, 0.0f);
 
 	glBegin(GL_LINE_STRIP);
 	
@@ -665,14 +666,15 @@ static void draw_fcurve_curve_bezts(bAnimContext *ac, ID *id, FCurve *fcu, View2
 	float fac = 0.0f;
 	int b = fcu->totvert - 1;
 	int resol;
-	float unit_scale;
+	float unit_scale, offset;
 	short mapping_flag = ANIM_get_normalization_flags(ac);
 	
 	/* apply unit mapping */
 	glPushMatrix();
-	unit_scale = ANIM_unit_mapping_get_factor(ac->scene, id, fcu, mapping_flag);
+	unit_scale = ANIM_unit_mapping_get_factor(ac->scene, id, fcu, mapping_flag, &offset);
 	glScalef(1.0f, unit_scale, 1.0f);
-	
+	glTranslatef(0.0f, offset, 0.0f);
+
 	glBegin(GL_LINE_STRIP);
 	
 	/* extrapolate to left? */
@@ -826,7 +828,8 @@ static void graph_draw_driver_debug(bAnimContext *ac, ID *id, FCurve *fcu)
 	ChannelDriver *driver = fcu->driver;
 	View2D *v2d = &ac->ar->v2d;
 	short mapping_flag = ANIM_get_normalization_flags(ac);
-	float unitfac = ANIM_unit_mapping_get_factor(ac->scene, id, fcu, mapping_flag);
+	float offset;
+	float unitfac = ANIM_unit_mapping_get_factor(ac->scene, id, fcu, mapping_flag, &offset);
 	
 	/* for now, only show when debugging driver... */
 	//if ((driver->flag & DRIVER_FLAG_SHOWDEBUG) == 0)
@@ -850,10 +853,10 @@ static void graph_draw_driver_debug(bAnimContext *ac, ID *id, FCurve *fcu)
 		glBegin(GL_LINES);
 		{
 			t = v2d->cur.xmin;
-			glVertex2f(t, t * unitfac);
+			glVertex2f(t, (t + offset) * unitfac);
 			
 			t = v2d->cur.xmax;
-			glVertex2f(t, t * unitfac); 
+			glVertex2f(t, (t + offset) * unitfac);
 		}
 		glEnd();
 		
@@ -1067,10 +1070,12 @@ void graph_draw_curves(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGrid
 			}
 			else if (((fcu->bezt) || (fcu->fpt)) && (fcu->totvert)) {
 				short mapping_flag = ANIM_get_normalization_flags(ac);
-				float unit_scale = ANIM_unit_mapping_get_factor(ac->scene, ale->id, fcu, mapping_flag);
+				float offset;
+				float unit_scale = ANIM_unit_mapping_get_factor(ac->scene, ale->id, fcu, mapping_flag, &offset);
 
 				glPushMatrix();
 				glScalef(1.0f, unit_scale, 1.0f);
+				glTranslatef(0.0f, offset, 0.0f);
 
 				if (fcu->bezt) {
 					bool do_handles = draw_fcurve_handles_check(sipo, fcu);
diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c
index 0dba9cc..80503a7 100644
--- a/source/blender/editors/space_graph/graph_edit.c
+++ b/source/blender/editors/space_graph/graph_edit.c
@@ -109,7 +109,7 @@ void get_graph_keyframe_extents(bAnimContext *ac, float *xmin, float *xmax, floa
 			AnimData *adt = ANIM_nla_mapping_get(ac, ale);
 			FCurve *fcu = (FCurve *)ale->key_data;
 			float txmin, txmax, tymin, tymax;
-			float unitFac;
+			float unitFac, offset;
 			
 			/* get range */
 			if (calc_fcurve_bounds(fcu, &txmin, &txmax, &tymin, &tymax, do_sel_only, include_handles)) {
@@ -122,7 +122,9 @@ void get_graph_keyframe_extents(bAnimContext *ac, float *xmin, float *xmax, floa
 				}
 				
 				/* apply unit corrections */
-				unitFac = ANIM_unit_mapping_get_factor(ac->scene, ale->id, fcu, mapping_flag);
+				unitFac = ANIM_unit_mapping_get_factor(ac->scene, ale->id, fcu, mapping_flag, &offset);
+				tymin += offset;
+				tymax += offset;
 				tymin *= unitFac;
 				tymax *= unitFac;
 				
@@ -350,7 +352,7 @@ static void create_ghost_curves(bAnimContext *ac, int start, int end)
 		AnimData *adt = ANIM_nla_mapping_get(ac, ale);
 		ChannelDriver *driver = fcu->driver;
 		FPoint *fpt;
-		float unitFac;
+		float unitFac, offset;
 		int cfra;
 		SpaceIpo *sipo = (SpaceIpo *) ac->sl;
 		short mapping_flag = ANIM_get_normalization_flags(ac);
@@ -359,7 +361,7 @@ static void create_ghost_curves(bAnimContext *ac, int start, int end)
 		fcu->driver = NULL;
 		
 		/* calculate unit-mapping factor */
-		unitFac = ANIM_unit_mapping_get_factor(ac->scene, ale->id, fcu, mapping_flag);
+		unitFac = ANIM_unit_mapping_get_factor(ac->scene, ale->id, fcu, mapping_flag, &offset);
 		
 		/* create samples, but store them in a new curve 
 		 *	- we cannot use fcurve_store_samples() as that will only overwrite the original curve 
@@ -372,7 +374,7 @@ static void create_ghost_curves(bAnimContext *ac, int start, int end)
 			float cfra

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list