X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fcollision.cpp;h=715d02e30afd717a5cc50af760cc29cd2eb664b3;hb=17384c690dbb1a212fd92c5f2237558ab973fd29;hp=8ae5e91bf13054dd9c2f3982c125ec4e1769c276;hpb=2892ebda09d24c977547159e34abf0244884b89e;p=supertux.git diff --git a/src/collision.cpp b/src/collision.cpp index 8ae5e91bf..715d02e30 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -52,16 +52,15 @@ namespace { { n = Vector(p2.y-p1.y, p1.x-p2.x); c = -(p2 * n); - float nval = n.norm(); + float nval = n.norm(); n /= nval; c /= nval; } - static const float DELTA = .0001; } bool rectangle_aatriangle(Constraints* constraints, const Rect& rect, - const AATriangle& triangle) + const AATriangle& triangle, const Vector& addl_ground_movement) { if(!intersects(rect, (const Rect&) triangle)) return false; @@ -93,8 +92,8 @@ bool rectangle_aatriangle(Constraints* constraints, const Rect& rect, break; default: assert(false); - } - + } + switch(triangle.dir & AATriangle::DIRECTION_MASK) { case AATriangle::SOUTHWEST: p1 = Vector(rect.p1.x, rect.p2.y); @@ -128,7 +127,7 @@ bool rectangle_aatriangle(Constraints* constraints, const Rect& rect, std::cout << "Norm: " << normal << " Depth: " << depth << "\n"; #endif - Vector outvec = normal * (depth + 0.2); + Vector outvec = normal * (depth + 0.2f); const float RDELTA = 3; if(p1.x < area.p1.x - RDELTA || p1.x > area.p2.x + RDELTA @@ -146,18 +145,19 @@ bool rectangle_aatriangle(Constraints* constraints, const Rect& rect, if(outvec.y < 0) { constraints->bottom = rect.get_bottom() + outvec.y; constraints->hit.bottom = true; + constraints->ground_movement += addl_ground_movement; } else { constraints->top = rect.get_top() + outvec.y; constraints->hit.top = true; } constraints->hit.slope_normal = normal; } - + return true; } void set_rectangle_rectangle_constraints(Constraints* constraints, - const Rect& r1, const Rect& r2) + const Rect& r1, const Rect& r2, const Vector& addl_ground_movement) { float itop = r1.get_bottom() - r2.get_top(); float ibottom = r2.get_bottom() - r1.get_top(); @@ -170,6 +170,7 @@ void set_rectangle_rectangle_constraints(Constraints* constraints, if(itop < ibottom) { constraints->bottom = std::min(constraints->bottom, r2.get_top()); constraints->hit.bottom = true; + constraints->ground_movement += addl_ground_movement; } else { constraints->top = std::max(constraints->top, r2.get_bottom()); constraints->hit.top = true;