Just some quick comments . . . .
Code:
142 const matrix4 operator* (const matrix4& other) const{
143 return matrix4(mat[0]*other.mat[0] + mat[1]*other.mat[4] + mat[2]*other.mat[8] + mat[3]*other.mat[12],
144 mat[0]*other.mat[1] + mat[1]*other.mat[5] + mat[2]*other.mat[9] + mat[3]*other.mat[13],
145 mat[0]*other.mat[2] + mat[1]*other.mat[6] + mat[2]*other.mat[10] + mat[3]*other.mat[14],
146 mat[0]*other.mat[3] + mat[1]*other.mat[7] + mat[2]*other.mat[11] + mat[3]*other.mat[15],
147 mat[4]*other.mat[0] + mat[5]*other.mat[4] + mat[6]*other.mat[8] + mat[7]*other.mat[12],
148 mat[4]*other.mat[1] + mat[5]*other.mat[5] + mat[6]*other.mat[9] + mat[7]*other.mat[13],
149 mat[4]*other.mat[2] + mat[5]*other.mat[6] + mat[6]*other.mat[10] + mat[7]*other.mat[14],
150 mat[4]*other.mat[3] + mat[5]*other.mat[7] + mat[6]*other.mat[11] + mat[7]*other.mat[15],
151 mat[8]*other.mat[0] + mat[9]*other.mat[4] + mat[10]*other.mat[8] + mat[11]*other.mat[12],
152 mat[8]*other.mat[1] + mat[9]*other.mat[5] + mat[10]*other.mat[9] + mat[11]*other.mat[13],
153 mat[8]*other.mat[2] + mat[9]*other.mat[6] + mat[10]*other.mat[10] + mat[11]*other.mat[14],
154 mat[8]*other.mat[3] + mat[9]*other.mat[7] + mat[10]*other.mat[11] + mat[11]*other.mat[15],
155 mat[12]*other.mat[0] + mat[13]*other.mat[4] + mat[14]*other.mat[8] + mat[15]*other.mat[12],
156 mat[12]*other.mat[1] + mat[13]*other.mat[5] + mat[14]*other.mat[9] + mat[15]*other.mat[13],
157 mat[12]*other.mat[2] + mat[13]*other.mat[6] + mat[14]*other.mat[10] + mat[15]*other.mat[14],
158 mat[12]*other.mat[3] + mat[13]*other.mat[7] + mat[14]*other.mat[11] + mat[15]*other.mat[15]);
159 }
A loop won't kill you. Any compiler worth its salt will unroll the loop if it's worth it when you turn on optimizations. Plus it's much less error-prone and more readable.
I'd definitely use the STL. We all know you can write a linked list class. But why waste time doing it now? You'll probably have a few tiny bugs to fix and it will be a bit slower and discourage other programmers from using your code. Imagine all the software a typical game uses. I'll simplify greatly and draw a dependency diagram like this (stuff on top depends on stuff below):
Code:
game
renderer, physics, sound
STL, packets, image loader
operating system
compiler
[That's a really silly stack, but bear with me.] You're not writing your own compiler, right? No, you're using someone else's. You're not writing your own operating system, right? If you want to target the middle of that stack wherever "game engine" fits, then don't worry about trying to reproduce everything that lies underneath . . . because if you don't trust the STL, why are you trusting TCP? Why are you trusting that handy BMP loader you found on the internet? Etc.
Regarding the design of vectors: I once wrote a fairly large OpenGL project where I had separate 2D and 3D vector classes. It was a huge pain, having to convert between them all the time. You think it will be easy, but somehow, it will come back to haunt you. Mind you, I didn't make vector3 inherit from vector2, that's an interesting idea. But I think it will still backfire. What if you want a function like length(), which is different for vector2 and vector3? If you have a vector3 which you pass to a function expecting a vector2, the length() might report something unexpected. And you wouldn't want to make the function virtual because virtualness is a bad idea for something as primitive as a vector.
I'm not saying that your design won't work. It probably will. Just spend a few minutes thinking about all the ways you're going to use this code and how you need to convert between the classes. In a different project of mine I created a 4D point class which I used almost everywhere. Even for places that needed just two dimensions. And then later on in the project I created other point classes, such as a WidgetPoint for the GUI, which was 2D but also understood the overall dimensions of the screen; and other point classes for texture coordinates, and screen coordinates (which were different from GUI ones, since GUI coordinates were subject to scaling). It allowed for a nice evolution. I'm not saying you should do this, but at least think about it a little.
Now, if I were you I'd be asking the harder questions about game design. For example: is this game engine going to support networking? If you allow for networked physics then it influences the whole design, because certain parts of objects can be serialized and sent over the network, and other attributes are clearly local or recomputable from the primary attributes. What is your object (I mean physical/game object) heirarchy going to look like, if you have a predefined one? It may be a good idea to separate physics from rendering and from general game state, have separate inheritance heirarchies for each. Then use composition rather than inheritance to build game objects, so that a box can be a Box class with SolidRenderer and a MobilePhysics component (google "composition versus inheritance").
Are you going to allow multithreading at all? (I suggest not. Really.) How are events going to be communicated between different components of the game? Having a good event system for communicating between components makes your life a lot easier. Imagine being able to say EMIT_EVENT(new ClientConnected(client)) and then somewhere else write an observer which automatically sends an updated world to this new client. Sorry, I have multi-player game engines on my mind. But you know what I mean.
All this to say, don't take my words to mean "You'll never succeed, give up now." The only way to get better is to try something. Just don't be surprised when it breaks, or your design was horrible and you have to refactor *all* of the vector code, or you leave in ad-hoc printing for so long that it's a nightmare to start using your new logging system, or you create a brilliant settings system which is never used anywhere, or your resource loader became an absolute mess when you were looking the other way and just adding one line at a time. Spend a little bit of time thinking about your options, maybe post a question here or there. Rewrite what needs rewriting. You've gotten started, which is one of the hard parts. Keep at it!
P.S. These are just my ideas of what's important for a game engine. Other people have different insights. No one said you had to listen to me.