make WorldBuilder non-consuming

This commit is contained in:
Carter Anderson 2020-04-07 13:25:01 -07:00
parent 45e28ef32b
commit 2565a69230
11 changed files with 29 additions and 44 deletions

View File

@ -26,18 +26,16 @@ pub struct WorldBuilder<'a> {
parent_entity: Option<Entity>, parent_entity: Option<Entity>,
} }
// TODO: make this a non-consuming builder
impl<'a> WorldBuilder<'a> { impl<'a> WorldBuilder<'a> {
pub fn build_entity(mut self) -> Self { pub fn build_entity(&mut self) -> &mut Self {
let entity = *self.world.insert((), vec![()]).first().unwrap(); let entity = *self.world.insert((), vec![()]).first().unwrap();
self.current_entity = Some(entity); self.current_entity = Some(entity);
self.add_parent_to_current_entity(); self.add_parent_to_current_entity();
self self
} }
pub fn build(self) {}
// note: this is slow and does a full entity copy /// note: this is slow and does a full entity copy
pub fn add<T>(self, component: T) -> Self pub fn add<T>(&mut self, component: T) -> &mut Self
where where
T: legion::storage::Component, T: legion::storage::Component,
{ {
@ -47,7 +45,7 @@ impl<'a> WorldBuilder<'a> {
self self
} }
pub fn tag<T>(self, tag: T) -> Self pub fn tag<T>(&mut self, tag: T) -> &mut Self
where where
T: legion::storage::Tag, T: legion::storage::Tag,
{ {
@ -57,7 +55,7 @@ impl<'a> WorldBuilder<'a> {
self self
} }
pub fn add_entities<T, C>(self, tags: T, components: C) -> Self pub fn add_entities<T, C>(&mut self, tags: T, components: C) -> &mut Self
where where
T: TagSet + TagLayout + for<'b> Filter<ChunksetFilterData<'b>>, T: TagSet + TagLayout + for<'b> Filter<ChunksetFilterData<'b>>,
C: IntoComponentSource, C: IntoComponentSource,
@ -66,18 +64,18 @@ impl<'a> WorldBuilder<'a> {
self self
} }
pub fn add_entity(mut self, entity_archetype: impl EntityArchetype) -> Self { pub fn add_entity(&mut self, entity_archetype: impl EntityArchetype) -> &mut Self {
let current_entity = entity_archetype.insert(self.world); let current_entity = entity_archetype.insert(self.world);
self.current_entity = Some(current_entity); self.current_entity = Some(current_entity);
self.add_parent_to_current_entity(); self.add_parent_to_current_entity();
self self
} }
pub fn add_children(mut self, build_children: impl Fn(WorldBuilder) -> WorldBuilder) -> Self { pub fn add_children(&mut self, build_children: impl Fn(&mut WorldBuilder)) -> &mut Self {
self.parent_entity = self.current_entity; self.parent_entity = self.current_entity;
self.current_entity = None; self.current_entity = None;
self = build_children(self); build_children(self);
self.current_entity = self.parent_entity; self.current_entity = self.parent_entity;
self.parent_entity = None; self.parent_entity = None;

View File

@ -126,6 +126,5 @@ fn setup(world: &mut World, resources: &mut Resources) {
Vec3::new(0.0, 0.0, 1.0), Vec3::new(0.0, 0.0, 1.0),
)), )),
..Default::default() ..Default::default()
}) });
.build();
} }

View File

@ -104,8 +104,7 @@ fn create_entities_builder_add_component(
Vec3::new(3.0, 8.0, 5.0), Vec3::new(3.0, 8.0, 5.0),
Vec3::new(0.0, 0.0, 0.0), Vec3::new(0.0, 0.0, 0.0),
Vec3::new(0.0, 0.0, 1.0), Vec3::new(0.0, 0.0, 1.0),
))) )));
.build();
} }
fn create_entities_builder_archetype( fn create_entities_builder_archetype(
@ -143,8 +142,7 @@ fn create_entities_builder_archetype(
Vec3::new(0.0, 0.0, 1.0), Vec3::new(0.0, 0.0, 1.0),
)), )),
..Default::default() ..Default::default()
}) });
.build();
} }
fn setup(world: &mut World, resources: &mut Resources) { fn setup(world: &mut World, resources: &mut Resources) {

View File

@ -89,6 +89,5 @@ fn setup(world: &mut World, resources: &mut Resources) {
Vec3::new(0.0, 0.0, 1.0), Vec3::new(0.0, 0.0, 1.0),
)), )),
..Default::default() ..Default::default()
}) });
.build();
} }

View File

