Use affine transformations for low-level movement logic
Describe in detail what your pull request accomplishes
This is the first in a (hopefully) series of PRs to converge Movecraft's translation and rotation systems by leveraging affine transformations. Affine transforms offer the ability to concisely represent these operations as a singular composable unit, which makes implementing code using them much simpler than our current methodologies.
One caveat is that the current implementation uses workarounds to decompose the transformations into its component parts (translation and rotation - in general there's also scaling for example). We have no use for more complex operations so they are left out.
To better support this system, it may be desirable to pre-bake the vector representation of our MovecraftLocation into the location objects - this will require performance testing.
Checklist
- [ ] Unit tests
- [ ] Proper internationalization
- [ ] Tested
- [ ] Performance tested