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>2007-10-23 12:23:57 +0400
committerJoshua Leung <aligorith@gmail.com>2007-10-23 12:23:57 +0400
commitcf8032f3155356833737caae65668400fd2d57a6 (patch)
treeb508283d30ab47c17a0464361d044113381cc5d0 /source/blender/python
parentbf68055b93dea393cfd9a9db2f0ae945c574bbe0 (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.c26
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);