Merge branch 'release/2025.04' of https://github.com/secondlife/viewer

# Conflicts:
#	indra/llui/llfloater.h
#	indra/newview/llfloatersnapshot.h
#	indra/newview/llstatusbar.cpp
#	indra/newview/llviewerwindow.cpp
#	indra/newview/skins/default/xui/da/floater_about.xml
#	indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml
#	indra/newview/skins/default/xui/de/strings.xml
#	indra/newview/skins/default/xui/en/floater_snapshot.xml
#	indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml
#	indra/newview/skins/default/xui/en/panel_tools_texture.xml
#	indra/newview/skins/default/xui/es/strings.xml
#	indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
#	indra/newview/skins/default/xui/fr/strings.xml
#	indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml
#	indra/newview/skins/default/xui/it/strings.xml
#	indra/newview/skins/default/xui/ja/panel_settings_water.xml
#	indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml
#	indra/newview/skins/default/xui/ja/strings.xml
#	indra/newview/skins/default/xui/pt/strings.xml
#	indra/newview/skins/default/xui/ru/strings.xml
#	indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml
#	indra/newview/skins/default/xui/zh/strings.xml
#	scripts/messages/message_template.msg
#	scripts/messages/message_template.msg.sha1
master
Ansariel 2025-03-31 23:55:28 +02:00
commit 82b05f1063
42 changed files with 6542 additions and 6298 deletions

View File

@ -359,5 +359,7 @@ const U8 CLICK_ACTION_DISABLED = 8;
const U8 CLICK_ACTION_IGNORE = 9; const U8 CLICK_ACTION_IGNORE = 9;
// DO NOT CHANGE THE SEQUENCE OF THIS LIST!! // DO NOT CHANGE THE SEQUENCE OF THIS LIST!!
constexpr U32 BEACON_SHOW_MAP = 0x0001;
constexpr U32 BEACON_FOCUS_MAP = 0x0002;
#endif #endif

View File

@ -57,16 +57,16 @@ const U32 FLAGS_CAMERA_SOURCE = (1U << 22);
//const U32 FLAGS_UNUSED_001 = (1U << 23); // was FLAGS_CAST_SHADOWS //const U32 FLAGS_UNUSED_001 = (1U << 23); // was FLAGS_CAST_SHADOWS
//const U32 FLAGS_UNUSED_002 = (1U << 24); const U32 FLAGS_SERVER_AUTOPILOT = (1U << 24); // Update was for an agent AND that agent is being autopiloted from the server
//const U32 FLAGS_UNUSED_003 = (1U << 25); //const U32 FLAGS_UNUSED_002 = (1U << 25);
//const U32 FLAGS_UNUSED_004 = (1U << 26); //const U32 FLAGS_UNUSED_003 = (1U << 26);
//const U32 FLAGS_UNUSED_005 = (1U << 27); //const U32 FLAGS_UNUSED_004 = (1U << 27);
const U32 FLAGS_OBJECT_OWNER_MODIFY = (1U << 28); const U32 FLAGS_OBJECT_OWNER_MODIFY = (1U << 28);
const U32 FLAGS_TEMPORARY_ON_REZ = (1U << 29); const U32 FLAGS_TEMPORARY_ON_REZ = (1U << 29);
//const U32 FLAGS_UNUSED_006 = (1U << 30); // was FLAGS_TEMPORARY //const U32 FLAGS_UNUSED_005 = (1U << 30); // was FLAGS_TEMPORARY
//const U32 FLAGS_UNUSED_007 = (1U << 31); // was FLAGS_ZLIB_COMPRESSED //const U32 FLAGS_UNUSED_006 = (1U << 31); // was FLAGS_ZLIB_COMPRESSED
const U32 FLAGS_LOCAL = FLAGS_ANIM_SOURCE | FLAGS_CAMERA_SOURCE; const U32 FLAGS_LOCAL = FLAGS_ANIM_SOURCE | FLAGS_CAMERA_SOURCE;
const U32 FLAGS_WORLD = FLAGS_USE_PHYSICS | FLAGS_PHANTOM | FLAGS_TEMPORARY_ON_REZ; const U32 FLAGS_WORLD = FLAGS_USE_PHYSICS | FLAGS_PHANTOM | FLAGS_TEMPORARY_ON_REZ;

View File

@ -114,6 +114,7 @@ void LLEmojiHelper::showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, c
// </FS:Beq> // </FS:Beq>
mHelperHandle = pHelperFloater->getHandle(); mHelperHandle = pHelperFloater->getHandle();
mHelperCommitConn = pHelperFloater->setCommitCallback(std::bind([&](const LLSD& sdValue) { onCommitEmoji(utf8str_to_wstring(sdValue.asStringRef())[0]); }, std::placeholders::_2)); mHelperCommitConn = pHelperFloater->setCommitCallback(std::bind([&](const LLSD& sdValue) { onCommitEmoji(utf8str_to_wstring(sdValue.asStringRef())[0]); }, std::placeholders::_2));
mHelperCloseConn = pHelperFloater->setCloseCallback([this](LLUICtrl* ctrl, const LLSD& param) { onCloseHelper(ctrl, param); });
} }
setHostCtrl(hostctrl_p); setHostCtrl(hostctrl_p);
mEmojiCommitCb = cb; mEmojiCommitCb = cb;
@ -170,6 +171,16 @@ void LLEmojiHelper::onCommitEmoji(llwchar emoji)
} }
} }
void LLEmojiHelper::onCloseHelper(LLUICtrl* ctrl, const LLSD& param)
{
mCloseSignal(ctrl, param);
}
boost::signals2::connection LLEmojiHelper::setCloseCallback(const commit_signal_t::slot_type& cb)
{
return mCloseSignal.connect(cb);
}
void LLEmojiHelper::setHostCtrl(LLUICtrl* hostctrl_p) void LLEmojiHelper::setHostCtrl(LLUICtrl* hostctrl_p)
{ {
const LLUICtrl* pCurHostCtrl = mHostHandle.get(); const LLUICtrl* pCurHostCtrl = mHostHandle.get();

View File

@ -51,16 +51,23 @@ public:
// Eventing // Eventing
bool handleKey(const LLUICtrl* ctrl_p, KEY key, MASK mask); bool handleKey(const LLUICtrl* ctrl_p, KEY key, MASK mask);
void onCommitEmoji(llwchar emoji); void onCommitEmoji(llwchar emoji);
void onCloseHelper(LLUICtrl* ctrl, const LLSD& param);
typedef boost::signals2::signal<void(LLUICtrl* ctrl, const LLSD& param)> commit_signal_t;
boost::signals2::connection setCloseCallback(const commit_signal_t::slot_type& cb);
protected: protected:
LLUICtrl* getHostCtrl() const { return mHostHandle.get(); } LLUICtrl* getHostCtrl() const { return mHostHandle.get(); }
void setHostCtrl(LLUICtrl* hostctrl_p); void setHostCtrl(LLUICtrl* hostctrl_p);
private: private:
commit_signal_t mCloseSignal;
LLHandle<LLUICtrl> mHostHandle; LLHandle<LLUICtrl> mHostHandle;
LLHandle<LLFloater> mHelperHandle; LLHandle<LLFloater> mHelperHandle;
boost::signals2::connection mHostCtrlFocusLostConn; boost::signals2::connection mHostCtrlFocusLostConn;
boost::signals2::connection mHelperCommitConn; boost::signals2::connection mHelperCommitConn;
boost::signals2::connection mHelperCloseConn;
std::function<void(llwchar)> mEmojiCommitCb; std::function<void(llwchar)> mEmojiCommitCb;
bool mIsHideDisabled; bool mIsHideDisabled;
}; };

