1#![allow(clippy::cast_possible_wrap)]
6
7use crate::{Sprite, SpriteCollection};
8use std::cmp::max;
9
10fn collided(sprite1: &Sprite, sprite2: &Sprite) -> bool {
13 let coll_rad1 = max(sprite1.rect.width(), sprite1.rect.height()) as i32;
14 let coll_rad2 = max(sprite2.rect.width(), sprite2.rect.height()) as i32;
15
16 let collision_radius = coll_rad1 + coll_rad2;
17 let collision_diameter = collision_radius * collision_radius;
18
19 let diff_x = sprite1.position().x - sprite2.position().x;
20 let diff_x2 = diff_x * diff_x;
21
22 if diff_x2 > collision_diameter {
23 return false;
24 }
25
26 let diff_y = sprite1.position().y - sprite2.position().y;
27 let diff_y2 = diff_y * diff_y;
28
29 if diff_y2 > collision_diameter {
30 return false;
31 }
32
33 sprite1.rect.has_intersection(sprite2.rect)
34}
35
36#[must_use]
38pub fn check_for_collision(sprite1: &Sprite, sprite2: &Sprite) -> bool {
39 collided(sprite1, sprite2)
40}
41
42#[must_use]
45pub fn check_for_collision_with_collection<'a>(
46 sprite: &Sprite,
47 list: &'a SpriteCollection,
48) -> Vec<&'a Sprite> {
49 list.inner()
50 .iter()
51 .filter(|s| check_for_collision(sprite, s))
52 .collect()
53}