November 18, 2024
status report, ~1yr later
In the last post, I said I needed to start looking for a job. The good news is, I found a job! Less good, finding a new job took SIX MONTHS. woof. I also bought a new house, moved, and sold my old house. I continued to work on the project, but with everything else going on, keeping this blog updated fell by the wayside. I'd like to get back to it, so I'll start off with another status report.
Caution: there is audio in this video, but not until ~3:17
What's new? So, so much. This thing is almost to the point where I feel like all functionality is in place, which is to say the parity I would like to have with rack-proper is pretty close. Some highlights are:
- cable stuff: configurable opacity and tension, color cycling, dangling cables
- user configurable module scale
- file handling: saving and loading patches, new from template, bootstrapping patches with my rack plugin
- simulator state is saved on the unreal side for module positions, etc
- unreal manages loading and quitting rack, and installing and removing my rack plugin
- modules can be snapped together, which rearranges them on the rack side, enabling expanders
- three environments to switch between: a light and a dark abstract void, and a cute little park
- adjustable lighting, including sun angle in the park
- module previews in the library
- configuration menu, filebrowser with keyboard
Here's a more complete changelog for the nerds who like reading changelogs (hey, friend!)
v0.0.1
-
module spawning location/rotation
- previously, this was a direct translation of the 2d position in rack into a wall of modules
-
now,
- when spawned from library, module lands next to library
- when spawned via quick duplication, new module has the same position as original module at time of duplication (as though rubber-stamped)
- when spawned via context menu duplication, new module will land in front of the original
- finally figured out smoothing on held module rotation (location smoothing was already present)
-
actual dev/shipping builds
- rack/oscctrl builds modified to 'install' to unreal build folders
-
unreal manages rack startup/shutdown
- because the oscctrl plugin only works with this custom rack build, and would be useless on its own anyway, we manage the plugin’s installation on startup and its removal on shutdown
- implement autosave-and-shutdown as an OSC command on the rack side (because shutting down the launched proc via unreal force-quits and leaves everything dirty)
-
recovers from error binding port of rack side and chooses new port in a range
- handle two-way OSC port discovery between rack client/server and unreal client/server
- marquee text in context menus only on hover (previous always-scrolling was madness)
-
implement savegames! tied to autosave or patch path, tracks:
- module positions
- library position
- library visibility
- avatar position
- weldments (snapped/expander modules)
-
better grabbable actor setup and code sharing
- fixed library grab outline size
- fixed grab outline position
- refactored grab handling to make it much more reliable and improve the feels
-
major overhaul of param/port/cable interaction
- promote cable ends to full actors
- instead of overlapping interactor component, run line traces on tick for each of param/port/cable end
-
use pub/sub to broadcast targeted params/ports/cables
- avatar responds by setting/unsetting input layer
- controller itself responds by refreshing/toggling tooltip
- cable ends respond with cute semi-plugged state
- cable ends broadcast their snapped-to destination port for the controller’s tooltip
- fix overlap issue with lights<->displays
- fixed a long-standing bug preventing initial light updates (tell rack an unreal-side module is ready to receive light updates only when it actually is, duh)
- fixed a bug with initial texture for active buttons with only one frame/texture
- added controls to summon/hide library [todo: summon only on loaded patch]
- fix issue with grabbable static mesh drifting away from the scene root
- fix positioning freakout on initial grabbable grab
- module snapping: modules can now be snapped together, which will rearrange things to match on the rack side, allowing grouping modules on the unreal side and connecting and disconnecting expanders on the rack side
- pull in data from rack settings.json for recent paths, autosave interval, cable colors, etc
- autosave unreal engine state at same interval as rack patch autosave
- use cable colors from
settings.json
, in case user has changed from defaults - main menu has a ‘save’ button, which saves both the rack patch and the unreal state (module positions, etc.) attached to it
- replace physically-simulated cable component with much more performant (albeit, sadly, much less wiggly) niagara beam/ribbon particle fx systems
- implement controls for cycling color of held cable
-
begin implementation of configuration menu, starting with:
- cable tension slider
- cable opacity slider
- auto-cycle cable color toggle
- replace translucent cable material with more performant dithered/masked material
- build file browser widget for loading patches and “save as” functionality
- build reusable keyboard widget, use for “save as”, library search
- replace existing marketplace plugin svg renderer with custom library based on rack’s rendering pipeline, using vcv rack’s modified nanovg, nanosvg for parsing, and nanovg-nanort for rendering to pixels on the cpu for consistency with rack rendering, eliminating strange rendering of many svgs. any svg that works in rack should work here too now.
- can overwrite template file (i decided to keep a separate template for the sim), which also saves unreal-side positions and such
- three maps, map switching, and lighting controls
v0.0.1-hotfix1
- fixed a crash caused by lights trying to overlap missing params
- stopped built-in controller models from showing
- made the laser pointer thinner
- temporarily removed LCDs (only really used by official VCV stuff like Audio modules, VCA, ADSR, Wavetable VCO etc) because of a weird, outsized performance hit sometimes. this is odd because an LCD is just a rectangle with a shiny material :shrug:
- patched up patch loading a bit, although it remains somewhat buggy and still needs a full rewrite
-
redirected rack’s logs to unreal’s logfile, and made unreal’s logs work in shipping, so now there’s one unified log for racksim
- unified log lives at
AppData\Local\RackSim\Saved\Logs\RackSim.log
- added a bunch of new logging statements to aid in debugging
- unified log lives at
v0.0.1-hotfix2
- fixed an issue with spaces in patch filename paths causing rack to fail loading the patch
v0.0.2
- give initial module positioning (for patches without a racksim save) a more ergonomic tilt
- fix plugin name/favorite star overlap in library
-
main menu is still ugly, but is now slightly less ugly
- added custom checkbox buttons and labeled sliders to help clean things up
- added settings for showing and hiding controller tooltips and lights. hiding controller lights should hopefully improve performance pretty significantly.
- save configuration settings (cable opacity/tension, auto-cycle cable colors, show controller tooltips, show controller lights) between runs
-
increase knob sensitivity. it is now easier to turn a knob from fully down to fully up with one wrist motion.
- added control for more precise knob turning–hold near button (X/A) while turning knob for precision mode.
v.0.0.3
- allow custom scaling of module size. 1x lifesize is very small, so we default to 1.667x (roughly 5U/moog size) for legibility and ease of use, but allow user adjustment on a per-patch basis
-
add precision step controls for custom labeled slider widget
- update lighting and scale sliders to use step controls
-
library updates
-
add module previews!
- will ask to generate previews, once per session, if any are missing
- manual preview (re)generation in settings
-
flesh out summoned module parking next to library
- newly spawned modules now form an orderly queue next to the library
- modules stay attached to the library until they’re moved somewhere else
- tighten up various buttons’ hit zone sizing
-
add module previews!
- cable particle fx automatically tracks cable end movement, simplifying a lot of the cable/end logic