PEW File Format: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
No edit summary
 
No edit summary
Line 21: Line 21:
|-
|-
|align="middle"|asciiz||align="left"| Null terminated (0x00) variable length ascii string
|align="middle"|asciiz||align="left"| Null terminated (0x00) variable length ascii string
|-
|align="middle"|ascii||align="left"| fixed length ascii string
|-
|-
|-
|-
Line 31: Line 33:




::The following is a mix of ''pseudo-code'' and structure references that could be used to discribe the file format of POSEW60.pew Island project design file. It may or may not be accurate.
::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).
::*This file format is principally used with Armed Assault v1.09 and later plus the ArmA Tools Suite Final release (v1.14).
Line 46: Line 49:
     if(RoadNetworkTypesIndicator == 0)
     if(RoadNetworkTypesIndicator == 0)
     {
     {
      int                                                NoOfRoadNetworkTypes;
      structRoadNetworkType[NoOfRoadNetworkTypes]        RoadNetworkTypes;
      int                                                Unknown;
     }
     }
     int                                        TerrainGrid_X;
     int                                        TerrainGrid_X;
Line 54: Line 60:
     int                                        Unknown;
     int                                        Unknown;
     int                                        NoOfObjects;
     int                                        NoOfObjects;
     structObject[NoOfObjects]                 Objects;
     if (NoOfObjects != 0)
    {
      structObject[NoOfObjects]               Objects;
      while (i < NoOfObjects)
      {
          short Indicator;
          if (Indicator != 0)
          {
            short Unknown;
            int  InstanceId;
            float TransformColumn_1_Row_1; // described here to solidly illustrate to reader
            float TransformColumn_1_Row_2; // this is a standard DirectX Transform matrix
            float TransformColumn_1_Row_3; // but in COLUMN format;
            float TransformColumn_2_Row_1;
            float TransformColumn_2_Row_2;
            float TransformColumn_2_Row_3;
            float TransformColumn_3_Row_1;
            float TransformColumn_3_Row_2;
            float TransformColumn_3_Row_3;
            float Unknown;
            float Unknown;
            int NoOfCharsInInstanceName;
            ascii[NoOfCharsInInstanceName] InstanceName;
            float RelativeSurfaceElevation;
            byte[4] OutlineColour; // rgba 0xFFFF FFFF means 'default'
            byte[4] ObjectColour;  // rgba 0xFFFF FFFF means 'default'
            int ObjectTypeId;
          }
      }
    }
 
     int                                        NoOfLayers;
     int                                        NoOfLayers;
     structLayer[NoOfLayers]                    Layers;
     structLayer[NoOfLayers]                    Layers;
     ...
      
   }
   }
</nowiki></code>
</nowiki></code>


----
----


== Structures ==
== Structures ==
=== structLayer ===
<code><nowiki>
  struct structLayer
  {
    int NoOfCharsInLayerName1;
    ascii[NoOfCharsInLayerName1] LayerName1;
    int LayerSizeType;
    int NoOfCharsInLayerName2;
    ascii[NoOfCharsInLayerName2] LayerName2;
    short DefaultIndicator;
    int NoOfTerrainMaterials;
    if (NoOfTerrainMaterials != 0)
    {
      structTerrainMaterial[NoOfTerrainMaterials] TerrainMaterials;
    }
  }
</nowiki></code>
=== structTerrainMaterial ===
<code><nowiki>
  struct structTerrainMaterial
  {
    int Unknown;
    int NoOfCharsInMaterialName;
    ascii[NoOfCharsInMaterialName] MaterialName;
    int Unknown;
  }
