use ifc_model::EntityId;
use crate::error::StyleResult;
use crate::view::Record;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum LightSourceKind {
Ambient,
Directional,
Goniometric,
Positional,
Spot,
}
#[derive(Debug, Clone, Copy)]
pub struct LightSource<'m, 's> {
record: Record<'m, 's>,
}
impl<'m, 's> LightSource<'m, 's> {
pub(crate) fn from_record(record: Record<'m, 's>) -> Self {
Self { record }
}
pub fn kind(&self) -> StyleResult<LightSourceKind> {
let declared = self.record.type_name();
for (name, kind) in [
("IfcLightSourceSpot", LightSourceKind::Spot),
("IfcLightSourceGoniometric", LightSourceKind::Goniometric),
("IfcLightSourcePositional", LightSourceKind::Positional),
("IfcLightSourceDirectional", LightSourceKind::Directional),
("IfcLightSourceAmbient", LightSourceKind::Ambient),
] {
if self.record.is_a(declared, name) {
return Ok(kind);
}
}
Err(self.record.wrong_type("a concrete IfcLightSource subtype"))
}
pub fn name(&self) -> StyleResult<Option<&'m str>> {
self.record.optional_text("Name")
}
pub fn light_colour(&self) -> StyleResult<EntityId> {
self.record.required_ref("LightColour", "IfcColourRgb")
}
pub fn ambient_intensity(&self) -> StyleResult<Option<f64>> {
self.record.optional_normalized("AmbientIntensity")
}
pub fn intensity(&self) -> StyleResult<Option<f64>> {
self.record.optional_normalized("Intensity")
}
}
#[derive(Debug, Clone, Copy)]
pub struct LightSourceAmbient<'m, 's> {
record: Record<'m, 's>,
}
impl<'m, 's> LightSourceAmbient<'m, 's> {
pub(crate) fn from_record(record: Record<'m, 's>) -> Self {
Self { record }
}
pub fn light_source(&self) -> LightSource<'m, 's> {
LightSource::from_record(self.record)
}
}
#[derive(Debug, Clone, Copy)]
pub struct LightSourceDirectional<'m, 's> {
record: Record<'m, 's>,
}
impl<'m, 's> LightSourceDirectional<'m, 's> {
pub(crate) fn from_record(record: Record<'m, 's>) -> Self {
Self { record }
}
pub fn light_source(&self) -> LightSource<'m, 's> {
LightSource::from_record(self.record)
}
pub fn orientation(&self) -> StyleResult<EntityId> {
self.record.required_ref("Orientation", "IfcDirection")
}
}