nif/blocks/ni_main/
ni_tri_shape_data.rs1use binrw::{
2 io::{Read, Seek},
3 BinRead, BinReaderExt,
4};
5
6use super::NiTriBasedGeomData;
7use crate::common::Triangle;
8
9#[derive(Debug, PartialEq, BinRead)]
10pub struct NiTriShapeData {
11 pub base: NiTriBasedGeomData,
12
13 pub num_triangle_points: u32,
14 #[br(map = |x: u8| x > 0)]
15 pub has_triangles: bool,
16 #[br(if(has_triangles))]
17 #[br(count=base.num_triangles)]
18 pub triangles: Option<Vec<Triangle>>,
19
20 pub num_match_groups: u16,
21 #[br(count=num_match_groups)]
22 pub match_groups: Vec<MatchGroup>,
23}
24#[derive(Debug, PartialEq, BinRead)]
25pub struct MatchGroup {
26 pub num_vertices: u16,
27 #[br(count=num_vertices)]
28 pub vertex_indices: Vec<u16>,
29}
30
31impl NiTriShapeData {
32 pub fn parse<R: Read + Seek>(reader: &mut R) -> anyhow::Result<Self> {
33 Ok(reader.read_le()?)
34 }
35}
36
37impl std::ops::Deref for NiTriShapeData {
38 type Target = NiTriBasedGeomData;
39
40 fn deref(&self) -> &Self::Target {
41 &self.base
42 }
43}