Commit graph

31 commits

Author SHA1 Message Date
5e18cb84a1 MCP: localhost agent server with reloadable S3.Mcp.Tools plugin pack
Loopback MCP host with observe/control/develop gates and a hot-reload
tools DLL. Default token is local-dev only. Leave the module off unless
you are driving S3 from an agent.
2026-09-11 15:19:24 -04:00
48c9b97029 IndustryTags: in-world business, track, and yard callouts
Live industry/track/yard labels with cached and staggered updates so
the old 10-12 ms/frame cost near busy areas is gone. /s3ind dump
writes a session dump.
2026-09-11 15:19:24 -04:00
cc552a0246 CarCards: fanned consist dock with notes, actions, and WQ cut dividers
Shows the selected cut as a fan of cards with waybill, notes, and
couple/handbrake/locate actions. WaypointQueue cuts appear as dividers
when that mod is present.
2026-09-11 15:19:23 -04:00
5187c03ebe QuickActions: outer-ring cut/couple actions and consist hover wheel
Adds end-gear couple/air/cut on the vanilla pie, plus a consist wheel
for set-lead, brakes, bleed, air, and idle without opening extra windows.
2026-09-11 15:19:23 -04:00
16d118c4a9 MiscTweaks: cancellable autoload of the most recent save
From the main menu, a short countdown loads the newest save.
Any input cancels so a misclick does not dump you into a session.
2026-09-11 15:19:23 -04:00
9f2097e579 Map: view presets, waypoint pins, and TrackLabelService
Named camera bookmarks, Auto Engineer / WaypointQueue pins, and
extracted track labels. Stock MapWindow stays collapsed while S3
owns the camera. Radio Runner is not in this drop.
2026-09-11 15:19:23 -04:00
290211e9e8 Profiler: automated /s3bench harness and hitch probe capture
Four-pass stationary/motion A/B plus per-frame hitch attribution
(GC, camera, streaming, car/scenery probes). Writes frames.csv,
hitches.jsonl, probes.csv, and an optional Unity binary log.
2026-09-11 15:19:22 -04:00
e8aeb2d6a3 BaseGamePerf: GC smoothing and Nature Renderer grass streaming caps
Spreads incremental GC across more frames and caps grass-cell work so
abrupt camera looks hitch less. Density, draw distance, and simulation
stay the same. Original values restore when the module is disabled.
2026-09-11 15:19:22 -04:00
7acf6b6841 Core: log ring buffer and live module TrySetActive
Agents can read recent S3 log lines without scraping UMM files.
TrySetActive changes session state only, so benchmarks and MCP
can toggle modules without writing the UMM enabled flags.
2026-09-11 15:19:22 -04:00
1d4d5a6312 Build: ignore local Railroader logs copied into the repo 2026-09-11 15:19:21 -04:00
b25496bbe4 PhysicsOptimizer: lower default resync interval to 1/4
1/8 caused intermittent physics instability on busy saves. 1/4 is a
better balance between update frequency and stability.
2026-09-11 15:19:21 -04:00
aec4d2ecc4 Bump version to 0.2.7
Skip 0.2.6: this rolls up two releases' worth of work (the Mesh LOD and
Profiler modules and the map labels). Add 0.2.7 to the update manifest and
drop the oldest entry to keep the last three releases listed.
2026-06-25 20:15:02 -04:00
92649801c2 Document Mesh LOD, Profiler, and map labels
Add README sections for the two new modules (Mesh LOD and Profiler) and the
track and industry label feature, with settings screenshots, the unified
overlay shot, the three-level LOD comparison, and the label demo video. Update
the module table and remove the profiler-overlay mention from Physics
Optimizer now that the overlay lives in its own module.
2026-06-25 20:14:57 -04:00
eb6699f23f Fix proxy box color, mesh leak, and stale comment
The Mesh LOD proxy box rendered flat gray instead of the car's color. It was
being given a shared material tinted via Material.color (the legacy _Color
property), which URP ignores in favor of _BaseColor, and a single shared
material cannot match each car anyway. Reuse the car's own material so the box
matches its color again.

