[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17745] branches/animsys2/source/blender: AnimSys2: View All (HomeKey) in Dopesheet improved

Joshua Leung aligorith at gmail.com
Mon Dec 8 10:16:10 CET 2008


Revision: 17745
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17745
Author:   aligorith
Date:     2008-12-08 10:16:09 +0100 (Mon, 08 Dec 2008)

Log Message:
-----------
AnimSys2: View All (HomeKey) in Dopesheet improved

* Keyframes in IPO's now get considered when doing this
* Vertical placement of view has been improved, though it's still not optimal

Modified Paths:
--------------
    branches/animsys2/source/blender/blenkernel/BKE_ipo.h
    branches/animsys2/source/blender/blenkernel/intern/action.c
    branches/animsys2/source/blender/blenkernel/intern/ipo.c
    branches/animsys2/source/blender/blenloader/intern/readfile.c
    branches/animsys2/source/blender/src/header_action.c
    branches/animsys2/source/blender/src/keyframing.c
    branches/animsys2/source/blender/src/space.c

Modified: branches/animsys2/source/blender/blenkernel/BKE_ipo.h
===================================================================
--- branches/animsys2/source/blender/blenkernel/BKE_ipo.h	2008-12-08 06:17:12 UTC (rev 17744)
+++ branches/animsys2/source/blender/blenkernel/BKE_ipo.h	2008-12-08 09:16:09 UTC (rev 17745)
@@ -103,6 +103,8 @@
 float calc_ipo_time(struct Ipo *ipo, float ctime);
 void calc_ipo(struct Ipo *ipo, float ctime);
 
+void calc_ipo_range(struct Ipo *ipo, float *start, float *end);
+
 /* ------------ Keyframe Column Tools -------------- */
 
 void add_to_cfra_elem(struct ListBase *lb, struct BezTriple *bezt);

Modified: branches/animsys2/source/blender/blenkernel/intern/action.c
===================================================================
--- branches/animsys2/source/blender/blenkernel/intern/action.c	2008-12-08 06:17:12 UTC (rev 17744)
+++ branches/animsys2/source/blender/blenkernel/intern/action.c	2008-12-08 09:16:09 UTC (rev 17745)
@@ -761,33 +761,33 @@
 	dst->ctime= src->ctime;
 }
 
