use std::sync::Arc;
use bevy::color::palettes::{css, tailwind};
use bevy::pbr::wireframe::{WireframeConfig, WireframePlugin};
use bevy::prelude::*;
use bevy_cube_marcher::cpu::*;
use bevy_cube_marcher::*;
use fastnoise_lite::FastNoiseLite;
fn main() {
App::new()
.add_plugins((
DefaultPlugins,
WireframePlugin::default(),
bevy_panorbit_camera::PanOrbitCameraPlugin,
CpuMarchingCubesPlugin::<MyComputeSampler, StandardMaterial>::default(),
))
.insert_resource(WireframeConfig {
global: true,
default_color: css::WHITE.into(),
..default()
})
.insert_resource(ChunkGeneratorSettings::<MyComputeSampler>::new(32, 8.0))
.add_systems(Startup, setup)
.run();
}
#[derive(Resource, Clone, Default)]
struct MyComputeSampler {
noise: Arc<FastNoiseLite>,
}
impl CpuChunkComputer for MyComputeSampler {
fn sample(
&self,
coord: UVec3,
chunk_position: IVec3,
settings: &ChunkGeneratorSettings<MyComputeSampler>,
) -> f32 {
let coord = settings.sample_to_position(coord, chunk_position) * 10.0;
self.noise.get_noise_3d(coord.x, coord.y, coord.z)
}
}
fn setup(mut commands: Commands, mut materials: ResMut<Assets<StandardMaterial>>) {
commands.spawn_scene(bsn! {
#Camera
Camera3d
template_value(Transform::from_xyz(4.0, 6.5, 8.0).looking_at(Vec3::ZERO, Vec3::Y))
bevy_panorbit_camera::PanOrbitCamera {
button_orbit: MouseButton::Left,
button_pan: MouseButton::Left,
modifier_pan: Option::Some(KeyCode::ShiftLeft),
reversed_zoom: true,
}
});
commands.spawn_scene(bsn! {
#Light
DirectionalLight { illuminance: 4000.0 }
Transform { rotation: Quat::from_euler(EulerRot::XYZ, -1.9, 0.8, 0.0) }
});
commands.spawn_scene(bsn! {
ChunkLoader::<MyComputeSampler>::new(5)
});
commands.insert_resource(ChunkMaterial::<MyComputeSampler, StandardMaterial>::new(
materials.add(Color::from(tailwind::EMERALD_500)),
));
}