Advertisement
Nachasic

Raylib 3D FPS with models

Dec 26th, 2019
356
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 6.58 KB | None | 0 0
  1. use raylib::prelude::*;
  2. use rand::prelude::*;
  3. use arr_macro::arr;
  4.  
  5. extern crate lazy_static;
  6.  
  7. mod lights;
  8.  
  9. const WINDOW_WIDTH: i32 = 1280;
  10. const WINDOW_HEIGHT: i32 = 720;
  11.  
  12. struct Column {
  13.     height: f32,
  14.     position: Vector3,
  15.     color: Color
  16. }
  17.  
  18. impl Column {
  19.     fn create_random() -> Column {
  20.         let mut rng = rand::thread_rng();
  21.         let height: f32 = rng.gen_range(1.0, 12.0);
  22.         let position = Vector3::new(
  23.             rng.gen_range(-15.0, 15.0),
  24.             height / 2.0,
  25.             rng.gen_range(-15.0, 15.0),
  26.         );
  27.         let color = Color::new(
  28.             rng.gen_range(20, 255),
  29.             rng.gen_range(10, 55),
  30.             30,
  31.             255
  32.         );
  33.        
  34.         Column {
  35.             height,
  36.             position,
  37.             color
  38.         }
  39.     }
  40.  
  41.     fn generate_mesh(&self, thread: &RaylibThread) -> Mesh {
  42.         Mesh::gen_mesh_cube(thread, 2.0, self.height, 2.0)
  43.     }
  44. }
  45.  
  46. fn main() {
  47.     let (mut rl, thread) = raylib::init()
  48.         .size(WINDOW_WIDTH, WINDOW_HEIGHT)
  49.         .title("Hello, world!")
  50.         .build();
  51.  
  52.     let mut camera = Camera3D::perspective(
  53.         Vector3::new(4.0, 2.0, 4.0),
  54.         Vector3::new(0.0, 1.8, 0.0),
  55.         Vector3::new(0.0, 1.0, 0.0),
  56.         60.0
  57.     );
  58.     let columns: [Column; 20] = arr![Column::create_random(); 20];
  59.     let mut column_meshes: Vec<Mesh> = Vec::with_capacity(20);
  60.     for column in columns.into_iter() {
  61.         column_meshes.push(
  62.             column.generate_mesh(&thread)
  63.         )
  64.     }
  65.     let mut column_models: Vec<Model> = Vec::with_capacity(20);
  66.  
  67.     for (index, _) in columns.into_iter().enumerate() {
  68.         let mesh = &column_meshes[index];
  69.         column_models.push(
  70.             rl.load_model_from_mesh(&thread, mesh).unwrap()
  71.         )
  72.     }
  73.     let mesh: Mesh = columns[0].generate_mesh(&thread);
  74.     let model: Model = rl.load_model_from_mesh(&thread, &mesh).unwrap();
  75.     // Borrow models vec to use in the loop
  76.     let models = &column_models;
  77.  
  78.     rl.set_camera_mode(&camera, CameraMode::CAMERA_FIRST_PERSON);
  79.     rl.set_target_fps(60);
  80.  
  81.     while !rl.window_should_close() {
  82.         rl.update_camera(&mut camera);
  83.  
  84.         let mut d = rl.begin_drawing(&thread);
  85.  
  86.         d.clear_background(Color::DARKGREEN);
  87.         {
  88.             let mut d2 = d.begin_mode_3D(camera);
  89.  
  90.             d2.draw_plane(
  91.                 Vector3::new(0.0, 0.0, 0.0),
  92.                 Vector2::new(32.0, 32.0),
  93.                 Color::LIGHTGRAY
  94.             );
  95.             d2.draw_cube(
  96.                 Vector3::new(-16.0, 2.5, 0.0),
  97.                 1.0, 5.0, 32.0, Color::BLUE
  98.             );
  99.             d2.draw_cube(
  100.                 Vector3::new(16.0, 2.5, 0.0),
  101.                 1.0, 5.0, 32.0, Color::LIME
  102.             );
  103.             d2.draw_cube(
  104.                 Vector3::new(0.0, 2.5, 16.0),
  105.                 32.0, 5.0, 1.0, Color::GOLD
  106.             );
  107.  
  108.             for (index, model) in models.into_iter().enumerate() {
  109.                 let position = columns[index].position;
  110.                 let color = columns[index].color;
  111.                 d2.draw_model(&model, position, 1.0, color);
  112.             }
  113.         }
  114.         d.draw_rectangle(10, 10, 220, 70, Color::SKYBLUE);
  115.         d.draw_rectangle_lines(10, 10, 220, 70, Color::BLUE);
  116.         d.draw_text("First person camera default controls:", 20, 20, 10, Color::BLACK);
  117.         d.draw_text("- Move with keys: W, A, S, D", 40, 40, 10, Color::DARKGRAY);
  118.         d.draw_text("- Mouse move to look around", 40, 60, 10, Color::DARKGRAY);
  119.     }
  120. }
  121.  
  122.  
  123. //     Finished dev [unoptimized + debuginfo] target(s) in 0.56s
  124. //      Running `target/debug/vicarious-raylib`
  125. // INFO: Initializing raylib 2.5
  126. // INFO: Display device initialized successfully
  127. // INFO: Display size: 1920 x 1080
  128. // INFO: Render size: 1280 x 720
  129. // INFO: Screen size: 1280 x 720
  130. // INFO: Viewport offsets: 0, 0
  131. // INFO: GLAD: OpenGL extensions loaded successfully
  132. // INFO: OpenGL 3.3 Core profile supported
  133. // INFO: GPU: Vendor:   Intel Open Source Technology Center
  134. // INFO: GPU: Renderer: Mesa DRI Intel(R) UHD Graphics 620 (Kabylake GT2)
  135. // INFO: GPU: Version:  4.5 (Core Profile) Mesa 19.2.7
  136. // INFO: GPU: GLSL:     4.50
  137. // INFO: Number of supported extensions: 210
  138. // INFO: [EXTENSION] DXT compressed textures supported
  139. // INFO: [EXTENSION] ETC2/EAC compressed textures supported
  140. // INFO: [EXTENSION] Anisotropic textures filtering supported (max: 16X)
  141. // INFO: [TEX ID 1] Texture created successfully (1x1 - 1 mipmaps)
  142. // INFO: [TEX ID 1] Base white texture loaded successfully
  143. // INFO: [SHDR ID 1] Shader compiled successfully
  144. // INFO: [SHDR ID 2] Shader compiled successfully
  145. // INFO: [SHDR ID 3] Shader program loaded successfully
  146. // INFO: [SHDR ID 3] Default shader loaded successfully
  147. // INFO: Internal buffers initialized successfully (CPU)
  148. // INFO: Internal buffers uploaded successfully (GPU)
  149. // INFO: OpenGL default states initialized successfully
  150. // INFO: [TEX ID 2] Texture created successfully (128x128 - 1 mipmaps)
  151. // INFO: [TEX ID 2] Default font loaded successfully
  152. // INFO: [VAO ID 2] Mesh uploaded successfully to VRAM (GPU)
  153. // INFO: [VAO ID 3] Mesh uploaded successfully to VRAM (GPU)
  154. // INFO: [VAO ID 4] Mesh uploaded successfully to VRAM (GPU)
  155. // INFO: [VAO ID 5] Mesh uploaded successfully to VRAM (GPU)
  156. // INFO: [VAO ID 6] Mesh uploaded successfully to VRAM (GPU)
  157. // INFO: [VAO ID 7] Mesh uploaded successfully to VRAM (GPU)
  158. // INFO: [VAO ID 8] Mesh uploaded successfully to VRAM (GPU)
  159. // INFO: [VAO ID 9] Mesh uploaded successfully to VRAM (GPU)
  160. // INFO: [VAO ID 10] Mesh uploaded successfully to VRAM (GPU)
  161. // INFO: [VAO ID 11] Mesh uploaded successfully to VRAM (GPU)
  162. // INFO: [VAO ID 12] Mesh uploaded successfully to VRAM (GPU)
  163. // INFO: [VAO ID 13] Mesh uploaded successfully to VRAM (GPU)
  164. // INFO: [VAO ID 14] Mesh uploaded successfully to VRAM (GPU)
  165. // INFO: [VAO ID 15] Mesh uploaded successfully to VRAM (GPU)
  166. // INFO: [VAO ID 16] Mesh uploaded successfully to VRAM (GPU)
  167. // INFO: [VAO ID 17] Mesh uploaded successfully to VRAM (GPU)
  168. // INFO: [VAO ID 18] Mesh uploaded successfully to VRAM (GPU)
  169. // INFO: [VAO ID 19] Mesh uploaded successfully to VRAM (GPU)
  170. // INFO: [VAO ID 20] Mesh uploaded successfully to VRAM (GPU)
  171. // INFO: [VAO ID 21] Mesh uploaded successfully to VRAM (GPU)
  172. // INFO: [VAO ID 22] Mesh uploaded successfully to VRAM (GPU)
  173. // INFO: Target time per frame: 16.667 milliseconds
  174. // INFO: [VAO ID 22] Unloaded model data from VRAM (GPU)
  175. // INFO: Unloaded model data from RAM and VRAM
  176. // double free or corruption (!prev)
  177. // fish: “cargo run” terminated by signal SIGABRT (Abort)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement