use bevy::prelude::*;
use bevy_camera::Viewport;
use serde::{Deserialize, Serialize};
use std::sync::atomic::{AtomicU32, Ordering};
#[derive(Component, Clone, Copy, Hash, Eq, PartialEq, Debug, Serialize, Deserialize)]
pub struct PlotId(pub u64);
impl Default for PlotId {
fn default() -> Self {
static CTR: AtomicU32 = AtomicU32::new(1);
Self(CTR.fetch_add(1, Ordering::Relaxed).into())
}
}
impl PlotId {
pub fn new() -> Self {
Self::default()
}
}
#[derive(Component)]
pub struct PlotTile {
pub id: PlotId,
pub index: usize,
pub kind: PlotKind,
}
#[derive(Component, Clone, Copy)]
pub enum PlotKind {
TwoD,
ThreeD,
Placeholder,
}
#[derive(Component, Clone, Copy)]
pub struct TileView {
pub offset: Vec2,
pub scale: f32,
pub min_scale: f32,
pub max_scale: f32,
}
impl Default for TileView {
fn default() -> Self {
Self {
offset: Vec2::ZERO,
scale: 1.0,
min_scale: 0.1,
max_scale: 100.0,
}
}
}
#[derive(Component)]
pub struct TileRect {
pub world_center: Vec2,
pub world_size: Vec2,
pub content: Rect,
pub viewport: Viewport,
}
#[derive(Component)]
pub struct TileRenderRoot;
#[derive(Component)]
pub struct TileCamera;
#[derive(Component)]
pub struct TileOverlayCamera;
#[derive(Component)]
pub struct Crosshair {
pub tile_index: usize,
}
#[derive(Component)]
pub struct CrosshairHLine;
#[derive(Component)]
pub struct CrosshairVLine;
#[derive(Component)]
pub struct CrosshairCoordText;
#[derive(Component)]
pub struct AutoFitted;
#[derive(Component)]
pub struct TabBar;
#[derive(Component)]
pub struct TabButton {
pub index: usize,
}
#[derive(Resource, Default)]
pub struct PreviousActiveTab(pub usize);
#[derive(Component, Clone, Copy, Debug)]
pub struct View3D {
pub target: Vec3,
pub radius: f32,
pub yaw: f32,
pub pitch: f32,
}
impl Default for View3D {
fn default() -> Self {
Self {
target: Vec3::ZERO,
radius: 12.0,
yaw: 0.8, pitch: -0.4, }
}
}
#[derive(Component)]
pub struct Tooltip3D {
pub tile_index: usize,
}
#[derive(Component)]
pub struct AxisLabel3D {
pub tile_index: usize,
}