-
+/* Calculate the extents of given action */
 void calc_action_range(const bAction *act, float *start, float *end, int incl_hidden)
 {
-	const bActionChannel *chan;
-	const bConstraintChannel *conchan;
-	const IpoCurve	*icu;
-	float min=999999999.0f, max=-999999999.0;
+	bActionChannel *chan;
+	bConstraintChannel *conchan;
+	IpoCurve *icu;
+	float min=999999999.0f, max=-999999999.0f;
 	int	foundvert=0;
 
-	if(act) {
+	if (act) {
 		for (chan=act->chanbase.first; chan; chan=chan->next) {
-			if(incl_hidden || (chan->flag & ACHAN_HIDDEN)==0) {
-				if(chan->ipo) {
+			if ((incl_hidden) || (chan->flag & ACHAN_HIDDEN)==0) {
+				if (chan->ipo) {
 					for (icu=chan->ipo->curve.first; icu; icu=icu->next) {
-						if(icu->totvert) {
-							min= MIN2 (min, icu->bezt[0].vec[1][0]);
-							max= MAX2 (max, icu->bezt[icu->totvert-1].vec[1][0]);
+						if (icu->totvert) {
+							min= MIN2(min, icu->bezt[0].vec[1][0]);
+							max= MAX2(max, icu->bezt[icu->totvert-1].vec[1][0]);
 							foundvert=1;
 						}
 					}
 				}
 				for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next) {
-					if(conchan->ipo) {
+					if (conchan->ipo) {
 						for (icu=conchan->ipo->curve.first; icu; icu=icu->next) {
-							if(icu->totvert) {
-								min= MIN2 (min, icu->bezt[0].vec[1][0]);
-								max= MAX2 (max, icu->bezt[icu->totvert-1].vec[1][0]);
+							if (icu->totvert) {
+								min= MIN2(min, icu->bezt[0].vec[1][0]);
+								max= MAX2(max, icu->bezt[icu->totvert-1].vec[1][0]);
 								foundvert=1;
 							}
 						}

Modified: branches/animsys2/source/blender/blenkernel/intern/ipo.c
===================================================================
--- branches/animsys2/source/blender/blenkernel/intern/ipo.c	2008-12-08 06:17:12 UTC (rev 17744)
+++ branches/animsys2/source/blender/blenkernel/intern/ipo.c	2008-12-08 09:16:09 UTC (rev 17745)
@@ -586,6 +586,35 @@
 	return ctime;
 }
 
+/* Calculate the extents of IPO block's keyframes */
+void calc_ipo_range (Ipo *ipo, float *start, float *end)
+{
+	IpoCurve *icu;
+	float min=999999999.0f, max=-999999999.0f;
+	short foundvert=0;
+
+	if (ipo) {
+		for (icu=ipo->curve.first; icu; icu=icu->next) {
+			if (icu->totvert) {
+				min= MIN2(min, icu->bezt[0].vec[1][0]);
+				max= MAX2(max, icu->bezt[icu->totvert-1].vec[1][0]);
+				foundvert=1;
+			}
+		}
+	}	
+	
+	/* minimum length is 1 frame */
+	if (foundvert) {
+		if (min == max) max += 1.0f;
+		*start= min;
+		*end= max;
+	}
+	else {
+		*start= 0.0f;
+		*end= 1.0f;
+	}
+}
+
 /* ***************************** IPO Curve Sanity ********************************* */
 /* The functions here are used in various parts of Blender, usually after some editing
  * of keyframe data has occurred. They ensure that keyframe data is properly ordered and

Modified: branches/animsys2/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/animsys2/source/blender/blenloader/intern/readfile.c	2008-12-08 06:17:12 UTC (rev 17744)
+++ branches/animsys2/source/blender/blenloader/intern/readfile.c	2008-12-08 09:16:09 UTC (rev 17745)
@@ -8003,8 +8003,12 @@
 						case SPACE_ACTION:
 						{
 							SpaceAction *sact= (SpaceAction *)sl;
+							
 							sact->mode= SACTCONT_DOPESHEET;
 							sact->autosnap= SACTSNAP_FRAME;
+							
+							sact->v2d.min[1]= -1000.0f;
+							sact->v2d.max[0]= 0.0f;
 						}
 							break;
 						case SPACE_IPO:

Modified: branches/animsys2/source/blender/src/header_action.c
===================================================================
--- branches/animsys2/source/blender/src/header_action.c	2008-12-08 06:17:12 UTC (rev 17744)
+++ branches/animsys2/source/blender/src/header_action.c	2008-12-08 09:16:09 UTC (rev 17745)
@@ -50,6 +50,8 @@
 #include "DNA_screen_types.h"
 #include "DNA_space_types.h"
 
+#include "BLI_blenlib.h"
+
 #include "BIF_gl.h"
 #include "BIF_glutil.h"
 #include "BIF_editaction.h"
@@ -65,6 +67,7 @@
 #include "BKE_armature.h"
 #include "BKE_constraint.h"
 #include "BKE_depsgraph.h"
+#include "BKE_ipo.h"
 #include "BKE_global.h"
 #include "BKE_main.h"
 #include "BKE_utildefines.h"
@@ -230,26 +233,67 @@
 
 void do_action_buttons(unsigned short event)
 {
-	Object *ob= OBACT;
-
 	switch(event) {
 		case B_ACTHOME: /* HOMEKEY in Action Editor */
+		{
+			ListBase act_data = {NULL, NULL};
+			bActListElem *ale;
+			void *data;
+			short datatype;
+			int filter;
+			
+			/* get pointer to data in editor... */
+			data = get_action_context(&datatype);
+			if (data == NULL) return;
+			
 			/*	Find X extents */
-			G.v2d->cur.xmin = 0;
-			G.v2d->cur.ymin=-SCROLLB;
-			
-			if ((G.saction->mode==SACTCONT_ACTION) && (G.saction->action)) {
+			if (ELEM(G.saction->mode, SACTCONT_ACTION, SACTCONT_DOPESHEET)) {
 				float extra;
 				
-				calc_action_range(G.saction->action, &G.v2d->cur.xmin, &G.v2d->cur.xmax, 0);
-				if (G.saction->pin==0 && ob) {
-					G.v2d->cur.xmin= get_action_frame_inv(ob, G.v2d->cur.xmin);
-					G.v2d->cur.xmax= get_action_frame_inv(ob, G.v2d->cur.xmax);
-				}				
-				extra= 0.05*(G.v2d->cur.xmax - G.v2d->cur.xmin);
-				G.v2d->cur.xmin-= extra;
-				G.v2d->cur.xmax+= extra;
-
+				/* get data to filter, from Action or Dopesheet */
+				filter= (ACTFILTER_VISIBLE | ACTFILTER_SEL | ACTFILTER_FOREDIT | ACTFILTER_IPOKEYS);
+				actdata_filter(&act_data, filter, data, datatype);
+				
+				/* set large values to try to override */
+				G.v2d->cur.xmin= 999999999.0f;
+				G.v2d->cur.xmax= -999999999.0f;
+				
+				/* check if any channels to set range with */
+				if (act_data.first) {
+					/* go through channels, finding max extents*/
+					for (ale= act_data.first; ale; ale= ale->next) {
+						Ipo *ipo= (Ipo *)ale->key_data; 
+						float min, max;
+						
+						/* get range and apply necessary scaling before */
+						calc_ipo_range(ipo, &min, &max);
+						
+						if (NLA_CHAN_SCALED(ale)) {
+							Object *nob= (NLA_ACTION_SCALED) ? OBACT : (Object *)ale->id;
+							min= get_action_frame_inv(nob, min);
+							max= get_action_frame_inv(nob, max);
+						}
+						
+						/* try to set cur using these values, if they're more extreme than previously set values */
+						G.v2d->cur.xmin= MIN2(min, G.v2d->cur.xmin);
+						G.v2d->cur.xmax= MAX2(max, G.v2d->cur.xmax);
+					}
+					
+					/* free memory */
+					BLI_freelistN(&act_data);
+				}
+				else {
+					/* set default range */
+					G.v2d->cur.xmin= -5;
+					G.v2d->cur.xmax= 100;
+				}
+				
+				/* add extra offset to the 'cur' rect so that keys will be in view */
+				extra= 0.05f * (G.v2d->cur.xmax - G.v2d->cur.xmin);
+				G.v2d->cur.xmin -= extra;
+				G.v2d->cur.xmax += extra;
+				
+				/* set default range if same frame */
 				if (G.v2d->cur.xmin==G.v2d->cur.xmax) {
 					G.v2d->cur.xmax= -5;
 					G.v2d->cur.xmax= 100;
@@ -257,19 +301,19 @@
 			}
 			else { /* shapekeys and/or no action */
 				G.v2d->cur.xmin= -5.0;
-				G.v2d->cur.xmax= 65.0;
+				G.v2d->cur.xmax= 100.0;
 			}
 			
-			// FIXME: this vertical alignment is bad!
-			G.v2d->cur.ymin= -75.0;
-			G.v2d->cur.ymax= 0.0;
+			/* although view is supposed to go downwards starting from 0, this doesn't seem to be the case... */
+			G.v2d->cur.ymin= -305.0;
+			G.v2d->cur.ymax= -150.0;
 			
 			G.v2d->tot= G.v2d->cur;
 			test_view2d(G.v2d, curarea->winx, curarea->winy);
 			view2d_do_locks(curarea, V2D_LOCK_COPY);
 			
 			addqueue (curarea->win, REDRAW, 1);
-			
+		}	
 			break;
 			
 		/* copy/paste/paste-flip buttons in 3d-view header in PoseMode */

Modified: branches/animsys2/source/blender/src/keyframing.c
===================================================================
--- branches/animsys2/source/blender/src/keyframing.c	2008-12-08 06:17:12 UTC (rev 17744)
+++ branches/animsys2/source/blender/src/keyframing.c	2008-12-08 09:16:09 UTC (rev 17745)
@@ -257,17 +257,13 @@
 	BezTriple *newb;
 	int i= 0;
 	
-	if (icu->bezt == NULL) {
-		icu->bezt= MEM_callocN(sizeof(BezTriple), "beztriple");
-		*(icu->bezt)= *bezt;
-		icu->totvert= 1;
-	}
-	else {
+	if (icu->bezt) {
 		short replace = -1;
 		i = binarysearch_bezt_index(icu->bezt, bezt->vec[1][0], icu->totvert, &replace);
 		
 		if (replace) {			
 			/* sanity check: 'i' may in rare cases exceed arraylen */
+			// FIXME: do not overwrite handletype if just replacing...?
 			if ((i >= 0) && (i < icu->totvert))
 				*(icu->bezt + i) = *bezt;
 		}
@@ -293,7 +289,13 @@
 			icu->totvert++;
 		}
 	}
+	else {
+		icu->bezt= MEM_callocN(sizeof(BezTriple), "beztriple");
+		*(icu->bezt)= *bezt;
+		icu->totvert= 1;
+	}
 	
+	
 	/* we need to return the index, so that some tools which do post-processing can 
 	 * detect where we added the BezTriple in the array
 	 */

Modified: branches/animsys2/source/blender/src/space.c
===================================================================
--- branches/animsys2/source/blender/src/space.c	2008-12-08 06:17:12 UTC (rev 17744)
+++ branches/animsys2/source/blender/src/space.c	2008-12-08 09:16:09 UTC (rev 17745)
@@ -5355,10 +5355,10 @@
 	saction->v2d.cur.ymax= 5.0f;
 
 	saction->v2d.min[0]= 0.0f;
-	saction->v2d.min[1]= 0.0f;
+	saction->v2d.min[1]= -1000.0f;
 
 	saction->v2d.max[0]= MAXFRAMEF;
-	saction->v2d.max[1]= 1000.0f;
+	saction->v2d.max[1]= 0;
 	
 	saction->v2d.minzoom= 0.01f;
 	saction->v2d.maxzoom= 50;





More information about the Bf-blender-cvs mailing list