]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/player_skeleton.qc
Merge branch 'master' into divVerent/csad
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / player_skeleton.qc
1 .float skeleton_modelindex;
2 #define BONETYPE_LOWER 0
3 #define BONETYPE_UPPER 1
4 #define MAX_BONES 128
5 .float skeleton_bonetype[MAX_BONES];
6 .float skeleton_aimbone;
7 .float skeleton_numbones;
8
9 void skeleton_identifybones(entity e)
10 {
11         float s = e.skeletonindex;
12         float n = (e.skeleton_numbones = skel_get_numbones(s));
13         e.skeleton_aimbone = 0;
14         float i;
15         for(i = 1; i <= n; ++i)
16         {
17                 float t = BONETYPE_LOWER;
18                 float p = skel_get_boneparent(s, i);
19                 if(p > 0)
20                         t = e.(skeleton_bonetype[p-1]);
21                 string nm = skel_get_bonename(s, i);
22                 if(nm == "spine2")
23                         t = BONETYPE_UPPER;
24                 if(nm == "upperarm_R")
25                         e.skeleton_aimbone = i;
26                 e.(skeleton_bonetype[i-1]) = t;
27         }
28 }
29
30 void free_skeleton_from_frames(entity e)
31 {
32         if(e.skeletonindex)
33         {
34                 skel_delete(e.skeletonindex);
35                 e.skeletonindex = 0;
36         }
37 }
38
39 void skeleton_from_frames(entity e)
40 {
41         float m = e.modelindex;
42         if(m != e.skeleton_modelindex)
43         {
44                 if(e.skeletonindex)
45                 {
46                         skel_delete(e.skeletonindex);
47                         e.skeletonindex = 0;
48                 }
49                 m = (e.skeleton_modelindex = e.modelindex);
50                 if(m)
51                 {
52                         e.skeletonindex = skel_create(m);
53                         skeleton_identifybones(e);
54                 }
55         }
56         float s = e.skeletonindex;
57         if(!s)
58                 return;
59         float bone;
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; )
65         {
66                 float firstbone = bone;
67                 float bonetype = e.skeleton_bonetype[bone];
68                 for(++bone; (bone < n) && (e.skeleton_bonetype[bone] == bonetype); ++bone)
69                         ;
70                 if(bonetype == BONETYPE_UPPER)
71                 {
72                         // only show frames 1+3 (upper body)
73                         e.lerpfrac = 0;
74                         e.lerpfrac3 = savelerpfrac3 * 2;
75                         e.lerpfrac4 = 0;
76                 }
77                 else
78                 {
79                         // only show frames 2+4 (lower body)
80                         e.lerpfrac = savelerpfrac * 2;
81                         e.lerpfrac3 = 0;
82                         e.lerpfrac4 = savelerpfrac4 * 2;
83                 }
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);
87         }
88         e.lerpfrac = savelerpfrac;
89         e.lerpfrac3 = savelerpfrac;
90         e.lerpfrac4 = savelerpfrac;
91 }