1- mod utils2d ;
1+ mod common_macroquad2d ;
22
3- use kiss3d:: prelude:: * ;
4- use parry2d:: bounding_volume:: BoundingVolume ;
5- use parry2d:: math:: Pose ;
3+ extern crate nalgebra as na;
4+
5+ use common_macroquad2d:: { draw_polyline, lissajous_2d, mquad_from_na, na_from_mquad} ;
6+ use macroquad:: prelude:: * ;
7+ use na:: Isometry2 ;
8+ use parry2d:: bounding_volume:: { Aabb , BoundingVolume } ;
69use parry2d:: shape:: Ball ;
7- use utils2d:: { draw_aabb2, draw_circle, lissajous_2d} ;
810
911const RENDER_SCALE : f32 = 30.0 ;
1012
11- #[ kiss3d :: main]
13+ #[ macroquad :: main( "aabb2d" ) ]
1214async fn main ( ) {
13- let mut window = Window :: new ( "aabb2d" ) . await ;
14- let mut camera = PanZoomCamera2d :: new ( Vec2 :: ZERO , 4.0 ) ;
15- let mut scene = SceneNode2d :: empty ( ) ;
16-
17- let start_time = web_time:: Instant :: now ( ) ;
15+ let render_pos = Vec2 :: new ( 300.0 , 300.0 ) ;
1816
19- while window. render_2d ( & mut scene, & mut camera) . await {
20- let elapsed_time = start_time. elapsed ( ) . as_secs_f32 ( ) * 0.7 ;
17+ loop {
18+ let elapsed_time = get_time ( ) as f32 * 0.7 ;
19+ clear_background ( BLACK ) ;
2120
2221 /*
2322 * Initialize the shapes.
2423 */
2524 let ball1 = Ball :: new ( 0.5 ) ;
2625 let ball2 = Ball :: new ( 1.0 ) ;
2726
28- let ball1_pos = lissajous_2d ( elapsed_time) * 5f32 ;
29- let ball1_pose = Pose :: from_translation ( ball1_pos) ;
30- let ball2_pose = Pose :: identity ( ) ;
27+ let ball1_pos = na_from_mquad ( lissajous_2d ( elapsed_time) ) * 5f32 ;
28+ let ball2_pos = Isometry2 :: identity ( ) ;
3129
3230 /*
3331 * Compute their axis-aligned bounding boxes.
3432 */
35- let aabb_ball1 = ball1. aabb ( & ball1_pose ) ;
36- let aabb_ball2 = ball2. aabb ( & ball2_pose ) ;
33+ let aabb_ball1 = ball1. aabb ( & ball1_pos . into ( ) ) ;
34+ let aabb_ball2 = ball2. aabb ( & ball2_pos ) ;
3735
3836 // Merge the two boxes.
3937 let bounding_aabb = aabb_ball1. merged ( & aabb_ball2) ;
@@ -52,49 +50,52 @@ async fn main() {
5250 assert ! ( bounding_aabb. contains( & aabb_ball2) ) ;
5351 assert ! ( loose_aabb_ball2. contains( & aabb_ball2) ) ;
5452
53+ let ball1_translation = mquad_from_na ( ball1_pos. coords . into ( ) ) * RENDER_SCALE + render_pos;
5554 draw_circle (
56- & mut window ,
57- ball1_pos * RENDER_SCALE ,
55+ ball1_translation . x ,
56+ ball1_translation . y ,
5857 ball1. radius * RENDER_SCALE ,
5958 color,
6059 ) ;
60+ let ball2_translation =
61+ mquad_from_na ( ball2_pos. translation . vector . into ( ) ) * RENDER_SCALE + render_pos;
6162 draw_circle (
62- & mut window ,
63- ball2_pose . translation * RENDER_SCALE ,
63+ ball2_translation . x ,
64+ ball2_translation . y ,
6465 ball2. radius * RENDER_SCALE ,
6566 color,
6667 ) ;
6768
68- draw_aabb2 (
69- & mut window,
70- aabb_ball1. mins * RENDER_SCALE ,
71- aabb_ball1. maxs * RENDER_SCALE ,
72- color,
73- ) ;
74- draw_aabb2 (
75- & mut window,
76- aabb_ball2. mins * RENDER_SCALE ,
77- aabb_ball2. maxs * RENDER_SCALE ,
78- color,
79- ) ;
80- draw_aabb2 (
81- & mut window,
82- bounding_aabb. mins * RENDER_SCALE ,
83- bounding_aabb. maxs * RENDER_SCALE ,
84- YELLOW ,
85- ) ;
69+ draw_aabb ( aabb_ball1, render_pos, color) ;
70+ draw_aabb ( aabb_ball2, render_pos, color) ;
71+ draw_aabb ( bounding_aabb, render_pos, YELLOW ) ;
8672
8773 // Inclusion test
8874 let color_included: Color = if loose_aabb_ball2. contains ( & aabb_ball1) {
8975 BLUE
9076 } else {
9177 MAGENTA
9278 } ;
93- draw_aabb2 (
94- & mut window,
95- loose_aabb_ball2. mins * RENDER_SCALE ,
96- loose_aabb_ball2. maxs * RENDER_SCALE ,
97- color_included,
98- ) ;
79+ draw_aabb ( loose_aabb_ball2, render_pos, color_included) ;
80+ next_frame ( ) . await
9981 }
10082}
83+
84+ fn draw_aabb ( aabb : Aabb , offset : Vec2 , color : Color ) {
85+ let mins = mquad_from_na ( aabb. mins ) * RENDER_SCALE + offset;
86+ let maxs = mquad_from_na ( aabb. maxs ) * RENDER_SCALE + offset;
87+
88+ let line = vec ! [
89+ Vec2 :: new( mins. x, mins. y) ,
90+ Vec2 :: new( mins. x, maxs. y) ,
91+ Vec2 :: new( maxs. x, maxs. y) ,
92+ Vec2 :: new( maxs. x, mins. y) ,
93+ Vec2 :: new( mins. x, mins. y) ,
94+ ] ;
95+ let drawable_line = line
96+ . iter ( )
97+ . zip ( line. iter ( ) . cycle ( ) . skip ( 1 ) . take ( line. len ( ) ) )
98+ . map ( |item| ( item. 0 . clone ( ) , item. 1 . clone ( ) ) )
99+ . collect ( ) ;
100+ draw_polyline ( drawable_line, color) ;
101+ }
0 commit comments