- framedata = (unsigned short *) (pbase + header->ofs_frames);
- 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_poses6s[k*6 + 0] = loadmodel->num_poseinvscale * (pose[j].channeloffset[0] + (pose[j].channelmask&1 ? (unsigned short)LittleShort(*framedata++) * pose[j].channelscale[0] : 0));
- loadmodel->data_poses6s[k*6 + 1] = loadmodel->num_poseinvscale * (pose[j].channeloffset[1] + (pose[j].channelmask&2 ? (unsigned short)LittleShort(*framedata++) * pose[j].channelscale[1] : 0));
- loadmodel->data_poses6s[k*6 + 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_poses6s[k*6 + 3] = 32767.0f * rot[0];
- loadmodel->data_poses6s[k*6 + 4] = 32767.0f * rot[1];
- loadmodel->data_poses6s[k*6 + 5] = 32767.0f * rot[2];
- // skip scale data for now
- if(pose[j].channelmask&128) framedata++;
- if(pose[j].channelmask&256) framedata++;
- if(pose[j].channelmask&512) framedata++;
+ // 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++)
+ {
+ loadmodel->data_poses6s[k*6 + 0] = loadmodel->num_poseinvscale * (pose1[j].channeloffset[0] + (pose1[j].channelmask&1 ? (unsigned short)LittleShort(*framedata++) * pose1[j].channelscale[0] : 0));
+ loadmodel->data_poses6s[k*6 + 1] = loadmodel->num_poseinvscale * (pose1[j].channeloffset[1] + (pose1[j].channelmask&2 ? (unsigned short)LittleShort(*framedata++) * pose1[j].channelscale[1] : 0));
+ loadmodel->data_poses6s[k*6 + 2] = loadmodel->num_poseinvscale * (pose1[j].channeloffset[2] + (pose1[j].channelmask&4 ? (unsigned short)LittleShort(*framedata++) * pose1[j].channelscale[2] : 0));
+ loadmodel->data_poses6s[k*6 + 3] = 32767.0f * (pose1[j].channeloffset[3] + (pose1[j].channelmask&8 ? (unsigned short)LittleShort(*framedata++) * pose1[j].channelscale[3] : 0));
+ loadmodel->data_poses6s[k*6 + 4] = 32767.0f * (pose1[j].channeloffset[4] + (pose1[j].channelmask&16 ? (unsigned short)LittleShort(*framedata++) * pose1[j].channelscale[4] : 0));
+ loadmodel->data_poses6s[k*6 + 5] = 32767.0f * (pose1[j].channeloffset[5] + (pose1[j].channelmask&32 ? (unsigned short)LittleShort(*framedata++) * pose1[j].channelscale[5] : 0));
+ // 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++)
+ {
+ loadmodel->data_poses6s[i*6 + 0] = loadmodel->num_poseinvscale * joint1[i].origin[0];
+ loadmodel->data_poses6s[i*6 + 1] = loadmodel->num_poseinvscale * joint1[i].origin[1];
+ loadmodel->data_poses6s[i*6 + 2] = loadmodel->num_poseinvscale * joint1[i].origin[2];
+ loadmodel->data_poses6s[i*6 + 3] = 32767.0f * joint1[i].rotation[0];
+ loadmodel->data_poses6s[i*6 + 4] = 32767.0f * joint1[i].rotation[1];
+ loadmodel->data_poses6s[i*6 + 5] = 32767.0f * joint1[i].rotation[2];
+ }
+ }
+ }
+ 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_poses6s[k*6 + 0] = loadmodel->num_poseinvscale * (pose[j].channeloffset[0] + (pose[j].channelmask&1 ? (unsigned short)LittleShort(*framedata++) * pose[j].channelscale[0] : 0));
+ loadmodel->data_poses6s[k*6 + 1] = loadmodel->num_poseinvscale * (pose[j].channeloffset[1] + (pose[j].channelmask&2 ? (unsigned short)LittleShort(*framedata++) * pose[j].channelscale[1] : 0));
+ loadmodel->data_poses6s[k*6 + 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_poses6s[k*6 + 3] = 32767.0f * rot[0];
+ loadmodel->data_poses6s[k*6 + 4] = 32767.0f * rot[1];
+ loadmodel->data_poses6s[k*6 + 5] = 32767.0f * rot[2];
+ // 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_poses6s[i*6 + 0] = loadmodel->num_poseinvscale * joint[i].origin[0];
+ loadmodel->data_poses6s[i*6 + 1] = loadmodel->num_poseinvscale * joint[i].origin[1];
+ loadmodel->data_poses6s[i*6 + 2] = loadmodel->num_poseinvscale * joint[i].origin[2];
+ loadmodel->data_poses6s[i*6 + 3] = 32767.0f * joint[i].rotation[0];
+ loadmodel->data_poses6s[i*6 + 4] = 32767.0f * joint[i].rotation[1];
+ loadmodel->data_poses6s[i*6 + 5] = 32767.0f * joint[i].rotation[2];
+ }