Skip to content

Commit

Permalink
raise up world
Browse files Browse the repository at this point in the history
  • Loading branch information
Stephen D committed Oct 24, 2024
1 parent e5dba4d commit 9f52148
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 22 deletions.
3 changes: 3 additions & 0 deletions src/block_definitions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ impl Block {
107 => "dark_oak_door",
108 => "potatoes",
109 => "wheat",
110 => "bedrock",
_ => panic!("Invalid id"),
}
}
Expand Down Expand Up @@ -291,6 +292,8 @@ pub const DARK_OAK_DOOR_UPPER: Block = Block::new(107);
pub const POTATOES: Block = Block::new(108);
pub const WHEAT: Block = Block::new(109);

pub const BEDROCK: Block = Block::new(110);

// Variations for building corners
pub fn building_corner_variations() -> Vec<Block> {
vec![
Expand Down
67 changes: 45 additions & 22 deletions src/data_processing.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::args::Args;
use crate::block_definitions::{DIRT, GRASS_BLOCK};
use crate::block_definitions::{BEDROCK, DIRT, GRASS_BLOCK, STONE};
use crate::element_processing::*;
use crate::osm_parser::ProcessedElement;
use crate::world_editor::WorldEditor;
Expand All @@ -10,6 +10,10 @@ use std::fs;
use std::io::Write;
use std::path::Path;

const MIN_Y: i32 = -64;
const MAX_Y: i32 = 256;
const GROUND_LEVEL: i32 = 65;

pub fn generate_world(
elements: Vec<ProcessedElement>,
args: &Args,
Expand All @@ -20,7 +24,6 @@ pub fn generate_world(

let region_template_path: &str = "region.template";
let region_dir: String = format!("{}/region", args.path);
let ground_level: i32 = -62;

// Check if the region.template file exists, and download if necessary
if !Path::new(region_template_path).exists() {
Expand Down Expand Up @@ -61,91 +64,91 @@ pub fn generate_world(
buildings::generate_buildings(
&mut editor,
way,
ground_level,
GROUND_LEVEL,
args.timeout.as_ref(),
);
} else if way.tags.contains_key("highway") {
highways::generate_highways(
&mut editor,
element,
ground_level,
GROUND_LEVEL,
args.timeout.as_ref(),
);
} else if way.tags.contains_key("landuse") {
landuse::generate_landuse(
&mut editor,
way,
ground_level,
GROUND_LEVEL,
args.timeout.as_ref(),
);
} else if way.tags.contains_key("natural") {
natural::generate_natural(
&mut editor,
element,
ground_level,
GROUND_LEVEL,
args.timeout.as_ref(),
);
} else if way.tags.contains_key("amenity") {
amenities::generate_amenities(
&mut editor,
element,
ground_level,
GROUND_LEVEL,
args.timeout.as_ref(),
);
} else if way.tags.contains_key("leisure") {
leisure::generate_leisure(
&mut editor,
way,
ground_level,
GROUND_LEVEL,
args.timeout.as_ref(),
);
} else if way.tags.contains_key("barrier") {
barriers::generate_barriers(&mut editor, element, ground_level);
barriers::generate_barriers(&mut editor, element, GROUND_LEVEL);
} else if way.tags.contains_key("waterway") {
waterways::generate_waterways(&mut editor, way, ground_level);
waterways::generate_waterways(&mut editor, way, GROUND_LEVEL);
} else if way.tags.contains_key("bridge") {
bridges::generate_bridges(&mut editor, way, ground_level);
bridges::generate_bridges(&mut editor, way, GROUND_LEVEL);
} else if way.tags.contains_key("railway") {
railways::generate_railways(&mut editor, way, ground_level);
railways::generate_railways(&mut editor, way, GROUND_LEVEL);
} else if way.tags.get("service") == Some(&"siding".to_string()) {
highways::generate_siding(&mut editor, way, ground_level);
highways::generate_siding(&mut editor, way, GROUND_LEVEL);
}
}
ProcessedElement::Node(node) => {
if node.tags.contains_key("door") || node.tags.contains_key("entrance") {
doors::generate_doors(&mut editor, node, ground_level);
doors::generate_doors(&mut editor, node, GROUND_LEVEL);
} else if node.tags.contains_key("natural")
&& node.tags.get("natural") == Some(&"tree".to_string())
{
natural::generate_natural(
&mut editor,
element,
ground_level,
GROUND_LEVEL,
args.timeout.as_ref(),
);
} else if node.tags.contains_key("amenity") {
amenities::generate_amenities(
&mut editor,
element,
ground_level,
GROUND_LEVEL,
args.timeout.as_ref(),
);
} else if node.tags.contains_key("barrier") {
barriers::generate_barriers(&mut editor, element, ground_level);
barriers::generate_barriers(&mut editor, element, GROUND_LEVEL);
} else if node.tags.contains_key("highway") {
highways::generate_highways(
&mut editor,
element,
ground_level,
GROUND_LEVEL,
args.timeout.as_ref(),
);
} else if node.tags.contains_key("tourism") {
tourisms::generate_tourisms(&mut editor, node, ground_level);
tourisms::generate_tourisms(&mut editor, node, GROUND_LEVEL);
}
}
ProcessedElement::Relation(rel) => {
if rel.tags.contains_key("water") {
water_areas::generate_water_areas(&mut editor, rel, ground_level);
water_areas::generate_water_areas(&mut editor, rel, GROUND_LEVEL);
}
}
}
Expand All @@ -171,8 +174,28 @@ pub fn generate_world(

for x in 0..=(scale_factor_x as i32) {
for z in 0..=(scale_factor_z as i32) {
editor.set_block(GRASS_BLOCK, x, ground_level, z, None, None);
editor.set_block(DIRT, x, ground_level - 1, z, None, None);
// Use the smaller of [current block y, ground level y]
let max_y = (MIN_Y..MAX_Y)
.filter(|y| editor.block_at(x, *y, z))
.next()
.unwrap_or(MAX_Y)
.min(GROUND_LEVEL);

// 1 layer of grass
editor.set_block(GRASS_BLOCK, x, max_y, z, None, None);

// 3 layers of dirt
for y in (max_y - 3)..max_y {
editor.set_block(DIRT, x, y, z, None, None);
}

// n - 1 layers of stone
for y in (MIN_Y + 1)..(max_y - 3) {
editor.set_block(STONE, x, y, z, None, None);
}

// 1 layer of bedrock
editor.set_block(BEDROCK, x, MIN_Y, z, None, None);

block_counter += 1;
if block_counter % batch_size == 0 {
Expand Down
4 changes: 4 additions & 0 deletions src/world_editor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,10 @@ impl<'a> WorldEditor<'a> {
(self.scale_factor_x as i32, self.scale_factor_x as i32)
}

pub fn block_at(&self, x: i32, y: i32, z: i32) -> bool {
self.world.get_block(x, y, z).is_some()
}

/// Sets a block of the specified type at the given coordinates.
pub fn set_block(
&mut self,
Expand Down

0 comments on commit 9f52148

Please sign in to comment.