91c5eb4afee7ea2d64399c89bf7cdef522167111
[blender-staging.git] / source / blender / blenkernel / BKE_collision.h
1 /**
2  * BKE_cloth.h
3  *
4  * $Id$
5  *
6  * ***** BEGIN GPL LICENSE BLOCK *****
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21  *
22  * The Original Code is Copyright (C) Blender Foundation.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Contributor(s): Daniel Genrich
28  *
29  * ***** END GPL LICENSE BLOCK *****
30  */
31 #ifndef BKE_COLLISIONS_H
32 #define BKE_COLLISIONS_H
33
34 #include <math.h>
35 #include <float.h>
36 #include <stdlib.h>
37 #include <string.h>
38
39 /* types */
40 #include "BLI_linklist.h"
41 #include "BKE_collision.h"
42 #include "BKE_customdata.h"
43 #include "BKE_DerivedMesh.h"
44 #include "DNA_cloth_types.h"
45 #include "DNA_customdata_types.h"
46 #include "DNA_meshdata_types.h"
47 #include "DNA_modifier_types.h"
48 #include "DNA_object_types.h"
49
50 #include "BLI_kdopbvh.h"
51
52 struct Cloth;
53 struct ClothModifierData;
54 struct DerivedMesh;
55 struct Group;
56 struct MFace;
57 struct Object;
58 struct Scene;
59
60 ////////////////////////////////////////
61 // used for collisions in collision.c
62 ////////////////////////////////////////
63
64 /* COLLISION FLAGS */
65 typedef enum
66 {
67         COLLISION_IN_FUTURE = ( 1 << 1 ),
68 } COLLISION_FLAGS;
69
70
71 ////////////////////////////////////////
72 // used for collisions in collision.c
73 ////////////////////////////////////////
74 /* used for collisions in collision.c */
75 typedef struct CollPair
76 {
77         unsigned int face1; // cloth face
78         unsigned int face2; // object face
79         double distance; // magnitude of vector
80         float normal[3];
81         float vector[3]; // unnormalized collision vector: p2-p1
82         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
83         int flag;
84         float time; // collision time, from 0 up to 1
85         int ap1, ap2, ap3, bp1, bp2, bp3;
86         int pointsb[4];
87 }
88 CollPair;
89
90 /* used for collisions in collision.c */
91 typedef struct EdgeCollPair
92 {
93         unsigned int p11, p12, p21, p22;
94         float normal[3];
95         float vector[3];
96         float time;
97         int lastsign;
98         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
99 }
100 EdgeCollPair;
101
102 /* used for collisions in collision.c */
103 typedef struct FaceCollPair
104 {
105         unsigned int p11, p12, p13, p21;
106         float normal[3];
107         float vector[3];
108         float time;
109         int lastsign;
110         float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
111 }
112 FaceCollPair;
113 ////////////////////////////////////////
114
115
116
117 /////////////////////////////////////////////////
118 // forward declarations
119 /////////////////////////////////////////////////
120
121 /////////////////////////////////////////////////
122 // used in modifier.c from collision.c
123 /////////////////////////////////////////////////
124
125 BVHTree *bvhtree_build_from_mvert ( MFace *mfaces, unsigned int numfaces, MVert *x, unsigned int numverts, float epsilon );
126 void bvhtree_update_from_mvert ( BVHTree * bvhtree, MFace *faces, int numfaces, MVert *x, MVert *xnew, int numverts, int moving );
127
128 /////////////////////////////////////////////////
129
130 LinkNode *BLI_linklist_append_fast ( LinkNode **listp, void *ptr );
131
132 // move Collision modifier object inter-frame with step = [0,1]
133 // defined in collisions.c
134 void collision_move_object ( CollisionModifierData *collmd, float step, float prevstep );
135
136 // interface for collision functions
137 void collisions_compute_barycentric ( float pv[3], float p1[3], float p2[3], float p3[3], float *w1, float *w2, float *w3 );
138 void interpolateOnTriangle ( float to[3], float v1[3], float v2[3], float v3[3], double w1, double w2, double w3 );
139
140 /////////////////////////////////////////////////
141 // used in effect.c
142 /////////////////////////////////////////////////
143 struct Object **get_collisionobjects(struct Scene *scene, struct Object *self, struct Group *group, int *numcollobj);
144
145 typedef struct ColliderCache {
146         struct ColliderCache *next, *prev;
147         struct Object *ob;
148         struct CollisionModifierData *collmd;
149 } ColliderCache;
150
151 struct ListBase *get_collider_cache(struct Scene *scene, struct Object *self, struct Group *group);
152 void free_collider_cache(struct ListBase **colliders);
153
154 /////////////////////////////////////////////////
155
156
157
158 /////////////////////////////////////////////////
159
160 #endif
161