Exemplo n.º 1
0
        internal void splitNode(SSBVHNodeAdaptor <GO> nAda)
        {
            // second, decide which axis to split on, and sort..
            List <GO> splitlist = gobjects;

            splitlist.ForEach(o => nAda.unmapObject(o));

            Axis splitAxis = pickSplitAxis();

            switch (splitAxis) // sort along the appropriate axis
            {
            case Axis.X:
                splitlist.Sort(delegate(GO go1, GO go2) { return(nAda.objectpos(go1).X.CompareTo(nAda.objectpos(go2).X)); });
                break;

            case Axis.Y:
                splitlist.Sort(delegate(GO go1, GO go2) { return(nAda.objectpos(go1).Y.CompareTo(nAda.objectpos(go2).Y)); });
                break;

            case Axis.Z:
                splitlist.Sort(delegate(GO go1, GO go2) { return(nAda.objectpos(go1).Z.CompareTo(nAda.objectpos(go2).Z)); });
                break;

            default: throw new NotImplementedException();
            }
            int center = (int)(splitlist.Count / 2);  // Find the center object in our current sub-list

            gobjects = null;

            // create the new left and right nodes...
            left  = new ssBVHNode <GO>(nAda.BVH, this, splitlist.GetRange(0, center), splitAxis, this.depth + 1);                        // Split the Hierarchy to the left
            right = new ssBVHNode <GO>(nAda.BVH, this, splitlist.GetRange(center, splitlist.Count - center), splitAxis, this.depth + 1); // Split the Hierarchy to the right
        }
Exemplo n.º 2
0
 internal void computeVolume(SSBVHNodeAdaptor <GO> nAda)
 {
     assignVolume(nAda.objectpos(gobjects[0]), nAda.radius(gobjects[0]));
     for (int i = 1; i < gobjects.Count; i++)
     {
         expandVolume(nAda, nAda.objectpos(gobjects[i]), nAda.radius(gobjects[i]));
     }
 }
Exemplo n.º 3
0
        public void addObject(GO newOb)
        {
            SSAABB box    = SSAABB.FromSphere(nAda.objectpos(newOb), nAda.radius(newOb));
            float  boxSAH = ssBVHNode <GO> .SA(ref box);

            rootBVH.addObject(nAda, newOb, ref box, boxSAH);
        }
Exemplo n.º 4
0
        internal void splitNode(SSBVHNodeAdaptor <GO> nAda)
        {
            // second, decide which axis to split on, and sort..
            List <GO> splitlist = gobjects;

            splitlist.ForEach(o => nAda.unmapObject(o));
            int center = (int)(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(delegate(GO go1, GO go2) { return(nAda.objectpos(go1).X.CompareTo(nAda.objectpos(go2).X)); });
                    break;

                case Axis.Y:
                    orderedlist.Sort(delegate(GO go1, GO go2) { return(nAda.objectpos(go1).Y.CompareTo(nAda.objectpos(go2).Y)); });
                    break;

                case Axis.Z:
                    orderedlist.Sort(delegate(GO go1, GO go2) { return(nAda.objectpos(go1).Z.CompareTo(nAda.objectpos(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);

                float 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
            gobjects   = null;
            this.left  = new ssBVHNode <GO>(nAda.BVH, this, bestSplit.left, bestSplit.axis, this.depth + 1);  // Split the Hierarchy to the left
            this.right = new ssBVHNode <GO>(nAda.BVH, this, bestSplit.right, bestSplit.axis, this.depth + 1); // Split the Hierarchy to the right
        }