コード例 #1
0
        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;
            }
        }
コード例 #2
0
 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]);
     }
 }
コード例 #3
0
        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);
        }
コード例 #4
0
        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]);
            }
        }
コード例 #5
0
        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;
            }
        }