diff options
-rw-r--r-- | Cargo.toml | 6 | ||||
-rw-r--r-- | README.md | 28 | ||||
-rw-r--r-- | src/lib.rs | 26 |
3 files changed, 27 insertions, 33 deletions
@@ -1,11 +1,11 @@ [package] name = "bevy_blacklight_material" description = "A blacklight material plugin for the Bevy engine" -version = "0.1.0" +version = "0.2.0" edition = "2021" license = "0BSD OR Apache-2.0 OR MIT" -repository = "https://github.com/exvacuum/bevy_blacklight_material" +repository = "https://git.exvacuum.dev/bevy_blacklight_material" [dependencies.bevy] -version = "0.14" +version = "0.15" features = ["bevy_render", "bevy_asset"] @@ -14,19 +14,20 @@ Feel free to contribute if you want to improve this, it was thrown together pret | Crate Version | Bevy Version | |--- |--- | | 0.1 | 0.14 | +| 0.2 | 0.15 | ## Installation ### crates.io ```toml [dependencies] -bevy_blacklight_material = "0.1" +bevy_blacklight_material = "0.2" ``` ### Using git URL in Cargo.toml ```toml [dependencies.bevy_rustysynth] -git = "https://github.com/exvacuum/bevy_blacklight_material.git" +git = "https://git.exvacuum.dev/bevy_blacklight_material" ``` ## Usage @@ -47,26 +48,15 @@ fn main() { Then you can create blacklight-emitting spotlights, and reveal-able surfaces, like this: ```rs // Mesh with blacklight material -commands.spawn(MaterialMeshBundle { - material: asset_server.add(BlacklightMaterial { - // base texture, color, etc - ..Default::default() - }), - ..Default::default() -}); +commands.spawn(( + //... + MeshMaterial3d(asset_server.add(BlacklightMaterial::new(&asset_server, None, Color::WHITE))), +)); // Blacklight -commands.spawn(( - Blacklight, // Marker component - SpotLightBundle { - spot_light: SpotLight { - // outer/inner angle, range - ..Default::default() - }, - ..Default::default() - }, -)); +// Requires `SpotLight`, but you might want to add one yourself +commands.spawn(Blacklight); ``` ## License @@ -10,7 +10,7 @@ use bevy::{ asset::embedded_asset, prelude::*, - render::render_resource::{AsBindGroup, ShaderType}, + render::{render_resource::{AsBindGroup, ShaderType}, storage::ShaderStorageBuffer}, }; /// Plugin which enables and updates blacklight shaders. @@ -26,6 +26,7 @@ impl Plugin for BlacklightPlugin { /// Marker component for spot lights to use them as blacklights for [`BlacklightMaterial`]. #[derive(Component, Debug)] +#[require(SpotLight)] pub struct Blacklight; /// Shader data representing a single blacklight point light. @@ -49,7 +50,7 @@ pub struct BlacklightData { pub struct BlacklightMaterial { /// List of light data processed by this shader #[storage(0, read_only)] - pub lights: Vec<BlacklightData>, + pub lights: Handle<ShaderStorageBuffer>, /// Base color texture which is revealed by blacklight exposure. #[texture(1)] #[sampler(2)] @@ -61,12 +62,13 @@ pub struct BlacklightMaterial { pub alpha_mode: AlphaMode, } -impl Default for BlacklightMaterial { - fn default() -> Self { +impl BlacklightMaterial { + /// Construct a new instance of this material + pub fn new(asset_server: &AssetServer, base_texture: Option<Handle<Image>>, base_color: impl Into<LinearRgba>) -> Self { Self { - lights: vec![], - base_texture: None, - base_color: LinearRgba::WHITE, + lights: asset_server.add(ShaderStorageBuffer::default()), + base_texture, + base_color: base_color.into(), alpha_mode: AlphaMode::Blend, } } @@ -84,8 +86,9 @@ impl Material for BlacklightMaterial { fn update_shader_blacklight_data( blacklight_query: Query<(&ViewVisibility, &GlobalTransform, &SpotLight), With<Blacklight>>, - blacklight_material_query: Query<&Handle<BlacklightMaterial>>, + blacklight_material_query: Query<&MeshMaterial3d<BlacklightMaterial>>, mut blacklight_materials: ResMut<Assets<BlacklightMaterial>>, + mut blacklight_storage_buffers: ResMut<Assets<ShaderStorageBuffer>>, ) { let light_data = blacklight_query .iter() @@ -98,8 +101,9 @@ fn update_shader_blacklight_data( outer_angle: light.outer_angle, }) .collect::<Vec<_>>(); - for handle in blacklight_material_query.iter() { - let material = blacklight_materials.get_mut(handle).unwrap(); - material.lights = light_data.clone(); + for blacklight_material in blacklight_material_query.iter() { + let material = blacklight_materials.get_mut(&blacklight_material.0).unwrap(); + let storage_buffer = blacklight_storage_buffers.get_mut(&material.lights).unwrap(); + storage_buffer.set_data(light_data.clone()); } } |