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")]
#[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
}

View File

@ -9,7 +9,7 @@ use {
use crate::{
app::{App, Model},
mvu,
mvu::{Event, MvuApp, Size2i},
mvu::{Event, File, MvuApp, Size2i},
};
struct FrameTimer {
@ -52,23 +52,9 @@ pub struct PteropusCanvas {
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]
impl PteropusCanvas {
async fn init(&self) -> Result<(), PteropusInitError> {
async fn init(&self) {
let html_canvas = self.get_canvas();
let size = Size2i {
width: html_canvas.client_width() as u32,
@ -76,17 +62,15 @@ impl PteropusCanvas {
};
let instance = wgpu::Instance::default();
let surface_target = SurfaceTarget::Canvas(html_canvas);
let surface = instance.create_surface(surface_target).map_err(|_| {
PteropusInitError::new(
"Could not initialize canvas. This browser may not support WebGPU.",
)
})?;
let surface = instance
.create_surface(surface_target)
.expect("create graphics surface for canvas");
self.app
.lock()
.expect("get app mutex")
.init(&instance, surface, size, Box::new(FrameTimer::new()))
.await;
Ok(())
}
#[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));
std::panic::set_hook(Box::new(console_error_panic_hook::hook));
console_log::init_with_level(log::Level::Info).expect("Couldn't initialize logger");
let pteropus_canvas = PteropusCanvas { app, model };
pteropus_canvas.init().await?;
Ok(pteropus_canvas)
pteropus_canvas.init().await;
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) {
event.preventDefault();
@ -7,26 +7,13 @@ function fileDragOverHandler(event) {
async function run() {
await init();
try {
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 needs_resize = true;
let clear_scene = false;
const mainCanvas = document.getElementById("pteropus-canvas");
let mainCanvas = document.getElementById("pteropus-canvas");
mainCanvas.addEventListener("drop", async (event) => {
event.preventDefault();
test_file_data = event.dataTransfer.files[0]
@ -37,7 +24,7 @@ async function run() {
});
resizeObserver.observe(mainCanvas);
const fileUploadButton = document.getElementById("file-upload-file-input");
let fileUploadButton = document.getElementById("file-upload-file-input");
fileUploadButton.addEventListener("change", () => {
const files = fileUploadButton.files;
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", () => {
clear_scene = true;
});