pub mod core;
use gl;
use sdl2::surface::Surface;
use sdl2::keyboard::Keycode;
use std::collections::HashSet;
use crate::core::mouse;
use crate::core::project::Performance;
pub fn init(config: crate::core::project::Config, runtime: &mut impl crate::core::project::Runtime) {
let sdl = sdl2::init().unwrap();
let video_subsystem = sdl.video().unwrap();
let gl_attr = video_subsystem.gl_attr();
gl_attr.set_context_profile(sdl2::video::GLProfile::Core);
gl_attr.set_context_version(3, 3);
gl_attr.set_double_buffer(true);
let mut window = video_subsystem
.window(&config.title, config.width, config.height)
.opengl()
.resizable()
.build()
.unwrap();
let _gl_context = window.gl_create_context().unwrap();
if let Ok(window_icon) = Surface::load_bmp("icon.bmp") {
window.set_icon(window_icon);
}
let _gl = gl::load_with(
|ptr| video_subsystem.gl_get_proc_address(ptr) as *const _
);
video_subsystem.gl_set_swap_interval(1).unwrap();
set_viewport(config.width as i32, config.height as i32);
let mut event_pump = sdl.event_pump().unwrap();
unsafe {
let color = config.background_color;
gl::ClearColor(color.r, color.g, color.b, 1.0);
gl::Enable(gl::BLEND);
gl::BlendFunc(gl::SRC_ALPHA, gl::ONE_MINUS_SRC_ALPHA);
}
let mut win = core::window::Window::new(config.width as f32, config.height as f32);
let mut performance = Performance::new();
runtime.load();
'main: loop {
let mut mws = crate::core::mouse::MouseWheelState::None;
for event in event_pump.poll_iter() {
match event {
sdl2::event::Event::Quit{..} => break 'main,
_ => {}
}
if let sdl2::event::Event::Window { win_event, .. } = event {
if let sdl2::event::WindowEvent::Resized(width, height) = win_event {
win = core::window::Window::new(width as f32, height as f32);
set_viewport(width, height);
}
}
if let sdl2::event::Event::MouseWheel {y, ..} = event {
mws = if y < 0 {
crate::core::mouse::MouseWheelState::Down
} else {
crate::core::mouse::MouseWheelState::Up
};
}
}
let mouse_state = event_pump.mouse_state();
let mouse = mouse::Mouse::new(
mouse_state.x() as f32,
mouse_state.y() as f32,
mouse_state.left(),
mouse_state.right(),
mws
);
let hashset_keys: HashSet<Keycode> = event_pump
.keyboard_state()
.pressed_scancodes()
.filter_map(Keycode::from_scancode)
.collect();
let mut keys = vec![];
for key in hashset_keys {
keys.push(key.to_string());
}
let draw = crate::core::project::Draw {
performance: performance.clone(),
window: win,
mouse: mouse,
keys: keys,
};
unsafe {
gl::Clear(gl::COLOR_BUFFER_BIT);
}
runtime.update(&draw);
window.gl_swap_window();
performance.frame();
}
}
fn set_viewport(width: i32, height: i32) {
unsafe {
gl::Viewport(0, 0, width, height);
}
}