Rtm Binarised File Format

From Bohemia Interactive Community
Revision as of 02:51, 29 April 2010 by Mikero (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Template:unsupported-doc


Structure

RTMB
{
  RTMBHeader       Header;
  byte             Always1;              // ??
  XYZTriplet       Displacement;
  ulong            nFrames;              // 55 eg
  ulong            Generally0;           // ??
  ulong            nBones;               // same value as NoOfBones
  ulong            NoOfBones;            // 128 eg
  Asciiz           BoneNames[NoOfBones]; // "weapon\0\rightarm\leftarm\etc..."
  CompressedFloats FrameTimes;
  CompressedFrames Frames[nFrames];
}

BoneNames are the traditional Bis catenated string. Unlike some however, there is no terminating null because the count is known

RTMBHeader

RTMBHeader
{
 char[4]       Type;          //"BMTR" 
 ulong         Version;       // =3
}

CompressedFloats

CompressedFloats
{
 ulong nFrameTimes;
 float Array[nFrameTimes];
}

This is the traditional Bis potentially compressed structure, where, if, the total bytes stored >=1024, the array is compressed (in lzo format)


CompressedFrames

CompressedFrames
{
 ulong   ThisFrameNoOfBones;               // Should, in Theory always be same as nFrames
 short   Transforms[7][ThisFrameNoOfBones];
}

The short values are compressed floats (7 in total) for each 'frame'

conversion to float is

float ShortToFloat(short value) {return ((float)1.0 / (65534)) * (value + 32767);}

this is suspiciously similar to ofp compressed floats

float = short * 0.045

4 floats probably are used to describe a quaternion that describes the rotation. the other 3 floats are then for the translation