/**************************************** 
 | 
    Simple Mesh Combine v1.61 
 | 
    Copyright 2015 Unluck Software     
 | 
     www.chemicalbliss.com                                                                                                                                                                                      
 | 
*****************************************/ 
 | 
  
 | 
@script AddComponentMenu("Simple Mesh Combine") 
 | 
#pragma strict 
 | 
#pragma downcast 
 | 
var combinedGameOjects:GameObject[];        //Stores gameObjects that has been merged, mesh renderer disabled 
 | 
var combined:GameObject;                    //Stores the combined mesh gameObject 
 | 
var meshName:String = "Combined_Meshes";    //Asset name when saving as prefab 
 | 
var _canGenerateLightmapUV:boolean; 
 | 
var vCount:int; 
 | 
var generateLightmapUV:boolean; 
 | 
  
 | 
var copyTarget:GameObject; 
 | 
var destroyOldColliders:boolean; 
 | 
var keepStructure:boolean = true; 
 | 
  
 | 
function EnableRenderers(e:boolean) {     
 | 
    for (var i:int = 0; i < combinedGameOjects.length; i++){ 
 | 
        combinedGameOjects[i].GetComponent.<Renderer>().enabled = e; 
 | 
    }   
 | 
} 
 | 
//Returns a meshFilter[] list of all renderer enabled meshfilters(so that it does not merge disabled meshes, useful when there are invisible box colliders) 
 | 
function FindEnabledMeshes(){ 
 | 
    var renderers:MeshFilter[]; 
 | 
    var count:int; 
 | 
    renderers = transform.GetComponentsInChildren.<MeshFilter>(); 
 | 
    //count all the enabled meshrenderers in children         
 | 
    for (var i:int = 0; i < renderers.length; i++) 
 | 
    { 
 | 
        if(renderers[i].GetComponent(MeshRenderer) && renderers[i].GetComponent(MeshRenderer).enabled) 
 | 
            count++; 
 | 
    } 
 | 
    var meshfilters = new MeshFilter[count];//creates a new array with the correct length 
 | 
    count = 0; 
 | 
    //adds all enabled meshes to the array 
 | 
    for (var ii:int = 0; ii < renderers.length; ii++) 
 | 
    { 
 | 
        if(renderers[ii].GetComponent(MeshRenderer) && renderers[ii].GetComponent(MeshRenderer).enabled){ 
 | 
            meshfilters[count] = renderers[ii]; 
 | 
            count++; 
 | 
        } 
 | 
    } 
 | 
    return meshfilters; 
 | 
} 
 | 
  
 | 
