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.
This commit is contained in:
Joshua Leung 2010-02-21 11:05:52 +00:00
parent e3dba7d6f4
commit f3b9ea066e
3 changed files with 32 additions and 3 deletions

@ -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);

@ -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 */

@ -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;
}