/// <summary> /// /// </summary> /// <param name="o2w"></param> /// <param name="w2o"></param> /// <param name="ro"></param> public IShape (Transform o2w, Transform w2o, bool ro) { this.ObjectToWorld = new Transform (o2w); this.WorldToObject = new Transform (w2o); this.ReverseOrientation = ro; this.ShapeID = NextShapeID++; }
/// <summary> /// /// </summary> /// <param name="o2w"></param> /// <param name="w2o"></param> /// <param name="ro"></param> /// <param name="height"></param> /// <param name="radius"></param> /// <param name="innerRadius"></param> /// <param name="phiMax"></param> public Disk(Transform o2w, Transform w2o, bool ro, double height, double radius, double innerRadius, double phiMax) : base(o2w, w2o, ro) { this.height = height; this.radius = radius; this.innerRadius = innerRadius; this.phiMax = phiMax; }
/// <summary> /// /// </summary> /// <param name="dg"></param> /// <param name="objectToWorld"></param> /// <returns></returns> public abstract BSSRDF GetBSSRDF (DifferentialGeometry dg, Transform objectToWorld);
/// <summary> /// /// </summary> /// <param name="dg"></param> /// <param name="objectToWorld"></param> /// <returns></returns> public abstract Task<BSDF> GetBSDFAsync (DifferentialGeometry dg, Transform objectToWorld);
/// <summary> /// /// </summary> /// <param name="l2w"></param> /// <param name="ns"></param> protected ILight(Transform l2w, int ns = 1) { this.NumberOfSamples = ns; this.LightToWorld = new Transform (l2w); this.WorldToLight = new Transform (l2w.Inverse); }
/// <summary> /// /// </summary> /// <param name="transform"></param> public Transform(Transform transform) : this(transform.Matrix, transform.InverseMatrix) { }
public override bool Intersect(Ray r, out double tHit, out double rayEpsilon, DifferentialGeometry dg) { tHit = 0.0; rayEpsilon = 0.0; var ray = new Ray (); this.WorldToObject.Apply (r, ref ray); if (Math.Abs (ray.Direction.z) < 1e-7) return false; var thit = (height - ray.Origin.z) / ray.Direction.z; if (thit < ray.MinT || thit > ray.MaxT) return false; var phit = ray.Apply (thit); var dist2 = phit.x * phit.x + phit.y * phit.y; if (dist2 > radius * radius || dist2 < innerRadius * innerRadius) return false; var phi = Math.Atan2 (phit.y, phit.x); if (phi < 0) phi += 2.0 * Math.PI; if (phi > phiMax) return false; var u = phi / phiMax; var oneMinusV = ((Math.Sqrt (dist2) - innerRadius) / (radius - innerRadius)); var invOneMinusV = (oneMinusV > 0.0) ? (1.0 / oneMinusV) : 0.0; var v = 1.0 - oneMinusV; var dpdu = new Vector (-phiMax * phit.y, phiMax * phit.x, 0.0); var dpdv = new Vector (-phit.x * invOneMinusV, -phit.y * invOneMinusV, 0.0); dpdu *= phiMax * Util.InvTwoPI; dpdv *= (radius - innerRadius) / radius; var dndu = new Normal (0, 0, 0); var dndv = new Normal (0, 0, 0); var o2w = new Transform (this.ObjectToWorld); dg = new DifferentialGeometry (o2w.Apply (phit), null, null, o2w.Apply (dndu), o2w.Apply (dndv), u, v, this); tHit = thit; rayEpsilon = 5e-4 * tHit; return true; }
public static IShape CreateDiskShape(Transform o2w, Transform w2o, bool reverseOrientation, ParameterSet parameters) { var height = parameters.FindOneDouble ("height", 0.0); var radius = parameters.FindOneDouble ("radius", 1.0); var innerRadius = parameters.FindOneDouble ("innerradius", 0.0); var phimax = parameters.FindOneDouble ("phimax", 360.0); return new Disk (o2w, w2o, reverseOrientation, height, radius, innerRadius, phimax); }
/// <summary> /// /// </summary> /// <param name="name"></param> /// <param name="objectToWorld"></param> /// <param name="worldToObject"></param> /// <param name="reverseOrientation"></param> /// <param name="parameters"></param> /// <param name="floatTextures"></param> /// <param name="spectrumTextures"></param> /// <returns></returns> public static IShape CreateShape(string name, Transform objectToWorld, Transform worldToObject, bool reverseOrientation, ParameterSet parameters, Dictionary<string, ITexture<double>> floatTextures, Dictionary<string, ITexture<Spectrum>> spectrumTextures) { var plugin = new ShapePlugin (name); return plugin.CreateShape (objectToWorld, worldToObject, reverseOrientation, parameters, floatTextures, spectrumTextures); }