After about a month of ultra-slow progress, per-triangle picking is finally done. It's really not that picking is a difficult problem, it's just that the framework to do it correctly and efficiently took a good deal of work. It required implementation of AABBs, ray structures, ray/AABB collision testing, ray/triangle collision testing, and, finally, CPU-side vertex buffers for fast memory access.

It may not be the most complex human-computer interaction ever, but being able to drag the output of Crawling Cubes around the screen sure is fun.