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);
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, 10.0, 0.0, 0.0, 10.0, ];
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();
}