While I was looking up various bits of code in OZMAV while hacking away on SM64toZ64, I couldn't help but notice how convoluted OZMAV's code was. It's not exactly logically structured, it's highly dependant on the Windows API and it's full of non-working and/or commented out sections of code.
So, pretty much on a whim, I decided to restart it from scratch and do it differently - among other things, it's gonna be "semi-cross-platform" from the start. That means, while the platform-specific code for both Win32 and Linux/X is in the same branch, wrapper functions and a bunch of "#ifdef WIN32"s (plus different build targets) make the same code compile on both platforms without any changes. An example:
The line
if(oz_InitProgram(APPTITLE, 640, 480)) return -1; is in the main function, some lines above the main loop. That calls the following function:
int oz_InitProgram(char * WndTitle, int Width, int Height)
{
#ifdef WIN32
return WinAPIInit(WndTitle, Width, Height);
#else
return XInit(WndTitle, Width, Height);
#endif
}The function WinAPIInit inside __win32.c contains the window creation and OpenGL initialization code for Windows (CreateWindowEx and the like), while XInit inside __linux.c contains the same for Xlib (no GTK or anything yet). Probably still an ugly hack, but hey, it's working well enough on both OS.
...but tl;dr, after the Experimental N64 Object Viewer and OZMAV, here comes the semi-cross-platform "OZMAV2" (tentative title):

(and no, that's just some OGL demo code being rendered there, I've only barely started interpreting the map and scene headers...)
EDIT: Prior to going to bed, two more screenshots demonstrating the "semi-cross-platform-ity":


No code changes, just built target "Debug - Win32" and "Debug - Linux".