diff options
author | Joshua Leung <aligorith@gmail.com> | 2007-10-23 12:23:57 +0400 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2007-10-23 12:23:57 +0400 |
commit | cf8032f3155356833737caae65668400fd2d57a6 (patch) | |
tree | b508283d30ab47c17a0464361d044113381cc5d0 /source/blender/python | |
parent | bf68055b93dea393cfd9a9db2f0ae945c574bbe0 (diff) |
== PyConstraints - Now working again ==
I've finally traced down the causes of several of the bugs which caused PyConstraints to work incorrectly (or not at all).
* Freeing is now done using BLI_freelistN inside the pycon_free function, instead of looping through the targets ourselves. This fixes all of those Memblock free: pointer not in list errors.
* BPY_pyconstraint_update now correctly creates/frees the constraint's targets as needed. Previously, it was creating/removing the wrong number of targets. Also, pyconstraints no longer get disabled when using armatures (not bones)
* The panel drawing was also not working right, as there were still some offset issues.
Diffstat (limited to 'source/blender/python')
-rw-r--r-- | source/blender/python/BPY_interface.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/source/blender/python/BPY_interface.c b/source/blender/python/BPY_interface.c index 27cfc2fa11c..238c05d54a4 100644 --- a/source/blender/python/BPY_interface.c +++ b/source/blender/python/BPY_interface.c @@ -1188,11 +1188,11 @@ void BPY_pyconstraint_update(Object *owner, bConstraint *con) /* script does exist. it is assumed that this is a valid pyconstraint script */ PyObject *globals; PyObject *retval, *gval; - int num; + int num, i; - /* clear the flag first */ + /* clear the relevant flags first */ data->flag = 0; - + /* populate globals dictionary */ globals = CreateGlobalDictionary(); retval = RunPython(data->text, globals); @@ -1222,18 +1222,23 @@ void BPY_pyconstraint_update(Object *owner, bConstraint *con) /* check if the number of targets has changed */ if (num < data->tarnum) { /* free a few targets */ - for (ct=data->targets.last; num > -1; num--, ct=data->targets.last, data->tarnum--) + num= data->tarnum - num; + for (i = 0; i < num; i++, data->tarnum--) { + ct= data->targets.last; BLI_freelinkN(&data->targets, ct); + } } else if (num > data->tarnum) { /* add a few targets */ - for ( ; num > -1; num--, data->tarnum++) { + num = num - data->tarnum; + for (i = 0; i < num; i++, data->tarnum++) { ct= MEM_callocN(sizeof(bConstraintTarget), "PyConTarget"); BLI_addtail(&data->targets, ct); } } /* validate targets */ + con->flag &= ~CONSTRAINT_DISABLE; for (ct= data->targets.first; ct; ct= ct->next) { if (!exist_object(ct->tar)) { ct->tar = NULL; @@ -1241,11 +1246,11 @@ void BPY_pyconstraint_update(Object *owner, bConstraint *con) break; } - if ( (ct->tar == owner) && - (!get_named_bone(get_armature(owner), ct->subtarget)) ) - { - con->flag |= CONSTRAINT_DISABLE; - break; + if ((ct->tar == owner) && (ct->subtarget[0] != 0)) { + if (get_named_bone(get_armature(owner), ct->subtarget) == NULL) { + con->flag |= CONSTRAINT_DISABLE; + break; + } } } @@ -1268,6 +1273,7 @@ void BPY_pyconstraint_update(Object *owner, bConstraint *con) /* no script, so clear any settings/data now */ data->tarnum = 0; data->flag = 0; + con->flag &= ~CONSTRAINT_DISABLE; BLI_freelistN(&data->targets); |