Box2D  2.4.1
A 2D physics engine for games
b2_fixture.h
1 // MIT License
2 
3 // Copyright (c) 2019 Erin Catto
4 
5 // Permission is hereby granted, free of charge, to any person obtaining a copy
6 // of this software and associated documentation files (the "Software"), to deal
7 // in the Software without restriction, including without limitation the rights
8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 // copies of the Software, and to permit persons to whom the Software is
10 // furnished to do so, subject to the following conditions:
11 
12 // The above copyright notice and this permission notice shall be included in all
13 // copies or substantial portions of the Software.
14 
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 // SOFTWARE.
22 
23 #ifndef B2_FIXTURE_H
24 #define B2_FIXTURE_H
25 
26 #include "b2_api.h"
27 #include "b2_body.h"
28 #include "b2_collision.h"
29 #include "b2_shape.h"
30 
31 class b2BlockAllocator;
32 class b2Body;
33 class b2BroadPhase;
34 class b2Fixture;
35 
37 struct B2_API b2Filter
38 {
39  b2Filter()
40  {
41  categoryBits = 0x0001;
42  maskBits = 0xFFFF;
43  groupIndex = 0;
44  }
45 
47  uint16 categoryBits;
48 
51  uint16 maskBits;
52 
56  int16 groupIndex;
57 };
58 
61 struct B2_API b2FixtureDef
62 {
65  {
66  shape = nullptr;
67  friction = 0.2f;
68  restitution = 0.0f;
69  restitutionThreshold = 1.0f * b2_lengthUnitsPerMeter;
70  density = 0.0f;
71  isSensor = false;
72  }
73 
76  const b2Shape* shape;
77 
80 
82  float friction;
83 
85  float restitution;
86 
90 
92  float density;
93 
96  bool isSensor;
97 
100 };
101 
103 struct B2_API b2FixtureProxy
104 {
105  b2AABB aabb;
106  b2Fixture* fixture;
107  int32 childIndex;
108  int32 proxyId;
109 };
110 
116 class B2_API b2Fixture
117 {
118 public:
121  b2Shape::Type GetType() const;
122 
126  b2Shape* GetShape();
127  const b2Shape* GetShape() const;
128 
130  void SetSensor(bool sensor);
131 
134  bool IsSensor() const;
135 
139  void SetFilterData(const b2Filter& filter);
140 
142  const b2Filter& GetFilterData() const;
143 
145  void Refilter();
146 
149  b2Body* GetBody();
150  const b2Body* GetBody() const;
151 
154  b2Fixture* GetNext();
155  const b2Fixture* GetNext() const;
156 
159  b2FixtureUserData& GetUserData();
160 
163  bool TestPoint(const b2Vec2& p) const;
164 
169  bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, int32 childIndex) const;
170 
174  void GetMassData(b2MassData* massData) const;
175 
178  void SetDensity(float density);
179 
181  float GetDensity() const;
182 
184  float GetFriction() const;
185 
188  void SetFriction(float friction);
189 
191  float GetRestitution() const;
192 
195  void SetRestitution(float restitution);
196 
198  float GetRestitutionThreshold() const;
199 
202  void SetRestitutionThreshold(float threshold);
203 
207  const b2AABB& GetAABB(int32 childIndex) const;
208 
210  void Dump(int32 bodyIndex);
211 
212 protected:
213 
214  friend class b2Body;
215  friend class b2World;
216  friend class b2Contact;
217  friend class b2ContactManager;
218 
219  b2Fixture();
220 
221  // We need separation create/destroy functions from the constructor/destructor because
222  // the destructor cannot access the allocator (no destructor arguments allowed by C++).
223  void Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def);
224  void Destroy(b2BlockAllocator* allocator);
225 
226  // These support body activation/deactivation.
227  void CreateProxies(b2BroadPhase* broadPhase, const b2Transform& xf);
228  void DestroyProxies(b2BroadPhase* broadPhase);
229 
230  void Synchronize(b2BroadPhase* broadPhase, const b2Transform& xf1, const b2Transform& xf2);
231 
232  float m_density;
233 
234  b2Fixture* m_next;
235  b2Body* m_body;
236 
237  b2Shape* m_shape;
238 
239  float m_friction;
240  float m_restitution;
241  float m_restitutionThreshold;
242 
243  b2FixtureProxy* m_proxies;
244  int32 m_proxyCount;
245 
246  b2Filter m_filter;
247 
248  bool m_isSensor;
249 
250  b2FixtureUserData m_userData;
251 };
252 
253 inline b2Shape::Type b2Fixture::GetType() const
254 {
255  return m_shape->GetType();
256 }
257 
259 {
260  return m_shape;
261 }
262 
263 inline const b2Shape* b2Fixture::GetShape() const
264 {
265  return m_shape;
266 }
267 
268 inline bool b2Fixture::IsSensor() const
269 {
270  return m_isSensor;
271 }
272 
273 inline const b2Filter& b2Fixture::GetFilterData() const
274 {
275  return m_filter;
276 }
277 
279 {
280  return m_userData;
281 }
282 
284 {
285  return m_body;
286 }
287 
288 inline const b2Body* b2Fixture::GetBody() const
289 {
290  return m_body;
291 }
292 
294 {
295  return m_next;
296 }
297 
298 inline const b2Fixture* b2Fixture::GetNext() const
299 {
300  return m_next;
301 }
302 
303 inline void b2Fixture::SetDensity(float density)
304 {
305  b2Assert(b2IsValid(density) && density >= 0.0f);
306  m_density = density;
307 }
308 
309 inline float b2Fixture::GetDensity() const
310 {
311  return m_density;
312 }
313 
314 inline float b2Fixture::GetFriction() const
315 {
316  return m_friction;
317 }
318 
319 inline void b2Fixture::SetFriction(float friction)
320 {
321  m_friction = friction;
322 }
323 
324 inline float b2Fixture::GetRestitution() const
325 {
326  return m_restitution;
327 }
328 
329 inline void b2Fixture::SetRestitution(float restitution)
330 {
331  m_restitution = restitution;
332 }
333 
335 {
336  return m_restitutionThreshold;
337 }
338 
339 inline void b2Fixture::SetRestitutionThreshold(float threshold)
340 {
341  m_restitutionThreshold = threshold;
342 }
343 
344 inline bool b2Fixture::TestPoint(const b2Vec2& p) const
345 {
346  return m_shape->TestPoint(m_body->GetTransform(), p);
347 }
348 
349 inline bool b2Fixture::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, int32 childIndex) const
350 {
351  return m_shape->RayCast(output, input, m_body->GetTransform(), childIndex);
352 }
353 
354 inline void b2Fixture::GetMassData(b2MassData* massData) const
355 {
356  m_shape->ComputeMass(massData, m_density);
357 }
358 
359 inline const b2AABB& b2Fixture::GetAABB(int32 childIndex) const
360 {
361  b2Assert(0 <= childIndex && childIndex < m_proxyCount);
362  return m_proxies[childIndex].aabb;
363 }
364 
365 #endif
b2Fixture::GetRestitution
float GetRestitution() const
Get the coefficient of restitution.
Definition: b2_fixture.h:324
b2Vec2
A 2D column vector.
Definition: b2_math.h:41
b2FixtureDef::restitution
float restitution
The restitution (elasticity) usually in the range [0,1].
Definition: b2_fixture.h:85
b2Fixture::GetDensity
float GetDensity() const
Get the density of this fixture.
Definition: b2_fixture.h:309
b2Shape::RayCast
virtual bool RayCast(b2RayCastOutput *output, const b2RayCastInput &input, const b2Transform &transform, int32 childIndex) const =0
b2Body
A rigid body. These are created via b2World::CreateBody.
Definition: b2_body.h:128
b2ContactManager
Definition: b2_contact_manager.h:35
b2Fixture::GetType
b2Shape::Type GetType() const
Definition: b2_fixture.h:253
b2Fixture::SetRestitutionThreshold
void SetRestitutionThreshold(float threshold)
Definition: b2_fixture.h:339
b2Fixture::GetShape
b2Shape * GetShape()
Definition: b2_fixture.h:258
b2Body::GetTransform
const b2Transform & GetTransform() const
Definition: b2_body.h:479
b2RayCastInput
Ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1).
Definition: b2_collision.h:153
b2Fixture::GetFilterData
const b2Filter & GetFilterData() const
Get the contact filtering data.
Definition: b2_fixture.h:273
b2Transform
Definition: b2_math.h:338
b2FixtureDef::filter
b2Filter filter
Contact filtering data.
Definition: b2_fixture.h:99
b2FixtureDef::friction
float friction
The friction coefficient, usually in the range [0,1].
Definition: b2_fixture.h:82
b2Fixture::RayCast
bool RayCast(b2RayCastOutput *output, const b2RayCastInput &input, int32 childIndex) const
Definition: b2_fixture.h:349
b2Filter::categoryBits
uint16 categoryBits
The collision category bits. Normally you would just set one bit.
Definition: b2_fixture.h:47
b2FixtureDef::shape
const b2Shape * shape
Definition: b2_fixture.h:76
b2Shape::ComputeMass
virtual void ComputeMass(b2MassData *massData, float density) const =0
b2Fixture::GetAABB
const b2AABB & GetAABB(int32 childIndex) const
Definition: b2_fixture.h:359
b2FixtureDef
Definition: b2_fixture.h:61
b2_lengthUnitsPerMeter
#define b2_lengthUnitsPerMeter
Define this macro in your build if you want to override settings.
Definition: b2_settings.h:49
b2Fixture::SetDensity
void SetDensity(float density)
Definition: b2_fixture.h:303
b2Fixture
Definition: b2_fixture.h:116
b2AABB
An axis aligned bounding box.
Definition: b2_collision.h:168
b2FixtureProxy
This proxy is used internally to connect fixtures to the broad-phase.
Definition: b2_fixture.h:103
b2Fixture::IsSensor
bool IsSensor() const
Definition: b2_fixture.h:268
b2FixtureDef::restitutionThreshold
float restitutionThreshold
Definition: b2_fixture.h:89
b2Filter::groupIndex
int16 groupIndex
Definition: b2_fixture.h:56
b2Fixture::TestPoint
bool TestPoint(const b2Vec2 &p) const
Definition: b2_fixture.h:344
b2BlockAllocator
Definition: b2_block_allocator.h:37
b2_collision.h
b2Fixture::SetFriction
void SetFriction(float friction)
Definition: b2_fixture.h:319
b2BroadPhase
Definition: b2_broad_phase.h:40
b2Contact
Definition: b2_contact.h:88
b2Fixture::GetRestitutionThreshold
float GetRestitutionThreshold() const
Get the restitution velocity threshold.
Definition: b2_fixture.h:334
b2FixtureDef::density
float density
The density, usually in kg/m^2.
Definition: b2_fixture.h:92
b2World
Definition: b2_world.h:46
b2FixtureDef::userData
b2FixtureUserData userData
Use this to store application specific fixture data.
Definition: b2_fixture.h:79
b2Fixture::GetFriction
float GetFriction() const
Get the coefficient of friction.
Definition: b2_fixture.h:314
b2FixtureUserData
You can define this to inject whatever data you want in b2Fixture.
Definition: b2_settings.h:70
b2Filter::maskBits
uint16 maskBits
Definition: b2_fixture.h:51
b2Shape
Definition: b2_shape.h:48
b2FixtureDef::isSensor
bool isSensor
Definition: b2_fixture.h:96
b2MassData
This holds the mass data computed for a shape.
Definition: b2_shape.h:33
b2Fixture::GetMassData
void GetMassData(b2MassData *massData) const
Definition: b2_fixture.h:354
b2Filter
This holds contact filtering data.
Definition: b2_fixture.h:37
b2RayCastOutput
Definition: b2_collision.h:161
b2Shape::TestPoint
virtual bool TestPoint(const b2Transform &xf, const b2Vec2 &p) const =0
b2FixtureDef::b2FixtureDef
b2FixtureDef()
The constructor sets the default fixture definition values.
Definition: b2_fixture.h:64
b2Fixture::GetNext
b2Fixture * GetNext()
Definition: b2_fixture.h:293
b2Fixture::SetRestitution
void SetRestitution(float restitution)
Definition: b2_fixture.h:329
b2Fixture::GetBody
b2Body * GetBody()
Definition: b2_fixture.h:283
b2Shape::GetType
Type GetType() const
Definition: b2_shape.h:105
b2Fixture::GetUserData
b2FixtureUserData & GetUserData()
Definition: b2_fixture.h:278