Skip to main content

waypoints/
waypoints.rs

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, // Geneva
17        6.6323, 46.5197, // Lausanne
18        7.4474, 46.9480, // Bern
19        8.2457, 46.8959, // Sarnen
20        8.5417, 47.3769, // Zurich
21        9.8355, 46.4908, // St-Moritz
22    ];
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}