use bevy::{
asset::RenderAssetUsages,
image::ImageSampler,
prelude::*,
render::render_resource::{Extent3d, ShaderType, TextureDimension, TextureFormat},
};
use crate::cascade::BodyParams;
use crate::{AmortizedBake, ResolvedWaterBody};
pub const MAX_BODIES: usize = 16;
#[derive(ShaderType, Debug, Clone, Copy)]
pub struct FieldParams {
pub region: Vec4,
pub meta: Vec4,
pub bodies: [BodyParams; MAX_BODIES],
}
impl FieldParams {
pub fn none() -> Self {
Self {
region: Vec4::ZERO,
meta: Vec4::ZERO,
bodies: [BodyParams::ocean(); MAX_BODIES],
}
}
}
#[derive(Resource, Debug)]
pub struct WaterFields {
pub params: FieldParams,
pub level_id: Handle<Image>,
pub flow: Handle<Image>,
pub bakes: AmortizedBake<(bool, Vec<ResolvedWaterBody>)>,
}
impl FromWorld for WaterFields {
fn from_world(world: &mut World) -> Self {
let mut images = world.resource_mut::<Assets<Image>>();
let mut level_id = Image::new_fill(
Extent3d::default(),
TextureDimension::D2,
&[0; 4], TextureFormat::Rg16Float,
RenderAssetUsages::default(),
);
level_id.sampler = ImageSampler::linear();
let mut flow = Image::new_fill(
Extent3d::default(),
TextureDimension::D2,
&[0; 8], TextureFormat::Rgba16Float,
RenderAssetUsages::default(),
);
flow.sampler = ImageSampler::linear();
Self {
params: FieldParams::none(),
level_id: images.add(level_id),
flow: images.add(flow),
bakes: AmortizedBake::new(),
}
}
}