From 4894c9db5b90a94b774277c0d80dc757a676cf7c Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 19 May 2026 11:13:49 -0700 Subject: [PATCH] Define investor rendering presets --- AGRARIAN_DEVELOPMENT_ROADMAP.md | 2 +- Config/AgrarianRenderingPresets.ini | 61 ++++++++++ Docs/Rendering/InvestorRenderingPresets.md | 48 ++++++++ Scripts/verify_investor_rendering_presets.py | 115 +++++++++++++++++++ 4 files changed, 225 insertions(+), 1 deletion(-) create mode 100644 Config/AgrarianRenderingPresets.ini create mode 100644 Docs/Rendering/InvestorRenderingPresets.md create mode 100644 Scripts/verify_investor_rendering_presets.py diff --git a/AGRARIAN_DEVELOPMENT_ROADMAP.md b/AGRARIAN_DEVELOPMENT_ROADMAP.md index 4dea512..1b0aa33 100644 --- a/AGRARIAN_DEVELOPMENT_ROADMAP.md +++ b/AGRARIAN_DEVELOPMENT_ROADMAP.md @@ -826,7 +826,7 @@ Target deliverable: A small group can join a server, spawn into one biome, gathe - [x] Add a real water-source visual pass with surface material, edge treatment, scale, and placement that reads as collectable freshwater instead of a placeholder plane. Formalized the MVP freshwater presentation around the native `AAgrarianWaterSource` water-surface, stone-bank, and collect-marker proxies, documented the Ground Zero drainage-candidate placement and nearby water-bank/reed dressing, and added an Unreal verifier that checks surface material, edge treatment, scale, placement, and nearby dressing actors in the actual map. - [x] Add density and sightline tuning so grasses, shrubs, trees, and resource clusters are visible enough to sell the world without hiding gameplay-critical objects. Added protected foliage clearances around early survival targets and biome resource nodes, sampled first-look sightline corridors from the player start to wood, fiber, campfire, shelter, wildlife, and freshwater, plus a dedicated Unreal verifier/documentation gate so investor-facing density cannot regress into object-hiding clutter. - [x] Preserve realism as the target: use assets, materials, lighting, and environmental dressing that can survive toward MVP production rather than cosmetic throwaways where practical. Added MVP realism target rules to the shared art/UX/code/asset standards, tied current 0.1.O visual passes to production-directed proxy expectations, and added a verifier that requires Ground Zero materials, water, density/sightline, character, and survival-object docs to point toward production realism instead of cosmetic throwaways. -- [ ] Define default, recommended, and cinematic investor rendering presets, with ray tracing available only as an optional high-end/cinematic mode and never required for baseline visual credibility. +- [x] Define default, recommended, and cinematic investor rendering presets, with ray tracing available only as an optional high-end/cinematic mode and never required for baseline visual credibility. Added `Config/AgrarianRenderingPresets.ini`, `Docs/Rendering/InvestorRenderingPresets.md`, and a verifier that requires Default and Recommended to remain non-ray-traced while Cinematic is the only optional high-end ray-tracing profile. - [ ] Verify the non-ray-traced compatibility/default path still looks credible on common investor, tester, and remote-session hardware. - [ ] Add packaged-demo visual QA screenshots or short clips for startup credits, character selection, first spawn, terrain, vegetation, water, campfire, shelter, pause menu, and save/quit before each investor build is called ready. - [ ] Add an investor-demo acceptance gate: no current build should be described as investor visual MVP if menus are confusing, character art is mannequin-only, terrain is flat/tan, foliage is absent or unreadable, or core objects still read as primitive debug shapes. diff --git a/Config/AgrarianRenderingPresets.ini b/Config/AgrarianRenderingPresets.ini new file mode 100644 index 0000000..78258e7 --- /dev/null +++ b/Config/AgrarianRenderingPresets.ini @@ -0,0 +1,61 @@ +; Agrarian investor/tester rendering presets. +; These are project-owned policy presets; launcher/runtime wiring can consume +; them as UI settings or command-line CVar groups in later milestones. + +[AgrarianRenderingPreset.Default] +DisplayName=Default +Audience=Investor demo baseline, remote play, and common tester hardware +TargetResolution=1920x1080 +TargetFrameRate=60 +RayTracing=Disabled +GlobalIllumination=LumenSoftware +ReflectionMode=ScreenSpaceAndLumen +ShadowQuality=High +FoliageDensity=InvestorReadable +WaterQuality=ReadableMvp ++CVars=r.RayTracing=0 ++CVars=r.Lumen.HardwareRayTracing=0 ++CVars=r.PathTracing=0 ++CVars=r.DynamicGlobalIlluminationMethod=1 ++CVars=r.ReflectionMethod=1 ++CVars=r.Shadow.Virtual.Enable=1 ++CVars=r.ScreenPercentage.Default=100 + +[AgrarianRenderingPreset.Recommended] +DisplayName=Recommended +Audience=Local GPU tester and investor machines with stable Unreal 5 Lumen support +TargetResolution=2560x1440 +TargetFrameRate=60 +RayTracing=Disabled +GlobalIllumination=LumenSoftwareHigh +ReflectionMode=Lumen +ShadowQuality=High +FoliageDensity=InvestorReadable +WaterQuality=EnhancedMvp ++CVars=r.RayTracing=0 ++CVars=r.Lumen.HardwareRayTracing=0 ++CVars=r.PathTracing=0 ++CVars=r.DynamicGlobalIlluminationMethod=1 ++CVars=r.ReflectionMethod=1 ++CVars=r.Shadow.Virtual.Enable=1 ++CVars=r.ScreenPercentage.Default=100 + +[AgrarianRenderingPreset.Cinematic] +DisplayName=Cinematic +Audience=High-end local capture, screenshots, clips, and controlled investor walkthroughs +TargetResolution=3840x2160 +TargetFrameRate=30 +RayTracing=Optional +GlobalIllumination=LumenHardwareWhenAvailable +ReflectionMode=LumenHardwareWhenAvailable +ShadowQuality=Cinematic +FoliageDensity=InvestorReadable +WaterQuality=Cinematic ++CVars=r.RayTracing=1 ++CVars=r.Lumen.HardwareRayTracing=1 ++CVars=r.PathTracing=0 ++CVars=r.RayTracing.Shadows=1 ++CVars=r.DynamicGlobalIlluminationMethod=1 ++CVars=r.ReflectionMethod=1 ++CVars=r.Shadow.Virtual.Enable=1 ++CVars=r.ScreenPercentage.Default=100 diff --git a/Docs/Rendering/InvestorRenderingPresets.md b/Docs/Rendering/InvestorRenderingPresets.md new file mode 100644 index 0000000..db2f4bc --- /dev/null +++ b/Docs/Rendering/InvestorRenderingPresets.md @@ -0,0 +1,48 @@ +# Investor Rendering Presets + +Agrarian should support high-end cinematic capture without making ray tracing a +baseline requirement. The investor demo should look credible in the default +non-ray-traced path first, then scale up when local hardware supports it. + +Preset definitions live in `Config/AgrarianRenderingPresets.ini`. + +## Default + +Default is the investor demo baseline for remote play, screen sharing, and +common tester hardware. + +- Target: 1080p, 60 FPS. +- Ray tracing: disabled. +- Lighting: Lumen software/global illumination path. +- Shadows: virtual shadow maps enabled. +- Use case: packaged demo, repeated testing, and normal investor handoff. + +## Recommended + +Recommended is for local GPU testing and investor machines that handle Unreal 5 +Lumen comfortably. + +- Target: 1440p, 60 FPS. +- Ray tracing: disabled. +- Lighting/reflection quality: higher software Lumen settings where available. +- Use case: local capture and higher-fidelity live walkthroughs without relying + on ray-tracing support. + +## Cinematic + +Cinematic is optional and should be used only for controlled local capture or +high-end walkthroughs. + +- Target: 4K, 30 FPS. +- Ray tracing: optional high-end mode. +- Lighting/reflections: hardware Lumen when available. +- Use case: screenshots, short clips, and investor capture passes. + +## Policy + +- No gameplay feature should require ray tracing. +- The default investor demo must remain credible with ray tracing disabled. +- Cinematic settings may be slower and should never become the required tester + path. +- If a visual feature only works in cinematic mode, it needs a default-mode + fallback before it can be considered MVP-ready. diff --git a/Scripts/verify_investor_rendering_presets.py b/Scripts/verify_investor_rendering_presets.py new file mode 100644 index 0000000..30a4412 --- /dev/null +++ b/Scripts/verify_investor_rendering_presets.py @@ -0,0 +1,115 @@ +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +PRESET_FILE = ROOT / "Config" / "AgrarianRenderingPresets.ini" +DOCS_FILE = ROOT / "Docs" / "Rendering" / "InvestorRenderingPresets.md" +ROADMAP_FILE = ROOT / "AGRARIAN_DEVELOPMENT_ROADMAP.md" + +EXPECTED_PRESETS = { + "AgrarianRenderingPreset.Default": { + "RayTracing": "Disabled", + "TargetResolution": "1920x1080", + "TargetFrameRate": "60", + "required_cvars": { + "r.RayTracing=0", + "r.Lumen.HardwareRayTracing=0", + "r.PathTracing=0", + }, + }, + "AgrarianRenderingPreset.Recommended": { + "RayTracing": "Disabled", + "TargetResolution": "2560x1440", + "TargetFrameRate": "60", + "required_cvars": { + "r.RayTracing=0", + "r.Lumen.HardwareRayTracing=0", + "r.PathTracing=0", + }, + }, + "AgrarianRenderingPreset.Cinematic": { + "RayTracing": "Optional", + "TargetResolution": "3840x2160", + "TargetFrameRate": "30", + "required_cvars": { + "r.RayTracing=1", + "r.Lumen.HardwareRayTracing=1", + "r.PathTracing=0", + }, + }, +} + + +def read_presets(): + presets = {} + active_section = None + for raw_line in PRESET_FILE.read_text(encoding="utf-8").splitlines(): + line = raw_line.strip() + if not line or line.startswith(";"): + continue + if line.startswith("[") and line.endswith("]"): + active_section = line[1:-1] + presets[active_section] = {"CVars": []} + continue + if not active_section or "=" not in line: + continue + + key, value = line.split("=", 1) + if key == "+CVars": + presets[active_section]["CVars"].append(value) + else: + presets[active_section][key] = value + return presets + + +def main(): + failures = [] + if not PRESET_FILE.exists(): + failures.append(f"missing {PRESET_FILE}") + if not DOCS_FILE.exists(): + failures.append(f"missing {DOCS_FILE}") + if failures: + raise SystemExit("Investor rendering preset verification failed:\n" + "\n".join(failures)) + + parser = read_presets() + for preset_name, expectations in EXPECTED_PRESETS.items(): + if preset_name not in parser: + failures.append(f"missing preset section {preset_name}") + continue + + section = parser[preset_name] + for key, expected_value in expectations.items(): + if key == "required_cvars": + continue + actual_value = section.get(key) + if actual_value != expected_value: + failures.append(f"{preset_name} {key} expected {expected_value}, got {actual_value}") + + cvars = set(section.get("CVars", [])) + missing_cvars = sorted(expectations["required_cvars"] - cvars) + if missing_cvars: + failures.append(f"{preset_name} missing CVars: {', '.join(missing_cvars)}") + + docs_text = DOCS_FILE.read_text(encoding="utf-8") + for snippet in [ + "Default", + "Recommended", + "Cinematic", + "No gameplay feature should require ray tracing.", + "default investor demo must remain credible with ray tracing disabled", + ]: + if snippet not in docs_text: + failures.append(f"{DOCS_FILE} missing snippet: {snippet}") + + roadmap_text = ROADMAP_FILE.read_text(encoding="utf-8") + if "[x] Define default, recommended, and cinematic investor rendering presets" not in roadmap_text: + failures.append("roadmap item is not marked complete") + + if failures: + raise SystemExit("Investor rendering preset verification failed:\n" + "\n".join(failures)) + + print("PASS: investor rendering presets define non-ray-traced default/recommended and optional cinematic ray tracing.") + + +if __name__ == "__main__": + main()