[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12353] trunk/blender/source/blender: == PyConstraints - Now working again ==

Joshua Leung aligorith at gmail.com
Tue Oct 23 10:23:57 CEST 2007


Revision: 12353
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12353
Author:   aligorith
Date:     2007-10-23 10:23:57 +0200 (Tue, 23 Oct 2007)

Log Message:
-----------
== 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. 

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/constraint.c
    trunk/blender/source/blender/python/BPY_interface.c
    trunk/blender/source/blender/src/buttons_object.c

Modified: trunk/blender/source/blender/blenkernel/intern/constraint.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/constraint.c	2007-10-23 06:24:29 UTC (rev 12352)
+++ trunk/blender/source/blender/blenkernel/intern/constraint.c	2007-10-23 08:23:57 UTC (rev 12353)
@@ -1804,15 +1804,13 @@
 static void pycon_free (bConstraint *con)
 {
 	bPythonConstraint *data= con->data;
-	bConstraintTarget *ct;
 	
 	/* id-properties */
 	IDP_FreeProperty(data->prop);
 	MEM_freeN(data->prop);
 	
 	/* multiple targets */
-	while ( (ct = data->targets.first) ) 
-		MEM_freeN(ct);
+	BLI_freelistN(&data->targets);
 }	
 
 static void pycon_relink (bConstraint *con)

Modified: trunk/blender/source/blender/python/BPY_interface.c
===================================================================
--- trunk/blender/source/blender/python/BPY_interface.c	2007-10-23 06:24:29 UTC (rev 12352)
+++ trunk/blender/source/blender/python/BPY_interface.c	2007-10-23 08:23:57 UTC (rev 12353)
@@ -1188,11 +1188,11 @@
 		/* 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 @@
 			/* 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 @@
 					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 @@
 		/* no script, so clear any settings/data now */
 		data->tarnum = 0;
 		data->flag = 0;
+		con->flag &= ~CONSTRAINT_DISABLE;
 		
 		BLI_freelistN(&data->targets);
 		

Modified: trunk/blender/source/blender/src/buttons_object.c
===================================================================
--- trunk/blender/source/blender/src/buttons_object.c	2007-10-23 06:24:29 UTC (rev 12352)
+++ trunk/blender/source/blender/src/buttons_object.c	2007-10-23 08:23:57 UTC (rev 12353)
@@ -583,21 +583,21 @@
 						
 						/* target label */
 						sprintf(tarstr, "Target %02d:", tarnum);
-						uiDefBut(block, LABEL, B_CONSTRAINT_TEST, tarstr, *xco+60, *yco-(48+yoffset), 55, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); 
+						uiDefBut(block, LABEL, B_CONSTRAINT_TEST, tarstr, *xco+45, *yco-(48+yoffset), 60, 18, NULL, 0.0, 0.0, 0.0, 0.0, ""); 
 						
 						/* target space-selector - per target */
 						if (is_armature_target(ct->tar)) {
 							uiDefButS(block, MENU, B_CONSTRAINT_TEST, "Target Space %t|World Space %x0|Pose Space %x3|Local with Parent %x4|Local Space %x1", 
-															*xco+60, *yco-(66+yoffset), 55, 18, &ct->space, 0, 0, 0, 0, "Choose space that target is evaluated in");	
+															*xco+10, *yco-(66+yoffset), 100, 18, &ct->space, 0, 0, 0, 0, "Choose space that target is evaluated in");	
 						}
 						else {
 							uiDefButS(block, MENU, B_CONSTRAINT_TEST, "Target Space %t|World Space %x0|Local (Without Parent) Space %x1", 
-															*xco+60, *yco-(66+yoffset), 55, 18, &ct->space, 0, 0, 0, 0, "Choose space that target is evaluated in");	
+															*xco+10, *yco-(66+yoffset), 100, 18, &ct->space, 0, 0, 0, 0, "Choose space that target is evaluated in");	
 						}
 						
 						uiBlockBeginAlign(block);
 							/* target object */
-							uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-48, 150, 18, &ct->tar, "Target Object"); 
+							uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-(48+yoffset), 150, 18, &ct->tar, "Target Object"); 
 							
 							/* subtarget */
 							if (is_armature_target(ct->tar)) {





More information about the Bf-blender-cvs mailing list