[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20104] branches/blender2.5/blender/source /blender/editors: 2.5 - Restored Various Tools using Markers

Joshua Leung aligorith at gmail.com
Fri May 8 14:51:37 CEST 2009


Revision: 20104
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20104
Author:   aligorith
Date:     2009-05-08 14:51:36 +0200 (Fri, 08 May 2009)

Log Message:
-----------
2.5 - Restored Various Tools using Markers

* Added back a few Marker-API tools
* Restored column select tools using markers (some of these aren't working right yet though).

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c
    branches/blender2.5/blender/source/blender/editors/animation/anim_markers.c
    branches/blender2.5/blender/source/blender/editors/animation/keyframes_edit.c
    branches/blender2.5/blender/source/blender/editors/include/ED_anim_api.h
    branches/blender2.5/blender/source/blender/editors/include/ED_keyframes_edit.h
    branches/blender2.5/blender/source/blender/editors/include/ED_markers.h
    branches/blender2.5/blender/source/blender/editors/space_action/action_edit.c
    branches/blender2.5/blender/source/blender/editors/space_action/action_select.c
    branches/blender2.5/blender/source/blender/editors/space_graph/graph_edit.c
    branches/blender2.5/blender/source/blender/editors/space_graph/graph_select.c

Modified: branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c	2009-05-08 10:50:32 UTC (rev 20103)
+++ branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c	2009-05-08 12:51:36 UTC (rev 20104)
@@ -291,7 +291,12 @@
 	
 	/* get useful default context settings from context */
 	ac->scene= scene;
-	ac->obact= (scene && scene->basact)?  scene->basact->object : NULL;
+	if (scene) {
+		ac->markers.first= scene->markers.first;
+		ac->markers.last= scene->markers.last;
+		
+		ac->obact= (scene->basact)?  scene->basact->object : NULL;
+	}
 	ac->sa= sa;
 	ac->ar= ar;
 	ac->spacetype= (sa) ? sa->spacetype : 0;

Modified: branches/blender2.5/blender/source/blender/editors/animation/anim_markers.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/anim_markers.c	2009-05-08 10:50:32 UTC (rev 20103)
+++ branches/blender2.5/blender/source/blender/editors/animation/anim_markers.c	2009-05-08 12:51:36 UTC (rev 20104)
@@ -46,6 +46,7 @@
 
 #include "BKE_context.h"
 #include "BKE_global.h"
+#include "BKE_fcurve.h"
 #include "BKE_utildefines.h"
 
 #include "WM_api.h"
@@ -83,6 +84,140 @@
 	return &CTX_data_scene(C)->markers;
 }
 
