ClangFormat: apply to source, most of intern
[blender.git] / source / blender / blenkernel / BKE_collision.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) Blender Foundation.
17  * All rights reserved.
18  */
19 #ifndef __BKE_COLLISION_H__
20 #define __BKE_COLLISION_H__
21
22 /** \file
23  * \ingroup bke
24  */
25
26 #include <math.h>
27 #include <float.h>
28 #include <stdlib.h>
29 #include <string.h>
30
31 /* types */
32 #include "BKE_collision.h"
33 #include "DNA_cloth_types.h"
34
35 #include "BLI_kdopbvh.h"
36
37 struct Collection;
38 struct CollisionModifierData;
39 struct Depsgraph;
40 struct MFace;
41 struct MVert;
42 struct MVertTri;
43 struct Object;
44 struct Scene;
45
46 ////////////////////////////////////////
47 // used for collisions in collision.c
48 ////////////////////////////////////////
49
50 /* COLLISION FLAGS */
51 typedef enum {
52   COLLISION_IN_FUTURE = (1 << 1),
53 #ifdef WITH_ELTOPO
54   COLLISION_USE_COLLFACE = (1 << 2),
55   COLLISION_IS_EDGES = (1 << 3),
56 #endif
57   COLLISION_INACTIVE = (1 << 4),
58 } COLLISION_FLAGS;
59
60 ////////////////////////////////////////
61 // used for collisions in collision.c
62 ////////////////////////////////////////
63 /* used for collisions in collision.c */
64 typedef struct CollPair {
65   unsigned int face1;  // cloth face
66   unsigned int face2;  // object face
67   float distance;
68   float normal[3];
69   float vector[3];     // unnormalized collision vector: p2-p1
70   float pa[3], pb[3];  // collision point p1 on face1, p2 on face2
71   int flag;
72   float time;  // collision time, from 0 up to 1
73
74   /* mesh-mesh collision */
75 #ifdef WITH_ELTOPO /*either ap* or bp* can be set, but not both*/
76   float bary[3];
77   int ap1, ap2, ap3, collp, bp1, bp2, bp3;
78   int collface;
79 #else
80   int ap1, ap2, ap3, bp1, bp2, bp3;
81 #endif
82   int pointsb[4];
83 } CollPair;
84
85 /* used for collisions in collision.c */
86 typedef struct EdgeCollPair {
87   unsigned int p11, p12, p21, p22;
88   float normal[3];
89   float vector[3];
90   float time;
91   int lastsign;
92   float pa[3], pb[3];  // collision point p1 on face1, p2 on face2
93 } EdgeCollPair;
94
95 /* used for collisions in collision.c */
96 typedef struct FaceCollPair {
97   unsigned int p11, p12, p13, p21;
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 } FaceCollPair;
104
105 ////////////////////////////////////////
106
107 /////////////////////////////////////////////////
108 // forward declarations
109 /////////////////////////////////////////////////
110
111 /////////////////////////////////////////////////
112 // used in modifier.c from collision.c
113 /////////////////////////////////////////////////
114
115 BVHTree *bvhtree_build_from_mvert(const struct MVert *mvert,
116                                   const struct MVertTri *tri,
117                                   int tri_num,
118                                   float epsilon);
119 void bvhtree_update_from_mvert(BVHTree *bvhtree,
120                                const struct MVert *mvert,
121                                const struct MVert *mvert_moving,
122                                const struct MVertTri *tri,
123                                int tri_num,
124                                bool moving);
125
126 /////////////////////////////////////////////////
127
128 // move Collision modifier object inter-frame with step = [0,1]
129 // defined in collisions.c
130 void collision_move_object(struct CollisionModifierData *collmd, float step, float prevstep);
131
132 void collision_get_collider_velocity(float vel_old[3],
133                                      float vel_new[3],
134                                      struct CollisionModifierData *collmd,
135                                      struct CollPair *collpair);
136
137 /* Collision relations for dependency graph build. */
138
139 typedef struct CollisionRelation {
140   struct CollisionRelation *next, *prev;
141   struct Object *ob;
142 } CollisionRelation;
143
144 struct ListBase *BKE_collision_relations_create(struct Depsgraph *depsgraph,
145                                                 struct Collection *collection,
146                                                 unsigned int modifier_type);
147 void BKE_collision_relations_free(struct ListBase *relations);
148
149 /* Collision object lists for physics simulation evaluation. */
150
151 struct Object **BKE_collision_objects_create(struct Depsgraph *depsgraph,
152                                              struct Object *self,
153                                              struct Collection *collection,
154                                              unsigned int *numcollobj,
155                                              unsigned int modifier_type);
156 void BKE_collision_objects_free(struct Object **objects);
157
158 typedef struct ColliderCache {
159   struct ColliderCache *next, *prev;
160   struct Object *ob;
161   struct CollisionModifierData *collmd;
162 } ColliderCache;
163
164 struct ListBase *BKE_collider_cache_create(struct Depsgraph *scene,
165                                            struct Object *self,
166                                            struct Collection *collection);
167 void BKE_collider_cache_free(struct ListBase **colliders);
168
169 /////////////////////////////////////////////////
170
171 /////////////////////////////////////////////////
172
173 #endif