Fix for bug: cross platform strand render differences with kink/branch.
[blender.git] / source / blender / blenkernel / BKE_constraint.h
index 6a11159645c5c1a8079dd9dffa972c48fb33b314..a5578377263789abcae81919a29476720049f846 100644 (file)
@@ -25,7 +25,7 @@
  *
  * The Original Code is: all of this file.
  *
- * Contributor(s): none yet.
+ * Contributor(s): 2007 - Joshua Leung (major recode)
  *
  * ***** END GPL/BL DUAL LICENSE BLOCK *****
  */
 #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 */
 
 /* ---------------------------------------------------------------------------- */
 
@@ -63,35 +53,91 @@ typedef struct bConstraintOb {
        short type;                                     /* type of owner  */
 } bConstraintOb;
 
+/* ---------------------------------------------------------------------------- */
+
+/* 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 of 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);
+void unique_constraint_name(struct bConstraint *con, struct ListBase *list);
+
+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);
+
+/* 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 (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);
-void copy_constraint_channels (ListBase *dst, ListBase *src);
-void clone_constraint_channels (struct ListBase *dst, struct ListBase *src);
-void free_constraint_channels (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);
+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(struct ListBase *chanbase);
+
 
 /* Constraint Evaluation function prototypes */
-struct bConstraintOb *constraints_make_evalob (struct Object *ob, void *subdata, short datatype);
+struct bConstraintOb *constraints_make_evalob(struct Object *ob, void *subdata, short datatype);
 void constraints_clear_evalob(struct bConstraintOb *cob);
 
-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);
+void constraint_mat_convertspace(struct Object *ob, struct bPoseChannel *pchan, float mat[][4], short from, short to);
+
+void get_constraint_target_matrix(struct bConstraint *con, int n, short ownertype, void *ownerdata, float mat[][4], float ctime);
+void solve_constraints(struct ListBase *conlist, struct bConstraintOb *cob, float ctime);
 
 
 #endif