pmx_parser 0.2.0

load and save .pmx model file.
Documentation
use std::io::{Read, Write};

use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};

use crate::error::PmxError;

#[inline(always)]
pub(crate) fn read_f32x3<R: Read>(read: &mut R) -> Result<[f32; 3], std::io::Error> {
    Ok([
        read.read_f32::<LittleEndian>()?,
        read.read_f32::<LittleEndian>()?,
        read.read_f32::<LittleEndian>()?,
    ])
}

#[inline(always)]
pub(crate) fn read_f32x4<R: Read>(read: &mut R) -> Result<[f32; 4], std::io::Error> {
    Ok([
        read.read_f32::<LittleEndian>()?,
        read.read_f32::<LittleEndian>()?,
        read.read_f32::<LittleEndian>()?,
        read.read_f32::<LittleEndian>()?,
    ])
}

#[inline(always)]
pub(crate) fn write_f32x3<W: Write>(write: &mut W, value: [f32; 3]) -> Result<(), std::io::Error> {
    write.write_f32::<LittleEndian>(value[0])?;
    write.write_f32::<LittleEndian>(value[1])?;
    write.write_f32::<LittleEndian>(value[2])?;
    Ok(())
}

#[inline(always)]
pub(crate) fn write_f32x4<W: Write>(write: &mut W, value: [f32; 4]) -> Result<(), std::io::Error> {
    write.write_f32::<LittleEndian>(value[0])?;
    write.write_f32::<LittleEndian>(value[1])?;
    write.write_f32::<LittleEndian>(value[2])?;
    write.write_f32::<LittleEndian>(value[3])?;
    Ok(())
}

#[inline(always)]
pub(crate) fn read_bool<R: Read>(read: &mut R) -> Result<bool, PmxError> {
    match read.read_u8()? {
        0 => Ok(false),
        1 => Ok(true),
        _ => Err(PmxError::BoolError),
    }
}

#[inline(always)]
pub(crate) fn read_vec<R: Read, F: FnMut(&mut R) -> Result<T, PmxError>, T>(
    read: &mut R,
    mut f: F,
) -> Result<Vec<T>, PmxError> {
    let count = read.read_u32::<LittleEndian>()? as usize;
    let mut r = Vec::with_capacity(count);
    for _ in 0..count {
        r.push(f(read.by_ref())?);
    }
    Ok(r)
}