Box2D 2.4.1
A 2D physics engine for games
Loading...
Searching...
No Matches
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
32class b2Body;
33class b2BroadPhase;
34class b2Fixture;
35
37struct B2_API b2Filter
38{
39 b2Filter()
40 {
41 categoryBits = 0x0001;
42 maskBits = 0xFFFF;
43 groupIndex = 0;
44 }
45
48
51 uint16 maskBits;
52
57};
58
61struct 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
86
90
92 float density;
93
97
100};
101
103struct B2_API b2FixtureProxy
104{
105 b2AABB aabb;
106 b2Fixture* fixture;
107 int32 childIndex;
108 int32 proxyId;
109};
110
116class B2_API b2Fixture
117{
118public:
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 const b2FixtureUserData& GetUserData() const;
161
164 bool TestPoint(const b2Vec2& p) const;
165
170 bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, int32 childIndex) const;
171
175 void GetMassData(b2MassData* massData) const;
176
179 void SetDensity(float density);
180
182 float GetDensity() const;
183
185 float GetFriction() const;
186
189 void SetFriction(float friction);
190
192 float GetRestitution() const;
193
196 void SetRestitution(float restitution);
197
199 float GetRestitutionThreshold() const;
200
203 void SetRestitutionThreshold(float threshold);
204
208 const b2AABB& GetAABB(int32 childIndex) const;
209
211 void Dump(int32 bodyIndex);
212
213protected:
214
215 friend class b2Body;
216 friend class b2World;
217 friend class b2Contact;
218 friend class b2ContactManager;
219
220 b2Fixture();
221
222 // We need separation create/destroy functions from the constructor/destructor because
223 // the destructor cannot access the allocator (no destructor arguments allowed by C++).
224 void Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def);
225 void Destroy(b2BlockAllocator* allocator);
226
227 // These support body activation/deactivation.
228 void CreateProxies(b2BroadPhase* broadPhase, const b2Transform& xf);
229 void DestroyProxies(b2BroadPhase* broadPhase);
230
231 void Synchronize(b2BroadPhase* broadPhase, const b2Transform& xf1, const b2Transform& xf2);
232
233 float m_density;
234
235 b2Fixture* m_next;
236 b2Body* m_body;
237
238 b2Shape* m_shape;
239
240 float m_friction;
241 float m_restitution;
242 float m_restitutionThreshold;
243
244 b2FixtureProxy* m_proxies;
245 int32 m_proxyCount;
246
247 b2Filter m_filter;
248
249 bool m_isSensor;
250
251 b2FixtureUserData m_userData;
252};
253
254inline b2Shape::Type b2Fixture::GetType() const
255{
256 return m_shape->GetType();
257}
258
260{
261 return m_shape;
262}
263
264inline const b2Shape* b2Fixture::GetShape() const
265{
266 return m_shape;
267}
268
269inline bool b2Fixture::IsSensor() const
270{
271 return m_isSensor;
272}
273
275{
276 return m_filter;
277}
278
280{
281 return m_userData;
282}
283
284inline const b2FixtureUserData& b2Fixture::GetUserData() const
285{
286 return m_userData;
287}
288
290{
291 return m_body;
292}
293
294inline const b2Body* b2Fixture::GetBody() const
295{
296 return m_body;
297}
298
300{
301 return m_next;
302}
303
304inline const b2Fixture* b2Fixture::GetNext() const
305{
306 return m_next;
307}
308
309inline void b2Fixture::SetDensity(float density)
310{
311 b2Assert(b2IsValid(density) && density >= 0.0f);
312 m_density = density;
313}
314
315inline float b2Fixture::GetDensity() const
316{
317 return m_density;
318}
319
320inline float b2Fixture::GetFriction() const
321{
322 return m_friction;
323}
324
325inline void b2Fixture::SetFriction(float friction)
326{
327 m_friction = friction;
328}
329
330inline float b2Fixture::GetRestitution() const
331{
332 return m_restitution;
333}
334
335inline void b2Fixture::SetRestitution(float restitution)
336{
337 m_restitution = restitution;
338}
339
341{
342 return m_restitutionThreshold;
343}
344
345inline void b2Fixture::SetRestitutionThreshold(float threshold)
346{
347 m_restitutionThreshold = threshold;
348}
349
350inline bool b2Fixture::TestPoint(const b2Vec2& p) const
351{
352 return m_shape->TestPoint(m_body->GetTransform(), p);
353}
354
355inline bool b2Fixture::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, int32 childIndex) const
356{
357 return m_shape->RayCast(output, input, m_body->GetTransform(), childIndex);
358}
359
360inline void b2Fixture::GetMassData(b2MassData* massData) const
361{
362 m_shape->ComputeMass(massData, m_density);
363}
364
365inline const b2AABB& b2Fixture::GetAABB(int32 childIndex) const
366{
367 b2Assert(0 <= childIndex && childIndex < m_proxyCount);
368 return m_proxies[childIndex].aabb;
369}
370
371#endif
#define b2_lengthUnitsPerMeter
Define this macro in your build if you want to override settings.
Definition b2_settings.h:49
Definition b2_block_allocator.h:38
A rigid body. These are created via b2World::CreateBody.
Definition b2_body.h:129
const b2Transform & GetTransform() const
Definition b2_body.h:476
Definition b2_broad_phase.h:41
Definition b2_contact.h:89
Definition b2_contact_manager.h:36
Definition b2_fixture.h:117
b2Fixture * GetNext()
Definition b2_fixture.h:299
void SetFriction(float friction)
Definition b2_fixture.h:325
const b2AABB & GetAABB(int32 childIndex) const
Definition b2_fixture.h:365
void SetFilterData(const b2Filter &filter)
float GetRestitutionThreshold() const
Get the restitution velocity threshold.
Definition b2_fixture.h:340
float GetFriction() const
Get the coefficient of friction.
Definition b2_fixture.h:320
void GetMassData(b2MassData *massData) const
Definition b2_fixture.h:360
void Refilter()
Call this if you want to establish collision that was previously disabled by b2ContactFilter::ShouldC...
void SetRestitutionThreshold(float threshold)
Definition b2_fixture.h:345
float GetRestitution() const
Get the coefficient of restitution.
Definition b2_fixture.h:330
void Dump(int32 bodyIndex)
Dump this fixture to the log file.
void SetSensor(bool sensor)
Set if this fixture is a sensor.
void SetDensity(float density)
Definition b2_fixture.h:309
b2Shape::Type GetType() const
Definition b2_fixture.h:254
b2Body * GetBody()
Definition b2_fixture.h:289
bool TestPoint(const b2Vec2 &p) const
Definition b2_fixture.h:350
b2Shape * GetShape()
Definition b2_fixture.h:259
bool RayCast(b2RayCastOutput *output, const b2RayCastInput &input, int32 childIndex) const
Definition b2_fixture.h:355
void SetRestitution(float restitution)
Definition b2_fixture.h:335
const b2Filter & GetFilterData() const
Get the contact filtering data.
Definition b2_fixture.h:274
float GetDensity() const
Get the density of this fixture.
Definition b2_fixture.h:315
bool IsSensor() const
Definition b2_fixture.h:269
b2FixtureUserData & GetUserData()
Definition b2_fixture.h:279
Definition b2_shape.h:49
virtual void ComputeMass(b2MassData *massData, float density) const =0
Type GetType() const
Definition b2_shape.h:105
virtual bool TestPoint(const b2Transform &xf, const b2Vec2 &p) const =0
virtual bool RayCast(b2RayCastOutput *output, const b2RayCastInput &input, const b2Transform &transform, int32 childIndex) const =0
Definition b2_world.h:47
An axis aligned bounding box.
Definition b2_collision.h:169
This holds contact filtering data.
Definition b2_fixture.h:38
uint16 categoryBits
The collision category bits. Normally you would just set one bit.
Definition b2_fixture.h:47
uint16 maskBits
Definition b2_fixture.h:51
int16 groupIndex
Definition b2_fixture.h:56
Definition b2_fixture.h:62
float friction
The friction coefficient, usually in the range [0,1].
Definition b2_fixture.h:82
const b2Shape * shape
Definition b2_fixture.h:76
float density
The density, usually in kg/m^2.
Definition b2_fixture.h:92
b2FixtureUserData userData
Use this to store application specific fixture data.
Definition b2_fixture.h:79
b2Filter filter
Contact filtering data.
Definition b2_fixture.h:99
float restitution
The restitution (elasticity) usually in the range [0,1].
Definition b2_fixture.h:85
b2FixtureDef()
The constructor sets the default fixture definition values.
Definition b2_fixture.h:64
bool isSensor
Definition b2_fixture.h:96
float restitutionThreshold
Definition b2_fixture.h:89
This proxy is used internally to connect fixtures to the broad-phase.
Definition b2_fixture.h:104
You can define this to inject whatever data you want in b2Fixture.
Definition b2_settings.h:71
This holds the mass data computed for a shape.
Definition b2_shape.h:34
Ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1).
Definition b2_collision.h:154
Definition b2_collision.h:162
Definition b2_math.h:339
A 2D column vector.
Definition b2_math.h:42