From de84cca5b9a4e8b0291eff1c9d4b1a472b42dd7d Mon Sep 17 00:00:00 2001 From: Piotr Date: Thu, 20 Aug 2020 20:42:25 +0200 Subject: [PATCH] Logs --- src/engine.rs | 1 + src/main.rs | 269 +++++--------------------------------------------- src/model.rs | 2 + 3 files changed, 28 insertions(+), 244 deletions(-) diff --git a/src/engine.rs b/src/engine.rs index dae63c7..e2e948b 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -12,6 +12,7 @@ use image::GenericImage; use image::*; pub unsafe fn loadTexture(path: &str) -> u32 { + println!("Loading texture from path: {}", path); let mut textureID = 0; gl::GenTextures(1, &mut textureID); diff --git a/src/main.rs b/src/main.rs index 1fa2805..dd50c29 100644 --- a/src/main.rs +++ b/src/main.rs @@ -82,145 +82,30 @@ pub fn main() { // --------------------------------------- gl::load_with(|symbol| window.get_proc_address(symbol) as *const _); - let ( - lightingShader, - lampShader, - VBO, - cubeVAO, - lightVAO, - diffuseMap, - specularMap, - cubePositions, - pointLightPositions - - ) = unsafe { + + let (ourShader, ourModel) = unsafe { // configure global opengl state // ----------------------------- gl::Enable(gl::DEPTH_TEST); - // build and compile our shader program - // ------------------------------------ - let lightingShader = shader::Shader::from_file( - "resources/shaders/multiple_lights.vs", - "resources/shaders/multiple_lights.fs", - ); - let lampShader = - shader::Shader::from_file("resources/shaders/lamp.vs", "resources/shaders/lamp.fs"); + // build and compile shaders + // ------------------------- + let ourShader = shader::Shader::from_file( + "resources/shaders/model_loading.vs", + "resources/shaders/model_loading.fs"); - // set up vertex data (and buffer(s)) and configure vertex attributes - // ------------------------------------------------------------------ - 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, - ]; - // positions all containers - let cubePositions: [Vector3; 10] = [ - vec3(0.0, 0.0, 0.0), - vec3(2.0, 5.0, -15.0), - vec3(-1.5, -2.2, -2.5), - vec3(-3.8, -2.0, -12.3), - vec3(2.4, -0.4, -3.5), - vec3(-1.7, 3.0, -7.5), - vec3(1.3, -2.0, -2.5), - vec3(1.5, 2.0, -2.5), - vec3(1.5, 0.2, -1.5), - vec3(-1.3, 1.0, -1.5), - ]; - // positions of the point lights - let pointLightPositions: [Vector3; 4] = [ - vec3(0.7, 0.2, 2.0), - vec3(2.3, -3.3, -4.0), - vec3(-4.0, 2.0, -12.0), - vec3(0.0, 0.0, -3.0), - ]; - // first, configure the cube's VAO (and VBO) - let (mut VBO, mut cubeVAO) = (0, 0); - gl::GenVertexArrays(1, &mut cubeVAO); - gl::GenBuffers(1, &mut VBO); + // load models + // ----------- + let ourModel = model::Model::new("resources/objects/nanosuit/nanosuit.obj"); - gl::BindBuffer(gl::ARRAY_BUFFER, VBO); - gl::BufferData( - gl::ARRAY_BUFFER, - (vertices.len() * mem::size_of::()) as GLsizeiptr, - &vertices[0] as *const f32 as *const c_void, - gl::STATIC_DRAW, - ); + // draw in wireframe + // gl::PolygonMode(gl::FRONT_AND_BACK, gl::LINE); - gl::BindVertexArray(cubeVAO); - let stride = 8 * mem::size_of::() as GLsizei; - gl::VertexAttribPointer(0, 3, gl::FLOAT, gl::FALSE, stride, ptr::null()); - gl::EnableVertexAttribArray(0); - gl::VertexAttribPointer( - 1, - 3, - gl::FLOAT, - gl::FALSE, - stride, - (3 * mem::size_of::()) as *const c_void, - ); - gl::EnableVertexAttribArray(1); - gl::VertexAttribPointer( - 2, - 2, - gl::FLOAT, - gl::FALSE, - stride, - (6 * mem::size_of::()) as *const c_void, - ); - gl::EnableVertexAttribArray(2); - - // second, configure the light's VAO (VBO stays the same; the vertices are the same for the light object which is also a 3D cube) - let mut lightVAO = 0; - gl::GenVertexArrays(1, &mut lightVAO); - gl::BindVertexArray(lightVAO); - - gl::BindBuffer(gl::ARRAY_BUFFER, VBO); - // note that we update the lamp's position attribute's stride to reflect the updated buffer data - gl::VertexAttribPointer(0, 3, gl::FLOAT, gl::FALSE, stride, ptr::null()); - gl::EnableVertexAttribArray(0); - - // load textures (we now use a utility function to keep the code more organized) - // ----------------------------------------------------------------------------- - let diffuseMap = engine::loadTexture("resources/pattern.png"); - let specularMap = engine::loadTexture("resources/textures/container2_specular.png"); - - // shader configuration - // -------------------- - lightingShader.useProgram(); - lightingShader.setInt(c_str!("material.diffuse"), 0); - lightingShader.setInt(c_str!("material.specular"), 1); - - ( - lightingShader, - lampShader, - VBO, - cubeVAO, - lightVAO, - diffuseMap, - specularMap, - cubePositions, - pointLightPositions - ) + (ourShader, ourModel) }; + // render loop // ----------- let (r, g, b) = (0.188, 0.22, 0.235); @@ -245,124 +130,26 @@ pub fn main() { // ----- process_input(&mut window, delta_time, &mut camera); - // render - // ------ // render // ------ unsafe { - gl::ClearColor(r, g, b, 1.0); + gl::ClearColor(0.1, 0.1, 0.1, 1.0); gl::Clear(gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT); - // be sure to activate shader when setting uniforms/drawing objects - lightingShader.useProgram(); - lightingShader.setVector3(c_str!("viewPos"), &camera.Position.to_vec()); - lightingShader.setFloat(c_str!("material.shininess"), 32.0); - /* - Here we set all the uniforms for the 5/6 types of lights we have. We have to set them manually and index - the proper PointLight struct in the array to set each uniform variable. This can be done more code-friendly - by defining light types as classes and set their values in there, or by using a more efficient uniform approach - by using 'Uniform buffer objects', but that is something we'll discuss in the 'Advanced GLSL' tutorial. - */ - // directional light - lightingShader.setVec3(c_str!("dirLight.direction"), -0.2, -1.0, -0.3); - lightingShader.setVec3(c_str!("dirLight.ambient"), 0.05, 0.05, 0.05); - lightingShader.setVec3(c_str!("dirLight.diffuse"), 0.4, 0.4, 0.4); - lightingShader.setVec3(c_str!("dirLight.specular"), 0.5, 0.5, 0.5); - // point light 1 - lightingShader.setVector3(c_str!("pointLights[0].position"), &pointLightPositions[0]); - lightingShader.setVec3(c_str!("pointLights[0].ambient"), 0.05, 0.05, 0.05); - lightingShader.setVec3(c_str!("pointLights[0].diffuse"), 0.8, 0.8, 0.8); - lightingShader.setVec3(c_str!("pointLights[0].specular"), 1.0, 1.0, 1.0); - lightingShader.setFloat(c_str!("pointLights[0].constant"), 1.0); - lightingShader.setFloat(c_str!("pointLights[0].linear"), 0.09); - lightingShader.setFloat(c_str!("pointLights[0].quadratic"), 0.032); - // point light 2 - lightingShader.setVector3(c_str!("pointLights[1].position"), &pointLightPositions[1]); - lightingShader.setVec3(c_str!("pointLights[1].ambient"), 0.05, 0.05, 0.05); - lightingShader.setVec3(c_str!("pointLights[1].diffuse"), 0.8, 0.8, 0.8); - lightingShader.setVec3(c_str!("pointLights[1].specular"), 1.0, 1.0, 1.0); - lightingShader.setFloat(c_str!("pointLights[1].constant"), 1.0); - lightingShader.setFloat(c_str!("pointLights[1].linear"), 0.09); - lightingShader.setFloat(c_str!("pointLights[1].quadratic"), 0.032); - // point light 3 - lightingShader.setVector3(c_str!("pointLights[2].position"), &pointLightPositions[2]); - lightingShader.setVec3(c_str!("pointLights[2].ambient"), 0.05, 0.05, 0.05); - lightingShader.setVec3(c_str!("pointLights[2].diffuse"), 0.8, 0.8, 0.8); - lightingShader.setVec3(c_str!("pointLights[2].specular"), 1.0, 1.0, 1.0); - lightingShader.setFloat(c_str!("pointLights[2].constant"), 1.0); - lightingShader.setFloat(c_str!("pointLights[2].linear"), 0.09); - lightingShader.setFloat(c_str!("pointLights[2].quadratic"), 0.032); - // point light 4 - lightingShader.setVector3(c_str!("pointLights[3].position"), &pointLightPositions[3]); - lightingShader.setVec3(c_str!("pointLights[3].ambient"), 0.05, 0.05, 0.05); - lightingShader.setVec3(c_str!("pointLights[3].diffuse"), 0.8, 0.8, 0.8); - lightingShader.setVec3(c_str!("pointLights[3].specular"), 1.0, 1.0, 1.0); - lightingShader.setFloat(c_str!("pointLights[3].constant"), 1.0); - lightingShader.setFloat(c_str!("pointLights[3].linear"), 0.09); - lightingShader.setFloat(c_str!("pointLights[3].quadratic"), 0.032); - // spotLight - lightingShader.setVector3(c_str!("spotLight.position"), &camera.Position.to_vec()); - lightingShader.setVector3(c_str!("spotLight.direction"), &camera.Front); - lightingShader.setVec3(c_str!("spotLight.ambient"), 0.0, 0.0, 0.0); - lightingShader.setVec3(c_str!("spotLight.diffuse"), 1.0, 1.0, 1.0); - lightingShader.setVec3(c_str!("spotLight.specular"), 1.0, 1.0, 1.0); - lightingShader.setFloat(c_str!("spotLight.constant"), 1.0); - lightingShader.setFloat(c_str!("spotLight.linear"), 0.09); - lightingShader.setFloat(c_str!("spotLight.quadratic"), 0.032); - lightingShader.setFloat(c_str!("spotLight.cutOff"), 12.5f32.to_radians().cos()); - lightingShader.setFloat(c_str!("spotLight.outerCutOff"), 15.0f32.to_radians().cos()); + // don't forget to enable shader before setting uniforms + ourShader.useProgram(); // view/projection transformations - let projection: Matrix4 = perspective( - Deg(camera.Zoom), - consts::SCR_WIDTH as f32 / consts::SCR_HEIGHT as f32, - 0.1, - 100.0, - ); + let projection: Matrix4 = perspective(Deg(camera.Zoom), consts::SCR_WIDTH as f32 / consts::SCR_HEIGHT as f32, 0.1, 100.0); let view = camera.get_view_matrix(); - lightingShader.setMat4(c_str!("projection"), &projection); - lightingShader.setMat4(c_str!("view"), &view); - - // world transformation - let mut model = Matrix4::::identity(); - lightingShader.setMat4(c_str!("model"), &model); - - // bind diffuse map - gl::ActiveTexture(gl::TEXTURE0); - gl::BindTexture(gl::TEXTURE_2D, diffuseMap); - // bind specular map - gl::ActiveTexture(gl::TEXTURE1); - gl::BindTexture(gl::TEXTURE_2D, specularMap); - - // render containers - gl::BindVertexArray(cubeVAO); - for (i, position) in cubePositions.iter().enumerate() { - // calculate the model matrix for each object and pass it to shader before drawing - let mut model: Matrix4 = Matrix4::from_translation(*position); - let angle = 20.0 * i as f32; - // don't forget to normalize the axis! - model = - model * Matrix4::from_axis_angle(vec3(1.0, 0.3, 0.5).normalize(), Deg(angle)); - lightingShader.setMat4(c_str!("model"), &model); - - gl::DrawArrays(gl::TRIANGLES, 0, 36); - } - - // also draw the lamp object(s) - lampShader.useProgram(); - lampShader.setMat4(c_str!("projection"), &projection); - lampShader.setMat4(c_str!("view"), &view); - - // we now draw as many light bulbs as we have point lights. - gl::BindVertexArray(lightVAO); - for position in &pointLightPositions { - model = Matrix4::from_translation(*position); - model = model * Matrix4::from_scale(0.2); // Make it a smaller cube - lampShader.setMat4(c_str!("model"), &model); - - gl::DrawArrays(gl::TRIANGLES, 0, 36); - } + ourShader.setMat4(c_str!("projection"), &projection); + ourShader.setMat4(c_str!("view"), &view); + // render the loaded model + let mut model = Matrix4::::from_translation(vec3(0.0, -1.75, 0.0)); // translate it down so it's at the center of the scene + model = model * Matrix4::from_scale(0.2); // it's a bit too big for our scene, so scale it down + ourShader.setMat4(c_str!("model"), &model); + ourModel.Draw(&ourShader); } // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.) @@ -370,12 +157,6 @@ pub fn main() { window.swap_buffers(); glfw.poll_events(); } - - unsafe { - gl::DeleteVertexArrays(1, &cubeVAO); - gl::DeleteVertexArrays(1, &lightVAO); - gl::DeleteBuffers(1, &VBO); - } } pub fn process_events( diff --git a/src/model.rs b/src/model.rs index 78ac951..2516cfa 100644 --- a/src/model.rs +++ b/src/model.rs @@ -45,6 +45,7 @@ impl Model { // loads a model from file and stores the resulting meshes in the meshes vector. fn loadModel(&mut self, path: &str) { let path = Path::new(path); + println!("Started loading model from path: {}", path.display()); // retrieve the directory path of the filepath self.directory = path.parent().unwrap_or_else(|| Path::new("")).to_str().unwrap().into(); @@ -94,6 +95,7 @@ impl Model { self.meshes.push(Mesh::new(vertices, indices, textures)); } + println!("Finished loading model from path: {}", path.display()); }