2019-05-03 02:11:47 +00:00
|
|
|
mod render;
|
|
|
|
|
|
|
|
use crate::render::GliumRenderBackend;
|
|
|
|
use fluster_core::{backend::audio::NullAudioBackend, Player};
|
2019-05-01 00:46:32 +00:00
|
|
|
use glutin::{dpi::LogicalSize, ContextBuilder, Event, EventsLoop, WindowBuilder, WindowEvent};
|
2019-04-28 06:08:59 +00:00
|
|
|
use std::path::PathBuf;
|
|
|
|
use std::time::{Duration, Instant};
|
|
|
|
use structopt::StructOpt;
|
|
|
|
|
|
|
|
#[derive(StructOpt, Debug)]
|
|
|
|
#[structopt(name = "basic")]
|
|
|
|
struct Opt {
|
|
|
|
#[structopt(name = "FILE", parse(from_os_str))]
|
|
|
|
input_path: PathBuf,
|
|
|
|
}
|
2019-04-25 17:52:22 +00:00
|
|
|
|
2019-04-27 01:55:06 +00:00
|
|
|
fn main() {
|
2019-05-02 00:46:49 +00:00
|
|
|
env_logger::init();
|
|
|
|
|
2019-04-28 06:08:59 +00:00
|
|
|
let opt = Opt::from_args();
|
|
|
|
|
|
|
|
let ret = run_player(opt.input_path);
|
|
|
|
|
|
|
|
if let Err(e) = ret {
|
|
|
|
eprintln!("Fatal error:\n{}", e);
|
|
|
|
std::process::exit(-1);
|
2019-04-25 17:52:22 +00:00
|
|
|
}
|
2019-04-28 06:08:59 +00:00
|
|
|
}
|
2019-04-25 17:52:22 +00:00
|
|
|
|
2019-04-28 06:08:59 +00:00
|
|
|
fn run_player(input_path: PathBuf) -> Result<(), Box<std::error::Error>> {
|
|
|
|
let swf_data = std::fs::read(input_path)?;
|
|
|
|
|
|
|
|
let mut events_loop = EventsLoop::new();
|
2019-05-01 00:46:32 +00:00
|
|
|
let window_builder = WindowBuilder::new().with_title("Fluster");
|
2019-05-01 06:05:16 +00:00
|
|
|
let windowed_context = ContextBuilder::new()
|
|
|
|
.with_vsync(true)
|
|
|
|
.with_multisampling(4)
|
|
|
|
.with_srgb(true)
|
|
|
|
.build_windowed(window_builder, &events_loop)?;
|
2019-04-30 08:53:21 +00:00
|
|
|
let audio = NullAudioBackend::new();
|
2019-04-28 06:08:59 +00:00
|
|
|
let renderer = GliumRenderBackend::new(windowed_context)?;
|
2019-05-01 00:46:32 +00:00
|
|
|
let display = renderer.display().clone();
|
2019-04-30 08:53:21 +00:00
|
|
|
let mut player = Player::new(Box::new(renderer), Box::new(audio), swf_data)?;
|
2019-04-26 03:27:44 +00:00
|
|
|
|
2019-05-01 00:46:32 +00:00
|
|
|
let logical_size: LogicalSize = (player.movie_width(), player.movie_height()).into();
|
|
|
|
let hidpi_factor = display.gl_window().get_hidpi_factor();
|
|
|
|
|
|
|
|
display
|
|
|
|
.gl_window()
|
|
|
|
.resize(logical_size.to_physical(hidpi_factor));
|
|
|
|
|
|
|
|
dbg!((player.movie_width(), player.movie_height()));
|
|
|
|
|
|
|
|
display.gl_window().set_inner_size(logical_size);
|
|
|
|
|
2019-04-28 06:08:59 +00:00
|
|
|
let mut time = Instant::now();
|
|
|
|
loop {
|
|
|
|
// Poll UI events
|
|
|
|
let mut request_close = false;
|
|
|
|
events_loop.poll_events(|event| match event {
|
|
|
|
Event::WindowEvent {
|
|
|
|
event: WindowEvent::CloseRequested,
|
|
|
|
..
|
|
|
|
} => request_close = true,
|
|
|
|
_ => (),
|
|
|
|
});
|
|
|
|
|
|
|
|
if request_close {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
let new_time = Instant::now();
|
|
|
|
let dt = new_time.duration_since(time).as_millis();
|
|
|
|
time = new_time;
|
|
|
|
|
|
|
|
player.tick(dt as f64);
|
|
|
|
|
|
|
|
std::thread::sleep(Duration::from_millis(1000 / 60));
|
|
|
|
}
|
|
|
|
Ok(())
|
2019-04-25 17:52:22 +00:00
|
|
|
}
|