added rudimentary ContentProcessor support to ContentBuilder tool

This commit is contained in:
Glatzemann 2012-08-21 12:10:40 +00:00
parent 4234155c8c
commit d64036a520
9 changed files with 232 additions and 11 deletions

View File

@ -35,6 +35,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="AnxContentImporterContext.cs" /> <Compile Include="AnxContentImporterContext.cs" />
<Compile Include="AnxContentProcessorContext.cs" />
<Compile Include="Audio\AudioContent.cs" /> <Compile Include="Audio\AudioContent.cs" />
<Compile Include="Audio\AudioFileType.cs" /> <Compile Include="Audio\AudioFileType.cs" />
<Compile Include="Audio\AudioFormat.cs" /> <Compile Include="Audio\AudioFormat.cs" />
@ -170,6 +171,7 @@
<Compile Include="Tasks\BuildItem.cs" /> <Compile Include="Tasks\BuildItem.cs" />
<Compile Include="Tasks\BuildRequest.cs" /> <Compile Include="Tasks\BuildRequest.cs" />
<Compile Include="Tasks\ImporterManager.cs" /> <Compile Include="Tasks\ImporterManager.cs" />
<Compile Include="Tasks\ProcessorManager.cs" />
<Compile Include="VideoContent.cs" /> <Compile Include="VideoContent.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -0,0 +1,116 @@
#region Using Statements
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ANX.Framework.Graphics;
#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
{
public class AnxContentProcessorContext : ContentProcessorContext
{
private string buildConfiguration;
private string intermediateDirectory;
private ContentBuildLogger contentBuildLogger;
private string outputDirectory;
private string outputFilename;
private OpaqueDataDictionary parameters;
private TargetPlatform targetPlatform;
private GraphicsProfile targetProfile;
public override string BuildConfiguration
{
get
{
return buildConfiguration;
}
}
public override string IntermediateDirectory
{
get
{
return intermediateDirectory;
}
}
public override ContentBuildLogger Logger
{
get
{
return contentBuildLogger;
}
}
public override string OutputDirectory
{
get
{
return outputDirectory;
}
}
public override string OutputFilename
{
get
{
return outputFilename;
}
}
public override OpaqueDataDictionary Parameters
{
get
{
return parameters;
}
}
public override TargetPlatform TargetPlatform
{
get
{
return targetPlatform;
}
}
public override GraphicsProfile TargetProfile
{
get
{
return targetProfile;
}
}
public override void AddDependency(string filename)
{
throw new NotImplementedException();
}
public override void AddOutputFile(string filename)
{
throw new NotImplementedException();
}
public override TOutput BuildAndLoadAsset<TInput, TOutput>(ExternalReference<TInput> sourceAsset, string processorName, OpaqueDataDictionary processorParameters, string importerName)
{
throw new NotImplementedException();
}
public override ExternalReference<TOutput> BuildAsset<TInput, TOutput>(ExternalReference<TInput> sourceAsset, string processorName, OpaqueDataDictionary processorParameters, string importerName, string assetName)
{
throw new NotImplementedException();
}
public override TOutput Convert<TInput, TOutput>(TInput input, string processorName, OpaqueDataDictionary processorParameters)
{
throw new NotImplementedException();
}
}
}

View File

@ -34,7 +34,7 @@ namespace ANX.Framework.Content.Pipeline
public OpaqueDataDictionary OpaqueData public OpaqueDataDictionary OpaqueData
{ {
get; get;
private set; set;
} }

View File

@ -14,26 +14,27 @@ namespace ANX.Framework.Content.Pipeline
{ {
public abstract class ContentProcessor<TInput, TOutput> : IContentProcessor public abstract class ContentProcessor<TInput, TOutput> : IContentProcessor
{ {
protected ContentProcessor()
{
throw new NotImplementedException();
}
public abstract TOutput Process(TInput input, ContentProcessorContext context); public abstract TOutput Process(TInput input, ContentProcessorContext context);
Type IContentProcessor.InputType Type IContentProcessor.InputType
{ {
get { throw new NotImplementedException(); } get
{
return typeof(TInput);
}
} }
Type IContentProcessor.OutputType Type IContentProcessor.OutputType
{ {
get { throw new NotImplementedException(); } get
{
return typeof(TOutput);
}
} }
object IContentProcessor.Process(object input, ContentProcessorContext context) object IContentProcessor.Process(object input, ContentProcessorContext context)
{ {
throw new NotImplementedException(); return Process((TInput)input, context);
} }
} }
} }

