| /* | |
| * Copyright (c) 2006-2009 Erin Catto http://www.box2d.org | |
| * | |
| * This software is provided 'as-is', without any express or implied | |
| * warranty. In no event will the authors be held liable for any damages | |
| * arising from the use of this software. | |
| * Permission is granted to anyone to use this software for any purpose, | |
| * including commercial applications, and to alter it and redistribute it | |
| * freely, subject to the following restrictions: | |
| * 1. The origin of this software must not be misrepresented; you must not | |
| * claim that you wrote the original software. If you use this software | |
| * in a product, an acknowledgment in the product documentation would be | |
| * appreciated but is not required. | |
| * 2. Altered source versions must be plainly marked as such, and must not be | |
| * misrepresented as being the original software. | |
| * 3. This notice may not be removed or altered from any source distribution. | |
| */ | |
| #ifndef B2_FIXTURE_H | |
| #define B2_FIXTURE_H | |
| #include <Box2D/Dynamics/b2Body.h> | |
| #include <Box2D/Collision/b2Collision.h> | |
| #include <Box2D/Collision/Shapes/b2Shape.h> | |
| class b2BlockAllocator; | |
| class b2Body; | |
| class b2BroadPhase; | |
| class b2Fixture; | |
| /// This holds contact filtering data. | |
| struct b2Filter | |
| { | |
| b2Filter() | |
| { | |
| categoryBits = 0x0001; | |
| maskBits = 0xFFFF; | |
| groupIndex = 0; | |
| } | |
| /// The collision category bits. Normally you would just set one bit. | |
| uint16 categoryBits; | |
| /// The collision mask bits. This states the categories that this | |
| /// shape would accept for collision. | |
| uint16 maskBits; | |
| /// Collision groups allow a certain group of objects to never collide (negative) | |
| /// or always collide (positive). Zero means no collision group. Non-zero group | |
| /// filtering always wins against the mask bits. | |
| int16 groupIndex; | |
| }; | |
| /// A fixture definition is used to create a fixture. This class defines an | |
| /// abstract fixture definition. You can reuse fixture definitions safely. | |
| struct b2FixtureDef | |
| { | |
| /// The constructor sets the default fixture definition values. | |
| b2FixtureDef() | |
| { | |
| shape = NULL; | |
| userData = NULL; | |
| friction = 0.2f; | |
| restitution = 0.0f; | |
| density = 0.0f; | |
| isSensor = false; | |
| } | |
| /// The shape, this must be set. The shape will be cloned, so you | |
| /// can create the shape on the stack. | |
| const b2Shape* shape; | |
| /// Use this to store application specific fixture data. | |
| void* userData; | |
| /// The friction coefficient, usually in the range [0,1]. | |
| float32 friction; | |
| /// The restitution (elasticity) usually in the range [0,1]. | |
| float32 restitution; | |
| /// The density, usually in kg/m^2. | |
| float32 density; | |
| /// A sensor shape collects contact information but never generates a collision | |
| /// response. | |
| bool isSensor; | |
| /// Contact filtering data. | |
| b2Filter filter; | |
| }; | |
| /// This proxy is used internally to connect fixtures to the broad-phase. | |
| struct b2FixtureProxy | |
| { | |
| b2AABB aabb; | |
| b2Fixture* fixture; | |
| int32 childIndex; | |
| int32 proxyId; | |
| }; | |
| /// A fixture is used to attach a shape to a body for collision detection. A fixture | |
| /// inherits its transform from its parent. Fixtures hold additional non-geometric data | |
| /// such as friction, collision filters, etc. | |
| /// Fixtures are created via b2Body::CreateFixture. | |
| /// @warning you cannot reuse fixtures. | |
| // emscripten - b2Fixture: make constructor public | |
| class b2Fixture | |
| { | |
| public: | |
| /// Get the type of the child shape. You can use this to down cast to the concrete shape. | |
| /// @return the shape type. | |
| b2Shape::Type GetType() const; | |
| /// Get the child shape. You can modify the child shape, however you should not change the | |
| /// number of vertices because this will crash some collision caching mechanisms. | |
| /// Manipulating the shape may lead to non-physical behavior. | |
| b2Shape* GetShape(); | |
| const b2Shape* GetShape() const; | |
| /// Set if this fixture is a sensor. | |
| void SetSensor(bool sensor); | |
| /// Is this fixture a sensor (non-solid)? | |
| /// @return the true if the shape is a sensor. | |
| bool IsSensor() const; | |
| /// Set the contact filtering data. This will not update contacts until the next time | |
| /// step when either parent body is active and awake. | |
| /// This automatically calls Refilter. | |
| void SetFilterData(const b2Filter& filter); | |
| /// Get the contact filtering data. | |
| const b2Filter& GetFilterData() const; | |
| /// Call this if you want to establish collision that was previously disabled by b2ContactFilter::ShouldCollide. | |
| void Refilter(); | |
| /// Get the parent body of this fixture. This is NULL if the fixture is not attached. | |
| /// @return the parent body. | |
| b2Body* GetBody(); | |
| const b2Body* GetBody() const; | |
| /// Get the next fixture in the parent body's fixture list. | |
| /// @return the next shape. | |
| b2Fixture* GetNext(); | |
| const b2Fixture* GetNext() const; | |
| /// Get the user data that was assigned in the fixture definition. Use this to | |
| /// store your application specific data. | |
| void* GetUserData() const; | |
| /// Set the user data. Use this to store your application specific data. | |
| void SetUserData(void* data); | |
| /// Test a point for containment in this fixture. | |
| /// @param p a point in world coordinates. | |
| bool TestPoint(const b2Vec2& p) const; | |
| /// Cast a ray against this shape. | |
| /// @param output the ray-cast results. | |
| /// @param input the ray-cast input parameters. | |
| bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, int32 childIndex) const; | |
| /// Get the mass data for this fixture. The mass data is based on the density and | |
| /// the shape. The rotational inertia is about the shape's origin. This operation | |
| /// may be expensive. | |
| void GetMassData(b2MassData* massData) const; | |
| /// Set the density of this fixture. This will _not_ automatically adjust the mass | |
| /// of the body. You must call b2Body::ResetMassData to update the body's mass. | |
| void SetDensity(float32 density); | |
| /// Get the density of this fixture. | |
| float32 GetDensity() const; | |
| /// Get the coefficient of friction. | |
| float32 GetFriction() const; | |
| /// Set the coefficient of friction. This will _not_ change the friction of | |
| /// existing contacts. | |
| void SetFriction(float32 friction); | |
| /// Get the coefficient of restitution. | |
| float32 GetRestitution() const; | |
| /// Set the coefficient of restitution. This will _not_ change the restitution of | |
| /// existing contacts. | |
| void SetRestitution(float32 restitution); | |
| /// Get the fixture's AABB. This AABB may be enlarge and/or stale. | |
| /// If you need a more accurate AABB, compute it using the shape and | |
| /// the body transform. | |
| const b2AABB& GetAABB(int32 childIndex) const; | |
| /// Dump this fixture to the log file. | |
| void Dump(int32 bodyIndex); | |
| protected: | |
| friend class b2Body; | |
| friend class b2World; | |
| friend class b2Contact; | |
| friend class b2ContactManager; | |
| public: | |
| b2Fixture(); | |
| protected: | |
| // We need separation create/destroy functions from the constructor/destructor because | |
| // the destructor cannot access the allocator (no destructor arguments allowed by C++). | |
| void Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def); | |
| void Destroy(b2BlockAllocator* allocator); | |
| // These support body activation/deactivation. | |
| void CreateProxies(b2BroadPhase* broadPhase, const b2Transform& xf); | |
| void DestroyProxies(b2BroadPhase* broadPhase); | |
| void Synchronize(b2BroadPhase* broadPhase, const b2Transform& xf1, const b2Transform& xf2); | |
| float32 m_density; | |
| b2Fixture* m_next; | |
| b2Body* m_body; | |
| b2Shape* m_shape; | |
| float32 m_friction; | |
| float32 m_restitution; | |
| b2FixtureProxy* m_proxies; | |
| int32 m_proxyCount; | |
| b2Filter m_filter; | |
| bool m_isSensor; | |
| void* m_userData; | |
| }; | |
| inline b2Shape::Type b2Fixture::GetType() const | |
| { | |
| return m_shape->GetType(); | |
| } | |
| inline b2Shape* b2Fixture::GetShape() | |
| { | |
| return m_shape; | |
| } | |
| inline const b2Shape* b2Fixture::GetShape() const | |
| { | |
| return m_shape; | |
| } | |
| inline bool b2Fixture::IsSensor() const | |
| { | |
| return m_isSensor; | |
| } | |
| inline const b2Filter& b2Fixture::GetFilterData() const | |
| { | |
| return m_filter; | |
| } | |
| inline void* b2Fixture::GetUserData() const | |
| { | |
| return m_userData; | |
| } | |
| inline void b2Fixture::SetUserData(void* data) | |
| { | |
| m_userData = data; | |
| } | |
| inline b2Body* b2Fixture::GetBody() | |
| { | |
| return m_body; | |
| } | |
| inline const b2Body* b2Fixture::GetBody() const | |
| { | |
| return m_body; | |
| } | |
| inline b2Fixture* b2Fixture::GetNext() | |
| { | |
| return m_next; | |
| } | |
| inline const b2Fixture* b2Fixture::GetNext() const | |
| { | |
| return m_next; | |
| } | |
| inline void b2Fixture::SetDensity(float32 density) | |
| { | |
| b2Assert(b2IsValid(density) && density >= 0.0f); | |
| m_density = density; | |
| } | |
| inline float32 b2Fixture::GetDensity() const | |
| { | |
| return m_density; | |
| } | |
| inline float32 b2Fixture::GetFriction() const | |
| { | |
| return m_friction; | |
| } | |
| inline void b2Fixture::SetFriction(float32 friction) | |
| { | |
| m_friction = friction; | |
| } | |
| inline float32 b2Fixture::GetRestitution() const | |
| { | |
| return m_restitution; | |
| } | |
| inline void b2Fixture::SetRestitution(float32 restitution) | |
| { | |
| m_restitution = restitution; | |
| } | |
| inline bool b2Fixture::TestPoint(const b2Vec2& p) const | |
| { | |
| return m_shape->TestPoint(m_body->GetTransform(), p); | |
| } | |
| inline bool b2Fixture::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, int32 childIndex) const | |
| { | |
| return m_shape->RayCast(output, input, m_body->GetTransform(), childIndex); | |
| } | |
| inline void b2Fixture::GetMassData(b2MassData* massData) const | |
| { | |
| m_shape->ComputeMass(massData, m_density); | |
| } | |
| inline const b2AABB& b2Fixture::GetAABB(int32 childIndex) const | |
| { | |
| b2Assert(0 <= childIndex && childIndex < m_proxyCount); | |
| return m_proxies[childIndex].aabb; | |
| } | |
| #endif |