From: Rudolf Polzer Date: Sun, 9 Oct 2011 14:40:03 +0000 (+0200) Subject: introspect models or framegroups files to fix animation duration X-Git-Tag: xonotic-v0.6.0~40^2~71 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=d026de75a4814e2b7f4b4cc439001121b28027f9;p=xonotic%2Fxonotic-data.pk3dir.git introspect models or framegroups files to fix animation duration --- diff --git a/qcsrc/server/cl_player.qc b/qcsrc/server/cl_player.qc index 7eac5bcf0..671f4a02c 100644 --- a/qcsrc/server/cl_player.qc +++ b/qcsrc/server/cl_player.qc @@ -203,30 +203,30 @@ float player_getspecies() void player_setupanimsformodel() { // defaults for legacy .zym models without animinfo files - self.anim_die1 = '0 1 0.5'; // 2 seconds - self.anim_die2 = '1 1 0.5'; // 2 seconds - self.anim_draw = '2 1 3'; // TODO: analyze models and set framerate - self.anim_duck = '3 1 100'; // this anim seems bogus in most models, so make it play VERY briefly! - self.anim_duckwalk = '4 1 1'; - self.anim_duckjump = '5 1 100'; // zym anims keep playing until changed, so this only has to start the anim, landing will end it - self.anim_duckidle = '6 1 1'; - self.anim_idle = '7 1 1'; - self.anim_jump = '8 1 100'; // zym anims keep playing until changed, so this only has to start the anim, landing will end it - self.anim_pain1 = '9 1 2'; // 0.5 seconds - self.anim_pain2 = '10 1 2'; // 0.5 seconds - self.anim_shoot = '11 1 5'; // TODO: analyze models and set framerate - self.anim_taunt = '12 1 0.33'; // FIXME? there is no code using this anim - self.anim_run = '13 1 1'; - self.anim_runbackwards = '14 1 1'; - self.anim_strafeleft = '15 1 1'; - self.anim_straferight = '16 1 1'; - self.anim_dead1 = '17 1 1'; - self.anim_dead2 = '18 1 1'; - self.anim_forwardright = '19 1 1'; - self.anim_forwardleft = '20 1 1'; - self.anim_backright = '21 1 1'; - self.anim_backleft = '22 1 1'; - self.anim_melee = '23 1 1'; + self.anim_die1 = animfixfps(self, '0 1 0.5'); // 2 seconds + self.anim_die2 = animfixfps(self, '1 1 0.5'); // 2 seconds + self.anim_draw = animfixfps(self, '2 1 3'); // TODO: analyze models and set framerate + self.anim_duck = animfixfps(self, '3 1 100'); // this anim seems bogus in most models, so make it play VERY briefly! + self.anim_duckwalk = animfixfps(self, '4 1 1'); + self.anim_duckjump = animfixfps(self, '5 1 100'); // zym anims keep playing until changed, so this only has to start the anim, landing will end it + self.anim_duckidle = animfixfps(self, '6 1 1'); + self.anim_idle = animfixfps(self, '7 1 1'); + self.anim_jump = animfixfps(self, '8 1 100'); // zym anims keep playing until changed, so this only has to start the anim, landing will end it + self.anim_pain1 = animfixfps(self, '9 1 2'); // 0.5 seconds + self.anim_pain2 = animfixfps(self, '10 1 2'); // 0.5 seconds + self.anim_shoot = animfixfps(self, '11 1 5'); // TODO: analyze models and set framerate + self.anim_taunt = animfixfps(self, '12 1 0.33'); // FIXME? there is no code using this anim + self.anim_run = animfixfps(self, '13 1 1'); + self.anim_runbackwards = animfixfps(self, '14 1 1'); + self.anim_strafeleft = animfixfps(self, '15 1 1'); + self.anim_straferight = animfixfps(self, '16 1 1'); + self.anim_dead1 = animfixfps(self, '17 1 1'); + self.anim_dead2 = animfixfps(self, '18 1 1'); + self.anim_forwardright = animfixfps(self, '19 1 1'); + self.anim_forwardleft = animfixfps(self, '20 1 1'); + self.anim_backright = animfixfps(self, '21 1 1'); + self.anim_backleft = animfixfps(self, '22 1 1'); + self.anim_melee = animfixfps(self, '23 1 1'); // TODO introspect models for finding right "fps" value (1/duration) // reset animstate now setanim(self, self.anim_idle, TRUE, FALSE, TRUE); diff --git a/qcsrc/server/cl_weaponsystem.qc b/qcsrc/server/cl_weaponsystem.qc index 597eb5ee7..db6ef7991 100644 --- a/qcsrc/server/cl_weaponsystem.qc +++ b/qcsrc/server/cl_weaponsystem.qc @@ -344,10 +344,10 @@ void CL_WeaponEntity_SetModel(string name) setmodel(self, strcat("models/weapons/h_", name, ".iqm")); // precision set below // preset some defaults that work great for renamed zym files (which don't need an animinfo) - self.anim_fire1 = '0 1 0.01'; - self.anim_fire2 = '1 1 0.01'; - self.anim_idle = '2 1 0.01'; - self.anim_reload = '3 1 0.01'; + self.anim_fire1 = animfixfps(self, '0 1 0.01'); + self.anim_fire2 = animfixfps(self, '1 1 0.01'); + self.anim_idle = animfixfps(self, '2 1 0.01'); + self.anim_reload = animfixfps(self, '3 1 0.01'); // if we have a "weapon" tag, let's attach the v_ model to it ("invisible hand" style model) // if we don't, this is a "real" animated model diff --git a/qcsrc/server/g_subs.qc b/qcsrc/server/g_subs.qc index 28e66f324..c397079e9 100644 --- a/qcsrc/server/g_subs.qc +++ b/qcsrc/server/g_subs.qc @@ -58,6 +58,19 @@ void updateanim(entity e) //print(ftos(time), " -> ", ftos(e.frame), "\n"); }; +vector animfixfps(entity e, vector a) +{ + // multi-frame anim: keep as-is + if(a_y == 1) + { + float dur; + dur = frameduration(e.modelindex, a_x); + if(dur > 0) + a_z = 1.0 / dur; + } + return a; +} + /* ================== SUB_Remove