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:
authorJoshua Leung <aligorith@gmail.com>2010-02-21 14:05:52 +0300
committerJoshua Leung <aligorith@gmail.com>2010-02-21 14:05:52 +0300
commitf3b9ea066eeb2b69b81723c24cb5d9ffdbf0556f (patch)
treebfe587e7ece7c56a5623b504b59fd8201ddf33c4
parente3dba7d6f4fd99438aad6c27f82462e567b14ce5 (diff)
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.
-rw-r--r--source/blender/blenkernel/BKE_constraint.h1
-rw-r--r--source/blender/blenkernel/intern/constraint.c23
-rw-r--r--source/blender/editors/object/object_relations.c11
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;
}