use crate::{Anchor, LayoutControl, OutOfFrameBehavior, RotatedRect};
use bevy::ecs::{component::Component, reflect::ReflectComponent};
use bevy::math::Vec2;
use bevy::prelude::{Transform, Visibility};
use bevy::reflect::{std_traits::ReflectDefault, Reflect, ReflectDeserialize, ReflectSerialize};
use serde::{Deserialize, Serialize};
#[derive(Debug, Copy, Clone, Component, Serialize, Deserialize, Reflect)]
#[reflect(Component, Serialize, Deserialize, Default)]
#[require(
Transform,
Visibility,
Dimension,
LayoutControl,
RotatedRect,
OutOfFrameBehavior,
InterpolateTransform
)]
pub struct Transform2D {
pub anchor: Anchor,
pub parent_anchor: Anchor,
pub center: Anchor,
pub offset: Vec2,
pub z: f32,
pub rotation: f32,
pub scale: Vec2,
}
impl Transform2D {
#[inline]
pub fn get_center(&self) -> Vec2 {
self.center.or(self.anchor).into()
}
#[inline]
pub fn get_parent_anchor(&self) -> Vec2 {
self.parent_anchor.or(self.anchor).into()
}
pub const IDENTITY: Self = Self {
anchor: Anchor::CENTER,
parent_anchor: Anchor::INHERIT,
center: Anchor::CENTER,
offset: Vec2::ZERO,
rotation: 0.0,
z: 0.01,
scale: Vec2::ONE,
};
#[deprecated = "Use IDENTITY instead."]
pub const UNIT: Self = Self::IDENTITY;
#[inline]
pub fn with_offset(mut self, offset: Vec2) -> Self {
self.offset = offset;
self
}
#[inline]
pub fn with_rotation(mut self, rot: f32) -> Self {
self.rotation = rot;
self
}
#[inline]
pub fn with_scale(mut self, scale: Vec2) -> Self {
self.scale = scale;
self
}
#[inline]
pub fn with_z(mut self, z: f32) -> Self {
self.z = z;
self
}
#[inline]
pub fn with_anchor(mut self, anchor: Anchor) -> Self {
self.anchor = anchor;
self
}
#[inline]
pub fn with_parent_anchor(mut self, anchor: Anchor) -> Self {
self.parent_anchor = anchor;
self
}
#[inline]
pub fn with_center(mut self, center: Anchor) -> Self {
self.center = center;
self
}
}
impl Default for Transform2D {
fn default() -> Self {
Self::IDENTITY
}
}
#[derive(Debug, Clone, Copy, PartialEq, Default, Component, Serialize, Deserialize, Reflect)]
#[reflect(Component, Default, Serialize, Deserialize)]
pub struct Dimension(pub Vec2);
impl Dimension {
pub const ZERO: Dimension = Dimension(Vec2::ZERO);
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Component, Default, Serialize, Deserialize, Reflect,
)]
#[reflect(Component, Default, Serialize, Deserialize)]
#[repr(u8)]
pub enum SyncDimension {
#[default]
None,
FromDimension,
ToDimension,
FromAspectDimension,
FromAspectDimensionX,
FromAspectDimensionY,
}
#[derive(Debug, Clone, Copy, PartialEq, Component, Default, Serialize, Deserialize, Reflect)]
pub enum InterpolateTransform {
#[default]
None,
ExponentialDecay(f32),
}