00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "LampBasic.h"
00026 #include "Framework/Utility/FirstPersonCameraController.h"
00027 #include "Graphics/Camera/Camera.h"
00028
00029 namespace Lamp{
00030
00031
00032
00033 FirstPersonCameraController::FirstPersonCameraController(){
00034 camera_ = NULL;
00035 cameraPosition_ = Vector3::zero;
00036 cameraRotation_ = Vector3::zero;
00037 fovY_ = 60.f;
00038 cameraPositionSensibility_ = 0.05f;
00039 cameraRotationSensibility_ = 0.005f;
00040 keyboardSensibility_ = 25.f;
00041 mouseXPosition_ = 0;
00042 mouseYPosition_ = 0;
00043 }
00044
00045
00046 FirstPersonCameraController::~FirstPersonCameraController(){
00047 }
00048
00049
00050 void FirstPersonCameraController::setup(
00051 float nearClip, float farClip, float aspect){
00052 if(camera_ == NULL){ return; }
00053 camera_->setPerspectiveFovY(
00054 Math::toRadian(fovY_), aspect, nearClip, farClip);
00055 camera_->setTransformation(cameraRotation_, cameraPosition_);
00056 informationString_.format(
00057 "pos { %.1f, %.1f, %.1f } rot { %.1f, %.1f, %.1f } "
00058 "near %.1f far %.1f fovY %.1f aspect %.2f",
00059 cameraPosition_.x, cameraPosition_.y, cameraPosition_.z,
00060 cameraRotation_.x, cameraRotation_.y, cameraRotation_.z,
00061 nearClip, farClip, fovY_, aspect);
00062 }
00063
00064
00065 LRESULT FirstPersonCameraController::windowProcedure(
00066 HWND windowHandle, u_int message, WPARAM wParam, LPARAM lParam){
00067 if(camera_ == NULL){ return 0; }
00068 bool cameraChanged = false;
00069 Vector3 cameraAddRotation(0.f, 0.f, 0.f);
00070 Vector3 cameraAddTranslation(0.f, 0.f, 0.f);
00071 switch(message){
00072
00073 case WM_KEYDOWN:
00074 switch(wParam){
00075 case 'F':
00076 cameraAddTranslation.x += cameraPositionSensibility_;
00077 cameraChanged = true;
00078 break;
00079 case 'S':
00080 cameraAddTranslation.x -= cameraPositionSensibility_;
00081 cameraChanged = true;
00082 break;
00083 case 'R':
00084 cameraAddTranslation.y += cameraPositionSensibility_;
00085 cameraChanged = true;
00086 break;
00087 case 'V':
00088 cameraAddTranslation.y -= cameraPositionSensibility_;
00089 cameraChanged = true;
00090 break;
00091 case 'D':
00092 cameraAddTranslation.z += cameraPositionSensibility_;
00093 cameraChanged = true;
00094 break;
00095 case 'E':
00096 cameraAddTranslation.z -= cameraPositionSensibility_;
00097 cameraChanged = true;
00098 break;
00099 }
00100 if(cameraChanged){
00101 cameraAddTranslation *= keyboardSensibility_;
00102 if(::GetKeyState(VK_SHIFT) < 0){ cameraAddTranslation *= 0.1f; }
00103 Matrix33 rotationMatrix;
00104 rotationMatrix.setRotationXYZ(cameraRotation_);
00105 cameraAddTranslation = rotationMatrix * cameraAddTranslation;
00106 cameraPosition_ += cameraAddTranslation;
00107 }
00108 break;
00109 case WM_MOUSEWHEEL:
00110 {
00111 int wheelMove = (int)(((short)HIWORD(wParam)) / WHEEL_DELTA);
00112 fovY_ += wheelMove * -3.f;
00113 if(fovY_ > 179.f){ fovY_ = 179.f; }
00114 else if(fovY_ < 1.f){ fovY_ = 1.f; }
00115 break;
00116 }
00117 case WM_MOUSEMOVE:
00118
00119 u_int xPosition = LOWORD(lParam);
00120 u_int yPosition = HIWORD(lParam);
00121 int xPositionDistance = xPosition - mouseXPosition_;
00122 int yPositionDistance = yPosition - mouseYPosition_;
00123 if((xPositionDistance == 0) && (yPositionDistance == 0)){ break; }
00124
00125 bool shift = ((wParam & MK_SHIFT) != 0);
00126 if((wParam & MK_LBUTTON) != 0){
00127 float xDistance = xPositionDistance * cameraRotationSensibility_;
00128 float yDistance = yPositionDistance * cameraRotationSensibility_;
00129 cameraAddRotation.x += -yDistance;
00130 cameraAddRotation.y += -xDistance;
00131 cameraChanged = true;
00132 }else if((wParam & MK_RBUTTON) != 0){
00133 float xDistance = xPositionDistance * cameraPositionSensibility_;
00134 float yDistance = yPositionDistance * cameraPositionSensibility_;
00135 if(shift){
00136 cameraAddTranslation.x += xDistance;
00137 cameraAddTranslation.z += yDistance;
00138 }else{
00139 cameraAddTranslation.x += xDistance;
00140 cameraAddTranslation.y += -yDistance;
00141 }
00142 cameraChanged = true;
00143 }
00144 mouseXPosition_ = xPosition;
00145 mouseYPosition_ = yPosition;
00146 if(cameraChanged){
00147
00148 cameraRotation_ += cameraAddRotation;
00149 Matrix33 rotationMatrix;
00150 rotationMatrix.setRotationXYZ(cameraRotation_);
00151 cameraAddTranslation = rotationMatrix * cameraAddTranslation;
00152 cameraPosition_ += cameraAddTranslation;
00153 }
00154 break;
00155 }
00156 return 0;
00157 }
00158
00159 }
00160