1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
use crate::{Integer, Scalar}; use serde::{Deserialize, Serialize}; use std::{ hash::{Hash, Hasher}, marker::PhantomData, }; #[derive(Debug, Default, Clone, Copy, Serialize, Deserialize)] pub struct Vec2 { pub x: Scalar, pub y: Scalar, } #[derive(Debug, Default, Clone, Copy, Serialize, Deserialize)] pub struct IntVec2 { pub x: Integer, pub y: Integer, } #[derive(Debug, Default, Clone, Copy, Serialize, Deserialize)] pub struct Rect { pub left: Scalar, pub right: Scalar, pub top: Scalar, pub bottom: Scalar, } impl Rect { #[inline] pub fn width(&self) -> Scalar { self.right - self.left } #[inline] pub fn height(&self) -> Scalar { self.bottom - self.top } #[inline] pub fn size(&self) -> Vec2 { Vec2 { x: self.width(), y: self.height(), } } } #[derive(Debug, Default, Clone, Copy, Serialize, Deserialize)] pub struct IntRect { pub left: Integer, pub right: Integer, pub top: Integer, pub bottom: Integer, } impl IntRect { #[inline] pub fn width(&self) -> Integer { self.right - self.left } #[inline] pub fn height(&self) -> Integer { self.bottom - self.top } #[inline] pub fn size(&self) -> IntVec2 { IntVec2 { x: self.width(), y: self.height(), } } } #[derive(Debug, Default, Clone, Copy, Serialize, Deserialize)] pub struct Color { pub r: Scalar, pub g: Scalar, pub b: Scalar, pub a: Scalar, } #[derive(Debug, Default, Copy, Clone)] pub struct MemoryId<T>(usize, PhantomData<T>); impl<T> MemoryId<T> { pub fn new(v: &T) -> Self { Self(v as *const T as usize, PhantomData) } } impl<T> From<&T> for MemoryId<T> { fn from(v: &T) -> Self { Self::new(v) } } impl<T> Hash for MemoryId<T> { fn hash<H: Hasher>(&self, state: &mut H) { self.0.hash(state); } } impl<T> PartialEq for MemoryId<T> { fn eq(&self, other: &Self) -> bool { self.0 == other.0 } } impl<T> Eq for MemoryId<T> {} #[inline] pub fn lerp(from: Scalar, to: Scalar, factor: Scalar) -> Scalar { from + (to - from) * factor } #[inline] pub fn lerp_clamped(from: Scalar, to: Scalar, factor: Scalar) -> Scalar { lerp(from, to, factor.max(0.0).min(1.0)) }