WWF

From wowdev
Revision as of 15:24, 14 June 2018 by Barncastle (talk | contribs)
Jump to navigation Jump to search
This section only applies to versions ≥ Battle.

WWF files are used to control particles in the particulate weather system that was introduced in Battle. Unlike most other files, the WWF format uses a binary header with JSON data. This has the advantage that all field names are documented within the data itself. Additionally, the client contains meta-style information which includes the human-readable variant of these names.

Particulate based weather is enabled for DB/Weather records with a m_type of 5 and/or a m_effectType of 4, that either join to the DB/WeatherXParticulate table or have their particulateFileDataID set. Both joins reference the required WWF files by fileDataId.

While standalone WWF files exist (documented below), the WWF specification itself is much larger and is used client-wide e.g. mpv.wdt. As such, changes to WWFParticulateGroup correlate with PVMI size changes and usually incur a mpv.wdt version change.

Header

char unk_0x0[4]; // always 0 filled
uint32_t magic;  // fnv1a(type_as_string), i.e. for "WWFParticulateGroup", 0x932c64b4
char data[];

Data

C-style representation of the JSON data. All enum values are stored as their string representation.

Note: Only the standalone WWF file structure is documented below.

WWFParticulateGroup

typedef C2Vector WWFVec2;
typedef C3Vector WWFVec3;
typedef C3Vector WWFGraphNodeVec3;
typedef CImVector WWFArgb;

struct WWFParticulateGroup
{
  int32_t placeHolder;
  WWFParticulateGeoType geometryType;
  WWFParticulateRenderMode renderMode;
  int32_t particleCount;
  float strength;                      // Default Particulate Strength
  char enableEmissionGraph;            // Enable Particulate Strength Graph
  WWFGraphNodeVec3 graphNodes[];       // Particulate Strength Graph
  char occlusion;                      // Enable Occlusion Testing
  float occlusionFadeDistance;
  float occlusionIgnoreChance;
  char enableGroundParticulate;
 #if ≥ Battle (8.0.1.26567)
  WWFParticulateGeoType groundGeometryType;
  WWFParticulateRenderMode groundRenderMode;
  uint32_t groundTextureID;            // fileDataId
  uint32_t groundSheetWidth;           // Ground Cell X Count
  uint32_t groundSheetHeight           // Ground Cell Y Count
  uint32_t groundAnimationCount;
  float groundAnimationSpeed;
  char groundEnableAngularTransition;  // Ground Enable Texture Angle Fading
  float groundDecayTime;
  WWFVec2 groundParticulateSize;
  WWFVec2 groundParticulateSizeVariance;
 #endif
  char depthFading;                    // Enable Depth Buffer Fading
  float depthFadeDistance;
  char useLookDirectionOffset;
  float groupEdgeFadeDistance;
  float cameraNearFade;
  float cameraFarFade;
  char useForceDirection;
  WWFVec3 velocityMean;
  WWFVec3 forceDirection;
  float rotation;
  float tilt;
  float speed;
  WWFVec3 velocityVariance;
  char enableCompute;                  // Enable Dynamic Rendering
  char enableWindEffects;
 #if ≥ Battle (8.0.1.26433)
  WWFVec2 massRange;
 #endif
  char useWandering;
  float wanderSpeed;
  WWFVec2 wanderAmount;
  WWFParticulateConstraintType constraint; // Volume Constraint
  char inclusiveRestraint;             // Use Inclusive Constraint
  float groupSize;                     // Particulate Group Size
  WWFVec3 particulateSize;
  WWFVec2 particulateSizeVariance;
  char randomRotation;                 // Randomize Initial Particle Orientation
  char useParticleRotation;
  float rotationSpeedMean;             // Particle Rotation Speed
  float rotationSpeedVariance;         // Particle Rotation Speed Variance
  char randomizeRotationDirection;
  float useParticleFading;
  float particleFadeTotalTime;         // Fade Loop Length
  float particleFadeTimeBegin;         // Fade Start Time
  float particleFadeTimeEnd;           // Fade End Time
  float particleFadeTimeVariance;
  char enableHeightFading;
  WWFParticulateHeightFadeMode heightFadeMode;
  float heightFadeStartDistance;       // Height Fade Max Height
  float heightFadeVariance;
  float heightFadeTransitionDistance;
  char enableDeltaCulling;
  float deltaCullingMax;
  WWFParticulateBlendMode blendMode;
 #if ≥ Battle (8.0.1.26433)
  char useSkyFogColor;                 // Use Sky Fog Color As Diffuse
 #endif
 #if ≥ Battle (8.0.1.26567)
  char useAmbientLighting;
 #endif
  WWFArgb color;
  uint32_t textureID;                  // fileDataId
  char useAnimation;
  int32_t sheetWidth;                  // Cell X Count
  int32_t sheetHeight;                 // Cell Y Count
  int32_t animationCount;
  float animationSpeed;
  char enableAngularTransition;        // Enable Texture Angle Fading
}

enum WWFParticulateGeoType
{
  Quads,
  Triangles
}

enum WWFParticulateRenderMode
{
  VelocityBillboard,
  CameraBillboard
}

enum WWFParticulateConstraintType
{
  Center,
  Nearest,
  None
}

enum WWFParticulateHeightFadeMode
{
  Flat,
  Relative,
  RelativeFollow
}

enum WWFParticulateBlendMode
{
  Additive,
  Blended
}