Unity3D2Babylon.SceneBuilder.DumpPBRMaterial C# (CSharp) Method

DumpPBRMaterial() private method

private DumpPBRMaterial ( Material material, int lightmapIndex = -1, Vector4 lightmapScaleOffset = default(Vector4), bool metallic = true, int lightmapCoordIndex = -1 ) : BabylonMaterial
material UnityEngine.Material
lightmapIndex int
lightmapScaleOffset Vector4
metallic bool
lightmapCoordIndex int
return BabylonExport.Entities.BabylonMaterial
        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;
        }