From 9f0f87a772743ce67e37700516cae0ead17cced9 Mon Sep 17 00:00:00 2001 From: natrixaeria Date: Sun, 26 May 2019 19:25:38 +0200 Subject: Create shaders --- WebInterface/wasm/asm-paint/Cargo.toml | 2 + WebInterface/wasm/asm-paint/src/app.rs | 7 ++-- WebInterface/wasm/asm-paint/src/canvas.rs | 20 ++++++++-- WebInterface/wasm/asm-paint/src/lib.rs | 3 +- WebInterface/wasm/asm-paint/src/shader.rs | 62 +++++++++++++++++++++++++++++++ WebInterface/wasm/asm-paint/src/site.rs | 3 +- 6 files changed, 89 insertions(+), 8 deletions(-) create mode 100644 WebInterface/wasm/asm-paint/src/shader.rs diff --git a/WebInterface/wasm/asm-paint/Cargo.toml b/WebInterface/wasm/asm-paint/Cargo.toml index 748bb8e..269d77d 100644 --- a/WebInterface/wasm/asm-paint/Cargo.toml +++ b/WebInterface/wasm/asm-paint/Cargo.toml @@ -23,5 +23,7 @@ features = [ 'Element', 'HtmlCanvasElement', 'WebGl2RenderingContext', + 'WebGlProgram', + 'WebGlShader', 'Window' ] diff --git a/WebInterface/wasm/asm-paint/src/app.rs b/WebInterface/wasm/asm-paint/src/app.rs index 003a2a1..005764d 100644 --- a/WebInterface/wasm/asm-paint/src/app.rs +++ b/WebInterface/wasm/asm-paint/src/app.rs @@ -11,8 +11,9 @@ impl App { }) } - pub fn run(&self) { - let canvas = self.site.create_canvas().unwrap(); - canvas.render(); + pub fn run(&mut self) { + let mut canvas = self.site.create_canvas().unwrap(); + canvas.init().unwrap(); + info!("canvas initialisation was succuessfull"); } } diff --git a/WebInterface/wasm/asm-paint/src/canvas.rs b/WebInterface/wasm/asm-paint/src/canvas.rs index 1956be0..ddf6d51 100644 --- a/WebInterface/wasm/asm-paint/src/canvas.rs +++ b/WebInterface/wasm/asm-paint/src/canvas.rs @@ -1,10 +1,12 @@ use web_sys; use web_sys::{WebGl2RenderingContext}; use wasm_bindgen::JsCast; +use crate::shader::Shaders; pub struct Canvas { element: web_sys::HtmlCanvasElement, ctx: WebGl2RenderingContext, + shaders: Shaders, } impl Canvas { @@ -17,11 +19,23 @@ impl Canvas { .dyn_into::().ok()?; info!("created webgl2 context successfully"); Some(Self { - element, ctx + element, ctx, + shaders: Shaders::new(), }) } - pub fn render(&self) { - info!("do a barrel roll"); + pub fn init(&mut self) -> Result<(), ()> { + debug!("create program"); + self.shaders.create_program(&self.ctx) + .map_err(|e| error!("webgl2 create program: {}", e))?; + debug!("create vertex shader"); + self.shaders.create_vertex_shader(&self.ctx) + .map_err(|e| error!("webgl2 create vertex shader: {}", e))?; + debug!("create fragment shader"); + self.shaders.create_fragment_shader(&self.ctx) + .map_err(|e| error!("webgl2 create fragment shader: {}", e))?; + debug!("compile shader program"); + self.shaders.compile(&self.ctx) + .map_err(|e| error!("webgl2 shader: {}", e)) } } diff --git a/WebInterface/wasm/asm-paint/src/lib.rs b/WebInterface/wasm/asm-paint/src/lib.rs index 432c370..945f2b1 100644 --- a/WebInterface/wasm/asm-paint/src/lib.rs +++ b/WebInterface/wasm/asm-paint/src/lib.rs @@ -1,4 +1,5 @@ mod client_logger; +mod shader; mod canvas; mod site; mod app; @@ -14,7 +15,7 @@ pub fn entry() { info!("begin running wasm application"); - let app = app::App::new().unwrap(); + let mut app = app::App::new().unwrap(); app.run(); } diff --git a/WebInterface/wasm/asm-paint/src/shader.rs b/WebInterface/wasm/asm-paint/src/shader.rs new file mode 100644 index 0000000..ac7c767 --- /dev/null +++ b/WebInterface/wasm/asm-paint/src/shader.rs @@ -0,0 +1,62 @@ +use web_sys::{WebGlProgram, WebGl2RenderingContext}; + +const VERTEX_SHADER: &str = r#"#version 300 es +in vec4 pos; +void main() { + gl_Position = pos; +} +"#; + +const FRAGMENT_SHADER: &str = r#"#version 300 es +precision mediump float; +out vec4 color; + +void main() { + color = vec4(1, 0, 0, 1); +} +"#; + +pub struct Shaders { + program: Option, +} + +impl Shaders { + pub fn new() -> Self { + Self { + program: None, + } + } + + pub fn create_program(&mut self, ctx: &WebGl2RenderingContext) -> Result<(), String> { + self.program = Some(ctx.create_program().ok_or("could not create program id")?); + Ok(()) + } + + fn create_shader(&mut self, ctx: &WebGl2RenderingContext, + shader_type: u32, source: &str) -> Result<(), String> { + let program = self.program.as_ref().ok_or("could not find created program")?; + let shader = ctx.create_shader(shader_type) + .ok_or("could not create shader")?; + ctx.shader_source(&shader, source); + ctx.compile_shader(&shader); + let status = ctx.get_shader_parameter(&shader, WebGl2RenderingContext::COMPILE_STATUS); + if status == wasm_bindgen::JsValue::TRUE { + ctx.attach_shader(program, &shader); + Ok(()) + } else { + Err(format!("\n{}", ctx.get_shader_info_log(&shader).unwrap_or_default())) + } + } + + pub fn create_vertex_shader(&mut self, ctx: &WebGl2RenderingContext) -> Result<(), String> { + self.create_shader(ctx, WebGl2RenderingContext::VERTEX_SHADER, VERTEX_SHADER) + } + + pub fn create_fragment_shader(&mut self, ctx: &WebGl2RenderingContext) -> Result<(), String> { + self.create_shader(ctx, WebGl2RenderingContext::FRAGMENT_SHADER, FRAGMENT_SHADER) + } + + pub fn compile(&mut self, ctx: &WebGl2RenderingContext) -> Result<(), String> { + Ok(()) + } +} diff --git a/WebInterface/wasm/asm-paint/src/site.rs b/WebInterface/wasm/asm-paint/src/site.rs index 47afd19..4ae0237 100644 --- a/WebInterface/wasm/asm-paint/src/site.rs +++ b/WebInterface/wasm/asm-paint/src/site.rs @@ -22,6 +22,7 @@ impl Site { let element = self.document.get_element_by_id("canvas") .or_else(|| {error!("could not gain canvas element"); None})?; Canvas::new(element) - .or_else(|| {error!("could not create a webgl2 canvas"); None}) + .or_else(|| {error!("could not create a webgl2 canvas. + Your browser doesn't seem to support webgl2"); None}) } } -- cgit v1.2.3-54-g00ecf