What is differ?
A Separating Axis Theorem collision library for haxe
Facts
- 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
Quick look
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
}
See tests/ for usage examples and tests
Other notes
- Not framework specific
- Original code ported from rocketmandevelopment blog
API documentation
https://snowkit.github.io/differ/
Demos
Main Contributors
History
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
Vector
in the APIShapeDrawer
:drawLine
,drawPoint
Collision.pointInPoly
- Added
Ray
infinite mode instead of boolean- Not infinite
- Infinite from start position
- Infinite in both directions
- Added
Rays
test in usage0 - Added ShapeCollision/RayCollision/RayIntersection
- added
clone()
,copy_from(other)
,reset()
- added
- Added differ.math.Util
- removes internal SAT2D use of the
Vector
class
- removes internal SAT2D use of the
- Added
into
argument 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
rayVsRay
with a negative overlap - Removed
Common
util class, it's internal to SAT2D and simplified now - Removed
drawVector
inShapeDrawer
, wasn't used (usedrawLine
if 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.test
toCollision.shapeWithShape
- Renamed
Collision.testShapes
toCollision.shapeWithShapes
- Renamed
Collision.rayShape
toCollision.rayWithShape
- Renamed
Collision.rayShapes
toCollision.rayWithShapes
- Renamed
Collision.rayRay
toCollision.rayWithRay
- Renamed
Collision.rayRays
toCollision.rayWithRays
- Renamed
Collision.rayRays
toCollision.rayWithRays
- Renamed
data.CollisionData
todata.ShapeCollision
- Renamed
data.RayCollisionData
todata.RayCollision
- Renamed
data.RayIntersectionData
todata.RayIntersection
- Removed
OpenFLDrawer
, will replace with gist or test later
1.1.0
- Added documentation and clean up of code
- Renamed
Vector2D
toVector
and 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
BaseShape
toShape
, continued refactoring - Renamed
Collision.testShapes
toCollision.test
- Renamed
Collision.testShapeList
toCollision.testShapes
- Renamed
Collision.rayCollision
toCollision.ray
- Fixed various bugs in collisions
- Fixed
separation
/unitVector
behaviour (signs bugs) - Fixed bug with
Polygon
/Polygon
collisions not returning best vectors - Fixed bug where you couldn't
beginFill
usingOpenFLDrawer
- Fixed
collisionData
inCheckCircles
, shape2 wasn't assigned. - Fixed
separation
/unitVector
is now bound to shape1 as it should be - Added 2 samples (usage2 & usage3)
- Added
drawVector
inOpenFLDrawer
showing vector direction - Added
drawShape
inShapeDrawer
, will cast proper types and call appropriate drawing functions.
1.0.4
- Renamed
Polygon.normalPolygon
toPolygon.create
- Added
testShapeList
for testing one shape with many - Added changes to the test to display the
unitVector
response (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
ShapeDrawer
class, 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