Example #1
0
        private void BuildOctree()
        {
            var tempNodes = new List <TempNode>();
            var root      = new TempNode();

            tempNodes.Add(root);

            // create bounding boxes for all triangles
            _triangleBoxes = new AlignedBox[_triangles.Length];
            for (int i = 0; i < _triangles.Length; i++)
            {
                AlignedBox.Fit(ref _body[_triangles[i][0]], ref _body[_triangles[i][1]], ref _body[_triangles[i][2]], out _triangleBoxes[i]);
                AlignedBox.Merge(ref root.BoundingBox, ref _triangleBoxes[i], out root.BoundingBox);
            }

            var subBoxes = new AlignedBox[8];

            // add each triangle to the bounding box
            for (int i = 0; i < _triangles.Length; i++)
            {
                int idx = 0;
                var box = root.BoundingBox;

                while (AlignedBox.Intersect(ref tempNodes[idx].BoundingBox, ref _triangleBoxes[i]) == BoxIntersectType.AContainsB)
                {
                    int sector = -1;
                    for (int j = 0; j < 8; j++)
                    {
                        CreateChildBox(ref tempNodes[idx].BoundingBox, j, out subBoxes[j]);
                        if (AlignedBox.Intersect(ref subBoxes[j], ref _triangleBoxes[i]) == BoxIntersectType.AContainsB)
                        {
                            sector = j;
                            break;
                        }
                    }
                    if (sector == -1)
                    {
                        tempNodes[idx].Triangles.Add(i);
                        break;
                    }
                    else
                    {
                        if (tempNodes[idx].Children[sector] > 0)
                        {
                            idx = tempNodes[idx].Children[sector];
                        }
                        else
                        {
                            var child = new TempNode();
                            child.BoundingBox = subBoxes[sector];
                            tempNodes.Add(child);

                            idx = tempNodes[idx].Children[sector] = tempNodes.Count - 1;
                        }
                    }
                }
            }

            _nodes = (from node in tempNodes
                      select new Node()
            {
                Children = (from i in node.Children where i > 0 select(ushort) i).ToArray(),
                Triangles = (from i in node.Triangles select(ushort) i).ToArray(),
                BoundingBox = node.BoundingBox
            }).ToArray();
        }