rustial-renderer-bevy 0.0.1

Bevy Engine renderer for the rustial 2.5D map engine
//! Custom Bevy material for dedicated hillshade overlay rendering.

use bevy::prelude::*;
use bevy::render::render_resource::AsBindGroup;
use bevy::shader::ShaderRef;

use crate::tile_fog_material::{FogUniforms, TerrainUniforms};

/// Overlay material that samples a prepared DEM-derived hillshade texture.
#[derive(Asset, AsBindGroup, TypePath, Debug, Clone, Default)]
pub struct HillshadeMaterial {
    /// Shared fog + hillshade uniform block.
    #[uniform(0)]
    pub fog: FogUniforms,

    /// Prepared hillshade texture generated from DEM data.
    #[texture(1)]
    #[sampler(2)]
    pub hillshade_texture: Handle<Image>,

    /// Terrain reconstruction uniforms for the shared-grid path.
    #[uniform(3)]
    pub terrain: TerrainUniforms,

    /// GPU height texture used by the shared-grid terrain path.
    #[texture(4, sample_type = "float", filterable = false, visibility(vertex))]
    pub height_texture: Handle<Image>,
}

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

    fn fragment_shader() -> ShaderRef {
        "embedded://rustial_renderer_bevy/shaders/hillshade_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;
        if let Some(depth) = descriptor.depth_stencil.as_mut() {
            depth.depth_write_enabled = false;
            depth.depth_compare = bevy::render::render_resource::CompareFunction::LessEqual;
        }
        Ok(())
    }
}