extern crate piston;
extern crate sdl2_window;
extern crate turbine_scene3d;
extern crate vecmath;
extern crate camera_controllers;
use piston::window::*;
use piston::event_loop::*;
use piston::input::{RenderEvent, UpdateEvent};
use turbine_scene3d::*;
use turbine_scene3d::Command::*;
use vecmath::*;
use camera_controllers::*;
fn main() {
let (mut window, mut scene, vertex_shader, fragment_shader) = {
use sdl2_window::Sdl2Window;
let settings = WindowSettings::new("colored cube", [512; 2])
.samples(4)
.exit_on_esc(true);
let mut window: Sdl2Window = settings.build().unwrap();
window.set_capture_cursor(true);
let mut scene = Scene::new(SceneSettings::new());
let vertex_shader = scene.vertex_shader(include_str!("../assets/basic_shading.glslv"))
.unwrap();
let fragment_shader = scene.fragment_shader(include_str!("../assets/basic_shading.glslf"))
.unwrap();
(window, scene, vertex_shader, fragment_shader)
};
let mut events = Events::new(EventSettings::new());
let mut frame_graph = FrameGraph::new();
let mut first_person = FirstPerson::new(
[0.5, 0.5, 4.0],
FirstPersonSettings::keyboard_wasd()
);
let (monkey, light_position_id, ambient_light_id, program) = {
let obj_mesh = ObjMesh::load("assets/monkey.obj").unwrap();
let vertex_array = scene.vertex_array();
let vertex_buffer = scene.vertex_buffer3(vertex_array, 0, &obj_mesh.vertices);
let _ = scene.uv_buffer(vertex_array, 1, &obj_mesh.uvs);
let _ = scene.normal_buffer(vertex_array, 2, &obj_mesh.normals);
let texture = scene.load_texture("assets/monkey.png").unwrap();
let program = scene.program_from_vertex_fragment(vertex_shader, fragment_shader);
let matrix_id = scene.matrix4_uniform(program, "MVP").unwrap();
let model_matrix_id = scene.matrix4_uniform(program, "M").unwrap();
let view_matrix_id = scene.matrix4_uniform(program, "V").unwrap();
let light_position_id = scene.vector3_uniform(program, "LightPosition_worldspace").unwrap();
let ambient_light_id = scene.f32_uniform(program, "ambientLight").unwrap();
(frame_graph.command_list(vec![
SetModelViewProjection(matrix_id),
SetView(view_matrix_id),
SetModel(model_matrix_id),
SetTexture(texture),
DrawTriangles(vertex_array, vertex_buffer.len()),
]), light_position_id, ambient_light_id, program)
};
let monkeys = frame_graph.command_list(vec![
Translate([0.0, -1.0, 0.0]),
Draw(monkey),
PushTransform,
Translate([1.0, 2.0, 0.0]),
RotateYDeg(20.0),
Draw(monkey),
PopTransform,
Translate([0.0, 4.0, 0.0]),
RotateYDeg(-20.0),
Draw(monkey),
]);
let mut time: f32 = 0.0;
while let Some(e) = events.next(&mut window) {
first_person.event(&e);
if let Some(args) = e.render_args() {
let proj = get_projection(&window);
scene.projection(proj);
scene.camera(first_person.camera(args.ext_dt).orthogonal());
scene.model(mat4_id());
scene.clear([0.0, 0.0, 0.0, 1.0]);
scene.use_program(program);
scene.set_vector3(light_position_id, [time.cos() * 4.0, 5.0, time.sin() * 4.0]);
scene.set_f32(ambient_light_id, 0.1);
scene.draw(monkeys, &frame_graph);
}
if let Some(args) = e.update_args() {
time += args.dt as f32;
}
}
}
fn get_projection<W: Window>(w: &W) -> Matrix4<f32> {
let draw_size = w.draw_size();
CameraPerspective {
fov: 90.0, near_clip: 0.1, far_clip: 1000.0,
aspect_ratio: (draw_size.width as f32) / (draw_size.height as f32)
}.projection()
}