[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12334] trunk/blender: == Constraints System - Recode 2 ==

Joshua Leung aligorith at gmail.com
Mon Oct 22 01:00:29 CEST 2007


Revision: 12334
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12334
Author:   aligorith
Date:     2007-10-22 01:00:29 +0200 (Mon, 22 Oct 2007)

Log Message:
-----------
== Constraints System - Recode 2 ==

Once again, I've recoded the constraints system. This time, the goals were:
* To make it more future-proof by 'modernising' the coding style. The long functions filled with switch statements, have given way to function-pointers with smaller functions for specific purposes.
* To make it support constraints which use multiple targets more readily that it did. In the past, it was assumed that constraints could only have at most one target.

As a result, a lot of code has been shuffled around, and modified. Also, the subversion number has been bumped up.

Known issues:
* PyConstraints, which were the main motivation for supporting multiple-targets, are currently broken. There are some bimport() error that keeps causing problems. I've also temporarily removed the doDriver support, although it may return in another form soon. 
* Constraints BPy-API is currently has a few features which currently don't work yet
* Outliner currently only displays the names of the constraints instead of the fancy subtarget/target/constraint-name display it used to do. What gets displayed here needs further investigation, as the old way was certainly not that great (and is not compatible with the new system too) 

Modified Paths:
--------------
    trunk/blender/release/scripts/scripttemplate_pyconstraint.py
    trunk/blender/source/blender/blenkernel/BKE_bad_level_calls.h
    trunk/blender/source/blender/blenkernel/BKE_blender.h
    trunk/blender/source/blender/blenkernel/BKE_constraint.h
    trunk/blender/source/blender/blenkernel/bad_level_call_stubs/stubs.c
    trunk/blender/source/blender/blenkernel/intern/armature.c
    trunk/blender/source/blender/blenkernel/intern/constraint.c
    trunk/blender/source/blender/blenkernel/intern/depsgraph.c
    trunk/blender/source/blender/blenkernel/intern/object.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/include/butspace.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/drawobject.c
    trunk/blender/source/blender/src/editarmature.c
    trunk/blender/source/blender/src/editconstraint.c
    trunk/blender/source/blender/src/editobject.c
    trunk/blender/source/blender/src/header_text.c
    trunk/blender/source/blender/src/outliner.c
    trunk/blender/source/blender/src/poseobject.c

Modified: trunk/blender/release/scripts/scripttemplate_pyconstraint.py
===================================================================
--- trunk/blender/release/scripts/scripttemplate_pyconstraint.py	2007-10-21 21:47:10 UTC (rev 12333)
+++ trunk/blender/release/scripts/scripttemplate_pyconstraint.py	2007-10-21 23:00:29 UTC (rev 12334)
@@ -20,18 +20,22 @@
 from Blender import Draw
 from Blender import Mathutils
 import math
+
+'''
+ This variable specifies the number of targets 
+ that this constraint can use
+'''
+NUM_TARGETS = 1
 
-USE_TARGET = True
 
-
 '''
  This function is called to evaluate the constraint
-	obmatrix:		(Matrix) copy of owner's worldspace matrix
-	targetmatrix:	(Matrix) copy of target's worldspace matrix (where applicable)
+	obmatrix:		(Matrix) copy of owner's 'ownerspace' matrix
+	targetmatrices:	(List) list of copies of the 'targetspace' matrices of the targets (where applicable)
 	idprop:			(IDProperties) wrapped data referring to this 
 					constraint instance's idproperties
 '''
-def doConstraint(obmatrix, targetmatrix, idprop):
+def doConstraint(obmatrix, targetmatrices, idprop):
 	# Separate out the tranformation components for easy access.
 	obloc = obmatrix.translationPart()	# Translation
 	obrot = obmatrix.toEuler()			# Rotation
@@ -60,9 +64,9 @@
 
 
 '''
- This function manipulates the target matrix prior to sending it to doConstraint()
+ This function manipulates the matrix of a target prior to sending it to doConstraint()
 	target_object:					wrapped data, representing the target object
-	subtarget_bone:					wrapped data, representing the subtarget pose-bone (where applicable)
+	subtarget_bone:					wrapped data, representing the subtarget pose-bone/vertex-group (where applicable)
 	target_matrix:					(Matrix) the transformation matrix of the target
 	id_properties_of_constraint:	(IDProperties) wrapped idproperties
 '''