View File

@ -17,7 +17,6 @@ namespace ANX.Framework.Content.Pipeline
{ {
public ContentProcessorContext() public ContentProcessorContext()
{ {
throw new NotImplementedException();
} }
public abstract string BuildConfiguration { get; } public abstract string BuildConfiguration { get; }

View File

@ -30,7 +30,14 @@ namespace ANX.Framework.Content.Pipeline.Processors
public override CompiledEffectContent Process(EffectContent input, ContentProcessorContext context) public override CompiledEffectContent Process(EffectContent input, ContentProcessorContext context)
{ {
throw new NotImplementedException(); byte[] effectCompiledCode = new byte[1]; //TODO: compile effect!!!
return new CompiledEffectContent(effectCompiledCode)
{
Identity = input.Identity,
Name = input.Name,
OpaqueData = input.OpaqueData
};
} }
} }
} }

View File

@ -15,6 +15,7 @@ namespace ANX.Framework.Content.Pipeline.Tasks
public class BuildContent public class BuildContent
{ {
private ImporterManager importerManager; private ImporterManager importerManager;
private ProcessorManager processorManager;
public ImporterManager ImporterManager public ImporterManager ImporterManager
{ {
@ -24,15 +25,36 @@ namespace ANX.Framework.Content.Pipeline.Tasks
{ {
this.importerManager = new ImporterManager(); this.importerManager = new ImporterManager();
} }
return this.importerManager; return this.importerManager;
} }
} }
public ProcessorManager ProcessorManager
{
get
{
if (this.processorManager == null)
{
this.processorManager = new ProcessorManager();
}
return this.processorManager;
}
}
public void Execute(IEnumerable<BuildItem> itemsToBuild) public void Execute(IEnumerable<BuildItem> itemsToBuild)
{ {
foreach (BuildItem buildItem in itemsToBuild) foreach (BuildItem buildItem in itemsToBuild)
{ {
var importedObject = ImportAsset(buildItem); var importedObject = ImportAsset(buildItem);
if (String.IsNullOrEmpty(buildItem.BuildRequest.ProcessorName))
{
buildItem.BuildRequest.ProcessorName = ProcessorManager.GetProcessorForType(importedObject.GetType());
}
var buildedItem = Process(buildItem, importedObject);
} }
} }
@ -47,5 +69,19 @@ namespace ANX.Framework.Content.Pipeline.Tasks
//}); //});
return instance.Import(item.BuildRequest.SourceFilename, context); return instance.Import(item.BuildRequest.SourceFilename, context);
} }
private object Process(BuildItem item, object importedObject)
{
if (String.IsNullOrEmpty(item.BuildRequest.ProcessorName) == false)
{
IContentProcessor instance = this.ProcessorManager.GetInstance(item.BuildRequest.ProcessorName);
ContentProcessorContext context = new AnxContentProcessorContext();
return instance.Process(importedObject, context);
}
else
{
return importedObject;
}
}
} }
} }

View File

@ -0,0 +1,59 @@
#region Using Statements
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
#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())
{
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);
}
}
}
}
public IContentProcessor GetInstance(string processorName)
{
IContentProcessor processor;
if (!this.processors.TryGetValue(processorName, out processor))
{
throw new Exception(String.Format("can't find processor {0}", processorName));
}
return processor;
}
public String GetProcessorForType(Type type)
{
foreach (KeyValuePair<String, IContentProcessor> processorDescription in processors)
{
if (Type.Equals(processorDescription.Value.InputType, type))
{
return processorDescription.Key;
}
}
return String.Empty;
}
}
}

View File

@ -29,6 +29,7 @@ namespace ContentBuilder
BuildItem buildItem = new BuildItem(); BuildItem buildItem = new BuildItem();
buildItem.BuildRequest = new BuildRequest(); buildItem.BuildRequest = new BuildRequest();
buildItem.BuildRequest.ImporterName = ImporterManager.GuessImporterByFileExtension(arg); buildItem.BuildRequest.ImporterName = ImporterManager.GuessImporterByFileExtension(arg);
//TODO: set configured processor name
buildItem.BuildRequest.SourceFilename = arg; buildItem.BuildRequest.SourceFilename = arg;
buildItem.BuildRequest.AssetName = System.IO.Path.GetFileNameWithoutExtension(arg); buildItem.BuildRequest.AssetName = System.IO.Path.GetFileNameWithoutExtension(arg);