00001 00032 #include "llviewerprecompiledheaders.h" 00033 #include "llviewercontrol.h" 00034 #include "llviewerwindow.h" 00035 #include "llviewercamera.h" 00036 #include "llviewerjoystick.h" 00037 #include "viewer.h" 00038 #include "llkeyboard.h" 00039 00040 static LLQuaternion sFlycamRotation; 00041 static LLVector3 sFlycamPosition; 00042 static F32 sFlycamZoom; 00043 00044 BOOL LLViewerJoystick::sOverrideCamera = FALSE; 00045 00046 void LLViewerJoystick::updateCamera(BOOL reset) 00047 { 00048 static F32 last_delta[] = {0,0,0,0,0,0,0}; 00049 static F32 delta[] = { 0,0,0,0,0,0,0 }; 00050 00051 LLWindow* window = gViewerWindow->getWindow(); 00052 00053 F32 time = gFrameIntervalSeconds; 00054 00055 S32 axis[] = 00056 { 00057 gSavedSettings.getS32("FlycamAxis0"), 00058 gSavedSettings.getS32("FlycamAxis1"), 00059 gSavedSettings.getS32("FlycamAxis2"), 00060 gSavedSettings.getS32("FlycamAxis3"), 00061 gSavedSettings.getS32("FlycamAxis4"), 00062 gSavedSettings.getS32("FlycamAxis5"), 00063 gSavedSettings.getS32("FlycamAxis6") 00064 }; 00065 00066 F32 axis_scale[] = 00067 { 00068 gSavedSettings.getF32("FlycamAxisScale0"), 00069 gSavedSettings.getF32("FlycamAxisScale1"), 00070 gSavedSettings.getF32("FlycamAxisScale2"), 00071 gSavedSettings.getF32("FlycamAxisScale3"), 00072 gSavedSettings.getF32("FlycamAxisScale4"), 00073 gSavedSettings.getF32("FlycamAxisScale5"), 00074 gSavedSettings.getF32("FlycamAxisScale6") 00075 }; 00076 00077 F32 dead_zone[] = 00078 { 00079 gSavedSettings.getF32("FlycamAxisDeadZone0"), 00080 gSavedSettings.getF32("FlycamAxisDeadZone1"), 00081 gSavedSettings.getF32("FlycamAxisDeadZone2"), 00082 gSavedSettings.getF32("FlycamAxisDeadZone3"), 00083 gSavedSettings.getF32("FlycamAxisDeadZone4"), 00084 gSavedSettings.getF32("FlycamAxisDeadZone5"), 00085 gSavedSettings.getF32("FlycamAxisDeadZone6") 00086 }; 00087 00088 if (reset) 00089 { 00090 sFlycamPosition = gCamera->getOrigin(); 00091 sFlycamRotation = gCamera->getQuaternion(); 00092 sFlycamZoom = gCamera->getView(); 00093 00094 for (U32 i = 0; i < 7; i++) 00095 { 00096 last_delta[i] = -window->getJoystickAxis(axis[i]); 00097 delta[i] = 0.f; 00098 } 00099 return; 00100 } 00101 00102 F32 cur_delta[7]; 00103 F32 feather = gSavedSettings.getF32("FlycamFeathering"); 00104 BOOL absolute = gSavedSettings.getBOOL("FlycamAbsolute"); 00105 00106 for (U32 i = 0; i < 7; i++) 00107 { 00108 cur_delta[i] = -window->getJoystickAxis(axis[i]); 00109 F32 tmp = cur_delta[i]; 00110 if (absolute) 00111 { 00112 cur_delta[i] = cur_delta[i] - last_delta[i]; 00113 } 00114 last_delta[i] = tmp; 00115 00116 if (cur_delta[i] > 0) 00117 { 00118 cur_delta[i] = llmax(cur_delta[i]-dead_zone[i], 0.f); 00119 } 00120 else 00121 { 00122 cur_delta[i] = llmin(cur_delta[i]+dead_zone[i], 0.f); 00123 } 00124 cur_delta[i] *= axis_scale[i]; 00125 00126 if (!absolute) 00127 { 00128 cur_delta[i] *= time; 00129 } 00130 00131 delta[i] = delta[i] + (cur_delta[i]-delta[i])*time*feather; 00132 } 00133 00134 sFlycamPosition += LLVector3(delta) * sFlycamRotation; 00135 00136 LLMatrix3 rot_mat(delta[3], 00137 delta[4], 00138 delta[5]); 00139 00140 sFlycamRotation = LLQuaternion(rot_mat)*sFlycamRotation; 00141 00142 if (gSavedSettings.getBOOL("FlycamAutoLeveling")) 00143 { 00144 LLMatrix3 level(sFlycamRotation); 00145 00146 LLVector3 x = LLVector3(level.mMatrix[0]); 00147 LLVector3 y = LLVector3(level.mMatrix[1]); 00148 LLVector3 z = LLVector3(level.mMatrix[2]); 00149 00150 y.mV[2] = 0.f; 00151 y.normVec(); 00152 00153 level.setRows(x,y,z); 00154 level.orthogonalize(); 00155 00156 LLQuaternion quat = LLQuaternion(level); 00157 sFlycamRotation = nlerp(llmin(feather*time,1.f), sFlycamRotation, quat); 00158 } 00159 00160 if (gSavedSettings.getBOOL("FlycamZoomDirect")) 00161 { 00162 sFlycamZoom = last_delta[6]*axis_scale[6]+dead_zone[6]; 00163 } 00164 else 00165 { 00166 sFlycamZoom += delta[6]; 00167 } 00168 00169 LLMatrix3 mat(sFlycamRotation); 00170 00171 gCamera->setView(sFlycamZoom); 00172 gCamera->setOrigin(sFlycamPosition); 00173 gCamera->mXAxis = LLVector3(mat.mMatrix[0]); 00174 gCamera->mYAxis = LLVector3(mat.mMatrix[1]); 00175 gCamera->mZAxis = LLVector3(mat.mMatrix[2]); 00176 } 00177 00178 00179 void LLViewerJoystick::scanJoystick() 00180 { 00181 if (!sOverrideCamera) 00182 { 00183 static U32 joystick_state = 0; 00184 static U32 button_state = 0; 00185 00186 F32 xval = gViewerWindow->getWindow()->getJoystickAxis(0); 00187 F32 yval = gViewerWindow->getWindow()->getJoystickAxis(1); 00188 00189 if (xval <= -0.5f) 00190 { 00191 if (!(joystick_state & 0x1)) 00192 { 00193 gKeyboard->handleTranslatedKeyDown(KEY_PAD_LEFT, 0); 00194 joystick_state |= 0x1; 00195 } 00196 } 00197 else 00198 { 00199 if (joystick_state & 0x1) 00200 { 00201 gKeyboard->handleTranslatedKeyUp(KEY_PAD_LEFT, 0); 00202 joystick_state &= ~0x1; 00203 } 00204 } 00205 if (xval >= 0.5f) 00206 { 00207 if (!(joystick_state & 0x2)) 00208 { 00209 gKeyboard->handleTranslatedKeyDown(KEY_PAD_RIGHT, 0); 00210 joystick_state |= 0x2; 00211 } 00212 } 00213 else 00214 { 00215 if (joystick_state & 0x2) 00216 { 00217 gKeyboard->handleTranslatedKeyUp(KEY_PAD_RIGHT, 0); 00218 joystick_state &= ~0x2; 00219 } 00220 } 00221 if (yval <= -0.5f) 00222 { 00223 if (!(joystick_state & 0x4)) 00224 { 00225 gKeyboard->handleTranslatedKeyDown(KEY_PAD_UP, 0); 00226 joystick_state |= 0x4; 00227 } 00228 } 00229 else 00230 { 00231 if (joystick_state & 0x4) 00232 { 00233 gKeyboard->handleTranslatedKeyUp(KEY_PAD_UP, 0); 00234 joystick_state &= ~0x4; 00235 } 00236 } 00237 if (yval >= 0.5f) 00238 { 00239 if (!(joystick_state & 0x8)) 00240 { 00241 gKeyboard->handleTranslatedKeyDown(KEY_PAD_DOWN, 0); 00242 joystick_state |= 0x8; 00243 } 00244 } 00245 else 00246 { 00247 if (joystick_state & 0x8) 00248 { 00249 gKeyboard->handleTranslatedKeyUp(KEY_PAD_DOWN, 0); 00250 joystick_state &= ~0x8; 00251 } 00252 } 00253 00254 for( int i = 0; i < 15; i++ ) 00255 { 00256 if ( gViewerWindow->getWindow()->getJoystickButton(i) & 0x80 ) 00257 { 00258 if (!(button_state & (1<<i))) 00259 { 00260 gKeyboard->handleTranslatedKeyDown(KEY_BUTTON1+i, 0); 00261 button_state |= (1<<i); 00262 } 00263 } 00264 else 00265 { 00266 if (button_state & (1<<i)) 00267 { 00268 gKeyboard->handleTranslatedKeyUp(KEY_BUTTON1+i, 0); 00269 button_state &= ~(1<<i); 00270 } 00271 } 00272 } 00273 } 00274 } 00275