Camera tracking integration

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

DeBalie commit (main changes only):

- Code cleanup
- Selectable tracking graph curves and curve knots
- Graph curve and curve knots can be deleted now
- Fixed wrong write when linking libraries
  (error is caused by hardcoded cound of linkable ID blocks)
- Fixed for KLT tracker when using keyframe adjustment
This commit is contained in:
Sergey Sharybin 2011-10-29 07:14:31 +00:00
parent f385e54a48
commit 9d2caba92e
23 changed files with 1009 additions and 365 deletions

@ -198,7 +198,7 @@ void savePNGImage(png_bytep *row_pointers, int width, int height, int depth, int
fclose(fp);
}
static void saveImage(libmv::FloatImage image, int x0, int y0)
static void saveImage(char *prefix, libmv::FloatImage image, int x0, int y0)
{
int x, y;
png_bytep *row_pointers;
@ -228,7 +228,7 @@ static void saveImage(libmv::FloatImage image, int x0, int y0)
{
static int a= 0;
char buf[128];
snprintf(buf, sizeof(buf), "%02d.png", ++a);
snprintf(buf, sizeof(buf), "%s_%02d.png", prefix, ++a);
savePNGImage(row_pointers, image.Width(), image.Height(), 8, PNG_COLOR_TYPE_RGBA, buf);
}
@ -238,7 +238,7 @@ static void saveImage(libmv::FloatImage image, int x0, int y0)
free(row_pointers);
}
static void saveBytesImage(unsigned char *data, int width, int height)
static void saveBytesImage(char *prefix, unsigned char *data, int width, int height)
{
int x, y;
png_bytep *row_pointers;
@ -260,7 +260,7 @@ static void saveBytesImage(unsigned char *data, int width, int height)
{
static int a= 0;
char buf[128];
snprintf(buf, sizeof(buf), "%02d.png", ++a);
snprintf(buf, sizeof(buf), "%s_%02d.png", prefix, ++a);
savePNGImage(row_pointers, width, height, 8, PNG_COLOR_TYPE_RGBA, buf);
}
@ -295,8 +295,8 @@ int libmv_regionTrackerTrack(libmv_RegionTracker *libmv_tracker, const float *im
int result = region_tracker->Track(old_patch, new_patch, x1, y1, x2, y2);
if (!result) {
saveImage(old_patch, x1, y1);
saveImage(new_patch, sx2, sy2);
saveImage("old_patch", old_patch, x1, y1);
saveImage("new_patch", new_patch, sx2, sy2);
}
return result;

@ -1190,6 +1190,7 @@ static void emDM_getVert(DerivedMesh *dm, int index, MVert *vert_r)
/* TODO what to do with vert_r->flag? */
vert_r->bweight = (unsigned char) (ev->bweight*255.0f);
vert_r->flag= ev->f;
}
static void emDM_getEdge(DerivedMesh *dm, int index, MEdge *edge_r)

@ -83,7 +83,7 @@ static int sequence_guess_offset(const char *full_name, int head_len, int numlen
{
char num[FILE_MAX]= {0};
BLI_strncpy(num, full_name+head_len, numlen);
BLI_strncpy(num, full_name+head_len, numlen+1);
return atoi(num);
}
@ -387,12 +387,12 @@ static MovieClip *movieclip_alloc(const char *name)
clip->tracking.settings.keyframe1= 1;
clip->tracking.settings.keyframe2= 30;
clip->tracking.settings.dist= 1;
clip->tracking.settings.corr= 0.75;
clip->tracking.settings.corr= 0.75f;
clip->tracking.stabilization.scaleinf= 1.f;
clip->tracking.stabilization.locinf= 1.f;
clip->tracking.stabilization.rotinf= 1.f;
clip->tracking.stabilization.maxscale= 2.f;
clip->tracking.stabilization.scaleinf= 1.0f;
clip->tracking.stabilization.locinf= 1.0f;
clip->tracking.stabilization.rotinf= 1.0f;
clip->tracking.stabilization.maxscale= 2.0f;
clip->proxy.build_size_flag= IMB_PROXY_25;
clip->proxy.build_tc_flag= IMB_TC_RECORD_RUN|IMB_TC_FREE_RUN|IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN;
@ -454,7 +454,7 @@ MovieClip *BKE_add_movieclip_file(const char *name)
clip->tracking.camera.principal[0]= ((float)width)/2;
clip->tracking.camera.principal[1]= ((float)height)/2;
clip->tracking.camera.focal= 24.f*width/clip->tracking.camera.sensor_width;
clip->tracking.camera.focal= 24.0f*width/clip->tracking.camera.sensor_width;
}
return clip;
@ -473,13 +473,13 @@ static void real_ibuf_size(MovieClip *clip, MovieClipUser *user, ImBuf *ibuf, in
break;
case MCLIP_PROXY_RENDER_SIZE_50:
(*width)*= 2;
(*height)*= 2;
(*width)*= 2.0f;
(*height)*= 2.0f;
break;
case MCLIP_PROXY_RENDER_SIZE_75:
*width= ((float)*width)*4.f/3.f;
*height= ((float)*height)*4.f/3.f;
*width= ((float)*width)*4.0f/3.0f;
*height= ((float)*height)*4.0f/3.0f;
break;
}
}
@ -535,9 +535,9 @@ static ImBuf *get_undistorted_ibuf(MovieClip *clip, struct MovieDistortion *dist
imb_freerectfloatImBuf(ibuf);
if(distoriton)
undistibuf= BKE_tracking_distortion_exec(distoriton, &clip->tracking, ibuf, ibuf->x, ibuf->y, 0.f, 1);
undistibuf= BKE_tracking_distortion_exec(distoriton, &clip->tracking, ibuf, ibuf->x, ibuf->y, 0.0f, 1);
else
undistibuf= BKE_tracking_undistort(&clip->tracking, ibuf, ibuf->x, ibuf->y, 0.f);
undistibuf= BKE_tracking_undistort(&clip->tracking, ibuf, ibuf->x, ibuf->y, 0.0f);
if(undistibuf->userflags|= IB_RECT_INVALID) {
ibuf->userflags&= ~IB_RECT_INVALID;
@ -645,7 +645,6 @@ ImBuf *BKE_movieclip_get_ibuf_flag(MovieClip *clip, MovieClipUser *user, int fla
cache_undistorted= 1;
}
/* cache is supposed to be threadsafe */
ibuf= get_imbuf_cache(clip, user, flag);
if(!ibuf) {
@ -730,8 +729,8 @@ ImBuf *BKE_movieclip_get_stable_ibuf(MovieClip *clip, MovieClipUser *user, float
if(angle) *angle= tangle;
} else {
if(loc) zero_v2(loc);
if(scale) *scale= 1.f;
if(angle) *angle= 0.f;
if(scale) *scale= 1.0f;
if(angle) *angle= 0.0f;
stableibuf= ibuf;
}
@ -895,7 +894,7 @@ void BKE_movieclip_update_scopes(MovieClip *clip, MovieClipUser *user, MovieClip
if(user->render_flag&MCLIP_PROXY_RENDER_UNDISTORT) {
int width, height;
float aspy= 1.f/clip->tracking.camera.pixel_aspect;;
float aspy= 1.0f/clip->tracking.camera.pixel_aspect;;
BKE_movieclip_get_size(clip, user, &width, &height);
@ -944,8 +943,8 @@ static void movieclip_build_proxy_ibuf(MovieClip *clip, ImBuf *ibuf, int cfra, i
get_proxy_fname(clip, proxy_render_size, undistorted, cfra, name);
rectx= ibuf->x*size/100.f;
recty= ibuf->y*size/100.f;
rectx= ibuf->x*size/100.0f;
recty= ibuf->y*size/100.0f;
scaleibuf= IMB_dupImBuf(ibuf);

@ -42,6 +42,7 @@
#include "BLI_utildefines.h"
#include "BLI_math.h"
#include "BLI_math_base.h"
#include "BLI_listbase.h"
#include "BLI_ghash.h"
#include "BLI_path_util.h"
@ -131,8 +132,8 @@ void BKE_tracking_clamp_track(MovieTrackingTrack *track, int event)
sub_v2_v2v2(dim, track->pat_max, track->pat_min);
for(a= 0; a<2; a++) {
track->pat_min[a]= -dim[a]/2.f;
track->pat_max[a]= dim[a]/2.f;
track->pat_min[a]= -dim[a]/2.0f;
track->pat_max[a]= dim[a]/2.0f;
}
}
}
@ -163,11 +164,11 @@ MovieTrackingTrack *BKE_tracking_add_track(MovieTracking *tracking, float x, flo
/* XXX: not very nice to have such check here, but it will prevent
complaints about bad default settings for new markers */
if(tracking->settings.tracker==TRACKER_SAD) {
pat[0]= 8.f;
pat[1]= 8.f;
pat[0]= 8.0f;
pat[1]= 8.0f;
search[0]= 32.f;
search[1]= 32.f;
search[0]= 32.0f;
search[1]= 32.0f;
}
pat[0] /= (float)width;
@ -478,6 +479,8 @@ typedef struct TrackContext {
MovieTrackingTrack *track;
#ifdef WITH_LIBMV
float keyframed_pos[2];
/* ** KLT tracker ** */
struct libmv_RegionTracker *region_tracker;
float *patch; /* keyframed patch */
@ -670,16 +673,12 @@ static ImBuf *get_area_imbuf(ImBuf *ibuf, MovieTrackingTrack *track, MovieTracki
w= (x2-x1)|1;
h= (y2-y1)|1;
/* happens due to rounding issues */
if(x1+w<=x) x1++;
if(y1+h<=y) y1++;
tmpibuf= IMB_allocImBuf(w+margin*2, h+margin*2, 32, IB_rect);
IMB_rectcpy(tmpibuf, ibuf, 0, 0, x1-margin, y1-margin, w+margin*2, h+margin*2);
if(pos != NULL) {
pos[0]= x-x1+(mpos[0]*ibuf->x-x)+margin;
pos[1]= y-y1+(mpos[1]*ibuf->y-y)+margin;
pos[0]= mpos[0]*ibuf->x-x1+margin;
pos[1]= mpos[1]*ibuf->y-y1+margin;
}
if(origin != NULL) {
@ -731,7 +730,7 @@ static float *get_search_floatbuf(ImBuf *ibuf, MovieTrackingTrack *track, MovieT
*fp= 0.2126*rrgbf[0] + 0.7152*rrgbf[1] + 0.0722*rrgbf[2];
} else {
char *rrgb= (char*)tmpibuf->rect + pixel*4;
unsigned char *rrgb= (unsigned char*)tmpibuf->rect + pixel*4;
*fp= (0.2126*rrgb[0] + 0.7152*rrgb[1] + 0.0722*rrgb[2])/255.0f;
}
@ -986,7 +985,7 @@ int BKE_tracking_next(MovieTrackingContext *context)
double x1, y1, x2, y2;
ImBuf *ibuf= NULL;
MovieTrackingMarker marker_new, *marker_keyed;
int onbound= 0;
int onbound= 0, coords_correct= 0;
if(!context->settings.adjframes) need_readjust= context->first_time;
else need_readjust= context->frames%context->settings.adjframes == 0;
@ -998,8 +997,8 @@ int BKE_tracking_next(MovieTrackingContext *context)
margin[1]= MAX2(margin[1], (float)context->settings.margin / ibuf_new->y);
/* do not track markers which are too close to boundary */
if(marker->pos[0]<margin[0] || marker->pos[0]>1.f-margin[0] ||
marker->pos[1]<margin[1] || marker->pos[1]>1.f-margin[1]) {
if(marker->pos[0]<margin[0] || marker->pos[0]>1.0f-margin[0] ||
marker->pos[1]<margin[1] || marker->pos[1]>1.0f-margin[1]) {
onbound= 1;
}
else if(context->settings.tracker==TRACKER_KLT) {
@ -1013,18 +1012,18 @@ int BKE_tracking_next(MovieTrackingContext *context)
if(track_context->patch)
MEM_freeN(track_context->patch);
track_context->patch= get_search_floatbuf(ibuf, track, marker_keyed, &width, &height, pos, origin);
track_context->patch= get_search_floatbuf(ibuf, track, marker_keyed, &width, &height, track_context->keyframed_pos, origin);
IMB_freeImBuf(ibuf);
}
patch_new= get_search_floatbuf(ibuf_new, track, marker, &width, &height, pos, origin);
x1= pos[0];
y1= pos[1];
x1= track_context->keyframed_pos[0];
y1= track_context->keyframed_pos[1];
x2= x1;
y2= y1;
x2= pos[0];
y2= pos[1];
wndx= (int)((track->pat_max[0]-track->pat_min[0])*ibuf_new->x)/2;
wndy= (int)((track->pat_max[1]-track->pat_min[1])*ibuf_new->y)/2;
@ -1100,7 +1099,8 @@ int BKE_tracking_next(MovieTrackingContext *context)
MEM_freeN(image_new);
}
if(tracked || !context->disable_failed) {
coords_correct= !isnan(x2) && !isnan(y2) && finite(x2) && finite(y2);
if(coords_correct && (tracked || !context->disable_failed)) {
if(context->first_time) {
int prevframe;
@ -1113,6 +1113,7 @@ int BKE_tracking_next(MovieTrackingContext *context)
marker_new= *marker;
marker_new.framenr= prevframe;
marker_new.flag&= ~MARKER_GRAPH_SEL;
marker_new.flag|= MARKER_DISABLED;
#pragma omp critical
@ -1201,7 +1202,7 @@ static int retrieve_libmv_reconstruct(MovieTracking *tracking, struct libmv_Reco
MovieTrackingTrack *track;
MovieTrackingReconstruction *reconstruction= &tracking->reconstruction;
MovieReconstructedCamera *reconstructed;
float origin[3]= {0.0f, 0.f, 0.0f};
float origin[3]= {0.0f, 0.0f, 0.0f};
int ok= 1;
track= tracking->tracks.first;
@ -1295,7 +1296,7 @@ float BKE_tracking_solve_reconstruction(MovieTracking *tracking, int width, int
#if WITH_LIBMV
{
MovieTrackingCamera *camera= &tracking->camera;
float aspy= 1.f/tracking->camera.pixel_aspect;
float aspy= 1.0f/tracking->camera.pixel_aspect;
struct libmv_Tracks *tracks= create_libmv_tracks(tracking, width, height*aspy);
struct libmv_Reconstruction *reconstruction = libmv_solveReconstruction(tracks,
tracking->settings.keyframe1, tracking->settings.keyframe2,
@ -1307,7 +1308,7 @@ float BKE_tracking_solve_reconstruction(MovieTracking *tracking, int width, int
tracking->reconstruction.error= error;
if(!retrieve_libmv_reconstruct(tracking, reconstruction))
error= -1.f;
error= -1.0f;
libmv_destroyReconstruction(reconstruction);
libmv_tracksDestroy(tracks);
@ -1441,7 +1442,7 @@ void BKE_tracking_projection_matrix(MovieTracking *tracking, int framenr, int wi
float lens= tracking->camera.focal*tracking->camera.sensor_width/(float)winx;
float viewfac, pixsize, left, right, bottom, top, clipsta, clipend;
float winmat[4][4];
float ycor= 1.f/tracking->camera.pixel_aspect;
float ycor= 1.0f/tracking->camera.pixel_aspect;
clipsta= 0.1f;
clipend= 1000.0f;
@ -1475,7 +1476,7 @@ void BKE_tracking_apply_intrinsics(MovieTracking *tracking, float co[2], float n
#ifdef WITH_LIBMV
double x, y;
float aspy= 1.f/tracking->camera.pixel_aspect;
float aspy= 1.0f/tracking->camera.pixel_aspect;
/* normalize coords */
x= (co[0]-camera->principal[0]) / camera->focal;
@ -1496,7 +1497,7 @@ void BKE_tracking_invert_intrinsics(MovieTracking *tracking, float co[2], float
#ifdef WITH_LIBMV
double x= co[0], y= co[1];
float aspy= 1.f/tracking->camera.pixel_aspect;
float aspy= 1.0f/tracking->camera.pixel_aspect;
libmv_InvertIntrinsics(camera->focal, camera->principal[0], camera->principal[1] * aspy,
camera->k1, camera->k2, camera->k3, x, y, &x, &y);
@ -1651,8 +1652,8 @@ static int stabilization_median_point(MovieTracking *tracking, int framenr, floa
track= track->next;
}
median[0]= (max[0]+min[0])/2.f;
median[1]= (max[1]+min[1])/2.f;
median[0]= (max[0]+min[0])/2.0f;
median[1]= (max[1]+min[1])/2.0f;
return ok;
}
@ -1662,8 +1663,8 @@ static void calculate_stabdata(MovieTracking *tracking, int framenr, float width
{
MovieTrackingStabilization *stab= &tracking->stabilization;
*scale= (stab->scale-1.f)*stab->scaleinf+1.f;
*angle= 0.f;
*scale= (stab->scale-1.0f)*stab->scaleinf+1.0f;
*angle= 0.0f;
loc[0]= (firstmedian[0]-median[0])*width*(*scale);
loc[1]= (firstmedian[1]-median[1])*height*(*scale);
@ -1673,7 +1674,7 @@ static void calculate_stabdata(MovieTracking *tracking, int framenr, float width
if(stab->rot_track && stab->rotinf) {
MovieTrackingMarker *marker;
float a[2], b[2];
float x0= (float)width/2.f, y0= (float)height/2.f;
float x0= (float)width/2.0f, y0= (float)height/2.0f;
float x= median[0]*width, y= median[1]*height;
marker= BKE_tracking_get_marker(stab->rot_track, 1);
@ -1705,10 +1706,10 @@ static float stabilization_auto_scale_factor(MovieTracking *tracking, int width,
if(stabilization_median_point(tracking, 1, firstmedian)) {
int sfra= INT_MAX, efra= INT_MIN, cfra;
float delta[2]= {0.f, 0.f}, scalex= 1.f, scaley= 1.f;
float delta[2]= {0.0f, 0.0f}, scalex= 1.0f, scaley= 1.0f;
MovieTrackingTrack *track;
stab->scale= 1.f;
stab->scale= 1.0f;
track= tracking->tracks.first;
while(track) {
@ -1731,30 +1732,30 @@ static float stabilization_auto_scale_factor(MovieTracking *tracking, int width,
calculate_stabdata(tracking, cfra, width, height, firstmedian, median,
loc, &scale, &angle);
if(angle==0.f) {
if(angle==0.0f) {
loc[0]= fabsf(loc[0]);
loc[1]= fabsf(loc[1]);
delta[0]= MAX2(delta[0], loc[0]);
delta[1]= MAX2(delta[1], loc[1]);
near[0]= MIN2(median[0], 1.f-median[0]);
near[1]= MIN2(median[1], 1.f-median[1]);
near[0]= MAX2(near[0], 0.05);
near[1]= MAX2(near[1], 0.05);
near[0]= MIN2(median[0], 1.0f-median[0]);
near[1]= MIN2(median[1], 1.0f-median[1]);
near[0]= MAX2(near[0], 0.05f);
near[1]= MAX2(near[1], 0.05f);
scalex= 1.f+delta[0]/(near[0]*width);
scaley= 1.f+delta[1]/(near[1]*height);
scalex= 1.0f+delta[0]/(near[0]*width);
scaley= 1.0f+delta[1]/(near[1]*height);
} else {
int i;
float mat[4][4];
float points[4][2]={{0.f, 0.f}, {0.f, height}, {width, height}, {width, 0.f}};
float points[4][2]={{0.0f, 0.0f}, {0.0f, height}, {width, height}, {width, 0.0f}};
BKE_tracking_stabdata_to_mat4(width, height, loc, scale, angle, mat);
for(i= 0; i<4; i++) {
int j;
float a[3]= {0.f}, b[3]= {0.f};
float a[3]= {0.0f, 0.0f, 0.0f}, b[3]= {0.0f, 0.0f, 0.0f};
copy_v3_v3(a, points[i]);
copy_v3_v3(b, points[(i+1)%4]);
@ -1763,13 +1764,13 @@ static float stabilization_auto_scale_factor(MovieTracking *tracking, int width,
mul_m4_v3(mat, b);
for(j= 0; j<4; j++) {
float point[3]= {points[j][0], points[j][1], 0.f};
float point[3]= {points[j][0], points[j][1], 0.0f};
float v1[3], v2[3];
sub_v3_v3v3(v1, b, a);
sub_v3_v3v3(v2, point, a);
if(cross_v2v2(v1, v2) >= 0.f) {
if(cross_v2v2(v1, v2) >= 0.0f) {
float dist= dist_to_line_v2(point, a, b);
if(i%2==0) {
scalex= MAX2(scalex, (width+2*dist)/width);
@ -1784,10 +1785,10 @@ static float stabilization_auto_scale_factor(MovieTracking *tracking, int width,
stab->scale= MAX2(scalex, scaley);
if(stab->maxscale>0.f)
if(stab->maxscale>0.0f)
stab->scale= MIN2(stab->scale, stab->maxscale);
} else {
stab->scale= 1.f;
stab->scale= 1.0f;
}
stab->ok= 1;
@ -1811,7 +1812,7 @@ static ImBuf* stabilize_alloc_ibuf(ImBuf *cacheibuf, ImBuf *srcibuf, int fill)
if(cacheibuf) {
if(fill) {
float col[4]= {0.f, 0.f, 0.f, 0.f};
float col[4]= {0.0f, 0.0f, 0.0f, 0.0f};
IMB_rectfill(cacheibuf, col);
}
}
@ -1830,8 +1831,8 @@ void BKE_tracking_stabilization_data(MovieTracking *tracking, int framenr, int w
if((stab->flag&TRACKING_2D_STABILIZATION)==0) {
zero_v2(loc);
*scale= 1.f;
*angle= 0.f;
*scale= 1.0f;
*angle= 0.0f;
return;
}
@ -1840,7 +1841,7 @@ void BKE_tracking_stabilization_data(MovieTracking *tracking, int framenr, int w
stabilization_median_point(tracking, framenr, median);
if((stab->flag&TRACKING_AUTOSCALE)==0)
stab->scale= 1.f;
stab->scale= 1.0f;
if(!stab->ok) {
if(stab->flag&TRACKING_AUTOSCALE)
@ -1854,8 +1855,8 @@ void BKE_tracking_stabilization_data(MovieTracking *tracking, int framenr, int w
}
} else {
zero_v2(loc);
*scale= 1.f;
*angle= 0.f;
*scale= 1.0f;
*angle= 0.0f;
}
}
@ -1871,7 +1872,7 @@ ImBuf *BKE_tracking_stabilize(MovieTracking *tracking, int framenr, ImBuf *ibuf,
if((stab->flag&TRACKING_2D_STABILIZATION)==0) {
if(loc) zero_v2(loc);
if(scale) *scale= 1.f;
if(scale) *scale= 1.0f;
return ibuf;
}
@ -1881,7 +1882,7 @@ ImBuf *BKE_tracking_stabilize(MovieTracking *tracking, int framenr, ImBuf *ibuf,
tmpibuf= stabilize_alloc_ibuf(NULL, ibuf, 1);
/* scale would be handled by matrix transformation when angle is non-zero */
if(tscale!=1.f && tangle==0.f) {
if(tscale!=1.0f && tangle==0.0f) {
ImBuf *scaleibuf;
stabilization_auto_scale_factor(tracking, width, height);
@ -1895,7 +1896,7 @@ ImBuf *BKE_tracking_stabilize(MovieTracking *tracking, int framenr, ImBuf *ibuf,
ibuf= scaleibuf;
}
if(tangle==0.f) {
if(tangle==0.0f) {
/* if angle is zero, then it's much faster to use rect copy
but could be issues with subpixel precisions */
IMB_rectcpy(tmpibuf, ibuf, tloc[0]-(tscale-1.0f)*width/2.0f, tloc[1]-(tscale-1.0f)*height/2.0f, 0, 0, ibuf->x, ibuf->y);
@ -1941,8 +1942,8 @@ void BKE_tracking_stabdata_to_mat4(int width, int height, float loc[2], float sc
unit_m4(cmat);
/* image center as rotation center */
cmat[3][0]= (float)width/2.f;
cmat[3][1]= (float)height/2.f;
cmat[3][0]= (float)width/2.0f;
cmat[3][1]= (float)height/2.0f;
invert_m4_m4(icmat, cmat);
size_to_mat4(smat, svec); /* scale matrix */
@ -1978,7 +1979,7 @@ MovieDistortion *BKE_tracking_distortion_copy(MovieDistortion *distortion)
void BKE_tracking_distortion_update(MovieDistortion *distortion, MovieTracking *tracking, int width, int height)
{
MovieTrackingCamera *camera= &tracking->camera;
float aspy= 1.f/tracking->camera.pixel_aspect;
float aspy= 1.0f/tracking->camera.pixel_aspect;
#ifdef WITH_LIBMV
if(!distortion->intrinsics) {

@ -2270,7 +2270,7 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
static void write_libraries(WriteData *wd, Main *main)
{
ListBase *lbarray[30];
ListBase *lbarray[ID_NUMTYPES];
ID *id;
int a, tot, foundone;

@ -842,6 +842,9 @@ void ui_theme_init_default(void)
SETCOL(btheme->tclip.path_after, 0x00, 0x00, 0xff, 255);
SETCOL(btheme->tclip.grid, 0x5e, 0x5e, 0x5e, 255);
SETCOL(btheme->tclip.cframe, 0x60, 0xc0, 0x40, 255);
SETCOL(btheme->tclip.handle_vertex, 0x00, 0x00, 0x00, 0xff);
SETCOL(btheme->tclip.handle_vertex_select, 0xff, 0xff, 0, 0xff);
btheme->tclip.handle_vertex_size= 4;
}
@ -1673,6 +1676,9 @@ void init_userdef_do_versions(void)
SETCOL(btheme->tclip.path_after, 0x00, 0x00, 0xff, 255);
SETCOL(btheme->tclip.grid, 0x5e, 0x5e, 0x5e, 255);
SETCOL(btheme->tclip.cframe, 0x60, 0xc0, 0x40, 255);
SETCOL(btheme->tclip.handle_vertex, 0x00, 0x00, 0x00, 0xff);
SETCOL(btheme->tclip.handle_vertex_select, 0xff, 0xff, 0, 0xff);
btheme->tclip.handle_vertex_size= 4;
}
}
}

@ -40,13 +40,15 @@ set(INC_SYS
set(SRC
space_clip.c
clip_draw_graph.c
clip_draw_main.c
clip_draw.c
clip_toolbar.c
clip_ops.c
tracking_ops.c
clip_graph_ops.c
clip_graph_draw.c
clip_editor.c
clip_buttons.c
clip_utils.c
tracking_ops.c
clip_intern.h
)

@ -25,7 +25,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
/** \file blender/editors/space_clip/clip_draw_main.c
/** \file blender/editors/space_clip/clip_draw.c
* \ingroup spclip
*/
@ -170,26 +170,55 @@ static void draw_movieclip_cache(SpaceClip *sc, ARegion *ar, MovieClip *clip, Sc
glRecti(x, 0, x+framelen, 8);
/* frame number */
BLF_size(fontid, 11.f, U.dpi);
BLF_size(fontid, 11.0f, U.dpi);
BLI_snprintf(str, sizeof(str), "%d", sc->user.framenr);
fontsize= BLF_height(fontid, str);
fontwidth= BLF_width(fontid, str);
if(x+fontwidth+6.f<=ar->winx) {
glRecti(x, 8.f, x+fontwidth+6.f, 12.f+fontsize);
if(x+fontwidth+6.0f<=ar->winx) {
glRecti(x, 8, x+fontwidth+6, 12+fontsize);
UI_ThemeColor(TH_TEXT);
BLF_position(fontid, x+2.f, 10.f, 0.f);
BLF_position(fontid, x+2.0f, 10.0f, 0.0f);
BLF_draw(fontid, str, strlen(str));
} else {
glRecti(x+framelen, 8.f, x+framelen-fontwidth-6.f, 12.f+fontsize);
glRecti(x+framelen, 8.0f, x+framelen-fontwidth-6.0f, 12.0f+fontsize);
UI_ThemeColor(TH_TEXT);
BLF_position(fontid, x-2.f-fontwidth+framelen, 10.f, 0.f);
BLF_position(fontid, x-2.0f-fontwidth+framelen, 10.0f, 0.0f);
BLF_draw(fontid, str, strlen(str));
}
}
static void draw_movieclip_notes(SpaceClip *sc, ARegion *ar)
{
char str[256]= {0};
if(sc->flag&SC_LOCK_SELECTION)
strcpy(str, "Locked");
if(str[0]) {
uiStyle *style= UI_GetStyle();
int fontsize, fontwidth;
int fontid= style->widget.uifont_id;
BLF_size(fontid, 11.0f, U.dpi);
fontsize= BLF_height(fontid, str);
fontwidth= BLF_width(fontid, str);
glEnable(GL_BLEND);
glColor4f(0.0f, 0.0f, 0.0f, 0.6f);
glRecti(0, ar->winy-fontsize-9, fontwidth+12, ar->winy);
glColor3f(1.0f, 1.0f, 1.0f);
BLF_position(fontid, 6.0f, ar->winy-fontsize-5.0f, 0.0f);
BLF_draw(fontid, str, strlen(str));
glDisable(GL_BLEND);
}
}
static void draw_movieclip_buffer(SpaceClip *sc, ARegion *ar, ImBuf *ibuf,
int width, int height, float zoomx, float zoomy)
{
@ -200,7 +229,7 @@ static void draw_movieclip_buffer(SpaceClip *sc, ARegion *ar, ImBuf *ibuf,
glPixelZoom(zoomx*width/ibuf->x, zoomy*height/ibuf->y);
/* find window pixel coordinates of origin */
UI_view2d_to_region_no_clip(&ar->v2d, 0.f, 0.f, &x, &y);
UI_view2d_to_region_no_clip(&ar->v2d, 0.0f, 0.0f, &x, &y);
if(sc->flag&SC_MUTE_FOOTAGE) {
glColor3f(0.0f, 0.0f, 0.0f);
@ -216,7 +245,7 @@ static void draw_movieclip_buffer(SpaceClip *sc, ARegion *ar, ImBuf *ibuf,
/* draw boundary border for frame if stabilization is enabled */
if(sc->flag&SC_SHOW_STABLE && clip->tracking.stabilization.flag&TRACKING_2D_STABILIZATION) {
glColor3f(0.f, 0.f, 0.f);
glColor3f(0.0f, 0.0f, 0.0f);
glLineStipple(3, 0xaaaa);
glEnable(GL_LINE_STIPPLE);
glEnable(GL_COLOR_LOGIC_OP);
@ -229,10 +258,10 @@ static void draw_movieclip_buffer(SpaceClip *sc, ARegion *ar, ImBuf *ibuf,
glMultMatrixf(sc->stabmat);
glBegin(GL_LINE_LOOP);
glVertex2f(0.f, 0.f);
glVertex2f(ibuf->x, 0.f);
glVertex2f(0.0f, 0.0f);
glVertex2f(ibuf->x, 0.0f);
glVertex2f(ibuf->x, ibuf->y);
glVertex2f(0.f, ibuf->y);
glVertex2f(0.0f, ibuf->y);
glEnd();
glPopMatrix();
@ -243,7 +272,7 @@ static void draw_movieclip_buffer(SpaceClip *sc, ARegion *ar, ImBuf *ibuf,
/* reset zoom */
glPixelZoom(1.f, 1.f);
glPixelZoom(1.0f, 1.0f);
}
static void draw_track_path(SpaceClip *sc, MovieClip *UNUSED(clip), MovieTrackingTrack *track)
@ -492,7 +521,7 @@ static void draw_marker_areas(SpaceClip *sc, MovieTrackingTrack *track, MovieTra
glVertex2f(pos[0], pos[1] + px[1]*7);
glEnd();
glColor3f(0.f, 0.f, 0.f);
glColor3f(0.0f, 0.0f, 0.0f);
glLineStipple(3, 0xaaaa);
glEnable(GL_LINE_STIPPLE);
glEnable(GL_COLOR_LOGIC_OP);
@ -597,11 +626,11 @@ static void draw_marker_slide_zones(SpaceClip *sc, MovieTrackingTrack *track, Mo
dx= 6.0f/width/sc->zoom;
dy= 6.0f/height/sc->zoom;
patdx= MIN2(dx*2.f/3.f, (track->pat_max[0]-track->pat_min[0])/6.f);
patdy= MIN2(dy*2.f/3.f, (track->pat_max[1]-track->pat_min[1])/6.f);
patdx= MIN2(dx*2.0f/3.0f, (track->pat_max[0]-track->pat_min[0])/6.0f);
patdy= MIN2(dy*2.0f/3.0f, (track->pat_max[1]-track->pat_min[1])/6.0f);
searchdx= MIN2(dx, (track->search_max[0]-track->search_min[0])/6.f);
searchdy= MIN2(dy, (track->search_max[1]-track->search_min[1])/6.f);
searchdx= MIN2(dx, (track->search_max[0]-track->search_min[0])/6.0f);
searchdy= MIN2(dy, (track->search_max[1]-track->search_min[1])/6.0f);
px[0]= 1.0f/sc->zoom/width/sc->scale;
px[1]= 1.0f/sc->zoom/height/sc->scale;
@ -635,8 +664,8 @@ static void draw_marker_slide_zones(SpaceClip *sc, MovieTrackingTrack *track, Mo
x= track->search_max[0];
y= track->search_min[1];
tdx= searchdx*2.f;
tdy= searchdy*2.f;
tdx= searchdx*2.0f;
tdy= searchdy*2.0f;
if(outline) {
tdx+= px[0];
@ -679,8 +708,8 @@ static void draw_marker_slide_zones(SpaceClip *sc, MovieTrackingTrack *track, Mo
x= track->pat_max[0];
y= track->pat_min[1];
tdx= patdx*2.f;
tdy= patdy*2.f;
tdx= patdx*2.0f;
tdy= patdy*2.0f;
if(outline) {
tdx+= px[0];
@ -704,14 +733,14 @@ static void draw_marker_texts(SpaceClip *sc, MovieTrackingTrack *track, MovieTra
int width, int height, float zoomx, float zoomy)
{
char str[128]= {0}, state[64]= {0};
float dx= 0.f, dy= 0.f, fontsize, pos[3];
float dx= 0.0f, dy= 0.0f, fontsize, pos[3];
uiStyle *style= U.uistyles.first;
int fontid= style->widget.uifont_id;
if(!TRACK_VIEW_SELECTED(sc, track))
return;
BLF_size(fontid, 11.f, U.dpi);
BLF_size(fontid, 11.0f, U.dpi);
fontsize= BLF_height_max(fontid);
if(marker->flag&MARKER_DISABLED) {
@ -732,7 +761,7 @@ static void draw_marker_texts(SpaceClip *sc, MovieTrackingTrack *track, MovieTra
pos[0]= (marker_pos[0]+dx)*width;
pos[1]= (marker_pos[1]+dy)*height;
pos[2]= 0.f;
pos[2]= 0.0f;
mul_m4_v3(sc->stabmat, pos);
@ -749,19 +778,19 @@ static void draw_marker_texts(SpaceClip *sc, MovieTrackingTrack *track, MovieTra
else
BLI_snprintf(str, sizeof(str), "%s", track->name);
BLF_position(fontid, pos[0], pos[1], 0.f);
BLF_position(fontid, pos[0], pos[1], 0.0f);
BLF_draw(fontid, str, strlen(str));
pos[1]-= fontsize;
if(track->flag&TRACK_HAS_BUNDLE) {
BLI_snprintf(str, sizeof(str), "Average error: %.3f", track->error);
BLF_position(fontid, pos[0], pos[1], 0.f);
BLF_position(fontid, pos[0], pos[1], 0.0f);
BLF_draw(fontid, str, strlen(str));
pos[1]-= fontsize;
}
if(track->flag&TRACK_LOCKED) {
BLF_position(fontid, pos[0], pos[1], 0.f);
BLF_position(fontid, pos[0], pos[1], 0.0f);
BLF_draw(fontid, "locked", 6);
}
}
@ -926,7 +955,7 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip,
glEnable(GL_POINT_SMOOTH);
glPointSize(3.0f);
aspy= 1.f/clip->tracking.camera.pixel_aspect;
aspy= 1.0f/clip->tracking.camera.pixel_aspect;
BKE_tracking_projection_matrix(tracking, framenr, width, height, mat);
track= tracking->tracks.first;
@ -946,7 +975,7 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip,
BKE_tracking_apply_intrinsics(tracking, pos, npos);
if(npos[0]>=0.f && npos[1]>=0.f && npos[0]<=width && npos[1]<=height*aspy) {
if(npos[0]>=0.0f && npos[1]>=0.0f && npos[0]<=width && npos[1]<=height*aspy) {
vec[0]= (marker->pos[0]+track->offset[0])*width;
vec[1]= (marker->pos[1]+track->offset[1])*height*aspy;
@ -1008,7 +1037,7 @@ static void draw_distortion(SpaceClip *sc, ARegion *ar, MovieClip *clip, int wid
int i, j, a;
float pos[2], tpos[2], grid[11][11][2];
MovieTracking *tracking= &clip->tracking;
float aspy= 1.f/tracking->camera.pixel_aspect;
float aspy= 1.0f/tracking->camera.pixel_aspect;
float dx= (float)width/n, dy= (float)height/n*aspy;
if(sc->mode!=SC_MODE_DISTORTION)
@ -1061,7 +1090,7 @@ static void draw_distortion(SpaceClip *sc, ARegion *ar, MovieClip *clip, int wid
pos[0]+= dx;
}
pos[0]= 0.f;
pos[0]= 0.0f;
pos[1]+= dy;
}
@ -1094,7 +1123,7 @@ static void draw_distortion(SpaceClip *sc, ARegion *ar, MovieClip *clip, int wid
pos[1]+= dy;
}
glColor3f(1.f, 0.f, 0.f);
glColor3f(1.0f, 0.0f, 0.0f);
for(i= 0; i<=n; i++) {
glBegin(GL_LINE_STRIP);
@ -1141,7 +1170,7 @@ static void draw_distortion(SpaceClip *sc, ARegion *ar, MovieClip *clip, int wid
npos[1]= stroke->points[i+1].y*height*aspy;
len= len_v2v2(pos, npos);
steps= ceil(len/5.f);
steps= ceil(len/5.0f);
/* we want to distort only long straight lines */
if(stroke->totpoints==2) {
@ -1150,7 +1179,7 @@ static void draw_distortion(SpaceClip *sc, ARegion *ar, MovieClip *clip, int wid
}
sub_v2_v2v2(dpos, npos, pos);
mul_v2_fl(dpos, 1.f/steps);
mul_v2_fl(dpos, 1.0f/steps);
for(j= 0; j<=steps; j++) {
BKE_tracking_apply_intrinsics(tracking, pos, tpos);
@ -1177,8 +1206,8 @@ static void draw_distortion(SpaceClip *sc, ARegion *ar, MovieClip *clip, int wid
layer= layer->next;
}
glLineWidth(1.f);
glPointSize(1.f);
glLineWidth(1.0f);
glPointSize(1.0f);
}
glPopMatrix();
@ -1205,8 +1234,8 @@ void draw_clip_main(SpaceClip *sc, ARegion *ar, Scene *scene)
BKE_tracking_stabdata_to_mat4(width, height, sc->loc, sc->scale, sc->angle, sc->stabmat);
unit_m4(smat);
smat[0][0]= 1.f/width;
smat[1][1]= 1.f/height;
smat[0][0]= 1.0f/width;
smat[1][1]= 1.0f/height;
invert_m4_m4(ismat, smat);
mul_serie_m4(sc->unistabmat, smat, sc->stabmat, ismat, NULL, NULL, NULL, NULL, NULL);
@ -1214,7 +1243,7 @@ void draw_clip_main(SpaceClip *sc, ARegion *ar, Scene *scene)
ibuf= ED_space_clip_get_buffer(sc);
zero_v2(sc->loc);
sc->scale= 1.f;
sc->scale= 1.0f;
unit_m4(sc->stabmat);
unit_m4(sc->unistabmat);
}
@ -1228,6 +1257,7 @@ void draw_clip_main(SpaceClip *sc, ARegion *ar, Scene *scene)
}
draw_movieclip_cache(sc, ar, clip, scene);
draw_movieclip_notes(sc, ar);
}
/* draw grease pencil */

@ -53,6 +53,8 @@
#include "UI_view2d.h"
#include "clip_intern.h" // own include
int ED_space_clip_poll(bContext *C)
{
SpaceClip *sc= CTX_wm_space_clip(C);
@ -139,7 +141,7 @@ void ED_space_clip_aspect(SpaceClip *sc, float *aspx, float *aspy)
if(clip)
BKE_movieclip_aspect(clip, aspx, aspy);
else
*aspx= *aspy= 1.f;
*aspx= *aspy= 1.0f;
}
void ED_clip_update_frame(const Main *mainp, int cfra)
@ -184,7 +186,7 @@ static int selected_boundbox(SpaceClip *sc, float min[2], float max[2])
pos[0]= (marker->pos[0]+track->offset[0])*width;
pos[1]= (marker->pos[1]+track->offset[1])*height;
pos[2]= 0.f;
pos[2]= 0.0f;
mul_v3_m4v3(pos, sc->stabmat, pos);
@ -202,29 +204,31 @@ static int selected_boundbox(SpaceClip *sc, float min[2], float max[2])
void ED_clip_view_selection(SpaceClip *sc, ARegion *ar, int fit)
{
int w, h, width, height, frame_width, frame_height;
float min[2], max[2], aspx, aspy;
int w, h, frame_width, frame_height;
float min[2], max[2];
ED_space_clip_size(sc, &frame_width, &frame_height);
ED_space_clip_aspect(sc, &aspx, &aspy);
if(frame_width==0 || frame_height==0) return;
width= ar->winrct.xmax - ar->winrct.xmin + 1;
height= ar->winrct.ymax - ar->winrct.ymin + 1;
if(!selected_boundbox(sc, min, max))
return;
if(!selected_boundbox(sc, min, max)) return;
/* center view */
clip_view_center_to_point(sc, (max[0]+min[0])/(2*frame_width), (max[1]+min[1])/(2*frame_height));
w= max[0]-min[0];
h= max[1]-min[1];
/* center view */
sc->xof= ((float)(max[0]+min[0]-frame_width))/2*aspx;
sc->yof= ((float)(max[1]+min[1]-frame_height))/2*aspy;
/* set zoom to see all selection */
if(w>0 && h>0) {
float zoomx, zoomy, newzoom;
int width, height;
float zoomx, zoomy, newzoom, aspx, aspy;
ED_space_clip_aspect(sc, &aspx, &aspy);
width= ar->winrct.xmax - ar->winrct.xmin + 1;
height= ar->winrct.ymax - ar->winrct.ymin + 1;
zoomx= (float)width/w/aspx;
zoomy= (float)height/h/aspy;
@ -242,7 +246,7 @@ void ED_clip_point_undistorted_pos(SpaceClip *sc, float co[2], float nco[2])
if(sc->user.render_flag&MCLIP_PROXY_RENDER_UNDISTORT) {
MovieClip *clip= ED_space_clip(sc);
float aspy= 1.f/clip->tracking.camera.pixel_aspect;
float aspy= 1.0f/clip->tracking.camera.pixel_aspect;
int width, height;
ED_space_clip_size(sc, &width, &height);
@ -261,7 +265,7 @@ void ED_clip_point_stable_pos(bContext *C, float x, float y, float *xr, float *y
ARegion *ar= CTX_wm_region(C);
SpaceClip *sc= CTX_wm_space_clip(C);
int sx, sy, width, height;
float zoomx, zoomy, pos[3]={0.f, 0.f, 0.f}, imat[4][4];
float zoomx, zoomy, pos[3]={0.0f, 0.0f, 0.0f}, imat[4][4];
ED_space_clip_zoom(sc, ar, &zoomx, &zoomy);
ED_space_clip_size(sc, &width, &height);
@ -280,7 +284,7 @@ void ED_clip_point_stable_pos(bContext *C, float x, float y, float *xr, float *y
if(sc->user.render_flag&MCLIP_PROXY_RENDER_UNDISTORT) {
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
float aspy= 1.f/tracking->camera.pixel_aspect;
float aspy= 1.0f/tracking->camera.pixel_aspect;
float tmp[2]= {*xr*width, *yr*height*aspy};
BKE_tracking_apply_intrinsics(tracking, tmp, tmp);

@ -25,7 +25,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
/** \file blender/editors/space_clip/clip_draw_graph.c
/** \file blender/editors/space_clip/clip_graph_draw.c
* \ingroup spclip
*/
@ -58,6 +58,34 @@
#include "clip_intern.h" // own include
static void draw_curve_knot(float x, float y, float xscale, float yscale, float hsize)
{
static GLuint displist=0;
/* initialise round circle shape */
if (displist == 0) {
GLUquadricObj *qobj;
displist= glGenLists(1);
glNewList(displist, GL_COMPILE);
qobj= gluNewQuadric();
gluQuadricDrawStyle(qobj, GLU_SILHOUETTE);
gluDisk(qobj, 0, 0.7, 8, 1);
gluDeleteQuadric(qobj);
glEndList();
}
glPushMatrix();
glTranslatef(x, y, 0.0f);
glScalef(1.0f/xscale*hsize, 1.0f/yscale*hsize, 1.0f);
glCallList(displist);
glPopMatrix();
}
static void draw_graph_cfra(SpaceClip *sc, ARegion *ar, Scene *scene)
{
View2D *v2d= &ar->v2d;
@ -104,70 +132,93 @@ static void draw_graph_cfra(SpaceClip *sc, ARegion *ar, Scene *scene)
/* draw current frame number - black text */
UI_ThemeColor(TH_TEXT);
BLF_position(fontid, x-5, y+2, 0.f);
BLF_position(fontid, x-5, y+2, 0.0f);
BLF_draw(fontid, str, strlen(str));
/* restore view transform */
glScalef(xscale, 1.0, 1.0);
}
static void draw_clip_tracks_curves(SpaceClip *sc)
static void tracking_segment_point_cb(void *UNUSED(userdata), MovieTrackingTrack *UNUSED(track),
MovieTrackingMarker *marker, int UNUSED(coord), float val)
{
glVertex2f(marker->framenr, val);
}
void tracking_segment_start_cb(void *userdata, MovieTrackingTrack *track, int coord)
{
static float colors[2][3] = {{1.0f, 0.0f, 0.0f},
{0.0f, 1.0f, 0.0f}};
float col[4];
copy_v3_v3(col, colors[coord]);
if(track==userdata) {
col[3]= 1.0f;
glLineWidth(2.0f);
} else {
col[3]= 0.5f;
glLineWidth(1.0f);
}
glColor4fv(col);
glBegin(GL_LINE_STRIP);
}
void tracking_segment_end_cb(void *UNUSED(userdata))
{
glEnd();
glLineWidth(1.0f);
}
static void tracking_segment_knot_cb(void *userdata, MovieTrackingTrack *track,
MovieTrackingMarker *marker, int UNUSED(coord), float val)
{
struct { MovieTrackingTrack *act_track; int sel; float xscale, yscale, hsize; } *data = userdata;
int sel= 0;
if(track!=data->act_track)
return;
sel= (marker->flag&MARKER_GRAPH_SEL) ? 1 : 0;
if(sel == data->sel) {
if(sel) UI_ThemeColor(TH_HANDLE_VERTEX_SELECT);
else UI_ThemeColor(TH_HANDLE_VERTEX);
draw_curve_knot(marker->framenr, val, data->xscale, data->yscale, data->hsize);
}
}
static void draw_clip_tracks_curves(View2D *v2d, SpaceClip *sc)
{
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
MovieTrackingTrack *track;
int size[2];
int width, height;
struct { MovieTrackingTrack *act_track; int sel; float xscale, yscale, hsize; } userdata;
static float colors[2][3] = {{1.f, 0.f, 0.f},
{0.f, 1.f, 0.f}};
BKE_movieclip_get_size(clip, &sc->user, &width, &height);
BKE_movieclip_get_size(clip, &sc->user, &size[0], &size[1]);
if(!size[0] || !size[1])
if(!width || !height)
return;
track= tracking->tracks.first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track)) {
int coord;
/* non-selected knot handles */
userdata.hsize= UI_GetThemeValuef(TH_HANDLE_VERTEX_SIZE);
userdata.sel= 0;
userdata.act_track= clip->tracking.act_track;
UI_view2d_getscale(v2d, &userdata.xscale, &userdata.yscale);
clip_graph_tracking_values_iterate(sc, &userdata, tracking_segment_knot_cb, NULL, NULL);
for(coord= 0; coord<2; coord++) {
int i, lines= 0, prevfra= 0;
float prevval= 0.f;
/* draw graph lines */
glEnable(GL_BLEND);
clip_graph_tracking_values_iterate(sc, tracking->act_track, tracking_segment_point_cb, tracking_segment_start_cb, tracking_segment_end_cb);
glDisable(GL_BLEND);
glColor3fv(colors[coord]);
for(i= 0; i<track->markersnr; i++) {
MovieTrackingMarker *marker= &track->markers[i];
if(marker->flag&MARKER_DISABLED)
continue;
if(lines && marker->framenr!=prevfra+1) {
glEnd();
lines= 0;
}
if(!lines) {
glBegin(GL_LINE_STRIP);
lines= 1;
prevval= marker->pos[coord];
}
glVertex2f(marker->framenr, (marker->pos[coord] - prevval) * size[coord]);
prevval= marker->pos[coord];
prevfra= marker->framenr;
}
if(lines)
glEnd();
}
}
track= track->next;
}
/* selected knot handles on top of curves */
userdata.sel= 1;
clip_graph_tracking_values_iterate(sc, &userdata, tracking_segment_knot_cb, NULL, NULL);
}
static void draw_clip_frame_curves(SpaceClip *sc)
@ -177,7 +228,7 @@ static void draw_clip_frame_curves(SpaceClip *sc)
MovieTrackingReconstruction *reconstruction= &tracking->reconstruction;
int i, lines= 0, prevfra= 0;
glColor3f(0.f, 0.f, 1.f);
glColor3f(0.0f, 0.0f, 1.0f);
for(i= 0; i<reconstruction->camnr; i++) {
MovieReconstructedCamera *camera= &reconstruction->cameras[i];
@ -213,7 +264,7 @@ void draw_clip_graph(SpaceClip *sc, ARegion *ar, Scene *scene)
UI_view2d_grid_free(grid);
if(sc->flag&SC_SHOW_GRAPH_TRACKS)
draw_clip_tracks_curves(sc);
draw_clip_tracks_curves(v2d, sc);
if(sc->flag&SC_SHOW_GRAPH_FRAMES)
draw_clip_frame_curves(sc);

@ -0,0 +1,356 @@
/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2011 Blender Foundation.
* All rights reserved.
*
*
* Contributor(s): Blender Foundation,
* Sergey Sharybin
*
* ***** END GPL LICENSE BLOCK *****
*/
/** \file blender/editors/space_clip/clip_graph_ops.c
* \ingroup spclip
*/
#include "DNA_object_types.h" /* SELECT */
#include "MEM_guardedalloc.h"
#include "BLI_utildefines.h"
#include "BLI_math.h"
#include "BLI_listbase.h"
#include "BKE_context.h"
#include "BKE_movieclip.h"
#include "BKE_tracking.h"
#include "WM_api.h"
#include "WM_types.h"
#include "ED_screen.h"
#include "ED_clip.h"
#include "UI_interface.h"
#include "RNA_access.h"
#include "RNA_define.h"
#include "UI_view2d.h"
#include "clip_intern.h" // own include
/******************** common graph-editing utilities ********************/
typedef struct {
int action;
} SelectUserData;
static void toggle_selection_cb(void *userdata, MovieTrackingMarker *marker)
{
SelectUserData *data= (SelectUserData *)userdata;
switch(data->action) {
case SEL_SELECT:
marker->flag|= MARKER_GRAPH_SEL;
break;
case SEL_DESELECT:
marker->flag&= ~MARKER_GRAPH_SEL;
break;
case SEL_INVERT:
marker->flag^= MARKER_GRAPH_SEL;
break;
}
}
/******************** mouse select operator ********************/
typedef struct {
int coord, /* coordinate index of found entuty (0 = X-axis, 1 = Y-axis) */
has_prev; /* if there's valid coordinate of previous point of curve segment */
float min_dist, /* minimal distance between mouse and currently found entuty */
mouse_co[2], /* mouse coordinate */
prev_co[2], /* coordinate of previeous point of segment */
min_co[2]; /* coordinate of entity with minimal distance */
MovieTrackingTrack *track; /* nearest found track */
MovieTrackingMarker *marker; /* nearest found marker */
} MouseSelectUserData;
static void find_nearest_tracking_segment_cb(void *userdata, MovieTrackingTrack *track,
MovieTrackingMarker *marker, int coord, float val)
{
MouseSelectUserData *data= userdata;
float co[2]= {marker->framenr, val};
if(data->has_prev) {
float d= dist_to_line_segment_v2(data->mouse_co, data->prev_co, co);
if(data->track==NULL || d<data->min_dist) {
data->track= track;
data->min_dist= d;
data->coord= coord;
copy_v2_v2(data->min_co, co);
}
}
data->has_prev= 1;
copy_v2_v2(data->prev_co, co);
}
void find_nearest_tracking_segment_end_cb(void *userdata)
{
MouseSelectUserData *data= userdata;
data->has_prev= 0;
}
static void find_nearest_tracking_knot_cb(void *userdata, MovieTrackingTrack *track,
MovieTrackingMarker *marker, int coord, float val)
{
MouseSelectUserData *data= userdata;
float dx= marker->framenr-data->mouse_co[0], dy= val-data->mouse_co[1];
float d= dx*dx+dy*dy;
if(data->marker==NULL || d<data->min_dist) {
float co[2]= {marker->framenr, val};
data->track= track;
data->marker= marker;
data->min_dist= d;
data->coord= coord;
copy_v2_v2(data->min_co, co);
}
}
static void mouse_select_init_data(MouseSelectUserData *userdata, float *co)
{
memset(userdata, 0, sizeof(MouseSelectUserData));
userdata->min_dist= FLT_MAX;
copy_v2_v2(userdata->mouse_co, co);
}
static int mouse_select_knot(bContext *C, float co[2], int extend)
{
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
ARegion *ar= CTX_wm_region(C);
View2D *v2d= &ar->v2d;
MovieTracking *tracking= &clip->tracking;
static const int delta= 6;
if(tracking->act_track) {
MouseSelectUserData userdata;
mouse_select_init_data(&userdata, co);
clip_graph_tracking_values_iterate_track(sc, tracking->act_track,
&userdata, find_nearest_tracking_knot_cb, NULL, NULL);
if(userdata.marker) {
int x1, y1, x2, y2;
UI_view2d_view_to_region(v2d, co[0], co[1], &x1, &y1);
UI_view2d_view_to_region(v2d, userdata.min_co[0], userdata.min_co[1], &x2, &y2);
if(abs(x2-x1)<=delta && abs(y2-y1)<=delta) {
if(!extend) {
SelectUserData selectdata = {SEL_DESELECT};
clip_graph_tracking_iterate(sc, &selectdata, toggle_selection_cb);
}
userdata.marker->flag|= MARKER_GRAPH_SEL;
return 1;
}
}
}
return 0;
}
static int mouse_select_curve(bContext *C, float co[2], int extend)
{
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
MouseSelectUserData userdata;
mouse_select_init_data(&userdata, co);
clip_graph_tracking_values_iterate(sc, &userdata, find_nearest_tracking_segment_cb, NULL, find_nearest_tracking_segment_end_cb);
if(userdata.track) {
if(extend) {
if(tracking->act_track==userdata.track) {
/* currently only single curve can be selected (selected curve represents active track) */
tracking->act_track= NULL;
}
}
else if(tracking->act_track!=userdata.track) {
MovieTrackingMarker *marker;
SelectUserData selectdata = {SEL_DESELECT};
tracking->act_track= userdata.track;
/* make active track be centered to screen */
marker= BKE_tracking_get_marker(userdata.track, sc->user.framenr);
clip_view_center_to_point(sc, marker->pos[0], marker->pos[1]);
/* deselect all knots on newly selected curve */
clip_graph_tracking_iterate(sc, &selectdata, toggle_selection_cb);
}
return 1;
}
return 0;
}
static int mouse_select(bContext *C, float co[2], int extend)
{
int sel= 0;
/* first try to select knot on selected curves */
sel= mouse_select_knot(C, co, extend);
if(!sel) {
/* if there's no close enough knot to mouse osition, select nearest curve */
sel= mouse_select_curve(C, co, extend);
}
if(sel)
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, NULL);
return OPERATOR_FINISHED;
}
static int select_exec(bContext *C, wmOperator *op)
{
float co[2];
int extend= RNA_boolean_get(op->ptr, "extend");
RNA_float_get_array(op->ptr, "location", co);
return mouse_select(C, co, extend);
}
static int select_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
ARegion *ar= CTX_wm_region(C);
float co[2];
UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &co[0], &co[1]);
RNA_float_set_array(op->ptr, "location", co);
return select_exec(C, op);
}
void CLIP_OT_graph_select(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select";
ot->description= "Select graph curves";
ot->idname= "CLIP_OT_graph_select";
/* api callbacks */
ot->exec= select_exec;
ot->invoke= select_invoke;
ot->poll= ED_space_clip_poll;
/* flags */
ot->flag= OPTYPE_UNDO;
/* properties */
RNA_def_float_vector(ot->srna, "location", 2, NULL, -FLT_MAX, FLT_MAX,
"Location", "Mouse location to select nearest entity closest to", -100.0f, 100.0f);
RNA_def_boolean(ot->srna, "extend", 0,
"Extend", "Extend selection rather than clearing the existing selection");
}
/******************** delete curve operator ********************/
static int delete_curve_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
if(tracking->act_track)
clip_delete_track(C, clip, tracking->act_track);
return OPERATOR_FINISHED;
}
void CLIP_OT_graph_delete_curve(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Delete Curve";
ot->description= "Delete selected curves";
ot->idname= "CLIP_OT_graph_delete_curve";
/* api callbacks */
ot->invoke= WM_operator_confirm;
ot->exec= delete_curve_exec;
ot->poll= ED_space_clip_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
/******************** delete knot operator ********************/
static int delete_knot_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
if(tracking->act_track) {
int a= 0;
MovieTrackingTrack *track= tracking->act_track;
while(a<track->markersnr) {
MovieTrackingMarker *marker= &track->markers[a];
if(marker->flag&MARKER_GRAPH_SEL)
clip_delete_marker(C, clip, track, marker);
else
a++;
}
}
return OPERATOR_FINISHED;
}
void CLIP_OT_graph_delete_knot(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Delete Knot";
ot->description= "Delete curve knots";
ot->idname= "CLIP_OT_graph_delete_knot";
/* api callbacks */
ot->exec= delete_knot_exec;
ot->poll= ED_space_clip_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}

@ -29,18 +29,35 @@
* \ingroup spclip
*/
#ifndef ED_CLIP_INTERN_H
#define ED_CLIP_INTERN_H
struct bContext;
struct ARegion;
struct MovieClip;
struct MovieTrackingMarker;
struct MovieTrackingTrack;
struct Scene;
struct SpaceClip;
struct wmOperatorType;
/* internal exports only */
/* clip_buttons.c */
void ED_clip_buttons_register(struct ARegionType *art);
/* clip_draw.c */
void draw_clip_main(struct SpaceClip *sc, struct ARegion *ar, struct Scene *scene);
void draw_clip_grease_pencil(struct bContext *C, int onlyv2d);
/* clip_graph_draw.c */
void draw_clip_graph(struct SpaceClip *sc, struct ARegion *ar, struct Scene *scene);
/* clip_graph_ops.c */
void CLIP_OT_graph_select(struct wmOperatorType *ot);
void CLIP_OT_graph_delete_curve(struct wmOperatorType *ot);
void CLIP_OT_graph_delete_knot(struct wmOperatorType *ot);
/* clip_ops.c */
void CLIP_OT_open(struct wmOperatorType *ot);
void CLIP_OT_reload(struct wmOperatorType *ot);
@ -56,7 +73,34 @@ void CLIP_OT_change_frame(wmOperatorType *ot);
void CLIP_OT_rebuild_proxy(struct wmOperatorType *ot);
void CLIP_OT_mode_set(struct wmOperatorType *ot);
/* clip_toolbar.c */
void CLIP_OT_tools(struct wmOperatorType *ot);
void CLIP_OT_properties(struct wmOperatorType *ot);
void ED_clip_tool_props_register(struct ARegionType *art);
/* clip_utils.c */
void clip_graph_tracking_values_iterate_track(struct SpaceClip *sc, struct MovieTrackingTrack *track, void *userdata,
void (*func) (void *userdata, struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker, int coord, float val),
void (*segment_start) (void *userdata, struct MovieTrackingTrack *track, int coord),
void (*segment_end) (void *userdata));
void clip_graph_tracking_values_iterate(struct SpaceClip *sc, void *userdata,
void (*func) (void *userdata, struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker, int coord, float val),
void (*segment_start) (void *userdata, struct MovieTrackingTrack *track, int coord),
void (*segment_end) (void *userdata));
void clip_graph_tracking_iterate(struct SpaceClip *sc, void *userdata,
void (*func) (void *userdata, struct MovieTrackingMarker *marker));
void clip_delete_track(struct bContext *C, struct MovieClip *clip, struct MovieTrackingTrack *track);
void clip_delete_marker(struct bContext *C, struct MovieClip *clip, struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker);
void clip_view_center_to_point(struct SpaceClip *sc, float x, float y);
/* tracking_ops.c */
void clip_delete_track(struct bContext *C, struct MovieClip *clip, struct MovieTrackingTrack *track);
void clip_delete_marker(struct bContext *C, struct MovieClip *clip, struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker);
void CLIP_OT_select(struct wmOperatorType *ot);
void CLIP_OT_select_all(struct wmOperatorType *ot);
void CLIP_OT_select_border(struct wmOperatorType *ot);
@ -100,20 +144,4 @@ void CLIP_OT_stabilize_2d_set_rotation(struct wmOperatorType *ot);
void CLIP_OT_clean_tracks(wmOperatorType *ot);
/* clip_draw_main.c */
void draw_clip_main(struct SpaceClip *sc, struct ARegion *ar, struct Scene *scene);
void draw_clip_grease_pencil(struct bContext *C, int onlyv2d);
/* clip_draw_graph.c */
void draw_clip_graph(struct SpaceClip *sc, struct ARegion *ar, struct Scene *scene);
/* clip_buttons.c */
void ED_clip_buttons_register(struct ARegionType *art);
/* clip_toolbar.c */
void CLIP_OT_tools(struct wmOperatorType *ot);
void CLIP_OT_properties(struct wmOperatorType *ot);
void ED_clip_tool_props_register(struct ARegionType *art);
#endif /* ED_CLIP_INTERN_H */

@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
/** \file blender/editors/space_clip/clip_ops.c
* \ingroup spclip
*/
#include <errno.h>
#include "MEM_guardedalloc.h"
@ -62,10 +66,6 @@
#include "clip_intern.h" // own include
/** \file blender/editors/space_clip/clip_ops.c
* \ingroup spclip
*/
/******************** view navigation utilities *********************/
static void sclip_zoom_set(SpaceClip *sc, ARegion *ar, float zoom)
@ -246,56 +246,6 @@ void CLIP_OT_reload(wmOperatorType *ot)
ot->exec= reload_exec;
}
/******************* delete operator *********************/
#if 0
static int unlink_poll(bContext *C)
{
/* it should be possible to unlink clips if they're lib-linked in... */
return CTX_data_edit_movieclip(C) != NULL;
}
static int unlink_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= CTX_data_edit_movieclip(C);
if(!clip) {
return OPERATOR_CANCELLED;
}
/* make the previous text active, if its not there make the next text active */
if(sc) {
if(clip->id.prev) ED_space_clip_set(C, sc, clip->id.prev);
else if(clip->id.next) ED_space_clip_set(C, sc, clip->id.next);
}
unlink_movieclip(bmain, clip);
free_libblock(&bmain->movieclip, clip);
WM_event_add_notifier(C, NC_MOVIECLIP|NA_REMOVED, NULL);
return OPERATOR_FINISHED;
}
void CLIP_OT_unlink(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Unlink";
ot->idname= "CLIP_OT_unlink";
ot->description= "Unlink active clip data block";
/* api callbacks */
ot->exec= unlink_exec;
ot->invoke= WM_operator_confirm;
ot->poll= unlink_poll;
/* flags */
ot->flag= OPTYPE_UNDO;
}
#endif
/********************** view pan operator *********************/
typedef struct ViewPanData {
@ -738,8 +688,8 @@ static int view_selected_exec(bContext *C, wmOperator *UNUSED(op))
SpaceClip *sc= CTX_wm_space_clip(C);
ARegion *ar= CTX_wm_region(C);
sc->xlockof= 0.f;
sc->ylockof= 0.f;
sc->xlockof= 0.0f;
sc->ylockof= 0.0f;
ED_clip_view_selection(sc, ar, 1);
ED_region_tag_redraw(CTX_wm_region(C));
@ -776,7 +726,7 @@ static void change_frame_apply(bContext *C, wmOperator *op)
/* set the new frame number */
CFRA= RNA_int_get(op->ptr, "frame");
FRAMENUMBER_MIN_CLAMP(CFRA);
SUBFRA = 0.f;
SUBFRA = 0.0f;
/* do updates */
sound_seek_scene(CTX_data_main(C), CTX_data_scene(C));

@ -0,0 +1,219 @@
/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2011 Blender Foundation.
* All rights reserved.
*
*
* Contributor(s): Blender Foundation,
* Sergey Sharybin
*
* ***** END GPL LICENSE BLOCK *****
*/
/** \file blender/editors/space_clip/clip_utils.c
* \ingroup spclip
*/
#include "DNA_object_types.h" /* SELECT */
#include "MEM_guardedalloc.h"
#include "BLI_utildefines.h"
#include "BLI_math.h"
#include "BLI_listbase.h"
#include "BKE_context.h"
#include "BKE_movieclip.h"
#include "BKE_tracking.h"
#include "BKE_depsgraph.h"
#include "WM_api.h"
#include "WM_types.h"
#include "ED_screen.h"
#include "ED_clip.h"
#include "UI_interface.h"
#include "RNA_access.h"
#include "RNA_define.h"
#include "UI_view2d.h"
#include "clip_intern.h" // own include
void clip_graph_tracking_values_iterate_track(SpaceClip *sc, MovieTrackingTrack *track, void *userdata,
void (*func) (void *userdata, MovieTrackingTrack *track, MovieTrackingMarker *marker, int coord, float val),
void (*segment_start) (void *userdata, MovieTrackingTrack *track, int coord),
void (*segment_end) (void *userdata))
{
MovieClip *clip= ED_space_clip(sc);
int width, height, coord;
BKE_movieclip_get_size(clip, &sc->user, &width, &height);
for(coord= 0; coord<2; coord++) {
int i, open= 0, prevfra= 0;
float prevval= 0.0f;
for(i= 0; i<track->markersnr; i++) {
MovieTrackingMarker *marker= &track->markers[i];
float val;
if(marker->flag&MARKER_DISABLED) {
if(open) {
if(segment_end)
segment_end(userdata);
open= 0;
}
continue;
}
if(!open) {
if(segment_start)
segment_start(userdata, track, coord);
open= 1;
prevval= marker->pos[coord];
}
/* value is a pixels per frame speed */
val= (marker->pos[coord] - prevval) * ((i==0) ? (width) : (height));
val/= marker->framenr-prevfra;
if(func)
func(userdata, track, marker, coord, val);
prevval= marker->pos[coord];
prevfra= marker->framenr;
}
if(open) {
if(segment_end)
segment_end(userdata);
}
}
}
void clip_graph_tracking_values_iterate(SpaceClip *sc, void *userdata,
void (*func) (void *userdata, MovieTrackingTrack *track, MovieTrackingMarker *marker, int coord, float val),
void (*segment_start) (void *userdata, MovieTrackingTrack *track, int coord),
void (*segment_end) (void *userdata))
{
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
MovieTrackingTrack *track;
track= tracking->tracks.first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track)) {
clip_graph_tracking_values_iterate_track(sc, track, userdata, func, segment_start, segment_end);
}
track= track->next;
}
}
void clip_graph_tracking_iterate(SpaceClip *sc, void *userdata,
void (*func) (void *userdata, MovieTrackingMarker *marker))
{
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
MovieTrackingTrack *track;
track= tracking->tracks.first;
while(track) {
if(TRACK_VIEW_SELECTED(sc, track)) {
int i;
for(i= 0; i<track->markersnr; i++) {
MovieTrackingMarker *marker= &track->markers[i];
if(marker->flag&MARKER_DISABLED)
continue;
if(func)
func(userdata, marker);
}
}
track= track->next;
}
}
void clip_delete_track(bContext *C, MovieClip *clip, MovieTrackingTrack *track)
{
MovieTracking *tracking= &clip->tracking;
MovieTrackingStabilization *stab= &tracking->stabilization;
int has_bundle= 0, update_stab= 0;
if(track==tracking->act_track)
tracking->act_track= NULL;
if(track==stab->rot_track) {
stab->rot_track= NULL;
update_stab= 1;
}
/* handle reconstruction display in 3d viewport */
if(track->flag&TRACK_HAS_BUNDLE)
has_bundle= 1;
BKE_tracking_free_track(track);
BLI_freelinkN(&tracking->tracks, track);
WM_event_add_notifier(C, NC_MOVIECLIP|NA_EDITED, clip);
if(update_stab) {
tracking->stabilization.ok= 0;
DAG_id_tag_update(&clip->id, 0);
WM_event_add_notifier(C, NC_MOVIECLIP|ND_DISPLAY, clip);
}
if(has_bundle)
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, NULL);
}
void clip_delete_marker(bContext *C, MovieClip *clip, MovieTrackingTrack *track, MovieTrackingMarker *marker)
{
if(track->markersnr==1) {
clip_delete_track(C, clip, track);
}
else {
BKE_tracking_delete_marker(track, marker->framenr);
WM_event_add_notifier(C, NC_MOVIECLIP|NA_EDITED, clip);
}
}
void clip_view_center_to_point(SpaceClip *sc, float x, float y)
{
int width, height;
float aspx, aspy;
ED_space_clip_size(sc, &width, &height);
ED_space_clip_aspect(sc, &aspx, &aspy);
sc->xof= (x-0.5f)*width*aspx;
sc->yof= (y-0.5f)*height*aspy;
}

@ -298,7 +298,6 @@ static void clip_operatortypes(void)
/* ** clip_ops.c ** */
WM_operatortype_append(CLIP_OT_open);
WM_operatortype_append(CLIP_OT_reload);
// WM_operatortype_append(CLIP_OT_unlink);
WM_operatortype_append(CLIP_OT_view_pan);
WM_operatortype_append(CLIP_OT_view_zoom);
WM_operatortype_append(CLIP_OT_view_zoom_in);
@ -368,6 +367,11 @@ static void clip_operatortypes(void)
WM_operatortype_append(CLIP_OT_track_copy_color);
WM_operatortype_append(CLIP_OT_clean_tracks);
/* graph editing */
WM_operatortype_append(CLIP_OT_graph_select);
WM_operatortype_append(CLIP_OT_graph_delete_curve);
WM_operatortype_append(CLIP_OT_graph_delete_knot);
}
static void clip_keymap(struct wmKeyConfig *keyconf)
@ -511,7 +515,18 @@ static void clip_keymap(struct wmKeyConfig *keyconf)
keymap= WM_keymap_find(keyconf, "Clip Graph Editor", SPACE_CLIP, 0);
/* "timeline" */
WM_keymap_add_item(keymap, "CLIP_OT_change_frame", LEFTMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "CLIP_OT_change_frame", ACTIONMOUSE, KM_PRESS, 0, 0);
/* selection */
WM_keymap_add_item(keymap, "CLIP_OT_graph_select", SELECTMOUSE, KM_PRESS, 0, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "CLIP_OT_graph_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1);
/* delete */
WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_curve", DELKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_curve", XKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_knot", DELKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_knot", XKEY, KM_PRESS, KM_SHIFT, 0);
}
const char *clip_context_dir[]= {"edit_movieclip", NULL};

@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
/** \file blender/editors/space_clip/tracking_ops.c
* \ingroup spclip
*/
#include "MEM_guardedalloc.h"
#include "DNA_camera_types.h"
@ -71,10 +75,6 @@
#include "clip_intern.h" // own include
/** \file blender/editors/space_clip/tracking_ops.c
* \ingroup spclip
*/
static int space_clip_frame_poll(bContext *C)
{
SpaceClip *sc= CTX_wm_space_clip(C);
@ -176,7 +176,7 @@ void CLIP_OT_add_marker(wmOperatorType *ot)
/* properties */
RNA_def_float_vector(ot->srna, "location", 2, NULL, -FLT_MIN, FLT_MAX,
"Location", "Location of marker on frame", -1.f, 1.f);
"Location", "Location of marker on frame", -1.0f, 1.0f);
}
/********************** delete track operator *********************/
@ -187,45 +187,16 @@ static int delete_track_exec(bContext *C, wmOperator *UNUSED(op))
MovieClip *clip= ED_space_clip(sc);
MovieTracking *tracking= &clip->tracking;
MovieTrackingTrack *track= tracking->tracks.first, *next;
MovieTrackingStabilization *stab= &tracking->stabilization;
int has_bundle= 0, update_stab= 0;
while(track) {
next= track->next;
if(TRACK_VIEW_SELECTED(sc, track)) {
if(track==tracking->act_track)
tracking->act_track= NULL;
if(track==stab->rot_track) {
stab->rot_track= NULL;
update_stab= 1;
}
/* handle reconstruction display in 3d viewport */
if(track->flag&TRACK_HAS_BUNDLE)
has_bundle= 1;
BKE_tracking_free_track(track);
BLI_freelinkN(&tracking->tracks, track);
}
if(TRACK_VIEW_SELECTED(sc, track))
clip_delete_track(C, clip, track);
track= next;
}
WM_event_add_notifier(C, NC_MOVIECLIP|NA_EDITED, clip);
if(update_stab) {
tracking->stabilization.ok= 0;
DAG_id_tag_update(&clip->id, 0);
WM_event_add_notifier(C, NC_MOVIECLIP|ND_DISPLAY, clip);
}
if(has_bundle)
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, NULL);
return OPERATOR_FINISHED;
}
@ -260,24 +231,13 @@ static int delete_marker_exec(bContext *C, wmOperator *UNUSED(op))
if(TRACK_VIEW_SELECTED(sc, track)) {
MovieTrackingMarker *marker= BKE_tracking_exact_marker(track, framenr);
if(marker) {
if(track->markersnr==1) {
if(track==clip->tracking.act_track)
clip->tracking.act_track= NULL;
BKE_tracking_free_track(track);
BLI_freelinkN(&clip->tracking.tracks, track);
} else {
BKE_tracking_delete_marker(track, framenr);
}
}
if(marker)
clip_delete_marker(C, clip, track, marker);
}
track= next;
}
WM_event_add_notifier(C, NC_MOVIECLIP|NA_EDITED, clip);
return OPERATOR_FINISHED;
}
@ -378,7 +338,7 @@ static int mouse_on_corner(SpaceClip *sc, MovieTrackingTrack *track, MovieTracki
int area, float co[2], int corner, int width, int height)
{
int inside= 0;
float size= 12.f;
float size= 12.0f;
float min[2], max[2];
float crn[2], dx, dy, tdx, tdy;
@ -396,8 +356,8 @@ static int mouse_on_corner(SpaceClip *sc, MovieTrackingTrack *track, MovieTracki
tdx= 5.0f/width/sc->zoom;
tdy= 5.0f/height/sc->zoom;
dx= MIN2(dx, (max[0]-min[0])/6.f) + tdx;
dy= MIN2(dy, (max[1]-min[1])/6.f) + tdy;
dx= MIN2(dx, (max[0]-min[0])/6.0f) + tdx;
dy= MIN2(dy, (max[1]-min[1])/6.0f) + tdy;
if(corner==0) {
crn[0]= marker->pos[0]+max[0];
@ -421,11 +381,11 @@ static int mouse_on_offset(SpaceClip *sc, MovieTrackingTrack *track, MovieTracki
add_v2_v2v2(pos, marker->pos, track->offset);
dx= 12.f/width/sc->zoom;
dy= 12.f/height/sc->zoom;
dx= 12.0f/width/sc->zoom;
dy= 12.0f/height/sc->zoom;
dx=MIN2(dx, (track->pat_max[0]-track->pat_min[0])/2.f);
dy=MIN2(dy, (track->pat_max[1]-track->pat_min[1])/2.f);
dx=MIN2(dx, (track->pat_max[0]-track->pat_min[0])/2.0f);
dy=MIN2(dy, (track->pat_max[1]-track->pat_min[1])/2.0f);
return co[0]>=pos[0]-dx && co[0]<=pos[0]+dx && co[1]>=pos[1]-dy && co[1]<=pos[1]+dy;
}
@ -697,8 +657,8 @@ static int track_mouse_area(SpaceClip *sc, float co[2], MovieTrackingTrack *trac
epsy= MIN4(track->pat_min[1]-track->search_min[1], track->search_max[1]-track->pat_max[1],
fabsf(track->pat_min[1]), fabsf(track->pat_max[1])) / 2;
epsx= MAX2(epsy, 2.f / width);
epsy= MAX2(epsy, 2.f / height);
epsx= MAX2(epsy, 2.0f / width);
epsy= MAX2(epsy, 2.0f / height);
if(sc->flag&SC_SHOW_MARKER_SEARCH)
if(mouse_on_rect(co, marker->pos, track->search_min, track->search_max, epsx, epsy))
@ -709,8 +669,8 @@ static int track_mouse_area(SpaceClip *sc, float co[2], MovieTrackingTrack *trac
if(mouse_on_rect(co, marker->pos, track->pat_min, track->pat_max, epsx, epsy))
return TRACK_AREA_PAT;
epsx= 12.f/width;
epsy= 12.f/height;
epsx= 12.0f/width;
epsy= 12.0f/height;
if(fabsf(co[0]-marker->pos[0]-track->offset[0])< epsx && fabsf(co[1]-marker->pos[1]-track->offset[1])<=epsy)
return TRACK_AREA_POINT;
@ -1554,10 +1514,10 @@ static int solve_camera_exec(bContext *C, wmOperator *op)
if(tracking->camera.pixel_aspect > 1.0f) {
scene->r.xasp= tracking->camera.pixel_aspect;
scene->r.yasp= 1.f;
scene->r.yasp= 1.0f;
} else {
scene->r.xasp= 1.f;
scene->r.yasp= 1.f / tracking->camera.pixel_aspect;
scene->r.xasp= 1.0f;
scene->r.yasp= 1.0f / tracking->camera.pixel_aspect;
}
WM_event_add_notifier(C, NC_OBJECT, camera);
@ -1824,24 +1784,24 @@ static void set_axis(Scene *scene, Object *ob, MovieTrackingTrack *track, char
if(axis=='X') {
if(fabsf(vec[1])<1e-3) {
mat[0][0]= -1.f; mat[0][1]= 0.f; mat[0][2]= 0.f;
mat[1][0]= 0.f; mat[1][1]= -1.f; mat[1][2]= 0.f;
mat[2][0]= 0.f; mat[2][1]= 0.f; mat[2][2]= 1.0f;
mat[0][0]= -1.0f; mat[0][1]= 0.0f; mat[0][2]= 0.0f;
mat[1][0]= 0.0f; mat[1][1]= -1.0f; mat[1][2]= 0.0f;
mat[2][0]= 0.0f; mat[2][1]= 0.0f; mat[2][2]= 1.0f;
} else {
copy_v3_v3(mat[0], vec);
mat[0][2]= 0.f;
mat[2][0]= 0.f; mat[2][1]= 0.f; mat[2][2]= 1.0f;
mat[0][2]= 0.0f;
mat[2][0]= 0.0f; mat[2][1]= 0.0f; mat[2][2]= 1.0f;
cross_v3_v3v3(mat[1], mat[2], mat[0]);
}
} else {
if(fabsf(vec[0])<1e-3) {
mat[0][0]= -1.f; mat[0][1]= 0.f; mat[0][2]= 0.f;
mat[1][0]= 0.f; mat[1][1]= -1.f; mat[1][2]= 0.f;
mat[2][0]= 0.f; mat[2][1]= 0.f; mat[2][2]= 1.0f;
mat[0][0]= -1.0f; mat[0][1]= 0.0f; mat[0][2]= 0.0f;
mat[1][0]= 0.0f; mat[1][1]= -1.0f; mat[1][2]= 0.0f;
mat[2][0]= 0.0f; mat[2][1]= 0.0f; mat[2][2]= 1.0f;
} else {
copy_v3_v3(mat[1], vec);
mat[1][2]= 0.f;
mat[2][0]= 0.f; mat[2][1]= 0.f; mat[2][2]= 1.0f;
mat[1][2]= 0.0f;
mat[2][0]= 0.0f; mat[2][1]= 0.0f; mat[2][2]= 1.0f;
cross_v3_v3v3(mat[0], mat[1], mat[2]);
}
}
@ -1866,11 +1826,11 @@ static int set_floor_exec(bContext *C, wmOperator *op)
Object *camera= scene->camera;
Object *parent= camera;
int tot= 0;
float vec[3][3], mat[4][4], obmat[4][4], newmat[4][4], orig[3]= {0.f, 0.f, 0.f};
float rot[4][4]={{0.f, 0.f, -1.f, 0.f},
{0.f, 1.f, 0.f, 0.f},
{1.f, 0.f, 0.f, 0.f},
{0.f, 0.f, 0.f, 1.f}}; /* 90 degrees Y-axis rotation matrix */
float vec[3][3], mat[4][4], obmat[4][4], newmat[4][4], orig[3]= {0.0f, 0.0f, 0.0f};
float rot[4][4]={{0.0f, 0.0f, -1.0f, 0.0f},
{0.0f, 1.0f, 0.0f, 0.0f},
{1.0f, 0.0f, 0.0f, 0.0f},
{0.0f, 0.0f, 0.0f, 1.0f}}; /* 90 degrees Y-axis rotation matrix */
if(count_selected_bundles(C)!=3) {
BKE_report(op->reports, RPT_ERROR, "Three tracks with bundles are needed to orient the floor");
@ -2081,7 +2041,7 @@ static int set_scale_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
MovieClip *clip= ED_space_clip(sc);
float dist= RNA_float_get(op->ptr, "distance");
if(dist==0.f)
if(dist==0.0f)
RNA_float_set(op->ptr, "distance", clip->tracking.settings.dist);
return set_scale_exec(C, op);
@ -2886,7 +2846,7 @@ static int clean_tracks_exec(bContext *C, wmOperator *op)
int ok= 1;
ok= (is_track_clean(track, frames, action==TRACKING_CLEAN_DELETE_SEGMENT)) &&
(error == 0.f || (track->flag&TRACK_HAS_BUNDLE)==0 || track->error < error);
(error == 0.0f || (track->flag&TRACK_HAS_BUNDLE)==0 || track->error < error);
if(!ok) {
if(action==TRACKING_CLEAN_SELECT) {
@ -2960,6 +2920,6 @@ void CLIP_OT_clean_tracks(wmOperatorType *ot)
/* properties */
RNA_def_int(ot->srna, "frames", 0, 0, INT_MAX, "Tracked Frames", "Effect on tracks which are tracked less than specified amount of frames", 0, INT_MAX);
RNA_def_float(ot->srna, "error", 0.0f, 0.f, FLT_MAX, "Reprojection Error", "Effect on tracks with have got larger reprojection error", 0.f, 100.0f);
RNA_def_float(ot->srna, "error", 0.0f, 0.0f, FLT_MAX, "Reprojection Error", "Effect on tracks with have got larger reprojection error", 0.0f, 100.0f);
RNA_def_enum(ot->srna, "action", actions_items, 0, "Action", "Cleanup action to execute");
}

@ -207,6 +207,12 @@ typedef struct PreviewImage {
/* fluidsim Ipo */
#define ID_FLUIDSIM MAKE_ID2('F', 'S')
/* ******** NOTE!!! ********
Some areas of code is using staticly sized arrays to hold ID types to be processed
DO NOT forgot to update this value when you're adding new ID type!
*/
#define ID_NUMTYPES 37
#define ID_REAL_USERS(id) (((ID *)id)->us - ((((ID *)id)->flag & LIB_FAKEUSER) ? 1:0))
#define ID_CHECK_UNDO(id) ((GS((id)->name) != ID_SCR) && (GS((id)->name) != ID_WM))

@ -171,6 +171,7 @@ enum {
/* MovieTrackingMarker->flag */
#define MARKER_DISABLED (1<<0)
#define MARKER_TRACKED (1<<1)
#define MARKER_GRAPH_SEL (1<<2)
/* MovieTrackingTrack->flag */
#define TRACK_HAS_BUNDLE (1<<1)

@ -281,7 +281,7 @@ static void rna_def_trackingSettings(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_float_sdna(prop, NULL, "corr");
RNA_def_property_range(prop, -1.0f, 1.0f);
RNA_def_property_ui_range(prop, -1.f, 1.f, .1, 3);
RNA_def_property_ui_range(prop, -1.0f, 1.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Correlation", "Minimal value of correlation between mathed pattern and reference which is still treated as successful tracking");
/* tool settings */
@ -590,28 +590,28 @@ static void rna_def_trackingStabilization(BlenderRNA *brna)
/* max scale */
prop= RNA_def_property(srna, "scale_max", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "maxscale");
RNA_def_property_range(prop, 0.f, 10.f);
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Miximal Scale", "Maximal value for scale factor");
RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, "rna_tracking_flushUpdate");
/* influence_location */
prop= RNA_def_property(srna, "influence_location", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "locinf");
RNA_def_property_range(prop, 0.f, 1.f);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Location Influence", "Influence of stabilization algorithm on footage location");
RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, "rna_tracking_flushUpdate");
/* influence_scale */
prop= RNA_def_property(srna, "influence_scale", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "scaleinf");
RNA_def_property_range(prop, 0.f, 1.f);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Scale Influence", "Influence of stabilization algorithm on footage scale");
RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, "rna_tracking_flushUpdate");
/* influence_rotation */
prop= RNA_def_property(srna, "influence_rotation", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "rotinf");
RNA_def_property_range(prop, 0.f, 1.f);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Rotation Influence", "Influence of stabilization algorithm on footage rotation");
RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, "rna_tracking_flushUpdate");
}

@ -1856,6 +1856,21 @@ static void rna_def_userdef_theme_space_clip(BlenderRNA *brna)
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Current Frame", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "handle_vertex", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Handle Vertex", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "handle_vertex_select", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Handle Vertex Select", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "handle_vertex_size", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 0, 255);
RNA_def_property_ui_text(prop, "Handle Vertex Size", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_themes(BlenderRNA *brna)

@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2006 Blender Foundation.
* The Original Code is Copyright (C) 2011 Blender Foundation.
* All rights reserved.
*
* The Original Code is: all of this file.
@ -60,7 +60,7 @@ static void exec(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **
ImBuf *obuf;
MovieTracking *tracking= &clip->tracking;
int width, height;
float overscan= 0.f;
float overscan= 0.0f;
ibuf->rect_float= cbuf->rect;

@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2006 Blender Foundation.
* The Original Code is Copyright (C) 2011 Blender Foundation.
* All rights reserved.
*
* The Original Code is: all of this file.

@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2006 Blender Foundation.
* The Original Code is Copyright (C) 2011 Blender Foundation.
* All rights reserved.
*
* The Original Code is: all of this file.
@ -61,8 +61,8 @@ CompBuf* node_composit_transform(CompBuf *cbuf, float x, float y, float angle, f
unit_m4(cmat);
/* image center as rotation center */
cmat[3][0]= (float)cbuf->x/2.f;
cmat[3][1]= (float)cbuf->y/2.f;
cmat[3][0]= (float)cbuf->x/2.0f;
cmat[3][1]= (float)cbuf->y/2.0f;
invert_m4_m4(icmat, cmat);
size_to_mat4(smat, svec); /* scale matrix */