</nowiki></code>
=== structObjectType ===
<code><nowiki>
  struct structObjectType
  {
    int                                            NoOfCharsInObjectModelFilename;
    ascii[NoOfCharsInObjectModelFilename]          ModelFilename;
    int                                            NoOfCharsInObjectName;
    ascii[NoOfCharsInObjectName]                  ObjectTypeName;
    int                                            ObjectClassId;
    byte[4]                                        OutlineColour; // rgba 0xFFFF FFFF means 'default'
    byte[4]                                        ObjectColour; // rgba 0xFFFF FFFF means 'default'
    switch (ObjectClassId)
    {
      case ObjectClassEnum.Natural // 1
      {
        byte[118]      VariousInfo;
      }
      case ObjectClassEnum.Artificial // 2
      {
        byte[118]      VariousInfo;
      }
      case ObjectClassEnum.Road // 3
      {
        byte[214]      VariousInfo;
      }
    }
    int                                            NoOfArtificialSubObjects;
    if (NoOfArtificialSubObjects != 0)
    {
      structArtificialSubObject[NoOfArtificialSubObjects]      ArtificialSubObjects;
    }
    int                                                        MarkerType; //See MarkerTypeEnum
    int ObjectTypeId = VariousInfo.Offset(16).[4].ToInt; // The 4-bytes at offset 16 in the VariousInfo is the ObjectTypeId.
  }
