+use bevy::prelude::*;
+
+pub struct CameraCfg;
+
+#[derive(Component)]
+pub struct MainCamera;
+
+//#[derive(Event)]
+//pub struct PanCamera(pub Vec2);
+//#[derive(Event)]
+//pub struct ZoomCamera(pub f32);
+//#[derive(Event)]
+//pub struct RotateCamera(pub f32);
+
+#[derive(Event)]
+pub enum MoveCamera {
+ Pan(Vec2),
+ Zoom(f32),
+ Rotate(f32),
+ Center(Vec2),
+ Reset,
+}
+
+impl Plugin for CameraCfg {
+ fn build(&self, app: &mut App) {
+ //app.add_event::<PanCamera>();
+ //app.add_event::<ZoomCamera>();
+ //app.add_event::<RotateCamera>();
+ app.add_event::<MoveCamera>();
+ app.add_systems(Startup, setup);
+ app.add_systems(Update, (
+ move_camera.run_if(on_event::<MoveCamera>()),
+ //pan_camera.run_if(on_event::<PanCamera>()),
+ //zoom_camera.run_if(on_event::<ZoomCamera>()),
+ //rotate_camera.run_if(on_event::<RotateCamera>()),
+ ));
+ }
+}
+
+fn setup(
+ mut commands: Commands,
+) {
+ commands.spawn((Camera2dBundle::default(), MainCamera));
+}
+
+fn move_camera(
+ mut e_read: EventReader<MoveCamera>,
+ mut camera: Query<(&mut Transform, &mut OrthographicProjection), With<MainCamera>>
+) {
+ let Ok((mut trans, mut proj)) = camera.get_single_mut() else { return; };
+ let z = trans.translation.z;
+ for mov in e_read.read() {
+ match mov {
+ MoveCamera::Pan(p) => {
+ let r = trans.rotation.mul_vec3(Vec3::from((*p * proj.scale, z)));
+ trans.translation += r;
+ },
+ MoveCamera::Zoom(z) => proj.scale += z * proj.scale,
+ MoveCamera::Rotate(th) => trans.rotation *= Quat::from_rotation_z(*th),
+ MoveCamera::Center(p) => trans.translation = Vec3::from((*p, z)),
+ MoveCamera::Reset => {
+ trans.translation = Vec3::from((Vec2::ZERO, z));
+ trans.rotation = Quat::from_rotation_z(0.0);
+ proj.scale = 1.0;
+ },
+ }
+ }
+}
+
+//fn pan_camera(
+// mut e_read: EventReader<PanCamera>,
+// mut camera: Query<&mut Transform, With<MainCamera>>
+//) {
+// let Ok(mut camera) = camera.get_single_mut() else { return; };
+// let z = camera.translation.z;
+// for PanCamera(p) in e_read.read() {
+// camera.translation += Vec3::from((*p, z));
+// }
+//}
+//
+//fn zoom_camera(
+// mut e_read: EventReader<ZoomCamera>,
+// mut camera: Query<&mut OrthographicProjection, With<MainCamera>>
+//) {
+// //use bevy::render::camera::ScalingMode;
+// let Ok(mut camera) = camera.get_single_mut() else { return; };
+// for ZoomCamera(z) in e_read.read() {
+// camera.scale += z;
+// }
+//}
+//
+//fn rotate_camera(
+// mut e_read: EventReader<RotateCamera>,
+// mut camera: Query<&mut Transform, With<MainCamera>>
+//) {
+// let Ok(mut camera) = camera.get_single_mut() else { return; };
+// for RotateCamera(th) in e_read.read() {
+// camera.rotation *= Quat::from_rotation_z(*th);
+// }
+//}