[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [10954] trunk/blender/source/blender: == PyConstraints ==

Joshua Leung aligorith at gmail.com
Mon Jun 18 09:41:21 CEST 2007


Revision: 10954
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=10954
Author:   aligorith
Date:     2007-06-18 09:41:21 +0200 (Mon, 18 Jun 2007)

Log Message:
-----------
== PyConstraints ==

At last! The ability to code constraints in Python. This opens up many interesting rigging possibilities, as well as making prototyping constraints easier.

* A PyConstraint script must begin with the line 
#BPYCONSTRAINT
* It must also define a doConstraint function, which performs the core actions of the constraint.
* PyConstraints use IDProperties to store custom properties for each PyConstraint instance. The scripter can choose which of these ID-Properties to expose to a user to control the behaviour of the constraint. This must be done using the Draw.PupBlock method.

Credits to Joe Eager (joeedh) for coding the original patch on which this is based. I've made heavy revisions to large parts of the patch.

For more detailed information, and some demo scripts, see the following page:
http://aligorith.googlepages.com/pyconstraints2

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/bad_level_call_stubs/stubs.c
    trunk/blender/source/blender/blenkernel/intern/constraint.c
    trunk/blender/source/blender/blenkernel/intern/idprop.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/include/BIF_editconstraint.h
    trunk/blender/source/blender/makesdna/DNA_constraint_types.h
    trunk/blender/source/blender/python/BPY_extern.h
    trunk/blender/source/blender/python/BPY_interface.c
    trunk/blender/source/blender/python/api2_2x/Constraint.c
    trunk/blender/source/blender/src/buttons_object.c
    trunk/blender/source/blender/src/editconstraint.c
    trunk/blender/source/blender/src/header_text.c

Modified: trunk/blender/source/blender/blenkernel/bad_level_call_stubs/stubs.c
===================================================================
--- trunk/blender/source/blender/blenkernel/bad_level_call_stubs/stubs.c	2007-06-17 18:54:57 UTC (rev 10953)
+++ trunk/blender/source/blender/blenkernel/bad_level_call_stubs/stubs.c	2007-06-18 07:41:21 UTC (rev 10954)
@@ -54,6 +54,7 @@
 struct FluidsimSettings;
 struct Render;
 struct RenderResult;
+struct bPythonConstraint;
 
 char *getIpoCurveName( struct IpoCurve * icu );
 void insert_vert_ipo(struct IpoCurve *icu, float x, float y);
@@ -124,6 +125,16 @@
 	return 0;
 }
 
+/* constraint.c */
+void BPY_pyconstraint_eval(struct bPythonConstraint *con, float obmat[][4], short ownertype, void *ownerdata, float targetmat[][4])
+{
+}
+int BPY_pyconstraint_targets(struct bPythonConstraint *con, float targetmat[][4])
+{
+	return 0;
+}
+
+
 /* writefile.c */
 	/* struct Oops; */
 void free_oops(struct Oops *oops){}

Modified: trunk/blender/source/blender/blenkernel/intern/constraint.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/constraint.c	2007-06-17 18:54:57 UTC (rev 10953)
+++ trunk/blender/source/blender/blenkernel/intern/constraint.c	2007-06-18 07:41:21 UTC (rev 10954)
@@ -58,7 +58,10 @@
 #include "BKE_ipo.h"
 #include "BKE_global.h"
 #include "BKE_library.h"
+#include "BKE_idprop.h"
 
+#include "BPY_extern.h"
+
 #include "blendef.h"
 
 #ifdef HAVE_CONFIG_H
