Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Collision data shape ordering (second attempt) #45

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions echo/Shape.hx
Original file line number Diff line number Diff line change
Expand Up @@ -206,11 +206,11 @@ class Shape #if cog implements cog.IComponent #end {

public function collides(s:Shape):Null<CollisionData> return null;

function collide_rect(r:Rect):Null<CollisionData> return null;
function collide_rect(r:Rect, flip:Bool = false):Null<CollisionData> return null;

function collide_circle(c:Circle):Null<CollisionData> return null;
function collide_circle(c:Circle, flip:Bool = false):Null<CollisionData> return null;

function collide_polygon(p:Polygon):Null<CollisionData> return null;
function collide_polygon(p:Polygon, flip:Bool = false):Null<CollisionData> return null;

function toString() {
var s = switch (type) {
Expand Down
8 changes: 4 additions & 4 deletions echo/shape/Circle.hx
Original file line number Diff line number Diff line change
Expand Up @@ -87,13 +87,13 @@ class Circle extends Shape implements Poolable {
return false;
}

override inline function collides(s:Shape):Null<CollisionData> return s.collide_circle(this);
override inline function collides(s:Shape):Null<CollisionData> return s.collide_circle(this, true);

override inline function collide_rect(r:Rect):Null<CollisionData> return r.rect_and_circle(this, true);
override inline function collide_rect(r:Rect, flip:Bool = false):Null<CollisionData> return r.rect_and_circle(this, !flip);

override inline function collide_circle(c:Circle):Null<CollisionData> return c.circle_and_circle(this);
override inline function collide_circle(c:Circle, flip:Bool = false):Null<CollisionData> return c.circle_and_circle(this, !flip);

override inline function collide_polygon(p:Polygon):Null<CollisionData> return this.circle_and_polygon(p, true);
override inline function collide_polygon(p:Polygon, flip:Bool = false):Null<CollisionData> return this.circle_and_polygon(p, flip);

// getters
inline function get_radius():Float return local_radius * scale_x;
Expand Down
8 changes: 4 additions & 4 deletions echo/shape/Polygon.hx
Original file line number Diff line number Diff line change
Expand Up @@ -197,13 +197,13 @@ class Polygon extends Shape implements Poolable {
return false;
}

override inline function collides(s:Shape):Null<CollisionData> return s.collide_polygon(this);
override inline function collides(s:Shape):Null<CollisionData> return s.collide_polygon(this, true);

override inline function collide_rect(r:Rect):Null<CollisionData> return r.rect_and_polygon(this, true);
override inline function collide_rect(r:Rect, flip:Bool = false):Null<CollisionData> return r.rect_and_polygon(this, !flip);

override inline function collide_circle(c:Circle):Null<CollisionData> return c.circle_and_polygon(this);
override inline function collide_circle(c:Circle, flip:Bool = false):Null<CollisionData> return c.circle_and_polygon(this, !flip);

override inline function collide_polygon(p:Polygon):Null<CollisionData> return p.polygon_and_polygon(this, true);
override inline function collide_polygon(p:Polygon, flip:Bool = false):Null<CollisionData> return this.polygon_and_polygon(p, flip);

override inline function get_top():Float {
if (count == 0 || vertices[0] == null) return y;
Expand Down
8 changes: 4 additions & 4 deletions echo/shape/Rect.hx
Original file line number Diff line number Diff line change
Expand Up @@ -174,13 +174,13 @@ class Rect extends Shape implements Poolable {
return false;
}

override inline function collides(s:Shape):Null<CollisionData> return s.collide_rect(this);
override inline function collides(s:Shape):Null<CollisionData> return s.collide_rect(this, true);

override inline function collide_rect(r:Rect):Null<CollisionData> return r.rect_and_rect(this);
override inline function collide_rect(r:Rect, flip:Bool = false):Null<CollisionData> return this.rect_and_rect(r, flip);

override inline function collide_circle(c:Circle):Null<CollisionData> return this.rect_and_circle(c);
override inline function collide_circle(c:Circle, flip:Bool = false):Null<CollisionData> return this.rect_and_circle(c, flip);

override inline function collide_polygon(p:Polygon):Null<CollisionData> return this.rect_and_polygon(p);
override inline function collide_polygon(p:Polygon, flip:Bool = false):Null<CollisionData> return this.rect_and_polygon(p, flip);

override function set_parent(?body:Body) {
super.set_parent(body);
Expand Down
25 changes: 16 additions & 9 deletions echo/util/SAT.hx
Original file line number Diff line number Diff line change
Expand Up @@ -190,17 +190,17 @@ class SAT {
var col:CollisionData = null;
if (rect1.rotation != 0 || rect2.rotation != 0) {
if (rect1.transformed_rect != null) {
col = rect_and_polygon(rect2, rect1.transformed_rect, flip);
col = rect_and_polygon(rect2, rect1.transformed_rect, !flip);

if (col == null) return null;

if (flip) col.sa = rect1;
if (flip) col.sa = rect2;
else col.sb = rect1;

return col;
}
if (rect2.transformed_rect != null) {
col = rect_and_polygon(rect1, rect2.transformed_rect, !flip);
col = rect_and_polygon(rect1, rect2.transformed_rect, flip);

if (col == null) return null;

Expand Down Expand Up @@ -318,6 +318,7 @@ class SAT {
data1.put();
return data2;
}

/**
* Test a Rect and a Circle for a Collision.
* @param r
Expand All @@ -327,19 +328,21 @@ class SAT {
*/
public static function rect_and_circle(r:Rect, c:Circle, flip:Bool = false):Null<CollisionData> {
if (r.transformed_rect != null && r.rotation != 0) {
var col = circle_and_polygon(c, r.transformed_rect, flip);
var col = circle_and_polygon(c, r.transformed_rect, !flip);

if (col == null) return null;

if (flip) col.sa = r;
// collisions used the transformed rect, set the collision data's shape back
// to the original rect
if (!flip) col.sa = r;
else col.sb = r;

return col;
}

// Vector from A to B
var nx = flip ? c.x - r.x : r.x - c.x;
var ny = flip ? c.y - r.y : r.y - c.y;
var nx = flip ? r.x - c.x : c.x - r.x;
var ny = flip ? r.y - c.y : c.y - r.y;
// Closest point on A to center of B
var cx = nx;
var cy = ny;
Expand Down Expand Up @@ -407,6 +410,8 @@ class SAT {

if (col == null) return null;

// collisions were done with a polygon derrived from the provided rect
// so we need to set our collision data shape back to the original rectangle
if (flip) col.sb = r;
else col.sa = r;

Expand Down Expand Up @@ -495,7 +500,7 @@ class SAT {
test1 = min1 - max2;
test2 = min2 - max1;

// Preform another test
// Perform another test
if (test1 > 0 || test2 > 0) {
col.put();
return null;
Expand Down Expand Up @@ -579,7 +584,9 @@ class SAT {
col.sa = flip ? polygon2 : polygon1;
col.sb = flip ? polygon1 : polygon2;

if (flip) {
// collision normal is calculated as resolution for poly2, so we need to
// negate the normal if we are not flipping the collision check.
if (!flip) {
col.normal.negate();
}

Expand Down
1 change: 1 addition & 0 deletions sample/Main.hx
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ class Main extends BaseApp {
PolygonState, StackingState, MultiShapeState, ShapesState, GroupsState, StaticState, LinecastState, Linecast2State, TileMapState, TileMapState2,
BezierState, VerletState
];

index = 0;
// Create a State Manager and pass it the World and the first Sample
fsm = new FSM<World>(world, Type.createInstance(sample_states[index], []));
Expand Down
Loading