private static List <IConformObject> CompareSerializedObject(SerializedObject template, SerializedObject asset)
        {
            SerializedProperty templateIter = template.GetIterator();
            SerializedProperty assetIter    = asset.GetIterator();

            assetIter.NextVisible(true);
            templateIter.NextVisible(true);

            List <IConformObject> infos = new List <IConformObject>();

            do
            {
                if (assetIter.name == "m_UserData")
                {
                    templateIter.NextVisible(false);
                    continue;
                }

                // TODO Performance: Is there a better way to find the properties?
                // possibly could use utility method to get all properties in one loop?? (this may not work, NextVisible will not work this way)
                PropertyConformObject conformObject = new PropertyConformObject(templateIter.name);
                conformObject.SetSerializedProperties(template.FindProperty(templateIter.name), asset.FindProperty(assetIter.name));
                infos.Add(conformObject);

                templateIter.NextVisible(false);
            } while(assetIter.NextVisible(false));

            return(infos);
        }
예제 #2
0
        protected override void ContextClickedItem(int id)
        {
            ConformObjectTreeViewItem item = FindItem(id, rootItem) as ConformObjectTreeViewItem;

            Assert.IsNotNull(item);
            if (item.conforms)
            {
                return;
            }

            // TODO ask the ConformObject to do this
            PropertyConformObject propertyConformObject = item.conformObject as PropertyConformObject;

            if (propertyConformObject != null)
            {
                GenericMenu menu = new GenericMenu();
                if (propertyConformObject.TemplateType == SerializedPropertyType.Generic)
                {
                    menu.AddItem(new GUIContent("Set children to Template Values"), false, FixCallback, item);
                }
                else if (propertyConformObject.TemplateType == SerializedPropertyType.ArraySize)
                {
                    menu.AddDisabledItem(new GUIContent("Cannot set array size"));
                }
                else
                {
                    menu.AddItem(new GUIContent("Set to " + propertyConformObject.TemplateValue), false, FixCallback, item);
                }

                menu.ShowAsContext();
            }
        }
        private List <IConformObject> CompareSerializedObject(SerializedObject template, SerializedObject asset)
        {
            SerializedProperty ruleIter  = template.GetIterator();
            SerializedProperty assetIter = asset.GetIterator();

            assetIter.NextVisible(true);
            ruleIter.NextVisible(true);

            List <IConformObject> infos = new List <IConformObject>();

            do
            {
                PropertyConformObject conformObject = new PropertyConformObject(ruleIter.name);
                // TODO better way to do this? could use utility method to get all properties in one loop
                conformObject.SetSerializedProperties(template.FindProperty(ruleIter.name), asset.FindProperty(assetIter.name));
                infos.Add(conformObject);
                ruleIter.NextVisible(false);
            } while(assetIter.NextVisible(false));

            return(infos);
        }
        public List <IConformObject> GetConformObjects(string asset)
        {
            AssetImporter assetImporter = AssetImporter.GetAtPath(asset);

            if (m_ImporterReference == null)
            {
                return(new List <IConformObject>(0));
            }

            SerializedObject assetImporterSO   = new SerializedObject(assetImporter);
            SerializedObject profileImporterSO = new SerializedObject(ReferenceAssetImporter);

            // TODO check to make sure these are valid constraints
            if (m_ConstrainProperties.Count == 0)
            {
                return(CompareSerializedObject(profileImporterSO, assetImporterSO));
            }

            List <IConformObject> infos = new List <IConformObject>();

            for (int i = 0; i < m_ConstrainProperties.Count; ++i)
            {
                string propertyName = m_ConstrainProperties[i];

                SerializedProperty assetRuleSP = profileImporterSO.FindProperty(propertyName);
                if (assetRuleSP == null)
                {
                    continue;                     // could be properties from another Object
                }
                SerializedProperty foundAssetSP = assetImporterSO.FindProperty(propertyName);

                PropertyConformObject conformObject = new PropertyConformObject(propertyName);
                conformObject.SetSerializedProperties(assetRuleSP, foundAssetSP);
                infos.Add(conformObject);
            }

            return(infos);
        }
        public override List <IConformObject> GetConformObjects(string asset, ImportDefinitionProfile profile)
        {
            AssetImporter assetImporter = AssetImporter.GetAtPath(asset);

            if (m_ImporterReference == null)
            {
                return(new List <IConformObject>(0));
            }

            SerializedObject assetImporterSO   = new SerializedObject(assetImporter);
            SerializedObject profileImporterSO = new SerializedObject(ReferenceAssetImporter);

            // TODO Performance: if there are any. check to make sure these are valid constraints, if not, don't include them in the count
            if (m_ConstrainProperties.Count == 0)
            {
                return(CompareSerializedObject(profileImporterSO, assetImporterSO));
            }

            List <IConformObject> infos = new List <IConformObject>();

            for (int i = 0; i < m_ConstrainProperties.Count; ++i)
            {
                SerializedProperty assetRuleSP = profileImporterSO.FindProperty(m_ConstrainProperties[i]);
                if (assetRuleSP == null)
                {
                    continue;                     // could be properties from another Object
                }
                SerializedProperty foundAssetSP = assetImporterSO.FindProperty(m_ConstrainProperties[i]);

                PropertyConformObject conformObject = new PropertyConformObject(m_ConstrainProperties[i]);
                conformObject.SetSerializedProperties(assetRuleSP, foundAssetSP);
                infos.Add(conformObject);
            }

            return(infos);
        }
        private static void AddChildProperty(string parentPath, PropertyViewItem parent, PropertyConformObject propertyConformObject, AssetViewItem assetItem, int depth, int arrayIndex = -1)
        {
            string           extra      = arrayIndex >= 0 ? arrayIndex.ToString() : "";
            string           activePath = parentPath + propertyConformObject.Name + extra;
            PropertyViewItem property   = new PropertyViewItem(activePath, depth, propertyConformObject)
            {
                assetViewItem = assetItem
            };

            parent.AddChild(property);

            for (int i = 0; i < propertyConformObject.SubObjects.Count; ++i)
            {
                // TODO will this be slow? , need to see if there is a better way to cache object type
                if (propertyConformObject.SubObjects[i] is PropertyConformObject)
                {
                    AddChildProperty(activePath, property, (PropertyConformObject)propertyConformObject.SubObjects[i], assetItem, depth + 1, propertyConformObject.AssetSerializedProperty.isArray ? i : -1);
                }
            }
        }