diff --git a/shaders/light_f.glsl b/shaders/light_f.glsl deleted file mode 100644 index b2a2083..0000000 --- a/shaders/light_f.glsl +++ /dev/null @@ -1,7 +0,0 @@ -#version 330 core -out vec4 FragColor; - -void main() -{ - FragColor = vec4(1.0); -} diff --git a/src/aabb.rs b/src/aabb.rs index a4bb0b2..077e4cc 100644 --- a/src/aabb.rs +++ b/src/aabb.rs @@ -80,15 +80,19 @@ impl AABB { shader.use_shader(); shader.set_mat4fv("model", &model_mat); + shader.set_3fv("material.ambient", glm::vec3(1.0, 0.627, 0.157)); + shader.set_3fv("material.diffuse", glm::vec3(1.0, 0.627, 0.157)); unsafe { // draw Mesh gl::BindVertexArray(self.vao); + gl::LineWidth(5.0); gl::PolygonMode(gl::FRONT_AND_BACK, gl::LINE); gl::DrawElements(gl::TRIANGLES, self.indices_len as i32, gl::UNSIGNED_INT, std::ptr::null()); // reset stuff to default gl::BindVertexArray(0); + gl::LineWidth(1.0); } } } diff --git a/src/camera.rs b/src/camera.rs index e9ac074..35b5178 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -56,7 +56,7 @@ impl Camera { self._speed = self.speed * delta_time; } - pub fn update_position(&mut self, active_model: Option, objects: &Vec) { + pub fn focus_on_selected_model(&mut self, active_model: Option, objects: &Vec) { if let Some(id) = active_model { for obj in objects { if obj.id == id { diff --git a/src/main.rs b/src/main.rs index 2d76703..8dee25f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -48,16 +48,6 @@ fn main() -> anyhow::Result<(), Box> { source: include_str!("../shaders/frag.glsl").to_string(), }, )?; - let light_shader = shader::Shader::new( - &mut shader::ShaderSource{ - name: "vertex.glsl".to_string(), - source: include_str!("../shaders/vertex.glsl").to_string(), - }, - &mut shader::ShaderSource{ - name: "light_f.glsl".to_string(), - source: include_str!("../shaders/light_f.glsl").to_string(), - }, - )?; let grid_shader = shader::Shader::new( &mut shader::ShaderSource{ name: "grid_v.glsl".to_string(), @@ -69,46 +59,6 @@ fn main() -> anyhow::Result<(), Box> { }, )?; - let vertices: [f32; 288] = [ - // positions // normals // texture coords - -0.5, -0.5, -0.5, 0.0, 0.0, -1.0, 0.0, 0.0, - 0.5, -0.5, -0.5, 0.0, 0.0, -1.0, 1.0, 0.0, - 0.5, 0.5, -0.5, 0.0, 0.0, -1.0, 1.0, 1.0, - 0.5, 0.5, -0.5, 0.0, 0.0, -1.0, 1.0, 1.0, - -0.5, 0.5, -0.5, 0.0, 0.0, -1.0, 0.0, 1.0, - -0.5, -0.5, -0.5, 0.0, 0.0, -1.0, 0.0, 0.0, - -0.5, -0.5, 0.5, 0.0, 0.0, 1.0, 0.0, 0.0, - 0.5, -0.5, 0.5, 0.0, 0.0, 1.0, 1.0, 0.0, - 0.5, 0.5, 0.5, 0.0, 0.0, 1.0, 1.0, 1.0, - 0.5, 0.5, 0.5, 0.0, 0.0, 1.0, 1.0, 1.0, - -0.5, 0.5, 0.5, 0.0, 0.0, 1.0, 0.0, 1.0, - -0.5, -0.5, 0.5, 0.0, 0.0, 1.0, 0.0, 0.0, - -0.5, 0.5, 0.5, -1.0, 0.0, 0.0, 1.0, 0.0, - -0.5, 0.5, -0.5, -1.0, 0.0, 0.0, 1.0, 1.0, - -0.5, -0.5, -0.5, -1.0, 0.0, 0.0, 0.0, 1.0, - -0.5, -0.5, -0.5, -1.0, 0.0, 0.0, 0.0, 1.0, - -0.5, -0.5, 0.5, -1.0, 0.0, 0.0, 0.0, 0.0, - -0.5, 0.5, 0.5, -1.0, 0.0, 0.0, 1.0, 0.0, - 0.5, 0.5, 0.5, 1.0, 0.0, 0.0, 1.0, 0.0, - 0.5, 0.5, -0.5, 1.0, 0.0, 0.0, 1.0, 1.0, - 0.5, -0.5, -0.5, 1.0, 0.0, 0.0, 0.0, 1.0, - 0.5, -0.5, -0.5, 1.0, 0.0, 0.0, 0.0, 1.0, - 0.5, -0.5, 0.5, 1.0, 0.0, 0.0, 0.0, 0.0, - 0.5, 0.5, 0.5, 1.0, 0.0, 0.0, 1.0, 0.0, - -0.5, -0.5, -0.5, 0.0, -1.0, 0.0, 0.0, 1.0, - 0.5, -0.5, -0.5, 0.0, -1.0, 0.0, 1.0, 1.0, - 0.5, -0.5, 0.5, 0.0, -1.0, 0.0, 1.0, 0.0, - 0.5, -0.5, 0.5, 0.0, -1.0, 0.0, 1.0, 0.0, - -0.5, -0.5, 0.5, 0.0, -1.0, 0.0, 0.0, 0.0, - -0.5, -0.5, -0.5, 0.0, -1.0, 0.0, 0.0, 1.0, - -0.5, 0.5, -0.5, 0.0, 1.0, 0.0, 0.0, 1.0, - 0.5, 0.5, -0.5, 0.0, 1.0, 0.0, 1.0, 1.0, - 0.5, 0.5, 0.5, 0.0, 1.0, 0.0, 1.0, 0.0, - 0.5, 0.5, 0.5, 0.0, 1.0, 0.0, 1.0, 0.0, - -0.5, 0.5, 0.5, 0.0, 1.0, 0.0, 0.0, 0.0, - -0.5, 0.5, -0.5, 0.0, 1.0, 0.0, 0.0, 1.0 - ]; - let points_lights: [glm::Vec3; 4] = [ glm::vec3(0.7, 0.2, 2.0), glm::vec3(2.3, -3.3, -4.0), @@ -116,12 +66,6 @@ fn main() -> anyhow::Result<(), Box> { glm::vec3(0.0, 0.0, -3.0), ]; - let ident_mat = glm::mat4( - 1., 0., 0., 0., - 0., 1., 0., 0., - 0., 0., 1., 0., - 0., 0., 0., 1.); - let mut delta_time: f32 = 0.0; let mut last_frame: f32 = 0.0; let mut last_cursor = None; @@ -132,38 +76,6 @@ fn main() -> anyhow::Result<(), Box> { let mut first_mouse: bool = true; unsafe { - // Object 1: Cube/container - // - let mut vbo: u32 = 0; - gl::GenBuffers(1, &mut vbo); - - gl::BindBuffer(gl::ARRAY_BUFFER, vbo); - gl::BufferData(gl::ARRAY_BUFFER, (vertices.len() * core::mem::size_of::()) as isize, vertices.as_ptr() as *const std::ffi::c_void, gl::STATIC_DRAW); - - // position attribute, maps to 'aPos' in vertex shader with location 0 - gl::VertexAttribPointer(0, 3, gl::FLOAT, gl::FALSE, 8 * std::mem::size_of::() as i32, std::ptr::null()); - gl::EnableVertexAttribArray(0); - - // normal attribute, maps to 'aNormal' in vertex shader with location 1 - gl::VertexAttribPointer(1, 3, gl::FLOAT, gl::FALSE, 8 * std::mem::size_of::() as i32, (3 * std::mem::size_of::()) as *const std::ffi::c_void); - gl::EnableVertexAttribArray(1); - - // texture attribute, maps to 'aTexCoords' in vertex shader with location 2 - gl::VertexAttribPointer(2, 2, gl::FLOAT, gl::FALSE, 8 * std::mem::size_of::() as i32, (6 * std::mem::size_of::()) as *const std::ffi::c_void); - gl::EnableVertexAttribArray(2); - - // Object 2: Light source - let mut light_vao: u32 = 0; - gl::GenVertexArrays(1, &mut light_vao); - - gl::BindVertexArray(light_vao); - - gl::BindBuffer(gl::ARRAY_BUFFER, vbo); - - // position attribute, maps to 'aPos' in vertex shader with location 0 - gl::VertexAttribPointer(0, 3, gl::FLOAT, gl::FALSE, 8 * std::mem::size_of::() as i32, std::ptr::null()); - gl::EnableVertexAttribArray(0); - grid_shader.use_shader(); grid_shader.set_float("near", 0.01); grid_shader.set_float("far", 200.0); @@ -255,7 +167,7 @@ fn main() -> anyhow::Result<(), Box> { if state.can_capture_cursor && window.get_mouse_button(glfw::MouseButtonLeft) == Action::Press { if window.get_key(glfw::Key::LeftShift) == Action::Press { - state.camera.move_camera(xoffset, yoffset); + state.camera.move_camera(-xoffset, -yoffset); } else { if let Some(active_model) = state.active_model { let x_rotation = xoffset * state.camera.sensitivity * state.rotation_speed; @@ -302,19 +214,6 @@ fn main() -> anyhow::Result<(), Box> { } gl::PolygonMode(gl::FRONT_AND_BACK, gl::FILL); - light_shader.use_shader(); - light_shader.set_mat4fv("view", &view_mat); - light_shader.set_mat4fv("projection", &projection_mat); - - // for i in 0..points_lights.len() { - // let light_model = glm::ext::translate(&ident_mat, points_lights[i]); - // let light_model = glm::ext::scale(&light_model, glm::vec3(0.2, 0.2, 0.2)); - // light_shader.set_mat4fv("model", &light_model); - - // gl::BindVertexArray(light_vao); - // gl::DrawArrays(gl::TRIANGLES, 0, 36); - // } - // draw grid if state.draw_grid {draw_grid(&grid_shader, &view_mat, &projection_mat);} @@ -335,8 +234,6 @@ fn main() -> anyhow::Result<(), Box> { gl::DeleteRenderbuffers(1, &rbo); } - gl::DeleteVertexArrays(1, &light_vao); - gl::DeleteBuffers(1, &vbo); gl::DeleteFramebuffers(1, &scene_fb); } diff --git a/src/mesh.rs b/src/mesh.rs index 441ca06..ede4bb8 100644 --- a/src/mesh.rs +++ b/src/mesh.rs @@ -105,8 +105,14 @@ impl Mesh { let model_mat = glm::ext::translate(&model_mat, glm::vec3(self.position.x, self.position.y, self.position.z)); shader.set_mat4fv("model", &model_mat); - shader.set_3fv("material.ambient", self.material.ambient_color); - shader.set_3fv("material.diffuse", self.material.diffuse_color); + let mut polygon_mode = 0; + unsafe { + gl::GetIntegerv(gl::POLYGON_MODE, &mut polygon_mode); + } + let is_wireframe = polygon_mode as u32 == gl::LINE; + + shader.set_3fv("material.ambient", if is_wireframe {glm::vec3(0.0, 0.0, 0.0)} else {self.material.ambient_color}); + shader.set_3fv("material.diffuse", if is_wireframe {glm::vec3(0.0, 0.0, 0.0)} else {self.material.diffuse_color}); shader.set_3fv("material.specular", self.material.specular_color); shader.set_float("material.shininess", self.material.specular_exponent); diff --git a/src/ui/ui.rs b/src/ui/ui.rs index 9ca84f1..bde08e7 100644 --- a/src/ui/ui.rs +++ b/src/ui/ui.rs @@ -188,7 +188,7 @@ fn draw_object_hierarchy(ui: &imgui::Ui, state: &mut State, idx: usize) -> bool if ui.checkbox("Selected", &mut (Some(state.objects[idx].id) == state.active_model)) { state.objects[idx].reset_rotation(); state.active_model = Some(state.objects[idx].id); - state.camera.update_position(state.active_model, &state.objects); + state.camera.focus_on_selected_model(state.active_model, &state.objects); } } @@ -208,7 +208,7 @@ fn draw_objects_window(ui: &imgui::Ui, state: &mut State) { if state.active_model == Some(selected_obj_id) { let model = state.objects.last_mut().map(|m| m.reset_rotation()); state.active_model = model.and_then(|o| Some(o.id)); - state.camera.update_position(state.active_model, &state.objects); + state.camera.focus_on_selected_model(state.active_model, &state.objects); } continue; } @@ -307,7 +307,7 @@ fn draw_viewport(ui: &imgui::Ui, state: &mut State, texture: u32) { state.viewport_size = tex_size; if ui.button("Reset Camera") { - state.camera.update_position(state.active_model, &state.objects); + state.camera.focus_on_selected_model(state.active_model, &state.objects); } ui.same_line(); if ui.button("Capture Scene") { diff --git a/src/utils.rs b/src/utils.rs index 0683839..180d72c 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -94,7 +94,7 @@ pub fn import_models_from_paths(paths: &Vec, state: &mut ui::ui::State) m.name = model_name.to_str().unwrap().to_string(); } state.objects.push(m); - state.camera.update_position(state.active_model, &state.objects); + state.camera.focus_on_selected_model(state.active_model, &state.objects); }, Err(e) => { let error = format!("Error loading model \"{}\": {}", model_path.to_str().unwrap(), e);