View File

@ -394,6 +394,9 @@ public:
bool isPositioning(LLFloaterEnums::EOpenPositioning p) const { return (p == mPositioning); } bool isPositioning(LLFloaterEnums::EOpenPositioning p) const { return (p == mPositioning); }
void setAutoFocus(bool focus) { mAutoFocus = focus; } // whether to automatically take focus when opened
bool getAutoFocus() const { return mAutoFocus; }
// <COLOSI opensim multi-currency support> // <COLOSI opensim multi-currency support>
// update currency symbols in titles (if there) and force update of display // update currency symbols in titles (if there) and force update of display
void updateCurrencySymbols() { mTitle.updateCurrencySymbols(); mShortTitle.updateCurrencySymbols(); applyTitle(); } void updateCurrencySymbols() { mTitle.updateCurrencySymbols(); mShortTitle.updateCurrencySymbols(); applyTitle(); }
@ -422,8 +425,6 @@ protected:
void setExpandedRect(const LLRect& rect) { mExpandedRect = rect; } // size when not minimized void setExpandedRect(const LLRect& rect) { mExpandedRect = rect; } // size when not minimized
const LLRect& getExpandedRect() const { return mExpandedRect; } const LLRect& getExpandedRect() const { return mExpandedRect; }
void setAutoFocus(bool focus) { mAutoFocus = focus; } // whether to automatically take focus when opened
bool getAutoFocus() const { return mAutoFocus; }
LLDragHandle* getDragHandle() const { return mDragHandle; } LLDragHandle* getDragHandle() const { return mDragHandle; }
void destroy(); // Don't call this directly. You probably want to call closeFloater() void destroy(); // Don't call this directly. You probably want to call closeFloater()

View File

@ -1316,6 +1316,14 @@ void LLTextEditor::showEmojiHelper()
LLEmojiHelper::instance().showHelper(this, cursorRect.mLeft, cursorRect.mTop, LLStringUtil::null, cb); LLEmojiHelper::instance().showHelper(this, cursorRect.mLeft, cursorRect.mTop, LLStringUtil::null, cb);
} }
void LLTextEditor::hideEmojiHelper()
{
if (mShowEmojiHelper)
{
LLEmojiHelper::instance().hideHelper(this);
}
}
void LLTextEditor::tryToShowEmojiHelper() void LLTextEditor::tryToShowEmojiHelper()
{ {
if (mReadOnly || !mShowEmojiHelper) if (mReadOnly || !mShowEmojiHelper)

View File

@ -222,6 +222,7 @@ public:
bool getShowContextMenu() const { return mShowContextMenu; } bool getShowContextMenu() const { return mShowContextMenu; }
void showEmojiHelper(); void showEmojiHelper();
void hideEmojiHelper();
void setShowEmojiHelper(bool show); void setShowEmojiHelper(bool show);
bool getShowEmojiHelper() const { return mShowEmojiHelper; } bool getShowEmojiHelper() const { return mShowEmojiHelper; }

View File

@ -224,6 +224,16 @@ bool LLUrlEntryBase::isWikiLinkCorrect(const std::string &labeled_url) const
}, },
L'\u002F'); // Solidus L'\u002F'); // Solidus
std::replace_if(wlabel.begin(),
wlabel.end(),
[](const llwchar& chr)
{
return // Not a decomposition, but suficiently similar
(chr == L'\u04BA') // "Cyrillic Capital Letter Shha"
|| (chr == L'\u04BB'); // "Cyrillic Small Letter Shha"
},
L'\u0068'); // "Latin Small Letter H"
std::string label = wstring_to_utf8str(wlabel); std::string label = wstring_to_utf8str(wlabel);
if ((label.find(".com") != std::string::npos if ((label.find(".com") != std::string::npos
|| label.find("www.") != std::string::npos) || label.find("www.") != std::string::npos)

View File

@ -13128,6 +13128,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key> <key>Value</key>
<integer>0</integer> <integer>0</integer>
</map> </map>
<key>RenderBalanceInSnapshot</key>
<map>
<key>Comment</key>
<string>Display L$ balance in snapshot</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>RenderUIBuffer</key> <key>RenderUIBuffer</key>
<map> <map>
<key>Comment</key> <key>Comment</key>
@ -23812,17 +23823,6 @@ Change of this parameter will affect the layout of buttons in notification toast
<integer>0</integer> <integer>0</integer>
</map> </map>
<!-- <FS_Zi> Add avatar hitbox debug --> <!-- <FS_Zi> Add avatar hitbox debug -->
<key>FSShowCurrencyBalanceInSnapshots</key>
<map>
<key>Comment</key>
<string>Show your currency balance in snapshots</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>DAEExportConsolidateMaterials</key> <key>DAEExportConsolidateMaterials</key>
<map> <map>
<key>Comment</key> <key>Comment</key>

View File

@ -5415,6 +5415,7 @@ void LLAppViewer::saveFinalSnapshot()
false, false,
gSavedSettings.getBOOL("RenderHUDInSnapshot"), gSavedSettings.getBOOL("RenderHUDInSnapshot"),
true, true,
false,
LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::SNAPSHOT_TYPE_COLOR,
LLSnapshotModel::SNAPSHOT_FORMAT_PNG); LLSnapshotModel::SNAPSHOT_FORMAT_PNG);
mSavedFinalSnapshot = true; mSavedFinalSnapshot = true;

View File

