It requires a bunch of rewrites and it's scary because our MP is working great and this is just going to mess stuff up again.
The initial work is fairly easy. Keep the drawing code on the main thread and move all the logic/updating code to a new thread. Lots of easy bugs and it works. Picked up around 10 frames. But I noticed something odd, every once in a while, on 1 frame a guy would be drawn in the sky, then immediately back to the ground. I ignored it for now and went to try MP. Basic crashes, basic fixes. Go it running, though there are still kinks to work out. Then I hit a snag, out of sync. Repeatable, a few minutes in every time. It was the height again. The same drawing error was now being used in the logic and causing an out of sync. I narrowed it down to the height function. I went through all my code and could not find an error. So I had to go into the powerrender code. Could not find a problem there either.
Looked closer, there was a define in there that led me to some assembler code. I don't really know assembler, but I found a class variable being used as a temporary holder (BAD IDEA IN THREADS).
In case you are still following me

PR:height()
{
int a;
PR:temp = a;
// some calcs
return a;
}
not the real function, but you can see what's not threadsafe. Because if two different threads enter this function at the same exact time, they are both trying to set the same variable, PR:temp and use it. So this is not threadsafe. The local variable (a) is ok because it's different for each instance of the function. But to save a temporary variable in a common location is not good. Not threadsafe.
So what was happening is that they both ran this function at the same exact time, so which ever function was last, got PR:temp set, then they both used that value. So for 1 frame you had a bad value for terrain height.
I know, it's techy, but thought I would share and document before I forget what I did. In order to work so many different pieces of code I have to learn a lot about unfamiliar areas. I'm pretty good at that, but the downside is that I braindump information just as fast, so I'll forget what I did. So I document a lot and put in comments to remind myself where I've been and what I've touched.