diff --git a/indra/newview/fsfloaterposer.cpp b/indra/newview/fsfloaterposer.cpp index dd59d39637..eba653938d 100644 --- a/indra/newview/fsfloaterposer.cpp +++ b/indra/newview/fsfloaterposer.cpp @@ -105,6 +105,9 @@ FSFloaterPoser::FSFloaterPoser(const LLSD& key) : LLFloater(key) mCommitCallbackRegistrar.add("Poser.RecaptureSelectedBones", [this](LLUICtrl*, const LLSD&) { onClickRecaptureSelectedBones(); }); mCommitCallbackRegistrar.add("Poser.TogglePosingSelectedBones", [this](LLUICtrl*, const LLSD&) { onClickToggleSelectedBoneEnabled(); }); mCommitCallbackRegistrar.add("Poser.PoseJointsReset", [this](LLUICtrl*, const LLSD&) { onPoseJointsReset(); }); + + //mCommitCallbackRegistrar.add("Poser.CommitSpinner", [this](LLUICtrl* spinnerControl, const LLSD&) { onCommitSpinner(spinnerControl); }); + mCommitCallbackRegistrar.add("Poser.CommitSpinner", boost::bind(&FSFloaterPoser::onCommitSpinner, this, _1, _2)); } bool FSFloaterPoser::postBuild() @@ -164,7 +167,6 @@ bool FSFloaterPoser::postBuild() mToggleAdvancedPanelBtn->setValue(true); mTrackpadSensitivitySlider = getChild("trackpad_sensitivity_slider"); - mTrackpadSensitivitySlider->setValue(gSavedSettings.getF32(POSER_TRACKPAD_SENSITIVITY_SAVE_KEY)); mPoseSaveNameEditor = getChild("pose_save_name"); mPoseSaveNameEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe); @@ -216,6 +218,20 @@ bool FSFloaterPoser::postBuild() mResetBaseRotCbx = getChild("reset_base_rotation_on_edit_checkbox"); mResetBaseRotCbx->setCommitCallback([this](LLUICtrl*, const LLSD&) { onClickSetBaseRotZero(); }); + mTrackpadSensitivitySpnr = getChild("trackpad_sensitivity_spinner"); + mYawSpnr = getChild("limb_yaw_spinner"); + mPitchSpnr = getChild("limb_pitch_spinner"); + mRollSpnr = getChild("limb_roll_spinner"); + mUpDownSpnr = getChild("av_position_updown_spinner"); + mLeftRightSpnr = getChild("av_position_leftright_spinner"); + mInOutSpnr = getChild("av_position_inout_spinner"); + mAdvPosXSpnr = getChild("adv_posx_spinner"); + mAdvPosYSpnr = getChild("adv_posy_spinner"); + mAdvPosZSpnr = getChild("adv_posz_spinner"); + mScaleXSpnr = getChild("adv_scalex_spinner"); + mScaleYSpnr = getChild("adv_scaley_spinner"); + mScaleZSpnr = getChild("adv_scalez_spinner"); + return true; } @@ -467,7 +483,7 @@ void FSFloaterPoser::onClickToggleSelectedBoneEnabled() mPoserAnimator.setPosingAvatarJoint(avatar, *item, !currentlyPosing); } - refreshRotationSliders(); + refreshRotationSlidersAndSpinners(); refreshTrackpadCursor(); refreshTextHighlightingOnJointScrollLists(); } @@ -511,7 +527,7 @@ void FSFloaterPoser::onClickFlipSelectedJoints() mPoserAnimator.reflectJoint(avatar, item); } - refreshRotationSliders(); + refreshRotationSlidersAndSpinners(); refreshTrackpadCursor(); } @@ -526,7 +542,7 @@ void FSFloaterPoser::onClickFlipPose() mPoserAnimator.flipEntirePose(avatar); - refreshRotationSliders(); + refreshRotationSlidersAndSpinners(); refreshTrackpadCursor(); } @@ -553,7 +569,7 @@ void FSFloaterPoser::onClickRecaptureSelectedBones() } setSavePosesButtonText(true); - refreshRotationSliders(); + refreshRotationSlidersAndSpinners(); refreshTrackpadCursor(); refreshTextHighlightingOnJointScrollLists(); } @@ -566,6 +582,114 @@ void FSFloaterPoser::onClickBrowsePoseCache() gViewerWindow->getWindow()->openFile(pathname); } +//void FSFloaterPoser::onCommitSpinner(LLUICtrl* spinner) +// Pass in an ID as a parameter, so you can use a switch statement +void FSFloaterPoser::onCommitSpinner(LLUICtrl* spinner, S32 id) +{ + if (!spinner) + return; + + auto activeTab = mJointsTabs->getCurrentPanel(); + if (!activeTab) + return; + + bool changingBodyPosition = activeTab == mPositionRotationPnl; + + F32 value = (F32)spinner->getValue().asReal(); + + // Use the ID passed in to perform a switch statment + // which should make each action take the same amount of time. + switch (id) + { + case 0: // av_position_updown_spinner + { + mPosZSlider->setValue(value); + onAvatarPositionSet(); + break; + } + case 1: // av_position_leftright + { + mPosYSlider->setValue(value); + onAvatarPositionSet(); + break; + } + case 2: // av_position_inout_spinner + { + mPosXSlider->setValue(value); + onAvatarPositionSet(); + break; + } + case 3: // trackpad_sensitivity_spinner + { + onAdjustTrackpadSensitivity(); + break; + } + case 4: // limb_pitch_spinner + { + mLimbPitchSlider->setValue(value); + onYawPitchRollSliderChanged(); + break; + } + case 5: // limb_yaw_spinner + { + mLimbYawSlider->setValue(value); + onYawPitchRollSliderChanged(); + break; + } + case 6: // limb_roll_spinner + { + mLimbRollSlider->setValue(value); + onYawPitchRollSliderChanged(); + break; + } + case 7: // adv_posx_spinner + { + if (changingBodyPosition) + mPosXSlider->setValue(value); + + mAdvPosXSlider->setValue(value); + onAdvancedPositionSet(); + break; + } + case 8: // adv_posy_spinner + { + if (changingBodyPosition) + mPosYSlider->setValue(value); + + mAdvPosYSlider->setValue(value); + onAdvancedPositionSet(); + break; + } + case 9: // adv_posz_spinner + { + if (changingBodyPosition) + mPosZSlider->setValue(value); + + mAdvPosZSlider->setValue(value); + onAdvancedPositionSet(); + break; + } + case 10: // adv_scalex_spinner + { + mAdvScaleXSlider->setValue(value); + onAdvancedScaleSet(); + break; + } + case 11: // adv_scaley_spinner + { + mAdvScaleYSlider->setValue(value); + onAdvancedScaleSet(); + break; + } + case 12: // adv_scalez_spinner + { + mAdvScaleZSlider->setValue(value); + onAdvancedScaleSet(); + break; + } + } +} + void FSFloaterPoser::onPoseJointsReset() { if (notDoubleClicked()) @@ -589,9 +713,9 @@ void FSFloaterPoser::onPoseJointsReset() mPoserAnimator.resetAvatarJoint(avatar, *item); } - refreshRotationSliders(); + refreshRotationSlidersAndSpinners(); refreshTrackpadCursor(); - refreshAvatarPositionSliders(); + refreshAvatarPositionSlidersAndSpinners(); } void FSFloaterPoser::onPoseMenuAction(const LLSD& param) @@ -1149,7 +1273,7 @@ void FSFloaterPoser::onUndoLastRotation() } enableOrDisableRedoButton(); - refreshRotationSliders(); + refreshRotationSlidersAndSpinners(); refreshTrackpadCursor(); } @@ -1173,8 +1297,8 @@ void FSFloaterPoser::onUndoLastPosition() mPoserAnimator.undoLastJointPosition(avatar, *item, getUiSelectedBoneDeflectionStyle()); } - refreshAdvancedPositionSliders(); - refreshAvatarPositionSliders(); + refreshAdvancedPositionSlidersAndSpinners(); + refreshAvatarPositionSlidersAndSpinners(); } void FSFloaterPoser::onUndoLastScale() @@ -1197,7 +1321,7 @@ void FSFloaterPoser::onUndoLastScale() mPoserAnimator.undoLastJointScale(avatar, *item, getUiSelectedBoneDeflectionStyle()); } - refreshAdvancedScaleSliders(); + refreshAdvancedScaleSlidersAndSpinners(); } void FSFloaterPoser::onSetAvatarToTpose() @@ -1237,8 +1361,8 @@ void FSFloaterPoser::onResetPosition() mPoserAnimator.resetJointPosition(avatar, *item, getUiSelectedBoneDeflectionStyle()); } - refreshAdvancedPositionSliders(); - refreshAvatarPositionSliders(); + refreshAdvancedPositionSlidersAndSpinners(); + refreshAvatarPositionSlidersAndSpinners(); } void FSFloaterPoser::onResetScale() @@ -1264,7 +1388,7 @@ void FSFloaterPoser::onResetScale() mPoserAnimator.resetJointScale(avatar, *item, getUiSelectedBoneDeflectionStyle()); } - refreshAdvancedScaleSliders(); + refreshAdvancedScaleSlidersAndSpinners(); } void FSFloaterPoser::onRedoLastRotation() @@ -1288,7 +1412,7 @@ void FSFloaterPoser::onRedoLastRotation() } enableOrDisableRedoButton(); - refreshRotationSliders(); + refreshRotationSlidersAndSpinners(); refreshTrackpadCursor(); } @@ -1312,8 +1436,8 @@ void FSFloaterPoser::onRedoLastPosition() mPoserAnimator.redoLastJointPosition(avatar, *item, getUiSelectedBoneDeflectionStyle()); } - refreshAdvancedPositionSliders(); - refreshAvatarPositionSliders(); + refreshAdvancedPositionSlidersAndSpinners(); + refreshAvatarPositionSlidersAndSpinners(); } void FSFloaterPoser::onRedoLastScale() @@ -1336,7 +1460,7 @@ void FSFloaterPoser::onRedoLastScale() mPoserAnimator.redoLastJointScale(avatar, *item, getUiSelectedBoneDeflectionStyle()); } - refreshAdvancedScaleSliders(); + refreshAdvancedScaleSlidersAndSpinners(); } void FSFloaterPoser::enableOrDisableRedoButton() @@ -1569,8 +1693,15 @@ void FSFloaterPoser::onAdvancedPositionSet() F32 posY = mAdvPosYSlider->getValueF32(); F32 posZ = mAdvPosZSlider->getValueF32(); + mAdvPosXSpnr->setValue(posX); + mInOutSpnr->setValue(posX); + mAdvPosYSpnr->setValue(posY); + mLeftRightSpnr->setValue(posY); + mAdvPosZSpnr->setValue(posZ); + mUpDownSpnr->setValue(posZ); + setSelectedJointsPosition(posX, posY, posZ); - refreshAvatarPositionSliders(); + refreshAvatarPositionSlidersAndSpinners(); } void FSFloaterPoser::onAdvancedScaleSet() @@ -1579,6 +1710,10 @@ void FSFloaterPoser::onAdvancedScaleSet() F32 scY = mAdvScaleYSlider->getValueF32(); F32 scZ = mAdvScaleZSlider->getValueF32(); + mScaleXSpnr->setValue(scX); + mScaleYSpnr->setValue(scY); + mScaleZSpnr->setValue(scZ); + setSelectedJointsScale(scX, scY, scZ); } @@ -1588,8 +1723,15 @@ void FSFloaterPoser::onAvatarPositionSet() F32 posY = mPosYSlider->getValueF32(); F32 posZ = mPosZSlider->getValueF32(); + mAdvPosXSpnr->setValue(posX); + mInOutSpnr->setValue(posX); + mAdvPosYSpnr->setValue(posY); + mLeftRightSpnr->setValue(posY); + mAdvPosZSpnr->setValue(posZ); + mUpDownSpnr->setValue(posZ); + setSelectedJointsPosition(posX, posY, posZ); - refreshAdvancedPositionSliders(); + refreshAdvancedPositionSlidersAndSpinners(); } void FSFloaterPoser::onLimbTrackballChanged() @@ -1628,6 +1770,10 @@ void FSFloaterPoser::onLimbTrackballChanged() mLimbYawSlider->setValue(trackPadPos.mV[VX] *= RAD_TO_DEG); mLimbPitchSlider->setValue(trackPadPos.mV[VY] *= RAD_TO_DEG); mLimbRollSlider->setValue(trackPadPos.mV[VZ] *= RAD_TO_DEG); + + mYawSpnr->setValue(mLimbYawSlider->getValueF32()); + mPitchSpnr->setValue(mLimbPitchSlider->getValueF32()); + mRollSpnr->setValue(mLimbRollSlider->getValueF32()); } F32 FSFloaterPoser::unWrapScale(F32 scale) @@ -1669,11 +1815,14 @@ void FSFloaterPoser::onYawPitchRollSliderChanged() absoluteRotation.mV[VZ] /= NormalTrackpadRangeInRads; mAvatarTrackball->setValue(absoluteRotation.getValue()); + + mYawSpnr->setValue(mLimbYawSlider->getValueF32()); + mPitchSpnr->setValue(mLimbPitchSlider->getValueF32()); + mRollSpnr->setValue(mLimbRollSlider->getValueF32()); } void FSFloaterPoser::onAdjustTrackpadSensitivity() { - gSavedSettings.setF32(POSER_TRACKPAD_SENSITIVITY_SAVE_KEY, mTrackpadSensitivitySlider->getValueF32()); refreshTrackpadCursor(); } @@ -1693,7 +1842,7 @@ void FSFloaterPoser::refreshTrackpadCursor() /// /// This only sets the position sliders of the 'basic' view (not the advanced sliders). /// -void FSFloaterPoser::refreshAvatarPositionSliders() +void FSFloaterPoser::refreshAvatarPositionSlidersAndSpinners() { auto activeTab = mJointsTabs->getCurrentPanel(); if (!activeTab) @@ -1704,36 +1853,48 @@ void FSFloaterPoser::refreshAvatarPositionSliders() LLVector3 position = getPositionOfFirstSelectedJoint(); mPosXSlider->setValue(position.mV[VX]); + mInOutSpnr->setValue(position.mV[VX]); mPosYSlider->setValue(position.mV[VY]); + mLeftRightSpnr->setValue(position.mV[VY]); mPosZSlider->setValue(position.mV[VZ]); + mUpDownSpnr->setValue(position.mV[VZ]); } -void FSFloaterPoser::refreshRotationSliders() +void FSFloaterPoser::refreshRotationSlidersAndSpinners() { LLVector3 rotation = getRotationOfFirstSelectedJoint(); mLastSliderRotation = rotation; mLimbYawSlider->setValue(rotation.mV[VX] *= RAD_TO_DEG); + mYawSpnr->setValue(rotation.mV[VX]); mLimbPitchSlider->setValue(rotation.mV[VY] *= RAD_TO_DEG); + mPitchSpnr->setValue(rotation.mV[VY]); mLimbRollSlider->setValue(rotation.mV[VZ] *= RAD_TO_DEG); + mRollSpnr->setValue(rotation.mV[VZ]); } -void FSFloaterPoser::refreshAdvancedPositionSliders() +void FSFloaterPoser::refreshAdvancedPositionSlidersAndSpinners() { LLVector3 position = getPositionOfFirstSelectedJoint(); mAdvPosXSlider->setValue(position.mV[VX]); + mAdvPosXSpnr->setValue(position.mV[VX]); mAdvPosYSlider->setValue(position.mV[VY]); + mAdvPosYSpnr->setValue(position.mV[VY]); mAdvPosZSlider->setValue(position.mV[VZ]); + mAdvPosZSpnr->setValue(position.mV[VZ]); } -void FSFloaterPoser::refreshAdvancedScaleSliders() +void FSFloaterPoser::refreshAdvancedScaleSlidersAndSpinners() { LLVector3 rotation = getScaleOfFirstSelectedJoint(); mAdvScaleXSlider->setValue(rotation.mV[VX]); + mScaleXSpnr->setValue(rotation.mV[VX]); mAdvScaleYSlider->setValue(rotation.mV[VY]); + mScaleYSpnr->setValue(rotation.mV[VY]); mAdvScaleZSlider->setValue(rotation.mV[VZ]); + mScaleZSpnr->setValue(rotation.mV[VZ]); } void FSFloaterPoser::setSelectedJointsPosition(F32 x, F32 y, F32 z) @@ -1877,16 +2038,16 @@ LLVector3 FSFloaterPoser::getScaleOfFirstSelectedJoint() const void FSFloaterPoser::onJointTabSelect() { - refreshAvatarPositionSliders(); - refreshRotationSliders(); + refreshAvatarPositionSlidersAndSpinners(); + refreshRotationSlidersAndSpinners(); refreshTrackpadCursor(); enableOrDisableRedoButton(); onClickSetBaseRotZero(); if (mToggleAdvancedPanelBtn->getValue().asBoolean()) { - refreshAdvancedPositionSliders(); - refreshAdvancedScaleSliders(); + refreshAdvancedPositionSlidersAndSpinners(); + refreshAdvancedScaleSlidersAndSpinners(); } } diff --git a/indra/newview/fsfloaterposer.h b/indra/newview/fsfloaterposer.h index 163d90f7a5..bd8e4c09db 100644 --- a/indra/newview/fsfloaterposer.h +++ b/indra/newview/fsfloaterposer.h @@ -253,13 +253,15 @@ class FSFloaterPoser : public LLFloater void onClickLoadRightHandPose(); void onClickLoadHandPose(bool isRightHand); void onClickSetBaseRotZero(); + //void onCommitSpinner(LLUICtrl* spinner); + void onCommitSpinner(LLUICtrl* spinner, S32 ID); // UI Refreshments - void refreshRotationSliders(); - void refreshAvatarPositionSliders(); + void refreshRotationSlidersAndSpinners(); + void refreshAvatarPositionSlidersAndSpinners(); void refreshTrackpadCursor(); - void refreshAdvancedPositionSliders(); - void refreshAdvancedScaleSliders(); + void refreshAdvancedPositionSlidersAndSpinners(); + void refreshAdvancedScaleSlidersAndSpinners(); /// /// Determines if we have permission to animate the supplied avatar. @@ -496,6 +498,20 @@ class FSFloaterPoser : public LLFloater LLCheckBoxCtrl* mResetBaseRotCbx{ nullptr }; LLCheckBoxCtrl* mAlsoSaveBvhCbx{ nullptr }; + + LLUICtrl* mTrackpadSensitivitySpnr{ nullptr }; + LLUICtrl* mYawSpnr{ nullptr }; + LLUICtrl* mPitchSpnr{ nullptr }; + LLUICtrl* mRollSpnr{ nullptr }; + LLUICtrl* mUpDownSpnr{ nullptr }; + LLUICtrl* mLeftRightSpnr{ nullptr }; + LLUICtrl* mInOutSpnr{ nullptr }; + LLUICtrl* mAdvPosXSpnr{ nullptr }; + LLUICtrl* mAdvPosYSpnr{ nullptr }; + LLUICtrl* mAdvPosZSpnr{ nullptr }; + LLUICtrl* mScaleXSpnr{ nullptr }; + LLUICtrl* mScaleYSpnr{ nullptr }; + LLUICtrl* mScaleZSpnr{ nullptr }; }; #endif diff --git a/indra/newview/skins/default/xui/en/floater_fs_poser.xml b/indra/newview/skins/default/xui/en/floater_fs_poser.xml index f4234960e1..61db38b42a 100644 --- a/indra/newview/skins/default/xui/en/floater_fs_poser.xml +++ b/indra/newview/skins/default/xui/en/floater_fs_poser.xml @@ -351,6 +351,7 @@ width="403"> max_val="1.5" name="av_position_updown" top_pad="5" - width="172" + width="122" tool_tip="Move the selected avatar up or down" can_edit_text="true"> + + + Left/Right: @@ -380,6 +396,7 @@ width="403"> max_val="1.5" name="av_position_leftright" top_pad="5" - width="172" + width="122" tool_tip="Move the selected avatar left or right" can_edit_text="true"> + + + In/Out: @@ -408,6 +440,7 @@ width="403"> max_val="1.5" name="av_position_inout" top_pad="5" - width="172" + width="122" tool_tip="Move the selected avatar in or out" can_edit_text="true"> - + + + + left_delta="0" max_val="2" min_val="0.01" + show_text="false" name="trackpad_sensitivity_slider" tool_tip="Adjusts the sensitivity of the trackball" top_pad="3" - width="170" > + width="120" > + + + follows="left|top" left="5" tool_tip="Not stopping your pose can be helpful if you do a lot of work, and don't want to accidentally lose it." - top_pad="5" + top_pad="10" width="134" /> enabled="false" label="Write BVH when saving**" follows="left|top" - left="5" + left="15" tool_tip="When you save your pose, also write a BVH file, which can be uploaded via the 'Build > Upload > Animation' to pose yourself or others in-world. This needs joints to reset their 'base' to zero, because BVH requires original work." - top_pad="5" + top_pad="2" width="134" /> @@ -992,7 +1058,7 @@ width="403"> name="limb_pitch_label" height="10" layout="topleft" - left_delta="0" + left="0" top_pad="2" width="200"> Up/Down: @@ -1008,16 +1074,31 @@ width="403"> min_val="-180" max_val="180" name="limb_pitch" + show_text="false" top_pad="2" - width="150" - can_edit_text="true"/> + width="98"/> + + + Left/Right: @@ -1032,16 +1113,32 @@ width="403"> min_val="-180" max_val="180" name="limb_yaw" + show_text="false" top_pad="0" - width="150" + width="98" can_edit_text="true"/> + + + Roll: @@ -1052,13 +1149,29 @@ width="403"> increment="0.1" initial_value="0" layout="topleft" + show_text="false" left_delta="5" min_val="-180" max_val="180" name="limb_roll" top_pad="-1" - width="150" + width="98" can_edit_text="true"/> + + + top="0" width="555"> + top_pad="2" + width="342" > - + + + - - - + max_val="1.5" + min_val="-1.5" + name="Advanced_Position_Y" + left="3" + width="342" > + + + + + + + + + @@ -1419,7 +1574,7 @@ width="403"> image_unselected="Toolbar_Middle_Off" name="redo_position_change" tool_tip="Redo the last position change" - width="110" + width="108" top_delta="0" left_pad="4"> image_unselected="Toolbar_Middle_Off" name="reset_positions" tool_tip="Double click to reset position back to original" - width="110" + width="109" top_delta="0" left_pad="4"> + top_pad="2" + width="342" > + + + + width="342" > + + + + width="342" > + + + @@ -1535,7 +1738,7 @@ width="403"> image_unselected="Toolbar_Middle_Off" name="redo_scale_change" tool_tip="Redo the last scale change" - width="110" + width="108" top_delta="0" left_pad="4"> image_unselected="Toolbar_Middle_Off" name="reset_scales" tool_tip="Double click to reset scale back to original" - width="110" + width="109" top_delta="0" left_pad="4">