@ -41,6 +41,7 @@
#include "llchicletbar.h" #include "llchicletbar.h"
#include "lldraghandle.h" #include "lldraghandle.h"
#include "llemojidictionary.h" #include "llemojidictionary.h"
#include "llemojihelper.h"
#include "llfloaterreg.h" #include "llfloaterreg.h"
#include "llfloateremojipicker.h" #include "llfloateremojipicker.h"
#include "llfloaterimsession.h" #include "llfloaterimsession.h"
@ -302,6 +303,8 @@ bool LLFloaterIMSessionTab::postBuild()
mEmojiPickerShowBtn = getChild<LLButton>("emoji_picker_show_btn"); mEmojiPickerShowBtn = getChild<LLButton>("emoji_picker_show_btn");
mEmojiPickerShowBtn->setClickedCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerShowBtnClicked(); }); mEmojiPickerShowBtn->setClickedCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerShowBtnClicked(); });
mEmojiPickerShowBtn->setMouseDownCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerShowBtnDown(); });
mEmojiCloseConn = LLEmojiHelper::instance().setCloseCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerClosed(); });
mGearBtn = getChild<LLButton>("gear_btn"); mGearBtn = getChild<LLButton>("gear_btn");
mAddBtn = getChild<LLButton>("add_btn"); mAddBtn = getChild<LLButton>("add_btn");
@ -534,8 +537,43 @@ void LLFloaterIMSessionTab::onEmojiRecentPanelToggleBtnClicked()
void LLFloaterIMSessionTab::onEmojiPickerShowBtnClicked() void LLFloaterIMSessionTab::onEmojiPickerShowBtnClicked()
{ {
mInputEditor->setFocus(true); if (!mEmojiPickerShowBtn->getToggleState())
mInputEditor->showEmojiHelper(); {
mInputEditor->hideEmojiHelper();
mInputEditor->setFocus(true);
mInputEditor->showEmojiHelper();
mEmojiPickerShowBtn->setToggleState(true); // in case hideEmojiHelper closed a visible instance
}
else
{
mInputEditor->hideEmojiHelper();
mEmojiPickerShowBtn->setToggleState(false);
}
}
void LLFloaterIMSessionTab::onEmojiPickerShowBtnDown()
{
if (mEmojiHelperLastCallbackFrame == LLFrameTimer::getFrameCount())
{
// Helper gets closed by focus lost event on Down before before onEmojiPickerShowBtnDown
// triggers.
// If this condition is true, user pressed button and it was 'toggled' during press,
// restore 'toggled' state so that button will not reopen helper.
mEmojiPickerShowBtn->setToggleState(true);
}
}
void LLFloaterIMSessionTab::onEmojiPickerClosed()
{
if (mEmojiPickerShowBtn->getToggleState())
{
mEmojiPickerShowBtn->setToggleState(false);
// Helper gets closed by focus lost event on Down before onEmojiPickerShowBtnDown
// triggers. If mEmojiHelperLastCallbackFrame is set and matches Down, means close
// was triggered by user's press.
// A bit hacky, but I can't think of a better way to handle this without rewriting helper.
mEmojiHelperLastCallbackFrame = LLFrameTimer::getFrameCount();
}
} }
void LLFloaterIMSessionTab::initEmojiRecentPanel() void LLFloaterIMSessionTab::initEmojiRecentPanel()

View File

@ -237,6 +237,8 @@ private:
void onEmojiRecentPanelToggleBtnClicked(); void onEmojiRecentPanelToggleBtnClicked();
void onEmojiPickerShowBtnClicked(); void onEmojiPickerShowBtnClicked();
void onEmojiPickerShowBtnDown();
void onEmojiPickerClosed();
void initEmojiRecentPanel(); void initEmojiRecentPanel();
void onEmojiRecentPanelFocusReceived(); void onEmojiRecentPanelFocusReceived();
void onEmojiRecentPanelFocusLost(); void onEmojiRecentPanelFocusLost();
@ -251,6 +253,9 @@ private:
S32 mInputEditorPad; S32 mInputEditorPad;
S32 mChatLayoutPanelHeight; S32 mChatLayoutPanelHeight;
S32 mFloaterHeight; S32 mFloaterHeight;
boost::signals2::connection mEmojiCloseConn;
U32 mEmojiHelperLastCallbackFrame = { 0 };
}; };

View File

