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

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()
});
}