#![warn(missing_docs)]
pub mod auto_cut;
mod cache;
mod callbacks;
mod control;
mod engine;
mod idle;
mod md2_inputs;
mod md3_inputs;
mod media;
mod mxd3q;
mod playlist;
mod rng;
mod runtime;
mod sprites;
mod teacher;
mod textures;
mod vars;
pub use callbacks::{Hook, SwitchFailure};
pub use control::{HARD_CUT_MIN_FRAMES, PresetControl, SwitchRequest};
pub use engine::{
DebugImage, DoubleMode, DoublePresetInfo, Engine, Md3Locks, Md3Pattern, Md3PatternInstance,
TouchType, default_enabled_patterns, md3_draw_progress, md3_fill_vertinfo, md3_random_instance,
};
pub use idle::{IDLE_PRESET, IDLE_PRESET_NAME};
pub use lactea_abi::PassKind;
pub use lactea_abi::dump::Stage;
pub use lactea_audio::AudioFrame;
pub use lactea_render::TransitionKind;
pub use lactea_render::{Compat, Renderer};
pub use md2_inputs::{CtrlKeys, DateTime};
pub use md3_inputs::MouseState;
pub use media::{AnimFrame, AnimatedImage, Media, MediaFiles, TEXTURE_EXTENSIONS, decode_gif};
pub use playlist::{
DEFAULT_RETRY_COUNT, FailedFn, Filter, INSERT_AT_END, LoadRequest, MAX_HISTORY, Playlist,
SortOrder, SortPredicate, SwitchedFn,
};
pub use teacher::ForcedFrame;
pub use textures::{Image, TextureProvider};
pub const VCS_VERSION: &str = env!("LACTEA_VCS_VERSION");
use std::collections::HashMap;
#[derive(Clone, Debug, Default)]
pub struct ShaderOverride {
pub warp: Option<String>,
pub comp: Option<String>,
}
pub fn compat_for_preset(bytes: &[u8]) -> Compat {
match lactea_preset::detect_compat(bytes).family {
lactea_preset::DetectedFamily::MilkDrop3 => Compat::MilkDrop3,
_ => Compat::ProjectM,
}
}
#[derive(Clone, Debug)]
pub struct EngineConfig {
pub width: u32,
pub height: u32,
pub mesh: [u32; 2],
pub seed: u64,
pub compat: Compat,
pub auto_compat: bool,
pub texel_offset: [f32; 2],
pub output_format: wgpu::TextureFormat,
pub sample_rate: u32,
pub fps: u32,
pub preset_duration: f64,
pub start_clean: bool,
pub md3_disable_box: bool,
pub auto_hard_cut_mode: u8,
pub volume_sensitivity: f32,
pub blend_milk2: bool,
pub blend_time_user: f64,
pub md3_transition_patterns: Vec<Md3Pattern>,
pub shader_overrides: HashMap<u64, ShaderOverride>,
}
impl Default for EngineConfig {
fn default() -> Self {
Self {
width: 640,
height: 360,
mesh: [48, 36],
seed: 1,
compat: Compat::ProjectM,
auto_compat: false,
texel_offset: [0.0, 0.0],
output_format: wgpu::TextureFormat::Rgba8Unorm,
sample_rate: 44_100,
fps: 60,
preset_duration: 1e9,
start_clean: false,
md3_disable_box: true,
auto_hard_cut_mode: 0,
volume_sensitivity: 1.0,
blend_milk2: true,
blend_time_user: 1.7,
shader_overrides: HashMap::new(),
md3_transition_patterns: engine::default_enabled_patterns(),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct FrameClock {
pub time: f64,
pub frame: u32,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Transition {
Cut,
Soft {
seconds: f64,
},
}
#[derive(Clone, Copy, Debug, PartialEq)]
#[non_exhaustive]
pub struct TransitionInfo {
pub kind: TransitionKind,
pub rand_static: [i32; 4],
pub start_time: f64,
pub duration: f64,
}
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum EngineError {
#[error("preset parse error: {0}")]
Parse(#[from] lactea_preset::ParseError),
#[error("{what}: {error}")]
Compile {
what: String,
error: lactea_eel::CompileError,
},
#[error("render error: {0}")]
Render(#[from] lactea_render::RenderError),
#[error("no preset loaded")]
NoPreset,
#[error("{0}")]
Unsupported(String),
#[error("double preset: {0}")]
Milk2(#[from] lactea_preset::milk2::Milk2Error),
}
impl EngineError {
pub(crate) fn compile(what: &str, error: lactea_eel::CompileError) -> Self {
EngineError::Compile {
what: what.to_string(),
error,
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
#[non_exhaustive]
pub enum ShaderOutcome {
#[default]
NotUsed,
User,
Default,
Fallback,
}
#[derive(Clone, Debug)]
#[non_exhaustive]
pub struct ShaderFallback {
pub pass: PassKind,
pub reason: String,
pub fallback: String,
}
#[derive(Clone, Debug, Default)]
#[non_exhaustive]
pub struct PresetReport {
pub name: String,
pub preset_version: i32,
pub compat: Compat,
pub warp: ShaderOutcome,
pub comp: ShaderOutcome,
pub warnings: Vec<String>,
pub shader_fallbacks: Vec<ShaderFallback>,
pub unresolved_textures: Vec<String>,
pub resolved_textures: Vec<(String, String)>,
pub sprite: Option<String>,
}