use ifc_model::{EntityId, Value};
use crate::error::StyleResult;
use crate::view::Record;
mod triangle;
pub use triangle::TriangleTextureCoordinates;
#[derive(Debug, Clone, Copy)]
pub struct IndexedTextureMap<'m, 's> {
record: Record<'m, 's>,
}
impl<'m, 's> IndexedTextureMap<'m, 's> {
pub(crate) fn from_record(record: Record<'m, 's>) -> Self {
Self { record }
}
pub fn id(&self) -> EntityId {
self.record.id
}
pub fn type_name(&self) -> &'m str {
&self.record.entity.type_name
}
pub fn maps(&self) -> StyleResult<Vec<EntityId>> {
self.record
.required_refs("Maps", "IfcSurfaceTexture", 1, None)
}
pub fn mapped_to(&self) -> StyleResult<EntityId> {
self.record
.required_ref("MappedTo", "IfcTessellatedFaceSet")
}
pub fn tex_coord_index(&self) -> StyleResult<Option<&'m Value>> {
self.record.optional_raw("TexCoordIndex")
}
pub fn tex_coords(&self) -> StyleResult<EntityId> {
self.record
.required_ref("TexCoords", "IfcTextureVertexList")
}
pub fn triangle_coordinates(
&self,
triangle_count: usize,
) -> StyleResult<Option<TriangleTextureCoordinates>> {
let record = &self.record;
if !record
.schema
.is_a(&record.entity.type_name, "IfcIndexedTriangleTextureMap")
{
return Ok(None);
}
let Some(index) = self.tex_coord_index()? else {
return Ok(None);
};
let list = crate::StyleView::new(record.model, record.schema)
.texture_vertex_list(self.tex_coords()?)?;
triangle::resolve(
self.id(),
self.type_name(),
index,
list.coordinates()?,
triangle_count,
)
.map(Some)
}
}