Merge branch 'blender2.7'
[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 CollisionModifierData;
47 struct Collection;
48 struct MFace;
49 struct MVert;
50 struct Object;
51 struct Scene;
52 struct Depsgraph;
53 struct MVertTri;
54
55 ////////////////////////////////////////
56 // used for collisions in collision.c
57 ////////////////////////////////////////
58
59 /* COLLISION FLAGS */
60 typedef enum {
61         COLLISION_IN_FUTURE =       (1 << 1),
62 #ifdef WITH_ELTOPO
63         COLLISION_USE_COLLFACE =    (1 << 2),
64         COLLISION_IS_EDGES =        (1 << 3),
65 #endif
66         COLLISION_INACTIVE =        (1 << 4),
67 } COLLISION_FLAGS;
68
69
70 ////////////////////////////////////////
71 // used for collisions in collision.c
72 ////////////////////////////////////////
73 /* used for collisions in collision.c */
74 typedef struct CollPair {
75         unsigned int face1; // cloth face
76         unsigned int face2; // object face
77         float distance;
78         float normal[3];
79         float vector[3]; // unnormalized collision vector: p2-p1
80         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
81         int flag;
82         float time; // collision time, from 0 up to 1
83
84         /* mesh-mesh collision */
85 #ifdef WITH_ELTOPO /*either ap* or bp* can be set, but not both*/
86         float bary[3];
87         int ap1, ap2, ap3, collp, bp1, bp2, bp3;
88         int collface;
89 #else
90         int ap1, ap2, ap3, bp1, bp2, bp3;
91 #endif
92         int pointsb[4];
93 }
94 CollPair;
95
96 /* used for collisions in collision.c */
97 typedef struct EdgeCollPair {
98         unsigned int p11, p12, p21, p22;
99         float normal[3];
100         float vector[3];
101         float time;
102         int lastsign;
103         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
104 }
105 EdgeCollPair;
106
107 /* used for collisions in collision.c */
108 typedef struct FaceCollPair {
109         unsigned int p11, p12, p13, p21;
110         float normal[3];
111         float vector[3];
112         float time;
113         int lastsign;
114         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
115 }
116 FaceCollPair;
117
118 ////////////////////////////////////////
119
120
121
122 /////////////////////////////////////////////////
123 // forward declarations
124 /////////////////////////////////////////////////
125
126 /////////////////////////////////////////////////
127 // used in modifier.c from collision.c
128 /////////////////////////////////////////////////
129
130 BVHTree *bvhtree_build_from_mvert(
131         const struct MVert *mvert,
132         const struct MVertTri *tri, int tri_num,
133         float epsilon);
134 void bvhtree_update_from_mvert(
135         BVHTree *bvhtree,
136         const struct MVert *mvert, const struct MVert *mvert_moving,
137         const struct MVertTri *tri, int tri_num,
138         bool moving);
139
140 /////////////////////////////////////////////////
141
142 // move Collision modifier object inter-frame with step = [0,1]
143 // defined in collisions.c
144 void collision_move_object(struct CollisionModifierData *collmd, float step, float prevstep);
145
146 void collision_get_collider_velocity(float vel_old[3], float vel_new[3], struct CollisionModifierData *collmd, struct CollPair *collpair);
147
148
149 /* Collision relations for dependency graph build. */
150
151 typedef struct CollisionRelation {
152         struct CollisionRelation *next, *prev;
153         struct Object *ob;
154 } CollisionRelation;
155
156 struct ListBase *BKE_collision_relations_create(
157         struct Depsgraph *depsgraph,
158         struct Collection *collection,
159         unsigned int modifier_type);
160 void BKE_collision_relations_free(struct ListBase *relations);
161
162 /* Collision object lists for physics simulation evaluation. */
163
164 struct Object **BKE_collision_objects_create(
165         struct Depsgraph *depsgraph,
166         struct Object *self,
167         struct Collection *collection,
168         unsigned int *numcollobj,
169         unsigned int modifier_type);
170 void BKE_collision_objects_free(struct Object **objects);
171
172 typedef struct ColliderCache {
173         struct ColliderCache *next, *prev;
174         struct Object *ob;
175         struct CollisionModifierData *collmd;
176 } ColliderCache;
177
178 struct ListBase *BKE_collider_cache_create(
179         struct Depsgraph *scene,
180         struct Object *self,
181         struct Collection *collection);
182 void BKE_collider_cache_free(struct ListBase **colliders);
183
184 /////////////////////////////////////////////////
185
186
187
188 /////////////////////////////////////////////////
189
190 #endif