@@ -9,6 +9,7 @@ use crate::math::{Vec2, EPSILON};
99/// A trait for objects that can collide with other objects.
1010pub trait Collide < Rhs = Self > {
1111 /// calculate the penetration depth (a scalar ratio of `dv`)
12+ /// as well as the normal of the colliding edge
1213 /// of the collision after applying the velocity,
1314 /// if there was any.
1415 /// `dv` is the difference between the two velocities
@@ -39,8 +40,8 @@ impl Collide for Collidable {
3940}
4041
4142impl Collidable {
42- pub fn shift ( & self , dv : Vec2 ) -> Collidable {
43- match self {
43+ pub fn shift ( & mut self , dv : Vec2 ) {
44+ * self = match self {
4445 Collidable :: AABox ( a) => Collidable :: AABox ( AABox {
4546 pos : a. pos + dv,
4647 size : a. size ,
@@ -55,32 +56,6 @@ impl Collidable {
5556 }
5657}
5758
58- /// calculate the minimal axis aligned bounding box that contains all `Collidable`s of a given set
59- pub fn calculate_aabb < ' a , I : Iterator < Item = & ' a Collidable > > ( vals : I ) -> AABox {
60- let [ ( mut minx, mut maxx) , ( mut miny, mut maxy) ] = [ ( f32:: INFINITY , f32:: NEG_INFINITY ) ; 2 ] ;
61- let mut minmax = |v1 : & Vec2 , v2 : & Vec2 | {
62- minx = f32:: min ( minx, v1. x ( ) ) ;
63- maxx = f32:: max ( maxx, v2. x ( ) ) ;
64- miny = f32:: min ( miny, v1. y ( ) ) ;
65- maxy = f32:: max ( maxy, v2. y ( ) ) ;
66- } ;
67- for val in vals {
68- match val {
69- Collidable :: Point ( v) => minmax ( v, v) ,
70- Collidable :: AABox ( AABox { pos, size } ) => minmax ( pos, & ( * pos + * size) ) ,
71- & Collidable :: RBox ( RBox { pos, v1, v2 } ) => {
72- for point in & [ pos, pos + v1, pos + v2, pos + v1 + v2] {
73- minmax ( point, point)
74- }
75- }
76- } ;
77- }
78- AABox {
79- pos : Vec2 :: new ( minx, miny) ,
80- size : Vec2 :: new ( maxx - minx, maxy - miny) ,
81- }
82- }
83-
8459// Given a fraction of the dv vectors length,
8560// return the amount to set the objects back
8661// in case of a collision
@@ -104,6 +79,26 @@ macro_rules! impl_collide {
10479 Self :: $C( other)
10580 }
10681 }
82+
83+ impl Collide <$A> for Collidable {
84+ fn collide_after( & self , other: & $A, dv: Vec2 ) -> Option <f32 > {
85+ match self {
86+ Collidable :: Point ( s) => s. collide_after( other, dv) ,
87+ Collidable :: AABox ( s) => s. collide_after( other, dv) ,
88+ Collidable :: RBox ( s) => s. collide_after( other, dv) ,
89+ }
90+ }
91+ }
92+
93+ impl Collide <Collidable > for $A {
94+ fn collide_after( & self , other: & Collidable , dv: Vec2 ) -> Option <f32 > {
95+ match other {
96+ Collidable :: Point ( s) => self . collide_after( s, dv) ,
97+ Collidable :: AABox ( s) => self . collide_after( s, dv) ,
98+ Collidable :: RBox ( s) => self . collide_after( s, dv) ,
99+ }
100+ }
101+ }
107102 } ;
108103 ( for { $A: ident, $B: ident} $item: item) => {
109104 impl Collide <$B> for $A {
0 commit comments