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