List <TracedRay> process_rays(Surface surface, TraceIntensityMode m, RayTraceResults result, List <TracedRay> input) { RayTraceParameters params_ = result._parameters; List <TracedRay> rays = new(); foreach (TracedRay i in input) { TracedRay ray = i; Transform3 t = ray.get_creator().get_transform_to(surface); Vector3Pair local1 = t.transform_line(ray.get_ray()); Vector3Pair pt = surface is Stop ? intersect((Stop)surface, params_, local1) : intersect(surface, params_, local1); if (pt != null) { result.add_intercepted(surface, ray); TracedRay cray = trace_ray(surface, m, result, ray, local1, pt); if (cray != null) { rays.Add(cray); } } } return(rays); }
List <TracedRay> process_rays(Element e, TraceIntensityMode m, RayTraceResults result, List <TracedRay> input) { switch (m) { case TraceIntensityMode.Simpletrace: return(process_rays_simple(e, result, input)); case TraceIntensityMode.Intensitytrace: return(process_rays_intensity(e, result, input)); case TraceIntensityMode.Polarizedtrace: return(process_rays_polarized(e, result, input)); } return(new()); }
TracedRay trace_ray(Surface surface, TraceIntensityMode m, RayTraceResults result, TracedRay incident, Vector3Pair local, Vector3Pair pt) { incident.set_len((pt.origin().minus(local.origin())).len()); incident.set_intercept(surface, pt.origin()); if (m == TraceIntensityMode.Simpletrace) { incident.set_intercept_intensity(1.0); return(trace_ray_simple(surface, result, incident, local, pt)); } else { // apply absorbtion from current material double i_intensity = incident.get_intensity() * incident.get_material().get_internal_transmittance( incident.get_wavelen(), incident.get_len()); incident.set_intercept_intensity(i_intensity); // FIXME // if (i_intensity < _discard_intensity) // return; if (m == TraceIntensityMode.Intensitytrace) { return(trace_ray_intensity(surface, result, incident, local, pt)); } else if (m == TraceIntensityMode.Polarizedtrace) { return(trace_ray_polarized(surface, result, incident, local, pt)); } else { throw new InvalidOperationException(); } } }
List <TracedRay> process_rays(Stop surface, TraceIntensityMode m, RayTraceResults result, List <TracedRay> input) { List <TracedRay> rays = new(); foreach (TracedRay i in input) { TracedRay ray = i; Transform3 t = ray.get_creator().get_transform_to(surface); Vector3Pair local = t.transform_line(ray.get_ray()); Vector3 origin = surface.get_curve().intersect(local); if (origin != null) { if (origin.project_xy().len() < surface.get_external_radius()) { Vector3 normal = surface.get_curve().normal(origin); if (local.direction().z() < 0) { normal = normal.negate(); } result.add_intercepted(surface, ray); TracedRay cray = trace_ray(surface, m, result, ray, local, new Vector3Pair(origin, normal)); if (cray != null) { rays.Add(cray); } } } } return(rays); }