# Minable ore patches Twenty ore patches for The Descent, two for each of ten ore types, built on 2026-10-13 after a reference picture from the user (four store assets: rocks with crystals and nuggets grown on them). Blender only: nothing here is imported into Unreal and no game code was written. Open `OrePatches.blend` (Blender 5.2). One column per ore type, the smaller A rock in front and the larger B rock behind it; the single pieces stand in rows further back. **How it got here.** Version 1 was sent back as not realistic (*"do it more realistic with good textures"*) and is kept in `versions\v01_stylised_glow\`. Version 2 took the rock surface from scans; it had the game's three ore types and is kept in `versions\v02_three_ores\`. The user then asked for the metals (*"not finished create iron, copper, silver, gold, lead, platinum, titanium"*): this is that set, the three from before plus the seven metals. The three were built again with the rest: same shapes, pieces and textures in kind, but their chips and the places of their clusters are not those of the `v02_three_ores` snapshot (see "Rebuilding"). ## What a patch is | Part | Object | What the game does with it | |---|---|---| | Host rock | `SM_OreRock__` | Static. Scanned rock; near the clusters its veins, crust or stain carry the ore. Stays when the patch is mined out. | | Ore clusters | `OrePatch___Ore_NN` (9 to 16 per patch) | **Each one is its own object**, seated in a socket of the rock. Mining takes one off and frees its `ore_units` loose chunks. | | Collision | `UCX_SM_OreRock_..._01` | One convex hull per rock (and per cluster and chunk mesh). | | Root | `OrePatch__` (empty) | Origin on the terrain surface, **+Z points out of the rock face**. The rock goes on below z = 0; that part is buried. | The clusters of a patch are instances of six cluster meshes per ore type (`SM_OreCluster__01..06`), turned and scaled. Three loose chunk meshes per ore type (`SM_OreChunk__01..03`, 0.34 m, the game's chunk size) are what flies into the suction. Under each cluster the rock has a shallow socket of freshly broken rock with a few ore specks, so a mined-out patch still shows where the ore was. The rock's glow is its own texture (`_E`); fade it to zero when the last cluster is gone. ## The ten ore types | Ore | In the game's design? | Rock | Pieces | |---|---|---|---| | **Ferrite** | yes (orange) | black veined rock, iron-stained crust round the clusters | lumps of orange-gold metal, sculpted, dark tarnish in the hollows | | **Cobalt** | yes (cyan) | black veined rock, thin blue mineral stain | six-sided prisms of dark blue volcanic glass, milky at the root | | **Pearl** | yes (magenta) | dark layered rock, grooved along its layers | grown clusters of small waxy spheres, muted magenta | | **Iron** | no | black rock under a red rust crust | kidney ore: rounded steel-grey masses with rust on them | | **Copper** | no | dark layered rock stained green | jagged lumps of native copper, green where it has weathered | | **Silver** | no | black veined rock with pale staining | lumpy native silver, bright, with black tarnish | | **Gold** | no | pale gangue over dark layered rock | water-worn nuggets, clean yellow | | **Lead** | no | black veined rock, grey stain | galena: intergrown lead-grey cubes, some faces gone dull | | **Platinum** | no | dark layered rock, hardly stained | many small smooth grey-white grains and pebbles | | **Titanium** | no | black veined rock, red-brown stain | rutile: sprays of red-black needles, grooved along their length | The first three are the game's own (DESIGN_UE 2.12) and carry the game's glow colours. The seven metals are not in the game's design or code yet: the game knows three ore types, their prices, depth bands and recipes. Their glow colours in `OrePatches.json` are a choice made here. Six rock shapes are used: slab, twin lobes, pyramid and mound (the four of the reference picture), and a layered shelf and ridge. Rocks of the same shape differ by their seed. ## The twenty patches | Patch | Rock shape | Footprint (m) | Height above / below ground (m) | Clusters | Ore units | Triangles: rock + ore = all | |---|---|---|---|---|---|---| | `OrePatch_Ferrite_A` | blocky slab | 1.9 x 1.7 | 1.11 / 0.31 | 11 | 15 | 4,800 + 7,176 = 11,976 | | `OrePatch_Ferrite_B` | twin lobes | 3.4 x 2.1 | 1.11 / 0.33 | 16 | 20 | 8,112 + 9,300 = 17,412 | | `OrePatch_Cobalt_A` | pyramid | 1.9 x 2.1 | 0.95 / 0.36 | 9 | 13 | 4,800 + 2,128 = 6,928 | | `OrePatch_Cobalt_B` | mound with side lumps | 3.3 x 2.7 | 1.52 / 0.37 | 16 | 20 | 8,112 + 3,832 = 11,944 | | `OrePatch_Pearl_A` | layered shelf | 2.5 x 2.0 | 0.63 / 0.29 | 11 | 15 | 4,800 + 9,468 = 14,268 | | `OrePatch_Pearl_B` | layered ridge | 3.6 x 2.0 | 1.13 / 0.32 | 16 | 20 | 8,112 + 13,788 = 21,900 | | `OrePatch_Iron_A` | blocky slab | 1.8 x 1.6 | 1.13 / 0.32 | 11 | 15 | 4,800 + 5,364 = 10,164 | | `OrePatch_Iron_B` | mound with side lumps | 3.0 x 2.7 | 1.49 / 0.36 | 16 | 20 | 8,112 + 6,864 = 14,976 | | `OrePatch_Copper_A` | layered shelf | 2.6 x 1.8 | 0.74 / 0.28 | 11 | 15 | 4,800 + 6,624 = 11,424 | | `OrePatch_Copper_B` | twin lobes | 3.3 x 2.0 | 1.14 / 0.33 | 16 | 20 | 8,112 + 9,000 = 17,112 | | `OrePatch_Silver_A` | pyramid | 2.3 x 2.0 | 1.02 / 0.39 | 9 | 13 | 4,800 + 4,680 = 9,480 | | `OrePatch_Silver_B` | twin lobes | 3.7 x 2.1 | 1.21 / 0.34 | 16 | 20 | 8,112 + 7,812 = 15,924 | | `OrePatch_Gold_A` | blocky slab | 1.8 x 1.5 | 1.20 / 0.32 | 11 | 15 | 4,800 + 5,328 = 10,128 | | `OrePatch_Gold_B` | layered ridge | 3.5 x 1.8 | 1.10 / 0.32 | 16 | 20 | 8,112 + 6,948 = 15,060 | | `OrePatch_Lead_A` | pyramid | 2.0 x 1.9 | 0.89 / 0.35 | 9 | 13 | 4,800 + 636 = 5,436 | | `OrePatch_Lead_B` | mound with side lumps | 3.2 x 2.7 | 1.52 / 0.36 | 16 | 20 | 8,112 + 1,056 = 9,168 | | `OrePatch_Platinum_A` | layered shelf | 2.4 x 2.0 | 0.80 / 0.28 | 11 | 15 | 4,800 + 8,748 = 13,548 | | `OrePatch_Platinum_B` | layered ridge | 3.3 x 2.1 | 1.19 / 0.34 | 16 | 20 | 8,112 + 12,204 = 20,316 | | `OrePatch_Titanium_A` | blocky slab | 2.3 x 1.5 | 0.88 / 0.30 | 11 | 15 | 4,800 + 2,000 = 6,800 | | `OrePatch_Titanium_B` | twin lobes | 3.4 x 2.2 | 1.08 / 0.33 | 16 | 20 | 8,112 + 2,800 = 10,912 | Triangles of the single pieces (least to most): | Ore | Clusters | Loose chunks | |---|---|---| | Ferrite | 432 to 840 | 300 to 300 | | Cobalt | 184 to 300 | 48 to 68 | | Pearl | 624 to 1728 | 792 to 1032 | | Iron | 300 to 708 | 408 to 408 | | Copper | 432 to 948 | 300 to 408 | | Silver | 324 to 840 | 300 to 408 | | Gold | 324 to 840 | 300 to 300 | | Lead | 48 to 120 | 24 to 36 | | Platinum | 648 to 1188 | 300 to 300 | | Titanium | 160 to 224 | 32 to 64 | All meshes: quads (crystal tips and base caps are triangles), no n-gons, no open edges, no zero-area faces, one UV map. No booleans were used. ## Files | Path | What | |---|---| | `OrePatches.blend` | Scene `Ore Patches`: collections `Patches`, `Library`, `Collision` (hidden), `Studio` (camera, lights, ground; not exported). | | `OrePatches.json` | The layout for the game: the ore types, and per patch the rock mesh, its textures and every cluster (mesh, position, normal, rotation, scale, units). Metres, Z up, right-handed; for Unreal multiply by 100 and flip Y. | | `fbx\SM_*.fbx` | 110 files: 20 rocks, 60 clusters, 30 chunks, each at the origin with its `UCX_` hull. Triangulated on export (the .blend keeps quads). | | `fbx\assembled\OrePatch_*.fbx` | 20 files: a whole patch with its clusters in place, for a quick look or for dressing a scene. | | `textures\T_OreRock___{BC,N,ORM}.png` | **4096 px**, one set per rock (`_E` is 2048 px). | | `textures\T_Ore__{BC,N,ORM,E}.png` | 2048 px, one atlas per ore type for its six clusters and three chunks. | | `source_textures\` | The three scanned rock sets the rocks are baked from (see below). Not needed by the game. | | `previews\` | A render of each patch, `OrePatches_sheet.png` (all twenty, four to a row), `OrePatch_mining_stages.png` (full, half mined, mined out), `OrePieces_.png` (the nine pieces of each type). | | `build\` | `build_ore_patches.py` (builds everything headless), `verify_fbx.py` (reads every FBX back), `check_fit.py` (seating and crossing check) and their reports. | | `versions\` | `v01_stylised_glow` (the first look), `v02_three_ores` (the scanned look with three ore types). | ## Where the textures come from The rock surfaces are scans from **Poly Haven** (polyhaven.com), licence **CC0**: free for commercial use, no credit required. Downloaded on 2026-10-13 with the user's permission, 9 files, 17.5 MB: | Set | Scanned area | Used for | Files | |---|---|---|---| | `dark_rock` (Amal Kumar) | 2.42 m | ferrite, cobalt, iron, silver, lead and titanium rocks | `_diff_2k.jpg`, `_rough_2k.jpg`, `_disp_2k.exr` | | `dark_rock_02` (Amal Kumar) | 2.0 m | pearl, copper, gold and platinum rocks | the same three | | `rock_05` (Rob Tuytel) | 1.5 m | the crust on ferrite and iron rocks, and (drained of colour) the pale gangue on gold rocks | the same three | Each scan is projected from three sides at its real size onto a 153,600-quad copy of the rock and baked into that rock's own UV set, so the game needs only the baked textures. Everything else is made here: the rock shapes, the ore pieces and their surfaces, and the masks that put crust, stain, dust and ore into the rock. The preview lighting uses Blender's own `studio.exr` (packed into the .blend). ## Textures in Unreal - `_BC` base colour (sRGB), `_E` emissive colour (sRGB), `_ORM` ambient occlusion / roughness / metallic in R / G / B (sRGB off), `_N` normal map in Unreal's convention (green down; leave "Flip Green Channel" off). - The emissive textures are tinted with the ore's glow colour and are deliberately sparse (ore in the rock's veins, specks in the sockets, the hollows of the pieces). The strength is the material's number: the .blend uses 1.0 on rocks and 0.6 on ore, which is a realistic look. Raise it if the ore should carry in the dark. - Import the FBX files with normals imported and tangents computed (MikkTSpace); they carry the triangulation the normal maps were baked on. ## Rebuilding ``` blender -b --factory-startup --python build\build_ore_patches.py blender -b --factory-startup --python build\verify_fbx.py blender -b OrePatches.blend --python build\check_fit.py ``` `-- --quick` builds a small test set into `build\_quick`, `-- --only Iron_A,Gold_B` builds some patches only. An ore type is one entry in `ORES` at the top of the script: the scan it sits on, its crust or stain, its family of pieces (`nugget`, `prism`, `cube`, `sphere`) and that family's numbers. A patch is one line in `PATCHES`: ore, rock shape, seed. **A rebuild does not give these exact files.** Blender's `noise_vector` takes its offsets from a generator seeded by the clock, which was found only after this set was built; every build until then came out with different chips on the rocks and different places for the clusters. The script now fixes the seed, so builds from here on repeat each other, but the first one will differ from the files in this folder in those two respects. Building the whole set takes about 20 minutes with the GPU to itself (50 when another Blender shares it). `build\reseat.py` was run once on this set: it seats a cluster deeper when the rock dips under one side of its foot (one cluster, by 6.6 mm). The build script has the same rule now. ## Limits - Not in the Unreal project. The game still draws its veins in the terrain material and builds its loose chunk in code; nothing reads `OrePatches.json` yet. - The seven metals are models only: the game has no such ore types, so using them is a design decision first (what they are worth, where they lie, what is made from them). - No LODs and no lightmap UVs. - The cobalt glass and the pearls are opaque in these textures. Light passing through them would need a translucent or subsurface material in Unreal; that is a material choice there, not a texture. - One convex hull per rock: a twin-lobed rock has an invisible bridge over the saddle between its lobes. - The game's terrain is not made from these scans, so a patch will only sit in the terrain as well as the two rock colours agree; the rock's colour can be shifted in the material. - The preview renders use the game meshes and the baked textures under studio light; under the Tender's lamp in dark water they will look darker.