use bevy::prelude::*;
use bevy::render::render_resource::{AsBindGroup, ShaderType};
use bevy::shader::ShaderRef;
#[derive(Debug, Clone, Copy, ShaderType)]
pub struct FogUniforms {
pub fog_color: Vec4,
pub eye_pos: Vec4,
pub fog_params: Vec4,
pub hillshade_highlight: Vec4,
pub hillshade_shadow: Vec4,
pub hillshade_accent: Vec4,
pub hillshade_light: Vec4,
}
impl Default for FogUniforms {
fn default() -> Self {
Self {
fog_color: Vec4::ONE,
eye_pos: Vec4::ZERO,
fog_params: Vec4::new(0.0, 1.0, 0.0, 0.0),
hillshade_highlight: Vec4::ONE,
hillshade_shadow: Vec4::new(0.0, 0.0, 0.0, 1.0),
hillshade_accent: Vec4::new(0.42, 0.48, 0.42, 1.0),
hillshade_light: Vec4::new(335.0f32.to_radians(), 45.0f32.to_radians(), 1.0, 0.0),
}
}
}
#[derive(Debug, Clone, Copy, ShaderType)]
pub struct MaterialFlags {
pub has_texture: f32,
pub fade_opacity: f32,
pub _pad: Vec2,
}
impl Default for MaterialFlags {
fn default() -> Self {
Self {
has_texture: 0.0,
fade_opacity: 1.0,
_pad: Vec2::ZERO,
}
}
}
#[derive(Debug, Clone, Copy, ShaderType)]
pub struct TerrainUniforms {
pub geo_bounds: Vec4,
pub scene_origin: Vec4,
pub elev_params: Vec4,
pub elev_region: Vec4,
pub options: Vec4,
}
impl TerrainUniforms {
pub fn disabled() -> Self {
Self {
geo_bounds: Vec4::ZERO,
scene_origin: Vec4::ZERO,
elev_params: Vec4::ZERO,
elev_region: Vec4::ZERO,
options: Vec4::ZERO,
}
}
}
impl Default for TerrainUniforms {
fn default() -> Self {
Self::disabled()
}
}
#[derive(Asset, AsBindGroup, TypePath, Debug, Clone, Default)]
pub struct TileFogMaterial {
#[uniform(0)]
pub fog: FogUniforms,
#[texture(1)]
#[sampler(2)]
pub tile_texture: Option<Handle<Image>>,
#[uniform(3)]
pub flags: MaterialFlags,
#[uniform(4)]
pub terrain: TerrainUniforms,
#[texture(
5,
sample_type = "float",
filterable = false,
visibility(vertex, fragment)
)]
pub height_texture: Handle<Image>,
}
impl Material for TileFogMaterial {
fn vertex_shader() -> ShaderRef {
"embedded://rustial_renderer_bevy/shaders/tile_fog.wgsl".into()
}
fn fragment_shader() -> ShaderRef {
"embedded://rustial_renderer_bevy/shaders/tile_fog.wgsl".into()
}
fn alpha_mode(&self) -> AlphaMode {
if self.flags.fade_opacity < 1.0 {
AlphaMode::Blend
} else {
AlphaMode::Opaque
}
}
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(())
}
}