Back on the engine front there is good and bad news. The good news is that I've implemented some very simple bots (all they can do right now is connect and spawn) which allows me to do some load testing with more players than I could simulate using actual computers. The bad news is that the engine failed the load test. Not badly, and not in the way I thought it might, but it still failed. I was half expecting the netcode to blow up with 20 players connected, but in fact that held up pretty well.
Unfortunately the rendering and animation parts didn't scale in an acceptable fashion. They work, but the performance is abysmal, even on my 3.2 Ghz Q6600 (as can be seen in the attached screenshot). Obviously this needs to change before the game will be playable, although whether there will ever actually be 20 players on a server at the same time remains to be seen.:-)
I've managed to make some progress on optimizing the bottleneck code so the framerate now is nearly double what it was before I started, but it's still too slow to be acceptable. The positive is that I haven't done much optimization on the function that is the top CPU user according to my profiling. Unfortunately the negative is that there isn't much low-hanging fruit to be optimized away there either. Clearly there is some way to get this working since there are plenty of games out there with more than 20 players and more complex models than mine that run perfectly fine. I just need to figure out exactly how they pull it off.