diff options
-rw-r--r-- | source/blender/blenkernel/BKE_constraint.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/constraint.c | 56 | ||||
-rw-r--r-- | source/blender/src/drawobject.c | 2 | ||||
-rw-r--r-- | source/blender/src/editconstraint.c | 5 |
4 files changed, 62 insertions, 2 deletions
diff --git a/source/blender/blenkernel/BKE_constraint.h b/source/blender/blenkernel/BKE_constraint.h index 0a878d93ebe..6570f547e48 100644 --- a/source/blender/blenkernel/BKE_constraint.h +++ b/source/blender/blenkernel/BKE_constraint.h @@ -55,6 +55,7 @@ void do_constraint_channels (struct ListBase *conbase, struct ListBase *chanbase short get_constraint_target (struct bConstraint *con, short ownertype, void *ownerdata, float mat[][4], float size[3], float time); struct bConstraintChannel *find_constraint_channel (ListBase *list, const char *name); void free_constraint_channels (ListBase *chanbase); +char constraint_has_target (struct bConstraint *con); /* Constraint target/owner types */ #define TARGET_OBJECT 1 // string is "" diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index 10e29759347..9e9a0c51405 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -70,6 +70,62 @@ static void constraint_target_to_mat4 (Object *ob, const char *substring, float /* Functions */ +char constraint_has_target (bConstraint *con) { + switch (con->type){ + case CONSTRAINT_TYPE_TRACKTO: + { + bTrackToConstraint *data = con->data; + if (data->tar) + return 1; + } + break; + case CONSTRAINT_TYPE_KINEMATIC: + { + bKinematicConstraint *data = con->data; + if (data->tar) + return 1; + } + break; + case CONSTRAINT_TYPE_FOLLOWPATH: + { + bFollowPathConstraint *data = con->data; + if (data->tar) + return 1; + } + break; + case CONSTRAINT_TYPE_ROTLIKE: + { + bRotateLikeConstraint *data = con->data; + if (data->tar) + return 1; + } + break; + case CONSTRAINT_TYPE_LOCLIKE: + { + bLocateLikeConstraint *data = con->data; + if (data->tar) + return 1; + } + break; + case CONSTRAINT_TYPE_ACTION: + { + bActionConstraint *data = con->data; + if (data->tar) + return 1; + } + break; + case CONSTRAINT_TYPE_LOCKTRACK: + { + bLockTrackConstraint *data = con->data; + if (data->tar) + return 1; + } + break; + } + // Unknown types or CONSTRAINT_TYPE_NULL or no target + return 0; +} + void unique_constraint_name (bConstraint *con, ListBase *list){ char tempname[64]; int number; diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index 8fa67dbded7..6138f64c831 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -3716,7 +3716,7 @@ void draw_object(Base *base) glColor3ubv(col2); for (curcon = list->first; curcon; curcon=curcon->next){ - if ((curcon->flag & CONSTRAINT_EXPAND)&&(curcon->type!=CONSTRAINT_TYPE_NULL)){ + if ((curcon->flag & CONSTRAINT_EXPAND)&&(curcon->type!=CONSTRAINT_TYPE_NULL)&&(constraint_has_target(curcon))){ get_constraint_target(curcon, TARGET_OBJECT, NULL, tmat, size, bsystem_time(ob, 0, (float)(G.scene->r.cfra), ob->sf)); setlinestyle(3); glBegin(GL_LINES); diff --git a/source/blender/src/editconstraint.c b/source/blender/src/editconstraint.c index 4f3e4d40513..999a4d5f444 100644 --- a/source/blender/src/editconstraint.c +++ b/source/blender/src/editconstraint.c @@ -491,7 +491,10 @@ static short detect_constraint_loop (Object *owner, const char* substring, int d case CONSTRAINT_TYPE_TRACKTO: { bTrackToConstraint *data = curcon->data; - if (!exist_object(data->tar)) data->tar = NULL; + if (!exist_object(data->tar)) { + data->tar = NULL; + break; + } if (typefrom != CONSTRAINT_TYPE_TRACKTO && typefrom != CONSTRAINT_TYPE_LOCKTRACK){ if (add_constraint_element (data->tar, data->subtarget, owner, substring)){ |