@@ -80,6 +83,15 @@
 {
 	if (con->data) {
 		/* any constraint-type specific stuff here */
+		switch (con->type) {
+			case CONSTRAINT_TYPE_PYTHON:
+			{
+				bPythonConstraint *data= con->data;
+				IDP_FreeProperty(data->prop);
+				MEM_freeN(data->prop);
+			}
+				break;
+		}
 		
 		MEM_freeN(con->data);
 	}
@@ -117,6 +129,14 @@
 	
 	for (con = list->first; con; con=con->next) {
 		switch (con->type) {
+			case CONSTRAINT_TYPE_PYTHON:
+			{
+				bPythonConstraint *data;
+				data = con->data;
+				
+				ID_NEW(data->tar);
+			}
+				break;
 			case CONSTRAINT_TYPE_KINEMATIC:
 			{
 				bKinematicConstraint *data;
@@ -260,6 +280,13 @@
 char constraint_has_target (bConstraint *con) 
 {
 	switch (con->type) {
+	case CONSTRAINT_TYPE_PYTHON:
+		{
+			bPythonConstraint *data = con->data;
+			if (data->tar)
+				return 1;
+		}
+		break;
 	case CONSTRAINT_TYPE_TRACKTO:
 		{
 			bTrackToConstraint *data = con->data;
@@ -354,6 +381,13 @@
 	  * to the name for this constraints subtarget ... NULL otherwise
 	  */
 	switch (con->type) {
+	case CONSTRAINT_TYPE_PYTHON:
+		{
+			bPythonConstraint *data=con->data;
+			*subtarget = data->subtarget;
+			return data->tar;
+		}
+		break;
 	case CONSTRAINT_TYPE_ACTION:
 		{
 			bActionConstraint *data = con->data;
@@ -450,6 +484,14 @@
 {
 	/* Set the target for this constraint  */
 	switch (con->type) {
+		
+		case CONSTRAINT_TYPE_PYTHON:
+		{
+			bPythonConstraint *data = con->data;
+			data->tar= ob;
+			if(subtarget) BLI_strncpy(data->subtarget, subtarget, 32);
+		}
+			break;		
 		case CONSTRAINT_TYPE_ACTION:
 		{
 			bActionConstraint *data = con->data;
@@ -590,6 +632,18 @@
 	void *result;
 	
 	switch (type) {
+	case CONSTRAINT_TYPE_PYTHON:
+		{
+			bPythonConstraint *data;
+			data = MEM_callocN(sizeof(bPythonConstraint), "pythonConstraint");
+			
+			/* everything should be set correctly by calloc, except for the prop->type constant.*/
+			data->prop = MEM_callocN(sizeof(IDProperty), "PyConstraintProps");
+			data->prop->type = IDP_GROUP;
+			
+			result = data;
+		}
+		break;		
 	case CONSTRAINT_TYPE_KINEMATIC:
 		{
 			bKinematicConstraint *data;
@@ -1272,6 +1326,31 @@
 				Mat4One (mat);
 		}
 		break;
+	case CONSTRAINT_TYPE_PYTHON:
+		{
+			bPythonConstraint *data;
+			data = (bPythonConstraint*)con->data;
+			
+			/* special exception for curves - depsgraph issues */
+			if (data->tar && data->tar->type == OB_CURVE) {
+				Curve *cu= data->tar->data;
+				
+				/* this check is to make sure curve objects get updated on file load correctly.*/
+				if(cu->path==NULL || cu->path->data==NULL) /* only happens on reload file, but violates depsgraph still... fix! */
+					makeDispListCurveTypes(data->tar, 0);				
+			}
+			
+			/* if the script doesn't set the target matrix for any reason, fall back to standard methods */
+			if (BPY_pyconstraint_targets(data, mat) < 1) {
+				if (data->tar) {
+					constraint_target_to_mat4(data->tar, data->subtarget, mat, size);
+					valid = 1;
+				}
+				else
+					Mat4One (mat);
+			}
+		}
+		break;
 	case CONSTRAINT_TYPE_CLAMPTO:
 		{
 			bClampToConstraint *data;
@@ -1316,7 +1395,14 @@
 	case CONSTRAINT_TYPE_NULL:
 	case CONSTRAINT_TYPE_KINEMATIC: /* removed */
 		break;
-	
+	case CONSTRAINT_TYPE_PYTHON:
+		{
+			bPythonConstraint *data;
+			
+			data= constraint->data;
+			BPY_pyconstraint_eval(data, ob->obmat, ownertype, ownerdata, targetmat);
+		} 
+		break;
 	case CONSTRAINT_TYPE_ACTION:
 		{
 			bActionConstraint *data;

Modified: trunk/blender/source/blender/blenkernel/intern/idprop.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/idprop.c	2007-06-17 18:54:57 UTC (rev 10953)
+++ trunk/blender/source/blender/blenkernel/intern/idprop.c	2007-06-18 07:41:21 UTC (rev 10954)
@@ -274,6 +274,7 @@
 	for (loop=prop->data.group.first; loop; loop=next)
 	{
 		next = loop->next;
+		BLI_remlink(&prop->data.group, loop);
 		IDP_FreeProperty(loop);
 		MEM_freeN(loop);
 	}

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2007-06-17 18:54:57 UTC (rev 10953)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2007-06-18 07:41:21 UTC (rev 10954)
@@ -1611,6 +1611,15 @@
 		}
 
 		switch (con->type) {
+		case CONSTRAINT_TYPE_PYTHON:
+			{
+				bPythonConstraint *data;
+				data= (bPythonConstraint*)con->data;
+				data->tar = newlibadr(fd, id->lib, data->tar);
+				data->text = newlibadr(fd, id->lib, data->text);
+				//IDP_LibLinkProperty(data->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd);
+			}
+			break;
 		case CONSTRAINT_TYPE_ACTION:
 			{
 				bActionConstraint *data;
@@ -1717,6 +1726,11 @@
 	link_list(fd, lb);
 	for (cons=lb->first; cons; cons=cons->next) {
 		cons->data = newdataadr(fd, cons->data);
+		if (cons->type == CONSTRAINT_TYPE_PYTHON) {
+			bPythonConstraint *data= cons->data;
+			data->prop = newdataadr(fd, data->prop);
+			IDP_DirectLinkProperty(data->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd);
+		}
 	}
 }
 
@@ -6885,6 +6899,13 @@
 
 	for (curcon=lb->first; curcon; curcon=curcon->next) {
 		switch (curcon->type) {
+		case CONSTRAINT_TYPE_PYTHON:
+			{
+				bPythonConstraint *data = (bPythonConstraint*)curcon->data;
+				expand_doit(fd, mainvar, data->tar);
+				expand_doit(fd, mainvar, data->text);
+				break;
+			}
 		case CONSTRAINT_TYPE_ACTION:
 			{
 				bActionConstraint *data = (bActionConstraint*)curcon->data;

Modified: trunk/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/writefile.c	2007-06-17 18:54:57 UTC (rev 10953)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c	2007-06-18 07:41:21 UTC (rev 10954)
@@ -702,6 +702,16 @@
 		switch (con->type) {
 		case CONSTRAINT_TYPE_NULL:
 			break;
+		case CONSTRAINT_TYPE_PYTHON:
+			{
+				bPythonConstraint *data = (bPythonConstraint*) con->data;
+				writestruct(wd, DATA, "bPythonConstraint", 1, data);
+				
+				/*Write ID Properties -- and copy this comment EXACTLY for easy finding
+				 of library blocks that implement this.*/
+				IDP_WriteProperty(data->prop, wd);
+			}
+			break;
 		case CONSTRAINT_TYPE_TRACKTO:
 			writestruct(wd, DATA, "bTrackToConstraint", 1, con->data);
 			break;

Modified: trunk/blender/source/blender/include/BIF_editconstraint.h
===================================================================
--- trunk/blender/source/blender/include/BIF_editconstraint.h	2007-06-17 18:54:57 UTC (rev 10953)
+++ trunk/blender/source/blender/include/BIF_editconstraint.h	2007-06-18 07:41:21 UTC (rev 10954)
@@ -38,7 +38,10 @@
 struct Object;
 struct bConstraint;
 struct bConstraintChannel;
+struct Text;
 
+/* generic constraint editing functions */
+
 struct bConstraint *add_new_constraint(short type);
 
 void add_constraint_to_object(struct bConstraint *con, struct Object *ob);
@@ -58,5 +61,9 @@
 void rename_constraint(struct Object *ob, struct bConstraint *con, char *newname);
 
 
+/* two special functions for PyConstraints */
+char *buildmenu_pyconstraints(struct Text *con_text, int *pyconindex);
+void validate_pyconstraint_cb(void *arg1, void *arg2);
+
 #endif
 

Modified: trunk/blender/source/blender/makesdna/DNA_constraint_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_constraint_types.h	2007-06-17 18:54:57 UTC (rev 10953)
+++ trunk/blender/source/blender/makesdna/DNA_constraint_types.h	2007-06-18 07:41:21 UTC (rev 10954)
@@ -39,6 +39,10 @@
 #include "DNA_object_types.h"
 
 struct Action;
+struct Text;
+#ifndef __cplusplus
+struct PyObject;
+#endif
 
 /* channels reside in Object or Action (ListBase) constraintChannels */
 typedef struct bConstraintChannel{
@@ -59,6 +63,18 @@
 	float		enforce;
 } bConstraint;
 
+/* Python Script Constraint */
+typedef struct bPythonConstraint {
+	Object *tar;			/* object to use as target (if required) */
+	char subtarget[32]; 	/* bone to use as subtarget (if required) */
+	
+	struct Text *text;		/* text-buffer (containing script) to execute */
+	IDProperty *prop;		/* 'id-properties' used to store custom properties for constraint */
+	
+	int flag;				/* general settings/state indicators accessed by bitmapping */
+	int pad;
+} bPythonConstraint;
+
 /* Single-target subobject constraints */
 typedef struct bKinematicConstraint{
 	Object		*tar;
@@ -350,6 +366,10 @@
 
 #define LIMIT_NOPARENT 0x01
 
+/* python constraint -> flag */
+#define PYCON_USETARGETS	0x01
+#define PYCON_SCRIPTERROR	0x02
+
 #define CONSTRAINT_DRAW_PIVOT 0x40
 
 /* important: these defines need to match up with PHY_DynamicTypes headerfile */

Modified: trunk/blender/source/blender/python/BPY_extern.h
===================================================================
--- trunk/blender/source/blender/python/BPY_extern.h	2007-06-17 18:54:57 UTC (rev 10953)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list