From 0b225454ce89819c612e3de7f90c2521ac338f30 Mon Sep 17 00:00:00 2001 From: Melik Houij Date: Thu, 23 Feb 2023 22:19:48 +0100 Subject: [PATCH] runs however does not work --- src/camera.rs | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 17 ++++++- src/model.rs | 2 +- src/shader.rs | 32 ++++++------ 4 files changed, 169 insertions(+), 18 deletions(-) create mode 100644 src/camera.rs diff --git a/src/camera.rs b/src/camera.rs new file mode 100644 index 0000000..3828d75 --- /dev/null +++ b/src/camera.rs @@ -0,0 +1,136 @@ +use cgmath::{vec3, prelude::*}; + +type Point3 = cgmath::Point3; +type Vector3 = cgmath::Vector3; +type Matrix4 = cgmath::Matrix4; + + +#[derive(PartialEq, Clone, Copy)] +pub enum Camera_Movement { + FORWARD, + BACKWARD, + LEFT, + RIGHT, +} +use self::Camera_Movement::*; + +const YAW: f32 = -90.0; +const PITCH: f32 = 0.0; +const SPEED: f32 = 2.5; +const SENSITIVITY: f32 = 0.1; +const ZOOM: f32 = 45.0; + +pub struct Camera { + // camera attributes + + pub Position: Point3, + pub Front: Vector3, + pub Up: Vector3, + pub Right: Vector3, + pub WorldUp: Vector3, + + pub Yaw: f32, + pub Pitch: f32, + + pub MovementSpeed: f32, + pub MouseSensitivity: f32, + pub Zoom: f32, +} + +impl Default for Camera { + fn default() -> Camera { + let mut camera = Camera { + Position: Point3::new(0.0, 0.0, 0.0), + Front: vec3(0.0, 0.0, -1.0), + Up: Vector3::zero(), + Right: Vector3::zero(), + WorldUp: Vector3::unit_y(), + Yaw: YAW, + Pitch: PITCH, + MovementSpeed: SPEED, + MouseSensitivity: SENSITIVITY, + Zoom: ZOOM + }; + camera.updateCameraVectors(); + camera + } +} + + +impl Camera { + pub fn GetViewMatrix(&self) -> Matrix4 { + Matrix4::look_at(self.Position, self.Position + self.Front, self.Up) + } + + + pub fn ProcessKeyboard(&mut self, direction: Camera_Movement, deltaTime: f32) { + let velocity = self.MovementSpeed * deltaTime; + if direction == FORWARD { + self.Position += self.Front * velocity; + } + if direction == BACKWARD { + self.Position += -(self.Front * velocity); + } + if direction == LEFT { + self.Position += -(self.Right * velocity); + } + if direction == RIGHT { + self.Position += self.Right * velocity; + } + } + + + pub fn ProcessMouseMovement(&mut self, mut xoffset: f32, mut yoffset: f32, constrainPitch: bool) { + xoffset *= self.MouseSensitivity; + yoffset *= self.MouseSensitivity; + + self.Yaw += xoffset; + self.Pitch += yoffset; + + if constrainPitch { + if self.Pitch > 89.0 { + self.Pitch = 89.0; + } + if self.Pitch < -89.0 { + self.Pitch = -89.0; + } + } + + self.updateCameraVectors(); + + + } + + + + pub fn ProcessMouseScroll(&mut self, yoffset: f32) { + if self.Zoom >= 1.0 && self.Zoom <= 45.0 { + self.Zoom -= yoffset; + } + if self.Zoom <= 1.0 { + if self.Zoom >= 45.0 { + self.Zoom = 45.0; + } + } + + } + + + + + + fn updateCameraVectors(&mut self) + { + let front = Vector3 { + x: self.Yaw.to_radians().cos() * self.Pitch.to_radians().cos(), + y: self.Pitch.to_radians().sin(), + z: self.Yaw.to_radians().sin() * self.Pitch.to_radians().cos(), + }; + self.Front = front.normalize(); + + self.Right = self.Front.cross(self.WorldUp).normalize(); + self.Up = self.Right.cross(self.Front).normalize(); + } + + +} diff --git a/src/main.rs b/src/main.rs index d566b22..e4787f3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,6 +4,7 @@ use glfw; use glfw::{Action, Context, Key}; use gl; use cgmath::{Matrix4, vec3, Point3, Deg, perspective}; +use std::ffi::CStr; const ScreenWidth: u32 = 480; const ScreenHeight: u32 = 320; @@ -12,6 +13,8 @@ const TITLE: &str = "GLFWtest"; mod shader; mod model; use model::Model; +mod camera; + fn main() { // initialize GLFW @@ -45,6 +48,10 @@ fn main() { // put biggie thingies here let model_Shader = shader::shader::new("model"); let ourModel = Model::new("resources/models/backpack"); + let mut camera = camera::Camera { + Position: cgmath::Point3::new(0.0, 0.0, 3.0), + ..camera::Camera::default() + }; println!("entering main loop, time since init: {} seconds", glfw.get_time()); // NOTE window loop @@ -58,9 +65,17 @@ fn main() { // view/projection transformations - //; + let projection: Matrix4 = perspective(Deg(camera.Zoom), ScreenWidth as f32 / ScreenHeight as f32, 0.1, 100.0); + let view = camera.GetViewMatrix(); + model_Shader.setMat4(String::from("projection").as_str(), &projection); + model_Shader.setMat4(String::from("view").as_str(), &view); + let mut model = Matrix4::::from_translation(vec3(0.0, -1.75, 0.0)); + model = model * Matrix4::from_scale(0.2); + model_Shader.setMat4(String::from("projection").as_str(), &model); + ourModel.Draw(&model_Shader); + unsafe { gl::Clear(gl::COLOR_BUFFER_BIT); }; diff --git a/src/model.rs b/src/model.rs index f6d2b78..d86d023 100644 --- a/src/model.rs +++ b/src/model.rs @@ -22,7 +22,7 @@ impl Model { } - pub fn Draw(&self, shader: shader) { + pub fn Draw(&self, shader: &shader) { for mesh in &self.meshes { unsafe { mesh.Draw(&shader); } } diff --git a/src/shader.rs b/src/shader.rs index 7e8f7f5..b573854 100644 --- a/src/shader.rs +++ b/src/shader.rs @@ -2,6 +2,7 @@ use gl; use std::fs; use glm; +use cgmath::prelude::*; /// Shader Struct for creating and using shaders in the Context of engine /// pub struct shader { @@ -93,7 +94,6 @@ use glm; unsafe {gl::UseProgram(self.ID);} } - // BOILERPLATE JUMPSCARE pub fn setBool(&self, name: &str, value: bool ) {unsafe {gl::Uniform1i(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), value as i32);}} @@ -101,24 +101,24 @@ use glm; {unsafe {gl::Uniform1i(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), value as i32);}} pub fn setFloat(&self, name: &str, value: f32 ) {unsafe {gl::Uniform1f(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), value as f32);}} - pub fn setVec2(&self, name: &str, value: glm::Vec2 ) - {unsafe {gl::Uniform2fv(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), 1, &value[0]);}} - pub fn setVec2d(&self, name: &str, x: f32, y: f32) + pub fn setVec2(&self, name: &str, value: &cgmath::Vector2 ) + {unsafe {gl::Uniform2fv(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), 1, value.as_ptr());}} + pub fn setVector2d(&self, name: &str, x: f32, y: f32) {unsafe {gl::Uniform2f(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), x, y);}} - pub fn setVec3(&self, name: &str, value: glm::Vec3 ) - {unsafe {gl::Uniform3fv(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), 1, &value[0]);}} - pub fn setVec3d(&self, name: &str, x: f32, y: f32, z: f32 ) + pub fn setVector3(&self, name: &str, value: cgmath::Vector3 ) + {unsafe {gl::Uniform3fv(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), 1, value.as_ptr());}} + pub fn setVector3d(&self, name: &str, x: f32, y: f32, z: f32 ) {unsafe {gl::Uniform3f(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), x, y, z);}} - pub fn setVec4(&self, name: &str, value: glm::Vec4 ) - {unsafe {gl::Uniform4fv(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), 1, &value[0]);}} - pub fn setVec4d(&self, name: &str, x: f32, y: f32, z: f32, w: f32) + pub fn setVector4(&self, name: &str, value: &cgmath::Vector4 ) + {unsafe {gl::Uniform4fv(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), 1, value.as_ptr());}} + pub fn setVector4d(&self, name: &str, x: f32, y: f32, z: f32, w: f32) {unsafe {gl::Uniform4f(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), x, y, z, w);}} - pub fn setMat2(&self, name: &str, value: glm::Mat2) - {unsafe {gl::UniformMatrix2fv(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), 1, gl::FALSE, &value[0][0]);}} - pub fn setMat3(&self, name: &str, value: glm::Mat3) - {unsafe {gl::UniformMatrix3fv(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), 1, gl::FALSE, &value[0][0]);}} - pub fn setMat4(&self, name: &str, value: glm::Mat4) - {unsafe {gl::UniformMatrix4fv(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), 1, gl::FALSE, &value[0][0]);}} + pub fn setMat2(&self, name: &str, value: &cgmath::Matrix2) + {unsafe {gl::UniformMatrix2fv(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), 1, gl::FALSE, value.as_ptr());}} + pub fn setMat3(&self, name: &str, value: &cgmath::Matrix3) + {unsafe {gl::UniformMatrix3fv(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), 1, gl::FALSE, value.as_ptr());}} + pub fn setMat4(&self, name: &str, value: &cgmath::Matrix4) + {unsafe {gl::UniformMatrix4fv(gl::GetUniformLocation(self.ID, name.as_ptr() as *const gl::types::GLchar), 1, gl::FALSE, value.as_ptr());}} }