First, there are several numerical fields appearing in the data,
describing object positions, rotation angles, scaling factors, etc. They
are stored as "32-bit fractional" numbers, such that the true number is
the 32-bit number divided by 65536. So as an example, the number 3.14159
is stored as (hexadecimal) $0003243F. This allows the data to be
independant of any particular floating point format. And it (actually) is
the internal format used in the "integer" version of Turbo Silver.
Numbers stored in this format are called as "FRACT"s below.
Second, there are several color (or RGB) fields in the data. They are
always stored as three UBYTEs representing the red, green and blue
components of the color. Red is always first, followed by green, and then
blue. For some of the data chunks, Turbo Silver reads the color field
into the 24 LSB's of a LONGword. In such cases, the 3 RGB bytes are
preceded by a zero byte in the file.
The following "typedef"s are used below:
typedef LONG FRACT; /* 4 bytes */
typedef UBYTE COLOR[3]; /* 3 bytes */
typedef struct vectors {
FRACT X; /* 4 bytes */
FRACT Y; /* 4 bytes */
FRACT Z; /* 4 bytes */
} VECTOR; /* 12 bytes total */
typedef struct matrices {
VECTOR I; /* 12 bytes */
VECTOR J; /* 12 bytes */
VECTOR K; /* 12 bytes */
} MATRIX; /* 36 bytes total */
typedef struct _tform {
VECTOR r; /* 12 bytes - position */
VECTOR a; /* 12 bytes - x axis */
VECTOR b; /* 12 bytes - y axis */
VECTOR c; /* 12 bytes - z axis */
VECTOR s; /* 12 bytes - size */
} TFORM; /* 60 bytes total */
The following structure is used in generating animated cells from a single
cell. It can be attached to an object or to the camera. It is also used
for Turbo Silver's "extrude along a path" feature. (It is ignored and
forgotten by Imagine.)
typedef struct story {
UBYTE Path[18]; /* 18 bytes */
VECTOR Translate; /* 12 bytes */
VECTOR Rotate; /* 12 bytes */
VECTOR Scale; /* 12 bytes */
UWORD info; /* 2 bytes */
} STORY; /* 56 bytes total */
The Path[] name refers to a named object in the cell data. The path object
should be a sequence of points connected with edges. The object moves
from the first point of the first edge, to the last point of the last
edge. The edge ordering is important. The path is interpolated so that
the object always moves an equal distance in each frame of the animation.
If there is no path the Path[] field should be set to zeros. The Translate
vector is not currently used. The Rotate "vector" specifies rotation
angles about the X, Y, and Z axes. The Scale vector specfies X,Y, and Z
scale factors. The "info" word is a bunch of bit flags:
ABS_TRA 0x0001 - translate in world coorinates (not used)
ABS_ROT 0x0002 - rotation in world coorinates
ABS_SCL 0x0004 - scaling in world coorinates
LOC_TRA 0x0010 - translate in local coorinates (not used)
LOC_ROT 0x0020 - rotation in local coorinates
LOC_SCL 0x0040 - scaling in local coorinates
X_ALIGN 0x0100 - (not used)
Y_ALIGN 0x0200 - align Y axis to path's direction
Z_ALIGN 0x0400 - (not used)
FOLLOW_ME 0x1000 - children follow parent on path
desc sub-sub-chunks
desc notes
info sub-chunks
extr sub-sub-chunks