Upgrade to Bevy 0.15

This commit is contained in:
Silas Bartha 2024-12-10 14:56:41 -05:00
parent 5247e02872
commit 7d084ef6a4
3 changed files with 27 additions and 33 deletions

View File

@ -1,11 +1,11 @@
[package] [package]
name = "bevy_blacklight_material" name = "bevy_blacklight_material"
description = "A blacklight material plugin for the Bevy engine" description = "A blacklight material plugin for the Bevy engine"
version = "0.1.0" version = "0.2.0"
edition = "2021" edition = "2021"
license = "0BSD OR Apache-2.0 OR MIT" 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] [dependencies.bevy]
version = "0.14" version = "0.15"
features = ["bevy_render", "bevy_asset"] features = ["bevy_render", "bevy_asset"]

View File

@ -14,19 +14,20 @@ Feel free to contribute if you want to improve this, it was thrown together pret
| Crate Version | Bevy Version | | Crate Version | Bevy Version |
|--- |--- | |--- |--- |
| 0.1 | 0.14 | | 0.1 | 0.14 |
| 0.2 | 0.15 |
## Installation ## Installation
### crates.io ### crates.io
```toml ```toml
[dependencies] [dependencies]
bevy_blacklight_material = "0.1" bevy_blacklight_material = "0.2"
``` ```
### Using git URL in Cargo.toml ### Using git URL in Cargo.toml
```toml ```toml
[dependencies.bevy_rustysynth] [dependencies.bevy_rustysynth]
git = "https://github.com/exvacuum/bevy_blacklight_material.git" git = "https://git.exvacuum.dev/bevy_blacklight_material"
``` ```
## Usage ## Usage
@ -47,26 +48,15 @@ fn main() {
Then you can create blacklight-emitting spotlights, and reveal-able surfaces, like this: Then you can create blacklight-emitting spotlights, and reveal-able surfaces, like this:
```rs ```rs
// Mesh with blacklight material // Mesh with blacklight material
commands.spawn(MaterialMeshBundle { commands.spawn((
material: asset_server.add(BlacklightMaterial { //...
// base texture, color, etc MeshMaterial3d(asset_server.add(BlacklightMaterial::new(&asset_server, None, Color::WHITE))),
..Default::default() ));
}),
..Default::default()
});
// Blacklight // Blacklight
commands.spawn(( // Requires `SpotLight`, but you might want to add one yourself
Blacklight, // Marker component commands.spawn(Blacklight);
SpotLightBundle {
spot_light: SpotLight {
// outer/inner angle, range
..Default::default()
},
..Default::default()
},
));
``` ```
## License ## License

View File

@ -10,7 +10,7 @@
use bevy::{ use bevy::{
asset::embedded_asset, asset::embedded_asset,
prelude::*, prelude::*,
render::render_resource::{AsBindGroup, ShaderType}, render::{render_resource::{AsBindGroup, ShaderType}, storage::ShaderStorageBuffer},
}; };
/// Plugin which enables and updates blacklight shaders. /// 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`]. /// Marker component for spot lights to use them as blacklights for [`BlacklightMaterial`].
#[derive(Component, Debug)] #[derive(Component, Debug)]
#[require(SpotLight)]
pub struct Blacklight; pub struct Blacklight;
/// Shader data representing a single blacklight point light. /// Shader data representing a single blacklight point light.
@ -49,7 +50,7 @@ pub struct BlacklightData {
pub struct BlacklightMaterial { pub struct BlacklightMaterial {
/// List of light data processed by this shader /// List of light data processed by this shader
#[storage(0, read_only)] #[storage(0, read_only)]
pub lights: Vec<BlacklightData>, pub lights: Handle<ShaderStorageBuffer>,
/// Base color texture which is revealed by blacklight exposure. /// Base color texture which is revealed by blacklight exposure.
#[texture(1)] #[texture(1)]
#[sampler(2)] #[sampler(2)]
@ -61,12 +62,13 @@ pub struct BlacklightMaterial {
pub alpha_mode: AlphaMode, pub alpha_mode: AlphaMode,
} }
impl Default for BlacklightMaterial { impl BlacklightMaterial {
fn default() -> Self { /// 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 { Self {
lights: vec![], lights: asset_server.add(ShaderStorageBuffer::default()),
base_texture: None, base_texture,
base_color: LinearRgba::WHITE, base_color: base_color.into(),
alpha_mode: AlphaMode::Blend, alpha_mode: AlphaMode::Blend,
} }
} }
@ -84,8 +86,9 @@ impl Material for BlacklightMaterial {
fn update_shader_blacklight_data( fn update_shader_blacklight_data(
blacklight_query: Query<(&ViewVisibility, &GlobalTransform, &SpotLight), With<Blacklight>>, 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_materials: ResMut<Assets<BlacklightMaterial>>,
mut blacklight_storage_buffers: ResMut<Assets<ShaderStorageBuffer>>,
) { ) {
let light_data = blacklight_query let light_data = blacklight_query
.iter() .iter()
@ -98,8 +101,9 @@ fn update_shader_blacklight_data(
outer_angle: light.outer_angle, outer_angle: light.outer_angle,
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
for handle in blacklight_material_query.iter() { for blacklight_material in blacklight_material_query.iter() {
let material = blacklight_materials.get_mut(handle).unwrap(); let material = blacklight_materials.get_mut(&blacklight_material.0).unwrap();
material.lights = light_data.clone(); let storage_buffer = blacklight_storage_buffers.get_mut(&material.lights).unwrap();
storage_buffer.set_data(light_data.clone());
} }
} }