From f3b9ea066eeb2b69b81723c24cb5d9ffdbf0556f Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Sun, 21 Feb 2010 11:05:52 +0000 Subject: [PATCH] Bugfix #21245: "Track to" (Ctrl + T) operator was missing notifier updates Bugfix #21255: Clear track operator did not remove TrackTo constraints too. This could still be made to do Locked Track and other tracking constraints later too, but for now this will do. --- source/blender/blenkernel/BKE_constraint.h | 1 + source/blender/blenkernel/intern/constraint.c | 23 ++++++++++++++++--- .../blender/editors/object/object_relations.c | 11 +++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/source/blender/blenkernel/BKE_constraint.h b/source/blender/blenkernel/BKE_constraint.h index 42089e37d63..9c5e89bff76 100644 --- a/source/blender/blenkernel/BKE_constraint.h +++ b/source/blender/blenkernel/BKE_constraint.h @@ -136,6 +136,7 @@ struct bConstraint *add_pose_constraint(struct Object *ob, struct bPoseChannel * int remove_constraint(ListBase *list, struct bConstraint *con); int remove_constraint_index(ListBase *list, int index); +void remove_constraints_type(ListBase *list, short type, short last_only); /* Constraints + Proxies function prototypes */ void extract_proxylocal_constraints(struct ListBase *dst, struct ListBase *src); diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index fe2e009918c..c22510a2527 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -3903,6 +3903,26 @@ int remove_constraint_index (ListBase *list, int index) return 0; } +/* Remove all the constraints of the specified type from the given constraint stack */ +void remove_constraints_type (ListBase *list, short type, short last_only) +{ + bConstraint *con, *conp; + + if (list == NULL) + return; + + /* remove from the end of the list to make it faster to find the last instance */ + for (con= list->last; con; con= conp) { + conp= con->prev; + + if (con->type == type) { + remove_constraint(list, con); + if (last_only) + return; + } + } +} + /* ......... */ /* Creates a new constraint, initialises its data, and returns it */ @@ -4062,9 +4082,6 @@ void copy_constraints (ListBase *dst, const ListBase *src) /* make a new copy of the constraint's data */ con->data = MEM_dupallocN(con->data); - // NOTE: depreceated... old animation system - id_us_plus((ID *)con->ipo); - /* only do specific constraints if required */ if (cti) { /* perform custom copying operations if needed */ diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index 71b0dd82252..b2ccd96f3a7 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -873,9 +873,17 @@ static int object_track_clear_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) { + /* remove track-object for old track */ ob->track= NULL; ob->recalc |= OB_RECALC; + /* also remove all Track To constraints + * TODO: + * - do we only want to do the last instance (use 1 as last arg instead) + * - also, what about other forms of tracking? + */ + remove_constraints_type(&ob->constraints, CONSTRAINT_TYPE_TRACKTO, 0); + if(type == 1) ED_object_apply_obmat(ob); } @@ -883,6 +891,7 @@ static int object_track_clear_exec(bContext *C, wmOperator *op) DAG_ids_flush_update(0); DAG_scene_sort(CTX_data_scene(C)); + WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL); return OPERATOR_FINISHED; } @@ -973,8 +982,10 @@ static int track_set_exec(bContext *C, wmOperator *op) } CTX_DATA_END; } + DAG_scene_sort(scene); DAG_ids_flush_update(0); + WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL); return OPERATOR_FINISHED; }