apecs-physics 0.4.1 → 0.4.2
raw patch · 8 files changed
+72/−25 lines, 8 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Apecs.Physics: CollisionType :: CUIntPtr -> CollisionType
+ Apecs.Physics: Impulse :: Double -> Impulse
+ Apecs.Physics: newtype CollisionType
+ Apecs.Physics: newtype Impulse
- Apecs.Physics: Between :: CollisionGroup -> CollisionGroup -> CollisionSource
+ Apecs.Physics: Between :: CollisionType -> CollisionType -> CollisionSource
- Apecs.Physics: Wildcard :: CollisionGroup -> CollisionSource
+ Apecs.Physics: Wildcard :: CollisionType -> CollisionSource
Files
- CHANGELOG.md +8/−0
- apecs-physics.cabal +1/−1
- src/Apecs/Physics.hs +3/−2
- src/Apecs/Physics/Body.hs +2/−2
- src/Apecs/Physics/Collision.hs +4/−2
- src/Apecs/Physics/Constraint.hs +19/−0
- src/Apecs/Physics/Shape.hs +14/−14
- src/Apecs/Physics/Types.hs +21/−4
CHANGELOG.md view
@@ -1,3 +1,11 @@+## [0.4.2]+### Added+- Query `Impulse` for `Constraints`+- Exposed the `CollisionType` Component++### Changed+- Fixed `ConstraintList` to actually yield constraints instead of shapes+ ## [0.4.1] ### Changed - Fix Point Query bug, should no longer give memory issues
apecs-physics.cabal view
@@ -1,5 +1,5 @@ name: apecs-physics-version: 0.4.1+version: 0.4.2 synopsis: 2D physics for apecs description: 2D physics for apecs. Uses Chipmunk physics library under the hood. homepage: https://github.com/jonascarpay/apecs#readme
src/Apecs/Physics.hs view
@@ -17,11 +17,12 @@ -- * Shape Convex (..), Shape (..),- Mass (..), Density (..), Sensor (..), Friction (..), Elasticity (..), SurfaceVelocity (..), CollisionFilter (..),+ Mass (..), Density (..), Sensor (..), Friction (..), Elasticity (..), SurfaceVelocity (..),+ CollisionFilter (..), CollisionType(..), Bitmask (..), maskAll, maskNone, maskList, defaultFilter, boxShape, -- * Constraint- Constraint (..), ConstraintType (..), MaxForce (..), MaxBias (..), ErrorBias (..), CollideBodies (..),+ Constraint (..), ConstraintType (..), MaxForce (..), MaxBias (..), ErrorBias (..), Impulse (..), CollideBodies (..), -- * Collision Collision (..), CollisionHandler (..), defaultHandler,
src/Apecs/Physics/Body.hs view
@@ -432,5 +432,5 @@ instance ExplGet IO (Space ConstraintList) where explExists s ety = explExists (cast s :: Space Body) ety explGet (Space bMap _ _ _ _) ety = do- Just (BodyRecord _ _ sPtr _) <- M.lookup ety <$> readIORef bMap- ConstraintList . fmap Entity . S.toList <$> readIORef sPtr+ Just (BodyRecord _ _ _ cPtr) <- M.lookup ety <$> readIORef bMap+ ConstraintList . fmap Entity . S.toList <$> readIORef cPtr
src/Apecs/Physics/Collision.hs view
@@ -82,8 +82,10 @@ newCollisionHandler spcPtr (CollisionHandler source begin separate presolve postsolve) (fromIntegral -> ety) = withForeignPtr spcPtr $ \space -> do handler <- case source of- Between cta ctb -> [C.exp| cpCollisionHandler* {cpSpaceAddCollisionHandler($(cpSpace* space), $(unsigned int cta), $(unsigned int ctb))}|]- Wildcard ct -> [C.exp| cpCollisionHandler* {cpSpaceAddWildcardHandler($(cpSpace* space), $(unsigned int ct))}|]+ Between (CollisionType cta) (CollisionType ctb)+ -> [C.exp| cpCollisionHandler* {cpSpaceAddCollisionHandler($(cpSpace* space), $(uintptr_t cta), $(uintptr_t ctb))}|]+ Wildcard (CollisionType ct)+ -> [C.exp| cpCollisionHandler* {cpSpaceAddWildcardHandler($(cpSpace* space), $(uintptr_t ct))}|] [C.exp| void { $(cpCollisionHandler* handler)->userData = (void*) $(intptr_t ety) }|]
src/Apecs/Physics/Constraint.hs view
@@ -275,6 +275,25 @@ Just (Record c _) <- M.lookup ety <$> readIORef cMap ErrorBias <$> getErrorBias c +-- Impulse+getImpulse :: Ptr Constraint -> IO Double+getImpulse c = realToFrac <$> [C.exp| double { cpConstraintGetImpulse ($(cpConstraint* c)) } |]++instance Component Impulse where+ type Storage Impulse = Space Impulse++instance Has w IO Physics => Has w IO Impulse where+ getStore = (cast :: Space Physics -> Space Impulse) <$> getStore++instance ExplMembers IO (Space Impulse) where+ explMembers s = explMembers (cast s :: Space Constraint)++instance ExplGet IO (Space Impulse) where+ explExists s ety = explExists (cast s :: Space Constraint) ety+ explGet (Space _ _ cMap _ _) ety = do+ Just (Record c _) <- M.lookup ety <$> readIORef cMap+ Impulse <$> getImpulse c+ -- CollideBodies getCollideBodies :: Ptr Constraint -> IO Bool getCollideBodies c = do
src/Apecs/Physics/Shape.hs view
@@ -140,9 +140,9 @@ explMembers s = explMembers (cast s :: Space Shape) instance ExplSet IO (Space Sensor) where- explSet (Space _ sMap _ _ _) ety (Sensor vec) = do+ explSet (Space _ sMap _ _ _) ety (Sensor isSensor) = do rd <- M.lookup ety <$> readIORef sMap- forM_ rd$ \(Record s _) -> setSensor s vec+ forM_ rd$ \(Record s _) -> setSensor s isSensor instance ExplGet IO (Space Sensor) where explExists s ety = explExists (cast s :: Space Shape) ety@@ -168,9 +168,9 @@ explMembers s = explMembers (cast s :: Space Shape) instance ExplSet IO (Space Elasticity) where- explSet (Space _ sMap _ _ _) ety (Elasticity vec) = do+ explSet (Space _ sMap _ _ _) ety (Elasticity elasticity) = do rd <- M.lookup ety <$> readIORef sMap- forM_ rd$ \(Record s _) -> setElasticity s vec+ forM_ rd$ \(Record s _) -> setElasticity s elasticity instance ExplGet IO (Space Elasticity) where explExists s ety = explExists (cast s :: Space Shape) ety@@ -196,9 +196,9 @@ explMembers s = explMembers (cast s :: Space Shape) instance ExplSet IO (Space Mass) where- explSet (Space _ sMap _ _ _) ety (Mass vec) = do+ explSet (Space _ sMap _ _ _) ety (Mass mass) = do rd <- M.lookup ety <$> readIORef sMap- forM_ rd$ \(Record s _) -> setMass s vec+ forM_ rd$ \(Record s _) -> setMass s mass instance ExplGet IO (Space Mass) where explExists s ety = explExists (cast s :: Space Shape) ety@@ -224,9 +224,9 @@ explMembers s = explMembers (cast s :: Space Shape) instance ExplSet IO (Space Density) where- explSet (Space _ sMap _ _ _) ety (Density vec) = do+ explSet (Space _ sMap _ _ _) ety (Density density) = do rd <- M.lookup ety <$> readIORef sMap- forM_ rd$ \(Record s _) -> setDensity s vec+ forM_ rd$ \(Record s _) -> setDensity s density instance ExplGet IO (Space Density) where explExists s ety = explExists (cast s :: Space Shape) ety@@ -252,9 +252,9 @@ explMembers s = explMembers (cast s :: Space Shape) instance ExplSet IO (Space Friction) where- explSet (Space _ sMap _ _ _) ety (Friction vec) = do+ explSet (Space _ sMap _ _ _) ety (Friction friction) = do rd <- M.lookup ety <$> readIORef sMap- forM_ rd$ \(Record s _) -> setFriction s vec+ forM_ rd$ \(Record s _) -> setFriction s friction instance ExplGet IO (Space Friction) where explExists s ety = explExists (cast s :: Space Shape) ety@@ -284,9 +284,9 @@ explMembers s = explMembers (cast s :: Space Shape) instance ExplSet IO (Space SurfaceVelocity) where- explSet (Space _ sMap _ _ _) ety (SurfaceVelocity vec) = do+ explSet (Space _ sMap _ _ _) ety (SurfaceVelocity svel) = do rd <- M.lookup ety <$> readIORef sMap- forM_ rd$ \(Record s _) -> setSurfaceVelocity s vec+ forM_ rd$ \(Record s _) -> setSurfaceVelocity s svel instance ExplGet IO (Space SurfaceVelocity) where explExists s ety = explExists (cast s :: Space Shape) ety@@ -348,9 +348,9 @@ explMembers s = explMembers (cast s :: Space Shape) instance ExplSet IO (Space CollisionType) where- explSet (Space _ sMap _ _ _) ety (CollisionType vec) = do+ explSet (Space _ sMap _ _ _) ety (CollisionType ctype) = do rd <- M.lookup ety <$> readIORef sMap- forM_ rd$ \(Record s _) -> setCollisionType s vec+ forM_ rd$ \(Record s _) -> setCollisionType s ctype instance ExplGet IO (Space CollisionType) where explExists s ety = explExists (cast s :: Space Shape) ety
src/Apecs/Physics/Types.hs view
@@ -133,10 +133,16 @@ -- See <https://en.wikipedia.org/wiki/Friction> for more information. newtype Friction = Friction Double deriving (Eq, Show) newtype SurfaceVelocity = SurfaceVelocity Vec deriving (Eq, Show)-newtype CollisionType = CollisionType C.CUIntPtr deriving (Eq, Show) type CollisionGroup = CUInt +-- | Collision Filters determine what shapes this shape collides with.+-- Shapes in the same 'filterGroup' will never collide with one another.+-- This is used to ignore collisions between parts on a complex object.+--+-- 'filterCategories' is a bitmask that determines what categories a shape belongs to.+-- 'filterMask' is a bitmask that determines what categories it collides with.+-- See <https://chipmunk-physics.net/release/ChipmunkLatest-Docs/#cpShape-Filtering> for more information. data CollisionFilter = CollisionFilter { filterGroup :: CollisionGroup , filterCategories :: Bitmask@@ -203,6 +209,7 @@ newtype MaxBias = MaxBias Double deriving (Eq, Show) newtype ErrorBias = ErrorBias Double deriving (Eq, Show) newtype CollideBodies = CollideBodies Bool deriving (Eq, Show)+newtype Impulse = Impulse Double deriving (Eq, Show) data Constraint = Constraint Entity Entity ConstraintType deriving (Eq, Show) @@ -221,7 +228,6 @@ deriving (Eq, Show) -- TODO--- getConstraintImpulse -- getPinJointDistance -- getSlideJointDistance? @@ -256,9 +262,20 @@ -- in this callback, if you need that for processing. } +-- | A 'Shape' can have a 'CollisionType'.+-- 'CollisionType's are used by callbacks for filtering, also see 'CollisionSource'.+-- The difference between 'CollisionType' and 'CollisionFilter' is that a 'CollisionFilter' determines whether+-- two shapes in the physics engine collide, or pass through one another, whereas a 'CollisionType' determines+-- what callback is called.+-- In general, if you don't want any special checks to happen, use 'CollisionFilter'.+newtype CollisionType = CollisionType C.CUIntPtr+ deriving (Num, Eq, Show)++-- | A 'CollisionSource' determines what types of collisions a callback handles.+-- Also see 'CollisionType' data CollisionSource- = Wildcard CollisionGroup- | Between CollisionGroup CollisionGroup+ = Wildcard CollisionType+ | Between CollisionType CollisionType -- Corresponds to an 'arbiter' in Chipmunk data Collision = Collision