diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp
index 3487ade1b..47e446869 100644
--- a/indra/newview/llviewerjoystick.cpp
+++ b/indra/newview/llviewerjoystick.cpp
@@ -59,7 +59,7 @@ F32 LLViewerJoystick::sLastDelta[] = {0,0,0,0,0,0,0};
F32 LLViewerJoystick::sDelta[] = {0,0,0,0,0,0,0};
// Note: Save the type of controller
-enum EControllerType { NONE, SPACE_NAV, XBOX, UNKNOWN };
+enum EControllerType { NONE, SPACE_NAV, XBOX, DS3, UNKNOWN };
static EControllerType sType = NONE;
// Control cursor instead of avatar?
@@ -84,6 +84,28 @@ bool isXboxLike(const std::string& desc)
return desc.find("Xbox") != std::string::npos
|| desc.find("OUYA") != std::string::npos;
}
+
+bool isDS3Like(const std::string& desc)
+{
+ return desc.find("MotioninJoy") != std::string::npos;
+}
+
+enum DS3Keys
+{
+ DS3_TRIANGLE_KEY = 0,
+ DS3_CIRCLE_KEY,
+ DS3_X_KEY,
+ DS3_SQUARE_KEY,
+ DS3_L1_KEY,
+ DS3_R1_KEY,
+ DS3_L2_KEY,
+ DS3_R2_KEY,
+ DS3_SELECT_KEY,
+ DS3_L_STICK_CLICK,
+ DS3_R_STICK_CLICK,
+ DS3_START_KEY,
+ DS3_LOGO_KEY
+};
//
// These constants specify the maximum absolute value coming in from the device.
@@ -1168,11 +1190,12 @@ void LLViewerJoystick::scanJoystick()
static bool toggle_cursor = false;
// Xbox 360 support
- if (sType == XBOX)
+ if (sType == XBOX || sType == DS3)
{
+ bool ds3 = sType == DS3;
// Special command keys ...
// - Back = toggle flycam
- if (mBtn[XBOX_BACK_KEY] == 1)
+ if (mBtn[ds3 ? DS3_SELECT_KEY : XBOX_BACK_KEY] == 1)
{
if (!toggle_flycam) toggle_flycam = toggleFlycam();
}
@@ -1182,7 +1205,7 @@ void LLViewerJoystick::scanJoystick()
}
// - Start = toggle cursor/camera control
- if (mBtn[XBOX_START_KEY] == 1)
+ if (mBtn[ds3 ? XBOX_START_KEY : DS3_START_KEY] == 1)
{
if (!toggle_cursor) toggle_cursor = toggleCursor();
}
@@ -1193,40 +1216,40 @@ void LLViewerJoystick::scanJoystick()
// Toggle mouselook ...
static bool right_stick_click_down = false;
- if (!!mBtn[XBOX_R_STICK_CLICK] != right_stick_click_down)
+ if (!!mBtn[ds3 ? DS3_R_STICK_CLICK : XBOX_R_STICK_CLICK] != right_stick_click_down)
{
- if (right_stick_click_down = mBtn[XBOX_R_STICK_CLICK]) // Note: Setting, not comparing.
+ if (right_stick_click_down = mBtn[ds3 ? DS3_R_STICK_CLICK : XBOX_R_STICK_CLICK]) // Note: Setting, not comparing.
gAgentCamera.cameraMouselook() ? gAgentCamera.changeCameraToDefault() : gAgentCamera.changeCameraToMouselook();
}
MASK mask = gKeyboard->currentMask(TRUE);
// Esc
static bool esc_down = false;
- if (!!mBtn[XBOX_Y_KEY] != esc_down)
+ if (!!mBtn[ds3 ? DS3_TRIANGLE_KEY : XBOX_Y_KEY] != esc_down)
{
- esc_down = mBtn[XBOX_Y_KEY];
+ esc_down = mBtn[ds3 ? DS3_TRIANGLE_KEY : XBOX_Y_KEY];
(gKeyboard->*(esc_down ? &LLKeyboard::handleTranslatedKeyDown : &LLKeyboard::handleTranslatedKeyDown))(KEY_ESCAPE, mask);
}
// Alt
static bool alt_down = false;
- if (!!mBtn[XBOX_A_KEY] != alt_down)
+ if (!!mBtn[ds3 ? DS3_X_KEY : XBOX_A_KEY] != alt_down)
{
- gKeyboard->setControllerKey(KEY_ALT, alt_down = mBtn[XBOX_A_KEY]);
+ gKeyboard->setControllerKey(KEY_ALT, alt_down = mBtn[ds3 ? DS3_X_KEY : XBOX_A_KEY]);
}
// Ctrl
static bool ctrl_down = false;
- if (!!mBtn[XBOX_X_KEY] != ctrl_down)
+ if (!!mBtn[ds3 ? DS3_SQUARE_KEY : XBOX_X_KEY] != ctrl_down)
{
- gKeyboard->setControllerKey(KEY_CONTROL, ctrl_down = mBtn[XBOX_X_KEY]);
+ gKeyboard->setControllerKey(KEY_CONTROL, ctrl_down = mBtn[ds3 ? DS3_SQUARE_KEY : XBOX_X_KEY]);
}
// Shift
static bool shift_down = false;
- if (!!mBtn[XBOX_B_KEY] != shift_down)
+ if (!!mBtn[ds3 ? DS3_CIRCLE_KEY : XBOX_B_KEY] != shift_down)
{
- gKeyboard->setControllerKey(KEY_SHIFT, shift_down = mBtn[XBOX_B_KEY]);
+ gKeyboard->setControllerKey(KEY_SHIFT, shift_down = mBtn[ds3 ? DS3_CIRCLE_KEY : XBOX_B_KEY]);
}
// Mouse clicks ...
@@ -1234,20 +1257,34 @@ void LLViewerJoystick::scanJoystick()
LLUI::getMousePositionScreen(&coord.mX, &coord.mY);
static bool m1_down = false;
static F32 last_m1 = 0;
- if (!!mBtn[XBOX_L_BUMP_KEY] != m1_down)
+ if (!!mBtn[ds3 ? DS3_L1_KEY : XBOX_L_BUMP_KEY] != m1_down)
{
- m1_down = mBtn[XBOX_L_BUMP_KEY];
+ m1_down = mBtn[ds3 ? DS3_L1_KEY : XBOX_L_BUMP_KEY];
(gViewerWindow->*(m1_down ? &LLViewerWindow::handleMouseDown : &LLViewerWindow::handleMouseUp))(gViewerWindow->getWindow(), coord, mask);
if (m1_down && gFrameTimeSeconds-last_m1 == 0.5f)
gViewerWindow->handleDoubleClick(gViewerWindow->getWindow(), coord, mask);
last_m1 = gFrameTimeSeconds;
}
static bool m2_down = false;
- if (!!mBtn[XBOX_R_BUMP_KEY] != m2_down)
+ if (!!mBtn[ds3 ? DS3_R1_KEY : XBOX_R_BUMP_KEY] != m2_down)
{
- m2_down = mBtn[XBOX_R_BUMP_KEY];
+ m2_down = mBtn[ds3 ? DS3_R1_KEY : XBOX_R_BUMP_KEY];
(gViewerWindow->*(m2_down ? &LLViewerWindow::handleRightMouseDown : &LLViewerWindow::handleRightMouseUp))(gViewerWindow->getWindow(), coord, mask);
}
+
+ if (ds3) // Yay bonus keys~
+ {
+ static bool sit_down = false;
+ if (!!mBtn[DS3_LOGO_BUTTON] != sit_down)
+ {
+ sit_down = mBtn[DS3_LOGO_BUTTON];
+ (gAgentAvatarp && gAgentAvatarp->isSitting()) ? gAgent.standUp() : gAgent.sitDown();
+ }
+ /* Singu TODO: What should these be?
+ DS3_L2_BUTTON
+ DS3_R2_BUTTON
+ */
+ }
}
else
//
@@ -1318,7 +1355,8 @@ void LLViewerJoystick::setSNDefaults()
//gViewerWindow->alertXml("CacheWillClear");
const bool xbox = sType == XBOX;
- llinfos << "restoring " << (xbox ? "Xbox Controller" : "SpaceNavigator") << " defaults..." << llendl;
+ const bool ds3 = sType == DS3;
+ llinfos << "restoring " << (xbox ? "Xbox Controller" : ds3 ? "Dual Shock 3" : "SpaceNavigator") << " defaults..." << llendl;
/*
Axis 0: Left Thumbstick Horizontal
@@ -1332,57 +1370,58 @@ void LLViewerJoystick::setSNDefaults()
Debug setting InternalMapping,Jostick Axis (see above) */
gSavedSettings.setS32("JoystickAxis0", 1); // z (at)
gSavedSettings.setS32("JoystickAxis1", 0); // x (slide)
- gSavedSettings.setS32("JoystickAxis2", 2); // y (up)
+ gSavedSettings.setS32("JoystickAxis2", ds3 ? 3 : 2); // y (up)
gSavedSettings.setS32("JoystickAxis3", xbox ? -1 : 4); // roll
- gSavedSettings.setS32("JoystickAxis4", xbox ? 4 : 3); // pitch
- gSavedSettings.setS32("JoystickAxis5", xbox ? 3 : 5); // yaw
+ gSavedSettings.setS32("JoystickAxis4", xbox ? 4 : ds3 ? 5 : 3); // pitch
+ gSavedSettings.setS32("JoystickAxis5", xbox ? 3 : ds3 ? 2 : 5); // yaw
gSavedSettings.setS32("JoystickAxis6", -1);
gSavedSettings.setBOOL("Cursor3D", !xbox && is_3d_cursor);
gSavedSettings.setBOOL("AutoLeveling", true);
gSavedSettings.setBOOL("ZoomDirect", false);
- gSavedSettings.setF32("AvatarAxisScale0", (xbox ? 0.43f : 1.f) * platformScaleAvXZ);
- gSavedSettings.setF32("AvatarAxisScale1", (xbox ? 0.43f : 1.f) * platformScaleAvXZ);
- gSavedSettings.setF32("AvatarAxisScale2", xbox ? 0.43f : 1.f);
- gSavedSettings.setF32("AvatarAxisScale4", (xbox ? 4.f : .1f) * platformScale);
- gSavedSettings.setF32("AvatarAxisScale5", (xbox ? 4.f : .1f) * platformScale);
- gSavedSettings.setF32("AvatarAxisScale3", (xbox ? 4.f : 0.f) * platformScale);
- gSavedSettings.setF32("BuildAxisScale1", (xbox ? 0.8f : .3f) * platformScale);
- gSavedSettings.setF32("BuildAxisScale2", (xbox ? 0.8f : .3f) * platformScale);
- gSavedSettings.setF32("BuildAxisScale0", (xbox ? 1.6f : .3f) * platformScale);
- gSavedSettings.setF32("BuildAxisScale4", (xbox ? 1.f : .3f) * platformScale);
- gSavedSettings.setF32("BuildAxisScale5", (xbox ? 2.f : .3f) * platformScale);
- gSavedSettings.setF32("BuildAxisScale3", (xbox ? 1.f : .3f) * platformScale);
- gSavedSettings.setF32("FlycamAxisScale1", (xbox ? 16.f : 2.f) * platformScale);
- gSavedSettings.setF32("FlycamAxisScale2", (xbox ? 16.f : 2.f) * platformScale);
- gSavedSettings.setF32("FlycamAxisScale0", (xbox ? 25.f : 2.1f) * platformScale); // Z Scale
- gSavedSettings.setF32("FlycamAxisScale4", (xbox ? -4.f : .1f) * platformScale);
- gSavedSettings.setF32("FlycamAxisScale5", (xbox ? 4.f : .15f) * platformScale);
- gSavedSettings.setF32("FlycamAxisScale3", (xbox ? 4.f : 0.f) * platformScale);
- gSavedSettings.setF32("FlycamAxisScale6", (xbox ? 4.f : 0.f) * platformScale);
+ const bool game = xbox || ds3; // All game controllers are relatively the same
+ gSavedSettings.setF32("AvatarAxisScale0", (game ? 0.43f : 1.f) * platformScaleAvXZ);
+ gSavedSettings.setF32("AvatarAxisScale1", (game ? 0.43f : 1.f) * platformScaleAvXZ);
+ gSavedSettings.setF32("AvatarAxisScale2", xbox ? 0.43f : ds3 ? -0.43f : 1.f);
+ gSavedSettings.setF32("AvatarAxisScale4", (game ? 4.f : .1f) * platformScale);
+ gSavedSettings.setF32("AvatarAxisScale5", (game ? 4.f : .1f) * platformScale);
+ gSavedSettings.setF32("AvatarAxisScale3", (game ? 4.f : 0.f) * platformScale);
+ gSavedSettings.setF32("BuildAxisScale1", (game ? 0.8f : .3f) * platformScale);
+ gSavedSettings.setF32("BuildAxisScale2", (xbox ? 0.8f : ds3 ? -0.8f : .3f) * platformScale);
+ gSavedSettings.setF32("BuildAxisScale0", (game ? 1.6f : .3f) * platformScale);
+ gSavedSettings.setF32("BuildAxisScale4", (game ? 1.f : .3f) * platformScale);
+ gSavedSettings.setF32("BuildAxisScale5", (game ? 2.f : .3f) * platformScale);
+ gSavedSettings.setF32("BuildAxisScale3", (game ? 1.f : .3f) * platformScale);
+ gSavedSettings.setF32("FlycamAxisScale1", (game ? 16.f : 2.f) * platformScale);
+ gSavedSettings.setF32("FlycamAxisScale2", (game ? 16.f : ds3 ? -16.f : 2.f) * platformScale);
+ gSavedSettings.setF32("FlycamAxisScale0", (game ? 25.f : 2.1f) * platformScale); // Z Scale
+ gSavedSettings.setF32("FlycamAxisScale4", (game ? -4.f : .1f) * platformScale);
+ gSavedSettings.setF32("FlycamAxisScale5", (game ? 4.f : .15f) * platformScale);
+ gSavedSettings.setF32("FlycamAxisScale3", (game ? 4.f : 0.f) * platformScale);
+ gSavedSettings.setF32("FlycamAxisScale6", (game ? 4.f : 0.f) * platformScale);
- gSavedSettings.setF32("AvatarAxisDeadZone0", xbox ? .2f : .1f);
- gSavedSettings.setF32("AvatarAxisDeadZone1", xbox ? .2f : .1f);
- gSavedSettings.setF32("AvatarAxisDeadZone2", xbox ? .2f : .1f);
- gSavedSettings.setF32("AvatarAxisDeadZone3", xbox ? .2f : 1.f);
- gSavedSettings.setF32("AvatarAxisDeadZone4", xbox ? .2f : .02f);
- gSavedSettings.setF32("AvatarAxisDeadZone5", xbox ? .2f : .01f);
- gSavedSettings.setF32("BuildAxisDeadZone0", xbox ? .02f : .01f);
- gSavedSettings.setF32("BuildAxisDeadZone1", xbox ? .02f : .01f);
- gSavedSettings.setF32("BuildAxisDeadZone2", xbox ? .02f : .01f);
- gSavedSettings.setF32("BuildAxisDeadZone3", xbox ? .02f : .01f);
- gSavedSettings.setF32("BuildAxisDeadZone4", xbox ? .02f : .01f);
- gSavedSettings.setF32("BuildAxisDeadZone5", xbox ? .02f : .01f);
- gSavedSettings.setF32("FlycamAxisDeadZone0", xbox ? .2f : .01f);
- gSavedSettings.setF32("FlycamAxisDeadZone1", xbox ? .2f : .01f);
- gSavedSettings.setF32("FlycamAxisDeadZone2", xbox ? .2f : .01f);
- gSavedSettings.setF32("FlycamAxisDeadZone3", xbox ? .1f : .01f);
- gSavedSettings.setF32("FlycamAxisDeadZone4", xbox ? .25f : .01f);
- gSavedSettings.setF32("FlycamAxisDeadZone5", xbox ? .25f : .01f);
- gSavedSettings.setF32("FlycamAxisDeadZone6", xbox ? .2f : 1.f);
+ gSavedSettings.setF32("AvatarAxisDeadZone0", game ? .2f : .1f);
+ gSavedSettings.setF32("AvatarAxisDeadZone1", game ? .2f : .1f);
+ gSavedSettings.setF32("AvatarAxisDeadZone2", game ? .2f : .1f);
+ gSavedSettings.setF32("AvatarAxisDeadZone3", game ? .2f : 1.f);
+ gSavedSettings.setF32("AvatarAxisDeadZone4", game ? .2f : .02f);
+ gSavedSettings.setF32("AvatarAxisDeadZone5", game ? .2f : .01f);
+ gSavedSettings.setF32("BuildAxisDeadZone0", game ? .02f : .01f);
+ gSavedSettings.setF32("BuildAxisDeadZone1", game ? .02f : .01f);
+ gSavedSettings.setF32("BuildAxisDeadZone2", game ? .02f : .01f);
+ gSavedSettings.setF32("BuildAxisDeadZone3", game ? .02f : .01f);
+ gSavedSettings.setF32("BuildAxisDeadZone4", game ? .02f : .01f);
+ gSavedSettings.setF32("BuildAxisDeadZone5", game ? .02f : .01f);
+ gSavedSettings.setF32("FlycamAxisDeadZone0", game ? .2f : .01f);
+ gSavedSettings.setF32("FlycamAxisDeadZone1", game ? .2f : .01f);
+ gSavedSettings.setF32("FlycamAxisDeadZone2", game ? .2f : .01f);
+ gSavedSettings.setF32("FlycamAxisDeadZone3", game ? .1f : .01f);
+ gSavedSettings.setF32("FlycamAxisDeadZone4", game ? .25f : .01f);
+ gSavedSettings.setF32("FlycamAxisDeadZone5", game ? .25f : .01f);
+ gSavedSettings.setF32("FlycamAxisDeadZone6", game ? .2f : 1.f);
- gSavedSettings.setF32("AvatarFeathering", xbox ? 3.f : 6.f);
+ gSavedSettings.setF32("AvatarFeathering", game ? 3.f : 6.f);
gSavedSettings.setF32("BuildFeathering", 12.f);
- gSavedSettings.setF32("FlycamFeathering", xbox ? 1.f : 5.f);
+ gSavedSettings.setF32("FlycamFeathering", game ? 1.f : 5.f);
}