diff options
Diffstat (limited to 'webhogg/wasm/src/context/graphics.rs')
-rw-r--r-- | webhogg/wasm/src/context/graphics.rs | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/webhogg/wasm/src/context/graphics.rs b/webhogg/wasm/src/context/graphics.rs index fa37e39..6af35a2 100644 --- a/webhogg/wasm/src/context/graphics.rs +++ b/webhogg/wasm/src/context/graphics.rs @@ -1,13 +1,18 @@ -use log::*; use crate::error::WasmError; use wasm_bindgen::JsCast; use web_sys::WebGl2RenderingContext as GlContext; -use super::webgl::{Color4, WebGl2}; +use super::webgl; +use super::webgl::{Color4, ShaderType, WebGl2}; +use super::shader::{MAIN_VERTEX_SHADER, MAIN_FRAGMENT_SHADER}; +use super::shader::ShaderProgram; pub struct GraphicsContext { gl: WebGl2, frame_nr: u64, + shader: ShaderProgram, + vao: webgl::WebGlVertexArrayObject, + buffer: webgl::WebGlBuffer, } impl GraphicsContext { @@ -23,9 +28,33 @@ impl GraphicsContext { format!("context object is not a context")))?; let gl = WebGl2::from_context(context); + let shader = ShaderProgram::from_sources(&gl, &[ + (ShaderType::Vertex, MAIN_VERTEX_SHADER.to_string()), + (ShaderType::Fragment, MAIN_FRAGMENT_SHADER.to_string()), + ])?; + + let vao = gl.create_vertex_array() + .map_err(|_| WasmError::WebGlBuffer( + format!("glGenVertexArrays failed")))?; + gl.bind_vertex_array(&vao); + + let buffer = gl.create_buffer() + .map_err(|_| WasmError::WebGlBuffer( + format!("glCreateBuffer failed")))?; + gl.bind_array_buffer(&buffer); + gl.array_buffer_data_f32(&[ + 0.0, 0.0, + 1.0, 0.0, + 0.0, 1.0, + 1.0, 1.0, + 0.0, 1.0, + 1.0, 0.0, + ]); + gl.enable_vertex_attrib_array(0); Ok(Self { gl, frame_nr: 0, + shader, vao, buffer }) } @@ -38,7 +67,12 @@ impl GraphicsContext { let b = f32::abs(f32::cos(a)); let (a, b) = (a * light, b * light); - self.gl.clear(Color4::new(a, light - a, b, 1.0)); + self.gl.set_viewport(); + self.gl.clear(&Color4::new(a, light - a, b, 1.0)); + + self.shader.run(&self.gl); + self.gl.vertex_attrib_f32_pointer(0, 2); + self.gl.draw_triangle_arrays(6); self.frame_nr += 1; |