/*
 *      public FresnelLensRing(Object3dCollection parent, MaterialProperties mprops,
 *                      Scientrace.Location lens_sphere_location, double lens_sphere_radius,
 *                      double lens_sphere_radians_min, double lens_sphere_radians_max,
 *                      Scientrace.UnitVector orientation_from_sphere_center) : base (parent, mprops) {
 *              this.paramInit(lens_sphere_location, lens_sphere_radius, lens_sphere_radians_min, lens_sphere_radians_max, orientation_from_sphere_center);
 *              }
 *
 *      /// <summary>
 *      /// Factory method that creates a new FresnelLensRing based on the properties of another FresnelLensRing
 *      /// but mirrored about the flat plane (flatBottomBorder).
 *      /// </summary>
 *      /// <returns>
 *      /// The new FresnelLensRing
 *      /// </returns>
 *      /// <param name='aFresnelLensRing'>
 *      /// A FresnelLensRing to base the (copied) properties upon.
 *      /// </param>
 *      public static FresnelLensRing newOppositeDirectionRing(FresnelLensRing aFresnelLensRing) {
 *              Object3dCollection parent = aFresnelLensRing.parent;
 *              MaterialProperties mprops = aFresnelLensRing.materialproperties;
 *              Scientrace.Location lens_sphere_location = aFresnelLensRing.sphereLoc + (aFresnelLensRing.orientation*aFresnelLensRing.getDistanceToPlanoCenter()*2);
 *              double lens_sphere_radius = aFresnelLensRing.sphereRadius;
 *              double lens_sphere_radians_min = aFresnelLensRing.radiansMin;
 *              double lens_sphere_radians_max = aFresnelLensRing.radiansMax;
 *              Scientrace.UnitVector orientation_from_sphere_center = aFresnelLensRing.orientation.negative();
 *              return new FresnelLensRing(parent, mprops, lens_sphere_location, lens_sphere_radius, lens_sphere_radians_min, lens_sphere_radians_max, orientation_from_sphere_center);
 *              } */

        public FresnelLensRing(ShadowScientrace.ShadowObject3d shadowObject) : base(shadowObject)
        {
            switch (shadowObject.factory_id)
            {
            case "SphereCenterAndRadians": this.shadowFac_SphereCenter_And_Radians(shadowObject);
                break;

            case "PlanoCenterAndRadians": this.shadowFac_PlanoCenter_And_Radians(shadowObject);
                break;

            default:
                throw new ArgumentOutOfRangeException("Factory method {" + shadowObject.factory_id + "} not found for " + shadowObject.typeString());
            }

            //General stuff:
            this.x3dCurvedSegments = shadowObject.getInt("draw_3d_segment_linecount", this.x3dCurvedSegments);
        }