[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13125] trunk/blender/source/blender: == Local Constraints for Proxies (Peach Request) ==

Joshua Leung aligorith at gmail.com
Fri Jan 4 12:21:50 CET 2008


Revision: 13125
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13125
Author:   aligorith
Date:     2008-01-04 12:21:50 +0100 (Fri, 04 Jan 2008)

Log Message:
-----------
== Local Constraints for Proxies (Peach Request) ==

Proxy protected bones can now get local (per-file) constraints added to them, which will be preserved after a file load. This is necessary for adding constraints to proxy-protected bones for special purposes while animating (i.e.  adding CopyLocs to IK-hand controls to pick up an object). 

These must be added after any constraints from the proxy, as proxy constraints may come and go without warning. As such, the UI forbids this from happening by removing the relevant button.

I've also made UI-changes to show which constraints come from the proxy (the buttons to move the constraint up/down and delete it, are replace with two icons - a the proxy 'ghost' icon and a lock). Also, trying to change any settings of proxy-protected constraint will show an error.


Notes:
* Object constraints are still not playing nice with proxies yet. They didn't before this commit either...

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_constraint.h
    trunk/blender/source/blender/blenkernel/intern/armature.c
    trunk/blender/source/blender/blenkernel/intern/constraint.c
    trunk/blender/source/blender/makesdna/DNA_constraint_types.h
    trunk/blender/source/blender/src/buttons_object.c
    trunk/blender/source/blender/src/editconstraint.c
    trunk/blender/source/blender/src/poseobject.c

Modified: trunk/blender/source/blender/blenkernel/BKE_constraint.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_constraint.h	2008-01-04 11:21:31 UTC (rev 13124)
+++ trunk/blender/source/blender/blenkernel/BKE_constraint.h	2008-01-04 11:21:50 UTC (rev 13125)
@@ -117,6 +117,9 @@
 void relink_constraints(struct ListBase *list);
 void free_constraint_data(struct bConstraint *con);
 
+/* Constraints + Proxies function prototypes */
+void extract_proxylocal_constraints(struct ListBase *dst, struct ListBase *src);
+short proxylocked_constraints_owner(struct Object *ob, struct bPoseChannel *pchan);
 
 /* Constraint Channel function prototypes */
 struct bConstraintChannel *get_constraint_channel(struct ListBase *list, const char *name);
@@ -126,6 +129,7 @@
 void clone_constraint_channels(struct ListBase *dst, struct ListBase *src);
 void free_constraint_channels(struct ListBase *chanbase);
 
+
 /* Constraint Evaluation function prototypes */
 struct bConstraintOb *constraints_make_evalob(struct Object *ob, void *subdata, short datatype);
 void constraints_clear_evalob(struct bConstraintOb *cob);

