Skip to main content

transforms/
transforms.rs

1extern crate sky_renderer;
2
3use std::rc::Rc;
4use glam::{Mat4, Vec3};
5use sky_renderer::core::{App, Attribute, Geometry, Mesh, Renderer, Shader, Window};
6use sky_renderer::core::engine::opengl::{GL_TRIANGLES, GLfloat};
7
8const SCALE_FACTOR: f32 = 2.0;
9
10fn build_transform(viewport_width: f32, viewport_height: f32, time: f64) -> Mat4 {
11    let scale = Mat4::from_scale(Vec3::new(SCALE_FACTOR, -SCALE_FACTOR, SCALE_FACTOR));
12    let rotation = Mat4::from_rotation_z(2.0*time as f32);
13
14    // Translate triangle to center of the screen
15    let translation = Mat4::from_translation(Vec3::new(
16        viewport_width / 2.0,
17        viewport_height / 2.0,
18        0.0,
19    ));
20    
21    let projection = Mat4::orthographic_rh_gl(0.0, viewport_width, viewport_height, 0.0, 0.0, 1.0);
22    projection * translation * rotation * scale
23}
24
25fn main() {
26    let vertices: Vec<GLfloat> = vec![
27        -10.0, 0.0,  // bottom-left
28        10.0, 0.0,  // bottom-right
29        0.0,  10.0, // top-center
30    ];
31    let values_per_vertex = 2;
32
33    let window = Window::new("Transform", 800, 600);
34    let mut geometry = Geometry::new(GL_TRIANGLES);
35    geometry.add_buffer(&vertices, values_per_vertex);
36    geometry.add_vertex_attribute(Attribute::new(0, 2, 2, 0));
37
38    let vertex_shader_source = include_str!("shaders/transform.vert");
39    let fragment_shader_source = include_str!("shaders/transform.frag");
40
41    let shader = Shader::compile(vertex_shader_source, fragment_shader_source, None)
42        .expect("Failed to compile shader");
43
44    let mut mesh = Mesh::new(Rc::new(shader), geometry);
45    let renderer = Renderer::new(window.handle());
46    let mut app = App::new(window);
47
48    app.on_render(move || {
49        // Get current viewport size in case window was resized
50        let (width, height) = renderer.viewport_size();
51
52        let transform = build_transform(width as f32, height as f32, renderer.get_time());
53        mesh.set_transform(transform);
54
55        renderer.draw_mesh(&mesh)
56    });
57
58    app.run();
59}