Particles
[blender.git] / source / blender / blenkernel / BKE_constraint.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL 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. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): 2007 - Joshua Leung (major recode)
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  */
32
33 #ifndef BKE_CONSTRAINT_H
34 #define BKE_CONSTRAINT_H
35
36 struct bConstraint;
37 struct bConstraintTarget;
38 struct ListBase;
39 struct Object;
40 struct bConstraintChannel;
41 struct bPoseChannel;
42
43 /* ---------------------------------------------------------------------------- */
44
45 /* special struct for use in constraint evaluation */
46 typedef struct bConstraintOb {
47         struct Object *ob;                      /* if pchan, then armature that it comes from, otherwise constraint owner */
48         struct bPoseChannel *pchan;     /* pose channel that owns the constraints being evaluated */
49         
50         float matrix[4][4];                     /* matrix where constraints are accumulated + solved */
51         float startmat[4][4];           /* original matrix (before constraint solving) */
52         
53         short type;                                     /* type of owner  */
54 } bConstraintOb;
55
56 /* ---------------------------------------------------------------------------- */
57
58 /* Constraint Type-Info (shorthand in code = cti):
59  *  This struct provides function pointers for runtime, so that functions can be
60  *  written more generally (with fewer/no special exceptions for various constraints).
61  *
62  *  Callers of these functions must check that they actually point to something useful,
63  *  as some constraints don't define some of these.
64  *
65  *  Warning: it is not too advisable to reorder order of members of this struct,
66  *                      as you'll have to edit quite a few ($NUM_CONSTRAINT_TYPES) of these
67  *                      structs.
68  */
69 typedef struct bConstraintTypeInfo {
70         /* admin/ident */
71         short type;                             /* CONSTRAINT_TYPE_### */
72         short size;                             /* size in bytes of the struct */
73         char name[32];                  /* name constraint in interface */
74         char structName[32];    /* name of struct for SDNA */
75         
76         /* data management function pointers - special handling */
77                 /* free any data that is allocated separately (optional) */
78         void (*free_data)(struct bConstraint *con);
79                 /* adjust pointer to other ID-data using ID_NEW(), but not to targets (optional) */
80         void (*relink_data)(struct bConstraint *con);
81                 /* copy any special data that is allocated separately (optional) */
82         void (*copy_data)(struct bConstraint *con, struct bConstraint *src);
83                 /* set settings for data that will be used for bConstraint.data (memory already allocated) */
84         void (*new_data)(void *cdata);
85         
86         /* target handling function pointers */
87                 /* for multi-target constraints: return that list; otherwise make a temporary list */
88         void (*get_constraint_targets)(struct bConstraint *con, struct ListBase *list);
89                 /* for single-target constraints only: flush data back to source data, and the free memory used */
90         void (*flush_constraint_targets)(struct bConstraint *con, struct ListBase *list, short nocopy);
91         
92         /* evaluation */
93                 /* set the ct->matrix for the given constraint target (at the given ctime) */
94         void (*get_target_matrix)(struct bConstraint *con, struct bConstraintOb *cob, struct bConstraintTarget *ct, float ctime);
95                 /* evaluate the constraint for the given time */
96         void (*evaluate_constraint)(struct bConstraint *con, struct bConstraintOb *cob, struct ListBase *targets);
97 } bConstraintTypeInfo;
98
99 /* Function Prototypes for bConstraintTypeInfo's */
100 bConstraintTypeInfo *constraint_get_typeinfo(struct bConstraint *con);
101 bConstraintTypeInfo *get_constraint_typeinfo(int type);
102
103 /* ---------------------------------------------------------------------------- */
104 /* Useful macros for testing various common flag combinations */
105
106 /* Constraint Target Macros */
107 #define VALID_CONS_TARGET(ct) ((ct) && (ct->tar))
108
109
110 /* ---------------------------------------------------------------------------- */
111
112 /* Constraint function prototypes */
113 void unique_constraint_name(struct bConstraint *con, struct ListBase *list);
114
115 void free_constraints(struct ListBase *conlist);
116 void copy_constraints(struct ListBase *dst, struct ListBase *src);
117 void relink_constraints(struct ListBase *list);
118 void free_constraint_data(struct bConstraint *con);
119
120
121 /* Constraint Channel function prototypes */
122 struct bConstraintChannel *get_constraint_channel(struct ListBase *list, const char *name);
123 struct bConstraintChannel *verify_constraint_channel(struct ListBase *list, const char *name);
124 void do_constraint_channels(struct ListBase *conbase, struct ListBase *chanbase, float ctime, short onlydrivers);
125 void copy_constraint_channels(struct ListBase *dst, struct ListBase *src);
126 void clone_constraint_channels(struct ListBase *dst, struct ListBase *src);
127 void free_constraint_channels(struct ListBase *chanbase);
128
129 /* Constraint Evaluation function prototypes */
130 struct bConstraintOb *constraints_make_evalob(struct Object *ob, void *subdata, short datatype);
131 void constraints_clear_evalob(struct bConstraintOb *cob);
132
133 void constraint_mat_convertspace(struct Object *ob, struct bPoseChannel *pchan, float mat[][4], short from, short to);
134
135 void get_constraint_target_matrix(struct bConstraint *con, int n, short ownertype, void *ownerdata, float mat[][4], float ctime);
136 void solve_constraints(struct ListBase *conlist, struct bConstraintOb *cob, float ctime);
137
138
139 #endif
140