I can't provide links to finished mods with source code, but I can give you some information from the perspective of someone that very recently coded 5 new view weapon models with complex animations into a mod for Darkplaces.
The more modern formats are coded the same way as the original, essentially by iterating through the raw frame numbers. You precache the mesh, and assign it the same way you would a quake mdl file. You call the animation by frames. I used the .dpm format, because I like skeletal animation, and because the tools to convert half life smd's is pretty easy to use. I was able to use .framegroup files for my models to simplify my animation calls. So my framegroup file for my akimbo pistol model is as follows:
Code: Select all
2 40 15 1 // Idle
42 41 15 1 // Idle Empty Right
83 41 15 1 // Idle Empty Both
124 11 30 0 // Fire Right
135 11 30 0 // Fire Right Empty
146 11 30 0 // Fire Left
157 11 30 0 // Fire Left Empty
168 41 25 0 // Reload
209 16 30 0 // Draw
225 11 30 0 // Holster
This is great in that I make a call to the framegroup from code, and it plays the full animation. E.g.:
Code: Select all
self.weaponframe=0 // calls the Idle animation.
self.weaponframe=3 // calls the Fire Right animation.
This was a lot nicer than:
Code: Select all
void() fire_right1 = [ 124, fire_right2 ] { ... some code ... };
void() fire_right2 = [ 125, fire_right3 ] { ... some code ... };
void() fire_right3 = [ 126, fire_right4 ] { ... some code ... };
void() fire_right4 = [ 127, fire_right5 ] { ... some code ... };
void() fire_right5 = [ 128, fire_right6 ] { ... some code ... };
void() fire_right6 = [ 129, fire_right7 ] { ... some code ... };
void() fire_right7 = [ 131, fire_right8 ] { ... some code ... };
void() fire_right8 = [ 132, fire_right9 ] { ... some code ... };
void() fire_right9 = [ 133, fire_right10 ] { ... some code ... };
void() fire_right10 = [ 134, fire_right11 ] { ... some code ... };
void() fire_right11 = [ 135, idle1 ] { ... some code ... };
That code is actually wrong, but you get the idea of why frame groups are cool.
There may be some specific quirks to md3, but the principles are the same, and actually require little to no modification in how you do things in QuakeC.