72 lines
8.7 KiB
JSON
72 lines
8.7 KiB
JSON
{
|
|
"_comment": "What Content/Terrain/ is made of. Read by Scripts/Authoring/collect_terrain_assets.py, which copies each source into the destination, repoints the copies at each other so the set stands on its own, and reports anything still leaning on a pack. Adding ground is a line in `assets`, and a rerun: the script is idempotent and skips what is already there and current.",
|
|
|
|
"_comment_why": "The ground was spread across the asset packs, one folder per vendor, with no way to tell what the project actually uses as terrain from what came along with a pack. This collects it. Copies rather than moves, so a pack stays exactly as it shipped and can be updated or deleted without taking the ground with it; the cost is the bytes, which for the Rocky Meadows set is about 200 MB through LFS.",
|
|
|
|
"destination": "/Game/Terrain",
|
|
|
|
"_comment_naming": "The project's asset prefixes (CLAUDE.md): T_ textures, M_ master materials, MI_ instances, MF_ material functions. The pack's own names are kept for the textures, which already comply, and for the layer infos, whose asset names are load-bearing nowhere but whose `LayerName` property must keep matching the layer names the master material blends: Base_Layer, Layer_02, Layer_03. Those three names mislead and are the pack's, not ours: Base_Layer is the rock, Layer_02 the meadow grass, Layer_03 the high rock.",
|
|
|
|
"assets": [
|
|
{ "source": "/Game/Elite_RockyMeadows/Textures/T_Grass_Color_02", "dest": "Textures/T_Grass_Color_02" },
|
|
{ "source": "/Game/Elite_RockyMeadows/Textures/T_Grass_normal", "dest": "Textures/T_Grass_Normal" },
|
|
{ "source": "/Game/Elite_RockyMeadows/Textures/T_Rock_Base_Color", "dest": "Textures/T_Rock_Base_Color" },
|
|
{ "source": "/Game/Elite_RockyMeadows/Textures/T_Rock_Base_Normal", "dest": "Textures/T_Rock_Base_Normal" },
|
|
{ "source": "/Game/Elite_RockyMeadows/Textures/T_Rock_High_Color", "dest": "Textures/T_Rock_High_Color" },
|
|
{ "source": "/Game/Elite_RockyMeadows/Textures/T_Rock_Shade_Variation", "dest": "Textures/T_Rock_Shade_Variation" },
|
|
|
|
{ "source": "/Game/Elite_RockyMeadows/Materials/Material_Functions/Base_Layer_function", "dest": "Materials/Functions/MF_Ground_Rock" },
|
|
{ "source": "/Game/Elite_RockyMeadows/Materials/Material_Functions/Layer_02_function", "dest": "Materials/Functions/MF_Ground_Meadow" },
|
|
{ "source": "/Game/Elite_RockyMeadows/Materials/Material_Functions/Layer_03_function", "dest": "Materials/Functions/MF_Ground_RockHigh" },
|
|
|
|
{ "source": "/Game/Elite_RockyMeadows/Materials/M_Landscape_Main", "dest": "Materials/M_Ground_Landscape" },
|
|
{ "source": "/Game/Elite_RockyMeadows/Materials/M_Landscape_Main_Inst_RockyMeadows02", "dest": "Materials/MI_Ground_RockyMeadows",
|
|
"_comment_parameters": "The two instances the pack ships share every texture and differ only in these colour multipliers, so which one a world uses decides what its ground *is*. RockyMeadows02, the one copied here, multiplies the meadow layer by (0.185, 0.248, 0.401) - a blue - at every distance, which is why a world painted 78% grass rendered as cold blue-grey rock from the air. These are Inst_Rocky's numbers instead, read from the pack's own Rocky_Meadows_01 demo map, where the meadow's far multiplier is a yellow-green and distant rock keeps its full brightness. They are applied to the copy; the pack is never modified. `Distance Blending Value Layer 02` is 20000 cm, so past 200 m it is the _Far colours alone that are seen - on a world tens of kilometres across that is almost all of it, which is what makes the far pair the ones that matter.",
|
|
"parameters": {
|
|
"vector": {
|
|
"Base Texture Color": [0.406250, 0.353117, 0.304688, 1.0],
|
|
"Base Texture Color Far": [1.000000, 1.000000, 1.000000, 1.0],
|
|
"Layer 02 Texture Color": [0.131353, 0.151042, 0.125868, 1.0],
|
|
"Layer 02 Texture Color_Far": [0.517693, 0.557292, 0.388244, 1.0],
|
|
"Layer 03 Texture Color": [0.781250, 0.725061, 0.663249, 1.0]
|
|
}
|
|
} },
|
|
|
|
{ "source": "/Game/Elite_RockyMeadows/Materials/Material_Layers/Base_Layer_LayerInfo", "dest": "Layers/Base_Layer_LayerInfo" },
|
|
{ "source": "/Game/Elite_RockyMeadows/Materials/Material_Layers/Layer_02_LayerInfo", "dest": "Layers/Layer_02_LayerInfo" },
|
|
{ "source": "/Game/Elite_RockyMeadows/Materials/Material_Layers/Layer_03_LayerInfo", "dest": "Layers/Layer_03_LayerInfo" }
|
|
],
|
|
|
|
"_comment_not_here": "Deliberately left in their packs. T_Cloud_Shadows_Tex and M_Cloud_Shadows_Inst02 dress the sun, not the ground, and belong with the sky kit in rocky_meadows.py. HouseForge_01's Textures/Stone is architecture - walls, stairs, a doorway - not terrain, and its Viking_Village_Props grass is a foliage card. Medieval_Weapons and RPGEnvironmentVFX have no ground at all. When a pack with real ground arrives, its substances go in `assets` above and nowhere else.",
|
|
|
|
"_comment_substances": "Ground that came from Fab rather than from a pack already in Content/. `assets` above duplicates assets the project already has; these are raw downloads that have to be *imported* first, which is a different job with a different tool. `mapart substances` reads this block, pulls the three maps the landscape material samples out of each set's nine, downsamples them to `resolution`, and writes them to `output_dir`; the import then has a small, clean folder to work from and never sees the 800 MB of 4K originals. Adding ground is a folder under `source_dir`, a line in `sets`, and a rerun.",
|
|
|
|
"_comment_resolution": "2048, not the 4096 they were downloaded at. The scans are 2 m across, so 4K is 2048 pixels per metre for ground that is almost always seen at grazing distance across a 71 km world - and a UTexture2D stores its source inside the uasset, so the resolution here is what decides whether this pipeline costs tens of megabytes through LFS or hundreds. Raise it if a substance turns out to be seen close up and looks soft; it is one number and a rerun.",
|
|
|
|
"_comment_maps": "BaseColor, Normal, Roughness. The pack's own ground samples colour and normal only, so this is already one map richer than what is there. AO, Cavity, Displacement, Gloss, Specular and Bump are downloaded and unused: AO and Cavity are baked into a scan's own colour at this distance, Displacement needs tessellation nobody has turned on, and Gloss is Roughness inverted.",
|
|
|
|
"substances": {
|
|
"source_dir": "RawContent/Terrain/Source",
|
|
"output_dir": "RawContent/Terrain/Substances",
|
|
"resolution": 2048,
|
|
"jpeg_quality": 92,
|
|
"maps": ["BaseColor", "Normal", "Roughness"],
|
|
|
|
"_comment_sets": "`layer` is the paint layer in RawContent/World/Region.json this substance is the ground for, so the two files agree about what a layer is made of without either importing the other. `physical_m` is left out on purpose: it is read from the set's own Quixel metadata, because it is what the material needs to tile the texture life-size and a number copied by hand goes stale the moment a substance is swapped for one scanned at a different scale.",
|
|
"sets": [
|
|
{ "name": "Rock_Layered", "folder": "Layered_Rock_Cliff-a1d10e7b", "layer": "Base_Layer",
|
|
"note": "Replaces the pack's rock on every steep slope in the world (D-76). A 2 m scan against a tiling texture; MI_Ground_RockyMeadows' colour corrections were tuned to the old one and will want re-reading." },
|
|
{ "name": "Sand_Beach", "folder": "Thai_Beach_Sand-21c8230c", "layer": "Beach",
|
|
"note": "Categorised surface/sand/beach in its own metadata, which is exactly what the shore layer wants." },
|
|
{ "name": "Sand_Desert", "folder": "Bright_Desert_Sand-fe7bd740", "layer": "Sand",
|
|
"note": "Deliberately a different set from the beach: one substance for both would make every shoreline read as the desert running into the sea." },
|
|
{ "name": "Snow", "folder": "Snow-2ddf31c1", "layer": "Ice",
|
|
"note": "Snow rather than the Frozen_Lake or Ice_Cliff sets beside it. An ice cap's surface is snow; blue ice is what a lake or a calving face looks like." },
|
|
{ "name": "Gravel_Coarse", "folder": "Desert_Western_Ground_Gravel_Coarse_04-900b9858", "layer": "Regolith",
|
|
"note": "Coarse gravel, which is what impact ground reads as. Nothing here is actually a regolith scan." }
|
|
],
|
|
|
|
"_comment_unused": "Three downloaded sets have no layer and are not extracted. Frozen_Lake and Ice_Cliff are blue ice, which the ice cap does not want; Mossy_Rocky_Ground was the nearest thing to a jungle floor and is temperate rather than tropical, so the Jungle layer was dropped instead of being dressed wrongly (D-76). They stay in Source/ because the download is the expensive part, and Source/ is not tracked."
|
|
}
|
|
}
|