1 .float skeleton_info_modelindex;
2 .float skeleton_info_skin;
3 #define BONETYPE_LOWER 0
4 #define BONETYPE_UPPER 1
6 .float skeleton_bonetype[MAX_BONES];
7 .float skeleton_numbones;
9 void skeleton_loadinfo(entity e)
11 if(e.skeleton_info_modelindex == e.modelindex && e.skeleton_info_skin == e.skin)
14 e.bone_weapon = gettagindex(e, "weapon");
16 e.bone_weapon = gettagindex(e, "tag_weapon");
18 e.bone_weapon = gettagindex(e, "bip01 r hand");
20 if(get_model_parameters(e.model, e.skin))
22 if(get_model_parameters_bone_upperbody)
23 e.bone_upperbody = gettagindex(e, get_model_parameters_bone_upperbody);
24 if(get_model_parameters_bone_weapon)
25 e.bone_weapon = gettagindex(e, get_model_parameters_bone_weapon);
26 e.fixbone = get_model_parameters_fixbone;
29 dprint("No model parameters for ", e.model, "\n");
30 dprint(e.model, " uses ", ftos(e.bone_upperbody), " ", ftos(e.fixbone), "\n");
31 get_model_parameters(string_null, 0);
32 e.skeleton_info_modelindex = e.modelindex;
33 e.skeleton_info_skin = e.skin;
36 skel_delete(e.skeletonindex);
41 void skeleton_markbones(entity e)
43 float s = e.skeletonindex;
44 float n = (e.skeleton_numbones = skel_get_numbones(s));
46 for(i = 1; i <= n; ++i)
48 float t = BONETYPE_LOWER;
49 float p = skel_get_boneparent(s, i);
51 t = e.(skeleton_bonetype[p-1]);
52 if(i == e.bone_upperbody)
54 e.(skeleton_bonetype[i-1]) = t;
58 void skeleton_fixbone(entity e, vector ang)
62 float s = e.skeletonindex;
64 skel_get_boneabs(s, e.bone_upperbody);
65 vector ang_cur = fixedvectoangles2(v_forward, v_up);
66 vector fix = AnglesTransform_LeftDivide(ang_cur, ang);
67 fixedmakevectors(fix);
68 skel_mul_bone(s, e.bone_upperbody, '0 0 0');
71 void free_skeleton_from_frames(entity e)
75 skel_delete(e.skeletonindex);
80 void skeleton_from_frames(entity e)
82 float m = e.modelindex;
85 e.skeletonindex = skel_create(m);
86 skeleton_markbones(e);
88 float s = e.skeletonindex;
92 float n = e.skeleton_numbones;
93 float savelerpfrac = e.lerpfrac;
94 float savelerpfrac3 = e.lerpfrac3;
95 float savelerpfrac4 = e.lerpfrac4;
97 vector fixbone_oldangles = '0 0 0';
100 // make all bones BONETYPE_UPPER
102 e.lerpfrac3 = savelerpfrac3 * 2;
105 skel_build(s, e, m, 0, 1, n);
107 skel_get_boneabs(s, e.bone_upperbody);
108 fixbone_oldangles = fixedvectoangles2(v_forward, v_up);
111 for(bone = 0; bone < n; )
113 float firstbone = bone;
114 float bonetype = e.skeleton_bonetype[bone];
115 for(++bone; (bone < n) && (e.skeleton_bonetype[bone] == bonetype); ++bone)
117 if(bonetype == BONETYPE_UPPER)
119 // only show frames 1+3 (upper body)
121 e.lerpfrac3 = savelerpfrac3 * 2;
126 // only show frames 2+4 (lower body)
127 e.lerpfrac = savelerpfrac * 2;
129 e.lerpfrac4 = savelerpfrac4 * 2;
131 //print(sprintf("Run: bone %d to %d, type %d\n", firstbone + 1, bone, bonetype));
132 //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));
133 skel_build(s, e, m, 0, firstbone + 1, bone);
135 e.lerpfrac = savelerpfrac;
136 e.lerpfrac3 = savelerpfrac3;
137 e.lerpfrac4 = savelerpfrac4;
142 skeleton_fixbone(e, fixbone_oldangles);