I should point out that the orientation vectors used here are ... lazy, and so might result in problems (especially with form::rotate).

3dio: Contains 2d/3d geometry, now with groups, holes, and a file format that I *think* is compatible with the JQ3D editor. The biggest change to the engine itself is that the form interface now has a method for intersection with boxes, instead of just spheres, and attempts at making it play nicer with orientation vectors.

Download

Includes2018: Updates to my other includes. The biggest additions here are keyconfig and BGT2py. The former is supposed to make it easier to do Swamp-style keyconfig, including the user-editable file and the ability to identify keys by name (for instance, for a controls menu or in-game instructions). BGT2py is a quick-and-dirty script for converting bgt files to python. It makes no attempt at perfection, just takes care of the most common differences in syntax. You will still have to edit the resulting python file for things that BGT2py missed. It's more a time-saver than a proper converter.

Download

Oh, I completely forgot to mention the fpsound_pool, which wound up with 3dio because it was supposed to allow bounding shapes (that part doesn't work). It basically tries to do Swamp-style first person sound in the sound_pool, instead of the top-down perspective of the normal sound_pool. I think it still has some bugs,—some of my tests had forward and backward reversed when facing along the z axis, but I'm not sure if that's the sound or if it's the movement code I was using.

The confusing part will be the orientation vectors. In 2d, it's just the unit vector corresponding to the angle, effectively (cos, sin). In 3d, it's messier, because I was too confused by rotation and addition of 3d vectors and instead went with (cos(theta), sin(phi), sin(theta)). Which is to say, x and z are for theta, and y is for elevation (phi). Since audio games almost never use elevation, an orientation vector might just be (cosine(theta), 0, sine(theta)). Since this was such a headache with the sum_angle and dif_angle functions, I included variations on those that take the numbers directly, instead of the vectors, but it still returns a 2d vector you'd need to convert

Math contains several new functions for all these angle and rotation shenanigans. See sum_angle, dif_angle, and rotate3d. I found that using sum_angle on very small angles didn't seem to have any effect, so it's certainly still somewhat buggy.

And there are some additions to stdlib, an nv(x, y, z) function for quicker vector creation, whatever.