--- OVERHAULS --- Overhauled turbo note testing! This is now front-and-centre (or, rather, top-and-right) in the menu as a little "test preset" toggle near the tooltip display, to encourage more people to use it. Turbo note testing is now fully configurable in terms of notes per second, duration range, velocity range, and random notes are deterministic with a seed! Random generation can also be looped after a set period of time, giving very repeatable stress testing if you're performing benchmarks. There are three baked in presets for testing, see if you can run "heavy"! Overhauled pulse animation! Pulses can now respond to note-off events in a similar way to particle systems, and have a variety of powerful fade-out modes. I'll have to try and re-word this for the full release, it's a little hard to explain, but just play with them! - Standard: pulse spawns, travels through its lifetime, and destroys. Old behaviour - Hold: pulse spawns, travels through lifetime to the given stopping point, waits for note-off and then travels through the rest of the lifetime - Reverse: pulse spawns, travels through lifetime and holds at the end. On note-off, pulse travels backwards through lifetime and destroys at the 0.00 point - Ping-pong: pulse spawns, and continually cycles towards 1.00 lifetime and back to 0.00 until note-off is detected. Upon note-off, pulse will keep travelling through lifetime until reaching the next 0.00 lifetime point Additionally, pulses can now have an additive shader mode, have an additional Y-height-by-lifetime variable, a Y-height-by-velocity multiplier, key-type-based stretching, random sprite start frame and direction toggles. Coming soon: pulse templates, and a bunch of cool default pulses to use! Overhauled general performance (again)! This is technically "only" a bunch of optimisations, but it's getting it's own overhaul listing because I want it at the top of the changelog. Thanks to note light optimisation, culling some branches on note objects if they're not needed, and some preset tweaks, Keysight now runs significantly faster! It's hard to put numbers on this, since it's highly dependent on hardware and the update is not finished, but I am seeing between 15-60% GPU performance uplift on my own system! Overhauled mask mode! Or rather, added some in-Keysight configuration to what was previously a binary switch. You can now control which elements in Keysight are masked and which are not, allowing for alternative implementations where the backdrop is opaque but notes are see-through, revealing the source behind Keysight. Note that masking only works for non-translucent surfaces, so things like particles and pulses can *never* be masked as they have the ability to be semi-transparent (same goes for transparent note objects) Overhauled texture loading! If you're a custom texture enjoyer, things just got a lot faster and easier. After dropping in a new custom texture, simply open the texture dropdown to trigger a module-specific reload of custom user textures. This removes the clunky "click to refresh" button and several-second wait time as Keysight reimported all textures rather than just the ones you changed. Engine textures (those found in Keysight/Default textures) only load on launch, so these cannot be changed while Keysight is open (but you probably shouldn't be changing these in any case) --- SMALL ADDITIONS --- Added FPS counter toggle to Graphics > Framerate Added extra world-space opacity masking to pulses! Think of this as applying another mask layer that is "independent" to the pulse. This extra mask layer allows pulses to "reveal" patterns as they move! Works especially well when combined with a blended backdrop or an overlay with matching texture mapping Added texture size slider to Basic menu Note Objects Added texture size slider to Basic menu Keypresses Added intended file path location (platform specific) to open-folder icon buttons, just in case these buttons fail and you need to navigate there manually (as has happened to one user, that I am aware of) --- CHANGES --- Changed text colour for slot display of colour pickers to be static white with black outline, rather than inheriting menu style colour Changed randomizer pulse generation to pick two values for min/max between 0.0 and 1.0, rather than one number from 0.1-1.0 and another from 0.75-1.0. This functionally means pulses will commonly be a lot less opaque Changed Overlay to not mask in mask mode by default Changed "apply to all" button in material picker to have a unique icon Changed "open folder" button to have a unique icon Changed dampers to not cast shadows, as typically these are not even lit by impact lights and if they are, they functionally cast no shadow anyway Changed damper models to overhang eachother very slightly. This should fix render bugs where it was possibly to see a one-pixel gap between some dampers when there was no gap Changed randomizer Advanced material randomization to force 52-size texture mapping with no rotation if it picks a custom texture for colour, along with forcing "Concrete" on all other material slots. This allows randomization to custom images in such a way as to not have them tile badly or be rotated if they apply to the backdrop Changed all default presets to have 0.25 white key offset. This puts them slightly above the backdrop, which stops angled indicators clipping through dampers slightly and assists in layering effects Changed all default presets to use 25.0 impact lighting radius rather than 30.0, as this has a 5-10% GPU performance benefit for a minor visual change Changed internal engine timecode. This may have implications for frame sync becoming better with applications like OBS, but it may also have done nothing and had no impact Optimised a bunch of note-on related internal data setup Optimised "ratcheting" for Static colour mode Optimised note light attenuation radius. This on its own gave a huge GPU performance boost. By isolating only note objects and note lights in a preset and running at 2880p for maximum GPU stress, things ran 70% (!) faster. At a more reasonable 1440p with the Honey default preset, this drops to 36% faster. Note lights behave very slightly differently at small sizes as a result of the radius optimisation, but you would not be able to notice this without direct comparison and it's well worth the performance improvement! Optimised checks for whether note objects should dynamically set colours. Unless you use a blended material on both note objects and borders, with dynamic colours on every colour slot, you can expect to see up to ~40% CPU performance improvement! (Tested with camera looking away from preset, 25% resolution scale, running Chopin midi file using Keysight preset to isolate pure simulation cost) Optimised pulse dynamic colour setting Removed ability to up-convert old data, and stripped out a ton of un-used preset data from JSONs Removed refresh texture buttons as these are no longer needed Removed manual debug simulation mode resetting scene upon unpause --- BUG FIXES --- Fixed pasting core settings not updating variable display Fixed colour slots for static mode "de-syncing" when changing slot count while things are spawning until a preset change is called Fixed "reload preset" midi hotkey being straight-up broken and non-functional Fixed Mask Mode "x-ray" stenciling the frame through the backdrop when using non-standard top-down angles, resulting in weird patches of always-visible backdrop. Mask mode now evaluates depth of the stencil pixel versus the normally-rendered pixel and only masks when the stencil is not behind something else Fixed shadows not rendering on piano keys with a shorter length than around 0.65 Fixed min/max effect bounds in 2-axis and slider not inheriting text colour from menu style Fixed camera reset hotkeys not triggering variable update in menu Fixed random seed entry (both in the menu and via websockets) not allowing a minus sign as part of the seed. Now, typing in -10 actually gives you -10 and not just 10 Fixed issue with effects disappearing when a note-off and note-on (or two note on events back to back) happen at the same time. This introduces a bug where if two note-on events occur in one frame, two sets of effects will stay active until the key is released, but I've only been able to make that happen with edited midi files and not with real performance Fixed ability to set undefined textures by adding a custom colour map and selecting it in basic mode on note objects/keypresses/backdrop Fixed Transparent material mode just... not having emissive colour texture options, despite supporting these (and the randomizer randomizing to these sometimes) Fixed greying out of colour tab in material menu when using Advanced mode with base colour using texture but self-emissive colour using colour settings Fixed a randomizer slider having an incorrect title Fixed note objects in manual simulation mode not having one of their caps