using System;
using System.IO;
using MikuMikuDance.Motion.Motion2;
namespace MikuMikuDance.Motion
{
///
/// MikuMikuDance(MMD)モーションの読み込みを行うFactory Class
///
public static class MotionManager
{
///
/// ファイルからMMDモーションを読み込む
///
/// MMDモーションファイル
/// 変換先座標系
/// MMDモーションオブジェクト
/// スケーリング値
public static MMDMotion Read(string filename, CoordinateType coordinate, float scale=1.0f)
{
//フルパス取得
filename = Path.GetFullPath(filename);
//ファイルチェック
if (!File.Exists(filename))
throw new FileNotFoundException("MMDモーションファイル:" + filename + "が見つかりません");
//戻り値用変数
MMDMotion result = null;
//ファイルリーダー
using (FileStream fs = new FileStream(filename, FileMode.Open))
{
BinaryReader reader = new BinaryReader(fs);
//マジック文字列
string magic = MMDMotion2.GetString(reader.ReadBytes(30));
if (magic.Substring(0, 20) != "Vocaloid Motion Data")
throw new FileLoadException("MMDモーションファイルではありません");
//バージョン
int version = Convert.ToInt32(magic.Substring(21));
if (version == 2)
result = new MMDMotion2();
else
throw new FileLoadException("version=" + version.ToString() + "モデルは対応していません");
result.Read(reader, coordinate,scale);
if (fs.Length != fs.Position)
Console.WriteLine("警告:ファイル末尾以降に不明データ?");
fs.Close();
}
return result;
}
///
/// ファイルからMMDモーションを読み込む
///
/// MMDモーションファイル
/// スケーリング値
/// MMDモーションオブジェクト
public static MMDMotion Read(string filename, float scale=0.1f)
{
return Read(filename, CoordinateType.LeftHandedCoordinate, scale);
}
///
/// ファイルへの書き出し
///
/// ファイル名
/// モーション
/// スケーリング値
public static void Write(string filename, MMDMotion motion, float scale=1f)
{
//フルパス取得
filename = Path.GetFullPath(filename);
//ファイルリーダー
using (FileStream fs = new FileStream(filename, FileMode.Create))
{
BinaryWriter writer = new BinaryWriter(fs);
//マジック文字列
if (motion is MMDMotion2)
{
writer.Write(MMDMotion2.GetBytes("Vocaloid Motion Data 0002", 25));
writer.Write((byte)0);
writer.Write(MMDMotion2.GetBytes("JKLM", 4));
}
else
new NotImplementedException("その他のバーションは未作成");
motion.Write(writer, scale);
fs.Close();
}
}
}
}