123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System.Text;
- using UnityEngine;
- public class ImportCM2 : MonoBehaviour
- {
- public static byte[] m_aniTempFile = null;
- private static Dictionary<string, Material> m_dicCacheMaterial = new Dictionary<string, Material>();
- private static Dictionary<int, KeyValuePair<string, float>> m_hashPriorityMaterials;
- private static byte[] m_matTempFile;
- private static byte[] m_skinTempFile;
- private static string[] properties = new string[7]
- {
- "m_LocalRotation.x", "m_LocalRotation.y", "m_LocalRotation.z", "m_LocalRotation.w", "m_LocalPosition.x", "m_LocalPosition.y",
- "m_LocalPosition.z"
- };
- public static GameObject LoadSkinMesh_R(string filename, string[] filename2, int layer)
- {
- try
- {
- using (AFileBase afileBase = GameUty.FileOpen(filename, null))
- {
- if (m_skinTempFile == null)
- m_skinTempFile = new byte[Math.Max(500000, afileBase.GetSize())];
- else if (m_skinTempFile.Length < afileBase.GetSize())
- m_skinTempFile = new byte[afileBase.GetSize()];
- afileBase.Read(ref m_skinTempFile, afileBase.GetSize());
- }
- }
- catch (Exception ex)
- {
- NDebug.Assert("ファイルが開けませんでした。" + filename + "\n" + ex.Message, false);
- }
- var r = new BinaryReader(new MemoryStream(m_skinTempFile), Encoding.UTF8);
- TBodySkin.OriVert oriVert = new TBodySkin.OriVert();
- var gameObject1 = Instantiate(Resources.Load("seed")) as GameObject;
- gameObject1.layer = layer;
- var gameObject2 = (GameObject)null;
- var hashtable = new Hashtable();
- string str1 = r.ReadString();
- if (str1 != "CM3D2_MESH")
- NDebug.Assert("LoadSkinMesh_R 例外 : ヘッダーファイルが不正です。" + str1, false);
- int num1 = r.ReadInt32();
- string str2 = r.ReadString();
- gameObject1.name = "_SM_" + str2;
- string str3 = r.ReadString();
- int num2 = r.ReadInt32();
- var gameObjectList = new List<GameObject>();
- for (int index = 0; index < num2; ++index)
- {
- var gameObject3 = Instantiate(Resources.Load("seed")) as GameObject;
- gameObject3.layer = layer;
- gameObject3.name = r.ReadString();
- gameObjectList.Add(gameObject3);
- if (gameObject3.name == str3)
- gameObject2 = gameObject3;
- hashtable[gameObject3.name] = gameObject3;
- if (r.ReadByte() != 0)
- {
- var gameObject4 = Instantiate(Resources.Load("seed")) as GameObject;
- gameObject4.name = gameObject3.name + "_SCL_";
- gameObject4.transform.parent = gameObject3.transform;
- hashtable[gameObject3.name + "&_SCL_"] = gameObject4;
- }
- }
- for (int index1 = 0; index1 < num2; ++index1)
- {
- int index2 = r.ReadInt32();
- gameObjectList[index1].transform.parent = index2 < 0 ? gameObject1.transform : gameObjectList[index2].transform;
- }
- for (int index = 0; index < num2; ++index)
- {
- Transform transform = gameObjectList[index].transform;
- float x1 = r.ReadSingle();
- float y1 = r.ReadSingle();
- float z1 = r.ReadSingle();
- transform.localPosition = new Vector3(x1, y1, z1);
- float x2 = r.ReadSingle();
- float y2 = r.ReadSingle();
- float z2 = r.ReadSingle();
- float w = r.ReadSingle();
- transform.localRotation = new Quaternion(x2, y2, z2, w);
- if (2001 <= num1 && r.ReadBoolean())
- {
- float x3 = r.ReadSingle();
- float y3 = r.ReadSingle();
- float z3 = r.ReadSingle();
- transform.localScale = new Vector3(x3, y3, z3);
- }
- }
- int length1 = r.ReadInt32();
- int length2 = r.ReadInt32();
- int length3 = r.ReadInt32();
- oriVert.VCount = length1;
- oriVert.nSubMeshCount = length2;
- gameObject2.AddComponent(typeof(SkinnedMeshRenderer));
- gameObject1.AddComponent(typeof(Animation));
- var component = gameObject2.GetComponent<Renderer>() as SkinnedMeshRenderer;
- component.updateWhenOffscreen = true;
- var transformArray = new Transform[length3];
- for (int index = 0; index < length3; ++index)
- {
- string str4 = r.ReadString();
- if (hashtable.ContainsKey(str4))
- {
- GameObject gameObject3 = !hashtable.ContainsKey(str4 + "&_SCL_")
- ? (GameObject)hashtable[str4]
- : (GameObject)hashtable[str4 + "&_SCL_"];
- transformArray[index] = gameObject3.transform;
- }
- }
- component.bones = transformArray;
- var mesh1 = new Mesh();
- component.sharedMesh = mesh1;
- Mesh mesh2 = mesh1;
- var matrix4x4Array = new Matrix4x4[length3];
- for (int index1 = 0; index1 < length3; ++index1)
- for (int index2 = 0; index2 < 16; ++index2)
- matrix4x4Array[index1][index2] = r.ReadSingle();
- mesh2.bindposes = matrix4x4Array;
- var vector3Array1 = new Vector3[length1];
- var vector3Array2 = new Vector3[length1];
- var vector2Array = new Vector2[length1];
- var boneWeightArray = new BoneWeight[length1];
- for (int index = 0; index < length1; ++index)
- {
- float new_x1 = r.ReadSingle();
- float new_y1 = r.ReadSingle();
- float new_z1 = r.ReadSingle();
- vector3Array1[index].Set(new_x1, new_y1, new_z1);
- float new_x2 = r.ReadSingle();
- float new_y2 = r.ReadSingle();
- float new_z2 = r.ReadSingle();
- vector3Array2[index].Set(new_x2, new_y2, new_z2);
- float newX = r.ReadSingle();
- float newY = r.ReadSingle();
- vector2Array[index].Set(newX, newY);
- }
- mesh2.vertices = vector3Array1;
- mesh2.normals = vector3Array2;
- mesh2.uv = vector2Array;
- oriVert.vOriVert = vector3Array1;
- oriVert.vOriNorm = vector3Array2;
- int length4 = r.ReadInt32();
- if (length4 > 0)
- {
- var vector4Array = new Vector4[length4];
- for (int index = 0; index < length4; ++index)
- {
- float x = r.ReadSingle();
- float y = r.ReadSingle();
- float z = r.ReadSingle();
- float w = r.ReadSingle();
- vector4Array[index] = new Vector4(x, y, z, w);
- }
- mesh2.tangents = vector4Array;
- }
- for (int index = 0; index < length1; ++index)
- {
- boneWeightArray[index].boneIndex0 = r.ReadUInt16();
- boneWeightArray[index].boneIndex1 = r.ReadUInt16();
- boneWeightArray[index].boneIndex2 = r.ReadUInt16();
- boneWeightArray[index].boneIndex3 = r.ReadUInt16();
- boneWeightArray[index].weight0 = r.ReadSingle();
- boneWeightArray[index].weight1 = r.ReadSingle();
- boneWeightArray[index].weight2 = r.ReadSingle();
- boneWeightArray[index].weight3 = r.ReadSingle();
- }
- mesh2.boneWeights = boneWeightArray;
- mesh2.subMeshCount = length2;
- oriVert.bwWeight = boneWeightArray;
- oriVert.nSubMeshCount = length2;
- oriVert.nSubMeshOriTri = new int[length2][];
- for (int submesh = 0; submesh < length2; ++submesh)
- {
- int length5 = r.ReadInt32();
- var triangles = new int[length5];
- for (int index = 0; index < length5; ++index)
- triangles[index] = r.ReadUInt16();
- oriVert.nSubMeshOriTri[submesh] = triangles;
- mesh2.SetTriangles(triangles, submesh);
- }
- int length6 = r.ReadInt32();
- var materialArray = new Material[length6];
- for (int index = 0; index < length6; ++index)
- {
- Material material = ReadMaterial(r, filename2[1 + index]);
- materialArray[index] = material;
- }
- component.materials = materialArray;
- r.Close();
- return gameObject1;
- }
- public static Material ReadMaterial(BinaryReader r, string filename)
- {
- if (m_hashPriorityMaterials == null)
- {
- m_hashPriorityMaterials = new Dictionary<int, KeyValuePair<string, float>>();
- var list = GameUty.FileSystem.GetList("prioritymaterial", AFileSystemBase.ListType.AllFile);
- if (list != null && 0 < list.Length)
- for (int index = 0; index < list.Length; ++index)
- if (Path.GetExtension(list[index]) == ".pmat")
- {
- string fileName = list[index];
- using (AFileBase afileBase = GameUty.FileOpen(fileName, null))
- {
- NDebug.Assert(afileBase.IsValid(), fileName + "を開けませんでした");
- using (var binaryReader = new BinaryReader(new MemoryStream(afileBase.ReadAll()), Encoding.UTF8))
- {
- NDebug.Assert(binaryReader.ReadString() == "CM3D2_PMATERIAL", "ヘッダーエラー\n" + fileName);
- binaryReader.ReadInt32();
- int key1 = binaryReader.ReadInt32();
- string key2 = binaryReader.ReadString();
- float num = binaryReader.ReadSingle();
- NDebug.Assert(!m_hashPriorityMaterials.ContainsKey(key1), "すでにハッシュが登録されています");
- m_hashPriorityMaterials.Add(key1, new KeyValuePair<string, float>(key2, num));
- }
- }
- }
- }
- string str1 = r.ReadString();
- string str2 = r.ReadString();
- string path1 = "DefMaterial/" + r.ReadString();
- Material material;
- var original = Resources.Load(path1, typeof(Material)) as Material;
- if (original == null)
- return original;
- material = Instantiate(original);
- material.name = str1;
- int hashCode1 = material.name.GetHashCode();
- if (m_hashPriorityMaterials != null && m_hashPriorityMaterials.ContainsKey(hashCode1))
- {
- var priorityMaterial = m_hashPriorityMaterials[hashCode1];
- if (priorityMaterial.Key == material.name)
- {
- material.SetFloat("_SetManualRenderQueue", priorityMaterial.Value);
- material.renderQueue = (int)priorityMaterial.Value;
- }
- }
- string str3;
- Vector2 vector2_1;
- Vector2 vector2_2;
- string str4;
- string str5;
- Color color;
- Vector4 vector4;
- while (true)
- {
- string str6 = r.ReadString();
- if (!(str6 == "end"))
- {
- string name = r.ReadString();
- if (str6 == "tex")
- {
- string str7 = r.ReadString();
- if (str7 == "null")
- {
- material.SetTexture(name, null);
- }
- else if (str7 == "tex2d")
- {
- try
- {
- string str8 = r.ReadString();
- str3 = r.ReadString();
- var data = ImportCM.LoadTexture(GameUty.FileSystem, str8 + ".tex", false).data;
- vector2_1.x = r.ReadSingle();
- vector2_1.y = r.ReadSingle();
- vector2_2.x = r.ReadSingle();
- vector2_2.y = r.ReadSingle();
- if (filename == null || !filename.Contains(".mate"))
- {
- var texture2D = new Texture2D(1, 1, TextureFormat.RGBA32, false);
- texture2D.LoadImage(data);
- texture2D.name = str8;
- texture2D.wrapMode = TextureWrapMode.Clamp;
- material.SetTexture(name, texture2D);
- material.SetTextureOffset(name, vector2_1);
- material.SetTextureScale(name, vector2_2);
- }
- }
- catch
- {
- break;
- }
- }
- else if (str7 == "texRT")
- {
- str4 = r.ReadString();
- str5 = r.ReadString();
- }
- }
- else if (str6 == "col")
- {
- color.r = r.ReadSingle();
- color.g = r.ReadSingle();
- color.b = r.ReadSingle();
- color.a = r.ReadSingle();
- material.SetColor(name, color);
- }
- else if (str6 == "vec")
- {
- vector4.x = r.ReadSingle();
- vector4.y = r.ReadSingle();
- vector4.z = r.ReadSingle();
- vector4.w = r.ReadSingle();
- material.SetVector(name, vector4);
- }
- else if (str6 == "f")
- {
- float num = r.ReadSingle();
- material.SetFloat(name, num);
- }
- }
- else
- {
- break;
- }
- }
- if (filename != null && filename.Contains(".mate"))
- {
- try
- {
- using (AFileBase afileBase = GameUty.FileOpen(filename, null))
- {
- if (m_matTempFile == null)
- m_matTempFile = new byte[Math.Max(10000, afileBase.GetSize())];
- else if (m_matTempFile.Length < afileBase.GetSize())
- m_matTempFile = new byte[afileBase.GetSize()];
- afileBase.Read(ref m_matTempFile, afileBase.GetSize());
- }
- }
- catch { }
- var binaryReader = new BinaryReader(new MemoryStream(m_matTempFile), Encoding.UTF8);
- string str6 = binaryReader.ReadString();
- NDebug.Assert(str6 == "CM3D2_MATERIAL", "ProcScriptBin 例外 : ヘッダーファイルが不正です。" + str6);
- binaryReader.ReadInt32();
- binaryReader.ReadString();
- r = binaryReader;
- string str7 = r.ReadString();
- string str8 = r.ReadString();
- string path2 = "DefMaterial/" + r.ReadString();
- var original2 = Resources.Load(path2, typeof(Material)) as Material;
- if (original2 == null)
- return original2;
- material = Instantiate(original2);
- material.name = str7;
- int hashCode2 = material.name.GetHashCode();
- if (m_hashPriorityMaterials != null && m_hashPriorityMaterials.ContainsKey(hashCode2))
- {
- var priorityMaterial = m_hashPriorityMaterials[hashCode2];
- if (priorityMaterial.Key == material.name)
- {
- material.SetFloat("_SetManualRenderQueue", priorityMaterial.Value);
- material.renderQueue = (int)priorityMaterial.Value;
- }
- }
- while (true)
- {
- string str9 = r.ReadString();
- if (!(str9 == "end"))
- {
- string name = r.ReadString();
- if (str9 == "tex")
- {
- string str10 = r.ReadString();
- if (str10 == "null")
- {
- material.SetTexture(name, null);
- }
- else if (str10 == "tex2d")
- {
- try
- {
- string str11 = r.ReadString();
- str3 = r.ReadString();
- var data = ImportCM.LoadTexture(GameUty.FileSystem, str11 + ".tex", false).data;
- var texture2D = new Texture2D(1, 1, TextureFormat.RGBA32, false);
- texture2D.LoadImage(data);
- texture2D.name = str11;
- texture2D.wrapMode = TextureWrapMode.Clamp;
- material.SetTexture(name, texture2D);
- vector2_1.x = r.ReadSingle();
- vector2_1.y = r.ReadSingle();
- material.SetTextureOffset(name, vector2_1);
- vector2_2.x = r.ReadSingle();
- vector2_2.y = r.ReadSingle();
- material.SetTextureScale(name, vector2_2);
- }
- catch
- {
- break;
- }
- }
- else if (str10 == "texRT")
- {
- str4 = r.ReadString();
- str5 = r.ReadString();
- }
- }
- else if (str9 == "col")
- {
- color.r = r.ReadSingle();
- color.g = r.ReadSingle();
- color.b = r.ReadSingle();
- color.a = r.ReadSingle();
- material.SetColor(name, color);
- }
- else if (str9 == "vec")
- {
- vector4.x = r.ReadSingle();
- vector4.y = r.ReadSingle();
- vector4.z = r.ReadSingle();
- vector4.w = r.ReadSingle();
- material.SetVector(name, vector4);
- }
- else if (str9 == "f")
- {
- float num = r.ReadSingle();
- material.SetFloat(name, num);
- }
- }
- else
- {
- break;
- }
- }
- }
- return material;
- }
- }
|