nif/blocks/ni_main/
ni_source_texture.rs

1use super::ni_object_net::NiObjectNET;
2use super::ni_string::NiString;
3use crate::error::NifError;
4use binrw::{
5    io::{Read, Seek},
6    BinRead, BinReaderExt,
7};
8
9#[derive(Debug, PartialEq, BinRead)]
10#[br(assert(!direct_render, NifError::NotImplemented("Direct Render")))]
11pub struct NiSourceTexture {
12    pub base: NiObjectNET,
13    pub use_external: u8,
14    pub file_name: NiString,
15    #[br(if(use_external == 1))]
16    pub unknown_link_ref: Option<i32>,
17    #[br(if(use_external == 0))]
18    pub pixel_data_ref: Option<i32>,
19    pub pixel_layout: PixelLayout,
20    pub mipmap_format: MipMapFormat,
21    pub alpha_format: AlphaFormat,
22    pub is_static: u8,
23    #[br(map = |x: u8| x > 0)]
24    pub direct_render: bool,
25}
26
27#[derive(Debug, PartialEq, BinRead)]
28pub enum PixelLayout {
29    #[br(magic = 0u32)]
30    Palettised,
31    #[br(magic = 1u32)]
32    HighColor16,
33    #[br(magic = 2u32)]
34    HighColor32,
35    #[br(magic = 3u32)]
36    Compressed,
37    #[br(magic = 4u32)]
38    BumpMap,
39    #[br(magic = 5u32)]
40    Palettised4,
41    #[br(magic = 6u32)]
42    Default,
43    Unknown,
44}
45
46#[derive(Debug, PartialEq, BinRead)]
47pub enum MipMapFormat {
48    #[br(magic = 0u32)]
49    No,
50    #[br(magic = 1u32)]
51    Yes,
52    #[br(magic = 2u32)]
53    Default,
54    Unknown,
55}
56
57#[derive(Debug, PartialEq, BinRead)]
58pub enum AlphaFormat {
59    #[br(magic = 0u32)]
60    None,
61    #[br(magic = 1u32)]
62    Binary,
63    #[br(magic = 2u32)]
64    Smooth,
65    #[br(magic = 3u32)]
66    Default,
67    Unknown,
68}
69
70impl NiSourceTexture {
71    pub fn parse<R: Read + Seek>(reader: &mut R) -> anyhow::Result<Self> {
72        Ok(reader.read_le()?)
73    }
74}
75
76impl std::ops::Deref for NiSourceTexture {
77    type Target = NiObjectNET;
78
79    fn deref(&self) -> &Self::Target {
80        &self.base
81    }
82}