/* 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; }