Beispiel #1
0
        public void Bake()
        {
            // Validate Project Platform
            if (!Unity3D2Babylon.Tools.ValidateProjectPlatform())
            {
                return;
            }

            try
            {
                string inputFile = AssetDatabase.GetAssetPath(convertCube);
                string inputExt  = Path.GetExtension(inputFile);
                if (cubemapTool == BabylonCubemapTool.ReflectionProbes)
                {
                    if (inputExt.Equals(".hdr", StringComparison.OrdinalIgnoreCase) || inputExt.Equals(".exr", StringComparison.OrdinalIgnoreCase))
                    {
                        ExporterWindow.ReportProgress(1, "Baking cubemap reflection probe... This may take a while.");
                        string            outputFile           = inputFile.Replace(inputExt, "Probe.hdr");
                        int               reflectionResolution = (int)reflectionType;
                        FREE_IMAGE_FORMAT srcType = FREE_IMAGE_FORMAT.FIF_HDR;
                        if (inputExt.Equals(".hdr", StringComparison.OrdinalIgnoreCase))
                        {
                            srcType = FREE_IMAGE_FORMAT.FIF_HDR;
                        }
                        else if (inputExt.Equals(".exr", StringComparison.OrdinalIgnoreCase))
                        {
                            srcType = FREE_IMAGE_FORMAT.FIF_EXR;
                        }
                        FREE_IMAGE_FILTER rescaleFilter = FREE_IMAGE_FILTER.FILTER_LANCZOS3;
                        int        rescaleWidth         = reflectionResolution * 4;
                        int        rescaleHeight        = rescaleWidth / 2;
                        FileStream destStream           = new FileStream(outputFile, FileMode.Create, FileAccess.Write);
                        FileStream sourceStream         = new FileStream(inputFile, FileMode.Open, FileAccess.Read);
                        try
                        {
                            Tools.ConvertFreeImage(sourceStream, srcType, destStream, FREE_IMAGE_FORMAT.FIF_HDR, FREE_IMAGE_TYPE.FIT_UNKNOWN, true, FREE_IMAGE_COLOR_DEPTH.FICD_AUTO, FREE_IMAGE_LOAD_FLAGS.DEFAULT, FREE_IMAGE_SAVE_FLAGS.DEFAULT, 0.0, false, false, rescaleWidth, rescaleHeight, rescaleFilter);
                        } catch (Exception ex) {
                            UnityEngine.Debug.LogException(ex);
                        } finally {
                            destStream.Close();
                            sourceStream.Close();
                        }
                        if (System.IO.File.Exists(outputFile))
                        {
                            AssetDatabase.ImportAsset(outputFile, ImportAssetOptions.ForceUpdate);
                            var importTool = new BabylonTextureImporter(outputFile);
                            importTool.textureImporter.textureShape = TextureImporterShape.TextureCube;
                            importTool.textureImporter.isReadable   = true;
                            importTool.ForceUpdate();
                        }
                    }
                    else
                    {
                        ExporterWindow.ShowMessage("You must select a high dynamic range cubemap");
                    }
                }
                else if (cubemapTool == BabylonCubemapTool.CubemapSplitter)
                {
                    ExporterWindow.ReportProgress(1, "Baking cubemap texture faces... This may take a while.");
                    bool   jpeg         = (imageFormat == BabylonImageFormat.JPEG);
                    string faceExt      = (jpeg) ? ".jpg" : ".png";
                    var    splitterOpts = new BabylonSplitterOptions();
                    var    outputFile   = inputFile.Replace(inputExt, faceExt);
                    Tools.ExportCubemap(convertCube, outputFile, imageFormat, splitterOpts);
                    if (createSkyboxMaterial == true)
                    {
                        ExporterWindow.ReportProgress(1, "Generating skybox material assets... This may take a while.");
                        AssetDatabase.Refresh();
                        Material skyboxMaterial = new Material(Shader.Find("Mobile/Skybox"));
                        if (skyboxMaterial != null)
                        {
                            string frontFilename = outputFile.Replace(faceExt, ("_pz" + faceExt));
                            AssetDatabase.ImportAsset(frontFilename, ImportAssetOptions.ForceUpdate);
                            Texture2D frontTexture = (Texture2D)AssetDatabase.LoadAssetAtPath(frontFilename, typeof(Texture2D));
                            if (frontTexture != null)
                            {
                                skyboxMaterial.SetTexture("_FrontTex", frontTexture);
                            }

                            string backFilename = outputFile.Replace(faceExt, ("_nz" + faceExt));
                            AssetDatabase.ImportAsset(backFilename, ImportAssetOptions.ForceUpdate);
                            Texture2D backTexture = (Texture2D)AssetDatabase.LoadAssetAtPath(backFilename, typeof(Texture2D));
                            if (backTexture != null)
                            {
                                skyboxMaterial.SetTexture("_BackTex", backTexture);
                            }

                            string leftFilename = outputFile.Replace(faceExt, ("_px" + faceExt));
                            AssetDatabase.ImportAsset(leftFilename, ImportAssetOptions.ForceUpdate);
                            Texture2D leftTexture = (Texture2D)AssetDatabase.LoadAssetAtPath(leftFilename, typeof(Texture2D));
                            if (leftTexture != null)
                            {
                                skyboxMaterial.SetTexture("_LeftTex", leftTexture);
                            }

                            string rightFilename = outputFile.Replace(faceExt, ("_nx" + faceExt));
                            AssetDatabase.ImportAsset(rightFilename, ImportAssetOptions.ForceUpdate);
                            Texture2D rightTexture = (Texture2D)AssetDatabase.LoadAssetAtPath(rightFilename, typeof(Texture2D));
                            if (rightTexture != null)
                            {
                                skyboxMaterial.SetTexture("_RightTex", rightTexture);
                            }

                            string upFilename = outputFile.Replace(faceExt, ("_py" + faceExt));
                            AssetDatabase.ImportAsset(upFilename, ImportAssetOptions.ForceUpdate);
                            Texture2D upTexture = (Texture2D)AssetDatabase.LoadAssetAtPath(upFilename, typeof(Texture2D));
                            if (upTexture != null)
                            {
                                skyboxMaterial.SetTexture("_UpTex", upTexture);
                            }

                            string downFilename = outputFile.Replace(faceExt, ("_ny" + faceExt));
                            AssetDatabase.ImportAsset(downFilename, ImportAssetOptions.ForceUpdate);
                            Texture2D downTexture = (Texture2D)AssetDatabase.LoadAssetAtPath(downFilename, typeof(Texture2D));
                            if (downTexture != null)
                            {
                                skyboxMaterial.SetTexture("_DownTex", downTexture);
                            }

                            string outputMaterialName = Path.GetFileNameWithoutExtension(inputFile);
                            string outputMaterialPath = Path.GetDirectoryName(inputFile);
                            string outputMaterialFile = outputMaterialPath + "/" + outputMaterialName + ".mat";
                            AssetDatabase.CreateAsset(skyboxMaterial, outputMaterialFile);
                        }
                        else
                        {
                            throw new Exception("Failed to create 'Mobile/Skybox' material");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                UnityEngine.Debug.LogException(ex);
            }
            finally
            {
                ExporterWindow.ReportProgress(1, "Refresing assets database...");
                AssetDatabase.Refresh();
            }
            ExporterWindow.ReportProgress(1, "Cubemap conversion complete.");
            EditorUtility.ClearProgressBar();
            if (this.keepGeneratorOpen)
            {
                ExporterWindow.ShowMessage("Cubemap optimzation complete.", "Babylon.js");
            }
            else
            {
                this.Close();
            }
        }
Beispiel #2
0
        public void Split(string inputFile, string inputExt, bool createSkybox)
        {
            bool   jpeg         = (skyboxSplitter == BabylonImageFormat.JPG);
            string faceExt      = (jpeg) ? ".jpg" : ".png";
            var    splitterOpts = new BabylonSplitterOptions();
            var    outputFile   = inputFile.Replace(inputExt, faceExt);

            if (createSkybox == true && generateSkybox == true)
            {
                ExporterWindow.ReportProgress(1, "Splitting cubemap texture faces... This may take a while.");
                Tools.ExportSkybox(convertCube, outputFile, splitterOpts, skyboxSplitter);
            }
            if (createSkybox == true && generateSkybox == true && createSkyboxMaterial == true)
            {
                ExporterWindow.ReportProgress(1, "Generating skybox material assets... This may take a while.");
                AssetDatabase.Refresh();
                Material skyboxMaterial = new Material(Shader.Find("Skybox/6 Sided"));
                if (skyboxMaterial != null)
                {
                    string frontFilename = outputFile.Replace(faceExt, ("_pz" + faceExt));
                    AssetDatabase.ImportAsset(frontFilename, ImportAssetOptions.ForceUpdate);
                    Texture2D frontTexture = (Texture2D)AssetDatabase.LoadAssetAtPath(frontFilename, typeof(Texture2D));
                    if (frontTexture != null)
                    {
                        skyboxMaterial.SetTexture("_FrontTex", frontTexture);
                    }

                    string backFilename = outputFile.Replace(faceExt, ("_nz" + faceExt));
                    AssetDatabase.ImportAsset(backFilename, ImportAssetOptions.ForceUpdate);
                    Texture2D backTexture = (Texture2D)AssetDatabase.LoadAssetAtPath(backFilename, typeof(Texture2D));
                    if (backTexture != null)
                    {
                        skyboxMaterial.SetTexture("_BackTex", backTexture);
                    }

                    string leftFilename = outputFile.Replace(faceExt, ("_px" + faceExt));
                    AssetDatabase.ImportAsset(leftFilename, ImportAssetOptions.ForceUpdate);
                    Texture2D leftTexture = (Texture2D)AssetDatabase.LoadAssetAtPath(leftFilename, typeof(Texture2D));
                    if (leftTexture != null)
                    {
                        skyboxMaterial.SetTexture("_LeftTex", leftTexture);
                    }

                    string rightFilename = outputFile.Replace(faceExt, ("_nx" + faceExt));
                    AssetDatabase.ImportAsset(rightFilename, ImportAssetOptions.ForceUpdate);
                    Texture2D rightTexture = (Texture2D)AssetDatabase.LoadAssetAtPath(rightFilename, typeof(Texture2D));
                    if (rightTexture != null)
                    {
                        skyboxMaterial.SetTexture("_RightTex", rightTexture);
                    }

                    string upFilename = outputFile.Replace(faceExt, ("_py" + faceExt));
                    AssetDatabase.ImportAsset(upFilename, ImportAssetOptions.ForceUpdate);
                    Texture2D upTexture = (Texture2D)AssetDatabase.LoadAssetAtPath(upFilename, typeof(Texture2D));
                    if (upTexture != null)
                    {
                        skyboxMaterial.SetTexture("_UpTex", upTexture);
                    }

                    string downFilename = outputFile.Replace(faceExt, ("_ny" + faceExt));
                    AssetDatabase.ImportAsset(downFilename, ImportAssetOptions.ForceUpdate);
                    Texture2D downTexture = (Texture2D)AssetDatabase.LoadAssetAtPath(downFilename, typeof(Texture2D));
                    if (downTexture != null)
                    {
                        skyboxMaterial.SetTexture("_DownTex", downTexture);
                    }

                    string outputMaterialName = Path.GetFileNameWithoutExtension(outputFile);
                    string outputMaterialPath = Path.GetDirectoryName(outputFile);
                    string outputMaterialFile = outputMaterialPath + "/" + outputMaterialName + ".mat";
                    AssetDatabase.CreateAsset(skyboxMaterial, outputMaterialFile);
                }
                else
                {
                    UnityEngine.Debug.LogError("CMFT: Failed to locate 'Skybox/6 Sided' shader material");
                }
            }
        }
Beispiel #3
0
 private void ConvertUnitySkyboxToBabylon(Camera camera, float progress)
 {
     // Note: Only Support Main Camera Skyboxes
     if (Camera.main == camera && (camera.clearFlags & CameraClearFlags.Skybox) == CameraClearFlags.Skybox)
     {
         // Note: Only Support Tone Mapped Skyboxes
         if (RenderSettings.skybox != null)
         {
             BabylonTexture skytex = null;
             if (RenderSettings.skybox.shader.name == "Skybox/Cubemap")
             {
                 var cubeMap = RenderSettings.skybox.GetTexture("_Tex") as Cubemap;
                 if (cubeMap != null)
                 {
                     var cubeTextureFile = AssetDatabase.GetAssetPath(cubeMap);
                     var cubeTextureExt  = Path.GetExtension(cubeTextureFile);
                     if (!cubeTextureExt.Equals(".dds", StringComparison.OrdinalIgnoreCase))
                     {
                         ExporterWindow.ReportProgress(progress, "Baking skybox environment textures... This may take a while.");
                         var faceTextureExt    = ".jpg";
                         var faceTextureFormat = BabylonImageFormat.JPEG;
                         if (exportationOptions.ImageEncodingOptions == (int)BabylonImageFormat.PNG)
                         {
                             faceTextureExt    = ".png";
                             faceTextureFormat = BabylonImageFormat.PNG;
                         }
                         string frontTextureExt = "_pz" + faceTextureExt;
                         string backTextureExt  = "_nz" + faceTextureExt;
                         string leftTextureExt  = "_px" + faceTextureExt;
                         string rightTextureExt = "_nx" + faceTextureExt;
                         string upTextureExt    = "_py" + faceTextureExt;
                         string downTextureExt  = "_ny" + faceTextureExt;
                         skytex                 = new BabylonTexture();
                         skytex.name            = String.Format("{0}_Skybox", SceneName);
                         skytex.isCube          = true;
                         skytex.coordinatesMode = 5;
                         skytex.extensions      = new string[] { leftTextureExt, upTextureExt, frontTextureExt, rightTextureExt, downTextureExt, backTextureExt };
                         Tools.SetTextureWrapMode(skytex, cubeMap);
                         var outputFile   = Path.Combine(babylonScene.OutputPath, skytex.name + faceTextureExt);
                         var splitterOpts = new BabylonSplitterOptions();
                         this.skyboxTextures = Tools.ExportCubemap(cubeMap, outputFile, faceTextureFormat, splitterOpts);
                     }
                     else
                     {
                         UnityEngine.Debug.LogWarning("SKYBOX: Unsupported cubemap texture type of " + cubeTextureExt + " for " + Path.GetFileName(cubeTextureFile));
                         return;
                     }
                 }
             }
             else if (RenderSettings.skybox.shader.name == "Skybox/6 Sided" || RenderSettings.skybox.shader.name == "Mobile/Skybox")
             {
                 // 6-Sided Skybox Textures (Tone Mapped Image Formats Only)
                 var frontTexture = RenderSettings.skybox.GetTexture("_FrontTex") as Texture2D;
                 var backTexture  = RenderSettings.skybox.GetTexture("_BackTex") as Texture2D;
                 var leftTexture  = RenderSettings.skybox.GetTexture("_LeftTex") as Texture2D;
                 var rightTexture = RenderSettings.skybox.GetTexture("_RightTex") as Texture2D;
                 var upTexture    = RenderSettings.skybox.GetTexture("_UpTex") as Texture2D;
                 var downTexture  = RenderSettings.skybox.GetTexture("_DownTex") as Texture2D;
                 if (frontTexture != null && backTexture != null && leftTexture != null && rightTexture != null && upTexture != null && downTexture != null)
                 {
                     ExporterWindow.ReportProgress(progress, "Exporting skybox environment textures... This may take a while.");
                     string frontTextureExt = "_pz.jpg";
                     string backTextureExt  = "_nz.jpg";
                     string leftTextureExt  = "_px.jpg";
                     string rightTextureExt = "_nx.jpg";
                     string upTextureExt    = "_py.jpg";
                     string downTextureExt  = "_ny.jpg";
                     skytex                 = new BabylonTexture();
                     skytex.name            = String.Format("{0}_Skybox", SceneName);
                     skytex.isCube          = true;
                     skytex.coordinatesMode = 5;
                     Tools.SetTextureWrapMode(skytex, frontTexture);
                     List <Tools.TextureInfo> faces = new List <Tools.TextureInfo>();
                     var faceTextureFile            = AssetDatabase.GetAssetPath(frontTexture);
                     var faceTextureExt             = Path.GetExtension(faceTextureFile);
                     var faceImportTool             = new BabylonTextureImporter(faceTextureFile);
                     if (faceTextureExt.Equals(".png", StringComparison.OrdinalIgnoreCase) || faceTextureExt.Equals(".jpg", StringComparison.OrdinalIgnoreCase) || faceTextureExt.Equals(".jpeg", StringComparison.OrdinalIgnoreCase))
                     {
                         frontTextureExt = "_pz" + faceTextureExt;
                         var frontTextureName = String.Format("{0}_pz{1}", skytex.name, faceTextureExt);
                         var frontTexturePath = Path.Combine(babylonScene.OutputPath, frontTextureName);
                         faceImportTool.SetReadable();
                         CopyTextureFace(frontTexturePath, frontTextureName, frontTexture);
                         faces.Add(new Tools.TextureInfo {
                             filename = frontTexturePath, texture = frontTexture.Copy()
                         });
                     }
                     else
                     {
                         UnityEngine.Debug.LogWarning("SKYBOX: Unsupported cube face texture type of " + faceTextureExt + " for " + Path.GetFileName(faceTextureFile));
                     }
                     faceTextureFile = AssetDatabase.GetAssetPath(backTexture);
                     faceTextureExt  = Path.GetExtension(faceTextureFile);
                     faceImportTool  = new BabylonTextureImporter(faceTextureFile);
                     if (faceTextureExt.Equals(".png", StringComparison.OrdinalIgnoreCase) || faceTextureExt.Equals(".jpg", StringComparison.OrdinalIgnoreCase) || faceTextureExt.Equals(".jpeg", StringComparison.OrdinalIgnoreCase))
                     {
                         backTextureExt = "_nz" + faceTextureExt;
                         var backTextureName = String.Format("{0}_nz{1}", skytex.name, faceTextureExt);
                         var backTexturePath = Path.Combine(babylonScene.OutputPath, backTextureName);
                         faceImportTool.SetReadable();
                         CopyTextureFace(backTexturePath, backTextureName, backTexture);
                         faces.Add(new Tools.TextureInfo {
                             filename = backTexturePath, texture = backTexture.Copy()
                         });
                     }
                     else
                     {
                         UnityEngine.Debug.LogWarning("SKYBOX: Unsupported cube face texture type of " + faceTextureExt + " for " + Path.GetFileName(faceTextureFile));
                     }
                     faceTextureFile = AssetDatabase.GetAssetPath(leftTexture);
                     faceTextureExt  = Path.GetExtension(faceTextureFile);
                     faceImportTool  = new BabylonTextureImporter(faceTextureFile);
                     if (faceTextureExt.Equals(".png", StringComparison.OrdinalIgnoreCase) || faceTextureExt.Equals(".jpg", StringComparison.OrdinalIgnoreCase) || faceTextureExt.Equals(".jpeg", StringComparison.OrdinalIgnoreCase))
                     {
                         leftTextureExt = "_px" + faceTextureExt;
                         var leftTextureName = String.Format("{0}_px{1}", skytex.name, faceTextureExt);
                         var leftTexturePath = Path.Combine(babylonScene.OutputPath, leftTextureName);
                         faceImportTool.SetReadable();
                         CopyTextureFace(leftTexturePath, leftTextureName, leftTexture);
                         faces.Add(new Tools.TextureInfo {
                             filename = leftTexturePath, texture = leftTexture.Copy()
                         });
                     }
                     else
                     {
                         UnityEngine.Debug.LogWarning("SKYBOX: Unsupported cube face texture type of " + faceTextureExt + " for " + Path.GetFileName(faceTextureFile));
                     }
                     faceTextureFile = AssetDatabase.GetAssetPath(rightTexture);
                     faceTextureExt  = Path.GetExtension(faceTextureFile);
                     faceImportTool  = new BabylonTextureImporter(faceTextureFile);
                     if (faceTextureExt.Equals(".png", StringComparison.OrdinalIgnoreCase) || faceTextureExt.Equals(".jpg", StringComparison.OrdinalIgnoreCase) || faceTextureExt.Equals(".jpeg", StringComparison.OrdinalIgnoreCase))
                     {
                         rightTextureExt = "_nx" + faceTextureExt;
                         var rightTextureName = String.Format("{0}_nx{1}", skytex.name, faceTextureExt);
                         var rightTexturePath = Path.Combine(babylonScene.OutputPath, rightTextureName);
                         faceImportTool.SetReadable();
                         CopyTextureFace(rightTexturePath, rightTextureName, rightTexture);
                         faces.Add(new Tools.TextureInfo {
                             filename = rightTexturePath, texture = rightTexture.Copy()
                         });
                     }
                     else
                     {
                         UnityEngine.Debug.LogWarning("SKYBOX: Unsupported cube face texture type of " + faceTextureExt + " for " + Path.GetFileName(faceTextureFile));
                     }
                     faceTextureFile = AssetDatabase.GetAssetPath(upTexture);
                     faceTextureExt  = Path.GetExtension(faceTextureFile);
                     faceImportTool  = new BabylonTextureImporter(faceTextureFile);
                     if (faceTextureExt.Equals(".png", StringComparison.OrdinalIgnoreCase) || faceTextureExt.Equals(".jpg", StringComparison.OrdinalIgnoreCase) || faceTextureExt.Equals(".jpeg", StringComparison.OrdinalIgnoreCase))
                     {
                         upTextureExt = "_py" + faceTextureExt;
                         var upTextureName = String.Format("{0}_py{1}", skytex.name, faceTextureExt);
                         var upTexturePath = Path.Combine(babylonScene.OutputPath, upTextureName);
                         faceImportTool.SetReadable();
                         CopyTextureFace(upTexturePath, upTextureName, upTexture);
                         faces.Add(new Tools.TextureInfo {
                             filename = upTexturePath, texture = upTexture.Copy()
                         });
                     }
                     else
                     {
                         UnityEngine.Debug.LogWarning("SKYBOX: Unsupported cube face texture type of " + faceTextureExt + " for " + Path.GetFileName(faceTextureFile));
                     }
                     faceTextureFile = AssetDatabase.GetAssetPath(downTexture);
                     faceTextureExt  = Path.GetExtension(faceTextureFile);
                     faceImportTool  = new BabylonTextureImporter(faceTextureFile);
                     if (faceTextureExt.Equals(".png", StringComparison.OrdinalIgnoreCase) || faceTextureExt.Equals(".jpg", StringComparison.OrdinalIgnoreCase) || faceTextureExt.Equals(".jpeg", StringComparison.OrdinalIgnoreCase))
                     {
                         downTextureExt = "_ny" + faceTextureExt;
                         var downTextureName = String.Format("{0}_ny{1}", skytex.name, faceTextureExt);
                         var downTexturePath = Path.Combine(babylonScene.OutputPath, downTextureName);
                         faceImportTool.SetReadable();
                         CopyTextureFace(downTexturePath, downTexturePath, downTexture);
                         faces.Add(new Tools.TextureInfo {
                             filename = downTexturePath, texture = downTexture.Copy()
                         });
                     }
                     else
                     {
                         UnityEngine.Debug.LogWarning("SKYBOX: Unsupported cube face texture type of " + faceTextureExt + " for " + Path.GetFileName(faceTextureFile));
                     }
                     skytex.extensions   = new string[] { leftTextureExt, upTextureExt, frontTextureExt, rightTextureExt, downTextureExt, backTextureExt };
                     this.skyboxTextures = (faces.Count > 0) ? faces.ToArray() : null;
                 }
             }
             if (skytex != null)
             {
                 skytex.level = (SceneController != null) ? SceneController.skyboxOptions.skyTextureLevel : 1.0f;
                 string meshTags     = (SceneController != null) ? SceneController.skyboxOptions.meshTags : String.Empty;
                 float  skyboxSize   = (SceneController != null) ? SceneController.skyboxOptions.skyMeshSize : 1000;
                 bool   skyboxSphere = (SceneController != null) ? (SceneController.skyboxOptions.meshType == BabylonSkyboxType.Sphere) : false;
                 // Babylon Skybox Mesh
                 var skybox = new BabylonMesh();
                 skybox.id = Guid.NewGuid().ToString();
                 skybox.infiniteDistance   = true;
                 skybox.numBoneInfluencers = Tools.GetMaxBoneInfluencers();
                 if (!String.IsNullOrEmpty(meshTags))
                 {
                     skybox.tags = meshTags;
                 }
                 if (skyboxSphere)
                 {
                     skybox.name = "sceneSkyboxSphere";
                     Mesh sphereMesh = Tools.CreateSphereMesh(skyboxSize * 0.5f, 48, 48);
                     Tools.GenerateBabylonMeshData(sphereMesh, skybox);
                 }
                 else
                 {
                     skybox.name = "sceneSkyboxCube";
                     Mesh boxMesh = Tools.CreateBoxMesh(skyboxSize, skyboxSize, skyboxSize);
                     Tools.GenerateBabylonMeshData(boxMesh, skybox);
                 }
                 // Babylon Default Skybox
                 var skyboxMaterial = new BabylonDefaultMaterial();
                 skyboxMaterial.name              = "sceneSkyboxMaterial";
                 skyboxMaterial.id                = Guid.NewGuid().ToString();
                 skyboxMaterial.backFaceCulling   = false;
                 skyboxMaterial.disableLighting   = true;
                 skyboxMaterial.diffuse           = Color.black.ToFloat();
                 skyboxMaterial.specular          = Color.black.ToFloat();
                 skyboxMaterial.ambient           = Color.clear.ToFloat();
                 skyboxMaterial.reflectionTexture = skytex;
                 // Babylon Skybox Material
                 skybox.materialId = skyboxMaterial.id;
                 babylonScene.MeshesList.Add(skybox);
                 babylonScene.MaterialsList.Add(skyboxMaterial);
                 babylonScene.AddTextureCube("sceneSkyboxMaterial");
             }
         }
     }
 }
 private void ExportMainCameraSkyboxToBabylon()
 {
     if (RenderSettings.sun != null)
     {
         var direction            = new Vector3(0, 0, 1);
         var transformedDirection = RenderSettings.sun.transform.TransformDirection(direction);
         SceneBuilder.SunlightDirection   = transformedDirection.ToFloat();
         SceneBuilder.SunlightIndentifier = GetID(RenderSettings.sun.gameObject);
     }
     if (Camera.main != null)
     {
         babylonScene.clearColor = Camera.main.backgroundColor.ToFloat(1.0f);
         if ((Camera.main.clearFlags & CameraClearFlags.Skybox) == CameraClearFlags.Skybox)
         {
             if (RenderSettings.skybox != null)
             {
                 bool           dds    = false;
                 BabylonTexture skytex = null;
                 if (RenderSettings.skybox.shader.name == "Skybox/Cubemap")
                 {
                     skytex                 = new BabylonCubeTexture();
                     skytex.name            = String.Format("{0}_Skybox", SceneName);
                     skytex.coordinatesMode = 5;
                     Cubemap cubeMap = RenderSettings.skybox.GetTexture("_Tex") as Cubemap;
                     if (cubeMap != null)
                     {
                         var srcTexturePath = AssetDatabase.GetAssetPath(cubeMap);
                         var srcTextureExt  = Path.GetExtension(srcTexturePath);
                         if (srcTextureExt.Equals(".dds", StringComparison.OrdinalIgnoreCase))
                         {
                             ExporterWindow.ReportProgress(1, "Exporting skybox direct draw surface... This may take a while.");
                             // ..
                             // Export Draw Surface Skybox Textures
                             // ..
                             dds               = true;
                             skytex.name      += ".dds";
                             skytex.extensions = null;
                             ((BabylonCubeTexture)skytex).prefiltered = true;
                             CopyCubemapTexture(skytex.name, cubeMap, skytex);
                         }
                         else
                         {
                             ExporterWindow.ReportProgress(1, "Baking skybox environment textures... This may take a while.");
                             var imageFormat = (BabylonImageFormat)ExporterWindow.exportationOptions.ImageEncodingOptions;
                             // ..
                             // Export Tone Mapped Cubemap To 6-Sided Skybox Textures
                             // ..
                             bool   jpeg            = (imageFormat == BabylonImageFormat.JPG);
                             string faceTextureExt  = (jpeg) ? ".jpg" : ".png";
                             string frontTextureExt = "_pz" + faceTextureExt;
                             string backTextureExt  = "_nz" + faceTextureExt;
                             string leftTextureExt  = "_px" + faceTextureExt;
                             string rightTextureExt = "_nx" + faceTextureExt;
                             string upTextureExt    = "_py" + faceTextureExt;
                             string downTextureExt  = "_ny" + faceTextureExt;
                             skytex.extensions = new string[] { leftTextureExt, upTextureExt, frontTextureExt, rightTextureExt, downTextureExt, backTextureExt };
                             Tools.SetTextureWrapMode(skytex, cubeMap);
                             var outputFile   = Path.Combine(babylonScene.OutputPath, skytex.name + faceTextureExt);
                             var splitterOpts = new BabylonSplitterOptions();
                             Tools.ExportSkybox(cubeMap, outputFile, splitterOpts, imageFormat);
                         }
                     }
                 }
                 else if (RenderSettings.skybox.shader.name == "Skybox/6 Sided" || RenderSettings.skybox.shader.name == "Mobile/Skybox")
                 {
                     skytex                 = new BabylonCubeTexture();
                     skytex.name            = String.Format("{0}_Skybox", SceneName);
                     skytex.coordinatesMode = 5;
                     // ..
                     // 6-Sided Skybox Textures (Tone Mapped Image Formats Only)
                     // ..
                     var frontTexture = RenderSettings.skybox.GetTexture("_FrontTex") as Texture2D;
                     var backTexture  = RenderSettings.skybox.GetTexture("_BackTex") as Texture2D;
                     var leftTexture  = RenderSettings.skybox.GetTexture("_LeftTex") as Texture2D;
                     var rightTexture = RenderSettings.skybox.GetTexture("_RightTex") as Texture2D;
                     var upTexture    = RenderSettings.skybox.GetTexture("_UpTex") as Texture2D;
                     var downTexture  = RenderSettings.skybox.GetTexture("_DownTex") as Texture2D;
                     DumpSkyboxTextures(ref skytex, ref frontTexture, ref backTexture, ref leftTexture, ref rightTexture, ref upTexture, ref downTexture);
                 }
                 else if (RenderSettings.skybox.name.Equals("Default-Skybox"))
                 {
                     skytex                 = new BabylonCubeTexture();
                     skytex.name            = String.Format("{0}_Skybox", SceneName);
                     skytex.coordinatesMode = 5;
                     // ..
                     // 6-Sided Skybox Textures (Toolkit Skybox Template Images)
                     // ..
                     string skyboxPath   = "Assets/Babylon/Template/Skybox/";
                     var    frontTexture = AssetDatabase.LoadAssetAtPath <Texture2D>(skyboxPath + "DefaultSkybox_pz.png");
                     var    backTexture  = AssetDatabase.LoadAssetAtPath <Texture2D>(skyboxPath + "DefaultSkybox_nz.png");
                     var    leftTexture  = AssetDatabase.LoadAssetAtPath <Texture2D>(skyboxPath + "DefaultSkybox_px.png");
                     var    rightTexture = AssetDatabase.LoadAssetAtPath <Texture2D>(skyboxPath + "DefaultSkybox_nx.png");
                     var    upTexture    = AssetDatabase.LoadAssetAtPath <Texture2D>(skyboxPath + "DefaultSkybox_py.png");
                     var    downTexture  = AssetDatabase.LoadAssetAtPath <Texture2D>(skyboxPath + "DefaultSkybox_ny.png");
                     DumpSkyboxTextures(ref skytex, ref frontTexture, ref backTexture, ref leftTexture, ref rightTexture, ref upTexture, ref downTexture);
                 }
                 else
                 {
                     UnityEngine.Debug.LogWarning("SKYBOX: " + RenderSettings.skybox.shader.name + " shader type is unsupported. Skybox and reflections will be disabled.");
                 }
                 if (skytex != null)
                 {
                     float  size = (SceneController != null) ? SceneController.skyboxOptions.skyboxMeshSize : 1000;
                     string tags = (SceneController != null) ? SceneController.skyboxOptions.skyboxMeshTags : String.Empty;
                     // ..
                     // PBR Skybox Material Support
                     // ..
                     bool  pbr    = (SceneController != null) ? SceneController.skyboxOptions.directDrawSurface.physicalBased : false;
                     float pbr_ms = (SceneController != null) ? SceneController.skyboxOptions.directDrawSurface.microSurface : 1.0f;
                     float pbr_cc = (SceneController != null) ? SceneController.skyboxOptions.directDrawSurface.cameraContrast : 1.0f;
                     float pbr_ce = (SceneController != null) ? SceneController.skyboxOptions.directDrawSurface.cameraExposure : 1.0f;
                     float pbr_di = (SceneController != null) ? SceneController.skyboxOptions.directDrawSurface.directIntensity : 1.0f;
                     float pbr_ei = (SceneController != null) ? SceneController.skyboxOptions.directDrawSurface.emissiveIntensity : 1.0f;
                     float pbr_si = (SceneController != null) ? SceneController.skyboxOptions.directDrawSurface.specularIntensity : 1.0f;
                     float pbr_ri = (SceneController != null) ? SceneController.skyboxOptions.directDrawSurface.environmentIntensity : 1.0f;
                     var   skybox = new BabylonMesh();
                     skybox.id = Guid.NewGuid().ToString();
                     skybox.infiniteDistance   = true;
                     skybox.numBoneInfluencers = Tools.GetMaxBoneInfluencers();
                     if (!String.IsNullOrEmpty(tags))
                     {
                         skybox.tags = tags;
                     }
                     skybox.name = "SceneSkyboxMesh";
                     Mesh boxMesh = Tools.CreateBoxMesh(size, size, size);
                     Tools.GenerateBabylonMeshData(boxMesh, skybox);
                     BabylonMaterial skyboxMaterial = null;
                     if (dds == true && pbr == true)
                     {
                         var skyboxMaterialPbr = new BabylonSystemMaterial {
                             name                      = "SceneSkyboxMaterial",
                             id                        = Guid.NewGuid().ToString(),
                             backFaceCulling           = false,
                             disableLighting           = true,
                             albedo                    = Color.white.ToFloat(),
                             ambient                   = Color.black.ToFloat(),
                             emissive                  = Color.black.ToFloat(),
                             metallic                  = null,
                             roughness                 = null,
                             sideOrientation           = 1,
                             reflectivity              = Color.white.ToFloat(),
                             reflection                = Color.white.ToFloat(),
                             microSurface              = pbr_ms,
                             cameraContrast            = pbr_cc,
                             cameraExposure            = pbr_ce,
                             directIntensity           = pbr_di,
                             emissiveIntensity         = pbr_ei,
                             specularIntensity         = pbr_si,
                             environmentIntensity      = pbr_ri,
                             maxSimultaneousLights     = 4,
                             useSpecularOverAlpha      = false,
                             useRadianceOverAlpha      = false,
                             usePhysicalLightFalloff   = false,
                             useAlphaFromAlbedoTexture = false,
                             useEmissiveAsIllumination = false,
                             reflectionTexture         = skytex
                         };
                         skyboxMaterial = skyboxMaterialPbr;
                     }
                     else
                     {
                         var skyboxMaterialStd = new BabylonDefaultMaterial {
                             name              = "SceneSkyboxMaterial",
                             id                = Guid.NewGuid().ToString(),
                             backFaceCulling   = false,
                             disableLighting   = true,
                             diffuse           = Color.black.ToFloat(),
                             specular          = Color.black.ToFloat(),
                             ambient           = Color.clear.ToFloat(),
                             reflectionTexture = skytex
                         };
                         skyboxMaterial = skyboxMaterialStd;
                     }
                     if (skyboxMaterial != null)
                     {
                         skybox.materialId = skyboxMaterial.id;
                         babylonScene.MeshesList.Add(skybox);
                         babylonScene.MaterialsList.Add(skyboxMaterial);
                         babylonScene.AddTextureCube("SceneSkyboxMaterial");
                     }
                 }
             }
         }
     }
 }