use indicatrix::optics::LightingPreset;
use indicatrix_cut_core::ObjectivePreset;
use indicatrix_editor::retarget::CrownShift;
use indicatrix_render_jobs::{ComputeChoice, LocalEngines, TransferChoice};
use std::path::PathBuf;
#[cfg(not(feature = "physical-color"))]
pub const LIGHTING_NAMES: [(&str, LightingPreset); 14] = [
("daylight", LightingPreset::Daylight),
("incandescent", LightingPreset::Incandescent),
("ring", LightingPreset::RingLights),
("spotlight", LightingPreset::DarkSpotlight),
("iso", LightingPreset::IsoHemisphere),
("grading", LightingPreset::IsoHemisphere),
("tent", LightingPreset::LightTent),
("dome", LightingPreset::DaylightDome),
("sun", LightingPreset::DaylightSun),
("tray", LightingPreset::WhiteTray),
("shop", LightingPreset::ShopLights),
("window", LightingPreset::WindowDaylight),
("illuminant-a", LightingPreset::IlluminantA),
("aset", LightingPreset::Aset),
];
#[cfg(feature = "physical-color")]
pub const LIGHTING_NAMES: [(&str, LightingPreset); 16] = [
("daylight", LightingPreset::Daylight),
("incandescent", LightingPreset::Incandescent),
("ring", LightingPreset::RingLights),
("spotlight", LightingPreset::DarkSpotlight),
("iso", LightingPreset::IsoHemisphere),
("grading", LightingPreset::IsoHemisphere),
("tent", LightingPreset::LightTent),
("dome", LightingPreset::DaylightDome),
("sun", LightingPreset::DaylightSun),
("tray", LightingPreset::WhiteTray),
("shop", LightingPreset::ShopLights),
("window", LightingPreset::WindowDaylight),
("illuminant-a", LightingPreset::IlluminantA),
("aset", LightingPreset::Aset),
("uv365", LightingPreset::UvLamp365),
("uv395", LightingPreset::UvLamp395),
];
pub const PRESET_NAMES: [(&str, ObjectivePreset); 7] = [
("balanced", ObjectivePreset::Balanced),
("brilliance", ObjectivePreset::Brilliance),
("low-windowing", ObjectivePreset::LowWindowing),
("low-extinction", ObjectivePreset::LowExtinction),
("keep-weight", ObjectivePreset::KeepWeight),
("lighten-dark", ObjectivePreset::LightenDark),
("intensify-pale", ObjectivePreset::IntensifyPale),
];
#[must_use]
pub fn lighting_name(preset: LightingPreset) -> &'static str {
LIGHTING_NAMES
.iter()
.find(|(_, known)| *known == preset)
.map_or("custom", |(name, _)| name)
}
#[must_use]
pub fn preset_name(preset: ObjectivePreset) -> &'static str {
PRESET_NAMES
.iter()
.find(|(_, known)| *known == preset)
.map_or("custom", |(name, _)| name)
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Topic {
Root,
Info,
Solve,
Metrics,
Validate,
Optimize,
Retarget,
Sweep,
Export,
Render,
TiltVideo,
}
impl Topic {
#[must_use]
pub fn of(word: &str) -> Self {
match word {
"info" => Self::Info,
"solve" => Self::Solve,
"metrics" => Self::Metrics,
"validate" => Self::Validate,
"optimize" => Self::Optimize,
"retarget" => Self::Retarget,
"sweep" => Self::Sweep,
"export" => Self::Export,
"render" => Self::Render,
"tilt-video" => Self::TiltVideo,
_ => Self::Root,
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum MaterialArg {
Named(String),
Ri(f64),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReportFormat {
Text,
Json,
Csv,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Mode {
Shift,
Optimize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ExportFormat {
Asc,
Indicatrix,
Gcs,
Html,
}
impl ExportFormat {
#[must_use]
pub fn from_file_name(name: &str) -> Option<Self> {
let lower = name.to_ascii_lowercase();
let extension = lower.rsplit_once('.').map(|(_, extension)| extension)?;
match extension {
"asc" => Some(Self::Asc),
"indicatrix" => Some(Self::Indicatrix),
"gcs" => Some(Self::Gcs),
"html" | "htm" => Some(Self::Html),
_ => None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct InfoArgs {
pub design: PathBuf,
pub json: bool,
pub out: Option<PathBuf>,
pub db: Option<PathBuf>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SolveArgs {
pub design: PathBuf,
pub json: bool,
pub out: Option<PathBuf>,
pub db: Option<PathBuf>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct MetricsArgs {
pub design: PathBuf,
pub material: Option<MaterialArg>,
pub tilt: bool,
pub format: ReportFormat,
pub lighting: LightingPreset,
pub out: Option<PathBuf>,
pub db: Option<PathBuf>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ValidateArgs {
pub design: PathBuf,
pub json: bool,
pub material: Option<MaterialArg>,
pub lighting: LightingPreset,
pub out: Option<PathBuf>,
pub db: Option<PathBuf>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OptimizeArgs {
pub design: PathBuf,
pub preset: ObjectivePreset,
pub budget: usize,
pub starts: usize,
pub seed: u64,
pub vary_anchored: bool,
pub candidates: usize,
pub lighting: LightingPreset,
pub json: bool,
pub out: Option<PathBuf>,
pub db: Option<PathBuf>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct RetargetArgs {
pub design: PathBuf,
pub target: MaterialArg,
pub mode: Mode,
pub crown: CrownShift,
pub preset: ObjectivePreset,
pub range_deg: Option<f64>,
pub budget: Option<usize>,
pub seed: u64,
pub keep_look: bool,
pub lighting: LightingPreset,
pub json: bool,
pub out: Option<PathBuf>,
pub db: Option<PathBuf>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct SweepArgs {
pub design: PathBuf,
pub tier: String,
pub from_deg: f64,
pub to_deg: f64,
pub step_deg: f64,
pub tilt: bool,
pub csv: Option<PathBuf>,
pub json: bool,
pub material: Option<MaterialArg>,
pub lighting: LightingPreset,
pub db: Option<PathBuf>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ExportArgs {
pub design: PathBuf,
pub format: ExportFormat,
pub out: PathBuf,
pub db: Option<PathBuf>,
pub date: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum JobCommandKind {
Render,
TiltVideo,
}
impl JobCommandKind {
#[must_use]
pub const fn word(self) -> &'static str {
match self {
Self::Render => "render",
Self::TiltVideo => "tilt-video",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RenderJobArgs {
pub kind: JobCommandKind,
pub job: PathBuf,
pub out: Option<PathBuf>,
pub local: LocalEngines,
pub compute: Option<ComputeChoice>,
pub transfer: Option<TransferChoice>,
pub remote: Option<String>,
pub cert_dir: Option<PathBuf>,
pub contribute_local: bool,
pub restart: bool,
pub quiet: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Command {
Help(Topic),
Version,
Info(InfoArgs),
Solve(SolveArgs),
Metrics(MetricsArgs),
Validate(ValidateArgs),
Optimize(OptimizeArgs),
Retarget(RetargetArgs),
Sweep(SweepArgs),
Export(ExportArgs),
Render(RenderJobArgs),
TiltVideo(RenderJobArgs),
}