using System;
using TriLibCore.General;
using UnityEngine;
namespace TriLibCore.Mappers
{
/// Represents a Material Mapper that converts TriLib Materials into Unity Standard Materials.
[Serializable]
[CreateAssetMenu(menuName = "TriLib/Mappers/Material/Standard Material Mapper", fileName = "StandardMaterialMapper")]
public class StandardMaterialMapper : MaterialMapper
{
private bool _isCompatible;
#region Standard
public override Material MaterialPreset => Resources.Load("Materials/Standard/Standard/TriLibStandard");
public override Material CutoutMaterialPreset => Resources.Load("Materials/Standard/Standard/TriLibStandardAlphaCutout");
public override Material TransparentComposeMaterialPreset => Resources.Load("Materials/Standard/Standard/TriLibStandardAlphaCompose");
public override Material TransparentMaterialPreset => Resources.Load("Materials/Standard/Standard/TriLibStandardAlpha");
public override Material MaterialPresetNoMetallicTexture => Resources.Load("Materials/Standard/Standard/TriLibStandardNoMetallicTexture");
public override Material CutoutMaterialPresetNoMetallicTexture => Resources.Load("Materials/Standard/Standard/TriLibStandardAlphaCutoutNoMetallicTexture");
public override Material TransparentMaterialPresetNoMetallicTexture => Resources.Load("Materials/Standard/Standard/TriLibStandardAlphaNoMetallicTexture");
public override Material TransparentComposeMaterialPresetNoMetallicTexture => TransparentComposeMaterialPreset;
#endregion
public override Material LoadingMaterial => Resources.Load("Materials/Standard/TriLibStandardLoading");
public override bool ExtractMetallicAndSmoothness
{
get
{
return false;
}
}
public override bool IsCompatible(MaterialMapperContext materialMapperContext)
{
return _isCompatible;
}
private void Awake()
{
_isCompatible = TriLibSettings.GetBool("StandardMaterialMapper");
}
public override void Map(MaterialMapperContext materialMapperContext)
{
materialMapperContext.VirtualMaterial = new VirtualMaterial();
CheckTransparencyMapTexture(materialMapperContext);
CheckSpecularMapTexture(materialMapperContext);
CheckDiffuseMapTexture(materialMapperContext);
CheckDiffuseColor(materialMapperContext);
CheckNormalMapTexture(materialMapperContext);
CheckEmissionColor(materialMapperContext);
CheckEmissionMapTexture(materialMapperContext);
CheckOcclusionMapTexture(materialMapperContext);
CheckGlossinessMapTexture(materialMapperContext);
CheckGlossinessValue(materialMapperContext);
CheckMetallicGlossMapTexture(materialMapperContext);
CheckMetallicValue(materialMapperContext);
BuildMaterial(materialMapperContext);
//materialMapperContext.AddPostProcessingActionToMainThread(BuildMaterial, materialMapperContext);
}
private void CheckDiffuseMapTexture(MaterialMapperContext materialMapperContext)
{
var diffuseTexturePropertyName = materialMapperContext.Material.GetGenericPropertyName(GenericMaterialProperty.DiffuseMap);
var textureValue = materialMapperContext.Material.GetTextureValue(diffuseTexturePropertyName);
LoadTextureWithCallbacks(materialMapperContext, TextureType.Diffuse, textureValue, CheckTextureOffsetAndScaling, ApplyDiffuseMapTexture);
}
private void ApplyDiffuseMapTexture(TextureLoadingContext textureLoadingContext)
{
if (textureLoadingContext.UnityTexture != null)
{
textureLoadingContext.Context.AddUsedTexture(textureLoadingContext.UnityTexture);
}
textureLoadingContext.MaterialMapperContext.VirtualMaterial.SetProperty("_MainTex", textureLoadingContext.UnityTexture, GenericMaterialProperty.DiffuseMap);
}
private void CheckGlossinessValue(MaterialMapperContext materialMapperContext)
{
var value = materialMapperContext.Material.GetGenericFloatValueMultiplied(GenericMaterialProperty.Glossiness, materialMapperContext);
materialMapperContext.VirtualMaterial.SetProperty("_Glossiness", value);
materialMapperContext.VirtualMaterial.SetProperty("_GlossMapScale", value);
}
private void CheckMetallicValue(MaterialMapperContext materialMapperContext)
{
var value = materialMapperContext.Material.GetGenericFloatValueMultiplied(GenericMaterialProperty.Metallic, materialMapperContext);
materialMapperContext.VirtualMaterial.SetProperty("_Metallic", value);
}
private void CheckEmissionMapTexture(MaterialMapperContext materialMapperContext)
{
var emissionTexturePropertyName = materialMapperContext.Material.GetGenericPropertyName(GenericMaterialProperty.EmissionMap);
var textureValue = materialMapperContext.Material.GetTextureValue(emissionTexturePropertyName);
LoadTextureWithCallbacks(materialMapperContext, TextureType.Emission, textureValue, CheckTextureOffsetAndScaling, ApplyEmissionMapTexture);
}
private void ApplyEmissionMapTexture(TextureLoadingContext textureLoadingContext)
{
if (textureLoadingContext.UnityTexture == null && textureLoadingContext.MaterialMapperContext.VirtualMaterial.HasEmissionColor)
{
textureLoadingContext.OriginalUnityTexture = textureLoadingContext.UnityTexture = TriLibCore.Textures.DefaultTextures.White;
}
if (textureLoadingContext.UnityTexture != null)
{
textureLoadingContext.Context.AddUsedTexture(textureLoadingContext.UnityTexture);
}
textureLoadingContext.MaterialMapperContext.VirtualMaterial.SetProperty("_EmissionMap", textureLoadingContext.UnityTexture, GenericMaterialProperty.EmissionMap);
if (textureLoadingContext.UnityTexture != null)
{
textureLoadingContext.MaterialMapperContext.VirtualMaterial.EnableKeyword("_EMISSION");
textureLoadingContext.MaterialMapperContext.VirtualMaterial.GlobalIlluminationFlags = MaterialGlobalIlluminationFlags.RealtimeEmissive;
}
else
{
textureLoadingContext.MaterialMapperContext.VirtualMaterial.DisableKeyword("_EMISSION");
textureLoadingContext.MaterialMapperContext.VirtualMaterial.GlobalIlluminationFlags = MaterialGlobalIlluminationFlags.EmissiveIsBlack;
}
}
private void CheckNormalMapTexture(MaterialMapperContext materialMapperContext)
{
var normalMapTexturePropertyName = materialMapperContext.Material.GetGenericPropertyName(GenericMaterialProperty.NormalMap);
var textureValue = materialMapperContext.Material.GetTextureValue(normalMapTexturePropertyName);
LoadTextureWithCallbacks(materialMapperContext, TextureType.NormalMap, textureValue, CheckTextureOffsetAndScaling, ApplyNormalMapTexture);
}
private void ApplyNormalMapTexture(TextureLoadingContext textureLoadingContext)
{
if (textureLoadingContext.UnityTexture != null)
{
textureLoadingContext.Context.AddUsedTexture(textureLoadingContext.UnityTexture);
}
textureLoadingContext.MaterialMapperContext.VirtualMaterial.SetProperty("_BumpMap", textureLoadingContext.UnityTexture, GenericMaterialProperty.NormalMap);
if (textureLoadingContext.UnityTexture != null)
{
textureLoadingContext.MaterialMapperContext.VirtualMaterial.EnableKeyword("_NORMALMAP");
textureLoadingContext.MaterialMapperContext.VirtualMaterial.SetProperty("_NormalScale", 1f);
}
else
{
textureLoadingContext.MaterialMapperContext.VirtualMaterial.DisableKeyword("_NORMALMAP");
}
}
private void CheckTransparencyMapTexture(MaterialMapperContext materialMapperContext)
{
materialMapperContext.VirtualMaterial.HasAlpha |= materialMapperContext.Material.UsesAlpha;
var transparencyTexturePropertyName = materialMapperContext.Material.GetGenericPropertyName(GenericMaterialProperty.TransparencyMap);
var textureValue = materialMapperContext.Material.GetTextureValue(transparencyTexturePropertyName);
LoadTextureWithCallbacks(materialMapperContext, TextureType.Transparency, textureValue, CheckTextureOffsetAndScaling);
}
private void CheckSpecularMapTexture(MaterialMapperContext materialMapperContext)
{
var specularTexturePropertyName = materialMapperContext.Material.GetGenericPropertyName(GenericMaterialProperty.SpecularMap);
var textureValue = materialMapperContext.Material.GetTextureValue(specularTexturePropertyName);
LoadTextureWithCallbacks(materialMapperContext, TextureType.Specular, textureValue, CheckTextureOffsetAndScaling);
}
private void CheckOcclusionMapTexture(MaterialMapperContext materialMapperContext)
{
var occlusionMapTextureName = materialMapperContext.Material.GetGenericPropertyName(GenericMaterialProperty.OcclusionMap);
var textureValue = materialMapperContext.Material.GetTextureValue(occlusionMapTextureName);
LoadTextureWithCallbacks(materialMapperContext, TextureType.Occlusion, textureValue, CheckTextureOffsetAndScaling, ApplyOcclusionMapTexture);
}
private void ApplyOcclusionMapTexture(TextureLoadingContext textureLoadingContext)
{
if (textureLoadingContext.Texture != null)
{
textureLoadingContext.Context.AddUsedTexture(textureLoadingContext.UnityTexture);
}
textureLoadingContext.MaterialMapperContext.VirtualMaterial.SetProperty("_OcclusionMap", textureLoadingContext.UnityTexture, GenericMaterialProperty.OcclusionMap);
if (textureLoadingContext.UnityTexture != null)
{
textureLoadingContext.MaterialMapperContext.VirtualMaterial.EnableKeyword("_OCCLUSIONMAP");
}
else
{
textureLoadingContext.MaterialMapperContext.VirtualMaterial.DisableKeyword("_OCCLUSIONMAP");
}
}
private void CheckGlossinessMapTexture(MaterialMapperContext materialMapperContext)
{
var auxiliaryMapTextureName = materialMapperContext.Material.GetGenericPropertyName(GenericMaterialProperty.GlossinessOrRoughnessMap);
var textureValue = materialMapperContext.Material.GetTextureValue(auxiliaryMapTextureName);
LoadTextureWithCallbacks(materialMapperContext, TextureType.GlossinessOrRoughness, textureValue, CheckTextureOffsetAndScaling);
}
private void CheckMetallicGlossMapTexture(MaterialMapperContext materialMapperContext)
{
var metallicGlossMapTextureName = materialMapperContext.Material.GetGenericPropertyName(GenericMaterialProperty.MetallicMap);
var textureValue = materialMapperContext.Material.GetTextureValue(metallicGlossMapTextureName);
LoadTextureWithCallbacks(materialMapperContext, TextureType.Metalness, textureValue, CheckTextureOffsetAndScaling, ApplyMetallicGlossMapTexture);
}
private void ApplyMetallicGlossMapTexture(TextureLoadingContext textureLoadingContext)
{
if (textureLoadingContext.UnityTexture != null)
{
textureLoadingContext.Context.AddUsedTexture(textureLoadingContext.UnityTexture);
}
textureLoadingContext.MaterialMapperContext.VirtualMaterial.SetProperty("_MetallicGlossMap", textureLoadingContext.UnityTexture, GenericMaterialProperty.MetallicMap);
if (textureLoadingContext.UnityTexture != null)
{
textureLoadingContext.MaterialMapperContext.VirtualMaterial.EnableKeyword("_METALLICGLOSSMAP");
}
else
{
textureLoadingContext.MaterialMapperContext.VirtualMaterial.DisableKeyword("_METALLICGLOSSMAP");
}
}
private void CheckEmissionColor(MaterialMapperContext materialMapperContext)
{
var value = materialMapperContext.Material.GetGenericColorValueMultiplied(GenericMaterialProperty.EmissionColor, materialMapperContext);
materialMapperContext.VirtualMaterial.SetProperty("_EmissionColor", materialMapperContext.Context.Options.ApplyGammaCurveToMaterialColors ? value.gamma : value);
if (value != Color.black)
{
materialMapperContext.VirtualMaterial.EnableKeyword("_EMISSION");
materialMapperContext.VirtualMaterial.GlobalIlluminationFlags = MaterialGlobalIlluminationFlags.RealtimeEmissive;
materialMapperContext.VirtualMaterial.SetProperty("_EmissiveIntensity", 1f);
materialMapperContext.VirtualMaterial.HasEmissionColor = true;
}
else
{
materialMapperContext.VirtualMaterial.DisableKeyword("_EMISSION");
materialMapperContext.VirtualMaterial.GlobalIlluminationFlags = MaterialGlobalIlluminationFlags.EmissiveIsBlack;
}
}
private void CheckDiffuseColor(MaterialMapperContext materialMapperContext)
{
var value = materialMapperContext.Material.GetGenericColorValueMultiplied(GenericMaterialProperty.DiffuseColor, materialMapperContext);
value.a *= materialMapperContext.Material.GetGenericFloatValueMultiplied(GenericMaterialProperty.AlphaValue);
materialMapperContext.VirtualMaterial.HasAlpha |= value.a < 1f;
materialMapperContext.VirtualMaterial.SetProperty("_Color", materialMapperContext.Context.Options.ApplyGammaCurveToMaterialColors ? value.gamma : value);
}
public override string GetDiffuseTextureName(MaterialMapperContext materialMapperContext)
{
return "_MainTex";
}
public override string GetGlossinessOrRoughnessTextureName(MaterialMapperContext materialMapperContext)
{
return "_MetallicGlossMap";
}
public override string GetDiffuseColorName(MaterialMapperContext materialMapperContext)
{
return "_Color";
}
public override string GetEmissionColorName(MaterialMapperContext materialMapperContext)
{
return "_EmissionColor";
}
public override string GetGlossinessOrRoughnessName(MaterialMapperContext materialMapperContext)
{
return "_GlossMapScale";
}
public override string GetMetallicName(MaterialMapperContext materialMapperContext)
{
return "_Metallic";
}
public override string GetMetallicTextureName(MaterialMapperContext materialMapperContext)
{
return null;
}
}
}