示例#1
0
            void ProcessAxis(Range range, int axis, NativeArray <float> scores, NativeArray <float4> points, ref int bestAxis, ref int pivot, ref float minScore)
            {
                CompareVertices comparator;

                comparator.SortAxis = axis;
                points.Sort(comparator);

                PointAndIndex *p = (PointAndIndex *)PointsAsFloat4 + range.Start;

                Aabb runningAabb = Aabb.Empty;

                for (int i = 0; i < points.Length; i++)
                {
                    runningAabb.Include(Aabbs[p[i].Index]);
                    scores[i] = (i + 1) * runningAabb.SurfaceArea;
                }

                runningAabb = Aabb.Empty;

                for (int i = points.Length - 1, j = 1; i > 0; --i, ++j)
                {
                    runningAabb.Include(Aabbs[p[i].Index]);
                    float sum = scores[i - 1] + j * runningAabb.SurfaceArea;
                    if (sum < minScore)
                    {
                        pivot    = i;
                        bestAxis = axis;
                        minScore = sum;
                    }
                }
            }
示例#2
0
            void ProcessAxis(int rangeLength, int axis, NativeArray <float> scores, NativeArray <float4> points, ref int bestAxis, ref int pivot, ref float minScore)
            {
                CompareVertices comparator;

                comparator.SortAxis = axis;
                NativeSortExtension.Sort((float4 *)points.GetUnsafePtr(), rangeLength, comparator);

                PointAndIndex *p = (PointAndIndex *)points.GetUnsafePtr();

                Aabb runningAabb = Aabb.Empty;

                for (int i = 0; i < rangeLength; i++)
                {
                    runningAabb.Include(Aabbs[p[i].Index]);
                    scores[i] = (i + 1) * runningAabb.SurfaceArea;
                }

                runningAabb = Aabb.Empty;

                for (int i = rangeLength - 1, j = 1; i > 0; --i, ++j)
                {
                    runningAabb.Include(Aabbs[p[i].Index]);
                    float sum = scores[i - 1] + j * runningAabb.SurfaceArea;
                    if (sum < minScore)
                    {
                        pivot    = i;
                        bestAxis = axis;
                        minScore = sum;
                    }
                }
            }