@ -67,12 +67,13 @@ LLPanelSnapshot* LLFloaterSnapshot::Impl::getActivePanel(LLFloaterSnapshotBase*
{ {
LLSideTrayPanelContainer* panel_container = floater->getChild<LLSideTrayPanelContainer>("panel_container"); LLSideTrayPanelContainer* panel_container = floater->getChild<LLSideTrayPanelContainer>("panel_container");
LLPanelSnapshot* active_panel = dynamic_cast<LLPanelSnapshot*>(panel_container->getCurrentPanel()); LLPanelSnapshot* active_panel = dynamic_cast<LLPanelSnapshot*>(panel_container->getCurrentPanel());
if (!active_panel)
{
LL_WARNS() << "No snapshot active panel, current panel index: " << panel_container->getCurrentPanelIndex() << LL_ENDL;
}
if (!ok_if_not_found) if (!ok_if_not_found)
{ {
if (!active_panel)
{
LL_WARNS() << "No snapshot active panel, current panel index: " << panel_container->getCurrentPanelIndex() << LL_ENDL;
}
llassert_always(active_panel != NULL); llassert_always(active_panel != NULL);
} }
return active_panel; return active_panel;
@ -605,34 +606,13 @@ void LLFloaterSnapshotBase::ImplBase::onClickFilter(LLUICtrl *ctrl, void* data)
} }
// static // static
void LLFloaterSnapshotBase::ImplBase::onClickUICheck(LLUICtrl *ctrl, void* data) void LLFloaterSnapshotBase::ImplBase::onClickDisplaySetting(LLUICtrl* ctrl, void* data)
{ {
LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; LLFloaterSnapshot* view = (LLFloaterSnapshot*)data;
gSavedSettings.setBOOL( "RenderUIInSnapshot", check->get() );
LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
if (view) if (view)
{ {
LLSnapshotLivePreview* previewp = view->getPreviewView(); LLSnapshotLivePreview* previewp = view->getPreviewView();
if(previewp) if (previewp)
{
previewp->updateSnapshot(true, true);
}
view->impl->updateControls(view);
}
}
// static
void LLFloaterSnapshotBase::ImplBase::onClickHUDCheck(LLUICtrl *ctrl, void* data)
{
LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl;
gSavedSettings.setBOOL( "RenderHUDInSnapshot", check->get() );
LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
if (view)
{
LLSnapshotLivePreview* previewp = view->getPreviewView();
if(previewp)
{ {
previewp->updateSnapshot(true, true); previewp->updateSnapshot(true, true);
} }
@ -1139,11 +1119,9 @@ bool LLFloaterSnapshot::postBuild()
mSucceessLblPanel = getChild<LLUICtrl>("succeeded_panel"); mSucceessLblPanel = getChild<LLUICtrl>("succeeded_panel");
mFailureLblPanel = getChild<LLUICtrl>("failed_panel"); mFailureLblPanel = getChild<LLUICtrl>("failed_panel");
childSetCommitCallback("ui_check", ImplBase::onClickUICheck, this); childSetCommitCallback("ui_check", ImplBase::onClickDisplaySetting, this);
getChild<LLUICtrl>("ui_check")->setValue(gSavedSettings.getBOOL("RenderUIInSnapshot")); childSetCommitCallback("balance_check", ImplBase::onClickDisplaySetting, this);
childSetCommitCallback("hud_check", ImplBase::onClickDisplaySetting, this);
childSetCommitCallback("hud_check", ImplBase::onClickHUDCheck, this);
getChild<LLUICtrl>("hud_check")->setValue(gSavedSettings.getBOOL("RenderHUDInSnapshot"));
// <FS:Ansariel> FIRE-15853: HUDs, interface or L$ balance checkbox don't update actual screenshot image // <FS:Ansariel> FIRE-15853: HUDs, interface or L$ balance checkbox don't update actual screenshot image
childSetCommitCallback("currency_check", ImplBase::onClickCurrencyCheck, this); childSetCommitCallback("currency_check", ImplBase::onClickCurrencyCheck, this);

View File

@ -104,8 +104,7 @@ public:
static void onClickAutoSnap(LLUICtrl *ctrl, void* data); static void onClickAutoSnap(LLUICtrl *ctrl, void* data);
static void onClickNoPost(LLUICtrl *ctrl, void* data); static void onClickNoPost(LLUICtrl *ctrl, void* data);
static void onClickFilter(LLUICtrl *ctrl, void* data); static void onClickFilter(LLUICtrl *ctrl, void* data);
static void onClickUICheck(LLUICtrl *ctrl, void* data); static void onClickDisplaySetting(LLUICtrl *ctrl, void* data);
static void onClickHUDCheck(LLUICtrl *ctrl, void* data);
// <FS:Ansariel> FIRE-15853: HUDs, interface or L$ balance checkbox don't update actual screenshot image // <FS:Ansariel> FIRE-15853: HUDs, interface or L$ balance checkbox don't update actual screenshot image
static void onClickCurrencyCheck(LLUICtrl *ctrl, void* data); static void onClickCurrencyCheck(LLUICtrl *ctrl, void* data);
static void onCommitFreezeFrame(LLUICtrl* ctrl, void* data); static void onCommitFreezeFrame(LLUICtrl* ctrl, void* data);

View File

@ -504,8 +504,11 @@ void LLFloaterWorldMap::onOpen(const LLSD& key)
const LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); const LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
LLInventoryModelBackgroundFetch::instance().start(landmark_folder_id); LLInventoryModelBackgroundFetch::instance().start(landmark_folder_id);
mLocationEditor->setFocus( true); if (hasFocus())
gFocusMgr.triggerFocusFlash(); {
mLocationEditor->setFocus( true);
gFocusMgr.triggerFocusFlash();
}
buildAvatarIDList(); buildAvatarIDList();
buildLandmarkIDLists(); buildLandmarkIDLists();

View File

@ -38,6 +38,7 @@
/* image compression headers. */ /* image compression headers. */
#include "llimagebmp.h" #include "llimagebmp.h"
#include "llimagetga.h" #include "llimagetga.h"
#include "llimagej2c.h"
#include "llimagejpeg.h" #include "llimagejpeg.h"
#include "llimagepng.h" #include "llimagepng.h"
@ -106,6 +107,10 @@ LLLocalBitmap::LLLocalBitmap(std::string filename)
{ {
mExtension = ET_IMG_JPG; mExtension = ET_IMG_JPG;
} }
else if (temp_exten == "j2c" || temp_exten == "jp2")
{
mExtension = ET_IMG_J2C;
}
else if (temp_exten == "png") else if (temp_exten == "png")
{ {
mExtension = ET_IMG_PNG; mExtension = ET_IMG_PNG;
@ -356,6 +361,21 @@ bool LLLocalBitmap::decodeBitmap(LLPointer<LLImageRaw> rawimg)
break; break;
} }
case ET_IMG_J2C:
{
LLPointer<LLImageJ2C> jpeg_image = new LLImageJ2C;
if (jpeg_image->load(mFilename))
{
jpeg_image->setDiscardLevel(0);
if (jpeg_image->decode(rawimg, 0.0f))
{
rawimg->biasedScaleToPowerOfTwo(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
decode_successful = true;
}
}
break;
}
case ET_IMG_PNG: case ET_IMG_PNG:
{ {
LLPointer<LLImagePNG> png_image = new LLImagePNG; LLPointer<LLImagePNG> png_image = new LLImagePNG;

View File

@ -89,6 +89,7 @@ class LLLocalBitmap
ET_IMG_BMP, ET_IMG_BMP,
ET_IMG_TGA, ET_IMG_TGA,
ET_IMG_JPG, ET_IMG_JPG,
ET_IMG_J2C,
ET_IMG_PNG ET_IMG_PNG
}; };

View File

@ -3291,6 +3291,8 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch)
F32 scale_x = 1; F32 scale_x = 1;
F32 scale_y = 1; F32 scale_y = 1;
F32 offset_x = 0;
F32 offset_y = 0;
for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
{ {
@ -3307,6 +3309,21 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch)
scale_y = scale_ratio.mV[t_axis] * object_scale.mV[t_axis]; scale_y = scale_ratio.mV[t_axis] * object_scale.mV[t_axis];
} }
material->mTextureTransform[i].mScale.set(scale_x, scale_y); material->mTextureTransform[i].mScale.set(scale_x, scale_y);
LLVector2 scales = selectNode->mGLTFScales[te_num][i];
LLVector2 offsets = selectNode->mGLTFOffsets[te_num][i];
F64 int_part = 0;
offset_x = (F32)modf((offsets[VX] + (scales[VX] - scale_x)) / 2, &int_part);
if (offset_x < 0)
{
offset_x++;
}
offset_y = (F32)modf((offsets[VY] + (scales[VY] - scale_y)) / 2, &int_part);
if (offset_y < 0)
{
offset_y++;
}
material->mTextureTransform[i].mOffset.set(offset_x, offset_y);
} }
const LLGLTFMaterial* base_material = tep->getGLTFMaterial(); const LLGLTFMaterial* base_material = tep->getGLTFMaterial();
@ -7172,6 +7189,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)
{ {
mTextureScaleRatios.clear(); mTextureScaleRatios.clear();
mGLTFScaleRatios.clear(); mGLTFScaleRatios.clear();
mGLTFScales.clear();
mGLTFOffsets.clear();
if (mObject.notNull()) if (mObject.notNull())
{ {
@ -7212,6 +7231,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)
F32 scale_x = 1; F32 scale_x = 1;
F32 scale_y = 1; F32 scale_y = 1;
std::vector<LLVector3> material_v_vec; std::vector<LLVector3> material_v_vec;
std::vector<LLVector2> material_scales_vec;
std::vector<LLVector2> material_offset_vec;
for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
{ {
if (material) if (material)
@ -7219,12 +7240,16 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)
LLGLTFMaterial::TextureTransform& transform = material->mTextureTransform[i]; LLGLTFMaterial::TextureTransform& transform = material->mTextureTransform[i];
scale_x = transform.mScale[VX]; scale_x = transform.mScale[VX];
scale_y = transform.mScale[VY]; scale_y = transform.mScale[VY];
material_scales_vec.push_back(transform.mScale);
material_offset_vec.push_back(transform.mOffset);
} }
else else
{ {
// Not having an override doesn't mean that there is no material // Not having an override doesn't mean that there is no material
scale_x = 1; scale_x = 1;
scale_y = 1; scale_y = 1;
material_scales_vec.emplace_back(scale_x, scale_y);
material_offset_vec.emplace_back(0.f, 0.f);
} }
if (tep->getTexGen() == LLTextureEntry::TEX_GEN_PLANAR) if (tep->getTexGen() == LLTextureEntry::TEX_GEN_PLANAR)
@ -7240,6 +7265,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)
material_v_vec.push_back(material_v); material_v_vec.push_back(material_v);
} }
mGLTFScaleRatios.push_back(material_v_vec); mGLTFScaleRatios.push_back(material_v_vec);
mGLTFScales.push_back(material_scales_vec);
mGLTFOffsets.push_back(material_offset_vec);
} }
} }
} }