</nowiki></code>
::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'''''.
::    The most important data is the ''ObjectTypeId'' found at the 16th byte and is an 4-byte int.
=== structArtificialSubObject ===
<code><nowiki>
  struct structArtificialSubObject
  {
    int NoOfCharsInArtificialSubObjectName;
    ascii[NoOfCharsInArtificialSubObjectName]    ArtificialSubObjectName;
    int Something1;
    int Something2;
    float[6] arySomethingFloats;
  }
</nowiki></code>
=== structRoadNetworkType ===
<code><nowiki>
  struct structRoadNetworkType
  {
    int                                            NoOfCharsInRoadNetworkTypeName;
    ascii[NoOfCharsInRoadNetworkTypeName]          NetworkTypeName;
    byte[4]                                        KeyPartsColour; // rgba 0xFFFF FFFF means 'default'
    byte[4]                                        NormalPartsColour; // rgba 0xFFFF FFFF means 'default'
    short                                          FilledLine; // 0x0000=No, 0x0100=Yes
    float[4]                                      Unknown; // 4 x Unknown floats
    int                                            NoOfStraightParts;
    if (NoOfStraightParts != 0)
    {
      structRoadNetworkTypeStraightPart[NoOfStraightParts]      RoadNetworkTypeStraightParts;
    }
    int                                            NoOfCurveParts;
    if (NoOfCurveParts != 0)
    {
      structRoadNetworkTypeCurvePart[NoOfCurveParts]      RoadNetworkTypeCurveParts;
    }
    int                                            NoOfSpecialParts;
    if (NoOfSpecialParts != 0)
    {
      structRoadNetworkTypeSpecialPart[NoOfSpecialParts]      RoadNetworkTypeSpecialParts;
    }
    int                                            NoOfTerminatorParts;
    if (NoOfTerminatorParts != 0)
    {
      structRoadNetworkTypeTerminatorPart[NoOfTerminatorParts]      RoadNetworkTypeTerminatorParts;
    }
  }
</nowiki></code>
=== structRoadNetworkTypeStraightPart ===
<code><nowiki>
  struct structRoadNetworkTypeStraightPart
  {
      int                                  NoOfCharsInStraightPartName;
      ascii[NoOfCharsInStraightPartName]  StraightPartName;
      int                                  ObjectId;
      short                                StraightPartType;
      short                                CanChangeBankAngle;
  }
</nowiki></code>
=== structRoadNetworkTypeCurvePart ===
<code><nowiki>
  struct structRoadNetworkTypeCurvePart
  {
      int                                  NoOfCharsInCurvePartName;
      ascii[NoOfCharsInCurvePartName]      CurvePartName;
      int                                  ObjectId;
      short                                CurvePartType;
  }
</nowiki></code>
=== structRoadNetworkTypeSpecialPart ===
<code><nowiki>
  struct structRoadNetworkTypeSpecialPart
  {
      int                                  NoOfCharsInSpecialPartName;
      ascii[NoOfCharsInSpecialPartName]    SpecialPartName;
      int                                  ObjectId;
      short                                SpecialPartType;
      short                                CanChangeBankAngle;
  }
</nowiki></code>
=== structRoadNetworkTypeTerminatorPart ===
<code><nowiki>
  struct structRoadNetworkTypeTerminatorPart
  {
      int                                  NoOfCharsInTerminatorPartName;
      ascii[NoOfCharsInTerminatorPartName] TerminatorPartName;
      int                                  ObjectId;
      short                                TerminatorPartType;
      short                                CanChangeBankAngle;
  }
</nowiki></code>
=== structLayer ===
<code><nowiki>
  struct structLayer
  {
      int                                  NoOfCharsInTerminatorPartName;
      ascii[NoOfCharsInTerminatorPartName] TerminatorPartName;
      int                                  ObjectId;
      short                                TerminatorPartType;
      short                                CanChangeBankAngle;
  }
</nowiki></code>
== Enums ==
=== ObjectClassEnum ===
<code><nowiki>
  enum ObjectClassEnum
  {
    Natural = 1,
    Artificial = 2,
    Road = 3
  }
</nowiki></code>
=== MarkerTypeEnum ===
<code><nowiki>
  enum MarkerTypeEnum
  {
    Rectangular = 0,
    Elliptical = 1
  }
</nowiki></code>

Revision as of 08:20, 19 July 2008

Template:unsupported-doc

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)
asciiz Null terminated (0x00) variable length ascii string
ascii fixed length ascii string

Although technically there should never be negetive values for many of the 16 bit & 32 bit values, it's 'safer' in programming terms to use signed datatypes as opposed to unsigned datatypes.


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 { structHeader Header; int NoOfObjectTypes; structObjectType[NoOfObjectTypes] ObjectTypes; short Unknown; short Unknown; short RoadNetworkTypesIndicator; if(RoadNetworkTypesIndicator == 0) { int NoOfRoadNetworkTypes; structRoadNetworkType[NoOfRoadNetworkTypes] RoadNetworkTypes; int Unknown; } int TerrainGrid_X; int TerrainGrid_Z; float[TerrainGrid_Z,TerrainGrid_X] TerrainGridHeights; int NoOfBlueFloats = (TerrainGrid_X / 16) * TerrainGrid_X; float[NoOfBlueFloats] BlueEdgeTerrainHeights; //Always zero values. int Unknown; int NoOfObjects; if (NoOfObjects != 0) { structObject[NoOfObjects] Objects; while (i < NoOfObjects) { short Indicator; if (Indicator != 0) { short Unknown; int InstanceId; float TransformColumn_1_Row_1; // described here to solidly illustrate to reader float TransformColumn_1_Row_2; // this is a standard DirectX Transform matrix float TransformColumn_1_Row_3; // but in COLUMN format; float TransformColumn_2_Row_1; float TransformColumn_2_Row_2; float TransformColumn_2_Row_3; float TransformColumn_3_Row_1; float TransformColumn_3_Row_2; float TransformColumn_3_Row_3; float Unknown; float Unknown; int NoOfCharsInInstanceName; ascii[NoOfCharsInInstanceName] InstanceName; float RelativeSurfaceElevation; byte[4] OutlineColour; // rgba 0xFFFF FFFF means 'default' byte[4] ObjectColour; // rgba 0xFFFF FFFF means 'default' int ObjectTypeId; } } } int NoOfLayers; structLayer[NoOfLayers] Layers; }



Structures

structLayer

struct structLayer { int NoOfCharsInLayerName1; ascii[NoOfCharsInLayerName1] LayerName1; int LayerSizeType; int NoOfCharsInLayerName2; ascii[NoOfCharsInLayerName2] LayerName2; short DefaultIndicator; int NoOfTerrainMaterials; if (NoOfTerrainMaterials != 0) { structTerrainMaterial[NoOfTerrainMaterials] TerrainMaterials; } }


structTerrainMaterial

struct structTerrainMaterial { int Unknown; int NoOfCharsInMaterialName; ascii[NoOfCharsInMaterialName] MaterialName; int Unknown; }



structObjectType

struct structObjectType { int NoOfCharsInObjectModelFilename; ascii[NoOfCharsInObjectModelFilename] ModelFilename; int NoOfCharsInObjectName; ascii[NoOfCharsInObjectName] ObjectTypeName; int ObjectClassId; byte[4] OutlineColour; // rgba 0xFFFF FFFF means 'default' byte[4] ObjectColour; // rgba 0xFFFF FFFF means 'default' switch (ObjectClassId) { case ObjectClassEnum.Natural // 1 { byte[118] VariousInfo; } case ObjectClassEnum.Artificial // 2 { byte[118] VariousInfo; } case ObjectClassEnum.Road // 3 { byte[214] VariousInfo; } } int NoOfArtificialSubObjects; if (NoOfArtificialSubObjects != 0) { structArtificialSubObject[NoOfArtificialSubObjects] ArtificialSubObjects; } int MarkerType; //See MarkerTypeEnum int ObjectTypeId = VariousInfo.Offset(16).[4].ToInt; // The 4-bytes at offset 16 in the VariousInfo is the ObjectTypeId. }

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.
The most important data is the ObjectTypeId found at the 16th byte and is an 4-byte int.


structArtificialSubObject

struct structArtificialSubObject { int NoOfCharsInArtificialSubObjectName; ascii[NoOfCharsInArtificialSubObjectName] ArtificialSubObjectName; int Something1; int Something2; float[6] arySomethingFloats; }


structRoadNetworkType

struct structRoadNetworkType { int NoOfCharsInRoadNetworkTypeName; ascii[NoOfCharsInRoadNetworkTypeName] NetworkTypeName; byte[4] KeyPartsColour; // rgba 0xFFFF FFFF means 'default' byte[4] NormalPartsColour; // rgba 0xFFFF FFFF means 'default' short FilledLine; // 0x0000=No, 0x0100=Yes float[4] Unknown; // 4 x Unknown floats int NoOfStraightParts; if (NoOfStraightParts != 0) { structRoadNetworkTypeStraightPart[NoOfStraightParts] RoadNetworkTypeStraightParts; } int NoOfCurveParts; if (NoOfCurveParts != 0) { structRoadNetworkTypeCurvePart[NoOfCurveParts] RoadNetworkTypeCurveParts; } int NoOfSpecialParts; if (NoOfSpecialParts != 0) { structRoadNetworkTypeSpecialPart[NoOfSpecialParts] RoadNetworkTypeSpecialParts; } int NoOfTerminatorParts; if (NoOfTerminatorParts != 0) { structRoadNetworkTypeTerminatorPart[NoOfTerminatorParts] RoadNetworkTypeTerminatorParts; } }


structRoadNetworkTypeStraightPart

struct structRoadNetworkTypeStraightPart { int NoOfCharsInStraightPartName; ascii[NoOfCharsInStraightPartName] StraightPartName; int ObjectId; short StraightPartType; short CanChangeBankAngle; }


structRoadNetworkTypeCurvePart

struct structRoadNetworkTypeCurvePart { int NoOfCharsInCurvePartName; ascii[NoOfCharsInCurvePartName] CurvePartName; int ObjectId; short CurvePartType; }


structRoadNetworkTypeSpecialPart

struct structRoadNetworkTypeSpecialPart { int NoOfCharsInSpecialPartName; ascii[NoOfCharsInSpecialPartName] SpecialPartName; int ObjectId; short SpecialPartType; short CanChangeBankAngle; }


structRoadNetworkTypeTerminatorPart

struct structRoadNetworkTypeTerminatorPart { int NoOfCharsInTerminatorPartName; ascii[NoOfCharsInTerminatorPartName] TerminatorPartName; int ObjectId; short TerminatorPartType; short CanChangeBankAngle; }


structLayer

struct structLayer { int NoOfCharsInTerminatorPartName; ascii[NoOfCharsInTerminatorPartName] TerminatorPartName; int ObjectId; short TerminatorPartType; short CanChangeBankAngle; }


Enums

ObjectClassEnum

enum ObjectClassEnum { Natural = 1, Artificial = 2, Road = 3 }

MarkerTypeEnum

enum MarkerTypeEnum { Rectangular = 0, Elliptical = 1 }