# Vessel interior (M-Ship v2): Modular SciFi Season 2 with Season 1 mixed in A second, from-scratch interior for the carrier, built 2026-10-12 in a fork of the ship file: **`models/M_Ship_v2_interior_season2.blend`** (Blender 5.2). The first layout stays in `models/M_Ship_v2_dock_room.blend`; this work does not touch it. Previews are in `previews/`, the labelled plans first: `Vessel_01_plan_main_deck_labelled.png`, `Vessel_02_plan_command_deck_labelled.png`, `Vessel_35_quarters_plan_labelled.png` (the command deck's two quarters and the corridor between them). ## What it is Ship frame: +X bow, +Y port, Z up, metres. Two decks plus the dock room. ``` MAIN DECK (threshold z -3.36 = the dock room's deck; the port service hatch is at x -26.8..-11.7) (Since 2026-10-13 the reactor gallery is a room 14 m wide, and everything forward of the sub bay stands 1.40 m higher: the passage has five bays, then the sensor room over the middle and port side and the lift room to starboard, to x 41.8.) aft bow ENGINE REACTOR WORKS HALL SUB BAY (moon pool) FORE PASSAGE SENSOR CONTROL -- GALLERY -- cargo, ore processing, -- well, Tender carousel, Galley | Quarters A ROOM (cube) (red pipe fabrication; boarding stair up to the -- ------passage------ -- (cube) gallery) gate in its port wall gallery Habitation | Quarters B x -46.6 -42.3..-30.8 -30.8..-10.0 -10.0..15.5 15.5..37.8 ..42.1 COMMAND DECK (threshold z 3.14; one level from the gallery to the bridge since 2026-10-13) CREW QUARTERS (port) gallery in the sub bay -- CONTROL ROOM -- BRIDGE CORRIDOR (two side doors) CAPTAIN'S QUARTERS (starboard) x 12.3..15.2 15.5..30.6 31..57, command floor centred at x 40.6 ``` ## Which bundle is where The user asked for two things on 2026-10-12 while this was being built: straight linings where the hull's shape is hard to build around (*"you can build rectangle hull lining or heptagon, or hexagon"*), and then Season 1 in the mix (*"use this assets too try to mix up and give me good looking composition ... especially moon pool room suits better with this"*). The composition that came out of both: | Space | Bundle | What | |---|---|---| | Engine control, reactor room, works hall | Season 2 | dark, piped, industrial: the pack's hall (three bays), the red car widened into a room 14 m across with two reactor vessels (see below), a cube | | **Sub bay (moon pool room)** | **Season 1** walls and lettering; Season 2 doors and rails; the ship's own deck, well and vault | see below | | Fore passage, galley, habitation, quarters, sensor room, lift room (**1.40 m above the main deck** since 2026-10-13, see below) | Season 2 structure, **Season 1 furniture** | glass-floored passage; four rooms five steps lower, each with a row of desks, cabinets, shelves and stools along its outer wall | | Control room corridor (the former CIC) | Season 2 | a clean corridor between the gallery and the bridge: its white floor level with the door sills, no stairs; two side doors facing each other, the pack's X-braced panel over dark quilted padding instead of the gold foil panels, no tables, rails or floor cables | | **Crew quarters** (port), beside that corridor | a lining made for this hull; **Season 1** Props floor, furniture and fittings | 14.4 x 4.9 m under a folded vault that follows the hull; six berths with lockers, a storage wall, a mess bench (see below) | | **Captain's quarters** (starboard), beside that corridor | the cabin of `models/captains-quarters` (another session's model, not from the packs) as the middle bay, and two bays made round it with that model's own library | a dark room over the whole 14.35 m, 2.6 m high at the bunk wall rising to 4.0 m at the corridor's wall: lounge by the window forward, bunk alcove, work station and bench in the middle, mess and lockers aft; entered by the corridor's own side door, one step below it (see below) | | **Bridge** | **Season 1** command floor; the ship's own shell | the middle of the pack's command centre: round floor 13.1 m across, walkway from the door, terminal with its display facing the bow, curved rail | - **Sub bay.** The room's shell is the ship's curved lining, which no modular wall fits. Its lower 4.5 m now has a rectangular lining of whole Season 1 bays inside the shell, under the Tender swing: the Hallways pack's hall wall along both sides (five 4.4 m bays: a locker band, two grey panels, black pilasters with bronze fins; the middle panel is centred on the carousel hub, so the launch arm points at it), and the Interiors pack's white wall on the two ends (a wall bay each side of the door, the middle bay left open for the Season 2 doorway that stands in the bulkhead behind it). Plain dark piers fill the corners where a whole bay does not fit; a cap ledge at z 1.14 runs back to the shell so nothing is open behind the walls. Above the cap the ship's vault is unchanged: the Tenders swing there, 0.98 m above it. Room between the two long walls: 16.7 m between pilasters. Floor lettering uses the Season 1 decals by the same rules as on Anchorage: CARGO before the door to the works hall, DOCK inside the door from the fore passage, CONTROL before the stair to the command deck, STAND CLEAR and an orange hazard band at the well's boarding gap. - **Control room corridor.** Changed on the user's marked-up screenshot of 2026-10-12 (*"add 2 doors like in the picture with red line, use the wall with red tick and replace with those golden nylons, remove those crowded tables and fences clean the corridor"*): a door in each side wall in the third bay from aft (x 23.1..26.7), each five steps above the sunken floor like the two end doors, with the pack's own stair turned to it; the three remaining gold foil panels replaced by the ticked wall (`SM_Wall_HB_A3`); the Season 1 tables, all sixteen rail sections, the floor sockets and the cable across the floor taken out. The two silver padded panels (starboard first bay, port second bay) were not named and are left; `CORRIDOR_SWAP = "all"` in `build_interior.py` swaps them too. The unit is `build/cic.py`. Since 2026-10-13 its floor is level with the sills and it has no stairs (section below). - **Works hall** stands directly aft of the sub bay, so ore, boxes and parts stay on one level between the two. Its port middle bay is the pack's "gate" wall and sits at the hull's port service hatch: that is the boarding gate (Anchorage's bridge meets the ship there). - **Bridge.** An open deck under the canopy, with the ship's own shell as walls and roof (in bright light a white vault with the two blue canopy lobes), an aft bulkhead round the corridor's door, and the command floor. The bulkhead closes the whole section there, the hull and the roof pod above it, and keeps 2 cm inside their skin. - The game places its own fixtures. Where they belong is marked with empties `MARKER | ...` (packer, refinery, fabricator, storage wall, Tethys terminal, nutrient vat and ports, four beds, sonar table, chart table, helm, carousel console, pool ladder, ore pipe riser, launch slot, sensor module, reactor, engine control, the gates). `build_interior.py` keeps the earlier variants behind switches at its top: `BAY_LINING = "season2"` (six Engineer panels a side instead of the Season 1 walls), `BRIDGE_SET = "season2"` (the hall pad as a helm dais), `FURNISH = False`, `CORRIDOR_SWAP`. ## The file is now edited in place Since the evening of 2026-10-12 the .blend is no longer only what the build script makes: - the user works in it by hand. Seen on 2026-10-12: the bridge's command floor raised about 1.16 m, moved forward and scaled to 0.948, and a pasted stair in front of it (its datablocks carry `.001` names and absolute image paths). That is the user's work in progress; nothing of it is in the build script; - the control room corridor was changed in the open file, not by a rebuild, so that this hand work stayed; - the roof pod was trimmed and the bridge's aft bulkhead refitted in the open file the same evening, the bridge's ceiling slot closed and the hull's seam lines taken out of the bridge after midnight (next two sections). So: **change this file in place; do not rebuild over it.** The layout's root empty `M_SHIP_INTERIOR_S2` carries `["hand_edited"]`, and `build_interior.py` stops when it sees that (it only goes on with `-- --overwrite-hand-edits`). The script still describes everything except the hand work: run on the backup from before the corridor change it gives the same counts as the file. Pieces can be added in place with the same units: in Blender's Python, put `build/` on `sys.path`, make `bl_kit.Kit()` (it adopts the meshes and materials already in the file), and `units.place(...)` a unit, as `cic.py` was placed. The bridge previews (`Vessel_18..20`, and the new `Vessel_25`, `Vessel_26`) were rendered at 00:16 on 2026-10-13 and show the bridge as it stood in the file then, the user's hand work in progress included (raised command floor, the pasted stair). They are lit by the command deck's own lamps only (`"lights"` in `build/preview_views.json`): with all 206 shadowed lamps of the layout on, EEVEE runs out of shadow tiles and lamps of other decks leak into the picture, differently on every run. ## The roof pod and the bridge's aft bulkhead (fixed 2026-10-12) Two things the user pointed at with screenshots, both mine to answer for. **`M_SHIP_Dorsal_Roof`** (*"clipping correct those no clipping inside ship fix those end lines fix those deformations"*). The pod is a lofted shell that sits on the hull, and its lower part ran on below the hull's skin: 0.6 to 0.7 m along both sides, 1.70 m at its aft end, 2 cm at the front. This layout had hidden that part with a Mask modifier, which takes whole faces: hence a stepped edge and spikes. Now the pod is cut for real, along the surface 5 mm under the hull's skin (`build/roof_trim.py`): one clean edge loop of 358 vertices all round (three loops before), nothing deeper than 6.4 mm under the skin (856 vertices were, up to 1.70 m), the visible surface and both UV sets unchanged, 8,439 faces (9,116 before), 70 triangles (71), no n-gons. The six edge vertices at the canopy corner are shared with the glazing and stay as they were. The mask and its vertex group are gone. `Vessel_23` shows the aft end with the hull hidden, `Fix_roof_pod_before_after.png` both states. The cut was made twice. The first one measured the hull through `BVHTree.FromPolygons`, which splits each quad along its own choice of diagonal; on this hull's warped quads that surface lies up to 11 mm from the one Blender draws, and the pod's edge stood up to 2.9 mm above the drawn skin in 20 of 3,222 places. The second cut (the one in the file) measures against the hull's loop triangles (`shipfit.drawn_tree`): no part of the edge is above the drawn skin except the shared glazing corner (0.1 mm). **`Bulkhead | bridge aft`** (*"is clipping outside needs fixing"*). It had been fitted on lines 1.2 m apart with straight edges between them, and the edge between z 6.0 and 7.04 cut across the hollow corner where the pod meets the hull: up to 20 cm outside. It is rebuilt with `shipfit.section_wall_mesh`: hull and pod count as one outer skin (`shipfit.Envelope`), the wall's edge stays 2 cm inside it measured at both faces and the middle, row lines are put where the shape needs them, and the top row reaches up to the roof. 26 rows, 616 faces (256 before), 24 triangles, closed, no n-gons; same object, material and door opening. `Vessel_24` and `Fix_bridge_bulkhead_before_after.png` show the corner from outside. Both were applied in the user's open file. To undo: the meshes from before are kept in the file with a fake user, `Dorsal roof | regular rounded loft.006` and `Bulkhead | bridge aft (before the fit fix)`; assign one back to its object. The whole file from before is `models/_backups/M_Ship_v2_interior_season2_pre-dorsal-roof-fix_2026-10-12.blend`. ## The bridge's ceiling slot and the seam lines (fixed 2026-10-13) The user, after both had been named as seen but not touched: *"fix the bridge ceiling slot and seam lines too"*. The tools are in `build/bridge_shell.py`. **The slot.** Under the pod the hull's crest is hidden by the Mask `LAYOUT mask pod opening`, because the corridor's cars stand taller than the crest. A mask takes whole faces and the hull's faces are about a metre long there, so the hidden strip ran on to x 32.18, 1.17 m past the bulkhead's bridge face (x 31.01): a slot in the bridge's ceiling, 8.2 m wide, looking up into the pod. `end_hull_opening_at(hull, 30.86)` gives the hull an edge across that strip inside the bulkhead's thickness (seven new vertices, six faces split across, the outermost face on each side split to its aft outer corner so that no vertex lands on the visible skin beside the strip) and takes everything forward of it out of the mask's group. 128 faces are hidden now (136 before), the strip ends at x 30.86, and the crest is whole from the bulkhead forward. The hull has 20,659 faces (20,651), two more triangles, no n-gons; both UV sets, the three materials and the custom normals are kept (the drawn normals of the 20,643 untouched faces differ by at most 0.05 degrees). Nothing is deleted. To undo: assign `Hull | structured crest and forebody.008 (before the ceiling slot fix)` back to `M_SHIP_Hull`. **The seam lines.** The hull's trims are bevelled curves, eight-sided tubes that lie half in the skin. Nine of them showed inside the bridge: `Hull | transverse assembly seam.003` (at x 32.2, 18 mm inside), the two `Cowl | belt panel seam` (28 to 29 mm), the four `Hull | longitudinal deck seam` where they end at x 31.4 (8 to 9 mm) and `Hull | recessed grab slot.001` and `.003` at deck level by the bulkhead (36 mm). Each carries a Shrinkwrap modifier now, "Seat on the skin (nothing of it inside the hull)": nearest surface point, snap mode Outside, 2 mm. Only the vertices under the skin move, onto the skin plus 2 mm; the curve stays a curve. Straight pieces longer than 17 cm near the bridge got extra points first (same path), so that nothing sags under the skin between two points. In the bridge no sample along these tubes is under the skin any more. From outside the tubes' lower edge moves by a pixel at most in close views. To undo: remove the modifier. Left alone: `Cockpit | continuous fitted black seal`, the windows' gasket (7.3 cm radius, half of it inside: a gasket shows on the inside of a window too), and `Roof | pod base seam`, which is not inside the hull. `Vessel_25` and `Vessel_26` show the aft wall with the ceiling and the port wall; `Fix_bridge_ceiling_slot_before_after.png` and `Fix_bridge_seam_lines_before_after.png` both states. The file from before is `models/_backups/M_Ship_v2_interior_season2_pre-ceiling-slot-and-seams_2026-10-12.blend`. ## The carousel and the well **Since 2026-10-13 the Tender on the launch arm hangs on the centre line of the deck well** (1.2 m from its edge at the nearest): the launch arm's hoist carries it 2.34 m in toward the hub as it is let down. The well was not changed. How, and what it looked like before: The docking arm (`models/docking-arm`) was built to the Unreal design: hub on the centre line, arms 6 m long, launch slot 6 m to starboard, mount 7.5 m above the deck. - Hub on the centre line (as built here, hub at x 3.05, y 0, z 4.14): the carousel turns a full circle with three stowed Tenders. Least clearance, measured with the real Kazah mesh in 2 degree steps: 0.37 m to the hull lining, 1.1 m to the roof, 1.1 m to the gallery, 1.5 m to the stair. The arm itself passes closer: its heads at 0.27 m and the ore hoses that lie on top of the booms (added to the arm on 2026-10-13) at 6 cm from the lining, where an arm points abeam and the roof's vault comes down. - Let straight down, as the arm was modelled, the Tender on the launch arm hangs at y -7.63..-4.37, and the deck's well ends at y -6.81: 0.88 m of the Tender was over the deck, measured against the well's real outline, so it could not go down through the well. A hub over the well's middle (2.34 m to port) is impossible: the two other Tenders would swing through the hull. Turning the launch arm to another angle does not help either. - I first reported that as a decision about the ship (widen the deck opening) and left it. That was the wrong end: the user wanted the Tender to fit the moon pool as it is, and the arm can do that (below). - Below the deck the hull's own aperture (titanium rim and the two pocket doors) spans y -9.1..-2.4 in plan, x -2.8..8.9: further outboard than the deck well (y -6.81..-0.51 at its middle). The two overlap between y -6.81 and -2.4; the Tender now hangs at y -5.30..-2.03, in the middle of the deck well. The mount flange of the arm has to be 7.5 m above the deck (its hoist travel fixes that), which is 1.76 m below this room's roof: a pylon carries it (`Carousel pylon`, the only new part of the mechanism). ### The carousel is the rigged model (since 2026-10-13) The user: *"have you updated to the rigged version?"*, then: swap it in. `build/carousel_rigged.py` put `DockArm_Carousel_Rigged.blend` in the place of the unrigged assembly: the armature `DockArm_Rig` with its 26 skinned parts hangs under the empty `DockArm_Root`, which stays at the hub and also carries the pylon and the three preview Tenders. Each part lies within 0.005 mm of the unrigged part it replaces; arm 1 is let down to BOARD. To pose it: select `DockArm_Rig`, Pose Mode. The square outboard of each head (`CTRL_ArmN_Hoist`) moves down 0..5.3 m and unfolds the arm, the ring beside it (`CTRL_ArmN_Claws`) opens the claws, the bone `Turret` turns the carousel. The handles' shapes are in `10.7 | Tender carousel | rig handle shapes (not exported)`, excluded from the view layer. Materials and textures are the ones this file already had. ### The launch arm reaches in (2026-10-13) The user: *"since we have rigged version you can set it so it will fit put the tender1 more center to the moon pool using the rigs and allign arm to more inwards so tender can move to the center"*. A hoist is a shoulder and an elbow (two 3 m links) and a wrist. As modelled they move as a zigzag (shoulder phi, elbow 2 phi, wrist phi, phi = asin(lowered / 6)), which keeps the head exactly under the boom tip. In this file the rig's mechanism is wider (`carousel_rigged.add_reach`): every hoist handle `CTRL_ArmN_Hoist` has a custom property **`reach_in`** (metres; 0 = the zigzag, and then every part is within 0.004 mm of the model). Let down by y, the head also moves in by x and stays level: ``` x = reach_in * (y / 5.3)^2 D = sqrt(x^2 + y^2) shoulder = atan2(y, x) - acos(D / 6) elbow = pi - 2 acos(D / 6) wrist = elbow - shoulder ``` The inward move grows with the square of the lowering, because near the top the upper link would otherwise have to rise above the boom. The joints keep their range limits; the hose's fan bones copy the joints and follow. The drivers are still simple expressions (no script auto-run). - **Arm 1 has `reach_in` 2.34**, which puts the Tender's origin on the well's centre line (y -3.66; the well's middle is at x 3.05, y -3.66). At BOARD: shoulder 51.1, elbow 149.9, wrist 98.8 degrees. The model's rig stops the wrists at 92 degrees (the zigzag never passes 62); in this file their range is +-100 (`carousel_rigged.set_wrist_range`). First it was 2.0 to stay inside 92 degrees; the user: *"Its still not centered?"*. - The three preview Tenders are children of the head bones (`ArmN_Head`), so they go where the arms carry them, also when the `Turret` bone turns. - Tender 1: origin at (3.015, -3.66, -2.16), was (3.05, -6.0, -2.16). In plan its outline is 1.20 m inside the well's edge at the nearest (1.05 m from the coaming); before it was 0.88 m outside. No part of the arm crosses the Tender. 3.0 m to the starboard wall (0.6 before). The stowed carousel's sweep is unchanged. - The marker `Launch slot (Tender at BOARD)` moved with it. - To try another value: Pose Mode, select the square handle of arm 1, change `reach_in` in its custom properties (N panel, Item, or Bone properties). `Vessel_27` (plan) and `Vessel_28` show the result, `Fix_launch_tender_in_the_well_before_after.png` both states. - **In `models/docking-arm` too, since the evening of 2026-10-13**: the rig's source there (`build\rig_dockarm.py`) now builds the same `reach_in` property, the second wrist constraint and the 100 degree wrist range, with the same names and driver expressions, and its README and `dockarm_rig.json` describe them. For Unreal the launch arm's three pitches follow the formulas above. ### The pylon's length: asked, then put back The user, with a marked-up picture: *"shorten this "Carousel pylon (bay roof to mount flange)" and adjust the whole docking arm according to that"*. The pylon is long because the roof is a vault and the arm is flat: the roof is at z 7.05 over the hub but at 5.80 six metres from it, where the arms' ends turn. Measured (`build/carousel_height.py`; `check_interior.py` with the environment variable `CAROUSEL_RAISE`): | Way | Pylon | What it takes | |---|---|---| | the whole arm up | 0.1 m shorter at most | the hoses touch the lining at +0.1 m, the heads at +0.3 m | | mount and turret up, every hoist let down by the same (heads and Tenders stay) | 0.3 m shorter (1.83 to 1.53 m) | boom tips 12 cm from the lining; the hoses must move off the boom tops; the rig's hoist limit of 5.3 m must be raised | | the three booms slope down from the hub | 0.9 m shorter with 10 degrees, 1.2 m with 14 | the arm's shape changes, so `models/docking-arm` (model, rig, FBX) has to follow | Put to the user, the answer was to put the pylon back. It is at its original length. The user's reason for a shorter pylon was the Tender's fit in the moon pool (*"Main reason that I wanted to shorten the pylon is so tender would fit without extend or modify the moon pool"*), which the reaching launch arm now gives. **Ore hose (added in place on 2026-10-13 by the docking-arm work).** Each arm now carries the cargo hose of `models/docking-arm` (its README has the details): six more objects in `10.7 | Tender carousel | docking arm` (`ArmN_HoseRig`, `ArmN_OreHose`) and four of the arm's meshes swapped for the versions with the hose brackets (`build\scene_add_hose.py` there does it and can undo the hose). Nothing else in this file was touched. The hose touches nothing in the ship; when an arm points abeam its loop at the arm tip passes about 10 cm from the hull lining, because the hull closes in to 6.49 m from the hub at that height. From before the change: `models\_backups\M_Ship_v2_interior_season2_pre-ore-hose_2026-10-12.blend` (the file on disk) and `..._pre-ore-hose_2026-10-12_session-state.blend` (the open session with its unsaved edits). (That was the unrigged carousel. Since the swap to the rigged one the hoses are three of its 26 skinned meshes, and `scene_add_hose.py` is gone from `models/docking-arm`.) **The carousel's surfaces (changed in place on 2026-10-13, 21:41, by the docking-arm work).** The user: *"pull the latest from the main vessel session and do it more realistic with good textures"*. The docking arm now has texture sets instead of flat colours (the Engineer pack's ScratchedMetal and StainedSteel sets and `T_Glass_DirtRough`, plus two maps baked from the arm: `models/docking-arm/README.md`, "Surfaces"), a clear spiral-ribbed hose, and fewer, dimmer lights. In this file: - the mesh datablocks of the 26 `SK_DockArm_*` objects were replaced by the new ones of the same names (two UV layers: `UVMap` for the arm's baked atlas, `UV_Tile` in metres), and the `M_DockArm_*` materials by the textured ones under the same names; two are new (`M_DockArm_LensGlass`, `M_DockArm_HoseBand`). `DockArm_Rig`, its pose, drivers and constraints (the reach), `DockArm_Root`, the Tenders and every object's modifiers were not touched. Checked in the file: the hoses are where they were vertex for vertex, the parts by their bounds; no texture is missing. - **The pylon** borrows `M_DockArm_Paint`, `_Graphite` and `_Steel`, so it took the new materials with it. Those read two UV layers by name, so the pylon's mesh got them **added beside its own**: `UV_Tile` (metres, walls unrolled) and `UVMap` (a blank corner of the arm's atlas: no baked edges there). Nothing else of the pylon changed. **A rebuild of the pylon loses them** (`build_interior.py` makes it with `shipfit.turned`, which writes one normalised layer): the paint then shows without its scratches. After a rebuild run `exec(open(r"...\models\docking-arm\build\scene_update_surfaces.py").read()); pylon_uvs(bpy.data.objects["Carousel pylon (bay roof to mount flange)"])`. - `carousel_rigged.swap_in_rigged` keeps the materials a file already has, so a swap-in from the rebuilt `DockArm_Carousel_Rigged.blend` into a file that still has the OLD flat `M_DockArm_*` materials would put the new meshes under the old materials. `models/docking-arm/build/scene_update_surfaces.py` (`update_surfaces()`) replaces both in place. - Tried on a copy beside this file first (update, save, reopen, pictures in this bay's own light: `models/docking-arm/previews/DockArm_in_ship_bay.png`, `DockArm_in_ship_hub_from_below.png`). From before the change: `models\_backups\M_Ship_v2_interior_season2_pre-dockarm-surfaces_2026-10-13.blend` (the file as saved at 21:16; the open session had no unsaved changes). **The boom joint (2026-10-16, 15:50, by the docking-arm work; the user: *"there need be another joint ... to be able to put down subtub tenders into moon pool ... after user gets in arms bent from the new joint ... and puts tender inside moon pool. so this needs re-rigging too"*).** Each boom of the carousel now hangs on a pitch joint 1.5 m from the hub, and the hoist handle goes on below BOARD: `CTRL_ArmN_Hoist` 0..9.3 m, 5.3 = BOARD (unchanged: the launch Tender is exactly where it was), 9.3 = POOL, where the Tender's top is 1.3 m below the deck and its keel 3.2 m above the hull's aperture. The launch arm's descent was run against this file's meshes in 10 steps: nothing crosses, the nearest things are the ore hose 0.45 m from the hull lining at BOARD and the Tender 1.2 m from the deck round the well on the way down. Details: `models/docking-arm/README.md`, "The boom joint and the pool". In this file: - `DockArm_Rig` and its skinned objects were replaced in place by the new ones (`models/docking-arm/build/scene_update_rig.py`, `update_rig()` + `check_descent()`): 29 objects now (the three booms are parts of their own), 140 bones; the handles' heights, `reach_in` (2.34 on arm 1), `auto`, the claws and the turret's yaw carried over; the three Tenders rehung on the new head bones at their places (moved 8 µm); the materials and images that came along a second time dropped for the file's own; the two baked atlas images reloaded (the atlas is laid out anew). The pylon was not touched. - **Done on the file itself, headless**: at 15:05 the user's Blender windows were gone and the only Blender open held a new, unsaved file, so there was no open session to change. The file on disk was the one saved at 02:25. A copy of the open session as it stood at 14:48 (with whatever was unsaved in it then) is `models\_backups\M_Ship_v2_interior_season2_pre-boom-joint_2026-10-16_session-state.blend`; the file from before the change is `..._pre-boom-joint_2026-10-16.blend`. - The vessel session's `carousel_rigged.add_reach()` must not be run on this rig: it would rewrite the shoulder and elbow drivers without the pool stage (`set_reach` and `hang_tenders` are fine). ## The corridor's level floor and the two quarters (2026-10-13) The user, with two marked-up pictures (red rectangles over the two dark areas beside the corridor on the command deck plan; crosses on the corridor's stairs, a line along the sill level and arrows on its floor pointing up): *"I want rooms here create me rooms for Crew quarters and captains quarters, also corridor needs to be level, delete stairs and level the floor"*. Both were done in the open file; the file from before is `models/_backups/M_Ship_v2_interior_season2_pre-quarters-and-level-corridor_2026-10-13.blend`. ### The corridor's floor (`build/corridor_level.py`) The corridor is the Engineer pack's sunken car: its floor lay 0.9 m under the door sills, with a five-step stair at each of its four doors. Now the four stairs and the four risers under the sills are gone, and the same floor (white tiles, the two grated gutters with their pipes, the black strips along the walls: 28 pieces) lies 0.9 m higher, wall to wall at sill level, z 3.14. The two side doors have the pack's sill plate like the end doors, so the floor runs through all four doorways. The command deck is one level from the gallery to the bridge's door. Taken out with the old floor, because it stood on the wall's foot and would now be under the floor or cut by it: 16 junction boxes, 8 short pipes that came up out of the floor, a run of small pipes, 3 plugs, 2 sockets, and the 9 labels that belonged to them (all in the backup). The tall pipe with the red valve stays; it passes through the floor and its valve is 6 cm above it. The two arrows painted on the floor and the marker `Sonar table` came up with the floor. Headroom is 3.9 m. The pack's own level cars carry a glass floor between two open trenches along the walls. That was not used: the user's arrows are on the white floor. ### The rooms (`build/quarters.py`) Beside the corridor the deck is 6.3 m wide each side, and the hull curves in over it: it meets the roof pod's foot 3.3 m above the deck, 5.1 to 5.5 m from the centre line. (This README used to say that only a wedge is left there. That was measured for the full height of the 3.9 m door frame and is wrong for a room.) The packs' walls are 3.9 to 4.8 m tall, so none can stand on the outer side. By the user's rule of 2026-10-12 (*"you can build rectangle hull lining or heptagon, or hexagon"*) each room is a straight lining with a folded section that follows the hull: ``` section, port side (the starboard room is its mirror); metres from the centre line, height above the floor 3.0 4.24 3.46 +----------+ ceiling strip, 1.24 m wide, 3.46 m up (z 6.60) | `-._ 2.91 | `+ 5.56 | corridor `-. 1.96 | wall `+ 6.94 | (door in `. 0.90 | fields 7-9) + 7.90 knee wall, 0.9 m 0 +-----------------------+ 3.0 floor 4.9 m 7.90 ``` One section for the whole length (x 15.86 to 30.26, the corridor car's own four bays: 14.4 m), every fold as far out as the hull allows at its narrowest station with 10 cm to spare. Frames stand 1.2 m apart (twelve fields); in fields 7 to 9 the corridor's side door fills the lining with its own frame. The ceiling is at z 6.60, just over the lamp above the door. - **Made here** (meshes `Quarters | ...`, drawn for the port side; the starboard pieces are the same meshes turned half a turn about Z, so nothing is mirrored by a negative scale): the lining field (116 faces, placed 18 times) and the door field (73 faces, 6 times), the end wall (three variants, four placed), the berth with its locker (74 faces, 6 times) and its bedding, the captain's bed and its bedding, and a plain deck under each room. 44 objects of 11 meshes, 4,659 faces, all quads, UVs on all. Like the packs' own wall pieces they are open at the back. - **Materials**: the panels and the berths are a satin white paint made here (`QUARTERS | lining, satin white`); the backing in the shadow gaps is the Props pack's plain dark material, the frames the ship's own brushed titanium, the padding of the captain's bed wall and headboard the Engineer pack's quilted padding (the same as in the corridor's X-braced walls). Four cloth materials are made here (mattress, pillow, two blankets). The Props pack's plain light material was tried for the panels first: in this file it is a polished metal and every lamp showed in it. - **From the packs**: the Props floor (4 whole and 8 half panels a room), ceiling light fittings (6 a room, each hung on a frame, each with a 130 W area lamp), vents, smoke detectors, sprinklers, and all the furniture. - **Crew quarters, port**: six berths along the outer wall under the slope, each 2.4 m: a tall locker at the head (its side is the partition to the next berth), a bed box with two drawers, a leeboard, a shelf along the knee wall, a reading light. On the corridor's wall aft of the door a stores shelf and two cabinets with six wall cabinets over them; fore of the door a mess bench with three stools; a crate by the aft wall. - **Captain's quarters, starboard, first version** (replaced the same afternoon, next section): the same lining with the bed against a padded aft end wall, a dresser, a shelf as a screen, two desks as a briefing table, a sideboard and the desk at the fore end. `CAPTAIN = "lined"` in `quarters.py` builds it again. - Which room goes on which side was not said. Captain to starboard is my choice. - New markers: `Crew quarters bunk 1` to `6`, `Crew quarters mess bench`, `Captain's bed`, `Captain's desk`. - `quarters.remove()` takes both rooms out again (objects, lamps, markers, collections, the meshes made here). `Vessel_29` to `Vessel_31` show the crew quarters, `Vessel_32` to `34` and `36` to `45` the captain's quarters (`33` the bunk from the reference picture's viewpoint, `37` the lounge, `38` the mess, `41` and `42` the entrance from inside and from the corridor with the door's leaf hidden, `43` and `44` the surfaces close up, `45` the door wall), `Vessel_35` the plan of both (cut 1.16 m above the corridor's floor), `Vessel_17`, `21` and `22` the corridor. ### The captain's cabin from `models/captains-quarters` (`build/captains_cabin.py`) While the rooms above were being built, the user had a second session model a captain's cabin from a reference picture (a black cabin with a bunk alcove, a padded back wall and a light strip): `models/captains-quarters/`, with its own README. Then, here: *"Port Captains quarters design from my other session into the room make it fit. delete anything inside, you can lower down floor "Deck | captain's quarters" to make it fit"*. The file from before is `models/_backups/M_Ship_v2_interior_season2_pre-captains-cabin-port_2026-10-13.blend`. This section is the state after that port (14:13). The same afternoon the cabin became the middle bay of a room over the whole length, and its own door, door wall, threshold step and the places of its end walls were changed: next section. - **Taken out**: everything that stood in the captain's quarters (73 objects: lining, floor panels, bed, furniture, ceiling fittings; 9 lamps; the two markers), and what the corridor's starboard side door carried on its room face (11 fittings: boxes, braces, the light over the door; 2 labels; 1 lamp), because the cabin's door wall stands there now. The deck under the room stays. - **Set in**: the model's 18 parts (walls, bunk interior, floor, ceiling, decals, desk props, mattress, blanket, pillow; and the moving ones: sliding door leaf, three locker doors, chair base and seat), as they are. The objects `Captain's cabin | SM_CQ_...` use the very meshes of the scene `Captains Quarters`, which the other session had appended to this file; nothing of the design is cut, scaled or moved against the rest. The box hulls (`UCX_...`) stay with the model's FBX files. - **Where**: turned half a turn about Z, so its door wall faces the corridor and its bunk wall the hull; origin at (23.06, -5.303, 2.94). That puts its door on the axis of the corridor's side door (x 24.86), its sliding leaf 5 mm clear of that door's frame, its two end walls on the corridor's bay lines (x 19.46 and 26.66; the window's light well reaches 27.12), the lockers aft and the window forward. - **One step down.** At sill level the top back corner of the bunk alcove meets the hull's skin (4 mm through it at its fore end). With its floor 0.20 m below the door sills the cabin is 9 cm inside the hull everywhere. So the floor did have to go down, by one step; the deck object itself moved 2 mm, because it already lay 0.21 m under the first version's floor panels. `Captain's cabin | threshold step` (made here) fills the gap between the corridor door's sill plate and the cabin's floor; the cabin's leaf slides over it. - **Two doors in a row**: the corridor's side door, and 0.3 m behind it the cabin's own sliding door. Both stand closed. - **Lamps** (made here, seven): the window (160 W), the four ceiling fixtures (22 W each), the bunk's cove and the work station's strip. The model's glowing surfaces light the room only in Cycles. - **Markers**: `Captain's bed` on the bunk, `Captain's desk` at the work station. - For Unreal: the cabin's parts are the model's own FBX files (`models/captains-quarters/fbx/SM_CQ_*.fbx`, with their hulls); `vessel_interior_layout.json` lists them under `own` with these mesh names and their matrices. - `captains_cabin.remove()` takes the cabin out again. If the scene `Captains Quarters` is not in a file, `port()` appends it from `models/captains-quarters/CaptainsQuarters.blend`. That folder is the other session's: nothing is written there. ### The captain's quarters over the whole room (`build/captains_suite.py`) The cabin as ported filled half of the room that had been set aside (7.2 m of 14.4 m; the rest was closed off and empty). The user, with the reference picture of the black cabin attached: *"what is this? this is a small room. you said it wont fit thats why I said try to fit. make it use all the space previously spared just generate if necessary here is the referance picture"*. And while that was being built, with the corridor's starboard side door selected in the open file: *"the entrance should be via the "Door_A_BP4.230" build according to that"*. The files from before: `models/_backups/M_Ship_v2_interior_season2_pre-captains-quarters-full-room_2026-10-13.blend` (14:38) and `..._pre-captains-quarters-full-room_15-58_2026-10-13.blend` (the open file just before the change). **The room** (cabin frame: +X aft along the bunk wall, +Y to the hull, origin on the cabin's floor centre; in the ship x 15.86 to 30.21, 14.35 m): - **Middle bay: the model's cabin**, where `captains_cabin.port()` put it: bunk alcove, work station, bench with the chart. Its **window wall stands 3.55 m further forward**, at the bridge end (5 cm short of a full bay: its light well ends 4 cm before the bridge bulkhead); its **locker wall with the three doors 3.6 m further aft**. The model's lettering mesh is taken apart by wall (three meshes), so the end walls' lettering goes with them. - **Forward bay: a lounge.** A padded bench (the model's bench, 2.6 m) with a light cove over it, a low table, a chair (the model's), a sideboard under a lit shelf on the corridor side. - **Aft bay: the mess.** The same bench as a banquette, a table for four, two chairs, and on the corridor side a sideboard under a status display (the model's screen sheet). - **The two bays are deeper than the cabin**: their floor runs 4.4 m out from the corridor's wall (the depth of the model's footprint, where the bunk alcove ends) instead of 3.3 m. The hull leans in over the outer 1.1 m, so that strip has a knee wall 1.6 m high and a canted panel up to the ceiling. Nothing made here is closer than 10 cm to the hull's drawn skin. - **At each junction** with the cabin: a pilaster on the corridor side, a beam under the ceiling, a strip in the floor, all on the new bay's side of the seam; on the hull side the model's own pillar at the end of the bunk wall, with a gunmetal angle over the outside corner where the bay's return wall begins. - All of it is drawn with the model's own functions and materials (`cq_lib.py`, `build_quarters.py` in `models/captains-quarters/build`, imported without writing a byte there; their `main()` is never called): plates on a dark backing with 6 mm gaps, rings, quilting, the same fixtures. Meshes `SM_CQS_*` (19, 25,048 triangles, no n-gons, weighted normals applied, box-projected UVs like the model's), objects `Captain's cabin | SM_CQS_...`. - **Lamps**: one under each of the roof's eight light fixtures, turned to the slope (26 W in the forward bay, where the window is; 55 W aft, which has no window; 22 W in the middle), and one in each bench's cove. 13 lamps in the room. **Markers**: `Captain's mess table`, `Captain's lounge` (with `Captain's bed` and `Captain's desk`). **The entrance** is the corridor's own side door, the Engineer pack's (`Door_A_BP4.230` in the frame `Doorway_Small_A10.010`). Measured in the file with rays through the frame, the leaf left out: its opening is 1.56 m wide (x 24.08 to 25.64) and runs from 0.23 m above the sill (a coaming) to 2.84 m above it; the frame's room face is at y -2.998. - What stood there before did not suit it: the model's own sliding door, 1.0 x 2.1 m, 0.4 m behind the pack's door, with the cabin's floor 0.43 m under the coaming's top and no step; and the pack's opening reaches 0.44 m above the cabin's ceiling, so from the corridor one looked over the cabin's roof. - Now: the model's sliding door and its door wall are **out of the ship** (they stay in the model's scene). The wall is drawn again as `SM_CQS_Wall_Door` with the model's own numbers (plates, chart display, bench) and a **doorway made to the pack's door**: 1.64 m wide, its head 6 cm over the door's own (3.10 m above the cabin's floor), the reveal lined back to the pack's frame; the control pad stands beside the frame, the model's EXIT lettering on the frame's head. - `SM_CQS_Entry`: inside the door a **landing at the corridor's level**, 2.2 x 0.9 m, with one lit step (0.20 m) down to the cabin's floor, so the coaming is the same height on both sides. **The room's height.** The model's cabin is 2.60 m high; the pack's door opening ends 3.04 m above the cabin's floor. At first a panel behind the door frame closed the difference. The user, with pictures of the door standing up over the cabin's roof and a red line along the top of the corridor's wall: *"extend the room height. the door look half cut fix that by extending the room height"*. The file from before: `models/_backups/M_Ship_v2_interior_season2_pre-captains-quarters-raised-ceiling_2026-10-13.blend`. - **The roof is one slope now**: 2.60 m at the bunk wall (the model's height, and all the hull leaves there) up to **4.03 m at the corridor's wall** (ship z 6.97), over the whole length of the room. That is 7 cm under the top of the pack's wall pieces, the user's red line: exactly at that top the roof cut 4 cm into the hull's crest skin in the forward bay. That skin is hidden (it lies under the roof pod, behind a Mask), but nothing of the room passes through it. - How high it can go was measured against **hull and roof pod as one** (`shipfit.Envelope`): the slope keeps 0.19 m or more; the tightest place is still the model's bunk wall top (0.10 m). Against the hull's skin alone the limit would be a level strip 3.66 m up and 1.1 m wide: the hull's crest lies in the way there, but it is under the pod and hidden, and the space above it belongs to the ship (the corridor's own walls stand in it). A level ceiling at 4 m with a slope after it does not fit: the hull's shoulder comes in at mid-depth. - The model's flat ceiling (`SM_CQ_Ceiling`) is **out of the ship**; `SM_CQS_Mid_Ceiling` and the two bays' ceilings carry its light fixtures (two rows on the slope) and its vent. The door wall and the bays' corridor walls are 4.03 m high, with two more rows of plates. Gables stand over the model's window wall and locker wall. The whole door stands in the wall, with 0.9 m of wall over it; the panel is gone. - `captains_suite.rebuild()` draws everything made here again in a room that is already filled (that is how the open file was changed); `extend()` works in two steps for it (`_prepare`: what is done once to the cabin's own parts, `_build`: everything made here). - `Captain's cabin | threshold step` (made for the old door) is gone. **For Unreal**: `build/captains_suite_fbx.py` writes one FBX file per mesh made here, with its box hulls, into `models/vessel-interior/captains-suite/fbx` (22 files, 25,074 triangles, 37 hulls: floors, roofs, walls, gables, canted panels, benches, sideboards, the landing, table tops and legs; lettering and props have none), in the same convention as the model's own files (each at identity in the cabin's frame, the two tables at their own foot, data turned -90 degrees about Z, forward -Y, up Z). Every file was read back and compared (`fbx_report.json`: all match). Where each stands in the ship is in `vessel_interior_layout.json` under `own`. `captains_suite.extend()` does all of this in one go on a file that holds the ported cabin; `remove()` takes it back to the cabin alone (it ports the cabin afresh). If the other session changes its `wall_door`, the copy of its numbers in `captains_suite.door_wall` does not follow. ### Real surfaces in the captain's quarters (`build/captains_look.py`) On the pictures of the finished room the user wrote: *"do it more realistic with good textures"*. Until then every surface was one flat colour with a faint generated roughness map (the model's own `T_CQ_*` textures), and the pictures were EEVEE renders. The file from before: `models/_backups/M_Ship_v2_interior_season2_pre-captains-quarters-real-textures_2026-10-13.blend`. The room's materials (`M_CQ_*`, shared by the cabin model's parts and the parts made here; they are this file's own copies, nothing is written into `models/captains-quarters`) now carry texture sets. The colours are still the reference picture's black cabin; what changed is how each surface answers light. | Material | Where | Texture set | One repeat | From | |---|---|---|---|---| | `M_CQ_Satin` | wall and ceiling plates, frames, bench and sideboard bodies, table tops | `ScratchedMetal` (diffuse, roughness, normal), roughness 0.23 to 0.54 | 1.10 m | pack | | `M_CQ_Matte` | kick plates, back boards, vents, linings | `ScratchedMetal`, roughness 0.52 to 0.76 | 0.85 m | pack | | `M_CQ_Gunmetal` | tops, pulls, rails, cartridges (metal) | `BrushedMetal` (diffuse, roughness, normal) | 0.45 m | pack | | `M_CQ_Steel` | chair bases, table feet, tie-downs (metal) | `StainedSteel` (diffuse, roughness) with `T_Scratch_Norm` | 0.60 m | pack | | `M_CQ_Floor` | floor plates, the landing | `FloorPanel_A` (diffuse, roughness, normal): a dimpled anti-slip plate | 1.00 m | pack | | `M_CQ_Quilt` | padded walls, bench backs | `leather_white`, tinted black, with the model's own stitch-and-crease normal map kept under its grain | 0.42 m | scan | | `M_CQ_Mattress` | seat cushions, chair pads, mattress | `denim_fabric_05`, a dark twill | 1.10 m | scan | | `M_CQ_Sheet` | the blanket | `poly_wool_herringbone`, grey wool (the camouflage print is gone) | 1.00 m | scan | | `M_CQ_Pillow` (new) | the pillow | `cotton_jersey` | 0.55 m | scan | | `M_CQ_Glass` | the window's pane | as before, with smudges in its sheen | 1.4 m | pack | - **pack** = the user's Modular SciFi Season 2 packs, the 1K sets already exported to `textures/ModSciInteriors` and `textures/ModSci_Engineer` (the same files the kit pieces use; the room has its own image blocks named `CQ | ...`, so the kit's are untouched). Every hard material also gets the pack's `T_Glass_DirtRough` as a large smudge mask that dulls the sheen in patches (2 to 3 m across, a few hundredths of roughness). - **scan** = Poly Haven (polyhaven.com), licence CC0, downloaded with the user's yes into `source_textures/` (12 JPG files at 2K, 43 MB; its README names each set). Cloth is laid on larger than life (a 27 cm scan over about 1 m) so that the weave shows at room distance. - Panels, metal and floor use the meshes' own UVs, which are metres. Leather and cloth are laid on by position (object coordinates, box projection): the quilt's own UVs count cushions, not metres. - The pillow gets its material on the object (`Captain's cabin | SM_CQ_Pillow`, slot linked to the object); the model's mesh keeps the blanket's material in its slot. - Unchanged: the backing behind the plates, lettering, screens, lamps' glowing faces, the window's light box, the grille. - The flat versions stay in the file as `M_CQ_*__flat` (9 materials, fake user). `captains_look.revert()` puts them back and takes the pillow's material off; `captains_look.apply()` builds the sets again. **Pictures**: the captain's quarters' previews (`Vessel_32` to `34`, `36` to `45`) are rendered in **Cycles** now (192 samples, denoised, the command deck by itself). Reflections and bounced light are what show a roughness or normal map; in EEVEE the same materials look almost as flat as before. `bl_render.py` takes `"engine": "CYCLES"`, `"samples"` and `"only"` per view. `Vessel_43` and `44` are close views of the padded wall with the bedding and of a bench's leather and cloth. **For Unreal**: the table above is the recipe (`captains_look.TABLE` has the numbers: tint, roughness range, repeat). The pack's textures are in the project already (`Content/ModSciInteriors/Textures/Base/...`, `Content/ModSci_Engineer/Textures/FloorPanel_A`); the four scanned sets are not. Leather and cloth need a world-aligned (triplanar) lookup or a second UV channel there. The FBX files do not change (they name the materials only); the pillow needs `M_CQ_Pillow` assigned by hand. ## The reactor room (2026-10-13) The user, on the labelled main-deck plan with a rectangle marked to port and one to starboard of the corridor labelled REACTOR GALLERY, arrows pointing outwards: *"extend this corridor and make a room instead of a corridor"*. Done in the open file with `build/reactor_room.py` (`apply()`, `remove()`, `check()`); a rebuild runs the same `apply()` after the gallery is built. The file from before: `models/_backups/M_Ship_v2_interior_season2_pre-reactor-room_2026-10-13.blend`. **What was there.** Three bays of the Engineer pack's "hallway B", 10.8 m long: a glass floor 3.6 m wide over pipes, a gutter 0.6 m wide and 0.9 m deep on each side, padded wall pieces 4.4 m apart, a 4.8 m ceiling panel per bay, six red wall lights. **How wide it can be.** The hull's skin at floor level is 7.40 m from the centre line at the aft end of the room and 8.51 m at the fore end; 0.9 m below the floor it is only 6.94 m. The pack's wall pieces are 0.42 m thick. A straight room can therefore have **7.00 m to the walls' inner face: 14.0 m between the walls** (the pieces' lower outer corner is then 13.6 cm inside the skin at the aft end). At the fore end 1.1 m between wall and hull is not used. The marked rectangles reach about 8.7 m: that is the hull's outline at its widest height, 3.9 m above the floor. **What lies under it.** The two lower engine pods (`Engine | titanium pod`, part of the ship, untouched) come in under the floor from both sides. In the two aft outer corners their crowns rise up to **16 cm above floor level** (over about 1.0 x 1.5 m each), and 21 cm above it just behind the room's aft wall. That decides the floor's make and the base along the walls. | Part | What it is | |---|---| | walls | the gallery's six wall pieces (`EN_SM_Wall_HB_A/A2/A3`), moved 4.82 m out with their light fittings, lamps and the padded panel. Their lower 1.2 m is a base that stood in the gutter; hull and pods are in the way of it out here, so they are **cut copies**, `SM_RR_Wall_HB_*`: cut 0.30 m above the floor, in the plain plating of the base, 9 cm of which stays as a skirting | | dais | along each wall a machinery base 1.6 m deep and 0.30 m high, `SM_RR_Dais`: drawn with the edge profile and on the trim-sheet bands of the pack's own platform (`EN_SM_Intersection_Floor`, measured on the mesh). The walls stand on it; the pods' crowns end 14 cm under its top | | floor | the glass floor stays. On each side one more 3.6 m module per bay. End bays: `SM_RR_Floor_Frame`, the glass floor tile's own top 6 cm as a cut copy (the tile is 1.2 m deep; the pods allow 10 cm), closed underneath, with the pack's perforated panel in it. Middle bay: the pack's platform, on a plate that shows only in its cut corners | | ceiling | two more rows of the pack's panel (`EN_SM_Ceiling_HB_A`), six pieces | | ends | beside each door: the pack's door-side brace (a cut copy: its foot stood in the gutter), a pilaster, a wall piece, a pilaster (`SI_SM_Wall_Divider_A`; the outer one a cut copy on the dais), on a base course with the dais' profile (`SM_RR_Base_Course`). Brace and first pilaster stand on a plate (`SM_RR_Sill_Plate`). The four wall pieces stand 8 cm into the room: the works hall's wall is right behind the fore ones | | reactor | in the middle bay, each side of the glass floor: a vessel (`SI_SM_WVC_Tank_A`, 2.9 m across, 2.1 m high) on the platform, and behind it on the dais a 6.7 m bank of the pack's power cells (`SI_SM_PowerCells_Wall`). The 3.6 m way between the two doors is clear | | light | six of the pack's caged tube fittings (`EP_SM_Light_B`) under the new ceiling panels, one over each new floor module, each with a lamp under it (220 W, warm white); on the four end walls the wall light the gallery's wall pieces carry, with the same red lamp. With the six that moved out: 16 lamps of the room, 10 of them new | **What is gone.** The gutters are closed, and what stood in them has no place in the room: 6 bottom strips, 14 distribution boxes and 7 pipe stubs on the walls' bases, 4 labels on the bases, 6 trims that closed the walls' open ends (37 objects). Everything removed or moved is written down in the .blend, in the text block `REACTOR ROOM | what the corridor was`; **`reactor_room.remove()` puts the corridor back** from that record (tried on a copy: all 3,443 objects back, none of the zone's differing in mesh, place, collection or properties). **Composition.** Symmetric about the centre line and about the middle bay. Whole pieces only: three wall pieces a side as the gallery had them, one per end wall between two pilasters, whole floor modules, whole ceiling panels. One datum 0.30 m above the floor all round the room: dais, base course, the vessels' platforms. **For Unreal.** The pack's pieces are instances in `vessel_interior_layout.json` as before. The eleven meshes `SM_RR_*` are the ship's own parts (listed there under `own`): `build/reactor_room_fbx.py` writes them to `models/vessel-interior/reactor-room/fbx` (11 files, 18,508 triangles, 10 box hulls; the wire has none), in the convention of the captain's quarters' files, and `reactor-room/fbx_report.json` names the pack's Unreal material for every slot. A cut copy keeps the pack piece's own origin and UVs. Nothing of this is in the Unreal project. **Pictures.** `Vessel_12` (the gallery's old camera), `46` to `51` and the plan `52`; `Change_reactor_gallery_to_room_before_after.png` and `..._plan_before_after.png`. Rendered with the zone's own lamps only. ## The fore main deck raised, the sensor room, the lift room (2026-10-13) The user, with a side view of the fore main deck (its whole block outlined, arrows up to a line along the underside of the command deck), the plan (the block outlined; forward of it a rectangle written "sensor room" over the middle and the port side and one written "lift room" to starboard, a link between them) and a view of the space under the block: *"this whole section should be moved up and stick to the [command deck] so that I can utilize the space underneath better. this way we can make another room beneath so its gonna be 3 floor I will add a lift later on, sensor room needs to be extended"*. Done in the open file with `build/fore_deck.py` (`apply()`, `remove()`, `check()`); a rebuild runs the same `apply()` after section 4 has built the deck as it was. The file from before: `models/_backups/M_Ship_v2_interior_season2_pre-fore-deck-raised_2026-10-13.blend`. **How far it can rise.** The block's roof was at z 0.84 everywhere. Above it the control room corridor's wall pieces and door plates reach down to z 2.24 (they hang 0.9 m below the command deck's sill); the quarters' decks are at 2.78, the bridge deck at 2.86. So it rises **1.40 m** (1.398: 2 mm short of touching), and meets the command deck along the corridor; over the side rooms 0.54 m stays free under the quarters' decks. | | before | now | |---|---|---| | passage's sill (z) | -3.36, level with the sub bay | **-1.96** | | side rooms' floors | -4.26 | -2.86 | | lowest piece of the deck | -5.13 | -3.73 | | roof | 0.84 | 2.24, against the command deck | | hull bottom under it | -10.9 on the centre line aft, -9.6 at the bow end; -9.1 to -7.4 six metres off it | the same: about 7 m free under the raised deck on the centre line, 4 to 5.5 m toward the sides | **The passage is five bays long** (it was six with a junction cube, the old sensor room, behind its bow door). Its fifth bay was taken out, its last bay with the door behind it moved one bay aft, the cube went: a car's last bay is dressed as an end, so it is a whole five-bay car again, door plane at x 34.21. The cube could not rise with the rest: its lantern roof would stand 1.3 m in the bridge deck. **The sensor room** (forward of that door, x 34.56 to 41.76, the old cube's bow end): two two-bay cars of the same kind as the passage (floor at sill level), one on the centre line and one on the port row's axis, set down by the build's own unit code and joined into one room. The walls between them are left out; a beam on two piers (`SM_FD_Beam`) stands where they were and closes the 0.4 m between the two ceilings; the two gutters there are covered by the pack's sill plates (four `EN_SM_GlassFloor_Door_B`) with a strip between them (`SM_FD_Floor_Strip`). **9.56 m wide** (y -2.18 to 7.38), 7.2 m long, 3.9 m high. The marker `Sensor module` is where it was in plan (39.96, 0), 1.40 m higher. **The lift room**: a third two-bay car on the starboard row's axis (y -7.38 to -3.02, 4.36 x 7.2 m), entered by the pack's door from the sensor room in its first bay. It holds only the pack's wall fittings: the lift is to come. **The door from the sub bay** is 1.40 m above the bay's deck now. `Bulkhead | sub bay fore` has its lower opening that much higher (made again by the same fitted-bulkhead code, its mesh swapped in the same object). In the bay's lining the door's lintel is taken out and the ledge parted; two jambs and a lintel (plain boxes like the lining's other piers) stand above the raised door, under the gallery. Before the door a landing 3.6 x 1.8 m with a flight to each side along the wall, eight risers of 17.5 cm, treads 28 cm (`SM_FD_Door_Podium`, with a handrail on each flight), and the pack's rail on the landing. The bay's floor lettering in front of it is as it was. **In numbers**: 52 objects removed, 1,207 moved, 286 added (232 pack pieces, 30 lettering quads, 10 lights, the rest drawn here or plain boxes). Everything is written down in the .blend, text block `FORE DECK | what it was`; **`fore_deck.remove()` puts it all back** (tried on a copy: all 3,470 objects back, none differing). **For Unreal**: the pack's pieces are instances in `vessel_interior_layout.json`. `build/fore_deck_fbx.py` writes the three meshes drawn here to `models/vessel-interior/fore-deck/fbx` (224 triangles, 7 hulls: the flights are wedges to walk on). Nothing of this is in the Unreal project. **Pictures**: `Vessel_53` and `54` (the raised door and its landing), `55` to `57` (the sensor room), `58` (the lift room), `59` (plan at the raised level), `13` (the passage). `Vessel_14` to `16` show the side rooms from before the raise; they are unchanged but for their height. `Vessel_60` is a cut along the centre line with the three levels written in (`build/bl_section.py` renders the cut in even light, `build/annotate_section.py` writes the labels). ## The room under the raised fore deck (2026-10-14) The user, after the raise was done: *"create the room underneath"* (the third floor it was raised for). Done with `build/lower_deck.py` (`apply()`, `remove()`, `check()`), applied to the saved file headless; a rebuild runs the same `apply()` after `fore_deck.apply()`. The file from before: `models/_backups/M_Ship_v2_interior_season2_pre-lower-deck-room_2026-10-14.blend`. - **Level**: the raised deck's lowest part is at z -3.73 (cables under the passage's glass floor). The room's roof is 2 cm under it, its floor 4.2 m lower, at **z -7.95**: the pack's room height, 3.9 m clear. - **Size**: 10.8 m wide and 20.8 m long inside (six bays, x 15.86 to 37.46). At that depth the hull's round bottom is what limits the width: 7.10 m from the centre line at floor level at the aft end, 5.88 m at the forward end; the room is the same width all along, set by the forward end (its port wall's outer lower corner is 9 cm inside the skin). - **Make**: the pack's glass floor car on the centre line, six bays, closed at both ends, without its side walls and what stands in its gutters; an aisle each side of floor modules (the reactor room's `SM_RR_Floor_Frame`, the glass floor tile's top 6 cm, with the pack's perforated panel: the hull's bottom is too close for the whole tile); two more rows of ceiling panels; the pack's wall pieces cut at the floor (`SM_LD_Wall_HB_A/A2/A3`, their 0.9 m of base below the sill would stand through the hull's bottom), 0.39 m of base showing as a skirting, as in the passage. Each end is three whole pieces; under the cut ones a plate over the module's panel (`SM_LD_Sill_Strip`). - **Light**: twelve of the pack's caged tube lights under the ceiling over the aisles, each with a lamp (200 W, the passage's cool white). - **The lift**: the room's last bay lies under the aft half of the lift room (x 34.56 to 37.46, y -3.02 to -5.40 in both), room for a shaft of about 2 x 2 m through both floors. **There is no way in yet**: the user means to add the lift. - 194 objects, nothing moved or removed; collection `10.4 | Fore main deck | lower deck`. `lower_deck.remove()` takes them out. Pictures: `Vessel_61` to `64`, the plan `Vessel_65`, and the cut `Vessel_60` again. ## The boarding gate: the pressure door through the hull (2026-10-15) **Two candidates.** Later the same morning (*"Save a copy. now do the newly created pressure door I want to see which one will be looking better"*) the sliding pressure door of `models/pressure-door-sliding` was fitted in the same place instead of the hinged one: `boarding_gate.py` knows both (`DOORS`: `"hinged"`, `"sliding"`), one is in the file at a time (`remove()`, then `apply(door=...)`), and `DEFAULT_DOOR` is what the file holds now (`"sliding"`), not a choice. The file with the hinged door as it stood is `models/M_Ship_v2_interior_season2_hinged-door_2026-10-15.blend`. For the sliding door: its own columns, conduits, console bracket, junction box, floor cable and the cable trough with its cables are kept for the look but cut at the wall face (the kit's wall pieces are solid behind it) and to the gate opening's width; the wall plate round it is two side strips and a header above the trough; the sleeve, the collar and the holes follow its opening, a rounded rectangle 1.40 x 2.20 m; the energy node in the bay's corner stays (14 kit objects out). Since 2026-10-15, 23:00 (*"Do the same realistic dark grey mettalic texture on the sliding door too"*) its paint, steel and dark materials wear the same treatment as the hinged door's (`pd_look.look(prefix="M_PDS_", masks_name="T_PDS_Masks")`; `apply()` does it for either door). Pictures `Vessel_71` to `75` and, with that finish, `82` and `83` (hinged: `66` to `70`). On 2026-10-16 (*"delete that screen"*, a red cross over it) the keypad on the left leaf was taken off in the ship (`_drop_keypad`), and the dark spot the door's bake had under it cleared in a copy of the mask atlas for the ship, `textures/T_PDS_Masks_ship.png` (`patch_keypad_masks`); `apply(door="sliding")` repeats both. Picture `Vessel_84`. The same night, on two pictures marked CLOSED and OPEN: the bar on the handle disc lies horizontal when the door is shut and stands vertical after the handle's quarter turn, before the leaves slide (`level_handle_bar()` turns the handle's mesh so the bar is level at rest; the rig is unchanged). Pictures `Vessel_85` (shut), `86` (unlocked). The rest of this section describes the hinged door's fitting; the sliding one is done the same way. **Since the evening of 2026-10-15 the file holds the sliding door's corrected version** (the user to the door's session: *"update the ship"*): no cables on top, the reference's leaf relief, a handle disc (`SM_PDSliding_Handle`, child of the left leaf, the fifth mover, slider `handle_turn`) that turns a quarter before the leaves slide, opening 1.40 x 2.10 m (R 0.32, centre 1.21), door plate ±1.645 (the gate's 3.30 m allow no wider pockets), the wall plate's side strips 2 mm off it; `_build_plate_rect` no longer puts rivets where there is no plate or where the door plate covers them. `check()` passes (no crossings, travel of all movers clash-free). Pictures `Vessel_76` to `81` (`build/views_boarding_gate_sliding_v2.json`). Backups `_backups/M_Ship_v2_interior_season2_pre-sliding-v2_2026-10-15.blend` (saved) and `..._live-before-sliding-v2_2026-10-15.blend` (the open session). The door's first version is in `pressure-door-sliding/versions/v01_2026-10-15_first_build/`. The user, on a picture of the Season 1 kit's lattice gate in the works hall's port wall: *"replace this part of the vessel change it with [models/pressure-door] basically you gonna open a hole on the main hull of the vessel all the way so it is going to be a pressure door"*. Done in the open file with `build/boarding_gate.py` (`apply()`, `remove()`, `check()`); a rebuild runs the same `apply()` after `lower_deck.apply()`. The file from before: `models/_backups/M_Ship_v2_interior_season2_pre-pressure-door_2026-10-15.blend` (saved file) and `..._live-before-pressure-door_2026-10-15.blend` (the open session). - **Where**: the gate's centre line, x -20.39, where the marker `Boarding gate (port, Anchorage bridge)` stands. The door is appended from `models/pressure-door/PressureDoor.blend` as it is (rigged: `PressureDoor_Root["open"]`, its timeline keys, the collision hulls in `PD | collision`, excluded) and stands with its wall face on the kit wall pieces' front face (y 7.30) and its floor on the floor strip along the wall (z -4.248): `PressureDoor_Root` at (-20.39, 7.30, -4.248), collection `10.2 | Works hall | boarding gate (pressure door)`. Its own bulkhead plate and floor plate are not used; the frame's back step and the housing's panel on the wall's back are dropped (behind the wall is the lining void). - **Out** (15 objects, recorded for `remove()`): the two lattice leaves (`SI_SM_WVD_Gate`), the two gate edges, the niche's tech dressing (server, wires, pipes, panel, two electric boxes), the light over the gate with its spot lamp, and the energy node in the bay's fore corner, where the door's hinge housing stands. - **In, drawn here** (`SM_BG_*`, the door's own materials, its plate code `pd_build.hole_panel`): a wall plate 3.30 x 3.89 m in the gate opening, with the round hole under the door's collar and back flange, seams and rivet rows as the door's own plate; a base plate 11.5 mm thick in front of the frame and the housing (the kit's floor strip along the wall is 12 mm proud of the floor); the **sleeve**, the frame's bore (R 1.08) carried on from the back flange (y 7.72) through the back wall and the void to the hull's skin and 7 cm beyond (about 1.6 m), the frame's tread carried on in it; the **collar** round the sleeve's mouth on the hull's outside, Ø 3.10 m, 7 cm proud, let 12 mm into the skin, with 16 bolts. - **The hole**: the niche's back wall piece (`SI_SM_WVD_Wall_C`) gets a round hole as a cut copy (`SM_BG_WVD_Wall_C_hole`); the hull mesh `M_SHIP_Hull` gets a round hole R 1.21 on the door's axis (z -2.97; the skin is at y 9.23 there), cut into the mesh (exact boolean, the cutter's own faces taken out again: the hull is a skin). The hull as it was is kept as a mesh datablock with a fake user, `Hull | ... | before the boarding gate hole`, which `remove()` puts back; the vertex group `LAYOUT_pod_opening` is restored by position after the cut. - **Checks** (`boarding_gate.check()`): no crossings with the ship or the works hall's pieces; the leaf, the wheel and the bolts through the whole travel: no clash, the leaf 4.3 cm over the floor strip and the base, 2 mm from the gasket shut; the axis ray goes out through the hull and the back wall; the plate, base, frame and housing are inside the hull. The leaf opens into the hall toward the bow and sweeps over the open power-cell trench, 4 cm above the floor. - **Surfaces** (the user, the same night: *"Do a more realistic color and texture on it"*): `pressure-door/build/pd_look.py` (`look()`) puts Poly Haven's `blue_metal_plate` scan (CC0, 2K, `pressure-door/source_polyhaven/`) under everything painted, with the door's baked masks on top (chips to bare steel on exposed edges, grime in crevices, dust on faces that look up, a thin enamel coat), brushed stainless for the bright steel, matte black for the fittings. Then, at *"Do it dark grey mettalic"*, the painted parts became a dark grey metallic finish (`pd_look.STYLES["gunmetal"]`, the default; `"navy"` is the scan's own colour). The materials keep their names (`M_PD_*`), so the plate, base, sleeve and collar made here changed with the door. `boarding_gate.apply()` runs `pd_look.look()` after appending the door, so a rebuild gets the same finish. - Pictures: `Vessel_66` (shut), `67` (open), `68` (through the open door), `69` and `70` (the hull's outside), with the realistic surfaces. - For Unreal: the door's parts carry the asset paths of `pressure-door/PressureDoor_layout.json` (`ue_mesh`); the plate, base, sleeve and collar are own parts. The layout file was not exported again. ## The moon pool door arms (2026-10-16) The user, with a marine flush hinge sheet (MFH 100 / 200) and a drawing of an arm from each pocket's upper rail down to its door: *"Create a door arm that looks like in the referance understand the picture and rig it accordingly and mechanically. according to the open and close animation fit it to the scene"*. `build/door_arms.py` (`apply()`, `remove()`, `check()`); the copy from before: `models/M_Ship_v2_interior_season2_before-door-arms_2026-10-16.blend`. - **The doors keep their animation** (1-12: 1.22 m inboard; 12-48: 6.14 m into the pocket; back 72-120). The arm follows it: the door's location drives every part through simple-expression drivers (no scripts in the file). - **One arm per door**, as drawn: a trolley (0.33 m) on the pocket's upper rail follows the slide (at the rail's inner end with the door shut, 4 mm off the pocket's end wall with it open); under it a frame block on a vertical yaw bearing; the sheet's double parallelogram: main arm + turnbuckle 1 to an elbow knuckle, link + turnbuckle 2 to the door bracket, whose disc turns on a bearing on a wedge mount fitted to the door's inner face (1.3 m from the door's middle toward its pocket). The parallelograms keep the knuckle and the bracket level; the yaw bearings take the swing; the links' angles are two-link inverse kinematics in the arm's vertical plane, elbow down. - The four placeholder carriages on the rails are hidden (they stood in the trolley's path); `remove()` shows them. - Checked through the whole timeline: no part crosses anything; the bracket stays on its mount (0.001 mm). - Pictures `Vessel_87` to `91` (lit with work lights that are only in the test copy). - Materials `M_DA_Black`, `M_DA_Steel`, `M_DA_Gunmetal` (from `pressure-door/build/pd_look.py`). Not in Unreal; no FBX. ## The moon pool robot door arms (2026-10-18) The user, with a screenshot of the door robot arm's version B (neck and plate) from `models/door-robot-arm`: *"ok now install this version of the arm to the ship, you can change the rail system with this try to fit it accordingly how I described you before"*. Installed by `models/door-robot-arm/build/dra_ship_install.py` (`apply()`, `remove()`, `check()`; record: text block `ROBOT DOOR ARMS | what was added`); the file before: `models/M_Ship_v2_interior_season2_before-robot-arm-install_2026-10-18.blend`. - One robot arm per starboard pocket door, hanging from a carriage on that pocket's rail, its plate bolted to a pad on the door; driven only by the doors' own animation (346 simple-expression drivers; details in `models/door-robot-arm/README.md`). Collections `02 MECHANISM | Starboard pocket doors | robot door arms (version B)` with `... | arms`, `... | solver (hidden)` and `... | rail system`. - **The flush-hinge door arms above (2026-10-16) are excluded**: they ride the same rails. Their collection `02 MECHANISM | Starboard pocket doors | door arms` is unticked in both scenes' view layers; nothing is deleted. - **The rail system was changed** (the user's permission): the plain `Pocket AFT/FORE | upper rail` boxes are hidden and `DoorArm_AFT/FORE | rail beam` (the same section, dark steel) carry the arm's rail kit (flanges, rack, buffers, chain tray and chain). The placeholder `rail carriage` cubes stay hidden. - Checked over frames 1-120: the plates hold their door pads within 0.02 mm and 0.0 deg; nothing crosses any of the 122 ship objects round the pockets; the beams sit in the deck and the end walls as the old rails did. Pictures: `models/door-robot-arm/previews/ship_install/`. Not in Unreal. ## Wall props in place of the Storage Area Network boxes (2026-10-19) The user: *"replace every box of that object in ship with inside "MachineParts_Kit" "HardSurfaceKit" objects ... do the objects gameready asset with baked textures, do the textures metallic substance in grey tones similar to that boxes ... choose attachable objects to the wall or hangable. you can set it randomly"*. The pack's `EN_SM_StorageAreaNetwork` stood 26 times on the walls; `build/wall_props.py` (`apply()`, `remove()`, `check()`) puts a prop from `models/wall-props` (16 game-ready wall-mounting parts of the two kits, each with its own baked texture set) in each box's place: picked at random (seeded by the box's name), its back on the box's wall plane, turned and scaled to fit the box's face, tested against everything round it. Hanging props keep gravity's way round. The boxes are recorded; `remove()` puts them back. The kit's source copy of the box in `11 KIT` stays. Pictures `Vessel_92` to `95`. ## The sub bay's bare places in the wall buffer's finish (2026-10-23, in the test copy) The user, with pictures of the moon pool room: *"what to do those places without texture? try to add that black marble texture there"*; a black marble from their Fab set was sent back within the hour, with a picture of the dark wall buffer beside the lower fore door: *"I meant this texture replace with that texture smooth forget about marble"*. In `M_Ship_v2_interior_season2_test-ceiling.blend` (the fork has none of the room's recent changes). `build/sub_bay_bare_places.py` (`apply()`, `remove()`, `check()`, record `SUB BAY BARE PLACES | what it was`): - two bands of the fore end wall beside the command deck doorway (0.81 m, from the gallery to the vault), where the ceiling's plates had been cut by mistake (its doorway list took two doorways of the command deck's rooms) and the bare bulkhead showed: 2 cm panels, jointed in line with the plates' reveals. `moonpool_ceiling.py` keeps the bands open on purpose now (`DOOR_BANDS`) and takes only the fore wall's own doorways (the plates came out the same); - the dark structure in `LINING | dark structure` (ledges under the vault, corner and wall-end piers, door lintels and jambs, 17 objects): mesh copies in the finish with UVs in metres; - the command deck landing's edges (its graphite lay at 4 m a repeat and read flat on the 22 cm edge); - then the carousel's pylon (*"do the same with this piece"*): a mesh copy with every face in the finish (the docking arm's own materials stay), UVs round its axis, smooth-shaded with edges over 30 degrees kept sharp (glossy, its 32 facets showed as stripes). The finish `IN_MI_WallBuffer_A | smooth` is a copy of the Season 1 wall buffer's material: that one reads an atlas made for the buffer's mesh, so the copy reads its three atlas maps at one point of the buffer's plain front and keeps the kit's scratch map on the roughness, over the faces' UVs (0.2 a metre). Not done: under the ledges, between the wall tops (about z 0.7) and the ledge (1.14), the room is open to the bare hull lining and the bulkheads. Pictures `Vessel_96` to `99`. ## In the .blend | Collection | What | |---|---| | `10 INTERIOR \| Season 2 layout` | the layout, one collection per zone (10.1 to 10.5), each with `... \| lights` and `... \| lettering`; `10.1 \| Sub bay \| straight lining` inside 10.1; `10.5 \| Command deck \| Crew quarters` and `10.5 \| Command deck \| Captain's quarters` inside 10.5 (each with `... \| lights`); `10.6 \| Stairs`, `10.7 \| Tender carousel` (the rigged docking arm under the empty `DockArm_Root`, its handle shapes in an excluded collection, the pylon, three Tenders linked for the picture), `10.8 \| Markers (game hooks)` | | `11 KIT \| Modular SciFi Season 2 (source, one of each)` | all 194 Season 2 meshes once, far from the ship, excluded from the view layer | | `13 KIT \| Modular SciFi Season 1 (source, one of each)` | all 282 Season 1 kit meshes once, likewise: the two parts bins for changes by hand | | `06 KIT \| Modular Stairs Kit (source)` | as before | | `01`, `02`, `03`, `90`, `99` | the ship, the pocket doors, the dock room, studio, references: untouched | Everything of the layout is parented to the empty `M_SHIP_INTERIOR_S2` (child of `M_SHIP_ROOT`). Numbers (2026-10-13, 16:01, with the crew quarters and the captain's quarters over the whole room): 1,854 kit instances of 194 different meshes (Season 2: 1,550 of 137; Season 1: 304 of 57; 4.4 million triangles counted with instances; the user took one instance out by hand that afternoon), 419 lettering quads, 226 lights (194 from the packs' demo rooms, 8 lamps for the sub bay's vault and the bridge, 12 in the crew quarters, 13 in the captain's quarters, less the lamp taken off the starboard door), 37 markers. Made for this hull: three bulkheads, the gallery slab, the bridge deck, the pylon, and the sub bay's corner piers, lintels and cap ledges (20 meshes, 2,729 faces, 158 of them triangles where a grid meets the curved shell, no n-gons, no open edges, UVs on all); for the crew quarters 27 objects of 7 meshes and the captain's deck (all quads, UVs on all, open at the back). The captain's quarters are 20 objects of the other session's model (14 of its 18 parts: its door leaf, door wall, ceiling and lettering mesh are not used; and three more of its chair) and 22 made in the ship (19 meshes `SM_CQS_*`, 25,048 triangles, and the model's lettering in three pieces). The scene `Captains Quarters` (47 objects: the model, its box hulls, its camera and two studio lights) is the other session's copy of its model, appended to the open file by that session. It is saved with this file since the port, because the cabin in the ship uses its meshes. Keep it; edit the cabin's meshes there. Every kit mesh carries `["ue_mesh"]` (its Unreal asset path: `/Game/ModSci...` is Season 2, `/Game/StarterBundle/...` Season 1) and every material `["ue_material"]`; a per-instance material override is an object-linked material slot; `object["zone"]` names the room. Door leaves carry `["ue_role"] = "door_leaf"`. Mesh names start with the pack: SI, EN, EP (Season 2), HW, IN, CC, PR (Season 1). Textures are 1K copies with relative paths: Season 2 in `textures/`, **Season 1 in `../anchorage/textures/`** (the copies made for the Anchorage station; that folder has to stay where it is). Two Mask modifiers on the ship's own meshes, with vertex groups, nothing deleted (remove them to undo): `Moonpool | hull lining` : `LAYOUT mask end caps`; `M_SHIP_Hull` : `LAYOUT mask pod opening` (both from the first layout, still needed; the 128 hull faces the second one hides lie under the pod, between the sub bay's fore bulkhead and the bridge's aft bulkhead). The third one, on the roof pod, is gone: the pod is trimmed for real. Nine trim curves carry a Shrinkwrap modifier (section above). Since the reactor room (2026-10-13, 19:26): 1,840 kit instances of 195 meshes (Season 2: 1,536; Season 1: 304), 415 lettering quads, 236 lights, 37 markers, 160 parts that are not pack pieces (35 of them the reactor room's: 11 meshes `SM_RR_*`), 3,470 objects in the file. Since the fore deck was raised (2026-10-13, 21:16): 2,035 kit instances of 195 meshes (Season 2: 1,731; Season 1: 304), 444 lettering quads, 240 lights, 37 markers, 166 parts that are not pack pieces, 3,704 objects in the file. ## How it was made, and what is the packs' and what is new Both bundles exist only as Unreal assets (`TheDescentUE/Content/ModSciInteriors`, `ModSci_Engineer`, `ModSci_EngiProps`; `Content/StarterBundle`). Season 2 was exported here with the editor commandlet (read-only for the project); Season 1 had already been exported the same way for the Anchorage station and is read from `models/anchorage/kit_export` in place. The packs' demo maps were rebuilt in Blender to prove the transform, and their author's rooms were cut into units: - Season 2 **car**: a run of 3.6 m bays, 5.2 m wide. Sunken (white floor, five steps at each door) or flush (glass floor). The middle bay of the demo's three-bay cars is repeated or left out for other lengths. - Season 2 **cube** (the 3.6 m junction room), **door** (frame, leaf and what is mounted on the frame; one door used everywhere so all doors match), **hall** (shortened to three bays, without its machine alcoves). - Season 1 **hall wall** and **white wall**: one side of the Hallways two-bay hall and of the Interiors processing hall, bay by bay (pilaster 0.82 m + panel 3.6 m), set out as free-standing runs with their wall lights. - Season 1 **command centre**: the pieces round its origin (floors, walkway, terminal, rail, the lamp over it, the lettering on it). Season 1 **furniture rows**: three rows of the Props pack's office demo as the author set them out (desk, cabinet with drawers, shelf, stools, what lies on them). - Season 1 **lettering**: the bundle's own decal materials (words, chevron, hazard band). New here: side doors, closed car ends, the three-bay hall with flush walls, the wall runs, and everything about the ship (plan, bulkheads, gallery, bridge deck, pylon, piers, ledges, markers, where the lettering lies). Left out on purpose: loose things on the floor (cables, mats, tools, pallets, gas bottles) and Season 2's hanging signs in the crew spaces and on the command deck, because they read CENTRAL ENGINEERING. Nothing of either pack is recoloured. ## Checks (`build/check_report.json`) - Every vertex of the layout's mesh objects (2,199 on 2026-10-13, the user adds to them) lies inside the hull (or inside the dock room's lining). - The 131 parts that are not pack pieces (the parts made for this hull and the sub bay's lining, 27 in the crew quarters, the captain's quarters' 42 with their deck, the reactor room's 35, the fore deck's), edge by edge: every edge sampled every 5 cm against the ship's outer skin (hull and roof pod as one). No point outside; the nearest is the bridge's aft bulkhead at 16 mm, then the bridge deck at 51 mm, the crew quarters' lining at 84 mm, the cabin's bunk wall at 93 mm. This check came after the old bulkhead, whose vertices were all inside while an edge between them stood 20 cm outside. - The captain's quarters (`captains_suite.check()`): every vertex at least 9.3 cm inside the ship's skin (hull and roof pod counted as one; the nearest part is the model's bunk alcove, nothing made here is nearer than 10 cm); 4 cm clear of the bridge bulkhead; no part of the room crosses another part of it or anything else in the ship, the hull's hidden faces included. That test counts two faces as crossing only if each reaches more than 0.5 mm through the other's plane, so the 175 pairs of faces that merely touch (plates on their backing, walls meeting in a corner) do not hide a real crossing. No part crosses a piece of the corridor. - The entrance: 2,028 rays from inside the pack's door frame into the room, over the door's whole clear opening: none meets a part of the room. The landing's top is level with the sill. No second door stands behind the first. - The reactor room (`reactor_room.check()`): 14.0 m between the walls (13.994); its 72 parts sampled along every edge are inside the ship, the nearest 13.6 cm from the skin (a wall piece's lower outer corner at the aft end). Against the 243 objects near it, nothing of the room crosses the ship (hull, engine pods, bulkheads), a part made here, or a pack piece it did not already meet in the gallery. What does cross is the pack's own way of joining, the same pairs as in the gallery as the demo built it: a wall's head stands 2 cm into the ceiling panel's lip, a light fitting and the padded panel sit in their wall, the perforated panel in its seat. The pilasters are as high as the wall pieces and meet the ceiling the same way. The test takes the objects of the interior's own scene only: the scene `M-Ship v2 | GAME EXPORT` holds a merged ship body made from the hull before its rebuild, with an inner skin 0.3 m inside that the hull no longer has. - The raised fore deck (`fore_deck.check()`): 2 mm under the command deck; the passage has five bays; its 460 parts near the hull (everything new, and everything more than 6.6 m from the centre line) sampled along every edge are inside the ship, the nearest 14.9 cm from the skin (the port car's gutter strip at the bow end); nothing new crosses the ship or a part made here; nothing of the raised deck crosses the command deck, a deck slab or a bulkhead. - The corridor's floor: level with the sills, no stair or riser left, four sill plates, nothing of the corridor reaches under the floor that should not. - The quarters: 300,000 points (every vertex; the parts made here along their edges) are at least 8.3 cm inside the hull, measured against the hull as it shows from inside (the skin under the pod's foot counts there); no piece of the packs crosses the lining; the meshes made here have no triangles, no n-gons and UVs. - The roof pod: nothing deeper than 6.4 mm under the hull's skin, no part of its edge above the skin (3,222 samples, against the hull as drawn), no modifier on it. - The bridge's own shell: 2,075 rays straight up from the bridge in front of the aft bulkhead all meet the hull (the ceiling is whole); the only trim curve with anything under the skin inside the bridge is the windows' seal. - Carousel sweep and launch arm: see above. - The sub bay's lining against the carousel: stowed Tenders pass 0.98 m above its cap; the launch Tender hangs 3.0 m from the kerb at the starboard wall's foot (0.64 m before the launch arm reached in); the lowered arm 4.3 m. - The launch Tender against the deck well's real outline (the lip curve round it): 1.20 m inside at the nearest, 1.05 m from the coaming. - `build/check_furniture.py`: no Season 1 furniture overlaps what the Season 2 rooms hold (a fire extinguisher, a floor cable and floor sockets that stood where a row now stands were taken out of those rooms). - `build/verify_file.py`: the saved file has no missing or absolute image paths. - `build/build_report.json`: counts and the audit of the parts made for this hull. ## Rebuilding ``` build\ue_export_kit.ps1 Season 2 out of Unreal: FBX, textures, materials, demo maps python build\make_proxies.py 1K texture copies blender -b --factory-startup ..\Kazah-stern-cavity-fixedv4.blend --python build\list_kazah.py blender -b --factory-startup ..\M_Ship_v2_interior_season2.blend --python build\roof_trim.py -- --apply (only on a file whose roof pod is not trimmed yet; saves the file) blender -b --factory-startup ..\M_Ship_v2_interior_season2.blend --python build\build_interior.py (1 min, saves the file) blender -b --factory-startup ..\M_Ship_v2_interior_season2.blend --python build\check_interior.py blender -b --factory-startup ..\M_Ship_v2_interior_season2.blend --python build\export_layout.py blender -b --factory-startup ..\M_Ship_v2_interior_season2.blend --python build\bl_render.py -- previews Vessel build\preview_views.json python build\annotate_plan.py ``` `build_interior.py` holds the plan (the numbers and switches at its top), `cars.py`, `hall.py`, `liner.py` and `cic.py` the Season 2 units, `corridor_level.py` the corridor's level floor, `quarters.py` the two quarters (plan numbers at its top, the meshes made for them, the furniture lists), `captains_cabin.py` the port of the cabin from `models/captains-quarters`, `captains_suite.py` the rest of the captain's room round it and its entrance, `captains_look.py` that room's texture sets, `s1.py` the Season 1 units, `lettering.py` the floor marks, `units.py` the cutting and placing, `carousel_rigged.py` the swap to the rigged carousel, `carousel_height.py` the study of the pylon's length, `shipfit.py` the parts fitted to the hull (and `check_inside`, the edge-by-edge test, and `drawn_tree`, the hull as Blender draws it), `roof_trim.py` the roof pod's cut along the hull's skin, `bridge_shell.py` the bridge's ceiling slot and the trims, `bl_kit.py` the Season 2 kit import and materials. The Season 1 kit import is `models/anchorage/build/bl_kit.py`, loaded from there under its own name; nothing is written into the Anchorage folder. The build removes what it made before and builds again: a hand-edited layout is overwritten by a rebuild, so pick one way of working (now: in place, see above). `build/_pass1/` keeps the scripts and reports of the first pass (Season 2 only, before the linings), `build/_pass2/` those from before the corridor change. `vessel_interior_layout.json` lists every kit piece of both bundles with its Unreal asset path and matrix in the vessel's own Unreal frame (+X bow, +Y starboard), the decals, lights and markers, for spawning the interior from the packs' original assets later. **Nothing has been put into the Unreal project.** The full-size Season 2 texture export (2 GB) was deleted after the 1K copies were made; `build\ue_export_kit.ps1 -Do textures` brings it back. ## Honest limits - **The fore main deck is no longer level with the sub bay**: its door is 1.40 m up, reached by eight steps. Until there is a lift, those steps are the only way to it from the main deck. - **The boarding gate's hole is only in this fork's hull.** The Anchorage file links `M_Ship_v2.blend` (no hole where its bridge meets the ship), and the merged game body `M_Ship_Body` in the scene `GAME EXPORT` has none. The hull's outside has no control panel for the door; the works hall's light over the gate went with the gate. - **The lower deck under the raised fore deck has no way in** until the lift is added, and nothing in it but the pack's own fittings. It is narrower than the deck above (10.8 m against 15.6 m): the hull's bottom is round. - **The lift room is an empty room** and the sensor room holds no sensor equipment, only the pack's wall fittings and the game's marker. Which wall of the lift room the shaft takes, and whether the lift also stops at the command deck (the bridge is above it), is open. - **Over the side rooms the roof does not touch**: 0.54 m stays free under the quarters' decks; the section is one block and meets the command deck along the corridor first. - The landing and its steps in the sub bay are drawn here on the pack's materials, not pack pieces; neither pack has a stair of that rise (theirs rise 0.90 or 1.76 m). - **The reactor room is 14.0 m wide, not the 17 m of the marked rectangles.** The hull's skin at floor level is 7.40 m out at the room's aft end; the rectangles follow the hull's outline at its widest height. The walls are straight and parallel, so at the fore end 1.1 m between wall and hull is not used. - **Its floor is not level right up to the walls**: the last 1.6 m on each side is a base 0.30 m high. The lower engine pods' crowns rise above floor level in the aft outer corners; the base is carried along the whole wall and round the ends so that it reads as one datum. It can be walked on. - **The two vessels and the power cells are my choice** of pack pieces for a room named after a reactor; the user asked for the room. They are six objects (`Reactor room | reactor vessel ...`, `... vessel platform ...`, `... power cells ...`) and can be moved or taken out by hand. The marker `Reactor` is where it was, in the middle of the room. - **The gallery's gutters are gone, with the 37 pieces that stood in them** (boxes, pipe stubs, strips, labels, trims). A gutter along the new walls does not fit over the pods. - **Twenty-three objects of the room are cut copies of pack pieces** (walls, braces, pilasters on the dais, the wire) and four floor modules are the top of the pack's glass floor tile. They are the ship's own parts now, with FBX files of their own; the pack's assets are not changed. - **The launch Tender fits the well only because the launch arm reaches in.** Since the evening of 2026-10-13 the model's own rig in `models/docking-arm` has the same `reach_in` property (rig source, README, `dockarm_rig.json`); how far each arm reaches (2.34 m on the launch arm) is set in this file. Since 2026-10-16 BOARD is no longer the lowest stop: the handle goes on to 9.3 m (POOL) and the boom joint puts the Tender into the basin under the deck. - **Only this file has the trimmed roof pod.** `M_Ship_v2.blend`, `M_Ship_v2_dock_room.blend` and `M_Ship_v2_interior_layout_separate.blend` still have the pod that reaches 1.70 m under the hull's skin. So do the merged game meshes inside this file, in the scene `M-Ship v2 | GAME EXPORT` (`M_Ship_Body`, its two LODs, `M_Ship_Body_SK`): they were merged before this work from an older pod (top at z 10.07; the pod is at 10.38 now) that reaches 2.1 m under the skin. Regenerating them is the ship asset's export step and was not done. - The same holds for the ceiling slot and the seated trims: they are fixed in this file only. Elsewhere on the ship the trims still lie half in the skin (only the nine that showed in the bridge were touched), and under the pod, behind the two bulkheads, the hull's hidden strip still ends on face edges along its sides. Neither shows in a room. - The windows' seal (`Cockpit | continuous fitted black seal`) shows inside the bridge as a black bead round the canopy, 7 cm proud. It was left as a gasket; the same modifier would lay it flat on the inside. - **The crew quarters' lining and berths are not pack assets.** They are meshes made for this hull, like the bulkheads: they travel with the ship model (listed under `own` in the layout file), and their materials (the paint and three cloths) are plain ones made here, without textures. - **The crew quarters have no windows** and their vault is a plain panelled lining. The berths are single: two tiers do not fit lengthwise under the hull's slope. - **The captain's quarters are not as deep as the white room was at floor level.** A flat ceiling 2.6 m up can reach 3.3 m out from the corridor's wall before the hull's slope takes it; the two new bays go on to 4.4 m under a canted panel, the bunk alcove to 4.3 m. Behind that, down at the floor, about a metre between lining and hull is not used. - **The cabin's floor is one step (0.20 m) below the corridor** (the hull: the bunk alcove's top corner is 9 cm inside the skin). The step is inside the room, after a landing at the corridor's level. - **The room's roof is a slope**, 4.03 m at the corridor's wall and 2.60 m at the bunk wall: a level ceiling at the height the door's wall has does not fit under the hull's shoulder. It ends 7 cm under the top of the corridor's wall pieces. The model's own flat ceiling is not used in the ship any more. - The door is the pack's (copper-red leaf, light frame) in a black wall: two different hands, as are the dark captain's quarters and the white crew quarters opposite. - **The window** is the model's placeholder (a lit white box behind the glass). It stands at the bridge end of the room, 4 cm in front of the bridge's aft bulkhead: there is no sea behind it. - **For Unreal the captain's quarters come from two folders**: the model's own FBX files (`models/captains-quarters/fbx`, without `SM_CQ_Door_Leaf`, `SM_CQ_Wall_Door` and `SM_CQ_Decals`, which the ship does not use any more) and the parts made here (`models/vessel-interior/captains-suite/fbx`). Nothing of either is in the Unreal project. - **The model's chair stands where the model has it**, 1.7 m in from the door and beside the way to the bunk. - **The room's textures are 1K (pack) and 2K (scans), tiling**: there is no wear that knows where an edge or a handle is, no fasteners on the plates, and the window is still a white light box. The cloth's weave is larger than life on purpose. - **Only the captain's quarters were given these surfaces and Cycles pictures.** The crew quarters and the other rooms' pictures are EEVEE as before. - **If the other session changes its model**, the meshes in this file's scene `Captains Quarters` do not follow by themselves (they are an appended copy). Take the cabin out (`captains_cabin.remove()`), remove that scene, and port again: `port()` appends the scene from `models/captains-quarters/CaptainsQuarters.blend`. - **Plan `Vessel_02`** is cut 2.4 m above the command deck with the quarters' lining hidden; the hull's overhang covers the outer 0.7 m of both rooms in it. `Vessel_35` (cut 1.16 m above the floor) shows them whole. - **No galley equipment, and no beds on the main deck.** Neither pack has them; the main deck's crew rooms have office furniture and markers. The command deck's quarters have the berths and the bed made here. - **The bridge's walls and roof are the hull's and the canopy's own inner faces.** They are single surfaces: in Unreal they need a two-sided material or a lining of their own. The canopy's material is an opaque dark blue, so it is not a window in this file. Flat kit walls do not fit there: the hull leans in 34 degrees from the deck. - **Two bundles meet at the sub bay's two doors**: the Season 1 walls stop each side of a Season 2 doorway. The Season 1 doorways were not used there because a doorway of each pack cannot share one opening. - The sub bay's doors are on the centre line and the well's edge is 0.5 m from it: one walks round the well on the port side. Rails stand on the well's two ends and its inboard side, with a 1.6 m gap for boarding. - The sub bay's vault above the cap ledge is the ship's bare lining, lit by four plain lamps. - No collision hulls. Lights are the demo rooms' own (Unreal 4 era values, each demo map with its own exposure; the Season 1 ones are scaled per map in `build_interior.py`, `S1_GAIN`) plus eight lamps; they will want a pass in Unreal. Door leaves stand closed; no door logic. - Materials are a close preview, not the Unreal shaders (no detail normals, no panning emissive, still screens, 1K textures). Lettering is flat quads here; in Unreal it is projected decals. - The Tenders are linked from `Kazah-stern-cavity-fixedv4.blend` as saved on disk; the file must stay next to this one for them to show. - **Licence**: `kit_export/`, `textures/`, `../anchorage/` and the .blend contain the packs' raw content. Under the Fab licence that may not be published on its own (no public repository or download). The work here only arranges the packs' content. The local Fab library entry for Season 1 carries no "NoAI" flag; for Season 2 the local entry holds only a file manifest; the listing pages were not read.