@ -44,8 +44,8 @@ fn setup(world: &mut World, resources: &mut Resources) {
..Default::default() ..Default::default()
}); });
let mut builder = world let mut builder = world.build();
.build() builder
// plane // plane
.add_entity(MeshEntity { .add_entity(MeshEntity {
mesh: plane_handle, mesh: plane_handle,
@ -84,7 +84,7 @@ fn setup(world: &mut World, resources: &mut Resources) {
), ),
..Default::default() ..Default::default()
}); });
builder = builder.add_entity(MeshEntity { builder.add_entity(MeshEntity {
mesh: cube_handle, mesh: cube_handle,
material: spawned_material_handle, material: spawned_material_handle,
translation: Translation::new( translation: Translation::new(
@ -97,8 +97,6 @@ fn setup(world: &mut World, resources: &mut Resources) {
..Default::default() ..Default::default()
}, },
..Default::default() ..Default::default()
}) });
} }
builder.build();
} }

View File

@ -52,7 +52,7 @@ fn setup(world: &mut World, resources: &mut Resources) {
material: cube_material_handle, material: cube_material_handle,
translation: Translation::new(0.0, 0.0, 3.0), translation: Translation::new(0.0, 0.0, 3.0),
..Default::default() ..Default::default()
}) });
}) })
// light // light
.add_entity(LightEntity { .add_entity(LightEntity {
@ -67,6 +67,5 @@ fn setup(world: &mut World, resources: &mut Resources) {
Vec3::new(0.0, 0.0, 1.0), Vec3::new(0.0, 0.0, 1.0),
)), )),
..Default::default() ..Default::default()
}) });
.build();
} }

View File

@ -53,6 +53,5 @@ fn setup(world: &mut World, resources: &mut Resources) {
Vec3::new(0.0, 0.0, 1.0), Vec3::new(0.0, 0.0, 1.0),
)), )),
..Default::default() ..Default::default()
}) });
.build();
} }

View File

@ -44,8 +44,8 @@ fn setup(world: &mut World, resources: &mut Resources) {
..Default::default() ..Default::default()
}); });
let mut builder = world let mut builder = world.build();
.build() builder
// plane // plane
.add_entity(MeshEntity { .add_entity(MeshEntity {
mesh: plane_handle, mesh: plane_handle,
@ -84,7 +84,7 @@ fn setup(world: &mut World, resources: &mut Resources) {
), ),
..Default::default() ..Default::default()
}); });
builder = builder.add_entity(MeshEntity { builder.add_entity(MeshEntity {
mesh: cube_handle, mesh: cube_handle,
material: spawned_material_handle, material: spawned_material_handle,
translation: Translation::new( translation: Translation::new(
@ -93,8 +93,6 @@ fn setup(world: &mut World, resources: &mut Resources) {
0.0, 0.0,
), ),
..Default::default() ..Default::default()
}) });
} }
builder.build();
} }

View File

@ -71,6 +71,5 @@ fn setup(world: &mut World, resources: &mut Resources) {
Vec3::new(0.0, 0.0, 1.0), Vec3::new(0.0, 0.0, 1.0),
)), )),
..Default::default() ..Default::default()
}) });
.build();
} }

View File

@ -110,7 +110,7 @@ fn setup(world: &mut World, resources: &mut Resources) {
Margins::new(20.0, 20.0, 20.0, 20.0), Margins::new(20.0, 20.0, 20.0, 20.0),
Color::rgb(0.6, 0.6, 1.0), Color::rgb(0.6, 0.6, 1.0),
), ),
}) });
}) })
// alpha test // alpha test
.add_entity(UiEntity { .add_entity(UiEntity {
@ -120,6 +120,5 @@ fn setup(world: &mut World, resources: &mut Resources) {
Margins::new(0.0, 100.0, 0.0, 100.0), Margins::new(0.0, 100.0, 0.0, 100.0),
Color::rgba(1.0, 0.9, 0.9, 0.4), Color::rgba(1.0, 0.9, 0.9, 0.4),
), ),
}) });
.build();
} }

View File

@ -27,7 +27,8 @@ fn build_move_system() -> Box<dyn Schedulable> {
} }
fn setup(world: &mut World, _resources: &mut Resources) { fn setup(world: &mut World, _resources: &mut Resources) {
let mut builder = world.build().add_entity(Camera2dEntity { let mut builder = world.build();
builder.add_entity(Camera2dEntity {
camera: Camera::new(CameraType::default_orthographic()), camera: Camera::new(CameraType::default_orthographic()),
..Default::default() ..Default::default()
}); });
@ -37,7 +38,7 @@ fn setup(world: &mut World, _resources: &mut Resources) {
for i in 0..count { for i in 0..count {
// 2d camera // 2d camera
let cur = Vec2::new(1.0, 1.0) * 1.0 + prev; let cur = Vec2::new(1.0, 1.0) * 1.0 + prev;
builder = builder.add_entity(UiEntity { builder.add_entity(UiEntity {
node: Node::new( node: Node::new(
math::vec2(75.0, 75.0) + cur, math::vec2(75.0, 75.0) + cur,
Anchors::new(0.5, 0.5, 0.5, 0.5), Anchors::new(0.5, 0.5, 0.5, 0.5),
@ -48,6 +49,4 @@ fn setup(world: &mut World, _resources: &mut Resources) {
prev = cur; prev = cur;
} }
builder.build();
} }