use crate::entities::{PItemKey, PlacedItem};
use crate::geometry::DTransformation;
use crate::geometry::geo_enums::GeoPosition;
use crate::geometry::primitives::SPolygon;
use slotmap::new_key_type;
use std::borrow::Borrow;
use std::sync::Arc;
new_key_type! {
pub struct HazKey;
}
#[derive(Clone, Debug)]
pub struct Hazard {
pub entity: HazardEntity,
pub shape: Arc<SPolygon>,
pub dynamic: bool,
}
impl Hazard {
pub fn new(entity: HazardEntity, shape: Arc<SPolygon>, dynamic: bool) -> Self {
Self {
entity,
shape,
dynamic,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum HazardEntity {
PlacedItem {
id: usize,
dt: DTransformation,
pk: PItemKey,
},
Exterior,
Hole { idx: usize },
InferiorQualityZone { quality: usize, idx: usize },
}
impl HazardEntity {
pub fn scope(&self) -> GeoPosition {
match self {
HazardEntity::PlacedItem { .. } => GeoPosition::Interior,
HazardEntity::Exterior => GeoPosition::Exterior,
HazardEntity::Hole { .. } => GeoPosition::Interior,
HazardEntity::InferiorQualityZone { .. } => GeoPosition::Interior,
}
}
}
impl<T> From<(PItemKey, T)> for HazardEntity
where
T: Borrow<PlacedItem>,
{
fn from((pk, pi): (PItemKey, T)) -> Self {
HazardEntity::PlacedItem {
id: pi.borrow().item_id,
dt: pi.borrow().d_transf,
pk,
}
}
}