1 .float skeleton_modelindex;
2 #define BONETYPE_LOWER 0
3 #define BONETYPE_UPPER 1
5 .float skeleton_bonetype[MAX_BONES];
6 .float skeleton_fixrotatebone;
8 .float skeleton_aimbone;
9 .float skeleton_numbones;
11 void skeleton_identifybones(entity e)
13 float s = e.skeletonindex;
14 float n = (e.skeleton_numbones = skel_get_numbones(s));
15 e.skeleton_aimbone = 0;
16 e.skeleton_fixrotatebone = 0;
18 for(i = 1; i <= n; ++i)
20 float t = BONETYPE_LOWER;
21 float p = skel_get_boneparent(s, i);
23 t = e.(skeleton_bonetype[p-1]);
24 string nm = skel_get_bonename(s, i);
27 e.skeleton_fixrotatebone = i;
30 if(nm == "upperarm_R")
31 e.skeleton_aimbone = i;
32 e.(skeleton_bonetype[i-1]) = t;
36 void skeleton_fixbone(entity e, vector ang)
38 if(!e.skeleton_fixrotatebone)
40 float s = e.skeletonindex;
42 skel_get_boneabs(s, e.skeleton_fixrotatebone);
43 vector ang_cur = fixedvectoangles2(v_forward, v_up);
44 vector fix = AnglesTransform_LeftDivide(ang_cur, ang);
45 fixedmakevectors(fix);
46 skel_mul_bone(s, e.skeleton_fixrotatebone, '0 0 0');
49 void free_skeleton_from_frames(entity e)
53 skel_delete(e.skeletonindex);
58 void skeleton_from_frames(entity e)
60 float m = e.modelindex;
61 if(m != e.skeleton_modelindex)
65 skel_delete(e.skeletonindex);
68 m = (e.skeleton_modelindex = e.modelindex);
71 e.skeletonindex = skel_create(m);
72 skeleton_identifybones(e);
75 float s = e.skeletonindex;
79 float n = e.skeleton_numbones;
80 float savelerpfrac = e.lerpfrac;
81 float savelerpfrac3 = e.lerpfrac3;
82 float savelerpfrac4 = e.lerpfrac4;
84 vector fixbone_oldangles = '0 0 0';
85 if(autocvar__animblend_fixbone)
87 // make all bones BONETYPE_UPPER
89 e.lerpfrac3 = savelerpfrac3 * 2;
92 skel_build(s, e, m, 0, 1, n);
94 skel_get_boneabs(s, e.skeleton_fixrotatebone);
95 fixbone_oldangles = fixedvectoangles2(v_forward, v_up);
98 for(bone = 0; bone < n; )
100 float firstbone = bone;
101 float bonetype = e.skeleton_bonetype[bone];
102 for(++bone; (bone < n) && (e.skeleton_bonetype[bone] == bonetype); ++bone)
104 if(bonetype == BONETYPE_UPPER)
106 // only show frames 1+3 (upper body)
108 e.lerpfrac3 = savelerpfrac3 * 2;
113 // only show frames 2+4 (lower body)
114 e.lerpfrac = savelerpfrac * 2;
116 e.lerpfrac4 = savelerpfrac4 * 2;
118 //print(sprintf("Run: bone %d to %d, type %d\n", firstbone + 1, bone, bonetype));
119 //print(sprintf("frame %d %d %d %d lerpfrac * %d %d %d\n", e.frame, e.frame2, e.frame3, e.frame4, e.lerpfrac, e.lerpfrac3, e.lerpfrac4));
120 skel_build(s, e, m, 0, firstbone + 1, bone);
122 e.lerpfrac = savelerpfrac;
123 e.lerpfrac3 = savelerpfrac3;
124 e.lerpfrac4 = savelerpfrac4;
126 if(autocvar__animblend_fixbone)
129 skeleton_fixbone(e, fixbone_oldangles);