Ansariel 2025-02-03 15:58:57 +01:00
commit 41b3ac04b3
42 changed files with 1164 additions and 207 deletions

View File

@ -45,7 +45,7 @@ jobs:
run: pip install discord-webhook
- name: Download Build Artifacts
uses: dawidd6/action-download-artifact@v7
uses: dawidd6/action-download-artifact@v8
id: download
with:
workflow: build_viewer.yml

View File

@ -41,7 +41,7 @@ jobs:
setup_files: ${{ steps.get-files.outputs.setup_files }}
steps:
- name: Download Build Artifacts
uses: dawidd6/action-download-artifact@v7
uses: dawidd6/action-download-artifact@v8
id: download
with:
workflow: build_viewer.yml

View File

@ -71,7 +71,7 @@ jobs:
echo "build_run_number=${{ github.event.inputs.build_run_number }}" >> "$GITHUB_OUTPUT"
fi
- name: Download Build Artifacts
uses: dawidd6/action-download-artifact@v7
uses: dawidd6/action-download-artifact@v8
id: download_build_info
with:
workflow: build_viewer.yml

View File

@ -1509,6 +1509,14 @@ void LLShaderMgr::initAttribsAndUniforms()
mReservedUniforms.push_back("areaTex");
mReservedUniforms.push_back("searchTex");
mReservedUniforms.push_back("blendTex");
// <FS:Beq> reserved uniforms for snapshot frame
mReservedUniforms.push_back("border_color");
mReservedUniforms.push_back("border_thickness");
mReservedUniforms.push_back("guide_color");
mReservedUniforms.push_back("guide_thickness");
mReservedUniforms.push_back("guide_style");
mReservedUniforms.push_back("frame_rect");
// </FS:Beq>
llassert(mReservedUniforms.size() == END_RESERVED_UNIFORMS);

View File

@ -351,6 +351,14 @@ public:
SMAA_SEARCH_TEX, // "searchTex"
SMAA_BLEND_TEX, // "blendTex"
// <FS:Beq> Uniforms for snapshot frame
SNAPSHOT_BORDER_COLOR, // "border_color"
SNAPSHOT_BORDER_THICKNESS, // "border_thickness"
SNAPSHOT_GUIDE_COLOR, // "guide_color"
SNAPSHOT_GUIDE_THICKNESS, // "guide_thickness"
SNAPSHOT_GUIDE_STYLE, // "guide_style"
SNAPSHOT_FRAME_RECT, // "frame_rect"
// </FS:Beq>
END_RESERVED_UNIFORMS
} eGLSLReservedUniforms;
// clang-format on

View File