Also destroy the proxy box mesh when tearing down or refreshing a car's LOD
(the GameObject was destroyed but the Mesh leaked until scene unload), and
prune dead weak-refs from the tracked-car list periodically so it cannot grow
unbounded across a long session.

Fix a stale comment in PhysicsTimer that still referenced PhysicsOverlayGUI
after the overlay moved to the Profiler module.
2026-06-25 20:14:52 -04:00
4853015eff Profiler: new unified overlay module; absorb PhysicsOverlayGUI
Add a standalone Profiler module (S3.profiler.json, disabled by default)
that hosts the in-game frame-time overlay previously owned by Physics
Optimizer.  The overlay now adapts to whichever modules are enabled:

- Always shows: render + physics frame-time graph, timing report.
- Physics Optimizer section (if enabled): LOD fast-path and auto-freeze
  quick-toggles with live stats, debug car count line.
- Mesh LOD section (if enabled): total tracked cars, loco/freight split,
  per-LOD-level counts refreshed once per second.

PhysicsOptimizerModule retains only the Harmony patches and
CarDebugVisualizer; ShowOverlay/OverlayOpacity removed from PhysicsSettings.
MeshLodInjector gains GetLodStats() and GetLodLevel() for the overlay.
BBox material shader search now tries URP/Lit before Standard.
/rpf overlay toggle redirected to ProfilerOverlayGUI.Instance.
2026-06-25 19:06:46 -04:00
1b4ab97be5 MeshLOD: polish settings fields, bbox material, tracked car count
- Rename all MeshLodSettings public fields to camelCase (consistency
  with every other settings class in the project).
- Replace the proxy-box renderer's borrowed car material with a shared
  matte Standard material tinted to the car body albedo; cheaper at
  LOD3 distances and responds correctly to scene lighting at night.
- Expose GetTrackedCounts() and display loco/freight breakdown next to
  the Refresh Now button in the settings panel.
2026-06-25 18:57:50 -04:00
fcfdc6fba0 Map: fix T key teleport in overlay and popout; pass M through when module disabled
Overlay: our IsMouseOverGameWindow patch was blocking StrategyCameraController.TeleportToMouse()
as a side effect. Added native export RRPOPOUT_GetOverlayMouseMapPos (stores imgPos atomically
each render frame, returns normalized map-image cursor coords) and handle the T key directly in
UiHost.Update(), invoking MapDrag.OnTeleport with the correct viewport position. MapDrag.Update()
stays gated behind _pointerOver which never fires on our collapsed canvas, so there is no
double-teleport.

Popout: T key does not fire through Unity Input System when the game window lacks focus. Added
GetAsyncKeyState(VK_T) rising-edge detection in DetachedPanel.Update(), using the last MouseMove
event position (tracked before the drag-only guard) as the viewport coordinate.

Module disabled: all three MapWindow_Toggle/Show/ShowPos Harmony prefixes now pass through to the
game's native map when PopoutModule.Settings.enabled is false. Previously UiService.Install()
always applied the intercepts regardless of module state.

Also removed F10 as a shortcut to switch to the popout - F9 already does this and F10 conflicts
with the Shift+F10 UMM hotkey.
2026-06-25 18:16:49 -04:00
c5e75ad54a track and industry labels on map; Mesh LOD module skeleton
Map: per-track industry labels rendered via Dear ImGui on both the popout
and in-game overlay. Three zoom stages - per-track labels, merged same-name
clusters, and one-per-industry labels at wider zoom. Settings: font size
(min/max with zoom scaling), leader lines, parallel rotation, collision
spread, utility track filters (repair/diesel/loader/interchange), zoom
thresholds per category. C# runs a world-space AABB solver at rebuild so
offsets are rotation-invariant; native runs a per-frame screen-space
fine-tuning pass and draws leader lines.