View File

@ -260,6 +260,8 @@ public:
gltf_materials_vec_t mSavedGLTFOverrideMaterials; gltf_materials_vec_t mSavedGLTFOverrideMaterials;
std::vector<LLVector3> mTextureScaleRatios; std::vector<LLVector3> mTextureScaleRatios;
std::vector< std::vector<LLVector3> > mGLTFScaleRatios; std::vector< std::vector<LLVector3> > mGLTFScaleRatios;
std::vector< std::vector<LLVector2> > mGLTFScales;
std::vector< std::vector<LLVector2> > mGLTFOffsets;
std::vector<LLVector3> mSilhouetteVertices; // array of vertices to render silhouette of object std::vector<LLVector3> mSilhouetteVertices; // array of vertices to render silhouette of object
std::vector<LLVector3> mSilhouetteNormals; // array of normals to render silhouette of object std::vector<LLVector3> mSilhouetteNormals; // array of normals to render silhouette of object
bool mSilhouetteExists; // need to generate silhouette? bool mSilhouetteExists; // need to generate silhouette?

View File

@ -731,6 +731,7 @@ bool LLSnapshotLivePreview::onIdle( void* snapshot_preview )
static LLCachedControl<bool> freeze_time(gSavedSettings, "FreezeTime", false); static LLCachedControl<bool> freeze_time(gSavedSettings, "FreezeTime", false);
static LLCachedControl<bool> use_freeze_frame(gSavedSettings, "UseFreezeFrame", false); static LLCachedControl<bool> use_freeze_frame(gSavedSettings, "UseFreezeFrame", false);
static LLCachedControl<bool> render_ui(gSavedSettings, "RenderUIInSnapshot", false); static LLCachedControl<bool> render_ui(gSavedSettings, "RenderUIInSnapshot", false);
static LLCachedControl<bool> render_balance(gSavedSettings, "RenderBalanceInSnapshot", false);
static LLCachedControl<bool> render_hud(gSavedSettings, "RenderHUDInSnapshot", false); static LLCachedControl<bool> render_hud(gSavedSettings, "RenderHUDInSnapshot", false);
static LLCachedControl<bool> render_no_post(gSavedSettings, "RenderSnapshotNoPost", false); static LLCachedControl<bool> render_no_post(gSavedSettings, "RenderSnapshotNoPost", false);
@ -787,6 +788,7 @@ bool LLSnapshotLivePreview::onIdle( void* snapshot_preview )
render_hud, render_hud,
false, false,
render_no_post, render_no_post,
render_balance,
previewp->mSnapshotBufferType, previewp->mSnapshotBufferType,
previewp->getMaxImageSize())) previewp->getMaxImageSize()))
{ {

View File

@ -1291,14 +1291,13 @@ void LLStatusBar::updateBalancePanelPosition()
balance_bg_view->setShape(balance_bg_rect); balance_bg_view->setShape(balance_bg_rect);
} }
void LLStatusBar::setBalanceVisible(bool visible)
{
mBoxBalance->setVisible(visible);
}
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// Firestorm methods // Firestorm methods
void LLStatusBar::showBalance(bool show)
{
mBoxBalance->setVisible(show);
}
// <COLOSI opensim multi-currency support> // <COLOSI opensim multi-currency support>
void LLStatusBar::updateCurrencySymbols() void LLStatusBar::updateCurrencySymbols()
{ {

View File

@ -140,6 +140,8 @@ public:
S32 getSquareMetersLeft() const; S32 getSquareMetersLeft() const;
LLRegionDetails mRegionDetails; LLRegionDetails mRegionDetails;
void setBalanceVisible(bool visible);
LLPanelNearByMedia* getNearbyMediaPanel() { return mPanelNearByMedia; } LLPanelNearByMedia* getNearbyMediaPanel() { return mPanelNearByMedia; }
bool getAudioStreamEnabled() const; bool getAudioStreamEnabled() const;
@ -150,8 +152,6 @@ public:
void toggleStream(bool enable); void toggleStream(bool enable);
// </FS:Zi> // </FS:Zi>
void showBalance(bool show); // <FS:CR> Hide currency balance in snapshots
// <COLOSI opensim multi-currency support> // <COLOSI opensim multi-currency support>
// force update of the "BUY L$" button when currency symbol is changed. // force update of the "BUY L$" button when currency symbol is changed.
void updateCurrencySymbols(); void updateCurrencySymbols();

View File

@ -1016,6 +1016,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
bool render_ui = gSavedSettings.getBOOL("RenderUIInSnapshot"); bool render_ui = gSavedSettings.getBOOL("RenderUIInSnapshot");
bool render_hud = gSavedSettings.getBOOL("RenderHUDInSnapshot"); bool render_hud = gSavedSettings.getBOOL("RenderHUDInSnapshot");
bool render_no_post = gSavedSettings.getBOOL("RenderSnapshotNoPost"); bool render_no_post = gSavedSettings.getBOOL("RenderSnapshotNoPost");
bool render_balance = gSavedSettings.getBOOL("RenderBalanceInSnapshot");
bool high_res = gSavedSettings.getBOOL("HighResSnapshot"); bool high_res = gSavedSettings.getBOOL("HighResSnapshot");
if (high_res) if (high_res)
@ -1036,6 +1037,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
render_hud, render_hud,
false, false,
render_no_post, render_no_post,
render_balance,
LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::SNAPSHOT_TYPE_COLOR,
high_res ? S32_MAX : MAX_SNAPSHOT_IMAGE_SIZE)) //per side high_res ? S32_MAX : MAX_SNAPSHOT_IMAGE_SIZE)) //per side
{ {

View File

@ -6351,6 +6351,7 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
false, //UI false, //UI
gSavedSettings.getBOOL("RenderHUDInSnapshot"), gSavedSettings.getBOOL("RenderHUDInSnapshot"),
false, false,
false,
LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::SNAPSHOT_TYPE_COLOR,
LLSnapshotModel::SNAPSHOT_FORMAT_PNG); LLSnapshotModel::SNAPSHOT_FORMAT_PNG);
} }
@ -6408,23 +6409,6 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
return true; return true;
} }
// </FS:Ansariel> // </FS:Ansariel>
// <FS:CR> FIRE-9696 - Moved detection of HomePositionSet Alert hack to here where it's actually found now
if (notificationID == "HomePositionSet")
{
// save the home location image to disk
std::string snap_filename = gDirUtilp->getLindenUserDir();
snap_filename += gDirUtilp->getDirDelimiter();
snap_filename += LLStartUp::getScreenHomeFilename();
if (gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw(), false, gSavedSettings.getBOOL("RenderHUDInSnapshot"), false, LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::SNAPSHOT_FORMAT_PNG))
{
LL_INFOS() << LLStartUp::getScreenHomeFilename() << " saved successfully." << LL_ENDL;
}
else
{
LL_WARNS() << LLStartUp::getScreenHomeFilename() << " could not be saved." << LL_ENDL;
}
}
// </FS:CR>
// Special Marketplace update notification // Special Marketplace update notification
if (notificationID == "SLM_UPDATE_FOLDER") if (notificationID == "SLM_UPDATE_FOLDER")
@ -6493,6 +6477,7 @@ static void process_special_alert_messages(const std::string & message)
false, false,
gSavedSettings.getBOOL("RenderHUDInSnapshot"), gSavedSettings.getBOOL("RenderHUDInSnapshot"),
false, false,
false,
LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::SNAPSHOT_TYPE_COLOR,
LLSnapshotModel::SNAPSHOT_FORMAT_PNG); LLSnapshotModel::SNAPSHOT_FORMAT_PNG);
} }
@ -8423,7 +8408,6 @@ void process_initiate_download(LLMessageSystem* msg, void**)
(void**)new std::string(viewer_filename)); (void**)new std::string(viewer_filename));
} }
void process_script_teleport_request(LLMessageSystem* msg, void**) void process_script_teleport_request(LLMessageSystem* msg, void**)
{ {
if (!gSavedSettings.getBOOL("ScriptsCanShowUI")) return; if (!gSavedSettings.getBOOL("ScriptsCanShowUI")) return;
@ -8437,6 +8421,11 @@ void process_script_teleport_request(LLMessageSystem* msg, void**)
msg->getString("Data", "SimName", sim_name); msg->getString("Data", "SimName", sim_name);
msg->getVector3("Data", "SimPosition", pos); msg->getVector3("Data", "SimPosition", pos);
msg->getVector3("Data", "LookAt", look_at); msg->getVector3("Data", "LookAt", look_at);
U32 flags = (BEACON_SHOW_MAP | BEACON_FOCUS_MAP);
if (msg->has("Options"))
{
msg->getU32("Options", "Flags", flags);
}
LLFloaterWorldMap* instance = LLFloaterWorldMap::getInstance(); LLFloaterWorldMap* instance = LLFloaterWorldMap::getInstance();
if(instance) if(instance)
@ -8447,7 +8436,13 @@ void process_script_teleport_request(LLMessageSystem* msg, void**)
<< LL_ENDL; << LL_ENDL;
instance->trackURL(sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]); instance->trackURL(sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]);
LLFloaterReg::showInstance("world_map", "center"); if (flags & BEACON_SHOW_MAP)
{
bool old_auto_focus = instance->getAutoFocus();
instance->setAutoFocus(flags & BEACON_FOCUS_MAP);
instance->openFloater("center");
instance->setAutoFocus(old_auto_focus);
}
} }
// remove above two lines and replace with below line // remove above two lines and replace with below line

