Ejemplo n.º 1
0
int main(int argc, char *argv[])
{
	initTracer();
	scene *curscene = sceneLoad();
	TGAFILE *tga = openTGA(curscene);

	clock_t start = clock();

	int i, j;

	for (j = 0; j < (int)curscene->resolution; j++)
	{
		printf("Scanning horizontal line %d.\n", j);

		for (i = 0; i < (int)curscene->resolution; i++)
		{
			vector color = pixelraytrace(curscene, i, j);
			writeTGAColor(tga, curscene, i, j, color.x, color.y, color.z);
		}
	}

	clock_t end = clock();

	printf("Entire process took %.4f seconds.\n", ((double)(end - start)) / CLOCKS_PER_SEC);

	sceneFree(curscene);
	closeTGA(tga);

	return 0;
}
Ejemplo n.º 2
0
int main(int argc, char *argv[])
{
	initTracer();

	int i;
	int rank, size;
	scene *curscene;
	int res;
	TGAFILE* tga = NULL;
	vector *scanline;
	MPI_Status status;

	MPI_Init(&argc, &argv);
	MPI_Comm_rank(MPI_COMM_WORLD, &rank);
	MPI_Comm_size(MPI_COMM_WORLD, &size);

	if (rank == 0) {
		curscene = sceneLoad();
		tga = openTGA(curscene);
	} else
		curscene = calloc(1, sizeof(scene));

	MPI_Bcast((void*)curscene, sizeof(scene) / sizeof(float), MPI_FLOAT, 0, MPI_COMM_WORLD);

	res = sceneResolution(curscene);
	scanline = calloc(res, sizeof(vector));
	int line = 0;
	float aaweight = 1.0f / size;

	for (line = 0; line < res; line++) {
		if (rank == size - 1) {
			printf("Starting scan of horizontal line %d.\n", line);
		} else {
			MPI_Recv(scanline, (sizeof(vector) / sizeof(float)) * res, MPI_FLOAT, rank + 1, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
		}

		for (i = 0; i <res; i++)
		{
			if (rank == size - 1)
				scanline[i] = smul(pixelraytraceaa(curscene, line, i, rank), aaweight);
			else
				scanline[i] = add(scanline[i], smul(pixelraytraceaa(curscene, line, i, rank), aaweight));
		}

		if (rank == 0) {
			for (i = 0; i < res; i++)
				writeTGAColor(tga, curscene, line, i, scanline[i].x, scanline[i].y, scanline[i].z);
		} else {
			MPI_Send(scanline, (sizeof(vector) / sizeof(float)) * res, MPI_FLOAT, rank - 1, 0, MPI_COMM_WORLD);
		}
	}

	free(curscene);

	MPI_Finalize();

	return 0;
}
Ejemplo n.º 3
0
void dumpTGA(const Common::UString &fileName, const ImageDecoder *image) {
	if (!image || (image->getLayerCount() < 1) || (image->getMipMapCount() < 1))
		throw Common::Exception("No image");

	int32 width  = image->getMipMap(0, 0).width;
	int32 height = 0;

	for (size_t i = 0; i < image->getLayerCount(); i++) {
		const ImageDecoder::MipMap &mipMap = image->getMipMap(0, i);

		if (mipMap.width != width)
			throw Common::Exception("dumpTGA(): Unsupported image with variable layer width");

		height += mipMap.height;
	}

	Common::ScopedPtr<Common::WriteStream> file(openTGA(fileName, width, height));

	for (size_t i = 0; i < image->getLayerCount(); i++)
		writeMipMap(*file, image->getMipMap(0, i), image->getFormat());

	file->flush();
}
Ejemplo n.º 4
0
int main(int argc, char *argv[])
{
	initTracer();

	int i, p;
	int rank, size;
	scene *curscene;
	int res;
	TGAFILE* tga = NULL;
	vector *scanline;
	MPI_Status status;

	MPI_Init(&argc, &argv);
	MPI_Comm_rank(MPI_COMM_WORLD, &rank);
	MPI_Comm_size(MPI_COMM_WORLD, &size);

	if (rank == 0) {
		curscene = sceneLoad();
		tga = openTGA(curscene);
	} else
		curscene = calloc(1, sizeof(scene));

	double start, end;
	start = MPI_Wtime();

	MPI_Bcast((void*)curscene, sizeof(scene) / sizeof(float), MPI_FLOAT, 0, MPI_COMM_WORLD);

	res = sceneResolution(curscene);
	scanline = calloc(res, sizeof(vector));

	if (rank == 0) {
		int lastline = 0;
		int waiting = res;

		for (lastline = 0; lastline < size - 1; lastline++) {
			MPI_Send(&lastline, 1, MPI_INT, lastline + 1, 0, MPI_COMM_WORLD);
		}

		int flag;

		while(1) {
			if (waiting == 0)
				break;

			MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status);
			if (flag) {
				MPI_Recv(scanline, (sizeof(vector) / sizeof(float)) * res, MPI_FLOAT, status.MPI_SOURCE, status.MPI_TAG, MPI_COMM_WORLD, &status);

				if (lastline < res) {
					MPI_Send(&lastline, 1, MPI_INT, status.MPI_SOURCE, 0, MPI_COMM_WORLD);
					lastline++;
				}

				for (i = 0; i < res; i++)
					writeTGAColor(tga, curscene, status.MPI_TAG, i, scanline[i].x, scanline[i].y, scanline[i].z);

				waiting--;
			}
		}

		flag = -1;
		for (p = 1; p < size; p++) {
			MPI_Send(&flag, 1, MPI_INT, p, 0, MPI_COMM_WORLD);
		}

	} else {
		int line;

		while(1) {
			MPI_Recv(&line, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);

			if (line < 0) {
				break;
			}

			printf("Process %d scanning horizontal line %d.\n", rank, line);

			for (i = 0; i < res; i++)
				scanline[i] = pixelraytrace(curscene, line, i);

			MPI_Send(scanline, (sizeof(vector) / sizeof(float)) * res, MPI_FLOAT, 0, line, MPI_COMM_WORLD);
		}
	}

	free(curscene);

	end = MPI_Wtime();

	if (rank == 0)
		printf("Entire process took %.4f seconds.\n", end - start);

	MPI_Finalize();

	return 0;
}