Make bevy 0.14 runnable by removing canvas effects

This commit is contained in:
2025-01-01 12:40:02 +01:00
parent 91dbf577bd
commit d59aa18809
7 changed files with 351 additions and 920 deletions

977
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -6,7 +6,6 @@ edition = "2021"
[dependencies]
itertools = "0.13.0"
rand = "0.8.5"
bevy_editor_pls = { git = "https://github.com/jakobhellermann/bevy_editor_pls" }
bevy_tweening = "0.11.0"
leafwing-input-manager = "0.15.1"
bevy_asset_loader = "0.21.0"

View File

@@ -1,120 +1,131 @@
mod tile_light;
// mod tile_light;
use crate::grid;
use bevy::{
prelude::*,
reflect::TypePath,
render::{
render_resource::{encase, AsBindGroup, OwnedBindingResource, ShaderRef, ShaderType},
renderer::RenderQueue,
Extract, Render, RenderApp, RenderSet,
},
sprite::{Material2d, Material2dPlugin, MaterialMesh2dBundle, RenderMaterials2d},
// reflect::TypePath,
// render::{
// render_resource::{encase, AsBindGroup, OwnedBindingResource, ShaderRef, ShaderType},
// renderer::RenderQueue,
// Extract, Render, RenderApp, RenderSet,
// },
// sprite::{Material2d, Material2dPlugin, MaterialMesh2dBundle},
};
use tile_light::{extract_tile_lights, TileLight, TileLightsUniform};
pub(crate) use tile_light::EmissiveTile;
// pub(crate) use tile_light::EmissiveTile;
pub struct CanvasPlugin;
impl Plugin for CanvasPlugin {
fn build(&self, app: &mut App) {
app.add_plugins(Material2dPlugin::<CanvasMaterial>::default())
.add_systems(Startup, spawn_canvas);
// app.add_plugins(Material2dPlugin::<CanvasMaterial>::default())
// .add_systems(Startup, spawn_canvas);
app.add_systems(Startup, spawn_canvas);
app.sub_app_mut(RenderApp)
.add_systems(ExtractSchedule, (extract_tile_lights, extract_canvas))
.add_systems(
Render,
prepare_canvas_material.in_set(RenderSet::PrepareAssets),
);
// app.sub_app_mut(RenderApp)
// .add_systems(ExtractSchedule, (extract_tile_lights, extract_canvas))
// .add_systems(
// Render,
// prepare_canvas_material.in_set(RenderSet::PrepareAssets),
// );
}
}
const CANVAS_COLOR: Color = Color::srgb(0.05, 0.05, 0.05);
const CANVAS_COLOR: Color = Color::srgb(0.075, 0.075, 0.075);
#[derive(AsBindGroup, TypePath, Asset, Clone)]
struct CanvasMaterial {
#[uniform(0)]
ambient_color: Color,
#[uniform(0)]
tile_lights: tile_light::TileLightsUniform,
#[uniform(0)]
number_of_lights: u32,
}
// #[derive(AsBindGroup, TypePath, Asset, Clone)]
// struct CanvasMaterial {
// #[uniform(0)]
// ambient_color: Color,
// #[uniform(0)]
// tile_lights: tile_light::TileLightsUniform,
// #[uniform(0)]
// number_of_lights: u32,
// }
impl Default for CanvasMaterial {
fn default() -> Self {
Self {
ambient_color: CANVAS_COLOR,
number_of_lights: 0,
tile_lights: Default::default(),
}
}
}
// impl Default for CanvasMaterial {
// fn default() -> Self {
// Self {
// ambient_color: CANVAS_COLOR,
// number_of_lights: 0,
// tile_lights: Default::default(),
// }
// }
// }
#[derive(ShaderType)]
struct CanvasMaterialUniform {
ambient_color: Color,
tile_lights: tile_light::TileLightsUniform,
number_of_lights: u32,
}
// #[derive(ShaderType)]
// struct CanvasMaterialUniform {
// ambient_color: Color,
// tile_lights: tile_light::TileLightsUniform,
// number_of_lights: u32,
// }
impl Material2d for CanvasMaterial {
fn fragment_shader() -> ShaderRef {
"canvas_shader.wgsl".into()
}
}
// impl Material2d for CanvasMaterial {
// fn fragment_shader() -> ShaderRef {
// "canvas_shader.wgsl".into()
// }
// }
fn prepare_canvas_material(
materials: Res<RenderMaterials2d<CanvasMaterial>>,
canvas_query: Query<&Handle<CanvasMaterial>>,
tile_light_query: Query<&TileLight>,
render_queue: Res<RenderQueue>,
) {
let tile_lights = tile_light_query.iter().cloned().collect::<Vec<_>>();
let tile_lights_uniform = TileLightsUniform::from_lights(&tile_lights);
// fn prepare_canvas_material(
// materials: Res<RenderMaterials2d<CanvasMaterial>>,
// canvas_query: Query<&Handle<CanvasMaterial>>,
// tile_light_query: Query<&TileLight>,
// render_queue: Res<RenderQueue>,
// ) {
// let tile_lights = tile_light_query.iter().cloned().collect::<Vec<_>>();
// let tile_lights_uniform = TileLightsUniform::from_lights(&tile_lights);
for handle in canvas_query.iter() {
if let Some(material) = materials.get(&handle.id()) {
let binding = &material.bindings[0];
if let (_, OwnedBindingResource::Buffer(cur_buffer)) = binding {
let mut buffer = encase::UniformBuffer::new(Vec::new());
buffer
.write(&CanvasMaterialUniform {
ambient_color: CANVAS_COLOR,
tile_lights: tile_lights_uniform.clone(),
number_of_lights: tile_lights.len() as _,
})
.unwrap();
render_queue.write_buffer(cur_buffer, 0, buffer.as_ref());
}
}
}
}
// for handle in canvas_query.iter() {
// if let Some(material) = materials.get(&handle.id()) {
// let binding = &material.bindings[0];
// if let (_, OwnedBindingResource::Buffer(cur_buffer)) = binding {
// let mut buffer = encase::UniformBuffer::new(Vec::new());
// buffer
// .write(&CanvasMaterialUniform {
// ambient_color: CANVAS_COLOR,
// tile_lights: tile_lights_uniform.clone(),
// number_of_lights: tile_lights.len() as _,
// })
// .unwrap();
// render_queue.write_buffer(cur_buffer, 0, buffer.as_ref());
// }
// }
// }
// }
fn extract_canvas(
mut commands: Commands,
canvas_query: Extract<Query<(Entity, &Handle<CanvasMaterial>)>>,
) {
for (entity, handle) in canvas_query.iter() {
commands.get_or_spawn(entity).insert(handle.clone());
}
}
// fn extract_canvas(
// mut commands: Commands,
// canvas_query: Extract<Query<(Entity, &Handle<CanvasMaterial>)>>,
// ) {
// for (entity, handle) in canvas_query.iter() {
// commands.get_or_spawn(entity).insert(handle.clone());
// }
// }
fn spawn_canvas(
mut commands: Commands,
mut mesh_assets: ResMut<Assets<Mesh>>,
mut canvas_material_assets: ResMut<Assets<CanvasMaterial>>,
) {
commands
.spawn(MaterialMesh2dBundle {
mesh: mesh_assets.add(Mesh::from(Rectangle::default())).into(),
material: canvas_material_assets.add(CanvasMaterial::default()),
transform: Transform::from_scale(Vec3::splat(
grid::SEGMENT_SIZE * f32::from(grid::SIZE),
)),
// fn spawn_canvas(
// mut commands: Commands,
// mut mesh_assets: ResMut<Assets<Mesh>>,
// mut canvas_material_assets: ResMut<Assets<CanvasMaterial>>,
// ) {
// commands
// .spawn(MaterialMesh2dBundle {
// mesh: mesh_assets.add(Mesh::from(Rectangle::default())).into(),
// material: canvas_material_assets.add(CanvasMaterial::default()),
// transform: Transform::from_scale(Vec3::splat(
// grid::SEGMENT_SIZE * f32::from(grid::SIZE),
// )),
// ..Default::default()
// })
// .insert(Name::new("Canvas"));
// }
fn spawn_canvas(mut commands: Commands) {
commands.spawn(SpriteBundle {
sprite: Sprite {
color: CANVAS_COLOR.into(),
..Default::default()
})
.insert(Name::new("Canvas"));
},
transform: Transform::from_scale(Vec3::splat(grid::SEGMENT_SIZE * f32::from(grid::SIZE))),
..Default::default()
});
}

View File

@@ -1,9 +1,9 @@
use bevy::{
prelude::*,
render::{render_resource::ShaderType, Extract},
// render::{render_resource::ShaderType, Extract},
};
const MAX_TILE_LIGHTS: usize = 256;
// const MAX_TILE_LIGHTS: usize = 256;
#[derive(Component, Clone, Copy)]
pub(crate) struct EmissiveTile {
@@ -16,48 +16,48 @@ impl Default for EmissiveTile {
}
}
#[derive(Copy, Clone, Default, ShaderType, Component)]
pub(super) struct TileLight {
color: Color,
intensity: f32,
position: Vec2,
}
// #[derive(Copy, Clone, Default, ShaderType, Component)]
// pub(super) struct TileLight {
// color: Color,
// intensity: f32,
// position: Vec2,
// }
#[derive(ShaderType, Clone)]
pub(super) struct TileLightsUniform {
pub data: Box<[TileLight; MAX_TILE_LIGHTS]>,
}
// #[derive(ShaderType, Clone)]
// pub(super) struct TileLightsUniform {
// pub data: Box<[TileLight; MAX_TILE_LIGHTS]>,
// }
impl TileLightsUniform {
pub(super) fn from_lights(tile_lights: &[TileLight]) -> Self {
let mut tile_lights_uniform = TileLightsUniform::default();
// impl TileLightsUniform {
// pub(super) fn from_lights(tile_lights: &[TileLight]) -> Self {
// let mut tile_lights_uniform = TileLightsUniform::default();
let len = tile_lights.len().min(MAX_TILE_LIGHTS);
let src = &tile_lights[..len];
let dst = &mut tile_lights_uniform.data[..len];
dst.copy_from_slice(src);
// let len = tile_lights.len().min(MAX_TILE_LIGHTS);
// let src = &tile_lights[..len];
// let dst = &mut tile_lights_uniform.data[..len];
// dst.copy_from_slice(src);
tile_lights_uniform
}
}
// tile_lights_uniform
// }
// }
impl Default for TileLightsUniform {
fn default() -> Self {
Self {
data: Box::new([TileLight::default(); MAX_TILE_LIGHTS]),
}
}
}
// impl Default for TileLightsUniform {
// fn default() -> Self {
// Self {
// data: Box::new([TileLight::default(); MAX_TILE_LIGHTS]),
// }
// }
// }
pub(super) fn extract_tile_lights(
mut commands: Commands,
emissive_sprite_query: Extract<Query<(Entity, &EmissiveTile, &Sprite, &GlobalTransform)>>,
) {
for (entity, emissive_sprite, sprite, global_transform) in emissive_sprite_query.iter() {
commands.get_or_spawn(entity).insert(TileLight {
color: sprite.color,
intensity: emissive_sprite.intensity,
position: global_transform.translation().xy(),
});
}
}
// pub(super) fn extract_tile_lights(
// mut commands: Commands,
// emissive_sprite_query: Extract<Query<(Entity, &EmissiveTile, &Sprite, &GlobalTransform)>>,
// ) {
// for (entity, emissive_sprite, sprite, global_transform) in emissive_sprite_query.iter() {
// commands.get_or_spawn(entity).insert(TileLight {
// color: sprite.color,
// intensity: emissive_sprite.intensity,
// position: global_transform.translation().xy(),
// });
// }
// }

View File

@@ -67,7 +67,7 @@ fn spawn_fruit_system(mut commands: Commands, coordinate_query: Query<&grid::Coo
})
.insert(fruit_coordinate)
.insert(Fruit)
.insert(crate::canvas::EmissiveTile { intensity: 1.0 })
// .insert(crate::canvas::EmissiveTile { intensity: 1.0 })
.insert(Name::new("Fruit"));
}

View File

@@ -11,9 +11,6 @@ use bevy_asset_loader::prelude::*;
use bevy_tweening::TweeningPlugin;
use std::time::Duration;
#[cfg(debug_assertions)]
use bevy_editor_pls::prelude::*;
mod audio;
mod canvas;
mod fruit;
@@ -103,8 +100,7 @@ fn main() {
#[cfg(debug_assertions)]
{
app.add_plugins(EditorPlugin::new())
.add_systems(Update, pause_system);
app.add_systems(Update, pause_system);
}
app.run();

View File

@@ -138,7 +138,7 @@ fn create_snake_segment(
})
.insert(SnakeSegment)
.insert(grid_position)
.insert(crate::canvas::EmissiveTile { intensity: 1.0 })
// .insert(crate::canvas::EmissiveTile { intensity: 1.0 })
.id()
}