@ -282,6 +282,10 @@ bool FloaterAO::postBuild()
mPreviousButtonSmall->setCommitCallback(boost::bind(&FloaterAO::onClickPrevious, this));
mNextButtonSmall->setCommitCallback(boost::bind(&FloaterAO::onClickNext, this));
// <AS:Chanayane> Double click on animation in AO
mAnimationList->setDoubleClickCallback(boost::bind(&FloaterAO::onDoubleClick, this));
// </AS:Chanayane>
updateSmart();
AOEngine::instance().setReloadCallback(boost::bind(&FloaterAO::updateList, this));
@ -780,6 +784,40 @@ void FloaterAO::onClickNext()
AOEngine::instance().cycle(AOEngine::CycleNext);
}
// <AS:Chanayane> Double click on animation in AO
void FloaterAO::onDoubleClick()
{
LLScrollListItem* item = mAnimationList->getFirstSelected();
if (!item)
{
return;
}
LLUUID* animUUID = (LLUUID*)item->getUserdata();
if (!animUUID)
{
return;
}
// do nothing if animation is for a different state than the active state
if (mSelectedState != AOEngine::instance().getCurrentState())
{
return;
}
// activate AO set if necessary
if (AOEngine::instance().getCurrentSet() != mSelectedSet)
{
// sync small set selector with main set selector
mSetSelectorSmall->selectNthItem(mSetSelector->getCurrentIndex());
LL_DEBUGS("AOEngine") << "Set activated: " << mSetSelector->getSelectedItemLabel() << LL_ENDL;
AOEngine::instance().selectSet(mSelectedSet);
}
AOEngine::instance().playAnimation(*animUUID);
}
// </AS:Chanayane>
void FloaterAO::onClickMore()
{
LLRect fullSize = gSavedPerAccountSettings.getRect("floater_rect_animation_overrider_full");

View File

@ -91,6 +91,10 @@ class FloaterAO
void onClickMore();
void onClickLess();
// <AS:Chanayane> Double click on animation in AO
void onDoubleClick();
// </AS:Chanayane>
void onAnimationChanged(const LLUUID& animation);
void reloading(bool reload);

View File

@ -960,6 +960,115 @@ void AOEngine::cycle(eCycleMode cycleMode)
}
}
// <AS:Chanayane> Double click on animation in AO
void AOEngine::playAnimation(const LLUUID& animation)
{
if (!mEnabled)
{
return;
}
if (!mCurrentSet)
{
LL_DEBUGS("AOEngine") << "cycle without set." << LL_ENDL;
return;
}
// do not cycle if we're sitting and sit-override is off
if (mLastMotion == ANIM_AGENT_SIT && !mCurrentSet->getSitOverride())
{
return;
}
// do not cycle if we're standing and mouselook stand override is disabled while being in mouselook
else if (mLastMotion == ANIM_AGENT_STAND && mCurrentSet->getMouselookStandDisable() && mInMouselook)
{
return;
}
AOSet::AOState* state = mCurrentSet->getStateByRemapID(mLastMotion);
if (!state)
{
LL_DEBUGS("AOEngine") << "cycle without state." << LL_ENDL;
return;
}
if (!state->mAnimations.size())
{
LL_DEBUGS("AOEngine") << "cycle without animations in state." << LL_ENDL;
return;
}
LLViewerInventoryItem* item = gInventory.getItem(animation);
AOSet::AOAnimation anim;
anim.mName = item->LLInventoryItem::getName();
anim.mInventoryUUID = item->getUUID();
anim.mOriginalUUID = item->getLinkedUUID();
anim.mAssetUUID = LLUUID::null;
// if we can find the original animation already right here, save its asset ID, otherwise this will
// be tried again in AOSet::getAnimationForState() and/or AOEngine::cycle()
if (item->getLinkedItem())
{
anim.mAssetUUID = item->getAssetUUID();
}
LLUUID newAnimation = anim.mAssetUUID;
LLUUID oldAnimation = state->mCurrentAnimationID;
// don't do anything if the animation didn't change
if (newAnimation == oldAnimation)
{
return;
}
mAnimationChangedSignal(LLUUID::null);
// Searches for the index of the animation
U32 idx = -1;
for (U32 i = 0; i < state->mAnimations.size(); i++)
{
if (state->mAnimations[i].mAssetUUID == newAnimation)
{
idx = i;
break;
}
}
if (idx < 0)
{
idx = 0;
}
state->mCurrentAnimation = idx;
state->mCurrentAnimationID = newAnimation;
if (newAnimation.notNull())
{
LL_DEBUGS("AOEngine") << "requesting animation start for motion " << gAnimLibrary.animationName(mLastMotion) << ": " << newAnimation << LL_ENDL;
gAgent.sendAnimationRequest(newAnimation, ANIM_REQUEST_START);
mAnimationChangedSignal(state->mAnimations[state->mCurrentAnimation].mInventoryUUID);
}
else
{
LL_DEBUGS("AOEngine") << "overrider came back with NULL animation for motion " << gAnimLibrary.animationName(mLastMotion) << "." << LL_ENDL;
}
if (oldAnimation.notNull())
{
LL_DEBUGS("AOEngine") << "Cycling state " << state->mName << " - stopping animation " << oldAnimation << LL_ENDL;
gAgent.sendAnimationRequest(oldAnimation, ANIM_REQUEST_STOP);
gAgentAvatarp->LLCharacter::stopMotion(oldAnimation);
}
}
const AOSet* AOEngine::getCurrentSet() const
{
return mCurrentSet;
}
const AOSet::AOState* AOEngine::getCurrentState() const
{
return mCurrentSet->getStateByRemapID(mLastMotion);
}
// </AS:Chanayane>
void AOEngine::updateSortOrder(AOSet::AOState* state)
{
for (U32 index = 0; index < state->mAnimations.size(); ++index)

View File

@ -123,6 +123,12 @@ class AOEngine
void cycleTimeout(const AOSet* set);
void cycle(eCycleMode cycleMode);
// <AS:Chanayane> Double click on animation in AO
void playAnimation(const LLUUID& animation);
const AOSet* getCurrentSet() const;
const AOSet::AOState* getCurrentState() const;
// </AS:Chanayane>
void inMouselook(bool mouselook);
void selectSet(AOSet* set);
AOSet* selectSetByName(const std::string& name);

View File

@ -26124,5 +26124,68 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>0</integer>
</map>
<key>FSSnapshotShowCaptureFrame</key>
<map>
<key>Comment</key>
<string>If enabled, masks the main screen according to the capture frame.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSSnapshotFrameBorderColor</key>
<map>
<key>Comment</key>
<string>The color of the border for the Snapshot frame</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Color3</string>
<key>Value</key>
<array>
<real>0.0</real>
<real>0.0</real>
<real>0.0</real>
</array>
</map>
<key>FSSnapshotFrameGuideColor</key>
<map>
<key>Comment</key>
<string>The color of the Snapshot composition guides</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Color3</string>
<key>Value</key>
<array>
<real>1.0</real>
<real>1.0</real>
<real>0.0</real>
</array>
</map>
<key>FSSnapshotFrameBorderWidth</key>
<map>
<key>Comment</key>
<string>The thickness of the line drawn around the snapshot frame</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>2.0</real>
</map>
<key>FSSnapshotFrameGuideWidth</key>
<map>
<key>Comment</key>
<string>The thickness of the lines drawn for the composition guides</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>1.0</real>
</map>
</map>
</llsd>

View File

@ -0,0 +1,78 @@
#extension GL_ARB_texture_rectangle : enable
out vec4 frag_color;
uniform sampler2D diffuseRect;
uniform vec2 screen_res;
uniform vec4 frame_rect; // x, y, width, height (normalized 0->1)
uniform vec3 border_color;
uniform float border_thickness; // in pixels
uniform vec3 guide_color;
uniform float guide_thickness; // in pixels
uniform float guide_style; // 0: no guide, 1: rule of thirds, 2: golden spiral
in vec2 vary_fragcoord;
void main()
{
vec4 diff = texture(diffuseRect, vary_fragcoord);
vec2 tc = vary_fragcoord * screen_res;
// Convert normalized frame_rect to pixel values
vec4 frame_rect_px = vec4(frame_rect.x * screen_res.x, frame_rect.y * screen_res.y, frame_rect.z * screen_res.x, frame_rect.w * screen_res.y);
vec4 border_rect_px = vec4(
(frame_rect.x * screen_res.x) - border_thickness,
(frame_rect.y * screen_res.y) - border_thickness,
(frame_rect.z * screen_res.x) + border_thickness,
(frame_rect.w * screen_res.y) + border_thickness);
// Desaturate fragments outside the snapshot frame
if (tc.x < border_rect_px.x || tc.x > border_rect_px.z ||
tc.y < border_rect_px.y || tc.y > border_rect_px.w)
{
// Simple box blur
vec3 blur_color = vec3(0.0);
float blur_size = 2;
int blur_samples = 9;
for (int x = -1; x <= 1; ++x)
{
for (int y = -1; y <= 1; ++y)
{
vec2 offset = vec2(x, y) * blur_size / screen_res;
blur_color += texture(diffuseRect, vary_fragcoord + offset).rgb;
}
}
blur_color /= float(blur_samples);
float gray = dot(blur_color, vec3(0.299, 0.587, 0.114));
diff.rgb = vec3(gray);
}
else
{
// Draw border around the snapshot frame
if ((tc.x >= border_rect_px.x && tc.x < frame_rect_px.x) ||
(tc.x <= border_rect_px.z && tc.x > frame_rect_px.z) ||
(tc.y >= border_rect_px.y && tc.y < frame_rect_px.y) ||
(tc.y <= border_rect_px.w && tc.y > frame_rect_px.w))
{
diff.rgb = mix(diff.rgb, border_color, 0.5);
}
// Draw guide based on guide_style
if (guide_style == 1)
{
// Draw rule of thirds guide
float third_x = (frame_rect_px.z - frame_rect_px.x) / 3.0;
float third_y = (frame_rect_px.w - frame_rect_px.y) / 3.0;
if ((tc.x > frame_rect_px.x + third_x - guide_thickness && tc.x < frame_rect_px.x + third_x + guide_thickness) ||
(tc.x > frame_rect_px.x + 2.0 * third_x - guide_thickness && tc.x < frame_rect_px.x + 2.0 * third_x + guide_thickness) ||
(tc.y > frame_rect_px.y + third_y - guide_thickness && tc.y < frame_rect_px.y + third_y + guide_thickness) ||
(tc.y > frame_rect_px.y + 2.0 * third_y - guide_thickness && tc.y < frame_rect_px.y + 2.0 * third_y + guide_thickness))
{
diff.rgb = mix(diff.rgb, guide_color, 0.05);
}
}
}
frag_color = diff;
}

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;
}
@ -238,7 +254,7 @@ void FSFloaterPoser::onClose(bool app_quitting)
gSavedSettings.setBOOL(POSER_ADVANCEDWINDOWSTATE_SAVE_KEY, mToggleAdvancedPanelBtn->getValue().asBoolean());
if (gSavedSettings.getBOOL(POSER_STOPPOSINGWHENCLOSED_SAVE_KEY))
stopPosingSelf();
stopPosingAllAvatars();
LLFloater::onClose(app_quitting);
}
@ -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)
@ -892,20 +1016,24 @@ void FSFloaterPoser::startPosingSelf()
onAvatarSelect();
}
void FSFloaterPoser::stopPosingSelf()
void FSFloaterPoser::stopPosingAllAvatars()
{
if (!gAgentAvatarp || gAgentAvatarp.isNull())
return;
LLVOAvatar* avatar = getAvatarByUuid(gAgentAvatarp->getID());
if (!avatar)
return;
for (auto listItem : mAvatarSelectionScrollList->getAllData())
{
LLScrollListCell* cell = listItem->getColumn(COL_UUID);
if (!cell)
continue;
bool arePosingSelected = mPoserAnimator.isPosingAvatar(avatar);
if (!arePosingSelected)
return;
LLUUID selectedAvatarId = cell->getValue().asUUID();
LLVOAvatar* listAvatar = getAvatarByUuid(selectedAvatarId);
if (mPoserAnimator.isPosingAvatar(listAvatar))
mPoserAnimator.stopPosingAvatar(listAvatar);
}
mPoserAnimator.stopPosingAvatar(avatar);
onAvatarSelect();
}
@ -1145,7 +1273,7 @@ void FSFloaterPoser::onUndoLastRotation()
}
enableOrDisableRedoButton();
refreshRotationSliders();
refreshRotationSlidersAndSpinners();
refreshTrackpadCursor();
}
@ -1169,8 +1297,8 @@ void FSFloaterPoser::onUndoLastPosition()
mPoserAnimator.undoLastJointPosition(avatar, *item, getUiSelectedBoneDeflectionStyle());
}
refreshAdvancedPositionSliders();
refreshAvatarPositionSliders();
refreshAdvancedPositionSlidersAndSpinners();
refreshAvatarPositionSlidersAndSpinners();
}
void FSFloaterPoser::onUndoLastScale()
@ -1193,7 +1321,7 @@ void FSFloaterPoser::onUndoLastScale()
mPoserAnimator.undoLastJointScale(avatar, *item, getUiSelectedBoneDeflectionStyle());
}
refreshAdvancedScaleSliders();
refreshAdvancedScaleSlidersAndSpinners();
}
void FSFloaterPoser::onSetAvatarToTpose()
@ -1233,8 +1361,8 @@ void FSFloaterPoser::onResetPosition()
mPoserAnimator.resetJointPosition(avatar, *item, getUiSelectedBoneDeflectionStyle());
}
refreshAdvancedPositionSliders();
refreshAvatarPositionSliders();
refreshAdvancedPositionSlidersAndSpinners();
refreshAvatarPositionSlidersAndSpinners();
}
void FSFloaterPoser::onResetScale()
@ -1260,7 +1388,7 @@ void FSFloaterPoser::onResetScale()
mPoserAnimator.resetJointScale(avatar, *item, getUiSelectedBoneDeflectionStyle());
}
refreshAdvancedScaleSliders();
refreshAdvancedScaleSlidersAndSpinners();
}
void FSFloaterPoser::onRedoLastRotation()
@ -1284,7 +1412,7 @@ void FSFloaterPoser::onRedoLastRotation()
}
enableOrDisableRedoButton();
refreshRotationSliders();
refreshRotationSlidersAndSpinners();
refreshTrackpadCursor();
}
@ -1308,8 +1436,8 @@ void FSFloaterPoser::onRedoLastPosition()
mPoserAnimator.redoLastJointPosition(avatar, *item, getUiSelectedBoneDeflectionStyle());
}
refreshAdvancedPositionSliders();
refreshAvatarPositionSliders();
refreshAdvancedPositionSlidersAndSpinners();
refreshAvatarPositionSlidersAndSpinners();
}
void FSFloaterPoser::onRedoLastScale()
@ -1332,7 +1460,7 @@ void FSFloaterPoser::onRedoLastScale()
mPoserAnimator.redoLastJointScale(avatar, *item, getUiSelectedBoneDeflectionStyle());
}
refreshAdvancedScaleSliders();
refreshAdvancedScaleSlidersAndSpinners();
}
void FSFloaterPoser::enableOrDisableRedoButton()
@ -1565,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()
@ -1575,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);
}
@ -1584,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()
@ -1624,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)
@ -1665,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();
}
@ -1689,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)
@ -1700,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)
@ -1873,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();
}
}
@ -2074,7 +2239,7 @@ void FSFloaterPoser::onAvatarsRefresh()
LLAvatarName av_name;
std::string animeshName = getControlAvatarName(avatar);
if (animeshName.empty())
animeshName = avatar->getFullname();
continue;
LLSD row;
row["columns"][COL_ICON]["column"] = "icon";
@ -2109,6 +2274,9 @@ std::string FSFloaterPoser::getControlAvatarName(const LLControlAvatar* avatar)
if (attachedItem)
return attachedItem->getName();
if (rootEditObject->permYouOwner())
return avatar->getFullname();
return "";
}
@ -2146,24 +2314,6 @@ void FSFloaterPoser::setSavePosesButtonText(bool setAsSaveDiff)
setAsSaveDiff ? mSavePosesBtn->setLabel("Save Diff") : mSavePosesBtn->setLabel("Save Pose");
}
bool FSFloaterPoser::posingAnyoneOnScrollList()
{
for (auto listItem : mAvatarSelectionScrollList->getAllData())
{
LLScrollListCell* cell = listItem->getColumn(COL_UUID);
if (!cell)
continue;
LLUUID selectedAvatarId = cell->getValue().asUUID();
LLVOAvatar* listAvatar = getAvatarByUuid(selectedAvatarId);
if (mPoserAnimator.isPosingAvatar(listAvatar))
return true;
}
return false;
}
void FSFloaterPoser::addBoldToScrollList(LLScrollListCtrl* list, LLVOAvatar* avatar)
{
if (!avatar)

View File

@ -236,7 +236,7 @@ class FSFloaterPoser : public LLFloater
void enableOrDisableRedoButton();
void onPoseStartStop();
void startPosingSelf();
void stopPosingSelf();
void stopPosingAllAvatars();
void onLimbTrackballChanged();
void onYawPitchRollSliderChanged();
void onAvatarPositionSet();
@ -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.
@ -328,11 +330,6 @@ class FSFloaterPoser : public LLFloater
/// <param name="setAsSaveDiff">Whether to indicate a diff will be saved, instead of a pose.</param>
void setSavePosesButtonText(bool setAsSaveDiff);
/// <summary>
/// Gets whether any avatar know by the UI is being posed.
/// </summary>
bool posingAnyoneOnScrollList();
/// <summary>
/// Applies the appropriate font-face (such as bold) to the text of the supplied list, to indicate use.
/// </summary>
@ -501,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

@ -28,11 +28,35 @@ if [[ -f "$CONFIG_FILE" ]]; then
echo "Notarized with id: [$match]"
else
echo "No match found"
exit 1
fi
# if [[ ! $match -eq 0 ]]; then
echo "Running Stapler"
xcrun stapler staple "$app_file"
# --- WAIT / RETRY LOGIC FOR STAPLER ---
# Try stapler up to 5 times with a 5-second delay in between attempts
max_attempts=5
sleep_seconds=5
attempt=1
while [[ $attempt -le $max_attempts ]]; do
echo "Running stapler (attempt $attempt of $max_attempts)..."
xcrun stapler staple "$app_file"
ret=$?
if [[ $ret -eq 0 ]]; then
echo "Stapling succeeded on attempt $attempt"
break
else
if [[ $attempt -lt $max_attempts ]]; then
echo "Stapling failed (Error $ret). Waiting $sleep_seconds seconds before retry..."
sleep $sleep_seconds
else
echo "Stapling failed after $max_attempts attempts, giving up."
exit 65
fi
fi
attempt=$((attempt + 1))
done
# Delete the zip file to stop it being packed in the dmg
rm -f "$zip_file"
if [[ $? -eq 0 ]]; then

View File

@ -103,6 +103,10 @@ echo "LIBGL_DRIVERS_PATH is ${LIBGL_DRIVERS_PATH}"
if [ "$GTK_IM_MODULE" = "scim" ]; then
export GTK_IM_MODULE=xim
fi
if [ "$XMODIFIERS" = "" ]; then
## IME is valid only for fcitx, not when using ibus
export XMODIFIERS="@im=fcitx"
fi
## - Automatically work around the ATI mouse cursor crash bug:
## (this workaround is disabled as most fglrx users do not see the bug)

View File

@ -1098,15 +1098,20 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
const LLWearableType::EType type = new_wearable->getType();
//<FS:Beq> BOM fallback legacy opensim
if(!gAgent.getRegion()->bakesOnMeshEnabled())
#ifdef OPENSIM
if (!LLGridManager::getInstance()->isInSecondLife())
{
if(type == LLWearableType::WT_UNIVERSAL)
if(!gAgent.getRegion()->bakesOnMeshEnabled())
{
LL_DEBUGS("Avatar") << "Universal wearable not supported on this region - ignoring." << LL_ENDL;
mismatched++;
continue;
if(type == LLWearableType::WT_UNIVERSAL)
{
LL_DEBUGS("Avatar") << "Universal wearable not supported on this region - ignoring." << LL_ENDL;
mismatched++;
continue;
}
}
}
#endif
//</FS:Beq>
if (type < 0 || type>=LLWearableType::WT_COUNT)
{

View File

@ -966,3 +966,13 @@ void LLFloaterFlickr::onOpen(const LLSD& key)
mFlickrPhotoPanel->onOpen(key);
}
// </FS:Ansariel>
//<FS:Beq> Add snapshot frame support to flickr
LLSnapshotLivePreview* LLFloaterFlickr::getPreviewView()
{
if(mFlickrPhotoPanel)
{
return mFlickrPhotoPanel->getPreviewView();
}
return nullptr;
}
//</FS:Beq>

View File

@ -134,6 +134,7 @@ public:
// <FS:Ansariel> Exodus' flickr upload
void onOpen(const LLSD& key);
LLSnapshotLivePreview* getPreviewView(); // <FS:Beq/> Required for snapshot frame rendering
private:
LLFlickrPhotoPanel* mFlickrPhotoPanel;

View File

@ -1480,12 +1480,14 @@ bool LLFloaterSnapshot::isWaitingState()
return (impl->getStatus() == ImplBase::STATUS_WORKING);
}
bool LLFloaterSnapshotBase::ImplBase::updatePreviewList(bool initialized)
// <FS:Beq> FIRE-35002 - Post to flickr broken, improved solution
// bool LLFloaterSnapshotBase::ImplBase::updatePreviewList(bool initialized)
bool LLFloaterSnapshotBase::ImplBase::updatePreviewList(bool initialized, bool have_flickr)
// </FS:Beq>
{
// <FS:Ansariel> Share to Flickr
//if (!initialized)
LLFloaterFlickr* floater_flickr = LLFloaterReg::findTypedInstance<LLFloaterFlickr>("flickr");
if (!initialized && !floater_flickr)
if (!initialized && !have_flickr)
// </FS:Ansariel>
return false;
@ -1504,8 +1506,11 @@ void LLFloaterSnapshotBase::ImplBase::updateLivePreview()
{
// don't update preview for hidden floater
// <FS:Beq> FIRE-35002 - Post to flickr broken
// if (mFloater && mFloater->isInVisibleChain() && ImplBase::updatePreviewList(true))
if (ImplBase::updatePreviewList(true) && mFloater)
LLFloaterFlickr* floater_flickr = LLFloaterReg::findTypedInstance<LLFloaterFlickr>("flickr");
auto have_flickr = floater_flickr != nullptr;
if ( ((mFloater && mFloater->isInVisibleChain()) ||
have_flickr) &&
ImplBase::updatePreviewList(true, have_flickr))
// </FS:Beq>
{
LL_DEBUGS() << "changed" << LL_ENDL;

View File

@ -122,7 +122,7 @@ public:
virtual EStatus getStatus() const { return mStatus; }
virtual void setNeedRefresh(bool need);
static bool updatePreviewList(bool initialized);
static bool updatePreviewList(bool initialized, bool have_flickr = false); // <FS:Beq/> FIRE-35002 - Post to flickr broken, improved solution
void setAdvanced(bool advanced) { mAdvanced = advanced; }
void setSkipReshaping(bool skip) { mSkipReshaping = skip; }

View File

@ -129,16 +129,12 @@ void LLHUDText::render()
// If the current text object is highighed and the use hover highlight feature is enabled, then
// disable writing to the depth buffer
static LLCachedControl<bool> mbUseHoverHighlight(gSavedSettings, "FSHudTextUseHoverHighlight");
if (mbUseHoverHighlight && mbIsHighlighted)
{
LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE);
}
//Else, use the standard method of writing to the depth buffer for all other non-highlighted text objects
else
{
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
}
// </FS:minerjr> [FIRE-35019]
// <FS:minerjr> [FIRE-35102] - Hover text appearing through walls in Beta 7.1.12.7737
// So it turns out when the LLGLDepthTest object goes out of scope, it reverts back
// to the previous state. So by having the LLGLDepthTest in the if statements, they were
// never applied.
LLGLDepthTest gls_depth(mbUseHoverHighlight && mbIsHighlighted ? GL_FALSE : GL_TRUE, GL_FALSE);
// </FS:minerjr> [FIRE-35019] </FS:minerjr> [FIRE-35102]
//LLGLDisable gls_stencil(GL_STENCIL_TEST);
renderText();
}

View File

@ -3978,7 +3978,7 @@ bool LLViewerRegion::meshUploadEnabled() const
bool LLViewerRegion::bakesOnMeshEnabled() const
{
return (mSimulatorFeatures.has("BakesOnMeshEnabled") &&
return (mSimulatorFeaturesReceived && mSimulatorFeatures.has("BakesOnMeshEnabled") && // FIRE-35111 (bugsplat) checking bakes on mesh feature before features received.
mSimulatorFeatures["BakesOnMeshEnabled"].asBoolean());
}

View File

@ -137,6 +137,7 @@ LLGLSLShader gGlowProgram;
LLGLSLShader gGlowExtractProgram;
LLGLSLShader gPostScreenSpaceReflectionProgram;
LLGLSLShader gPostVignetteProgram; // <FS:CR> Import Vignette from Exodus
LLGLSLShader gPostSnapshotFrameProgram; // <FS:Beq/> Add Snapshot frame guide
// Deferred rendering shaders
LLGLSLShader gDeferredImpostorProgram;
@ -1033,6 +1034,7 @@ bool LLViewerShaderMgr::loadShadersEffects()
gGlowProgram.unload();
gGlowExtractProgram.unload();
gPostVignetteProgram.unload(); // <FS:Ansariel> Import Vignette from Exodus
gPostSnapshotFrameProgram.unload(); // <FS:Beq/> Add Snapshot framing shader
return true;
}
@ -1084,6 +1086,17 @@ bool LLViewerShaderMgr::loadShadersEffects()
success = gPostVignetteProgram.createShader();
}
// </FS:CR>
// <FS:Beq> Add Snapshot framing shader
if (success)
{
gPostSnapshotFrameProgram.mName = "Snapshot Frame Post";
gPostSnapshotFrameProgram.mShaderFiles.clear();
gPostSnapshotFrameProgram.mShaderFiles.push_back(make_pair("post/exoPostBaseV.glsl", GL_VERTEX_SHADER));
gPostSnapshotFrameProgram.mShaderFiles.push_back(make_pair("post/snapshotFrameF.glsl", GL_FRAGMENT_SHADER));
gPostSnapshotFrameProgram.mShaderLevel = mShaderLevel[SHADER_EFFECT];
success = gPostSnapshotFrameProgram.createShader();
}
// </FS:Beq>
return success;

