import type { BackdropConfig, LightingConfig } from "../game/playableGame.js"; import type { SkyEnvironmentConfig } from "../world/features.js"; import type { PostProcessingConfig } from "./postProcessing.js"; /** * Named look preset composing the existing lighting/sky/fog/post knobs into one field. * `"neutral"` (the default when unset) keeps presentation unstyled; `"cinematic"` draws a scene lit like a shipped game — a real day sky * with a view-following shadow-casting sun + hemisphere fill, a network-free image-based-lighting * environment so PBR surfaces catch soft reflections, and a tuned tone-map/bloom/AO/vignette post * stack. `"comic"` adds ink outlines and cel bands over a saturated grade (Borderlands-style); * `"retro"` pixelates and posterizes the frame. `"flat"` opts out of the sky/IBL/post rig to the bare ambient+directional default (pre-#773). * The upgraded default primitive materials — tuned roughness/metalness plus subtle procedural surface * detail so un-modeled boxes/capsules stop reading as flat plastic — apply under both presets. * @capability default-look one field that lights a scene like a shipped game (opt out with "flat") */ export type LookPreset = "neutral" | "photoreal" | "toon" | "comic" | "retro" | "cinematic" | "flat"; /** Every look preset name, for pickers and validating a preset read from a URL or file. */ export declare const LOOK_PRESETS: readonly LookPreset[]; /** Explicit graphics knobs a game may set; the preset only fills the ones left undefined. */ export interface GameLookInput { look?: LookPreset; lighting?: LightingConfig; backdrop?: BackdropConfig; postProcessing?: PostProcessingConfig; /** True when the world already declares its own sky — the preset then leaves the sky to the world. */ hasWorldSky?: boolean; } /** Concrete lighting/backdrop/post the shell renders after the preset has filled unset knobs. */ export interface ResolvedGameLook { lighting?: LightingConfig; backdrop?: BackdropConfig; postProcessing?: PostProcessingConfig; } /** A static day sky: a real dome plus the shell's view-following shadow-casting sun and hemisphere fill. */ export declare const CINEMATIC_SKY: SkyEnvironmentConfig; /** Tuned tone-map + bloom + gentle SSAO + vignette/grade stack — the shipped-game post look. */ export declare const CINEMATIC_POST_PROCESSING: PostProcessingConfig; /** Unstyled baseline: no bloom or grade; contact AO stays at the graphics-tier default. */ export declare const NEUTRAL_POST_PROCESSING: PostProcessingConfig; /** High-contrast physically based presentation for authored HDR environments. */ export declare const PHOTOREAL_POST_PROCESSING: PostProcessingConfig; /** Clean graphic presentation; toon materials remain game-owned while this sets the grade. */ export declare const TOON_POST_PROCESSING: PostProcessingConfig; /** Ink outlines, four cel bands and a punchy grade — a hand-inked comic look on any model. */ export declare const COMIC_POST_PROCESSING: PostProcessingConfig; /** Chunky pixels and posterized colour with no smoothing — a low-resolution retro look. */ export declare const RETRO_POST_PROCESSING: PostProcessingConfig; /** * Deep-merge a game's partial post chain over a preset's. Every field the game set wins, including * `false` to drop a stage; fields it left unset come from the preset, and stage objects merge field by * field (tuples such as `grade.lift` replace whole). * @capability merge-post-processing layer a partial post chain over a look preset without losing its stages */ export declare function mergePostProcessing(preset: PostProcessingConfig, authored: PostProcessingConfig | undefined): PostProcessingConfig; /** * Expand a game's `look` into concrete lighting/backdrop/post. The default is `"neutral"`; * `"flat"` passes the explicit knobs through untouched. * Anything the game authored wins — the preset only fills unset knobs, and it never adds a sky when * the world already owns one (so the sky's tuned sun/hemisphere serve as the lighting rig). * A styled preset's post stages are deep-merged under a partial game `postProcessing` * ({@link mergePostProcessing}); under `"neutral"` a game's own chain is used as authored. * @capability resolve-game-look expand a look preset into concrete lighting/backdrop/post knobs */ export declare function resolveGameLook(input: GameLookInput): ResolvedGameLook;