[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