mod font;
mod hud;
mod loading;
mod physics;
mod sky;
use crate::components::{EngineDefaults, GraphicsConfig};
use crate::ecs::asset_id::{AssetId, MintedIds};
use crate::ecs::{FontHandle, PipelineContext};
use crate::result::CnResult;
pub use font::{HUD_FONT_SIZE_PX, HudFont, hud_font};
pub fn run(ctx: &mut PipelineContext) -> Result<(), CnResult> {
let toggles = take_toggles(ctx)?;
let mut minter = Minter::resume(ctx);
let result = inject_defaults(ctx, &toggles, &mut minter);
minter.store(ctx);
result
}
fn inject_defaults(
ctx: &mut PipelineContext,
toggles: &EngineDefaults,
minter: &mut Minter,
) -> Result<(), CnResult> {
if toggles.physics_config {
physics::inject(ctx);
}
if ctx.query::<GraphicsConfig>().next().is_none() {
return Ok(());
}
if toggles.sky {
sky::inject(ctx, minter)?;
}
if toggles.hud {
hud::complete_stat_hud(ctx, minter)?;
}
if toggles.debug_hud {
hud::inject_debug_hud(ctx, minter)?;
}
if toggles.loading_overlay {
loading::inject(ctx, minter)?;
}
Ok(())
}
fn take_toggles(ctx: &mut PipelineContext) -> Result<EngineDefaults, CnResult> {
let mut declared = ctx.drain::<EngineDefaults>();
if declared.len() > 1 {
return Err(CnResult::InvalidState);
}
Ok(declared.pop().unwrap_or_default())
}
#[derive(Default)]
pub(crate) struct Minter {
ids: MintedIds,
}
impl Minter {
fn resume(ctx: &PipelineContext) -> Self {
Self {
ids: ctx.resource::<MintedIds>().cloned().unwrap_or_default(),
}
}
fn store(self, ctx: &mut PipelineContext) {
ctx.insert_resource(self.ids);
}
fn id(&mut self) -> AssetId {
self.ids.next_id()
}
fn hud_font(&mut self, ctx: &mut PipelineContext) -> Result<FontHandle, CnResult> {
font::hud_font(ctx)
}
}
#[cfg(test)]
mod tests;