summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornatrixaeria <janng@gmx.de>2019-05-26 19:25:38 +0200
committernatrixaeria <janng@gmx.de>2019-05-26 19:25:38 +0200
commit9f0f87a772743ce67e37700516cae0ead17cced9 (patch)
treee04868e23c47b48ec5923493879670dbe6d4d44e
parent77a41c3065aea3269f0c48da9cc736c404a624c0 (diff)
Create shaders
-rw-r--r--WebInterface/wasm/asm-paint/Cargo.toml2
-rw-r--r--WebInterface/wasm/asm-paint/src/app.rs7
-rw-r--r--WebInterface/wasm/asm-paint/src/canvas.rs20
-rw-r--r--WebInterface/wasm/asm-paint/src/lib.rs3
-rw-r--r--WebInterface/wasm/asm-paint/src/shader.rs62
-rw-r--r--WebInterface/wasm/asm-paint/src/site.rs3
6 files changed, 89 insertions, 8 deletions
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::<WebGl2RenderingContext>().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<WebGlProgram>,
+}
+
+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})
}
}