public override IEnumerable <CompilerParameters> Generate(AssetCompilerContext context, CompilerParameters baseParameters, ILogger log) { var allMaterialParameters = new List <ParameterCollection>(); if (baseParameters.Get(MaterialAssetKeys.GenerateShader)) { var assetManager = new AssetManager(); var settings = new AssetManagerLoaderSettings() { ContentFilter = AssetManagerLoaderSettings.NewContentFilterByType(typeof(MaterialData)), }; var hashParameters = new HashSet <ObjectId>(); foreach (var materialAssetItem in context.Package.Assets.Where(item => item.Asset is MaterialAsset)) { var assetPath = materialAssetItem.Location.GetDirectoryAndFileName(); try { var materialData = assetManager.Load <MaterialData>(assetPath, settings); if (materialData != null && materialData.Parameters != null && materialData.Parameters.Count > 0) { var materialParameters = new ParameterCollection(); AddToParameters(materialData.Parameters, materialParameters); if (materialParameters.Count > 0) { byte[] buffer1; var id = ObjectId.FromObject(materialParameters, out buffer1); if (!hashParameters.Contains(id)) { hashParameters.Add(id); allMaterialParameters.Add(materialParameters); } } } } catch (Exception ex) { log.Error("Error while loading material [{0}]", ex, assetPath); } } } if (allMaterialParameters.Count != 0) { foreach (var materialParams in allMaterialParameters) { var compilerParameters = baseParameters.Clone(); materialParams.CopyTo(compilerParameters); yield return(compilerParameters); } } else { yield return(baseParameters.Clone()); } }
private static ThumbnailData GetFolderThumbnail(IDispatcherService dispatcher) { const string assetKey = "FolderIconAlfredo"; var objectId = ObjectId.FromObject(assetKey); var data = new ResourceThumbnailData(objectId, assetKey); data.PrepareForPresentation(dispatcher).Forget(); return(data); }
public override IEnumerable <CompilerParameters> Generate(AssetCompilerContext context, CompilerParameters baseParameters, ILogger log) { // Cache all the entity parameters once List <EntityParameters> entityParametersList; var entityParametersSet = (ConcurrentDictionary <Guid, List <EntityParameters> >)context.Properties.GetOrAdd(EntityParametersKey, key => new ConcurrentDictionary <Guid, List <EntityParameters> >()); entityParametersList = entityParametersSet.GetOrAdd(context.Package.Id, key => { var assetManager = new AssetManager(); var settings = new AssetManagerLoaderSettings() { ContentFilter = AssetManagerLoaderSettings.NewContentFilterByType(typeof(ModelData), typeof(MeshData), typeof(MaterialData), typeof(LightingConfigurationsSetData)), }; var allEntityParameters = new List <EntityParameters>(); foreach (var entityAssetItem in context.Package.Assets.Where(item => item.Asset is EntityAsset)) { var assetPath = entityAssetItem.Location.GetDirectoryAndFileName(); try { var entity = assetManager.Load <EntityData>(assetPath, settings); foreach (var modelComponent in entity.Components.Select(x => x.Value).OfType <ModelComponentData>()) { foreach (var meshData in modelComponent.Model.Value.Meshes) { var lightingParameters = GetLightingParameters(meshData); var materialParameters = GetMeshMaterialParameters(meshData); if (lightingParameters == null || lightingParameters.Count == 0) { EntityParameters entityParameters; entityParameters.MaterialParameters = materialParameters; entityParameters.ModelParameters = modelComponent.Parameters; entityParameters.MeshParameters = meshData != null ? meshData.Parameters : null; entityParameters.LightingParameters = null; allEntityParameters.Add(entityParameters); } else { foreach (var lightConfig in lightingParameters) { EntityParameters entityParameters; entityParameters.MaterialParameters = materialParameters; entityParameters.ModelParameters = modelComponent.Parameters; entityParameters.MeshParameters = meshData != null ? meshData.Parameters : null; entityParameters.LightingParameters = lightConfig; allEntityParameters.Add(entityParameters); } } } } } catch (Exception ex) { log.Error("Error while loading model mesh [{0}]", ex, assetPath); } } return(allEntityParameters); }); var useMeshParameters = baseParameters.Get(MeshKeys.UseParameters); var useMaterialParameters = baseParameters.Get(MaterialAssetKeys.UseParameters) && !baseParameters.Get(MaterialAssetKeys.GenerateShader); if ((useMeshParameters || useMaterialParameters) && entityParametersList.Count != 0) { var hashParameters = new HashSet <ObjectId>(); foreach (var entityParameters in entityParametersList) { // Add parameters in this order // 1. Material // 2. ModelComponent (Entity) // 3. Mesh // 4. Lighting var newParameters = new ParameterCollection(); if (useMaterialParameters) { AddToParameters(entityParameters.MaterialParameters, newParameters); } AddToParameters(entityParameters.ModelParameters, newParameters); if (useMeshParameters) { AddToParameters(entityParameters.MeshParameters, newParameters); } AddToParameters(entityParameters.LightingParameters, newParameters); byte[] buffer1; var id = ObjectId.FromObject(newParameters, out buffer1); if (!hashParameters.Contains(id)) { hashParameters.Add(id); var compilerParameters = baseParameters.Clone(); newParameters.CopyTo(compilerParameters); yield return(compilerParameters); } } } else { yield return(baseParameters.Clone()); } }