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
path: root/source
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
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')
-rw-r--r--source/blender/blenkernel/BKE_tracking.h2
-rw-r--r--source/blender/blenkernel/intern/tracking.c29
-rw-r--r--source/blender/editors/object/object_constraint.c6
-rw-r--r--source/blender/editors/space_view3d/drawobject.c24
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c53
-rw-r--r--source/blender/editors/space_view3d/view3d_snap.c48
6 files changed, 118 insertions, 44 deletions
diff --git a/source/blender/blenkernel/BKE_tracking.h b/source/blender/blenkernel/BKE_tracking.h
index 772306967fc..7b3cb3f69bb 100644
--- a/source/blender/blenkernel/BKE_tracking.h
+++ b/source/blender/blenkernel/BKE_tracking.h
@@ -77,7 +77,7 @@ struct ImBuf *BKE_tracking_get_search_imbuf(struct ImBuf *ibuf, struct MovieTrac
void BKE_track_unique_name(struct ListBase *tracksbase, struct MovieTrackingTrack *track);
struct MovieTrackingTrack *BKE_tracking_named_track(struct MovieTracking *tracking, struct MovieTrackingObject *object, const char *name);
-struct MovieTrackingTrack *BKE_tracking_indexed_track(struct MovieTracking *tracking, int tracknr);
+struct MovieTrackingTrack *BKE_tracking_indexed_track(struct MovieTracking *tracking, int tracknr, struct ListBase **tracksbase_r);
void BKE_tracking_camera_shift(struct MovieTracking *tracking, int winx, int winy, float *shiftx, float *shifty);
void BKE_tracking_camera_to_blender(struct MovieTracking *tracking, struct Scene *scene, struct Camera *camera, int width, int height);
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c
index 931f3f5fc72..262c0576186 100644
--- a/source/blender/blenkernel/intern/tracking.c
+++ b/source/blender/blenkernel/intern/tracking.c
@@ -2257,23 +2257,34 @@ void BKE_tracking_detect_fast(MovieTracking *tracking, ListBase *tracksbase, ImB
#endif
}
-MovieTrackingTrack *BKE_tracking_indexed_track(MovieTracking *tracking, int tracknr)
+MovieTrackingTrack *BKE_tracking_indexed_track(MovieTracking *tracking, int tracknr, ListBase **tracksbase_r)
{
- ListBase *tracksbase= &tracking->tracks; /* XXX: need proper tracks base */
- MovieTrackingTrack *track= tracksbase->first;
+ MovieTrackingObject *object;
int cur= 1;
- while(track) {
- if(track->flag&TRACK_HAS_BUNDLE) {
- if(cur==tracknr)
- return track;
+ object= tracking->objects.first;
+ while(object) {
+ ListBase *tracksbase= BKE_tracking_object_tracks(tracking, object);
+ MovieTrackingTrack *track= tracksbase->first;
+
+ while(track) {
+ if(track->flag&TRACK_HAS_BUNDLE) {
+ if(cur==tracknr) {
+ *tracksbase_r= tracksbase;
+ return track;
+ }
- cur++;
+ cur++;
+ }
+
+ track= track->next;
}
- track= track->next;
+ object= object->next;
}
+ *tracksbase_r= NULL;
+
return NULL;
}
diff --git a/source/blender/editors/object/object_constraint.c b/source/blender/editors/object/object_constraint.c
index a4a33b866ff..fa4f50e240f 100644
--- a/source/blender/editors/object/object_constraint.c
+++ b/source/blender/editors/object/object_constraint.c
@@ -433,6 +433,12 @@ static void test_constraints (Object *owner, bPoseChannel *pchan)
if((data->flag&CAMERASOLVER_ACTIVECLIP)==0 && data->clip == NULL)
curcon->flag |= CONSTRAINT_DISABLE;
}
+ else if (curcon->type == CONSTRAINT_TYPE_OBJECTSOLVER) {
+ bObjectSolverConstraint *data = curcon->data;
+
+ if((data->flag&CAMERASOLVER_ACTIVECLIP)==0 && data->clip == NULL)
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
/* Check targets for constraints */
if (cti && cti->get_constraint_targets) {
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 27bc13a8921..82ee494630d 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -1459,13 +1459,13 @@ static void draw_bundle_sphere(void)
}
static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D *v3d,
- MovieClip *clip, MovieTrackingObject *tracking_object, int flag)
+ MovieClip *clip, MovieTrackingObject *tracking_object, int flag, int *global_track_index)
{
MovieTracking *tracking= &clip->tracking;
MovieTrackingTrack *track;
float mat[4][4], imat[4][4];
unsigned char col[4], scol[4];
- int bundlenr= 1;
+ int tracknr= *global_track_index;
ListBase *tracksbase= BKE_tracking_object_tracks(tracking, tracking_object);
UI_GetThemeColor4ubv(TH_TEXT, col);
@@ -1487,10 +1487,6 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D
else {
float obmat[4][4];
- if(flag & DRAW_PICKING) {
- return;
- }
-
BKE_tracking_get_interpolated_camera(tracking, tracking_object, scene->r.cfra, obmat);
invert_m4_m4(imat, obmat);
@@ -1504,7 +1500,7 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D
continue;
if(flag&DRAW_PICKING)
- glLoadName(base->selcol + (bundlenr<<16));
+ glLoadName(base->selcol + (tracknr<<16));
glPushMatrix();
glTranslatef(track->bundle_pos[0], track->bundle_pos[1], track->bundle_pos[2]);
@@ -1512,7 +1508,6 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D
if(v3d->drawtype==OB_WIRE) {
glDisable(GL_LIGHTING);
- glDepthMask(0);
if(selected) {
if(base==BASACT) UI_ThemeColor(TH_ACTIVE);
@@ -1524,7 +1519,6 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D
drawaxes(0.05f, v3d->bundle_drawtype);
- glDepthMask(1);
glEnable(GL_LIGHTING);
} else if(v3d->drawtype>OB_WIRE) {
if(v3d->bundle_drawtype==OB_EMPTY_SPHERE) {
@@ -1533,7 +1527,6 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D
if(base==BASACT) UI_ThemeColor(TH_ACTIVE);
else UI_ThemeColor(TH_SELECT);
- glDepthMask(0);
glLineWidth(2.f);
glDisable(GL_LIGHTING);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
@@ -1543,7 +1536,6 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glEnable(GL_LIGHTING);
glLineWidth(1.f);
- glDepthMask(1);
}
if(track->flag&TRACK_CUSTOMCOLOR) glColor3fv(track->color);
@@ -1552,7 +1544,6 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D
draw_bundle_sphere();
} else {
glDisable(GL_LIGHTING);
- glDepthMask(0);
if(selected) {
if(base==BASACT) UI_ThemeColor(TH_ACTIVE);
@@ -1564,7 +1555,6 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D
drawaxes(0.05f, v3d->bundle_drawtype);
- glDepthMask(1);
glEnable(GL_LIGHTING);
}
}
@@ -1582,7 +1572,7 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D
view3d_cached_text_draw_add(pos, track->name, 10, V3D_CACHE_TEXT_GLOBALSPACE, tcol);
}
- bundlenr++;
+ tracknr++;
}
if((flag & DRAW_PICKING)==0) {
@@ -1611,6 +1601,8 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D
}
glPopMatrix();
+
+ *global_track_index= tracknr;
}
static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d, MovieClip *clip, int flag)
@@ -1618,6 +1610,7 @@ static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d,
MovieTracking *tracking= &clip->tracking;
MovieTrackingObject *tracking_object;
float curcol[4];
+ int global_track_index= 1;
if((v3d->flag2&V3D_SHOW_RECONSTRUCTION)==0)
return;
@@ -1634,7 +1627,8 @@ static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d,
tracking_object= tracking->objects.first;
while(tracking_object) {
- draw_viewport_object_reconstruction(scene, base, v3d, clip, tracking_object, flag);
+ draw_viewport_object_reconstruction(scene, base, v3d, clip, tracking_object,
+ flag, &global_track_index);
tracking_object= tracking_object->next;
}
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 */
diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c
index ecb54c77e0c..db33426a804 100644
--- a/source/blender/editors/space_view3d/view3d_snap.c
+++ b/source/blender/editors/space_view3d/view3d_snap.c
@@ -55,6 +55,7 @@
#include "BKE_lattice.h"
#include "BKE_main.h"
#include "BKE_object.h"
+#include "BKE_scene.h"
#include "BKE_tracking.h"
#include "WM_api.h"
@@ -756,28 +757,55 @@ void VIEW3D_OT_snap_cursor_to_grid(wmOperatorType *ot)
static void bundle_midpoint(Scene *scene, Object *ob, float vec[3])
{
- MovieTrackingTrack *track;
MovieClip *clip= object_get_movieclip(scene, ob, 0);
+ MovieTracking *tracking= &clip->tracking;
+ MovieTrackingObject *object= tracking->objects.first;
int ok= 0;
- float min[3], max[3], mat[4][4], pos[3];
+ float min[3], max[3], mat[4][4], pos[3], cammat[4][4];
if(!clip)
return;
+ unit_m4(cammat);
+
+ if(!scene->camera)
+ scene->camera= scene_find_camera(scene);
+
+ if(scene->camera)
+ copy_m4_m4(cammat, scene->camera->obmat);
+
BKE_get_tracking_mat(scene, ob, mat);
INIT_MINMAX(min, max);
- track= clip->tracking.tracks.first;
- while(track) {
- int selected= (track->flag&SELECT) || (track->pat_flag&SELECT) || (track->search_flag&SELECT);
- if((track->flag&TRACK_HAS_BUNDLE) && selected) {
- ok= 1;
- mul_v3_m4v3(pos, mat, track->bundle_pos);
- DO_MINMAX(pos, min, max);
+ while(object) {
+ ListBase *tracksbase= BKE_tracking_object_tracks(tracking, object);
+ MovieTrackingTrack *track= tracksbase->first;
+ float obmat[4][4];
+
+ if(object->flag & TRACKING_OBJECT_CAMERA) {
+ copy_m4_m4(obmat, mat);
+ }
+ else {
+ float imat[4][4];
+
+ BKE_tracking_get_interpolated_camera(tracking, object, scene->r.cfra, imat);
+ invert_m4(imat);
+
+ mul_m4_m4m4(obmat, imat, cammat);
+ }
+
+ while(track) {
+ if((track->flag&TRACK_HAS_BUNDLE) && TRACK_SELECTED(track)) {
+ ok= 1;
+ mul_v3_m4v3(pos, obmat, track->bundle_pos);
+ DO_MINMAX(pos, min, max);
+ }
+
+ track= track->next;
}
- track= track->next;
+ object= object->next;
}
if(ok) {