Modified: trunk/blender/source/blender/blenkernel/intern/armature.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/armature.c	2008-01-04 11:21:31 UTC (rev 13124)
+++ trunk/blender/source/blender/blenkernel/intern/armature.c	2008-01-04 11:21:50 UTC (rev 13125)
@@ -1317,6 +1317,7 @@
 	pchan= pose->chanbase.first;
 	for(; pchan; pchan= pchan->next) {
 		if(pchan->bone->layer & layer_protected) {
+			ListBase proxylocal_constraints = {NULL, NULL};
 			pchanp= get_pose_channel(frompose, pchan->name);
 			
 			/* copy posechannel to temp, but restore important pointers */
@@ -1327,9 +1328,16 @@
 			pchanw.child= pchan->child;
 			pchanw.path= NULL;
 			
-			/* constraints, set target ob pointer to own object */
+			/* constraints - proxy constraints are flushed... local ones are added after 
+			 *	1. extract constraints not from proxy (CONSTRAINT_PROXY_LOCAL) from pchan's constraints
+			 *	2. copy proxy-pchan's constraints on-to new
+			 *	3. add extracted local constraints back on top 
+			 */
+			extract_proxylocal_constraints(&proxylocal_constraints, &pchan->constraints);
 			copy_constraints(&pchanw.constraints, &pchanp->constraints);
+			addlisttolist(&pchanw.constraints, &proxylocal_constraints);
 			
+			/* constraints - set target ob pointer to own object */
 			for (con= pchanw.constraints.first; con; con= con->next) {
 				bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
 				ListBase targets = {NULL, NULL};

Modified: trunk/blender/source/blender/blenkernel/intern/constraint.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/constraint.c	2008-01-04 11:21:31 UTC (rev 13124)
+++ trunk/blender/source/blender/blenkernel/intern/constraint.c	2008-01-04 11:21:50 UTC (rev 13125)
@@ -3246,6 +3246,46 @@
 	}
 }
 
+/* -------- Constraints and Proxies ------- */
+
+/* Rescue all constraints tagged as being CONSTRAINT_PROXY_LOCAL (i.e. added to bone that's proxy-synced in this file) */
+void extract_proxylocal_constraints (ListBase *dst, ListBase *src)
+{
+	bConstraint *con, *next;
+	
+	/* for each tagged constraint, remove from src and move to dst */
+	for (con= src->first; con; con= next) {
+		next= con->next;
+		
+		/* check if tagged */
+		if (con->flag & CONSTRAINT_PROXY_LOCAL) {
+			BLI_remlink(src, con);
+			BLI_addtail(dst, con);
+		}
+	}
+}
+
+/* Returns if the owner of the constraint is proxy-protected */
+short proxylocked_constraints_owner (Object *ob, bPoseChannel *pchan)
+{
+	/* Currently, constraints can only be on object or bone level */
+	if (ob && ob->proxy) {
+		if (ob->pose && pchan) {
+			bArmature *arm= ob->data;
+			
+			/* On bone-level, check if bone is on proxy-protected layer */
+			if ((pchan->bone) && (pchan->bone->layer & arm->layer_protected))
+				return 1;
+		}
+		else {
+			/* FIXME: constraints on object-level are not handled well yet */
+			return 1;
+		}	
+	}
+	
+	return 0;
+}
+
 /* -------- Target-Matrix Stuff ------- */
 
 /* This function is a relic from the prior implementations of the constraints system, when all

Modified: trunk/blender/source/blender/makesdna/DNA_constraint_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_constraint_types.h	2008-01-04 11:21:31 UTC (rev 13124)
+++ trunk/blender/source/blender/makesdna/DNA_constraint_types.h	2008-01-04 11:21:50 UTC (rev 13125)
@@ -352,7 +352,9 @@
 		/* to indicate that the owner's space should only be changed into ownspace, but not out of it */
 	CONSTRAINT_SPACEONCE = 	(1<<6),
 		/* influence ipo is on constraint itself, not in action channel */
-	CONSTRAINT_OWN_IPO	= (1<<7)
+	CONSTRAINT_OWN_IPO	= (1<<7),
+		/* indicates that constraint was added locally (i.e.  didn't come from the proxy-lib) */
+	CONSTRAINT_PROXY_LOCAL = (1<<8)
 } B_CONSTRAINT_FLAG;
 
 /* bConstraint->ownspace/tarspace */

Modified: trunk/blender/source/blender/src/buttons_object.c
===================================================================
--- trunk/blender/source/blender/src/buttons_object.c	2008-01-04 11:21:31 UTC (rev 13124)
+++ trunk/blender/source/blender/src/buttons_object.c	2008-01-04 11:21:50 UTC (rev 13125)
@@ -190,15 +190,18 @@
 
 static void add_constraint_to_active(Object *ob, bConstraint *con)
 {
-	ListBase *list;
+	ListBase *list= get_active_constraints(ob);
+	bPoseChannel *pchan= get_active_posechannel(ob);
 	
-	list = get_active_constraints(ob);
 	if (list) {
 		unique_constraint_name(con, list);
 		BLI_addtail(list, con);
 		
+		if (proxylocked_constraints_owner(ob, pchan))
+			con->flag |= CONSTRAINT_PROXY_LOCAL;
+		
 		con->flag |= CONSTRAINT_ACTIVE;
-		for(con= con->prev; con; con= con->prev)
+		for (con= con->prev; con; con= con->prev)
 			con->flag &= ~CONSTRAINT_ACTIVE;
 	}
 }
