public override void Scatter_VeryLate(ref OctaveRay Ray, ref Random rand, Hare.Geometry.Vector Normal, double Cos_Theta) { if (rand.NextDouble() < Scattering_Coefficient[Ray.Octave, 1]) { Hare.Geometry.Vector diffx; Hare.Geometry.Vector diffy; Hare.Geometry.Vector diffz; double proj; //Check that the ray and the normal are both on the same side... if (Cos_Theta > 0) Normal *= -1; diffz = Normal; diffx = new Hare.Geometry.Vector(0, 0, 1); proj = Math.Abs(Hare.Geometry.Hare_math.Dot(diffz, diffx)); if (0.99 < proj && 1.01 > proj) diffx = new Hare.Geometry.Vector(1, 0, 0); diffy = Hare.Geometry.Hare_math.Cross(diffz, diffx); diffx = Hare.Geometry.Hare_math.Cross(diffy, diffz); diffx.Normalize(); diffy.Normalize(); diffz.Normalize(); double u1; double u2; double x; double y; double z; Hare.Geometry.Vector vect; u1 = 2.0 * Math.PI * rand.NextDouble(); // random azimuth double Scat_Mod = rand.NextDouble(); u2 = Math.Acos(Scat_Mod); // random zenith (elevation) x = Math.Cos(u1) * Math.Sin(u2); y = Math.Sin(u1) * Math.Sin(u2); z = Math.Cos(u2); vect = (diffx * x) + (diffy * y) + (diffz * z); vect.Normalize(); //Return the new direction Ray.direction = vect; } else { //Specular Reflection Ray.direction -= Normal * Cos_Theta * 2; } }
public override void Scatter_Late(ref OctaveRay Ray, ref Queue<OctaveRay> Rays, ref Random rand, Hare.Geometry.Vector Normal, double Cos_Theta) { double scat_sel = rand.NextDouble(); if (scat_sel > Scattering_Coefficient[Ray.Octave, 2]) { // Specular Reflection Ray.direction -= Normal * Cos_Theta * 2; return; } else if (scat_sel > Scattering_Coefficient[Ray.Octave, 0]) { //Only for a certain portion of high benefit cases-- //// a. Create new source for scattered energy (E * Scattering). //// b. Modify E (E * 1 - Scattering). //Create a new ray... OctaveRay tr = Ray.SplitRay(1 - Scattering_Coefficient[Ray.Octave,1]); // this is the specular reflection. Save it for later. tr.direction -= Normal * Cos_Theta * 2; if (tr.t_sum == 0) { Rhino.RhinoApp.Write("Something's up!"); } Rays.Enqueue(tr); } //If we are here, the original ray needs a scattered direction: Hare.Geometry.Vector diffx; Hare.Geometry.Vector diffy; Hare.Geometry.Vector diffz; double proj; //Check that the ray and the normal are both on the same side... if (Cos_Theta > 0) Normal *= -1; diffz = Normal; diffx = new Hare.Geometry.Vector(0, 0, 1); proj = Math.Abs(Hare.Geometry.Hare_math.Dot(diffz, diffx)); if (0.99 < proj && 1.01 > proj) diffx = new Hare.Geometry.Vector(1, 0, 0); diffy = Hare.Geometry.Hare_math.Cross(diffz, diffx); diffx = Hare.Geometry.Hare_math.Cross(diffy, diffz); diffx.Normalize(); diffy.Normalize(); diffz.Normalize(); double u1; double u2; double x; double y; double z; Hare.Geometry.Vector vect; u1 = 2.0 * Math.PI * rand.NextDouble(); // random azimuth double Scat_Mod = rand.NextDouble(); u2 = Math.Acos(Scat_Mod); // random zenith (elevation) x = Math.Cos(u1) * Math.Sin(u2); y = Math.Sin(u1) * Math.Sin(u2); z = Math.Cos(u2); vect = (diffx * x) + (diffy * y) + (diffz * z); vect.Normalize(); //Return the new direction Ray.direction = vect; }
public override void Scatter_Early(ref BroadRay Ray, ref Queue<OctaveRay> Rays, ref Random rand, Hare.Geometry.Vector Normal, double Cos_Theta) { double roughness_chance = rand.NextDouble(); if (Cos_Theta > 0) { Normal *= -1; Cos_Theta *= -1; } foreach (int oct in Ray.Octaves) { // 3. Apply Scattering. //// a. Create new source for scattered energy (E * Scattering). //// b. Modify E (E * 1 - Scattering). OctaveRay R = Ray.SplitRay(oct, Scattering_Coefficient[oct, 1]); Hare.Geometry.Vector diffx; Hare.Geometry.Vector diffy; Hare.Geometry.Vector diffz; double proj; //Check that the ray and the normal are both on the same side... diffz = Normal; diffx = new Hare.Geometry.Vector(0, 0, 1); proj = Math.Abs(Hare.Geometry.Hare_math.Dot(diffz, diffx)); if (0.99 < proj && 1.01 > proj) diffx = new Hare.Geometry.Vector(1, 0, 0); diffy = Hare.Geometry.Hare_math.Cross(diffz, diffx); diffx = Hare.Geometry.Hare_math.Cross(diffy, diffz); diffx.Normalize(); diffy.Normalize(); diffz.Normalize(); double u1; double u2; double x; double y; double z; Hare.Geometry.Vector vect; u1 = 2.0 * Math.PI * rand.NextDouble(); // random azimuth double Scat_Mod = rand.NextDouble(); u2 = Math.Acos(Scat_Mod); // random zenith (elevation) x = Math.Cos(u1) * Math.Sin(u2); y = Math.Sin(u1) * Math.Sin(u2); z = Math.Cos(u2); vect = (diffx * x) + (diffy * y) + (diffz * z); vect.Normalize(); //Return the new direction R.direction = vect; if (R.t_sum == 0) { Rhino.RhinoApp.Write("Something's up!"); } Rays.Enqueue(R); } Ray.direction -= Normal * Cos_Theta * 2; }