This one is for the people who like to know how the sausage is made.
If you have played any game on the Spring or Recoil engine in the last fifteen years, you have looked at LUPS. The Lua Particle System, written by jK in 2008, is how most of those games draw everything the engine's own effects cannot: shield bubbles, thruster flames, nano spray, cloak shimmer, shockwaves. It is a remarkable piece of work for its time, and SplinterFaction has leaned on it since the beginning.
It is also a product of 2008. Every effect is drawn one at a time with immediate-mode OpenGL calls from Lua. Every frame, for every particle, Lua decides whether it is visible, pushes a matrix, binds its textures, and issues its vertices. With a dozen effects on screen that is fine. With four hundred aircraft each trailing two or four jet flames, it is a measurable share of the frame, and it scales with the number of effects rather than with the number of pixels.

The alternative
Modern Recoil exposes the same tools to Lua that the engine uses internally: vertex buffers, instanced drawing, and direct access to the per-unit transform and uniform buffers the engine fills every frame. The pattern that follows from that is simple. Put every instance of an effect into one buffer. Draw the whole buffer with one call. Let the vertex shader fetch each instance's unit and piece transform straight from the engine's own data, so the CPU never touches a position at all. The cost of the effect becomes the cost of the pixels it covers, and nearly nothing else.
Beyond All Reason's graphics team, led by Beherith, has been rebuilding BAR's effects this way for several years, and with their permission SplinterFaction has been porting the results. The deferred lights and the screen-space distortion came across earlier this year. This month we moved the three things that were still on LUPS and always on screen.
Thruster flames
Every aircraft and air plant in SplinterFaction has jet flames on its engine pieces, ninety-two of them across the roster. They were LUPS AirJet particles, each one a display list with a two-pass jitter shader, re-evaluated from Lua every few frames.
They are now one instanced draw. Each jet is a single camera-facing quad placed by the vertex shader at the engine piece's live transform, read directly from the engine's piece matrix buffer, so a flame is glued to its nozzle even on an aircraft that is banking hard. The flame shape and its perlin-noise displacement come from a small texture atlas with eight flame profiles, and the quad stretches with the aircraft's velocity so a climbing jet burns longer than a hovering one.

Two things the BAR version did not need and ours did. Our air plants have engine jets that point straight down out of the bottom, and BAR's widget always fired along the engine piece's forward axis; the port honors the emit direction from the config instead. And many of our jets are only meant to show while the aircraft is actually flying, a LUPS feature called onActive; the port polls the unit's active state and adds or removes the flame on the fly, replaying its fade-in each time it lights.

The configuration file did not change. The same ninety-two entries that drove LUPS drive the new widget, and the distortion system reads them too for the heat haze behind each engine, so flame and shimmer stay in step from one source. While porting we also found the old thruster gadget had been loading a config file that does not exist in SplinterFaction, which means it had been silently failing on startup for a long time. It is gone.
Shields and shockwaves
The shield bubbles got their own article, as did the explosion work, so briefly: the shield sphere, the shield jitter and the LUPS shockwave class are all retired. Shields are an instanced draw with per-instance impact buffers; explosion shockwaves come entirely from the GL4 distortion widget, which was already producing them and was being doubled up by the LUPS one for larger weapons.
What is left
LUPS is not gone, and does not need to be. Napalm, cloak shimmer on individual units, nano spray, burning-unit effects and a few projectile trails are still LUPS, and they are fine there: they are occasional, short-lived, and there are never hundreds of them at once. Moving them would be housekeeping, not an improvement anyone would see. The things that were always on screen, scaling with army size, are what needed to go, and they have.
A note on the toggle
All three new widgets hand their effect back to LUPS cleanly if you disable them from the widget list, and take it back when re-enabled. If you have a machine that does not like one of them, you lose the new look, not the effect.
Our thanks to Beherith and the BAR graphics team, whose work this builds on.