unify include guard defines, __$FILENAME__
[blender-staging.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 {
64         COLLISION_IN_FUTURE =           (1 << 1),
65 #ifdef WITH_ELTOPO
66         COLLISION_USE_COLLFACE =        (1 << 2),
67         COLLISION_IS_EDGES =            (1 << 3),
68 #endif
69 } COLLISION_FLAGS;
70
71
72 ////////////////////////////////////////
73 // used for collisions in collision.c
74 ////////////////////////////////////////
75 /* used for collisions in collision.c */
76 typedef struct CollPair
77 {
78         unsigned int face1; // cloth face
79         unsigned int face2; // object face
80         double distance; // magnitude of vector
81         float normal[3];
82         float vector[3]; // unnormalized collision vector: p2-p1
83         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
84         int flag;
85         float time; // collision time, from 0 up to 1
86 #ifdef WITH_ELTOPO /*either ap* or bp* can be set, but not both*/
87         float bary[3];
88         int ap1, ap2, ap3, collp, bp1, bp2, bp3;
89         int collface;
90 #else
91         int ap1, ap2, ap3, bp1, bp2, bp3;
92 #endif
93         int pointsb[4];
94 }
95 CollPair;
96
97 /* used for collisions in collision.c */
98 typedef struct EdgeCollPair
99 {
100         unsigned int p11, p12, p21, p22;
101         float normal[3];
102         float vector[3];
103         float time;
104         int lastsign;
105         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
106 }
107 EdgeCollPair;
108
109 /* used for collisions in collision.c */
110 typedef struct FaceCollPair
111 {
112         unsigned int p11, p12, p13, p21;
113         float normal[3];
114         float vector[3];
115         float time;
116         int lastsign;
117         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
118 }
119 FaceCollPair;
120
121 ////////////////////////////////////////
122
123
124
125 /////////////////////////////////////////////////
126 // forward declarations
127 /////////////////////////////////////////////////
128
129 /////////////////////////////////////////////////
130 // used in modifier.c from collision.c
131 /////////////////////////////////////////////////
132
133 BVHTree *bvhtree_build_from_mvert ( struct MFace *mfaces, unsigned int numfaces, struct MVert *x, unsigned int numverts, float epsilon );
134 void bvhtree_update_from_mvert ( BVHTree * bvhtree, struct MFace *faces, int numfaces, struct MVert *x, struct MVert *xnew, int numverts, int moving );
135
136 /////////////////////////////////////////////////
137
138 struct LinkNode *BLI_linklist_append_fast ( struct LinkNode **listp, void *ptr );
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 // interface for collision functions
145 void collisions_compute_barycentric ( float pv[3], float p1[3], float p2[3], float p3[3], float *w1, float *w2, float *w3 );
146 void interpolateOnTriangle ( float to[3], float v1[3], float v2[3], float v3[3], double w1, double w2, double w3 );
147
148 /////////////////////////////////////////////////
149 // used in effect.c
150 /////////////////////////////////////////////////
151 struct Object **get_collisionobjects(struct Scene *scene, struct Object *self, struct Group *group, unsigned int *numcollobj);
152
153 typedef struct ColliderCache {
154         struct ColliderCache *next, *prev;
155         struct Object *ob;
156         struct CollisionModifierData *collmd;
157 } ColliderCache;
158
159 struct ListBase *get_collider_cache(struct Scene *scene, struct Object *self, struct Group *group);
160 void free_collider_cache(struct ListBase **colliders);
161
162 /////////////////////////////////////////////////
163
164
165
166 /////////////////////////////////////////////////
167
168 #endif
169