gdritter repos outlander / master src / game / mainloop.rs
master

Tree @master (Download .tar.gz)

mainloop.rs @master

3a60013
 
 
 
0bab597
 
 
497535d
63e8bb0
3a60013
497535d
63e8bb0
 
 
 
 
 
 
 
 
 
3a60013
497535d
 
 
63e8bb0
497535d
63e8bb0
497535d
 
 
 
 
 
 
 
 
3a60013
497535d
3a60013
497535d
 
 
3a60013
63e8bb0
0bab597
 
63e8bb0
0bab597
3a60013
497535d
 
 
3a60013
 
497535d
 
 
63e8bb0
497535d
 
 
 
 
3a60013
 
0bab597
 
63e8bb0
 
 
a1f4c9e
63e8bb0
a1f4c9e
63e8bb0
 
0bab597
 
 
 
 
 
 
a1f4c9e
 
63e8bb0
a1f4c9e
 
497535d
a1f4c9e
497535d
 
 
 
 
 
0bab597
 
497535d
 
 
63e8bb0
497535d
 
3a60013
 
mod gl {
    pub use gl::types::*;
    pub use gl::*;
}
use std::ptr;

use errors::Error;
use graphics;
use data::obj::OBJFile;

// Vertex data
// static VERTEX_DATA: [gl::GLfloat; 6] = [0.0, 0.5, 0.5, -0.5, -0.5, -0.5];
static TRI_OBJ: &'static str = "
v  0.0  0.5  0.0
v  0.5 -0.5  0.0
v -0.5 -0.5  0.0
v  0.0  0.5  0.0
v  0.5 -0.5  0.0
v -0.5 -0.5  0.0
f 1 2 3
";

// Shader sources
static VS_SRC: &'static str = "
#version 150
in vec3 position;
void main() {
    gl_Position = vec4(position, 1.0);
}";

static FS_SRC: &'static str = "
#version 150
out vec4 out_color;
void main() {
    out_color = vec4(1.0, 1.0, 1.0, 1.0);
}";

pub fn main_loop() -> Result<(), Error> {
    let window = graphics::Window::create()?;

    let vs = graphics::Shader::compile(graphics::ShaderType::Vertex, VS_SRC)?;
    let fs = graphics::Shader::compile(graphics::ShaderType::Fragment, FS_SRC)?;
    let program = graphics::Program::link(vec![vs, fs])?;

    let vertex_data = OBJFile::parse(TRI_OBJ).unwrap().to_bare_object().unwrap();
    let vbo = graphics::VertexBuffer::new_array_buffer(
        graphics::VertexArray::new(),
        &vertex_data,
    );

    program.use_program();
    program.bind_frag_data_location(0, "out_color")?;
    let pos_attr = program.get_attrib_location("position")?;

    unsafe {
        gl::EnableVertexAttribArray(pos_attr as gl::GLuint);
        gl::VertexAttribPointer(
            pos_attr as gl::GLuint,
            3,
            gl::FLOAT,
            gl::FALSE as gl::GLboolean,
            0,
            ptr::null(),
        );
    }

    vbo.unbind();

    window.run(move |event| {
        use glutin::event_loop::ControlFlow;
        use glutin::event::{Event, WindowEvent, VirtualKeyCode};

        println!("{:?}", event);
        match event {
            Event::WindowEvent { event: WindowEvent::CloseRequested, .. } =>
                return ControlFlow::Exit,
            Event::WindowEvent {
                event: WindowEvent::KeyboardInput {
                    input: k,
                    ..
                },
                ..
            } => {
                match k.virtual_keycode {
                    Some(VirtualKeyCode::Q) =>
                        return ControlFlow::Exit,
                    _ => println!("{:#?}", k),
                }
            }
            _ => (),
        }

        unsafe {
            gl::ClearColor(0.3, 0.3, 0.3, 1.0);
            gl::Clear(gl::COLOR_BUFFER_BIT);

            vbo.bind();

            gl::DrawArrays(gl::TRIANGLES, 0, 3);
        }

        ControlFlow::Wait
    })?;

    Ok(())
}