Merge pull request #75 from AngeldarkRaymaker/FIRE-34943

Fire 34943: Add spinners to sliders for finer adjustments
meow-7.2.2
Beq Janus 2025-02-03 02:10:42 +00:00 committed by GitHub
commit fdb54ab59d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 501 additions and 121 deletions

View File

@ -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<LLSliderCtrl>("trackpad_sensitivity_slider");
mTrackpadSensitivitySlider->setValue(gSavedSettings.getF32(POSER_TRACKPAD_SENSITIVITY_SAVE_KEY));
mPoseSaveNameEditor = getChild<LLLineEditor>("pose_save_name");
mPoseSaveNameEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
@ -216,6 +218,20 @@ bool FSFloaterPoser::postBuild()
mResetBaseRotCbx = getChild<LLCheckBoxCtrl>("reset_base_rotation_on_edit_checkbox");
mResetBaseRotCbx->setCommitCallback([this](LLUICtrl*, const LLSD&) { onClickSetBaseRotZero(); });
mTrackpadSensitivitySpnr = getChild<LLUICtrl>("trackpad_sensitivity_spinner");
mYawSpnr = getChild<LLUICtrl>("limb_yaw_spinner");
mPitchSpnr = getChild<LLUICtrl>("limb_pitch_spinner");
mRollSpnr = getChild<LLUICtrl>("limb_roll_spinner");
mUpDownSpnr = getChild<LLUICtrl>("av_position_updown_spinner");
mLeftRightSpnr = getChild<LLUICtrl>("av_position_leftright_spinner");
mInOutSpnr = getChild<LLUICtrl>("av_position_inout_spinner");
mAdvPosXSpnr = getChild<LLUICtrl>("adv_posx_spinner");
mAdvPosYSpnr = getChild<LLUICtrl>("adv_posy_spinner");
mAdvPosZSpnr = getChild<LLUICtrl>("adv_posz_spinner");
mScaleXSpnr = getChild<LLUICtrl>("adv_scalex_spinner");
mScaleYSpnr = getChild<LLUICtrl>("adv_scaley_spinner");
mScaleZSpnr = getChild<LLUICtrl>("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()
/// <summary>
/// This only sets the position sliders of the 'basic' view (not the advanced sliders).
/// </summary>
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();
}
}

View File

@ -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();
/// <summary>
/// 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

View File

