Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2011-12-15 20:10:49 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2011-12-15 20:10:49 +0400
commite534af906a938b6e3cf0727d577c89a51052f6ff (patch)
tree28b719240db65d87bcb45363d1638782cc410312 /source/blender/editors/space_view3d/view3d_select.c
parent53f37cd1edb6e4aa5ea1c8a0da2c466e0cad497c (diff)
Object tracking: various fixes and improvements
- Bundles selection is now available for object's bundles - If bundles selection wasn't changed in 3D viewport, fallback to regular object selection, so objects behind bundles can be selected - Snap cursor to selection now respects object's bundle selection - Object and rack name now can be selected from list in constraint settings - Added preset for tracks used for object tracking
Diffstat (limited to 'source/blender/editors/space_view3d/view3d_select.c')
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c53
1 files changed, 44 insertions, 9 deletions
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index d8ff01a880d..7da07149490 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -1320,6 +1320,25 @@ Base *ED_view3d_give_base_under_cursor(bContext *C, const int mval[2])
return basact;
}
+static void deselect_all_tracks(MovieTracking *tracking)
+{
+ MovieTrackingObject *object;
+
+ object= tracking->objects.first;
+ while(object) {
+ ListBase *tracksbase= BKE_tracking_object_tracks(tracking, object);
+ MovieTrackingTrack *track= tracksbase->first;
+
+ while(track) {
+ BKE_tracking_deselect_track(track, TRACK_AREA_ALL);
+
+ track= track->next;
+ }
+
+ object= object->next;
+ }
+}
+
/* mval is region coords */
static int mouse_select(bContext *C, const int mval[2], short extend, short obcenter, short enumerate)
{
@@ -1391,31 +1410,41 @@ static int mouse_select(bContext *C, const int mval[2], short extend, short obce
if(basact->object->type==OB_CAMERA) {
if(BASACT==basact) {
int i, hitresult;
- MovieTrackingTrack *track;
+ int changed= 0;
for (i=0; i< hits; i++) {
hitresult= buffer[3+(i*4)];
/* if there's bundles in buffer select bundles first,
so non-camera elements should be ignored in buffer */
- if(basact->selcol != (hitresult & 0xFFFF))
+ if(basact->selcol != (hitresult & 0xFFFF)) {
continue;
+ }
/* index of bundle is 1<<16-based. if there's no "bone" index
in hight word, this buffer value belongs to camera,. not to bundle */
if(buffer[4*i+3] & 0xFFFF0000) {
MovieClip *clip= object_get_movieclip(scene, basact->object, 0);
MovieTracking *tracking= &clip->tracking;
- int selected;
-
- track= BKE_tracking_indexed_track(&clip->tracking, hitresult >> 16);
+ ListBase *tracksbase;
+ MovieTrackingTrack *track;
- selected= (track->flag&SELECT) || (track->pat_flag&SELECT) || (track->search_flag&SELECT);
+ track= BKE_tracking_indexed_track(&clip->tracking, hitresult >> 16, &tracksbase);
- if(selected && extend)
+ if(TRACK_SELECTED(track) && extend) {
+ changed= 0;
BKE_tracking_deselect_track(track, TRACK_AREA_ALL);
- else
- BKE_tracking_select_track(&tracking->tracks, track, TRACK_AREA_ALL, extend);
+ }
+ else {
+ int oldsel= TRACK_SELECTED(track) ? 1 : 0;
+ if(!extend)
+ deselect_all_tracks(tracking);
+
+ BKE_tracking_select_track(tracksbase, track, TRACK_AREA_ALL, extend);
+
+ if(oldsel!=(TRACK_SELECTED(track) ? 1 : 0))
+ changed= 1;
+ }
basact->flag|= SELECT;
basact->object->flag= basact->flag;
@@ -1428,6 +1457,12 @@ static int mouse_select(bContext *C, const int mval[2], short extend, short obce
break;
}
}
+
+ if(!changed) {
+ /* fallback to regular object selection if no new bundles were selected,
+ allows to select object parented to reconstruction object */
+ basact= mouse_select_eval_buffer(&vc, buffer, hits, mval, startbase, 0);
+ }
}
}
else if(ED_do_pose_selectbuffer(scene, basact, buffer, hits, extend) ) { /* then bone is found */