wow-m2 0.6.4

Parser, validator, and converter for World of Warcraft M2 model files with animation support
Documentation
# M2 Version Differences Documentation

## Version-Specific Findings

### Vanilla (1.12.1) - Version 256
- **Embedded Skins**: Yes, all skin data embedded in M2 file
- **Bone Count**: Typically fewer bones (e.g., HumanMale: 96 bones)
- **Animation Count**: Slightly fewer animations (e.g., HumanMale: 142)
- **Animation Timing**: Uses start/end timestamps (requires subtraction for duration)
- **Submesh Size**: 32-byte aligned structures
- **File Size**: Larger due to embedded skins (e.g., HumanMale: 2.5MB)

### The Burning Crusade (2.4.3) - Version 260
- **Embedded Skins**: Yes, still embedded like vanilla
- **Bone Count**: More bones for enhanced detail (e.g., HumanMale: 119 bones)
- **Animation Count**: More animations (e.g., HumanMale: 143)
- **Animation Timing**: Transition period - some duration values appear corrupted
- **Submesh Size**: 32-byte aligned structures (same as vanilla)
- **File Size**: Smaller with better compression (e.g., HumanMale: 1.4MB)
- **New Features**: Particle emitters and ribbon effects introduced

### Key Parsing Differences

#### Animation Duration Calculation
```rust
// Version 256 (Vanilla)
let duration_ms = end_timestamp.saturating_sub(animation.start_timestamp);

// Version 260+ (TBC and later)
let duration_ms = animation.start_timestamp; // Direct duration value
```

#### Embedded Skin Detection
```rust
pub fn has_embedded_skins(&self) -> bool {
    // Vanilla (256) and TBC (260-263) have embedded skins
    // WotLK (264+) moved to external .skin files
    self.header.version <= 263 && self.header.views.count > 0
}
```

## Validation Results

### Python Parser
- ✅ Vanilla (256): Full support with all data extracted
- ✅ TBC (260): Full support with all data extracted
- Both versions parse vertices, bones, animations, textures successfully

### Rust Parser
- ✅ Vanilla (256): Complete parsing with enhanced data extraction
- ✅ TBC (260): Complete parsing with enhanced data extraction
- Successfully handles version-specific differences

## Known Issues

1. **Animation Duration Values**: Some TBC animations show extremely large duration values (e.g., 1073787628ms), suggesting:
   - Possible float/int conversion issues
   - Endianness problems in specific fields
   - Different encoding for certain animation types

2. **Texture Names**: Both versions show empty texture names in embedded data
   - Names likely stored in separate DBC files
   - Referenced by texture type IDs instead

## Recommendations

1. Add version-specific validation for animation durations
2. Implement sanity checks for unrealistic values
3. Consider version-specific parsing paths for optimal accuracy
4. Add more TBC models to test suite for broader validation