use bevy_asset::Handle;
use bevy_camera::Camera;
use bevy_ecs::{
component::Component,
query::{QueryItem, With},
reflect::ReflectComponent,
resource::Resource,
system::lifetimeless::Read,
};
use bevy_image::Image;
use bevy_reflect::{std_traits::ReflectDefault, Reflect};
use bevy_render::{
extract_component::ExtractComponent, render_resource::ShaderType, sync_component::SyncComponent,
};
pub(super) static DEFAULT_CHROMATIC_ABERRATION_LUT_DATA: [u8; 12] =
[255, 0, 0, 255, 0, 255, 0, 255, 0, 0, 255, 255];
#[derive(Resource)]
pub(crate) struct DefaultChromaticAberrationLut(pub(crate) Handle<Image>);
#[derive(Reflect, Component, Clone)]
#[reflect(Component, Default, Clone)]
pub struct ChromaticAberration {
pub color_lut: Option<Handle<Image>>,
pub intensity: f32,
pub max_samples: u32,
}
impl Default for ChromaticAberration {
fn default() -> Self {
Self {
color_lut: None,
intensity: 0.02,
max_samples: 8,
}
}
}
impl SyncComponent for ChromaticAberration {
type Target = Self;
}
impl ExtractComponent for ChromaticAberration {
type QueryData = Read<ChromaticAberration>;
type QueryFilter = With<Camera>;
type Out = Self;
fn extract_component(
chromatic_aberration: QueryItem<'_, '_, Self::QueryData>,
) -> Option<Self::Out> {
if chromatic_aberration.intensity > 1e-4 {
Some(chromatic_aberration.clone())
} else {
None
}
}
}
#[derive(ShaderType, Default)]
pub struct ChromaticAberrationUniform {
pub(super) intensity: f32,
pub(super) max_samples: u32,
pub(super) unused_1: u32,
pub(super) unused_2: u32,
}