1extern crate sky_renderer;
2
3use std::cell::RefCell;
4use std::rc::Rc;
5use sky_renderer::core::{App, Attribute, Geometry, Mesh, Renderer, Shader, Window};
6use sky_renderer::core::engine::opengl::{GL_POINTS};
7
8static SWITZERLAND_BOUNDS: [f32; 4] = [5.956, 45.817, 10.492, 47.808];
9
10thread_local! {
11 static MAP_BOUNDS: RefCell<[f32; 4]> = RefCell::new(SWITZERLAND_BOUNDS);
12}
13
14fn main() {
15 let wgs84_coordinates = vec![
16 6.1432, 46.2044, 6.6323, 46.5197, 7.4474, 46.9480, 8.2457, 46.8959, 8.5417, 47.3769, 9.8355, 46.4908, ];
23
24 let mut window = Window::new("Hello, Switzerland", 800, 600);
25
26 window.on_scroll(move |_, y_offset| {
27 MAP_BOUNDS.with(|bounds| {
28 let mut b = bounds.borrow_mut();
29
30 let center_long = (b[0] + b[2]) / 2.0;
31 let center_lat = (b[1] + b[3]) / 2.0;
32 let zoom_factor = if y_offset > 0.0 { 0.95 } else { 1.05 };
33
34 b[0] = center_long + (b[0] - center_long) * zoom_factor;
35 b[1] = center_lat + (b[1] - center_lat) * zoom_factor;
36 b[2] = center_long + (b[2] - center_long) * zoom_factor;
37 b[3] = center_lat + (b[3] - center_lat) * zoom_factor;
38 });
39 });
40
41 let vertex_shader_source = include_str!("shaders/waypoints.vert");
42 let fragment_shader_source = include_str!("shaders/waypoints.frag");
43 let geometry_shader_source = include_str!("shaders/waypoints.geom");
44
45 let shader = Shader::compile(
46 vertex_shader_source,
47 fragment_shader_source,
48 Some(geometry_shader_source),
49 )
50 .expect("Failed to compile shader");
51
52 let mut geometry = Geometry::new(GL_POINTS);
53
54 geometry.add_buffer(&wgs84_coordinates, 2);
55 geometry.add_vertex_attribute(Attribute::new(0, 2, 2usize, 0));
56
57 let mesh = Mesh::new(Rc::new(shader), geometry);
58
59 let renderer = Renderer::new(window.handle());
60 renderer.set_point_size(5.0);
61
62 let mut app = App::new(window);
63
64
65 app.on_render(move || {
66 MAP_BOUNDS.with(|bounds| {
67 mesh.set_uniform_4f("map_bounds", &bounds.borrow());
68 });
69 renderer.draw_mesh(&mesh);
70 });
71 app.run();
72}