bevy_exponential_height_fog 0.1.0

Standalone exponential height fog extension for Bevy volumetric fog.
Documentation
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,
                ),
            );
    }
}