Guest User

Untitled

a guest
Jan 28th, 2023
15
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 7.80 KB | None | 0 0
  1. #![windows_subsystem = "windows"]
  2.  
  3. use bevy::prelude::*;
  4.  
  5. #[derive(Resource)]
  6. struct Screen {
  7.     size: Vec2,
  8. }
  9.  
  10. #[derive(Component, Default)]
  11. struct Velocity {
  12.     vector: Vec2,
  13. }
  14.  
  15. #[derive(Component, Default)]
  16. struct Grabber {
  17.     previous_cursor_position: Vec2,
  18. }
  19.  
  20. fn main() {
  21.     App::new()
  22.         .add_plugins(DefaultPlugins.set(WindowPlugin {
  23.             // TODO: Add always on top
  24.             window: WindowDescriptor {
  25.                 title: "Gorgeous Window".to_owned(),
  26.                 width: 128.0,
  27.                 height: 128.0,
  28.                 position: WindowPosition::Centered,
  29.                 decorations: false,
  30.                 transparent: true,
  31.                 ..default()
  32.             },
  33.             ..default()
  34.         }))
  35.         .add_startup_system(startup)
  36.         .add_system(update)
  37.         //.add_system(update_camera.after(update))
  38.         .run();
  39. }
  40.  
  41. fn startup(
  42.     mut commands: Commands,
  43.     mut windows: ResMut<Windows>,
  44.     asset_server: Res<AssetServer>,
  45.     assets: Res<Assets<Image>>,
  46. ) {
  47.     // Get texture's handle
  48.     let texture_handle = asset_server.load("cube.png");
  49.     // Get window
  50.     let window = windows.primary_mut();
  51.     if let Some(image) = assets.get(&texture_handle) {
  52.         window.set_resolution(image.size().x, image.size().y);
  53.     }
  54.     let window_position = window.position().unwrap().as_vec2();
  55.     let window_center = Vec2 {
  56.         x: window_position.x + window.width() * 0.5,
  57.         y: window_position.y + window.height() * 0.5,
  58.     };
  59.     // Calculate screen size
  60.     commands.insert_resource(Screen {
  61.         size: window_center * 2.0,
  62.     });
  63.     // Create an entity and set its position to window's position
  64.     commands
  65.         .spawn((
  66.             SpriteBundle {
  67.                 transform: Transform::from_xyz(window_center.x, window_center.y, 0.0),
  68.                 texture: texture_handle,
  69.                 ..default()
  70.             },
  71.             Velocity::default(),
  72.             Grabber::default(),
  73.         ))
  74.         .with_children(|parent| {
  75.             parent.spawn(
  76.                 // Change camera's clear color to transparent
  77.                 Camera2dBundle {
  78.                     camera_2d: Camera2d {
  79.                         clear_color: bevy::core_pipeline::clear_color::ClearColorConfig::None,
  80.                     },
  81.                     transform: Transform::from_xyz(0.0, 0.0, 1.0),
  82.                     ..default()
  83.                 },
  84.             );
  85.         });
  86. }
  87.  
  88. /* fn update_camera(mut query: Query<&mut Camera2d>) {
  89.     for mut camera in query.iter_mut() {
  90.         match camera.clear_color {
  91.             ClearColorConfig::Default => {
  92.                 camera.clear_color = ClearColorConfig::None;
  93.                 break;
  94.             }
  95.             ClearColorConfig::None => {
  96.                 camera.clear_color = ClearColorConfig::Default;
  97.                 break;
  98.             }
  99.             _ => {}
  100.         }
  101.     }
  102. } */
  103.  
  104. fn update(
  105.     mut query: Query<(&mut Transform, &mut Velocity, &mut Grabber)>,
  106.     // mut query_camera: Query<&mut Transform, With<Camera2d>>,
  107.     mut windows: ResMut<Windows>,
  108.     screen: Res<Screen>,
  109.     mouse_buttons: Res<Input<MouseButton>>,
  110.     time: Res<Time>,
  111. ) {
  112.     let delta = time.delta_seconds();
  113.     let drag_force = 500.0;
  114.     let throw_force = 10.0;
  115.     let friction_force = 2000.0;
  116.     let push_force = 2000.0;
  117.     let lerp_force = 10.0;
  118.     // Window
  119.     let window = windows.primary_mut();
  120.     let window_position = window.position().unwrap().as_vec2();
  121.     let window_rect = Rect::new(
  122.         window_position.x,
  123.         window_position.y,
  124.         window_position.x + window.width(),
  125.         window_position.y + window.height(),
  126.     );
  127.     for (mut transform, mut velocity, mut grabber) in query.iter_mut() {
  128.         // Cursor position
  129.         let mut cursor_position: Vec2;
  130.         if window.cursor_position().is_some() {
  131.             cursor_position = window.cursor_position().unwrap();
  132.             cursor_position.y = window_rect.height() - cursor_position.y;
  133.         } else {
  134.             cursor_position = grabber.previous_cursor_position;
  135.         }
  136.         // Window position delta
  137.         let cursor_delta = cursor_position - grabber.previous_cursor_position;
  138.         grabber.previous_cursor_position = cursor_position;
  139.         // Grab start
  140.         if mouse_buttons.just_pressed(MouseButton::Left) {
  141.             velocity.vector = Vec2::ZERO;
  142.         }
  143.         // Grab process, moving window
  144.         if mouse_buttons.pressed(MouseButton::Left) {
  145.             transform.translation += Vec3 {
  146.                 x: cursor_delta.x,
  147.                 y: cursor_delta.y,
  148.                 z: 0.0,
  149.             } * drag_force
  150.                 * delta
  151.         }
  152.         // Grab end
  153.         if mouse_buttons.just_released(MouseButton::Left) {
  154.             // Throw
  155.             let heading = cursor_delta.normalize();
  156.             velocity.vector += heading * cursor_delta.length() * throw_force;
  157.         }
  158.         // Push window towards screen if it's out of bounds
  159.         if window_rect.max.x > screen.size.x
  160.             || window_rect.min.x < 0.0
  161.             || window_rect.max.y > screen.size.y
  162.             || window_rect.min.y < 0.0
  163.         {
  164.             let to_screen_center = screen.size * 0.5 - window_rect.center();
  165.             velocity.vector += to_screen_center.normalize() * push_force * delta;
  166.         // Move velocity towards zero
  167.         } else
  168.         /* if velocity.vector != Vec2::ZERO */
  169.         {
  170.             velocity.vector = move_towards(velocity.vector, Vec2::ZERO, friction_force * delta);
  171.             // velocity.vector.lerp(Vec2::ZERO, friction_force * delta);
  172.             /* let strength = friction_force * delta;
  173.             if velocity.vector.x > delta {
  174.                 velocity.vector.x -= strength
  175.             };
  176.             if velocity.vector.x < -delta {
  177.                 velocity.vector.x += strength
  178.             };
  179.             if velocity.vector.y > delta {
  180.                 velocity.vector.y -= strength
  181.             };
  182.             if velocity.vector.y < -delta {
  183.                 velocity.vector.y += strength
  184.             }; */
  185.         }
  186.         // Add velocity to position
  187.         // TODO: Retrieve previous velocity if it's NaN
  188.         if velocity.vector.is_nan() == false {
  189.             transform.translation += Vec3 {
  190.                 x: velocity.vector.x,
  191.                 y: velocity.vector.y,
  192.                 z: 0.0,
  193.             } * delta;
  194.         }
  195.         // Update window position
  196.         let lerp = window_rect.center().lerp(
  197.             Vec2 {
  198.                 x: transform.translation.x,
  199.                 y: transform.translation.y,
  200.             },
  201.             lerp_force * delta,
  202.         );
  203.         window.set_position(
  204.             MonitorSelection::Current,
  205.             IVec2 {
  206.                 x: (lerp.x - window_rect.half_size().x) as i32,
  207.                 y: (lerp.y - window_rect.half_size().y) as i32,
  208.             },
  209.         );
  210.         /* for mut camera in query_camera.iter_mut() {
  211.             camera.translation = Vec3 {
  212.                 x: window_rect.center().x,
  213.                 y: window_rect.center().y,
  214.                 z: 1.0,
  215.             }
  216.         } */
  217.         // Debug info
  218.         // println!("\x1B[2J\x1B[1;1H"); // Clears console
  219.         // println!("Screen size: {}", screen.size);
  220.         // println!("Window position: {}", window_rect.center());
  221.         // println!("Cursor position: {}", cursor_position);
  222.         // println!("Translation: {}", transform.translation);
  223.         // println!("Velocity: {}", velocity.vector);
  224.     }
  225. }
  226.  
  227. fn move_towards(current: Vec2, target: Vec2, delta: f32) -> Vec2 {
  228.     let vector = target - current;
  229.     let magnitude = vector.length();
  230.     if magnitude <= delta || magnitude == 0.0 {
  231.         return target;
  232.     }
  233.     current + vector / magnitude * delta
  234. }
  235.  
Advertisement
Add Comment
Please, Sign In to add comment