diff --git a/app-proto/inversive-display/Cargo.toml b/app-proto/inversive-display/Cargo.toml index 42d4e17..3d7eb3f 100644 --- a/app-proto/inversive-display/Cargo.toml +++ b/app-proto/inversive-display/Cargo.toml @@ -25,6 +25,7 @@ features = [ 'WebGlBuffer', 'WebGlProgram', 'WebGlShader', + 'WebGlUniformLocation', 'WebGlVertexArrayObject', 'Window' ] diff --git a/app-proto/inversive-display/src/main.rs b/app-proto/inversive-display/src/main.rs index ed8200c..b10f31a 100644 --- a/app-proto/inversive-display/src/main.rs +++ b/app-proto/inversive-display/src/main.rs @@ -10,7 +10,7 @@ extern crate js_sys; /* use std::f64::consts::PI as PI; */ use sycamore::{prelude::*, rt::{JsCast, JsValue}}; -use web_sys::{console, WebGl2RenderingContext, WebGlProgram, WebGlShader}; +use web_sys::{console, WebGl2RenderingContext, WebGlShader}; fn compile_shader( context: &WebGl2RenderingContext, @@ -97,18 +97,9 @@ fn main() { out vec4 vertexColor; - const float focal_length = 3.0; - const float near_clip = 0.1; - const float far_clip = 20.0; - const float depth_inv = 1. / (far_clip - near_clip); + uniform mat4 world_to_clip; void main() { - const mat4 world_to_clip = mat4( - focal_length, 0.0, 0.0, 0.0, - 0.0, focal_length, 0.0, 0.0, - 0.0, 0.0, (near_clip + far_clip) * depth_inv, -1., - 0.0, 0.0, 2. * near_clip * far_clip * depth_inv, 0.0 - ); gl_Position = world_to_clip * vec4(position, 1.); vertexColor = vec4(color, 1.); } @@ -146,14 +137,28 @@ fn main() { console::log_1(&JsValue::from(link_msg)); ctx.use_program(Some(&program)); - // find indices of vertex attributes + // find indices of vertex attributes and uniforms let position_index = ctx.get_attrib_location(&program, "position") as u32; let color_index = ctx.get_attrib_location(&program, "color") as u32; + let world_to_clip_loc = ctx.get_uniform_location(&program, "world_to_clip"); // create a vertex array and bind it to the graphics context let vertex_array = ctx.create_vertex_array().unwrap(); ctx.bind_vertex_array(Some(&vertex_array)); + // set the projection map + let focal_length = 3.0_f32; + let near_clip = 0.1_f32; + let far_clip = 20_f32; + let depth_inv = 1_f32 / (far_clip - near_clip); + let world_to_clip: [f32; 16] = [ + focal_length, 0.0, 0.0, 0.0, + 0.0, focal_length, 0.0, 0.0, + 0.0, 0.0, (near_clip + far_clip) * depth_inv, -1., + 0.0, 0.0, 2. * near_clip * far_clip * depth_inv, 0.0 + ]; + ctx.uniform_matrix4fv_with_f32_array(world_to_clip_loc.as_ref(), false, &world_to_clip); + // set up a repainting routine create_effect(move || { const VERTEX_CNT: usize = 9;