Add Agrarian asset pipeline policy

This commit is contained in:
2026-05-21 22:16:57 +00:00
parent 3f27be7f88
commit f0713c6c46
4 changed files with 185 additions and 0 deletions
+1
View File
@@ -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 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] 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 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 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. - [ ] Replace or upgrade resource objects so wood, stone, fiber, edible plants, pickups, and gathered items look like world objects rather than debug primitives.
+77
View File
@@ -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.
+55
View File
@@ -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_<Category>_<SpeciesOrObject>_<Variant>`
- Skeletal meshes: `SK_<Category>_<Name>_<Variant>`
- Materials: `M_<Category>_<Name>` or `MI_<Category>_<Name>_<Variant>`
- Textures: `T_<Category>_<Name>_<MapType>`
- Niagara systems: `NS_<Effect>_<Variant>`
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. |
+52
View File
@@ -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()