What would it actually take to have 3D graphics in BYOND?
It could take a lot of work to make a BYOND client that draws 3D graphics but that's really all it would take. A lot of the built-in stuff (tile-based maps and movement, density, etc.) would translate easily to 3D.
This post explains what modifications (i.e. what additional built-in variables) BYOND would need to be able to display simple 2D games like Spies in 3D. Obviously you could do much more to extend BYOND's 3D capabilities than what I mention here but I'm looking for a bare minimum feature set - only what you need to convert existing games to 3D. We can worry about how to extend the system later.
Tiles can now have height. This height can be a single setting for a whole tile. For example:
The brick walls have a height of 32. This makes them appear raised.
Height could be specified for a whole tile, a side of a tile, or a corner of a tile. The most specific value that you've defined is used. If you set the height to 32 for the whole tile then each corner inherits that height. If you set the height to 32 but the left side's height to 0 then the top-left and bottom-left corners inherit the zero height and the other corners are 32 (this could be used for creating stairs and ramps).
You could also include a setting for the bottom of a tile so that objects could appear raised in the air. This could be handled by pixel_z because the behavior is similar but there might be reasons to differentiate.
You might also want the sides of a tile to have a different texture than the top. You'd need settings for the sides as a whole and as individuals. This would work similar to the height settings where the most specific setting is inherited.
By combining these settings you could create tiles that appear to have a wall on only one side (like a fence). The built-in density system could be extended to also include per-side density settings. You could have a tile whose north side is dense. You can only enter/exit the tile from the east, south, or west.
You'd need different display settings for sprites. Some should appear standing up, some should appear flat, some should always face the camera. For example:
You want the player to stand up but the footprints to be flat. Combined with an atom.angle type of variable this should allow for almost anything you'd need.
You might also want an object to be shown as a cube (like how I represented turfs). The settings I described for turfs could belong to /atom/movable too and you'd have a variable to determine whether the atom is drawn as a sprite or a cube. This could just be part of the display options (standing, flat, billboard, or cube).
The client's eye would need more settings too. The exact variables needed would depend on how much flexibility is given to the programmer. It could be as simple as setting a couple of angles and the amount of zoom.
What You Get For Free
Dynamic colored lighting (image)
Isometric view (image)
First-person view (image)
Custom camera control - rotate the camera, zoom in, zoom out, etc.
Some existing features might be hard to translate to 3D. I'm not sure how layering would work (the built-in layer variable) because 3D gives you z-buffering for free. I'm not sure that everything you can currently do with layers could be easily done in 3D, but I'm also not sure that you'd need to or want to.
Is there anything else you can think of that would need to be added to BYOND to support a 3D display mode?