Vector3d Camera::getFocusPoint( float distance, float longitude, float latitude ) { // Get point coordinates storeCamera(tCam); setFocusPosition(-distance, longitude, latitude, 0.); Vector3d focus = position - tCam.position; if( focus==Vector3d(0., 0., 0.) ) { restoreCamera(tCam); return tCam.eye; } focus.normalize(); restoreCamera(tCam); return focus; }
void Camera::step() { switch( cType ) { case ROTATE: // Apply angle change with constant acceleration/deceleration float cAngle; if( !cAccel.getPosition(cAngle) ) { stop(); // Ensure final direction is accurate vEye = finalV; setVUp(); setVRight(); setMatrix(); } else { restoreCamera(tCam); vEye.rotate(rotV, cAngle); vEye.normalize(); vUp.rotate(rotV, cAngle); vUp.normalize(); setVRight(); setMatrix(); } break; case REVOLVE: /// TODO /// STUB break; case MOVE: float distance; if( !cAccel.getPosition(distance) ) { stop(); position = finalPos; } else position = tCam.position + moveV*distance; break; default: position += momentum; break; } }
BeingId NpcHandler::getNpc(Net::MessageIn &msg) { if (msg.getId() == SMSG_NPC_CHOICE || msg.getId() == SMSG_NPC_MESSAGE || msg.getId() == SMSG_NPC_CHANGETITLE) { msg.readInt16("len"); } const BeingId npcId = msg.readBeingId("npc id"); const NpcDialogs::const_iterator diag = NpcDialog::mNpcDialogs.find(npcId); mDialog = nullptr; if (diag == NpcDialog::mNpcDialogs.end()) { // Empty dialogs don't help if (msg.getId() == SMSG_NPC_CLOSE) { closeDialog(npcId); return npcId; } else if (msg.getId() == SMSG_NPC_NEXT) { nextDialog(npcId); return npcId; } else { mDialog = new NpcDialog(npcId); mDialog->postInit(); mDialog->saveCamera(); if (localPlayer) localPlayer->stopWalking(false); NpcDialog::mNpcDialogs[npcId] = mDialog; } } else { NpcDialog *const dialog = diag->second; if (mDialog && mDialog != dialog) mDialog->restoreCamera(); mDialog = dialog; if (mDialog) mDialog->saveCamera(); } return npcId; }
bool Camera::pollEvent( SDL_Event *event ) // This should be called at regular intervals to avoid key-response lag { if( !SDL_PollEvent(event) ) { if( event->type==SDL_QUIT ) exit(0); if( event->type!=SDL_KEYDOWN ) { step(); return false; } } switch( event->key.keysym.sym ) { case SDLK_LEFT: if( event->key.keysym.mod & KMOD_SHIFT ) revolveLeft(); else if( event->key.keysym.mod & KMOD_CTRL ) rotateCW(); else if( event->key.keysym.mod & KMOD_ALT ) accelerateLeft(accInc); else panLeft(); break; case SDLK_RIGHT: if( event->key.keysym.mod & KMOD_SHIFT ) revolveRight(); else if( event->key.keysym.mod & KMOD_CTRL ) rotateCCW(); else if( event->key.keysym.mod & KMOD_ALT ) accelerateRight(accInc); else panRight(); break; case SDLK_UP: if( event->key.keysym.mod & KMOD_SHIFT ) revolveUp(); else if( event->key.keysym.mod & KMOD_ALT ) accelerateUp(accInc); else panUp(); break; case SDLK_DOWN: if( event->key.keysym.mod & KMOD_SHIFT ) revolveDown(); else if( event->key.keysym.mod & KMOD_ALT ) accelerateDown(accInc); else panDown(); break; case SDLK_f: case SDLK_PERIOD: accelerate(accInc); break; case SDLK_b: case SDLK_COMMA: accelerate(-accInc); break; case SDLK_SPACE: stop(); break; case SDLK_F1: accInc = accel[0]; break; case SDLK_F2: accInc = accel[1]; break; case SDLK_F3: accInc = accel[2]; break; case SDLK_F4: accInc = accel[3]; break; case SDLK_F5: accInc = accel[4]; break; case SDLK_F6: accInc = accel[5]; break; case SDLK_F7: accInc = accel[6]; break; case SDLK_F8: accInc = accel[7]; break; case SDLK_F9: accInc = accel[8]; break; case SDLK_ESCAPE: exit(0); break; case SDLK_TAB: if( event->key.keysym.mod & KMOD_SHIFT ) storeCamera(camStore); else restoreCamera(camStore); stop(); break; default: break; } step(); return true; }
void NpcDialog::closeDialog() { restoreCamera(); npcHandler->closeDialog(mNpcId); }