public void ZeroRadius()
        {
            var random = new Random(123456);
              var d = new SphereDistribution { OuterRadius = 0 };

              Assert.AreEqual(new Vector3F(), d.Next(random));
              Assert.AreEqual(new Vector3F(), d.Next(random));
              Assert.AreEqual(new Vector3F(), d.Next(random));
        }
Example #2
0
        public void ZeroRadius()
        {
            var random = new Random(123456);
            var d      = new SphereDistribution {
                OuterRadius = 0
            };

            Assert.AreEqual(new Vector3F(), d.Next(random));
            Assert.AreEqual(new Vector3F(), d.Next(random));
            Assert.AreEqual(new Vector3F(), d.Next(random));
        }
Example #3
0
        public void Values()
        {
            var random = new Random(123456);
            var d      = new SphereDistribution();

            for (int i = 0; i < 100; i++)
            {
                d.InnerRadius = RandomHelper.Random.NextFloat(0, 100);
                d.OuterRadius = RandomHelper.Random.NextFloat(0, 100);

                var value = d.Next(random);

                var radius = value.Length;
                Assert.IsTrue(d.InnerRadius < radius && radius < d.OuterRadius ||
                              d.OuterRadius < radius && radius < d.InnerRadius);
            }
        }
        public void Values()
        {
            var random = new Random(123456);
              var d = new SphereDistribution();

              for (int i = 0; i < 100; i++)
              {
            d.InnerRadius = RandomHelper.Random.NextFloat(0, 100);
            d.OuterRadius = RandomHelper.Random.NextFloat(0, 100);

            var value = d.Next(random);

            var radius = value.Length;
            Assert.IsTrue(d.InnerRadius < radius && radius < d.OuterRadius
                      || d.OuterRadius < radius && radius < d.InnerRadius);
              }
        }
Example #5
0
    // Update is called once per frame
    void Update()
    {
        framecount++;
        if (framecount % 20 == 0)
        {
            UpdateTexture();
        }
        float distanceToListener = (NA.listener.transform.position - transform.position).magnitude;

        if (distanceToListener > 10)
        {
            return;
        }
        //compute reflections

        SphereDistribution d = new SphereDistribution();

        d.CreateSpiral(tap_count);
        for (int i = 0; i < tap_count; ++i)
        {
            Ray        ray = new Ray(gameObject.transform.position, d.positions[i]);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                //we hit something, we add a tap to the delay
                float distance      = (hit.point - gameObject.transform.position).magnitude;
                float wall2listener = (hit.point - NA.listener.transform.position).magnitude;
                float time          = (distance + wall2listener) / 340f * 1f;
                if (time < 2f)
                {
                    reflections[i] = time;
                }
            }
            else
            {
                //nothing here
                reflections[i] = 0;
            }
        }

        //tap1 = (int)(delaytime * 44100f);
    }
        public Vector3F GetAmbientLight(int numberOfSamples)
        {
            var random             = new Random(1234567);
            var sphereDistribution = new SphereDistribution
            {
                Center      = Vector3F.Zero,
                InnerRadius = 1,
                OuterRadius = 1,
            };

            Vector3F ambient = new Vector3F();

            for (int i = numberOfSamples - 1; i >= 0; i--)
            {
                Vector3F sampleDirection = sphereDistribution.Next(random);
                if (sampleDirection.Y < 0)
                {
                    sampleDirection.Y *= -1;
                }

                Vector3F transmittance;
                Vector3F colorR, colorM;
                ComputeScattering(sampleDirection, true, out transmittance, out colorR, out colorM);
                Debug.Assert(sampleDirection.IsNumericallyNormalized);

                Vector3F sample = colorR + colorM + GetBaseColor(sampleDirection);
                if (sample.IsNaN)
                {
                    numberOfSamples--; // Ignore sample.
                }
                else
                {
                    ambient += sample;
                }
            }

            ambient /= numberOfSamples;

            // We have added up luminance, now we have to multiply by the solid angle
            // of the hemisphere to get illuminance.
            return(ambient * ConstantsF.TwoPi);
        }
Example #7
0
        public void Properties()
        {
            var d = new SphereDistribution();

            Assert.AreEqual(0, d.InnerRadius);
            Assert.AreEqual(1, d.OuterRadius);
            Assert.AreEqual(Vector3F.One, d.Scale);

            d.InnerRadius = 2;
            Assert.AreEqual(2, d.InnerRadius);
            Assert.AreEqual(1, d.OuterRadius);
            Assert.AreEqual(Vector3F.One, d.Scale);

            d.OuterRadius = 3;
            Assert.AreEqual(2, d.InnerRadius);
            Assert.AreEqual(3, d.OuterRadius);
            Assert.AreEqual(Vector3F.One, d.Scale);

            d.Scale = new Vector3F(0.5f, 2, 1.2f);
            Assert.AreEqual(2, d.InnerRadius);
            Assert.AreEqual(3, d.OuterRadius);
            Assert.AreEqual(new Vector3F(0.5f, 2, 1.2f), d.Scale);
        }
        public void Properties()
        {
            var d = new SphereDistribution();

              Assert.AreEqual(0, d.InnerRadius);
              Assert.AreEqual(1, d.OuterRadius);
              Assert.AreEqual(Vector3F.One, d.Scale);

              d.InnerRadius = 2;
              Assert.AreEqual(2, d.InnerRadius);
              Assert.AreEqual(1, d.OuterRadius);
              Assert.AreEqual(Vector3F.One, d.Scale);

              d.OuterRadius = 3;
              Assert.AreEqual(2, d.InnerRadius);
              Assert.AreEqual(3, d.OuterRadius);
              Assert.AreEqual(Vector3F.One, d.Scale);

              d.Scale = new Vector3F(0.5f, 2, 1.2f);
              Assert.AreEqual(2, d.InnerRadius);
              Assert.AreEqual(3, d.OuterRadius);
              Assert.AreEqual(new Vector3F(0.5f, 2, 1.2f), d.Scale);
        }
Example #9
0
        public Vector3F GetAmbientLight(int numberOfSamples)
        {
            var random = new Random(1234567);
              var sphereDistribution = new SphereDistribution
              {
            Center = Vector3F.Zero,
            InnerRadius = 1,
            OuterRadius = 1,
              };

              Vector3F ambient = new Vector3F();
              for (int i = numberOfSamples - 1; i >= 0; i--)
              {
            Vector3F sampleDirection = sphereDistribution.Next(random);
            if (sampleDirection.Y < 0)
              sampleDirection.Y *= -1;

            Vector3F transmittance;
            Vector3F colorR, colorM;
            ComputeScattering(sampleDirection, true, out transmittance, out colorR, out colorM);
            Debug.Assert(sampleDirection.IsNumericallyNormalized);

            Vector3F sample = colorR + colorM + GetBaseColor(sampleDirection);
            if (sample.IsNaN)
              numberOfSamples--;  // Ignore sample.
            else
              ambient += sample;
              }

              ambient /= numberOfSamples;

              // We have added up luminance, now we have to multiply by the solid angle
              // of the hemisphere to get illuminance.
              return ambient * ConstantsF.TwoPi;
        }