View File

@ -2417,6 +2417,12 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
// Set the rotation of the object followed by adjusting for the accumulated angular velocity (llSetTargetOmega) // Set the rotation of the object followed by adjusting for the accumulated angular velocity (llSetTargetOmega)
setRotation(new_rot * mAngularVelocityRot); setRotation(new_rot * mAngularVelocityRot);
if ((mFlags & FLAGS_SERVER_AUTOPILOT) && asAvatar() && asAvatar()->isSelf())
{
gAgent.resetAxes();
gAgent.rotate(new_rot);
gAgentCamera.resetView();
}
setChanged(ROTATED | SILHOUETTE); setChanged(ROTATED | SILHOUETTE);
} }

View File

@ -1529,6 +1529,15 @@ bool LLViewerTextureList::createUploadFile(const std::string& filename,
image->setLastError("Couldn't load the image to be uploaded."); image->setLastError("Couldn't load the image to be uploaded.");
return false; return false;
} }
// calcDataSizeJ2C assumes maximum size is 2048 and for bigger images can
// assign discard to bring imige to needed size, but upload does the scaling
// as needed, so just reset discard.
// Assume file is full and has 'discard' 0 data.
// Todo: probably a better idea to have some setMaxDimentions in J2C
// called when loading from a local file
image->setDiscardLevel(0);
// Decompress or expand it in a raw image structure // Decompress or expand it in a raw image structure
LLPointer<LLImageRaw> raw_image = new LLImageRaw; LLPointer<LLImageRaw> raw_image = new LLImageRaw;
if (!image->decode(raw_image, 0.0f)) if (!image->decode(raw_image, 0.0f))

View File

