Advertisement
Guest User

Untitled

a guest
May 4th, 2025
12
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 7.19 KB | None | 0 0
  1. use std::time::Instant;
  2.  
  3. use collision::Collidable;
  4. use level_one::LevelOne;
  5. use nalgebra::{Matrix4, Perspective3, Vector3};
  6. use player::Player;
  7. use sdl2::{event::Event, keyboard::Scancode, video::GLProfile};
  8.  
  9. mod utils;
  10. mod grid;
  11. mod renderable;
  12. mod shader;
  13. mod camera;
  14. mod consts;
  15. mod level_one;
  16. mod plane;
  17. mod cube;
  18. mod capsule;
  19. mod skybox;
  20. mod collision;
  21. mod debug;
  22. mod player;
  23.  
  24. use consts::*;
  25. use camera::*;
  26. use shader::Shader;
  27. use grid::Grid;
  28. use skybox::Skybox;
  29. use debug::DebugRenderer;
  30.  
  31. fn main() {
  32.     let sdl = sdl2::init().unwrap();
  33.     let video = sdl.video().unwrap();
  34.  
  35.     let gl_attr = video.gl_attr();
  36.     gl_attr.set_context_profile(GLProfile::Core);
  37.     gl_attr.set_context_version(3, 3);
  38.  
  39.     let mut window = video.window(GAME_TITLE, SCREEN_WIDTH, SCREEN_HEIGHT)
  40.         .opengl()
  41.         .build()
  42.         .unwrap();
  43.  
  44.     let _ctx = window.gl_create_context().unwrap();
  45.     gl::load_with(|s| video.gl_get_proc_address(s) as *const _);
  46.  
  47.     unsafe {
  48.         gl::Viewport(0, 0, SCREEN_WIDTH as i32, SCREEN_HEIGHT as i32);
  49.         gl::Enable(gl::DEPTH_TEST);
  50.     }
  51.  
  52.     let mouse = sdl.mouse();
  53.     window.set_grab(true);
  54.     mouse.set_relative_mouse_mode(true);
  55.     mouse.show_cursor(false);
  56.  
  57.     let mut light_angle: f32 = 0.0;         // Azimuthal angle around Y
  58.     let light_elevation: f32 = 45.0f32.to_radians(); // Fixed elevation above horizon
  59.     let light_speed: f32 = 0.2;            // Revolutions per second (~0.2 rad/s)
  60.  
  61.     let debug_renderer = DebugRenderer::new();
  62.  
  63.     let mut mouse_locked = true;
  64.     let mut first_mouse = true;
  65.  
  66.     let skybox_shader = Shader::new("src/shaders/skybox_vertex.glsl", "src/shaders/skybox_fragment.glsl");
  67.     let skybox = Skybox::new(SKYBOX_FACES);
  68.  
  69.     let shader = Shader::new("src/shaders/vertex.glsl", "src/shaders/fragment.glsl");
  70.  
  71.     let mut event_pump = sdl.event_pump().unwrap();
  72.     //let mut last_mouse_pos = (SCREEN_WIDTH as f32 / 2.0, SCREEN_HEIGHT as f32 / 2.0);
  73.  
  74.     let mut last_frame = Instant::now();
  75.  
  76.     let grid = Grid::new(10000.0, 1.0);
  77.  
  78.     // INITIALIZE LEVEL ONE
  79.     let level_one = LevelOne::new();
  80.     let spawn = level_one.spawn_position();
  81.  
  82.     let eye_height = 5.8;
  83.     let mut camera = Camera::new(Vector3::new(spawn.x, spawn.y + eye_height, spawn.z));
  84.  
  85.     // INITIALIZE PLAYER
  86.     let mut player = Player::new(spawn, eye_height);
  87.  
  88.     let start_time = Instant::now();
  89.  
  90.     // let mut player = Player::new(Vector3::new(-37.28033, 1.0, -37.28033));
  91.     //let mut player = Player::new(Vector3::new(1.0, 1.0, -1.0));
  92.  
  93.     let mut world_colliders: Vec<&dyn Collidable> =
  94.     level_one.walls.iter().map(|w| w as &dyn Collidable).collect();
  95.     world_colliders.push(&level_one.ground);
  96.  
  97.     // MAIN GAME LOOP GOES THROUGH HERE
  98.     'main: loop {
  99.        let current_frame = Instant::now();
  100.        let delta_time = current_frame.duration_since(last_frame).as_secs_f32();
  101.        last_frame = current_frame;
  102.  
  103.        light_angle += light_speed * delta_time;
  104.        if light_angle > std::f32::consts::TAU {
  105.            light_angle -= std::f32::consts::TAU;
  106.        }
  107.  
  108.        let elapsed = start_time.elapsed().as_secs_f32();
  109.  
  110.        // spherical → cartesian
  111.        let lx = light_angle.cos() * light_elevation.cos();
  112.        let ly = light_elevation.sin();
  113.        let lz = light_angle.sin() * light_elevation.cos();
  114.        let light_dir = Vector3::new(lx, ly, lz);
  115.  
  116.        if mouse_locked {
  117.            mouse.warp_mouse_in_window(&window, SCREEN_WIDTH as i32 / 2, SCREEN_HEIGHT as i32 / 2);
  118.        }
  119.  
  120.        for event in event_pump.poll_iter() {
  121.            //println!("{:?}", event);
  122.            match event {
  123.                Event::Quit { .. } => break 'main,
  124.                 Event::KeyDown { scancode: Some(Scancode::Escape), .. } => {
  125.                     window.set_grab(false);
  126.                     if mouse_locked {
  127.                         mouse.set_relative_mouse_mode(false);
  128.                         mouse.show_cursor(true);
  129.                         mouse_locked = false;
  130.                     }
  131.                 }
  132.                 Event::KeyDown { scancode: Some(Scancode::Left), .. } => {
  133.                     light_angle -= light_speed * delta_time;
  134.                 }
  135.                 Event::KeyDown { scancode: Some(Scancode::Right), .. } => {
  136.                     light_angle += light_speed * delta_time;
  137.                 }
  138.                 Event::MouseButtonDown { .. } if !mouse_locked => {
  139.                     mouse.set_relative_mouse_mode(true);
  140.                     mouse.show_cursor(false);
  141.                     mouse_locked = true;
  142.                     //mouse.warp_mouse_in_window(&window, (SCREEN_WIDTH / 2) as i32, (SCREEN_HEIGHT / 2) as i32);
  143.                     // first_mouse = true;
  144.                 }
  145.                 Event::MouseMotion { xrel, yrel, x, y, .. } => {
  146.                     if first_mouse {
  147.                         //last_mouse_pos = (x as f32, y as f32);
  148.                         first_mouse = false;
  149.                     } else {
  150.                         camera.process_mouse_movement(xrel as f32, yrel as f32, true);
  151.                     }
  152.                 }
  153.                 _ => {}
  154.             }
  155.         }
  156.  
  157.         let keys = event_pump.keyboard_state();
  158.         //camera.process_keyboard(&keys, delta_time);
  159.  
  160.         // Add Player Update here
  161.         player.update(delta_time, &keys, &mut camera, &world_colliders);
  162.  
  163.         unsafe {
  164.             gl::ClearColor(0.1, 0.1, 0.1, 1.0);
  165.             gl::Clear(gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT);
  166.         }
  167.  
  168.         // first_mouse = true;
  169.         shader.use_program();
  170.         skybox_shader.use_program();
  171.         skybox_shader.set_int("skybox", 0);
  172.  
  173.         let projection = Perspective3::new(SCREEN_WIDTH as f32 / SCREEN_HEIGHT as f32, 45.0f32.to_radians(), 0.1, 100.0);
  174.         let view = camera.get_view_matrix();
  175.         let model = Matrix4::<f32>::identity();
  176.  
  177.         shader.set_mat4("model", &model);
  178.         shader.set_mat4("view", &view);
  179.         shader.set_mat4("projection", projection.as_matrix());
  180.         shader.set_vec3("lightDir", &light_dir);
  181.         shader.set_vec3("fogColor", &Vector3::new(0.6, 0.7, 0.8));   // pale blue mist
  182.         shader.set_float("fogDensity", 0.02);                       // base density
  183.         shader.set_float("fogTime", elapsed);                       // drives the animation
  184.  
  185.         grid.draw(&shader, &camera, projection.as_matrix());
  186.         level_one.draw_ground(&shader, &camera, projection.as_matrix());
  187.         level_one.draw_walls(&shader, &camera, projection.as_matrix());
  188.  
  189.         player.draw(&shader, &camera, &projection.as_matrix());
  190.  
  191.         skybox.draw(&skybox_shader, &camera, projection.as_matrix());
  192.  
  193.         debug_renderer.draw_collider(
  194.             &camera.get_view_matrix(),
  195.             &projection.as_matrix(),
  196.             &level_one.ground.collider(),
  197.         );
  198.         for wall in &level_one.walls {
  199.             debug_renderer.draw_collider(
  200.                 &camera.get_view_matrix(),
  201.                 &projection.as_matrix(),
  202.                 &wall.collider(),
  203.             );
  204.         }
  205.  
  206.         window.gl_swap_window();
  207.  
  208.         std::thread::sleep(std::time::Duration::from_millis(1));
  209.     }
  210. }
  211.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement