Ejemplo n.º 1
0
		public static void Main (String[] argv, ILog ilog)
		{
			logger = ilog;
			RayTracer rt = new RayTracer ();

			rt.size = 0;
			rt.width = rt.datasizes [rt.size];
			rt.height = rt.datasizes [rt.size];

			// create the objects to be rendered 
			rt.scene = rt.createScene ();

			// get lights, objects etc. from scene. 
			rt.setScene (rt.scene);

			rt.numobjects = rt.scene.Objects.Count;

			// Set interval to be rendered to the whole picture 
			// (overkill, but will be useful to retain this for parallel versions)
			Interval interval = new Interval (0, rt.width, rt.height, 0, rt.height, 1);

			// Do the business!
			rt.render (interval);

			rt.validate ();
		}
Ejemplo n.º 2
0
		public void render (Interval interval)
		{
			int[] row = new int[interval.width * (interval.yto - interval.yfrom)];
			int pixCounter = 0; //iterator

			int x, y, red, green, blue;
			double xlen, ylen;
			Vec viewVec;

			viewVec = Vec.sub (view.at, view.from);

			viewVec.normalize ();

			Vec tmpVec = new Vec (viewVec);
			tmpVec.scale (Vec.dot (view.up, viewVec));

			Vec upVec = Vec.sub (view.up, tmpVec);
			upVec.normalize ();

			Vec leftVec = Vec.cross (view.up, viewVec);
			leftVec.normalize ();

			double frustrumwidth = view.dist * Math.Tan (view.angle);

			upVec.scale (-frustrumwidth);
			leftVec.scale (view.aspect * frustrumwidth);

			Ray r = new Ray (view.from, voidVec);
			Vec col = new Vec ();

			// For each line
			for (y = interval.yfrom; y < interval.yto; y++) {
				ylen = (double)(2.0 * y) / (double)interval.width - 1.0;
				for (x = 0; x < interval.width; x++) {
					xlen = (double)(2.0 * x) / (double)interval.width - 1.0;
					r.D = Vec.comb (xlen, leftVec, ylen, upVec);
					r.D.add (viewVec);
					r.D.normalize ();
					col = trace (0, 1.0, r);

					// computes the color of the ray
					red = (int)(col.x * 255.0);
					if (red > 255)
						red = 255;
					green = (int)(col.y * 255.0);
					if (green > 255)
						green = 255;
					blue = (int)(col.z * 255.0);
					if (blue > 255)
						blue = 255;

					checksum += red;
					checksum += green;
					checksum += blue;

					// Sets the pixels
					row [pixCounter] = alpha | (red << 16) | (green << 8) | (blue);
					pixCounter++;
				}
			}

		}