use serde::{Deserialize, Serialize};
use std::fmt::Display;
use sugarloaf::Filter;
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct Renderer {
#[serde(default = "Performance::default")]
pub performance: Performance,
#[serde(default = "Backend::default", skip_serializing)]
pub backend: Backend,
#[serde(default = "bool::default", rename = "disable-unfocused-render")]
pub disable_unfocused_render: bool,
#[serde(
default = "default_disable_occluded_render",
rename = "disable-occluded-render"
)]
pub disable_occluded_render: bool,
#[serde(default = "Vec::default")]
pub filters: Vec<Filter>,
#[serde(default = "RendererStategy::default")]
pub strategy: RendererStategy,
#[serde(default = "default_use_cpu", rename = "use-cpu")]
pub use_cpu: bool,
}
fn default_use_cpu() -> bool {
false
}
fn default_disable_occluded_render() -> bool {
false
}
#[derive(Default, Debug, Clone, PartialEq, Deserialize, Serialize)]
pub enum RendererStategy {
#[default]
#[serde(alias = "events")]
Events,
#[serde(alias = "game")]
Game,
}
impl RendererStategy {
#[inline]
pub fn is_game(&self) -> bool {
self == &RendererStategy::Game
}
#[inline]
pub fn is_event_based(&self) -> bool {
self == &RendererStategy::Events
}
}
#[allow(clippy::derivable_impls)]
impl Default for Renderer {
fn default() -> Renderer {
Renderer {
performance: Performance::default(),
backend: Backend::default(),
disable_unfocused_render: false,
disable_occluded_render: default_disable_occluded_render(),
filters: Vec::default(),
strategy: RendererStategy::Events,
use_cpu: default_use_cpu(),
}
}
}
#[derive(Default, Debug, Serialize, Deserialize, PartialEq, Clone, Copy)]
pub enum Performance {
#[default]
#[serde(alias = "high")]
High,
#[serde(alias = "low")]
Low,
}
impl Display for Performance {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
Performance::High => {
write!(f, "High")
}
Performance::Low => {
write!(f, "Low")
}
}
}
}
#[derive(Debug, Default, Serialize, Deserialize, Clone, PartialEq)]
pub enum Backend {
#[serde(alias = "automatic")]
#[cfg_attr(not(target_os = "macos"), default)]
Automatic,
#[serde(alias = "gl")]
GL,
#[serde(alias = "vulkan")]
Vulkan,
#[serde(alias = "dx12")]
DX12,
#[serde(alias = "wgpumetal")]
WgpuMetal,
#[cfg(target_os = "macos")]
#[cfg_attr(target_os = "macos", default)]
#[serde(alias = "metal")]
Metal,
}
impl Display for Backend {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
Backend::Automatic => {
write!(f, "Automatic")
}
#[cfg(target_os = "macos")]
Backend::Metal => {
write!(f, "Metal")
}
Backend::WgpuMetal => {
write!(f, "Metal")
}
Backend::Vulkan => {
write!(f, "Vulkan")
}
Backend::GL => {
write!(f, "GL")
}
Backend::DX12 => {
write!(f, "DX12")
}
}
}
}