use std::error::Error; use async_trait::async_trait; use web_sys::{CanvasRenderingContext2d, HtmlCanvasElement}; use crate::rendering::Renderer; use wasm_bindgen::{JsCast, JsValue}; use crate::CLIENT; #[derive(Debug)] pub struct WebRenderer { canvas_element_id: String } #[async_trait] impl Renderer for WebRenderer { async fn get(canvas_element_id: &str) -> Result> { Ok(Self { canvas_element_id: canvas_element_id.to_string() }) } async fn render_frame(&self, _time_delta_ms: f64) -> Result<(), Box> { // TODO - core is working on this, please no touchy without telling him // TODO - until this notice is removed // time_delta_ms is the delta, in ms, from when the last render_frame was called by the browser let window = web_sys::window().ok_or("window needs to exist")?; let document = window.document().ok_or("window.document needs to exist")?; let canvas_element = document.get_element_by_id(&self.canvas_element_id).ok_or("canvas element does not exist")?; let typed_canvas_element: HtmlCanvasElement = canvas_element.dyn_into::().map_err(|_| ()).unwrap(); let context = typed_canvas_element.get_context("2d").unwrap().unwrap().dyn_into::().unwrap(); let client = CLIENT.read()?; context.set_transform(1f64, 0f64, 0f64, 1f64, 0f64, 0f64).map_err(|e: JsValue| e.as_string().unwrap())?; context.clear_rect(0f64, 0f64, typed_canvas_element.width() as f64, typed_canvas_element.height() as f64); let camera_translate_x = -client.x + (typed_canvas_element.width() / 2) as f64; let camera_translate_y = -client.y + (typed_canvas_element.height() / 2) as f64; context.translate(camera_translate_x, camera_translate_y).map_err(|e: JsValue| e.as_string().unwrap())?; Ok(()) } }