public static void Import(string xmlPath, GameObject root, string materialFolder) { XmlDocument doc = new XmlDocument(); doc.Load(xmlPath); XmlNode xmlRoot = doc.DocumentElement; XmlNodeList nodes = xmlRoot.SelectNodes("/assignments/node"); Dictionary <GameObject, List <Assignment> > allAssignments = new Dictionary <GameObject, List <Assignment> >(); foreach (XmlNode node in nodes) { string path = node.Attributes["path"].Value; XmlNodeList shaders = node.SelectNodes("shader"); foreach (XmlNode shader in shaders) { XmlAttribute name = shader.Attributes["name"]; XmlAttribute inst = shader.Attributes["instance"]; if (name == null) { continue; } int instNum = (inst == null ? 0 : Convert.ToInt32(inst.Value)); GameObject target = FindNode(root, path, instNum); if (target == null) { // Debug.Log("Could not find node: " + path); continue; } List <Assignment> assignments; if (!allAssignments.ContainsKey(target)) { assignments = new List <Assignment>(); allAssignments.Add(target, assignments); } else { assignments = allAssignments[target]; } Material material = GetMaterial(name.Value, materialFolder); if (material == null) { material = new Material(Shader.Find("Standard")); material.color = new Color(UnityEngine.Random.value, UnityEngine.Random.value, UnityEngine.Random.value); AssetDatabase.CreateAsset(material, materialFolder + "/" + name.Value + ".mat"); } // Get or create material assignment bool newlyAssigned = false; var a = new Assignment { material = material, faces = new List <int>() }; assignments.Add(a); newlyAssigned = true; string faceset = shader.InnerText; faceset.Trim(); if (faceset.Length > 0 && (newlyAssigned || a.faces.Count > 0)) { string[] items = faceset.Split(FaceSep, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < items.Length; ++i) { string[] rng = items[i].Split(RangeSep, StringSplitOptions.RemoveEmptyEntries); if (rng.Length == 1) { a.faces.Add(Convert.ToInt32(rng[0])); } else if (rng.Length == 2) { int j0 = Convert.ToInt32(rng[0]); int j1 = Convert.ToInt32(rng[1]); for (int j = j0; j <= j1; ++j) { a.faces.Add(j); } } } if (!newlyAssigned) { a.faces = new List <int>(new HashSet <int>(a.faces)); } } else if (faceset.Length == 0 && a.faces.Count > 0) { // Shader assgined to whole object, remove any face level assignments a.faces.Clear(); } } } // Update AlembicMaterial components foreach (KeyValuePair <GameObject, List <Assignment> > pair in allAssignments) { AlembicMaterial abcmaterial = pair.Key.GetComponent <AlembicMaterial>(); if (abcmaterial == null) { abcmaterial = pair.Key.AddComponent <AlembicMaterial>(); } abcmaterial.UpdateAssignments(pair.Value); } // Force refresh var player = root.GetComponent <AlembicStreamPlayer>(); if (player != null && player.Stream != null) { player.SendMessage("ForceRefresh", null, SendMessageOptions.DontRequireReceiver); } else { // todo: do figure something else... } }
public void OnGUI() { float hp = 5; float vp = 5; float hs = 5; float rh = 16; float lw; float fw; float bw; Rect r; // Material assignment file controls r = NewControlRect(true, rh, hp, vp); lw = r.width * 0.33f; EditorGUI.PrefixLabel(new Rect(r.x, r.y, lw, r.height), new GUIContent("Assignments File")); bw = 26; fw = r.width - lw - bw - 2 * hs; xmlPath = EditorGUI.TextField(new Rect(r.x + lw + hs, r.y, fw, r.height), xmlPath); if (GUI.Button(new Rect(r.x + lw + hs + fw + hs, r.y, bw, r.height), "...")) { string startFolder = (xmlPath.Length > 0 ? Path.GetDirectoryName(xmlPath) : Application.dataPath); xmlPath = MakeDataRelativePath(EditorUtility.OpenFilePanel("Select Material Assignment File", startFolder, "xml")); if (xmlPath.Length > 0) { materialFolder = Path.GetDirectoryName(xmlPath); } } // Material folder controls r = NewControlRect(true, rh, hp, vp); lw = r.width * 0.33f; EditorGUI.PrefixLabel(new Rect(r.x, r.y, lw, r.height), new GUIContent("Materials Folder")); bw = 26; fw = r.width - lw - bw - 2 * hs; materialFolder = EditorGUI.TextField(new Rect(r.x + lw + hs, r.y, fw, r.height), materialFolder); if (GUI.Button(new Rect(r.x + lw + hs + fw + hs, r.y, bw, r.height), "...")) { string startFolder = (materialFolder.Length > 0 ? materialFolder : Application.dataPath); materialFolder = MakeDataRelativePath(EditorUtility.OpenFolderPanel("Select Materials Folder", startFolder, "")); } // Target asset node controls r = NewControlRect(true, rh, hp, vp); lw = r.width * 0.33f; EditorGUI.PrefixLabel(new Rect(r.x, r.y, lw, r.height), new GUIContent("Asset Root")); fw = r.width - lw - hs; assetRoot = (GameObject)EditorGUI.ObjectField(new Rect(r.x + lw + hs, r.y, fw, r.height), assetRoot, typeof(GameObject), true); // Action buttons r = NewControlRect(false, rh, hp, vp); bw = 0.5f * (r.width - hs); if (GUI.Button(new Rect(r.x, r.y, bw, r.height), "Import")) { AlembicMaterial.Import(Application.dataPath + "/" + xmlPath, assetRoot, "Assets/" + materialFolder); //relMatFolder); } if (GUI.Button(new Rect(r.x + bw + hs, r.y, bw, r.height), "Export")) { AlembicMaterial.Export(Application.dataPath + "/" + xmlPath, assetRoot); } }