Merging r38694 through r38739 from trunk into vgroup_modifiers
[blender.git] / source / blender / blenkernel / BKE_constraint.h
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): 2007 - Joshua Leung (major recode)
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 #ifndef BKE_CONSTRAINT_H
31 #define BKE_CONSTRAINT_H
32
33 /** \file BKE_constraint.h
34  *  \ingroup bke
35  *  \author Joshua Leung (major recode 2007)
36  */
37
38 struct ID;
39 struct bConstraint;
40 struct bConstraintTarget;
41 struct ListBase;
42 struct Object;
43 struct Scene;
44 struct bPoseChannel;
45
46 /* ---------------------------------------------------------------------------- */
47 #ifdef __cplusplus
48 extern "C" {
49 #endif
50
51 /* special struct for use in constraint evaluation */
52 typedef struct bConstraintOb {
53         struct Scene *scene;            /* for system time, part of deglobalization, code nicer later with local time (ton) */
54         struct Object *ob;                      /* if pchan, then armature that it comes from, otherwise constraint owner */
55         struct bPoseChannel *pchan;     /* pose channel that owns the constraints being evaluated */
56         
57         float matrix[4][4];                     /* matrix where constraints are accumulated + solved */
58         float startmat[4][4];           /* original matrix (before constraint solving) */
59         
60         short type;                                     /* type of owner  */
61         short rotOrder;                         /* rotation order for constraint owner (as defined in eEulerRotationOrders in BLI_math.h) */
62 } bConstraintOb;
63
64 /* ---------------------------------------------------------------------------- */
65
66 /* Callback format for performing operations on ID-pointers for Constraints */
67 typedef void (*ConstraintIDFunc)(struct bConstraint *con, struct ID **idpoin, void *userdata);
68
69 /* ....... */
70
71 /* Constraint Type-Info (shorthand in code = cti):
72  *  This struct provides function pointers for runtime, so that functions can be
73  *  written more generally (with fewer/no special exceptions for various constraints).
74  *
75  *  Callers of these functions must check that they actually point to something useful,
76  *  as some constraints don't define some of these.
77  *
78  *  Warning: it is not too advisable to reorder order of members of this struct,
79  *                      as you'll have to edit quite a few ($NUM_CONSTRAINT_TYPES) of these
80  *                      structs.
81  */
82 typedef struct bConstraintTypeInfo {
83         /* admin/ident */
84         short type;                             /* CONSTRAINT_TYPE_### */
85         short size;                             /* size in bytes of the struct */
86         char name[32];                  /* name of constraint in interface */
87         char structName[32];    /* name of struct for SDNA */
88         
89         /* data management function pointers - special handling */
90                 /* free any data that is allocated separately (optional) */
91         void (*free_data)(struct bConstraint *con);
92                 /* adjust pointer to other ID-data using ID_NEW(), but not to targets (optional) */
93         void (*relink_data)(struct bConstraint *con);
94                 /* run the provided callback function on all the ID-blocks linked to the constraint */
95         void (*id_looper)(struct bConstraint *con, ConstraintIDFunc func, void *userdata);
96                 /* copy any special data that is allocated separately (optional) */
97         void (*copy_data)(struct bConstraint *con, struct bConstraint *src);
98                 /* set settings for data that will be used for bConstraint.data (memory already allocated using MEM_callocN) */
99         void (*new_data)(void *cdata);
100         
101         /* target handling function pointers */
102                 /* for multi-target constraints: return that list; otherwise make a temporary list (returns number of targets) */
103         int (*get_constraint_targets)(struct bConstraint *con, struct ListBase *list);
104                 /* for single-target constraints only: flush data back to source data, and the free memory used */
105         void (*flush_constraint_targets)(struct bConstraint *con, struct ListBase *list, short nocopy);
106         
107         /* evaluation */
108                 /* set the ct->matrix for the given constraint target (at the given ctime) */
109         void (*get_target_matrix)(struct bConstraint *con, struct bConstraintOb *cob, struct bConstraintTarget *ct, float ctime);
110                 /* evaluate the constraint for the given time */
111         void (*evaluate_constraint)(struct bConstraint *con, struct bConstraintOb *cob, struct ListBase *targets);
112 } bConstraintTypeInfo;
113
114 /* Function Prototypes for bConstraintTypeInfo's */
115 bConstraintTypeInfo *constraint_get_typeinfo(struct bConstraint *con);
116 bConstraintTypeInfo *get_constraint_typeinfo(int type);
117
118 /* ---------------------------------------------------------------------------- */
119 /* Useful macros for testing various common flag combinations */
120
121 /* Constraint Target Macros */
122 #define VALID_CONS_TARGET(ct) ((ct) && (ct->tar))
123
124 /* ---------------------------------------------------------------------------- */
125
126 /* Constraint function prototypes */
127 void unique_constraint_name(struct bConstraint *con, struct ListBase *list);
128
129 void free_constraints(struct ListBase *list);
130 void copy_constraints(struct ListBase *dst, const struct ListBase *src, int do_extern);
131 void relink_constraints(struct ListBase *list);
132 void id_loop_constraints(struct ListBase *list, ConstraintIDFunc func, void *userdata);
133 void free_constraint_data(struct bConstraint *con);
134
135 /* Constraint API function prototypes */
136 struct bConstraint *constraints_get_active(struct ListBase *list);
137 void constraints_set_active(ListBase *list, struct bConstraint *con);
138 struct bConstraint *constraints_findByName(struct ListBase *list, const char *name);
139         
140 struct bConstraint *add_ob_constraint(struct Object *ob, const char *name, short type);
141 struct bConstraint *add_pose_constraint(struct Object *ob, struct bPoseChannel *pchan, const char *name, short type);
142
143 int remove_constraint(ListBase *list, struct bConstraint *con);
144 void remove_constraints_type(ListBase *list, short type, short last_only);
145
146 /* Constraints + Proxies function prototypes */
147 void extract_proxylocal_constraints(struct ListBase *dst, struct ListBase *src);
148 short proxylocked_constraints_owner(struct Object *ob, struct bPoseChannel *pchan);
149
150 /* Constraint Evaluation function prototypes */
151 struct bConstraintOb *constraints_make_evalob(struct Scene *scene, struct Object *ob, void *subdata, short datatype);
152 void constraints_clear_evalob(struct bConstraintOb *cob);
153
154 void constraint_mat_convertspace(struct Object *ob, struct bPoseChannel *pchan, float mat[][4], short from, short to);
155
156 void get_constraint_target_matrix(struct Scene *scene, struct bConstraint *con, int n, short ownertype, void *ownerdata, float mat[][4], float ctime);
157 void solve_constraints(struct ListBase *conlist, struct bConstraintOb *cob, float ctime);
158
159 #ifdef __cplusplus
160 }
161 #endif
162
163 #endif
164