diff --git a/AGRARIAN_DEVELOPMENT_ROADMAP.md b/AGRARIAN_DEVELOPMENT_ROADMAP.md index 1b0aa33..b2ee045 100644 --- a/AGRARIAN_DEVELOPMENT_ROADMAP.md +++ b/AGRARIAN_DEVELOPMENT_ROADMAP.md @@ -827,7 +827,7 @@ Target deliverable: A small group can join a server, spawn into one biome, gathe - [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. - [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. +- [x] Verify the non-ray-traced compatibility/default path still looks credible on common investor, tester, and remote-session hardware. Added a dedicated non-ray-traced default verifier that checks Default and Recommended disable `r.RayTracing`, `r.Lumen.HardwareRayTracing`, and `r.PathTracing`, keeps Cinematic as the only optional ray-tracing profile, and documents that packaged investor demos should launch on Default unless another profile is explicitly selected. - [ ] 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/Docs/Rendering/InvestorRenderingPresets.md b/Docs/Rendering/InvestorRenderingPresets.md index db2f4bc..b8bc10a 100644 --- a/Docs/Rendering/InvestorRenderingPresets.md +++ b/Docs/Rendering/InvestorRenderingPresets.md @@ -42,6 +42,8 @@ high-end walkthroughs. - No gameplay feature should require ray tracing. - The default investor demo must remain credible with ray tracing disabled. +- The packaged investor demo should launch against the Default preset unless a + tester explicitly selects another profile. - 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 diff --git a/Scripts/verify_non_ray_traced_default.py b/Scripts/verify_non_ray_traced_default.py new file mode 100644 index 0000000..f30752a --- /dev/null +++ b/Scripts/verify_non_ray_traced_default.py @@ -0,0 +1,86 @@ +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" + + +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 = [] + presets = read_presets() + default = presets.get("AgrarianRenderingPreset.Default") + recommended = presets.get("AgrarianRenderingPreset.Recommended") + cinematic = presets.get("AgrarianRenderingPreset.Cinematic") + + if not default: + failures.append("missing AgrarianRenderingPreset.Default") + if not recommended: + failures.append("missing AgrarianRenderingPreset.Recommended") + if not cinematic: + failures.append("missing AgrarianRenderingPreset.Cinematic") + + for label, section in [("Default", default), ("Recommended", recommended)]: + if not section: + continue + cvars = set(section.get("CVars", [])) + if section.get("RayTracing") != "Disabled": + failures.append(f"{label} RayTracing must be Disabled") + for cvar in ["r.RayTracing=0", "r.Lumen.HardwareRayTracing=0", "r.PathTracing=0"]: + if cvar not in cvars: + failures.append(f"{label} missing non-ray-tracing CVar {cvar}") + if "r.RayTracing=1" in cvars or "r.Lumen.HardwareRayTracing=1" in cvars: + failures.append(f"{label} enables ray tracing") + + if cinematic: + cvars = set(cinematic.get("CVars", [])) + if cinematic.get("RayTracing") != "Optional": + failures.append("Cinematic RayTracing must be Optional") + if "r.RayTracing=1" not in cvars: + failures.append("Cinematic must be the only preset that opts into r.RayTracing=1") + + docs_text = DOCS_FILE.read_text(encoding="utf-8") + for snippet in [ + "Default is the investor demo baseline", + "Ray tracing: disabled.", + "Cinematic is optional", + "No gameplay feature should require ray tracing.", + ]: + 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] Verify the non-ray-traced compatibility/default path" not in roadmap_text: + failures.append("roadmap item is not marked complete") + + if failures: + raise SystemExit("Non-ray-traced default verification failed:\n" + "\n".join(failures)) + + print("PASS: default and recommended investor rendering paths are non-ray-traced; cinematic is optional.") + + +if __name__ == "__main__": + main()