Add terrain contours toggle
This commit is contained in:
parent
92f25cf159
commit
1d673203db
3 changed files with 85 additions and 6 deletions
|
@ -2,6 +2,7 @@
|
||||||
name = "worlds-sim-rust"
|
name = "worlds-sim-rust"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
resolver = "2"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
debug = ["save/debug"]
|
debug = ["save/debug"]
|
||||||
|
|
|
@ -18,6 +18,8 @@ pub struct WorldManager {
|
||||||
rainfall_visible: bool,
|
rainfall_visible: bool,
|
||||||
#[cfg(feature = "render")]
|
#[cfg(feature = "render")]
|
||||||
temperature_visible: bool,
|
temperature_visible: bool,
|
||||||
|
#[cfg(feature = "render")]
|
||||||
|
terrain_as_contours: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WorldManager {
|
impl WorldManager {
|
||||||
|
@ -28,6 +30,7 @@ impl WorldManager {
|
||||||
world: None,
|
world: None,
|
||||||
rainfall_visible: false,
|
rainfall_visible: false,
|
||||||
temperature_visible: false,
|
temperature_visible: false,
|
||||||
|
terrain_as_contours: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,6 +54,16 @@ impl WorldManager {
|
||||||
self.temperature_visible = !self.temperature_visible;
|
self.temperature_visible = !self.temperature_visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "render")]
|
||||||
|
pub fn toggle_contours(&mut self) {
|
||||||
|
if self.terrain_as_contours {
|
||||||
|
debug!("Turning terrain contours off");
|
||||||
|
} else {
|
||||||
|
debug!("Turning terrain contours on");
|
||||||
|
}
|
||||||
|
self.terrain_as_contours = !self.terrain_as_contours;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_world(&self) -> Option<&World> {
|
pub fn get_world(&self) -> Option<&World> {
|
||||||
self.world.as_ref()
|
self.world.as_ref()
|
||||||
}
|
}
|
||||||
|
@ -65,7 +78,11 @@ impl WorldManager {
|
||||||
|
|
||||||
#[cfg(feature = "render")]
|
#[cfg(feature = "render")]
|
||||||
fn generate_color(&self, cell: &TerrainCell) -> Color {
|
fn generate_color(&self, cell: &TerrainCell) -> Color {
|
||||||
let mut final_color = Self::altitude_color(cell.altitude);
|
let mut final_color = if self.terrain_as_contours {
|
||||||
|
Self::altitude_contour_color(cell.altitude)
|
||||||
|
} else {
|
||||||
|
Self::altitude_color(cell.altitude)
|
||||||
|
};
|
||||||
|
|
||||||
if self.rainfall_visible {
|
if self.rainfall_visible {
|
||||||
let rainfall_color = Self::rainfall_color(cell.rainfall);
|
let rainfall_color = Self::rainfall_color(cell.rainfall);
|
||||||
|
@ -106,7 +123,6 @@ impl WorldManager {
|
||||||
final_color
|
final_color
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
#[cfg(feature = "render")]
|
#[cfg(feature = "render")]
|
||||||
fn altitude_color(altitude: f32) -> Color {
|
fn altitude_color(altitude: f32) -> Color {
|
||||||
if altitude < 0.0 {
|
if altitude < 0.0 {
|
||||||
|
@ -117,7 +133,6 @@ impl WorldManager {
|
||||||
Color::rgb(0.58 * mult, 0.29 * mult, 0.0)
|
Color::rgb(0.58 * mult, 0.29 * mult, 0.0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
#[cfg(feature = "render")]
|
#[cfg(feature = "render")]
|
||||||
fn altitude_contour_color(altitude: f32) -> Color {
|
fn altitude_contour_color(altitude: f32) -> Color {
|
||||||
|
|
69
src/main.rs
69
src/main.rs
|
@ -85,6 +85,10 @@ struct RainfallButton;
|
||||||
#[derive(Component, Default)]
|
#[derive(Component, Default)]
|
||||||
struct TemperatureButton;
|
struct TemperatureButton;
|
||||||
|
|
||||||
|
#[cfg(feature = "render")]
|
||||||
|
#[derive(Component, Default)]
|
||||||
|
struct ContoursButton;
|
||||||
|
|
||||||
const NORMAL_BUTTON: Color = Color::rgb(0.15, 0.15, 0.15);
|
const NORMAL_BUTTON: Color = Color::rgb(0.15, 0.15, 0.15);
|
||||||
const HOVERED_BUTTON: Color = Color::rgb(0.25, 0.25, 0.25);
|
const HOVERED_BUTTON: Color = Color::rgb(0.25, 0.25, 0.25);
|
||||||
const PRESSED_BUTTON: Color = Color::rgb(0.35, 0.60, 0.35);
|
const PRESSED_BUTTON: Color = Color::rgb(0.35, 0.60, 0.35);
|
||||||
|
@ -154,6 +158,39 @@ fn handle_temperature_button(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "render")]
|
||||||
|
fn handle_contours_button(
|
||||||
|
mut interaction_query: Query<
|
||||||
|
'_,
|
||||||
|
'_,
|
||||||
|
(&Interaction, &mut UiColor),
|
||||||
|
(Changed<Interaction>, With<ContoursButton>),
|
||||||
|
>,
|
||||||
|
mut windows: ResMut<'_, Windows>,
|
||||||
|
mut images: ResMut<'_, Assets<Image>>,
|
||||||
|
mut world_manager: ResMut<'_, WorldManager>,
|
||||||
|
) {
|
||||||
|
for (interaction, mut color) in &mut interaction_query {
|
||||||
|
match *interaction {
|
||||||
|
Interaction::Clicked => {
|
||||||
|
windows.primary_mut().set_cursor_icon(CursorIcon::Default);
|
||||||
|
*color = PRESSED_BUTTON.into();
|
||||||
|
debug!("Toggling contours");
|
||||||
|
world_manager.toggle_contours();
|
||||||
|
refresh_world_texture(&mut images, &world_manager)
|
||||||
|
}
|
||||||
|
Interaction::Hovered => {
|
||||||
|
windows.primary_mut().set_cursor_icon(CursorIcon::Hand);
|
||||||
|
*color = HOVERED_BUTTON.into();
|
||||||
|
}
|
||||||
|
Interaction::None => {
|
||||||
|
windows.primary_mut().set_cursor_icon(CursorIcon::Default);
|
||||||
|
*color = NORMAL_BUTTON.into();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(feature = "render")]
|
#[cfg(feature = "render")]
|
||||||
fn generate_graphics(
|
fn generate_graphics(
|
||||||
mut commands: Commands<'_, '_>,
|
mut commands: Commands<'_, '_>,
|
||||||
|
@ -256,6 +293,31 @@ fn generate_graphics(
|
||||||
..default()
|
..default()
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
_ = button_box
|
||||||
|
.spawn_bundle(ButtonBundle {
|
||||||
|
button: Button,
|
||||||
|
style: Style {
|
||||||
|
align_items: AlignItems::Center,
|
||||||
|
justify_content: JustifyContent::Center,
|
||||||
|
..default()
|
||||||
|
},
|
||||||
|
color: NORMAL_BUTTON.into(),
|
||||||
|
..default()
|
||||||
|
})
|
||||||
|
.insert(ContoursButton::default())
|
||||||
|
.with_children(|button| {
|
||||||
|
_ = button.spawn_bundle(TextBundle {
|
||||||
|
text: bevy::text::Text::from_section(
|
||||||
|
"Toggle contours",
|
||||||
|
bevy::text::TextStyle {
|
||||||
|
font: asset_server.load("JuliaMono.ttf"),
|
||||||
|
font_size: 20.0,
|
||||||
|
color: Color::WHITE,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
..default()
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -272,15 +334,16 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
// Use nearest-neighbor rendering for cripsier pixels
|
// Use nearest-neighbor rendering for cripsier pixels
|
||||||
.insert_resource(ImageSettings::default_nearest())
|
.insert_resource(ImageSettings::default_nearest())
|
||||||
.insert_resource(WindowDescriptor {
|
.insert_resource(WindowDescriptor {
|
||||||
width: world.width as f32,
|
width: (2 * world.width) as f32,
|
||||||
height: world.height as f32,
|
height: (2 * world.height) as f32,
|
||||||
title: String::from("World-RS"),
|
title: String::from("World-RS"),
|
||||||
resizable: true,
|
resizable: true,
|
||||||
..default()
|
..default()
|
||||||
})
|
})
|
||||||
.add_startup_system(generate_graphics)
|
.add_startup_system(generate_graphics)
|
||||||
.add_system(handle_rainfall_button)
|
.add_system(handle_rainfall_button)
|
||||||
.add_system(handle_temperature_button);
|
.add_system(handle_temperature_button)
|
||||||
|
.add_system(handle_contours_button);
|
||||||
}
|
}
|
||||||
#[cfg(not(feature = "render"))]
|
#[cfg(not(feature = "render"))]
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue