11use core:: ops:: ControlFlow :: * ;
2+ use re:: geom:: Ray ;
23
34use re:: prelude:: * ;
45
56use re:: math:: color:: gray;
7+ use re:: math:: mat:: { orient, orient_z_y, RealToReal } ;
8+ use re:: render:: cam:: Spline ;
69use re:: render:: {
710 cam:: FirstPerson , shader:: Shader , Batch , Camera , ModelToProj ,
811} ;
912
1013use re_front:: sdl2:: Window ;
11- use re_geom:: solids:: Box ;
14+ use re_geom:: solids:: { Box , Cone } ;
1215
1316fn main ( ) {
1417 let mut win = Window :: builder ( )
@@ -32,55 +35,101 @@ fn main() {
3235 } ,
3336 ) ;
3437
38+ let spline: BezierSpline < Point3 < World > > = BezierSpline :: from_rays ( [
39+ Ray ( pt3 ( -12.0 , 0.0 , 0.0 ) , Vec3 :: Z . to ( ) * 50.0 ) ,
40+ Ray ( pt3 ( 0.0 , -6.0 , 10.0 ) , Vec3 :: X . to ( ) * 50.0 ) ,
41+ Ray ( pt3 ( 12.0 , -16.0 , 0.0 ) , -Vec3 :: Z . to ( ) * 50.0 ) ,
42+ Ray ( pt3 ( 10.0 , -3.0 , -10.0 ) , -Vec3 :: X . to ( ) * 50.0 ) ,
43+ Ray ( pt3 ( -12.0 , 0.0 , 0.0 ) , Vec3 :: Z . to ( ) * 50.0 ) ,
44+ ] ) ;
45+
3546 let ( w, h) = win. dims ;
3647 let mut cam = Camera :: new ( win. dims )
37- . transform ( FirstPerson :: default ( ) )
38- . viewport ( ( 10 ..w - 10 , 10 ..h - 10 ) )
48+ /*.transform(FirstPerson {
49+ pos: pt3(-20.0, -2.0, 0.0),
50+ heading: Default::default(),
51+ })*/
52+ . transform ( Spline { spline : spline. clone ( ) , t : 0.0 } )
3953 . perspective ( 1.0 , 0.1 ..1000.0 ) ;
4054
4155 let floor = floor ( ) ;
4256 let crat = Box :: cube ( 2.0 ) . build ( ) ;
4357
4458 win. run ( |frame| {
45- // Camera
46-
47- let mut cam_vel = Vec3 :: zero ( ) ;
48-
4959 let ep = & frame. win . ev_pump ;
5060
51- for key in ep. keyboard_state ( ) . pressed_scancodes ( ) {
52- use sdl2:: keyboard:: Scancode as Sc ;
53- match key {
54- Sc :: W => cam_vel[ 2 ] += 4.0 ,
55- Sc :: S => cam_vel[ 2 ] -= 2.0 ,
56- Sc :: D => cam_vel[ 0 ] += 3.0 ,
57- Sc :: A => cam_vel[ 0 ] -= 3.0 ,
58- _ => { }
59- }
60- }
61-
62- let ms = ep. relative_mouse_state ( ) ;
63- let d_az = turns ( ms. x ( ) as f32 ) * -0.001 ;
64- let d_alt = turns ( ms. y ( ) as f32 ) * 0.001 ;
65-
66- cam. transform . rotate ( d_az, d_alt) ;
67- cam. transform
68- . translate ( cam_vel. mul ( frame. dt . as_secs_f32 ( ) ) ) ;
61+ // eprint!(
62+ // "\r pos={:.2?} sdir={:.2?} cdir={:.2?}",
63+ // cam.transform.pos,
64+ // cam.transform.heading,
65+ // cam.transform.heading.to_cart::<()>()
66+ // );
6967
70- let flip = scale3 ( 1.0 , -1.0 , -1.0 ) . to ( ) ;
68+ // Camera
69+ // let mut cam_vel = Vec3::zero();
70+ //
71+ // for key in ep.keyboard_state().pressed_scancodes() {
72+ // use sdl2::keyboard::Scancode as Sc;
73+ // match key {
74+ // Sc::W => cam_vel[2] += 4.0,
75+ // Sc::S => cam_vel[2] -= 2.0,
76+ // Sc::D => cam_vel[0] += 3.0,
77+ // Sc::A => cam_vel[0] -= 3.0,
78+ // _ => {}
79+ // }
80+ // }
81+ //
82+ // let ms = ep.relative_mouse_state();
83+ //
84+ // let d_az = turns(ms.x() as f32) * -0.001;
85+ //
86+ // let d_alt = turns(ms.y() as f32) * 0.001;
87+ //
88+ // cam.transform.rotate(d_az, d_alt);
89+ // cam.transform
90+ // .translate(cam_vel.mul(frame.dt.as_secs_f32()));
91+
92+ cam. transform . t = ( frame. t . as_secs_f32 ( ) * 0.1 ) % 1.0 ;
7193
7294 // Render
7395
74- let world_to_project = flip . then ( & cam. world_to_project ( ) ) ;
96+ let world_to_project = & cam. world_to_project ( ) ;
7597
7698 let batch = Batch :: new ( )
7799 . viewport ( cam. viewport )
78100 . context ( & frame. ctx ) ;
79101
102+ let arrow = Cone {
103+ sectors : 20 ,
104+ segments : 1 ,
105+ capped : true ,
106+ base_radius : 0.4 ,
107+ apex_radius : 0.0 ,
108+ }
109+ . build ( ) ;
110+
111+ let t = ( frame. t . as_secs_f32 ( ) * 0.1 + 0.1 ) % 1.0 ;
112+ let pos = spline. eval ( t) ;
113+
114+ let fwd = spline. tangent ( t) . normalize ( ) ;
115+
116+ let arrow_tf = orient_y ( fwd. to ( ) , Vec3 :: Y )
117+ . then ( & translate ( pos. to_vec ( ) . to ( ) ) )
118+ . to ( )
119+ . then ( & world_to_project) ;
120+
121+ batch
122+ . clone ( )
123+ . mesh ( & arrow)
124+ . uniform ( & arrow_tf)
125+ . shader ( crate_shader)
126+ . target ( & mut frame. buf )
127+ . render ( ) ;
128+
80129 batch
81130 . clone ( )
82131 . mesh ( & floor)
83- . uniform ( & world_to_project)
132+ . uniform ( & world_to_project. to ( ) )
84133 . shader ( floor_shader)
85134 . target ( & mut frame. buf )
86135 . render ( ) ;
@@ -113,19 +162,19 @@ fn main() {
113162fn floor ( ) -> Mesh < Color3f > {
114163 let mut bld = Mesh :: builder ( ) ;
115164
116- let size = 50 ;
117- for j in -size ..=size {
118- for i in -size ..=size {
165+ let ( min , max ) = ( - 40 , 40 ) ;
166+ for j in min ..=max {
167+ for i in min ..=max {
119168 let even_odd = ( ( i & 1 ) ^ ( j & 1 ) ) == 1 ;
120169
121- let pos = pt3 ( i as f32 , - 1.0 , j as f32 ) ;
170+ let pos = pt3 ( i as f32 , 1.0 , j as f32 ) ;
122171 let col = if even_odd { gray ( 0.2 ) } else { gray ( 0.9 ) } ;
123172 bld. push_vert ( pos, col) ;
124173
125- if j > -size && i > -size {
126- let w = size * 2 + 1 ;
127- let j = size + j;
128- let i = size + i;
174+ if j > min && i > min {
175+ let w = ( max - min ) + 1 ;
176+ let j = -min + j;
177+ let i = -min + i;
129178 let [ a, b, c, d] = [
130179 w * ( j - 1 ) + ( i - 1 ) ,
131180 w * ( j - 1 ) + i,
@@ -135,11 +184,11 @@ fn floor() -> Mesh<Color3f> {
135184 . map ( |i| i as usize ) ;
136185
137186 if even_odd {
138- bld. push_face ( a, c , d ) ;
139- bld. push_face ( a, d , b ) ;
187+ bld. push_face ( a, d , c ) ;
188+ bld. push_face ( a, b , d ) ;
140189 } else {
141- bld. push_face ( b, c , d ) ;
142- bld. push_face ( b, a , c )
190+ bld. push_face ( b, d , c ) ;
191+ bld. push_face ( b, c , a )
143192 }
144193 }
145194 }
0 commit comments