+/* Get the marker that is closest to this point */
+TimeMarker *ED_markers_find_nearest_marker (ListBase *markers, float x) 
+{
+	TimeMarker *marker, *nearest=NULL;
+	float dist, min_dist= 1000000;
+	
+	if (markers) {
+		for (marker= markers->first; marker; marker= marker->next) {
+			dist = ABS((float)marker->frame - x);
+			
+			if (dist < min_dist) {
+				min_dist= dist;
+				nearest= marker;
+			}
+		}
+	}
+	
+	return nearest;
+}
+
+/* Return the time of the marker that occurs on a frame closest to the given time */
+int ED_markers_find_nearest_marker_time (ListBase *markers, float x)
+{
+	TimeMarker *nearest= ED_markers_find_nearest_marker(markers, x);
+	return (nearest) ? (nearest->frame) : (int)floor(x + 0.5f);
+}
+
+
+void ED_markers_get_minmax (ListBase *markers, short sel, float *first, float *last)
+{
+	TimeMarker *marker;
+	float min, max;
+	int selcount = 0;
+	
+	/* sanity check */
+	if (markers == NULL) {
+		*first = 0.0f;
+		*last = 0.0f;
+		return;
+	}
+	
+	if (markers->first && markers->last) {
+		TimeMarker *first= markers->first;
+		TimeMarker *last= markers->last;
+		
+		min= first->frame;
+		max= last->frame;
+	}
+	else {
+		*first = 0.0f;
+		*last = 0.0f;
+		return;
+	}
+	
+	/* count how many markers are usable - see later */
+	if (sel) {
+		for (marker= markers->first; marker; marker= marker->next) {
+			if (marker->flag & SELECT)
+				selcount++;
+		}
+	}
+	else
+		selcount= BLI_countlist(markers);
+	
+	/* if only selected are to be considered, only consider the selected ones
+	 * (optimisation for not searching list) 
+	 */
+	if (selcount > 1) {
+		for (marker= markers->first; marker; marker= marker->next) {
+			if (sel) {
+				if (marker->flag & SELECT) {
+					if (marker->frame < min)
+						min= (float)marker->frame;
+					else if (marker->frame > max)
+						max= (float)marker->frame;
+				}
+			}
+			else {
+				if (marker->frame < min)
+					min= marker->frame;
+				else if (marker->frame > max)
+					max= marker->frame;
+			}	
+		}
+	}
+	
+	/* set the min/max values */
+	*first= min;
+	*last= max;
+}
+
+/* Adds a marker to list of cfra elems */
+void add_marker_to_cfra_elem(ListBase *lb, TimeMarker *marker, short only_sel)
+{
+	CfraElem *ce, *cen;
+	
+	/* should this one only be considered if it is selected? */
+	if ((only_sel) && ((marker->flag & SELECT)==0))
+		return;
+	
+	/* insertion sort - try to find a previous cfra elem */
+	for (ce= lb->first; ce; ce= ce->next) {
+		if (ce->cfra == marker->frame) {
+			/* do because of double keys */
+			if (marker->flag & SELECT) 
+				ce->sel= marker->flag;
+			return;
+		}
+		else if (ce->cfra > marker->frame) break;
+	}	
+	
+	cen= MEM_callocN(sizeof(CfraElem), "add_to_cfra_elem");	
+	if (ce) BLI_insertlinkbefore(lb, ce, cen);
+	else BLI_addtail(lb, cen);
+
+	cen->cfra= marker->frame;
+	cen->sel= marker->flag;
+}
+
+/* This function makes a list of all the markers. The only_sel
+ * argument is used to specify whether only the selected markers
+ * are added.
+ */
+void ED_markers_make_cfra_list(ListBase *markers, ListBase *lb, short only_sel)
+{
+	TimeMarker *marker;
+	
+	if (markers == NULL)
+		return;
+	
+	for (marker= markers->first; marker; marker= marker->next)
+		add_marker_to_cfra_elem(lb, marker, only_sel);
+}
+
 /* ************* Marker Drawing ************ */
 
 /* function to draw markers */
@@ -185,8 +320,6 @@
 	}
 }
 
-
-
 /* ************************** add markers *************************** */
 
 /* add TimeMarker at curent frame */
@@ -598,24 +731,6 @@
 	}
 }
 
-int find_nearest_marker_time (ListBase *markers, float dx)
-{
-	TimeMarker *marker, *nearest= NULL;
-	float dist, min_dist= 1000000;
-	
-	for (marker= markers->first; marker; marker= marker->next) {
-		dist = ABS((float)marker->frame - dx);
-		if (dist < min_dist) {
-			min_dist= dist;
-			nearest= marker;
-		}
-	}
-	
-	if (nearest) return nearest->frame;
-	else return (int)floor(dx); /* hrmf? */
-}
-
-
 static int ed_marker_select(bContext *C, wmEvent *evt, int extend)
 {
 	ListBase *markers= context_get_markers(C);
@@ -631,7 +746,7 @@
 	
 	UI_view2d_region_to_view(v2d, x, y, &viewx, NULL);	
 	
-	cfra= find_nearest_marker_time(markers, viewx);
+	cfra= ED_markers_find_nearest_marker_time(markers, viewx);
 	
 	if (extend)
 		select_timeline_marker_frame(markers, cfra, 1);
@@ -834,9 +949,9 @@
 		}
 	}
 	
-	if(changed) {
+	if (changed)
 		WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
-	}
+	
 	return OPERATOR_FINISHED;
 }
 

Modified: branches/blender2.5/blender/source/blender/editors/animation/keyframes_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/keyframes_edit.c	2009-05-08 10:50:32 UTC (rev 20103)
+++ branches/blender2.5/blender/source/blender/editors/animation/keyframes_edit.c	2009-05-08 12:51:36 UTC (rev 20104)
@@ -382,6 +382,20 @@
 	return 0;
 }
 
