From: Rudolf Polzer Date: Thu, 13 Dec 2012 08:31:53 +0000 (+0100) Subject: csad: some animation fixes X-Git-Tag: xonotic-v0.7.0~99^2~20 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=d93c9dff05cb656fe936e0c0a850d445312cfc53;p=xonotic%2Fxonotic-data.pk3dir.git csad: some animation fixes --- diff --git a/qcsrc/common/animdecide.qc b/qcsrc/common/animdecide.qc index 17f8b57ac..1848b7cbb 100644 --- a/qcsrc/common/animdecide.qc +++ b/qcsrc/common/animdecide.qc @@ -71,11 +71,20 @@ void animdecide_init(entity e) } #define ANIMPRIO_IDLE 0 -#define ANIMPRIO_ACTIVE 2 +#define ANIMPRIO_ACTIVE 1 +#define ANIMPRIO_CROUCH 2 #define ANIMPRIO_DEAD 3 vector animdecide_getupperanim(entity e) { + // death etc. + if(e.anim_state & ANIMSTATE_FROZEN) + return vec3(e.anim_idle_x, e.anim_time, ANIMPRIO_DEAD); + if(e.anim_state & ANIMSTATE_DEAD1) + return vec3(e.anim_die1_x, e.anim_time, ANIMPRIO_DEAD); + if(e.anim_state & ANIMSTATE_DEAD2) + return vec3(e.anim_die2_x, e.anim_time, ANIMPRIO_DEAD); + // is there an action? vector outframe = '-1 0 0'; float t, a; @@ -152,27 +161,27 @@ vector animdecide_getloweranim(entity e) if(e.anim_state & ANIMSTATE_DUCK) { if(e.anim_implicit_state & ANIMIMPLICITSTATE_INAIR) - return vec3(e.anim_duckjump_x, 0, ANIMPRIO_ACTIVE); // play the END of the jump anim + return vec3(e.anim_duckjump_x, 0, ANIMPRIO_CROUCH); // play the END of the jump anim else switch(e.anim_implicit_state & (ANIMIMPLICITSTATE_FORWARD | ANIMIMPLICITSTATE_BACKWARDS | ANIMIMPLICITSTATE_LEFT | ANIMIMPLICITSTATE_RIGHT)) { case ANIMIMPLICITSTATE_FORWARD: - return vec3(e.anim_duckwalk_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckwalk_x, t, ANIMPRIO_CROUCH); case ANIMIMPLICITSTATE_BACKWARDS: - return vec3(e.anim_duckwalkbackwards_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckwalkbackwards_x, t, ANIMPRIO_CROUCH); case ANIMIMPLICITSTATE_RIGHT: - return vec3(e.anim_duckwalkstraferight_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckwalkstraferight_x, t, ANIMPRIO_CROUCH); case ANIMIMPLICITSTATE_LEFT: - return vec3(e.anim_duckwalkstrafeleft_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckwalkstrafeleft_x, t, ANIMPRIO_CROUCH); case ANIMIMPLICITSTATE_FORWARD | ANIMIMPLICITSTATE_RIGHT: - return vec3(e.anim_duckwalkforwardright_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckwalkforwardright_x, t, ANIMPRIO_CROUCH); case ANIMIMPLICITSTATE_FORWARD | ANIMIMPLICITSTATE_LEFT: - return vec3(e.anim_duckwalkforwardleft_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckwalkforwardleft_x, t, ANIMPRIO_CROUCH); case ANIMIMPLICITSTATE_BACKWARDS | ANIMIMPLICITSTATE_RIGHT: - return vec3(e.anim_duckwalkbackright_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckwalkbackright_x, t, ANIMPRIO_CROUCH); case ANIMIMPLICITSTATE_BACKWARDS | ANIMIMPLICITSTATE_LEFT: - return vec3(e.anim_duckwalkbackleft_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckwalkbackleft_x, t, ANIMPRIO_CROUCH); default: - return vec3(e.anim_duckidle_x, t, ANIMPRIO_ACTIVE); + return vec3(e.anim_duckidle_x, t, ANIMPRIO_CROUCH); } } else @@ -260,12 +269,12 @@ void animdecide_setframes(entity e, float support_blending, .float fld_frame, .f vector upper = animdecide_getupperanim(e); vector lower = animdecide_getloweranim(e); //print("UPPER: ", vtos(upper), ", LOWER: ", vtos(lower), "\n"); - if(upper_z > lower_z) - lower = upper; - else if(lower_z > upper_z) - upper = lower; if(support_blending) { + if(upper_z && !lower_z) + lower = upper; + else if(lower_z && !upper_z) + upper = lower; if(e.frame1time != upper_y || e.frame2time != lower_y) BITXOR_ASSIGN(e.effects, EF_RESTARTANIM_BIT); e.fld_frame = upper_x; @@ -275,6 +284,10 @@ void animdecide_setframes(entity e, float support_blending, .float fld_frame, .f } else { + if(upper_z > lower_z) + lower = upper; + else if(lower_z > upper_z) + upper = lower; if(e.frame1time != upper_y) BITXOR_ASSIGN(e.effects, EF_RESTARTANIM_BIT); e.fld_frame = upper_x; diff --git a/qcsrc/csqcmodellib/cl_model.qc b/qcsrc/csqcmodellib/cl_model.qc index b2157f5dd..feb775387 100644 --- a/qcsrc/csqcmodellib/cl_model.qc +++ b/qcsrc/csqcmodellib/cl_model.qc @@ -213,6 +213,7 @@ void CSQCModel_Read(float isnew) self.classname = "csqcmodel"; self.iflags |= IFLAG_ANGLES; // interpolate angles too + self.iflags |= IFLAG_VELOCITY | IFLAG_AUTOVELOCITY; // let's calculate velocity automatically { CSQCMODEL_HOOK_PREUPDATE } diff --git a/qcsrc/csqcmodellib/interpolate.qc b/qcsrc/csqcmodellib/interpolate.qc index ac0ba6e7d..817bc531e 100644 --- a/qcsrc/csqcmodellib/interpolate.qc +++ b/qcsrc/csqcmodellib/interpolate.qc @@ -50,6 +50,10 @@ void InterpolateOrigin_Note() if(self.iorigin2 != self.iorigin1) self.angles = vectoangles(self.iorigin2 - self.iorigin1); + if(self.iflags & IFLAG_AUTOVELOCITY) + if(self.itime2 != self.itime1) + self.velocity = (self.iorigin2 - self.iorigin1) * (1.0 / (self.itime2 - self.itime1)); + if(self.iflags & IFLAG_ANGLES) { fixedmakevectors(self.angles); diff --git a/qcsrc/csqcmodellib/interpolate.qh b/qcsrc/csqcmodellib/interpolate.qh index 8254fae8c..c69c90dde 100644 --- a/qcsrc/csqcmodellib/interpolate.qh +++ b/qcsrc/csqcmodellib/interpolate.qh @@ -27,6 +27,7 @@ #define IFLAG_VALID 8 #define IFLAG_PREVALID 16 #define IFLAG_TELEPORTED 32 +#define IFLAG_AUTOVELOCITY 64 #define IFLAG_INTERNALMASK (IFLAG_VALID | IFLAG_PREVALID) // call this BEFORE reading an entity update