public void TestExtractSurfaceAllEdges()
        {
            int size    = 16;
            var srcGrid = new DelegateHermiteGrid(p => p.X % 2 == 0 || p.Y % 2 == 0 || p.Z % 2 == 0, (p, i) => new Vector4(), new Point3(size, size, size));

            testExtractSurface(srcGrid);
        }
        public void TestExtractSurfaceNoEdges()
        {
            //TODO: serious optimization idea: store all signs for each cube
            int size    = 16;
            var srcGrid = new DelegateHermiteGrid(p => true, (p, i) => new Vector4(), new Point3(size, size, size));

            testExtractSurface(srcGrid);
        }
        public void TestHermiteCopyingAllEdges()
        {
            int size    = 32;
            var srcGrid = new DelegateHermiteGrid(p => p.X % 2 == 0 || p.Y % 2 == 0 || p.Z % 2 == 0, (p, i) => new Vector4(), new Point3(size, size, size));
            int times   = 100;

            Console.WriteLine(PerformanceHelper.Measure(() =>
            {
                for (int i = 0; i < times; i++)
                {
                    HermiteDataGrid.CopyGrid(srcGrid);
                }
            }).Multiply(1f / times).PrettyPrint());
        }
        private static void testExtractSurface(DelegateHermiteGrid srcGrid)
        {
            var grid  = HermiteDataGrid.CopyGrid(srcGrid);
            int times = 40;

            var vertices  = new List <Vector3>(10 * 1000 * 1000);
            var indices   = new List <int>(10 * 1000 * 1000);
            var extractor = new DualContouringAlgorithm();

            var time = PerformanceHelper.Measure(() =>
            {
                for (int i = 0; i < times; i++)
                {
                    vertices.Clear();
                    indices.Clear();
                    extractor.GenerateSurface(vertices, indices, srcGrid);
                }
            });

            Console.WriteLine("Time: " + time.Multiply(1f / times).PrettyPrint());
            Console.WriteLine("{0:#.0}x{0:#.0}x{0:#.0} grid per second", Math.Pow(srcGrid.Dimensions.X * srcGrid.Dimensions.Y * srcGrid.Dimensions.Z / (time.TotalSeconds / times), 1 / 3f));
        }