Kelsidavis-WoWee/tools/editor/FORMAT_SPEC.md
Kelsi f6dfc295ab feat: WOM2 animated model format with bones and keyframe animation
Upgrades WOM from geometry-only (WOM1) to fully animated (WOM2):

- WOM2 magic (0x324D4F57) for animated models, WOM1 for static
- Vertex extended: +boneWeights[4] +boneIndices[4] (40 bytes vs 32)
- Bone data: keyBoneId, parentBone, pivot, flags per bone
- Animation data: per-sequence per-bone keyframes with translation,
  rotation (quaternion), scale at millisecond timestamps
- fromM2() now preserves all skeletal data: bone hierarchy, weights,
  and per-sequence keyframes from M2 animation tracks
- Backward compatible: WOM1 files load without bone data (32-byte
  vertices read and padded with default bone weights)
- FORMAT_SPEC.md updated with WOM2 binary layout
2026-05-05 16:16:07 -07:00

4.2 KiB
Raw Blame History

Wowee Open Format Specification v1.1

Novel file formats for custom WoW zone content. No Blizzard IP.

WOT — Wowee Open Terrain (JSON metadata)

  • Extension: .wot
  • Contains: tile coords, texture list, per-chunk layers/holes, water data, doodad placements (M2 objects), WMO placements (buildings)
  • Key: "format": "wot-1.0"
  • Placement fields: doodadNames[], doodads[] (nameId, uniqueId, pos, rot, scale, flags)
  • WMO fields: wmoNames[], wmos[] (nameId, uniqueId, pos, rot, flags, doodadSet)

WHM — Wowee HeightMap (binary)

  • Extension: .whm
  • Magic: WHM1 (0x314D4857)
  • Layout: magic(4) + chunks(4) + vertsPerChunk(4) + per-chunk data × 256
  • Per-chunk: baseHeight(4) + heights145 + alphaSize(4) + alphaData(alphaSize)
  • Alpha data: raw alpha blend maps for texture layers (same format as ADT MCAL)
  • Backward compatible: older WHM files without alpha data still load (alphaSize=0)

WOM — Wowee Open Model (binary)

  • Extension: .wom
  • Magic: WOM1 (0x314D4F57) for static, WOM2 (0x324D4F57) for animated
  • Layout: magic(4) + vertCount(4) + indexCount(4) + texCount(4) + bounds(28) + name + vertices + indices + texPaths
  • WOM1 Vertex: position(vec3) + normal(vec3) + texCoord(vec2) = 32 bytes
  • WOM2 Vertex: + boneWeights(4) + boneIndices(4) = 40 bytes
  • WOM2 Bones: boneCount(4) + [keyBoneId(4) + parentBone(2) + pivot(12) + flags(4)] × N
  • WOM2 Animations: animCount(4) + [id(4) + duration(4) + speed(4) + per-bone keyframes] × N
  • Keyframe: timeMs(4) + translation(12) + rotation(16) + scale(12) = 44 bytes
  • Backward compatible: WOM1 files load without bone/animation data

WOB — Wowee Open Building (binary)

  • Extension: .wob
  • Magic: WOB1 (0x31424F57)
  • Layout: magic(4) + groupCount(4) + portalCount(4) + doodadCount(4) + bounds(4) + name + groups + portals + doodads
  • Group: name + vertexCount(4) + indexCount(4) + texCount(4) + outdoor(1) + bounds(24)
    • vertices(pos+normal+uv+color) + indices + texPaths + materialCount(4) + materials
  • Material: texturePath + flags(4) + shader(4) + blendMode(4)
  • Doodad: modelPath + position(12) + rotation(12) + scale(4)
  • Portal: groupA(4) + groupB(4) + vertexCount(4) + vertices

WCP — Wowee Content Pack (archive)

  • Extension: .wcp
  • Magic: WCP1 (0x31504357)
  • Layout: magic(4) + fileCount(4) + infoJsonSize(4) + infoJSON + [pathLen(2) + path + dataSize(4) + data] × N
  • Info JSON includes categorized file list (terrain/model/building/texture/data)

zone.json — Map Definition

  • Replaces WDT
  • Fields: mapName, displayName, mapId, biome, baseHeight
  • hasCreatures, description, tiles array, files map
  • doodadNames[], doodads[], wmoNames[], wmos[] for placed objects
  • editorVersion for compatibility tracking

JSON DBC — Data Table Replacement

  • Replaces binary DBC files
  • Format: {"format": "wowee-dbc-json-1.0", "records": [...], "fieldCount": N}
  • Records are arrays of mixed types: integers, floats, strings
  • Client loads via DBCFile::loadJSON() when found in custom_zones/ or output/

PNG Textures — Texture Replacement

  • Replaces BLP texture files
  • Standard PNG format, loaded by client's texture override system
  • Editor auto-converts BLP→PNG on export via stb_image_write

WOC — Wowee Open Collision (binary)

  • Extension: .woc
  • Magic: WOC1 (0x31434F57)
  • Layout: magic(4) + triCount(4) + tileX(4) + tileY(4) + boundsMin(12) + boundsMax(12) + triangles
  • Triangle: v0(12) + v1(12) + v2(12) + flags(1) = 37 bytes
  • Flags: 0x01=walkable, 0x02=water, 0x04=steep, 0x08=indoor
  • Generated from terrain heightmap with slope classification (50 deg threshold)
  • Respects terrain holes (skips triangles in hole regions)

Terrain Stamps (.json)

  • Portable terrain feature snapshots (mountains, craters, etc.)
  • Format: {"format": "wowee-stamp-1.0", "vertices": [[dx, dy, height], ...]}
  • Can be saved/loaded across zones and sessions

Open Format Scoring (0-7)

  1. WOT terrain metadata present
  2. WHM heightmap with valid magic
  3. zone.json map definition
  4. PNG textures present
  5. WOM models with valid magic
  6. WOB buildings with valid magic
  7. WOC collision mesh with valid magic

All formats are novel, portable, and open for redistribution.

No Blizzard intellectual property is used in any format definition.