I decided to take a look into adding collision into the RetroCopy virtual room, which may seem like a simple task but it's not as easy as it first seems.
When you can visually see the 3D world with your own eyes, you think, "hey that should be easy to know that you can't walk through that wall there because you can see it". But in the 3D graphics world you have data which is relevant to graphics cards (vertices, triangles, etc) but not so much to a physics world where collisions can occur.
Most 3D games have data structures which hold things like "there is a wall here" (a lot of games use something called BSP trees) which form the basis of their level design. From that data, they can form graphics data and collision data, etc.
RetroCopy on the other hand has no concept of a level in the way games do. There is only one area, with 4 walls a roof and a floor. Inside that area objects are placed, using certain rules, so there is a crude form of box collision testing already in RetroCopy.
However when you want to do something more advanced, like say, jump around the virtual room using a virtual character then you need something more advanced than "there is an object here you can't be here". If I used the existing collision information then if you jumped on the couch you would be floating on the top of it instead of say standing on a cushion. Rather unrealistic.

So I had a quick play around with some techniques to do better collision detection so that virtual characters can start inhabiting it. In the above screenshot you can see one method I tried, voxels. Basically we split each object up into a 3D grid, if we detect that there are any polygons in a specific cube in that grid we know that the player shouldn't be able to be there.
One problem with voxels though is they eat up memory and are rather computational the smaller you make them (the smaller they are the more accurate they are to the object). Memory isn't really a concern with RetroCopy as anyone with a modern computer has at least one GB of RAM and RetroCopy at startup only uses about 80MB. The biggest issue though is the amount of CPU it takes to process the objects, on my CPU it's only a few seconds but seeing as a lot more data will be added in the future I don't think it's a worthwhile method to continue with.