rustial-renderer-bevy 1.0.0

Bevy Engine renderer for the rustial 2.5D map engine
//! Custom Bevy material for flat grid-scalar overlays.

use bevy::prelude::*;
use bevy::render::render_resource::{AsBindGroup, ShaderType};
use bevy::shader::ShaderRef;

/// GPU-side uniforms for a flat georeferenced scalar grid.
#[derive(Debug, Clone, Copy, ShaderType)]
pub struct GridScalarUniforms {
    /// `(origin_lat, origin_lon, rows, cols)`.
    pub origin_counts: Vec4,
    /// `(cell_width_m, cell_height_m, rotation_rad, opacity)`.
    pub grid_params: Vec4,
    /// `(scene_origin_x, scene_origin_y, scene_origin_z, projection_kind)`.
    pub scene_origin: Vec4,
    /// `(min, max, nan_value, has_nan)`.
    pub value_params: Vec4,
    /// `(base_altitude, 0, 0, 0)`.
    pub base_altitude: Vec4,
}

impl Default for GridScalarUniforms {
    fn default() -> Self {
        Self {
            origin_counts: Vec4::ZERO,
            grid_params: Vec4::ZERO,
            scene_origin: Vec4::ZERO,
            value_params: Vec4::new(0.0, 1.0, 0.0, 0.0),
            base_altitude: Vec4::ZERO,
        }
    }
}

/// Material for rendering a flat scalar grid overlay.
#[derive(Asset, AsBindGroup, TypePath, Debug, Clone)]
pub struct GridScalarMaterial {
    /// Overlay uniforms.
    #[uniform(0)]
    pub grid: GridScalarUniforms,

    /// Scalar value texture.
    #[texture(1, sample_type = "float", filterable = false)]
    pub scalar_texture: Handle<Image>,

    /// Color ramp LUT texture.
    #[texture(2)]
    #[sampler(3)]
    pub ramp_texture: Handle<Image>,
}

impl Material for GridScalarMaterial {
    fn vertex_shader() -> ShaderRef {
        "embedded://rustial_renderer_bevy/shaders/grid_scalar_overlay.wgsl".into()
    }

    fn fragment_shader() -> ShaderRef {
        "embedded://rustial_renderer_bevy/shaders/grid_scalar_overlay.wgsl".into()
    }

    fn alpha_mode(&self) -> AlphaMode {
        AlphaMode::Blend
    }

    fn enable_prepass() -> bool {
        false
    }

    fn enable_shadows() -> bool {
        false
    }

    fn specialize(
        _pipeline: &bevy::pbr::MaterialPipeline,
        descriptor: &mut bevy::render::render_resource::RenderPipelineDescriptor,
        _layout: &bevy::mesh::MeshVertexBufferLayoutRef,
        _key: bevy::pbr::MaterialPipelineKey<Self>,
    ) -> Result<(), bevy::render::render_resource::SpecializedMeshPipelineError> {
        descriptor.primitive.cull_mode = None;
        Ok(())
    }
}