1 .float skeleton_modelindex;
2 #define BONETYPE_LOWER 0
3 #define BONETYPE_UPPER 1
5 .float skeleton_bonetype[MAX_BONES];
6 .float skeleton_aimbone;
7 .float skeleton_numbones;
9 void skeleton_identifybones(entity e)
11 float s = e.skeletonindex;
12 float n = (e.skeleton_numbones = skel_get_numbones(s));
13 e.skeleton_aimbone = 0;
15 for(i = 1; i <= n; ++i)
17 float t = BONETYPE_LOWER;
18 float p = skel_get_boneparent(s, i);
20 t = e.(skeleton_bonetype[p-1]);
21 string nm = skel_get_bonename(s, i);
24 if(nm == "upperarm_R")
25 e.skeleton_aimbone = i;
26 e.(skeleton_bonetype[i-1]) = t;
30 void free_skeleton_from_frames(entity e)
34 skel_delete(e.skeletonindex);
39 void skeleton_from_frames(entity e)
41 float m = e.modelindex;
42 if(m != e.skeleton_modelindex)
46 skel_delete(e.skeletonindex);
49 m = (e.skeleton_modelindex = e.modelindex);
52 e.skeletonindex = skel_create(m);
53 skeleton_identifybones(e);
56 float s = e.skeletonindex;
60 float n = e.skeleton_numbones;
61 float savelerpfrac = e.lerpfrac;
62 float savelerpfrac3 = e.lerpfrac3;
63 float savelerpfrac4 = e.lerpfrac4;
64 for(bone = 0; bone < n; )
66 float firstbone = bone;
67 float bonetype = e.skeleton_bonetype[bone];
68 for(++bone; (bone < n) && (e.skeleton_bonetype[bone] == bonetype); ++bone)
70 if(bonetype == BONETYPE_UPPER)
72 // only show frames 1+3 (upper body)
74 e.lerpfrac3 = savelerpfrac3 * 2;
79 // only show frames 2+4 (lower body)
80 e.lerpfrac = savelerpfrac * 2;
82 e.lerpfrac4 = savelerpfrac4 * 2;
84 //print(sprintf("Run: bone %d to %d, type %d\n", firstbone + 1, bone, bonetype));
85 //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));
86 skel_build(s, e, m, 0, firstbone + 1, bone);
88 e.lerpfrac = savelerpfrac;
89 e.lerpfrac3 = savelerpfrac;
90 e.lerpfrac4 = savelerpfrac;