//Basic Combine
        void OnWizardOtherButton()
        {
            MeshFilter[] filters     = parentToCombinedObjects.GetComponentsInChildren <MeshFilter>();
            Matrix4x4    myTransform = parentToCombinedObjects.transform.worldToLocalMatrix;

            Dictionary <string, Dictionary <Material, List <MeshCombineUtility.MeshInstance> > > allMeshesAndMaterials = new Dictionary <string, Dictionary <Material, List <MeshCombineUtility.MeshInstance> > >();

            for (int i = 0; i < filters.Length; i++)
            {
                Renderer curRenderer = filters [i].GetComponent <Renderer>();
                MeshCombineUtility.MeshInstance instance = new MeshCombineUtility.MeshInstance();

                instance.mesh = filters [i].sharedMesh;

                if (curRenderer != null && curRenderer.enabled && instance.mesh != null)
                {
                    instance.transform = myTransform * filters [i].transform.localToWorldMatrix;

                    Material[] materials = curRenderer.sharedMaterials;
                    for (int m = 0; m < materials.Length; m++)
                    {
                        instance.subMeshIndex = System.Math.Min(m, instance.mesh.subMeshCount - 1);

                        if (!allMeshesAndMaterials.ContainsKey(materials [m].shader.ToString()))
                        {
                            allMeshesAndMaterials.Add(materials [m].shader.ToString(), new Dictionary <Material, List <MeshCombineUtility.MeshInstance> >());
                        }

                        if (!allMeshesAndMaterials [materials [m].shader.ToString()].ContainsKey(materials [m]))
                        {
                            allMeshesAndMaterials [materials [m].shader.ToString()].Add(materials [m], new List <MeshCombineUtility.MeshInstance>());
                        }

                        allMeshesAndMaterials [materials [m].shader.ToString()] [materials [m]].Add(instance);
                    }
                }
            }

            foreach (KeyValuePair <string, Dictionary <Material, List <MeshCombineUtility.MeshInstance> > > firstPass in allMeshesAndMaterials)
            {
                Material[] allMaterialTextures = new Material[firstPass.Value.Keys.Count];
                int        index = 0;

                foreach (KeyValuePair <Material, List <MeshCombineUtility.MeshInstance> > kv in firstPass.Value)
                {
                    allMaterialTextures [index] = kv.Key;
                    index++;
                }

                TextureCombineUtility.TexturePosition[] textureUVPositions;
                Material combined = TextureCombineUtility.combine(allMaterialTextures, out textureUVPositions, textureAtlasProperties);
                List <MeshCombineUtility.MeshInstance> meshes = new List <MeshCombineUtility.MeshInstance>();

                foreach (KeyValuePair <Material, List <MeshCombineUtility.MeshInstance> > kv in firstPass.Value)
                {
                    List <MeshCombineUtility.MeshInstance> meshIntermediates = new List <MeshCombineUtility.MeshInstance>();
                    Mesh[] firstCombineStep = MeshCombineUtility.Combine(kv.Value.ToArray());

                    for (int i = 0; i < firstCombineStep.Length; i++)
                    {
                        MeshCombineUtility.MeshInstance instance = new MeshCombineUtility.MeshInstance();
                        instance.mesh         = firstCombineStep [i];
                        instance.subMeshIndex = 0;
                        instance.transform    = Matrix4x4.identity;
                        meshIntermediates.Add(instance);
                    }

                    TextureCombineUtility.TexturePosition refTexture = textureUVPositions [0];

                    for (int j = 0; j < textureUVPositions.Length; j++)
                    {
                        if (kv.Key.mainTexture.name == textureUVPositions [j].textures [0].name)
                        {
                            refTexture = textureUVPositions [j];
                            break;
                        }
                    }

                    for (int j = 0; j < meshIntermediates.Count; j++)
                    {
                        Vector2[] uvCopy = meshIntermediates [j].mesh.uv;
                        for (int k = 0; k < uvCopy.Length; k++)
                        {
                            uvCopy [k].x = refTexture.position.x + uvCopy [k].x * refTexture.position.width;
                            uvCopy [k].y = refTexture.position.y + uvCopy [k].y * refTexture.position.height;
                        }

                        meshIntermediates [j].mesh.uv = uvCopy;

                        uvCopy = meshIntermediates [j].mesh.uv2;
                        for (int k = 0; k < uvCopy.Length; k++)
                        {
                            uvCopy [k].x = refTexture.position.x + uvCopy [k].x * refTexture.position.width;
                            uvCopy [k].y = refTexture.position.y + uvCopy [k].y * refTexture.position.height;
                        }

                        meshIntermediates [j].mesh.uv2 = uvCopy;

                        uvCopy = meshIntermediates [j].mesh.uv2;
                        for (int k = 0; k < uvCopy.Length; k++)
                        {
                            uvCopy [k].x = refTexture.position.x + uvCopy [k].x * refTexture.position.width;
                            uvCopy [k].y = refTexture.position.y + uvCopy [k].y * refTexture.position.height;
                        }

                        meshIntermediates [j].mesh.uv2 = uvCopy;

                        meshes.Add(meshIntermediates [j]);
                    }
                }

                Material mat = combined;

                Mesh[] combinedMeshes = MeshCombineUtility.Combine(meshes.ToArray());

                GameObject parent = new GameObject("Combined " + parentToCombinedObjects.name + " " + firstPass.Key + " Mesh Parent");
                parent.transform.position = parentToCombinedObjects.transform.position;
                parent.transform.rotation = parentToCombinedObjects.transform.rotation;

                for (int i = 0; i < combinedMeshes.Length; i++)
                {
                    GameObject go = new GameObject("Combined " + parentToCombinedObjects.name + " Mesh");
                    go.transform.parent = parent.transform;
                    go.tag   = parentToCombinedObjects.tag;
                    go.layer = parentToCombinedObjects.layer;
                    go.transform.localScale    = Vector3.one;
                    go.transform.localRotation = Quaternion.identity;
                    go.transform.localPosition = Vector3.zero;
                    MeshFilter filter = go.AddComponent <MeshFilter>();
                    go.AddComponent <MeshRenderer>();
                    go.GetComponent <Renderer>().sharedMaterial = mat;

                    filter.mesh = combinedMeshes [i];
                }
            }

            if (developmentBake)
            {
                foreach (Renderer r in parentToCombinedObjects.GetComponentsInChildren <Renderer>())
                {
                    r.enabled = false;
                }
            }
        }
        GameObject combineMesh(bool export)
        {
            GameObject returnObject = new GameObject(m_parentObject.name);

            returnObject.transform.position = m_parentObject.transform.position;
            returnObject.transform.rotation = m_parentObject.transform.rotation;


            MeshFilter[] filters     = m_parentObject.GetComponentsInChildren <MeshFilter>();
            Matrix4x4    myTransform = m_parentObject.transform.worldToLocalMatrix;

            Dictionary <string, Dictionary <Material, List <MeshCombineUtility.MeshInstance> > > allMeshesAndMaterials = new Dictionary <string, Dictionary <Material, List <MeshCombineUtility.MeshInstance> > >();

            for (int i = 0; i < filters.Length; i++)
            {
                Renderer curRenderer = filters [i].GetComponent <Renderer>();
                MeshCombineUtility.MeshInstance instance = new MeshCombineUtility.MeshInstance();

                instance.mesh = filters [i].sharedMesh;

                if (curRenderer != null && curRenderer.enabled && instance.mesh != null)
                {
                    instance.transform = myTransform * filters [i].transform.localToWorldMatrix;

                    Material[] materials = curRenderer.sharedMaterials;
                    for (int m = 0; m < materials.Length; m++)
                    {
                        instance.subMeshIndex = System.Math.Min(m, instance.mesh.subMeshCount - 1);

                        if (!allMeshesAndMaterials.ContainsKey(materials [m].shader.ToString()))
                        {
                            allMeshesAndMaterials.Add(materials [m].shader.ToString(), new Dictionary <Material, List <MeshCombineUtility.MeshInstance> >());
                        }

                        if (!allMeshesAndMaterials [materials [m].shader.ToString()].ContainsKey(materials [m]))
                        {
                            allMeshesAndMaterials [materials [m].shader.ToString()].Add(materials [m], new List <MeshCombineUtility.MeshInstance>());
                        }

                        allMeshesAndMaterials [materials [m].shader.ToString()] [materials [m]].Add(instance);
                    }
                }
            }

            foreach (KeyValuePair <string, Dictionary <Material, List <MeshCombineUtility.MeshInstance> > > firstPass in allMeshesAndMaterials)
            {
                Material[] allMaterialTextures = new Material[firstPass.Value.Keys.Count];
                int        index = 0;

                foreach (KeyValuePair <Material, List <MeshCombineUtility.MeshInstance> > kv in firstPass.Value)
                {
                    allMaterialTextures [index] = kv.Key;
                    index++;
                }

                TextureCombineUtility.TexturePosition[] textureUVPositions;
                Material combined = TextureCombineUtility.combine(allMaterialTextures, out textureUVPositions, m_textureAtlasInfo);
                List <MeshCombineUtility.MeshInstance> meshes = new List <MeshCombineUtility.MeshInstance>();

                foreach (KeyValuePair <Material, List <MeshCombineUtility.MeshInstance> > kv in firstPass.Value)
                {
                    List <MeshCombineUtility.MeshInstance> meshIntermediates = new List <MeshCombineUtility.MeshInstance>();
                    Mesh[] firstCombineStep = MeshCombineUtility.Combine(kv.Value.ToArray());

                    for (int i = 0; i < firstCombineStep.Length; i++)
                    {
                        MeshCombineUtility.MeshInstance instance = new MeshCombineUtility.MeshInstance();
                        instance.mesh         = firstCombineStep [i];
                        instance.subMeshIndex = 0;
                        instance.transform    = Matrix4x4.identity;
                        meshIntermediates.Add(instance);
                    }

                    TextureCombineUtility.TexturePosition refTexture = textureUVPositions [0];

                    for (int j = 0; j < textureUVPositions.Length; j++)
                    {
                        if (kv.Key.mainTexture.name == textureUVPositions [j].textures [0].name)
                        {
                            refTexture = textureUVPositions [j];
                            break;
                        }
                    }

                    for (int j = 0; j < meshIntermediates.Count; j++)
                    {
                        Vector2[] uvCopy = meshIntermediates [j].mesh.uv;
                        for (int k = 0; k < uvCopy.Length; k++)
                        {
                            uvCopy [k].x = refTexture.position.x + uvCopy [k].x * refTexture.position.width;
                            uvCopy [k].y = refTexture.position.y + uvCopy [k].y * refTexture.position.height;
                        }

                        meshIntermediates [j].mesh.uv = uvCopy;

                        uvCopy = meshIntermediates [j].mesh.uv2;
                        for (int k = 0; k < uvCopy.Length; k++)
                        {
                            uvCopy [k].x = refTexture.position.x + uvCopy [k].x * refTexture.position.width;
                            uvCopy [k].y = refTexture.position.y + uvCopy [k].y * refTexture.position.height;
                        }

                        meshIntermediates [j].mesh.uv2 = uvCopy;

                        uvCopy = meshIntermediates [j].mesh.uv2;
                        for (int k = 0; k < uvCopy.Length; k++)
                        {
                            uvCopy [k].x = refTexture.position.x + uvCopy [k].x * refTexture.position.width;
                            uvCopy [k].y = refTexture.position.y + uvCopy [k].y * refTexture.position.height;
                        }

                        meshIntermediates [j].mesh.uv2 = uvCopy;

                        meshes.Add(meshIntermediates [j]);
                    }
                }

                Material mat = combined;

                Mesh[] combinedMeshes = MeshCombineUtility.Combine(meshes.ToArray());

                GameObject parent = new GameObject("Combined " + m_parentObject.name + " " + firstPass.Key + " Mesh Parent");
                parent.transform.position = m_parentObject.transform.position;
                parent.transform.rotation = m_parentObject.transform.rotation;
                parent.transform.parent   = returnObject.transform;

                for (int i = 0; i < combinedMeshes.Length; i++)
                {
                    GameObject go = new GameObject("Combined " + m_parentObject.name + " Mesh");
                    go.transform.parent = parent.transform;
                    go.tag   = m_parentObject.tag;
                    go.layer = m_parentObject.layer;
                    go.transform.localScale    = Vector3.one;
                    go.transform.localRotation = Quaternion.identity;
                    go.transform.localPosition = Vector3.zero;
                    MeshFilter filter = go.AddComponent <MeshFilter>();
                    go.AddComponent <MeshRenderer>();
                    go.GetComponent <Renderer>().sharedMaterial = mat;

                    filter.mesh = combinedMeshes [i];

                    if (export)
                    {
                        checkAndCreateFolder();

                        //(go.GetComponent<MeshRenderer>().material.mainTexture as Texture2D).format = TextureFormat.RGBA32;
                        Debug.Log((go.GetComponent <MeshRenderer>().sharedMaterial.mainTexture as Texture2D).format);
                        if ((go.GetComponent <MeshRenderer>().sharedMaterial.mainTexture as Texture2D).format != TextureFormat.ARGB32 &&
                            (go.GetComponent <MeshRenderer>().sharedMaterial.mainTexture as Texture2D).format != TextureFormat.RGB24 &&
                            (go.GetComponent <MeshRenderer>().sharedMaterial.mainTexture as Texture2D).format != TextureFormat.RGBA32)
                        {
                            Debug.LogError("Textures assigned to objects must be either RGBA32 or RGB 24 to be exported");
                            return(null);
                        }

                        byte[] texture = (go.GetComponent <MeshRenderer>().material.mainTexture as Texture2D).EncodeToPNG();
                        File.WriteAllBytes(m_pathToAssets + mat.shader.ToString().Remove(mat.shader.ToString().IndexOf("(", System.StringComparison.Ordinal)) + i + ".png", texture);
                        exportMesh(combinedMeshes [i], mat.shader.ToString().Remove(mat.shader.ToString().IndexOf("(", System.StringComparison.Ordinal)) + i);
                    }
                }
            }

            //if(developmentBake == true)
            //{
            foreach (Renderer r in m_parentObject.GetComponentsInChildren <Renderer>())
            {
                r.enabled = false;
            }
            //}

            return(returnObject);
        }