Exemple #1
0
    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 <AlembicMaterial.Assignment> > allAssignments = new Dictionary <GameObject, List <AlembicMaterial.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 <AlembicMaterial.Assignment> assignments;

                if (!allAssignments.ContainsKey(target))
                {
                    assignments = new List <AlembicMaterial.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;
                AlembicMaterial.Assignment a = null;

                if (a == null)
                {
                    a          = new AlembicMaterial.Assignment();
                    a.material = material;
                    a.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 <AlembicMaterial.Assignment> > pair in allAssignments)
        {
            AlembicMaterial abcmaterial = pair.Key.GetComponent <AlembicMaterial>();

            if (abcmaterial == null)
            {
                abcmaterial = pair.Key.AddComponent <AlembicMaterial>();
            }

            abcmaterial.UpdateAssignments(pair.Value);
        }

        // Force refresh
        AlembicStream abcstream = root.GetComponent <AlembicStream>();

        if (abcstream != null)
        {
            abcstream.m_forceRefresh = true;
            abcstream.SendMessage("AbcUpdate", abcstream.m_time, SendMessageOptions.DontRequireReceiver);
        }
    }
    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<AlembicMaterial.Assignment> > allAssignments = new Dictionary<GameObject, List<AlembicMaterial.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<AlembicMaterial.Assignment> assignments;

                if (!allAssignments.ContainsKey(target))
                {
                    assignments = new List<AlembicMaterial.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;
                AlembicMaterial.Assignment a = null;
                
                if (a == null)
                {
                    a = new AlembicMaterial.Assignment();
                    a.material = material;
                    a.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<AlembicMaterial.Assignment> > pair in allAssignments)
        {
            AlembicMaterial abcmaterial = pair.Key.GetComponent<AlembicMaterial>();

            if (abcmaterial == null)
            {
                abcmaterial = pair.Key.AddComponent<AlembicMaterial>();
            }

            abcmaterial.UpdateAssignments(pair.Value);
        }

        // Force refresh
        AlembicStream abcstream = root.GetComponent<AlembicStream>();
            
        if (abcstream != null)
        {
            abcstream.m_forceRefresh = true;
            abcstream.SendMessage("AbcUpdate", abcstream.m_time, SendMessageOptions.DontRequireReceiver);
        }
    }