Пример #1
0
static int tmain(int argc, char **argv) {
	if(argc>=2 && string("--help") == argv[1]) {
		PrintHelp();
		return 0;
	}

	CameraConfigs camConfigs;
	try { Loader("scenes/cameras.dat") & camConfigs; } catch(...) { }

	int resx = 1024, resy = 1024;
	bool fullscreen = 0;
	int threads = 2;
	string sceneName = "/mnt/data/volumes/zatoki/dicom/";

	bool flipNormals = 1, swapYZ = 0;
	string texPath = "";
	int rebuild = 0, buildFlags = 8;

	int nInstances = 1;
	int nPlanes = 256;

	for(int n = 1; n < argc; n++) {
			 if(string("-res") == argv[n] && n < argc-2) { resx = atoi(argv[n+1]); resy = atoi(argv[n+2]); n += 2; }
		else if(string("-rebuild") == argv[n]) rebuild = 1;
		else if(string("-threads") == argv[n] && n < argc - 1) { threads = atoi(argv[n + 1]); n += 1; }
		else if(string("-fullscreen") == argv[n]) fullscreen = 1;
		else if(string("-flipNormals") == argv[n]) flipNormals = 0;
		else if(string("-swapYZ") == argv[n]) swapYZ = 1;
		else if(string("-noDump") == argv[n]) buildFlags &= ~8;
		else if(string("-instances") == argv[n]) { nInstances = atoi(argv[n + 1]); n += 1; }
		else {
			if(argv[n][0] == '-') {
				printf("Unknown option: %s\n",argv[n]);
				exit(0);
			}
			else sceneName = argv[n];
		}
	}
	
	if(texPath == "") {
		texPath = "scenes/" + sceneName;
		int pos = texPath.rfind('/');
		if(pos == string::npos) texPath = "";
		else texPath.resize(pos + 1);
	}

	float sceneScale = 1.0f;
	Vec3f sceneCenter(0, 0, 0);

	GLWindow window(resx, resy, fullscreen);
	window.SetTitle("Volume viewer v 0.002");
	Font font;
			
		bool lightsEnabled = 1;
	bool staticEnabled = 0, orbiting = true;
	float speed = 10.0f;

	{
		VolumeData volume;
		volume.LoadDicom(sceneName.c_str());

		sceneCenter = Vec3f(volume.width, volume.height, volume.depth) * 0.5f;
		sceneScale = Length(sceneCenter) * 2.0f;

		printf("\nUploading data (%d, %d, %d) to GPU: ", volume.width, volume.height, volume.depth);
		fflush(stdout);
		double uploadTime = GetTime();
		uploadTime = GetTime() - uploadTime;
		Load3dTexture(volume);
		printf("%.2f msec\n", uploadTime * 1000.0);
	}
	
	FPSCamera cam;
	if(!camConfigs.GetConfig(string(sceneName),cam))
		cam.SetPos(sceneCenter);
	OrbitingCamera ocam;
	ocam.Reset(sceneCenter, sceneScale);


	FrameCounter frmCounter;
	float lastFrameTime = 0.0f;
	double lastTime = GetTime();

	while(window.PollEvents()) {
		frmCounter.NextFrame();

		if(window.KeyUp(Key_esc)) break;

		if(window.KeyDown('C')) {
			if(orbiting) ocam.Reset(sceneCenter, sceneScale);
			else cam.SetPos(sceneCenter);
			cam.ang = 0;
			cam.pitch = 0;
		}
		if(window.KeyDown('P')) {
			camConfigs.AddConfig(string(sceneName),cam);
			Saver("cameras.dat") & camConfigs;
			cam.Print();
		}
		if(window.KeyDown('O')) {
			if(orbiting) cam.SetPos(ocam.pos);
			else ocam.Reset(cam.pos, -sceneScale);
			orbiting ^= 1;
			printf("Orbiting: %s\n", orbiting? "true" : "false");
		}
		if(window.KeyDown('P')) {
			camConfigs.AddConfig(string(sceneName),cam);
			Saver("scenes/cameras.dat") & camConfigs;
			cam.Print();
		}

		float tspeed = speed * lastFrameTime * 20.0f;
		lastFrameTime = GetTime() - lastTime;
		lastTime = GetTime();

		if(orbiting)
			MoveCamera(ocam, window, tspeed);
		else
			MoveCamera(cam, window, tspeed);

		for(int n = 1; n <= 8; n++) if(window.KeyDown('0' + n))
				{ threads = n; printf("Threads: %d\n", threads); }

		if(window.KeyDown(Key_f1)) nPlanes *= 2;
		if(window.KeyDown(Key_f2)) nPlanes /= 2;
		if(window.KeyDown(Key_f2)) { gVals[1]^=1; printf("Val 1 %s\n", gVals[1]?"on" : "off"); }
		if(window.KeyDown(Key_f3)) { gVals[2]^=1; printf("Val 2 %s\n", gVals[2]?"on" : "off"); }
		if(window.KeyDown(Key_f4)) { gVals[3]^=1; printf("Photons visible %s\n", gVals[3]?"on" : "off"); }
		if(window.KeyDown(Key_f5)) { gVals[4]^=1; printf("Photon tracing %s\n", gVals[4]?"on" : "off"); }
		if(window.KeyDown(Key_f6)) { gVals[5]^=1; printf("Scene complexity visualization %s\n",gVals[5]?"on":"off"); }
		if(window.KeyDown(Key_f7)) { gVals[6]^=1; printf("Advanced shading %s\n",gVals[6]?"on":"off"); }
		if(window.KeyDown(Key_f8)) { gVals[7]^=1; printf("Reflections 7 %s\n",gVals[7]?"on":"off"); }
		if(window.KeyDown(Key_f9)) { gVals[8]^=1; printf("Node tasks visualization 8 %s\n",gVals[8]?"on":"off"); }
		if(window.KeyDown(Key_f10)) { gVals[9]^=1; printf("Antialiasing 4x %s\n",gVals[9]?"on":"off"); }
		if(window.KeyDown(Key_f1)) { gVals[0]^=1; printf("Traversing from 8x8: %s\n", gVals[0]?"on" : "off"); }

		nPlanes = Clamp(nPlanes, 16, 2048);

		static float animPos = 0;
		if(window.Key(Key_space)) animPos+=0.025f;

		double time = GetTime(); 
		Camera camera = orbiting?(Camera)ocam : (Camera)cam;

		time = GetTime() - time;

		RenderVolume(camera, float(resx) / resy, nPlanes);

		double fps = double(unsigned(frmCounter.FPS() * 100)) * 0.01;

		font.BeginDrawing(resx,resy);
		font.SetSize(Vec2f(30, 20));
		font.PrintAt(Vec2f(5, 25), "FPS: ", fps, "  Planes: ", nPlanes);

		font.FinishDrawing();
		window.SwapBuffers();
	}

	return 0;
}