Beispiel #1
0
		/// <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++;
		}
Beispiel #2
0
 /// <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;
 }
Beispiel #3
0
		/// <summary>
		/// 
		/// </summary>
		/// <param name="dg"></param>
		/// <param name="objectToWorld"></param>
		/// <returns></returns>
		public abstract BSSRDF GetBSSRDF (DifferentialGeometry dg, Transform objectToWorld);
Beispiel #4
0
		/// <summary>
		/// 
		/// </summary>
		/// <param name="dg"></param>
		/// <param name="objectToWorld"></param>
		/// <returns></returns>
		public abstract Task<BSDF> GetBSDFAsync (DifferentialGeometry dg, Transform objectToWorld);
Beispiel #5
0
 /// <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);
 }
Beispiel #6
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="transform"></param>
 public Transform(Transform transform)
     : this(transform.Matrix, transform.InverseMatrix)
 {
 }
Beispiel #7
0
        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;
        }
Beispiel #8
0
        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);
        }
Beispiel #9
0
 /// <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);
 }