]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/player_skeleton.qc
fixbone: simplify, and keep only one method
[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_fixrotatebone;
7 .float skeleton_bone;
8 .float skeleton_aimbone;
9 .float skeleton_numbones;
10
11 void skeleton_identifybones(entity e)
12 {
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;
17         float i;
18         for(i = 1; i <= n; ++i)
19         {
20                 float t = BONETYPE_LOWER;
21                 float p = skel_get_boneparent(s, i);
22                 if(p > 0)
23                         t = e.(skeleton_bonetype[p-1]);
24                 string nm = skel_get_bonename(s, i);
25                 if(nm == "spine2")
26                 {
27                         e.skeleton_fixrotatebone = i;
28                         t = BONETYPE_UPPER;
29                 }
30                 if(nm == "upperarm_R")
31                         e.skeleton_aimbone = i;
32                 e.(skeleton_bonetype[i-1]) = t;
33         }
34 }
35
36 void skeleton_fixbone(entity e, vector ang)
37 {
38         if(!e.skeleton_fixrotatebone)
39                 return;
40         float s = e.skeletonindex;
41
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');
47 }
48
49 void free_skeleton_from_frames(entity e)
50 {
51         if(e.skeletonindex)
52         {
53                 skel_delete(e.skeletonindex);
54                 e.skeletonindex = 0;
55         }
56 }
57
58 void skeleton_from_frames(entity e)
59 {
60         float m = e.modelindex;
61         if(m != e.skeleton_modelindex)
62         {
63                 if(e.skeletonindex)
64                 {
65                         skel_delete(e.skeletonindex);
66                         e.skeletonindex = 0;
67                 }
68                 m = (e.skeleton_modelindex = e.modelindex);
69                 if(m)
70                 {
71                         e.skeletonindex = skel_create(m);
72                         skeleton_identifybones(e);
73                 }
74         }
75         float s = e.skeletonindex;
76         if(!s)
77                 return;
78         float bone;
79         float n = e.skeleton_numbones;
80         float savelerpfrac = e.lerpfrac;
81         float savelerpfrac3 = e.lerpfrac3;
82         float savelerpfrac4 = e.lerpfrac4;
83
84         vector fixbone_oldangles = '0 0 0';
85         if(autocvar__animblend_fixbone)
86         {
87                 // make all bones BONETYPE_UPPER
88                 e.lerpfrac = 0;
89                 e.lerpfrac3 = savelerpfrac3 * 2;
90                 e.lerpfrac4 = 0;
91                 // build skeleton
92                 skel_build(s, e, m, 0, 1, n);
93                 // get hip bone
94                 skel_get_boneabs(s, e.skeleton_fixrotatebone);
95                 fixbone_oldangles = fixedvectoangles2(v_forward, v_up);
96         }
97
98         for(bone = 0; bone < n; )
99         {
100                 float firstbone = bone;
101                 float bonetype = e.skeleton_bonetype[bone];
102                 for(++bone; (bone < n) && (e.skeleton_bonetype[bone] == bonetype); ++bone)
103                         ;
104                 if(bonetype == BONETYPE_UPPER)
105                 {
106                         // only show frames 1+3 (upper body)
107                         e.lerpfrac = 0;
108                         e.lerpfrac3 = savelerpfrac3 * 2;
109                         e.lerpfrac4 = 0;
110                 }
111                 else
112                 {
113                         // only show frames 2+4 (lower body)
114                         e.lerpfrac = savelerpfrac * 2;
115                         e.lerpfrac3 = 0;
116                         e.lerpfrac4 = savelerpfrac4 * 2;
117                 }
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);
121         }
122         e.lerpfrac = savelerpfrac;
123         e.lerpfrac3 = savelerpfrac3;
124         e.lerpfrac4 = savelerpfrac4;
125
126         if(autocvar__animblend_fixbone)
127         {
128                 // FIX IT
129                 skeleton_fixbone(e, fixbone_oldangles);
130         }
131 }