mirror of
https://github.com/bevyengine/bevy
synced 2024-11-24 05:33:04 +00:00
upgrade legion. refactor system and world construction
This commit is contained in:
parent
9f7e313dc4
commit
151675a5ef
23 changed files with 100 additions and 104 deletions
|
@ -5,7 +5,7 @@ authors = ["Carter Anderson <mcanders1@gmail.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
legion = { git = "https://github.com/TomGillen/legion.git", rev = "8628b227bcbe57582fffb5e80e73c634ec4eebd9" }
|
legion = { git = "https://github.com/TomGillen/legion.git", rev = "940ef3bfcb77e5d074ee3184b776ff1600da228d" }
|
||||||
legion_transform = { path = "src/transform" }
|
legion_transform = { path = "src/transform" }
|
||||||
wgpu = { git = "https://github.com/gfx-rs/wgpu-rs.git", rev = "44fa1bc2fa208fa92f80944253e0da56cb7ac1fe"}
|
wgpu = { git = "https://github.com/gfx-rs/wgpu-rs.git", rev = "44fa1bc2fa208fa92f80944253e0da56cb7ac1fe"}
|
||||||
glam = "0.8.4"
|
glam = "0.8.4"
|
||||||
|
|
|
@ -25,10 +25,20 @@ struct Wander {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
AppBuilder::new().add_defaults().setup(&setup).run();
|
AppBuilder::new()
|
||||||
|
.add_defaults()
|
||||||
|
.setup_world(setup)
|
||||||
|
.setup_systems(|builder| {
|
||||||
|
builder
|
||||||
|
.add_system(build_wander_system())
|
||||||
|
.add_system(build_navigate_system())
|
||||||
|
.add_system(build_move_system())
|
||||||
|
.add_system(build_print_status_system())
|
||||||
|
})
|
||||||
|
.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(world: &mut World, scheduler: &mut SystemScheduler<AppStage>) {
|
fn setup(world: &mut World) {
|
||||||
let cube = Mesh::load(MeshType::Cube);
|
let cube = Mesh::load(MeshType::Cube);
|
||||||
let cube_handle = {
|
let cube_handle = {
|
||||||
let mut mesh_storage = world
|
let mut mesh_storage = world
|
||||||
|
@ -38,13 +48,6 @@ fn setup(world: &mut World, scheduler: &mut SystemScheduler<AppStage>) {
|
||||||
mesh_storage.add(cube, "cube")
|
mesh_storage.add(cube, "cube")
|
||||||
};
|
};
|
||||||
|
|
||||||
let transform_system_bundle = transform_system_bundle::build(world);
|
|
||||||
scheduler.add_systems(AppStage::Update, transform_system_bundle);
|
|
||||||
scheduler.add_system(AppStage::Update, build_wander_system());
|
|
||||||
scheduler.add_system(AppStage::Update, build_navigate_system());
|
|
||||||
scheduler.add_system(AppStage::Update, build_move_system());
|
|
||||||
scheduler.add_system(AppStage::Update, build_print_status_system());
|
|
||||||
|
|
||||||
world.insert(
|
world.insert(
|
||||||
(),
|
(),
|
||||||
vec![
|
vec![
|
||||||
|
@ -112,7 +115,7 @@ fn build_wander_system() -> Box<dyn Schedulable> {
|
||||||
Write<NavigationPoint>,
|
Write<NavigationPoint>,
|
||||||
)>::query())
|
)>::query())
|
||||||
.build(move |_, world, time, person_query| {
|
.build(move |_, world, time, person_query| {
|
||||||
for (_, translation, mut wander, mut navigation_point) in person_query.iter(world) {
|
for (_, translation, mut wander, mut navigation_point) in person_query.iter_mut(world) {
|
||||||
wander.elapsed += time.delta_seconds;
|
wander.elapsed += time.delta_seconds;
|
||||||
if wander.elapsed >= wander.duration {
|
if wander.elapsed >= wander.duration {
|
||||||
let direction = math::vec3(
|
let direction = math::vec3(
|
||||||
|
@ -141,7 +144,7 @@ fn build_navigate_system() -> Box<dyn Schedulable> {
|
||||||
Write<NavigationPoint>,
|
Write<NavigationPoint>,
|
||||||
)>::query())
|
)>::query())
|
||||||
.build(move |_, world, _, person_query| {
|
.build(move |_, world, _, person_query| {
|
||||||
for (_, translation, mut velocity, navigation_point) in person_query.iter(world) {
|
for (_, translation, mut velocity, navigation_point) in person_query.iter_mut(world) {
|
||||||
let distance = navigation_point.target - translation.0;
|
let distance = navigation_point.target - translation.0;
|
||||||
if distance.length() > 0.01 {
|
if distance.length() > 0.01 {
|
||||||
let direction = distance.normalize();
|
let direction = distance.normalize();
|
||||||
|
@ -158,7 +161,7 @@ fn build_move_system() -> Box<dyn Schedulable> {
|
||||||
.read_resource::<Time>()
|
.read_resource::<Time>()
|
||||||
.with_query(<(Write<Translation>, Read<Velocity>)>::query())
|
.with_query(<(Write<Translation>, Read<Velocity>)>::query())
|
||||||
.build(move |_, world, time, person_query| {
|
.build(move |_, world, time, person_query| {
|
||||||
for (mut translation, velocity) in person_query.iter(world) {
|
for (mut translation, velocity) in person_query.iter_mut(world) {
|
||||||
translation.0 += velocity.value * time.delta_seconds;
|
translation.0 += velocity.value * time.delta_seconds;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -8,7 +8,11 @@ use bevy::{
|
||||||
struct Rotator;
|
struct Rotator;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
AppBuilder::new().add_defaults().setup(&setup).run();
|
AppBuilder::new()
|
||||||
|
.add_defaults()
|
||||||
|
.setup_world(setup)
|
||||||
|
.setup_systems(|builder: Builder| builder.add_system(build_rotator_system()))
|
||||||
|
.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn build_rotator_system() -> Box<dyn Schedulable> {
|
fn build_rotator_system() -> Box<dyn Schedulable> {
|
||||||
|
@ -16,13 +20,13 @@ fn build_rotator_system() -> Box<dyn Schedulable> {
|
||||||
.read_resource::<Time>()
|
.read_resource::<Time>()
|
||||||
.with_query(<(Write<Rotator>, Write<Rotation>)>::query())
|
.with_query(<(Write<Rotator>, Write<Rotation>)>::query())
|
||||||
.build(move |_, world, time, light_query| {
|
.build(move |_, world, time, light_query| {
|
||||||
for (_, mut rotation) in light_query.iter(world) {
|
for (_, mut rotation) in light_query.iter_mut(world) {
|
||||||
rotation.0 = rotation.0 * Quat::from_rotation_x(3.0 * time.delta_seconds);
|
rotation.0 = rotation.0 * Quat::from_rotation_x(3.0 * time.delta_seconds);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(world: &mut World, scheduler: &mut SystemScheduler<AppStage>) {
|
fn setup(world: &mut World) {
|
||||||
let cube = Mesh::load(MeshType::Cube);
|
let cube = Mesh::load(MeshType::Cube);
|
||||||
let plane = Mesh::load(MeshType::Plane { size: 10.0 });
|
let plane = Mesh::load(MeshType::Plane { size: 10.0 });
|
||||||
|
|
||||||
|
@ -37,10 +41,6 @@ fn setup(world: &mut World, scheduler: &mut SystemScheduler<AppStage>) {
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
let transform_system_bundle = transform_system_bundle::build(world);
|
|
||||||
scheduler.add_systems(AppStage::Update, transform_system_bundle);
|
|
||||||
scheduler.add_system(AppStage::Update, build_rotator_system());
|
|
||||||
|
|
||||||
// plane
|
// plane
|
||||||
world.insert(
|
world.insert(
|
||||||
(),
|
(),
|
||||||
|
|
|
@ -6,10 +6,10 @@ use bevy::{
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
AppBuilder::new().add_defaults().setup(&setup).run();
|
AppBuilder::new().add_defaults().setup_world(setup).run();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(world: &mut World, scheduler: &mut SystemScheduler<AppStage>) {
|
fn setup(world: &mut World) {
|
||||||
let cube = Mesh::load(MeshType::Cube);
|
let cube = Mesh::load(MeshType::Cube);
|
||||||
let plane = Mesh::load(MeshType::Plane { size: 10.0 });
|
let plane = Mesh::load(MeshType::Plane { size: 10.0 });
|
||||||
|
|
||||||
|
@ -24,9 +24,6 @@ fn setup(world: &mut World, scheduler: &mut SystemScheduler<AppStage>) {
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
let transform_system_bundle = transform_system_bundle::build(world);
|
|
||||||
scheduler.add_systems(AppStage::Update, transform_system_bundle);
|
|
||||||
|
|
||||||
// plane
|
// plane
|
||||||
world.insert(
|
world.insert(
|
||||||
(),
|
(),
|
||||||
|
|
|
@ -6,10 +6,10 @@ use bevy::{
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
AppBuilder::new().add_defaults().setup(&setup).run();
|
AppBuilder::new().add_defaults().setup_world(setup).run();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(world: &mut World, scheduler: &mut SystemScheduler<AppStage>) {
|
fn setup(world: &mut World) {
|
||||||
let cube = Mesh::load(MeshType::Cube);
|
let cube = Mesh::load(MeshType::Cube);
|
||||||
let cube_handle = {
|
let cube_handle = {
|
||||||
let mut mesh_storage = world
|
let mut mesh_storage = world
|
||||||
|
@ -19,9 +19,6 @@ fn setup(world: &mut World, scheduler: &mut SystemScheduler<AppStage>) {
|
||||||
mesh_storage.add(cube, "cube")
|
mesh_storage.add(cube, "cube")
|
||||||
};
|
};
|
||||||
|
|
||||||
let transform_system_bundle = transform_system_bundle::build(world);
|
|
||||||
scheduler.add_systems(AppStage::Update, transform_system_bundle);
|
|
||||||
|
|
||||||
world.insert(
|
world.insert(
|
||||||
(),
|
(),
|
||||||
vec![(
|
vec![(
|
||||||
|
|
|
@ -1,48 +1,58 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
asset::AssetStorage,
|
asset::AssetStorage,
|
||||||
legion::prelude::{SystemScheduler, World},
|
legion::{
|
||||||
|
prelude::{Schedule, World},
|
||||||
|
schedule::Builder,
|
||||||
|
},
|
||||||
render::{passes::*, *},
|
render::{passes::*, *},
|
||||||
App, AppStage, Time,
|
transform_system_bundle, App, Time,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct AppBuilder {
|
pub struct AppBuilder {
|
||||||
pub app: App,
|
pub world: World,
|
||||||
|
pub schedule_builder: Builder,
|
||||||
|
pub render_graph: RenderGraph,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AppBuilder {
|
impl AppBuilder {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
let world = World::new();
|
|
||||||
let scheduler = SystemScheduler::<AppStage>::new();
|
|
||||||
AppBuilder {
|
AppBuilder {
|
||||||
app: App::new(world, scheduler),
|
world: World::new(),
|
||||||
|
schedule_builder: Schedule::builder(),
|
||||||
|
render_graph: RenderGraph::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build(self) -> App {
|
pub fn build(self) -> App {
|
||||||
self.app
|
App::new(self.world, self.schedule_builder.build(), self.render_graph)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run(self) {
|
pub fn run(self) {
|
||||||
self.app.run();
|
self.build().run();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn with_world(mut self, world: World) -> Self {
|
pub fn with_world(mut self, world: World) -> Self {
|
||||||
self.app.world = world;
|
self.world = world;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn with_scheduler(mut self, scheduler: SystemScheduler<AppStage>) -> Self {
|
pub fn with_schedule(mut self, schedule_builder: Builder) -> Self {
|
||||||
self.app.scheduler = scheduler;
|
self.schedule_builder = schedule_builder;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn setup(mut self, setup: &dyn Fn(&mut World, &mut SystemScheduler<AppStage>)) -> Self {
|
pub fn setup_world(mut self, setup: impl Fn(&mut World)) -> Self {
|
||||||
setup(&mut self.app.world, &mut self.app.scheduler);
|
setup(&mut self.world);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn setup_systems(mut self, setup: impl Fn(Builder) -> Builder) -> Self {
|
||||||
|
self.schedule_builder = setup(self.schedule_builder);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_default_passes(mut self) -> Self {
|
pub fn add_default_passes(mut self) -> Self {
|
||||||
let render_graph = &mut self.app.render_graph;
|
let render_graph = &mut self.render_graph;
|
||||||
render_graph
|
render_graph
|
||||||
.add_render_resource_manager(Box::new(render_resources::MaterialResourceManager));
|
.add_render_resource_manager(Box::new(render_resources::MaterialResourceManager));
|
||||||
render_graph
|
render_graph
|
||||||
|
@ -65,13 +75,22 @@ impl AppBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_default_resources(mut self) -> Self {
|
pub fn add_default_resources(mut self) -> Self {
|
||||||
let resources = &mut self.app.world.resources;
|
let resources = &mut self.world.resources;
|
||||||
resources.insert(Time::new());
|
resources.insert(Time::new());
|
||||||
resources.insert(AssetStorage::<Mesh, MeshType>::new());
|
resources.insert(AssetStorage::<Mesh, MeshType>::new());
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn add_default_systems(mut self) -> Self {
|
||||||
|
for transform_system in transform_system_bundle::build(&mut self.world).drain(..) {
|
||||||
|
self.schedule_builder = self.schedule_builder.add_system(transform_system);
|
||||||
|
}
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
pub fn add_defaults(self) -> Self {
|
pub fn add_defaults(self) -> Self {
|
||||||
self.add_default_resources().add_default_passes()
|
self.add_default_resources()
|
||||||
|
.add_default_passes()
|
||||||
|
.add_default_systems()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
use legion::schedule::Stage;
|
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
|
||||||
pub enum AppStage {
|
|
||||||
Update,
|
|
||||||
Render,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Stage for AppStage {}
|
|
||||||
|
|
||||||
impl std::fmt::Display for AppStage {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
||||||
match self {
|
|
||||||
AppStage::Update => write!(f, "update"),
|
|
||||||
AppStage::Render => write!(f, "draw"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,8 +1,6 @@
|
||||||
mod app_builder;
|
mod app_builder;
|
||||||
mod app_stage;
|
|
||||||
|
|
||||||
pub use app_builder::AppBuilder;
|
pub use app_builder::AppBuilder;
|
||||||
pub use app_stage::AppStage;
|
|
||||||
|
|
||||||
use winit::{
|
use winit::{
|
||||||
event,
|
event,
|
||||||
|
@ -20,15 +18,15 @@ pub struct App {
|
||||||
pub window: Option<Window>,
|
pub window: Option<Window>,
|
||||||
pub render_graph: RenderGraph,
|
pub render_graph: RenderGraph,
|
||||||
pub swap_chain: Option<wgpu::SwapChain>,
|
pub swap_chain: Option<wgpu::SwapChain>,
|
||||||
pub scheduler: SystemScheduler<AppStage>,
|
pub scheduler: Schedule,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl App {
|
impl App {
|
||||||
pub fn new(world: World, scheduler: SystemScheduler<AppStage>) -> App {
|
pub fn new(world: World, schedule: Schedule, render_graph: RenderGraph) -> App {
|
||||||
App {
|
App {
|
||||||
world: world,
|
world: world,
|
||||||
scheduler: scheduler,
|
scheduler: schedule,
|
||||||
render_graph: RenderGraph::new(),
|
render_graph: render_graph,
|
||||||
swap_chain: None,
|
swap_chain: None,
|
||||||
window: None,
|
window: None,
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,12 +5,12 @@ pub mod render;
|
||||||
mod vertex;
|
mod vertex;
|
||||||
|
|
||||||
pub use crate::core::*;
|
pub use crate::core::*;
|
||||||
pub use app::{App, AppBuilder, AppStage};
|
pub use app::{App, AppBuilder};
|
||||||
|
|
||||||
pub use glam as math;
|
pub use glam as math;
|
||||||
pub use legion;
|
pub use legion;
|
||||||
pub use legion::prelude::*;
|
pub use legion::prelude::*;
|
||||||
pub use legion::schedule::Schedulable;
|
pub use legion::schedule::{Schedulable, Builder};
|
||||||
pub use legion_transform;
|
pub use legion_transform;
|
||||||
pub use legion_transform::prelude::*;
|
pub use legion_transform::prelude::*;
|
||||||
pub use legion_transform::transform_system_bundle;
|
pub use legion_transform::transform_system_bundle;
|
||||||
|
|
|
@ -140,9 +140,9 @@ impl Pipeline for ForwardPipeline {
|
||||||
.get_mut::<AssetStorage<Mesh, MeshType>>()
|
.get_mut::<AssetStorage<Mesh, MeshType>>()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let mut last_mesh_id = None;
|
let mut last_mesh_id = None;
|
||||||
let mut mesh_query =
|
let mesh_query =
|
||||||
<(Read<Material>, Read<Handle<Mesh>>)>::query().filter(!component::<Instanced>());
|
<(Read<Material>, Read<Handle<Mesh>>)>::query().filter(!component::<Instanced>());
|
||||||
for (material, mesh) in mesh_query.iter_immutable(world) {
|
for (material, mesh) in mesh_query.iter(world) {
|
||||||
let current_mesh_id = *mesh.id.read().unwrap();
|
let current_mesh_id = *mesh.id.read().unwrap();
|
||||||
|
|
||||||
let mut should_load_mesh = last_mesh_id == None;
|
let mut should_load_mesh = last_mesh_id == None;
|
||||||
|
|
|
@ -27,13 +27,13 @@ impl ForwardInstancedPipeline {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_instance_buffer_infos(device: &Device, world: &World) -> Vec<InstanceBufferInfo> {
|
fn create_instance_buffer_infos(device: &Device, world: &World) -> Vec<InstanceBufferInfo> {
|
||||||
let mut entities = <(
|
let entities = <(
|
||||||
Read<Material>,
|
Read<Material>,
|
||||||
Read<LocalToWorld>,
|
Read<LocalToWorld>,
|
||||||
Read<Handle<Mesh>>,
|
Read<Handle<Mesh>>,
|
||||||
Read<Instanced>,
|
Read<Instanced>,
|
||||||
)>::query();
|
)>::query();
|
||||||
let entities_count = entities.iter_immutable(world).count();
|
let entities_count = entities.iter(world).count();
|
||||||
if entities_count == 0 {
|
if entities_count == 0 {
|
||||||
return Vec::new();
|
return Vec::new();
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,7 @@ impl ForwardInstancedPipeline {
|
||||||
|
|
||||||
let mut last_mesh_id = None;
|
let mut last_mesh_id = None;
|
||||||
for ((material, transform, mesh, _), slot) in entities
|
for ((material, transform, mesh, _), slot) in entities
|
||||||
.iter_immutable(world)
|
.iter(world)
|
||||||
.zip(temp_buf_data.data.chunks_exact_mut(size))
|
.zip(temp_buf_data.data.chunks_exact_mut(size))
|
||||||
{
|
{
|
||||||
last_mesh_id = Some(*mesh.id.read().unwrap());
|
last_mesh_id = Some(*mesh.id.read().unwrap());
|
||||||
|
@ -79,17 +79,17 @@ impl ForwardInstancedPipeline {
|
||||||
device: &Device,
|
device: &Device,
|
||||||
world: &World,
|
world: &World,
|
||||||
) -> Vec<InstanceBufferInfo> {
|
) -> Vec<InstanceBufferInfo> {
|
||||||
let mut entities = <(
|
let entities = <(
|
||||||
Read<Material>,
|
Read<Material>,
|
||||||
Read<LocalToWorld>,
|
Read<LocalToWorld>,
|
||||||
Read<Handle<Mesh>>,
|
Read<Handle<Mesh>>,
|
||||||
Read<Instanced>,
|
Read<Instanced>,
|
||||||
)>::query();
|
)>::query();
|
||||||
let entities_count = entities.iter_immutable(world).count();
|
let entities_count = entities.iter(world).count();
|
||||||
|
|
||||||
let mut last_mesh_id = None;
|
let mut last_mesh_id = None;
|
||||||
let mut data = Vec::with_capacity(entities_count);
|
let mut data = Vec::with_capacity(entities_count);
|
||||||
for (material, transform, mesh, _) in entities.iter_immutable(world) {
|
for (material, transform, mesh, _) in entities.iter(world) {
|
||||||
last_mesh_id = Some(*mesh.id.read().unwrap());
|
last_mesh_id = Some(*mesh.id.read().unwrap());
|
||||||
let (_, _, translation) = transform.0.to_scale_rotation_translation();
|
let (_, _, translation) = transform.0.to_scale_rotation_translation();
|
||||||
|
|
||||||
|
|
|
@ -166,14 +166,14 @@ impl Pipeline for ForwardShadowPassNew {
|
||||||
_swap_chain_output: &SwapChainOutput,
|
_swap_chain_output: &SwapChainOutput,
|
||||||
world: &mut World,
|
world: &mut World,
|
||||||
) {
|
) {
|
||||||
let mut mesh_query = <(Read<Material>, Read<Handle<Mesh>>)>::query();
|
let mesh_query = <(Read<Material>, Read<Handle<Mesh>>)>::query();
|
||||||
pass.set_bind_group(0, self.bind_group.as_ref().unwrap(), &[]);
|
pass.set_bind_group(0, self.bind_group.as_ref().unwrap(), &[]);
|
||||||
|
|
||||||
let mut mesh_storage = world
|
let mut mesh_storage = world
|
||||||
.resources
|
.resources
|
||||||
.get_mut::<AssetStorage<Mesh, MeshType>>()
|
.get_mut::<AssetStorage<Mesh, MeshType>>()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
for (material, mesh) in mesh_query.iter_immutable(world) {
|
for (material, mesh) in mesh_query.iter(world) {
|
||||||
if let Some(mesh_asset) = mesh_storage.get(*mesh.id.read().unwrap()) {
|
if let Some(mesh_asset) = mesh_storage.get(*mesh.id.read().unwrap()) {
|
||||||
mesh_asset.setup_buffers(&render_graph.device);
|
mesh_asset.setup_buffers(&render_graph.device);
|
||||||
pass.set_bind_group(1, material.bind_group.as_ref().unwrap(), &[]);
|
pass.set_bind_group(1, material.bind_group.as_ref().unwrap(), &[]);
|
||||||
|
|
|
@ -57,9 +57,9 @@ impl Pass for ShadowPass {
|
||||||
self.light_index = 0;
|
self.light_index = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut light_query = <(Write<Light>, Read<LocalToWorld>, Read<Translation>)>::query();
|
let light_query = <(Write<Light>, Read<LocalToWorld>, Read<Translation>)>::query();
|
||||||
let light_count = light_query.iter(world).count();
|
let light_count = light_query.iter_mut(world).count();
|
||||||
for (i, (mut light, _, _)) in light_query.iter(world).enumerate() {
|
for (i, (mut light, _, _)) in light_query.iter_mut(world).enumerate() {
|
||||||
if i != self.light_index as usize {
|
if i != self.light_index as usize {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,7 +153,7 @@ impl Pipeline for ShadowPipeline {
|
||||||
_: &SwapChainOutput,
|
_: &SwapChainOutput,
|
||||||
world: &mut World,
|
world: &mut World,
|
||||||
) {
|
) {
|
||||||
let mut mesh_query =
|
let mesh_query =
|
||||||
<(Read<Material>, Read<Handle<Mesh>>)>::query().filter(!component::<Instanced>());
|
<(Read<Material>, Read<Handle<Mesh>>)>::query().filter(!component::<Instanced>());
|
||||||
pass.set_bind_group(0, self.bind_group.as_ref().unwrap(), &[]);
|
pass.set_bind_group(0, self.bind_group.as_ref().unwrap(), &[]);
|
||||||
|
|
||||||
|
@ -161,7 +161,7 @@ impl Pipeline for ShadowPipeline {
|
||||||
.resources
|
.resources
|
||||||
.get_mut::<AssetStorage<Mesh, MeshType>>()
|
.get_mut::<AssetStorage<Mesh, MeshType>>()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
for (material, mesh) in mesh_query.iter_immutable(world) {
|
for (material, mesh) in mesh_query.iter(world) {
|
||||||
if let Some(mesh_asset) = mesh_storage.get(*mesh.id.read().unwrap()) {
|
if let Some(mesh_asset) = mesh_storage.get(*mesh.id.read().unwrap()) {
|
||||||
mesh_asset.setup_buffers(&render_graph.device);
|
mesh_asset.setup_buffers(&render_graph.device);
|
||||||
|
|
||||||
|
|
|
@ -39,8 +39,8 @@ impl UiPipeline {
|
||||||
device: &wgpu::Device,
|
device: &wgpu::Device,
|
||||||
world: &World,
|
world: &World,
|
||||||
) -> Vec<InstanceBufferInfo> {
|
) -> Vec<InstanceBufferInfo> {
|
||||||
let mut rect_query = <Read<Rect>>::query();
|
let rect_query = <Read<Rect>>::query();
|
||||||
let rect_count = rect_query.iter_immutable(world).count();
|
let rect_count = rect_query.iter(world).count();
|
||||||
|
|
||||||
if rect_count == 0 {
|
if rect_count == 0 {
|
||||||
return Vec::new();
|
return Vec::new();
|
||||||
|
@ -49,7 +49,7 @@ impl UiPipeline {
|
||||||
let mut data = Vec::with_capacity(rect_count);
|
let mut data = Vec::with_capacity(rect_count);
|
||||||
// TODO: this probably isn't the best way to handle z-ordering
|
// TODO: this probably isn't the best way to handle z-ordering
|
||||||
let mut z = 0.9999;
|
let mut z = 0.9999;
|
||||||
for rect in rect_query.iter_immutable(world) {
|
for rect in rect_query.iter(world) {
|
||||||
data.push(RectData {
|
data.push(RectData {
|
||||||
position: rect.position.into(),
|
position: rect.position.into(),
|
||||||
dimensions: rect.dimensions.into(),
|
dimensions: rect.dimensions.into(),
|
||||||
|
|
|
@ -47,7 +47,7 @@ impl RenderResourceManager for Global2dResourceManager {
|
||||||
encoder: &'a mut wgpu::CommandEncoder,
|
encoder: &'a mut wgpu::CommandEncoder,
|
||||||
world: &mut World,
|
world: &mut World,
|
||||||
) {
|
) {
|
||||||
for (mut camera, _) in <(Write<Camera>, Read<ActiveCamera2d>)>::query().iter(world) {
|
for (mut camera, _) in <(Write<Camera>, Read<ActiveCamera2d>)>::query().iter_mut(world) {
|
||||||
camera.update(
|
camera.update(
|
||||||
render_graph.swap_chain_descriptor.width,
|
render_graph.swap_chain_descriptor.width,
|
||||||
render_graph.swap_chain_descriptor.height,
|
render_graph.swap_chain_descriptor.height,
|
||||||
|
|
|
@ -10,7 +10,7 @@ pub struct GlobalResourceManager;
|
||||||
|
|
||||||
impl RenderResourceManager for GlobalResourceManager {
|
impl RenderResourceManager for GlobalResourceManager {
|
||||||
fn initialize(&self, render_graph: &mut RenderGraphData, world: &mut World) {
|
fn initialize(&self, render_graph: &mut RenderGraphData, world: &mut World) {
|
||||||
let light_count = <Read<Light>>::query().iter_immutable(world).count();
|
let light_count = <Read<Light>>::query().iter(world).count();
|
||||||
let forward_uniforms = ForwardUniforms {
|
let forward_uniforms = ForwardUniforms {
|
||||||
proj: math::Mat4::identity().to_cols_array_2d(),
|
proj: math::Mat4::identity().to_cols_array_2d(),
|
||||||
num_lights: [light_count as u32, 0, 0, 0],
|
num_lights: [light_count as u32, 0, 0, 0],
|
||||||
|
@ -42,7 +42,7 @@ impl RenderResourceManager for GlobalResourceManager {
|
||||||
world: &mut World,
|
world: &mut World,
|
||||||
) {
|
) {
|
||||||
for (mut camera, local_to_world, _) in
|
for (mut camera, local_to_world, _) in
|
||||||
<(Write<Camera>, Read<LocalToWorld>, Read<ActiveCamera>)>::query().iter(world)
|
<(Write<Camera>, Read<LocalToWorld>, Read<ActiveCamera>)>::query().iter_mut(world)
|
||||||
{
|
{
|
||||||
camera.update(
|
camera.update(
|
||||||
render_graph.swap_chain_descriptor.width,
|
render_graph.swap_chain_descriptor.width,
|
||||||
|
|
|
@ -44,7 +44,7 @@ impl RenderResourceManager for LightResourceManager {
|
||||||
world: &mut World,
|
world: &mut World,
|
||||||
) {
|
) {
|
||||||
if self.lights_are_dirty {
|
if self.lights_are_dirty {
|
||||||
let mut light_query = <(Read<Light>, Read<LocalToWorld>, Read<Translation>)>::query();
|
let light_query = <(Read<Light>, Read<LocalToWorld>, Read<Translation>)>::query();
|
||||||
let light_count = light_query.iter(world).count();
|
let light_count = light_query.iter(world).count();
|
||||||
|
|
||||||
if light_count == 0 {
|
if light_count == 0 {
|
||||||
|
|
|
@ -31,9 +31,9 @@ impl RenderResourceManager for MaterialResourceManager {
|
||||||
encoder: &'a mut wgpu::CommandEncoder,
|
encoder: &'a mut wgpu::CommandEncoder,
|
||||||
world: &mut World,
|
world: &mut World,
|
||||||
) {
|
) {
|
||||||
let mut entities =
|
let entities =
|
||||||
<(Write<Material>, Read<LocalToWorld>)>::query().filter(!component::<Instanced>());
|
<(Write<Material>, Read<LocalToWorld>)>::query().filter(!component::<Instanced>());
|
||||||
let entities_count = entities.iter(world).count();
|
let entities_count = entities.iter_mut(world).count();
|
||||||
if entities_count == 0 {
|
if entities_count == 0 {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ impl RenderResourceManager for MaterialResourceManager {
|
||||||
.create_buffer_mapped(entities_count * size, wgpu::BufferUsage::COPY_SRC);
|
.create_buffer_mapped(entities_count * size, wgpu::BufferUsage::COPY_SRC);
|
||||||
|
|
||||||
for ((material, transform), slot) in entities
|
for ((material, transform), slot) in entities
|
||||||
.iter(world)
|
.iter_mut(world)
|
||||||
.zip(temp_buf_data.data.chunks_exact_mut(size))
|
.zip(temp_buf_data.data.chunks_exact_mut(size))
|
||||||
{
|
{
|
||||||
slot.copy_from_slice(
|
slot.copy_from_slice(
|
||||||
|
@ -62,7 +62,7 @@ impl RenderResourceManager for MaterialResourceManager {
|
||||||
|
|
||||||
for mut material in <Write<Material>>::query()
|
for mut material in <Write<Material>>::query()
|
||||||
.filter(!component::<Instanced>())
|
.filter(!component::<Instanced>())
|
||||||
.iter(world)
|
.iter_mut(world)
|
||||||
{
|
{
|
||||||
if let None = material.bind_group {
|
if let None = material.bind_group {
|
||||||
let material_uniform_size =
|
let material_uniform_size =
|
||||||
|
@ -92,7 +92,7 @@ impl RenderResourceManager for MaterialResourceManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
let temp_buf = temp_buf_data.finish();
|
let temp_buf = temp_buf_data.finish();
|
||||||
for (i, (material, _)) in entities.iter(world).enumerate() {
|
for (i, (material, _)) in entities.iter_mut(world).enumerate() {
|
||||||
encoder.copy_buffer_to_buffer(
|
encoder.copy_buffer_to_buffer(
|
||||||
&temp_buf,
|
&temp_buf,
|
||||||
(i * size) as wgpu::BufferAddress,
|
(i * size) as wgpu::BufferAddress,
|
||||||
|
|
|
@ -7,7 +7,7 @@ edition = "2018"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
legion = { git = "https://github.com/TomGillen/legion.git", rev = "8628b227bcbe57582fffb5e80e73c634ec4eebd9" }
|
legion = { git = "https://github.com/TomGillen/legion.git", rev = "940ef3bfcb77e5d074ee3184b776ff1600da228d" }
|
||||||
#legion = { path = "../legion" }
|
#legion = { path = "../legion" }
|
||||||
glam = "0.8.3"
|
glam = "0.8.3"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
|
|
|
@ -49,7 +49,7 @@ pub fn build(_: &mut World) -> Vec<Box<dyn Schedulable>> {
|
||||||
HashMap::<Entity, SmallVec<[Entity; 8]>>::with_capacity(16);
|
HashMap::<Entity, SmallVec<[Entity; 8]>>::with_capacity(16);
|
||||||
|
|
||||||
// Entities with a changed Parent (that also have a PreviousParent, even if None)
|
// Entities with a changed Parent (that also have a PreviousParent, even if None)
|
||||||
for (entity, (parent, mut previous_parent)) in queries.1.iter_entities(world) {
|
for (entity, (parent, mut previous_parent)) in queries.1.iter_entities_mut(world) {
|
||||||
log::trace!("Parent changed for {}", entity);
|
log::trace!("Parent changed for {}", entity);
|
||||||
|
|
||||||
// If the `PreviousParent` is not None.
|
// If the `PreviousParent` is not None.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
use crate::{
|
use crate::{
|
||||||
components::*,
|
components::*,
|
||||||
ecs::{prelude::*, system::PreparedWorld},
|
ecs::{prelude::*, system::SubWorld},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn build(_: &mut World) -> Box<dyn Schedulable> {
|
pub fn build(_: &mut World) -> Box<dyn Schedulable> {
|
||||||
|
@ -22,7 +22,7 @@ pub fn build(_: &mut World) -> Box<dyn Schedulable> {
|
||||||
|
|
||||||
fn propagate_recursive(
|
fn propagate_recursive(
|
||||||
parent_local_to_world: LocalToWorld,
|
parent_local_to_world: LocalToWorld,
|
||||||
world: &mut PreparedWorld,
|
world: &mut SubWorld,
|
||||||
entity: Entity,
|
entity: Entity,
|
||||||
commands: &mut CommandBuffer,
|
commands: &mut CommandBuffer,
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -224,7 +224,7 @@ pub fn build(_: &mut World) -> Box<dyn Schedulable> {
|
||||||
// Just to issue warnings: Scale + NonUniformScale
|
// Just to issue warnings: Scale + NonUniformScale
|
||||||
#[allow(unused_unsafe)]
|
#[allow(unused_unsafe)]
|
||||||
unsafe {
|
unsafe {
|
||||||
l.iter_entities_immutable(world).for_each(
|
l.iter_entities(world).for_each(
|
||||||
|(entity, (mut _ltw, _scale, _non_uniform_scale))| {
|
|(entity, (mut _ltw, _scale, _non_uniform_scale))| {
|
||||||
log::warn!(
|
log::warn!(
|
||||||
"Entity {:?} has both a Scale and NonUniformScale component.",
|
"Entity {:?} has both a Scale and NonUniformScale component.",
|
||||||
|
|
Loading…
Reference in a new issue