This commit is contained in:
Rainer Leit
2026-09-25 17:02:24 +03:00
parent cc43ed8dc8
commit 9597629951
2149 changed files with 460234 additions and 1770 deletions
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:badf0d836e76b1cc8b7973805d05efdd3ac6741c04a0f688bf198eaffde45ff6
size 1523788
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ddd2e473db089a11da24150c6b297beeba10339a5a7b28f2868f41ee5bbd5dc9
size 10056654
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a9d67c2896ad270faf7d86187df5acf47eb8d328a332f9acef565ad8580a8c6b
size 694383
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a94885e7d50aaabb1646597e9c110f9ede8486adba67fbe351f38cda454030ac
size 1483703
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:afde7495a094787517f6f81acf68d571b88b8ff725fa738eb36cfe49883c49d7
size 9898252
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b792f62a059828c8a7e6caa9f30317cfe4429ac90855230d3cf9f58b3666fbbc
size 481255
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:282f1d57737e3642a054c519d6995177a5682906c174d334d4659543f525838d
size 1724227
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ba01a70ca892fcfc04198523dd4c31dd7615847b79250fd4e136e57daa1e6e8e
size 9582191
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8b192c33a7a1ca52e34c2063be28ca271b7ebb7bb00e17e1b54928ea8eb316b7
size 588546
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5c038cd5ac23af04893e82b9ac829a0bc7e3153ef5af70a49386f9296a8fd7a7
size 1665074
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ee7f6547bd805fa42dd665b4a280ccde6f8fe4c0eab8977683ad2a4574557761
size 7966014
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6a7d0221f0acda6a4de585df6ae984a872453f26fc84d0b9d4416752f18ffc55
size 714673
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:768bfbebe27ccb75dc8475e690db821977b606f87a6ac38c4593dfc222013ef8
size 702044
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e2e1b5123eda98145c3f54c98ebc138d01659d7fa17ababbc6396d01a1575a5a
size 5662640
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c1cf96738cc3a767bb7d39c899191e1e151042314f8698d62c699759443c67a9
size 1658373
@@ -0,0 +1,81 @@
{
"maps": [
"BaseColor",
"Normal",
"Roughness"
],
"resolution": 2048,
"sets": [
{
"name": "Rock_Layered",
"layer": "Base_Layer",
"source": "Layered_Rock_Cliff-a1d10e7b",
"physical_m": 2,
"written": [
"T_Rock_Layered_BaseColor.jpg",
"T_Rock_Layered_Normal.png",
"T_Rock_Layered_Roughness.jpg"
],
"from_px": 4096,
"to_px": 2048,
"seconds": 3.7319375
},
{
"name": "Sand_Beach",
"layer": "Beach",
"source": "Thai_Beach_Sand-21c8230c",
"physical_m": 2,
"written": [
"T_Sand_Beach_BaseColor.jpg",
"T_Sand_Beach_Normal.png",
"T_Sand_Beach_Roughness.jpg"
],
"from_px": 4096,
"to_px": 2048,
"seconds": 3.9402629
},
{
"name": "Sand_Desert",
"layer": "Sand",
"source": "Bright_Desert_Sand-fe7bd740",
"physical_m": 2,
"written": [
"T_Sand_Desert_BaseColor.jpg",
"T_Sand_Desert_Normal.png",
"T_Sand_Desert_Roughness.jpg"
],
"from_px": 4096,
"to_px": 2048,
"seconds": 3.8338872
},
{
"name": "Snow",
"layer": "Ice",
"source": "Snow-2ddf31c1",
"physical_m": 0.3,
"written": [
"T_Snow_BaseColor.jpg",
"T_Snow_Normal.png",
"T_Snow_Roughness.jpg"
],
"from_px": 4096,
"to_px": 2048,
"seconds": 3.1032527
},
{
"name": "Gravel_Coarse",
"layer": "Regolith",
"source": "Desert_Western_Ground_Gravel_Coarse_04-900b9858",
"physical_m": 2,
"written": [
"T_Gravel_Coarse_BaseColor.jpg",
"T_Gravel_Coarse_Normal.png",
"T_Gravel_Coarse_Roughness.jpg"
],
"from_px": 4096,
"to_px": 2048,
"seconds": 3.7498515
}
],
"when": "2026-09-20T20:10:19Z"
}
+71
View File
@@ -0,0 +1,71 @@
{
"_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."
}
}