@@ -72,8 +76,8 @@
 
 '''
  This function draws a pupblock that lets the user set
-	the values of custom settings the constraint defines.
-	This function is called when the user presses the settings button.
+ the values of custom settings the constraint defines.
+ This function is called when the user presses the settings button.
 	idprop:	(IDProperties) wrapped data referring to this 
 			constraint instance's idproperties
 '''

Modified: trunk/blender/source/blender/blenkernel/BKE_bad_level_calls.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_bad_level_calls.h	2007-10-21 21:47:10 UTC (rev 12333)
+++ trunk/blender/source/blender/blenkernel/BKE_bad_level_calls.h	2007-10-21 23:00:29 UTC (rev 12334)
@@ -65,6 +65,7 @@
 struct Object;
 struct bPythonConstraint;
 struct bConstraintOb;
+struct bConstraintTarget;
 void BPY_do_pyscript (struct ID *id, short int event);
 void BPY_clear_script (struct Script *script);
 void BPY_free_compiled_text (struct Text *text);
@@ -74,9 +75,9 @@
 void BPY_pydriver_update(void);
 /* button python evaluation */
 int BPY_button_eval(char *expr, double *value);
-void BPY_pyconstraint_eval(struct bPythonConstraint *con, float ownermat[][4], float targetmat[][4]);
-void BPY_pyconstraint_driver(struct bPythonConstraint *con, struct bConstraintOb *cob, struct Object *target, char subtarget[]);
-int BPY_pyconstraint_targets(struct bPythonConstraint *con, float targetmat[][4]);
+/* pyconstraints */
+void BPY_pyconstraint_eval(struct bPythonConstraint *con, struct bConstraintOb *cob, struct ListBase *targets);
+void BPY_pyconstraint_targets(struct bPythonConstraint *con, struct bConstraintTarget *ct);
 
 
 /* writefile.c */

Modified: trunk/blender/source/blender/blenkernel/BKE_blender.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_blender.h	2007-10-21 21:47:10 UTC (rev 12333)
+++ trunk/blender/source/blender/blenkernel/BKE_blender.h	2007-10-21 23:00:29 UTC (rev 12334)
@@ -44,7 +44,7 @@
 struct MemFile;
 
 #define BLENDER_VERSION			245
-#define BLENDER_SUBVERSION		6
+#define BLENDER_SUBVERSION		7
 
 #define BLENDER_MINVERSION		240
 #define BLENDER_MINSUBVERSION	0

Modified: trunk/blender/source/blender/blenkernel/BKE_constraint.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_constraint.h	2007-10-21 21:47:10 UTC (rev 12333)
+++ trunk/blender/source/blender/blenkernel/BKE_constraint.h	2007-10-21 23:00:29 UTC (rev 12334)
@@ -33,25 +33,15 @@
 #ifndef BKE_CONSTRAINT_H
 #define BKE_CONSTRAINT_H
 
-
 struct bConstraint;
+struct bConstraintTarget;
 struct ListBase;
 struct Object;
 struct bConstraintChannel;
 struct bPoseChannel;
-struct bAction;
-struct bArmature;
 
 /* ---------------------------------------------------------------------------- */
 
