summaryrefslogtreecommitdiff
path: root/webhogg/wasm/src/context/graphics.rs
diff options
context:
space:
mode:
Diffstat (limited to 'webhogg/wasm/src/context/graphics.rs')
-rw-r--r--webhogg/wasm/src/context/graphics.rs55
1 files changed, 46 insertions, 9 deletions
diff --git a/webhogg/wasm/src/context/graphics.rs b/webhogg/wasm/src/context/graphics.rs
index b94441d..6af35a2 100644
--- a/webhogg/wasm/src/context/graphics.rs
+++ b/webhogg/wasm/src/context/graphics.rs
@@ -1,11 +1,18 @@
-use log::*;
use crate::error::WasmError;
use wasm_bindgen::JsCast;
-use web_sys::WebGl2RenderingContext as Gl;
+use web_sys::WebGl2RenderingContext as GlContext;
+
+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: Gl,
+ gl: WebGl2,
frame_nr: u64,
+ shader: ShaderProgram,
+ vao: webgl::WebGlVertexArrayObject,
+ buffer: webgl::WebGlBuffer,
}
impl GraphicsContext {
@@ -16,26 +23,56 @@ impl GraphicsContext {
.ok_or_else(|| WasmError::WebGl2ContextCreation(
format!("context cration failed: getContext returned nothing")))?;
let context = context
- .dyn_into::<Gl>()
+ .dyn_into::<GlContext>()
.map_err(|_| WasmError::WebGl2ContextCreation(
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: context,
- frame_nr: 0,
+ gl, frame_nr: 0,
+ shader, vao, buffer
})
}
pub fn update(&mut self) -> Result<(), WasmError> {
let light = 0.5;
+ let speed = 60.0;
- let a = (self.frame_nr as f32) / 60.0;
+ let a = (self.frame_nr as f32) / speed;
let a = f32::abs(f32::sin(a));
let b = f32::abs(f32::cos(a));
let (a, b) = (a * light, b * light);
- self.gl.clear_color(a, light - a, b, 1.0);
- self.gl.clear(Gl::COLOR_BUFFER_BIT);
+ 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;