#![warn(unreachable_pub)]
#[doc(hidden)]
pub mod amortized_bake;
#[doc(hidden)]
pub mod bed;
mod body;
#[doc(hidden)]
pub mod cascade;
#[doc(hidden)]
pub mod fields;
#[doc(hidden)]
pub mod pass;
#[doc(hidden)]
pub use bevy_aqua_geom::rings;
#[doc(hidden)]
pub mod view;
#[doc(hidden)]
pub mod waves_abi;
#[doc(hidden)]
pub use amortized_bake::AmortizedBake;
#[doc(inline)]
pub use bed::BedHeightMap;
#[doc(hidden)]
pub use bed::GpuFallback;
pub use body::WaterBody;
#[doc(hidden)]
pub use body::{ResolvedWaterBodies, ResolvedWaterBody, WaterBodyTransformError};
#[doc(hidden)]
pub use cascade::{
BodyOptics, BodyParams, CascadeMaterial, Data, GpuCascade, GpuLayout, LOD_COUNT,
PlanarReflectionParams, PlanarReflectionView, RESOLUTION, SurfaceParams, TILE_RESOLUTION,
UpdateInputs, layout, lod_scale, make_detail_normal_texture, make_fft_surface_texture,
make_texture, update as update_cascade_material,
};
#[doc(hidden)]
pub use view::projected_detail_lod;
#[doc(hidden)]
pub use cascade::BASE_SCALE;
#[doc(hidden)]
pub use cascade::add_shader;
#[doc(hidden)]
pub use fields::{FieldParams, MAX_BODIES, WaterFields};
#[doc(hidden)]
pub use rings::{Patch, Tile, build_patch, tile_layout};
#[doc(hidden)]
pub use view::{OceanView, ViewDetail, ViewOrder, ViewPos, ViewSeaLevel};
#[doc(hidden)]
pub use waves_abi::WAVE_SLOTS;
#[doc(hidden)]
pub use waves_abi::{AnimWavesUniform, AnimWavesUniformSlot, GpuWave};
pub use bevy_aqua_sdf::{FlowSample, RiverPath, RiverPoint, RiverSample, WaterShape};
use bevy::ecs::schedule::SystemSet;
use bevy::prelude::*;
#[doc(hidden)]
#[derive(SystemSet, Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct CascadeDataReady;
#[doc(hidden)]
#[derive(SystemSet, Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct CascadeMaterialsUpdated;
#[doc(hidden)]
#[derive(SystemSet, Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct WaterBodiesResolved;
#[doc(hidden)]
#[derive(SystemSet, Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct AnimWavesWritten;
#[doc(hidden)]
#[derive(Resource, Debug, Default, Clone, Copy)]
pub struct AnimWavesStatus {
pub written: bool,
}
#[derive(Component, Debug, Clone, Copy, PartialEq)]
pub struct WaterOptics {
pub extinction: Vec3,
pub scatter_scale: f32,
pub sun_roughness: f32,
pub deep_color: Vec3,
pub grazing_color: Vec3,
pub shallow_color: Vec3,
pub sss_tint: Vec3,
}
impl WaterOptics {
pub const DEEP_OCEAN: Self = Self {
extinction: Vec3::new(0.90, 0.30, 0.35),
scatter_scale: 1.0,
sun_roughness: -1.0,
deep_color: Vec3::new(0.0, 0.002_695_407_3, 0.169_811_31),
grazing_color: Vec3::new(0.0, 0.003_921_569, 0.168_627_4),
shallow_color: Vec3::new(0.012, 0.13, 0.115),
sss_tint: Vec3::new(0.088_506_84, 0.497, 0.456_150_74),
};
pub const COASTAL: Self = Self {
extinction: Vec3::new(0.86, 0.24, 0.39),
scatter_scale: 1.0,
sun_roughness: -1.0,
deep_color: Vec3::new(0.0, 0.018, 0.13),
grazing_color: Vec3::new(0.0, 0.025, 0.145),
shallow_color: Vec3::new(0.01, 0.16, 0.12),
sss_tint: Vec3::new(0.06, 0.55, 0.45),
};
pub const TROPICAL: Self = Self {
extinction: Vec3::new(0.78, 0.14, 0.52),
scatter_scale: 1.0,
sun_roughness: -1.0,
deep_color: Vec3::new(0.0, 0.08, 0.06),
grazing_color: Vec3::new(0.0, 0.10, 0.075),
shallow_color: Vec3::new(0.015, 0.19, 0.10),
sss_tint: Vec3::new(0.025, 0.62, 0.38),
};
pub const CLEAR_FRESH: Self = Self {
extinction: Vec3::new(0.24, 0.13, 0.10),
scatter_scale: 0.10,
sun_roughness: 0.1,
..Self::DEEP_OCEAN
};
pub const PRESETS: [(&'static str, Self); 3] = [
("deep-ocean", Self::DEEP_OCEAN),
("coastal", Self::COASTAL),
("tropical", Self::TROPICAL),
];
}
#[derive(Resource, Debug, Default, Clone, Copy, PartialEq)]
pub struct Ocean {
pub level: f32,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub enum WaveModel {
#[default]
Analytic,
Spectral,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SeaState {
Calm,
#[default]
Moderate,
Rough,
}
impl SeaState {
pub const ALL: [Self; 3] = [Self::Calm, Self::Moderate, Self::Rough];
pub const fn as_str(self) -> &'static str {
match self {
Self::Calm => "calm",
Self::Moderate => "moderate",
Self::Rough => "rough",
}
}
pub const fn amplitude_multiplier(self) -> f32 {
match self {
Self::Calm => 0.5,
Self::Moderate => 1.0,
Self::Rough => 1.5,
}
}
}
impl std::fmt::Display for SeaState {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter.write_str(self.as_str())
}
}
#[derive(Resource, Debug, Clone, Copy)]
pub struct OceanWaves {
pub model: WaveModel,
pub sea_state: SeaState,
pub shallow_water_attenuation: f32,
pub wind_direction_degrees: f32,
pub wind_speed: f32,
pub fetch: f32,
pub flow: Vec2,
}
impl Default for OceanWaves {
fn default() -> Self {
Self {
model: WaveModel::Analytic,
sea_state: SeaState::Moderate,
shallow_water_attenuation: 0.95,
wind_direction_degrees: 0.0,
wind_speed: 20.0,
fetch: 100_000.0,
flow: Vec2::ZERO,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ReflectionMode {
Cubemap,
Planar {
scale: f32,
distortion: f32,
},
}
impl Default for ReflectionMode {
fn default() -> Self {
Self::Planar {
scale: 0.5,
distortion: 0.02,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Caustics {
pub strength: f32,
pub scale: f32,
pub speed: f32,
pub depth_max: f32,
}
impl Default for Caustics {
fn default() -> Self {
Self {
strength: 0.35,
scale: 5.0,
speed: 0.18,
depth_max: 6.0,
}
}
}
#[derive(Resource, Debug, Clone, Copy, PartialEq)]
pub struct CausticsSunVisibility(pub f32);
impl Default for CausticsSunVisibility {
fn default() -> Self {
Self(1.0)
}
}
#[doc(hidden)]
#[derive(Component, Debug, Default, Clone, Copy)]
pub struct AuxiliaryWaterView;
#[derive(Resource, Debug, Clone, Copy)]
pub struct AquaSettings {
pub detail_strength: f32,
pub water_optics: WaterOptics,
pub atmospheric_sunlight: bool,
pub far_tier_start: f32,
pub far_tier_end: f32,
pub reflections: ReflectionMode,
pub caustics: Option<Caustics>,
}
impl Default for AquaSettings {
fn default() -> Self {
Self {
detail_strength: 0.08,
water_optics: WaterOptics::DEEP_OCEAN,
atmospheric_sunlight: false,
far_tier_start: 320.0,
far_tier_end: 512.0,
reflections: ReflectionMode::default(),
caustics: Some(Caustics::default()),
}
}
}
#[derive(Resource, Debug, Default, Clone, Copy, PartialEq, Eq)]
pub enum AquaDebug {
#[default]
Shaded,
WaterPath,
RefractionValidity,
Transmission,
TransmissionUnrefracted,
BeerLambert,
SeaFloorDepth,
ShallowComposite,
ReflectionSanity,
FoamDensity,
FoamDensityBilinear,
WaveHeight,
LightRadiance,
FarTier,
ReflectionFraction,
}