wow-m2

Crates.iowow-m2
lib.rswow-m2
version0.3.2
created_at2025-06-14 01:44:28.809976+00
updated_at2025-08-29 04:00:57.039031+00
descriptionParser, validator, and converter for World of Warcraft M2 model files with animation support
homepagehttps://github.com/wowemulation-dev/warcraft-rs
repositoryhttps://github.com/wowemulation-dev/warcraft-rs
max_upload_size
id1712029
size366,823
WoW Emulation Panda King (wowemulation-panda)

documentation

https://docs.rs/wow-m2

README

wow-m2

A Rust library for parsing, validating, and converting World of Warcraft M2 model files.

Crates.io Version docs.rs License

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
  • ✅ 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:

[dependencies]
wow-m2 = "0.3.0"

Or use cargo add:

cargo add wow-m2

Usage

Basic Example

use wow_m2::{M2Model, M2Version, M2Converter};

// Load a model
let data = std::fs::read("path/to/model.m2")?;
let mut cursor = std::io::Cursor::new(data);
let model = M2Model::parse(&mut cursor)?;

// Print basic information
println!("Model version: {:?}", model.header.version());
println!("Vertices: {}", model.vertices.len());
println!("Bones: {}", model.bones.len());

// Convert to a different version
let converter = M2Converter::new();
let converted = converter.convert(&model, M2Version::WotLK)?;
// Save the converted model
let output_data = converted.write_to_bytes()?;
std::fs::write("path/to/converted.m2", output_data)?;

Working with Skin Files

use wow_m2::Skin;

// Load a skin file
let data = std::fs::read("path/to/model00.skin")?;
let mut cursor = std::io::Cursor::new(data);
let skin = Skin::parse(&mut cursor)?;

// Access submesh information
for submesh in &skin.submeshes {
    println!("Submesh {}: {} vertices, {} triangles",
        submesh.id, submesh.vertex_count, submesh.triangle_count);
}

Version Support

The library supports parsing versions by both numeric format and expansion names:

use wow_m2::M2Version;

// Using version numbers
let version = M2Version::from_string("3.3.5a")?;  // WotLK

// Using expansion names
let version = M2Version::from_expansion_name("wotlk")?;
let version = M2Version::from_expansion_name("MoP")?;

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 versions
  • analyze_model.rs - Analyze model structure and contents
  • validate_model.rs - Validate model integrity

License

Licensed under either of:

at your option.

Contributing

See CONTRIBUTING.md for guidelines.

References

Commit count: 125

cargo fmt