Mesh LOD: new module skeleton with 4-level LOD group injected on
HandleModelsLoaded - three progressive renderer cull tiers (sorted by
bounds volume) plus a 12-tri proxy box at max distance. lodBias-corrected
distance-to-screenHeight conversion. Debounced live refresh on settings
change. Disabled by default.
2026-06-25 12:33:37 -04:00
c918dd7867 Fix release URL pattern in repository.json (no v prefix on tags) 2026-06-22 19:14:12 -04:00
29689f8a34 Include last 3 releases in UMM repository manifest 2026-06-22 19:12:21 -04:00
55bc84412a Add UMM auto-update repository manifest 2026-06-22 19:11:43 -04:00
2343f05b18 README: note 3-12 FPS improvement from icon culling 2026-06-22 18:53:18 -04:00
edf6a8a14e Map Module 0.2.5: icon culling, EOTD, gear menu icons, font fix
Icon culling hides car icons when zoomed out past a configurable threshold
(default 40%), keeping only locomotive icons visible. Locos scale up
automatically when culling is active (configurable boost). An option also
hides MU trailing units. All managed by the new MapIconCuller class with
smooth fade transitions.

EOTD (End-of-Train Device): a blinking red dot at the rear of each consist.
Shown by default when car icons are hidden. Dot size and visibility conditions
are configurable. Implemented in EotdSystem as a programmatically generated
circle texture to avoid asset dependencies.

Added an Icons submenu to the gear menu containing all icon and EOTD settings.
Controls grey out to reflect dependencies: culling sub-settings (MU hide, loco
boost, EOTD) grey out when culling is off; EOTD dot size and hide-when-visible
grey out when EOTD is off. Changes round-trip via UICmd events, persist to
PopoutSettings, and call MapIconCuller.Refresh(). Native state is seeded from
C# on window init via RRPOPOUT_SetIconCullingState.

Settings completeness: added Right-click recenters toggle and Map BG opacity
slider to the UMM settings panel (were only accessible from the gear menu).

Replaced four FindObjectOfType<MapWindow> calls with PanelFinder.GetMapWindow().

Fixed AV false-positive on release zips: ImGui's built-in font blob contained
the substring "UPX", matching the heuristic for UPX-packed binaries. Added
IMGUI_DISABLE_DEFAULT_FONT to strip the blob; ProggyClean.ttf is now shipped
as a separate file alongside the DLL and loaded at runtime instead.
2026-06-22 18:46:12 -04:00
c8918851aa v0.2.4 - MapEnhancer version detection
Probe for version-specific types at startup to determine which MapEnhancer
build is installed, then gray out features unavailable in that build.

Three tiers: official v1.5.2 (minimal), v1.6.0 (adds turntable markers),
and the community fork (full feature set). Detection uses type probes -
TurntableHelper for the v1.6.0+ tier, SwitchResetAuditState for community.

Adds HasTurntable and IsCommunity capability flags on MapEnhancerBridge,
imMEHasTurntable/imMECommunity atomics on PopoutWindow, and a two-arg
RRPOPOUT_SetMapEnhancerCaps export. The renderer reads both flags and wraps
community-only menu items in BeginDisabled blocks accordingly.

Updates README with version compatibility notes and comparison screenshots.
2026-06-21 15:12:56 -04:00
4391d96e70 add opacity media and fix readme paths 2026-06-19 08:52:54 -04:00
dd1af2ec30 v0.2.3 - MapEnhancer settings panel, opacity controls, right-click recenter
Extends the existing MapEnhancer gear menu integration with a full settings
panel covering the options added by the community fork: marker visibility
toggles, scale sliders for flares, junctions, track lines, and crossings,
and bulk switch reset buttons.

