diff --git a/assets/ui/camera.png b/assets/ui/camera.png new file mode 100644 index 0000000..9fa8c5a Binary files /dev/null and b/assets/ui/camera.png differ diff --git a/src/camera.rs b/src/camera.rs index 103ebf4..4ad8fff 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -17,8 +17,12 @@ pub struct CameraRotation(pub f32); #[reflect(Resource)] pub struct CameraState { pub cutscene: bool, + pub look_around: bool, } +#[derive(Component, Reflect, Debug, Default)] +struct CameraUi; + #[derive(Component, Reflect, Debug)] #[reflect(Component)] pub struct MainCamera { @@ -40,7 +44,16 @@ pub fn plugin(app: &mut App) { app.init_resource::(); app.add_systems(Startup, startup); - app.add_systems(Update, (update, rotate_view_keyboard, rotate_view_gamepad)); + app.add_systems( + Update, + ( + update, + update_ui, + update_look_around, + rotate_view_keyboard, + rotate_view_gamepad, + ), + ); } fn startup(mut commands: Commands) { @@ -51,6 +64,54 @@ fn startup(mut commands: Commands) { )); } +fn update_look_around(controls: Res, mut cam_state: ResMut) { + let look_around = + controls.keyboard_state.view_mode || controls.gamepad_state.map_or(false, |g| g.view_mode); + + if look_around != cam_state.look_around { + cam_state.look_around = look_around; + } +} + +fn update_ui( + mut commands: Commands, + cam_state: Res, + asset_server: Res, + query: Query>, +) { + if cam_state.is_changed() { + let show_ui = cam_state.look_around || cam_state.cutscene; + + if show_ui { + let image = asset_server.load("ui/camera.png"); + + commands + .spawn(( + CameraUi, + Node { + margin: UiRect::top(Val::Px(20.)) + .with_left(Val::Auto) + .with_right(Val::Auto), + justify_content: JustifyContent::Center, + ..default() + }, + )) + .with_child(( + Node { + display: Display::Block, + position_type: PositionType::Absolute, + ..default() + }, + ImageNode::new(image), + )); + } else { + for entity in query.iter() { + commands.entity(entity).despawn_recursive(); + } + } + } +} + fn update( mut cam: Query< (&MainCamera, &mut Transform, &CameraRotation),