コード例 #1
0
 internal void computeVolume(SSBVHNodeAdaptor <GO> nAda)
 {
     box = nAda.boundingBox(gobjects[0]);
     for (int i = 1; i < gobjects.Count; i++)
     {
         expandVolume(nAda, nAda.boundingBox(gobjects[i]));
     }
 }
コード例 #2
0
        public void addObject(GO newOb)
        {
            SSAABB box    = nAda.boundingBox(newOb);
            float  boxSAH = ssBVHNode <GO> .SA(ref box);

            rootBVH.addObject(nAda, newOb, ref box, boxSAH);
        }
コード例 #3
0
        // TODO: will need to calculate center of AABB
        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.boundingBox(go1).Center().X.CompareTo(nAda.boundingBox(go2).Center().X)); });
                    break;

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

                case Axis.Z:
                    orderedlist.Sort(delegate(GO go1, GO go2) { return(nAda.boundingBox(go1).Center().Z.CompareTo(nAda.boundingBox(go2).Center().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
        }
コード例 #4
0
 internal static SSAABB AABBofOBJ(SSBVHNodeAdaptor <GO> nAda, GO obj)
 {
     return(nAda.boundingBox(obj));
 }