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