function CombineMeshes() {     
 | 
    var combo:GameObject = new GameObject(); 
 | 
    combo.name = "_Combined Mesh [" + name + "]"; 
 | 
    combo.gameObject.AddComponent(MeshFilter); 
 | 
    combo.gameObject.AddComponent(MeshRenderer); 
 | 
    var meshFilters:MeshFilter[]; 
 | 
    meshFilters = FindEnabledMeshes(); 
 | 
    var materials: ArrayList = new ArrayList(); 
 | 
    var combineInstanceArrays: ArrayList = new ArrayList(); 
 | 
    combinedGameOjects = new GameObject[meshFilters.length];     
 | 
    for (var i = 0; i < meshFilters.length; i++) { 
 | 
        var meshFilterss: MeshFilter[] = meshFilters[i].GetComponentsInChildren.<MeshFilter>();     
 | 
        combinedGameOjects[i] = meshFilters[i].gameObject;     
 | 
        for (var meshFilter: MeshFilter in meshFilterss) { 
 | 
            var meshRenderer: MeshRenderer = meshFilter.GetComponent(MeshRenderer); 
 | 
            meshFilters[i].transform.gameObject.GetComponent(Renderer).enabled = false; 
 | 
            for (var o: int = 0; o < meshFilter.sharedMesh.subMeshCount; o++) { 
 | 
                if(o < meshRenderer.sharedMaterials.Length && o < meshFilter.sharedMesh.subMeshCount){ 
 | 
                    var materialArrayIndex: int = Contains(materials, meshRenderer.sharedMaterials[o]); 
 | 
                    if (materialArrayIndex == -1) { 
 | 
                        materials.Add(meshRenderer.sharedMaterials[o]); 
 | 
                        materialArrayIndex = materials.Count - 1; 
 | 
                    } 
 | 
                    combineInstanceArrays.Add(new ArrayList()); 
 | 
                    var combineInstance: CombineInstance = new CombineInstance(); 
 | 
                    combineInstance.transform = meshRenderer.transform.localToWorldMatrix; 
 | 
                    combineInstance.subMeshIndex = o; 
 | 
                    combineInstance.mesh = meshFilter.sharedMesh; 
 | 
                    (combineInstanceArrays[materialArrayIndex] as ArrayList).Add(combineInstance); 
 | 
                } 
 | 
                #if UNITY_EDITOR 
 | 
                else{ 
 | 
                    Debug.LogWarning("Simple Mesh Combine: GameObject [ " +meshRenderer.gameObject.name + " ] is missing a material (Mesh or sub-mesh ignored from combine)"); 
 | 
                } 
 | 
                #endif 
 | 
            } 
 | 
  
 | 
        } 
 | 
        #if UNITY_EDITOR       
 | 
        EditorUtility.DisplayProgressBar("Combining", "", i);     
 | 
        #endif 
 | 
    } 
 | 
     
 | 
    var meshes: Mesh[] = new Mesh[materials.Count]; 
 | 
    var combineInstances: CombineInstance[] = new CombineInstance[materials.Count]; 
 | 
    for (var m: int = 0; m < materials.Count; m++) { 
 | 
        var combineInstanceArray: CombineInstance[] = (combineInstanceArrays[m] as ArrayList).ToArray(typeof(CombineInstance)) as CombineInstance[]; 
 | 
        meshes[m] = new Mesh(); 
 | 
        meshes[m].CombineMeshes(combineInstanceArray, true, true); 
 | 
        combineInstances[m] = new CombineInstance(); 
 | 
        combineInstances[m].mesh = meshes[m]; 
 | 
        combineInstances[m].subMeshIndex = 0; 
 | 
    }         
 | 
    combo.GetComponent(MeshFilter).sharedMesh = new Mesh(); 
 | 
    combo.GetComponent(MeshFilter).sharedMesh.CombineMeshes(combineInstances, false, false); 
 | 
    for (var mesh: Mesh in meshes) { 
 | 
        mesh.Clear(); 
 | 
        DestroyImmediate(mesh); 
 | 
    } 
 | 
    var meshRendererCombine: MeshRenderer = combo.GetComponent(MeshFilter).GetComponent(MeshRenderer); 
 | 
    if (!meshRendererCombine) meshRendererCombine = gameObject.AddComponent(MeshRenderer); 
 | 
    var materialsArray: Material[] = materials.ToArray(typeof(Material)) as Material[]; 
 | 
    meshRendererCombine.materials = materialsArray;     
 | 
    combined = combo.gameObject; 
 | 
    EnableRenderers(false); 
 | 
    combo.transform.parent = transform; 
 | 
    #if UNITY_EDITOR 
 | 
    if(generateLightmapUV){ 
 | 
        Unwrapping.GenerateSecondaryUVSet(combo.GetComponent(MeshFilter).sharedMesh); 
 | 
    } 
 | 
    #endif 
 | 
    vCount = combo.GetComponent(MeshFilter).sharedMesh.vertexCount; 
 | 
    if(vCount > 65536) {  
 | 
        Debug.LogWarning("Vertex Count: " +vCount + "- Vertex Count too high, please divide mesh combine into more groups. Max 65536 for each mesh" ); 
 | 
        _canGenerateLightmapUV = false; 
 | 
    }else{ 
 | 
        _canGenerateLightmapUV = true; 
 | 
    } 
 | 
    #if UNITY_EDITOR 
 | 
    EditorUtility.ClearProgressBar(); 
 | 
    #endif 
 | 
} 
 | 
  
 | 
function Contains(l: ArrayList, n: Material) { 
 | 
    for (var i: int = 0; i < l.Count; i++) { 
 | 
        if ((l[i] as Material) == n) { 
 | 
            return i; 
 | 
        } 
 | 
    } 
 | 
    return -1; 
 | 
} 
 |