//Optimisation Test
    void CombineMeshes()
    {
        // go through each clusterNode parent
        foreach (VisualNode n in clusterNodes)
        {
            // arraylist to be added to cluster late
            ArrayList nodes = new ArrayList();
            // setup meshfilters for child objects
            MeshFilter[] meshFilters = new MeshFilter[n.getClusterNodes().Count + 1];
            // combine instance mesh array
            CombineInstance[] combine = new CombineInstance[meshFilters.Length];
            //stop center from being combined
            nodes_already_clustered.Add(n);
            // Create a new cluster gameobject
            GameObject newCluster = new GameObject();

            // Color of cluster
            Color col = UnityEngine.Random.ColorHSV(0.1f, 0.8f, 0.7f, 1f, 0.5f, 1f);


            // go through each child node and add to meshFilter array

            // first cluster node
            GameObject c1 = n.gameObject;
            meshFilters[0]       = c1.GetComponent <MeshFilter>();
            combine[0].mesh      = meshFilters[0].sharedMesh;
            combine[0].transform = meshFilters[0].transform.localToWorldMatrix;
            meshFilters[0].gameObject.SetActive(false);
            nodes.Add(n);
            nodes_already_clustered.Add(n);
            // add boxcollider for each node
            //BoxCollider b = newCluster.AddComponent<BoxCollider>();
            //b.size = new Vector3(0.05f, 0.05f, 0.05f);
            //b.center = c1.transform.position;
            //b.isTrigger = true;
            ArrayList edge = n.getAllocatedEdges();
            if (edge.Count > 0)
            {
                GameObject index0 = edge[0] as GameObject;
                foreach (GameObject ga in edge)
                {
                    LineRenderer l = ga.GetComponent <LineRenderer>();
                    l.material.SetColor("_TintColor", new Color(col.r, col.g, col.b, 0.01f));
                }
            }

            int k = 1;

            foreach (VisualNode v in n.getClusterNodes())
            {
                if (nodes_already_clustered.Contains(v) == false)
                {
                    GameObject g = v.gameObject;
                    meshFilters[k]       = g.GetComponent <MeshFilter>();
                    combine[k].mesh      = meshFilters[k].sharedMesh;
                    combine[k].transform = meshFilters[k].transform.localToWorldMatrix;
                    meshFilters[k].gameObject.SetActive(false);
                    nodes.Add(v);
                    nodes_already_clustered.Add(v);
                    // add boxcollider for each node
                    //BoxCollider b1 = newCluster.AddComponent<BoxCollider>();
                    //b1.size = new Vector3(0.05f, 0.05f, 0.05f);
                    //b1.center = g.transform.position;
                    //b1.isTrigger = true;
                    v.transform.parent = n.transform;
                    ArrayList edge1 = v.getAllocatedEdges();
                    if (edge1.Count > 0)
                    {
                        GameObject index0 = edge1[0] as GameObject;
                        foreach (GameObject ga in edge1)
                        {
                            LineRenderer l = ga.GetComponent <LineRenderer>();
                            l.material.SetColor("_TintColor", new Color(col.r, col.g, col.b, 0.01f));
                        }
                    }
                }
                else
                {
                }
                k++;
            }

            // set the parent of the cluster to visualization object
            newCluster.transform.parent = this.transform;
            // set the name of the cluster
            newCluster.transform.name = n.transform.name + " cluster";

            // add meshfilter to new cluster
            newCluster.AddComponent <MeshFilter>();
            newCluster.AddComponent <MeshRenderer>();
            newCluster.GetComponent <MeshFilter>().mesh = new Mesh();
            // combine all the meshes in the mesh array "combine"
            newCluster.GetComponent <MeshFilter>().mesh.CombineMeshes(combine);
            newCluster.GetComponent <MeshRenderer>().material = nodeMat;
            // assign random color to cluster
            newCluster.GetComponent <MeshRenderer>().material.color = col;
            // add clustercode
            newCluster.AddComponent <ClusterBehaviour>();
            ClusterBehaviour c = newCluster.GetComponent <ClusterBehaviour>();
            n.transform.parent = c.transform;
            c.setArrayList(nodes);
            c.setClusterCentre(n.gameObject);


            // lastly, add collider (trying box colliders)
            //newCluster.AddComponent<MeshCollider>();
        }
        EdgeManager edgeManager = Camera.main.GetComponent <EdgeManager> ();
        ArrayList   glEdges     = edgeManager.getEdges();

//		print (glEdges.Count + "glEdge count");
        for (int i = 0; i < glEdges.Count; i++)
        {
            Edge e = (Edge)glEdges[i];
            e.setColor(e.getTransformRef().parent.parent.GetComponent <MeshRenderer>().material.color);
        }

        clusterAllNodes         = true;
        graph_layout_recognized = false;

        Camera.main.cullingMask = cullingmask;
    }