- collision.normal = normalize(LinAl::Vector<float, 2>(c*local_cdelta.x-s*local_cdelta.y, c*local_cdelta.y+s*local_cdelta.x));
- collision.depth = radius-sqrt(d_sq);
+ if(d_sq>1e-10)
+ {
+ collision.normal = normalize(LinAl::Vector<float, 2>(c*local_cdelta.x-s*local_cdelta.y, c*local_cdelta.y+s*local_cdelta.x));
+ collision.depth = radius-sqrt(d_sq);
+ }
+ else
+ {
+ LinAl::Vector<float, 2> inside_dist(half_size.x-abs(local_delta.x), half_size.y-abs(local_delta.y));
+ if(inside_dist.x<inside_dist.y)
+ {
+ collision.normal = LinAl::Vector<float, 2>(c, s) * (local_delta.x<0 ? -1.0f : 1.0f);
+ collision.depth = radius+inside_dist.x;
+ }
+ else
+ {
+ collision.normal = LinAl::Vector<float, 2>(-s, c) * (local_delta.y<0 ? -1.0f : 1.0f);
+ collision.depth = radius+inside_dist.y;
+ }
+ }