public void ValidateModifier( Model.NodeData node, BuildTarget target, IEnumerable <PerformGraph.AssetGroups> incoming) { if (string.IsNullOrEmpty(m_modifierType)) { throw new NodeException("Modifier asset type not set.", "Select asset type to modify from inspector.", node); } var modifier = m_instance.Get <IModifier> (target); if (modifier == null) { throw new NodeException("Failed to create Modifier.", "Select modifier from inspector.", node); } modifier.OnValidate(); Type expected = Type.GetType(m_modifierType); Type modifierFor = ModifierUtility.GetModifierTargetType(m_instance.ClassName); if (expected != modifierFor) { throw new NodeException("Modifier type does not match.", "Reset setting or fix Modifier code.", node); } }
public override void Prepare(BuildTarget target, Model.NodeData node, IEnumerable <PerformGraph.AssetGroups> incoming, IEnumerable <Model.ConnectionData> connectionsToOutput, PerformGraph.Output Output) { var modifier = m_instance.Get <IModifier> (target); if (modifier != null && string.IsNullOrEmpty(m_modifierType)) { m_modifierType = ModifierUtility.GetModifierTargetType(m_instance.ClassName).AssemblyQualifiedName; } ValidateModifier(node, target, incoming); if (incoming != null && Output != null) { // Modifier does not add, filter or change structure of group, so just pass given group of assets var dst = (connectionsToOutput == null || !connectionsToOutput.Any())? null : connectionsToOutput.First(); foreach (var ag in incoming) { Output(dst, ag.assetGroups); } } }
public override void Build(BuildTarget target, Model.NodeData node, IEnumerable <PerformGraph.AssetGroups> incoming, IEnumerable <Model.ConnectionData> connectionsToOutput, PerformGraph.Output Output, Action <Model.NodeData, string, float> progressFunc) { if (incoming == null) { return; } var modifier = m_instance.Get <IModifier>(target); UnityEngine.Assertions.Assert.IsNotNull(modifier); Type targetType = ModifierUtility.GetModifierTargetType(m_instance.ClassName); bool isAnyAssetModified = false; var aggregatedGroups = new Dictionary <string, List <AssetReference> >(); foreach (var ag in incoming) { foreach (var name in ag.assetGroups.Keys) { if (!aggregatedGroups.ContainsKey(name)) { aggregatedGroups[name] = new List <AssetReference>(); } aggregatedGroups[name].AddRange(ag.assetGroups[name].AsEnumerable()); } } foreach (var assets in aggregatedGroups.Values) { foreach (var asset in assets) { if (asset.assetType == targetType) { if (modifier.IsModified(asset.allData, assets)) { modifier.Modify(asset.allData, assets); asset.SetDirty(); AssetProcessEventRecord.GetRecord().LogModify(asset); isAnyAssetModified = true; // apply asset setting changes to AssetDatabase. if (asset.isSceneAsset) { if (!EditorSceneManager.SaveScene(asset.scene)) { throw new NodeException("Failed to save modified scene:" + asset.importFrom, "See console for details.", node); } } else { AssetDatabase.SaveAssets(); } } asset.ReleaseData(); } } } if (isAnyAssetModified) { AssetDatabase.Refresh(); } if (incoming != null && Output != null) { // Modifier does not add, filter or change structure of group, so just pass given group of assets var dst = (connectionsToOutput == null || !connectionsToOutput.Any())? null : connectionsToOutput.First(); Output(dst, aggregatedGroups); } }