TODO: rewrite this smarter!
| 327 | |
| 328 | // TODO: rewrite this smarter! |
| 329 | int CCollision::IntersectLine(vec2 Pos0, vec2 Pos1, vec2 *pOutCollision, vec2 *pOutBeforeCollision) const |
| 330 | { |
| 331 | float Distance = distance(Pos0, Pos1); |
| 332 | int End(Distance + 1); |
| 333 | vec2 Last = Pos0; |
| 334 | for(int i = 0; i <= End; i++) |
| 335 | { |
| 336 | float a = i / (float)End; |
| 337 | vec2 Pos = mix(Pos0, Pos1, a); |
| 338 | // Temporary position for checking collision |
| 339 | int ix = round_to_int(Pos.x); |
| 340 | int iy = round_to_int(Pos.y); |
| 341 | |
| 342 | if(CheckPoint(ix, iy)) |
| 343 | { |
| 344 | if(pOutCollision) |
| 345 | *pOutCollision = Pos; |
| 346 | if(pOutBeforeCollision) |
| 347 | *pOutBeforeCollision = Last; |
| 348 | return GetCollisionAt(ix, iy); |
| 349 | } |
| 350 | |
| 351 | Last = Pos; |
| 352 | } |
| 353 | if(pOutCollision) |
| 354 | *pOutCollision = Pos1; |
| 355 | if(pOutBeforeCollision) |
| 356 | *pOutBeforeCollision = Pos1; |
| 357 | return 0; |
| 358 | } |
| 359 | |
| 360 | int CCollision::IntersectLineTeleHook(vec2 Pos0, vec2 Pos1, vec2 *pOutCollision, vec2 *pOutBeforeCollision, int *pTeleNr) const |
| 361 | { |