PEW File Format: Difference between revisions
m (→ObjectType) |
|||
Line 129: | Line 129: | ||
case ObjectClassEnum.ArtificialAndDefinedInRoad // 5 | case ObjectClassEnum.ArtificialAndDefinedInRoad // 5 | ||
{ | { | ||
byte[118] VariousInfo; | byte[118] VariousInfo; | ||
} | } | ||
case ObjectClassEnum.Road // 3 | case ObjectClassEnum.Road // 3 | ||
{ | { | ||
byte[214] VariousInfo; | byte[214] VariousInfo; | ||
} | } | ||
} | } |
Revision as of 13:20, 13 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).
POSEW59 POSEW60 { PoseHeader Header; ulong nObjectTypes; ObjectType ObjectTypes[nObjectTypes]; RoadNets RoadNets[...]; Terrain Terrain[...]; ulong Always0; ulong NoOfObjects; Object Objects[NoOfObjects]; ulong NoOfLayers; Layer Layers[[NoOfLayers] ; ulong RoadNetIndices[TerrainGridSizeXY]; if (POSEW60) { ulong NoOfBackgrounds; Background Backgrounds[NoOfBackgrounds] ;// probably } else // pose59 { ulong Count; UnknownStruct2 UnknownStructs[Count]; } ulong nBlocks; EndBlock; EndBlocks[nBlocks]; if (POSEW60) { ulong Count; UnknownStruct2 UnknownStructs[Count]; } else // pose59 { ulong NoOfBackgrounds; Background Backgrounds[NoOfBackgrounds] ;// probably } ulong Count; UnknownStruct1 UnknownStructs[Count]; ulong Always0; ulong Always4; ulong Always0; }
</nowiki>
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;
}
case ObjectClassEnum.Road // 3
{
byte[214] VariousInfo;
}
}
ulong nOfArtificialSubObjects;
ArtificialSubObject ArtificialSubObjects[nOfArtificialSubObjects];
// ulong MarkerType; //See MarkerTypeEnum
LongBool LongBool; // 0 or 1
}
- 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.
// ObjectTypeID is also present at offset 16 in the VariousInfo's
ArtificialSubObject
ArtificialSubObject { String Name; LongBool LongBool; ulong Always02; XYZTriplet StartEndPos[2]; }
RoadNet
RoadNet { shortBool Always1; shortBool Always1; shortBool NoRoads; if (!NoRoads) { ulong nTypes; RoadType RoadTypes[nTypes]; ulong nXRoads; XRoad XRoads[nXRoads]; } }
RoadType
RoadType { String FamilyName; // "cesta","silnice",etc 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; RoadList Straights[nStraights]; ulong nCurves; RoadList Curves[nCurves]; ulong nSpecials; RoadList Specials[nSpecials]; ulong nTerminators; RoadList Terminators[nTerminators]; } }
RoadList
RoadList { String ModelName; // "cesta25" ulong ObjectID; // in the model list ushort MeterType; // 0,1,2,3 not present for Terminators shortBool CanChangeAngle; // not present for Terminators or Curves }
MeterType
- Type Straights Curves
- 0 6 25 meters
- 1 12 50
- 2 25 75
- 3 100
Broadly speaking, there are a few basic road types
- asfalt bitumen.
- silnice Paved
- cesta dirt
Each RoadType describes the general characteristics of a Dirt Road as opposed to (say) an Asphalt one.
Each of these RoadTypes (such as asphalt) can have multiple curved, straight, special, and termination p3d models associated with them.
Generally speaking, there are
- 3 'straight' models, approximately 6,12, and 25 meters long respectively.
- 4 'curved' models, 25,50,75 and 100 meters long.
- 1 'terminaton type.
The termination type is a road like any other but tends to be a fixed 6 meter fade out of the general road texture.
XRoad
XRoad { String Name; //kr_asfaltka_asfaltka_t. ushort Type //1 or 3 RGBA color; //FF FF FF FF shortBool CanChangeBankAngle; ulong ObjectID; String Intersections[4]; //"asfaltka","silnice","cesta",Type=3 "silnice" else "" }
Although CrossRoads could, conceivably, have any number of intersections, only two types are handled.
- Type 1: A T_Junction (3 intersections)
- Type 3: A Genuine crossroad (4 way intersection)
For T_Junctions, there is, obviously, no 4th intersection and this is null filled.
Without taking too literal an interpretation, there are some major types of road.
- asfaltka:bitumen (sealed)
- silnice: Paved
- cesta: Dirt
Thus the names of each intersection reflect the road type of that intersection, sometimes resulting in (up to) four identical names.
The overall name of the crossroad itself, tries to reflect the nature of it's makeup thus kr_asfaltka_asfaltka_t: an bitumen T_Junction kr_silince_x_cesta: a crossroad of paved and dirt roads.
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
{
ShortBool IsPresent;
if (IsPresent)
{
ShortBool Always0;
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; // "minimalStrelPos"
float RelativeSurfaceElevation;
RGBA OutlineColour;
RGBA ObjectColour;
ulong ObjectTypeId;
};
};
Layer
Layer { String Name1; //"Base" ulong SizeType; //0 String Name2; //"Base" ushort DefaultIndicator; // 1 ulong NoOfTerrainMaterials; TerrainMaterial TerrainMaterials[NoOfTerrainMaterials]; } }
TerrainMaterial
TerrainMaterial { ulong Type; // 1 = label, 0x40 = rvmatfile,,,, String MaterialName; // "---sea---","Layers\P_000-000_L00.rvmat" ulong TypeID; // 0,1,2 }
Background
Background
{
String BackgroundFilename;
String BackgroundName;
float OffsetX;
float OffsetY;
float SizeX;
float SizeY;
ulong Transparency;
ulong Visible;
}
EndBlock
EndBlock { ShortBool IsPresent; if IsPresent { 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 Type; // 0,1,2,3 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 ShortBool Always01; //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; //0,1,2,3 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; // 0 or 1 }
UnknownStruct2
UnknownStruct2 { ShortBool IsPresent; if IsPresent { ShortBool Always0; BisString Name1; //"Les_new" ulong Colour[3]; ulong nFloats; float Floats[nFloats]; /* Typical Data **00 00 61 45 00 78 1B 46 00 20 64 45 00 20 19 46 **00 20 64 45 00 78 1B 46 00 40 67 45 00 58 18 46 **00 40 67 45 00 78 1B 46 00 60 6A 45 00 58 18 46 **00 60 6A 45 00 78 1B 46 00 80 6D 45 00 90 17 46 **00 80 6D 45 00 B0 1A 46 00 A0 70 45 00 C8 16 46 **00 A0 70 45 00 E8 19 46 00 C0 73 45 00 00 16 46 */ ulong ID; // 0,1,2,3,4.... if POSEW60 { LongBool Always1; } else { BisString Name2; //Les_new Name2==Name1 } } };
UnknownStruct1
UnknownStruct1 { ShortBool LongInd; // always 0 or 1 String Name1; //"Noe_Lany" RGBA Colour[3]; ShortBool Always1; float Offset[2]; float Size[2]; // 250 x 250.0 eg ulong ID; // 0,1,2,3,4,5,6 BisString Name2; //"Lipany" BisString Name3; //"NameCity" BisString Name4; // always null }
Enums
ObjectClassEnum
enum ObjectClassEnum
{
Natural = 1,
Artificial = 2,
ArtificialAndDefinedInRoad = 5,
Road = 3
}
MarkerTypeEnum
enum MarkerTypeEnum
{
Rectangular = 0,
Elliptical = 1
}