Compare commits

..

No commits in common. '09f8c2a49dc117ce1ca07f6c982bb78692860fc4' and 'ef52c604d1a0f615949e62018a8aa24a6ff3265b' have entirely different histories.

3639
Cargo.lock generated

File diff suppressed because it is too large Load Diff

@ -6,9 +6,3 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
bevy = "0.11.0"
# Enable high optimizations for dependencies (incl. Bevy), but not for our code:
[profile.dev.package."*"]
opt-level = 3

@ -1,145 +1,4 @@
use bevy::{
prelude::*,
diagnostic::{FrameTimeDiagnosticsPlugin, DiagnosticsStore},
window::{PresentMode, WindowTheme},
sprite::MaterialMesh2dBundle};
use std::time::Instant;
mod neural_net;
#[derive(Component)]
struct Agent;
#[derive(Component)]
struct FpsText;
#[derive(Resource)]
struct SimulationState
{
generation: i32,
generation_step: i32,
max_gen_steps: i32,
last_step_time: f32,
last_gen_time: f32,
}
impl SimulationState
{
fn new(steps_per_gen: i32) -> SimulationState
{
SimulationState { generation: (1), generation_step: (0), max_gen_steps: steps_per_gen, last_step_time: 0.0, last_gen_time: 0.0 }
}
}
fn main()
{
App::new()
.add_plugins((
DefaultPlugins.set(WindowPlugin {
primary_window: Some(Window {
title: "Life Sim".into(),
resolution: (1280., 720.).into(),
present_mode: PresentMode::AutoVsync,
// Tells wasm to resize the window according to the available canvas
fit_canvas_to_parent: true,
// Tells wasm not to override default event handling, like F5, Ctrl+R etc.
prevent_default_event_handling: false,
window_theme: Some(WindowTheme::Dark),
..default()
}),
..default()
}),
FrameTimeDiagnosticsPlugin
))
.insert_resource(SimulationState::new(200))
.insert_resource(Time::new(Instant::now()))
.add_systems(Startup, setup)
.add_systems(Update, (tick_simulation, ui_update))
.run();
}
fn setup(mut commands: Commands, mut meshes: ResMut<Assets<Mesh>>, mut materials: ResMut<Assets<ColorMaterial>>)
{
// Camera
commands.spawn(Camera2dBundle::default());
// Circle
commands.spawn((
MaterialMesh2dBundle {
mesh: meshes.add(shape::Circle::new(50.).into()).into(),
material: materials.add(ColorMaterial::from(Color::PURPLE)),
transform: Transform::from_translation(Vec3::new(-150., 0., 0.)),
..default()
},
Agent
));
// UI
// Text with multiple sections
commands.spawn((
// Create a TextBundle that has a Text with a list of sections.
TextBundle::from_sections([
TextSection::new(
"FPS: ",
TextStyle {
font_size: 60.0,
color: Color::WHITE,
..default()
},
),
TextSection::from_style(TextStyle {
font_size: 60.0,
color: Color::GOLD,
..default()
}),
]),
FpsText,
));
}
fn tick_simulation(mut state: ResMut<SimulationState>, delta_time: Res<Time>, mut query: Query<&mut Transform, With<Agent>>)
{
let now = Instant::now();
// Update neural net inputs
// Tick the neural net
// Process agent actions
let mut agent_transform = query.single_mut();
agent_transform.translation.x += 50.0 * delta_time.delta_seconds();
let elapsed_time = now.elapsed();
state.last_gen_time += state.last_step_time;
state.last_step_time = elapsed_time.as_secs_f32();
state.generation_step += 1;
if state.generation_step >= state.max_gen_steps
{
// Move on to the next generation
state.generation += 1;
}
}
fn ui_update(mut state: Res<SimulationState>, diagnostics: Res<DiagnosticsStore>, mut query: Query<&mut Text, With<FpsText>>)
{
for mut text in &mut query
{
if let Some(fps) = diagnostics.get(FrameTimeDiagnosticsPlugin::FPS)
{
if let Some(value) = fps.smoothed()
{
// Update the value of the second section
text.sections[1].value = format!("{value:.2}");
}
}
}
println!("Hello, world!");
}

@ -1,7 +0,0 @@
pub enum InputNeuron
{
Position((i32, i32)), // Position on the world grid
Age(i32), // Age is the number of steps since the start of the generation
}
Loading…
Cancel
Save