// ▄████████▄ + ███ + ▄█████████ ███ + // ███▀ ▀███ + + ███ ███▀ + ███ + + // ███ + ███ ███ ███ █████████ ███ ███ ███ ███ // ███ +███ ███ ███ ███ ███▐██████ ███ ███ ███ // ███ + ███ ███+ ███ +███ ███ + ███ ███ + ███ // ███▄ ▄███ ███▄ ███ ███ + ███ + ███ ███▄ ███ // ▀████████▀ + ▀███████ ███▄ ███▄ ▀████ ▀███████ // + + + ███ // + ▀████████████████████████████████████████████████████▀ use bevy::prelude::*; use bevy::render::render_resource::{AsBindGroup, ShaderRef}; use bevy::pbr::{ExtendedMaterial, MaterialExtension, OpaqueRendererMethod}; pub struct ShadingPlugin; impl Plugin for ShadingPlugin { fn build(&self, app: &mut App) { app.add_plugins(MaterialPlugin::::default()); app.add_plugins(MaterialPlugin::::default()); app.add_plugins(MaterialPlugin::>::default()); } } // Jupiter's Ring #[derive(Asset, TypePath, AsBindGroup, Debug, Clone)] pub struct JupitersRing { pub alpha_mode: AlphaMode, #[uniform(0)] pub ring_radius: f32, #[uniform(1)] pub jupiter_radius: f32, } impl Material for JupitersRing { fn fragment_shader() -> ShaderRef { "shaders/jupiters_rings.wgsl".into() } fn alpha_mode(&self) -> AlphaMode { self.alpha_mode } } // Sky Box #[derive(Asset, TypePath, AsBindGroup, Debug, Clone)] pub struct SkyBox {} impl Material for SkyBox { fn fragment_shader() -> ShaderRef { "shaders/skybox.wgsl".into() } } // Asteroid Surface #[derive(Asset, Reflect, AsBindGroup, Debug, Clone)] pub struct AsteroidSurface { #[uniform(100)] quantize_steps: u32 } impl MaterialExtension for AsteroidSurface { fn fragment_shader() -> ShaderRef { "shaders/material_asteroid.wgsl".into() } fn deferred_fragment_shader() -> ShaderRef { "shaders/material_asteroid.wgsl".into() } } impl AsteroidSurface { pub fn material() -> ExtendedMaterial { ExtendedMaterial { base: StandardMaterial { base_color: Color::rgb(0.29, 0.255, 0.208), perceptual_roughness: 1.0, opaque_render_method: OpaqueRendererMethod::Auto, ..default() }, extension: Self::default(), } } } impl Default for AsteroidSurface { fn default() -> Self { Self { quantize_steps: 3, } } }