4 using System.Collections.Concurrent;
5 using System.Collections.Generic;
8 using SiliconStudio.Assets.Compiler;
9 using SiliconStudio.Core;
10 using SiliconStudio.Core.Diagnostics;
11 using SiliconStudio.Core.Serialization;
12 using SiliconStudio.Core.Serialization.Assets;
13 using SiliconStudio.Core.Storage;
14 using SiliconStudio.Paradox.Assets.Model;
15 using SiliconStudio.Paradox.Effects;
16 using SiliconStudio.Paradox.Effects.Data;
17 using SiliconStudio.Paradox.Engine.Data;
18 using SiliconStudio.Paradox.EntityModel.Data;
19 using SiliconStudio.Paradox.Shaders.Compiler;
21 namespace SiliconStudio.
Paradox.Assets.Effect.Generators
27 LightingKeys.CastShadows,
28 LightingKeys.ReceiveShadows
39 public override int GeneratorPriority
52 List<EntityParameters> entityParametersList;
53 var entityParametersSet = (ConcurrentDictionary<Guid, List<EntityParameters>>)context.
Properties.GetOrAdd(EntityParametersKey, key =>
new ConcurrentDictionary<Guid, List<EntityParameters>>());
54 entityParametersList = entityParametersSet.GetOrAdd(context.Package.Id, key =>
63 var allEntityParameters =
new List<EntityParameters>();
66 var assetPath = entityAssetItem.Location.GetDirectoryAndFileName();
69 var entity = assetManager.Load<
EntityData>(assetPath, settings);
71 foreach (var modelComponent
in entity.Components.Select(x => x.Value).OfType<
ModelComponentData>())
73 foreach (var meshData
in modelComponent.Model.Value.Meshes)
75 var lightingParameters = GetLightingParameters(meshData);
76 var materialParameters = GetMeshMaterialParameters(meshData);
78 if (lightingParameters == null || lightingParameters.Count == 0)
81 entityParameters.MaterialParameters = materialParameters;
82 entityParameters.ModelParameters = modelComponent.Parameters;
83 entityParameters.MeshParameters = meshData != null ? meshData.Parameters : null;
84 entityParameters.LightingParameters = null;
85 allEntityParameters.Add(entityParameters);
89 foreach (var lightConfig
in lightingParameters)
92 entityParameters.MaterialParameters = materialParameters;
93 entityParameters.ModelParameters = modelComponent.Parameters;
94 entityParameters.MeshParameters = meshData != null ? meshData.Parameters : null;
95 entityParameters.LightingParameters = lightConfig;
96 allEntityParameters.Add(entityParameters);
104 log.Error(
"Error while loading model mesh [{0}]", ex, assetPath);
108 return allEntityParameters;
112 if (entityParametersList.Count != 0)
114 var useMeshParameters = baseParameters.Get(MeshKeys.UseParameters);
116 var hashParameters =
new HashSet<ObjectId>();
118 foreach (var entityParameters
in entityParametersList)
127 if (useMaterialParameters)
128 AddToParameters(entityParameters.MaterialParameters, newParameters);
130 AddToParameters(entityParameters.ModelParameters, newParameters);
132 if (useMeshParameters)
133 AddToParameters(entityParameters.MeshParameters, newParameters);
135 AddToParameters(entityParameters.LightingParameters, newParameters);
138 var
id = ObjectId.FromObject(newParameters, out buffer1);
139 if (!hashParameters.Contains(
id))
141 hashParameters.Add(id);
142 var compilerParameters = baseParameters.Clone();
143 newParameters.CopyTo(compilerParameters);
144 yield
return compilerParameters;
150 yield
return baseParameters.Clone();
161 if (meshData != null)
163 var material = meshData.Material.Value;
164 if (material != null)
166 return material.Parameters;
177 private List<ParameterCollectionData> GetLightingParameters(
MeshData meshData)
181 var lightingDescContent = meshData.Parameters[LightingKeys.LightingConfigurations];
184 var lightingDesc = ((ContentReference<LightingConfigurationsSetData>)lightingDescContent).Value;
185 if (lightingDesc != null)
187 var collection =
new List<ParameterCollectionData>();
188 foreach (var config
in lightingDesc.Configs)
190 var parameters = config.GetCollection();
191 SetShadowCasterReceiverConfiguration(meshData.
Parameters, parameters, shadowKeys);
192 collection.Add(parameters);
198 SetShadowCasterReceiverConfiguration(meshData.
Parameters, defaultParameters, shadowKeys);
199 return new List<ParameterCollectionData> { defaultParameters };
206 if (sourceParameters != null)
208 foreach (var key
in keys)
210 if (sourceParameters.ContainsKey(key))
211 targetParameters.
Set(key, sourceParameters[key]);
217 internal static void Register()
void Set(ParameterKey key, object value)
Key of an effect parameter.
SiliconStudio.Paradox.Effects.Data.ParameterCollectionData Parameters
Data field for SiliconStudio.Paradox.Effects.Mesh.Parameters.
Package Package
Gets the package.
static readonly ParameterKey< bool > GenerateShader
Allow material compilation without mesh.
Data type for SiliconStudio.Paradox.Effects.LightingConfigurationsSet.
Parameters used for compilation.
Data type for SiliconStudio.Paradox.Effects.Material.
PackageAssetCollection Assets
Gets the assets stored in this package.
Specifies settings for AssetManager.Load{T} operations.
Data type for SiliconStudio.Paradox.Effects.ParameterCollection.
ParameterCollectionData ModelParameters
The context used when compiling an asset in a Package.
ParameterCollectionData LightingParameters
ParameterCollectionData MaterialParameters
Defines keys associated with mesh used for compiling assets.
Data type for SiliconStudio.Paradox.EntityModel.Entity.
Data type for SiliconStudio.Paradox.Engine.ModelComponent.
PropertyCollection Properties
Gets the attributes attached to this context.
Data type for SiliconStudio.Paradox.Effects.Mesh.
Data type for SiliconStudio.Paradox.Effects.Model.
override IEnumerable< CompilerParameters > Generate(AssetCompilerContext context, CompilerParameters baseParameters, ILogger log)
Generates derived CompilerParameters from a base parameters.
static readonly ParameterKey< LightingConfigurationsSet > LightingConfigurations
Supported lighting configurations.
ParameterCollectionData MeshParameters
A class that represents a tag propety.
A container to handle a hierarchical collection of effect variables.