pub mod inspector;
pub mod mesh;
pub mod sculpt;
pub mod toolbar;
use std::collections::HashSet;
use bevy::prelude::*;
use crate::EditorMeta;
pub use toolbar::TerrainToolbar;
pub struct TerrainPlugin;
impl Plugin for TerrainPlugin {
fn build(&self, app: &mut App) {
app.register_type_data::<jackdaw_jsn::Terrain, crate::ReflectEditorMeta>();
app.init_resource::<TerrainEditMode>()
.init_resource::<TerrainBrushSettings>()
.init_resource::<TerrainSculptState>()
.add_systems(
Update,
ensure_terrain_dirty_chunks.run_if(in_state(crate::AppState::Editor)),
)
.add_plugins((
mesh::plugin,
sculpt::plugin,
toolbar::plugin,
inspector::plugin,
));
}
}
fn ensure_terrain_dirty_chunks(
mut commands: Commands,
terrains: Query<Entity, (With<jackdaw_jsn::Terrain>, Without<TerrainDirtyChunks>)>,
) {
for entity in &terrains {
commands.entity(entity).insert(TerrainDirtyChunks {
rebuild_all: true,
..default()
});
}
}
#[derive(Component)]
pub struct TerrainChunk {
pub terrain_entity: Entity,
pub chunk_x: u32,
pub chunk_z: u32,
}
#[derive(Component, Default)]
pub(crate) struct TerrainDirtyChunks {
pub(crate) dirty: HashSet<(u32, u32)>,
pub(crate) rebuild_all: bool,
}
#[derive(Resource, Default, PartialEq, Eq, Clone, Debug)]
pub enum TerrainEditMode {
#[default]
None,
Sculpt(jackdaw_terrain::SculptTool),
Generate,
}
#[derive(Resource)]
pub struct TerrainBrushSettings {
pub radius: f32,
pub strength: f32,
pub falloff: f32,
}
impl Default for TerrainBrushSettings {
fn default() -> Self {
Self {
radius: 5.0,
strength: 10.0,
falloff: 2.0,
}
}
}
#[derive(Resource, Default)]
pub(crate) struct TerrainSculptState {
pub target: Option<Entity>,
pub active: bool,
pub stroke_snapshot: Vec<f32>,
pub brush_position: Option<Vec2>,
}
pub const CHUNK_SIZE: u32 = 32;
impl EditorMeta for jackdaw_jsn::Terrain {
fn category() -> &'static str {
"Terrain"
}
}
pub fn spawn_terrain_entity(commands: &mut Commands) -> Entity {
commands
.spawn((
Name::new("Terrain"),
Transform::default(),
Visibility::default(),
jackdaw_jsn::Terrain::default(),
TerrainDirtyChunks {
rebuild_all: true,
..default()
},
))
.id()
}