using System; using System.IO; using BabylonExport.Entities; using UnityEditor; using UnityEngine; namespace Unity3D2Babylon { partial class SceneBuilder { private void CopyTextureCube(string texturePath, Cubemap cubemap, BabylonTexture babylonTexture) { if (!babylonScene.AddTextureCube(texturePath)) { return; } try { foreach (CubemapFace face in Enum.GetValues(typeof(CubemapFace))) { var faceTexturePath = Path.Combine(babylonScene.OutputPath, Path.GetFileNameWithoutExtension(texturePath)); switch (face) { case CubemapFace.PositiveX: faceTexturePath += "_px.jpg"; break; case CubemapFace.NegativeX: faceTexturePath += "_nx.jpg"; break; case CubemapFace.PositiveY: faceTexturePath += "_py.jpg"; break; case CubemapFace.NegativeY: faceTexturePath += "_ny.jpg"; break; case CubemapFace.PositiveZ: faceTexturePath += "_pz.jpg"; break; case CubemapFace.NegativeZ: faceTexturePath += "_nz.jpg"; break; } var tempTexture = new Texture2D(cubemap.width, cubemap.height, cubemap.format, false); tempTexture.SetPixels(cubemap.GetPixels(face)); tempTexture.Apply(); File.WriteAllBytes(faceTexturePath, tempTexture.EncodeToJPG()); } } catch (Exception ex) { Debug.LogException(ex); } var textureName = Path.GetFileNameWithoutExtension(texturePath); babylonTexture.name = textureName; babylonTexture.isCube = true; babylonTexture.level = exportationOptions.ReflectionDefaultLevel; babylonTexture.coordinatesMode = 3; } private void CopyTexture(string texturePath, Texture2D texture2D, BabylonTexture babylonTexture) { bool needToDelete = false; var useJPG = !texture2D.alphaIsTransparency; // Convert unsupported file extensions if (texturePath.EndsWith(".psd") || texturePath.EndsWith(".tif") || texturePath.EndsWith(".exr")) { try { // Change texture import settings to be able to read texture data var textureImporter = AssetImporter.GetAtPath(texturePath) as TextureImporter; var previousIsReadable = textureImporter.isReadable; var previousNormalMap = textureImporter.normalmap; var previousLightmap = textureImporter.lightmap; var previousConvertToNormalmap = textureImporter.convertToNormalmap; var previousTextureType = textureImporter.textureType; var previousGrayscaleToAlpha = textureImporter.grayscaleToAlpha; textureImporter.textureType = TextureImporterType.Advanced; textureImporter.isReadable = true; textureImporter.lightmap = false; textureImporter.normalmap = false; textureImporter.convertToNormalmap = false; textureImporter.grayscaleToAlpha = false; AssetDatabase.ImportAsset(texturePath); texturePath = Path.Combine(Path.GetTempPath(), Path.GetFileName(texturePath)); var extension = useJPG ? ".jpg" : ".png"; texturePath = texturePath.Replace(".psd", extension).Replace(".tif", extension).Replace(".exr", extension); var tempTexture = new Texture2D(texture2D.width, texture2D.height, TextureFormat.ARGB32, false); tempTexture.SetPixels32(texture2D.GetPixels32()); tempTexture.Apply(); File.WriteAllBytes(texturePath, useJPG ? tempTexture.EncodeToJPG() : tempTexture.EncodeToPNG()); needToDelete = true; // Restore textureImporter.isReadable = previousIsReadable; textureImporter.normalmap = previousNormalMap; textureImporter.lightmap = previousLightmap; textureImporter.convertToNormalmap = previousConvertToNormalmap; textureImporter.textureType = previousTextureType; textureImporter.grayscaleToAlpha = previousGrayscaleToAlpha; AssetDatabase.ImportAsset(texturePath, ImportAssetOptions.ForceUpdate); } catch (Exception ex) { Debug.LogException(ex); } } var textureName = Path.GetFileName(texturePath); babylonTexture.name = textureName; babylonScene.AddTexture(texturePath); if (needToDelete) { File.Delete(texturePath); } } private BabylonMaterial DumpMaterial(Material material, Renderer renderer) { if (!materialsDictionary.ContainsKey(material.name)) { var bMat = new BabylonMaterial { name = material.name, id = Guid.NewGuid().ToString(), diffuse = new float[4], specular = new float[4] }; bMat.diffuse[0] = 1.0f; bMat.diffuse[1] = 1.0f; bMat.diffuse[2] = 1.0f; bMat.diffuse[3] = 1.0f; if (material.HasProperty("_Color")) { bMat.diffuse = material.color.ToFloat(); } if (material.HasProperty("_SpecColor")) { var specColor = material.GetColor("_SpecColor"); bMat.specular = specColor.ToFloat(); } if (material.HasProperty("_Shininess")) { var specShininess = material.GetFloat("_Shininess"); bMat.specularPower = specShininess * 128; } if (material.HasProperty("_Emission")) { var emissiveColor = material.GetColor("_Emission"); bMat.emissive = emissiveColor.ToFloat(); } if (material.mainTexture) { var mainTexturePath = AssetDatabase.GetAssetPath(material.mainTexture); bMat.diffuseTexture = new BabylonTexture { uScale = material.mainTextureScale.x, vScale = material.mainTextureScale.y, uOffset = material.mainTextureOffset.x, vOffset = material.mainTextureOffset.y }; var mainTexture2D = material.mainTexture as Texture2D; CopyTexture(mainTexturePath, mainTexture2D, bMat.diffuseTexture); var alphaCuttOff = 0f; if (material.HasProperty("_Cutoff")) { alphaCuttOff = material.GetFloat("_Cutoff"); } if ((mainTexture2D && mainTexture2D.alphaIsTransparency) || alphaCuttOff > 0) { bMat.diffuseTexture.hasAlpha = true; bMat.backFaceCulling = false; } bMat.diffuse[0] = 1.0f; bMat.diffuse[1] = 1.0f; bMat.diffuse[2] = 1.0f; bMat.diffuse[3] = 1.0f; } bMat.bumpTexture = DumpTextureFromMaterial(material, "_BumpMap"); bMat.emissiveTexture = DumpTextureFromMaterial(material, "_Illum"); bMat.ambientTexture = DumpTextureFromMaterial(material, "_LightMap"); bMat.reflectionTexture = DumpTextureFromMaterial(material, "_Cube"); //if (bMat.ambientTexture == null && renderer.lightmapIndex >= 0 && renderer.lightmapIndex != 255 && LightmapSettings.lightmaps.Length > renderer.lightmapIndex) //{ // var lightmap = LightmapSettings.lightmaps[renderer.lightmapIndex].lightmapFar; // bMat.ambientTexture = DumpTexture(lightmap); // bMat.ambientTexture.coordinatesIndex = 1; // bMat.ambientTexture.uScale = renderer.lightmapTilingOffset.x; // bMat.ambientTexture.vScale = renderer.lightmapTilingOffset.y; // bMat.ambientTexture.uOffset = renderer.lightmapTilingOffset.z; // bMat.ambientTexture.vOffset = renderer.lightmapTilingOffset.w; //} materialsDictionary.Add(bMat.name, bMat); return bMat; } return materialsDictionary[material.name]; } private BabylonTexture DumpTextureFromMaterial(Material material, string name) { if (!material.HasProperty(name)) { return null; } var texture = material.GetTexture(name); return DumpTexture(texture, material, name); } private BabylonTexture DumpTexture(Texture texture, Material material = null, string name = "") { if (texture == null) { return null; } var texturePath = AssetDatabase.GetAssetPath(texture); var textureName = Path.GetFileName(texturePath); var babylonTexture = new BabylonTexture { name = textureName }; if (material != null) { var textureScale = material.GetTextureScale(name); babylonTexture.uScale = textureScale.x; babylonTexture.vScale = textureScale.y; var textureOffset = material.GetTextureOffset(name); babylonTexture.uOffset = textureOffset.x; babylonTexture.vOffset = textureOffset.y; } var texture2D = texture as Texture2D; if (texture2D) { babylonTexture.hasAlpha = texture2D.alphaIsTransparency; CopyTexture(texturePath, texture2D, babylonTexture); } else { var cubemap = texture as Cubemap; if (cubemap != null) { CopyTextureCube(texturePath, cubemap, babylonTexture); } } return babylonTexture; } } }