Finally, I have recently added multimonitor support.
If you've followed Infinity's development for a while, you'll probably go, "eh ? I thought it already supported multiple monitors !?", thinking to Kaboom22's triple-screen setup.
The trick here is that Kaboom's system used a special device, the Matrox Triple head 2 GO to make windows "believe" there's only one physical monitor instead of 2 or 3. It's completely transparent to the program; Windows just reports a single screen of a wide resolution ( like 3840x1024 ) instead of three.
But if you have a multimonitor setup ( 2 or 3 screens ) without this device, like me.. well.. you're out of luck.
A week ago I decided to have a look at adding support for multiple screens into the I-Novae engine.
Technically, it's not so hard. After all, all you need to do is to create two windows, one on each screen ( in case of a dual screen setup ), to create two cameras, and to render the scene twice.
Of course, you get a 2 times slow-down ( or 3 times in case of a triple config ).
Fortunately, I took a different approach. I'm still creating my 2 windows, but I now use the engine's pipeline to create one virtual off-screen buffer. The scene only has to be rendered once. Much better! Then in the final stage, the buffer is shared and split between the windows.
It's also a lot faster in case your second monitor doesn't have hardware acceleration, because technically, the rendering only happens off-screen on the first monitor's device.
To implement all of this I had to tweak many small bits everywhere in the engine, and add new concepts. A few subtle bugs when sharing textures between different GL contexts with the texture cache. A monitor lister. Management of virtual windows. Etc..
The result is pretty cool, and if properly set up, the images are perfectly seamless. For example, consider this one, taken on a dual monitor config, each screen being full-screen 1280x1024 (click for full-screen):
That pic was simply taken with the "Print Screen" key in Windows.
Now, in windowed mode, you can see better how the buffer is split in 2 windows:
Note that nothing forces the windows to get perfectly aligned or to "touch", and they can even be of different resolutions ( meaning that it'll work perfectly even if your monitors have different resolutions ).