Make bevy 0.14 runnable by removing canvas effects
This commit is contained in:
977
Cargo.lock
generated
977
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -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"
|
||||
|
||||
201
src/canvas.rs
201
src/canvas.rs
@@ -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()
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user