void _BuildListOfClustersToDraw() { _clustersToDraw.Clear(); if (cluster.clusters == null) { return; } List <MB3_AgglomerativeClustering.ClusterNode> removeMe = new List <MB3_AgglomerativeClustering.ClusterNode>(); float largest = 1f; for (int i = 0; i < cluster.clusters.Length; i++) { MB3_AgglomerativeClustering.ClusterNode node = cluster.clusters[i]; //don't draw clusters that were merged too far apart and only want leaf nodes if (node.distToMergedCentroid <= d.maxDistBetweenClusters && node.leaf == null) { _clustersToDraw.Add(node); } if (node.distToMergedCentroid > largest) { largest = node.distToMergedCentroid; } } for (int i = 0; i < _clustersToDraw.Count; i++) { removeMe.Add(_clustersToDraw[i].cha); removeMe.Add(_clustersToDraw[i].chb); } for (int i = 0; i < removeMe.Count; i++) { _clustersToDraw.Remove(removeMe[i]); } _radii = new float[_clustersToDraw.Count]; for (int i = 0; i < _radii.Length; i++) { MB3_AgglomerativeClustering.ClusterNode n = _clustersToDraw[i]; Bounds b = new Bounds(n.centroid, Vector3.one); for (int j = 0; j < n.leafs.Length; j++) { Renderer r = cluster.clusters[n.leafs[j]].leaf.go.GetComponent <Renderer>(); if (r != null) { b.Encapsulate(r.bounds); } } _radii[i] = b.extents.magnitude; } _ObjsExtents = largest + 1f; if (_ObjsExtents < 2f) { _ObjsExtents = 2f; } }
public override void DrawGizmos(Bounds sceneObjectBounds) { if (cluster == null || cluster.clusters == null) { return; } if (_lastMaxDistBetweenClusters != d.maxDistBetweenClusters) { _BuildListOfClustersToDraw(); _lastMaxDistBetweenClusters = d.maxDistBetweenClusters; } for (int i = 0; i < _clustersToDraw.Count; i++) { Gizmos.color = Color.white; MB3_AgglomerativeClustering.ClusterNode node = _clustersToDraw[i]; Gizmos.DrawWireSphere(node.centroid, _radii[i]); } }
public override Dictionary <string, List <Renderer> > FilterIntoGroups(List <GameObject> selection) { Dictionary <string, List <Renderer> > cell2objs = new Dictionary <string, List <Renderer> >(); for (int i = 0; i < _clustersToDraw.Count; i++) { MB3_AgglomerativeClustering.ClusterNode node = _clustersToDraw[i]; List <Renderer> rrs = new List <Renderer>(); for (int j = 0; j < node.leafs.Length; j++) { Renderer r = cluster.clusters[node.leafs[j]].leaf.go.GetComponent <Renderer>(); if (r is MeshRenderer || r is SkinnedMeshRenderer) { rrs.Add(r); } } cell2objs.Add("Cluster_" + i, rrs); } return(cell2objs); }
public override void DrawGizmos(Bounds sceneObjectBounds) { if (cluster == null || cluster.clusters == null) { return; } if (_lastMaxDistBetweenClusters != d.maxDistBetweenClusters) { float s, l; _BuildListOfClustersToDraw(null, out s, out l); _lastMaxDistBetweenClusters = d.maxDistBetweenClusters; } Gizmos.color = MB3_MeshBakerGrouper.WHITE_TRANSP; for (int i = 0; i < _clustersToDraw.Count; i++) { Gizmos.color = MB3_MeshBakerGrouper.WHITE_TRANSP; MB3_AgglomerativeClustering.ClusterNode node = _clustersToDraw[i]; Gizmos.DrawWireSphere(node.centroid, _radii[i]); } }
void _BuildListOfClustersToDraw(ProgressUpdateCancelableDelegate progFunc, out float smallest, out float largest) { _clustersToDraw.Clear(); if (cluster.clusters == null) { smallest = 1f; largest = 10f; return; } if (progFunc != null) { progFunc("Building Clusters To Draw A:", 0); } List <MB3_AgglomerativeClustering.ClusterNode> removeMe = new List <MB3_AgglomerativeClustering.ClusterNode>(); largest = 1f; smallest = 10e6f; for (int i = 0; i < cluster.clusters.Length; i++) { MB3_AgglomerativeClustering.ClusterNode node = cluster.clusters[i]; //don't draw clusters that were merged too far apart and only want leaf nodes if (node.distToMergedCentroid <= d.maxDistBetweenClusters /*&& node.leaf == null*/) { if (d.includeCellsWithOnlyOneRenderer) { _clustersToDraw.Add(node); } else if (node.leaf == null) { _clustersToDraw.Add(node); } } if (node.distToMergedCentroid > largest) { largest = node.distToMergedCentroid; } if (node.height > 0 && node.distToMergedCentroid < smallest) { smallest = node.distToMergedCentroid; } } if (progFunc != null) { progFunc("Building Clusters To Draw B:", 0); } for (int i = 0; i < _clustersToDraw.Count; i++) { removeMe.Add(_clustersToDraw[i].cha); removeMe.Add(_clustersToDraw[i].chb); } for (int i = 0; i < removeMe.Count; i++) { _clustersToDraw.Remove(removeMe[i]); } _radii = new float[_clustersToDraw.Count]; if (progFunc != null) { progFunc("Building Clusters To Draw C:", 0); } for (int i = 0; i < _radii.Length; i++) { MB3_AgglomerativeClustering.ClusterNode n = _clustersToDraw[i]; Bounds b = new Bounds(n.centroid, Vector3.one); for (int j = 0; j < n.leafs.Length; j++) { Renderer r = cluster.clusters[n.leafs[j]].leaf.go.GetComponent <Renderer>(); if (r != null) { b.Encapsulate(r.bounds); } } _radii[i] = b.extents.magnitude; } if (progFunc != null) { progFunc("Building Clusters To Draw D:", 0); } _ObjsExtents = largest + 1f; _minDistBetweenClusters = Mathf.Lerp(smallest, 0f, .9f); if (_ObjsExtents < 2f) { _ObjsExtents = 2f; } }