idk work (r + h)

This commit is contained in:
iris committed 2025-12-11 23:05:27 -05:00
1 parent a70d09e162
commit a708813ce7
11 files changed
+152 -102

No files matched your search

+34 -10
View File
@@ -1,9 +1,9 @@
#![allow(clippy::multiple_bound_locations)]
use std::marker::Destruct;
/// stored in linear for sane manipulation
#[repr(C)]
#[derive(Clone, Copy, Hash, PartialEq, Eq, bytemuck::Zeroable, Debug)]
pub struct Color<T: ColorNum> {
pub struct Color<T> {
pub r: T,
pub g: T,
pub b: T,
@@ -56,23 +56,47 @@ pub trait ColorNum {
const MAX: Self;
}
impl<T: ColorNum + F32Conversion> Color<T> {
pub fn mul_rgb(self, amt: impl F32Conversion) -> Self {
macro_rules! map_rgb {
($x:ident,$self:ident, $e:tt) => {
#[allow(unused_braces)]
Self {
r: {
let $x = $self.r;
$e
},
g: {
let $x = $self.g;
$e
},
b: {
let $x = $self.b;
$e
},
a: $self.a,
}
};
}
impl<T: ColorNum + const F32Conversion> Color<T>
where
Self: const Destruct,
{
pub const fn mul_rgb(self, amt: impl const F32Conversion) -> Self {
let amt = amt.to();
self.map_rgb(|x| T::from(x.to() * amt))
map_rgb!(x, self, { T::from(x.to() * amt) })
}
pub fn add_rgb(self, amt: impl F32Conversion) -> Self {
pub const fn add_rgb(self, amt: impl const F32Conversion) -> Self {
let amt = amt.to();
self.map_rgb(|x| T::from(x.to() + amt))
map_rgb!(x, self, { T::from(x.to() + amt) })
}
pub fn darker(self, amt: f32) -> Self {
pub const fn darker(self, amt: f32) -> Self {
self.mul_rgb(1.0 - amt)
}
pub fn brighter(self, amt: f32) -> Self {
self.map_rgb(|x| {
pub const fn brighter(self, amt: f32) -> Self {
map_rgb!(x, self, {
let x = x.to();
T::from(x + (1.0 - x) * amt)
})