mod support;
mod ui;
use cubik::glium::{glutin, Surface};
use cubik::draw::{ObjDrawInfo, EnvDrawInfo, basic_render, MAX_LIGHTS, Light};
use cubik::camera::perspective_matrix;
use cubik::input::{InputListener, process_input_event, center_cursor};
use cubik::skybox::Skybox;
use cubik::animation::ObjAnimation;
use cubik::player::{Player, PlayerControlType};
use ui::{MainMenu, MainMenuAction};
use support::constants::APP_ID;
use cubik::audio::{buffer_sound, get_sound_stream, play_sound_from_file};
use cubik::map::GameMap;
use cubik::container::RenderContainer;
fn main() {
let event_loop = glutin::event_loop::EventLoop::new();
let mut ctr = RenderContainer::new(&event_loop, 1280, 720, "Example", false);
let mut map_info: ObjDrawInfo = Default::default();
map_info.generate_matrix();
let mut wolf_info = ObjDrawInfo {
position: [0.4, 0.05, 0.0f32],
rotation: [0.0, 0.0, 0.0f32],
scale: [1., 1., 1.],
color: [1., 1., 1.],
model_mat: None
};
wolf_info.generate_matrix();
let sound_stream = get_sound_stream().unwrap();
let mut player = Player::new([0.0, 1.5, 0.0], PlayerControlType::Singleplayer,
[-0.28, 0.275, 0.0], [0.44, 0.275, 0.08]);
play_sound_from_file(&sound_stream, "./audio/ding.wav", APP_ID).unwrap();
player.walking_sound = Some(buffer_sound("./audio/running.wav", APP_ID).unwrap());
let map = GameMap::load_map("models/map2", APP_ID, Some(&ctr.display), Some(&mut ctr.textures),
true).unwrap();
let wolf_anim = ObjAnimation::load_wavefront("models/wolfrunning", APP_ID, &ctr.display, &mut ctr.textures, 0.041).unwrap();
let skybox = Skybox::new(&ctr.display, "skybox1", APP_ID, 512, 50.).unwrap();
let mut lights_arr: [Light; MAX_LIGHTS] = Default::default();
let mut lights_iter = map.lights.values();
for i in 0..map.lights.len() { lights_arr[i] = *lights_iter.next().unwrap(); }
let mut displace = 0.0f32;
let mut main_menu = MainMenu::new(&ctr.display).unwrap();
main_menu.enabled = false;
let start_time = std::time::Instant::now();
let mut last_frame_time = std::time::Instant::now();
event_loop.run(move |ev, _, control_flow| {
let listeners: Vec<&mut dyn InputListener> = vec![&mut main_menu, &mut player];
*control_flow = glutin::event_loop::ControlFlow::Poll;
match ev {
glutin::event::Event::WindowEvent { event, .. } => match event {
glutin::event::WindowEvent::CloseRequested => {
*control_flow = glutin::event_loop::ControlFlow::Exit;
return;
},
glutin::event::WindowEvent::KeyboardInput { input, .. } => {
if let Some(glutin::event::VirtualKeyCode::Escape) = input.virtual_keycode {
*control_flow = glutin::event_loop::ControlFlow::Exit;
return;
}
process_input_event(event, listeners, &ctr.display);
return;
},
_ => {
process_input_event(event, listeners, &ctr.display);
return;
}
},
glutin::event::Event::NewEvents(cause) => match cause {
glutin::event::StartCause::ResumeTimeReached { .. } => (),
glutin::event::StartCause::Init => {
center_cursor(&ctr.display, false);
},
glutin::event::StartCause::Poll => (),
_ => return
},
_ => return
}
let new_frame_time = std::time::Instant::now();
let time_delta = new_frame_time.duration_since(last_frame_time).as_secs_f32();
last_frame_time = new_frame_time;
displace += time_delta;
player.update(time_delta, Some(map.quadoctree.as_ref().unwrap()), Some(&sound_stream), None);
let mut target = ctr.display.draw();
let perspective_mat = perspective_matrix(&mut target);
let env_info = EnvDrawInfo {
perspective_mat: perspective_mat,
view_mat: player.camera.view_matrix(),
lights: lights_arr,
light_count: map.lights.len(),
params: &ctr.params,
textures: &ctr.textures
};
if main_menu.enabled {
target.clear_color_and_depth((0., 0., 0., 1.0), 1.0);
if let Some(result) = main_menu.draw(&mut target, &ctr.display, &ctr.ui_program).unwrap() {
match result {
MainMenuAction::Quit => {
target.finish().unwrap();
*control_flow = glutin::event_loop::ControlFlow::Exit;
return;
},
MainMenuAction::Start => main_menu.enabled = false
};
}
} else {
target.clear_color_and_depth((0.85, 0.85, 0.85, 1.0), 1.0);
for (key, o) in &map.objects {
let text_displace = if key.starts_with("water") {
Some([displace.sin() * 0.005, displace.sin() * 0.005])
} else { None };
basic_render(&mut target, &env_info, &map_info, &o, &ctr.main_program, text_displace);
}
for o in wolf_anim.get_keyframe(start_time.elapsed().as_secs_f32()).values() {
basic_render(&mut target, &env_info, &wolf_info, &o, &ctr.main_program, None);
}
skybox.draw(&mut target, &env_info, &ctr.skybox_program);
}
target.finish().unwrap();
});
}