Use Visible
component with opacity to indicate that something should appear visually.
This commit is contained in:
parent
e90a85641b
commit
a59f8a22a1
|
@ -266,13 +266,9 @@ fn exploration_focus<S, A: 'static>(
|
||||||
config.action_explore_left.clone(),
|
config.action_explore_left.clone(),
|
||||||
config.action_explore_right.clone(),
|
config.action_explore_right.clone(),
|
||||||
) {
|
) {
|
||||||
println!("Here1");
|
|
||||||
for map in map.iter() {
|
for map in map.iter() {
|
||||||
println!("Here2");
|
|
||||||
if let Ok((entity, coordinates, exploring)) = explorers.single() {
|
if let Ok((entity, coordinates, exploring)) = explorers.single() {
|
||||||
println!("Here");
|
let coordinates = **coordinates;
|
||||||
let coordinates = coordinates.i32();
|
|
||||||
let coordinates = (coordinates.x() + 0.5, coordinates.y() + 0.5);
|
|
||||||
let mut exploring = if let Some(exploring) = exploring {
|
let mut exploring = if let Some(exploring) = exploring {
|
||||||
**exploring
|
**exploring
|
||||||
} else {
|
} else {
|
||||||
|
@ -346,7 +342,7 @@ fn exploration_changed_announcement(
|
||||||
for (map, revealed_tiles, visible_tiles) in map.iter() {
|
for (map, revealed_tiles, visible_tiles) in map.iter() {
|
||||||
let point = **exploring;
|
let point = **exploring;
|
||||||
let idx = point.to_index(map.width);
|
let idx = point.to_index(map.width);
|
||||||
let shape = Cuboid::new(Vec2::new(0.5, 0.5).into());
|
let shape = Cuboid::new(Vec2::new(0.49, 0.49).into());
|
||||||
let known = revealed_tiles[idx];
|
let known = revealed_tiles[idx];
|
||||||
let visible = visible_tiles[idx];
|
let visible = visible_tiles[idx];
|
||||||
let fog_of_war = known && !visible;
|
let fog_of_war = known && !visible;
|
||||||
|
|
|
@ -13,7 +13,7 @@ use crate::{
|
||||||
exploration::{ExplorationType, Mappable},
|
exploration::{ExplorationType, Mappable},
|
||||||
log::Log,
|
log::Log,
|
||||||
utils::target_and_other,
|
utils::target_and_other,
|
||||||
visibility::BlocksVisibility,
|
visibility::Visible,
|
||||||
};
|
};
|
||||||
|
|
||||||
impl From<mapgen::geometry::Point> for Coordinates {
|
impl From<mapgen::geometry::Point> for Coordinates {
|
||||||
|
@ -232,7 +232,7 @@ fn spawn_colliders(
|
||||||
.insert(MapObstruction)
|
.insert(MapObstruction)
|
||||||
.id();
|
.id();
|
||||||
if tile.blocks_visibility() {
|
if tile.blocks_visibility() {
|
||||||
commands.entity(id).insert(BlocksVisibility::default());
|
commands.entity(id).insert(Visible::default());
|
||||||
}
|
}
|
||||||
commands.entity(map_entity).push_children(&[id]);
|
commands.entity(map_entity).push_children(&[id]);
|
||||||
}
|
}
|
||||||
|
@ -327,7 +327,7 @@ fn spawn_colliders(
|
||||||
.insert(MapObstruction)
|
.insert(MapObstruction)
|
||||||
.id();
|
.id();
|
||||||
if map.at(x as usize, y as usize).blocks_visibility() {
|
if map.at(x as usize, y as usize).blocks_visibility() {
|
||||||
commands.entity(id).insert(BlocksVisibility::default());
|
commands.entity(id).insert(Visible::default());
|
||||||
}
|
}
|
||||||
commands.entity(map_entity).push_children(&[id]);
|
commands.entity(map_entity).push_children(&[id]);
|
||||||
bottom_left = None;
|
bottom_left = None;
|
||||||
|
|
|
@ -28,7 +28,7 @@ impl Default for Footstep {
|
||||||
Self {
|
Self {
|
||||||
sound: "".into(),
|
sound: "".into(),
|
||||||
step_length: 0.8,
|
step_length: 0.8,
|
||||||
gain: 0.05,
|
gain: 1.,
|
||||||
reference_distance: 1.,
|
reference_distance: 1.,
|
||||||
max_distance: f32::MAX,
|
max_distance: f32::MAX,
|
||||||
rolloff_factor: 1.,
|
rolloff_factor: 1.,
|
||||||
|
|
|
@ -14,16 +14,6 @@ use crate::{
|
||||||
utils::target_and_other,
|
utils::target_and_other,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Deref, DerefMut, Reflect)]
|
|
||||||
#[reflect(Component)]
|
|
||||||
pub struct BlocksVisibility(pub u8);
|
|
||||||
|
|
||||||
impl Default for BlocksVisibility {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self(u8::MAX)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Default, Reflect)]
|
#[derive(Clone, Copy, Debug, Default, Reflect)]
|
||||||
#[reflect(Component)]
|
#[reflect(Component)]
|
||||||
pub struct DontLogWhenVisible;
|
pub struct DontLogWhenVisible;
|
||||||
|
@ -56,6 +46,25 @@ impl Viewshed {
|
||||||
#[derive(Clone, Copy, Debug, Default, Reflect)]
|
#[derive(Clone, Copy, Debug, Default, Reflect)]
|
||||||
struct VisibilityCollider;
|
struct VisibilityCollider;
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, Deref, DerefMut, Reflect)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub struct Visible(pub u8);
|
||||||
|
|
||||||
|
impl Default for Visible {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::opaque()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Visible {
|
||||||
|
pub fn transparent() -> Self {
|
||||||
|
Self(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn opaque() -> Self {
|
||||||
|
Self(u8::MAX)
|
||||||
|
}
|
||||||
|
}
|
||||||
#[derive(Clone, Debug, Default, Deref, DerefMut)]
|
#[derive(Clone, Debug, Default, Deref, DerefMut)]
|
||||||
pub struct VisibleEntities(HashSet<Entity>);
|
pub struct VisibleEntities(HashSet<Entity>);
|
||||||
|
|
||||||
|
@ -156,7 +165,6 @@ fn viewshed_changed(
|
||||||
if let Ok((collider_shape, collider_position)) = collider_data.get_mut(*collider_entity)
|
if let Ok((collider_shape, collider_position)) = collider_data.get_mut(*collider_entity)
|
||||||
{
|
{
|
||||||
if viewshed.visible_points.len() < 2 {
|
if viewshed.visible_points.len() < 2 {
|
||||||
println!("Too few points, removing");
|
|
||||||
commands.entity(*collider_entity).remove::<ColliderShape>();
|
commands.entity(*collider_entity).remove::<ColliderShape>();
|
||||||
} else {
|
} else {
|
||||||
let translation = position.position.translation;
|
let translation = position.position.translation;
|
||||||
|
@ -217,7 +225,7 @@ fn update_viewshed(
|
||||||
query_pipeline: &QueryPipeline,
|
query_pipeline: &QueryPipeline,
|
||||||
collider_query: &QueryPipelineColliderComponentsQuery,
|
collider_query: &QueryPipelineColliderComponentsQuery,
|
||||||
map: &Map,
|
map: &Map,
|
||||||
blocks_visibility: &Query<&BlocksVisibility>,
|
visible: &Query<&Visible>,
|
||||||
) {
|
) {
|
||||||
let mut context: Context<u8> = Context::default();
|
let mut context: Context<u8> = Context::default();
|
||||||
let vision_distance = vision_distance::Circle::new(viewshed.range);
|
let vision_distance = vision_distance::Circle::new(viewshed.range);
|
||||||
|
@ -236,11 +244,10 @@ fn update_viewshed(
|
||||||
&shape_pos.into(),
|
&shape_pos.into(),
|
||||||
&shape,
|
&shape,
|
||||||
InteractionGroups::all(),
|
InteractionGroups::all(),
|
||||||
Some(&|v| v.entity() != *viewer_entity && blocks_visibility.get(v.entity()).is_ok()),
|
Some(&|v| v.entity() != *viewer_entity && visible.get(v.entity()).is_ok()),
|
||||||
|handle| {
|
|handle| {
|
||||||
if let Ok(blocks_visibility) = blocks_visibility.get(handle.entity()) {
|
if let Ok(visible) = visible.get(handle.entity()) {
|
||||||
opacity = **blocks_visibility;
|
opacity = **visible;
|
||||||
} else {
|
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
},
|
},
|
||||||
|
@ -264,12 +271,12 @@ fn update_viewshed(
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_viewshed_for_coordinates(
|
fn update_viewshed_for_coordinates(
|
||||||
visible: Query<(Entity, &Coordinates), (Changed<Coordinates>, With<BlocksVisibility>)>,
|
visible: Query<(Entity, &Coordinates), (Changed<Coordinates>, With<Visible>)>,
|
||||||
mut viewers: Query<(Entity, &mut Viewshed, &Coordinates)>,
|
mut viewers: Query<(Entity, &mut Viewshed, &Coordinates)>,
|
||||||
map: Query<&Map>,
|
map: Query<&Map>,
|
||||||
query_pipeline: Res<QueryPipeline>,
|
query_pipeline: Res<QueryPipeline>,
|
||||||
collider_query: QueryPipelineColliderComponentsQuery,
|
collider_query: QueryPipelineColliderComponentsQuery,
|
||||||
blocks_visibility: Query<&BlocksVisibility>,
|
visible_query: Query<&Visible>,
|
||||||
) {
|
) {
|
||||||
for (visible_entity, coordinates) in visible.iter() {
|
for (visible_entity, coordinates) in visible.iter() {
|
||||||
for (viewer_entity, mut viewshed, start) in viewers.iter_mut() {
|
for (viewer_entity, mut viewshed, start) in viewers.iter_mut() {
|
||||||
|
@ -286,7 +293,7 @@ fn update_viewshed_for_coordinates(
|
||||||
&*query_pipeline,
|
&*query_pipeline,
|
||||||
&collider_query,
|
&collider_query,
|
||||||
map,
|
map,
|
||||||
&blocks_visibility,
|
&visible_query,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -298,7 +305,7 @@ fn update_viewshed_for_start(
|
||||||
map: Query<&Map>,
|
map: Query<&Map>,
|
||||||
query_pipeline: Res<QueryPipeline>,
|
query_pipeline: Res<QueryPipeline>,
|
||||||
collider_query: QueryPipelineColliderComponentsQuery,
|
collider_query: QueryPipelineColliderComponentsQuery,
|
||||||
blocks_visibility: Query<&BlocksVisibility>,
|
visible: Query<&Visible>,
|
||||||
) {
|
) {
|
||||||
for (viewer_entity, mut viewshed, start) in viewers.iter_mut() {
|
for (viewer_entity, mut viewshed, start) in viewers.iter_mut() {
|
||||||
if let Ok(map) = map.single() {
|
if let Ok(map) = map.single() {
|
||||||
|
@ -309,19 +316,19 @@ fn update_viewshed_for_start(
|
||||||
&*query_pipeline,
|
&*query_pipeline,
|
||||||
&collider_query,
|
&collider_query,
|
||||||
map,
|
map,
|
||||||
&blocks_visibility,
|
&visible,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn remove_blocks_visibility(
|
fn remove_visible(
|
||||||
removed: RemovedComponents<BlocksVisibility>,
|
removed: RemovedComponents<Visible>,
|
||||||
mut viewers: Query<(Entity, &mut Viewshed, &mut VisibleEntities, &Coordinates)>,
|
mut viewers: Query<(Entity, &mut Viewshed, &mut VisibleEntities, &Coordinates)>,
|
||||||
map: Query<&Map>,
|
map: Query<&Map>,
|
||||||
query_pipeline: Res<QueryPipeline>,
|
query_pipeline: Res<QueryPipeline>,
|
||||||
collider_query: QueryPipelineColliderComponentsQuery,
|
collider_query: QueryPipelineColliderComponentsQuery,
|
||||||
blocks_visibility: Query<&BlocksVisibility>,
|
visible: Query<&Visible>,
|
||||||
) {
|
) {
|
||||||
for removed in removed.iter() {
|
for removed in removed.iter() {
|
||||||
for (viewer_entity, mut viewshed, mut visible_entities, start) in viewers.iter_mut() {
|
for (viewer_entity, mut viewshed, mut visible_entities, start) in viewers.iter_mut() {
|
||||||
|
@ -337,7 +344,7 @@ fn remove_blocks_visibility(
|
||||||
&*query_pipeline,
|
&*query_pipeline,
|
||||||
&collider_query,
|
&collider_query,
|
||||||
map,
|
map,
|
||||||
&blocks_visibility,
|
&visible,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -370,6 +377,7 @@ fn intersection(
|
||||||
collider_to_viewshed: Res<VisibilityColliderToViewshed>,
|
collider_to_viewshed: Res<VisibilityColliderToViewshed>,
|
||||||
colliders: Query<Entity, With<VisibilityCollider>>,
|
colliders: Query<Entity, With<VisibilityCollider>>,
|
||||||
mut viewers: Query<&mut VisibleEntities>,
|
mut viewers: Query<&mut VisibleEntities>,
|
||||||
|
visible: Query<Entity, With<Visible>>,
|
||||||
mut visibility_changed: EventWriter<VisibilityChanged>,
|
mut visibility_changed: EventWriter<VisibilityChanged>,
|
||||||
) {
|
) {
|
||||||
for event in events.iter() {
|
for event in events.iter() {
|
||||||
|
@ -378,23 +386,21 @@ fn intersection(
|
||||||
colliders.get(v).is_ok()
|
colliders.get(v).is_ok()
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
if let Some(viewshed_entity) = collider_to_viewshed.get(&visibility_collider) {
|
if visible.get(other).is_ok() {
|
||||||
if let Ok(mut visible_entities) = viewers.get_mut(*viewshed_entity) {
|
if let Some(viewshed_entity) = collider_to_viewshed.get(&visibility_collider) {
|
||||||
if event.intersecting {
|
if let Ok(mut visible_entities) = viewers.get_mut(*viewshed_entity) {
|
||||||
visibility_changed.send(VisibilityChanged::Gained {
|
if event.intersecting {
|
||||||
viewer: *viewshed_entity,
|
visibility_changed.send(VisibilityChanged::Gained {
|
||||||
viewed: other,
|
viewer: *viewshed_entity,
|
||||||
});
|
viewed: other,
|
||||||
visible_entities.insert(other);
|
});
|
||||||
} else {
|
visible_entities.insert(other);
|
||||||
visibility_changed.send(VisibilityChanged::Lost {
|
|
||||||
viewer: *viewshed_entity,
|
|
||||||
viewed: other,
|
|
||||||
});
|
|
||||||
if visible_entities.contains(&other) {
|
|
||||||
visible_entities.remove(&other);
|
|
||||||
} else {
|
} else {
|
||||||
println!("Making invisible something that was never visible");
|
visibility_changed.send(VisibilityChanged::Lost {
|
||||||
|
viewer: *viewshed_entity,
|
||||||
|
viewed: other,
|
||||||
|
});
|
||||||
|
visible_entities.remove(&other);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -461,7 +467,7 @@ impl Plugin for VisibilityPlugin {
|
||||||
.add_system_to_stage(CoreStage::PostUpdate, viewshed_removed.system())
|
.add_system_to_stage(CoreStage::PostUpdate, viewshed_removed.system())
|
||||||
.add_system(update_viewshed_for_coordinates.system())
|
.add_system(update_viewshed_for_coordinates.system())
|
||||||
.add_system(update_viewshed_for_start.system())
|
.add_system(update_viewshed_for_start.system())
|
||||||
.add_system_to_stage(CoreStage::PostUpdate, remove_blocks_visibility.system())
|
.add_system_to_stage(CoreStage::PostUpdate, remove_visible.system())
|
||||||
.add_system_to_stage(
|
.add_system_to_stage(
|
||||||
CoreStage::PostUpdate,
|
CoreStage::PostUpdate,
|
||||||
update_visible_and_revealed_tiles.system(),
|
update_visible_and_revealed_tiles.system(),
|
||||||
|
|
Loading…
Reference in New Issue
Block a user