1. You don't need an engine to make a FPS.
2. You don't need quaternions to make a FPS.
Frankly you don't even need SIMD (outside of what compilers spits out for you on release build) or multithreading.
People have this tendency here to over-complicate things.
You can even initially avoid shaders to reduce scope of things you have to learn at once.
Take a look at CUBE game,
http://cubeengine.com/cube.php.
And how little code it has, even though it has multiplayer and a built in editor.
And frankly the code here could even be shorter since CUBE does occlusion culling to avoid overdraw, and you can really just use one VBO (or couple of chunked VBOs for the whole level).
You can have a simple CUBE or voxel like *engine* in something close to *zero lines of code*.
All you need is a good understanding of vectormath, matrices and transforms. Plus basic OpenGL and GLFW/SDL.
You can bolt on things on top of that quite easily once you've got the hang of it.
Quake2 like engine is slightly more complicated. Collision detection & response is more tricky, and lightmap baking is more involved (or you can use an external tool for that). But it still can be pulled of with very low LoC.