ruffle/desktop/src/main.rs

96 lines
2.7 KiB
Rust
Raw Normal View History

2019-04-30 08:53:21 +00:00
use fluster_core::{
backend::audio::null::NullAudioBackend, backend::render::glium::GliumRenderBackend, 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
}
2019-04-28 06:08:59 +00:00
// impl UiBackend for GlutinBackend {
// fn poll_events(&mut self) -> bool {
// let mut request_close = false;
// self.events_loop.poll_events(|event| match event {
// Event::WindowEvent {
// event: WindowEvent::CloseRequested,
// ..
// } => request_close = true,
// _ => (),
// });
// !request_close
// }
// }