+/* helper callback for columnselect_<animeditor>_keys() -> populate list CfraElems with frame numbers from selected beztriples */
+short bezt_to_cfraelem(BeztEditData *bed, BezTriple *bezt)
+{
+	/* only if selected */
+	if (bezt->f2 & SELECT) {
+		CfraElem *ce= MEM_callocN(sizeof(CfraElem), "cfraElem");
+		BLI_addtail(&bed->list, ce);
+		
+		ce->cfra= bezt->vec[1][0];
+	}
+	
+	return 0;
+}
+
 /* ******************************************* */
 /* Transform */
 
@@ -412,15 +426,15 @@
 
 static short snap_bezier_nearmarker(BeztEditData *bed, BezTriple *bezt)
 {
-	//if (bezt->f2 & SELECT)
-	//	bezt->vec[1][0]= (float)find_nearest_marker_time(bezt->vec[1][0]);  // XXX missing function!
+	if (bezt->f2 & SELECT)
+		bezt->vec[1][0]= (float)ED_markers_find_nearest_marker_time(&bed->list, bezt->vec[1][0]);
 	return 0;
 }
 
 static short snap_bezier_horizontal(BeztEditData *bed, BezTriple *bezt)
 {
 	if (bezt->f2 & SELECT) {
-		bezt->vec[0][1]= bezt->vec[2][1]= bezt->vec[1][1];
+		bezt->vec[0][1]= bezt->vec[2][1]= (float)floor(bezt->vec[1][1] + 0.5f);
 		if ((bezt->h1==HD_AUTO) || (bezt->h1==HD_VECT)) bezt->h1= HD_ALIGN;
 		if ((bezt->h2==HD_AUTO) || (bezt->h2==HD_VECT)) bezt->h2= HD_ALIGN;
 	}

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_anim_api.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_anim_api.h	2009-05-08 10:50:32 UTC (rev 20103)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_anim_api.h	2009-05-08 12:51:36 UTC (rev 20104)
@@ -64,6 +64,7 @@
 	
 	struct Scene *scene;	/* active scene */
 	struct Object *obact;	/* active object */
+	ListBase markers;		/* active set of markers */
 } bAnimContext;
 
 /* Main Data container types */

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_keyframes_edit.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_keyframes_edit.h	2009-05-08 10:50:32 UTC (rev 20103)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_keyframes_edit.h	2009-05-08 12:51:36 UTC (rev 20104)
@@ -137,6 +137,7 @@
 /* ----------- BezTriple Callback (Assorted Utilities) ---------- */
 
 short bezt_calc_average(BeztEditData *bed, struct BezTriple *bezt);
+short bezt_to_cfraelem(BeztEditData *bed, struct BezTriple *bezt);
 
 /* ************************************************ */
 /* Destructive Editing API (keyframes_general.c) */

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_markers.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_markers.h	2009-05-08 10:50:32 UTC (rev 20103)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_markers.h	2009-05-08 12:51:36 UTC (rev 20104)
@@ -28,19 +28,31 @@
 #ifndef ED_MARKERS_H
 #define ED_MARKERS_H
 
+struct wmWindowManager;
+struct bContext;
+struct TimeMarker;
 
+/* Drawing API ------------------------------ */
+
 /* flags for drawing markers */
 enum {
 	DRAW_MARKERS_LINES	= (1<<0),
 	DRAW_MARKERS_LOCAL	= (1<<1)
 };
 
-struct wmWindowManager;
-struct bContext;
-
 void draw_markers_time(const struct bContext *C, int flag);
-int find_nearest_marker_time(ListBase *markers, float dx);
 
+/* Backend API ----------------------------- */
+
+struct TimeMarker *ED_markers_find_nearest_marker(ListBase *markers, float x);
+int ED_markers_find_nearest_marker_time(ListBase *markers, float x);
+
+void ED_markers_get_minmax(ListBase *markers, short sel, float *first, float *last);
+
+void ED_markers_make_cfra_list(ListBase *markers, ListBase *lb, short sel);
+
+/* Operators ------------------------------ */
+
 /* called in screen_ops.c:ED_operatortypes_screen() */
 void ED_marker_operatortypes(void); 
 /* called in screen_ops.c:ED_keymap_screen() */

Modified: branches/blender2.5/blender/source/blender/editors/space_action/action_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_action/action_edit.c	2009-05-08 10:50:32 UTC (rev 20103)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list