rogalik_common 0.3.0

Common definitions for the Rogalik engine
Documentation
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};

use rogalik_math::vectors::Vector2f;

#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq, PartialOrd, Ord)]
pub struct ResourceId(pub usize);
impl ResourceId {
    pub fn next(&self) -> Self {
        Self(self.0 + 1)
    }
}

#[derive(Debug)]
pub enum EngineError {
    InvalidResource,
    ResourceNotFound,
    GraphicsInternalError,
    GraphicsNotReady,
}

#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub struct Color(pub u8, pub u8, pub u8, pub u8);
impl Color {
    pub fn as_f32(&self) -> [f32; 4] {
        [
            self.0 as f32 / 255.,
            self.1 as f32 / 255.,
            self.2 as f32 / 255.,
            self.3 as f32 / 255.,
        ]
    }
    pub fn as_srgb(&self) -> [f32; 4] {
        let f = self.as_f32();
        [
            srgb_single(f[0]),
            srgb_single(f[1]),
            srgb_single(f[2]),
            f[3],
        ]
    }
}
impl Default for Color {
    fn default() -> Self {
        Self(255, 255, 255, 255)
    }
}

#[derive(Clone, Copy, Default)]
pub struct SpriteParams {
    pub color: Color,
    pub flip_x: bool,
    pub flip_y: bool,
    pub rotate: Option<f32>,
    // slice size in px, base sprite size
    pub slice: Option<(usize, Vector2f)>,
}

#[inline(always)]
fn srgb_single(v: f32) -> f32 {
    ((v + 0.055) / 1.055).powf(2.4)
}

#[derive(Clone, Copy, Default)]
pub struct MaterialParams {
    pub atlas: Option<AtlasParams>,
    pub diffuse_texture: Option<ResourceId>,
    pub normal_texture: Option<ResourceId>,
    pub shader: Option<ResourceId>,
    pub repeat: TextureRepeat,
    pub filtering: TextureFiltering,
}

#[derive(Clone, Copy, Default)]
pub struct PostProcessParams {
    pub texture: Option<ResourceId>,
    pub shader: ResourceId,
    pub repeat: TextureRepeat,
    pub filtering: TextureFiltering,
}

#[derive(Clone, Copy, Debug)]
pub struct AtlasParams {
    pub cols: usize,
    pub rows: usize,
    pub padding: Option<(f32, f32)>,
}

#[derive(Clone, Copy, Default)]
pub enum TextureRepeat {
    #[default]
    Clamp,
    Repeat,
    MirrorRepeat,
}

#[derive(Clone, Copy, Default)]
pub enum TextureFiltering {
    #[default]
    Nearest,
    Linear,
}

#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
pub enum ShaderKind {
    Sprite,
    PostProcess,
}

#[derive(Hash, Eq, PartialEq, Debug)]
pub enum BuiltInShader {
    SpriteUnlit,
    SpriteLit,
    Upscale,
    Lut,
}

#[derive(Clone, Copy)]
pub struct AudioDeviceParams {
    pub sample_rate: usize,
    pub buffer_secs: f32,
}
impl Default for AudioDeviceParams {
    fn default() -> Self {
        Self {
            sample_rate: 44100,
            buffer_secs: 0.1,
        }
    }
}