gl_lib 0.1.0

This package uses the gl_generator package and add some useful tools on top. An example is a textrenderer that used signed distance field. All the low level access is still avaiable
Documentation
use gl_lib::{gl, objects::cube, shader, camera};
use failure;
use std::time::Instant;

use nalgebra as na;

fn main() -> Result<(), failure::Error> {
    let sdl = sdl2::init().unwrap();
    let video_subsystem = sdl.video().unwrap();

    //sdl.mouse().show_cursor(false);

    //sdl.mouse().set_relative_mouse_mode(true);

    let controller_subsystem = sdl.game_controller().unwrap();

    controller_subsystem.set_event_state(true);

    let gl_attr = video_subsystem.gl_attr();

    gl_attr.set_context_profile(sdl2::video::GLProfile::Core);
    gl_attr.set_context_version(4,5);


    let width = 800;
    let height = 600;

    let viewport = gl::viewport::Viewport::for_window(width as i32, height as i32);

    let window = video_subsystem
        .window("Game", width, height)
        .opengl()
        .resizable()
        .build()?;



    let _gl_context = window.gl_create_context().unwrap();
    let gl = gl::Gl::load_with(|s|{
        video_subsystem.gl_get_proc_address(s) as *const std::os::raw::c_void
    });

    viewport.set_used(&gl);

    unsafe {
        gl.Enable(gl::DEPTH_TEST);

    }

    let mut camera = camera::Camera::new( width as f32, height as f32);
    let shader = create_shader(&gl);
    let cube = cube::Cube::new(&gl);

    let model_mat = na::Matrix4::identity();

    let color = na::Vector3::new(0.4, 0.9, 0.3);

    let dist = 5.0;


    unsafe {
        gl.PolygonMode(gl::FRONT_AND_BACK, gl::LINE);

        // background color
        gl.ClearColor(0.85, 0.8, 0.7, 1.0);
    }

    let mut instant = Instant::now();

    let mut angle = 0.0;

    let mut line = true;
    loop {

        let delta = (instant.elapsed().as_millis() as f32) / 1000.0;
        instant = Instant::now();

        angle += delta;
        // update camera pos

        let x = f32::sin(angle);
        let y = f32::cos(angle);
        let z = f32::sin(2.0 * angle);

        camera.update_pos(na::Vector3::new(x * dist, y * dist, 2.0 * z));
        unsafe {
            gl.Clear(gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT);
        }

        // Set the model matrix
        shader.set_mat4(&gl, "model", model_mat);

        shader.set_mat4(&gl, "view", camera.view());

        shader.set_mat4(&gl, "projection", camera.projection());


        // set color
        shader.set_vec3(&gl, "color", color);


        cube.render(&gl);
        window.gl_swap_window();

        if angle > std::f32::consts::PI * 2.0 {
            angle = 0.0;


            unsafe {
                if line {
                    gl.PolygonMode(gl::FRONT_AND_BACK, gl::FILL);

                }
                else {
                    gl.PolygonMode(gl::FRONT_AND_BACK, gl::LINE);
                }
                line = !line;
            }
        }


    }

}


fn create_shader(gl: &gl::Gl) -> shader::Shader {
    let vert_source = r"#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;

out VS_OUTPUT {
   flat vec3 Color;
} OUT;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
    OUT.Color = aColor;
    gl_Position =  projection * view * model * vec4(aPos.x, aPos.y, aPos.z, 1.0);
}";

    let frag_source = r"#version 330 core
out vec4 FragColor;
uniform vec3 color;


in VS_OUTPUT {
    flat vec3 Color;
} IN;

void main()
{
    FragColor = vec4(IN.Color * color, 1.0f);
}";


    shader::Shader::new(gl, vert_source, frag_source).unwrap()
}