Beispiel #1
0
        public OCTree Build(Vector3[] vertexArray, int[] indexArray)
        {
            var list = new List <OCTPoly>();

            for (var i = 0; i < (indexArray.Length / 3); i++)
            {
                var a = vertexArray[indexArray[i * 3]];
                var b = vertexArray[indexArray[(i * 3) + 1]];
                var c = vertexArray[indexArray[(i * 3) + 2]];
                list.Add(new OCTPoly(a, b, c));
            }
            var polyList = list.ToArray();
            var box      = CalculateBounds(polyList);
            var center   = ((box.Max + box.Min) * 0.5f);
            var extents  = box.Max - center;

            if (MakeSquare)
            {
                var x = extents.X;
                if (extents.Y > x)
                {
                    x = extents.Y;
                }
                if (extents.Z > x)
                {
                    x = extents.Z;
                }
                extents.X = extents.Y = extents.Z = x;
            }
            extents += (extents * ExpandBoundsFactor);
            box.Min  = center - extents;
            box.Max  = center + extents;
            var node = new IntermediateOCTreeNode
            {
                Bounds = box
            };

            RecursiveBuild(node, polyList, center, extents, 0);
            var tree = new OCTree
            {
                Root = node.Build(WeldDelta)
            };

            return(tree);
        }
Beispiel #2
0
 public OCTree Build(Vector3[] vertexArray, int[] indexArray)
 {
     var list = new List<OCTPoly>();
     for (var i = 0; i < (indexArray.Length / 3); i++)
     {
         var a = vertexArray[indexArray[i * 3]];
         var b = vertexArray[indexArray[(i * 3) + 1]];
         var c = vertexArray[indexArray[(i * 3) + 2]];
         list.Add(new OCTPoly(a, b, c));
     }
     var polyList = list.ToArray();
     var box = CalculateBounds(polyList);
     var center = ((box.Max + box.Min) * 0.5f);
     var extents = box.Max - center;
     if (MakeSquare)
     {
         var x = extents.X;
         if (extents.Y > x)
         {
             x = extents.Y;
         }
         if (extents.Z > x)
         {
             x = extents.Z;
         }
         extents.X = extents.Y = extents.Z = x;
     }
     extents += (extents * ExpandBoundsFactor);
     box.Min = center - extents;
     box.Max = center + extents;
     var node = new IntermediateOCTreeNode
     {
         Bounds = box
     };
     RecursiveBuild(node, polyList, center, extents, 0);
     var tree = new OCTree
     {
         Root = node.Build(WeldDelta)
     };
     return tree;
 }
Beispiel #3
0
        private void RecursiveBuild(IntermediateOCTreeNode node, OCTPoly[] PolyList, Vector3 center, Vector3 extents, int depth)
        {
            var planeArray = new[] { MathExtensions.PlaneFromPointNormal(center + (planeOffsets[0] * extents), planeNormals[0]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[1] * extents), planeNormals[1]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[2] * extents), planeNormals[2]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[3] * extents), planeNormals[3]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[4] * extents), planeNormals[4]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[5] * extents), planeNormals[5]) };
            var polyArray  = new OCTPoly[PolyList.Length];
            var index      = 0;

            while (index < PolyList.Length)
            {
                polyArray[index] = new OCTPoly(PolyList[index]);
                index++;
            }
            for (var i = 0; i < planeArray.Length; i++)
            {
                var list = new List <OCTPoly>();
                for (var j = 0; j < polyArray.Length; j++)
                {
                    int num4;
                    var newPolys = new OCTPoly[2];
                    Split(polyArray[j], planeArray[i], ref newPolys, out num4);
                    index = 0;
                    while (index < num4)
                    {
                        var plane = new Plane(newPolys[index].Verts[0], newPolys[index].Verts[1], newPolys[index].Verts[2]);
                        if (!float.IsNaN(plane.Normal.X))
                        {
                            list.Add(newPolys[index]);
                        }
                        index++;
                    }
                }
                polyArray = new OCTPoly[list.Count];
                index     = 0;
                while (index < list.Count)
                {
                    polyArray[index] = new OCTPoly(list[index]);
                    index++;
                }
            }
            if ((polyArray.Length <= MaxPolygonsPerNode) || (depth >= MaxSubdivisions))
            {
                node.Polys = new OCTPoly[polyArray.Length];
                if (polyArray.Length > 0)
                {
                    for (index = 0; index < polyArray.Length; index++)
                    {
                        node.Polys[index] = new OCTPoly(polyArray[index]);
                    }
                }
            }
            else
            {
                node.Children = new IntermediateOCTreeNode[8];
                for (index = 0; index < 8; index++)
                {
                    node.Children[index] = new IntermediateOCTreeNode();
                    var vector  = (extents * 0.5f);
                    var vector2 = center + (nodeOffsets[index] * vector);
                    node.Children[index].Bounds = new BoundingBox(vector2 - vector, vector2 + vector);
                    RecursiveBuild(node.Children[index], PolyList, vector2, vector, depth + 1);
                }
            }
        }
Beispiel #4
0
 private void RecursiveBuild(IntermediateOCTreeNode node, OCTPoly[] PolyList, Vector3 center, Vector3 extents, int depth)
 {
     var planeArray = new[] { MathExtensions.PlaneFromPointNormal(center + (planeOffsets[0] * extents), planeNormals[0]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[1] * extents), planeNormals[1]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[2] * extents), planeNormals[2]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[3] * extents), planeNormals[3]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[4] * extents), planeNormals[4]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[5] * extents), planeNormals[5]) };
     var polyArray = new OCTPoly[PolyList.Length];
     var index = 0;
     while (index < PolyList.Length)
     {
         polyArray[index] = new OCTPoly(PolyList[index]);
         index++;
     }
     for (var i = 0; i < planeArray.Length; i++)
     {
         var list = new List<OCTPoly>();
         for (var j = 0; j < polyArray.Length; j++)
         {
             int num4;
             var newPolys = new OCTPoly[2];
             Split(polyArray[j], planeArray[i], ref newPolys, out num4);
             index = 0;
             while (index < num4)
             {
                 var plane = new Plane(newPolys[index].Verts[0], newPolys[index].Verts[1], newPolys[index].Verts[2]);
                 if (!float.IsNaN(plane.Normal.X))
                 {
                     list.Add(newPolys[index]);
                 }
                 index++;
             }
         }
         polyArray = new OCTPoly[list.Count];
         index = 0;
         while (index < list.Count)
         {
             polyArray[index] = new OCTPoly(list[index]);
             index++;
         }
     }
     if ((polyArray.Length <= MaxPolygonsPerNode) || (depth >= MaxSubdivisions))
     {
         node.Polys = new OCTPoly[polyArray.Length];
         if (polyArray.Length > 0)
         {
             for (index = 0; index < polyArray.Length; index++)
             {
                 node.Polys[index] = new OCTPoly(polyArray[index]);
             }
         }
     }
     else
     {
         node.Children = new IntermediateOCTreeNode[8];
         for (index = 0; index < 8; index++)
         {
             node.Children[index] = new IntermediateOCTreeNode();
             var vector = (extents * 0.5f);
             var vector2 = center + (nodeOffsets[index] * vector);
             node.Children[index].Bounds = new BoundingBox(vector2 - vector, vector2 + vector);
             RecursiveBuild(node.Children[index], PolyList, vector2, vector, depth + 1);
         }
     }
 }