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