PEW File Format: Difference between revisions
(Endblocks) |
m (→File Format: Enblocks) |
||
| Line 70: | Line 70: | ||
ulong NoOfBackgrounds; | ulong NoOfBackgrounds; | ||
Background Backgrounds[NoOfBackgrounds] ; | Background Backgrounds[NoOfBackgrounds] ; | ||
EndBlocks; | ulong nBlocks; | ||
EndBlock; EndBlocks[nBlocks]; | |||
ulong Residual[5]; // typically 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 | |||
} | } | ||
</nowiki></code> | </nowiki></code> | ||
Revision as of 10:45, 10 February 2009
Introduction
- To do...
Legend
| Type | Description |
|---|---|
| byte | 8 bit (1 byte) |
| short | 16 bit signed short (2 bytes) |
| int | 32 bit signed integer (4 bytes) |
| float | 32 bit signed single precision floating point value (4 bytes) |
| double | 64 bit signed single precision floating point value (8 bytes) |
| asciiz | Null terminated (0x00) variable length ascii string |
| ascii | fixed length ascii string(UTF-8) |
XYPair
XYPair
{
ulong x,y;
}
RGBAColor
RGBAColor
{
byte r,g,b,a;
}
String
String
{
ulong Length;
Asciiz Characters;// null terminated regardless. Actual len = len+1;
File Format
- The following is a mix of pseudo-code and structure references that could be used to describe the file format of POSEW60.pew project design file.
- Any naming definitions or naming conventions used may or may not be accurate.
- This file format is principally used with Armed Assault v1.09 and later plus the ArmA Tools Suite Final release (v1.14).
POSEW60
{
PoseHeader Header;
ulong nObjectTypes;
ObjectType ObjectTypes[nObjectTypes];
RoadNets RoadNets[...];
Terrain Terrain[...];
ulong Unknown;
ulong NoOfObjects;
Object Objects[NoOfObjects];
ulong NoOfLayers;
Layer Layers[[NoOfLayers] ;
ulong RoadNetIndices[TerrainGridSizeXY];
ulong NoOfBackgrounds;
Background Backgrounds[NoOfBackgrounds] ;
ulong nBlocks;
EndBlock; EndBlocks[nBlocks];
ulong Residual[5]; // typically 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00
}
PoseHeader
Header
{
char Signature[7]; "POSEW59" or "POSEW60" note not null terminated
ulong UnknownLong0;
ulong UnknownLong1; // typically 0
String UnknownString1;//"cwr\cwr_islands\cwr_cain\data\0"
String UnknownString2;//""
float GridSize; //50.0
float UnknownFloat3; //400.0
String UnknownString3;//""
ulong UnknownLong2; // typically 0
};
ObjectType
ObjectType
{
String ModelFilename; //"SomePrefixRoot\data\SomeFile.p3d\0"
String ObjectTypeName;//"SomePrefixRoot\data\SomeFile\0"
ulong ObjectClassId;
RGBAColor OutlineColour; // 0xFF:FF:FF:FF means 'default'
RGBAColor ObjectColour; // ditto
switch (ObjectClassId)
{
case ObjectClassEnum.Natural // 1
case ObjectClassEnum.Artificial // 2
case ObjectClassEnum.ArtificialAndDefinedInRoad // 5
{
byte[118] VariousInfo; // 114 for POSEW59
}
case ObjectClassEnum.Road // 3
{
byte[214] VariousInfo; // 210 for POSEW59
}
}
ulong nOfArtificialSubObjects;
ArtificialSubObject ArtificialSubObjects[nOfArtificialSubObjects]; // not present for POSEW59
ulong MarkerType; //See MarkerTypeEnum
ulong ObjectTypeId // ObjectTypeID is also present at offset 16 in the VariousInfo's
}
- NB: While the 'VariousInfo' byte array is decernable at this time it essentially defines various floats, integers, transforms etc. that denote the 'default' and/or 'seed' values for a given ObjectType.
ArtificialSubObject
ArtificialSubObject
{
String ArtificialSubObjectName;
ulong Something1;
ulong Something2;
XYZTriplet StartEndPos[2];
}
RoadNets
RoadNets
{
shortBool RoadInd;
if(RoadInd)
{
ulong nNets
{
ulong nRoads;
Road RoadTypes[nRoads];
ulong nXRoads;
XRoad XRoads[nXRoads];
}[nNets];
}
}
Road
Road
{
String NetworkTypeName; // "cesta\0"
RGBA KeyPartsColour; // 0xFF:FF:FF:FF means 'default'
RGBA NormalPartsColour; // ditto
shortBool FilledLine; // 0 or 1
double MaxAngle; // 25.0 degrees
double MaxBankAngle; // 5.0 degrees
ulong nStraights;
RoadPart Straights[nStraights] ;
ulong nCurves;
RoadPart Curves[nCurves];
ulong nSpecials;
RoadPart Specials[nSpecials];
ulong nTerminators;
RoadPart Terminators[nTerminators];
}
}
RoadPart
RoadPart
{
String Name; // "cesta25" generallly "" on 1st entry
ulong ObjectId;
ushort Type; // not present for Terminators
shortBool CanChangeBankAngle; // not present for Terminators or Curves
}
XRoad
XRoad
{
String Name; //kr_asfaltka_asfaltka_t.
ushort Type //1 or 3
RGBA color; //FF FF FF FF
shortBool CanChangeBankAngle; //0 or 1
ulong ObjectID;
String ChildName1; //asfaltka
String ChildName2; //hlavni silnice
String ChildName3; //cesta
String ChildName4; //Type=1"" Type=3 "cesta"
}
Terrain
Terrain
{
XYPair TerrainGridSize; // 256 x 256 eg
float TerrainGridHeights[TerrainGridSize];
float BlueEdgeTerrainHeights[NoOfBlueFloats] ; //Always zero values // NoOfBlueFloats = (TerrainGrid_Y * TerrainGrid_X)/16;
}
Object
Object
{
ushort IsPresent;
if (IsPresent)
{
ushort Unknown;
ulong InstanceId;
float TransformColumn[3][4]; // described here to solidly illustrate to reader
// this is a standard DirectX Transform matrix
// but in COLUMN format;
double ObjectRelativeSize; // decimal percentage
String InstanceName;
float RelativeSurfaceElevation;
RGBA OutlineColour;
RGBA ObjectColour;
ulong ObjectTypeId;
};
};
Layer
Layer
{
String LayerName1;
ulong LayerSizeType;
String LayerName2;
ushort DefaultIndicator;
ulong NoOfTerrainMaterials;
TerrainMaterial TerrainMaterials[NoOfTerrainMaterials];
}
}
TerrainMaterial
TerrainMaterial
{
ulong Unknown;
String MaterialName;
ulong Unknown;
}
Background
Background
{
String BackgroundFilename;
String BackgroundName;
float OffsetX;
float OffsetY;
float SizeX;
float SizeY;
ulong Transparency;
ulong Visible;
}
EndBlock
EndBlock
{
shortBool Always1;
shortbool Always1;
ulong Unknown[12];
/* typical data
**00 00 00 00 00 00 00 F0 2C 46 00 98 23 46 C6 6F
**C6 42 0E 01 00 00 01 00 00 F0 2C 46 00 98 23 46
**C6 6F C6 42 0E 01 00 00 4B 00 00 00 00 00 00 00
*/
ushort StageID; // 1,2,3,4
String Name1; //"hlavni silnice\0"
String Name2; //"kr_silnice_cesta_t\0"
RGBA color; //0xFFFFFFFF
shortBool Always1;
ulong Count; // 2,3
EndBlock1 EndBlock1[Count];
ulong Unknown[27];
/* typical data
**FA D4 30 BF 94 58 08 3D 00 00 C8 C0 00 00 60 C0
**00 00 00 00 00 00 48 C1 00 00 60 40 00 00 00 00
**00 00 48 C1 00 00 60 C0 00 00 00 00 00 00 00 00
**00 00 60 40 00 00 00 00 00 00 00 00 00 00 C8 C0
**00 00 00 00 00 00 30 C0 00 00 C8 C0 00 00 00 00
**00 00 1C C1 04 01 00 00 00 00 00 00 00 00 00 00
**09 00 00 00 0B 80 00 00 04 00 00 00
*/
ulong Count; // 2,3
EndBlock2 EndBlock2[Count];
}
EndBlock1
EndBlock1
{
ulong Unknown[4];// Typically 00 00 C8 C0 00 00 C8 C0 00 00 00 00 0E 01 00 00
String Name; // "silnice hlavni silnic\0"
}
EndBlock2
EndBlock2
{
ulong Count; //15 eg
EndBlock3 EndBlock3[Count];
String Name; //"silnice hlavni silnic\0"
ulong Unknown[4]; //Typically 00 00 C8 C0 00 00 C8 C0 00 00 00 00 0E 01 00 00
RGBA color; //FFFFFFFF
RGBA color2; //FFFFFFFF
ushort ind; //01
ulong buf2[4]; // Typically 00 00 00 00 00 00 39 40 00 00 00 00 00 00 24 40
}
EndBlock3
EndBlock3
{
ulong unknown[6];
/* typical data
**01 00 01 00 00 86 2D 46
**00 98 23 46 65 6C C5 42
**0E 01 00 00 4D 00 00 00
*/
ushort Type; //03
String Name; //"silnice10 100\0"
ulong unknown[25];
/*typical data
**00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
**C4 76 C2 3F 0E EB 8A C1 00 00 00 00 BE 00 00 00
**CC ED 26 BE CA 0F 12 40 56 30 28 3F 00 00 00 00
**18 CA 04 C1 48 8B 3D C0 00 00 00 00 2D 3D 91 C1
**06 01 C0 40 00 00 00 00 EE 98 84 C1 99 99 91 C0
**00 00 00 00 64 4A 5F 35 99 99 91 40 00 00 00 00
**64 4A 5F B5 01 00
*/
shortBool ok; //1
}
Enums
ObjectClassEnum
enum ObjectClassEnum
{
Natural = 1,
Artificial = 2,
ArtificialAndDefinedInRoad = 5,
Road = 3
}
MarkerTypeEnum
enum MarkerTypeEnum
{
Rectangular = 0,
Elliptical = 1
}