Fixed a performance problem in the Visual Studio extension where no importer or processor was selected for an asset. Fixed that the asset names for Uri encoded in the build output. Fixed that errors when serializing assets get logged. Sped up ImporterManager.GuessImporterByFileExtension, which caused performance problems if many assemblies are loaded into the current AppDomain. Made the AssimpImporter library deploy the binary files again (hopefully just a temporary solution until we've found a better way.) Provide a extension for TargetPlatform enum for getting the DisplayName of an entry. Changed that ProcessorManager.GetProcessorDisplayName doesn't throw an exception if no processor with the given name exists, which now mimicks the same behavior as in importerManager.GetImporterDisplayName.
238 lines
8.8 KiB
C#
238 lines
8.8 KiB
C#
#region Using Statements
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Reflection;
|
|
using ANX.Framework.Content.Pipeline.Helpers;
|
|
using ANX.Framework.NonXNA.Development;
|
|
using System.ComponentModel;
|
|
|
|
#endregion
|
|
|
|
// This file is part of the ANX.Framework created by the
|
|
// "ANX.Framework developer group" and released under the Ms-PL license.
|
|
// For details see: http://anxframework.codeplex.com/license
|
|
|
|
namespace ANX.Framework.Content.Pipeline.Tasks
|
|
{
|
|
|
|
public class ProcessorManager
|
|
{
|
|
private Dictionary<string, IContentProcessor> processors = new Dictionary<string, IContentProcessor>();
|
|
|
|
|
|
public ProcessorManager()
|
|
{
|
|
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
|
|
{
|
|
if (!AssemblyHelper.IsValidForPipeline(assembly.GetName()))
|
|
continue;
|
|
#if LINUX
|
|
Console.WriteLine("ProcessorManager: Checking " + assembly.FullName);
|
|
#endif
|
|
try
|
|
{
|
|
foreach (Type type in assembly.GetTypes())
|
|
{
|
|
ContentProcessorAttribute[] value = (ContentProcessorAttribute[]) type.GetCustomAttributes(typeof(ContentProcessorAttribute), true);
|
|
if (value.Length > 0 && !processors.ContainsKey(type.Name))
|
|
{
|
|
processors[type.Name] = (IContentProcessor)Activator.CreateInstance(type);
|
|
}
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
Console.WriteLine(assembly.FullName);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public IContentProcessor GetInstance(string processorName)
|
|
{
|
|
IContentProcessor processor;
|
|
if (!this.processors.TryGetValue(processorName, out processor))
|
|
{
|
|
throw new ArgumentException(String.Format("Can't find processor {0}", processorName));
|
|
}
|
|
|
|
return processor;
|
|
}
|
|
|
|
|
|
public string GetProcessorName(string displayName)
|
|
{
|
|
foreach (var value in this.AvailableProcessors)
|
|
{
|
|
var attribute = value.Value.GetType().GetCustomAttributes(typeof(ContentProcessorAttribute), true).Cast<ContentProcessorAttribute>().FirstOrDefault();
|
|
if (attribute.DisplayName == displayName)
|
|
{
|
|
return value.Key;
|
|
}
|
|
}
|
|
|
|
return displayName;
|
|
}
|
|
|
|
public string GetProcessorDisplayName(string proccessorName)
|
|
{
|
|
if (this.processors.ContainsKey(proccessorName))
|
|
{
|
|
var attribute = this.GetInstance(proccessorName).GetType().GetCustomAttributes(typeof(ContentProcessorAttribute), true).Cast<ContentProcessorAttribute>().FirstOrDefault();
|
|
if (attribute != null && !string.IsNullOrEmpty(attribute.DisplayName))
|
|
return attribute.DisplayName;
|
|
}
|
|
return proccessorName;
|
|
}
|
|
|
|
public String GetProcessorForType(Type inputType)
|
|
{
|
|
foreach (KeyValuePair<string, IContentProcessor> processorDescription in processors)
|
|
{
|
|
if (Type.Equals(processorDescription.Value.InputType, inputType))
|
|
{
|
|
return processorDescription.Key;
|
|
}
|
|
}
|
|
|
|
return string.Empty;
|
|
}
|
|
|
|
|
|
public String GetProcessorForType(Type inputType, Type outputType)
|
|
{
|
|
foreach (KeyValuePair<string, IContentProcessor> processorDescription in processors)
|
|
{
|
|
if (Type.Equals(processorDescription.Value.InputType, inputType) && Type.Equals(processorDescription.Value.OutputType, outputType))
|
|
{
|
|
return processorDescription.Key;
|
|
}
|
|
}
|
|
|
|
return string.Empty;
|
|
}
|
|
|
|
public string GetProcessorForImporter(IContentImporter contentImporter)
|
|
{
|
|
return GetProcessorForType(contentImporter.OutputType);
|
|
}
|
|
|
|
|
|
public void SetProcessorParameters(IContentProcessor processor, OpaqueDataDictionary parameters)
|
|
{
|
|
if (processor == null)
|
|
throw new ArgumentNullException("processor");
|
|
|
|
if (parameters == null)
|
|
throw new ArgumentNullException("parameters");
|
|
|
|
if (parameters.Count == 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Type processorType = processor.GetType();
|
|
|
|
foreach (var keyPair in parameters)
|
|
{
|
|
var property = processorType.GetProperty(keyPair.Key);
|
|
if (property != null)
|
|
{
|
|
property.SetValue(processor, keyPair.Value, null);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public IEnumerable<KeyValuePair<string, IContentProcessor>> AvailableProcessors
|
|
{
|
|
get
|
|
{
|
|
foreach (KeyValuePair<string, IContentProcessor> kvp in processors)
|
|
{
|
|
yield return kvp;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public ProcessorParameterCollection GetProcessorParameters(string processor)
|
|
{
|
|
IContentProcessor processorInstance = this.GetInstance(processor);
|
|
|
|
List<ProcessorParameter> list = new List<ProcessorParameter>();
|
|
|
|
IEnumerable<PropertyInfo> properties = processorInstance.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy);
|
|
foreach (var propertyInfo in properties)
|
|
{
|
|
if (propertyInfo.GetSetMethod(false) != null && propertyInfo.GetIndexParameters().Length == 0 && ProcessorManager.IsBrowsable(propertyInfo))
|
|
{
|
|
list.Add(new ProcessorParameter(propertyInfo.Name, propertyInfo.PropertyType)
|
|
{
|
|
DefaultValue = ProcessorManager.GetDefaultValue(propertyInfo),
|
|
Description = ProcessorManager.GetDescription(propertyInfo),
|
|
DisplayName = ProcessorManager.GetDisplayName(propertyInfo)
|
|
});
|
|
}
|
|
}
|
|
return new ProcessorParameterCollection(list);
|
|
}
|
|
|
|
private static bool IsBrowsable(PropertyInfo property)
|
|
{
|
|
BrowsableAttribute attribute = (BrowsableAttribute)property.GetCustomAttributes(typeof(BrowsableAttribute), true).FirstOrDefault();
|
|
return attribute == null || attribute.Browsable;
|
|
}
|
|
|
|
private static string GetDisplayName(PropertyInfo property)
|
|
{
|
|
DisplayNameAttribute attribute = (DisplayNameAttribute)property.GetCustomAttributes(typeof(DisplayNameAttribute), true).FirstOrDefault();
|
|
if (attribute != null)
|
|
{
|
|
return attribute.DisplayName;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private static string GetDescription(PropertyInfo property)
|
|
{
|
|
DescriptionAttribute attribute = (DescriptionAttribute)property.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault();
|
|
if (attribute != null)
|
|
{
|
|
return attribute.Description;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private static object GetDefaultValue(PropertyInfo property)
|
|
{
|
|
DefaultValueAttribute attribute = (DefaultValueAttribute)property.GetCustomAttributes(typeof(DefaultValueAttribute), true).FirstOrDefault();
|
|
object obj = null;
|
|
if (attribute != null)
|
|
{
|
|
obj = attribute.Value;
|
|
}
|
|
return obj;
|
|
}
|
|
|
|
|
|
public void ValidateProcessorTypes(string processorName, Type inputType, Type outputType)
|
|
{
|
|
if (inputType == null)
|
|
throw new ArgumentNullException("inputType");
|
|
|
|
if (outputType == null)
|
|
throw new ArgumentNullException("outputType");
|
|
|
|
var processor = this.GetInstance(processorName);
|
|
if (!processor.InputType.IsAssignableFrom(inputType))
|
|
throw new InvalidOperationException(string.Format("The type {0} is not compatible to the input type of the processor {1}", inputType, processor.GetType().Name));
|
|
|
|
if (!outputType.IsAssignableFrom(processor.OutputType))
|
|
throw new InvalidOperationException(string.Format("The type {0} is not compatible to the output type of the processor {1}", outputType, processor.GetType().Name));
|
|
}
|
|
}
|
|
}
|