]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
csad: some animation fixes
authorRudolf Polzer <divverent@xonotic.org>
Thu, 13 Dec 2012 08:31:53 +0000 (09:31 +0100)
committerRudolf Polzer <divverent@xonotic.org>
Thu, 13 Dec 2012 08:31:53 +0000 (09:31 +0100)
qcsrc/common/animdecide.qc
qcsrc/csqcmodellib/cl_model.qc
qcsrc/csqcmodellib/interpolate.qc
qcsrc/csqcmodellib/interpolate.qh

index 17f8b57ac0a0a5fd2cef602a17193dacdef8e309..1848b7cbbc3f59abcd053ea55b3d7b01b9dd4ba7 100644 (file)
@@ -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;
index b2157f5dd54139a538ce9fa5a77f66527b6d3bbc..feb77538758e0138c6bb7fce4e5f04df5b793866 100644 (file)
@@ -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 }
 
index ac0ba6e7d70ac7cb56fbc8673a4abec027b513b9..817bc531e7fd7aebe7e3341e788bf8d8690db0fe 100644 (file)
@@ -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);
index 8254fae8cfc6f44649b7dd158035d7749bec79aa..c69c90dde9f53f9dcd1eea3587c463a59baf8eab 100644 (file)
@@ -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