Пример #1
0
        private void SplitNode(SSBVHNodeAdaptor <GO> nAda)
        {
            // second, decide which axis to split on, and sort..
            List <GO> splitlist = ContainedObjects;

            splitlist.ForEach(nAda.UnmapObject);
            int center = splitlist.Count / 2;             // find the center object

            SplitAxisOpt <GO> bestSplit = eachAxis.Min(
                axis => {
                var orderedlist = new List <GO>(splitlist);
                switch (axis)
                {
                case Axis.X:
                    orderedlist.Sort((go1, go2) => nAda.GetObjectPosition(go1).x.CompareTo(nAda.GetObjectPosition(go2).x));
                    break;

                case Axis.Y:
                    orderedlist.Sort((go1, go2) => nAda.GetObjectPosition(go1).y.CompareTo(nAda.GetObjectPosition(go2).y));
                    break;

                case Axis.Z:
                    orderedlist.Sort((go1, go2) => nAda.GetObjectPosition(go1).z.CompareTo(nAda.GetObjectPosition(go2).z));
                    break;

                default:
                    throw new NotImplementedException("unknown split axis: " + axis.ToString());
                }

                var left_s  = orderedlist.GetRange(0, center);
                var right_s = orderedlist.GetRange(center, splitlist.Count - center);

                double SAH = SAofList(nAda, left_s) * left_s.Count + SAofList(nAda, right_s) * right_s.Count;
                return(new SplitAxisOpt <GO>(SAH, axis, left_s, right_s));
            });

            // perform the split
            ContainedObjects = null;
            Left             = new ssBVHNode <GO>(nAda.BVH, this, bestSplit.left, Depth + 1);  // Split the Hierarchy to the left
            Right            = new ssBVHNode <GO>(nAda.BVH, this, bestSplit.right, Depth + 1); // Split the Hierarchy to the right
        }