A Separating Axis Theorem collision library for haxe
- Implements Separating Axis Theorem, for collision detection.
- Supports convex polygons, circles, and rays.
- 2D only (for now).
- Includes a simple drawing interface for debugging shapes
- COLLISION ONLY. No physics/response - this is by design.
- Contributions welcome
A simple collision example
var circle = new Circle( 300, 200, 50 );
var box = Polygon.rectangle( 0, 0, 50, 150 );
box.rotation = 45;
var collideInfo = Collision.shapeWithShape( circle, box );
if(collideInfo != null) {
//use collideInfo.separationX
// collideInfo.separationY
// collideInfo.normalAxisX
// collideInfo.normalAxisY
// collideInfo.overlap
}- Not framework specific
- Original code ported from rocketmandevelopment blog
https://snowkit.github.io/differ/
1.4.0 (Latest release, haxelib)
- Fixes for newer haxe versions
- Fix Polygon.testRay ignoring 'into' parameter
1.3.0
The goal of this release is as follows :
- Reduce the usage of Vector internally, simplifying the code to primitives
- Remove allocations, myriads of them the old code had that carried over
- Add ways to reuse allocated results for efficiency when querying
- Add more test/example cases
- Expose the alternative polygon vs shape overlaps to make better choices based on movement
- Move the code more forward to be internally consistent and maintainable
- Fix the bugs with the rays and add more useful infinite flags
All of this was achieved, with the following changes.
- Refactor continued clean up
- remove all allocations in SAT2D, except for results if not provided
- refactor away internal uses of
Vector - remove superfluous use of
Vectorin the APIShapeDrawer:drawLine,drawPointCollision.pointInPoly
- Added
Rayinfinite mode instead of boolean- Not infinite
- Infinite from start position
- Infinite in both directions
- Added
Raystest in usage0 - Added ShapeCollision/RayCollision/RayIntersection
- added
clone(),copy_from(other),reset()
- added
- Added differ.math.Util
- removes internal SAT2D use of the
Vectorclass
- removes internal SAT2D use of the
- Added
intoargument for all internal and external calls- this reuses the existing instance for the result
- all calls will always reset the collision result
- all direct calls still return null as "no result"
- added
Results<T>results cache helper - all plural calls return
Results<T>
- Fixed Bug in
testCircleVsPolygon- When testing polygon vs circle values were flipped/wrong
- Fixed Bug in
rayVsRaywith a negative overlap - Removed
Commonutil class, it's internal to SAT2D and simplified now - Removed
drawVectorinShapeDrawer, wasn't used (usedrawLineif needed)
1.2.0
The biggest change for sure, renamed hxcollision to differ
Now that the library is getting more use its better to have a consistent name
and to have a more explicit path. Think of "differ" as a diff tool for shapes/rays,
it tells you how shapes differ (i.e the separation).
- Added ray collision information, rather than just true/false
- Added ray vs ray intersection with info on overlap
- Added more granular tests, that will expand further
- New test case uses luxe https://luxeengine.com/
- hxcollision/differ was born for luxe.collision, separate for any framework
- Refactor continued separating code for future 3D vs 2D
- moved all internal 2D code into differ.sat.SAT2D
- moved all internal common code into differ.sat.Common
- Renamed
Collision.testtoCollision.shapeWithShape - Renamed
Collision.testShapestoCollision.shapeWithShapes - Renamed
Collision.rayShapetoCollision.rayWithShape - Renamed
Collision.rayShapestoCollision.rayWithShapes - Renamed
Collision.rayRaytoCollision.rayWithRay - Renamed
Collision.rayRaystoCollision.rayWithRays - Renamed
Collision.rayRaystoCollision.rayWithRays - Renamed
data.CollisionDatatodata.ShapeCollision - Renamed
data.RayCollisionDatatodata.RayCollision - Renamed
data.RayIntersectionDatatodata.RayIntersection - Removed
OpenFLDrawer, will replace with gist or test later
1.1.0
- Added documentation and clean up of code
- Renamed
Vector2DtoVectorand cleaned up code to ONLY what is needed. This class is meant to be as small and easy to integrate as possible. - Refactor for easier maintaining in embedded libraries
- Renamed
BaseShapetoShape, continued refactoring - Renamed
Collision.testShapestoCollision.test - Renamed
Collision.testShapeListtoCollision.testShapes - Renamed
Collision.rayCollisiontoCollision.ray - Fixed various bugs in collisions
- Fixed
separation/unitVectorbehaviour (signs bugs) - Fixed bug with
Polygon/Polygoncollisions not returning best vectors - Fixed bug where you couldn't
beginFillusingOpenFLDrawer - Fixed
collisionDatainCheckCircles, shape2 wasn't assigned. - Fixed
separation/unitVectoris now bound to shape1 as it should be - Added 2 samples (usage2 & usage3)
- Added
drawVectorinOpenFLDrawershowing vector direction - Added
drawShapeinShapeDrawer, will cast proper types and call appropriate drawing functions.
1.0.4
- Renamed
Polygon.normalPolygontoPolygon.create - Added
testShapeListfor testing one shape with many - Added changes to the test to display the
unitVectorresponse (soon to be renamed also) - Refactor to more integration friendly api, and more logical order of arguments for shapes.
- Fixed rotation on the base shapes absolute (submitted by @grapefrukt).
- Added name and data flag to
BaseShape
1.0.3
- Fixed bug in circle vs polygon, when polygon was rotated.
- Added line raycast with collision shapes
- Added a custom
ShapeDrawerclass, for drawing the shapes in a non specific way. - Update to latest haxelib revisions
- Removed dependency on OpenFL, now completely standalone
1.0.2
- uncommitted internal fixes
1.0.1
- Added an option for
Polygon.rectangle()to be non-centered
1.0.0
- Initial project pull and compile/port, functional




