# Machine parts kit Built 2026-10-14 after a reference sheet from the user: 39 tan-painted mechanical parts seen from above, five rows (*"build these objects in the reference picture each different object in same blender project using MCP"*). Built through the Blender MCP in the user's Blender. Not imported into Unreal. `MachineParts_Kit.blend` holds every part, laid out as on the sheet (rows A to E, left to right). ## Scale and axes - The sheet has no scale. **1 sheet pixel = 3 mm**: the big holed plate (A01) is 0.83 m long, the radiator bar (C01) 1.23 m, the plug capsule (A06) 0.15 m. To change it, change `U` in `build/mpk_lib.py` and rebuild. - Metres, Z up. Each part's origin is at its centre on the floor (z = 0). X is right on the sheet, Y up the sheet. - The sheet is one top view, so the heights are my reading of its shading. ## Objects - `SM_MPK__`, one static mesh per part, in `MPK | Parts`. Keys A01 ... E07 follow the sheet. - Moving parts are separate children with the origin on their axis, rotation 0, scale 1 (`mpk_axis` property): | Part | Axis | Opens | |---|---|---| | `SM_MPK_A05_HatchPanel_Hatch` | X, along the hatch's top edge | -110 degrees (lifts) | | `SM_MPK_B01_PivotLid_Lid` | Y, along the lid's hinge | +110 degrees | | `SM_MPK_B05_FanPanel_FanRotor` | Z | spins | | `SM_MPK_E05_HingeMount_Leaf` | X | +120 degrees | Checked through their whole travel by `build/mpk_check.py` (no part passes through its base). - Collision: `UCX__NN` convex boxes (up to six per part, one per moving part), in `MPK | Collision (UCX)`. The collection is hidden in the viewport (its eye) as well as in renders: the viewport's Rendered mode draws everything the viewport shows, so visible hulls render there as white boxes over the parts, with dark grain where their faces lie on the parts' own faces. Show the collection to inspect the hulls; the FBX export unhides it itself. - `_preview` holds the cameras, floor and light for the pictures; it is not exported. ## Topology Quads everywhere except poked caps of round parts and the few n-gons the bevels leave, which are triangulated. No booleans: holes in plates (A01, B04) are rings of quads round each opening; recesses, panels and ports are raised or inset geometry. Static parts are kitbash shells that may overlap each other inside one mesh. Faces nobody can see (lying wholly inside another shell, or facing down on the floor) are removed (`Kit.cull_hidden`, 7.3k of 54k faces), so the shells are open only there; 0 non-manifold edges. Sharp edges are marked from 40 degrees. ## Surfaces - Three materials on every part: `MPK_Paint` (the sheet's tan paint), `MPK_Steel` (bolts, pins: the same paint, a little more worn), `MPK_Dark` (ports, gaps, hole walls, the fan well). - UV0 `UVMap`: all parts unwrapped into one shared 4096 atlas. UV1 `UV_Tile`: box projection in metres. - Baked from the model in Cycles into the atlas (`textures/`): `T_MPK_Masks.png` (R ambient occlusion, G edges, B cavity) and `T_MPK_BevelNormal.png` (tangent space, every hard edge rounded by 2.5 mm). The single maps `T_MPK_AO`, `T_MPK_Edge`, `T_MPK_Cavity` are kept too. - Tiling sets from the user's Season 2 pack, read in place from `models/vessel-interior/textures/ModSciInteriors/Textures/Base`: ScratchedMetal (paint and steel), StainedSteel (dark), Glass_DirtRough (smudges). They are already in the Unreal project. - The wear (lighter paint on exposed edges, a few small brown chips) is a Blender shader on the edge mask and a noise; in Unreal a material has to be made from the same maps. ## Files - `fbx/SM_MPK_*.fbx`: one per part, the part at the origin with its moving parts and hulls. - `MachineParts_Kit_layout.json`: sizes, faces, moving parts with pivot and axis, hull counts. - `renders/`: Cycles pictures (`_wip_*` are working views). - `build/`: `mpk_lib.py` (primitives), `mpk_items.py` (one builder per part), `mpk_build.py` (`build(keys)`), `mpk_surface.py` (UVs, bakes, materials), `mpk_check.py` (moving-part travel), `mpk_export.py` (UCX, FBX, JSON), `mpk_preview.py`. Rebuilding geometry needs the UVs and bakes redone (`uv_atlas_start`, `bake_all_start`, `combine_masks`).