forked from bartvdbraak/blender
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).
This commit is contained in:
parent
7e29e97c21
commit
4f0dc8abbf
@ -291,7 +291,12 @@ short ANIM_animdata_get_context (const bContext *C, bAnimContext *ac)
|
||||
|
||||
/* 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;
|
||||
|
@ -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 @@ static ListBase *context_get_markers(const bContext *C)
|
||||
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 @@ void draw_markers_time(const bContext *C, int flag)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ************************** add markers *************************** */
|
||||
|
||||
/* add TimeMarker at curent frame */
|
||||
@ -598,24 +731,6 @@ static void select_timeline_marker_frame(ListBase *markers, int frame, unsigned
|
||||
}
|
||||
}
|
||||
|
||||
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 @@ static int ed_marker_select(bContext *C, wmEvent *evt, int extend)
|
||||
|
||||
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 @@ static int ed_marker_delete_exec(bContext *C, wmOperator *op)
|
||||
}
|
||||
}
|
||||
|
||||
if(changed) {
|
||||
if (changed)
|
||||
WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
|
||||
}
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
|
@ -382,6 +382,20 @@ short bezt_calc_average(BeztEditData *bed, BezTriple *bezt)
|
||||
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_cframe(BeztEditData *bed, BezTriple *bezt)
|
||||
|
||||
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;
|
||||
}
|
||||
|
@ -64,6 +64,7 @@ typedef struct bAnimContext {
|
||||
|
||||
struct Scene *scene; /* active scene */
|
||||
struct Object *obact; /* active object */
|
||||
ListBase markers; /* active set of markers */
|
||||
} bAnimContext;
|
||||
|
||||
/* Main Data container types */
|
||||
|
@ -137,6 +137,7 @@ BeztEditFunc ANIM_editkeyframes_ipo(short mode);
|
||||
/* ----------- 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) */
|
||||
|
@ -28,6 +28,11 @@
|
||||
#ifndef ED_MARKERS_H
|
||||
#define ED_MARKERS_H
|
||||
|
||||
struct wmWindowManager;
|
||||
struct bContext;
|
||||
struct TimeMarker;
|
||||
|
||||
/* Drawing API ------------------------------ */
|
||||
|
||||
/* flags for drawing markers */
|
||||
enum {
|
||||
@ -35,11 +40,18 @@ enum {
|
||||
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);
|
||||
|
@ -1118,6 +1118,7 @@ static void snap_action_keys(bAnimContext *ac, short mode)
|
||||
|
||||
memset(&bed, 0, sizeof(BeztEditData));
|
||||
bed.scene= ac->scene;
|
||||
bed.list= ac->scene->markers; /* for marker-snapping option */
|
||||
|
||||
/* snap keyframes */
|
||||
for (ale= anim_data.first; ale; ale= ale->next) {
|
||||
|
@ -74,6 +74,7 @@
|
||||
#include "ED_keyframing.h"
|
||||
#include "ED_keyframes_draw.h"
|
||||
#include "ED_keyframes_edit.h"
|
||||
#include "ED_markers.h"
|
||||
#include "ED_screen.h"
|
||||
#include "ED_space_api.h"
|
||||
|
||||
@ -394,11 +395,8 @@ static void markers_selectkeys_between (bAnimContext *ac)
|
||||
float min, max;
|
||||
|
||||
/* get extreme markers */
|
||||
//get_minmax_markers(1, &min, &max); // FIXME... add back markers api!
|
||||
min= (float)ac->scene->r.sfra; // xxx temp code
|
||||
max= (float)ac->scene->r.efra; // xxx temp code
|
||||
ED_markers_get_minmax(&ac->markers, 1, &min, &max);
|
||||
|
||||
if (min==max) return;
|
||||
min -= 0.5f;
|
||||
max += 0.5f;
|
||||
|
||||
@ -431,21 +429,6 @@ static void markers_selectkeys_between (bAnimContext *ac)
|
||||
}
|
||||
|
||||
|
||||
/* helper callback for columnselect_action_keys() -> populate list CfraElems with frame numbers from selected beztriples */
|
||||
// TODO: if some other code somewhere needs this, it'll be time to port this over to keyframes_edit.c!!!
|
||||
static 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;
|
||||
}
|
||||
|
||||
/* Selects all visible keyframes in the same frames as the specified elements */
|
||||
static void columnselect_action_keys (bAnimContext *ac, short mode)
|
||||
{
|
||||
@ -490,9 +473,7 @@ static void columnselect_action_keys (bAnimContext *ac, short mode)
|
||||
break;
|
||||
|
||||
case ACTKEYS_COLUMNSEL_MARKERS_COLUMN: /* list of selected markers */
|
||||
// FIXME: markers api needs to be improved for this first!
|
||||
//make_marker_cfra_list(&elems, 1);
|
||||
return; // XXX currently, this does nothing!
|
||||
ED_markers_make_cfra_list(&ac->markers, &bed.list, 1);
|
||||
break;
|
||||
|
||||
default: /* invalid option */
|
||||
@ -509,7 +490,7 @@ static void columnselect_action_keys (bAnimContext *ac, short mode)
|
||||
if (ac->datatype == ANIMCONT_GPENCIL)
|
||||
filter= (ANIMFILTER_VISIBLE);
|
||||
else
|
||||
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY);
|
||||
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY);
|
||||
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
|
||||
|
||||
for (ale= anim_data.first; ale; ale= ale->next) {
|
||||
|
@ -1388,7 +1388,7 @@ static void snap_graph_keys(bAnimContext *ac, short mode)
|
||||
BeztEditFunc edit_cb;
|
||||
|
||||
/* filter data */
|
||||
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY);
|
||||
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY);
|
||||
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
|
||||
|
||||
/* get beztriple editing callbacks */
|
||||
@ -1396,6 +1396,7 @@ static void snap_graph_keys(bAnimContext *ac, short mode)
|
||||
|
||||
memset(&bed, 0, sizeof(BeztEditData));
|
||||
bed.scene= ac->scene;
|
||||
bed.list= ac->markers; /* for marker-snapping option */
|
||||
|
||||
/* snap keyframes */
|
||||
for (ale= anim_data.first; ale; ale= ale->next) {
|
||||
@ -1486,11 +1487,10 @@ static void mirror_graph_keys(bAnimContext *ac, short mode)
|
||||
/* for 'first selected marker' mode, need to find first selected marker first! */
|
||||
// XXX should this be made into a helper func in the API?
|
||||
if (mode == GRAPHKEYS_MIRROR_MARKER) {
|
||||
Scene *scene= ac->scene;
|
||||
TimeMarker *marker= NULL;
|
||||
|
||||
/* find first selected marker */
|
||||
for (marker= scene->markers.first; marker; marker=marker->next) {
|
||||
for (marker= ac->markers.first; marker; marker=marker->next) {
|
||||
if (marker->flag & SELECT) {
|
||||
break;
|
||||
}
|
||||
|
@ -73,6 +73,7 @@
|
||||
#include "ED_keyframing.h"
|
||||
#include "ED_keyframes_draw.h"
|
||||
#include "ED_keyframes_edit.h"
|
||||
#include "ED_markers.h"
|
||||
#include "ED_screen.h"
|
||||
#include "ED_space_api.h"
|
||||
|
||||
@ -358,11 +359,8 @@ static void markers_selectkeys_between (bAnimContext *ac)
|
||||
float min, max;
|
||||
|
||||
/* get extreme markers */
|
||||
//get_minmax_markers(1, &min, &max); // FIXME... add back markers api!
|
||||
min= (float)ac->scene->r.sfra; // xxx temp code
|
||||
max= (float)ac->scene->r.efra; // xxx temp code
|
||||
ED_markers_get_minmax(&ac->markers, 1, &min, &max);
|
||||
|
||||
if (min==max) return;
|
||||
min -= 0.5f;
|
||||
max += 0.5f;
|
||||
|
||||
@ -395,21 +393,6 @@ static void markers_selectkeys_between (bAnimContext *ac)
|
||||
}
|
||||
|
||||
|
||||
/* helper callback for columnselect_graph_keys() -> populate list CfraElems with frame numbers from selected beztriples */
|
||||
// TODO: if some other code somewhere needs this, it'll be time to port this over to keyframes_edit.c!!!
|
||||
static 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;
|
||||
}
|
||||
|
||||
/* Selects all visible keyframes in the same frames as the specified elements */
|
||||
static void columnselect_graph_keys (bAnimContext *ac, short mode)
|
||||
{
|
||||
@ -446,9 +429,7 @@ static void columnselect_graph_keys (bAnimContext *ac, short mode)
|
||||
break;
|
||||
|
||||
case GRAPHKEYS_COLUMNSEL_MARKERS_COLUMN: /* list of selected markers */
|
||||
// FIXME: markers api needs to be improved for this first!
|
||||
//make_marker_cfra_list(&elems, 1);
|
||||
return; // XXX currently, this does nothing!
|
||||
ED_markers_make_cfra_list(&ac->markers, &bed.list, 1);
|
||||
break;
|
||||
|
||||
default: /* invalid option */
|
||||
|
Loading…
Reference in New Issue
Block a user