Also adds pan-cancels-follow and right-click to recenter on player toggles,
three independent opacity controls (Window, Map Elements, Map Background),
a per-element hover minimum of 50% for the window chrome so controls stay
reachable at low opacity, and fixes to make the compass and toolbar correctly
respond to their respective sliders. Both surfaces (in-game overlay and OS
popout) maintain parity on all new settings.
2026-06-19 08:32:05 -04:00
b85a492bd6 fix video embeds with absolute raw URLs 2026-06-18 21:54:37 -04:00
97eb320e0f v0.2.2 - map module themes, custom colors, in-game overlay
Map module:
- In-game overlay (UiService) with full map chrome matching the popout
- Six themes (S3 Dark, Railroader Classic, Night Mode, Hi-Vis, Retro Terminal, Custom)
- Per-element custom color editor with hex input and live R/G/B/A sliders
- Independent window and map opacity controls
- Theme and opacity changes apply from both the in-game overlay and the popout window
- Renamed module display name from "Map Popout" to "Map Module"

Native engine:
- SnapshotTheme() helper reduces per-frame mutex acquisitions from two to one
- Toolbar button text color auto-contrasts against the button background
- Compass colors driven by theme data

README:
- Logo, screenshots, and videos for all features
- Physics Optimizer before/after profiler comparison
- Correct MapEnhancer link (maintained fork)
2026-06-18 21:30:53 -04:00
914597b717 Update .gitignore 2026-06-18 10:58:54 -04:00
a4d3cd1621 feat(map): S3 v0.2.1 - in-game overlay, M/F10, popout restore
Replace the bare-bones stock map with a full Dear ImGui in-game overlay
(M key). The overlay shares the same toolbar and compass as the OS popout
window: Follow, Pop Out, Gear, rotation compass.

Pop Out button is now in the bottom toolbar where it is actually visible.
Pressing it (or F10) closes the overlay, waits 0.5 s for the camera to
release, then opens the OS popout window. Closing the popout restores the
overlay if it was running when the launch was triggered. Pressing M while
the popout is open closes the popout and reopens the overlay.

Harmony patches intercept MapWindow.Toggle and Show so base-game "Show on
map" links and the map hotkey both route through the S3 overlay. MapBypass
lets internal S3 calls through without triggering the patch recursively.

Camera ownership is enforced in LateUpdate so no base-game script can reset
targetTexture before the camera renders. Object.Destroy replaces Release()
on both RT teardown paths so the D3D address stays live until end-of-frame
and cannot be recycled into a new RT mid-frame.
2026-06-17 22:25:48 -04:00
a1fcf01125 Initial commit: S3 - Seton's Special Sauce v0.2.0
Consolidates two standalone Railroader mods into one UMM "everything mod"
with an optional-module framework. Modules are disabled by default and
toggled per-module from the S3 settings page.

Core framework:
- IModule contract plus ModuleRegistry, with each module owning a Harmony
  instance scoped by its id so only enabled modules patch the game
- Per-module flat JSON settings (SettingsStore). On this Mono runtime
  JsonUtility silently drops nested custom-class fields, so settings stay flat
- Foldout-per-module settings panel plus a detector that offers to disable the
  old standalone mods if they are still installed

Modules (moved over to parity, verified in-game):
- Physics Optimizer (was RailroaderPhysicsOverhaul): LOD fast-path and
  auto-freeze, profiler overlay, debug car tinting, /rpf console commands
- Map Popout (was RRPopout): native map detach window. Pure-UMM install that
  drops the winhttp proxy and LoadLibrary's RRPopout.dll from the mod folder.
  Native Win32 + D3D11 + Dear ImGui engine included. Fixes a latent break where
  the now-private MapBuilder.UpdateForZoom() is reached via Traverse.

Build: dotnet for the managed assembly (netstandard2.1) and CMake for the
native DLL. build-local.ps1 installs into the game, build-release.ps1 packages
the UMM drag-install zip.
2026-06-17 14:17:41 -04:00