+ // load the pose data
+ // this unaligned memory access is safe (LittleShort reads as bytes)
+ framedata = (const unsigned short *)(pbase + header.ofs_frames);
+ if (header.version == 1)
+ {
+ for (i = 0, k = 0;i < (int)header.num_frames;i++)
+ {
+ for (j = 0;j < (int)header.num_poses;j++, k++)
+ {
+ float qx, qy, qz, qw;
+ loadmodel->data_poses7s[k*7 + 0] = loadmodel->num_poseinvscale * (pose1[j].channeloffset[0] + (pose1[j].channelmask&1 ? (unsigned short)LittleShort(*framedata++) * pose1[j].channelscale[0] : 0));
+ loadmodel->data_poses7s[k*7 + 1] = loadmodel->num_poseinvscale * (pose1[j].channeloffset[1] + (pose1[j].channelmask&2 ? (unsigned short)LittleShort(*framedata++) * pose1[j].channelscale[1] : 0));
+ loadmodel->data_poses7s[k*7 + 2] = loadmodel->num_poseinvscale * (pose1[j].channeloffset[2] + (pose1[j].channelmask&4 ? (unsigned short)LittleShort(*framedata++) * pose1[j].channelscale[2] : 0));
+ qx = pose1[j].channeloffset[3] + (pose1[j].channelmask&8 ? (unsigned short)LittleShort(*framedata++) * pose1[j].channelscale[3] : 0);
+ qy = pose1[j].channeloffset[4] + (pose1[j].channelmask&16 ? (unsigned short)LittleShort(*framedata++) * pose1[j].channelscale[4] : 0);
+ qz = pose1[j].channeloffset[5] + (pose1[j].channelmask&32 ? (unsigned short)LittleShort(*framedata++) * pose1[j].channelscale[5] : 0);
+ qw = 1.0f - (qx*qx + qy*qy + qz*qz);
+ qw = qw > 0.0f ? -sqrt(qw) : 0.0f;
+ loadmodel->data_poses7s[k*7 + 3] = 32767.0f * qx;
+ loadmodel->data_poses7s[k*7 + 4] = 32767.0f * qy;
+ loadmodel->data_poses7s[k*7 + 5] = 32767.0f * qz;
+ loadmodel->data_poses7s[k*7 + 6] = 32767.0f * qw;
+ // skip scale data for now
+ if(pose1[j].channelmask&64) framedata++;
+ if(pose1[j].channelmask&128) framedata++;
+ if(pose1[j].channelmask&256) framedata++;
+ }
+ }
+ if (header.num_frames <= 0)
+ {
+ for (i = 0;i < loadmodel->num_bones;i++)
+ {
+ float qx, qy, qz, qw;
+ loadmodel->data_poses7s[i*7 + 0] = loadmodel->num_poseinvscale * joint1[i].origin[0];
+ loadmodel->data_poses7s[i*7 + 1] = loadmodel->num_poseinvscale * joint1[i].origin[1];
+ loadmodel->data_poses7s[i*7 + 2] = loadmodel->num_poseinvscale * joint1[i].origin[2];
+ qx = joint1[i].rotation[0];
+ qy = joint1[i].rotation[1];
+ qz = joint1[i].rotation[2];
+ qw = 1.0f - (qx*qx + qy*qy + qz*qz);
+ qw = qw > 0.0f ? -sqrt(qw) : 0.0f;
+ loadmodel->data_poses7s[i*7 + 3] = 32767.0f * qx;
+ loadmodel->data_poses7s[i*7 + 4] = 32767.0f * qy;
+ loadmodel->data_poses7s[i*7 + 5] = 32767.0f * qz;
+ loadmodel->data_poses7s[i*7 + 6] = 32767.0f * qw;
+ }
+ }
+ }
+ else
+ {
+ for (i = 0, k = 0;i < (int)header.num_frames;i++)
+ {
+ for (j = 0;j < (int)header.num_poses;j++, k++)
+ {
+ float rot[4];
+ loadmodel->data_poses7s[k*7 + 0] = loadmodel->num_poseinvscale * (pose[j].channeloffset[0] + (pose[j].channelmask&1 ? (unsigned short)LittleShort(*framedata++) * pose[j].channelscale[0] : 0));
+ loadmodel->data_poses7s[k*7 + 1] = loadmodel->num_poseinvscale * (pose[j].channeloffset[1] + (pose[j].channelmask&2 ? (unsigned short)LittleShort(*framedata++) * pose[j].channelscale[1] : 0));
+ loadmodel->data_poses7s[k*7 + 2] = loadmodel->num_poseinvscale * (pose[j].channeloffset[2] + (pose[j].channelmask&4 ? (unsigned short)LittleShort(*framedata++) * pose[j].channelscale[2] : 0));
+ rot[0] = pose[j].channeloffset[3] + (pose[j].channelmask&8 ? (unsigned short)LittleShort(*framedata++) * pose[j].channelscale[3] : 0);
+ rot[1] = pose[j].channeloffset[4] + (pose[j].channelmask&16 ? (unsigned short)LittleShort(*framedata++) * pose[j].channelscale[4] : 0);
+ rot[2] = pose[j].channeloffset[5] + (pose[j].channelmask&32 ? (unsigned short)LittleShort(*framedata++) * pose[j].channelscale[5] : 0);
+ rot[3] = pose[j].channeloffset[6] + (pose[j].channelmask&64 ? (unsigned short)LittleShort(*framedata++) * pose[j].channelscale[6] : 0);
+ if (rot[3] > 0)
+ Vector4Negate(rot, rot);
+ Vector4Normalize2(rot, rot);
+ loadmodel->data_poses7s[k*7 + 3] = 32767.0f * rot[0];
+ loadmodel->data_poses7s[k*7 + 4] = 32767.0f * rot[1];
+ loadmodel->data_poses7s[k*7 + 5] = 32767.0f * rot[2];
+ loadmodel->data_poses7s[k*7 + 6] = 32767.0f * rot[3];
+ // skip scale data for now
+ if(pose[j].channelmask&128) framedata++;
+ if(pose[j].channelmask&256) framedata++;
+ if(pose[j].channelmask&512) framedata++;
+ }
+ }
+ if (header.num_frames <= 0)
+ {
+ for (i = 0;i < loadmodel->num_bones;i++)
+ {
+ loadmodel->data_poses7s[i*7 + 0] = loadmodel->num_poseinvscale * joint[i].origin[0];
+ loadmodel->data_poses7s[i*7 + 1] = loadmodel->num_poseinvscale * joint[i].origin[1];
+ loadmodel->data_poses7s[i*7 + 2] = loadmodel->num_poseinvscale * joint[i].origin[2];
+ loadmodel->data_poses7s[i*7 + 3] = 32767.0f * joint[i].rotation[0];
+ loadmodel->data_poses7s[i*7 + 4] = 32767.0f * joint[i].rotation[1];
+ loadmodel->data_poses7s[i*7 + 5] = 32767.0f * joint[i].rotation[2];
+ loadmodel->data_poses7s[i*7 + 6] = 32767.0f * joint[i].rotation[3];
+ }
+ }
+ }