View File

@ -214,6 +214,7 @@ extern LLGLSLShader gImpostorProgram;
// Post Process Shaders
extern LLGLSLShader gPostScreenSpaceReflectionProgram;
extern LLGLSLShader gPostVignetteProgram; // <FS:CR> Import Vignette from Exodus
extern LLGLSLShader gPostSnapshotFrameProgram; // <FS:Beq/> Snapshot Frame overlay
// Deferred rendering shaders
extern LLGLSLShader gDeferredImpostorProgram;

View File

@ -109,6 +109,9 @@
#include "llfloaterpathfindingconsole.h"
#include "llfloaterpathfindingcharacters.h"
#include "llfloatertools.h"
#include "llfloatersnapshot.h" // <FS:Beq/> for snapshotFrame
#include "llfloaterflickr.h" // <FS:Beq/> for snapshotFrame
#include "llsnapshotlivepreview.h" // <FS:Beq/> for snapshotFrame
// #include "llpanelface.h" // <FS:Zi> switchable edit texture/materials panel - include not needed
#include "llpathfindingpathtool.h"
#include "llscenemonitor.h"
@ -7872,7 +7875,7 @@ void LLPipeline::combineGlow(LLRenderTarget* src, LLRenderTarget* dst)
}
// <FS:Beq> updated Vignette code (based on original Exo Vignette)
void LLPipeline::renderVignette(LLRenderTarget* src, LLRenderTarget* dst)
bool LLPipeline::renderVignette(LLRenderTarget* src, LLRenderTarget* dst)
{
if (RenderVignette.mV[0] > 0.f)
{
@ -7909,14 +7912,166 @@ void LLPipeline::renderVignette(LLRenderTarget* src, LLRenderTarget* dst)
shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
shader->unbind();
dst->flush();
return true;
}
else
{
copyRenderTarget(src, dst);
return false;
}
}
// </FS:Beq>
// <FS:Beq> Render Snapshot frame oerlay
bool LLPipeline::renderSnapshotFrame(LLRenderTarget* src, LLRenderTarget* dst)
{
static LLCachedControl<bool> show_frame(gSavedSettings, "FSSnapshotShowCaptureFrame", false);
static LLCachedControl<bool> show_guides(gSavedSettings, "FSSnapshotShowGuides", false);
float left = 0.f;
float top = 0.f;
float right = 1.f;
float bottom = 1.f;
// TODO - add debug settings to control the appearance of the snapshot frameand guides
static LLCachedControl<LLColor3> border_color(gSavedSettings, "FSSnapshotFrameBorderColor", LLColor3(1.f, 0.f, 0.f));
static LLCachedControl<LLColor3> guide_color(gSavedSettings, "FSSnapshotFrameGuideColor", LLColor3(1.f, 1.f, 0.f));
static LLCachedControl<F32> border_thickness(gSavedSettings, "FSSnapshotFrameBorderWidth", 2.0f);
static LLCachedControl<F32> guide_thickness(gSavedSettings, "FSSnapshotFrameGuideWidth", 2.0f);
F32 guide_style = 1.f; // 0:off, 1:rule_of_thirds, others maybe in the future
if (!show_guides)
{
guide_style = 0.f;
}
const bool simple_snapshot_visible = LLFloaterReg::instanceVisible("simple_snapshot");
const bool flickr_snapshot_visible = LLFloaterReg::instanceVisible("flickr");
const bool snapshot_visible = LLFloaterReg::instanceVisible("snapshot");
const bool any_snapshot_visible = simple_snapshot_visible || flickr_snapshot_visible || snapshot_visible;
if (!show_frame || !any_snapshot_visible || !gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
{
return false;
}
LLSnapshotLivePreview * previewView = nullptr;
if (snapshot_visible)
{
auto * floater =dynamic_cast<LLFloaterSnapshotBase*>(LLFloaterReg::findInstance("snapshot"));
previewView = floater->impl->getPreviewView();
}
// Note: simple_snapshot not supported as there can be more than one active and more complex selection is required
if (flickr_snapshot_visible && !previewView)
{
auto * floater = dynamic_cast<LLFloaterFlickr*>(LLFloaterReg::findInstance("flickr"));
previewView = floater->getPreviewView();
}
if(!previewView)
{
return false;
}
static LLCachedControl<bool> keep_aspect(gSavedSettings, "KeepAspectForSnapshot", false);
S32 snapshot_width;
S32 snapshot_height;
previewView->getSize(snapshot_width, snapshot_height);
F32 screen_aspect = float(gViewerWindow->getWindowWidthRaw()) / float(gViewerWindow->getWindowHeightRaw());
F32 snapshot_aspect = float(snapshot_width) / float(snapshot_height);
if (keep_aspect || (std::fabs(screen_aspect - snapshot_aspect) < 1e-6f) )
{
top = 0.0f;
left = 0.0f;
bottom = 1.0f;
right = 1.0f;
}
float w = screen_aspect;
float h = 1.0;
if (snapshot_aspect > screen_aspect)
{
float frame_width = w;
float frame_height = frame_width / snapshot_aspect;
// Centre this box in [0..1]×[0..1]
float y_offset = 0.5f * (h - frame_height);
left = 0.f;
top = y_offset / h;
right = 1.f;
bottom = (y_offset + frame_height) / h;
}
else
{
float frame_height = h;
float frame_width = h * snapshot_aspect;
// Centre this box in [0..1]×[0..1]
float x_offset = 0.5f * (w - frame_width);
left = x_offset / w;
top = 0.f;
right = (x_offset + frame_width) / w;
bottom = 1.f;
}
LL_PROFILE_GPU_ZONE("Snapshot Frame");
dst->bindTarget();
LLGLSLShader *shader = &gPostSnapshotFrameProgram;
// bind the program and output to screentriangle VBO
shader->bind();
S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
if (channel > -1)
{
src->bindTexture(0, channel, LLTexUnit::TFO_POINT);
}
else
{
LL_ERRS("snapshot_frame") << "Failed to bind diffuse texture" << LL_ENDL;
}
shader->uniform2f(
LLShaderMgr::DEFERRED_SCREEN_RES,
(GLfloat)dst->getWidth(),
(GLfloat)dst->getHeight());
// Assuming frame_rect is a static or accessible variable containing the frame dimensions
shader->uniform4f(
LLShaderMgr::SNAPSHOT_FRAME_RECT,
(GLfloat)left,
(GLfloat)top,
(GLfloat)right,
(GLfloat)bottom);
shader->uniform3fv(
LLShaderMgr::SNAPSHOT_BORDER_COLOR,
1,
border_color().mV);
shader->uniform1f(
LLShaderMgr::SNAPSHOT_BORDER_THICKNESS,
(GLfloat)border_thickness);
shader->uniform3fv(
LLShaderMgr::SNAPSHOT_GUIDE_COLOR,
1,
guide_color().mV);
shader->uniform1f(
LLShaderMgr::SNAPSHOT_GUIDE_THICKNESS,
(GLfloat)guide_thickness);
shader->uniform1f(
LLShaderMgr::SNAPSHOT_GUIDE_STYLE,
(GLfloat)guide_style);
mScreenTriangleVB->setBuffer();
mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
stop_glerror();
shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
shader->unbind();
dst->flush();
return true;
}
// </FS:Beq>
void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
{
{
@ -8217,8 +8372,23 @@ void LLPipeline::renderFinalize()
targetBuffer = params.m_pSrcBuffer;
}
// [/RLVa:KB]
renderVignette(activeBuffer, targetBuffer);
finalBuffer = targetBuffer;
if (renderVignette(activeBuffer, targetBuffer))
{
auto prevActiveBuffer = activeBuffer;
activeBuffer = targetBuffer;
targetBuffer = prevActiveBuffer;
};
// </FS:Beq>
// <FS:Beq> new shader for snapshot frame helper
if (renderSnapshotFrame(targetBuffer, activeBuffer))
{
auto prevActiveBuffer = activeBuffer;
activeBuffer = targetBuffer;
targetBuffer = prevActiveBuffer;
};
finalBuffer = activeBuffer;
// </FS:Beq>
if (RenderBufferVisualization > -1)
{

View File

@ -348,7 +348,8 @@ public:
void renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCamera& camera, LLCullResult& result, bool depth_clamp);
void renderSelectedFaces(const LLColor4& color);
void renderHighlights();
void renderVignette(LLRenderTarget* src, LLRenderTarget* dst);
bool renderVignette(LLRenderTarget* src, LLRenderTarget* dst);
bool renderSnapshotFrame(LLRenderTarget* src, LLRenderTarget* dst); // <FS:Beq/> Add snapshot frame rendering
void renderDebug();
void renderPhysicsDisplay();

View File

@ -235,7 +235,7 @@
<panel name="trackball_button_panel">
<button name="undo_change" tool_tip="Letzte Rotationsänderung rückgängig machen"/>
<button name="button_redo_change" tool_tip="Letzte Rotationsänderung wiederherstellen"/>
<button name="refresh_avatars" tool_tip="Doppelklicken, um alle ausgewählten Körperteile auf die Ursprungswerte zurückzusetzen."/>
<button name="poser_joint_reset" tool_tip="Doppelklicken, um alle ausgewählten Körperteile auf die Ursprungswerte zurückzusetzen."/>
<button name="delta_mode_toggle" tool_tip="Falls mehrere Gelenke geändert werden, diese um denselben Wert ändern anstatt in dieselbe Rotation zu versetzen. Wird auch zur Verhinderung von Gimbal Lock verwendet."/>
<button label="Spieg." name="button_toggleMirrorRotation" tool_tip="Änderungen an gegenüberliegendem Gelenk spiegeln."/>
<button label="Sym." name="button_toggleSympatheticRotation" tool_tip="Gegenüberliegendes Gelenk gleichermaßen anpassen."/>

View File

@ -59,6 +59,8 @@
<combo_box.item label="Tiefe" name="Depth"/>
<combo_box.item label="Tiefe (24 Bit)" name="Depth24"/>
</combo_box>
<check_box label="Aufnahmerahmen anzeigen" name="show_frame" tool_tip="Zeigt einen Rahmen um den Bereich der Aufnahme an. Teile der Szene, die außerhalb des Aufnahmebereichs liegen, werden entsättigt und leicht verschwommen dargestellt."/>
<check_box label="Aufnahme-Guide anzeigen" name="show_guides" tool_tip="Zeigt Aufnahme-Guide (Drittel-Regel) innerhalb des Aufnahmebereichs an."/>
<check_box label="Benutzeroberfläche" name="ui_check"/>
<check_box label="L$-Kontostand" name="currency_check"/>
<check_box label="HUDs" name="hud_check"/>

View File

@ -11,6 +11,8 @@
<text name="working_lbl">
Aktualisiere...
</text>
<check_box label="Rahmen anzeigen" name="show_frame" tool_tip="Zeigt einen Rahmen um den Bereich der Aufnahme an. Teile der Szene, die außerhalb des Aufnahmebereichs liegen, werden entsättigt und leicht verschwommen dargestellt."/>
<check_box label="Guide anzeigen" name="show_guides" tool_tip="Zeigt Aufnahme-Guide (Drittel-Regel) innerhalb des Aufnahmebereichs an."/>
<button label="Aktualisieren" name="new_snapshot_btn" tool_tip="Zum Aktualisieren klicken"/>
<button label="Vorschau" name="big_preview_btn" tool_tip="Klicken, um Vorschau ein-/auszuschalten"/>
<text name="title_label">

View File

@ -10,7 +10,7 @@
single_instance="true"
reuse_instance="true"
title="Share to Flickr"
height="590"
height="600"
width="272">
<panel
height="590"
@ -27,7 +27,7 @@
tab_height="21"
tab_position="top"
top="7"
height="555"
height="565"
follows="all"
halign="center">
<panel

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>
@ -923,7 +989,7 @@ width="403">
layout="topleft"
image_overlay="Inv_TrashOpen"
image_unselected="Toolbar_Middle_Off"
name="refresh_avatars"
name="poser_joint_reset"
tool_tip="Double click to reset all selected body parts to when you first started posing"
width="18"
top_delta="0"
@ -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

View File

@ -5,7 +5,7 @@
can_minimize="true"
can_resize="false"
can_close="true"
height="475"
height="480"
layout="topleft"
name="Snapshot"
single_instance="true"
@ -124,7 +124,7 @@
top_delta="0"
width="31" />
<panel
height="174"
height="200"
layout="topleft"
follows="top|left"
left="0"
@ -200,6 +200,25 @@
top_pad="0"
width="180"
name="hud_check" />
<check_box
control_name="FSSnapshotShowCaptureFrame"
label="Show capture frame"
tool_tip="Show a frame on-screen that surrounds the areas of the snapshot. Parts of the scene that are outside of the snapshot will be de-saturated and slightly blurred."
layout="topleft"
left="10"
top_pad="7"
width="180"
name="show_frame" />
<check_box
enabled_control="FSSnapshotShowCaptureFrame"
control_name="FSSnapshotShowGuides"
label="Show framing guide"
tool_tip="Show framing guide (rule of thirds) inside the snapshot frame"
layout="topleft"
left="30"
top_pad="7"
width="180"
name="show_guides" />
<check_box
label="Freeze frame (fullscreen)"
layout="topleft"

View File

@ -137,6 +137,24 @@
width="251">
Refreshing...
</text>
<check_box
control_name="FSSnapshotShowCaptureFrame"
label="Show capture frame"
tool_tip="Show a frame on-screen that surrounds the areas of the snapshot. Parts of the scene that are outside of the snapshot will be de-saturated and slightly blurred."
layout="topleft"
left="10"
top_pad="7"
width="124"
name="show_frame" />
<check_box
enabled_control="FSSnapshotShowCaptureFrame"
control_name="FSSnapshotShowGuides"
label="Framing guide"
tool_tip="Show framing guide (rule of thirds) inside the snapshot frame."
layout="topleft"
left_pad="10"
width="60"
name="show_guides" />
<view_border
bevel_style="in"
follows="left|top"

View File

@ -226,7 +226,7 @@
<panel name="trackball_button_panel">
<button name="undo_change" tool_tip="Annuler la dernière rotation" />
<button name="button_redo_change" tool_tip="Rétablir la dernière modification annulée" />
<button name="refresh_avatars" tool_tip="Double-cliquez pour remettre toutes les parties du corps sélectionnées dans l'état où elles se trouvaient lorsque vous avez commencé à poser." />
<button name="poser_joint_reset" tool_tip="Double-cliquez pour remettre toutes les parties du corps sélectionnées dans l'état où elles se trouvaient lorsque vous avez commencé à poser." />
<button name="delta_mode_toggle" tool_tip="Si vous modifiez plusieurs articulations, chacune d'entre elles sera modifiée de la même manière, au lieu de toutes les modifier du même coup. Sert également à déverrouiller le Gimbal Lock." />
<button label="Miroir" name="button_toggleMirrorRotation" tool_tip="Changer l'articulation opposée, comme dans un miroir." />
<button label="Sym." name="button_toggleSympatheticRotation" tool_tip="Modifier l'articulation opposée, mais de la même manière." />

View File

@ -226,7 +226,7 @@
<panel name="trackball_button_panel">
<button name="undo_change" tool_tip="Annulla l'ultima modifica della rotazione" />
<button name="button_redo_change" tool_tip="Ripristina l'ultima modifica annullata" />
<button name="refresh_avatars" tool_tip="Fai doppio clic per ripristinare tutte le parti del corpo selezionate al momento in cui hai iniziato a modificare la posa" />
<button name="poser_joint_reset" tool_tip="Fai doppio clic per ripristinare tutte le parti del corpo selezionate al momento in cui hai iniziato a modificare la posa" />
<button name="delta_mode_toggle" tool_tip="Se si cambiano più giunture, ognuna cambia della stessa quantità, anziché ottenere la stessa rotazione per tutte" />
<button label="Spec." name="button_toggleMirrorRotation" tool_tip="Cambia la giuntura opposta, come in uno specchio" />
<button label="Simp." name="button_toggleSympatheticRotation" tool_tip="Cambia la giuntura opposta, ma nello stesso modo" />

View File

@ -227,7 +227,7 @@
<panel name="trackball_button_panel">
<button name="undo_change" tool_tip="Cofnij ostatnią zmianę obrotu" />
<button name="button_redo_change" tool_tip="Ponów ostatnią cofniętą zmianę" />
<button name="refresh_avatars" tool_tip="Kliknij dwukrotnie, aby zresetować wszystkie wybrane części ciała do stanu z momentu, w którym po raz pierwszy zacząłeś/aś pozować" />
<button name="poser_joint_reset" tool_tip="Kliknij dwukrotnie, aby zresetować wszystkie wybrane części ciała do stanu z momentu, w którym po raz pierwszy zacząłeś/aś pozować" />
<button name="delta_mode_toggle" tool_tip="Jeśli zmienisz wiele stawów, każdy z nich zmieni się o tę samą wartość, zamiast wszystkie o taki sam obrót. Stosowany również do pozbywania się blokady Gimbala." />
<button label="Odbij" name="button_toggleMirrorRotation" tool_tip="Zmień przeciwległy staw, jak w lustrze." />
<button label="Sym." name="button_toggleSympatheticRotation" tool_tip="Zmień przeciwległy staw, ale w ten sam sposób." />

View File

@ -221,7 +221,7 @@
<panel name="trackball_button_panel">
<button name="undo_change" tool_tip="Отмените последнее изменение поворота"/>
<button name="button_redo_change" tool_tip="Повторить последнее отмененное изменение"/>
<button name="refresh_avatars" tool_tip="Двойной клик чтобы восстановить все выбранные части тела на тот момент, когда вы впервые начали изменения"/>
<button name="poser_joint_reset" tool_tip="Двойной клик чтобы восстановить все выбранные части тела на тот момент, когда вы впервые начали изменения"/>
<button name="delta_mode_toggle" tool_tip="При изменении нескольких суставов каждый из них изменяется на одинаковую величину, а не все они получают одинаковое вращение."/>
<button label="Зерк." name="button_toggleMirrorRotation" tool_tip="Изменять положение противоположного сустава как в зеркале."/>
<button label="Симм." name="button_toggleSympatheticRotation" tool_tip="Изменять положение противоположного сустав таким же образом."/>

View File

@ -16,8 +16,12 @@
<stat_bar label="Треугольников на кадр" name="ktrisframe"/>
<stat_bar label="Треугольников в секунду" name="ktrissec"/>
<stat_bar label="Всего объектов" name="objs"/>
<stat_bar name="cachedobjs" label="Кэшированных объектов"/>
<stat_bar label="Новых объектов" name="newobjs"/>
<stat_bar label="Частота попаданий в кэш объектов" name="object_cache_hits"/>
<stat_bar name="occlusion_queries" label="Выполненные запросы на окклюзию"/>
<stat_bar name="occluded" label="Закрытые объекты"/>
<stat_bar name="unoccluded" label="Незакрытый объекты"/>
</stat_view>
<stat_view label="Текстура" name="texture">
<stat_bar label="Частота попаданий в кэш" name="texture_cache_hits"/>
@ -29,15 +33,18 @@
<stat_bar label="Неформатированная память" name="rawmemstat"/>
<stat_bar label="Ограничение памяти" name="glboundmemstat"/>
</stat_view>
<stat_view name="material" label="Материал">
<stat_bar name="nummaterials" label="Подсчет"/>
</stat_view>
<stat_view label="Сеть" name="network">
<stat_bar label="Входящие пакеты" name="packetsinstat"/>
<stat_bar label="Исходящие пакеты" name="packetsoutstat"/>
<stat_bar label="Объекты" name="objectkbitstat"/>
<stat_bar label="Текстура" name="texturekbitstat"/>
<stat_bar label="Актив" name="assetkbitstat"/>
<stat_bar label="Слои" name="layerskbitstat"/>
<stat_bar label="Действительный ввод" name="actualinkbitstat"/>
<stat_bar label="Действительный вывод" name="actualoutkbitstat"/>
<stat_bar label="Объекты" name="objectdatareceived"/>
<stat_bar label="Текстура" name="texturedatareceived"/>
<stat_bar label="Актив" name="assetudpdatareceived"/>
<stat_bar label="Слои" name="layersdatareceived"/>
<stat_bar label="Фактический ввод" name="messagedatain"/>
<stat_bar label="Фактический вывод" name="messagedataout"/>
</stat_view>
</stat_view>
<stat_view label="Симулятор" name="sim">

View File

@ -107,6 +107,7 @@
<menu_item_check name="Conversation Log..." label="Журнал разговоров..."/>
<menu_item_check label="Ближайшие голоса" name="Nearby Voice"/>
<menu_item_call label="Список заблокированных" name="Block List"/>
<menu_item_check label="Показать экранную консоль чата" name="Show On-screen Console"/>
</menu>
<!-- World Menu -->

View File

@ -234,7 +234,7 @@
<panel name="trackball_button_panel">
<button name="undo_change" tool_tip="撤銷最後一次旋轉變化"/>
<button name="button_redo_change" tool_tip="重做最後一次旋轉變化"/>
<button name="refresh_avatars" tool_tip="雙擊將所有選定身體部位重設為原始值。"/>
<button name="poser_joint_reset" tool_tip="雙擊將所有選定身體部位重設為原始值。"/>
<button name="delta_mode_toggle" tool_tip="如果改變多個關節,則改變它們相同的值而不是相同的角度。這也用於解決萬向節鎖定的問題。"/>
<button label="映象" name="button_toggleMirrorRotation" tool_tip="映象對稱關節的變化。"/>
<button label="同步" name="button_toggleSympatheticRotation" tool_tip="同步調整對稱關節。"/>
@ -261,7 +261,7 @@
<button name="toggleAdvancedPanel" tool_tip="啟用/禁用高級設定"/>
<button name="FlipPose_avatar" tool_tip="左右翻轉整個姿勢"/>
<button name="FlipJoint_avatar" tool_tip="映象翻轉選定的身體部位"/>
<button label="取得選擇" name="button_RecaptureParts" tool_tip="如果選中的身體部位沒有姿勢,將取得目前姿勢的值。"/>
<button label="重捕" name="button_RecaptureParts" tool_tip="如果選擇的身體部位已關閉,這將重新捕捉這些身體部位當前的姿勢。"/>
<button label="啟用/禁用部位" name="toggle_PosingSelectedBones" tool_tip="啟用或禁用選定身體部位的姿勢。如果禁用,這些部位將正常動畫化。"/>
<button label="自定義姿勢" name="toggleLoadSavePanel" tool_tip="載入、儲存並管理自定義建立的姿勢"/>
<button tool_tip="管理姿勢目錄" name="open_poseDir_button"/>

View File

@ -46,7 +46,7 @@
剩餘容納量 [LAND_CAPACITY]。
</floater.string>
<floater.string name="link_number">
聯結
聯結序號
</floater.string>
<floater.string name="selected_faces">
面: