using System; using System.Collections.Generic; using System.IO; using UnityEngine; public class CMMImporter { public static bool ImportOnlyBone(string fileName, GameObject parent) { CMMImporter.CMModel cmmodel = new CMMImporter.CMModel(); cmmodel.Deserialize(fileName); foreach (CMMImporter.CMModel.CMObject cmobject in cmmodel.bones) { Transform transform = parent.transform.Find(cmobject.path); if (transform == null) { Debug.Log("skip !! " + cmobject.path); } else { transform.localPosition = cmobject.localPos; transform.localRotation = cmobject.localRot; transform.localScale = cmobject.localScale; } } return true; } public static bool ImportModel(string fileName, GameObject parent, TMorph tgtMorph) { CMMImporter.CMModel cmmodel = new CMMImporter.CMModel(); cmmodel.Deserialize(fileName); foreach (CMMImporter.CMModel.CMObject cmobject in cmmodel.bones) { Transform transform = parent.transform.Find(cmobject.path); if (transform == null) { Debug.Log("skip !! " + cmobject.path); } else { transform.localPosition = cmobject.localPos; transform.localRotation = cmobject.localRot; transform.localScale = cmobject.localScale; } } foreach (CMMImporter.CMModel.CMMorph cmmorph in cmmodel.morphs) { if (!tgtMorph.hash.Contains(cmmorph.name)) { Debug.LogError("target morph name is not found. " + cmmorph.name); } else { tgtMorph.SetBlendValues(cmmorph.idx, cmmorph.value); } } tgtMorph.FixBlendValues(); return true; } private class CMModel { public bool Serialize(string fileName) { FileStream fileStream = new FileStream(fileName, FileMode.CreateNew); BinaryWriter binaryWriter = new BinaryWriter(fileStream); binaryWriter.Write("CMMODEL"); binaryWriter.Write(100); binaryWriter.Write(this.bones.Count); for (int i = 0; i < this.bones.Count; i++) { this.bones[i].Serialize(binaryWriter); } binaryWriter.Write(this.morphs.Count); for (int j = 0; j < this.morphs.Count; j++) { this.morphs[j].Serialize(binaryWriter); } fileStream.Close(); binaryWriter.Close(); return true; } public bool Deserialize(string fileName) { this.bones.Clear(); this.morphs.Clear(); FileStream fileStream = new FileStream(fileName, FileMode.Open); BinaryReader binaryReader = new BinaryReader(fileStream); string text = binaryReader.ReadString(); int num = binaryReader.ReadInt32(); int num2 = binaryReader.ReadInt32(); for (int i = 0; i < num2; i++) { this.bones.Add(new CMMImporter.CMModel.CMObject(binaryReader)); } int num3 = binaryReader.ReadInt32(); for (int j = 0; j < num3; j++) { this.morphs.Add(new CMMImporter.CMModel.CMMorph(binaryReader)); } fileStream.Close(); binaryReader.Close(); return true; } private const int CMMODEL_VER = 100; public List bones = new List(); public List morphs = new List(); public class CMObject { public CMObject(Transform tr, string parentPath) { this.name = tr.name; this.parentName = ((!(tr.parent != null)) ? null : tr.parent.name); this.path = this.name + parentPath; this.localPos = tr.localPosition; this.localRot = tr.localRotation; this.localScale = tr.localScale; } public CMObject(BinaryReader br) { this.name = br.ReadString(); this.parentName = br.ReadString(); this.path = br.ReadString(); this.localPos.x = br.ReadSingle(); this.localPos.y = br.ReadSingle(); this.localPos.z = br.ReadSingle(); this.localRot.x = br.ReadSingle(); this.localRot.y = br.ReadSingle(); this.localRot.z = br.ReadSingle(); this.localRot.w = br.ReadSingle(); this.localScale.x = br.ReadSingle(); this.localScale.y = br.ReadSingle(); this.localScale.z = br.ReadSingle(); } public bool Serialize(BinaryWriter bw) { bw.Write(this.name); bw.Write((this.parentName != null) ? this.parentName : string.Empty); bw.Write(this.path); bw.Write(this.localPos.x); bw.Write(this.localPos.y); bw.Write(this.localPos.z); bw.Write(this.localRot.x); bw.Write(this.localRot.y); bw.Write(this.localRot.z); bw.Write(this.localRot.w); bw.Write(this.localScale.x); bw.Write(this.localScale.y); bw.Write(this.localScale.z); return true; } public string name; public string parentName; public string path; public Vector3 localPos; public Quaternion localRot; public Vector3 localScale; } public class CMMorph { public CMMorph(string name, int idx, float value) { this.name = name; this.idx = idx; this.value = value; } public CMMorph(BinaryReader br) { this.name = br.ReadString(); this.idx = br.ReadInt32(); this.value = br.ReadSingle(); } public bool Serialize(BinaryWriter bw) { bw.Write(this.name); bw.Write(this.idx); bw.Write(this.value); return true; } public string name; public int idx; public float value; } } }