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
use bevy::prelude::*;
use crate::DEFAULT_FILL_HANDLE;
#[derive(Component, Debug, Clone)]
#[cfg_attr(
feature = "bevy-inspector-egui",
derive(bevy_inspector_egui::Inspectable)
)]
/// Main component used for describing an sdf shape
pub struct SmudShape {
/// The color used by the fill shader
pub color: Color,
/// Shader containing a wgsl function for a signed distance field
///
/// The shader needs to have the signature `fn sdf(p: vec2<f32>) -> f32`.
pub sdf: Handle<Shader>,
/// Shader containing a wgsl function for the fill of the shape
///
/// The shader needs to have the signature `fn fill(distance: f32, color: vec4<f32>) -> vec4<f32>`.
pub fill: Handle<Shader>, // todo: wrap in newtypes?
/// The outer bounds for the shape, should be bigger than the sdf shape
pub frame: Frame,
}
impl Default for SmudShape {
fn default() -> Self {
Self {
color: Color::PINK,
sdf: default(),
frame: default(),
fill: DEFAULT_FILL_HANDLE.typed(),
}
}
}
/// Bounds for describing how far the fragment shader of a shape will reach, should be bigger than the shape unless you want to clip it
#[derive(Debug, Clone, Copy)]
#[cfg_attr(
feature = "bevy-inspector-egui",
derive(bevy_inspector_egui::Inspectable)
)]
pub enum Frame {
/// A quad with a given half-size (!)
Quad(f32), // todo: it probably makes sense for this to be the full width instead...
}
impl Frame {
const DEFAULT_QUAD: Self = Self::Quad(1.);
}
impl Default for Frame {
fn default() -> Self {
Self::DEFAULT_QUAD
}
}