I know I'm necroing this thread, but I just started experimenting with swapping out textures, myself, and came across this one while Googling S3DSpy. Awesome!
It's a lot of fun seeing Felwithe (my testing zone) take on a whole new visual life. Even the low poly counts aren't too bad when you've got 1k uncompressed textures on everything instead of 256x256 dxt5. (DDS compression is highly lossy!)
I made a quick app to auto-convert images to DDSes with mipmaps, or .dds files to .png (or another format) for editing.
Makes it mighty easy to extract the files with S3DSpy, convert public domain .png or .jpg or .gif textures to .dds, and swap the new textures back into the .s3d.
The only slowdowns are:
1. Some of the old zones name the textures whatever.bmp, even though they're actually .dds images. You have to rename each new texture as you import it so that it exactly matches the previous filename. Blah.
2. You have to exit the client and come back in whenever you change something in a .s3d zone file. The client doesn't expect those files to change while it's running, so it appears to do some file pointer caching. Swap out a texture while the client's running and try to zone back in, and the pointers will fail for the new texture and everything after, so you get the white surfaces.
#2 you can't do anything about, but I'm looking into whether I can patch S3DSpy so that it'll automatically rename extensions when needed during importing/exporting, and to get rid of that annoying confirmation popup for each imported file.
Some work-in-progress screenshots showing enhanced texturing:
http://imgur.com/a/acJ4p
Fun times!