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...
            }
        }
Exemple #2
0
        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);
            }
        }