diff --git a/assets/models/customer.glb b/assets/models/customer.glb new file mode 100644 index 0000000..e8137a4 Binary files /dev/null and b/assets/models/customer.glb differ diff --git a/modelling/employee.blend b/modelling/employee.blend index 0809a5d..e8b300b 100644 Binary files a/modelling/employee.blend and b/modelling/employee.blend differ diff --git a/modelling/employee.blend1 b/modelling/employee.blend1 index 442f584..0809a5d 100644 Binary files a/modelling/employee.blend1 and b/modelling/employee.blend1 differ diff --git a/src/main.rs b/src/main.rs index 6606681..6aa196a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,14 +4,42 @@ fn main() { App::new() .add_plugins(DefaultPlugins) .add_systems(Startup, setup) - .add_systems(Update, (handle_click, move_to_target)) + .add_systems( + Update, + (handle_click, move_to_target, fryer_cook, customer_serve), + ) .run(); } +#[derive(PartialEq)] +enum Item { + None, + Burger, +} + +#[derive(Component)] +struct Customer { + order: Item, + served: bool, + range: f32, +} + +#[derive(Component)] +struct Fryer { + range: f32, + speed: f32, +} + +#[derive(Component)] +struct Unit { + move_speed: f32, + height_offset: f32, +} + #[derive(Component)] struct Player { - move_speed: f32, - height_offset: f32, + holding: Item, + progress: f32, } #[derive(Component)] @@ -31,22 +59,7 @@ fn setup( Transform::from_xyz(0.0, 25.0, -25.0).looking_at(Vec3::ZERO, Vec3::Y), )); - // Player - commands.spawn(( - SceneRoot(asset_server.load("models/employee.glb#Scene0")), - //MeshMaterial3d(materials.add(Color::srgb(0.9, 0.83, 0.6))), - Transform::from_xyz(0.0, 1.5, 0.0).with_scale(Vec3::splat(0.5)), - Player { - move_speed: 10.0, - height_offset: 1.5, - }, - MoveTarget { - position: Vec3::new(0.0, 0.0, 0.0), - }, - )); - // Light - commands.insert_resource(AmbientLight { color: Color::WHITE, brightness: 200.0, // Subtle fill light so shadows aren't pitch black @@ -67,27 +80,71 @@ fn setup( )), )); - /*commands.spawn(( - PointLight { - intensity: 1000000.0, - shadows_enabled: true, - ..default() - }, - Transform::from_xyz(0.0, 10.0, 0.0), - ));*/ - // Plane commands.spawn(( Mesh3d(meshes.add(Plane3d::new(Vec3::Y, Vec2::splat(50.0)))), MeshMaterial3d(materials.add(Color::srgb(0.3, 0.5, 0.3))), )); + + // Fryer + commands.spawn(( + Mesh3d(meshes.add(Cuboid::new(2.0, 1.75, 2.0))), + Transform::from_xyz(-10.0, 0.875, 0.0), + MeshMaterial3d(materials.add(Color::srgb(0.1, 0.1, 0.1))), + Fryer { + range: 3.0, + speed: 50.0, + }, + )); + + // Front Counter + commands.spawn(( + Mesh3d(meshes.add(Cuboid::new(2.0, 1.5, 10.0))), + Transform::from_xyz(10.0, 0.75, 0.0), + MeshMaterial3d(materials.add(Color::srgb(0.7, 0.7, 0.7))), + )); + + // Player + commands.spawn(( + SceneRoot(asset_server.load("models/employee.glb#Scene0")), + Transform::from_xyz(0.0, 1.5, 0.0).with_scale(Vec3::splat(0.5)), + Unit { + move_speed: 10.0, + height_offset: 1.5, + }, + Player { + holding: Item::None, + progress: 0.0, + }, + MoveTarget { + position: Vec3::new(0.0, 0.0, 0.0), + }, + )); + + // Customer + commands.spawn(( + SceneRoot(asset_server.load("models/customer.glb#Scene0")), + Transform::from_xyz(20.0, 1.5, 0.0).with_scale(Vec3::splat(0.5)), + Unit { + move_speed: 5.0, + height_offset: 1.5, + }, + Customer { + order: Item::Burger, + served: false, + range: 4.0, + }, + MoveTarget { + position: Vec3::new(12.0, 0.0, 0.0), + }, + )); } fn handle_click( mouse_button: Res>, windows: Query<&Window>, camera_query: Query<(&Camera, &GlobalTransform)>, - mut target_query: Query<&mut MoveTarget>, + mut target_query: Query<&mut MoveTarget, With>, ) { // Guard clause if !mouse_button.just_pressed(MouseButton::Right) { @@ -126,9 +183,9 @@ fn handle_click( } } -fn move_to_target(mut query: Query<(&mut Transform, &MoveTarget, &Player)>, time: Res