use binrw::{binread, helpers::until_eof, BinRead};
use ssbh_write::SsbhWrite;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[binread]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[derive(Debug, PartialEq, Eq)]
pub struct Adj {
#[br(temp)]
entry_count: u32,
#[br(count = entry_count)]
pub entries: Vec<AdjEntry>,
#[br(parse_with = until_eof)]
pub index_buffer: Vec<i16>,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[derive(Debug, BinRead, SsbhWrite, PartialEq, Eq)]
pub struct AdjEntry {
pub mesh_object_index: u32,
pub index_buffer_offset: u32,
}
impl SsbhWrite for Adj {
fn ssbh_write<W: std::io::Write + std::io::Seek>(
&self,
writer: &mut W,
data_ptr: &mut u64,
) -> std::io::Result<()> {
let current_pos = writer.stream_position()?;
if *data_ptr < current_pos + self.size_in_bytes() {
*data_ptr = current_pos + self.size_in_bytes();
}
(self.entries.len() as u32).ssbh_write(writer, data_ptr)?;
self.entries.ssbh_write(writer, data_ptr)?;
self.index_buffer.ssbh_write(writer, data_ptr)?;
Ok(())
}
}