예제 #1
0
        public float sampleTrilinear(Array3D <float> noise, Vector3 pos)
        {
            var min = pos.ToFloored();
            var f   = pos - min;

            /*var q000 = noise.GetTiled(new Point3(0, 0, 0) + min);
            *  var q100 = noise.GetTiled(new Point3(1, 0, 0) + min);
            *  var q010 = noise.GetTiled(new Point3(0, 1, 0) + min);
            *  var q001 = noise.GetTiled(new Point3(0, 0, 1) + min);
            *  var q110 = noise.GetTiled(new Point3(1, 1, 0) + min);
            *  var q011 = noise.GetTiled(new Point3(0, 1, 1) + min);
            *  var q101 = noise.GetTiled(new Point3(1, 0, 1) + min);
            *  var q111 = noise.GetTiled(new Point3(1, 1, 1) + min);*/
            var x0 = TWMath.nfmod(min.X + 0, noise.Size.X);;
            var y0 = TWMath.nfmod(min.Y + 0, noise.Size.Y);
            var z0 = TWMath.nfmod(min.Z + 0, noise.Size.Z);

            var x1   = TWMath.nfmod(x0 + 1, noise.Size.X);
            var y1   = TWMath.nfmod(y0 + 1, noise.Size.Y);
            var z1   = TWMath.nfmod(z0 + 1, noise.Size.Z);
            var q000 = noise.GetFast(x0, y0, z0);
            var q100 = noise.GetFast(x1, y0, z0);
            var q010 = noise.GetFast(x0, y1, z0);
            var q001 = noise.GetFast(x0, y0, z1);
            var q110 = noise.GetFast(x1, y1, z0);
            var q011 = noise.GetFast(x0, y1, z1);
            var q101 = noise.GetFast(x1, y0, z1);
            var q111 = noise.GetFast(x1, y1, z1);

            var ret = TWMath.triLerp(f.dx(), q000, q100, q001, q101, q010, q110, q011, q111);

            return(ret);
        }
        public void TestDensityCalcPerformance()
        {
            var dens = VoxelTerrainGenerationTest.createDensityFunction5Perlin(11, 10);

            var times = 10000;
            var s     = new Stopwatch();

            s.Start();

            for (int i = 0; i < times; i++)
            {
                float a = dens(new Vector3(1));
            }
            s.Stop();
            var densityEval = s.Elapsed.TotalSeconds / times;

            Console.WriteLine("Density evaluation: 100% - {0} ms", +densityEval * 1000);


            s.Reset();
            s.Start();

            for (int i = 0; i < times * 5; i++)// 5 trilerps per density lookup
            {
                float a = TWMath.triLerp(new Vector3(0.5f), 4, 7, 8, 6, 4, 8, 9, 7);
            }
            s.Stop();
            var trilerp = s.Elapsed.TotalSeconds / times;

            Console.WriteLine("Trilerp : {0:###}% - {1}ms", trilerp / densityEval * 100, trilerp * 1000);



            var ar = new Array3D <float>(new Point3(16, 16, 16));

            s.Reset();
            s.Start();

            for (int i = 0; i < times * 5 * 8; i++)// 8 getTiled per trilerp and 5 trilerps per density lookup
            {
                /*var pos = new Point3(5, 5, 5);
                 * pos.X = TWMath.nfmod(pos.X, ar.Size.X);
                 * pos.Y = TWMath.nfmod(pos.Y, ar.Size.Y);
                 * pos.Z = TWMath.nfmod(pos.Z, ar.Size.Z);
                 * float a = ar.arr[pos.X, pos.Y, pos.Z];*/
                float a = ar.GetTiled(new Point3(5, 5, 5));
            }
            s.Stop();
            var getTiled = s.Elapsed.TotalSeconds / times;

            Console.WriteLine("GetTiled : {0:###}% - {1}ms", getTiled / densityEval * 100, getTiled * 1000);
        }