示例#1
0
/* function to handle key press events */
void handleKeyPress( SDL_keysym *keysym )
{
	VERTEX tvec1, tvec2, fr, fl, bl, br, camray, selvert;
	QUATERNION trot;
	BEZIER * lastbez;
	BEZIER * colbez;
	ROADSTRIP * tempstrip;
	BEZIER patch;
	bool l;
	int i;
	string tstr;
	
	//else if (timefactor == 0 && !menu.InMenu()) timefactor = 0;
		//		else timefactor = 1.0;
//	else
	{
		switch ( keysym->sym )
		{
		case SDLK_ESCAPE:
			/* ESC key was pressed */
			Quit( 0 );
			//menu.MainMenu();
			break;
		/*case SDLK_F7:
			
			tvec1 = tvec1.rotate(0,0,6.21652);
			cout << tvec1[0] << "," << tvec1[1] << endl;
		
			
			tvec2.Set(44.464,-126.8737,0);
			
			trot.Rotate(6.21652, 0, 0, 1);
			tvec2 = trot.RotateVec(tvec2);
			tvec2.DebugPrint();
			break;*/
		/*case SDLK_F7:
			if (timefactor != 100.0f)
				timefactor = 100.0f;
			else
				timefactor = 1.0f;
			break;*/
		/*case SDLK_PAGEUP:
			//tmpvert = cam.GetVelocity();
			cam.MoveRelative(0.0f, 0.0f, -2.0f);
			//cam.Update();
			//cam.LoadVelocityIdentity();
			break;
		case SDLK_PAGEDOWN:
			//tmpvert = cam.GetVelocity();
			cam.MoveRelative(0.0f, 0.0f, 2.0f);
			//cam.Update();
			//cam.LoadVelocityIdentity();
			break;*/
			
		case SDLK_BACKSPACE:
			if (activestrip != NULL)
			{
				if (activestrip->DeleteLastPatch())
				{
					if (activestrip->NumPatches() == 0)
					{
						mq1.AddMessage("Deleted patch and empty road");
						track.Delete(activestrip);
						activestrip = NULL;
						editordata.numbezinput = 0;
					}
					else
					{
						mq1.AddMessage("Deleted patch");
						lastbez = activestrip->GetLastPatch();
						if (lastbez != NULL)
						{
							editordata.bezinput[0] = lastbez->points[0][0];
							editordata.bezinput[1] = lastbez->points[0][1];
							editordata.bezinput[2] = lastbez->points[0][2];
							editordata.bezinput[3] = lastbez->points[0][3];
						}
						else
							editordata.numbezinput = 0;
					}
				}
				else
					mq1.AddMessage("Can't delete patch: no patches on this road");
			}
			else
			{
				mq1.AddMessage("Can't delete patch: no road selected");
			}
			break;
			
		case 'h':
			editordata.helppage++;
			break;
		
		case 'd':
			if (activestrip != NULL)
			{
				track.Delete(activestrip);
				mq1.AddMessage("Deleted road.");
			}
			else
			{
				mq1.AddMessage("Can't delete road: no road selected.");
			}
			activestrip = NULL;
			editordata.numbezinput = 0;
			break;
		
		case 'n':
			//create a new road
			mq1.AddMessage("Ready to create new road, add patches.");
			activestrip = NULL;
			editordata.numbezinput = 0;
			break;
			
		case 's':
			mq1.AddMessage("Saved to file");
			track.Write(editordata.activetrack);
			break;
		
		case 'l':
			track.SetStart(cam.position.ScaleR(-1));
			track.SetStartOrientation(cam.dir.ReturnConjugate());
			mq1.AddMessage("Added start location");
			break;
		
		case 'k':
			track.RemoveStart();
			track.RemoveStartOrientation();
			mq1.AddMessage("Removed start location");
			break;
		
		case 'r':
			//mq1.AddMessage("Saved to file");
			tvec1.zero();
			tvec1.z = -1;
			tvec2 = cam.dir.ReturnConjugate().RotateVec(tvec1);
			l = track.Collide(cam.position.ScaleR(-1.0), tvec2, tvec1, true, activestrip, colbez);
			if (!l)
			{
				mq1.AddMessage("Can't select road: no road found under cursor");
			}
			break;
		
		case 'a':
			AutoTrace();
			break;
			
		case 'f':
			for (i = 0; i < 25; i++)
			{
				AutoTrace();
			}
			break;
		
		case 'i':
			camray.z = -1;
			camray = cam.dir.ReturnConjugate().RotateVec(camray);
			if (objects.FindClosestVert(cam.position.ScaleR(-1.0), camray, selvert, tstr))
				cout << tstr << endl;
			break;
			
		case '-':
			track.ClearLapSequence();
			mq1.AddMessage("All lap sequence markers cleared");
			break;
		
		case 'e':
			//mq1.AddMessage("Saved to file");
			tvec1.zero();
			tvec1.z = -1;
			tvec2 = cam.dir.ReturnConjugate().RotateVec(tvec1);
			l = track.Collide(cam.position.ScaleR(-1.0), tvec2, tvec1, true, tempstrip, colbez);
			if (!l)
			{
				mq1.AddMessage("Can't create lap sequence marker: no road found under cursor");
			}
			else
			{
				track.AddLapSequence(colbez);
			}
			break;
			
		case '2':
			mq1.AddMessage("Two-vertex selection mode");
			vertmode = TWOVERTS;
			break;
			
		case '3':
			mq1.AddMessage("Three-vertex selection mode");
			vertmode = THREEVERTS;
			break;
			
		case '4':
			mq1.AddMessage("Four-vertex selection mode");
			vertmode = FOURVERTS;
			break;
		
		//case SDLK_F11:
			//SDL_WM_ToggleFullScreen( surface );
			//ChangeDisplay(1280,1024,32,true);
			//menu.DisplayMenu();//DisplaySelect();
			//break;
		
		//case SDLK_F12:
			//menu.MainMenu();
			//break;
		
		default:
			keyman.OneTime(keysym->sym);
			break;
		}
	}
	
    return;
}