use specs;
use specs::{Fetch, LazyUpdate, Entities};
use types::*;
use globe;
use cell_dweller;
use render;
use camera::DefaultCamera;
pub fn populate_world(world: &mut specs::World) {
let globe_entity = create_simple_globe_now(world);
let player_character_entity = create_simple_player_character_now(world, globe_entity);
create_simple_chase_camera_now(world, player_character_entity);
}
pub fn create_simple_globe_now(world: &mut specs::World) -> specs::Entity {
let globe = globe::Globe::new_earth_scale_example();
world
.create_entity()
.with(globe)
.with(::Spatial::new_root())
.build()
}
pub fn create_simple_player_character_now(
world: &mut specs::World,
globe_entity: specs::Entity,
) -> specs::Entity {
use rand::{XorShiftRng, SeedableRng};
use grid::Dir;
let (globe_spec, player_character_pos) = {
let mut globe_storage = world.write::<globe::Globe>();
let globe = globe_storage.get_mut(globe_entity).expect(
"Uh oh, it looks like our Globe went missing.",
);
let globe_spec = globe.spec();
let seed = globe_spec.seed;
let mut rng = XorShiftRng::from_seed([seed, seed, seed, seed]);
let player_character_pos = globe
.air_above_random_surface_dry_land(
&mut rng,
2, 5, 5, )
.expect(
"Oh noes, we took too many attempts to find a decent spawn point!",
);
(globe_spec, player_character_pos)
};
let mut player_character_visual = render::Visual::new_empty();
player_character_visual.proto_mesh = Some(render::make_axes_mesh());
let player_character_entity = world.create_entity()
.with(cell_dweller::CellDweller::new(
player_character_pos,
Dir::default(),
globe_spec,
Some(globe_entity),
))
.with(player_character_visual)
.with(::Spatial::new(globe_entity, Iso3::identity()))
.build();
world
.write_resource::<cell_dweller::ActiveCellDweller>()
.maybe_entity = Some(player_character_entity);
player_character_entity
}
pub fn create_simple_chase_camera_now(
world: &mut specs::World,
player_character_entity: specs::Entity,
) -> specs::Entity {
let eye = Pt3::new(0.0, 4.0, -6.0);
let target = Pt3::origin();
let camera_transform = Iso3::new_observer_frame(&eye, &target, &Vec3::z());
let camera_entity = world
.create_entity()
.with(::Spatial::new(player_character_entity, camera_transform))
.build();
use camera::DefaultCamera;
world.add_resource(DefaultCamera { camera_entity: Some(camera_entity) });
camera_entity
}
pub fn create_simple_chase_camera(
entities: &Entities,
updater: &Fetch<LazyUpdate>,
player_character_entity: specs::Entity,
default_camera: &mut DefaultCamera,
) -> specs::Entity {
let eye = Pt3::new(0.0, 4.0, -6.0);
let target = Pt3::origin();
let camera_transform = Iso3::new_observer_frame(&eye, &target, &Vec3::z());
let entity = entities.create();
updater.insert(entity, ::Spatial::new(player_character_entity, camera_transform));
default_camera.camera_entity = Some(entity);
entity
}