-/* Constraint target/owner types */
-#define TARGET_OBJECT			1	/*	string is ""				*/
-#define TARGET_BONE				2	/*	string is bone-name		*/
-#define TARGET_VERT				3	/*	string is vertex-group name 	*/
-#define TARGET_CV				4 	/* 	string is vertex-group name - is not available until curves get vgroups */
-
-/* ---------------------------------------------------------------------------- */
-
 /* special struct for use in constraint evaluation */
 typedef struct bConstraintOb {
 	struct Object *ob;			/* if pchan, then armature that it comes from, otherwise constraint owner */
@@ -65,26 +55,77 @@
 
 /* ---------------------------------------------------------------------------- */
 
+/* Constraint Type-Info (shorthand in code = cti):
+ *  This struct provides function pointers for runtime, so that functions can be
+ *  written more generally (with fewer/no special exceptions for various constraints).
+ *
+ *  Callers of these functions must check that they actually point to something useful,
+ *  as some constraints don't define some of these.
+ *
+ *  Warning: it is not too advisable to reorder order of members of this struct,
+ *			as you'll have to edit quite a few ($NUM_CONSTRAINT_TYPES) of these
+ *			structs.
+ */
+typedef struct bConstraintTypeInfo {
+	/* admin/ident */
+	short type;				/* CONSTRAINT_TYPE_### */
+	short size;				/* size in bytes of the struct */
+	char name[32]; 			/* name constraint in interface */
+	char structName[32];	/* name of struct for SDNA */
+	
+	/* data management function pointers - special handling */
+		/* free any data that is allocated separately (optional) */
+	void (*free_data)(struct bConstraint *con);
+		/* adjust pointer to other ID-data using ID_NEW(), but not to targets (optional) */
+	void (*relink_data)(struct bConstraint *con);
+		/* copy any special data that is allocated separately (optional) */
+	void (*copy_data)(struct bConstraint *con, struct bConstraint *src);
+		/* set settings for data that will be used for bConstraint.data (memory already allocated) */
+	void (*new_data)(void *cdata);
+	
+	/* target handling function pointers */
+		/* for multi-target constraints: return that list; otherwise make a temporary list */
+	void (*get_constraint_targets)(struct bConstraint *con, struct ListBase *list);
+		/* for single-target constraints only: flush data back to source data, and the free memory used */
+	void (*flush_constraint_targets)(struct bConstraint *con, struct ListBase *list, short nocopy);
+	
+	/* evaluation */
+		/* set the ct->matrix for the given constraint target (at the given ctime) */
+	void (*get_target_matrix)(struct bConstraint *con, struct bConstraintOb *cob, struct bConstraintTarget *ct, float ctime);
+		/* evaluate the constraint for the given time */
+	void (*evaluate_constraint)(struct bConstraint *con, struct bConstraintOb *cob, struct ListBase *targets);
+} bConstraintTypeInfo;
+
+/* Function Prototypes for bConstraintTypeInfo's */
+bConstraintTypeInfo *constraint_get_typeinfo(struct bConstraint *con);
+bConstraintTypeInfo *get_constraint_typeinfo(int type);
+
+/* ---------------------------------------------------------------------------- */
+/* Useful macros for testing various common flag combinations */
+
+/* Constraint Target Macros */
+#define VALID_CONS_TARGET(ct) ((ct) && (ct->tar))
+
+
+/* ---------------------------------------------------------------------------- */
+
 /* Constraint function prototypes */
 void unique_constraint_name(struct bConstraint *con, struct ListBase *list);
-void *new_constraint_data(short type);
+
 void free_constraints(struct ListBase *conlist);
 void copy_constraints(struct ListBase *dst, struct ListBase *src);
 void relink_constraints(struct ListBase *list);
 void free_constraint_data(struct bConstraint *con);
 
+
 /* Constraint Channel function prototypes */
-struct bConstraintChannel *get_constraint_channel(ListBase *list, const char *name);
-struct bConstraintChannel *verify_constraint_channel(ListBase *list, const char *name);
-void do_constraint_channels(struct ListBase *conbase, struct ListBase *chanbase, float ctime, int onlydrivers);
-void copy_constraint_channels(ListBase *dst, ListBase *src);
+struct bConstraintChannel *get_constraint_channel(struct ListBase *list, const char *name);
+struct bConstraintChannel *verify_constraint_channel(struct ListBase *list, const char *name);
+void do_constraint_channels(struct ListBase *conbase, struct ListBase *chanbase, float ctime, short onlydrivers);
+void copy_constraint_channels(struct ListBase *dst, struct ListBase *src);
 void clone_constraint_channels(struct ListBase *dst, struct ListBase *src);
-void free_constraint_channels(ListBase *chanbase);
+void free_constraint_channels(struct ListBase *chanbase);
 
-/* Target function prototypes  */
-char constraint_has_target(struct bConstraint *con);
-struct Object *get_constraint_target(struct bConstraint *con, char **subtarget);
-void set_constraint_target(struct bConstraint *con, struct Object *ob, char *subtarget);
 
 /* Constraint Evaluation function prototypes */
 struct bConstraintOb *constraints_make_evalob(struct Object *ob, void *subdata, short datatype);
@@ -92,8 +133,8 @@
 
 void constraint_mat_convertspace(struct Object *ob, struct bPoseChannel *pchan, float mat[][4], short from, short to);
 
-short get_constraint_target_matrix(struct bConstraint *con, short ownertype, void *ownerdata, float mat[][4], float time);
-void solve_constraints (struct ListBase *conlist, struct bConstraintOb *cob, float ctime);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list