Difference between revisions of "RenderWare"
(Created page. Link to all other RW related pages from here.) |
(Added information about chunk headers) |
||
Line 38: | Line 38: | ||
==Binary Streams== | ==Binary Streams== | ||
+ | |||
+ | RW streams are split up into chunks. Each section has a 12 byte header and can either be empty, contain data or more child chunks. | ||
+ | The content depends on the type and parent chunks. | ||
+ | |||
+ | 4 byte - RwUInt32 - type | ||
+ | 4 byte - RwUInt32 - size, including child chunks and/or data | ||
+ | 4 byte - RwUInt32 - library ID stamp | ||
+ | |||
+ | The library ID stamp contains the version and build number of the RW library that wrote the file. | ||
+ | |||
+ | The library version is a hexadecimal number and has the form <code>0xVJNBB</code> where V (3 bits) is the Renderware version, J (4 bits) is the major revision, N (4 bits) is the minor revision and B (6 bits) is the binary revision. Version 3.6.0.3 for instance would be encoded as <code>0x36003</code>. | ||
+ | |||
+ | To make the library ID stamp, <code>0x30000</code> is subtracted from the version first and then packed as follows (where D is the 16 bit build number): | ||
+ | VVJJ JJNN NNBB BBBB DDDD DDDD DDDD DDDD | ||
+ | |||
+ | Before version 3.2 Renderware had no build number and the library ID stamp was just 0x00000VJN (no <code>0x30000</code> subtracted). | ||
+ | Version 3.1.0.0 for instance would be encoded as 0x31000. | ||
+ | To find out what version a file has when reading, RW checks the upper 16 bits and assumes the old format when they're zero. | ||
+ | |||
+ | These C example functions pack and unpack library ID stamps: | ||
+ | |||
+ | <source lang="c"> | ||
+ | RwUInt32 | ||
+ | libraryIDPack(RwUInt32 version, RwUInt32 build) | ||
+ | { | ||
+ | if(version < 0x32000) | ||
+ | return version>>8; | ||
+ | return (version-0x30000 & 0x3FF00) << 14 | (version & 0x3F) << 16 | | ||
+ | (build & 0xFFFF); | ||
+ | } | ||
+ | |||
+ | RwUInt32 | ||
+ | libraryIDUnpackVersion(RwUInt32 libid) | ||
+ | { | ||
+ | if(libid & 0xFFFF0000) | ||
+ | return (libid>>14 & 0x3FF00) + 0x30000 | | ||
+ | (libid>>16 & 0x3F); | ||
+ | return libid<<8; | ||
+ | } | ||
+ | |||
+ | RwUInt32 | ||
+ | libraryIDUnpackBuild(RwUInt32 libid) | ||
+ | { | ||
+ | if(libid & 0xFFFF0000) | ||
+ | return libid & 0xFFFF; | ||
+ | return 0; | ||
+ | } | ||
+ | </source> | ||
See [[RenderWare binary stream file|RenderWare binary stream file]] for further information. | See [[RenderWare binary stream file|RenderWare binary stream file]] for further information. |
Revision as of 20:57, 11 August 2015
Contents |
Renderware (RW for short) is the graphics engine used by GTA III, Vice City and San Andreas. For general information see [1] and for a list of games using it [2].
Versions
The versions of Renderware the games are linked against are the following:
III | Vice City | San Andreas | |
PS2 | 3.1.0.0 | 3.3.0.2 | 3.6.0.3 |
PC | 3.3.0.2 | 3.4.0.3 | 3.6.0.3 |
Xbox | 3.5.0.0 | 3.5.0.0 | 3.6.0.3 |
Android | 3.4.0.5 | 3.4.0.5 | 3.6.0.3 |
Binary Streams
RW streams are split up into chunks. Each section has a 12 byte header and can either be empty, contain data or more child chunks. The content depends on the type and parent chunks.
4 byte - RwUInt32 - type 4 byte - RwUInt32 - size, including child chunks and/or data 4 byte - RwUInt32 - library ID stamp
The library ID stamp contains the version and build number of the RW library that wrote the file.
The library version is a hexadecimal number and has the form 0xVJNBB
where V (3 bits) is the Renderware version, J (4 bits) is the major revision, N (4 bits) is the minor revision and B (6 bits) is the binary revision. Version 3.6.0.3 for instance would be encoded as 0x36003
.
To make the library ID stamp, 0x30000
is subtracted from the version first and then packed as follows (where D is the 16 bit build number):
VVJJ JJNN NNBB BBBB DDDD DDDD DDDD DDDD
Before version 3.2 Renderware had no build number and the library ID stamp was just 0x00000VJN (no 0x30000
subtracted).
Version 3.1.0.0 for instance would be encoded as 0x31000.
To find out what version a file has when reading, RW checks the upper 16 bits and assumes the old format when they're zero.
These C example functions pack and unpack library ID stamps:
RwUInt32
libraryIDPack(RwUInt32 version, RwUInt32 build)
{
if(version < 0x32000)
return version>>8;
return (version-0x30000 & 0x3FF00) << 14 | (version & 0x3F) << 16 |
(build & 0xFFFF);
}
RwUInt32
libraryIDUnpackVersion(RwUInt32 libid)
{
if(libid & 0xFFFF0000)
return (libid>>14 & 0x3FF00) + 0x30000 |
(libid>>16 & 0x3F);
return libid<<8;
}
RwUInt32
libraryIDUnpackBuild(RwUInt32 libid)
{
if(libid & 0xFFFF0000)
return libid & 0xFFFF;
return 0;
}
See RenderWare binary stream file for further information.