@ -351,6 +351,7 @@ width="403">
</text>
<slider
decimal_digits="2"
show_text="false"
follows="left|top"
height="16"
increment="0.01"
@ -361,18 +362,33 @@ 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">
<slider.commit_callback
function="Poser.PositionSet"/>
</slider>
<spinner
height="16"
decimal_digits="2"
follows="left|top"
increment="0.01"
top_pad="-19"
left_pad="0"
name="av_position_updown_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner"
parameter="0"/>
</spinner>
<text
follows="left|top"
name="av_position_leftright_label"
height="10"
layout="topleft"
left_delta="-5"
left="0"
top_pad="5"
width="172">
Left/Right:
@ -380,6 +396,7 @@ width="403">
<slider
decimal_digits="2"
follows="left|top"
show_text="false"
height="16"
increment="0.01"
initial_value="0"
@ -389,18 +406,33 @@ 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">
<slider.commit_callback
function="Poser.PositionSet"/>
</slider>
<spinner
height="16"
decimal_digits="2"
follows="left|top"
increment="0.01"
top_pad="-19"
left_pad="0"
name="av_position_leftright_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner"
parameter="1"/>
</spinner>
<text
follows="left|top"
name="av_position_inout_label"
height="10"
layout="topleft"
left_delta="-5"
left="0"
top_pad="5"
width="172">
In/Out:
@ -408,6 +440,7 @@ width="403">
<slider
decimal_digits="2"
follows="left|top"
show_text="false"
height="16"
increment="0.01"
initial_value="0"
@ -417,13 +450,28 @@ 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">
<slider.commit_callback
function="Poser.PositionSet"/>
</slider>
<!-- so this panel behaves like the others in the code behind, it has an invisible list... -->
<spinner
height="16"
decimal_digits="2"
follows="left|top"
increment="0.01"
top_pad="-19"
left_pad="0"
name="av_position_inout_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner"
parameter="2"/>
</spinner>
<!-- to make this panel behaves like the others in code-behind, it has an invisible list -->
<scroll_list
visible="false"
column_padding="2"
@ -796,6 +844,7 @@ width="403">
</text>
<slider
decimal_digits="2"
control_name="FSPoserTrackpadSensitivity"
can_edit_text="true"
follows="left|top"
height="14"
@ -805,13 +854,30 @@ width="403">
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" >
<slider.commit_callback
function="Poser.AdjustTrackPadSensitivity"/>
</slider>
<spinner
height="16"
decimal_digits="2"
follows="left|top"
control_name="FSPoserTrackpadSensitivity"
increment="0.01"
top_pad="-19"
left_pad="0"
name="trackpad_sensitivity_spinner"
min_val="0.01"
max_val="2"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner"
parameter="3"/>
</spinner>
<check_box
control_name="FSPoserStopPosingWhenClosed"
name="stop_posing_on_close_checkbox"
@ -820,7 +886,7 @@ width="403">
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" />
<check_box
control_name="FSPoserResetBaseRotationOnEdit"
@ -839,9 +905,9 @@ width="403">
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" />
</panel>
</tab_container>
@ -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"/>
<spinner
height="16"
decimal_digits="2"
follows="left|top"
increment="0.1"
top_pad="-19"
left_pad="0"
name="limb_pitch_spinner"
min_val="-180"
max_val="180"
width="57">
<spinner.commit_callback
function="Poser.CommitSpinner"
parameter="4"/>
</spinner>
<text
follows="left|top"
name="limb_yaw_label"
height="10"
layout="topleft"
left_delta="-5"
top_pad="0"
left="0"
top_pad="2"
width="200">
Left/Right:
</text>
@ -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"/>
<spinner
height="16"
decimal_digits="2"
follows="left|top"
increment="0.1"
top_pad="-19"
left_pad="0"
name="limb_yaw_spinner"
min_val="-180"
max_val="180"
width="57">
<spinner.commit_callback
function="Poser.CommitSpinner"
parameter="5"/>
</spinner>
<text
follows="left|top"
name="limb_roll_label"
height="10"
layout="topleft"
left_delta="-5"
top_pad="-1"
left="0"
top_pad="2"
width="200">
Roll:
</text>
@ -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"/>
<spinner
height="16"
decimal_digits="2"
follows="left|top"
increment="0.1"
top_pad="-18"
left_pad="0"
name="limb_roll_spinner"
min_val="-180"
max_val="180"
width="57">
<spinner.commit_callback
function="Poser.CommitSpinner"
parameter="6"/>
</spinner>
</panel>
<panel
follows="top|left|bottom"
@ -1300,13 +1413,13 @@ width="403">
<layout_panel
follows="top|left|right"
layout="topleft"
height="97"
height="99"
auto_resize="false"
name="advanced_controls_layout"
width="600">
<panel
follows="top|left|right"
height="97"
height="99"
left="0"
layout="all"
enabled="false"
@ -1318,7 +1431,7 @@ width="403">
<tab_container
follows="all"
halign="center"
height="97"
height="99"
layout="topleft"
name="modifier_tabs"
tab_height="20"
@ -1329,7 +1442,7 @@ width="403">
<panel
follows="all"
background_visible="false"
height="97"
height="99"
layout="topleft"
left="0"
title="Body Part Position"
@ -1337,75 +1450,117 @@ width="403">
top="0"
width="555">
<slider
decimal_digits="3"
can_edit_text="true"
follows="left|top"
height="14"
increment="0.001"
initial_value="0"
label="Position X:"
label_width="70"
label_width="60"
follows="left|top"
height="14"
increment="0.001"
initial_value="0"
layout="topleft"
left="10"
max_val="0.5"
min_val="-0.5"
show_text="false"
left="3"
max_val="1.5"
min_val="-1.5"
name="Advanced_Position_X"
top_pad="6"
width="380" >
top_pad="2"
width="342" >
<slider.commit_callback
function="Poser.Advanced.PositionSet"/>
</slider>
<slider
decimal_digits="3"
can_edit_text="true"
<spinner
height="0"
decimal_digits="2"
follows="left|top"
height="14"
increment="0.001"
initial_value="0"
increment="0.01"
top_pad="-19"
left_pad="2"
name="adv_posx_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner"
parameter="7"/>
</spinner>
<slider
label="Position Y:"
label_width="70"
layout="topleft"
left_delta="0"
max_val="0.5"
min_val="-0.5"
name="Advanced_Position_Y"
top_pad="1"
width="380" >
<slider.commit_callback
function="Poser.Advanced.PositionSet"/>
</slider>
<slider
decimal_digits="3"
can_edit_text="true"
label_width="60"
follows="left|top"
height="14"
top_pad="24"
increment="0.001"
initial_value="0"
label="Position Z:"
label_width="70"
show_text="false"
layout="topleft"
left_delta="0"
max_val="0.5"
min_val="-0.5"
name="Advanced_Position_Z"
top_pad="1"
width="380" >
max_val="1.5"
min_val="-1.5"
name="Advanced_Position_Y"
left="3"
width="342" >
<slider.commit_callback
function="Poser.Advanced.PositionSet"/>
</slider>
<spinner
height="0"
decimal_digits="2"
follows="left|top"
increment="0.01"
top_pad="-17"
left_pad="2"
name="adv_posy_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner"
parameter="8"/>
</spinner>
<slider
label="Position Z:"
label_width="60"
show_text="false"
follows="left|top"
height="14"
top_pad="22"
increment="0.001"
initial_value="0"
layout="topleft"
max_val="1.5"
min_val="-1.5"
name="Advanced_Position_Z"
left="3"
width="342" >
<slider.commit_callback
function="Poser.Advanced.PositionSet"/>
</slider>
<spinner
height="12"
decimal_digits="2"
follows="left|top"
increment="0.01"
top_pad="-15"
left_pad="2"
name="adv_posz_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner"
parameter="9"/>
</spinner>
<button
height="21"
follows="left|top"
layout="topleft"
label="Undo Position Change"
label="Undo Position"
image_overlay="Script_Undo"
image_overlay_alignment="left"
image_unselected="Toolbar_Middle_Off"
name="undo_position_change"
tool_tip="Undo the last position change"
width="150"
top_pad="2"
left_delta="0">
width="109"
left="3"
top_pad="5">
<button.commit_callback
function="Poser.UndoLastPosition"/>
</button>
@ -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">
<button.commit_callback
@ -1435,7 +1590,7 @@ width="403">
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">
<button.commit_callback
@ -1445,7 +1600,7 @@ width="403">
<panel
follows="all"
background_visible="false"
height="97"
height="99"
layout="topleft"
left="0"
title="Body Part Scale"
@ -1455,73 +1610,121 @@ width="403">
<slider
decimal_digits="3"
can_edit_text="true"
show_text="false"
follows="left|top"
height="14"
increment="0.001"
initial_value="0"
label="Scale X:"
label_width="70"
label_width="43"
layout="topleft"
left="10"
left="3"
max_val="2"
min_val="-2"
name="Advanced_Scale_X"
top_pad="6"
width="380" >
top_pad="2"
width="342" >
<slider.commit_callback
function="Poser.Advanced.ScaleSet"/>
</slider>
<spinner
height="0"
decimal_digits="2"
follows="left|top"
increment="0.01"
top_pad="-19"
left_pad="2"
name="adv_scalex_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner"
parameter="10"/>
</spinner>
<slider
decimal_digits="3"
can_edit_text="true"
show_text="false"
follows="left|top"
height="14"
top_pad="24"
increment="0.001"
initial_value="0"
label="Scale Y:"
label_width="70"
label_width="43"
layout="topleft"
left_delta="0"
left="3"
max_val="2"
min_val="-2"
name="Advanced_Scale_Y"
top_pad="1"
width="380" >
width="342" >
<slider.commit_callback
function="Poser.Advanced.ScaleSet"/>
</slider>
<spinner
height="0"
decimal_digits="2"
follows="left|top"
increment="0.01"
top_pad="-17"
left_pad="2"
name="adv_scaley_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner"
parameter="11"/>
</spinner>
<slider
decimal_digits="3"
can_edit_text="true"
show_text="false"
follows="left|top"
height="14"
top_pad="22"
increment="0.001"
initial_value="0"
label="Scale Z:"
label_width="70"
label_width="43"
layout="topleft"
left_delta="0"
left="3"
max_val="2"
min_val="-2"
name="Advanced_Scale_Z"
top_pad="1"
width="380" >
width="342" >
<slider.commit_callback
function="Poser.Advanced.ScaleSet"/>
</slider>
<spinner
height="12"
decimal_digits="2"
follows="left|top"
increment="0.01"
top_pad="-15"
left_pad="2"
name="adv_scalez_spinner"
min_val="-1.5"
max_val="1.5"
width="47">
<spinner.commit_callback
function="Poser.CommitSpinner"
parameter="12"/>
</spinner>
<button
height="21"
follows="left|top"
layout="topleft"
label="Undo Scale Change"
label="Undo Scale"
image_overlay="Script_Undo"
image_overlay_alignment="left"
image_unselected="Toolbar_Middle_Off"
name="undo_scale_change"
tool_tip="Undo the last scale change"
width="150"
top_pad="2"
left_delta="0">
width="109"
left="3"
top_pad="5">
<button.commit_callback
function="Poser.UndoLastScale"/>
</button>
@ -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">
<button.commit_callback
@ -1551,7 +1754,7 @@ width="403">
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">
<button.commit_callback