====== OFP Wrp File Format 1WVR ====== [[https://www.pmctactical.org/forum/viewforum.php?f=43|OFP Forum]], [[:ofp|OFP Home]], [[ofp:file_formats|OFP File Formats]], [[ofp:tools|OFP Tools]], [[ofp:missions|OFP Missions]], [[ofp:modeling|OFP 3D Modeling]], [[ofp:terrain|OFP Terrain]] **Operation Flashpoint (OFP)** aka ArmA: Cold War Assault (CWA) ====== General ====== WVR type 1 was released as a OFP CWC demo island For a general description WVR-WRP file construct, see [[ofp:file_formats:4wvr|WRP - 4WVR]]. ====== Conventions ====== [[arma:file_formats:generic_data_types|File format generic data types]] (link to ArmA namespace) ====== Structure ====== WVR1 { WVR1Header Header; Texture Textures[...]; Model Models[...]; Net Nets[...]; } **WVR1Header** WVR1Header // same as WVR4 except for the signature of course { char Signature[4]; //"1WVR" ulong Xsize; //(=128) cell dimension (wvr4 is 256) ulong Ysize; //(=128) cell dimension } **Texture** Texture { ushort Elevations [Ysize][Xsize]; // in centimetres. see 4WVR documentation ushort TextureIndex[Ysize][Xsize]; //Each 'index' refers to a filename below. Range 0..255 4WVR is 1..511 Asciiz TextureFilenames[256][32]; //"LandText\\mo.pac\0LandText.pi.pac.........." } Unlike 4WVR the table is limited to 256 (not 512) entries. Unlike 4WVR the names can be * replicated * scattered anywhere Unlike 4WVR there is no dummy, 0 index. the first entry is used. There are 'holes' in the table (eg no strings) where that paa file was removed ====== Elevations ====== Elevations are expressed as an integral of the gridsize. Since the gridsize for ofp is a fixed 50 meters, to convert the value into meters: RealHeight = Elevations[x][y] * 0.05; ====== TextureIndex ====== Each cell on the map references an texture file (pac/paa) and an elevation for that text at that cell position. Since there could be myriads of 'sea' texture (eg), rather than have each cell list it's texture, it references a texture list via an index. In this way, THE texture which is common to many cells (at sometimes differing elevations) is only stored once. A max of 256 texture files can be listed. Each is held as an asciiz string inside a fixed 32 byte record. Eg max length of file name is 31 characters. ====== Model ====== Model// 64 byte structure { XYZTriplet XYZTriplet; // in gridsize scale. eg *50.0 meters float heading; // in Cartesian degrees NOT polar radians char P3dModelName[48]; // "Data3d\Smrk.p3d (WVR4 is 76) } * Unlike wvr4, wvr1 has no object id * Unlike wvr4, only the xyz position, and an orientation is supplied. In wvr4, these were replaced by the standard Microsoft 12 float array * The XYZ triplet is specified in gridsize. to get real meters, multiply by 50. * The Y component (the height) is a relative measurement. eg an offset from the calculated position of the model on the land surface. * in all other formats this value is absolute asl. not, relative. * Cartesian rotation is clockwise. Polar rottion is counter clock. Therefore, Polar (wrp) degrees = -Cartesian degrees. ====== Net ====== Net//64 byte structure { NetHeader NetHeader; Subnet SubNets[...]; } ====== NetHeader ====== NetHeader { Asciiz NetName[24]; //"LandText\Silnice.pac" null termed ulong Always; //0x00cd9100 or 0x00d4c600 ulong Always; //0x00bfd400 ulong Always; //0x00000047 ulong Always; //0x00000000 ulong Always; //0x0069fbb0; ulong Type; //0,1 or 2 XYZTriplet XYZTriplet; //[0.152,0.15,0.1] typical float Scale; //3.5, 4.5 or 5.5 } The last NetHeader (eg, last net) contains the NetName "EndOfNets". There are NO subnets. Endof Nets also marks end of file. ====== Subnet ====== SubNet { float X,Y; //* gridsize of 50 if (X || Y) { XYZTriplet Triplet; //very similar content to header triplet float Stepping; ulong Always; //0x0046931A ulong Always; //0x00980778 or 0x733760 } } A block of subnets continue for each Netheader until X==Y==0 Stepping appears to incrementally increase around 5.0 to each subsequent subnet ====== FilePaths ====== Despite the impression given (lack of a leading \) All file names (pac/paa and p3d files) are hard wired to the (virtual) pboRoot\ directory. From the very beginning of OFP, this lack of relative addressing has persisted: Making the transfer of models into other addons a difficult.