[#34013] [video sequence editor] Offset and crop of strips are wrong
[blender.git] / source / blender / blenkernel / BKE_collision.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) Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Daniel Genrich
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27 #ifndef __BKE_COLLISION_H__
28 #define __BKE_COLLISION_H__
29
30 /** \file BKE_collision.h
31  *  \ingroup bke
32  *  \author Daniel Genrich
33  */
34
35 #include <math.h>
36 #include <float.h>
37 #include <stdlib.h>
38 #include <string.h>
39
40 /* types */
41 #include "BKE_collision.h"
42 #include "DNA_cloth_types.h"
43
44 #include "BLI_kdopbvh.h"
45
46 struct Cloth;
47 struct ClothModifierData;
48 struct CollisionModifierData;
49 struct DerivedMesh;
50 struct Group;
51 struct MFace;
52 struct MVert;
53 struct Object;
54 struct Scene;
55 struct LinkNode;
56
57 ////////////////////////////////////////
58 // used for collisions in collision.c
59 ////////////////////////////////////////
60
61 /* COLLISION FLAGS */
62 typedef enum {
63         COLLISION_IN_FUTURE =       (1 << 1),
64 #ifdef WITH_ELTOPO
65         COLLISION_USE_COLLFACE =    (1 << 2),
66         COLLISION_IS_EDGES =        (1 << 3),
67 #endif
68 } COLLISION_FLAGS;
69
70
71 ////////////////////////////////////////
72 // used for collisions in collision.c
73 ////////////////////////////////////////
74 /* used for collisions in collision.c */
75 typedef struct CollPair {
76         unsigned int face1; // cloth face
77         unsigned int face2; // object face
78         double distance; // magnitude of vector
79         float normal[3];
80         float vector[3]; // unnormalized collision vector: p2-p1
81         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
82         int flag;
83         float time; // collision time, from 0 up to 1
84 #ifdef WITH_ELTOPO /*either ap* or bp* can be set, but not both*/
85         float bary[3];
86         int ap1, ap2, ap3, collp, bp1, bp2, bp3;
87         int collface;
88 #else
89         int ap1, ap2, ap3, bp1, bp2, bp3;
90 #endif
91         int pointsb[4];
92 }
93 CollPair;
94
95 /* used for collisions in collision.c */
96 typedef struct EdgeCollPair {
97         unsigned int p11, p12, p21, p22;
98         float normal[3];
99         float vector[3];
100         float time;
101         int lastsign;
102         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
103 }
104 EdgeCollPair;
105
106 /* used for collisions in collision.c */
107 typedef struct FaceCollPair {
108         unsigned int p11, p12, p13, p21;
109         float normal[3];
110         float vector[3];
111         float time;
112         int lastsign;
113         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
114 }
115 FaceCollPair;
116
117 ////////////////////////////////////////
118
119
120
121 /////////////////////////////////////////////////
122 // forward declarations
123 /////////////////////////////////////////////////
124
125 /////////////////////////////////////////////////
126 // used in modifier.c from collision.c
127 /////////////////////////////////////////////////
128
129 BVHTree *bvhtree_build_from_mvert(struct MFace *mfaces, unsigned int numfaces, struct MVert *x, unsigned int numverts, float epsilon);
130 void bvhtree_update_from_mvert(BVHTree *bvhtree, struct MFace *faces, int numfaces, struct MVert *x, struct MVert *xnew, int numverts, int moving);
131
132 /////////////////////////////////////////////////
133
134 // move Collision modifier object inter-frame with step = [0,1]
135 // defined in collisions.c
136 void collision_move_object(struct CollisionModifierData *collmd, float step, float prevstep);
137
138 /////////////////////////////////////////////////
139 // used in effect.c
140 /////////////////////////////////////////////////
141 struct Object **get_collisionobjects(struct Scene *scene, struct Object *self, struct Group *group, unsigned int *numcollobj, unsigned int modifier_type);
142
143 typedef struct ColliderCache {
144         struct ColliderCache *next, *prev;
145         struct Object *ob;
146         struct CollisionModifierData *collmd;
147 } ColliderCache;
148
149 struct ListBase *get_collider_cache(struct Scene *scene, struct Object *self, struct Group *group);
150 void free_collider_cache(struct ListBase **colliders);
151
152 /////////////////////////////////////////////////
153
154
155
156 /////////////////////////////////////////////////
157
158 #endif
159