use crate::enums::BiomeID;
use cubiomes_sys::num_traits::FromPrimitive;
use std::{
collections::BTreeMap,
mem::MaybeUninit,
ops::{Index, IndexMut},
};
#[must_use]
pub fn new_biome_color_map() -> BTreeMap<BiomeID, [u8; 3]> {
let mut colors: MaybeUninit<[[u8; 3]; 256]> = MaybeUninit::uninit();
unsafe {
cubiomes_sys::initBiomeColors(colors.as_mut_ptr() as *mut [u8; 3]);
}
let colors = unsafe { colors.assume_init() };
colors
.into_iter()
.enumerate()
.filter_map(|(index, color)| BiomeID::from_usize(index).map(|biome_id| (biome_id, color)))
.collect()
}
#[derive(Debug, Clone, Copy)]
pub struct BiomeColorMap([[u8; 3]; 256]);
impl Default for BiomeColorMap {
fn default() -> Self {
Self::new()
}
}
impl BiomeColorMap {
#[must_use]
pub fn new() -> Self {
let mut colors: MaybeUninit<[[u8; 3]; 256]> = MaybeUninit::uninit();
unsafe {
cubiomes_sys::initBiomeColors(colors.as_mut_ptr() as *mut [u8; 3]);
}
Self(unsafe { colors.assume_init() })
}
#[must_use]
#[allow(clippy::missing_panics_doc)]
pub fn get(&self, idx: BiomeID) -> &[u8; 3] {
self.0.get(idx as usize).expect("All values should exists")
}
#[must_use]
#[allow(clippy::missing_panics_doc)]
pub fn get_mut(&mut self, idx: BiomeID) -> &mut [u8; 3] {
self.0
.get_mut(idx as usize)
.expect("All values should exist")
}
#[must_use]
#[inline]
pub fn as_arr(&self) -> &[[u8; 3]; 256] {
&self.0
}
#[must_use]
#[inline]
pub fn to_arr(&self) -> [[u8; 3]; 256] {
self.0
}
}
impl Index<BiomeID> for BiomeColorMap {
type Output = [u8; 3];
fn index(&self, index: BiomeID) -> &Self::Output {
&self.0[index as usize]
}
}
impl IndexMut<BiomeID> for BiomeColorMap {
fn index_mut(&mut self, index: BiomeID) -> &mut Self::Output {
&mut self.0[index as usize]
}
}