public void SetAnimation(XAnimation animation) { keyframe_activeTime = 0; keyframe_startTime = 0; active_xAnim = animation; active_keyframe = active_xAnim.frames[0]; }
public static XAnimation Create() { XAnimation asset = ScriptableObject.CreateInstance <XAnimation>(); if (!AssetDatabase.IsValidFolder("Assets/Resources")) { AssetDatabase.CreateFolder("Assets", "Resources"); } if (!AssetDatabase.IsValidFolder("Assets/Resources/Data")) { AssetDatabase.CreateFolder("Assets/Resources", "Data"); } if (!AssetDatabase.IsValidFolder("Assets/Resources/Data/XAnimationData")) { AssetDatabase.CreateFolder("Assets/Resources/Data", "XAnimationData"); } AssetDatabase.CreateAsset(asset, "Assets/Resources/Data/XAnimationData/XAnimation" + count + ".asset"); AssetDatabase.SaveAssets(); EditorUtility.FocusProjectWindow(); Selection.activeObject = asset; count++; return(asset); }
private void OnEnable() { if (EditorPrefs.HasKey("ObjectPath")) { string objectPath = EditorPrefs.GetString("ObjectPath"); xAnimation = AssetDatabase.LoadAssetAtPath(objectPath, typeof(XAnimation)) as XAnimation; } sizeRatio = 0.3f; resizerStyle = new GUIStyle(); resizerStyle.normal.background = EditorGUIUtility.Load("icons/d_AvatarBlendBackground.png") as Texture2D; foldoutStyle = new GUIStyle(); foldoutStyle.normal.background = EditorGUIUtility.Load("icons/d_AvatarBlendBackground.png") as Texture2D; }
private void OnSelectionChange() { if (Selection.objects.Length > 1) { } else if (Selection.activeObject is XAnimation) { child_frames.Clear(); xAnimation_obj = (XAnimation)Selection.activeObject; foreach (XFrame frame in xAnimation_obj.frames) { child_frames.Add(frame); } } else { child_frames.Clear(); } this.Repaint(); }
static int i = 0; // общий "указатель" строк //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж public static void Main() { SearchOption SOAD = SearchOption.AllDirectories; string[] filesName = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.XAF", SOAD); System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж foreach (var file in filesName) { List <XMaterial> Materials = new List <XMaterial>(); List <Frame> Frames = new List <Frame>(); List <Mesh> Meshes = new List <Mesh>(); readText = File.ReadAllLines(file); // для прохода по строкам и поиска "шаблонов" // создаём список в котором будет искать фреймы и удалять лишние строки // создаём именно здесь, потому что далее содержимое readText будет изменяться foreach (var o in readText) { if (o.Contains("animation_set {")) { break; // отбрасываем лишние строки с Анимацией } newlist.Add(o); } XAnimationSet animset = new XAnimationSet(); // этот блок вроде он всегда один //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж for (i = 0; i < readText.Length; i++) // Ищем материалы { // Материалы // лучше искать отдельно для каждого файла if (readText[i].Contains("material \"") && readText[i].EndsWith("\" {")) { XMaterial xmat = new XMaterial(); // СОЗДАЁМ НОВЫЙ ОБЪЕКТ xmat.Name = Regex.Split(readText[i], "\"")[1]; // первая строка - это всегда имя материала for (int iii = 1; iii < 4; iii++) // цикл по 3 следущим строкам { if (readText[i + iii].Contains("texture")) { xmat.Filename = Regex.Split(readText[i + iii], "\"")[1]; // имя текстуры } if (readText[i + iii].Contains("colour")) // colour { float, float, float, float } { MatchCollection floats = Regex.Matches(readText[i + iii], @"(-?\d+(?:\.\d+)?)"); xmat.FaceColor.R = float.Parse(floats[0].Value); xmat.FaceColor.G = float.Parse(floats[1].Value); xmat.FaceColor.B = float.Parse(floats[2].Value); xmat.FaceColor.A = float.Parse(floats[3].Value); } if (readText[i + iii].Contains("specular")) // specular { float, float } { MatchCollection floats = Regex.Matches(readText[i + iii], @"(-?\d+(?:\.\d+)?)"); xmat.Intensity = float.Parse(floats[0].Value); xmat.Power = float.Parse(floats[1].Value); } } Materials.Add(xmat); // ДОБАВЛЯЕМ МАТЕРИАЛ В СПИСОК } } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж for (i = 0; i < readText.Length; i++) { // Фреймы //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж if ((readText[i].Contains("object")) && (readText[i].Contains("{"))) { Frame frame = new Frame(); frame.FrameName = "Frame " + Regex.Split(readText[i], "\"")[1] + " { //начало фрейма"; frame.FrameTransformMatrix = ReadMatrix(i + 1); frame.FrameMeshName = "{ " + frame.FrameName + " }"; Frames.Add(frame); } } // Меши //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж for (i = 0; i < readText.Length; i++) { if (readText[i].Contains("mesh {")) // { Mesh mesh = new Mesh(); mesh.MeshName = Regex.Split(readText[i - 7], "\"")[1]; for (;;) { i++; // в цикле опускаемся каждый раз на строку ниже от "mesh {" // пока не достигнем двух идущих подряд строк содержащих "}" означающую конец МЕШа if (readText[i].Contains("}") && readText[i + 1].Contains("}")) { break; } if (readText[i].Contains("}") && readText[i + 1].Contains("object \"")) { break; // -_- долго искал этот косяк -_- } if (readText[i].Contains("vertices {")) { mesh.MeshVertices = ReadVector2or3(i); } if (readText[i].Contains("normals {")) { mesh.MeshNormals = ReadVector2or3(i); } if (readText[i].Contains("texture_coordinates {")) { mesh.MeshTextureCoords = ReadVector2or3(i); } if (readText[i].Contains("faces {")) { List <string> findex, nordex; ReadFaces(i, out findex, out nordex); mesh.FacesIndices = findex; mesh.NormalsIndices = nordex; } if (readText[i].Contains("face_materials {")) { int offset = i; for (;;) { offset++; // шагаем по строкам if (readText[offset].Contains("}")) { break; } mesh.face_materials.Add(Regex.Split(readText[offset], "\"")[1]); } } if (readText[i].Contains("material \"") && readText[i].EndsWith("\"")) { mesh.MeshMaterial = "{ " + Regex.Split(readText[i], "\"")[1] + " }"; // имя материала } } Meshes.Add(mesh); } // if } // анимация //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж for (i = 0; i < readText.Length; i++) { if (readText[i].Contains("animation_set {")) // найден набор анимаций { int ii = 0; // счётчик for (;;) // цикл по всем следующим строкам { if (readText[i + ii].Contains("animation ") && readText[i + ii].EndsWith(" {")) { XAnimation anima = new XAnimation(); anima.Name = " Animation " + Regex.Split(readText[i + ii], "\"")[1] + " {"; // имя анимации anima.Keys = new List <XAnimationKey>(); for (;;) { if (readText[i + ii].Contains("object_name ")) // object_name "dummy" { anima.FrameReference = " { " + Regex.Split(readText[i + ii], "\"")[1] + " }"; // имя ссылки на фрейм } if (readText[i + ii].Contains("rotate_keys {")) { int iii = 1; XAnimationKey rotate_keys = new XAnimationKey(); rotate_keys.Name = "rotate_keys"; for (;;) { string[] numbers = readText[i + ii + iii].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); foreach (var f in numbers) { rotate_keys.KeysF.Add(float.Parse(f)); } rotate_keys.KeysS.Add(numbers[0] + ";4;" + numbers[1] + "," + numbers[2] + "," + numbers[3] + "," + numbers[4] + ";;,"); iii++; if (readText[i + ii + iii].Contains("}")) { break; } } rotate_keys.KeysS.Insert(0, " AnimationKey rot {"); rotate_keys.KeysS.Insert(1, " 0;"); rotate_keys.KeysS.Insert(2, " " + (rotate_keys.KeysS.Count - 2) + ";"); rotate_keys.KeysS[rotate_keys.KeysS.Count - 1] = rotate_keys.KeysS[rotate_keys.KeysS.Count - 1].Replace(";;,", ";;;"); rotate_keys.KeysS.Add(" }"); anima.Keys.Add(rotate_keys); } if (readText[i + ii].Contains("scale_keys {")) { int iii = 1; XAnimationKey scale_keys = new XAnimationKey(); scale_keys.Name = "scale_keys"; for (;;) { string[] numbers = readText[i + ii + iii].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); foreach (var f in numbers) { scale_keys.KeysF.Add(float.Parse(f)); } scale_keys.KeysS.Add(numbers[0] + ";3;" + numbers[1] + "," + numbers[2] + "," + numbers[3] + ";;,"); iii++; if (readText[i + ii + iii].Contains("}")) { break; } } scale_keys.KeysS.Insert(0, " AnimationKey scale {"); scale_keys.KeysS.Insert(1, " 1;"); scale_keys.KeysS.Insert(2, " " + (scale_keys.KeysS.Count - 2) + ";"); scale_keys.KeysS[scale_keys.KeysS.Count - 1] = scale_keys.KeysS[scale_keys.KeysS.Count - 1].Replace(";;,", ";;;"); scale_keys.KeysS.Add(" }"); anima.Keys.Add(scale_keys); } if (readText[i + ii].Contains("position_keys {")) { int iii = 1; XAnimationKey position_keys = new XAnimationKey(); position_keys.Name = "position_keys"; for (;;) { string[] numbers = readText[i + ii + iii].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); foreach (var f in numbers) { position_keys.KeysF.Add(float.Parse(f)); } position_keys.KeysS.Add(numbers[0] + ";3;" + numbers[1] + "," + numbers[2] + "," + numbers[3] + ";;,"); iii++; if (readText[i + ii + iii].Contains("}")) { break; } } position_keys.KeysS.Insert(0, " AnimationKey pos {"); position_keys.KeysS.Insert(1, " 2;"); position_keys.KeysS.Insert(2, " " + (position_keys.KeysS.Count - 2) + ";"); position_keys.KeysS[position_keys.KeysS.Count - 1] = position_keys.KeysS[position_keys.KeysS.Count - 1].Replace(";;,", ";;;"); position_keys.KeysS.Add(" }"); anima.Keys.Add(position_keys); } if (readText[i + ii].Contains("}") && readText[i + ii + 1].Contains("}")) { break; } ii++; } ii++; animset.Animations.Add(anima); // добавляем анимации с ключами в набор } i++; if ((i + ii) - readText.Length == 0) // конец файла { break; // это выход для [animation_set] } } //for } //if анимация } // for // чтение всех строк //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж // СУПЕР КОСТЫЛЬ ОСТАВЛЯЮЩИЙ ФРЕЙМЫ И УБИРАЮЩИЙ ВСЁ ЛИШНЕЕ // иначе нужно юзать реккурсию и список дочерних фреймов для "Объектов" for (i = 0; i < newlist.Count; i++) { if (newlist[i].Contains(",")) { newlist[i] = ""; } } // удаляем все строки содержащие запятые newlist.RemoveAll(str => String.IsNullOrWhiteSpace(str)); // каждый раз удаляем образовавшиеся пустые строки for (i = 0; i < newlist.Count; i++) { if (newlist[i].Contains("faces {")) { newlist[i + 0] = ""; newlist[i + 1] = ""; newlist[i + 2] = ""; } } newlist.RemoveAll(str => String.IsNullOrWhiteSpace(str)); for (i = 0; i < newlist.Count; i++) { if (newlist[i].Contains("matrix {")) { newlist[i] = ""; newlist[i + 1] = ""; } } newlist.RemoveAll(str => String.IsNullOrWhiteSpace(str)); for (i = 0; i < newlist.Count; i++) { if (newlist[i].Contains("texture \"")) { newlist[i] = ""; } } newlist.RemoveAll(str => String.IsNullOrWhiteSpace(str)); for (i = 0; i < newlist.Count; i++) { if (newlist[i].Contains("normals {")) { newlist[i] = ""; newlist[i + 1] = ""; } } newlist.RemoveAll(str => String.IsNullOrWhiteSpace(str)); for (i = 0; i < newlist.Count; i++) { if (newlist[i].Contains("texture_coordinates {")) { newlist[i] = ""; newlist[i + 1] = ""; } } newlist.RemoveAll(str => String.IsNullOrWhiteSpace(str)); for (i = 0; i < newlist.Count; i++) { if (newlist[i].Contains("vertices {")) { newlist[i] = ""; newlist[i + 1] = ""; } } newlist.RemoveAll(str => String.IsNullOrWhiteSpace(str)); for (i = 0; i < newlist.Count; i++) { if (newlist[i].Contains("material \"") && newlist[i].EndsWith("\"")) { newlist[i] = ""; } } newlist.RemoveAll(str => String.IsNullOrWhiteSpace(str)); for (i = 0; i < newlist.Count; i++) { if (newlist[i].Contains("mesh {")) { newlist[i] = ""; newlist[i + 1] = ""; } } newlist.RemoveAll(str => String.IsNullOrWhiteSpace(str)); for (i = 0; i < newlist.Count; i++) { if (newlist[i].Contains("material") && newlist[i].Contains("{")) { newlist[i] = ""; newlist[i + 1] = ""; } } newlist.RemoveAll(str => String.IsNullOrWhiteSpace(str)); for (i = 0; i < newlist.Count; i++) { if (newlist[i].Contains("face_materials")) { newlist[i] = ""; newlist[i + 1] = ""; } } newlist.RemoveAll(str => String.IsNullOrWhiteSpace(str)); //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж using (StreamWriter new_xaf = new StreamWriter(file + ".x")) new_xaf.Write("xof 0303txt 0032\n\n"); // HEADER // можно записывать всё в одном блоке using using (StreamWriter new_xaf = File.AppendText(file + ".x")) { // ЗАПИСЫВАЕМ МАТЕРИАЛЫ В ФАЙЛ if (Materials.Count > 0) { for (int mati = 0; mati < Materials.Count; mati++) { new_xaf.WriteLine("Material " + Materials[mati].Name + " {"); new_xaf.WriteLine(Materials[mati].FaceColor); new_xaf.WriteLine(Materials[mati].Power + ";"); new_xaf.WriteLine("0.000000;0.000000;0.000000;;"); new_xaf.WriteLine("0.000000;0.000000;0.000000;;"); if (Materials[mati].Filename == "" || Materials[mati].Filename == " " || Materials[mati].Filename == String.Empty || Materials[mati].Filename == null) { new_xaf.WriteLine("}"); } else { new_xaf.WriteLine("TextureFilename { \"" + Materials[mati].Filename + "\"; } }\n"); } } Materials.Clear(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////// // ЗАПИСЫВАЕМ Фреймы И МЕШИ В ФАЙЛ // теперь надо пробежаться по newlist списку // чтобы запихнуть после его матрицы - тело соответствующего меша // таким образом нужные скобки сдвинуться // лучше заюзаю новый список // или юзай метод отсюда https://stackoverflow.com/questions/9462518/short-way-to-add-item-after-item-in-list int co = 0; List <string> NewNewList = new List <string>(); foreach (var o in newlist) // идём по строкам в новом списке { //if (newlist.Contains("Frame ")) // если встретился объект if (o.Contains("object") /*&& o.Contains("{")*/) { NewNewList.Add(Frames[co].FrameName); NewNewList.Add(Frames[co].FrameTransformMatrix); NewNewList.Add(Meshes[co].ToString()); co++; // переходим к следущему фрейму и его мешу } if (o.Contains("}")) { NewNewList.Add(o + " // конец фрейма"); // ставим закрывающую скобку } // if ( co > ( Frames.Count - 1 ) ) break; // и если нет больше фреймов с мешами - выходим // эта строчка тоже вызывала ошибку // не добавляла последнюю скобку закрывающую фрейм } ///////////////////////////////////////////////////////////////////////////////////////////////////////////// // ЗАПИСЫВАЕМ Фреймы И МЕШИ В ФАЙЛ foreach (var str in NewNewList) { new_xaf.WriteLine(str); } Frames.Clear(); Meshes.Clear(); NewNewList.Clear(); newlist.Clear(); ///////////////////////////////////////////////////////////////////////////////////////////////////////////// // ЗАПИСЫВАЕМ АНИМАЦИИ В ФАЙЛ if (animset.Animations.Count > 0) { new_xaf.WriteLine("\nAnimationSet {\n"); foreach (var o in animset.Animations) { new_xaf.WriteLine(o.Name + "\n" + o.FrameReference); new_xaf.WriteLine(" AnimationOptions { 1; 0; } \n"); foreach (var oo in o.Keys) { foreach (var ooo in oo.KeysS) { new_xaf.WriteLine(ooo); } } new_xaf.WriteLine(" }"); // для каждого блока Animation } new_xaf.WriteLine("}"); // для блока AnimationSet animset.Animations.Clear(); } } // запись в файл animset.Animations.Clear(); animset = null; //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж } // foreach (var file in filesName) //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж } // public static void Main()
public void Update(Double delayBeforeAnimation) { XAnimation.BeginTime = TimeSpan.FromMilliseconds(delayBeforeAnimation); XAnimation.Begin(); }