packages feed

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 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