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>2008-08-05 07:29:46 +0400
committerJoshua Leung <aligorith@gmail.com>2008-08-05 07:29:46 +0400
commit9e968cea4743640848a6e878de7fc1de47dc69b3 (patch)
tree50cd9a25ac2e91d0359f77d4ca8e528dcddb19ef /source/blender
parent07bc1e56fec864748c160af02659e3fcff317be9 (diff)
Bugfix #16673: Segfault when using Bake Constraints Script
There were several buggy things here (in order of significance): 1) PyAPI method didn't check to make sure that there was an active posechannel when deleting posechannel constraints. This was required by constraint_active_func() to be able to update the 'active' flags for the constraints in that stack 2) PyAPI method removed the links to the constraint data from the constraints list, even though that wasn't necessary, and may have caused memory leaks. 3) constraint_active_func() had no error checking for no constraints-stack being found
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/python/api2_2x/Constraint.c29
-rw-r--r--source/blender/src/buttons_object.c3
2 files changed, 24 insertions, 8 deletions
diff --git a/source/blender/python/api2_2x/Constraint.c b/source/blender/python/api2_2x/Constraint.c
index 8db6a49465e..a62a5ee7ed8 100644
--- a/source/blender/python/api2_2x/Constraint.c
+++ b/source/blender/python/api2_2x/Constraint.c
@@ -29,6 +29,7 @@
#include "Constraint.h" /*This must come first*/
+#include "DNA_armature_types.h"
#include "DNA_object_types.h"
#include "DNA_effect_types.h"
#include "DNA_vec_types.h"
@@ -43,6 +44,7 @@
#include "BKE_constraint.h"
#include "BLI_blenlib.h"
#include "BIF_editconstraint.h"
+#include "BIF_poseobject.h"
#include "BSE_editipo.h"
#include "MEM_guardedalloc.h"
#include "butspace.h"
@@ -2286,19 +2288,32 @@ static PyObject *ConstraintSeq_moveDown( BPy_ConstraintSeq *self, BPy_Constraint
static PyObject *ConstraintSeq_remove( BPy_ConstraintSeq *self, BPy_Constraint *value )
{
- bConstraint *con = locate_constr( self, value );
+ bConstraint *con = locate_constr(self, value);
+ bPoseChannel *active= NULL;
/* if we can't locate the constraint, return (exception already set) */
- if( !con )
+ if (!con)
return (PyObject *)NULL;
- /* do the actual removal */
- if( self->pchan )
- BLI_remlink( &self->pchan->constraints, con );
- else
- BLI_remlink( &self->obj->constraints, con);
+ /* check if we need to set temporary 'active' flag for pchan */
+ if (self->pchan) {
+ active= get_active_posechannel(self->obj);
+
+ if (active != self->pchan) {
+ if (active) active->bone->flag &= ~BONE_ACTIVE;
+ self->pchan->bone->flag |= BONE_ACTIVE;
+ }
+ }
+
+ /* del_constr_func() frees constraint + its data */
del_constr_func( self->obj, con );
+ /* reset active pchan (if applicable) */
+ if (self->pchan && self->pchan!=active) {
+ if (active) active->bone->flag |= BONE_ACTIVE;
+ self->pchan->bone->flag &= ~BONE_ACTIVE;
+ }
+
/* erase the link to the constraint */
value->con = NULL;
diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c
index 2c7802c3302..58f3bff09c8 100644
--- a/source/blender/src/buttons_object.c
+++ b/source/blender/src/buttons_object.c
@@ -173,6 +173,7 @@ static void constraint_active_func(void *ob_v, void *con_v)
}
lb= get_active_constraints(ob);
+ if (lb == NULL) return;
for(con= lb->first; con; con= con->next) {
if(con==con_v) con->flag |= CONSTRAINT_ACTIVE;
@@ -307,7 +308,7 @@ void del_constr_func (void *ob_v, void *con_v)
}
/* remove constraint itself */
lb= get_active_constraints(ob_v);
- free_constraint_data (con);
+ free_constraint_data(con);
BLI_freelinkN(lb, con);
constraint_active_func(ob_v, NULL);