private BabylonMaterial DumpPBRMaterial(Material material, int lightmapIndex = -1, Vector4 lightmapScaleOffset = default(Vector4), bool metallic = true, int lightmapCoordIndex = -1)
{
var materialNotSupported = false;
if (materialsDictionary.ContainsKey(material.name))
{
return materialsDictionary[material.name];
}
var babylonPbrMaterial = new BabylonPBRMaterial
{
name = material.name,
id = Guid.NewGuid().ToString(),
albedo = new float[4],
useEmissiveAsIllumination = true,
useSpecularOverAlpha = true,
useRadianceOverAlpha = true,
};
ExporterWindow.ReportProgress(1, "Exporting physical material: " + material.name);
babylonPbrMaterial.environmentIntensity = RenderSettings.ambientIntensity;
if (material.mainTexture && material.mainTexture.GetType().FullName == "UnityEngine.ProceduralTexture")
{
materialNotSupported = true;
Debug.LogWarning("ProceduralTexture: " + material.mainTexture.name + " not supported by Babylon.js");
}
if (material.HasProperty("_Roughness"))
{
babylonPbrMaterial.roughness = material.GetInt("_Roughness");
}
if (material.HasProperty("_UseRoughnessFromMetallicTextureAlpha"))
{
babylonPbrMaterial.useRoughnessFromMetallicTextureAlpha = (material.GetInt("_UseRoughnessFromMetallicTextureAlpha") != 0);
}
if (material.HasProperty("_UseRoughnessFromMetallicTextureGreen"))
{
babylonPbrMaterial.useRoughnessFromMetallicTextureGreen = (material.GetInt("_UseRoughnessFromMetallicTextureGreen") != 0);
}
if (material.HasProperty("_AlphaMode"))
{
babylonPbrMaterial.alphaMode = material.GetInt("_AlphaMode");
}
if (material.HasProperty("_DisableLighting"))
{
babylonPbrMaterial.disableLighting = (material.GetInt("_DisableLighting") != 0);
}
if (material.HasProperty("_UseEmissiveAsIllumination"))
{
babylonPbrMaterial.useEmissiveAsIllumination = (material.GetInt("_UseEmissiveAsIllumination") != 0);
}
if (material.HasProperty("_BackFaceCulling"))
{
babylonPbrMaterial.backFaceCulling = (material.GetInt("_BackFaceCulling") != 0);
}
// Albedo
if (material.HasProperty("_Color"))
{
babylonPbrMaterial.albedo = material.color.ToFloat();
}
babylonPbrMaterial.albedoTexture = DumpTextureFromMaterial(material, "_MainTex");
if (material.mainTexture != null && !materialNotSupported)
{
var textureScale = material.mainTextureScale;
babylonPbrMaterial.albedoTexture.uScale = textureScale.x;
babylonPbrMaterial.albedoTexture.vScale = textureScale.y;
var textureOffset = material.mainTextureOffset;
babylonPbrMaterial.albedoTexture.uOffset = textureOffset.x;
babylonPbrMaterial.albedoTexture.vOffset = textureOffset.y;
}
// Emissive
if (material.HasProperty("_EmissionColor"))
{
babylonPbrMaterial.emissive = material.GetColor("_EmissionColor").ToFloat();
}
babylonPbrMaterial.emissiveTexture = DumpTextureFromMaterial(material, "_EmissionMap");
// Transparency
DumpTransparency(material, babylonPbrMaterial);
// Glossiess/Reflectivity
DumpGlossinessReflectivity(material, metallic, babylonPbrMaterial);
// Occlusion
babylonPbrMaterial.ambientTexture = DumpTextureFromMaterial(material, "_OcclusionMap");
if (babylonPbrMaterial.ambientTexture != null && material.HasProperty("_OcclusionStrength"))
{
babylonPbrMaterial.ambientTexture.level = material.GetFloat("_OcclusionStrength");
}
// Normal
babylonPbrMaterial.bumpTexture = DumpTextureFromMaterial(material, "_BumpMap");
if (babylonPbrMaterial.bumpTexture != null && material.HasProperty("_BumpScale"))
{
babylonPbrMaterial.bumpTexture.level = material.GetFloat("_BumpScale");
}
// Reflection
babylonPbrMaterial.reflectionTexture = DumpReflectionTexture();
// Baking Override
if (exportationOptions.DefaultLightmapMode == (int)BabylonLightmapMode.FullLightBaking)
{
babylonPbrMaterial.disableLighting = true;
babylonPbrMaterial.useEmissiveAsIllumination = true;
}
// Lightmapping
bool hasLightmap = (exportationOptions.ExportLightmaps && lightmapIndex >= 0 && lightmapIndex != 65535 && LightmapSettings.lightmaps.Length > lightmapIndex);
if (hasLightmap && babylonPbrMaterial.ambientTexture == null)
{
var lightmap = LightmapSettings.lightmaps[lightmapIndex].lightmapLight;
var texturePath = AssetDatabase.GetAssetPath(lightmap);
if (!String.IsNullOrEmpty(texturePath))
{
ExporterWindow.ReportProgress(1, "Dumping pbr material lightmap: " + lightmap.name);
babylonPbrMaterial.lightmapTexture = DumpTexture(lightmap, isLightmap: true);
babylonPbrMaterial.lightmapTexture.coordinatesIndex = (lightmapCoordIndex >= 0) ? lightmapCoordIndex : exportationOptions.DefaultCoordinatesIndex;
babylonPbrMaterial.useLightmapAsShadowmap = true;
babylonPbrMaterial.lightmapTexture.uScale = lightmapScaleOffset.x;
babylonPbrMaterial.lightmapTexture.vScale = lightmapScaleOffset.y;
babylonPbrMaterial.lightmapTexture.uOffset = lightmapScaleOffset.z;
babylonPbrMaterial.lightmapTexture.vOffset = lightmapScaleOffset.w;
}
}
materialsDictionary.Add(babylonPbrMaterial.name, babylonPbrMaterial);
return babylonPbrMaterial;
}