Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
AssetDependenciesCompilerBase.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System;
4 using System.Linq;
5 using SiliconStudio.BuildEngine;
6 
7 namespace SiliconStudio.Assets.Compiler
8 {
9  /// <summary>
10  /// A base class for the compilers that need to recursively compile an asset's dependencies.
11  /// </summary>
12  /// <typeparam name="T">The type of asset that the builder build</typeparam>
13  public abstract class AssetDependenciesCompilerBase<T> : IAssetCompiler where T : Asset
14  {
15  /// <summary>
16  /// The item asset to compile
17  /// </summary>
18  protected AssetItem AssetItem;
19 
20  /// <summary>
21  /// The typed asset associated to <see cref="AssetItem"/>
22  /// </summary>
23  protected T Asset;
24 
25  /// <summary>
26  /// The asset item session where all the <see cref="AssetItem"/> references can be found.
27  /// </summary>
29 
30  public virtual AssetCompilerResult Compile(CompilerContext context, AssetItem assetItem)
31  {
32  if (context == null) throw new ArgumentNullException("context");
33  if (assetItem == null) throw new ArgumentNullException("assetItem");
34 
35  Asset = (T)assetItem.Asset;
36  AssetItem = assetItem;
37  // TODO: This can critically fail if the asset item has been removed from its package - find a way to prevent exceptions here and in usages of AssetsSession
38  AssetsSession = AssetItem.Package.Session;
39 
40  var compilerResult = new AssetCompilerResult();
41 
42  CompileOverride((AssetCompilerContext)context, compilerResult);
43 
44  return compilerResult;
45  }
46 
47  protected abstract AssetCompilerResult CompileOverride(AssetCompilerContext context, AssetCompilerResult compilationResult);
48 
49  /// <summary>
50  /// Add to the current compilation result the compilation steps required to compile the <see cref="AssetItem"/> dependencies.
51  /// </summary>
52  /// <param name="context">A compiler context.</param>
53  /// <param name="result">The current result of the compilation</param>
55  {
56  // create the fake package used to compile the dependences
57  var dependenciesCompilePackage = AssetsSession.CreateCompilePackageFromAsset(AssetItem);
58 
59  // compile the fake package (create the build steps)
60  var assetPackageCompiler = new PackageAssetsCompiler(dependenciesCompilePackage);
61  context.Package = dependenciesCompilePackage.LocalPackages.FirstOrDefault();
62  var dependenciesCompileResult = assetPackageCompiler.Compile(context);
63 
64  // Create the result build steps if not existing yet
65  if (result.BuildSteps == null)
66  result.BuildSteps = new ListBuildStep();
67 
68  // Add the dependencies build steps to the current result
69  result.BuildSteps.Add(dependenciesCompileResult.BuildSteps);
70 
71  // Copy log the dependencies result to the current result
72  dependenciesCompileResult.CopyTo(result);
73  }
74  }
75 }
Result of a compilation of assets when using IAssetCompiler.Compile
A package assets compiler. Creates the build steps necessary to produce the assets of a package...
Base class for Asset.
Definition: Asset.cs:14
The context used when compiling an asset in a Package.
An asset item part of a Package accessible through SiliconStudio.Assets.Package.Assets.
Definition: AssetItem.cs:17
The context used when compiling an asset in a Package.
ListBuildStep BuildSteps
Gets or sets the build steps generated for the build engine. This can be null if LoggerResult.HasErrors is true.
A session for editing a package.
Package Package
Gets the package where this asset is stored.
Definition: AssetItem.cs:97
PackageSession Session
Gets the session.
Definition: Package.cs:219
virtual AssetCompilerResult Compile(CompilerContext context, AssetItem assetItem)
Compiles a list of assets from the specified package.
void AddDependenciesBuildStepsToResult(AssetCompilerContext context, AssetCompilerResult result)
Add to the current compilation result the compilation steps required to compile the AssetItem depende...
PackageSession AssetsSession
The asset item session where all the AssetItem references can be found.
Main interface for compiling an Asset.
Asset Asset
Gets or sets the asset.
Definition: AssetItem.cs:197