From f461cbf2b9a66a5da19ce64d440b64b44d07b5de Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sat, 22 Aug 2020 04:33:01 -0400 Subject: [PATCH] more typesafe uniforms --- src/assets/positionable_object.rs | 7 ++++--- src/opengl/wrapper/mod.rs | 1 + src/opengl/wrapper/uniform.rs | 27 +++++++++++++++++++++++++ src/point_cloud/point_cloud_renderer.rs | 13 ++++++------ 4 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 src/opengl/wrapper/uniform.rs diff --git a/src/assets/positionable_object.rs b/src/assets/positionable_object.rs index a54f296992..eb4c606705 100644 --- a/src/assets/positionable_object.rs +++ b/src/assets/positionable_object.rs @@ -3,6 +3,7 @@ use gl::types::*; use nalgebra::{Vector4, Rotation3, Translation3, Matrix4, Vector3}; use std::ffi::CString; use std::os::raw::c_char; +use crate::opengl::wrapper::uniform::Uniform; pub struct PositionableObject { pub renderable_object: RenderableObject, @@ -63,8 +64,7 @@ impl PositionableObject { transformation.as_ptr() }*/ - pub fn draw(&self, model_view_uniform_id: GLint) { - unsafe { + pub fn draw(&self, model_transform_id: Uniform) { //let name : CString = CString::new("view").expect("string is correct"); //let name_ptr : *const c_char = name.as_ptr() as *const c_char; @@ -83,7 +83,8 @@ impl PositionableObject { let mat_ptr = transformation.as_ptr(); - gl::UniformMatrix4fv(model_view_uniform_id, 1, gl::FALSE, mat_ptr); + unsafe { + gl::UniformMatrix4fv(model_transform_id.id(), 1, gl::FALSE, mat_ptr); } self.renderable_object.draw(); diff --git a/src/opengl/wrapper/mod.rs b/src/opengl/wrapper/mod.rs index 9690de54c6..c49c63f8c5 100644 --- a/src/opengl/wrapper/mod.rs +++ b/src/opengl/wrapper/mod.rs @@ -1,4 +1,5 @@ pub mod buffer; pub mod other_misc_wrapper; pub mod texture; +pub mod uniform; pub mod vertex_array; diff --git a/src/opengl/wrapper/uniform.rs b/src/opengl/wrapper/uniform.rs new file mode 100644 index 0000000000..6b3c997584 --- /dev/null +++ b/src/opengl/wrapper/uniform.rs @@ -0,0 +1,27 @@ +use anyhow::Result as AnyhowResult; +use gl::types::*; +use std::os::raw::c_char; + +/// A typesafe handle on uniform IDs with convenience methods. +#[derive(Clone, Debug, Copy)] +pub struct Uniform { + id: GLint, +} + +impl Uniform { + pub fn lookup(opengl_program_id: GLuint, identifier: *const c_char) -> AnyhowResult { + let mut loc = -1; + + unsafe { + loc = gl::GetUniformLocation(opengl_program_id, identifier); + } + + Ok(Self { + id: loc, + }) + } + + pub fn id(&self) -> GLint { + self.id + } +} diff --git a/src/point_cloud/point_cloud_renderer.rs b/src/point_cloud/point_cloud_renderer.rs index dcdc09af6d..e1c36bea03 100644 --- a/src/point_cloud/point_cloud_renderer.rs +++ b/src/point_cloud/point_cloud_renderer.rs @@ -34,6 +34,7 @@ use std::time::{SystemTime, UNIX_EPOCH}; use tobj::load_obj; use crate::assets::positionable_object::PositionableObject; use cgmath::{Matrix4, SquareMatrix, Matrix}; +use crate::opengl::wrapper::uniform::Uniform; pub type Result = std::result::Result; @@ -109,7 +110,7 @@ pub struct PointCloudRenderer { projection_index: GLint, /// Uniform location in the shader program. - model_view_index: GLint, + model_transform_id: Uniform, /// Uniform location in the shader program. enable_shading_index: GLint, @@ -222,7 +223,6 @@ impl PointCloudRenderer { let mut view_index = 0; let mut projection_index = 0; - let mut model_view_index = 0; let mut enable_shading_index = 0; unsafe { @@ -232,13 +232,14 @@ impl PointCloudRenderer { // FIXME: THe 'view' and 'projection' uniforms are not binding for some reason. view_index = gl::GetUniformLocation(program_id, VIEW_PTR); projection_index = gl::GetUniformLocation(program_id, PROJECTION_PTR); - model_view_index = gl::GetUniformLocation(program_id, MODEL_VIEW_PTR); enable_shading_index = gl::GetUniformLocation(program_id, ENABLE_SHADING_PTR); // TODO: This is hardcoded to 2 point_cloud_texture_indices.push(gl::GetUniformLocation(program_id, POINT_CLOUD_0_PTR)); point_cloud_texture_indices.push(gl::GetUniformLocation(program_id, POINT_CLOUD_1_PTR)); } + let model_transform = Uniform::lookup(program_id, MODEL_VIEW_PTR).unwrap(); + let color_vertex_attribute_location = unsafe { let location = gl::GetAttribLocation(program_id, COLOR_LOCATION_PTR); @@ -292,7 +293,7 @@ impl PointCloudRenderer { enable_shading: false, view_index, projection_index, - model_view_index, + model_transform_id: model_transform, enable_shading_index, point_cloud_texture_indices, vertex_array_objects: Vec::with_capacity(num_cameras), @@ -503,7 +504,7 @@ impl PointCloudRenderer { if use_default_model_view { let typed_model_view = self.default_model_view_matrix.as_ptr() as *const GLfloat; - gl::UniformMatrix4fv(self.model_view_index, 1, gl::FALSE, typed_model_view); + gl::UniformMatrix4fv(self.model_transform_id.id(), 1, gl::FALSE, typed_model_view); } // Update render settings in shader @@ -524,7 +525,7 @@ impl PointCloudRenderer { gl::BindVertexArray(0); if let Some(ref renderable) = self.renderable_object { - renderable.draw(self.model_view_index); + renderable.draw(self.model_transform_id); } gl_get_error()