wow-m2
A Rust library for parsing, validating, and converting World of Warcraft M2 model files.
Overview
wow-m2 provides comprehensive support for M2 model files across all World of Warcraft expansions from Classic (1.12.1) through The War Within (11.x). The library handles:
- M2 Models (
.m2/.mdx) - 3D character, creature, and object models - Skin Files (
.skin) - Level-of-detail and submesh information - Animation Files (
.anim) - External animation sequences - BLP Texture References - Re-exports BLP support from the wow-blp crate
Features
- ✅ Parse and validate M2 models from all WoW versions
- ✅ Convert models between different game versions
- ✅ Coordinate system transformations for Blender, Unity, Unreal Engine
- ✅ Support for all chunk types (bones, animations, textures, etc.)
- ✅ Comprehensive error handling with detailed context
- ✅ Zero-copy parsing where possible for performance
- ✅ Optional serde support for serialization
Installation
Add to your Cargo.toml:
[]
= "0.3.0"
Or use cargo add:
Usage
Basic Example
use ;
// Load a model
let data = read?;
let mut cursor = new;
let model = parse?;
// Print basic information
println!;
println!;
println!;
// Convert to a different version
let converter = new;
let converted = converter.convert?;
// Save the converted model
let output_data = converted.write_to_bytes?;
write?;
Working with Skin Files
use Skin;
// Load a skin file
let data = read?;
let mut cursor = new;
let skin = parse?;
// Access submesh information
for submesh in &skin.submeshes
Coordinate System Transformations
Transform WoW models for use in common 3D applications:
use ;
// Load a model
let model = load?;
// Transform for Blender (right-handed: X=right, Y=forward, Z=up)
let transformer = new;
for vertex in &model.vertices
// Or transform individual coordinates
let wow_pos = model.vertices.position;
let unity_pos = transform_position;
let unreal_pos = transform_position;
Why coordinate transformation is needed: WoW uses X=North, Y=West, Z=Up, which differs from standard 3D applications. Without transformation, models appear rotated or mirrored.
Version Support
The library supports parsing versions by both numeric format and expansion names:
use M2Version;
// Using version numbers
let version = from_string?; // WotLK
// Using expansion names
let version = from_expansion_name?;
let version = from_expansion_name?;
Supported Versions
| Expansion | Version Range | Support |
|---|---|---|
| Classic | 1.12.x | ✅ Full |
| TBC | 2.4.x | ✅ Full |
| WotLK | 3.3.x | ✅ Full |
| Cataclysm | 4.3.x | ✅ Full |
| MoP | 5.4.x | ✅ Full |
| WoD | 6.2.x | ✅ Full |
| Legion | 7.3.x | ✅ Full |
| BfA | 8.3.x | ✅ Full |
| Shadowlands | 9.x | ✅ Full |
| Dragonflight | 10.x | ✅ Full |
| The War Within | 11.x | ✅ Full |
Examples
See the examples/ directory for more detailed examples:
convert_model.rs- Convert models between versionsanalyze_model.rs- Analyze model structure and contentsvalidate_model.rs- Validate model integrity
Documentation
- Coordinate Systems Guide - Comprehensive guide to WoW coordinate systems and transformations
- API Documentation - Complete API reference
License
Licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT license (LICENSE-MIT)
at your option.
Contributing
See CONTRIBUTING.md for guidelines.