wilhelm_renderer 0.8.0

A minimalist 2D data rendering engine
Documentation
extern crate wilhelm_renderer;

use std::rc::Rc;
use glam::{Mat4, Vec3};
use wilhelm_renderer::core::{App, Attribute, Color, Geometry, Mesh, Shader, Window};
use wilhelm_renderer::core::engine::opengl::{GL_TRIANGLES, GLfloat};

const SCALE_FACTOR: f32 = 2.0;

fn build_transform(viewport_width: f32, viewport_height: f32, time: f64) -> Mat4 {
    let scale = Mat4::from_scale(Vec3::new(SCALE_FACTOR, -SCALE_FACTOR, SCALE_FACTOR));
    let rotation = Mat4::from_rotation_z(2.0*time as f32);

    // Translate triangle to center of the screen
    let translation = Mat4::from_translation(Vec3::new(
        viewport_width / 2.0,
        viewport_height / 2.0,
        0.0,
    ));
    
    let projection = Mat4::orthographic_rh_gl(0.0, viewport_width, viewport_height, 0.0, 0.0, 1.0);
    projection * translation * rotation * scale
}

fn main() {
    let vertices: Vec<GLfloat> = vec![
        -10.0, 0.0,  // bottom-left
        10.0, 0.0,  // bottom-right
        0.0,  10.0, // top-center
    ];
    let values_per_vertex = 2;

    let window = Window::new("Transform", 800, 600, Color::from_rgb(0.07, 0.13, 0.17));
    let mut geometry = Geometry::new(GL_TRIANGLES);
    geometry.add_buffer(&vertices, values_per_vertex);
    geometry.add_vertex_attribute(Attribute::new(0, 2, 2, 0));

    let vertex_shader_source = include_str!("shaders/transform.vert");
    let fragment_shader_source = include_str!("shaders/transform.frag");

    let shader = Shader::compile(vertex_shader_source, fragment_shader_source, None)
        .expect("Failed to compile shader");

    let mut mesh = Mesh::new(Rc::new(shader), geometry);
    let mut app = App::new(window);

    app.on_render(move |renderer, _| {
        let (width, height) = renderer.window_handle.size();

        let transform = build_transform(width as f32, height as f32, renderer.get_time());
        mesh.set_transform(transform);

        renderer.draw_mesh(&mesh)
    });

    app.run();
}