use bevy::prelude::*;
use bevy::render::render_resource::AsBindGroup;
use bevy::shader::ShaderRef;
use crate::tile_fog_material::{FogUniforms, TerrainUniforms};
#[derive(Asset, AsBindGroup, TypePath, Debug, Clone, Default)]
pub struct HillshadeMaterial {
#[uniform(0)]
pub fog: FogUniforms,
#[texture(1)]
#[sampler(2)]
pub hillshade_texture: Handle<Image>,
#[uniform(3)]
pub terrain: TerrainUniforms,
#[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(())
}
}