# Hard-surface kit (33 parts) Built 2026-10-14 after the user's reference sheet (three rows of 11 beige cast mechanical parts, top/front view): *"build these objects in the reference picture each different object in same blender project using MCP"*. - `HardSurfaceKit.blend` — all 33 parts in one file, laid out as on the sheet (collection `KIT | 33 parts`, rows A/B/C). - `fbx/SM_Kit__.fbx` — one FBX per part (Z up, -Y forward, metres), with its UCX boxes and, for the six hydraulic cylinders, the rod as a child object. - `textures/T_Kit_Masks.png` — baked atlas over every part (UV0): R ambient occlusion, G edges, B crevices. - `renders/` — `kit_sheet_cycles.png` (framed like the reference), `kit_34_cycles.png` (three-quarter view), `*_preview.png` (Workbench shape checks). - `build/` — the scripts; rebuild with `blender.exe -b --factory-startup --python build/build_kit.py -- --stage all` (stages `geo`, `surf`, `render`, `export`; `--preview` renders in Workbench). `build/check_kit.py` checks the rods. ## Scale and orientation The sheet has no scale: **1 sheet pixel = 2 mm**, so the top two rows are about 0.28 m long, the bottom row 0.5 m. Scale each instance freely in the level. Each part's origin is the centre of its footprint on the floor (z = 0); X is right on the sheet, Y up the sheet, Z towards the viewer: the parts lie on their backs, mounting plates down. ## Parts | Key | Object | Key | Object | Key | Object | |---|---|---|---|---|---| | A01 | ChannelHousing | B01 | ClampAdapter | C01 | VentHousing | | A02 | TwinCanister | B02 | SlottedBottle | C02 | TroughHousing | | A03 | ValveCan | B03 | CylinderRail | C03 | DuctBend | | A04 | BlockHousing | B04 | WinchDrum | C04 | PanelEnclosure | | A05 | BracketCylinder | B05 | FlangedMotor | C05 | TwinNeckHousing | | A06 | MotorGrille | B06 | WindowTube | C06 | HydraulicCylinder_Flat | | A07 | LinearActuatorPlate | B07 | FinnedTube | C07 | HydraulicCylinder_Hose | | A08 | JunctionBox | B08 | Manifold | C08 | HydraulicCylinder_Plate | | A09 | FilterBowlPlate | B09 | TwinCanisterYoke | C09 | HydraulicCylinder_Slim | | A10 | SlimValve | B10 | CapsuleTank | C10 | HydraulicCylinder_Heavy | | A11 | CastCanister | B11 | KnurledCanister | C11 | HydraulicCylinder_Guided | ## Moving parts C06-C11: `SM_Kit_Cxx_Rod` is its own object, parented to the barrel, origin at the gland, rotation 0, scale 1. It slides along its `slide_axis` property (+Y = into the barrel) from 0 (as built, fully out) to `stroke_mm` (C06 78, C07 50, C08 110, C09 50, C10 84, C11 33 mm): there its highest outside part is 12 mm short of the gland. The bar runs on inside the barrel by stroke + 10 mm. `check_kit.py` moves each rod through the travel in 24 steps and tests everything but the bar against the barrel (result in `check_report.json`). ## Topology and surfaces - Quads; triangles only at the poles of turned parts, on the caps of the duct outline and where a loop cut meets a bevel. No booleans: recesses and raised panels are loop cuts with an extruded face region, edges are real bevels. Shading: smooth with sharp edges over 40 degrees. Separate pieces of a part overlap (kitbash style); hidden faces inside are not removed. - Small dark drillings are dark discs on the surface, not holes; bores you can see into (eyes, ports) are geometry. - Two materials. `M_Kit_Paint`: the sheet's beige over the Season 2 pack's ScratchedMetal set (read in place from `models/vessel-interior/textures/ModSci_Engineer`, already in the Unreal project) on UV_Tile (UV1, metres), the pack's smudge mask, shade in crevices and dark scuffs on exposed edges from the baked masks. `M_Kit_Dark`: sockets, drillings and bores. - UV0 `UVMap`: one atlas shared by all 39 meshes (the masks); UV1 `UV_Tile`: box-projected metres. - Collision: `UCX__NN` boxes round the main pieces (at most 10 per part, 4 per rod). ## Honest limits - The sheet is one picture from one angle: the depth of every part, and the backs, are my reading of the shading. - Fine detail of the reference (hex sockets, the grille's straight slats, the knurl pitch) is simplified: sockets are round, A06's grille is concentric ribs. - No baked normal map from a high-poly source: the bevels are in the mesh.