diff --git a/AGRARIAN_DEVELOPMENT_ROADMAP.md b/AGRARIAN_DEVELOPMENT_ROADMAP.md index 5bd826e..ba84801 100644 --- a/AGRARIAN_DEVELOPMENT_ROADMAP.md +++ b/AGRARIAN_DEVELOPMENT_ROADMAP.md @@ -948,6 +948,7 @@ Required order: - [x] Replace or upgrade the terrain material first so Ground Zero no longer reads as flat tan placeholder ground. Rebuilt `M_AGR_GZ_Terrain_CoastalScrub` as a procedural coastal scrub material that blends dry soil, scrub green, and sandy path color families with broad and fine noise, documented the visual baseline, and extended the natural-environment verifier so flat constant-color terrain fails. - [x] Replace or upgrade grasses, shrubs, and trees with believable coastal-scrub vegetation assets, density, color variation, scale variation, and LOD/performance limits. Added native generated coastal oak, coyote brush, and dry grass clump mesh assets under `/Game/Agrarian/Environment/Vegetation`, switched the Ground Zero foliage patch off engine basic shapes, rebuilt foliage materials with per-instance color variation, preserved investor-facing density and scale variation, added explicit HISM cull/shadow performance limits, and extended verifiers so basic-shape vegetation or missing cull limits fail. +- [x] Add the Asset acquisition and ingest pipeline before pulling more visuals: created approved staging folders, added `Docs/Art/AssetLicenses.md`, documented the pipeline in `Docs/Art/AgrarianAssetPipeline.md`, added `Scripts/verify_asset_pipeline_policy.py`, defaulted to Fab/free, Quixel, CC0/public-domain, team-created, or Nathan-supplied assets only, rejected random scraped internet assets, and prioritized trees, shrubs, grass, water, rocks, character bodies/outfits, and old abandoned equipment being reclaimed by nature. - [ ] Replace or upgrade freshwater visuals with readable water surface, edge treatment, bank dressing, reflection/roughness tuning, and collectability cues. - [ ] Replace or upgrade character bodies and clothing so selected characters read as realistic near-future post-collapse frontier people rather than template mannequins or proxy stacks. - [ ] Replace or upgrade resource objects so wood, stone, fiber, edible plants, pickups, and gathered items look like world objects rather than debug primitives. diff --git a/Docs/Art/AgrarianAssetPipeline.md b/Docs/Art/AgrarianAssetPipeline.md new file mode 100644 index 0000000..3bef72e --- /dev/null +++ b/Docs/Art/AgrarianAssetPipeline.md @@ -0,0 +1,77 @@ +# Agrarian Asset Pipeline + +Purpose: replace placeholder visuals with realistic, licensed, performant +assets while keeping the project clean enough to scale across Earth-sized +tiles. + +## Visual Direction + +Agrarian should read as realistic modern post-collapse frontier survival: +damaged but recoverable, practical, lived-in, and grounded. The world should +not look cartoonish, old-west, or exaggerated apocalypse junkyard. + +## First Asset Priorities + +1. Coastal scrub trees. +2. Shrubs and bushes. +3. Grasses and ground cover. +4. Water, banks, wet edges, and shoreline dressing. +5. Rocks, terrain decals, and material detail. +6. Two to four human character bodies/outfits. +7. Old abandoned equipment starting to be overtaken by nature. + +## Approved Sources + +- Fab free assets or assets explicitly owned for this project. +- Quixel/Megascans assets available under the current Epic/Unreal terms. +- CC0/public-domain art libraries. +- Assets created internally. +- Assets Nathan manually adds to the staging folder with permission to use. + +Do not scrape random internet images or models. If an asset cannot be traced to +a usable license, reject it. + +## Staging Workflow + +1. Place downloaded/manual assets in: + `/home/nathan/AssetStaging/Agrarian/Incoming` +2. Save license evidence in: + `/home/nathan/AssetStaging/Agrarian/LicenseEvidence` +3. Review license and visual fit. +4. Move acceptable assets to: + `/home/nathan/AssetStaging/Agrarian/Approved` +5. Import into Unreal under the correct project path: + `/Game/Agrarian/Environment`, `/Game/Agrarian/Characters`, + `/Game/Agrarian/Props`, or `/Game/Agrarian/Effects`. +6. Rename using Agrarian naming policy. +7. Generate or verify: + - materials/material instances + - collision + - LODs or Nanite settings + - texture size limits + - foliage cull distances where relevant + - gameplay tags or placement metadata where relevant +8. Record the asset in `Docs/Art/AssetLicenses.md`. +9. Run visual and placeholder verifiers before packaging a demo. + +## Unreal Import Notes + +- Foliage should use HISM/foliage-friendly meshes with cull distances and + sensible material complexity. +- Nanite may be used for rigid static meshes where it improves visual density, + but grass and alpha-heavy foliage still need performance testing. +- Characters and animals must not be imported as static showcase meshes if + gameplay requires animation. They need skeletal meshes, animation targets, + collision, and gameplay integration. +- Water should be handled as a shader/system problem, not a generated model. + +## Rejection Rules + +Reject or quarantine assets that: + +- have unclear licensing. +- require attribution we cannot satisfy in-game or in shipped notices. +- are visibly stylized against the realism target. +- are too high-poly or texture-heavy without a practical optimization path. +- include unrelated branding, logos, watermarks, or embedded marketplace demo + content. diff --git a/Docs/Art/AssetLicenses.md b/Docs/Art/AssetLicenses.md new file mode 100644 index 0000000..159ba9b --- /dev/null +++ b/Docs/Art/AssetLicenses.md @@ -0,0 +1,55 @@ +# Agrarian Asset License Register + +Every non-original art asset imported into Agrarian must be recorded here +before it is used in a playable map, packaged demo, screenshot, or trailer. + +Allowed default sources: + +- Fab assets explicitly marked free or otherwise purchased/owned for this + project. +- Quixel/Megascans assets available under the current Epic/Unreal terms for + this project. +- CC0 or public-domain assets. +- Assets created by the Agrarian team. +- Assets manually supplied by Nathan with permission to use in the game. + +Do not import random internet images, models, scans, or textures unless the +license is clear, compatible with commercial game use, and recorded below. + +## Staging Policy + +Asset staging root on the Unreal Ubuntu VM: + +`/home/nathan/AssetStaging/Agrarian` + +Expected subfolders: + +- `Incoming`: newly downloaded or manually supplied assets. +- `LicenseEvidence`: screenshots, text exports, or links proving license terms. +- `Approved`: assets reviewed and ready for Unreal import. +- `Processed`: assets imported, optimized, renamed, and verified. +- `Rejected`: assets that should not be used. + +## Naming Policy + +Use project-readable names before import: + +- Static meshes: `SM___` +- Skeletal meshes: `SK___` +- Materials: `M__` or `MI___` +- Textures: `T___` +- Niagara systems: `NS__` + +Examples: + +- `SM_Tree_CoastalOak_A` +- `SM_Shrub_CoyoteBrush_B` +- `MI_Ground_CoastalScrub_Dry` +- `SK_Human_FrontierAdult_A` +- `SM_Equipment_OvergrownTractor_A` + +## License Entries + +| Asset | Type | Source | License | Cost | Imported Path | Notes | +| --- | --- | --- | --- | --- | --- | --- | +| Native Ground Zero proxy vegetation | Tree/shrub/grass placeholders | Created in project | Project-owned | N/A | `/Game/Agrarian/Environment/Vegetation` | Generated proxy meshes; replace with licensed/production assets during 0.2.0 visual credibility work. | diff --git a/Scripts/verify_asset_pipeline_policy.py b/Scripts/verify_asset_pipeline_policy.py new file mode 100644 index 0000000..ee38bf5 --- /dev/null +++ b/Scripts/verify_asset_pipeline_policy.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +"""Verify Agrarian asset pipeline policy docs are present and explicit.""" + +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] + +REQUIRED = { + "Docs/Art/AssetLicenses.md": [ + "Fab assets explicitly marked free", + "Quixel/Megascans", + "CC0 or public-domain", + "/home/nathan/AssetStaging/Agrarian", + "Do not import random internet images", + "Native Ground Zero proxy vegetation", + ], + "Docs/Art/AgrarianAssetPipeline.md": [ + "realistic modern post-collapse frontier survival", + "Old abandoned equipment", + "Do not scrape random internet images or models", + "LicenseEvidence", + "Run visual and placeholder verifiers", + "Water should be handled as a shader/system problem", + ], + "AGRARIAN_DEVELOPMENT_ROADMAP.md": [ + "Asset acquisition and ingest pipeline", + "Fab/free, Quixel, CC0/public-domain", + "old abandoned equipment", + ], +} + + +def main() -> None: + missing: list[str] = [] + for relative_path, snippets in REQUIRED.items(): + path = ROOT / relative_path + if not path.exists(): + missing.append(f"missing file: {relative_path}") + continue + text = path.read_text(encoding="utf-8") + for snippet in snippets: + if snippet not in text: + missing.append(f"{relative_path}: missing snippet {snippet!r}") + + if missing: + raise SystemExit("\n".join(missing)) + + print("Asset pipeline policy verification complete.") + + +if __name__ == "__main__": + main()