@ -5988,12 +5988,12 @@ void LLViewerWindow::movieSize(S32 new_width, S32 new_height)
} }
bool LLViewerWindow::saveSnapshot(const std::string& filepath, S32 image_width, S32 image_height, bool show_ui, bool show_hud, bool do_rebuild, LLSnapshotModel::ESnapshotLayerType type, LLSnapshotModel::ESnapshotFormat format) bool LLViewerWindow::saveSnapshot(const std::string& filepath, S32 image_width, S32 image_height, bool show_ui, bool show_hud, bool do_rebuild, bool show_balance, LLSnapshotModel::ESnapshotLayerType type, LLSnapshotModel::ESnapshotFormat format)
{ {
LL_INFOS() << "Saving snapshot to: " << filepath << LL_ENDL; LL_INFOS() << "Saving snapshot to: " << filepath << LL_ENDL;
LLPointer<LLImageRaw> raw = new LLImageRaw; LLPointer<LLImageRaw> raw = new LLImageRaw;
bool success = rawSnapshot(raw, image_width, image_height, true, false, show_ui, show_hud, do_rebuild); bool success = rawSnapshot(raw, image_width, image_height, true, false, show_ui, show_hud, do_rebuild, show_balance);
if (success) if (success)
{ {
@ -6057,14 +6057,14 @@ void LLViewerWindow::resetSnapshotLoc() const
bool LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, bool show_ui, bool show_hud, bool do_rebuild, bool no_post, LLSnapshotModel::ESnapshotLayerType type) bool LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, bool show_ui, bool show_hud, bool do_rebuild, bool no_post, LLSnapshotModel::ESnapshotLayerType type)
{ {
return rawSnapshot(raw, preview_width, preview_height, false, false, show_ui, show_hud, do_rebuild, no_post, type); return rawSnapshot(raw, preview_width, preview_height, false, false, show_ui, show_hud, do_rebuild, no_post, gSavedSettings.getBOOL("RenderBalanceInSnapshot"), type);
} }
// Saves the image from the screen to a raw image // Saves the image from the screen to a raw image
// Since the required size might be bigger than the available screen, this method rerenders the scene in parts (called subimages) and copy // Since the required size might be bigger than the available screen, this method rerenders the scene in parts (called subimages) and copy
// the results over to the final raw image. // the results over to the final raw image.
bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height,
bool keep_window_aspect, bool is_texture, bool show_ui, bool show_hud, bool do_rebuild, bool no_post, LLSnapshotModel::ESnapshotLayerType type, S32 max_size) bool keep_window_aspect, bool is_texture, bool show_ui, bool show_hud, bool do_rebuild, bool no_post, bool show_balance, LLSnapshotModel::ESnapshotLayerType type, S32 max_size)
{ {
if (!raw) if (!raw)
{ {
@ -6123,11 +6123,7 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
image_width = llmin(image_width, window_width); image_width = llmin(image_width, window_width);
image_height = llmin(image_height, window_height); image_height = llmin(image_height, window_height);
// <FS:CR> Hide currency balance in snapshots setBalanceVisible(show_balance);
if (gStatusBar)
{
gStatusBar->showBalance((bool)gSavedSettings.getBOOL("FSShowCurrencyBalanceInSnapshots"));
}
} }
S32 original_width = 0; S32 original_width = 0;
@ -6208,13 +6204,13 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
} }
else else
{ {
gStatusBar->showBalance(true); // <FS:CR> Hide currency balance in snapshots setBalanceVisible(true);
return false; return false;
} }
if (raw->isBufferInvalid()) if (raw->isBufferInvalid())
{ {
gStatusBar->showBalance(true); // <FS:CR> Hide currency balance in snapshots setBalanceVisible(true);
return false; return false;
} }
@ -6425,12 +6421,7 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
{ {
send_agent_resume(); send_agent_resume();
} }
setBalanceVisible(true);
// <FS:CR> Hide currency balance in snapshots
if (gStatusBar)
{
gStatusBar->showBalance(true);
}
return ret; return ret;
} }
@ -6941,6 +6932,14 @@ void LLViewerWindow::setProgressCancelButtonVisible( bool b, const std::string&
} }
} }
void LLViewerWindow::setBalanceVisible(bool visible)
{
if (gStatusBar)
{
gStatusBar->setBalanceVisible(visible);
}
}
LLProgressView *LLViewerWindow::getProgressView() const LLProgressView *LLViewerWindow::getProgressView() const
{ {
return mProgressView; return mProgressView;

View File

@ -366,9 +366,11 @@ public:
// snapshot functionality. // snapshot functionality.
// perhaps some of this should move to llfloatershapshot? -MG // perhaps some of this should move to llfloatershapshot? -MG
bool saveSnapshot(const std::string& filename, S32 image_width, S32 image_height, bool show_ui = true, bool show_hud = true, bool do_rebuild = false, LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::ESnapshotFormat format = LLSnapshotModel::SNAPSHOT_FORMAT_BMP); bool saveSnapshot(const std::string& filename, S32 image_width, S32 image_height, bool show_ui = true, bool show_hud = true, bool do_rebuild = false, bool show_balance = true,
bool rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, bool keep_window_aspect = true, bool is_texture = false, LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::ESnapshotFormat format = LLSnapshotModel::SNAPSHOT_FORMAT_BMP);
bool show_ui = true, bool show_hud = true, bool do_rebuild = false, bool no_post = false, LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE); bool rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, bool keep_window_aspect = true, bool is_texture = false,
bool show_ui = true, bool show_hud = true, bool do_rebuild = false, bool no_post = false, bool show_balance = true,
LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE);
bool simpleSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, const int num_render_passes); bool simpleSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, const int num_render_passes);
@ -467,6 +469,8 @@ public:
void setTitle(const std::string& win_title); void setTitle(const std::string& win_title);
// </FS:TT> // </FS:TT>
void setBalanceVisible(bool visible);
static std::string getLastSnapshotDir(); static std::string getLastSnapshotDir();
LLView* getFloaterSnapRegion() { return mFloaterSnapRegion; } LLView* getFloaterSnapRegion() { return mFloaterSnapRegion; }

View File

@ -100,7 +100,7 @@ void LLViewerWindowListener::saveSnapshot(const LLSD& event) const
} }
type = found->second; type = found->second;
} }
bool ok = mViewerWindow->saveSnapshot(event["filename"], width, height, showui, showhud, rebuild, type); bool ok = mViewerWindow->saveSnapshot(event["filename"], width, height, showui, showhud, rebuild, true /*L$ Balance*/, type);
sendReply(LLSDMap("ok", ok), event); sendReply(LLSDMap("ok", ok), event);
} }

View File

@ -4254,6 +4254,9 @@ Versuch abgebrochen.
<notification name="NowOwnObject"> <notification name="NowOwnObject">
Sie sind jetzt Eigentümer des Objekts [OBJECT_NAME] Sie sind jetzt Eigentümer des Objekts [OBJECT_NAME]
</notification> </notification>
<notification name="NowOwnObjectInv">
Sie sind jetzt Eigentümer des Objekts [OBJECT_NAME] und es wurde Ihrem Inventar hinzugefügt.
</notification>
<notification name="CantRezOnLand"> <notification name="CantRezOnLand">
Objekt kann nicht an [OBJECT_POS] gerezzt werden, da der Landeigentümer dies nicht zulässt. Machen Sie den Landeigentümer mit dem Landwerkzeug ausfindig. Objekt kann nicht an [OBJECT_POS] gerezzt werden, da der Landeigentümer dies nicht zulässt. Machen Sie den Landeigentümer mit dem Landwerkzeug ausfindig.
</notification> </notification>

View File

