Use more iterators

This commit is contained in:
2022-10-25 00:39:19 +02:00
parent 2984d147fa
commit 89387d82fd
+32 -50
View File
@@ -4,7 +4,6 @@ use glium::glutin::event_loop::{ControlFlow, EventLoop};
use glium::vertex::VertexBufferAny; use glium::vertex::VertexBufferAny;
use glium::{self, Display}; use glium::{self, Display};
use std::fs; use std::fs;
use std::str::Split;
use std::time::{Duration, Instant}; use std::time::{Duration, Instant};
pub mod camera; pub mod camera;
@@ -77,6 +76,7 @@ fn get_altitude(height_columns: &[&str], columns_index: usize) -> f32 {
const SEABED_ALTITUDE: f32 = -100.0; const SEABED_ALTITUDE: f32 = -100.0;
// seabed altitude - biggest drop * tiles in a chunk * (chunks in a row - 1) // seabed altitude - biggest drop * tiles in a chunk * (chunks in a row - 1)
const ALTITUDE_BETWEEN_CHUNKS: f32 = SEABED_ALTITUDE - 16.17 * 250.0 * 30.0; const ALTITUDE_BETWEEN_CHUNKS: f32 = SEABED_ALTITUDE - 16.17 * 250.0 * 30.0;
const CHUNK_SIZE: u32 = 1_000;
/// Returns a vertex buffer that should be rendered as `TrianglesList`. /// Returns a vertex buffer that should be rendered as `TrianglesList`.
pub fn load_ground(display: &Display) -> VertexBufferAny { pub fn load_ground(display: &Display) -> VertexBufferAny {
@@ -106,24 +106,21 @@ pub fn load_ground(display: &Display) -> VertexBufferAny {
println!("{}", file_name); println!("{}", file_name);
let file_name_parts: Vec<&str> = file_name.split(' ').collect(); let file_name_parts: Vec<&str> = file_name.split(' ').collect();
const CHUNK_SIZE: u32 = 1_000; let chunk = [0, 1].map(|file_name_parts_index| {
let chunk = [ file_name_parts[file_name_parts_index]
file_name_parts[0].parse::<u32>().unwrap() * CHUNK_SIZE, .parse::<u32>()
file_name_parts[1].parse::<u32>().unwrap() * CHUNK_SIZE, .unwrap()
]; * CHUNK_SIZE
});
// have deleted a few height files to make it work // have deleted a few height files to make it work
let height_contents = fs::read_to_string(&format!( let [height_contents, biomes_contents] =
"Extensions/LemnosLife/Map/Altis/Ground/{}.height", [["Ground", "height"], ["Biomes", "biomes"]].map(|[folder, extension]| {
file_name fs::read_to_string(&format!(
"Extensions/LemnosLife/Map/Altis/{folder}/{file_name}.{extension}"
)) ))
.expect("Unable to load ground file!"); .expect(&format!("Unable to load {} file!", extension))
});
let biomes_contents = fs::read_to_string(&format!(
"Extensions/LemnosLife/Map/Altis/Biomes/{}.biomes",
file_name
))
.expect("Unable to load biomes file!");
let height_lines: Vec<&str> = height_contents.split('\n').rev().collect(); let height_lines: Vec<&str> = height_contents.split('\n').rev().collect();
@@ -132,28 +129,22 @@ pub fn load_ground(display: &Display) -> VertexBufferAny {
let mut index: u32 = 0; let mut index: u32 = 0;
for lines_index in 0..height_lines.len() - 1 { for lines_index in 0..height_lines.len() - 1 {
let height_line = height_lines[lines_index]; let [height_columns, height_next_columns]: [Vec<&str>; 2] =
let height_next_line = height_lines[lines_index + 1]; [height_lines[lines_index], height_lines[lines_index + 1]]
let height_columns_split: Split<char> = height_line.split(' '); .map(|height_line| height_line.split(' '))
let height_next_columns_split: Split<char> = height_next_line.split(' '); .map(|height_columns_split| {
let (height_columns, height_next_columns): (Vec<&str>, Vec<&str>) =
if lines_index % 2 == 0 { if lines_index % 2 == 0 {
( height_columns_split.collect()
height_columns_split.collect(),
height_next_columns_split.collect(),
)
} else { } else {
( height_columns_split.rev().collect()
height_columns_split.rev().collect(), }
height_next_columns_split.rev().collect(), });
)
};
let biomes_line = biomes_lines[lines_index / 2]; let biomes_line = biomes_lines[lines_index / 2];
for columns_index in 0..height_columns.len() { for columns_index in 0..height_columns.len() {
let column = get_altitude(&height_columns, columns_index); let [column, column_below]: [f32; 2] = [&height_columns, &height_next_columns]
let column_below = get_altitude(&height_next_columns, columns_index); .map(|height_columns| get_altitude(&height_columns, columns_index));
let biome_index = if lines_index % 2 == 0 { let biome_index = if lines_index % 2 == 0 {
columns_index columns_index
@@ -163,37 +154,28 @@ pub fn load_ground(display: &Display) -> VertexBufferAny {
let biome = get_biome(biomes_line, biome_index); let biome = get_biome(biomes_line, biome_index);
if lines_index == 0 && columns_index == 0 { if lines_index == 0 && columns_index == 0 {
// This vertex defines the end of the wall below the ground. // These vertexes respectively define the end of the wall below the ground and make the cursor ready to be used.
[ALTITUDE_BETWEEN_CHUNKS, column]
.into_iter()
.for_each(|altitude| {
vertex_data.push(Vertex { vertex_data.push(Vertex {
altitude: ALTITUDE_BETWEEN_CHUNKS, altitude,
index,
biome,
chunk,
});
// This vertex defines the cursor ready to be used.
vertex_data.push(Vertex {
altitude: column,
index, index,
biome, biome,
chunk, chunk,
})
}); });
} }
[column, column_below].into_iter().for_each(|altitude| {
vertex_data.push(Vertex { vertex_data.push(Vertex {
altitude: column, altitude,
index, index,
biome, biome,
chunk, chunk,
}); });
index += 1; index += 1
vertex_data.push(Vertex {
altitude: column_below,
index,
biome,
chunk,
}); });
index += 1;
} }
} }
// This vertex remove the wall across the chunks above the ground. // This vertex remove the wall across the chunks above the ground.