void WASDCameraController::Input(UIEvent * event) { if (currScene == 0) return; Camera * camera = currScene->GetCurrentCamera(); if (!camera)return; if (event->phase == UIEvent::PHASE_KEYCHAR) { if(!IsKeyModificatorsPressed()) { switch (event->tid) { case DVKEY_Z: { LookAtSelection(); break; } case DVKEY_T: { if (!camera)return; viewZAngle = 0; viewYAngle = MAX_ANGLE; Matrix4 mt, mt2; mt.CreateRotation(Vector3(0,0,1), DegToRad(viewZAngle)); mt2.CreateRotation(Vector3(1,0,0), DegToRad(viewYAngle)); mt2 *= mt; Vector3 vect = Vector3(0,0, 200); Vector3 position = vect + Vector3(0, 10, 0) * mt2; camera->SetTarget(position); camera->SetPosition(vect); break; } case DVKEY_1: { EditorSettings::Instance()->SetCameraSpeedIndex(0); SetSpeed(EditorSettings::Instance()->GetCameraSpeed()); break; } case DVKEY_2: { EditorSettings::Instance()->SetCameraSpeedIndex(1); SetSpeed(EditorSettings::Instance()->GetCameraSpeed()); break; } case DVKEY_3: { EditorSettings::Instance()->SetCameraSpeedIndex(2); SetSpeed(EditorSettings::Instance()->GetCameraSpeed()); break; } case DVKEY_4: { EditorSettings::Instance()->SetCameraSpeedIndex(3); SetSpeed(EditorSettings::Instance()->GetCameraSpeed()); break; } case DVKEY_9: { if (speed - 50 >= 0) { speed -= 50; } break; } case DVKEY_0: { if (speed + 50 <= 5000) { speed += 50; } break; } default: break; } } } bool altBut3 = (selection && event->tid == UIEvent::BUTTON_3 && IsKeyModificatorPressed(DVKEY_ALT)); if(UIEvent::PHASE_BEGAN == event->phase) { startPt = stopPt = event->point; if (altBut3) { const Vector3 & pos = camera->GetPosition(); AABBox3 box = selection->GetWTMaximumBoundingBoxSlow(); center = box.GetCenter(); radius = (center - pos).Length(); } } else if(UIEvent::PHASE_DRAG == event->phase || UIEvent::PHASE_ENDED == event->phase) { startPt = stopPt; stopPt = event->point; if (event->tid == UIEvent::BUTTON_2) { UpdateCam2But(camera); } else if (altBut3) { UpdateCamAlt3But(camera); } else if (event->tid == UIEvent::BUTTON_3) { UpdateCam3But(camera); } } }
void WASDCameraController::Update(float32 timeElapsed) { if (currScene == 0) return; UITextField *tf = dynamic_cast<UITextField *>(UIControlSystem::Instance()->GetFocusedControl()); Camera * camera = currScene->GetCurrentCamera(); if(camera != lastCamera) { lastCamera = camera; UpdateAngels(camera); } if(!tf && camera) { float32 moveSpeed = speed * timeElapsed; if(!IsKeyModificatorsPressed()) { bool moveUp = (InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_UP) | InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_W)); if(moveUp) { Vector3 pos = camera->GetPosition(); Vector3 direction = camera->GetDirection(); //Logger::Debug("oldpos: %f %f %f olddir: %f %f %f", pos.x, pos.y, pos.z, direction.x, direction.y, direction.z); direction.Normalize(); pos += direction * moveSpeed; camera->SetPosition(pos); camera->SetDirection(direction); // right now required because camera rebuild direction to target, and if position & target is equal after set position it produce wrong results //Logger::Debug("newpos: %f %f %f", pos.x, pos.y, pos.z); } bool moveLeft = (InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_LEFT) | InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_A)); if(moveLeft) { Vector3 pos = camera->GetPosition(); Vector3 dir = camera->GetDirection(); Vector3 left = camera->GetLeft(); pos -= left * moveSpeed; camera->SetPosition(pos); camera->SetDirection(dir); } bool moveDown = (InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_DOWN) | InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_S)); if(moveDown) { Vector3 pos = camera->GetPosition(); Vector3 direction = camera->GetDirection(); //Logger::Debug("oldpos: %f %f %f olddir: %f %f %f", pos.x, pos.y, pos.z, direction.x, direction.y, direction.z); pos -= direction * moveSpeed; camera->SetPosition(pos); camera->SetDirection(direction); // right now required because camera rebuild direction to target, and if position & target is equal after set position it produce wrong results //Logger::Debug("newpos: %f %f %f olddir: %f %f %f", pos.x, pos.y, pos.z, direction.x, direction.y, direction.z); } bool moveRight = (InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_RIGHT) | InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_D)); if(moveRight) { Vector3 pos = camera->GetPosition(); Vector3 dir = camera->GetDirection(); Vector3 left = camera->GetLeft(); pos += left * moveSpeed; camera->SetPosition(pos); camera->SetDirection(dir); } } } CameraController::Update(timeElapsed); }
bool EditorBodyControl::ProcessKeyboard(UIEvent *event) { if (event->phase == UIEvent::PHASE_KEYCHAR) { UITextField *tf = dynamic_cast<UITextField *>(UIControlSystem::Instance()->GetFocusedControl()); if(!tf) { modificationPanel->Input(event); if(!IsKeyModificatorsPressed()) { Camera * newCamera = 0; switch(event->tid) { case DVKEY_ESCAPE: { UIControl *c = UIControlSystem::Instance()->GetFocusedControl(); if(c == this || c == scene3dView) { SceneData *activeScene = SceneDataManager::Instance()->SceneGetActive(); activeScene->SelectNode(NULL); } break; } case DVKEY_C: newCamera = scene->GetCamera(2); break; case DVKEY_V: newCamera = scene->GetCamera(3); break; case DVKEY_B: newCamera = scene->GetCamera(4); break; case DVKEY_X: { bool Z = InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_Z); bool C = InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_C); if(!Z && !C) { ProcessIsSolidChanging(); } break; } default: break; } if (newCamera) { scene->SetCurrentCamera(newCamera); scene->SetClipCamera(scene->GetCamera(0)); } } else if(InputSystem::Instance()->GetKeyboard()->IsKeyPressed(DVKEY_CTRL) && (event->tid == DVKEY_BACKSPACE)) { sceneGraph->RemoveWorkingNode(); SceneData *activeScene = SceneDataManager::Instance()->SceneGetActive(); activeScene->SelectNode(NULL); activeScene->RebuildSceneGraph(); } } } return true; }