use bevy::asset::embedded_asset;
use bevy::core_pipeline::core_3d::graph::{Core3d, Node3d};
use bevy::prelude::*;
use bevy::render::extract_component::{ExtractComponentPlugin, UniformComponentPlugin};
use bevy::render::render_graph::{RenderGraphExt, RenderLabel, ViewNodeRunner};
use bevy::render::render_resource::SpecializedRenderPipelines;
use bevy::render::{Render, RenderApp, RenderStartup, RenderSystems};
use crate::component::{ExponentialHeightFog, ExponentialHeightFogUniform};
use crate::node::ExponentialHeightFogNode;
use crate::pipeline::{
ExponentialHeightFogPipeline, configure_depth_texture_for_exponential_height_fog,
init_exponential_height_fog_pipeline, prepare_exponential_height_fog_pipelines,
};
#[derive(Debug, Hash, PartialEq, Eq, Clone, RenderLabel)]
pub enum ExponentialHeightFogNodeLabel {
Pass,
}
pub struct ExponentialHeightFogPlugin;
impl Plugin for ExponentialHeightFogPlugin {
fn build(&self, app: &mut App) {
embedded_asset!(app, "exponential_height_fog.wgsl");
app.register_type::<ExponentialHeightFog>()
.register_type::<crate::component::ExponentialHeightFogLayer>()
.register_type::<crate::component::ExponentialHeightFogDistanceMode>()
.add_plugins((
ExtractComponentPlugin::<ExponentialHeightFog>::default(),
UniformComponentPlugin::<ExponentialHeightFogUniform>::default(),
))
.add_systems(Update, configure_depth_texture_for_exponential_height_fog);
let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
return;
};
render_app
.init_resource::<SpecializedRenderPipelines<ExponentialHeightFogPipeline>>()
.add_systems(RenderStartup, init_exponential_height_fog_pipeline)
.add_systems(
Render,
prepare_exponential_height_fog_pipelines.in_set(RenderSystems::Prepare),
)
.add_render_graph_node::<ViewNodeRunner<ExponentialHeightFogNode>>(
Core3d,
ExponentialHeightFogNodeLabel::Pass,
)
.add_render_graph_edges(
Core3d,
(
Node3d::StartMainPassPostProcessing,
ExponentialHeightFogNodeLabel::Pass,
Node3d::Tonemapping,
),
);
}
}