Box2D  2.3.0
A 2D Physics Engine for Games
b2Collision.h
Go to the documentation of this file.
1 /*
2 * Copyright (c) 2006-2009 Erin Catto http://www.box2d.org
3 *
4 * This software is provided 'as-is', without any express or implied
5 * warranty. In no event will the authors be held liable for any damages
6 * arising from the use of this software.
7 * Permission is granted to anyone to use this software for any purpose,
8 * including commercial applications, and to alter it and redistribute it
9 * freely, subject to the following restrictions:
10 * 1. The origin of this software must not be misrepresented; you must not
11 * claim that you wrote the original software. If you use this software
12 * in a product, an acknowledgment in the product documentation would be
13 * appreciated but is not required.
14 * 2. Altered source versions must be plainly marked as such, and must not be
15 * misrepresented as being the original software.
16 * 3. This notice may not be removed or altered from any source distribution.
17 */
18 
19 #ifndef B2_COLLISION_H
20 #define B2_COLLISION_H
21 
22 #include <Box2D/Common/b2Math.h>
23 #include <limits.h>
24 
28 
29 class b2Shape;
30 class b2CircleShape;
31 class b2EdgeShape;
32 class b2PolygonShape;
33 
34 const uint8 b2_nullFeature = UCHAR_MAX;
35 
38 struct b2ContactFeature
39 {
40  enum Type
41  {
42  e_vertex = 0,
43  e_face = 1
44  };
45 
46  uint8 indexA;
47  uint8 indexB;
48  uint8 typeA;
49  uint8 typeB;
50 };
51 
53 union b2ContactID
54 {
55  b2ContactFeature cf;
56  uint32 key;
57 };
58 
70 {
72  float32 normalImpulse;
73  float32 tangentImpulse;
74  b2ContactID id;
75 };
76 
93 struct b2Manifold
94 {
95  enum Type
96  {
97  e_circles,
98  e_faceA,
99  e_faceB
100  };
101 
105  Type type;
106  int32 pointCount;
107 };
108 
111 {
116  void Initialize(const b2Manifold* manifold,
117  const b2Transform& xfA, float32 radiusA,
118  const b2Transform& xfB, float32 radiusB);
119 
123 };
124 
127 {
132 };
133 
136 void b2GetPointStates(b2PointState state1[b2_maxManifoldPoints], b2PointState state2[b2_maxManifoldPoints],
137  const b2Manifold* manifold1, const b2Manifold* manifold2);
138 
140 struct b2ClipVertex
141 {
142  b2Vec2 v;
143  b2ContactID id;
144 };
145 
148 {
149  b2Vec2 p1, p2;
150  float32 maxFraction;
151 };
152 
156 {
157  b2Vec2 normal;
158  float32 fraction;
159 };
160 
162 struct b2AABB
163 {
165  bool IsValid() const;
166 
169  {
170  return 0.5f * (lowerBound + upperBound);
171  }
172 
175  {
176  return 0.5f * (upperBound - lowerBound);
177  }
178 
180  float32 GetPerimeter() const
181  {
182  float32 wx = upperBound.x - lowerBound.x;
183  float32 wy = upperBound.y - lowerBound.y;
184  return 2.0f * (wx + wy);
185  }
186 
188  void Combine(const b2AABB& aabb)
189  {
190  lowerBound = b2Min(lowerBound, aabb.lowerBound);
191  upperBound = b2Max(upperBound, aabb.upperBound);
192  }
193 
195  void Combine(const b2AABB& aabb1, const b2AABB& aabb2)
196  {
197  lowerBound = b2Min(aabb1.lowerBound, aabb2.lowerBound);
198  upperBound = b2Max(aabb1.upperBound, aabb2.upperBound);
199  }
200 
202  bool Contains(const b2AABB& aabb) const
203  {
204  bool result = true;
205  result = result && lowerBound.x <= aabb.lowerBound.x;
206  result = result && lowerBound.y <= aabb.lowerBound.y;
207  result = result && aabb.upperBound.x <= upperBound.x;
208  result = result && aabb.upperBound.y <= upperBound.y;
209  return result;
210  }
211 
212  bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const;
213 
216 };
217 
219 void b2CollideCircles(b2Manifold* manifold,
220  const b2CircleShape* circleA, const b2Transform& xfA,
221  const b2CircleShape* circleB, const b2Transform& xfB);
222 
224 void b2CollidePolygonAndCircle(b2Manifold* manifold,
225  const b2PolygonShape* polygonA, const b2Transform& xfA,
226  const b2CircleShape* circleB, const b2Transform& xfB);
227 
229 void b2CollidePolygons(b2Manifold* manifold,
230  const b2PolygonShape* polygonA, const b2Transform& xfA,
231  const b2PolygonShape* polygonB, const b2Transform& xfB);
232 
234 void b2CollideEdgeAndCircle(b2Manifold* manifold,
235  const b2EdgeShape* polygonA, const b2Transform& xfA,
236  const b2CircleShape* circleB, const b2Transform& xfB);
237 
239 void b2CollideEdgeAndPolygon(b2Manifold* manifold,
240  const b2EdgeShape* edgeA, const b2Transform& xfA,
241  const b2PolygonShape* circleB, const b2Transform& xfB);
242 
244 int32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2],
245  const b2Vec2& normal, float32 offset, int32 vertexIndexA);
246 
248 bool b2TestOverlap( const b2Shape* shapeA, int32 indexA,
249  const b2Shape* shapeB, int32 indexB,
250  const b2Transform& xfA, const b2Transform& xfB);
251 
252 // ---------------- Inline Functions ------------------------------------------
253 
254 inline bool b2AABB::IsValid() const
255 {
257  bool valid = d.x >= 0.0f && d.y >= 0.0f;
258  valid = valid && lowerBound.IsValid() && upperBound.IsValid();
259  return valid;
260 }
261 
262 inline bool b2TestOverlap(const b2AABB& a, const b2AABB& b)
263 {
264  b2Vec2 d1, d2;
265  d1 = b.lowerBound - a.upperBound;
266  d2 = a.lowerBound - b.upperBound;
267 
268  if (d1.x > 0.0f || d1.y > 0.0f)
269  return false;
270 
271  if (d2.x > 0.0f || d2.y > 0.0f)
272  return false;
273 
274  return true;
275 }
276 
277 #endif