@ -4916,6 +4916,10 @@ Bitte installieren Sie den Viewer von [DOWNLOAD_URL] erneut und wenden Sie sich
<string name="inventory_folder_offered-im"> <string name="inventory_folder_offered-im">
Inventarordner „[ITEM_NAME]“ angeboten Inventarordner „[ITEM_NAME]“ angeboten
</string> </string>
<string name="bot_warning">
Sie chatten mit einem Bot, [NAME]. Geben Sie keine persönlichen Informationen weiter.
Erfahren Sie mehr unter https://second.life/scripted-agents.
</string>
<string name="share_alert"> <string name="share_alert">
Objekte aus dem Inventar hier her ziehen Objekte aus dem Inventar hier her ziehen
</string> </string>

View File

@ -182,10 +182,11 @@
height="16" height="16"
top_pad="3" top_pad="3"
width="180" width="180"
control_name="RenderUIInSnapshot"
name="ui_check" /> name="ui_check" />
<check_box <check_box
enabled_control="RenderUIInSnapshot" enabled_control="RenderUIInSnapshot"
control_name="FSShowCurrencyBalanceInSnapshots" control_name="RenderBalanceInSnapshot"
label="L$ Balance" label="L$ Balance"
layout="topleft" layout="topleft"
left="30" left="30"
@ -199,6 +200,7 @@
left="30" left="30"
top_pad="0" top_pad="0"
width="180" width="180"
control_name="RenderHUDInSnapshot"
name="hud_check" /> name="hud_check" />
<check_box <check_box
control_name="FSSnapshotShowCaptureFrame" control_name="FSSnapshotShowCaptureFrame"

View File

@ -11593,6 +11593,14 @@ You are now the owner of object [OBJECT_NAME]
<notification <notification
icon="alertmodal.tga" icon="alertmodal.tga"
name="NowOwnObjectInv"
type="notify">
<tag>fail</tag>
You are now the owner of object [OBJECT_NAME] and it has been placed in your inventory.
</notification>
<notification
icon="alertmodal.tga"
name="CantRezOnLand" name="CantRezOnLand"
type="notify"> type="notify">
<tag>fail</tag> <tag>fail</tag>

View File

@ -377,7 +377,7 @@
initial_value="0" initial_value="0"
layout="topleft" layout="topleft"
left_delta="5" left_delta="5"
min_val="-0.5" min_val="0"
max_val="0.5" max_val="0.5"
name="water_blur_multip" name="water_blur_multip"
top_pad="5" top_pad="5"

View File

@ -4584,6 +4584,10 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="inventory_folder_offered-im"> <string name="inventory_folder_offered-im">
Carpeta del inventario &apos;[ITEM_NAME]&apos; ofrecida Carpeta del inventario &apos;[ITEM_NAME]&apos; ofrecida
</string> </string>
<string name="bot_warning">
Estás conversando con un bot, [NAME]. No compartas información personal.
Más información en https://second.life/scripted-agents.
</string
<string name="inventory_item_offered_rlv"> <string name="inventory_item_offered_rlv">
Ofrecido ítem de inventario a [NAME] Ofrecido ítem de inventario a [NAME]
</string> </string>

View File

@ -4846,6 +4846,10 @@ Veuillez réinstaller la visionneuse à partir de [DOWNLOAD_URL] et contacter [S
<string name="inventory_folder_offered-im"> <string name="inventory_folder_offered-im">
Dossier de linventaire [ITEM_NAME] offert Dossier de linventaire [ITEM_NAME] offert
</string> </string>
<string name="bot_warning">
Vous discutez avec un bot, [NAME]. Ne partagez pas dinformations personnelles.
En savoir plus sur https://second.life/scripted-agents.
</string>
<string name="inventory_item_offered_rlv"> <string name="inventory_item_offered_rlv">
Article d'inventaire offert à [NAME] Article d'inventaire offert à [NAME]
</string> </string>

View File

@ -4756,6 +4756,10 @@ Reinstallare il browser da [DOWNLOAD_URL] e contattare [SUPPORT_SITE] se il prob
<string name="inventory_folder_offered-im"> <string name="inventory_folder_offered-im">
Offerta cartella &apos;[ITEM_NAME]&apos; da inventario Offerta cartella &apos;[ITEM_NAME]&apos; da inventario
</string> </string>
<string name="bot_warning">
Stai parlando con un bot, [NAME]. Non condividere informazioni personali.
Scopri di più su https://second.life/scripted-agents.
</string>
<string name="inventory_item_offered_rlv"> <string name="inventory_item_offered_rlv">
Offerto oggetto da inventario a [NAME] Offerto oggetto da inventario a [NAME]
</string> </string>

View File

@ -4682,6 +4682,10 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="inventory_folder_offered-im"> <string name="inventory_folder_offered-im">
インベントリフォルダー '[ITEM_NAME]' を送りました インベントリフォルダー '[ITEM_NAME]' を送りました
</string> </string>
<string name="bot_warning">
[NAME]とチャットしています。個人情報を共有しないでください。
詳細は https://second.life/scripted-agents をご覧ください。
</string>
<string name="share_alert"> <string name="share_alert">
インベントリからここにアイテムをドラッグします インベントリからここにアイテムをドラッグします
</string> </string>

View File

@ -4856,6 +4856,10 @@ https://www.firestormviewer.org/support за помощь в решении эт
<string name="inventory_item_offered_rlv"> <string name="inventory_item_offered_rlv">
Предложен элемент инвентаря [NAME] Предложен элемент инвентаря [NAME]
</string> </string>
<string name="bot_warning">
Вы общаетесь с ботом [NAME]. Не передавайте личные данные.
Подробнее на https://second.life/scripted-agents.
</string>
<string name="share_alert"> <string name="share_alert">
Перетащите элементы из инвентаря сюда Перетащите элементы из инвентаря сюда
</string> </string>

View File

@ -5091,6 +5091,10 @@ support@secondlife.com.
<string name="inventory_item_offered_rlv"> <string name="inventory_item_offered_rlv">
庫存物件已傳送給 [NAME] 庫存物件已傳送給 [NAME]
</string> </string>
<string name="bot_warning">
您正在与人工智能机器人 [NAME] 聊天。请勿分享任何个人信息。
了解更多https://second.life/scripted-agents。
</string>
<string name="share_alert"> <string name="share_alert">
將庫存物件拖拽到這裡 將庫存物件拖拽到這裡
</string> </string>
@ -7512,4 +7516,4 @@ SecondLife.com網站的「支援」部分
<string name="Unlimited"> <string name="Unlimited">
無限 無限
</string> </string>
</strings> </strings>

File diff suppressed because it is too large Load Diff

View File

@ -1 +1 @@
1a9a3717fde5d0fb3d5f688a1a3dab7fcc2aa308 f0e9d30b03fe7823a7050cf1a86653e4de4bc256