diff options
author | TrueDoctor <dennis@kobert.dev> | 2019-06-22 00:03:37 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-22 00:03:37 +0200 |
commit | 8b2040eb93e8e4355c8f357b775dedcffafff3dc (patch) | |
tree | 0b2c4724f0c75d09ee8b86f397bf6602a899e825 /webhogg/wasm/src/context/shader.rs | |
parent | 9e9c1c822a64c0a65033b7eed07ea661a385cecc (diff) | |
parent | 5522731ec4de8741f923b339ca942f8aaff2a338 (diff) |
Merge pull request #39 from TrueDoctor/game_server_refactor
Game server refactor
Diffstat (limited to 'webhogg/wasm/src/context/shader.rs')
-rw-r--r-- | webhogg/wasm/src/context/shader.rs | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/webhogg/wasm/src/context/shader.rs b/webhogg/wasm/src/context/shader.rs new file mode 100644 index 0000000..9ccb9fc --- /dev/null +++ b/webhogg/wasm/src/context/shader.rs @@ -0,0 +1,34 @@ +use crate::error::WasmError; +use super::webgl; +use super::webgl::{WebGl2, ShaderType}; + +pub const MAIN_VERTEX_SHADER: &str = include_str!("main.vs"); +pub const MAIN_FRAGMENT_SHADER: &str = include_str!("main.fs"); + +pub struct ShaderProgram { + program: webgl::WebGlProgram, +} + +impl ShaderProgram { + pub fn from_sources(gl: &WebGl2, sources: &[(ShaderType, String)]) -> Result<Self, WasmError> { + let program = gl.create_program() + .map_err(|_| WasmError::Shader(format!("glCreateProgram failed ({})", gl.get_error())))?; + for (shader_type, source) in sources { + let shader = gl.create_shader(shader_type) + .map_err(|_| WasmError::Shader(format!("glCreateShader failed ({})", gl.get_error())))?; + gl.shader_source(&shader, source); + gl.compile_shader(&shader) + .map_err(|e| WasmError::Shader(format!("compile error in {} shader: {}", shader_type, e)))?; + gl.attach_shader(&program, &shader) + } + gl.link_program(&program) + .map_err(|e| WasmError::Shader(format!("linker error in program: {}", e)))?; + Ok(Self { + program + }) + } + + pub fn run(&self, gl: &WebGl2) { + gl.use_program(&self.program) + } +} |