Compare commits

..

No commits in common. "04aec9231b25724364792eb7339f5ddcdee89ca9" and "072b54cafece52e9e565d938ec2d1863bc3fceca" have entirely different histories.

4 changed files with 15 additions and 75 deletions

View File

@ -1,31 +0,0 @@
use log::info;
pub struct StatisticsReporter {
total_time_seconds: f64,
frame_count: u32,
}
impl StatisticsReporter {
pub fn new() -> Self {
let total_time_seconds = 0.0;
let frame_count = 0;
Self {
total_time_seconds,
frame_count,
}
}
pub fn log_frame_time_seconds(&mut self, t: f64) {
self.total_time_seconds += t;
self.frame_count += 1;
if self.total_time_seconds >= 1.0 {
info!(
"Average frame time: {:.0} ms ({:.1} fps)",
self.total_time_seconds * 1000.0 / (self.frame_count as f64),
(self.frame_count as f64) / self.total_time_seconds
);
self.total_time_seconds = 0.0;
self.frame_count = 0;
}
}
}

View File

@ -23,6 +23,6 @@ pub fn main() {
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
#[wasm_bindgen] #[wasm_bindgen]
pub async fn init_pteropus() -> Result<wasm::PteropusCanvas, wasm::PteropusInitError> { pub async fn init_pteropus() -> wasm::PteropusCanvas {
run(App::new(), Rc::new(Model::new())).await run(App::new(), Rc::new(Model::new())).await
} }

View File

@ -9,7 +9,7 @@ use {
use crate::{ use crate::{
app::{App, Model}, app::{App, Model},
mvu, mvu,
mvu::{Event, MvuApp, Size2i}, mvu::{Event, File, MvuApp, Size2i},
}; };
struct FrameTimer { struct FrameTimer {
@ -52,23 +52,9 @@ pub struct PteropusCanvas {
model: Rc<Model>, model: Rc<Model>,
} }
#[wasm_bindgen(getter_with_clone)]
#[derive(Clone)]
pub struct PteropusInitError {
pub message: String,
}
impl PteropusInitError {
fn new<M: Into<String>>(message: M) -> Self {
Self {
message: message.into(),
}
}
}
#[wasm_bindgen] #[wasm_bindgen]
impl PteropusCanvas { impl PteropusCanvas {
async fn init(&self) -> Result<(), PteropusInitError> { async fn init(&self) {
let html_canvas = self.get_canvas(); let html_canvas = self.get_canvas();
let size = Size2i { let size = Size2i {
width: html_canvas.client_width() as u32, width: html_canvas.client_width() as u32,
@ -76,17 +62,15 @@ impl PteropusCanvas {
}; };
let instance = wgpu::Instance::default(); let instance = wgpu::Instance::default();
let surface_target = SurfaceTarget::Canvas(html_canvas); let surface_target = SurfaceTarget::Canvas(html_canvas);
let surface = instance.create_surface(surface_target).map_err(|_| { let surface = instance
PteropusInitError::new( .create_surface(surface_target)
"Could not initialize canvas. This browser may not support WebGPU.", .expect("create graphics surface for canvas");
)
})?;
self.app self.app
.lock() .lock()
.expect("get app mutex") .expect("get app mutex")
.init(&instance, surface, size, Box::new(FrameTimer::new())) .init(&instance, surface, size, Box::new(FrameTimer::new()))
.await; .await;
Ok(())
} }
#[wasm_bindgen] #[wasm_bindgen]
@ -150,11 +134,11 @@ impl PteropusCanvas {
} }
} }
pub async fn run(app: App, model: Rc<Model>) -> Result<PteropusCanvas, PteropusInitError> { pub async fn run(app: App, model: Rc<Model>) -> PteropusCanvas {
let app = Rc::new(Mutex::new(app)); let app = Rc::new(Mutex::new(app));
std::panic::set_hook(Box::new(console_error_panic_hook::hook)); std::panic::set_hook(Box::new(console_error_panic_hook::hook));
console_log::init_with_level(log::Level::Info).expect("Couldn't initialize logger"); console_log::init_with_level(log::Level::Info).expect("Couldn't initialize logger");
let pteropus_canvas = PteropusCanvas { app, model }; let pteropus_canvas = PteropusCanvas { app, model };
pteropus_canvas.init().await?; pteropus_canvas.init().await;
Ok(pteropus_canvas) pteropus_canvas
} }

View File

@ -1,4 +1,4 @@
import init, {init_pteropus, PteropusInitError} from '../pkg/pteropus.js'; import init, {init_pteropus} from '../pkg/pteropus.js';
function fileDragOverHandler(event) { function fileDragOverHandler(event) {
event.preventDefault(); event.preventDefault();
@ -7,26 +7,13 @@ function fileDragOverHandler(event) {
async function run() { async function run() {
await init(); await init();
try {
let pteropus = await init_pteropus(); let pteropus = await init_pteropus();
} catch(e) {
const errorParagraph = document.createElement("p");
if(e instanceof PteropusInitError) {
const errorMessage = document.createTextNode(e.message);
errorParagraph.appendChild(errorMessage);
} else {
const errorMessage = document.createTextNode("Something unexpected happened.");
errorParagraph.appendChild(errorMessage);
}
document.getElementById("whole-window").replaceWith(errorParagraph);
return;
}
let test_file_data = null; let test_file_data = null;
let needs_resize = true; let needs_resize = true;
let clear_scene = false; let clear_scene = false;
const mainCanvas = document.getElementById("pteropus-canvas"); let mainCanvas = document.getElementById("pteropus-canvas");
mainCanvas.addEventListener("drop", async (event) => { mainCanvas.addEventListener("drop", async (event) => {
event.preventDefault(); event.preventDefault();
test_file_data = event.dataTransfer.files[0] test_file_data = event.dataTransfer.files[0]
@ -37,7 +24,7 @@ async function run() {
}); });
resizeObserver.observe(mainCanvas); resizeObserver.observe(mainCanvas);
const fileUploadButton = document.getElementById("file-upload-file-input"); let fileUploadButton = document.getElementById("file-upload-file-input");
fileUploadButton.addEventListener("change", () => { fileUploadButton.addEventListener("change", () => {
const files = fileUploadButton.files; const files = fileUploadButton.files;
if(files.length > 0) { if(files.length > 0) {
@ -45,7 +32,7 @@ async function run() {
} }
}); });
const clearSceneButton = document.getElementById("clear-scene-button"); let clearSceneButton = document.getElementById("clear-scene-button");
clearSceneButton.addEventListener("click", () => { clearSceneButton.addEventListener("click", () => {
clear_scene = true; clear_scene = true;
}); });