From 5de862b4d175578ed67e177d482ac31bf811d486 Mon Sep 17 00:00:00 2001 From: natrixaeria Date: Thu, 13 Jun 2019 01:34:35 +0200 Subject: Create a WebGl2 context --- webhogg/wasm/Cargo.toml | 3 +++ webhogg/wasm/src/context/graphics.rs | 18 +++++++++++++++++- webhogg/wasm/src/error.rs | 6 +++--- webhogg/wasm/src/graphics.rs | 4 ++-- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/webhogg/wasm/Cargo.toml b/webhogg/wasm/Cargo.toml index 71b6a8e..2d69f41 100644 --- a/webhogg/wasm/Cargo.toml +++ b/webhogg/wasm/Cargo.toml @@ -18,8 +18,11 @@ lto = true wasm-bindgen = "0.2" log = "0.4" fern = "0.5" +js-sys = "0.3" [dependencies.web-sys] version = "0.3" features = [ + "OffscreenCanvas", + "WebGl2RenderingContext" ] diff --git a/webhogg/wasm/src/context/graphics.rs b/webhogg/wasm/src/context/graphics.rs index 57955d0..3476e5d 100644 --- a/webhogg/wasm/src/context/graphics.rs +++ b/webhogg/wasm/src/context/graphics.rs @@ -1,10 +1,26 @@ +use log::*; use crate::error::WasmError; +use wasm_bindgen::JsCast; +use web_sys::WebGl2RenderingContext as Gl; pub struct GraphicsContext { } impl GraphicsContext { - pub fn from_canvas() -> Result { + pub fn from_canvas(canvas: web_sys::OffscreenCanvas) -> Result { + let context = canvas.get_context("webgl2") + .map_err(|_| WasmError::WebGl2ContextCreation( + format!("context cration failed: getContext returned an exception")))? + .ok_or_else(|| WasmError::WebGl2ContextCreation( + format!("context cration failed: getContext returned nothing")))?; + let context = context + .dyn_into::() + .map_err(|_| WasmError::WebGl2ContextCreation( + format!("context object is not a context")))?; + + //context.clear(Gl::COLOR_BUFFER_BIT); + //context.clear_color(0.6, 0.0, 0.6, 1.0); + Ok(Self { }) } diff --git a/webhogg/wasm/src/error.rs b/webhogg/wasm/src/error.rs index b544112..1c6ec27 100644 --- a/webhogg/wasm/src/error.rs +++ b/webhogg/wasm/src/error.rs @@ -2,7 +2,7 @@ use std::error::Error; #[derive(Debug)] pub enum WasmError { - TestError(String), + WebGl2ContextCreation(String), } impl std::fmt::Display for WasmError { @@ -14,7 +14,7 @@ impl std::fmt::Display for WasmError { impl Error for WasmError { fn description(&self) -> &str { match self { - WasmError::TestError(msg) => msg, + WasmError::WebGl2ContextCreation(msg) => msg, } } @@ -24,7 +24,7 @@ impl Error for WasmError { impl WasmError { pub fn name(&self) -> &str { match self { - WasmError::TestError(_) => "TestError", + WasmError::WebGl2ContextCreation(_) => "WebGl2ContextCreationError", } } } diff --git a/webhogg/wasm/src/graphics.rs b/webhogg/wasm/src/graphics.rs index 8169a3c..a879c5e 100644 --- a/webhogg/wasm/src/graphics.rs +++ b/webhogg/wasm/src/graphics.rs @@ -3,11 +3,11 @@ use log::*; use crate::*; #[wasm_bindgen] -pub fn start_graphics() { +pub fn start_graphics(canvas: web_sys::OffscreenCanvas) { logger::init_logger(); info!("graphics: wasm entry-point reached"); - match context::graphics::GraphicsContext::from_canvas() { + match context::graphics::GraphicsContext::from_canvas(canvas) { Ok(ctx) => context::set_graphics(ctx), Err(e) => error!("graphics {}", e) } -- cgit v1.2.3-54-g00ecf