I think that you're maybe a little over-pessimistic. First off, the CPU cost of glBindTexture() is fairly high, regardless of the GPU and the size of the texture.
Let's look at the rendering process for the game (insofar as I understand it:
1. Background
2. Back-most elements (PlanetAPIs etc.)
3. First round of JitterUnder elements for ShipAPIs
4. First round of ShipAPIs
5. First round of damage decals
6. First round of WeaponAPIs
7. First round of JitterOver for ShipAPIs
8. First round of Jitter for WeaponAPIs (I presume Glows are also drawn during that pass)
...keep going...
So, yeah, there are a
lot of rendering processes. But a lot of them would involve just
one atlas; a 4096 texture could easily hold every weapon, barrel and projectile graphic for every weapon in the game (and frankly, also hold most of the particles, damage masks, etc.).
For most things in this game, especially all of the stuff that gets drawn to the screen in many places per frame- everything from weapon sprites to projectiles and particle effects... it's almost certainly a huge win to use atlases.
Five machine-guns on a ship, for example, is at least five glBindTexture() calls, if it's brute-forced every time (which of course, I don't know how that's being done; I presume it's a little slicker than that). Each time that gets called, there's a delay as the GL state is changed. So just avoiding that by doing one binding per frame for every one of these things, or at most two, is a big optimization.
Where is an atlas approach
maybe a bad idea?
The unfortunate answer is that ships themselves might be the no-go. Hard to say without actually trying it out, though.
There's no point in binding a 4096 to render
one ship on the screen, when one 128X128 would suffice.
It's almost impossible to predict how many ships would require how many atlases, either.
However, how many 4096's do you need, to fit
all of the ships in the game into one glBindTexture operation? At a guess, maybe 2 for all of the current ships in the game, at most. Especially if the ships are atlased using their collision borders with a padding around that, although then we're getting into some
fairly advanced atlas-construction techniques.
If the ships are sorted by the texture they need before passing to rendering, then it should be fine.
Anyhow... ultimately, atlases are one of the answers; if implemented as described above, the biggest issue would be that SpriteAPI calls from mod-side code would harken back to the atlases; there's where things would get a little ugly, since we'd need the UVs, etc., if we're doing anything like what I'm doing (getting texture ids, binding them, etc.) but that's not the end of the Earth (I figure anybody doing something crazy like that probably knows a thing or three).