@@ -209,8 +212,7 @@
 {
 	Object *ob= ob_v;
 	
-	/* todo; check object if it has ob-level action ipo */
-	
+	/* todo: check object if it has ob-level action ipo */
 	if (ob->flag & OB_POSEMODE) {
 		bPoseChannel *pchan;
 		
@@ -503,12 +505,15 @@
 static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, short *xco, short *yco)
 {
 	Object *ob= OBACT;
+	bPoseChannel *pchan= get_active_posechannel(ob);
 	bConstraintTypeInfo *cti;
 	uiBut *but;
 	char typestr[32];
 	short height, width = 265;
+	short proxy_protected;
 	int rb_col;
 
+	/* get constraint typeinfo */
 	cti= constraint_get_typeinfo(con);
 	if (cti == NULL) {
 		/* exception for 'Null' constraint - it doesn't have constraint typeinfo! */
@@ -520,6 +525,13 @@
 	else
 		strcpy(typestr, cti->name);
 		
+	/* determine whether constraint is proxy protected or not */
+	if (proxylocked_constraints_owner(ob, pchan)) {
+		proxy_protected= (con->flag & CONSTRAINT_PROXY_LOCAL) ? 0 : 1;
+	}
+	else
+		proxy_protected= 1;
+		
 	/* unless button has own callback, it adds this callback to button */
 	uiBlockSetFunc(block, constraint_active_func, ob, con);
 
@@ -534,17 +546,8 @@
 	/* open/close */
 	uiDefIconButBitS(block, ICONTOG, CONSTRAINT_EXPAND, B_CONSTRAINT_TEST, ICON_DISCLOSURE_TRI_RIGHT, *xco-10, *yco, 20, 20, &con->flag, 0.0, 0.0, 0.0, 0.0, "Collapse/Expand Constraint");
 	
-	/* up/down */
-	uiBlockBeginAlign(block);
-	uiBlockSetEmboss(block, UI_EMBOSS);
-	but = uiDefIconBut(block, BUT, B_CONSTRAINT_TEST, VICON_MOVE_UP, *xco+width-50, *yco, 16, 18, NULL, 0.0, 0.0, 0.0, 0.0, "Move constraint up in constraint stack");
-	uiButSetFunc(but, constraint_moveUp, ob, con);
-	
-	but = uiDefIconBut(block, BUT, B_CONSTRAINT_TEST, VICON_MOVE_DOWN, *xco+width-50+18, *yco, 16, 18, NULL, 0.0, 0.0, 0.0, 0.0, "Move constraint down in constraint stack");
-	uiButSetFunc(but, constraint_moveDown, ob, con);
-	uiBlockEndAlign(block);
-	
-	if (con->flag & CONSTRAINT_EXPAND) {
+	/* name */	
+	if ((con->flag & CONSTRAINT_EXPAND) && (proxy_protected==0)) {
 		if (con->flag & CONSTRAINT_DISABLE)
 			uiBlockSetCol(block, TH_REDALERT);
 		
@@ -568,14 +571,60 @@
 
 	uiBlockSetCol(block, TH_AUTO);	
 	
-	uiBlockSetEmboss(block, UI_EMBOSSN);
+	/* proxy-protected constraints cannot be edited, so hide up/down + close buttons */
+	if (proxy_protected) {
+		uiBlockSetEmboss(block, UI_EMBOSSN);
+		
+		/* draw a ghost icon (for proxy) and also a lock beside it, to show that constraint is "proxy locked" */
+		uiDefIconBut(block, BUT, B_CONSTRAINT_TEST, ICON_GHOST, *xco+244, *yco, 19, 19, NULL, 0.0, 0.0, 0.0, 0.0, "Proxy Protected");
+		uiDefIconBut(block, BUT, B_CONSTRAINT_TEST, ICON_LOCKED, *xco+262, *yco, 19, 19, NULL, 0.0, 0.0, 0.0, 0.0, "Proxy Protected");
+		
+		uiBlockSetEmboss(block, UI_EMBOSS);
+	}
+	else {
+		short prev_proxylock;
+		
+		/* Up/Down buttons: 
+		 *	Proxy-constraints are not allowed to occur after local (non-proxy) constraints
+		 *	as that poses problems when restoring them, so disable the "up" button where
+		 *	it may cause this situation.
+		 */
+		if (proxylocked_constraints_owner(ob, pchan)) {
+			if (con->prev) {
+				prev_proxylock= (con->prev->flag & CONSTRAINT_PROXY_LOCAL) ? 0 : 1;
+			}
+			else
+				prev_proxylock= 0;
+		}
+		else
+			prev_proxylock= 0;
+		 
+		uiBlockBeginAlign(block);
+			uiBlockSetEmboss(block, UI_EMBOSS);
+			
+			if (prev_proxylock == 0) {
+				but = uiDefIconBut(block, BUT, B_CONSTRAINT_TEST, VICON_MOVE_UP, *xco+width-50, *yco, 16, 18, NULL, 0.0, 0.0, 0.0, 0.0, "Move constraint up in constraint stack");
+				uiButSetFunc(but, constraint_moveUp, ob, con);
+			}
+			
+			but = uiDefIconBut(block, BUT, B_CONSTRAINT_TEST, VICON_MOVE_DOWN, *xco+width-50+18, *yco, 16, 18, NULL, 0.0, 0.0, 0.0, 0.0, "Move constraint down in constraint stack");
+			uiButSetFunc(but, constraint_moveDown, ob, con);
+		uiBlockEndAlign(block);
+		
+		
+		/* Close 'button' - emboss calls here disable drawing of 'button' behind X */
+		uiBlockSetEmboss(block, UI_EMBOSSN);
+		
+			but = uiDefIconBut(block, BUT, B_CONSTRAINT_CHANGETARGET, ICON_X, *xco+262, *yco, 19, 19, list, 0.0, 0.0, 0.0, 0.0, "Delete constraint");
+			uiButSetFunc(but, del_constraint_func, ob, con);
+		
+		uiBlockSetEmboss(block, UI_EMBOSS);
+	}
 	
-	but = uiDefIconBut(block, BUT, B_CONSTRAINT_CHANGETARGET, ICON_X, *xco+262, *yco, 19, 19, list, 0.0, 0.0, 0.0, 0.0, "Delete constraint");
-	uiButSetFunc(but, del_constraint_func, ob, con);
-

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list