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)); }
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); } }
// 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); }
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 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; }