From 53c3176121f585eed4f2efff02c3694217604221 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 18 Mar 2025 23:40:02 +0200 Subject: #3661 Clamp water blur multiplier --- indra/newview/skins/default/xui/en/panel_settings_water.xml | 2 +- indra/newview/skins/default/xui/ja/panel_settings_water.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_settings_water.xml b/indra/newview/skins/default/xui/en/panel_settings_water.xml index 5e65b0e8a2..e062f1710b 100644 --- a/indra/newview/skins/default/xui/en/panel_settings_water.xml +++ b/indra/newview/skins/default/xui/en/panel_settings_water.xml @@ -378,7 +378,7 @@ initial_value="0" layout="topleft" left_delta="5" - min_val="-0.5" + min_val="0" max_val="0.5" name="water_blur_multip" top_pad="5" diff --git a/indra/newview/skins/default/xui/ja/panel_settings_water.xml b/indra/newview/skins/default/xui/ja/panel_settings_water.xml index ead1ca9b2f..2510523897 100644 --- a/indra/newview/skins/default/xui/ja/panel_settings_water.xml +++ b/indra/newview/skins/default/xui/ja/panel_settings_water.xml @@ -63,7 +63,7 @@ ブラー乗数 - + -- cgit v1.2.3 From ed6f939df42fa414e7ab55329c58e9aa2848b34a Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 19 Mar 2025 19:29:32 +0200 Subject: #3771 Fix unresolved HOSTIP parameter --- indra/newview/skins/default/xui/da/floater_about.xml | 2 +- indra/newview/skins/default/xui/de/strings.xml | 2 +- indra/newview/skins/default/xui/es/strings.xml | 2 +- indra/newview/skins/default/xui/fr/strings.xml | 2 +- indra/newview/skins/default/xui/it/strings.xml | 2 +- indra/newview/skins/default/xui/ja/strings.xml | 2 +- indra/newview/skins/default/xui/pt/strings.xml | 2 +- indra/newview/skins/default/xui/ru/strings.xml | 2 +- indra/newview/skins/default/xui/tr/strings.xml | 2 +- indra/newview/skins/default/xui/zh/strings.xml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/indra/newview/skins/default/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml index 604eb7c58f..4ea34975e1 100644 --- a/indra/newview/skins/default/xui/da/floater_about.xml +++ b/indra/newview/skins/default/xui/da/floater_about.xml @@ -5,7 +5,7 @@ [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] - Du er ved [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] i regionen [REGION] lokaliseret ved <nolink>[HOSTNAME]</nolink> ([HOSTIP]) + Du er ved [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] i regionen [REGION] lokaliseret ved <nolink>[HOSTNAME]</nolink> [SERVER_VERSION] [SERVER_RELEASE_NOTES_URL] diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index 486d604e9f..3f5fccf57f 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -12,7 +12,7 @@ Grafikinitialisierung fehlgeschlagen. Bitte aktualisieren Sie Ihren Grafiktreiber. [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]Bit) [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] Build-Konfiguration [BUILD_CONFIG] - Sie befinden sich an [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] auf <nolink>[HOSTNAME]</nolink> ([HOSTIP]) + Sie befinden sich an [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] auf <nolink>[HOSTNAME]</nolink> SLURL: <nolink>[SLURL]</nolink> (globale Koordinaten [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 9fcfc2daa5..ff1200e2b3 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -10,7 +10,7 @@ [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] Configuración de constitución [BUILD_CONFIG] - Estás en la posición [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1], de [REGION], alojada en <nolink>[HOSTNAME]</nolink> ([HOSTIP]) + Estás en la posición [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1], de [REGION], alojada en <nolink>[HOSTNAME]</nolink> SLURL: <nolink>[SLURL]</nolink> (coordenadas globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 55f6209fe1..5307c8d561 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -13,7 +13,7 @@ [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] Configuration de la construction [BUILD_CONFIG] - Vous êtes à [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] dans [REGION], se trouvant à <nolink>[HOSTNAME]</nolink> ([HOSTIP]) + Vous êtes à [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] dans [REGION], se trouvant à <nolink>[HOSTNAME]</nolink> SLURL : <nolink>[SLURL]</nolink> (coordonnées globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index f77ab1062a..bb22ff788e 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -12,7 +12,7 @@ [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] Configurazione struttura [BUILD_CONFIG] - Tu sei a [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] che si trova a <nolink>[HOSTNAME]</nolink> ([HOSTIP]) + Tu sei a [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] che si trova a <nolink>[HOSTNAME]</nolink> SLURL: <nolink>[SLURL]</nolink> (coordinate globali [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index 71f7c1a034..df19f3678f 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -39,7 +39,7 @@ あなたは、現在[REGION]の[POSITION_LOCAL_0,number,1],[POSITION_LOCAL_1,number,1],[POSITION_LOCAL_2,number,1]にいます。 -位置は、<nolink>[HOSTNAME]</nolink>です。([HOSTIP]) +位置は、<nolink>[HOSTNAME]</nolink>です。 SLURL:<nolink>[SLURL]</nolink> (グローバル座標は、[POSITION_0,number,1],[POSITION_1,number,1],[POSITION_2,number,1]です。) [SERVER_VERSION] diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 4ce1e6d2ec..509b3d72a0 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -10,7 +10,7 @@ [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] Configuração do corpo [BUILD_CONFIG] - Você está em [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] em [REGION] localizado em <nolink>[HOSTNAME]</nolink> ([HOSTIP]) + Você está em [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] em [REGION] localizado em <nolink>[HOSTNAME]</nolink> SLURL: <nolink>[SLURL]</nolink> (coordenadas globais [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index 0079309ba2..48eb7118aa 100644 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -42,7 +42,7 @@ Конфигурация построения [BUILD_CONFIG] - Вы в точке [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] в регионе «[REGION]», расположенном на <nolink>[HOSTNAME]</nolink> ([HOSTIP]) + Вы в точке [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] в регионе «[REGION]», расположенном на <nolink>[HOSTNAME]</nolink> SLURL: <nolink>[SLURL]</nolink> (глобальные координаты [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index fa2fd3a802..92e5160e97 100644 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -42,7 +42,7 @@ Yapı Konfigürasyonu [BUILD_CONFIG] - <nolink>[HOSTNAME]</nolink> ([HOSTIP]) üzerinde bulunan [REGION] içerisinde [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] konumundasınız + <nolink>[HOSTNAME]</nolink> üzerinde bulunan [REGION] içerisinde [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] konumundasınız SLURL: <nolink>[SLURL]</nolink> (küresel koordinatlar [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml index d053d2b30d..8fae007429 100644 --- a/indra/newview/skins/default/xui/zh/strings.xml +++ b/indra/newview/skins/default/xui/zh/strings.xml @@ -42,7 +42,7 @@ 建製設置 [BUILD_CONFIG] - 你的方位是 [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1],地區名:[REGION],主機:<nolink>[HOSTNAME]</nolink> ([HOSTIP]) + 你的方位是 [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1],地區名:[REGION],主機:<nolink>[HOSTNAME]</nolink> 第二人生URL:<nolink>[SLURL]</nolink> (全域坐標:[POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] -- cgit v1.2.3 From 28638b31af625e59914e215af1cf7b0ad40b3fb6 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 19 Mar 2025 19:59:00 +0200 Subject: #3762 Remove incorrect resolution specification Looks like it was added by a mistake and does not match real value --- indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml | 2 +- indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml | 2 +- indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml | 2 +- indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml | 2 +- indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml | 2 +- indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml | 2 +- indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml | 2 +- indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml | 2 +- indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml | 2 +- indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml index 602424821f..09447cbbaf 100644 --- a/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@ - + diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml index f8040b9a65..68878baa0d 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml @@ -60,7 +60,7 @@ name="Large(512x512)" value="[i512,i512]" /> - + diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml index 3cf64583d2..a560ff8d5e 100644 --- a/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@ L'enregistrement d'une image dans l'inventaire coûte [UPLOAD_COST] L$. Pour enregistrer votre image sous forme de texture, sélectionnez un format carré. - + diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml index 75b5d64660..21b65e8e69 100644 --- a/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@ Salvare un'immagine nell'inventario costa L$[UPLOAD_COST]. Per salvare l'immagine come texture, selezionare uno dei formati quadrati. - + diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml index c55c11e928..30542378cc 100644 --- a/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml @@ -6,7 +6,7 @@ - + diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml index f3357026d5..28a5142baa 100644 --- a/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@ Salvar uma imagem em seu inventário custa L$[UPLOAD_COST]. Para salvar sua imagem como uma textura, selecione um dos formatos quadrados. - + diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml index f07e12e0ed..adc612dfd8 100644 --- a/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@ Сохранение изображения в инвентаре стоит L$[UPLOAD_COST]. Чтобы сохранить его как текстуру, выберите один из квадратных форматов. - + diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml index be5940c4b9..160cba8700 100644 --- a/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@ Bir görüntüyü envanterinize kaydetmenin maliyeti L$[UPLOAD_COST] olur. Görüntünüzü bir doku olarak kaydetmek için kare formatlardan birini seçin. - + diff --git a/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml index 094bf019b4..9c45c54a5e 100644 --- a/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@ 將圖像儲存到收納區的費用為 L$[UPLOAD_COST]。 若要將圖像存為材質,請選擇一個正方格式。 - + -- cgit v1.2.3 From 5608c3998df99c9ea075c58f0f45fb23617ec2ed Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 8 Oct 2024 22:10:50 +0300 Subject: viewer#2270 The "More" button does not close the "Choose emoji" floater --- indra/llui/llemojihelper.cpp | 11 +++++++++ indra/llui/llemojihelper.h | 7 ++++++ indra/llui/lltexteditor.cpp | 8 +++++++ indra/llui/lltexteditor.h | 1 + indra/newview/llfloaterimsessiontab.cpp | 42 +++++++++++++++++++++++++++++++-- indra/newview/llfloaterimsessiontab.h | 5 ++++ 6 files changed, 72 insertions(+), 2 deletions(-) diff --git a/indra/llui/llemojihelper.cpp b/indra/llui/llemojihelper.cpp index b9441a9c91..b2c59ce775 100644 --- a/indra/llui/llemojihelper.cpp +++ b/indra/llui/llemojihelper.cpp @@ -99,6 +99,7 @@ void LLEmojiHelper::showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, c LLFloater* pHelperFloater = LLFloaterReg::getInstance(DEFAULT_EMOJI_HELPER_FLOATER); mHelperHandle = pHelperFloater->getHandle(); 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); mEmojiCommitCb = cb; @@ -148,6 +149,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) { const LLUICtrl* pCurHostCtrl = mHostHandle.get(); diff --git a/indra/llui/llemojihelper.h b/indra/llui/llemojihelper.h index 2834b06061..26840eef94 100644 --- a/indra/llui/llemojihelper.h +++ b/indra/llui/llemojihelper.h @@ -51,16 +51,23 @@ public: // Eventing bool handleKey(const LLUICtrl* ctrl_p, KEY key, MASK mask); void onCommitEmoji(llwchar emoji); + void onCloseHelper(LLUICtrl* ctrl, const LLSD& param); + + typedef boost::signals2::signal commit_signal_t; + boost::signals2::connection setCloseCallback(const commit_signal_t::slot_type& cb); protected: LLUICtrl* getHostCtrl() const { return mHostHandle.get(); } void setHostCtrl(LLUICtrl* hostctrl_p); private: + commit_signal_t mCloseSignal; + LLHandle mHostHandle; LLHandle mHelperHandle; boost::signals2::connection mHostCtrlFocusLostConn; boost::signals2::connection mHelperCommitConn; + boost::signals2::connection mHelperCloseConn; std::function mEmojiCommitCb; bool mIsHideDisabled; }; diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 3537c764b9..6c59ed0fd9 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1211,6 +1211,14 @@ void LLTextEditor::showEmojiHelper() LLEmojiHelper::instance().showHelper(this, cursorRect.mLeft, cursorRect.mTop, LLStringUtil::null, cb); } +void LLTextEditor::hideEmojiHelper() +{ + if (mShowEmojiHelper) + { + LLEmojiHelper::instance().hideHelper(this); + } +} + void LLTextEditor::tryToShowEmojiHelper() { if (mReadOnly || !mShowEmojiHelper) diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index e9e7070414..b2b14b01e2 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -207,6 +207,7 @@ public: bool getShowContextMenu() const { return mShowContextMenu; } void showEmojiHelper(); + void hideEmojiHelper(); void setShowEmojiHelper(bool show); bool getShowEmojiHelper() const { return mShowEmojiHelper; } diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 655674357f..50e765c236 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -39,6 +39,7 @@ #include "llchicletbar.h" #include "lldraghandle.h" #include "llemojidictionary.h" +#include "llemojihelper.h" #include "llfloaterreg.h" #include "llfloateremojipicker.h" #include "llfloaterimsession.h" @@ -300,6 +301,8 @@ bool LLFloaterIMSessionTab::postBuild() mEmojiPickerShowBtn = getChild("emoji_picker_show_btn"); 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("gear_btn"); mAddBtn = getChild("add_btn"); @@ -532,8 +535,43 @@ void LLFloaterIMSessionTab::onEmojiRecentPanelToggleBtnClicked() void LLFloaterIMSessionTab::onEmojiPickerShowBtnClicked() { - mInputEditor->setFocus(true); - mInputEditor->showEmojiHelper(); + if (!mEmojiPickerShowBtn->getToggleState()) + { + 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() diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h index 367d988f26..6d04d622e1 100644 --- a/indra/newview/llfloaterimsessiontab.h +++ b/indra/newview/llfloaterimsessiontab.h @@ -235,6 +235,8 @@ private: void onEmojiRecentPanelToggleBtnClicked(); void onEmojiPickerShowBtnClicked(); + void onEmojiPickerShowBtnDown(); + void onEmojiPickerClosed(); void initEmojiRecentPanel(); void onEmojiRecentPanelFocusReceived(); void onEmojiRecentPanelFocusLost(); @@ -249,6 +251,9 @@ private: S32 mInputEditorPad; S32 mChatLayoutPanelHeight; S32 mFloaterHeight; + + boost::signals2::connection mEmojiCloseConn; + U32 mEmojiHelperLastCallbackFrame = { 0 }; }; -- cgit v1.2.3 From bf0767b0d781202064c58ff7c9f44dfeec6959ac Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 29 Oct 2024 00:54:13 +0200 Subject: viewer#2894 Make PBR scale like Blinn Phong does --- indra/newview/llselectmgr.cpp | 27 +++++++++++++++++++++++++++ indra/newview/llselectmgr.h | 2 ++ 2 files changed, 29 insertions(+) diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index b307de787c..b2f30dd966 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -3138,6 +3138,8 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch) F32 scale_x = 1; F32 scale_y = 1; + F32 offset_x = 0; + F32 offset_y = 0; for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) { @@ -3154,6 +3156,21 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch) scale_y = scale_ratio.mV[t_axis] * object_scale.mV[t_axis]; } 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(); @@ -6904,6 +6921,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query) { mTextureScaleRatios.clear(); mGLTFScaleRatios.clear(); + mGLTFScales.clear(); + mGLTFOffsets.clear(); if (mObject.notNull()) { @@ -6944,6 +6963,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query) F32 scale_x = 1; F32 scale_y = 1; std::vector material_v_vec; + std::vector material_scales_vec; + std::vector material_offset_vec; for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) { if (material) @@ -6951,12 +6972,16 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query) LLGLTFMaterial::TextureTransform& transform = material->mTextureTransform[i]; scale_x = transform.mScale[VX]; scale_y = transform.mScale[VY]; + material_scales_vec.push_back(transform.mScale); + material_offset_vec.push_back(transform.mOffset); } else { // Not having an override doesn't mean that there is no material scale_x = 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) @@ -6972,6 +6997,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query) material_v_vec.push_back(material_v); } mGLTFScaleRatios.push_back(material_v_vec); + mGLTFScales.push_back(material_scales_vec); + mGLTFOffsets.push_back(material_offset_vec); } } } diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index b70ec3dbea..e4613bb3e7 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -242,6 +242,8 @@ public: gltf_materials_vec_t mSavedGLTFOverrideMaterials; std::vector mTextureScaleRatios; std::vector< std::vector > mGLTFScaleRatios; + std::vector< std::vector > mGLTFScales; + std::vector< std::vector > mGLTFOffsets; std::vector mSilhouetteVertices; // array of vertices to render silhouette of object std::vector mSilhouetteNormals; // array of normals to render silhouette of object bool mSilhouetteExists; // need to generate silhouette? -- cgit v1.2.3 From ecfe76ac125e484a78f1cba67314f5195d8fdf71 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 21 Mar 2025 21:40:38 +0200 Subject: vp#404 Improve URL filter --- indra/llui/llurlentry.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 3cc0c05ffa..77f132e9d8 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -221,6 +221,16 @@ bool LLUrlEntryBase::isWikiLinkCorrect(const std::string &labeled_url) const }, 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); if ((label.find(".com") != std::string::npos || label.find("www.") != std::string::npos) -- cgit v1.2.3 From b1822e36e531a3c423404f0aa875cbf6949061a0 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 27 Mar 2025 20:04:24 +0200 Subject: #3784 Increase texture scale boundaries --- .../skins/default/xui/en/panel_tools_texture.xml | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml index 9a19d06432..af6a9b94d9 100644 --- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml @@ -729,8 +729,8 @@ label_width="205" layout="topleft" left="10" - min_val="-100" - max_val="100" + min_val="-10000" + max_val="10000" name="TexScaleU" top_pad="5" width="265" /> @@ -742,8 +742,8 @@ label_width="205" layout="topleft" left="10" - min_val="-100" - max_val="100" + min_val="-10000" + max_val="10000" name="TexScaleV" width="265" /> @@ -818,8 +818,8 @@ label_width="205" layout="topleft" left="10" - min_val="-100" - max_val="100" + min_val="-10000" + max_val="10000" name="bumpyScaleV" width="265" /> @@ -882,8 +882,8 @@ label_width="205" layout="topleft" left="10" - min_val="-100" - max_val="100" + min_val="-10000" + max_val="10000" name="shinyScaleV" width="265" /> Date: Fri, 28 Mar 2025 21:49:58 +0200 Subject: #3809 Fix J2C Upload --- indra/llimage/llimagedimensionsinfo.cpp | 20 ++++++++++++++++++++ indra/llimage/llimagedimensionsinfo.h | 1 + indra/newview/llfilepicker.cpp | 6 ++++-- indra/newview/lllocalbitmaps.cpp | 20 ++++++++++++++++++++ indra/newview/lllocalbitmaps.h | 1 + indra/newview/llviewermenufile.cpp | 2 +- indra/newview/llviewertexturelist.cpp | 9 +++++++++ 7 files changed, 56 insertions(+), 3 deletions(-) diff --git a/indra/llimage/llimagedimensionsinfo.cpp b/indra/llimage/llimagedimensionsinfo.cpp index d4efbcfad2..49a1777fe5 100644 --- a/indra/llimage/llimagedimensionsinfo.cpp +++ b/indra/llimage/llimagedimensionsinfo.cpp @@ -27,6 +27,7 @@ #include "stdtypes.h" #include "llimagejpeg.h" +#include "llimagej2c.h" #include "llimagedimensionsinfo.h" @@ -63,6 +64,8 @@ bool LLImageDimensionsInfo::load(const std::string& src_filename,U32 codec) return getImageDimensionsTga(); case IMG_CODEC_JPEG: return getImageDimensionsJpeg(); + case IMG_CODEC_J2C: + return getImageDimensionsJ2c(); case IMG_CODEC_PNG: return getImageDimensionsPng(); default: @@ -214,6 +217,23 @@ bool LLImageDimensionsInfo::getImageDimensionsJpeg() return !sJpegErrorEncountered; } +bool LLImageDimensionsInfo::getImageDimensionsJ2c() +{ + clean(); + + LLPointer jpeg_image = new LLImageJ2C; + if (jpeg_image->load(mSrcFilename)) + { + mWidth = jpeg_image->getWidth(); + mHeight = jpeg_image->getHeight(); + return true; + } + mWarning = "texture_load_format_error"; + LL_WARNS() << "J2C load error: " << LLImage::getLastThreadError() << LL_ENDL; + + return false; +} + bool LLImageDimensionsInfo::checkFileLength(S32 min_len) { // Make sure the file is not shorter than min_len bytes. diff --git a/indra/llimage/llimagedimensionsinfo.h b/indra/llimage/llimagedimensionsinfo.h index 681d66ae4e..820cf33d7e 100644 --- a/indra/llimage/llimagedimensionsinfo.h +++ b/indra/llimage/llimagedimensionsinfo.h @@ -91,6 +91,7 @@ protected: bool getImageDimensionsTga(); bool getImageDimensionsPng(); bool getImageDimensionsJpeg(); + bool getImageDimensionsJ2c(); S32 read_s32() { diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 716e6cd9e3..96ac41a2bf 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -52,7 +52,7 @@ LLFilePicker LLFilePicker::sInstance; #if LL_WINDOWS #define SOUND_FILTER L"Sounds (*.wav)\0*.wav\0" -#define IMAGE_FILTER L"Images (*.tga; *.bmp; *.jpg; *.jpeg; *.png)\0*.tga;*.bmp;*.jpg;*.jpeg;*.png\0" +#define IMAGE_FILTER L"Images (*.tga; *.bmp; *.jpg; *.jpeg; *.j2c; *.jp2; *.png)\0*.tga;*.bmp;*.jpg;*.jpeg;*.j2c;*.jp2;*.png\0" #define ANIM_FILTER L"Animations (*.bvh; *.anim)\0*.bvh;*.anim\0" #define COLLADA_FILTER L"Scene (*.dae)\0*.dae\0" #define GLTF_FILTER L"glTF (*.gltf; *.glb)\0*.gltf;*.glb\0" @@ -559,7 +559,7 @@ bool LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename, } mOFN.lpstrDefExt = L"j2c"; mOFN.lpstrFilter = - L"Compressed Images (*.j2c)\0*.j2c\0" \ + L"Compressed Images (*.j2c *.jp2)\0*.j2c;*.jp2\0" \ L"\0"; break; case FFSAVE_SCRIPT: @@ -649,6 +649,8 @@ std::unique_ptr> LLFilePicker::navOpenFilterProc(ELoadF case FFLOAD_IMAGE: allowedv->push_back("jpg"); allowedv->push_back("jpeg"); + allowedv->push_back("j2c"); + allowedv->push_back("jp2"); allowedv->push_back("bmp"); allowedv->push_back("tga"); allowedv->push_back("bmpf"); diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp index 31c9eb8966..72a7fe8814 100644 --- a/indra/newview/lllocalbitmaps.cpp +++ b/indra/newview/lllocalbitmaps.cpp @@ -38,6 +38,7 @@ /* image compression headers. */ #include "llimagebmp.h" #include "llimagetga.h" +#include "llimagej2c.h" #include "llimagejpeg.h" #include "llimagepng.h" @@ -106,6 +107,10 @@ LLLocalBitmap::LLLocalBitmap(std::string filename) { mExtension = ET_IMG_JPG; } + else if (temp_exten == "j2c" || temp_exten == "jp2") + { + mExtension = ET_IMG_J2C; + } else if (temp_exten == "png") { mExtension = ET_IMG_PNG; @@ -356,6 +361,21 @@ bool LLLocalBitmap::decodeBitmap(LLPointer rawimg) break; } + case ET_IMG_J2C: + { + LLPointer 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: { LLPointer png_image = new LLImagePNG; diff --git a/indra/newview/lllocalbitmaps.h b/indra/newview/lllocalbitmaps.h index e169f96e70..06770334e4 100644 --- a/indra/newview/lllocalbitmaps.h +++ b/indra/newview/lllocalbitmaps.h @@ -89,6 +89,7 @@ class LLLocalBitmap ET_IMG_BMP, ET_IMG_TGA, ET_IMG_JPG, + ET_IMG_J2C, ET_IMG_PNG }; diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index ce66dbc03f..7a079b267d 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -378,7 +378,7 @@ void LLMediaFilePicker::notify(const std::vector& filenames) #if LL_WINDOWS static std::string SOUND_EXTENSIONS = "wav"; -static std::string IMAGE_EXTENSIONS = "tga bmp jpg jpeg png"; +static std::string IMAGE_EXTENSIONS = "tga bmp jpg jpeg j2c jp2 png"; static std::string ANIM_EXTENSIONS = "bvh anim"; static std::string XML_EXTENSIONS = "xml"; static std::string SLOBJECT_EXTENSIONS = "slobject"; diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index ae723b4068..9f23d39506 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1419,6 +1419,15 @@ bool LLViewerTextureList::createUploadFile(const std::string& filename, image->setLastError("Couldn't load the image to be uploaded."); 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 LLPointer raw_image = new LLImageRaw; if (!image->decode(raw_image, 0.0f)) -- cgit v1.2.3 From fcc8ffda16ee409e5952e3ca1d872bee786514df Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 31 Mar 2025 14:33:12 +0300 Subject: #3809 Partial revert of "Fix J2C Upload" This partially reverts commit 8d5dab9f67d54ce20768c0ccda58f27693cb20c9. Apparently viewer doesn't support some jp2 variants, so I'm leaving only the fix for bulk upload. --- indra/llimage/llimagedimensionsinfo.cpp | 20 -------------------- indra/llimage/llimagedimensionsinfo.h | 1 - indra/newview/llfilepicker.cpp | 6 ++---- indra/newview/llviewermenufile.cpp | 2 +- 4 files changed, 3 insertions(+), 26 deletions(-) diff --git a/indra/llimage/llimagedimensionsinfo.cpp b/indra/llimage/llimagedimensionsinfo.cpp index 49a1777fe5..d4efbcfad2 100644 --- a/indra/llimage/llimagedimensionsinfo.cpp +++ b/indra/llimage/llimagedimensionsinfo.cpp @@ -27,7 +27,6 @@ #include "stdtypes.h" #include "llimagejpeg.h" -#include "llimagej2c.h" #include "llimagedimensionsinfo.h" @@ -64,8 +63,6 @@ bool LLImageDimensionsInfo::load(const std::string& src_filename,U32 codec) return getImageDimensionsTga(); case IMG_CODEC_JPEG: return getImageDimensionsJpeg(); - case IMG_CODEC_J2C: - return getImageDimensionsJ2c(); case IMG_CODEC_PNG: return getImageDimensionsPng(); default: @@ -217,23 +214,6 @@ bool LLImageDimensionsInfo::getImageDimensionsJpeg() return !sJpegErrorEncountered; } -bool LLImageDimensionsInfo::getImageDimensionsJ2c() -{ - clean(); - - LLPointer jpeg_image = new LLImageJ2C; - if (jpeg_image->load(mSrcFilename)) - { - mWidth = jpeg_image->getWidth(); - mHeight = jpeg_image->getHeight(); - return true; - } - mWarning = "texture_load_format_error"; - LL_WARNS() << "J2C load error: " << LLImage::getLastThreadError() << LL_ENDL; - - return false; -} - bool LLImageDimensionsInfo::checkFileLength(S32 min_len) { // Make sure the file is not shorter than min_len bytes. diff --git a/indra/llimage/llimagedimensionsinfo.h b/indra/llimage/llimagedimensionsinfo.h index 820cf33d7e..681d66ae4e 100644 --- a/indra/llimage/llimagedimensionsinfo.h +++ b/indra/llimage/llimagedimensionsinfo.h @@ -91,7 +91,6 @@ protected: bool getImageDimensionsTga(); bool getImageDimensionsPng(); bool getImageDimensionsJpeg(); - bool getImageDimensionsJ2c(); S32 read_s32() { diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 96ac41a2bf..716e6cd9e3 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -52,7 +52,7 @@ LLFilePicker LLFilePicker::sInstance; #if LL_WINDOWS #define SOUND_FILTER L"Sounds (*.wav)\0*.wav\0" -#define IMAGE_FILTER L"Images (*.tga; *.bmp; *.jpg; *.jpeg; *.j2c; *.jp2; *.png)\0*.tga;*.bmp;*.jpg;*.jpeg;*.j2c;*.jp2;*.png\0" +#define IMAGE_FILTER L"Images (*.tga; *.bmp; *.jpg; *.jpeg; *.png)\0*.tga;*.bmp;*.jpg;*.jpeg;*.png\0" #define ANIM_FILTER L"Animations (*.bvh; *.anim)\0*.bvh;*.anim\0" #define COLLADA_FILTER L"Scene (*.dae)\0*.dae\0" #define GLTF_FILTER L"glTF (*.gltf; *.glb)\0*.gltf;*.glb\0" @@ -559,7 +559,7 @@ bool LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename, } mOFN.lpstrDefExt = L"j2c"; mOFN.lpstrFilter = - L"Compressed Images (*.j2c *.jp2)\0*.j2c;*.jp2\0" \ + L"Compressed Images (*.j2c)\0*.j2c\0" \ L"\0"; break; case FFSAVE_SCRIPT: @@ -649,8 +649,6 @@ std::unique_ptr> LLFilePicker::navOpenFilterProc(ELoadF case FFLOAD_IMAGE: allowedv->push_back("jpg"); allowedv->push_back("jpeg"); - allowedv->push_back("j2c"); - allowedv->push_back("jp2"); allowedv->push_back("bmp"); allowedv->push_back("tga"); allowedv->push_back("bmpf"); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 7a079b267d..ce66dbc03f 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -378,7 +378,7 @@ void LLMediaFilePicker::notify(const std::vector& filenames) #if LL_WINDOWS static std::string SOUND_EXTENSIONS = "wav"; -static std::string IMAGE_EXTENSIONS = "tga bmp jpg jpeg j2c jp2 png"; +static std::string IMAGE_EXTENSIONS = "tga bmp jpg jpeg png"; static std::string ANIM_EXTENSIONS = "bvh anim"; static std::string XML_EXTENSIONS = "xml"; static std::string SLOBJECT_EXTENSIONS = "slobject"; -- cgit v1.2.3 From 515c1f15d835f1e8c45828722d8ad91b0604408c Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Mon, 31 Mar 2025 19:06:06 +0300 Subject: #3044 Add option to hide L$ balance for Snapshots with Interface showing --- indra/newview/app_settings/settings.xml | 11 ++++++ indra/newview/llappviewer.cpp | 1 + indra/newview/llfloatersnapshot.cpp | 44 ++++++---------------- indra/newview/llfloatersnapshot.h | 3 +- indra/newview/llsnapshotlivepreview.cpp | 2 + indra/newview/llstatusbar.cpp | 4 ++ indra/newview/llstatusbar.h | 2 + indra/newview/llviewermenufile.cpp | 2 + indra/newview/llviewermessage.cpp | 2 + indra/newview/llviewerwindow.cpp | 21 +++++++++-- indra/newview/llviewerwindow.h | 10 +++-- indra/newview/llviewerwindowlistener.cpp | 2 +- .../skins/default/xui/en/floater_snapshot.xml | 14 ++++++- 13 files changed, 74 insertions(+), 44 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 0c83355a81..86d36b3f29 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -9540,6 +9540,17 @@ Value 0 + RenderBalanceInSnapshot + + Comment + Display L$ balance in snapshot + Persist + 1 + Type + Boolean + Value + 1 + RenderUIBuffer Comment diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 4cf651de33..3f7aaf9557 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -4540,6 +4540,7 @@ void LLAppViewer::saveFinalSnapshot() false, gSavedSettings.getBOOL("RenderHUDInSnapshot"), true, + false, LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::SNAPSHOT_FORMAT_PNG); mSavedFinalSnapshot = true; diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 68b9e758a1..faf7ed0d8c 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -60,12 +60,13 @@ LLPanelSnapshot* LLFloaterSnapshot::Impl::getActivePanel(LLFloaterSnapshotBase* { LLSideTrayPanelContainer* panel_container = floater->getChild("panel_container"); LLPanelSnapshot* active_panel = dynamic_cast(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 (!active_panel) + { + LL_WARNS() << "No snapshot active panel, current panel index: " << panel_container->getCurrentPanelIndex() << LL_ENDL; + } llassert_always(active_panel != NULL); } return active_panel; @@ -516,34 +517,13 @@ void LLFloaterSnapshotBase::ImplBase::onClickFilter(LLUICtrl *ctrl, void* data) } // static -void LLFloaterSnapshotBase::ImplBase::onClickUICheck(LLUICtrl *ctrl, void* data) +void LLFloaterSnapshotBase::ImplBase::onClickDisplaySetting(LLUICtrl* ctrl, void* data) { - LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; - gSavedSettings.setBOOL( "RenderUIInSnapshot", check->get() ); - - LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; + LLFloaterSnapshot* view = (LLFloaterSnapshot*)data; if (view) { LLSnapshotLivePreview* previewp = view->getPreviewView(); - 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) + if (previewp) { previewp->updateSnapshot(true, true); } @@ -1002,11 +982,9 @@ bool LLFloaterSnapshot::postBuild() mSucceessLblPanel = getChild("succeeded_panel"); mFailureLblPanel = getChild("failed_panel"); - childSetCommitCallback("ui_check", ImplBase::onClickUICheck, this); - getChild("ui_check")->setValue(gSavedSettings.getBOOL("RenderUIInSnapshot")); - - childSetCommitCallback("hud_check", ImplBase::onClickHUDCheck, this); - getChild("hud_check")->setValue(gSavedSettings.getBOOL("RenderHUDInSnapshot")); + childSetCommitCallback("ui_check", ImplBase::onClickDisplaySetting, this); + childSetCommitCallback("balance_check", ImplBase::onClickDisplaySetting, this); + childSetCommitCallback("hud_check", ImplBase::onClickDisplaySetting, this); ((Impl*)impl)->setAspectRatioCheckboxValue(this, gSavedSettings.getBOOL("KeepAspectForSnapshot")); diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index 6df851b839..186d9c41cf 100644 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -103,8 +103,7 @@ public: static void onClickAutoSnap(LLUICtrl *ctrl, void* data); static void onClickNoPost(LLUICtrl *ctrl, void* data); static void onClickFilter(LLUICtrl *ctrl, void* data); - static void onClickUICheck(LLUICtrl *ctrl, void* data); - static void onClickHUDCheck(LLUICtrl *ctrl, void* data); + static void onClickDisplaySetting(LLUICtrl *ctrl, void* data); static void onCommitFreezeFrame(LLUICtrl* ctrl, void* data); virtual LLPanelSnapshot* getActivePanel(LLFloaterSnapshotBase* floater, bool ok_if_not_found = true) = 0; diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp index ea95d71b27..68b4ab381a 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -694,6 +694,7 @@ bool LLSnapshotLivePreview::onIdle( void* snapshot_preview ) static LLCachedControl freeze_time(gSavedSettings, "FreezeTime", false); static LLCachedControl use_freeze_frame(gSavedSettings, "UseFreezeFrame", false); static LLCachedControl render_ui(gSavedSettings, "RenderUIInSnapshot", false); + static LLCachedControl render_balance(gSavedSettings, "RenderBalanceInSnapshot", false); static LLCachedControl render_hud(gSavedSettings, "RenderHUDInSnapshot", false); static LLCachedControl render_no_post(gSavedSettings, "RenderSnapshotNoPost", false); @@ -750,6 +751,7 @@ bool LLSnapshotLivePreview::onIdle( void* snapshot_preview ) render_hud, false, render_no_post, + render_balance, previewp->mSnapshotBufferType, previewp->getMaxImageSize())) { diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index ecbbc4b2c5..8aa2058ae1 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -738,6 +738,10 @@ void LLStatusBar::updateBalancePanelPosition() balance_bg_view->setShape(balance_bg_rect); } +void LLStatusBar::setBalanceVisible(bool visible) +{ + mBoxBalance->setVisible(visible); +} // Implements secondlife:///app/balance/request to request a L$ balance // update via UDP message system. JC diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h index 4c9d3e0c08..45cbda0ef1 100644 --- a/indra/newview/llstatusbar.h +++ b/indra/newview/llstatusbar.h @@ -93,6 +93,8 @@ public: S32 getSquareMetersCommitted() const; S32 getSquareMetersLeft() const; + void setBalanceVisible(bool visible); + LLPanelNearByMedia* getNearbyMediaPanel() { return mPanelNearByMedia; } private: diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index ce66dbc03f..9743ec0c59 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -932,6 +932,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t bool render_ui = gSavedSettings.getBOOL("RenderUIInSnapshot"); bool render_hud = gSavedSettings.getBOOL("RenderHUDInSnapshot"); bool render_no_post = gSavedSettings.getBOOL("RenderSnapshotNoPost"); + bool render_balance = gSavedSettings.getBOOL("RenderBalanceInSnapshot"); bool high_res = gSavedSettings.getBOOL("HighResSnapshot"); if (high_res) @@ -952,6 +953,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t render_hud, false, render_no_post, + render_balance, LLSnapshotModel::SNAPSHOT_TYPE_COLOR, high_res ? S32_MAX : MAX_SNAPSHOT_IMAGE_SIZE)) //per side { diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 7890a571b2..b274ba5abb 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -5039,6 +5039,7 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem) false, //UI gSavedSettings.getBOOL("RenderHUDInSnapshot"), false, + false, LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::SNAPSHOT_FORMAT_PNG); } @@ -5144,6 +5145,7 @@ static void process_special_alert_messages(const std::string & message) false, gSavedSettings.getBOOL("RenderHUDInSnapshot"), false, + false, LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::SNAPSHOT_FORMAT_PNG); } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 4194dd00e7..a133febb85 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -4849,12 +4849,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; LLPointer 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) { @@ -4915,14 +4915,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) { - 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 // 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. 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) { @@ -4980,6 +4980,8 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei // If the user wants the UI, limit the output size to the available screen size image_width = llmin(image_width, window_width); image_height = llmin(image_height, window_height); + + setBalanceVisible(show_balance); } S32 original_width = 0; @@ -5057,11 +5059,13 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei } else { + setBalanceVisible(true); return false; } if (raw->isBufferInvalid()) { + setBalanceVisible(true); return false; } @@ -5237,6 +5241,7 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei { send_agent_resume(); } + setBalanceVisible(true); return ret; } @@ -5702,6 +5707,14 @@ void LLViewerWindow::setProgressCancelButtonVisible( bool b, const std::string& } } +void LLViewerWindow::setBalanceVisible(bool visible) +{ + if (gStatusBar) + { + gStatusBar->setBalanceVisible(visible); + } +} + LLProgressView *LLViewerWindow::getProgressView() const { return mProgressView; diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index ac0dfa3fe4..d55c2d3817 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -364,9 +364,11 @@ public: // snapshot functionality. // 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 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, LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE); + 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, + LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::ESnapshotFormat format = LLSnapshotModel::SNAPSHOT_FORMAT_BMP); + 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); @@ -462,6 +464,8 @@ public: void calcDisplayScale(); static LLRect calcScaledRect(const LLRect & rect, const LLVector2& display_scale); + void setBalanceVisible(bool visible); + static std::string getLastSnapshotDir(); LLView* getFloaterSnapRegion() { return mFloaterSnapRegion; } diff --git a/indra/newview/llviewerwindowlistener.cpp b/indra/newview/llviewerwindowlistener.cpp index da7e18af5c..3119c31613 100644 --- a/indra/newview/llviewerwindowlistener.cpp +++ b/indra/newview/llviewerwindowlistener.cpp @@ -100,7 +100,7 @@ void LLViewerWindowListener::saveSnapshot(const LLSD& event) const } 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); } diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index e6b780728c..acdccdc03a 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -167,8 +167,19 @@ left="30" height="16" top_pad="8" - width="180" + width="80" + control_name="RenderUIInSnapshot" name="ui_check" /> + Date: Wed, 17 Apr 2024 16:58:48 +0200 Subject: secondlife/viewer#912 BugSplat Crash 1412267 (missed refactoring for FindModel) # Conflicts: # indra/newview/llmodelpreview.cpp --- indra/newview/llmodelpreview.cpp | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index 29ab4e38c0..4ac3abd747 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -132,7 +132,7 @@ std::string getLodSuffix(S32 lod) return suffix; } -void FindModel(LLModelLoader::scene& scene, const std::string& name_to_match, LLModel*& baseModelOut, LLMatrix4& matOut) +static bool FindModel(LLModelLoader::scene& scene, const std::string& name_to_match, LLModel*& baseModelOut, LLMatrix4& matOut) { for (auto scene_iter = scene.begin(); scene_iter != scene.end(); scene_iter++) { @@ -142,10 +142,11 @@ void FindModel(LLModelLoader::scene& scene, const std::string& name_to_match, LL { baseModelOut = model_iter->mModel; matOut = scene_iter->first; - return; + return true; } } } + return false; } //----------------------------------------------------------------------------- @@ -319,10 +320,8 @@ void LLModelPreview::rebuildUploadData() mat *= scale_mat; - for (auto model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter) - { // for each instance with said transform applied - LLModelInstance instance = *model_iter; - + for (LLModelInstance& instance : iter->second) + { //for each instance with said transform applied LLModel* base_model = instance.mModel; if (base_model && !requested_name.empty()) @@ -354,7 +353,7 @@ void LLModelPreview::rebuildUploadData() } else { - //Physics can be inherited from other LODs or loaded, so we need to adjust what extension we are searching for + // Physics can be inherited from other LODs or loaded, so we need to adjust what extension we are searching for extensionLOD = mPhysicsSearchLOD; } @@ -365,9 +364,9 @@ void LLModelPreview::rebuildUploadData() name_to_match += toAdd; } - FindModel(mScene[i], name_to_match, lod_model, transform); + bool found = FindModel(mScene[i], name_to_match, lod_model, transform); - if (!lod_model && i != LLModel::LOD_PHYSICS) + if (!found && i != LLModel::LOD_PHYSICS) { if (mImporterDebug) { @@ -380,7 +379,7 @@ void LLModelPreview::rebuildUploadData() } int searchLOD = (i > LLModel::LOD_HIGH) ? LLModel::LOD_HIGH : i; - while ((searchLOD <= LLModel::LOD_HIGH) && !lod_model) + for (; searchLOD <= LLModel::LOD_HIGH; ++searchLOD) { std::string name_to_match = instance.mLabel; llassert(!name_to_match.empty()); @@ -394,8 +393,8 @@ void LLModelPreview::rebuildUploadData() // See if we can find an appropriately named model in LOD 'searchLOD' // - FindModel(mScene[searchLOD], name_to_match, lod_model, transform); - searchLOD++; + if (FindModel(mScene[searchLOD], name_to_match, lod_model, transform)) + break; } } } @@ -1174,8 +1173,7 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod) LLModel* found_model = NULL; LLMatrix4 transform; - FindModel(mBaseScene, loaded_name, found_model, transform); - if (found_model) + if (FindModel(mBaseScene, loaded_name, found_model, transform)) { // don't rename correctly named models (even if they are placed in a wrong order) name_based = true; } -- cgit v1.2.3 From 497c309a5b148fd86a0e1429343092f0a6ca2e0d Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Tue, 1 Apr 2025 15:02:24 +0300 Subject: #912 Refactor FindModel() --- indra/newview/llmodelpreview.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index 4ac3abd747..5a8fd299bf 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -132,16 +132,16 @@ std::string getLodSuffix(S32 lod) return suffix; } -static bool FindModel(LLModelLoader::scene& scene, const std::string& name_to_match, LLModel*& baseModelOut, LLMatrix4& matOut) +static bool FindModel(const LLModelLoader::scene& scene, const std::string& name_to_match, LLModel*& baseModelOut, LLMatrix4& matOut) { - for (auto scene_iter = scene.begin(); scene_iter != scene.end(); scene_iter++) + for (const auto& scene_pair : scene) { - for (auto model_iter = scene_iter->second.begin(); model_iter != scene_iter->second.end(); model_iter++) + for (const auto& model_iter : scene_pair.second) { - if (model_iter->mModel && (model_iter->mModel->mLabel == name_to_match)) + if (model_iter.mModel && (model_iter.mModel->mLabel == name_to_match)) { - baseModelOut = model_iter->mModel; - matOut = scene_iter->first; + baseModelOut = model_iter.mModel; + matOut = scene_pair.first; return true; } } -- cgit v1.2.3 From 945b965fc237a37d44f4fa57188b369e3f4a693d Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Tue, 1 Apr 2025 19:42:21 +0300 Subject: Add file pattern and recursive directory processing fix_xml_indentations.py --- scripts/code_tools/fix_xml_indentations.py | 54 ++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/scripts/code_tools/fix_xml_indentations.py b/scripts/code_tools/fix_xml_indentations.py index e317e4f7f6..a196b0b7d4 100644 --- a/scripts/code_tools/fix_xml_indentations.py +++ b/scripts/code_tools/fix_xml_indentations.py @@ -86,21 +86,37 @@ def save_xml(tree, file_path, xml_decl, indent_text=False, indent_tab=False, rm_ except IOError as e: print(f"Error saving file {file_path}: {e}") -def process_directory(directory_path, indent_text=False, indent_tab=False, rm_space=False, rewrite_decl=False): +def process_xml_files(file_paths, indent_text=False, indent_tab=False, rm_space=False, rewrite_decl=False): + found_files = False + if file_paths: + found_files = True + for file_path in file_paths: + xml_decl = get_xml_declaration(file_path) + tree = parse_xml_file(file_path) + if tree is not None: + save_xml(tree, file_path, xml_decl, indent_text, indent_tab, rm_space, rewrite_decl) + return found_files + +def process_directory(directory_path, indent_text=False, indent_tab=False, rm_space=False, rewrite_decl=False, file_pattern=None, recursive=False): if not os.path.isdir(directory_path): print(f"Directory not found: {directory_path}") return - xml_files = glob.glob(os.path.join(directory_path, "*.xml")) - if not xml_files: - print(f"No XML files found in directory: {directory_path}") - return + pattern = file_pattern if file_pattern else "*.xml" + found_files = False + + if not recursive: + # Non-recursive mode + xml_files = glob.glob(os.path.join(directory_path, pattern)) + found_files = process_xml_files(xml_files, indent_text, indent_tab, rm_space, rewrite_decl) + else: + # Recursive mode + for root, dirs, files in os.walk(directory_path): + xml_files = glob.glob(os.path.join(root, pattern)) + found_files = process_xml_files(xml_files, indent_text, indent_tab, rm_space, rewrite_decl) - for file_path in xml_files: - xml_decl = get_xml_declaration(file_path) - tree = parse_xml_file(file_path) - if tree is not None: - save_xml(tree, file_path, xml_decl, indent_text, indent_tab, rm_space, rewrite_decl) + if not found_files: + print(f"No XML files found in {'directory tree' if recursive else 'directory'}: {directory_path}") if __name__ == "__main__": if len(sys.argv) < 2 or '--help' in sys.argv: @@ -112,9 +128,13 @@ if __name__ == "__main__": print(" --indent-tab Uses tabs instead of spaces for indentation.") print(" --rm-space Removes spaces in self-closing tags.") print(" --rewrite_decl Replaces the XML declaration line.") + print(" --file Only process files matching the pattern") + print(" --recursive Process files in all subdirectories") print("\nCommon Usage:") print(" To format XML files with text indentation, tab indentation, and removal of spaces in self-closing tags:") print(" python fix_xml_indentations.py /path/to/xmls --indent-text --indent-tab --rm-space") + print("\n To format specific XML files recursively through all subdirectories:") + print(" python fix_xml_indentations.py /path/to/xmls --file floater_*.xml --recursive") sys.exit(1) directory_path = sys.argv[1] @@ -122,4 +142,16 @@ if __name__ == "__main__": indent_tab = '--indent-tab' in sys.argv rm_space = '--rm-space' in sys.argv rewrite_decl = '--rewrite_decl' in sys.argv - process_directory(directory_path, indent_text, indent_tab, rm_space, rewrite_decl) + recursive = '--recursive' in sys.argv + + # Get file pattern if specified + file_pattern = None + if '--file' in sys.argv: + try: + file_index = sys.argv.index('--file') + 1 + if file_index < len(sys.argv): + file_pattern = sys.argv[file_index] + except ValueError: + pass + + process_directory(directory_path, indent_text, indent_tab, rm_space, rewrite_decl, file_pattern, recursive) -- cgit v1.2.3 From 3a03c5f8fe00ae23a33c823625052f39fb42501e Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 1 Apr 2025 16:30:21 +0300 Subject: #3846 Crash at updateGLTFMaterials --- indra/newview/lllocalbitmaps.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp index 75c77e9301..e31fbb188a 100644 --- a/indra/newview/lllocalbitmaps.cpp +++ b/indra/newview/lllocalbitmaps.cpp @@ -700,11 +700,15 @@ void LLLocalBitmap::updateGLTFMaterials(LLUUID old_id, LLUUID new_id) // do not create a new material, reuse existing pointer // so that mTextureEntires remains untouched LLGLTFMaterial* render_mat = entry->getGLTFRenderMaterial(); - if (render_mat) + if (render_mat && render_mat != mat) { *render_mat = *mat; render_mat->applyOverride(*override_mat); // can update mGLTFMaterialWithLocalTextures } + else + { + LL_WARNS() << "A TE had an override, but no render material" << LL_ENDL; + } } } } -- cgit v1.2.3 From 8c20662ff77a9672917aa127f80a2fa9efda7119 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 1 Apr 2025 20:35:52 +0300 Subject: #3712 CMakeFindFrameworks deprecation --- indra/cmake/Linking.cmake | 1 - indra/llwindow/CMakeLists.txt | 1 - 2 files changed, 2 deletions(-) diff --git a/indra/cmake/Linking.cmake b/indra/cmake/Linking.cmake index 1d757abeff..1093fc7f71 100644 --- a/indra/cmake/Linking.cmake +++ b/indra/cmake/Linking.cmake @@ -67,7 +67,6 @@ elseif (WINDOWS) legacy_stdio_definitions ) else() - include(CMakeFindFrameworks) find_library(COREFOUNDATION_LIBRARY CoreFoundation) find_library(CARBON_LIBRARY Carbon) find_library(COCOA_LIBRARY Cocoa) diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt index 2996f58fe0..5bfac34ca5 100644 --- a/indra/llwindow/CMakeLists.txt +++ b/indra/llwindow/CMakeLists.txt @@ -182,7 +182,6 @@ endif (SDL_FOUND) target_include_directories(llwindow INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) if (DARWIN) - include(CMakeFindFrameworks) find_library(CARBON_LIBRARY Carbon) target_link_libraries(llwindow ${CARBON_LIBRARY}) endif (DARWIN) -- cgit v1.2.3 From 939817d560434cdc2888ef478b965f5625a381b7 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 1 Apr 2025 21:16:38 +0300 Subject: #3849 Crash at LLSelectMgr::updatePointAt --- indra/newview/llselectmgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 3d17446186..be1e64ce54 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -7513,7 +7513,7 @@ void LLSelectMgr::updatePointAt() LLVector3 select_offset; const LLPickInfo& pick = gViewerWindow->getLastPick(); LLViewerObject *click_object = pick.getObject(); - bool was_hud = pick.mPickHUD && !click_object->isHUDAttachment(); + bool was_hud = pick.mPickHUD && click_object && !click_object->isHUDAttachment(); if (click_object && click_object->isSelected() && !was_hud) { // clicked on another object in our selection group, use that as target -- cgit v1.2.3 From d77954ef50f300846eb14034a8dde3e4d7064dcf Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Wed, 2 Apr 2025 01:50:21 +0300 Subject: #3597 Improve error handling at LLGLSLShader::disableTexture() --- indra/llrender/llglslshader.cpp | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index b3f32fdc83..50e40a3eb6 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -1247,23 +1247,40 @@ S32 LLGLSLShader::disableTexture(S32 uniform, LLTexUnit::eTextureType mode) llassert(false); return -1; } + S32 index = mTexture[uniform]; - if (index != -1 && gGL.getTexUnit(index)->getCurrType() != LLTexUnit::TT_NONE) + if (index < 0) + { + // Invalid texture index - nothing to disable + return index; + } + + LLTexUnit* tex_unit = gGL.getTexUnit(index); + if (!tex_unit) { - if (gDebugGL && gGL.getTexUnit(index)->getCurrType() != mode) + // Invalid texture unit + LL_WARNS_ONCE("Shader") << "Invalid texture unit at index: " << index << LL_ENDL; + return index; + } + + LLTexUnit::eTextureType curr_type = tex_unit->getCurrType(); + if (curr_type != LLTexUnit::TT_NONE) + { + if (gDebugGL && curr_type != mode) { if (gDebugSession) { - gFailLog << "Texture channel " << index << " texture type corrupted." << std::endl; + gFailLog << "Texture channel " << index << " texture type corrupted. Expected: " << mode << ", Found: " << curr_type << std::endl; ll_fail("LLGLSLShader::disableTexture failed"); } else { - LL_ERRS() << "Texture channel " << index << " texture type corrupted." << LL_ENDL; + LL_ERRS() << "Texture channel " << index << " texture type corrupted. Expected: " << mode << ", Found: " << curr_type << LL_ENDL; } } - gGL.getTexUnit(index)->disable(); + tex_unit->disable(); } + return index; } -- cgit v1.2.3 From db2c45ba23a10d34d89f556533f80a8b42600bf6 Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Wed, 2 Apr 2025 17:22:17 +0300 Subject: #3857 pick new and updated LEAP functions from develop branch --- indra/newview/llagentlistener.cpp | 387 ++++++++++++++++++++---- indra/newview/llagentlistener.h | 17 +- indra/newview/llfloaterimnearbychat.cpp | 3 + indra/newview/llfloaterimnearbychatlistener.cpp | 34 +-- indra/newview/llfloaterimnearbychatlistener.h | 6 +- 5 files changed, 371 insertions(+), 76 deletions(-) diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp index 0c120ae01d..5ddb87558a 100644 --- a/indra/newview/llagentlistener.cpp +++ b/indra/newview/llagentlistener.cpp @@ -31,19 +31,25 @@ #include "llagentlistener.h" #include "llagent.h" +#include "llagentcamera.h" +#include "llavatarname.h" +#include "llavatarnamecache.h" #include "llvoavatar.h" #include "llcommandhandler.h" +#include "llinventorymodel.h" #include "llslurl.h" #include "llurldispatcher.h" +#include "llviewercontrol.h" #include "llviewernetwork.h" #include "llviewerobject.h" #include "llviewerobjectlist.h" #include "llviewerregion.h" +#include "llvoavatarself.h" #include "llsdutil.h" #include "llsdutil_math.h" #include "lltoolgrab.h" #include "llhudeffectlookat.h" -#include "llagentcamera.h" +#include "llviewercamera.h" LLAgentListener::LLAgentListener(LLAgent &agent) : LLEventAPI("LLAgent", @@ -69,13 +75,6 @@ LLAgentListener::LLAgentListener(LLAgent &agent) add("resetAxes", "Set the agent to a fixed orientation (optionally specify [\"lookat\"] = array of [x, y, z])", &LLAgentListener::resetAxes); - add("getAxes", - "Obsolete - use getPosition instead\n" - "Send information about the agent's orientation on [\"reply\"]:\n" - "[\"euler\"]: map of {roll, pitch, yaw}\n" - "[\"quat\"]: array of [x, y, z, w] quaternion values", - &LLAgentListener::getAxes, - LLSDMap("reply", LLSD())); add("getPosition", "Send information about the agent's position and orientation on [\"reply\"]:\n" "[\"region\"]: array of region {x, y, z} position\n" @@ -87,33 +86,34 @@ LLAgentListener::LLAgentListener(LLAgent &agent) add("startAutoPilot", "Start the autopilot system using the following parameters:\n" "[\"target_global\"]: array of target global {x, y, z} position\n" - "[\"stop_distance\"]: target maxiumum distance from target [default: autopilot guess]\n" + "[\"stop_distance\"]: maximum stop distance from target [default: autopilot guess]\n" "[\"target_rotation\"]: array of [x, y, z, w] quaternion values [default: no target]\n" "[\"rotation_threshold\"]: target maximum angle from target facing rotation [default: 0.03 radians]\n" - "[\"behavior_name\"]: name of the autopilot behavior [default: \"\"]" - "[\"allow_flying\"]: allow flying during autopilot [default: True]", - //"[\"callback_pump\"]: pump to send success/failure and callback data to [default: none]\n" - //"[\"callback_data\"]: data to send back during a callback [default: none]", - &LLAgentListener::startAutoPilot); + "[\"behavior_name\"]: name of the autopilot behavior [default: \"\"]\n" + "[\"allow_flying\"]: allow flying during autopilot [default: True]\n" + "event with [\"success\"] flag is sent to 'LLAutopilot' event pump, when auto pilot is terminated", + &LLAgentListener::startAutoPilot, + llsd::map("target_global", LLSD())); add("getAutoPilot", "Send information about current state of the autopilot system to [\"reply\"]:\n" "[\"enabled\"]: boolean indicating whether or not autopilot is enabled\n" "[\"target_global\"]: array of target global {x, y, z} position\n" "[\"leader_id\"]: uuid of target autopilot is following\n" - "[\"stop_distance\"]: target maximum distance from target\n" + "[\"stop_distance\"]: maximum stop distance from target\n" "[\"target_distance\"]: last known distance from target\n" "[\"use_rotation\"]: boolean indicating if autopilot has a target facing rotation\n" "[\"target_facing\"]: array of {x, y} target direction to face\n" "[\"rotation_threshold\"]: target maximum angle from target facing rotation\n" "[\"behavior_name\"]: name of the autopilot behavior", &LLAgentListener::getAutoPilot, - LLSDMap("reply", LLSD())); + llsd::map("reply", LLSD())); add("startFollowPilot", "[\"leader_id\"]: uuid of target to follow using the autopilot system (optional with avatar_name)\n" "[\"avatar_name\"]: avatar name to follow using the autopilot system (optional with leader_id)\n" "[\"allow_flying\"]: allow flying during autopilot [default: True]\n" - "[\"stop_distance\"]: target maxiumum distance from target [default: autopilot guess]", - &LLAgentListener::startFollowPilot); + "[\"stop_distance\"]: maximum stop distance from target [default: autopilot guess]", + &LLAgentListener::startFollowPilot, + llsd::map("reply", LLSD())); add("setAutoPilotTarget", "Update target for currently running autopilot:\n" "[\"target_global\"]: array of target global {x, y, z} position", @@ -138,6 +138,69 @@ LLAgentListener::LLAgentListener(LLAgent &agent) "[\"contrib\"]: user's land contribution to this group\n", &LLAgentListener::getGroups, LLSDMap("reply", LLSD())); + //camera params are similar to LSL, see https://wiki.secondlife.com/wiki/LlSetCameraParams + add("setCameraParams", + "Set Follow camera params, and then activate it:\n" + "[\"camera_pos\"]: vector3, camera position in region coordinates\n" + "[\"focus_pos\"]: vector3, what the camera is aimed at (in region coordinates)\n" + "[\"focus_offset\"]: vector3, adjusts the camera focus position relative to the target, default is (1, 0, 0)\n" + "[\"distance\"]: float (meters), distance the camera wants to be from its target, default is 3\n" + "[\"focus_threshold\"]: float (meters), sets the radius of a sphere around the camera's target position within which its focus is not affected by target motion, default is 1\n" + "[\"camera_threshold\"]: float (meters), sets the radius of a sphere around the camera's ideal position within which it is not affected by target motion, default is 1\n" + "[\"focus_lag\"]: float (seconds), how much the camera lags as it tries to aim towards the target, default is 0.1\n" + "[\"camera_lag\"]: float (seconds), how much the camera lags as it tries to move towards its 'ideal' position, default is 0.1\n" + "[\"camera_pitch\"]: float (degrees), adjusts the angular amount that the camera aims straight ahead vs. straight down, maintaining the same distance, default is 0\n" + "[\"behindness_angle\"]: float (degrees), sets the angle in degrees within which the camera is not constrained by changes in target rotation, default is 10\n" + "[\"behindness_lag\"]: float (seconds), sets how strongly the camera is forced to stay behind the target if outside of behindness angle, default is 0\n" + "[\"camera_locked\"]: bool, locks the camera position so it will not move\n" + "[\"focus_locked\"]: bool, locks the camera focus so it will not move", + &LLAgentListener::setFollowCamParams); + add("setFollowCamActive", + "Turns on or off scripted control of the camera using boolean [\"active\"]", + &LLAgentListener::setFollowCamActive, + llsd::map("active", LLSD())); + add("removeCameraParams", + "Reset Follow camera params", + &LLAgentListener::removeFollowCamParams); + + add("playAnimation", + "Play [\"item_id\"] animation locally (by default) or [\"inworld\"] (when set to true)", + &LLAgentListener::playAnimation, + llsd::map("item_id", LLSD(), "reply", LLSD())); + add("stopAnimation", + "Stop playing [\"item_id\"] animation", + &LLAgentListener::stopAnimation, + llsd::map("item_id", LLSD(), "reply", LLSD())); + add("getAnimationInfo", + "Return information about [\"item_id\"] animation", + &LLAgentListener::getAnimationInfo, + llsd::map("item_id", LLSD(), "reply", LLSD())); + + add("getID", + "Return your own avatar ID", + &LLAgentListener::getID, + llsd::map("reply", LLSD())); + + add("getNearbyAvatarsList", + "Return result set key [\"result\"] for nearby avatars in a range of [\"dist\"]\n" + "if [\"dist\"] is not specified, 'RenderFarClip' setting is used\n" + "reply contains \"result\" table with \"id\", \"name\", \"global_pos\", \"region_pos\", \"region_id\" fields", + &LLAgentListener::getNearbyAvatarsList, + llsd::map("reply", LLSD())); + + add("getNearbyObjectsList", + "Return result set key [\"result\"] for nearby objects in a range of [\"dist\"]\n" + "if [\"dist\"] is not specified, 'RenderFarClip' setting is used\n" + "reply contains \"result\" table with \"id\", \"global_pos\", \"region_pos\", \"region_id\" fields", + &LLAgentListener::getNearbyObjectsList, + llsd::map("reply", LLSD())); + + add("getAgentScreenPos", + "Return screen position of the [\"avatar_id\"] avatar or own avatar if not specified\n" + "reply contains \"x\", \"y\" coordinates and \"onscreen\" flag to indicate if it's actually in within the current window\n" + "avatar render position is used as the point", + &LLAgentListener::getAgentScreenPos, + llsd::map("reply", LLSD())); } void LLAgentListener::requestTeleport(LLSD const & event_data) const @@ -168,7 +231,7 @@ void LLAgentListener::requestSit(LLSD const & event_data) const //mAgent.getAvatarObject()->sitOnObject(); // shamelessly ripped from llviewermenu.cpp:handle_sit_or_stand() // *TODO - find a permanent place to share this code properly. - + Response response(LLSD(), event_data); LLViewerObject *object = NULL; if (event_data.has("obj_uuid")) { @@ -177,7 +240,13 @@ void LLAgentListener::requestSit(LLSD const & event_data) const else if (event_data.has("position")) { LLVector3 target_position = ll_vector3_from_sd(event_data["position"]); - object = findObjectClosestTo(target_position); + object = findObjectClosestTo(target_position, true); + } + else + { + //just sit on the ground + mAgent.setControlFlags(AGENT_CONTROL_SIT_ON_GROUND); + return; } if (object && object->getPCode() == LL_PCODE_VOLUME) @@ -194,8 +263,7 @@ void LLAgentListener::requestSit(LLSD const & event_data) const } else { - LL_WARNS() << "LLAgent requestSit could not find the sit target: " - << event_data << LL_ENDL; + response.error("requestSit could not find the sit target"); } } @@ -205,7 +273,7 @@ void LLAgentListener::requestStand(LLSD const & event_data) const } -LLViewerObject * LLAgentListener::findObjectClosestTo( const LLVector3 & position ) const +LLViewerObject * LLAgentListener::findObjectClosestTo(const LLVector3 & position, bool sit_target) const { LLViewerObject *object = NULL; @@ -216,8 +284,13 @@ LLViewerObject * LLAgentListener::findObjectClosestTo( const LLVector3 & positio while (cur_index < num_objects) { LLViewerObject * cur_object = gObjectList.getObject(cur_index++); - if (cur_object) - { // Calculate distance from the target position + if (cur_object && !cur_object->isAttachment()) + { + if(sit_target && (cur_object->getPCode() != LL_PCODE_VOLUME)) + { + continue; + } + // Calculate distance from the target position LLVector3 target_diff = cur_object->getPositionRegion() - position; F32 distance_to_target = target_diff.length(); if (distance_to_target < min_distance) @@ -296,22 +369,6 @@ void LLAgentListener::resetAxes(const LLSD& event_data) const } } -void LLAgentListener::getAxes(const LLSD& event_data) const -{ - LLQuaternion quat(mAgent.getQuat()); - F32 roll, pitch, yaw; - quat.getEulerAngles(&roll, &pitch, &yaw); - // The official query API for LLQuaternion's [x, y, z, w] values is its - // public member mQ... - LLSD reply = LLSD::emptyMap(); - reply["quat"] = llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ)); - reply["euler"] = LLSD::emptyMap(); - reply["euler"]["roll"] = roll; - reply["euler"]["pitch"] = pitch; - reply["euler"]["yaw"] = yaw; - sendReply(reply, event_data); -} - void LLAgentListener::getPosition(const LLSD& event_data) const { F32 roll, pitch, yaw; @@ -333,14 +390,13 @@ void LLAgentListener::getPosition(const LLSD& event_data) const void LLAgentListener::startAutoPilot(LLSD const & event_data) { - LLQuaternion target_rotation_value; LLQuaternion* target_rotation = NULL; if (event_data.has("target_rotation")) { - target_rotation_value = ll_quaternion_from_sd(event_data["target_rotation"]); + LLQuaternion target_rotation_value = ll_quaternion_from_sd(event_data["target_rotation"]); target_rotation = &target_rotation_value; } - // *TODO: Use callback_pump and callback_data + F32 rotation_threshold = 0.03f; if (event_data.has("rotation_threshold")) { @@ -360,13 +416,24 @@ void LLAgentListener::startAutoPilot(LLSD const & event_data) stop_distance = (F32)event_data["stop_distance"].asReal(); } + std::string behavior_name = LLCoros::getName(); + if (event_data.has("behavior_name")) + { + behavior_name = event_data["behavior_name"].asString(); + } + // Clear follow target, this is doing a path mFollowTarget.setNull(); + auto finish_cb = [](bool success, void*) + { + LLEventPumps::instance().obtain("LLAutopilot").post(llsd::map("success", success)); + }; + mAgent.startAutoPilotGlobal(ll_vector3d_from_sd(event_data["target_global"]), - event_data["behavior_name"], + behavior_name, target_rotation, - NULL, NULL, + finish_cb, NULL, stop_distance, rotation_threshold, allow_flying); @@ -374,7 +441,7 @@ void LLAgentListener::startAutoPilot(LLSD const & event_data) void LLAgentListener::getAutoPilot(const LLSD& event_data) const { - LLSD reply = LLSD::emptyMap(); + Response reply(LLSD(), event_data); LLSD::Boolean enabled = mAgent.getAutoPilot(); reply["enabled"] = enabled; @@ -403,12 +470,11 @@ void LLAgentListener::getAutoPilot(const LLSD& event_data) const reply["rotation_threshold"] = mAgent.getAutoPilotRotationThreshold(); reply["behavior_name"] = mAgent.getAutoPilotBehaviorName(); reply["fly"] = (LLSD::Boolean) mAgent.getFlying(); - - sendReply(reply, event_data); } void LLAgentListener::startFollowPilot(LLSD const & event_data) { + Response response(LLSD(), event_data); LLUUID target_id; bool allow_flying = true; @@ -442,6 +508,10 @@ void LLAgentListener::startFollowPilot(LLSD const & event_data) } } } + else + { + return response.error("'leader_id' or 'avatar_name' should be specified"); + } F32 stop_distance = 0.f; if (event_data.has("stop_distance")) @@ -449,13 +519,16 @@ void LLAgentListener::startFollowPilot(LLSD const & event_data) stop_distance = (F32)event_data["stop_distance"].asReal(); } - if (target_id.notNull()) + if (!gObjectList.findObject(target_id)) { - mAgent.setFlying(allow_flying); - mFollowTarget = target_id; // Save follow target so we can report distance later - - mAgent.startFollowPilot(target_id, allow_flying, stop_distance); + std::string target_info = event_data.has("leader_id") ? event_data["leader_id"] : event_data["avatar_name"]; + return response.error(stringize("Target ", std::quoted(target_info), " was not found")); } + + mAgent.setFlying(allow_flying); + mFollowTarget = target_id; // Save follow target so we can report distance later + + mAgent.startFollowPilot(target_id, allow_flying, stop_distance); } void LLAgentListener::setAutoPilotTarget(LLSD const & event_data) const @@ -519,3 +592,209 @@ void LLAgentListener::getGroups(const LLSD& event) const } sendReply(LLSDMap("groups", reply), event); } + +/*----------------------------- camera control -----------------------------*/ +// specialize LLSDParam to support (const LLVector3&) arguments -- this +// wouldn't even be necessary except that the relevant LLVector3 constructor +// is explicitly explicit +template <> +class LLSDParam: public LLSDParamBase +{ +public: + LLSDParam(const LLSD& value): value(LLVector3(value)) {} + + operator const LLVector3&() const { return value; } + +private: + LLVector3 value; +}; + +// accept any of a number of similar LLFollowCamMgr methods with different +// argument types, and return a wrapper lambda that accepts LLSD and converts +// to the target argument type +template +auto wrap(void (LLFollowCamMgr::*method)(const LLUUID& source, T arg)) +{ + return [method](LLFollowCamMgr& followcam, const LLUUID& source, const LLSD& arg) + { (followcam.*method)(source, LLSDParam(arg)); }; +} + +// table of supported LLFollowCamMgr methods, +// with the corresponding setFollowCamParams() argument keys +static std::pair> +cam_params[] = +{ + { "camera_pos", wrap(&LLFollowCamMgr::setPosition) }, + { "focus_pos", wrap(&LLFollowCamMgr::setFocus) }, + { "focus_offset", wrap(&LLFollowCamMgr::setFocusOffset) }, + { "camera_locked", wrap(&LLFollowCamMgr::setPositionLocked) }, + { "focus_locked", wrap(&LLFollowCamMgr::setFocusLocked) }, + { "distance", wrap(&LLFollowCamMgr::setDistance) }, + { "focus_threshold", wrap(&LLFollowCamMgr::setFocusThreshold) }, + { "camera_threshold", wrap(&LLFollowCamMgr::setPositionThreshold) }, + { "focus_lag", wrap(&LLFollowCamMgr::setFocusLag) }, + { "camera_lag", wrap(&LLFollowCamMgr::setPositionLag) }, + { "camera_pitch", wrap(&LLFollowCamMgr::setPitch) }, + { "behindness_lag", wrap(&LLFollowCamMgr::setBehindnessLag) }, + { "behindness_angle", wrap(&LLFollowCamMgr::setBehindnessAngle) }, +}; + +void LLAgentListener::setFollowCamParams(const LLSD& event) const +{ + auto& followcam{ LLFollowCamMgr::instance() }; + for (const auto& pair : cam_params) + { + if (event.has(pair.first)) + { + pair.second(followcam, gAgentID, event[pair.first]); + } + } + followcam.setCameraActive(gAgentID, true); +} + +void LLAgentListener::setFollowCamActive(LLSD const & event) const +{ + LLFollowCamMgr::getInstance()->setCameraActive(gAgentID, event["active"]); +} + +void LLAgentListener::removeFollowCamParams(LLSD const & event) const +{ + LLFollowCamMgr::getInstance()->removeFollowCamParams(gAgentID); +} + +LLViewerInventoryItem* get_anim_item(LLEventAPI::Response &response, const LLSD &event_data) +{ + LLViewerInventoryItem* item = gInventory.getItem(event_data["item_id"].asUUID()); + if (!item || (item->getInventoryType() != LLInventoryType::IT_ANIMATION)) + { + response.error(stringize("Animation item ", std::quoted(event_data["item_id"].asString()), " was not found")); + return NULL; + } + return item; +} + +void LLAgentListener::playAnimation(LLSD const &event_data) +{ + Response response(LLSD(), event_data); + if (LLViewerInventoryItem* item = get_anim_item(response, event_data)) + { + if (event_data["inworld"].asBoolean()) + { + mAgent.sendAnimationRequest(item->getAssetUUID(), ANIM_REQUEST_START); + } + else + { + gAgentAvatarp->startMotion(item->getAssetUUID()); + } + } +} + +void LLAgentListener::stopAnimation(LLSD const &event_data) +{ + Response response(LLSD(), event_data); + if (LLViewerInventoryItem* item = get_anim_item(response, event_data)) + { + gAgentAvatarp->stopMotion(item->getAssetUUID()); + mAgent.sendAnimationRequest(item->getAssetUUID(), ANIM_REQUEST_STOP); + } +} + +void LLAgentListener::getAnimationInfo(LLSD const &event_data) +{ + Response response(LLSD(), event_data); + if (LLViewerInventoryItem* item = get_anim_item(response, event_data)) + { + // if motion exists, will return existing one + LLMotion* motion = gAgentAvatarp->createMotion(item->getAssetUUID()); + response["anim_info"] = llsd::map("duration", motion->getDuration(), + "is_loop", motion->getLoop(), + "num_joints", motion->getNumJointMotions(), + "asset_id", item->getAssetUUID(), + "priority", motion->getPriority()); + } +} + +void LLAgentListener::getID(LLSD const& event_data) +{ + Response response(llsd::map("id", gAgentID), event_data); +} + +F32 get_search_radius(LLSD const& event_data) +{ + static LLCachedControl render_far_clip(gSavedSettings, "RenderFarClip", 64); + F32 dist = render_far_clip; + if (event_data.has("dist")) + { + dist = llclamp((F32)event_data["dist"].asReal(), 1, 512); + } + return dist * dist; +} + +void LLAgentListener::getNearbyAvatarsList(LLSD const& event_data) +{ + Response response(LLSD(), event_data); + F32 radius = get_search_radius(event_data); + LLVector3d agent_pos = gAgent.getPositionGlobal(); + for (LLCharacter* character : LLCharacter::sInstances) + { + LLVOAvatar* avatar = (LLVOAvatar*)character; + if (avatar && !avatar->isDead() && !avatar->isControlAvatar() && !avatar->isSelf()) + { + if ((dist_vec_squared(avatar->getPositionGlobal(), agent_pos) <= radius)) + { + LLAvatarName av_name; + LLAvatarNameCache::get(avatar->getID(), &av_name); + LLVector3 region_pos = avatar->getCharacterPosition(); + response["result"].append(llsd::map("id", avatar->getID(), "global_pos", ll_sd_from_vector3d(avatar->getPosGlobalFromAgent(region_pos)), + "region_pos", ll_sd_from_vector3(region_pos), "name", av_name.getUserName(), "region_id", avatar->getRegion()->getRegionID())); + } + } + } +} + +void LLAgentListener::getNearbyObjectsList(LLSD const& event_data) +{ + Response response(LLSD(), event_data); + F32 radius = get_search_radius(event_data); + S32 num_objects = gObjectList.getNumObjects(); + LLVector3d agent_pos = gAgent.getPositionGlobal(); + for (S32 i = 0; i < num_objects; ++i) + { + LLViewerObject* object = gObjectList.getObject(i); + if (object && object->getVolume() && !object->isAttachment()) + { + if ((dist_vec_squared(object->getPositionGlobal(), agent_pos) <= radius)) + { + response["result"].append(llsd::map("id", object->getID(), "global_pos", ll_sd_from_vector3d(object->getPositionGlobal()), "region_pos", + ll_sd_from_vector3(object->getPositionRegion()), "region_id", object->getRegion()->getRegionID())); + } + } + } +} + +void LLAgentListener::getAgentScreenPos(LLSD const& event_data) +{ + Response response(LLSD(), event_data); + LLVector3 render_pos; + if (event_data.has("avatar_id") && (event_data["avatar_id"].asUUID() != gAgentID)) + { + LLUUID avatar_id(event_data["avatar_id"]); + for (LLCharacter* character : LLCharacter::sInstances) + { + LLVOAvatar* avatar = (LLVOAvatar*)character; + if (!avatar->isDead() && (avatar->getID() == avatar_id)) + { + render_pos = avatar->getRenderPosition(); + break; + } + } + } + else if (gAgentAvatarp.notNull() && gAgentAvatarp->isValid()) + { + render_pos = gAgentAvatarp->getRenderPosition(); + } + LLCoordGL screen_pos; + response["onscreen"] = LLViewerCamera::getInstance()->projectPosAgentToScreen(render_pos, screen_pos, false); + response["x"] = screen_pos.mX; + response["y"] = screen_pos.mY; +} diff --git a/indra/newview/llagentlistener.h b/indra/newview/llagentlistener.h index c544d089ce..31f50a653f 100644 --- a/indra/newview/llagentlistener.h +++ b/indra/newview/llagentlistener.h @@ -48,7 +48,6 @@ private: void requestStand(LLSD const & event_data) const; void requestTouch(LLSD const & event_data) const; void resetAxes(const LLSD& event_data) const; - void getAxes(const LLSD& event_data) const; void getGroups(const LLSD& event) const; void getPosition(const LLSD& event_data) const; void startAutoPilot(const LLSD& event_data); @@ -58,7 +57,21 @@ private: void stopAutoPilot(const LLSD& event_data) const; void lookAt(LLSD const & event_data) const; - LLViewerObject * findObjectClosestTo( const LLVector3 & position ) const; + void setFollowCamParams(LLSD const & event_data) const; + void setFollowCamActive(LLSD const & event_data) const; + void removeFollowCamParams(LLSD const & event_data) const; + + void playAnimation(LLSD const &event_data); + void playAnimation_(const LLUUID& asset_id, const bool inworld); + void stopAnimation(LLSD const &event_data); + void getAnimationInfo(LLSD const &event_data); + + void getID(LLSD const& event_data); + void getNearbyAvatarsList(LLSD const& event_data); + void getNearbyObjectsList(LLSD const& event_data); + void getAgentScreenPos(LLSD const& event_data); + + LLViewerObject * findObjectClosestTo( const LLVector3 & position, bool sit_target = false ) const; private: LLAgent & mAgent; diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp index 28c651f0cd..db6f9ac22a 100644 --- a/indra/newview/llfloaterimnearbychat.cpp +++ b/indra/newview/llfloaterimnearbychat.cpp @@ -52,6 +52,7 @@ #include "llfirstuse.h" #include "llfloaterimnearbychat.h" +#include "llfloaterimnearbychatlistener.h" #include "llagent.h" // gAgent #include "llgesturemgr.h" #include "llmultigesture.h" @@ -71,6 +72,8 @@ S32 LLFloaterIMNearbyChat::sLastSpecialChatChannel = 0; +static LLFloaterIMNearbyChatListener sChatListener; + constexpr S32 EXPANDED_HEIGHT = 266; constexpr S32 COLLAPSED_HEIGHT = 60; constexpr S32 EXPANDED_MIN_HEIGHT = 150; diff --git a/indra/newview/llfloaterimnearbychatlistener.cpp b/indra/newview/llfloaterimnearbychatlistener.cpp index 43173d3680..b15a32ce40 100644 --- a/indra/newview/llfloaterimnearbychatlistener.cpp +++ b/indra/newview/llfloaterimnearbychatlistener.cpp @@ -34,12 +34,12 @@ #include "llagent.h" #include "llchat.h" #include "llviewercontrol.h" +#include "stringize.h" +static const F32 CHAT_THROTTLE_PERIOD = 1.f; -LLFloaterIMNearbyChatListener::LLFloaterIMNearbyChatListener(LLFloaterIMNearbyChat & chatbar) - : LLEventAPI("LLChatBar", - "LLChatBar listener to (e.g.) sendChat, etc."), - mChatbar(chatbar) +LLFloaterIMNearbyChatListener::LLFloaterIMNearbyChatListener() : + LLEventAPI("LLChatBar", "LLChatBar listener to (e.g.) sendChat, etc.") { add("sendChat", "Send chat to the simulator:\n" @@ -49,10 +49,18 @@ LLFloaterIMNearbyChatListener::LLFloaterIMNearbyChatListener(LLFloaterIMNearbyCh &LLFloaterIMNearbyChatListener::sendChat); } - // "sendChat" command -void LLFloaterIMNearbyChatListener::sendChat(LLSD const & chat_data) const +void LLFloaterIMNearbyChatListener::sendChat(LLSD const& chat_data) { + F64 cur_time = LLTimer::getElapsedSeconds(); + + if (cur_time < mLastThrottleTime + CHAT_THROTTLE_PERIOD) + { + LL_WARNS("LLFloaterIMNearbyChatListener") << "'sendChat' was throttled" << LL_ENDL; + return; + } + mLastThrottleTime = cur_time; + // Extract the data std::string chat_text = chat_data["message"].asString(); @@ -81,20 +89,12 @@ void LLFloaterIMNearbyChatListener::sendChat(LLSD const & chat_data) const } // Have to prepend /42 style channel numbers - std::string chat_to_send; - if (channel == 0) - { - chat_to_send = chat_text; - } - else + if (channel) { - chat_to_send += "/"; - chat_to_send += chat_data["channel"].asString(); - chat_to_send += " "; - chat_to_send += chat_text; + chat_text = stringize("/", chat_data["channel"].asString(), " ", chat_text); } // Send it as if it was typed in - mChatbar.sendChatFromViewer(chat_to_send, type_o_chat, ((bool)(channel == 0)) && gSavedSettings.getBOOL("PlayChatAnim")); + LLFloaterIMNearbyChat::sendChatFromViewer(chat_text, type_o_chat, (channel == 0) && gSavedSettings.getBOOL("PlayChatAnim")); } diff --git a/indra/newview/llfloaterimnearbychatlistener.h b/indra/newview/llfloaterimnearbychatlistener.h index 96184d95b3..71eba53a9a 100644 --- a/indra/newview/llfloaterimnearbychatlistener.h +++ b/indra/newview/llfloaterimnearbychatlistener.h @@ -38,12 +38,12 @@ class LLFloaterIMNearbyChat; class LLFloaterIMNearbyChatListener : public LLEventAPI { public: - LLFloaterIMNearbyChatListener(LLFloaterIMNearbyChat & chatbar); + LLFloaterIMNearbyChatListener(); private: - void sendChat(LLSD const & chat_data) const; + void sendChat(LLSD const & chat_data); - LLFloaterIMNearbyChat & mChatbar; + F64 mLastThrottleTime{0}; }; #endif // LL_LLFLOATERIMNEARBYCHATLISTENER_H -- cgit v1.2.3 From 498b244070b47a9f9f14b5b0f026a14274942459 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 2 Apr 2025 22:05:49 +0300 Subject: # 3826 Physics Material Type does not update for linked objects --- indra/newview/llpanelvolume.cpp | 44 ++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index 951dc45a78..2fbdbeaf59 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -576,32 +576,48 @@ void LLPanelVolume::getState( ) return object->getMaterial(); } } func; - bool material_same = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, material_code ); + LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); + bool material_same = selection->getSelectedTEValue( &func, material_code ); std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright"); - if (editable && single_volume && material_same) + + bool enable_material = editable && single_volume && material_same; + LLCachedControl edit_linked(gSavedSettings, "EditLinkedParts", false); + if (!enable_material && !edit_linked()) { - mComboMaterial->setEnabled( true ); - if (material_code == LL_MCODE_LIGHT) + LLViewerObject* root = selection->getPrimaryObject(); + while (root && !root->isAvatar() && root->getParent()) { - if (mComboMaterial->getItemCount() == mComboMaterialItemCount) + LLViewerObject* parent = (LLViewerObject*)root->getParent(); + if (parent->isAvatar()) { - mComboMaterial->add(LEGACY_FULLBRIGHT_DESC); + break; } - mComboMaterial->setSimple(LEGACY_FULLBRIGHT_DESC); + root = parent; } - else + if (root) { - if (mComboMaterial->getItemCount() != mComboMaterialItemCount) - { - mComboMaterial->remove(LEGACY_FULLBRIGHT_DESC); - } + material_code = root->getMaterial(); + } + } - mComboMaterial->setSimple(std::string(LLMaterialTable::basic.getName(material_code))); + mComboMaterial->setEnabled(enable_material); + + if (material_code == LL_MCODE_LIGHT) + { + if (mComboMaterial->getItemCount() == mComboMaterialItemCount) + { + mComboMaterial->add(LEGACY_FULLBRIGHT_DESC); } + mComboMaterial->setSimple(LEGACY_FULLBRIGHT_DESC); } else { - mComboMaterial->setEnabled( false ); + if (mComboMaterial->getItemCount() != mComboMaterialItemCount) + { + mComboMaterial->remove(LEGACY_FULLBRIGHT_DESC); + } + + mComboMaterial->setSimple(std::string(LLMaterialTable::basic.getName(material_code))); } // Physics properties -- cgit v1.2.3 From 46fca6f5bbafcdb2942114ccccdadc1e769955e4 Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Thu, 3 Apr 2025 12:34:51 +0300 Subject: #3857 second batch of new or updated LEAP functions --- indra/llcommon/llsdutil.h | 55 ++++++++++++ indra/newview/CMakeLists.txt | 2 + indra/newview/groupchatlistener.cpp | 84 ++++++++++++------ indra/newview/groupchatlistener.h | 15 ++-- indra/newview/llagentlistener.h | 1 - indra/newview/llappearancelistener.cpp | 158 +++++++++++++++++++++++++++++++++ indra/newview/llappearancelistener.h | 46 ++++++++++ indra/newview/llappearancemgr.cpp | 8 ++ indra/newview/llappearancemgr.h | 1 + indra/newview/llgroupactions.cpp | 2 +- indra/newview/llwearableitemslist.cpp | 10 --- indra/newview/llwearableitemslist.h | 9 ++ 12 files changed, 345 insertions(+), 46 deletions(-) create mode 100644 indra/newview/llappearancelistener.cpp create mode 100644 indra/newview/llappearancelistener.h diff --git a/indra/llcommon/llsdutil.h b/indra/llcommon/llsdutil.h index 38bbe19ddd..c31030c5ea 100644 --- a/indra/llcommon/llsdutil.h +++ b/indra/llcommon/llsdutil.h @@ -553,6 +553,61 @@ LLSD shallow(LLSD value, LLSD filter=LLSD()) { return llsd_shallow(value, filter } // namespace llsd +/***************************************************************************** + * toArray(), toMap() + *****************************************************************************/ +namespace llsd +{ + +// For some T convertible to LLSD, given std::vector myVec, +// toArray(myVec) returns an LLSD array whose entries correspond to the +// items in myVec. +// For some U convertible to LLSD, given function U xform(const T&), +// toArray(myVec, xform) returns an LLSD array whose every entry is +// xform(item) of the corresponding item in myVec. +// toArray() actually works with any container usable with range +// 'for', not just std::vector. +// (Once we get C++20 we can use std::identity instead of this default lambda.) +template +LLSD toArray(const C& container, FUNC&& func = [](const auto& arg) { return arg; }) +{ + LLSD array; + for (const auto& item : container) + { + array.append(std::forward(func)(item)); + } + return array; +} + +// For some T convertible to LLSD, given std::map myMap, +// toMap(myMap) returns an LLSD map whose entries correspond to the +// (key, value) pairs in myMap. +// For some U convertible to LLSD, given function +// std::pair xform(const std::pair&), +// toMap(myMap, xform) returns an LLSD map whose every entry is +// xform(pair) of the corresponding (key, value) pair in myMap. +// toMap() actually works with any container usable with range 'for', not +// just std::map. It need not even be an associative container, as long as +// you pass an xform function that returns std::pair. +// (Once we get C++20 we can use std::identity instead of this default lambda.) +template +LLSD toMap(const C& container, FUNC&& func = [](const auto& arg) { return arg; }) +{ + LLSD map; + for (const auto& pair : container) + { + const auto& [key, value] = std::forward(func)(pair); + map[key] = value; + } + return map; +} + +} // namespace llsd + +/***************************************************************************** + * boost::hash + *****************************************************************************/ + // Specialization for generating a hash value from an LLSD block. namespace boost { diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index ed29911a43..fff1597fd9 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -92,6 +92,7 @@ set(viewer_SOURCE_FILES llagentwearables.cpp llanimstatelabels.cpp llappcorehttp.cpp + llappearancelistener.cpp llappearancemgr.cpp llappviewer.cpp llappviewerlistener.cpp @@ -761,6 +762,7 @@ set(viewer_HEADER_FILES llanimstatelabels.h llappcorehttp.h llappearance.h + llappearancelistener.h llappearancemgr.h llappviewer.h llappviewerlistener.h diff --git a/indra/newview/groupchatlistener.cpp b/indra/newview/groupchatlistener.cpp index 43507f13e9..ed9e34d1bf 100644 --- a/indra/newview/groupchatlistener.cpp +++ b/indra/newview/groupchatlistener.cpp @@ -2,11 +2,11 @@ * @file groupchatlistener.cpp * @author Nat Goodspeed * @date 2011-04-11 - * @brief Implementation for groupchatlistener. + * @brief Implementation for LLGroupChatListener. * - * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2011, Linden Research, Inc. + * Copyright (C) 2024, Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -34,43 +34,69 @@ // std headers // external library headers // other Linden headers +#include "llchat.h" #include "llgroupactions.h" #include "llimview.h" +LLGroupChatListener::LLGroupChatListener(): + LLEventAPI("GroupChat", + "API to enter, leave, send and intercept group chat messages") +{ + add("startGroupChat", + "Enter a group chat in group with UUID [\"group_id\"]\n" + "Assumes the logged-in agent is already a member of this group.", + &LLGroupChatListener::startGroupChat, + llsd::map("group_id", LLSD())); + add("leaveGroupChat", + "Leave a group chat in group with UUID [\"group_id\"]\n" + "Assumes a prior successful startIM request.", + &LLGroupChatListener::leaveGroupChat, + llsd::map("group_id", LLSD())); + add("sendGroupIM", + "send a [\"message\"] to group with UUID [\"group_id\"]", + &LLGroupChatListener::sendGroupIM, + llsd::map("message", LLSD(), "group_id", LLSD())); +} -namespace { - void startIm_wrapper(LLSD const & event) +bool is_in_group(LLEventAPI::Response &response, const LLSD &data) +{ + if (!LLGroupActions::isInGroup(data["group_id"])) { - LLUUID session_id = LLGroupActions::startIM(event["id"].asUUID()); - sendReply(LLSDMap("session_id", LLSD(session_id)), event); + response.error(stringize("You are not the member of the group:", std::quoted(data["group_id"].asString()))); + return false; } + return true; +} - void send_message_wrapper(const std::string& text, const LLUUID& session_id, const LLUUID& group_id) +void LLGroupChatListener::startGroupChat(LLSD const &data) +{ + Response response(LLSD(), data); + if (!is_in_group(response, data)) + { + return; + } + if (LLGroupActions::startIM(data["group_id"]).isNull()) { - LLIMModel::sendMessage(text, session_id, group_id, IM_SESSION_GROUP_START); + return response.error(stringize("Failed to start group chat session ", std::quoted(data["group_id"].asString()))); } } +void LLGroupChatListener::leaveGroupChat(LLSD const &data) +{ + Response response(LLSD(), data); + if (is_in_group(response, data)) + { + LLGroupActions::endIM(data["group_id"].asUUID()); + } +} -GroupChatListener::GroupChatListener(): - LLEventAPI("GroupChat", - "API to enter, leave, send and intercept group chat messages") +void LLGroupChatListener::sendGroupIM(LLSD const &data) { - add("startIM", - "Enter a group chat in group with UUID [\"id\"]\n" - "Assumes the logged-in agent is already a member of this group.", - &startIm_wrapper); - add("endIM", - "Leave a group chat in group with UUID [\"id\"]\n" - "Assumes a prior successful startIM request.", - &LLGroupActions::endIM, - llsd::array("id")); - add("sendIM", - "send a groupchat IM", - &send_message_wrapper, - llsd::array("text", "session_id", "group_id")); + Response response(LLSD(), data); + if (!is_in_group(response, data)) + { + return; + } + LLUUID group_id(data["group_id"]); + LLIMModel::sendMessage(data["message"], gIMMgr->computeSessionID(IM_SESSION_GROUP_START, group_id), group_id, IM_SESSION_SEND); } -/* - static void sendMessage(const std::string& utf8_text, const LLUUID& im_session_id, - const LLUUID& other_participant_id, EInstantMessage dialog); -*/ diff --git a/indra/newview/groupchatlistener.h b/indra/newview/groupchatlistener.h index 3819ac59b7..14cd7266a3 100644 --- a/indra/newview/groupchatlistener.h +++ b/indra/newview/groupchatlistener.h @@ -26,15 +26,20 @@ * $/LicenseInfo$ */ -#if ! defined(LL_GROUPCHATLISTENER_H) -#define LL_GROUPCHATLISTENER_H +#if ! defined(LL_LLGROUPCHATLISTENER_H) +#define LL_LLGROUPCHATLISTENER_H #include "lleventapi.h" -class GroupChatListener: public LLEventAPI +class LLGroupChatListener: public LLEventAPI { public: - GroupChatListener(); + LLGroupChatListener(); + +private: + void startGroupChat(LLSD const &data); + void leaveGroupChat(LLSD const &data); + void sendGroupIM(LLSD const &data); }; -#endif /* ! defined(LL_GROUPCHATLISTENER_H) */ +#endif /* ! defined(LL_LLGROUPCHATLISTENER_H) */ diff --git a/indra/newview/llagentlistener.h b/indra/newview/llagentlistener.h index 31f50a653f..b5bea8c0bd 100644 --- a/indra/newview/llagentlistener.h +++ b/indra/newview/llagentlistener.h @@ -62,7 +62,6 @@ private: void removeFollowCamParams(LLSD const & event_data) const; void playAnimation(LLSD const &event_data); - void playAnimation_(const LLUUID& asset_id, const bool inworld); void stopAnimation(LLSD const &event_data); void getAnimationInfo(LLSD const &event_data); diff --git a/indra/newview/llappearancelistener.cpp b/indra/newview/llappearancelistener.cpp new file mode 100644 index 0000000000..65cdf2e11b --- /dev/null +++ b/indra/newview/llappearancelistener.cpp @@ -0,0 +1,158 @@ +/** + * @file llappearancelistener.cpp + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llappearancelistener.h" + +#include "llappearancemgr.h" +#include "llinventoryfunctions.h" +#include "lltransutil.h" +#include "llwearableitemslist.h" +#include "stringize.h" + +LLAppearanceListener::LLAppearanceListener() + : LLEventAPI("LLAppearance", + "API to wear a specified outfit and wear/remove individual items") +{ + add("wearOutfit", + "Wear outfit by folder id: [\"folder_id\"] OR by folder name: [\"folder_name\"]\n" + "When [\"append\"] is true, outfit will be added to COF\n" + "otherwise it will replace current oufit", + &LLAppearanceListener::wearOutfit); + + add("wearItems", + "Wear items by id: [items_id]", + &LLAppearanceListener::wearItems, + llsd::map("items_id", LLSD(), "replace", LLSD())); + + add("detachItems", + "Detach items by id: [items_id]", + &LLAppearanceListener::detachItems, + llsd::map("items_id", LLSD())); + + add("getOutfitsList", + "Return the table with Outfits info(id and name)", + &LLAppearanceListener::getOutfitsList); + + add("getOutfitItems", + "Return the table of items with info(id : name, wearable_type, is_worn) inside specified outfit folder", + &LLAppearanceListener::getOutfitItems); +} + + +void LLAppearanceListener::wearOutfit(LLSD const &data) +{ + Response response(LLSD(), data); + if (!data.has("folder_id") && !data.has("folder_name")) + { + return response.error("Either [folder_id] or [folder_name] is required"); + } + + bool append = data.has("append") ? data["append"].asBoolean() : false; + if (!LLAppearanceMgr::instance().wearOutfit(data, append)) + { + response.error("Failed to wear outfit"); + } +} + +void LLAppearanceListener::wearItems(LLSD const &data) +{ + const LLSD& items_id{ data["items_id"] }; + uuid_vec_t ids; + if (!items_id.isArray()) + { + ids.push_back(items_id.asUUID()); + } + else // array + { + for (const auto& id : llsd::inArray(items_id)) + { + ids.push_back(id); + } + } + LLAppearanceMgr::instance().wearItemsOnAvatar(ids, true, data["replace"].asBoolean()); +} + +void LLAppearanceListener::detachItems(LLSD const &data) +{ + const LLSD& items_id{ data["items_id"] }; + uuid_vec_t ids; + if (!items_id.isArray()) + { + ids.push_back(items_id.asUUID()); + } + else // array + { + for (const auto& id : llsd::inArray(items_id)) + { + ids.push_back(id); + } + } + LLAppearanceMgr::instance().removeItemsFromAvatar(ids); +} + +void LLAppearanceListener::getOutfitsList(LLSD const &data) +{ + Response response(LLSD(), data); + const LLUUID outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + + LLIsType is_category(LLAssetType::AT_CATEGORY); + gInventory.collectDescendentsIf(outfits_id, cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, is_category); + + response["outfits"] = llsd::toMap(cat_array, + [](const LLPointer &cat) + { return std::make_pair(cat->getUUID().asString(), cat->getName()); }); +} + +void LLAppearanceListener::getOutfitItems(LLSD const &data) +{ + Response response(LLSD(), data); + LLUUID outfit_id(data["outfit_id"].asUUID()); + LLViewerInventoryCategory *cat = gInventory.getCategory(outfit_id); + if (!cat || cat->getPreferredType() != LLFolderType::FT_OUTFIT) + { + return response.error(stringize(LLTrans::getString("OutfitNotFound"), outfit_id.asString())); + } + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + + LLFindOutfitItems collector = LLFindOutfitItems(); + gInventory.collectDescendentsIf(outfit_id, cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, collector); + + response["items"] = llsd::toMap(item_array, + [](const LLPointer &it) + { + return std::make_pair( + it->getUUID().asString(), + llsd::map( + "name", it->getName(), + "wearable_type", LLWearableType::getInstance()->getTypeName(it->isWearableType() ? it->getWearableType() : LLWearableType::WT_NONE), + "is_worn", get_is_item_worn(it))); + }); +} diff --git a/indra/newview/llappearancelistener.h b/indra/newview/llappearancelistener.h new file mode 100644 index 0000000000..04c5eac2eb --- /dev/null +++ b/indra/newview/llappearancelistener.h @@ -0,0 +1,46 @@ +/** + * @file llappearancelistener.h + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + + +#ifndef LL_LLAPPEARANCELISTENER_H +#define LL_LLAPPEARANCELISTENER_H + +#include "lleventapi.h" + +class LLAppearanceListener : public LLEventAPI +{ +public: + LLAppearanceListener(); + +private: + void wearOutfit(LLSD const &data); + void wearItems(LLSD const &data); + void detachItems(LLSD const &data); + void getOutfitsList(LLSD const &data); + void getOutfitItems(LLSD const &data); +}; + +#endif // LL_LLAPPEARANCELISTENER_H + diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 101aca3823..e9d455ae53 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -31,6 +31,7 @@ #include "llagent.h" #include "llagentcamera.h" #include "llagentwearables.h" +#include "llappearancelistener.h" #include "llappearancemgr.h" #include "llattachmentsmgr.h" #include "llcommandhandler.h" @@ -66,6 +67,8 @@ #include "llavatarpropertiesprocessor.h" +LLAppearanceListener sAppearanceListener; + namespace { const S32 BAKE_RETRY_MAX_COUNT = 5; @@ -4762,6 +4765,11 @@ bool wear_category(const LLSD& query_map, bool append) return false; } +bool LLAppearanceMgr::wearOutfit(const LLSD& query_map, bool append) +{ + return wear_category(query_map, append); +} + class LLWearFolderHandler : public LLCommandHandler { public: diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 6c45a32856..bc7dc9506b 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -60,6 +60,7 @@ public: void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append); void wearCategoryFinal(const LLUUID& cat_id, bool copy_items, bool append); void wearOutfitByName(const std::string& name); + bool wearOutfit(const LLSD& query_map, bool append = false); void changeOutfit(bool proceed, const LLUUID& category, bool append); void replaceCurrentOutfit(const LLUUID& new_outfit); void renameOutfit(const LLUUID& outfit_id); diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index ba9c9fa13f..34d96aa024 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -46,7 +46,7 @@ // // Globals // -static GroupChatListener sGroupChatListener; +static LLGroupChatListener sGroupChatListener; class LLGroupHandler : public LLCommandHandler { diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index 8ce1a745c3..c708e804b2 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -33,7 +33,6 @@ #include "llagentwearables.h" #include "llappearancemgr.h" -#include "llinventoryfunctions.h" #include "llinventoryicon.h" #include "llgesturemgr.h" #include "lltransutil.h" @@ -41,15 +40,6 @@ #include "llviewermenu.h" #include "llvoavatarself.h" -class LLFindOutfitItems : public LLInventoryCollectFunctor -{ -public: - LLFindOutfitItems() {} - virtual ~LLFindOutfitItems() {} - virtual bool operator()(LLInventoryCategory* cat, - LLInventoryItem* item); -}; - bool LLFindOutfitItems::operator()(LLInventoryCategory* cat, LLInventoryItem* item) { diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index 3fe1059176..7a5f29020e 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -32,6 +32,7 @@ #include "llsingleton.h" // newview +#include "llinventoryfunctions.h" #include "llinventoryitemslist.h" #include "llinventorylistitem.h" #include "lllistcontextmenu.h" @@ -507,4 +508,12 @@ protected: LLWearableType::EType mMenuWearableType; }; +class LLFindOutfitItems : public LLInventoryCollectFunctor +{ +public: + LLFindOutfitItems() {} + virtual ~LLFindOutfitItems() {} + virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item); +}; + #endif //LL_LLWEARABLEITEMSLIST_H -- cgit v1.2.3 From dead3c1fca14e8097fdc707fb94572eee6b23dc3 Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Thu, 3 Apr 2025 15:11:51 +0300 Subject: #3857 teleport finished/failed event --- indra/newview/llappearancelistener.cpp | 2 +- indra/newview/llviewerparcelmgr.cpp | 24 ++++++++++++++++++++++++ indra/newview/llviewerparcelmgr.h | 4 ++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/indra/newview/llappearancelistener.cpp b/indra/newview/llappearancelistener.cpp index 65cdf2e11b..a6d6e76e02 100644 --- a/indra/newview/llappearancelistener.cpp +++ b/indra/newview/llappearancelistener.cpp @@ -137,7 +137,7 @@ void LLAppearanceListener::getOutfitItems(LLSD const &data) LLViewerInventoryCategory *cat = gInventory.getCategory(outfit_id); if (!cat || cat->getPreferredType() != LLFolderType::FT_OUTFIT) { - return response.error(stringize(LLTrans::getString("OutfitNotFound"), outfit_id.asString())); + return response.error(stringize("Couldn't find outfit ", outfit_id.asString())); } LLInventoryModel::cat_array_t cat_array; LLInventoryModel::item_array_t item_array; diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 8e6657b4b9..66a19d3601 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -42,6 +42,7 @@ // Viewer includes #include "llagent.h" #include "llagentaccess.h" +#include "llcallbacklist.h" #include "llviewerparcelaskplay.h" #include "llviewerwindow.h" #include "llviewercontrol.h" @@ -1750,6 +1751,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use { instance->mTeleportFinishedSignal(instance->mTeleportInProgressPosition, false); } + instance->postTeleportFinished(instance->mTeleportWithinRegion); + instance->mTeleportWithinRegion = false; } parcel->setParcelEnvironmentVersion(parcel_environment_version); LL_DEBUGS("ENVIRONMENT") << "Parcel environment version is " << parcel->getParcelEnvironmentVersion() << LL_ENDL; @@ -2719,6 +2722,8 @@ void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos // Local teleport. We already have the agent parcel data. // Emit the signal immediately. getInstance()->mTeleportFinishedSignal(new_pos, local); + + postTeleportFinished(true); } else { @@ -2727,12 +2732,14 @@ void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos // Let's wait for the update and then emit the signal. mTeleportInProgressPosition = new_pos; mTeleportInProgress = true; + mTeleportWithinRegion = local; } } void LLViewerParcelMgr::onTeleportFailed() { mTeleportFailedSignal(); + LLEventPumps::instance().obtain("LLTeleport").post(llsd::map("success", false)); } bool LLViewerParcelMgr::getTeleportInProgress() @@ -2740,3 +2747,20 @@ bool LLViewerParcelMgr::getTeleportInProgress() return mTeleportInProgress // case where parcel data arrives after teleport || gAgent.getTeleportState() > LLAgent::TELEPORT_NONE; // For LOCAL, no mTeleportInProgress } + +void LLViewerParcelMgr::postTeleportFinished(bool local) +{ + auto post = []() + { + LLEventPumps::instance().obtain("LLTeleport").post(llsd::map("success", true)); + }; + if (local) + { + static LLCachedControl teleport_local_delay(gSavedSettings, "TeleportLocalDelay"); + doAfterInterval(post, teleport_local_delay + 0.5f); + } + else + { + post(); + } +} diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h index 974ea39359..95d693662e 100644 --- a/indra/newview/llviewerparcelmgr.h +++ b/indra/newview/llviewerparcelmgr.h @@ -295,6 +295,8 @@ public: void onTeleportFailed(); bool getTeleportInProgress(); + void postTeleportFinished(bool local); + static bool isParcelOwnedByAgent(const LLParcel* parcelp, U64 group_proxy_power); static bool isParcelModifiableByAgent(const LLParcel* parcelp, U64 group_proxy_power); @@ -344,7 +346,9 @@ private: std::vector mObservers; + // Used to communicate between onTeleportFinished() and processParcelProperties() bool mTeleportInProgress; + bool mTeleportWithinRegion{ false }; LLVector3d mTeleportInProgressPosition; teleport_finished_signal_t mTeleportFinishedSignal; teleport_failed_signal_t mTeleportFailedSignal; -- cgit v1.2.3 From f2e7e30cffca1de0a1ee9287753156f8a312b7dd Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 3 Apr 2025 20:27:28 +0300 Subject: #3868 Crash in updateHoveredState according to bugsplat mWrapperPanel is null. --- indra/newview/lltoast.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index 84503e66a5..84854a79d4 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -436,6 +436,14 @@ void LLToast::setVisible(bool show) void LLToast::updateHoveredState() { + if (!mWrapperPanel) + { + // Shouldn't be happening. + // mWrapperPanel should have been inited in the constructor + // This needs to be figured out and fixed + llassert(false); + return; + } S32 x, y; LLUI::getInstance()->getMousePositionScreen(&x, &y); -- cgit v1.2.3 From f795ad6d6298a5a2e13a9cf9117f9c1d39475a4f Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 3 Apr 2025 21:15:57 +0300 Subject: #3870 Crash at LLVOAvatarSelf::getJoint() A long standing one --- indra/newview/llvoavatar.h | 2 +- indra/newview/llvoavatarself.cpp | 9 +++++++++ indra/newview/llvoavatarself.h | 4 ++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 263c3dadf6..a2232d21a2 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -547,7 +547,7 @@ public: U32 renderTransparent(bool first_pass); void renderCollisionVolumes(); void renderBones(const std::string &selected_joint = std::string()); - void renderJoints(); + virtual void renderJoints(); static void deleteCachedImages(bool clearAll=true); static void destroyGL(); static void restoreGL(); diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 746ef7cacb..f23af5afa4 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -697,6 +697,7 @@ void LLVOAvatarSelf::idleUpdate(LLAgent &agent, const F64 &time) // virtual LLJoint *LLVOAvatarSelf::getJoint(const std::string &name) { + std::lock_guard lock(mJointMapMutex); LLJoint *jointp = NULL; jointp = LLVOAvatar::getJoint(name); if (!jointp && mScreenp) @@ -714,6 +715,14 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name) return jointp; } + +//virtual +void LLVOAvatarSelf::renderJoints() +{ + std::lock_guard lock(mJointMapMutex); + LLVOAvatar::renderJoints(); +} + // virtual bool LLVOAvatarSelf::setVisualParamWeight(const LLVisualParam *which_param, F32 weight) { diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 051ac791c0..f9bea41b1d 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -92,6 +92,8 @@ public: /*virtual*/ void requestStopMotion(LLMotion* motion); /*virtual*/ LLJoint* getJoint(const std::string &name); + /*virtual*/ void renderJoints(); + /*virtual*/ bool setVisualParamWeight(const LLVisualParam *which_param, F32 weight); /*virtual*/ bool setVisualParamWeight(const char* param_name, F32 weight); /*virtual*/ bool setVisualParamWeight(S32 index, F32 weight); @@ -103,6 +105,8 @@ private: // helper function. Passed in param is assumed to be in avatar's parameter list. bool setParamWeight(const LLViewerVisualParam *param, F32 weight); + std::mutex mJointMapMutex; // getJoint gets used from mesh thread + /******************************************************************************** ** ** ** STATE -- cgit v1.2.3 From 68f20d542ebbb999d7bebb05c7e4c08ebafdfd89 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 3 Apr 2025 21:55:38 +0300 Subject: #2702 Increase hover height's limit --- indra/newview/llvoavatar.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 40312b7f4e..de530976ea 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -122,8 +122,8 @@ extern F32 ANIM_SPEED_MAX; extern F32 ANIM_SPEED_MIN; extern U32 JOINT_COUNT_REQUIRED_FOR_FULLRIG; -const F32 MAX_HOVER_Z = 2.0; -const F32 MIN_HOVER_Z = -2.0; +const F32 MAX_HOVER_Z = 3.0; +const F32 MIN_HOVER_Z = -3.0; const F32 MIN_ATTACHMENT_COMPLEXITY = 0.f; const F32 DEFAULT_MAX_ATTACHMENT_COMPLEXITY = 1.0e6f; -- cgit v1.2.3 From 2b475ad027285144bbbe46cbfa6db17744acd15b Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 4 Apr 2025 21:49:23 +0300 Subject: #3878 Crash at LLPipeline::unlinkDrawable assertInitializedDoError() on shutdown --- indra/newview/lldrawable.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index 4921964b35..9d212cfe8b 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -253,7 +253,15 @@ void LLDrawable::cleanupReferences() std::for_each(mFaces.begin(), mFaces.end(), DeletePointer()); mFaces.clear(); - gPipeline.unlinkDrawable(this); + if (gPipeline.mInitialized) + { + gPipeline.unlinkDrawable(this); + } + else if (getSpatialGroup()) + { + // Not supposed to happen? + getSpatialGroup()->getSpatialPartition()->remove(this, getSpatialGroup()); + } removeFromOctree(); -- cgit v1.2.3 From 9aea5bb5e25a3b046c305eb0200fa9e84895c898 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 4 Apr 2025 22:39:37 +0300 Subject: #3876 sendLogoutRequest logging mac's crash logs seem to get mixed with normal logs, hope is this will help confirming the issue. Also needed for automated testing. --- indra/newview/llappviewer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index dfe4a0c197..edc70030b4 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -5255,6 +5255,8 @@ void LLAppViewer::sendLogoutRequest() msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); gAgent.sendReliableMessage(); + LL_INFOS("Agent") << "Logging out as agent: " << gAgent.getID() << " Session: " << gAgent.getSessionID() << LL_ENDL; + gLogoutTimer.reset(); gLogoutMaxTime = LOGOUT_REQUEST_TIME; mLogoutRequestSent = true; -- cgit v1.2.3 From 2da46c38305f6002993cd1974a9342935e97f8c6 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 1 Apr 2025 22:59:22 +0300 Subject: #3575 Clean up obsolete VRAM detectin logic --- indra/llrender/llgl.cpp | 19 - indra/llwindow/lldxhardware.cpp | 652 ------------------------- indra/llwindow/lldxhardware.h | 68 --- indra/newview/llappviewerwin32.cpp | 60 +-- indra/newview/skins/default/xui/en/strings.xml | 1 - 5 files changed, 1 insertion(+), 799 deletions(-) diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 1966e48f2e..0be27b8975 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -1228,28 +1228,9 @@ bool LLGLManager::initGL() } #endif -#if LL_WINDOWS - if (mVRAM < 256) - { - // Something likely went wrong using the above extensions - // try WMI first and fall back to old method (from dxdiag) if all else fails - // Function will check all GPUs WMI knows of and will pick up the one with most - // memory. We need to check all GPUs because system can switch active GPU to - // weaker one, to preserve power when not under load. - U32 mem = LLDXHardware::getMBVideoMemoryViaWMI(); - if (mem != 0) - { - mVRAM = mem; - LL_WARNS("RenderInit") << "VRAM Detected (WMI):" << mVRAM<< LL_ENDL; - } - } -#endif - if (mVRAM < 256 && old_vram > 0) { // fall back to old method - // Note: on Windows value will be from LLDXHardware. - // Either received via dxdiag or via WMI by id from dxdiag. mVRAM = old_vram; } diff --git a/indra/llwindow/lldxhardware.cpp b/indra/llwindow/lldxhardware.cpp index 4bc069c5a4..387982dfc2 100644 --- a/indra/llwindow/lldxhardware.cpp +++ b/indra/llwindow/lldxhardware.cpp @@ -47,7 +47,6 @@ #include "llstl.h" #include "lltimer.h" -void (*gWriteDebug)(const char* msg) = NULL; LLDXHardware gDXHardware; //----------------------------------------------------------------------------- @@ -61,170 +60,6 @@ typedef BOOL ( WINAPI* PfnCoSetProxyBlanket )( IUnknown* pProxy, DWORD dwAuthnSv OLECHAR* pServerPrincName, DWORD dwAuthnLevel, DWORD dwImpLevel, RPC_AUTH_IDENTITY_HANDLE pAuthInfo, DWORD dwCapabilities ); -HRESULT GetVideoMemoryViaWMI(WCHAR* strInputDeviceID, DWORD* pdwAdapterRam) -{ - HRESULT hr; - bool bGotMemory = false; - IWbemLocator* pIWbemLocator = nullptr; - IWbemServices* pIWbemServices = nullptr; - BSTR pNamespace = nullptr; - - *pdwAdapterRam = 0; - CoInitializeEx(0, COINIT_APARTMENTTHREADED); - - hr = CoCreateInstance( CLSID_WbemLocator, - nullptr, - CLSCTX_INPROC_SERVER, - IID_IWbemLocator, - ( LPVOID* )&pIWbemLocator ); -#ifdef PRINTF_DEBUGGING - if( FAILED( hr ) ) wprintf( L"WMI: CoCreateInstance failed: 0x%0.8x\n", hr ); -#endif - - if( SUCCEEDED( hr ) && pIWbemLocator ) - { - // Using the locator, connect to WMI in the given namespace. - pNamespace = SysAllocString( L"\\\\.\\root\\cimv2" ); - - hr = pIWbemLocator->ConnectServer( pNamespace, nullptr, nullptr, 0L, - 0L, nullptr, nullptr, &pIWbemServices ); -#ifdef PRINTF_DEBUGGING - if( FAILED( hr ) ) wprintf( L"WMI: pIWbemLocator->ConnectServer failed: 0x%0.8x\n", hr ); -#endif - if( SUCCEEDED( hr ) && pIWbemServices != 0 ) - { - HINSTANCE hinstOle32 = nullptr; - - hinstOle32 = LoadLibraryW( L"ole32.dll" ); - if( hinstOle32 ) - { - PfnCoSetProxyBlanket pfnCoSetProxyBlanket = nullptr; - - pfnCoSetProxyBlanket = ( PfnCoSetProxyBlanket )GetProcAddress( hinstOle32, "CoSetProxyBlanket" ); - if( pfnCoSetProxyBlanket != 0 ) - { - // Switch security level to IMPERSONATE. - pfnCoSetProxyBlanket( pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nullptr, - RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, 0 ); - } - - FreeLibrary( hinstOle32 ); - } - - IEnumWbemClassObject* pEnumVideoControllers = nullptr; - BSTR pClassName = nullptr; - - pClassName = SysAllocString( L"Win32_VideoController" ); - - hr = pIWbemServices->CreateInstanceEnum( pClassName, 0, - nullptr, &pEnumVideoControllers ); -#ifdef PRINTF_DEBUGGING - if( FAILED( hr ) ) wprintf( L"WMI: pIWbemServices->CreateInstanceEnum failed: 0x%0.8x\n", hr ); -#endif - - if( SUCCEEDED( hr ) && pEnumVideoControllers ) - { - IWbemClassObject* pVideoControllers[10] = {0}; - DWORD uReturned = 0; - BSTR pPropName = nullptr; - - // Get the first one in the list - pEnumVideoControllers->Reset(); - hr = pEnumVideoControllers->Next( 5000, // timeout in 5 seconds - 10, // return the first 10 - pVideoControllers, - &uReturned ); -#ifdef PRINTF_DEBUGGING - if( FAILED( hr ) ) wprintf( L"WMI: pEnumVideoControllers->Next failed: 0x%0.8x\n", hr ); - if( uReturned == 0 ) wprintf( L"WMI: pEnumVideoControllers uReturned == 0\n" ); -#endif - - VARIANT var; - if( SUCCEEDED( hr ) ) - { - bool bFound = false; - for( UINT iController = 0; iController < uReturned; iController++ ) - { - if ( !pVideoControllers[iController] ) - continue; - - // if strInputDeviceID is set find this specific device and return memory or specific device - // if strInputDeviceID is not set return the best device - if (strInputDeviceID) - { - pPropName = SysAllocString( L"PNPDeviceID" ); - hr = pVideoControllers[iController]->Get( pPropName, 0L, &var, nullptr, nullptr ); -#ifdef PRINTF_DEBUGGING - if( FAILED( hr ) ) - wprintf( L"WMI: pVideoControllers[iController]->Get PNPDeviceID failed: 0x%0.8x\n", hr ); -#endif - if( SUCCEEDED( hr ) && strInputDeviceID) - { - if( wcsstr( var.bstrVal, strInputDeviceID ) != 0 ) - bFound = true; - } - VariantClear( &var ); - if( pPropName ) SysFreeString( pPropName ); - } - - if( bFound || !strInputDeviceID ) - { - pPropName = SysAllocString( L"AdapterRAM" ); - hr = pVideoControllers[iController]->Get( pPropName, 0L, &var, nullptr, nullptr ); -#ifdef PRINTF_DEBUGGING - if( FAILED( hr ) ) - wprintf( L"WMI: pVideoControllers[iController]->Get AdapterRAM failed: 0x%0.8x\n", - hr ); -#endif - if( SUCCEEDED( hr ) ) - { - bGotMemory = true; - *pdwAdapterRam = llmax(var.ulVal, *pdwAdapterRam); - } - VariantClear( &var ); - if( pPropName ) SysFreeString( pPropName ); - } - - SAFE_RELEASE( pVideoControllers[iController] ); - - if (bFound) - { - break; - } - } - } - } - - if( pClassName ) - SysFreeString( pClassName ); - SAFE_RELEASE( pEnumVideoControllers ); - } - - if( pNamespace ) - SysFreeString( pNamespace ); - SAFE_RELEASE( pIWbemServices ); - } - - SAFE_RELEASE( pIWbemLocator ); - - CoUninitialize(); - - if( bGotMemory ) - return S_OK; - else - return E_FAIL; -} - -//static -U32 LLDXHardware::getMBVideoMemoryViaWMI() -{ - DWORD vram = 0; - if (SUCCEEDED(GetVideoMemoryViaWMI(NULL, &vram))) - { - return vram / (1024 * 1024);; - } - return 0; -} //Getting the version of graphics controller driver via WMI std::string LLDXHardware::getDriverVersionWMI(EGPUVendor vendor) @@ -480,495 +315,14 @@ std::string get_string(IDxDiagContainer *containerp, const WCHAR *wszPropName) return utf16str_to_utf8str(wszPropValue); } - -LLVersion::LLVersion() -{ - mValid = false; - S32 i; - for (i = 0; i < 4; i++) - { - mFields[i] = 0; - } -} - -bool LLVersion::set(const std::string &version_string) -{ - S32 i; - for (i = 0; i < 4; i++) - { - mFields[i] = 0; - } - // Split the version string. - std::string str(version_string); - typedef boost::tokenizer > tokenizer; - boost::char_separator sep(".", "", boost::keep_empty_tokens); - tokenizer tokens(str, sep); - - tokenizer::iterator iter = tokens.begin(); - S32 count = 0; - for (;(iter != tokens.end()) && (count < 4);++iter) - { - mFields[count] = atoi(iter->c_str()); - count++; - } - if (count < 4) - { - //LL_WARNS() << "Potentially bogus version string!" << version_string << LL_ENDL; - for (i = 0; i < 4; i++) - { - mFields[i] = 0; - } - mValid = false; - } - else - { - mValid = true; - } - return mValid; -} - -S32 LLVersion::getField(const S32 field_num) -{ - if (!mValid) - { - return -1; - } - else - { - return mFields[field_num]; - } -} - -std::string LLDXDriverFile::dump() -{ - if (gWriteDebug) - { - gWriteDebug("Filename:"); - gWriteDebug(mName.c_str()); - gWriteDebug("\n"); - gWriteDebug("Ver:"); - gWriteDebug(mVersionString.c_str()); - gWriteDebug("\n"); - gWriteDebug("Date:"); - gWriteDebug(mDateString.c_str()); - gWriteDebug("\n"); - } - LL_INFOS() << mFilepath << LL_ENDL; - LL_INFOS() << mName << LL_ENDL; - LL_INFOS() << mVersionString << LL_ENDL; - LL_INFOS() << mDateString << LL_ENDL; - - return ""; -} - -LLDXDevice::~LLDXDevice() -{ - for_each(mDriverFiles.begin(), mDriverFiles.end(), DeletePairedPointer()); - mDriverFiles.clear(); -} - -std::string LLDXDevice::dump() -{ - if (gWriteDebug) - { - gWriteDebug("StartDevice\n"); - gWriteDebug("DeviceName:"); - gWriteDebug(mName.c_str()); - gWriteDebug("\n"); - gWriteDebug("PCIString:"); - gWriteDebug(mPCIString.c_str()); - gWriteDebug("\n"); - } - LL_INFOS() << LL_ENDL; - LL_INFOS() << "DeviceName:" << mName << LL_ENDL; - LL_INFOS() << "PCIString:" << mPCIString << LL_ENDL; - LL_INFOS() << "Drivers" << LL_ENDL; - LL_INFOS() << "-------" << LL_ENDL; - for (driver_file_map_t::iterator iter = mDriverFiles.begin(), - end = mDriverFiles.end(); - iter != end; iter++) - { - LLDXDriverFile *filep = iter->second; - filep->dump(); - } - if (gWriteDebug) - { - gWriteDebug("EndDevice\n"); - } - - return ""; -} - -LLDXDriverFile *LLDXDevice::findDriver(const std::string &driver) -{ - for (driver_file_map_t::iterator iter = mDriverFiles.begin(), - end = mDriverFiles.end(); - iter != end; iter++) - { - LLDXDriverFile *filep = iter->second; - if (!utf8str_compare_insensitive(filep->mName,driver)) - { - return filep; - } - } - - return NULL; -} - LLDXHardware::LLDXHardware() { - mVRAM = 0; - gWriteDebug = NULL; } void LLDXHardware::cleanup() { - // for_each(mDevices.begin(), mDevices.end(), DeletePairedPointer()); - // mDevices.clear(); -} - -/* -std::string LLDXHardware::dumpDevices() -{ - if (gWriteDebug) - { - gWriteDebug("\n"); - gWriteDebug("StartAllDevices\n"); - } - for (device_map_t::iterator iter = mDevices.begin(), - end = mDevices.end(); - iter != end; iter++) - { - LLDXDevice *devicep = iter->second; - devicep->dump(); - } - if (gWriteDebug) - { - gWriteDebug("EndAllDevices\n\n"); - } - return ""; } -LLDXDevice *LLDXHardware::findDevice(const std::string &vendor, const std::string &devices) -{ - // Iterate through different devices tokenized in devices string - std::string str(devices); - typedef boost::tokenizer > tokenizer; - boost::char_separator sep("|", "", boost::keep_empty_tokens); - tokenizer tokens(str, sep); - - tokenizer::iterator iter = tokens.begin(); - for (;iter != tokens.end();++iter) - { - std::string dev_str = *iter; - for (device_map_t::iterator iter = mDevices.begin(), - end = mDevices.end(); - iter != end; iter++) - { - LLDXDevice *devicep = iter->second; - if ((devicep->mVendorID == vendor) - && (devicep->mDeviceID == dev_str)) - { - return devicep; - } - } - } - - return NULL; -} -*/ - -bool LLDXHardware::getInfo(bool vram_only) -{ - LLTimer hw_timer; - bool ok = false; - HRESULT hr; - - // CLSID_DxDiagProvider does not work with Multithreaded? - CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); - - IDxDiagProvider *dx_diag_providerp = NULL; - IDxDiagContainer *dx_diag_rootp = NULL; - IDxDiagContainer *devices_containerp = NULL; - // IDxDiagContainer *system_device_containerp= NULL; - IDxDiagContainer *device_containerp = NULL; - IDxDiagContainer *file_containerp = NULL; - IDxDiagContainer *driver_containerp = NULL; - DWORD dw_device_count; - - mVRAM = 0; - - // CoCreate a IDxDiagProvider* - LL_DEBUGS("AppInit") << "CoCreateInstance IID_IDxDiagProvider" << LL_ENDL; - hr = CoCreateInstance(CLSID_DxDiagProvider, - NULL, - CLSCTX_INPROC_SERVER, - IID_IDxDiagProvider, - (LPVOID*) &dx_diag_providerp); - - if (FAILED(hr)) - { - LL_WARNS("AppInit") << "No DXDiag provider found! DirectX 9 not installed!" << LL_ENDL; - gWriteDebug("No DXDiag provider found! DirectX 9 not installed!\n"); - goto LCleanup; - } - if (SUCCEEDED(hr)) // if FAILED(hr) then dx9 is not installed - { - // Fill out a DXDIAG_INIT_PARAMS struct and pass it to IDxDiagContainer::Initialize - // Passing in TRUE for bAllowWHQLChecks, allows dxdiag to check if drivers are - // digital signed as logo'd by WHQL which may connect via internet to update - // WHQL certificates. - DXDIAG_INIT_PARAMS dx_diag_init_params; - ZeroMemory(&dx_diag_init_params, sizeof(DXDIAG_INIT_PARAMS)); - - dx_diag_init_params.dwSize = sizeof(DXDIAG_INIT_PARAMS); - dx_diag_init_params.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION; - dx_diag_init_params.bAllowWHQLChecks = TRUE; - dx_diag_init_params.pReserved = NULL; - - LL_DEBUGS("AppInit") << "dx_diag_providerp->Initialize" << LL_ENDL; - hr = dx_diag_providerp->Initialize(&dx_diag_init_params); - if(FAILED(hr)) - { - goto LCleanup; - } - - LL_DEBUGS("AppInit") << "dx_diag_providerp->GetRootContainer" << LL_ENDL; - hr = dx_diag_providerp->GetRootContainer( &dx_diag_rootp ); - if(FAILED(hr) || !dx_diag_rootp) - { - goto LCleanup; - } - - HRESULT hr; - - // Get display driver information - LL_DEBUGS("AppInit") << "dx_diag_rootp->GetChildContainer" << LL_ENDL; - hr = dx_diag_rootp->GetChildContainer(L"DxDiag_DisplayDevices", &devices_containerp); - if(FAILED(hr) || !devices_containerp) - { - // do not release 'dirty' devices_containerp at this stage, only dx_diag_rootp - devices_containerp = NULL; - goto LCleanup; - } - - // make sure there is something inside - hr = devices_containerp->GetNumberOfChildContainers(&dw_device_count); - if (FAILED(hr) || dw_device_count == 0) - { - goto LCleanup; - } - - // Get device 0 - // By default 0 device is the primary one, howhever in case of various hybrid graphics - // like itegrated AMD and PCI AMD GPUs system might switch. - LL_DEBUGS("AppInit") << "devices_containerp->GetChildContainer" << LL_ENDL; - hr = devices_containerp->GetChildContainer(L"0", &device_containerp); - if(FAILED(hr) || !device_containerp) - { - goto LCleanup; - } - - DWORD vram = 0; - - WCHAR deviceID[512]; - - get_wstring(device_containerp, L"szDeviceID", deviceID, 512); - // Example: searches id like 1F06 in pnp string (aka VEN_10DE&DEV_1F06) - // doesn't seem to work on some systems since format is unrecognizable - // but in such case keyDeviceID works - if (SUCCEEDED(GetVideoMemoryViaWMI(deviceID, &vram))) - { - mVRAM = vram/(1024*1024); - } - else - { - get_wstring(device_containerp, L"szKeyDeviceID", deviceID, 512); - LL_WARNS() << "szDeviceID" << deviceID << LL_ENDL; - // '+9' to avoid ENUM\\PCI\\ prefix - // Returns string like Enum\\PCI\\VEN_10DE&DEV_1F06&SUBSYS... - // and since GetVideoMemoryViaWMI searches by PNPDeviceID it is sufficient - if (SUCCEEDED(GetVideoMemoryViaWMI(deviceID + 9, &vram))) - { - mVRAM = vram / (1024 * 1024); - } - } - - if (mVRAM == 0) - { // Get the English VRAM string - std::string ram_str = get_string(device_containerp, L"szDisplayMemoryEnglish"); - - // We don't need the device any more - SAFE_RELEASE(device_containerp); - - // Dump the string as an int into the structure - char *stopstring; - mVRAM = strtol(ram_str.c_str(), &stopstring, 10); - LL_INFOS("AppInit") << "VRAM Detected: " << mVRAM << " DX9 string: " << ram_str << LL_ENDL; - } - - if (vram_only) - { - ok = true; - goto LCleanup; - } - - - /* for now, we ONLY do vram_only the rest of this - is commented out, to ensure no-one is tempted - to use it - - // Now let's get device and driver information - // Get the IDxDiagContainer object called "DxDiag_SystemDevices". - // This call may take some time while dxdiag gathers the info. - DWORD num_devices = 0; - WCHAR wszContainer[256]; - LL_DEBUGS("AppInit") << "dx_diag_rootp->GetChildContainer DxDiag_SystemDevices" << LL_ENDL; - hr = dx_diag_rootp->GetChildContainer(L"DxDiag_SystemDevices", &system_device_containerp); - if (FAILED(hr)) - { - goto LCleanup; - } - - hr = system_device_containerp->GetNumberOfChildContainers(&num_devices); - if (FAILED(hr)) - { - goto LCleanup; - } - - LL_DEBUGS("AppInit") << "DX9 iterating over devices" << LL_ENDL; - S32 device_num = 0; - for (device_num = 0; device_num < (S32)num_devices; device_num++) - { - hr = system_device_containerp->EnumChildContainerNames(device_num, wszContainer, 256); - if (FAILED(hr)) - { - goto LCleanup; - } - - hr = system_device_containerp->GetChildContainer(wszContainer, &device_containerp); - if (FAILED(hr) || device_containerp == NULL) - { - goto LCleanup; - } - - std::string device_name = get_string(device_containerp, L"szDescription"); - - std::string device_id = get_string(device_containerp, L"szDeviceID"); - - LLDXDevice *dxdevicep = new LLDXDevice; - dxdevicep->mName = device_name; - dxdevicep->mPCIString = device_id; - mDevices[dxdevicep->mPCIString] = dxdevicep; - - // Split the PCI string based on vendor, device, subsys, rev. - std::string str(device_id); - typedef boost::tokenizer > tokenizer; - boost::char_separator sep("&\\", "", boost::keep_empty_tokens); - tokenizer tokens(str, sep); - - tokenizer::iterator iter = tokens.begin(); - S32 count = 0; - bool valid = true; - for (;(iter != tokens.end()) && (count < 3);++iter) - { - switch (count) - { - case 0: - if (strcmp(iter->c_str(), "PCI")) - { - valid = false; - } - break; - case 1: - dxdevicep->mVendorID = iter->c_str(); - break; - case 2: - dxdevicep->mDeviceID = iter->c_str(); - break; - default: - // Ignore it - break; - } - count++; - } - - - - - // Now, iterate through the related drivers - hr = device_containerp->GetChildContainer(L"Drivers", &driver_containerp); - if (FAILED(hr) || !driver_containerp) - { - goto LCleanup; - } - - DWORD num_files = 0; - hr = driver_containerp->GetNumberOfChildContainers(&num_files); - if (FAILED(hr)) - { - goto LCleanup; - } - - S32 file_num = 0; - for (file_num = 0; file_num < (S32)num_files; file_num++ ) - { - - hr = driver_containerp->EnumChildContainerNames(file_num, wszContainer, 256); - if (FAILED(hr)) - { - goto LCleanup; - } - - hr = driver_containerp->GetChildContainer(wszContainer, &file_containerp); - if (FAILED(hr) || file_containerp == NULL) - { - goto LCleanup; - } - - std::string driver_path = get_string(file_containerp, L"szPath"); - std::string driver_name = get_string(file_containerp, L"szName"); - std::string driver_version = get_string(file_containerp, L"szVersion"); - std::string driver_date = get_string(file_containerp, L"szDatestampEnglish"); - - LLDXDriverFile *dxdriverfilep = new LLDXDriverFile; - dxdriverfilep->mName = driver_name; - dxdriverfilep->mFilepath= driver_path; - dxdriverfilep->mVersionString = driver_version; - dxdriverfilep->mVersion.set(driver_version); - dxdriverfilep->mDateString = driver_date; - - dxdevicep->mDriverFiles[driver_name] = dxdriverfilep; - - SAFE_RELEASE(file_containerp); - } - SAFE_RELEASE(device_containerp); - } - */ - } - - // dumpDevices(); - ok = true; - -LCleanup: - if (!ok) - { - LL_WARNS("AppInit") << "DX9 probe failed" << LL_ENDL; - gWriteDebug("DX9 probe failed\n"); - } - - SAFE_RELEASE(file_containerp); - SAFE_RELEASE(driver_containerp); - SAFE_RELEASE(device_containerp); - SAFE_RELEASE(devices_containerp); - SAFE_RELEASE(dx_diag_rootp); - SAFE_RELEASE(dx_diag_providerp); - - CoUninitialize(); - - return ok; - } - LLSD LLDXHardware::getDisplayInfo() { LLTimer hw_timer; @@ -995,7 +349,6 @@ LLSD LLDXHardware::getDisplayInfo() if (FAILED(hr)) { LL_WARNS() << "No DXDiag provider found! DirectX 9 not installed!" << LL_ENDL; - gWriteDebug("No DXDiag provider found! DirectX 9 not installed!\n"); goto LCleanup; } if (SUCCEEDED(hr)) // if FAILED(hr) then dx9 is not installed @@ -1111,9 +464,4 @@ LCleanup: return ret; } -void LLDXHardware::setWriteDebugFunc(void (*func)(const char*)) -{ - gWriteDebug = func; -} - #endif diff --git a/indra/llwindow/lldxhardware.h b/indra/llwindow/lldxhardware.h index 2b879e021c..8d8a08a4eb 100644 --- a/indra/llwindow/lldxhardware.h +++ b/indra/llwindow/lldxhardware.h @@ -30,64 +30,16 @@ #include #include "stdtypes.h" -#include "llstring.h" #include "llsd.h" -class LLVersion -{ -public: - LLVersion(); - bool set(const std::string &version_string); - S32 getField(const S32 field_num); -protected: - std::string mVersionString; - S32 mFields[4]; - bool mValid; -}; - -class LLDXDriverFile -{ -public: - std::string dump(); - -public: - std::string mFilepath; - std::string mName; - std::string mVersionString; - LLVersion mVersion; - std::string mDateString; -}; - -class LLDXDevice -{ -public: - ~LLDXDevice(); - std::string dump(); - - LLDXDriverFile *findDriver(const std::string &driver); -public: - std::string mName; - std::string mPCIString; - std::string mVendorID; - std::string mDeviceID; - - typedef std::map driver_file_map_t; - driver_file_map_t mDriverFiles; -}; - class LLDXHardware { public: LLDXHardware(); - void setWriteDebugFunc(void (*func)(const char*)); void cleanup(); - // Returns true on success. - // vram_only true does a "light" probe. - bool getInfo(bool vram_only); - // WMI can return multiple GPU drivers // specify which one to output typedef enum { @@ -98,29 +50,9 @@ public: } EGPUVendor; std::string getDriverVersionWMI(EGPUVendor vendor); - S32 getVRAM() const { return mVRAM; } - LLSD getDisplayInfo(); - - // Will get memory of best GPU in MB, return memory on sucsess, 0 on failure - // Note: WMI is not accurate in some cases - static U32 getMBVideoMemoryViaWMI(); - - // Find a particular device that matches the following specs. - // Empty strings indicate that you don't care. - // You can separate multiple devices with '|' chars to indicate you want - // ANY of them to match and return. - // LLDXDevice *findDevice(const std::string &vendor, const std::string &devices); - - // std::string dumpDevices(); -public: - typedef std::map device_map_t; - // device_map_t mDevices; -protected: - S32 mVRAM; }; -extern void (*gWriteDebug)(const char* msg); extern LLDXHardware gDXHardware; #endif // LL_LLDXHARDWARE_H diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index aaf2a7ea3e..4f5fa53312 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -842,69 +842,11 @@ void write_debug_dx(const std::string& str) bool LLAppViewerWin32::initHardwareTest() { - // - // Do driver verification and initialization based on DirectX - // hardware polling and driver versions - // - if (true == gSavedSettings.getBOOL("ProbeHardwareOnStartup") && false == gSavedSettings.getBOOL("NoHardwareProbe")) - { - // per DEV-11631 - disable hardware probing for everything - // but vram. - bool vram_only = true; - - LLSplashScreen::update(LLTrans::getString("StartupDetectingHardware")); - - LL_DEBUGS("AppInit") << "Attempting to poll DirectX for hardware info" << LL_ENDL; - gDXHardware.setWriteDebugFunc(write_debug_dx); - bool probe_ok = gDXHardware.getInfo(vram_only); - - if (!probe_ok - && gWarningSettings.getBOOL("AboutDirectX9")) - { - LL_WARNS("AppInit") << "DirectX probe failed, alerting user." << LL_ENDL; - - // Warn them that runnin without DirectX 9 will - // not allow us to tell them about driver issues - std::ostringstream msg; - msg << LLTrans::getString ("MBNoDirectX"); - S32 button = OSMessageBox( - msg.str(), - LLTrans::getString("MBWarning"), - OSMB_YESNO); - if (OSBTN_NO== button) - { - LL_INFOS("AppInit") << "User quitting after failed DirectX 9 detection" << LL_ENDL; - LLWeb::loadURLExternal("http://secondlife.com/support/", false); - return false; - } - gWarningSettings.setBOOL("AboutDirectX9", false); - } - LL_DEBUGS("AppInit") << "Done polling DirectX for hardware info" << LL_ENDL; - - // Only probe once after installation - gSavedSettings.setBOOL("ProbeHardwareOnStartup", false); - - // Disable so debugger can work - std::string splash_msg; - LLStringUtil::format_map_t args; - args["[APP_NAME]"] = LLAppViewer::instance()->getSecondLifeTitle(); - splash_msg = LLTrans::getString("StartupLoading", args); - - LLSplashScreen::update(splash_msg); - } - if (!restoreErrorTrap()) { - LL_WARNS("AppInit") << " Someone took over my exception handler (post hardware probe)!" << LL_ENDL; + LL_WARNS("AppInit") << " Someone took over my exception handler!" << LL_ENDL; } - if (gGLManager.mVRAM == 0) - { - gGLManager.mVRAM = gDXHardware.getVRAM(); - } - - LL_INFOS("AppInit") << "Detected VRAM: " << gGLManager.mVRAM << LL_ENDL; - return true; } diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index f0a26f9c56..d909a95b83 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -13,7 +13,6 @@ Second Life Support Portal - Detecting hardware... Loading [APP_NAME]... Clearing cache... Initializing texture cache... -- cgit v1.2.3 From 0c056c77f4eddb13e3e7a2a1d3d4b881dc07ea46 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 1 Apr 2025 23:24:51 +0300 Subject: #3575 Adjust VRAM budget test a bit --- indra/llwindow/llwindowwin32.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 832cf254d1..c190295512 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -4684,9 +4684,18 @@ void LLWindowWin32::LLWindowWin32Thread::checkDXMem() if (phys_mb > 0) { - // Intel uses 'shared' vram, cap it to 25% of total memory - // Todo: consider caping all adapters at least to 50% ram - budget_mb = llmin(budget_mb, (UINT64)(phys_mb * 0.25)); + if (gGLManager.mIsIntel) + { + // Intel uses 'shared' vram, cap it to 25% of total memory + // Todo: consider a way of detecting integrated Intel and AMD + budget_mb = llmin(budget_mb, (UINT64)(phys_mb * 0.25)); + } + else + { + // More budget is generally better, but the way viewer + // utilizes even dedicated VRAM leaves a footprint in RAM + budget_mb = llmin(budget_mb, (UINT64)(phys_mb * 0.75)); + } } else { -- cgit v1.2.3 From cc54e206c3ea390a3a14829a4ac40ce5d98f5965 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 2 Apr 2025 00:05:57 +0300 Subject: #3575 Shrink draw distance when VRAM is very low --- indra/newview/lldrawpoolavatar.cpp | 2 -- indra/newview/llviewerdisplay.cpp | 6 +++++- indra/newview/llvoavatar.cpp | 6 ++---- indra/newview/llworld.cpp | 4 +--- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 95f96e85d6..90ee95d424 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -491,7 +491,6 @@ void LLDrawPoolAvatar::beginImpostor() if (!LLPipeline::sReflectionRender) { - LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f); LLVOAvatar::sNumVisibleAvatars = 0; } @@ -547,7 +546,6 @@ void LLDrawPoolAvatar::beginDeferredImpostor() if (!LLPipeline::sReflectionRender) { - LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f); LLVOAvatar::sNumVisibleAvatars = 0; } diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 32019f860d..27718782ee 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -215,11 +215,15 @@ void display_update_camera() final_far = gSavedSettings.getF32("RenderReflectionProbeDrawDistance"); } else if (CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode()) - { final_far *= 0.5f; } + else if (LLViewerTexture::sDesiredDiscardBias > 2.f) + { + final_far = llmax(32.f, final_far / (LLViewerTexture::sDesiredDiscardBias - 1.f)); + } LLViewerCamera::getInstance()->setFar(final_far); + LLVOAvatar::sRenderDistance = llclamp(final_far, 16.f, 256.f); gViewerWindow->setup3DRender(); if (!gCubeSnapshot) diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index de530976ea..3306289f51 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -10963,8 +10963,7 @@ void LLVOAvatar::idleUpdateRenderComplexity() bool autotune = LLPerfStats::tunables.userAutoTuneEnabled && !mIsControlAvatar && !isSelf(); if (autotune && !isDead()) { - static LLCachedControl render_far_clip(gSavedSettings, "RenderFarClip", 64); - F32 radius = render_far_clip * render_far_clip; + F32 radius = sRenderDistance * sRenderDistance; bool is_nearby = true; if ((dist_vec_squared(getPositionGlobal(), gAgent.getPositionGlobal()) > radius) && @@ -10996,8 +10995,7 @@ void LLVOAvatar::updateNearbyAvatarCount() if (agent_update_timer.getElapsedTimeF32() > 1.0f) { S32 avs_nearby = 0; - static LLCachedControl render_far_clip(gSavedSettings, "RenderFarClip", 64); - F32 radius = render_far_clip * render_far_clip; + F32 radius = sRenderDistance * sRenderDistance; for (LLCharacter* character : LLCharacter::sInstances) { LLVOAvatar* avatar = (LLVOAvatar*)character; diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 899733ccc3..47e1815bc2 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -1372,10 +1372,8 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector* positi F32 LLWorld::getNearbyAvatarsAndMaxGPUTime(std::vector &valid_nearby_avs) { - static LLCachedControl render_far_clip(gSavedSettings, "RenderFarClip", 64); - F32 nearby_max_complexity = 0; - F32 radius = render_far_clip * render_far_clip; + F32 radius = LLVOAvatar::sRenderDistance * LLVOAvatar::sRenderDistance; for (LLCharacter* character : LLCharacter::sInstances) { -- cgit v1.2.3 From f6a2dbe6ec3dbe059ca25cfcd2348619aeacb46b Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Sun, 6 Apr 2025 15:01:28 +0300 Subject: #3627 std::bad_alloc when loading a model --- indra/newview/gltfscenemanager.cpp | 11 +++++++++-- indra/newview/llmaterialeditor.cpp | 11 +++++++++-- indra/newview/skins/default/xui/en/notifications.xml | 10 ++++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/indra/newview/gltfscenemanager.cpp b/indra/newview/gltfscenemanager.cpp index c33d15228c..e0cd762776 100644 --- a/indra/newview/gltfscenemanager.cpp +++ b/indra/newview/gltfscenemanager.cpp @@ -69,9 +69,16 @@ void GLTFSceneManager::load() { return; } - if (filenames.size() > 0) + try + { + if (filenames.size() > 0) + { + GLTFSceneManager::instance().load(filenames[0]); + } + } + catch (std::bad_alloc&) { - GLTFSceneManager::instance().load(filenames[0]); + LLNotificationsUtil::add("CannotOpenFileTooBig"); } }, LLFilePicker::FFLOAD_GLTF, diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp index 1e3a328464..28160177f6 100644 --- a/indra/newview/llmaterialeditor.cpp +++ b/indra/newview/llmaterialeditor.cpp @@ -2857,9 +2857,16 @@ void LLMaterialEditor::importMaterial() { return; } - if (filenames.size() > 0) + try { - LLMaterialEditor::loadMaterialFromFile(filenames[0], -1); + if (filenames.size() > 0) + { + LLMaterialEditor::loadMaterialFromFile(filenames[0], -1); + } + } + catch (std::bad_alloc&) + { + LLNotificationsUtil::add("CannotOpenFileTooBig"); } }, LLFilePicker::FFLOAD_MATERIAL, diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 509a8eec38..1a56d7e3a3 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -2408,6 +2408,16 @@ Unable to upload snapshot. File might be too big, try reducing resolution or try again later. fail + + +Unable to open file. + +Viewer run out of memory while opening file. File might be too big. + fail + Date: Mon, 7 Apr 2025 21:30:47 +0300 Subject: #3873 Return back AudioLevelWind Partial revert from d00b6e4216bb308ae075d90dfa871c902d765f8d Our statistics claimed that AudioLevelWind is unused, but it is in use. --- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/llvieweraudio.cpp | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index a2a6744722..1025c9299d 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -345,6 +345,17 @@ F32 Value 0.5 + + AudioLevelWind + + Comment + Audio level of wind noise when standing still + Persist + 1 + Type + F32 + Value + 0.5 AudioStreamingMedia diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index b3b4f43e57..404297c58f 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -541,8 +541,8 @@ void audio_update_wind(bool force_update) // whereas steady-state avatar walk velocity is only 3.2 m/s. // Without this the world feels desolate on first login when you are // standing still. - const F32 WIND_LEVEL = 0.5f; - LLVector3 scaled_wind_vec = gWindVec * WIND_LEVEL; + static LLUICachedControl wind_level("AudioLevelWind", 0.5f); + LLVector3 scaled_wind_vec = gWindVec * wind_level; // Mix in the avatar's motion, subtract because when you walk north, // the apparent wind moves south. -- cgit v1.2.3 From b95b20a1be56ff7baa3ad20e8d0571ec9f07ab12 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 8 Apr 2025 20:28:50 +0300 Subject: #3757 Allow subfolders in "My Outfits" --- indra/newview/llappearancelistener.cpp | 2 +- indra/newview/llinventorybridge.cpp | 45 +++++++++++++++++++-- indra/newview/llinventorybridge.h | 1 + indra/newview/llinventoryfunctions.cpp | 5 +++ indra/newview/llinventoryfunctions.h | 18 +++++++++ indra/newview/llinventorygallery.cpp | 13 ++++++ indra/newview/llinventorygallerymenu.cpp | 1 + indra/newview/lloutfitslist.cpp | 47 +++++++++++++++++++++- .../skins/default/xui/en/menu_inventory.xml | 8 ++++ 9 files changed, 134 insertions(+), 6 deletions(-) diff --git a/indra/newview/llappearancelistener.cpp b/indra/newview/llappearancelistener.cpp index a6d6e76e02..dc7bbc3236 100644 --- a/indra/newview/llappearancelistener.cpp +++ b/indra/newview/llappearancelistener.cpp @@ -122,7 +122,7 @@ void LLAppearanceListener::getOutfitsList(LLSD const &data) LLInventoryModel::cat_array_t cat_array; LLInventoryModel::item_array_t item_array; - LLIsType is_category(LLAssetType::AT_CATEGORY); + LLIsFolderType is_category(LLFolderType::FT_OUTFIT); gInventory.collectDescendentsIf(outfits_id, cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, is_category); response["outfits"] = llsd::toMap(cat_array, diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index ce91f9a1f3..8d31c4dde7 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2916,6 +2916,10 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, // create a new folder and populate it with links to original objects dropToMyOutfits(inv_cat, cb); } + else if (getCategory() && getCategory()->getParentUUID() == my_outifts_id) + { + dropToMyOutfitsSubfolder(inv_cat, mUUID, cb); + } // if target is current outfit folder we use link else if (move_is_into_current_outfit && (inv_cat->getPreferredType() == LLFolderType::FT_NONE || @@ -4016,7 +4020,14 @@ void LLFolderBridge::perform_pasteFromClipboard() U32 max_items_to_wear = gSavedSettings.getU32("WearFolderLimit"); if (cat && can_move_to_my_outfits(model, cat, max_items_to_wear)) { - dropToMyOutfits(cat, cb); + if (mUUID == my_outifts_id) + { + dropToMyOutfits(cat, cb); + } + else if (getCategory() && getCategory()->getParentUUID() == mUUID) + { + dropToMyOutfitsSubfolder(cat, mUUID, cb); + } } else { @@ -4256,6 +4267,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items if (outfits_id == mUUID) { + items.push_back(std::string("New Outfit Folder")); items.push_back(std::string("New Outfit")); } @@ -5331,13 +5343,36 @@ void LLFolderBridge::dropToMyOutfits(LLInventoryCategory* inv_cat, LLPointergetUUID(), _1, cb, mInventoryPanel); - gInventory.createNewCategory(dest_id, + getInventoryModel()->createNewCategory(dest_id, LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID()); } +void LLFolderBridge::dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id, LLPointer cb) +{ + LLViewerInventoryCategory* cat = getInventoryModel()->getCategory(dest_id); + const LLUUID outfits_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + inventory_func_type func = boost::bind(outfitFolderCreatedCallback, inv_cat->getUUID(), _1, cb, mInventoryPanel); + if (cat && cat->getParentUUID() == outfits_id) + { + getInventoryModel()->createNewCategory(dest_id, + LLFolderType::FT_OUTFIT, + inv_cat->getName(), + func, + inv_cat->getThumbnailUUID()); + } + else + { + getInventoryModel()->createNewCategory(outfits_id, + LLFolderType::FT_OUTFIT, + inv_cat->getName(), + func, + inv_cat->getThumbnailUUID()); + } +} + void LLFolderBridge::outfitFolderCreatedCallback(LLUUID cat_source_id, LLUUID cat_dest_id, LLPointer cb, @@ -5441,6 +5476,10 @@ bool LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, const bool move_is_into_favorites = (mUUID == favorites_id); const bool move_is_into_my_outfits = (mUUID == my_outifts_id) || model->isObjectDescendentOf(mUUID, my_outifts_id); const bool move_is_into_outfit = move_is_into_my_outfits || (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); + const bool move_is_into_my_outfits_subfolder = move_is_into_my_outfits + && getCategory() + && getCategory()->getParentUUID() == my_outifts_id + && getCategory()->getPreferredType() != LLFolderType::FT_OUTFIT; const bool move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id); const bool move_is_into_marketplacelistings = model->isObjectDescendentOf(mUUID, marketplacelistings_id); const bool move_is_from_marketplacelistings = model->isObjectDescendentOf(inv_item->getUUID(), marketplacelistings_id); @@ -5511,7 +5550,7 @@ bool LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, } else if (user_confirm && (move_is_into_current_outfit || move_is_into_outfit)) { - accept = can_move_to_outfit(inv_item, move_is_into_current_outfit); + accept = !move_is_into_my_outfits_subfolder && can_move_to_outfit(inv_item, move_is_into_current_outfit); } else if (user_confirm && (move_is_into_favorites || move_is_into_landmarks)) { diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 3e7f74384b..b7bdef9b21 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -369,6 +369,7 @@ protected: void dropToFavorites(LLInventoryItem* inv_item, LLPointer cb = NULL); void dropToOutfit(LLInventoryItem* inv_item, bool move_is_into_current_outfit, LLPointer cb = NULL); void dropToMyOutfits(LLInventoryCategory* inv_cat, LLPointer cb = NULL); + void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest, LLPointer cb = NULL); //-------------------------------------------------------------------- // Messy hacks for handling folder options diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 1ccefa3212..b4299972d9 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -2621,6 +2621,11 @@ bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(const LLInventoryIte return false; } +bool LLIsFolderType::operator()(LLInventoryCategory* cat, LLInventoryItem* item) +{ + return cat && cat->getPreferredType() == mType; +} + bool LLIsType::operator()(LLInventoryCategory* cat, LLInventoryItem* item) { if(mType == LLAssetType::AT_CATEGORY) diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index 13a64f21dc..b379d625a9 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -234,6 +234,24 @@ protected: // the type is the type passed in during construction. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLIsFolderType : public LLInventoryCollectFunctor +{ +public: + LLIsFolderType(LLFolderType::EType type) : mType(type) {} + virtual ~LLIsFolderType() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item); +protected: + LLFolderType::EType mType; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLIsType +// +// Implementation of a LLInventoryCollectFunctor which returns true if +// the type is the type passed in during construction. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + class LLIsType : public LLInventoryCollectFunctor { public: diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index c4f93cee98..6188b812d5 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -64,6 +64,7 @@ const S32 FAST_LOAD_THUMBNAIL_TRSHOLD = 50; // load folders below this value imm bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, bool drop, std::string& tooltip_msg, bool is_link); bool dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, bool drop, std::string& tooltip_msg, bool user_confirm); void dropToMyOutfits(LLInventoryCategory* inv_cat); +void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id); class LLGalleryPanel: public LLPanel { @@ -3898,6 +3899,10 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, // create a new folder and populate it with links to original objects dropToMyOutfits(inv_cat); } + else if (dest_cat && dest_cat->getParentUUID() == my_outifts_id) + { + dropToMyOutfitsSubfolder(inv_cat, dest_id); + } // if target is current outfit folder we use link else if (move_is_into_current_outfit && (inv_cat->getPreferredType() == LLFolderType::FT_NONE || @@ -4041,3 +4046,11 @@ void dropToMyOutfits(LLInventoryCategory* inv_cat) inventory_func_type func = boost::bind(&outfitFolderCreatedCallback, inv_cat->getUUID(), _1); gInventory.createNewCategory(dest_id, LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID()); } + +void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID &dest_id) +{ + // Note: creation will take time, so passing folder id to callback is slightly unreliable, + // but so is collecting and passing descendants' ids + inventory_func_type func = boost::bind(&outfitFolderCreatedCallback, inv_cat->getUUID(), _1); + gInventory.createNewCategory(dest_id, LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID()); +} diff --git a/indra/newview/llinventorygallerymenu.cpp b/indra/newview/llinventorygallerymenu.cpp index dbf4821ca1..25b339d51e 100644 --- a/indra/newview/llinventorygallerymenu.cpp +++ b/indra/newview/llinventorygallerymenu.cpp @@ -771,6 +771,7 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men if(is_outfits && !isRootFolder()) { + items.push_back(std::string("New Outfit Folder")); items.push_back(std::string("New Outfit")); } diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 6e666b8a4b..cfbfe8f8e0 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -819,6 +819,49 @@ void LLOutfitListBase::observerCallback(const LLUUID& category_id) refreshList(category_id); } +class LLIsOutfitListFolder : public LLInventoryCollectFunctor +{ +public: + LLIsOutfitListFolder() + { + mOutfitsId = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + } + virtual ~LLIsOutfitListFolder() {} + + bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) override + { + if (cat) + { + if (cat->getPreferredType() == LLFolderType::FT_OUTFIT) + { + return true; + } + if (cat->getPreferredType() == LLFolderType::FT_NONE + && cat->getParentUUID() == mOutfitsId) + { + LLViewerInventoryCategory* inv_cat = dynamic_cast(cat); + if (inv_cat && inv_cat->getDescendentCount() > 3) + { + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf(inv_cat->getUUID(), cats, items); + if (items->size() > 3) // eyes, skin, hair and shape are required + { + // For now assume this to be an old style outfit, not a subfolder + // but ideally no such 'outfits' should be left in My Outfits + // Todo: stop counting FT_NONE as outfits, + // convert obvious outfits into FT_OUTFIT + return true; + } + } + } + } + return false; + } +protected: + LLUUID mOutfitsId; +}; + void LLOutfitListBase::refreshList(const LLUUID& category_id) { bool wasNull = mRefreshListState.CategoryUUID.isNull(); @@ -828,13 +871,13 @@ void LLOutfitListBase::refreshList(const LLUUID& category_id) LLInventoryModel::item_array_t item_array; // Collect all sub-categories of a given category. - LLIsType is_category(LLAssetType::AT_CATEGORY); + LLIsOutfitListFolder is_outfit; gInventory.collectDescendentsIf( category_id, cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, - is_category); + is_outfit); // Memorize item names for each UUID std::map names; diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index e57e3b0750..d8c7de0e55 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -151,6 +151,14 @@ function="Inventory.DoCreate" parameter="category" /> + + + Date: Tue, 8 Apr 2025 22:39:41 +0300 Subject: #3757 Menu for subfodlers in outfits --- indra/newview/llinventorybridge.cpp | 199 ++++++++++++++++++++++--------- indra/newview/llinventorybridge.h | 2 +- indra/newview/llinventorygallery.cpp | 57 ++++++++- indra/newview/llinventorygallerymenu.cpp | 8 +- indra/newview/llinventorymodel.cpp | 3 +- indra/newview/lloutfitslist.cpp | 3 +- 6 files changed, 202 insertions(+), 70 deletions(-) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 8d31c4dde7..fd9d08a26d 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -105,6 +105,44 @@ static bool check_item(const LLUUID& item_id, // Helper functions + +namespace { + enum EMyOutfitsSubfolderType + { + MY_OUTFITS_NO, + MY_OUTFITS_SUBFOLDER, + MY_OUTFITS_OUTFIT, + }; + + EMyOutfitsSubfolderType myoutfit_object_subfolder_type(LLInventoryModel* model, const LLUUID& obj_id, + const LLUUID& cat_id) + { + if (obj_id == cat_id) return MY_OUTFITS_NO; + + const LLViewerInventoryCategory* test_cat = model->getCategory(obj_id); + while (test_cat) + { + if (test_cat->getPreferredType() == LLFolderType::FT_OUTFIT) + { + return MY_OUTFITS_OUTFIT; + } + + const LLUUID& parent_id = test_cat->getParentUUID(); + if (parent_id.isNull()) + { + return MY_OUTFITS_NO; + } + if (parent_id == cat_id) + { + return MY_OUTFITS_SUBFOLDER; + } + test_cat = model->getCategory(parent_id); + } + + return MY_OUTFITS_NO; + } +} + bool isAddAction(const std::string& action) { return ("wear" == action || "attach" == action || "activate" == action); @@ -2912,13 +2950,22 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, if (mUUID == my_outifts_id) { - // Category can contains objects, + // Category can't contains objects, // create a new folder and populate it with links to original objects dropToMyOutfits(inv_cat, cb); } - else if (getCategory() && getCategory()->getParentUUID() == my_outifts_id) + else if (move_is_into_my_outfits) { - dropToMyOutfitsSubfolder(inv_cat, mUUID, cb); + EMyOutfitsSubfolderType res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); + if (res == MY_OUTFITS_SUBFOLDER) + { + // turn it into outfit + dropToMyOutfitsSubfolder(inv_cat, mUUID, LLFolderType::FT_OUTFIT, cb); + } + else + { + dropToMyOutfitsSubfolder(inv_cat, mUUID, LLFolderType::FT_NONE, cb); + } } // if target is current outfit folder we use link else if (move_is_into_current_outfit && @@ -4012,6 +4059,7 @@ void LLFolderBridge::perform_pasteFromClipboard() { if (!move_is_into_my_outfits && item && can_move_to_outfit(item, move_is_into_current_outfit)) { + // todo: this is going to create dupplicate folders? dropToOutfit(item, move_is_into_current_outfit, cb); } else if (move_is_into_my_outfits && LLAssetType::AT_CATEGORY == obj->getType()) @@ -4024,9 +4072,18 @@ void LLFolderBridge::perform_pasteFromClipboard() { dropToMyOutfits(cat, cb); } - else if (getCategory() && getCategory()->getParentUUID() == mUUID) + else if (move_is_into_my_outfits) { - dropToMyOutfitsSubfolder(cat, mUUID, cb); + EMyOutfitsSubfolderType res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); + if (res == MY_OUTFITS_SUBFOLDER) + { + // turn it into outfit + dropToMyOutfitsSubfolder(cat, mUUID, LLFolderType::FT_OUTFIT, cb); + } + else + { + dropToMyOutfitsSubfolder(cat, mUUID, LLFolderType::FT_NONE, cb); + } } } else @@ -4361,63 +4418,85 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items else if(isAgentInventory()) // do not allow creating in library { LLViewerInventoryCategory *cat = getCategory(); - // BAP removed protected check to re-enable standard ops in untyped folders. - // Not sure what the right thing is to do here. - if (!isCOFFolder() && cat && (cat->getPreferredType() != LLFolderType::FT_OUTFIT)) - { - if (!isInboxFolder() // don't allow creation in inbox - && outfits_id != mUUID) - { - bool menu_items_added = false; - // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694. - if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat)) - { - items.push_back(std::string("New Folder")); - menu_items_added = true; - } - if (!isMarketplaceListingsFolder()) - { - items.push_back(std::string("upload_def")); - items.push_back(std::string("create_new")); - items.push_back(std::string("New Script")); - items.push_back(std::string("New Note")); - items.push_back(std::string("New Gesture")); - items.push_back(std::string("New Material")); - items.push_back(std::string("New Clothes")); - items.push_back(std::string("New Body Parts")); - items.push_back(std::string("New Settings")); - if (!LLEnvironment::instance().isInventoryEnabled()) - { - disabled_items.push_back("New Settings"); - } - } - else - { - items.push_back(std::string("New Listing Folder")); - } - if (menu_items_added) - { - items.push_back(std::string("Create Separator")); - } - } - getClipboardEntries(false, items, disabled_items, flags); - } - else + + if (cat) { - // Want some but not all of the items from getClipboardEntries for outfits. - if (cat && (cat->getPreferredType() == LLFolderType::FT_OUTFIT)) + if (cat->getPreferredType() == LLFolderType::FT_OUTFIT) { + // Want some but not all of the items from getClipboardEntries for outfits. + items.push_back(std::string("New Outfit Folder")); items.push_back(std::string("Rename")); items.push_back(std::string("thumbnail")); addDeleteContextMenuOptions(items, disabled_items); // EXT-4030: disallow deletion of currently worn outfit - const LLViewerInventoryItem *base_outfit_link = LLAppearanceMgr::instance().getBaseOutfitLink(); + const LLViewerInventoryItem* base_outfit_link = LLAppearanceMgr::instance().getBaseOutfitLink(); if (base_outfit_link && (cat == base_outfit_link->getLinkedCategory())) { disabled_items.push_back(std::string("Delete")); } } + else if (outfits_id == mUUID) + { + getClipboardEntries(false, items, disabled_items, flags); + } + else if (!isCOFFolder()) + { + EMyOutfitsSubfolderType in_my_outfits = myoutfit_object_subfolder_type(model, mUUID, outfits_id); + if (in_my_outfits != MY_OUTFITS_NO) + { + if (in_my_outfits == MY_OUTFITS_SUBFOLDER) + { + // Not inside an outfit, but inside 'my outfits' + items.push_back(std::string("New Outfit")); + } + + items.push_back(std::string("New Outfit Folder")); + items.push_back(std::string("Rename")); + items.push_back(std::string("thumbnail")); + + addDeleteContextMenuOptions(items, disabled_items); + } + else + { + if (!isInboxFolder() // don't allow creation in inbox + && outfits_id != mUUID) + { + bool menu_items_added = false; + // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694. + if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat)) + { + items.push_back(std::string("New Folder")); + menu_items_added = true; + } + if (!isMarketplaceListingsFolder()) + { + items.push_back(std::string("upload_def")); + items.push_back(std::string("create_new")); + items.push_back(std::string("New Script")); + items.push_back(std::string("New Note")); + items.push_back(std::string("New Gesture")); + items.push_back(std::string("New Material")); + items.push_back(std::string("New Clothes")); + items.push_back(std::string("New Body Parts")); + items.push_back(std::string("New Settings")); + if (!LLEnvironment::instance().isInventoryEnabled()) + { + disabled_items.push_back("New Settings"); + } + } + else + { + items.push_back(std::string("New Listing Folder")); + } + if (menu_items_added) + { + items.push_back(std::string("Create Separator")); + } + } + getClipboardEntries(false, items, disabled_items, flags); + } + } } if (model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT) == mUUID) @@ -4570,7 +4649,11 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags, menuentry_vec_t& if (((flags & ITEM_IN_MULTI_SELECTION) == 0) && hasChildren() && (type != LLFolderType::FT_OUTFIT)) { - items.push_back(std::string("Ungroup folder items")); + const LLUUID my_outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + if (!gInventory.isObjectDescendentOf(mUUID, my_outfits)) + { + items.push_back(std::string("Ungroup folder items")); + } } } else @@ -5350,7 +5433,7 @@ void LLFolderBridge::dropToMyOutfits(LLInventoryCategory* inv_cat, LLPointergetThumbnailUUID()); } -void LLFolderBridge::dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id, LLPointer cb) +void LLFolderBridge::dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id, LLFolderType::EType preferred_type, LLPointer cb) { LLViewerInventoryCategory* cat = getInventoryModel()->getCategory(dest_id); const LLUUID outfits_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); @@ -5358,7 +5441,7 @@ void LLFolderBridge::dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, cons if (cat && cat->getParentUUID() == outfits_id) { getInventoryModel()->createNewCategory(dest_id, - LLFolderType::FT_OUTFIT, + preferred_type, inv_cat->getName(), func, inv_cat->getThumbnailUUID()); @@ -5366,7 +5449,7 @@ void LLFolderBridge::dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, cons else { getInventoryModel()->createNewCategory(outfits_id, - LLFolderType::FT_OUTFIT, + preferred_type, inv_cat->getName(), func, inv_cat->getThumbnailUUID()); @@ -5476,10 +5559,6 @@ bool LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, const bool move_is_into_favorites = (mUUID == favorites_id); const bool move_is_into_my_outfits = (mUUID == my_outifts_id) || model->isObjectDescendentOf(mUUID, my_outifts_id); const bool move_is_into_outfit = move_is_into_my_outfits || (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); - const bool move_is_into_my_outfits_subfolder = move_is_into_my_outfits - && getCategory() - && getCategory()->getParentUUID() == my_outifts_id - && getCategory()->getPreferredType() != LLFolderType::FT_OUTFIT; const bool move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id); const bool move_is_into_marketplacelistings = model->isObjectDescendentOf(mUUID, marketplacelistings_id); const bool move_is_from_marketplacelistings = model->isObjectDescendentOf(inv_item->getUUID(), marketplacelistings_id); @@ -5550,7 +5629,9 @@ bool LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, } else if (user_confirm && (move_is_into_current_outfit || move_is_into_outfit)) { - accept = !move_is_into_my_outfits_subfolder && can_move_to_outfit(inv_item, move_is_into_current_outfit); + EMyOutfitsSubfolderType res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); + // don't allow items in my outfits' subfodlers, only in outfits and outfit's subfolders + accept = res != MY_OUTFITS_SUBFOLDER && can_move_to_outfit(inv_item, move_is_into_current_outfit); } else if (user_confirm && (move_is_into_favorites || move_is_into_landmarks)) { diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index b7bdef9b21..a101c7368a 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -369,7 +369,7 @@ protected: void dropToFavorites(LLInventoryItem* inv_item, LLPointer cb = NULL); void dropToOutfit(LLInventoryItem* inv_item, bool move_is_into_current_outfit, LLPointer cb = NULL); void dropToMyOutfits(LLInventoryCategory* inv_cat, LLPointer cb = NULL); - void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest, LLPointer cb = NULL); + void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest, LLFolderType::EType preferred_type, LLPointer cb = NULL); //-------------------------------------------------------------------- // Messy hacks for handling folder options diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index 6188b812d5..15bc578c64 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -60,11 +60,49 @@ static LLPanelInjector t_inventory_gallery("inventory_galler const S32 GALLERY_ITEMS_PER_ROW_MIN = 2; const S32 FAST_LOAD_THUMBNAIL_TRSHOLD = 50; // load folders below this value immediately + +namespace { + enum EMyOutfitsSubfolderType + { + MY_OUTFITS_NO, + MY_OUTFITS_SUBFOLDER, + MY_OUTFITS_OUTFIT, + }; + + EMyOutfitsSubfolderType myoutfit_object_subfolder_type(LLInventoryModel* model, const LLUUID& obj_id, + const LLUUID& cat_id) + { + if (obj_id == cat_id) return MY_OUTFITS_NO; + + const LLViewerInventoryCategory* test_cat = model->getCategory(obj_id); + while (test_cat) + { + if (test_cat->getPreferredType() == LLFolderType::FT_OUTFIT) + { + return MY_OUTFITS_OUTFIT; + } + + const LLUUID& parent_id = test_cat->getParentUUID(); + if (parent_id.isNull()) + { + return MY_OUTFITS_NO; + } + if (parent_id == cat_id) + { + return MY_OUTFITS_SUBFOLDER; + } + test_cat = model->getCategory(parent_id); + } + + return MY_OUTFITS_NO; + } +} + // Helper dnd functions bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, bool drop, std::string& tooltip_msg, bool is_link); bool dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, bool drop, std::string& tooltip_msg, bool user_confirm); void dropToMyOutfits(LLInventoryCategory* inv_cat); -void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id); +void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id, LLFolderType::EType preferred_type); class LLGalleryPanel: public LLPanel { @@ -3899,9 +3937,18 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, // create a new folder and populate it with links to original objects dropToMyOutfits(inv_cat); } - else if (dest_cat && dest_cat->getParentUUID() == my_outifts_id) + else if (move_is_into_my_outfits) { - dropToMyOutfitsSubfolder(inv_cat, dest_id); + EMyOutfitsSubfolderType res = myoutfit_object_subfolder_type(model, dest_id, my_outifts_id); + if (res == MY_OUTFITS_SUBFOLDER) + { + // turn it into outfit + dropToMyOutfitsSubfolder(inv_cat, dest_id, LLFolderType::FT_OUTFIT); + } + else + { + dropToMyOutfitsSubfolder(inv_cat, dest_id, LLFolderType::FT_NONE); + } } // if target is current outfit folder we use link else if (move_is_into_current_outfit && @@ -4047,10 +4094,10 @@ void dropToMyOutfits(LLInventoryCategory* inv_cat) gInventory.createNewCategory(dest_id, LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID()); } -void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID &dest_id) +void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID &dest_id, LLFolderType::EType preferred_type) { // Note: creation will take time, so passing folder id to callback is slightly unreliable, // but so is collecting and passing descendants' ids inventory_func_type func = boost::bind(&outfitFolderCreatedCallback, inv_cat->getUUID(), _1); - gInventory.createNewCategory(dest_id, LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID()); + gInventory.createNewCategory(dest_id, preferred_type, inv_cat->getName(), func, inv_cat->getThumbnailUUID()); } diff --git a/indra/newview/llinventorygallerymenu.cpp b/indra/newview/llinventorygallerymenu.cpp index 25b339d51e..3ef5071c97 100644 --- a/indra/newview/llinventorygallerymenu.cpp +++ b/indra/newview/llinventorygallerymenu.cpp @@ -586,7 +586,9 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men bool is_trash = (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH)); bool is_in_trash = gInventory.isObjectDescendentOf(selected_id, gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH)); bool is_lost_and_found = (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND)); - bool is_outfits= (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS)); + const LLUUID my_outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + bool is_outfits= (selected_id == my_outfits); + bool is_in_outfits = is_outfits || gInventory.isObjectDescendentOf(selected_id, my_outfits); bool is_in_favorites = gInventory.isObjectDescendentOf(selected_id, gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE)); //bool is_favorites= (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE)); @@ -725,7 +727,7 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men } else { - if (is_agent_inventory && !is_inbox && !is_cof && !is_in_favorites && !is_outfits) + if (is_agent_inventory && !is_inbox && !is_cof && !is_in_favorites && !is_outfits && !is_in_outfits) { LLViewerInventoryCategory* category = gInventory.getCategory(selected_id); if (!category || !LLFriendCardsManager::instance().isCategoryInFriendFolder(category)) @@ -778,7 +780,7 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men items.push_back(std::string("Subfolder Separator")); if (!is_system_folder && !isRootFolder()) { - if(has_children && (folder_type != LLFolderType::FT_OUTFIT)) + if(has_children && (folder_type != LLFolderType::FT_OUTFIT) && !is_in_outfits) { items.push_back(std::string("Ungroup folder items")); } diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 9fffe6378e..6f4d2db12e 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1007,7 +1007,8 @@ void LLInventoryModel::createNewCategory(const LLUUID& parent_id, return; } - if (preferred_type != LLFolderType::FT_NONE) + if (preferred_type != LLFolderType::FT_NONE + && preferred_type != LLFolderType::FT_OUTFIT) { // Ultimately this should only be done for non-singleton // types. Requires back-end changes to guarantee that others diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index cfbfe8f8e0..9d8493549d 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -845,7 +845,8 @@ public: LLInventoryModel::cat_array_t* cats; LLInventoryModel::item_array_t* items; gInventory.getDirectDescendentsOf(inv_cat->getUUID(), cats, items); - if (items->size() > 3) // eyes, skin, hair and shape are required + if (cats->empty() // protection against outfits inside + && items->size() > 3) // eyes, skin, hair and shape are required { // For now assume this to be an old style outfit, not a subfolder // but ideally no such 'outfits' should be left in My Outfits -- cgit v1.2.3 From 1c90421b8873a2228a845ea2f7f4a80758500aa6 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 9 Apr 2025 19:54:50 +0300 Subject: #3596 Faster mesh thread shutdown --- indra/llcommon/lluuid.cpp | 15 --------------- indra/llcommon/lluuid.h | 2 -- indra/newview/llinventorymodel.cpp | 2 +- indra/newview/llmeshrepository.cpp | 29 +++++++++++++++++++++++++++-- indra/newview/llmeshrepository.h | 3 +++ 5 files changed, 31 insertions(+), 20 deletions(-) diff --git a/indra/llcommon/lluuid.cpp b/indra/llcommon/lluuid.cpp index b9bd27aa17..4aae90626e 100644 --- a/indra/llcommon/lluuid.cpp +++ b/indra/llcommon/lluuid.cpp @@ -174,14 +174,6 @@ void LLUUID::toString(std::string& out) const (U8)(mData[15])); } -// *TODO: deprecate -void LLUUID::toString(char* out) const -{ - std::string buffer; - toString(buffer); - strcpy(out, buffer.c_str()); /* Flawfinder: ignore */ -} - void LLUUID::toCompressedString(std::string& out) const { char bytes[UUID_BYTES + 1]; @@ -190,13 +182,6 @@ void LLUUID::toCompressedString(std::string& out) const out.assign(bytes, UUID_BYTES); } -// *TODO: deprecate -void LLUUID::toCompressedString(char* out) const -{ - memcpy(out, mData, UUID_BYTES); /* Flawfinder: ignore */ - out[UUID_BYTES] = '\0'; -} - std::string LLUUID::getString() const { return asString(); diff --git a/indra/llcommon/lluuid.h b/indra/llcommon/lluuid.h index bd4edc7993..ca1cf03c4d 100644 --- a/indra/llcommon/lluuid.h +++ b/indra/llcommon/lluuid.h @@ -103,9 +103,7 @@ public: friend LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLUUID &uuid); friend LL_COMMON_API std::istream& operator>>(std::istream& s, LLUUID &uuid); - void toString(char *out) const; // Does not allocate memory, needs 36 characters (including \0) void toString(std::string& out) const; - void toCompressedString(char *out) const; // Does not allocate memory, needs 17 characters (including \0) void toCompressedString(std::string& out) const; std::string asString() const; diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 6f4d2db12e..0a2d938bd0 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -3526,7 +3526,7 @@ bool LLInventoryModel::saveToFile(const std::string& filename, fileXML.close(); - LL_INFOS(LOG_INV) << "Inventory saved: " << cat_count << " categories, " << it_count << " items." << LL_ENDL; + LL_INFOS(LOG_INV) << "Inventory saved: " << (S32)cat_count << " categories, " << (S32)it_count << " items." << LL_ENDL; } catch (...) { diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index a8c6f69425..48c80842b9 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1210,6 +1210,12 @@ void LLMeshRepoThread::run() LL_WARNS(LOG_MESH) << "Convex decomposition unable to be quit." << LL_ENDL; } } +void LLMeshRepoThread::cleanup() +{ + mShuttingDown = true; + mSignal->broadcast(); + mMeshThreadPool->close(); +} // Mutex: LLMeshRepoThread::mMutex must be held on entry void LLMeshRepoThread::loadMeshSkinInfo(const LLUUID& mesh_id) @@ -1493,6 +1499,11 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id) [mesh_id, buffer, size] () { + if (gMeshRepo.mThread->isShuttingDown()) + { + delete[] buffer; + return; + } if (!gMeshRepo.mThread->skinInfoReceived(mesh_id, buffer, size)) { // either header is faulty or something else overwrote the cache @@ -1993,6 +2004,11 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod) [params, mesh_id, lod, buffer, size] () { + if (gMeshRepo.mThread->isShuttingDown()) + { + delete[] buffer; + return; + } if (gMeshRepo.mThread->lodReceived(params, lod, buffer, size) == MESH_OK) { LL_DEBUGS(LOG_MESH) << "Mesh/Cache: Mesh body for ID " << mesh_id << " - was retrieved from the cache." << LL_ENDL; @@ -3792,6 +3808,11 @@ void LLMeshLODHandler::processData(LLCore::BufferArray * /* body */, S32 /* body [shrd_handler, data, data_size] () { + if (gMeshRepo.mThread->isShuttingDown()) + { + delete[] data; + return; + } LLMeshLODHandler* handler = (LLMeshLODHandler * )shrd_handler.get(); handler->processLod(data, data_size); delete[] data; @@ -3905,6 +3926,11 @@ void LLMeshSkinInfoHandler::processData(LLCore::BufferArray * /* body */, S32 /* [shrd_handler, data, data_size] () { + if (gMeshRepo.mThread->isShuttingDown()) + { + delete[] data; + return; + } LLMeshSkinInfoHandler* handler = (LLMeshSkinInfoHandler*)shrd_handler.get(); handler->processSkin(data, data_size); delete[] data; @@ -4127,8 +4153,7 @@ void LLMeshRepository::shutdown() mUploads[i]->discard() ; //discard the uploading requests. } - mThread->mSignal->broadcast(); - mThread->mMeshThreadPool->close(); + mThread->cleanup(); while (!mThread->isStopped()) { diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index 0d9da32e27..b9acb3573f 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -515,6 +515,8 @@ public: ~LLMeshRepoThread(); virtual void run(); + void cleanup(); + bool isShuttingDown() { return mShuttingDown; } void lockAndLoadMeshLOD(const LLVolumeParams& mesh_params, S32 lod); void loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod); @@ -583,6 +585,7 @@ private: U8* getDiskCacheBuffer(S32 size); S32 mDiskCacheBufferSize = 0; U8* mDiskCacheBuffer = nullptr; + bool mShuttingDown = false; }; -- cgit v1.2.3 From 2371994a88ffeefd07891d00aed18ac226b954a7 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 9 Apr 2025 21:35:40 +0300 Subject: #3757 Menu for subfodlers in outfits p2 --- indra/newview/llinventorybridge.cpp | 90 +++++++++----------------- indra/newview/llinventoryfunctions.cpp | 30 +++++++++ indra/newview/llinventoryfunctions.h | 11 ++++ indra/newview/llinventorygallery.cpp | 65 +++++++------------ indra/newview/llinventorygallerymenu.cpp | 16 ++++- indra/newview/skins/default/xui/en/strings.xml | 1 + 6 files changed, 109 insertions(+), 104 deletions(-) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index fd9d08a26d..2c1c6d22a6 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -104,45 +104,6 @@ static bool check_item(const LLUUID& item_id, LLInventoryFilter* filter); // Helper functions - - -namespace { - enum EMyOutfitsSubfolderType - { - MY_OUTFITS_NO, - MY_OUTFITS_SUBFOLDER, - MY_OUTFITS_OUTFIT, - }; - - EMyOutfitsSubfolderType myoutfit_object_subfolder_type(LLInventoryModel* model, const LLUUID& obj_id, - const LLUUID& cat_id) - { - if (obj_id == cat_id) return MY_OUTFITS_NO; - - const LLViewerInventoryCategory* test_cat = model->getCategory(obj_id); - while (test_cat) - { - if (test_cat->getPreferredType() == LLFolderType::FT_OUTFIT) - { - return MY_OUTFITS_OUTFIT; - } - - const LLUUID& parent_id = test_cat->getParentUUID(); - if (parent_id.isNull()) - { - return MY_OUTFITS_NO; - } - if (parent_id == cat_id) - { - return MY_OUTFITS_SUBFOLDER; - } - test_cat = model->getCategory(parent_id); - } - - return MY_OUTFITS_NO; - } -} - bool isAddAction(const std::string& action) { return ("wear" == action || "attach" == action || "activate" == action); @@ -2735,7 +2696,12 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, U32 max_items_to_wear = gSavedSettings.getU32("WearFolderLimit"); if (is_movable && move_is_into_outfit) { - if (mUUID == my_outifts_id) + if ((inv_cat->getPreferredType() != LLFolderType::FT_NONE) && (inv_cat->getPreferredType() != LLFolderType::FT_OUTFIT)) + { + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); + is_movable = false; + } + else if (mUUID == my_outifts_id) { if (source != LLToolDragAndDrop::SOURCE_AGENT || move_is_from_marketplacelistings) { @@ -2752,13 +2718,28 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, is_movable = false; } } - else if(getCategory() && getCategory()->getPreferredType() == LLFolderType::FT_NONE) + else if (!getCategory()) { - is_movable = ((inv_cat->getPreferredType() == LLFolderType::FT_NONE) || (inv_cat->getPreferredType() == LLFolderType::FT_OUTFIT)); + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); } else { - is_movable = false; + LLFolderType::EType type = getCategory()->getPreferredType(); + if (type == LLFolderType::FT_OUTFIT && inv_cat->getPreferredType() == LLFolderType::FT_OUTFIT) + { + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantMoveOutfitIntoOutfit"); + } + else if (can_move_to_my_outfits(model, inv_cat, max_items_to_wear)) + { + is_movable = true; + } + else + { + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); + } } } if (is_movable && move_is_into_current_outfit && is_link) @@ -2964,6 +2945,7 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, } else { + // or link it? dropToMyOutfitsSubfolder(inv_cat, mUUID, LLFolderType::FT_NONE, cb); } } @@ -5435,25 +5417,13 @@ void LLFolderBridge::dropToMyOutfits(LLInventoryCategory* inv_cat, LLPointer cb) { - LLViewerInventoryCategory* cat = getInventoryModel()->getCategory(dest_id); const LLUUID outfits_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); inventory_func_type func = boost::bind(outfitFolderCreatedCallback, inv_cat->getUUID(), _1, cb, mInventoryPanel); - if (cat && cat->getParentUUID() == outfits_id) - { - getInventoryModel()->createNewCategory(dest_id, - preferred_type, - inv_cat->getName(), - func, - inv_cat->getThumbnailUUID()); - } - else - { - getInventoryModel()->createNewCategory(outfits_id, - preferred_type, - inv_cat->getName(), - func, - inv_cat->getThumbnailUUID()); - } + getInventoryModel()->createNewCategory(dest_id, + preferred_type, + inv_cat->getName(), + func, + inv_cat->getThumbnailUUID()); } void LLFolderBridge::outfitFolderCreatedCallback(LLUUID cat_source_id, diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index b4299972d9..dc69e0c92e 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -2493,6 +2493,36 @@ bool can_share_item(const LLUUID& item_id) return can_share; } + +EMyOutfitsSubfolderType myoutfit_object_subfolder_type( + LLInventoryModel* model, + const LLUUID& obj_id, + const LLUUID& my_outfits_id) +{ + if (obj_id == my_outfits_id) return MY_OUTFITS_NO; + + const LLViewerInventoryCategory* test_cat = model->getCategory(obj_id); + while (test_cat) + { + if (test_cat->getPreferredType() == LLFolderType::FT_OUTFIT) + { + return MY_OUTFITS_OUTFIT; + } + + const LLUUID& parent_id = test_cat->getParentUUID(); + if (parent_id.isNull()) + { + return MY_OUTFITS_NO; + } + if (parent_id == my_outfits_id) + { + return MY_OUTFITS_SUBFOLDER; + } + test_cat = model->getCategory(parent_id); + } + + return MY_OUTFITS_NO; +} ///---------------------------------------------------------------------------- /// LLMarketplaceValidator implementations ///---------------------------------------------------------------------------- diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index b379d625a9..eb3503c5b0 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -121,6 +121,17 @@ std::string get_searchable_creator_name(LLInventoryModel* model, const LLUUID& i std::string get_searchable_UUID(LLInventoryModel* model, const LLUUID& item_id); bool can_share_item(const LLUUID& item_id); +enum EMyOutfitsSubfolderType +{ + MY_OUTFITS_NO, + MY_OUTFITS_SUBFOLDER, + MY_OUTFITS_OUTFIT, +}; +EMyOutfitsSubfolderType myoutfit_object_subfolder_type( + LLInventoryModel* model, + const LLUUID& obj_id, + const LLUUID& my_outfits_id); + /** Miscellaneous global functions ** ** *******************************************************************************/ diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index 15bc578c64..d640e04915 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -61,43 +61,6 @@ const S32 GALLERY_ITEMS_PER_ROW_MIN = 2; const S32 FAST_LOAD_THUMBNAIL_TRSHOLD = 50; // load folders below this value immediately -namespace { - enum EMyOutfitsSubfolderType - { - MY_OUTFITS_NO, - MY_OUTFITS_SUBFOLDER, - MY_OUTFITS_OUTFIT, - }; - - EMyOutfitsSubfolderType myoutfit_object_subfolder_type(LLInventoryModel* model, const LLUUID& obj_id, - const LLUUID& cat_id) - { - if (obj_id == cat_id) return MY_OUTFITS_NO; - - const LLViewerInventoryCategory* test_cat = model->getCategory(obj_id); - while (test_cat) - { - if (test_cat->getPreferredType() == LLFolderType::FT_OUTFIT) - { - return MY_OUTFITS_OUTFIT; - } - - const LLUUID& parent_id = test_cat->getParentUUID(); - if (parent_id.isNull()) - { - return MY_OUTFITS_NO; - } - if (parent_id == cat_id) - { - return MY_OUTFITS_SUBFOLDER; - } - test_cat = model->getCategory(parent_id); - } - - return MY_OUTFITS_NO; - } -} - // Helper dnd functions bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, bool drop, std::string& tooltip_msg, bool is_link); bool dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, bool drop, std::string& tooltip_msg, bool user_confirm); @@ -3784,7 +3747,12 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, U32 max_items_to_wear = gSavedSettings.getU32("WearFolderLimit"); if (is_movable && move_is_into_outfit) { - if (dest_id == my_outifts_id) + if ((inv_cat->getPreferredType() != LLFolderType::FT_NONE) && (inv_cat->getPreferredType() != LLFolderType::FT_OUTFIT)) + { + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); + is_movable = false; + } + else if (dest_id == my_outifts_id) { if (source != LLToolDragAndDrop::SOURCE_AGENT || move_is_from_marketplacelistings) { @@ -3801,13 +3769,28 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, is_movable = false; } } - else if (dest_cat && dest_cat->getPreferredType() == LLFolderType::FT_NONE) + else if (!dest_cat) { - is_movable = ((inv_cat->getPreferredType() == LLFolderType::FT_NONE) || (inv_cat->getPreferredType() == LLFolderType::FT_OUTFIT)); + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); } else { - is_movable = false; + LLFolderType::EType type = dest_cat->getPreferredType(); + if (type == LLFolderType::FT_OUTFIT && inv_cat->getPreferredType() == LLFolderType::FT_OUTFIT) + { + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantMoveOutfitIntoOutfit"); + } + else if (can_move_to_my_outfits(model, inv_cat, max_items_to_wear)) + { + is_movable = true; + } + else + { + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); + } } } if (is_movable && move_is_into_current_outfit && is_link) diff --git a/indra/newview/llinventorygallerymenu.cpp b/indra/newview/llinventorygallerymenu.cpp index 3ef5071c97..68af0cb581 100644 --- a/indra/newview/llinventorygallerymenu.cpp +++ b/indra/newview/llinventorygallerymenu.cpp @@ -771,14 +771,24 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men items.push_back(std::string("upload_def")); } - if(is_outfits && !isRootFolder()) + if(is_outfits) { + EMyOutfitsSubfolderType res = myoutfit_object_subfolder_type(&gInventory, selected_id, my_outfits); + if (res == MY_OUTFITS_OUTFIT) + { + items.push_back(std::string("New Outfit")); + } items.push_back(std::string("New Outfit Folder")); - items.push_back(std::string("New Outfit")); + items.push_back(std::string("Delete")); + items.push_back(std::string("Rename")); + if (!get_is_category_and_children_removable(&gInventory, selected_id, false)) + { + disabled_items.push_back(std::string("Delete")); + } } items.push_back(std::string("Subfolder Separator")); - if (!is_system_folder && !isRootFolder()) + if (!is_system_folder && !isRootFolder() && !is_outfits) { if(has_children && (folder_type != LLFolderType::FT_OUTFIT) && !is_in_outfits) { diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index d909a95b83..7361ad5245 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -258,6 +258,7 @@ If you feel this is an error, please contact support@secondlife.com All items in a stock folder must have the same type and permission You can only put items or outfits from your personal inventory into "My outfits" One or more items can't be used inside "My outfits" + Can not move an outfit into another outfit You can't move a folder into its child You can't move a folder into itself -- cgit v1.2.3 From 7dce74fcfb9ca9e6c152eaf33392ff79412ff555 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 10 Apr 2025 22:39:04 +0300 Subject: #3757 Move for subfodlers --- indra/newview/llinventorybridge.cpp | 93 +++++++++++++++++++++++++++----- indra/newview/llinventoryfunctions.cpp | 6 ++- indra/newview/llinventoryfunctions.h | 1 + indra/newview/llinventorygallery.cpp | 85 ++++++++++++++++++++++++----- indra/newview/llinventorygallerymenu.cpp | 2 +- 5 files changed, 158 insertions(+), 29 deletions(-) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 2c1c6d22a6..5bd17d4d5b 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2725,12 +2725,23 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, } else { - LLFolderType::EType type = getCategory()->getPreferredType(); - if (type == LLFolderType::FT_OUTFIT && inv_cat->getPreferredType() == LLFolderType::FT_OUTFIT) + EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); + EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); + if ((dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) && inv_res == MY_OUTFITS_OUTFIT) { is_movable = false; tooltip_msg = LLTrans::getString("TooltipCantMoveOutfitIntoOutfit"); } + else if ((dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) && inv_res == MY_OUTFITS_SUBFOLDER) + { + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); + } + else if (dest_res == MY_OUTFITS_SUBFOLDER && inv_res == MY_OUTFITS_SUBOUTFIT) + { + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); + } else if (can_move_to_my_outfits(model, inv_cat, max_items_to_wear)) { is_movable = true; @@ -2931,22 +2942,76 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, if (mUUID == my_outifts_id) { - // Category can't contains objects, - // create a new folder and populate it with links to original objects - dropToMyOutfits(inv_cat, cb); - } - else if (move_is_into_my_outfits) - { - EMyOutfitsSubfolderType res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); - if (res == MY_OUTFITS_SUBFOLDER) + EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); + if (inv_res == MY_OUTFITS_SUBFOLDER || inv_res == MY_OUTFITS_OUTFIT) { - // turn it into outfit - dropToMyOutfitsSubfolder(inv_cat, mUUID, LLFolderType::FT_OUTFIT, cb); + LLInvFVBridge::changeCategoryParent( + model, + (LLViewerInventoryCategory*)inv_cat, + mUUID, + false); + if (cb) cb->fire(inv_cat->getUUID()); } else { - // or link it? - dropToMyOutfitsSubfolder(inv_cat, mUUID, LLFolderType::FT_NONE, cb); + // Moving from inventory + // create a new folder and populate it with links to original objects + dropToMyOutfits(inv_cat, cb); + } + } + else if (move_is_into_my_outfits) + { + EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); + EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); + switch (inv_res) + { + case MY_OUTFITS_NO: + // Moning from outside outfits into outfits + if (dest_res == MY_OUTFITS_SUBFOLDER) + { + // turn it into outfit + dropToMyOutfitsSubfolder(inv_cat, mUUID, LLFolderType::FT_OUTFIT, cb); + } + else + { + // or link it? + dropToMyOutfitsSubfolder(inv_cat, mUUID, LLFolderType::FT_NONE, cb); + } + break; + case MY_OUTFITS_SUBFOLDER: + case MY_OUTFITS_OUTFIT: + // only permit moving subfodlers and outfits into other subfolders + if (dest_res == MY_OUTFITS_SUBFOLDER) + { + LLInvFVBridge::changeCategoryParent( + model, + (LLViewerInventoryCategory*)inv_cat, + mUUID, + false); + if (cb) cb->fire(inv_cat->getUUID()); + } + else + { + assert(false); // mot permitted, shouldn't have accepted + } + break; + case MY_OUTFITS_SUBOUTFIT: + if (dest_res == MY_OUTFITS_SUBOUTFIT || dest_res == MY_OUTFITS_OUTFIT) + { + LLInvFVBridge::changeCategoryParent( + model, + (LLViewerInventoryCategory*)inv_cat, + mUUID, + false); + if (cb) cb->fire(inv_cat->getUUID()); + } + else + { + assert(false); // mot permitted, shouldn't have accepted + } + break; + default: + break; } } // if target is current outfit folder we use link diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index dc69e0c92e..7fff88fba7 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -2502,11 +2502,15 @@ EMyOutfitsSubfolderType myoutfit_object_subfolder_type( if (obj_id == my_outfits_id) return MY_OUTFITS_NO; const LLViewerInventoryCategory* test_cat = model->getCategory(obj_id); + if (test_cat->getPreferredType() == LLFolderType::FT_OUTFIT) + { + return MY_OUTFITS_OUTFIT; + } while (test_cat) { if (test_cat->getPreferredType() == LLFolderType::FT_OUTFIT) { - return MY_OUTFITS_OUTFIT; + return MY_OUTFITS_SUBOUTFIT; } const LLUUID& parent_id = test_cat->getParentUUID(); diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index eb3503c5b0..0ab045f2a0 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -126,6 +126,7 @@ enum EMyOutfitsSubfolderType MY_OUTFITS_NO, MY_OUTFITS_SUBFOLDER, MY_OUTFITS_OUTFIT, + MY_OUTFITS_SUBOUTFIT, }; EMyOutfitsSubfolderType myoutfit_object_subfolder_type( LLInventoryModel* model, diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index d640e04915..713d87787e 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -3776,12 +3776,23 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, } else { - LLFolderType::EType type = dest_cat->getPreferredType(); - if (type == LLFolderType::FT_OUTFIT && inv_cat->getPreferredType() == LLFolderType::FT_OUTFIT) + EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, dest_id, my_outifts_id); + EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); + if ((dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) && inv_res == MY_OUTFITS_OUTFIT) { is_movable = false; tooltip_msg = LLTrans::getString("TooltipCantMoveOutfitIntoOutfit"); } + else if ((dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) && inv_res == MY_OUTFITS_SUBFOLDER) + { + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); + } + else if (dest_res == MY_OUTFITS_SUBFOLDER && inv_res == MY_OUTFITS_SUBOUTFIT) + { + is_movable = false; + tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); + } else if (can_move_to_my_outfits(model, inv_cat, max_items_to_wear)) { is_movable = true; @@ -3916,21 +3927,69 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, if (dest_id == my_outifts_id) { - // Category can contains objects, - // create a new folder and populate it with links to original objects - dropToMyOutfits(inv_cat); - } - else if (move_is_into_my_outfits) - { - EMyOutfitsSubfolderType res = myoutfit_object_subfolder_type(model, dest_id, my_outifts_id); - if (res == MY_OUTFITS_SUBFOLDER) + EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); + if (inv_res == MY_OUTFITS_SUBFOLDER || inv_res == MY_OUTFITS_OUTFIT) { - // turn it into outfit - dropToMyOutfitsSubfolder(inv_cat, dest_id, LLFolderType::FT_OUTFIT); + gInventory.changeCategoryParent( + (LLViewerInventoryCategory*)inv_cat, + dest_id, + move_is_into_trash); } else { - dropToMyOutfitsSubfolder(inv_cat, dest_id, LLFolderType::FT_NONE); + // Category can contains objects, + // create a new folder and populate it with links to original objects + dropToMyOutfits(inv_cat); + } + } + else if (move_is_into_my_outfits) + { + EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, dest_id, my_outifts_id); + EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); + switch (inv_res) + { + case MY_OUTFITS_NO: + // Moning from outside outfits into outfits + if (dest_res == MY_OUTFITS_SUBFOLDER) + { + // turn it into outfit + dropToMyOutfitsSubfolder(inv_cat, dest_id, LLFolderType::FT_OUTFIT); + } + else + { + dropToMyOutfitsSubfolder(inv_cat, dest_id, LLFolderType::FT_NONE); + } + break; + case MY_OUTFITS_SUBFOLDER: + case MY_OUTFITS_OUTFIT: + // only permit moving subfodlers and outfits into other subfolders + if (dest_res == MY_OUTFITS_SUBFOLDER) + { + gInventory.changeCategoryParent( + (LLViewerInventoryCategory*)inv_cat, + dest_id, + move_is_into_trash); + } + else + { + assert(false); // mot permitted, shouldn't have accepted + } + break; + case MY_OUTFITS_SUBOUTFIT: + if (dest_res == MY_OUTFITS_SUBOUTFIT || dest_res == MY_OUTFITS_OUTFIT) + { + gInventory.changeCategoryParent( + (LLViewerInventoryCategory*)inv_cat, + dest_id, + move_is_into_trash); + } + else + { + assert(false); // mot permitted, shouldn't have accepted + } + break; + default: + break; } } // if target is current outfit folder we use link diff --git a/indra/newview/llinventorygallerymenu.cpp b/indra/newview/llinventorygallerymenu.cpp index 68af0cb581..7acd3b90a2 100644 --- a/indra/newview/llinventorygallerymenu.cpp +++ b/indra/newview/llinventorygallerymenu.cpp @@ -774,7 +774,7 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men if(is_outfits) { EMyOutfitsSubfolderType res = myoutfit_object_subfolder_type(&gInventory, selected_id, my_outfits); - if (res == MY_OUTFITS_OUTFIT) + if (res != MY_OUTFITS_OUTFIT && res != MY_OUTFITS_SUBOUTFIT) { items.push_back(std::string("New Outfit")); } -- cgit v1.2.3 From e43baa755d9b91c029e7b5166317e76468baf896 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 11 Apr 2025 19:21:25 +0300 Subject: #1754 Restore land owners overlay --- indra/newview/lldrawpoolterrain.h | 1 + indra/newview/llsurfacepatch.cpp | 9 ++++++- indra/newview/llsurfacepatch.h | 2 +- indra/newview/llterrainpaintmap.cpp | 3 ++- indra/newview/llvosurfacepatch.cpp | 51 +++++++++++++++++++++++++++---------- indra/newview/llvosurfacepatch.h | 4 +++ 6 files changed, 53 insertions(+), 17 deletions(-) diff --git a/indra/newview/lldrawpoolterrain.h b/indra/newview/lldrawpoolterrain.h index 5380463d01..23cf253b6a 100644 --- a/indra/newview/lldrawpoolterrain.h +++ b/indra/newview/lldrawpoolterrain.h @@ -38,6 +38,7 @@ public: VERTEX_DATA_MASK = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TANGENT | // Only PBR terrain uses this currently + LLVertexBuffer::MAP_TEXCOORD0 | // Ownership overlay LLVertexBuffer::MAP_TEXCOORD1 }; diff --git a/indra/newview/llsurfacepatch.cpp b/indra/newview/llsurfacepatch.cpp index 4315c4c6b0..6f99da5957 100644 --- a/indra/newview/llsurfacepatch.cpp +++ b/indra/newview/llsurfacepatch.cpp @@ -201,7 +201,7 @@ LLVector2 LLSurfacePatch::getTexCoords(const U32 x, const U32 y) const void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3 *vertex, LLVector3 *normal, - LLVector2 *tex1) const + LLVector2* tex0, LLVector2 *tex1) const { if (!mSurfacep || !mSurfacep->getRegion() || !mSurfacep->getGridsPerEdge() || !mVObjp) { @@ -210,6 +210,7 @@ void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3 llassert_always(vertex && normal && tex1); U32 surface_stride = mSurfacep->getGridsPerEdge(); + U32 texture_stride = mSurfacep->getGridsPerEdge() - 1; U32 point_offset = x + y*surface_stride; *normal = getNormal(x, y); @@ -220,6 +221,12 @@ void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3 pos_agent.mV[VZ] = *(mDataZ + point_offset); *vertex = pos_agent-mVObjp->getRegion()->getOriginAgent(); + // tex0 is used for ownership overlay + LLVector3 rel_pos = pos_agent - mSurfacep->getOriginAgent(); + LLVector3 tex_pos = rel_pos * (1.f / (texture_stride * mSurfacep->getMetersPerGrid())); + tex0->mV[0] = tex_pos.mV[0]; + tex0->mV[1] = tex_pos.mV[1]; + tex1->mV[0] = mSurfacep->getRegion()->getCompositionXY(llfloor(mOriginRegion.mV[0])+x, llfloor(mOriginRegion.mV[1])+y); const F32 xyScale = 4.9215f*7.f; //0.93284f; diff --git a/indra/newview/llsurfacepatch.h b/indra/newview/llsurfacepatch.h index f4831487c1..505fc8c24c 100644 --- a/indra/newview/llsurfacepatch.h +++ b/indra/newview/llsurfacepatch.h @@ -116,7 +116,7 @@ public: void calcNormalFlat(LLVector3& normal_out, const U32 x, const U32 y, const U32 index /* 0 or 1 */); void eval(const U32 x, const U32 y, const U32 stride, - LLVector3 *vertex, LLVector3 *normal, LLVector2 *tex1) const; + LLVector3 *vertex, LLVector3 *normal, LLVector2* tex0, LLVector2 *tex1) const; diff --git a/indra/newview/llterrainpaintmap.cpp b/indra/newview/llterrainpaintmap.cpp index 8ccde74c93..c7a82013e4 100644 --- a/indra/newview/llterrainpaintmap.cpp +++ b/indra/newview/llterrainpaintmap.cpp @@ -204,8 +204,9 @@ bool LLTerrainPaintMap::bakeHeightNoiseIntoPBRPaintMapRGB(const LLViewerRegion& { LLVector3 scratch3; LLVector3 pos3; + LLVector2 tex0_temp; LLVector2 tex1_temp; - patch->eval(i, j, stride, &pos3, &scratch3, &tex1_temp); + patch->eval(i, j, stride, &pos3, &scratch3, &tex0_temp, &tex1_temp); (*pos++).set(pos3.mV[VX], pos3.mV[VY], pos3.mV[VZ]); *tex1++ = tex1_temp; vertex_total++; diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp index 294d36b0a9..bc326a74a8 100644 --- a/indra/newview/llvosurfacepatch.cpp +++ b/indra/newview/llvosurfacepatch.cpp @@ -245,6 +245,7 @@ bool LLVOSurfacePatch::updateLOD() void LLVOSurfacePatch::getTerrainGeometry(LLStrider &verticesp, LLStrider &normalsp, + LLStrider &texCoords0p, LLStrider &texCoords1p, LLStrider &indicesp) { @@ -259,18 +260,21 @@ void LLVOSurfacePatch::getTerrainGeometry(LLStrider &verticesp, updateMainGeometry(facep, verticesp, normalsp, + texCoords0p, texCoords1p, indicesp, index_offset); updateNorthGeometry(facep, verticesp, normalsp, + texCoords0p, texCoords1p, indicesp, index_offset); updateEastGeometry(facep, verticesp, normalsp, + texCoords0p, texCoords1p, indicesp, index_offset); @@ -279,6 +283,7 @@ void LLVOSurfacePatch::getTerrainGeometry(LLStrider &verticesp, void LLVOSurfacePatch::updateMainGeometry(LLFace *facep, LLStrider &verticesp, LLStrider &normalsp, + LLStrider &texCoords0p, LLStrider &texCoords1p, LLStrider &indicesp, U32 &index_offset) @@ -317,9 +322,10 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep, { x = i * render_stride; y = j * render_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } } @@ -381,6 +387,7 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep, void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, LLStrider &verticesp, LLStrider &normalsp, + LLStrider &texCoords0p, LLStrider &texCoords1p, LLStrider &indicesp, U32 &index_offset) @@ -414,9 +421,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, x = i * render_stride; y = 16 - render_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -425,9 +433,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, { x = i * render_stride; y = 16; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -460,9 +469,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, x = i * render_stride; y = 16 - render_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -472,9 +482,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, x = i * render_stride; y = 16; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -514,9 +525,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, x = i * north_stride; y = 16 - render_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -526,9 +538,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, x = i * north_stride; y = 16; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -564,6 +577,7 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, LLStrider &verticesp, LLStrider &normalsp, + LLStrider &texCoords0p, LLStrider &texCoords1p, LLStrider &indicesp, U32 &index_offset) @@ -592,9 +606,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, x = 16 - render_stride; y = i * render_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -603,9 +618,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, { x = 16; y = i * render_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -638,9 +654,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, x = 16 - render_stride; y = i * render_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } // Iterate through the east patch's points @@ -649,9 +666,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, x = 16; y = i * render_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -690,9 +708,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, x = 16 - render_stride; y = i * east_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } // Iterate through the east patch's points @@ -701,9 +720,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, x = 16; y = i * east_stride; - mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); + mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get()); verticesp++; normalsp++; + texCoords0p++; texCoords1p++; } @@ -1022,12 +1042,14 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group) LLStrider vertices_start; LLStrider normals_start; LLStrider tangents_start; + LLStrider texcoords0_start; // ownership overlay LLStrider texcoords2_start; LLStrider indices_start; llassert_always(buffer->getVertexStrider(vertices_start)); llassert_always(buffer->getNormalStrider(normals_start)); llassert_always(buffer->getTangentStrider(tangents_start)); + llassert_always(buffer->getTexCoord0Strider(texcoords0_start)); llassert_always(buffer->getTexCoord1Strider(texcoords2_start)); llassert_always(buffer->getIndexStrider(indices_start)); @@ -1037,6 +1059,7 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group) { LLStrider vertices = vertices_start; LLStrider normals = normals_start; + LLStrider texcoords0 = texcoords0_start; LLStrider texcoords2 = texcoords2_start; LLStrider indices = indices_start; @@ -1049,7 +1072,7 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group) facep->setVertexBuffer(buffer); LLVOSurfacePatch* patchp = (LLVOSurfacePatch*) facep->getViewerObject(); - patchp->getTerrainGeometry(vertices, normals, texcoords2, indices); + patchp->getTerrainGeometry(vertices, normals, texcoords0, texcoords2, indices); indices_index += facep->getIndicesCount(); index_offset += facep->getGeomCount(); diff --git a/indra/newview/llvosurfacepatch.h b/indra/newview/llvosurfacepatch.h index af5f05774b..c93a58d2d9 100644 --- a/indra/newview/llvosurfacepatch.h +++ b/indra/newview/llvosurfacepatch.h @@ -57,6 +57,7 @@ public: /*virtual*/ void updateFaceSize(S32 idx); void getTerrainGeometry(LLStrider &verticesp, LLStrider &normalsp, + LLStrider &texCoords0p, LLStrider &texCoords1p, LLStrider &indicesp); @@ -109,18 +110,21 @@ protected: void updateMainGeometry(LLFace *facep, LLStrider &verticesp, LLStrider &normalsp, + LLStrider &texCoords0p, LLStrider &texCoords1p, LLStrider &indicesp, U32 &index_offset); void updateNorthGeometry(LLFace *facep, LLStrider &verticesp, LLStrider &normalsp, + LLStrider &texCoords0p, LLStrider &texCoords1p, LLStrider &indicesp, U32 &index_offset); void updateEastGeometry(LLFace *facep, LLStrider &verticesp, LLStrider &normalsp, + LLStrider &texCoords0p, LLStrider &texCoords1p, LLStrider &indicesp, U32 &index_offset); -- cgit v1.2.3 From 7d36e7103e4260c8d79d2022bfaacdcebafb75d3 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 14 Apr 2025 22:07:11 +0300 Subject: #3757 Disable ability to create folders in individual outfits This part needs a recheck --- indra/newview/llinventorybridge.cpp | 6 ++---- indra/newview/llinventorygallery.cpp | 2 +- indra/newview/llinventorygallerymenu.cpp | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 5bd17d4d5b..4018a89c5a 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2732,7 +2732,7 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, is_movable = false; tooltip_msg = LLTrans::getString("TooltipCantMoveOutfitIntoOutfit"); } - else if ((dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) && inv_res == MY_OUTFITS_SUBFOLDER) + else if (dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) { is_movable = false; tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); @@ -4471,7 +4471,6 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items if (cat->getPreferredType() == LLFolderType::FT_OUTFIT) { // Want some but not all of the items from getClipboardEntries for outfits. - items.push_back(std::string("New Outfit Folder")); items.push_back(std::string("Rename")); items.push_back(std::string("thumbnail")); @@ -4496,9 +4495,8 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items { // Not inside an outfit, but inside 'my outfits' items.push_back(std::string("New Outfit")); + items.push_back(std::string("New Outfit Folder")); } - - items.push_back(std::string("New Outfit Folder")); items.push_back(std::string("Rename")); items.push_back(std::string("thumbnail")); diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index 713d87787e..eb47af85fd 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -3783,7 +3783,7 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, is_movable = false; tooltip_msg = LLTrans::getString("TooltipCantMoveOutfitIntoOutfit"); } - else if ((dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) && inv_res == MY_OUTFITS_SUBFOLDER) + else if (dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) { is_movable = false; tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); diff --git a/indra/newview/llinventorygallerymenu.cpp b/indra/newview/llinventorygallerymenu.cpp index 7acd3b90a2..ec3e03ee2d 100644 --- a/indra/newview/llinventorygallerymenu.cpp +++ b/indra/newview/llinventorygallerymenu.cpp @@ -777,8 +777,8 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men if (res != MY_OUTFITS_OUTFIT && res != MY_OUTFITS_SUBOUTFIT) { items.push_back(std::string("New Outfit")); + items.push_back(std::string("New Outfit Folder")); } - items.push_back(std::string("New Outfit Folder")); items.push_back(std::string("Delete")); items.push_back(std::string("Rename")); if (!get_is_category_and_children_removable(&gInventory, selected_id, false)) -- cgit v1.2.3 From 206f8d9e01aeadd972d2b279a5e111e0fb418987 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 15 Apr 2025 20:04:38 +0300 Subject: #3863 Ensure cloud texture selection updates the sky --- indra/llinventory/llsettingsbase.h | 2 +- indra/llinventory/llsettingssky.cpp | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/indra/llinventory/llsettingsbase.h b/indra/llinventory/llsettingsbase.h index 7de71588ef..bea6fdec97 100644 --- a/indra/llinventory/llsettingsbase.h +++ b/indra/llinventory/llsettingsbase.h @@ -398,7 +398,7 @@ protected: private: bool mLLSDDirty; - bool mDirty; + bool mDirty; // gates updateSettings bool mReplaced; // super dirty! static LLSD combineSDMaps(const LLSD &first, const LLSD &other); diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp index ff28c30563..e7d2887fdb 100644 --- a/indra/llinventory/llsettingssky.cpp +++ b/indra/llinventory/llsettingssky.cpp @@ -1932,6 +1932,7 @@ LLUUID LLSettingsSky::getCloudNoiseTextureId() const void LLSettingsSky::setCloudNoiseTextureId(const LLUUID &id) { mCloudTextureId = id; + setDirtyFlag(true); setLLSDDirty(); } @@ -1976,6 +1977,7 @@ LLVector2 LLSettingsSky::getCloudScrollRate() const void LLSettingsSky::setCloudScrollRate(const LLVector2 &val) { mScrollRate = val; + setDirtyFlag(true); setLLSDDirty(); } @@ -2134,6 +2136,7 @@ LLUUID LLSettingsSky::getMoonTextureId() const void LLSettingsSky::setMoonTextureId(LLUUID id) { mMoonTextureId = id; + setDirtyFlag(true); setLLSDDirty(); } @@ -2218,6 +2221,7 @@ LLUUID LLSettingsSky::getSunTextureId() const void LLSettingsSky::setSunTextureId(LLUUID id) { mSunTextureId = id; + setDirtyFlag(true); setLLSDDirty(); } -- cgit v1.2.3 From a99c1e36de575c008ea6f16c74cbcdb99ea29c5b Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 15 Apr 2025 20:43:36 +0300 Subject: #3887 Fix clouds not updating setSelectedEnvironment for a default transition was conflicting with updateEnvironment for an instant transition. setSelectedEnvironment already has updateEnvironment, so remove the update and fix time --- indra/newview/llenvironment.cpp | 1 - indra/newview/llfloatereditextdaycycle.cpp | 2 -- indra/newview/llfloaterenvironmentadjust.cpp | 5 +---- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp index 0017a724ea..875dac103c 100644 --- a/indra/newview/llenvironment.cpp +++ b/indra/newview/llenvironment.cpp @@ -2563,7 +2563,6 @@ void LLEnvironment::setSharedEnvironment() { clearEnvironment(LLEnvironment::ENV_LOCAL); setSelectedEnvironment(LLEnvironment::ENV_LOCAL); - updateEnvironment(); } void LLEnvironment::setExperienceEnvironment(LLUUID experience_id, LLUUID asset_id, F32 transition_time) diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp index 42307dd3f8..0a8b8d321d 100644 --- a/indra/newview/llfloatereditextdaycycle.cpp +++ b/indra/newview/llfloatereditextdaycycle.cpp @@ -495,7 +495,6 @@ void LLFloaterEditExtDayCycle::setEditDayCycle(const LLSettingsDay::ptr_t &pday) updateEditEnvironment(); LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_EDIT, LLEnvironment::TRANSITION_INSTANT); - LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_INSTANT); synchronizeTabs(); updateTabs(); refresh(); @@ -824,7 +823,6 @@ void LLFloaterEditExtDayCycle::onClearTrack() updateEditEnvironment(); LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_EDIT, LLEnvironment::TRANSITION_INSTANT); - LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_INSTANT); synchronizeTabs(); updateTabs(); refresh(); diff --git a/indra/newview/llfloaterenvironmentadjust.cpp b/indra/newview/llfloaterenvironmentadjust.cpp index 35f8340997..aa548a3f42 100644 --- a/indra/newview/llfloaterenvironmentadjust.cpp +++ b/indra/newview/llfloaterenvironmentadjust.cpp @@ -242,9 +242,7 @@ void LLFloaterEnvironmentAdjust::captureCurrentEnvironment() environment.setEnvironment(LLEnvironment::ENV_LOCAL, mLiveSky, FLOATER_ENVIRONMENT_UPDATE); environment.setEnvironment(LLEnvironment::ENV_LOCAL, mLiveWater, FLOATER_ENVIRONMENT_UPDATE); } - environment.setSelectedEnvironment(LLEnvironment::ENV_LOCAL); - environment.updateEnvironment(LLEnvironment::TRANSITION_INSTANT); - + environment.setSelectedEnvironment(LLEnvironment::ENV_LOCAL, LLEnvironment::TRANSITION_INSTANT); } void LLFloaterEnvironmentAdjust::onButtonReset() @@ -258,7 +256,6 @@ void LLFloaterEnvironmentAdjust::onButtonReset() this->closeFloater(); LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_LOCAL); LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL); - LLEnvironment::instance().updateEnvironment(); } }); -- cgit v1.2.3 From 67921fae6d9f32464b42b6b3086de109c0761532 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 16 Apr 2025 22:39:02 +0300 Subject: #3922 out_of_range crash in preeditor --- indra/llui/lllineeditor.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 66b274c33f..45dab88e87 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -2505,9 +2505,24 @@ void LLLineEditor::resetPreedit() if (hasPreeditString()) { const S32 preedit_pos = mPreeditPositions.front(); - mText.erase(preedit_pos, mPreeditPositions.back() - preedit_pos); - mText.insert(preedit_pos, mPreeditOverwrittenWString); - setCursor(preedit_pos); + const S32 end = mPreeditPositions.back(); + const S32 len = end - preedit_pos; + const S32 size = mText.length(); + if (preedit_pos < size + && end <= size + && preedit_pos >= 0 + && len > 0) + { + mText.erase(preedit_pos, len); + mText.insert(preedit_pos, mPreeditOverwrittenWString); + setCursor(preedit_pos); + } + else + { + LL_WARNS() << "Index out of bounds. Start: " << preedit_pos + << ", end:" << end + << ", full string length: " << size << LL_ENDL; + } mPreeditWString.clear(); mPreeditOverwrittenWString.clear(); -- cgit v1.2.3 From 2e4d2ddae15428002d289ea6d097cc3300d16559 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 16 Apr 2025 22:48:25 +0300 Subject: #3627 Crash on texture cache init I'm not sure if I should be crashing and logging this data to bugsplat or if I should let it be in case cache file is unreasonably big. --- indra/newview/lltexturecache.cpp | 44 +++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index be7653c011..442c627d07 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -1347,27 +1347,39 @@ U32 LLTextureCache::openAndReadEntries(std::vector& entries) } for (U32 idx=0; idxread((void*)(&entry), (S32)sizeof(Entry)); - if (bytes_read < sizeof(Entry)) + try + { + Entry entry; + S32 bytes_read = aprfile->read((void*)(&entry), (S32)sizeof(Entry)); + if (bytes_read < sizeof(Entry)) + { + LL_WARNS() << "Corrupted header entries, failed at " << idx << " / " << num_entries << LL_ENDL; + return 0; + } + entries.push_back(entry); + // LL_INFOS() << "ENTRY: " << entry.mTime << " TEX: " << entry.mID << " IDX: " << idx << " Size: " << entry.mImageSize << LL_ENDL; + if (entry.mImageSize > entry.mBodySize) + { + mHeaderIDMap[entry.mID] = idx; + mTexturesSizeMap[entry.mID] = entry.mBodySize; + mTexturesSizeTotal += entry.mBodySize; + } + else + { + mFreeList.insert(idx); + } + } + catch (std::bad_alloc&) { - LL_WARNS() << "Corrupted header entries, failed at " << idx << " / " << num_entries << LL_ENDL; + // Too little ram yet very large cache? + // Should this actually crash viewer? + entries.clear(); + LL_WARNS() << "Bad alloc trying to read texture entries from cache, mFreeList: " << (S32)mFreeList.size() + << ", added entries: " << idx << ", total entries: " << num_entries << LL_ENDL; closeHeaderEntriesFile(); purgeAllTextures(false); return 0; } - entries.push_back(entry); -// LL_INFOS() << "ENTRY: " << entry.mTime << " TEX: " << entry.mID << " IDX: " << idx << " Size: " << entry.mImageSize << LL_ENDL; - if(entry.mImageSize > entry.mBodySize) - { - mHeaderIDMap[entry.mID] = idx; - mTexturesSizeMap[entry.mID] = entry.mBodySize; - mTexturesSizeTotal += entry.mBodySize; - } - else - { - mFreeList.insert(idx); - } } closeHeaderEntriesFile(); return num_entries; -- cgit v1.2.3 From f6219fecc3a1387f56791eb31c7d83c74c90ce90 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 18 Apr 2025 16:47:08 +0300 Subject: #3696 Crash at LLFontFreetype::addGlyphFromFont --- indra/llrender/llfontfreetype.cpp | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index 649dd369cb..5f04664267 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -654,7 +654,14 @@ LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, l LLImageGL *image_gl = mFontBitmapCachep->getImageGL(bitmap_glyph_type, bitmap_num); LLImageRaw *image_raw = mFontBitmapCachep->getImageRaw(bitmap_glyph_type, bitmap_num); - image_gl->setSubImage(image_raw, 0, 0, image_gl->getWidth(), image_gl->getHeight()); + if (image_gl && image_raw) + { + image_gl->setSubImage(image_raw, 0, 0, image_gl->getWidth(), image_gl->getHeight()); + } + else + { + llassert(false); //images were just inserted by nextOpenPos, they shouldn't be missing + } return gi; } @@ -838,7 +845,12 @@ bool LLFontFreetype::setSubImageBGRA(U32 x, U32 y, U32 bitmap_num, U16 width, U1 { LLImageRaw* image_raw = mFontBitmapCachep->getImageRaw(EFontGlyphType::Color, bitmap_num); llassert(!mIsFallback); - llassert(image_raw && (image_raw->getComponents() == 4)); + if (!image_raw) + { + llassert(false); + return false; + } + llassert(image_raw->getComponents() == 4); // NOTE: inspired by LLImageRaw::setSubImage() U32* image_data = (U32*)image_raw->getData(); @@ -866,10 +878,17 @@ bool LLFontFreetype::setSubImageBGRA(U32 x, U32 y, U32 bitmap_num, U16 width, U1 void LLFontFreetype::setSubImageLuminanceAlpha(U32 x, U32 y, U32 bitmap_num, U32 width, U32 height, U8 *data, S32 stride) const { LLImageRaw *image_raw = mFontBitmapCachep->getImageRaw(EFontGlyphType::Grayscale, bitmap_num); - LLImageDataLock lock(image_raw); llassert(!mIsFallback); - llassert(image_raw && (image_raw->getComponents() == 2)); + if (!image_raw) + { + llassert(false); + return; + } + + LLImageDataLock lock(image_raw); + + llassert(image_raw->getComponents() == 2); U8 *target = image_raw->getData(); llassert(target); -- cgit v1.2.3 From 3d5f1541dd9980196ba0c8a3c3396c8ed3384d1e Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Tue, 15 Apr 2025 02:56:06 +0300 Subject: Fix llhttpdate test on windows and macos (#3909) --- indra/test/llhttpdate_tut.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/indra/test/llhttpdate_tut.cpp b/indra/test/llhttpdate_tut.cpp index a47602dec5..b580b09a9f 100644 --- a/indra/test/llhttpdate_tut.cpp +++ b/indra/test/llhttpdate_tut.cpp @@ -112,13 +112,8 @@ namespace tut void httpdate_object::test<4>() { // test localization of http dates -#if LL_WINDOWS - const char *en_locale = "english"; - const char *fr_locale = "french"; -#else - const char *en_locale = "en_GB.UTF-8"; + const char *en_locale = "en_US.UTF-8"; const char *fr_locale = "fr_FR.UTF-8"; -#endif std::string prev_locale = LLStringUtil::getLocale(); std::string prev_clocale = std::string(setlocale(LC_TIME, NULL)); -- cgit v1.2.3 From 90c7684112714fd5ca2c8d73d8ca9bef3fc1e5d6 Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Thu, 10 Apr 2025 17:57:16 +0300 Subject: #3758 add support for highlighted segments --- indra/llui/llstyle.cpp | 8 +- indra/llui/llstyle.h | 13 +++- indra/llui/lltextbase.cpp | 138 +++++++++++++++++++++++++++++++-- indra/llui/lltextbase.h | 8 +- indra/llui/llurlentry.cpp | 56 +++++++++---- indra/llui/llurlentry.h | 31 +++++--- indra/llui/llurlmatch.cpp | 10 ++- indra/llui/llurlmatch.h | 17 +++- indra/llui/llurlregistry.cpp | 11 ++- indra/newview/llappviewer.cpp | 2 +- indra/newview/llpanelprofile.cpp | 2 +- indra/newview/llstartup.cpp | 2 +- indra/newview/skins/default/colors.xml | 6 ++ 13 files changed, 247 insertions(+), 57 deletions(-) diff --git a/indra/llui/llstyle.cpp b/indra/llui/llstyle.cpp index 4714665e8b..7a0e620d61 100644 --- a/indra/llui/llstyle.cpp +++ b/indra/llui/llstyle.cpp @@ -38,11 +38,13 @@ LLStyle::Params::Params() color("color", LLColor4::black), readonly_color("readonly_color", LLColor4::black), selected_color("selected_color", LLColor4::black), + highlight_bg_color("highlight_bg_color", LLColor4::green), alpha("alpha", 1.f), font("font", LLStyle::getDefaultFont()), image("image"), link_href("href"), - is_link("is_link") + is_link("is_link"), + draw_highlight_bg("draw_highlight_bg", false) {} @@ -51,12 +53,14 @@ LLStyle::LLStyle(const LLStyle::Params& p) mColor(p.color), mReadOnlyColor(p.readonly_color), mSelectedColor(p.selected_color), + mHighlightBgColor(p.highlight_bg_color), mFont(p.font()), mLink(p.link_href), mIsLink(p.is_link.isProvided() ? p.is_link : !p.link_href().empty()), mDropShadow(p.drop_shadow), mImagep(p.image()), - mAlpha(p.alpha) + mAlpha(p.alpha), + mDrawHighlightBg(p.draw_highlight_bg) {} void LLStyle::setFont(const LLFontGL* font) diff --git a/indra/llui/llstyle.h b/indra/llui/llstyle.h index 0c78fe5a9f..2c86eb6db7 100644 --- a/indra/llui/llstyle.h +++ b/indra/llui/llstyle.h @@ -43,12 +43,14 @@ public: Optional drop_shadow; Optional color, readonly_color, - selected_color; + selected_color, + highlight_bg_color; Optional alpha; Optional font; Optional image; Optional link_href; Optional is_link; + Optional draw_highlight_bg; Params(); }; LLStyle(const Params& p = Params()); @@ -84,6 +86,9 @@ public: bool isImage() const { return mImagep.notNull(); } + bool getDrawHighlightBg() const { return mDrawHighlightBg; } + const LLUIColor& getHighlightBgColor() const { return mHighlightBgColor; } + bool operator==(const LLStyle &rhs) const { return @@ -91,11 +96,13 @@ public: && mColor == rhs.mColor && mReadOnlyColor == rhs.mReadOnlyColor && mSelectedColor == rhs.mSelectedColor + && mHighlightBgColor == rhs.mHighlightBgColor && mFont == rhs.mFont && mLink == rhs.mLink && mImagep == rhs.mImagep && mDropShadow == rhs.mDropShadow - && mAlpha == rhs.mAlpha; + && mAlpha == rhs.mAlpha + && mDrawHighlightBg == rhs.mDrawHighlightBg; } bool operator!=(const LLStyle& rhs) const { return !(*this == rhs); } @@ -112,11 +119,13 @@ private: LLUIColor mColor; LLUIColor mReadOnlyColor; LLUIColor mSelectedColor; + LLUIColor mHighlightBgColor; const LLFontGL* mFont; LLPointer mImagep; F32 mAlpha; bool mVisible; bool mIsLink; + bool mDrawHighlightBg; }; typedef LLPointer LLStyleSP; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 41e7094163..cb682a3625 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -460,6 +460,62 @@ std::vector LLTextBase::getSelectionRects() return selection_rects; } +std::vector> LLTextBase::getHighlightedBgRects() +{ + std::vector> highlight_rects; + + LLRect content_display_rect = getVisibleDocumentRect(); + + // binary search for line that starts before top of visible buffer + line_list_t::const_iterator line_iter = + std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mTop, compare_bottom()); + line_list_t::const_iterator end_iter = + std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mBottom, compare_top()); + + for (; line_iter != end_iter; ++line_iter) + { + segment_set_t::iterator segment_iter; + S32 segment_offset; + getSegmentAndOffset(line_iter->mDocIndexStart, &segment_iter, &segment_offset); + + // Use F32 otherwise a string of multiple segments + // will accumulate a large error + F32 left_precise = (F32)line_iter->mRect.mLeft; + F32 right_precise = (F32)line_iter->mRect.mLeft; + + for (; segment_iter != mSegments.end(); ++segment_iter) + { + LLTextSegmentPtr segmentp = *segment_iter; + + S32 segment_line_start = segmentp->getStart() + segment_offset; + S32 segment_line_end = llmin(segmentp->getEnd(), line_iter->mDocIndexEnd); + + if (segment_line_start > segment_line_end) + break; + + F32 segment_width = 0; + S32 segment_height = 0; + + S32 num_chars = segment_line_end - segment_line_start; + segmentp->getDimensionsF32(segment_offset, num_chars, segment_width, segment_height); + right_precise += segment_width; + + if (segmentp->getStyle()->getDrawHighlightBg()) + { + LLRect selection_rect; + selection_rect.mLeft = (S32)left_precise; + selection_rect.mRight = (S32)right_precise; + selection_rect.mBottom = line_iter->mRect.mBottom; + selection_rect.mTop = line_iter->mRect.mTop; + + highlight_rects.push_back(std::pair(selection_rect, segmentp->getStyle()->getHighlightBgColor())); + } + left_precise += segment_width; + } + } + return highlight_rects; +} + // Draws the black box behind the selected text void LLTextBase::drawSelectionBackground() { @@ -529,6 +585,71 @@ void LLTextBase::drawSelectionBackground() } } +void LLTextBase::drawHighlightedBackground() +{ + if (!mLineInfoList.empty()) + { + std::vector> highlight_rects = getHighlightedBgRects(); + + if (highlight_rects.empty()) + return; + + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + + LLRect content_display_rect = getVisibleDocumentRect(); + + for (std::vector>::iterator rect_it = highlight_rects.begin(); + rect_it != highlight_rects.end(); ++rect_it) + { + LLRect selection_rect = rect_it->first; + const LLColor4& color = rect_it->second; + if (mScroller) + { + // If scroller is On content_display_rect has correct rect and safe to use as is + // Note: we might need to account for border + selection_rect.translate(mVisibleTextRect.mLeft - content_display_rect.mLeft, mVisibleTextRect.mBottom - content_display_rect.mBottom); + } + else + { + // If scroller is Off content_display_rect will have rect from document, adjusted to text width, heigh and position + // and we have to acount for offset depending on position + S32 v_delta = 0; + S32 h_delta = 0; + switch (mVAlign) + { + case LLFontGL::TOP: + v_delta = mVisibleTextRect.mTop - content_display_rect.mTop - mVPad; + break; + case LLFontGL::VCENTER: + v_delta = (llmax(mVisibleTextRect.getHeight() - content_display_rect.mTop, -content_display_rect.mBottom) + (mVisibleTextRect.mBottom - content_display_rect.mBottom)) / 2; + break; + case LLFontGL::BOTTOM: + v_delta = mVisibleTextRect.mBottom - content_display_rect.mBottom; + break; + default: + break; + } + switch (mHAlign) + { + case LLFontGL::LEFT: + h_delta = mVisibleTextRect.mLeft - content_display_rect.mLeft + mHPad; + break; + case LLFontGL::HCENTER: + h_delta = (llmax(mVisibleTextRect.getWidth() - content_display_rect.mLeft, -content_display_rect.mRight) + (mVisibleTextRect.mRight - content_display_rect.mRight)) / 2; + break; + case LLFontGL::RIGHT: + h_delta = mVisibleTextRect.mRight - content_display_rect.mRight; + break; + default: + break; + } + selection_rect.translate(h_delta, v_delta); + } + gl_rect_2d(selection_rect, color); + } + } +} + void LLTextBase::drawCursor() { F32 alpha = getDrawContext().mAlpha; @@ -1399,6 +1520,7 @@ void LLTextBase::draw() drawChild(mDocumentView); } + drawHighlightedBackground(); drawSelectionBackground(); drawText(); drawCursor(); @@ -2245,7 +2367,7 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para } // output the styled Url - appendAndHighlightTextImpl(match.getLabel(), part, link_params, match.underlineOnHoverOnly()); + appendAndHighlightTextImpl(match.getLabel(), part, link_params, match.getUnderline()); bool tooltip_required = !match.getTooltip().empty(); // set the tooltip for the Url label @@ -2260,7 +2382,7 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para { link_params.color = LLColor4::grey; link_params.readonly_color = LLColor4::grey; - appendAndHighlightTextImpl(label, part, link_params, match.underlineOnHoverOnly()); + appendAndHighlightTextImpl(label, part, link_params, match.getUnderline()); // set the tooltip for the query part of url if (tooltip_required) @@ -2428,7 +2550,7 @@ void LLTextBase::appendWidget(const LLInlineViewSegment::Params& params, const s insertStringNoUndo(getLength(), widget_wide_text, &segments); } -void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, bool underline_on_hover_only) +void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, e_underline underline_link) { // Save old state S32 selection_start = mSelectionStart; @@ -2458,7 +2580,7 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig S32 cur_length = getLength(); LLStyleConstSP sp(new LLStyle(highlight_params)); LLTextSegmentPtr segmentp; - if (underline_on_hover_only || mSkipLinkUnderline) + if ((underline_link == e_underline::UNDERLINE_ON_HOVER) || mSkipLinkUnderline) { highlight_params.font.style("NORMAL"); LLStyleConstSP normal_sp(new LLStyle(highlight_params)); @@ -2482,7 +2604,7 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig S32 segment_start = old_length; S32 segment_end = old_length + static_cast(wide_text.size()); LLStyleConstSP sp(new LLStyle(style_params)); - if (underline_on_hover_only || mSkipLinkUnderline) + if ((underline_link == e_underline::UNDERLINE_ON_HOVER) || mSkipLinkUnderline) { LLStyle::Params normal_style_params(style_params); normal_style_params.font.style("NORMAL"); @@ -2516,7 +2638,7 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig } } -void LLTextBase::appendAndHighlightText(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, bool underline_on_hover_only) +void LLTextBase::appendAndHighlightText(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, e_underline underline_link) { if (new_text.empty()) { @@ -2531,7 +2653,7 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, S32 highlig if (pos != start) { std::string str = std::string(new_text,start,pos-start); - appendAndHighlightTextImpl(str, highlight_part, style_params, underline_on_hover_only); + appendAndHighlightTextImpl(str, highlight_part, style_params, underline_link); } appendLineBreakSegment(style_params); start = pos+1; @@ -2539,7 +2661,7 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, S32 highlig } std::string str = std::string(new_text, start, new_text.length() - start); - appendAndHighlightTextImpl(str, highlight_part, style_params, underline_on_hover_only); + appendAndHighlightTextImpl(str, highlight_part, style_params, underline_link); } diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 76d4e160af..fa8d22c819 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -35,6 +35,7 @@ #include "llstyle.h" #include "llkeywords.h" #include "llpanel.h" +#include "llurlmatch.h" #include #include @@ -607,6 +608,7 @@ protected: bool operator()(const LLTextSegmentPtr& a, const LLTextSegmentPtr& b) const; }; typedef std::multiset segment_set_t; + typedef LLUrlMatch::EUnderlineLink e_underline; // member functions LLTextBase(const Params &p); @@ -620,12 +622,13 @@ protected: virtual void drawSelectionBackground(); // draws the black box behind the selected text void drawCursor(); void drawText(); + void drawHighlightedBackground(); // modify contents S32 insertStringNoUndo(S32 pos, const LLWString &wstr, segment_vec_t* segments = NULL); // returns num of chars actually inserted S32 removeStringNoUndo(S32 pos, S32 length); S32 overwriteCharNoUndo(S32 pos, llwchar wc); - void appendAndHighlightText(const std::string &new_text, S32 highlight_part, const LLStyle::Params& stylep, bool underline_on_hover_only = false); + void appendAndHighlightText(const std::string &new_text, S32 highlight_part, const LLStyle::Params& stylep, e_underline underline_link = e_underline::UNDERLINE_ALWAYS); // manage segments @@ -674,7 +677,7 @@ protected: void replaceUrl(const std::string &url, const std::string &label, const std::string& icon); void appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params = LLStyle::Params()); - void appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, bool underline_on_hover_only = false); + void appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, e_underline underline_link = e_underline::UNDERLINE_ALWAYS); S32 normalizeUri(std::string& uri); protected: @@ -685,6 +688,7 @@ protected: } std::vector getSelectionRects(); + std::vector> getHighlightedBgRects(); protected: // text segmentation and flow diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 77f132e9d8..ce5ff0ff75 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -29,7 +29,6 @@ #include "llurlentry.h" #include "lluictrl.h" #include "lluri.h" -#include "llurlmatch.h" #include "llurlregistry.h" #include "lluriparser.h" @@ -48,7 +47,7 @@ // Utility functions std::string localize_slapp_label(const std::string& url, const std::string& full_name); - +LLUUID LLUrlEntryBase::sAgentID(LLUUID::null); LLUrlEntryBase::LLUrlEntryBase() { } @@ -68,7 +67,7 @@ std::string LLUrlEntryBase::getIcon(const std::string &url) return mIcon; } -LLStyle::Params LLUrlEntryBase::getStyle() const +LLStyle::Params LLUrlEntryBase::getStyle(const std::string &url) const { LLStyle::Params style_params; style_params.color = LLUIColorTable::instance().getColor("HTMLLinkColor"); @@ -667,10 +666,24 @@ std::string LLUrlEntryAgent::getTooltip(const std::string &string) const return LLTrans::getString("TooltipAgentUrl"); } -bool LLUrlEntryAgent::underlineOnHoverOnly(const std::string &string) const +LLUrlMatch::EUnderlineLink LLUrlEntryAgent::getUnderline(const std::string& string) const { std::string url = getUrl(string); - return LLStringUtil::endsWith(url, "/about") || LLStringUtil::endsWith(url, "/inspect"); + if (LLStringUtil::endsWith(url, "/about") || LLStringUtil::endsWith(url, "/inspect")) + { + return LLUrlMatch::EUnderlineLink::UNDERLINE_ON_HOVER; + } + else if (LLStringUtil::endsWith(url, "/mention")) + { + return LLUrlMatch::EUnderlineLink::UNDERLINE_NEVER; + } + return LLUrlMatch::EUnderlineLink::UNDERLINE_ALWAYS; +} + +bool LLUrlEntryAgent::getSkipProfileIcon(const std::string& string) const +{ + std::string url = getUrl(string); + return (LLStringUtil::endsWith(url, "/mention")) ? true : false; } std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCallback &cb) @@ -712,11 +725,19 @@ std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCa } } -LLStyle::Params LLUrlEntryAgent::getStyle() const +LLStyle::Params LLUrlEntryAgent::getStyle(const std::string &url) const { - LLStyle::Params style_params = LLUrlEntryBase::getStyle(); + LLStyle::Params style_params = LLUrlEntryBase::getStyle(url); style_params.color = LLUIColorTable::instance().getColor("HTMLLinkColor"); style_params.readonly_color = LLUIColorTable::instance().getColor("HTMLLinkColor"); + if (LLStringUtil::endsWith(url, "/mention")) + { + style_params.font.style = "NORMAL"; + style_params.draw_highlight_bg = true; + + LLUUID agent_id(getIDStringFromUrl(url)); + style_params.highlight_bg_color = LLUIColorTable::instance().getColor((agent_id == sAgentID) ? "ChatSelfMentionHighlight" : "ChatMentionHighlight"); + } return style_params; } @@ -751,6 +772,10 @@ std::string localize_slapp_label(const std::string& url, const std::string& full { return LLTrans::getString("SLappAgentRemoveFriend") + " " + full_name; } + if (LLStringUtil::endsWith(url, "/mention")) + { + return "@" + full_name; + } return full_name; } @@ -823,7 +848,7 @@ std::string LLUrlEntryAgentName::getLabel(const std::string &url, const LLUrlLab } } -LLStyle::Params LLUrlEntryAgentName::getStyle() const +LLStyle::Params LLUrlEntryAgentName::getStyle(const std::string &url) const { // don't override default colors return LLStyle::Params().is_link(false); @@ -959,9 +984,9 @@ std::string LLUrlEntryGroup::getLabel(const std::string &url, const LLUrlLabelCa } } -LLStyle::Params LLUrlEntryGroup::getStyle() const +LLStyle::Params LLUrlEntryGroup::getStyle(const std::string &url) const { - LLStyle::Params style_params = LLUrlEntryBase::getStyle(); + LLStyle::Params style_params = LLUrlEntryBase::getStyle(url); style_params.color = LLUIColorTable::instance().getColor("HTMLLinkColor"); style_params.readonly_color = LLUIColorTable::instance().getColor("HTMLLinkColor"); return style_params; @@ -1037,7 +1062,6 @@ std::string LLUrlEntryChat::getLabel(const std::string &url, const LLUrlLabelCal } // LLUrlEntryParcel statics. -LLUUID LLUrlEntryParcel::sAgentID(LLUUID::null); LLUUID LLUrlEntryParcel::sSessionID(LLUUID::null); LLHost LLUrlEntryParcel::sRegionHost; bool LLUrlEntryParcel::sDisconnected(false); @@ -1371,17 +1395,17 @@ std::string LLUrlEntrySLLabel::getTooltip(const std::string &string) const return LLUrlEntryBase::getTooltip(string); } -bool LLUrlEntrySLLabel::underlineOnHoverOnly(const std::string &string) const +LLUrlMatch::EUnderlineLink LLUrlEntrySLLabel::getUnderline(const std::string& string) const { std::string url = getUrl(string); - LLUrlMatch match; + LLUrlMatch match; if (LLUrlRegistry::instance().findUrl(url, match)) { - return match.underlineOnHoverOnly(); + return match.getUnderline(); } // unrecognized URL? should not happen - return LLUrlEntryBase::underlineOnHoverOnly(string); + return LLUrlEntryBase::getUnderline(string); } // @@ -1445,7 +1469,7 @@ std::string LLUrlEntryNoLink::getLabel(const std::string &url, const LLUrlLabelC return getUrl(url); } -LLStyle::Params LLUrlEntryNoLink::getStyle() const +LLStyle::Params LLUrlEntryNoLink::getStyle(const std::string &url) const { // Don't render as URL (i.e. no context menu or hand cursor). return LLStyle::Params().is_link(false); diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index fffee88496..af5b8f5d83 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -34,6 +34,7 @@ #include "llavatarname.h" #include "llhost.h" // for resolving parcel name by parcel id +#include "llurlmatch.h" #include #include @@ -85,7 +86,7 @@ public: virtual std::string getIcon(const std::string &url); /// Return the style to render the displayed text - virtual LLStyle::Params getStyle() const; + virtual LLStyle::Params getStyle(const std::string &url) const; /// Given a matched Url, return a tooltip string for the hyperlink virtual std::string getTooltip(const std::string &string) const { return mTooltip; } @@ -96,11 +97,12 @@ public: /// Return the name of a SL location described by this Url, if any virtual std::string getLocation(const std::string &url) const { return ""; } - /// Should this link text be underlined only when mouse is hovered over it? - virtual bool underlineOnHoverOnly(const std::string &string) const { return false; } + virtual LLUrlMatch::EUnderlineLink getUnderline(const std::string& string) const { return LLUrlMatch::EUnderlineLink::UNDERLINE_ALWAYS; } virtual bool isTrusted() const { return false; } + virtual bool getSkipProfileIcon(const std::string& string) const { return false; } + virtual LLUUID getID(const std::string &string) const { return LLUUID::null; } bool isLinkDisabled() const; @@ -109,6 +111,8 @@ public: virtual bool isSLURLvalid(const std::string &url) const { return true; }; + static void setAgentID(const LLUUID& id) { sAgentID = id; } + protected: std::string getIDStringFromUrl(const std::string &url) const; std::string escapeUrl(const std::string &url) const; @@ -130,6 +134,8 @@ protected: std::string mMenuName; std::string mTooltip; std::multimap mObservers; + + static LLUUID sAgentID; }; /// @@ -224,9 +230,12 @@ public: /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); /*virtual*/ std::string getIcon(const std::string &url); /*virtual*/ std::string getTooltip(const std::string &string) const; - /*virtual*/ LLStyle::Params getStyle() const; + /*virtual*/ LLStyle::Params getStyle(const std::string &url) const; /*virtual*/ LLUUID getID(const std::string &string) const; - /*virtual*/ bool underlineOnHoverOnly(const std::string &string) const; + + LLUrlMatch::EUnderlineLink getUnderline(const std::string& string) const; + bool getSkipProfileIcon(const std::string& string) const; + protected: /*virtual*/ void callObservers(const std::string &id, const std::string &label, const std::string& icon); private: @@ -257,7 +266,7 @@ public: mAvatarNameCacheConnections.clear(); } /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); - /*virtual*/ LLStyle::Params getStyle() const; + /*virtual*/ LLStyle::Params getStyle(const std::string &url) const; protected: // override this to pull out relevant name fields virtual std::string getName(const LLAvatarName& avatar_name) = 0; @@ -339,7 +348,7 @@ class LLUrlEntryGroup : public LLUrlEntryBase public: LLUrlEntryGroup(); /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); - /*virtual*/ LLStyle::Params getStyle() const; + /*virtual*/ LLStyle::Params getStyle(const std::string &url) const; /*virtual*/ LLUUID getID(const std::string &string) const; private: void onGroupNameReceived(const LLUUID& id, const std::string& name, bool is_group); @@ -411,17 +420,15 @@ public: // Processes parcel label and triggers notifying observers. static void processParcelInfo(const LLParcelData& parcel_data); - // Next 4 setters are used to update agent and viewer connection information + // Next setters are used to update agent and viewer connection information // upon events like user login, viewer disconnect and user changing region host. // These setters are made public to be accessible from newview and should not be // used in other cases. - static void setAgentID(const LLUUID& id) { sAgentID = id; } static void setSessionID(const LLUUID& id) { sSessionID = id; } static void setRegionHost(const LLHost& host) { sRegionHost = host; } static void setDisconnected(bool disconnected) { sDisconnected = disconnected; } private: - static LLUUID sAgentID; static LLUUID sSessionID; static LLHost sRegionHost; static bool sDisconnected; @@ -486,7 +493,7 @@ public: /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); /*virtual*/ std::string getUrl(const std::string &string) const; /*virtual*/ std::string getTooltip(const std::string &string) const; - /*virtual*/ bool underlineOnHoverOnly(const std::string &string) const; + LLUrlMatch::EUnderlineLink getUnderline(const std::string& string) const; }; /// @@ -510,7 +517,7 @@ public: LLUrlEntryNoLink(); /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); /*virtual*/ std::string getUrl(const std::string &string) const; - /*virtual*/ LLStyle::Params getStyle() const; + /*virtual*/ LLStyle::Params getStyle(const std::string &url) const; }; /// diff --git a/indra/llui/llurlmatch.cpp b/indra/llui/llurlmatch.cpp index bfa3b167b1..3e61abe118 100644 --- a/indra/llui/llurlmatch.cpp +++ b/indra/llui/llurlmatch.cpp @@ -37,8 +37,9 @@ LLUrlMatch::LLUrlMatch() : mIcon(""), mMenuName(""), mLocation(""), - mUnderlineOnHoverOnly(false), - mTrusted(false) + mUnderline(UNDERLINE_ALWAYS), + mTrusted(false), + mSkipProfileIcon(false) { } @@ -46,7 +47,7 @@ void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url, const std const std::string& query, const std::string &tooltip, const std::string &icon, const LLStyle::Params& style, const std::string &menu, const std::string &location, - const LLUUID& id, bool underline_on_hover_only, bool trusted) + const LLUUID& id, EUnderlineLink underline, bool trusted, bool skip_icon) { mStart = start; mEnd = end; @@ -60,6 +61,7 @@ void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url, const std mMenuName = menu; mLocation = location; mID = id; - mUnderlineOnHoverOnly = underline_on_hover_only; + mUnderline = underline; mTrusted = trusted; + mSkipProfileIcon = skip_icon; } diff --git a/indra/llui/llurlmatch.h b/indra/llui/llurlmatch.h index ba822fbda6..b05b3f2c82 100644 --- a/indra/llui/llurlmatch.h +++ b/indra/llui/llurlmatch.h @@ -47,6 +47,13 @@ class LLUrlMatch public: LLUrlMatch(); + enum EUnderlineLink + { + UNDERLINE_ALWAYS = 0, + UNDERLINE_ON_HOVER, + UNDERLINE_NEVER + }; + /// return true if this object does not contain a valid Url match yet bool empty() const { return mUrl.empty(); } @@ -80,18 +87,19 @@ public: /// return the SL location that this Url describes, or "" if none. std::string getLocation() const { return mLocation; } - /// Should this link text be underlined only when mouse is hovered over it? - bool underlineOnHoverOnly() const { return mUnderlineOnHoverOnly; } + EUnderlineLink getUnderline() const { return mUnderline; } /// Return true if Url is trusted. bool isTrusted() const { return mTrusted; } + bool getSkipProfileIcon() const { return mSkipProfileIcon; } + /// Change the contents of this match object (used by LLUrlRegistry) void setValues(U32 start, U32 end, const std::string &url, const std::string &label, const std::string& query, const std::string &tooltip, const std::string &icon, const LLStyle::Params& style, const std::string &menu, const std::string &location, const LLUUID& id, - bool underline_on_hover_only = false, bool trusted = false); + EUnderlineLink underline = UNDERLINE_ALWAYS, bool trusted = false, bool skip_icon = false); const LLUUID& getID() const { return mID; } private: @@ -106,8 +114,9 @@ private: std::string mLocation; LLUUID mID; LLStyle::Params mStyle; - bool mUnderlineOnHoverOnly; + EUnderlineLink mUnderline; bool mTrusted; + bool mSkipProfileIcon; }; #endif diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index cec1ddfc57..6e6e3be9b4 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -233,12 +233,13 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL match_entry->getQuery(url), match_entry->getTooltip(url), match_entry->getIcon(url), - match_entry->getStyle(), + match_entry->getStyle(url), match_entry->getMenuName(), match_entry->getLocation(url), match_entry->getID(url), - match_entry->underlineOnHoverOnly(url), - match_entry->isTrusted()); + match_entry->getUnderline(url), + match_entry->isTrusted(), + match_entry->getSkipProfileIcon(url)); return true; } @@ -274,7 +275,9 @@ bool LLUrlRegistry::findUrl(const LLWString &text, LLUrlMatch &match, const LLUr match.getMenuName(), match.getLocation(), match.getID(), - match.underlineOnHoverOnly()); + match.getUnderline(), + false, + match.getSkipProfileIcon()); return true; } return false; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index edc70030b4..7e7aa521d3 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -475,7 +475,7 @@ static void deferred_ui_audio_callback(const LLUUID& uuid) bool create_text_segment_icon_from_url_match(LLUrlMatch* match,LLTextBase* base) { - if(!match || !base || base->getPlainText()) + if (!match || match->getSkipProfileIcon() || !base || base->getPlainText()) return false; LLUUID match_id = match->getID(); diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index 08605f7cf4..c81746a48a 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -328,7 +328,7 @@ public: } const std::string verb = params[1].asString(); - if (verb == "about") + if (verb == "about" || verb == "mention") { LLAvatarActions::showProfile(avatar_id); return true; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 3973036cc6..4f60f98b49 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -3566,7 +3566,7 @@ bool process_login_success_response() // Agent id needed for parcel info request in LLUrlEntryParcel // to resolve parcel name. - LLUrlEntryParcel::setAgentID(gAgentID); + LLUrlEntryBase::setAgentID(gAgentID); text = response["session_id"].asString(); if(!text.empty()) gAgentSessionID.set(text); diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index f0af4acf20..cb190d3d34 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -1000,4 +1000,10 @@ + + -- cgit v1.2.3 From 3e46d707a243e91046b3ab0af8f844d7f40f77b4 Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Fri, 18 Apr 2025 17:48:02 +0300 Subject: #3758 initial chat mention support --- indra/llui/CMakeLists.txt | 2 + indra/llui/llchatentry.cpp | 19 +++ indra/llui/llchatentry.h | 2 + indra/llui/llchatmentionhelper.cpp | 151 +++++++++++++++++ indra/llui/llchatmentionhelper.h | 66 ++++++++ indra/llui/llflatlistview.cpp | 6 +- indra/llui/llflatlistview.h | 4 + indra/llui/lltextbase.cpp | 4 +- indra/llui/lltextbase.h | 2 +- indra/llui/lltexteditor.cpp | 50 +++++- indra/llui/lltexteditor.h | 4 + indra/llui/llurlentry.cpp | 4 +- indra/newview/CMakeLists.txt | 2 + indra/newview/llavatarlist.cpp | 18 +- indra/newview/llavatarlist.h | 7 +- indra/newview/llavatarlistitem.cpp | 17 +- indra/newview/llavatarlistitem.h | 3 +- indra/newview/llfloaterchatmentionpicker.cpp | 183 +++++++++++++++++++++ indra/newview/llfloaterchatmentionpicker.h | 58 +++++++ indra/newview/llfloaterimnearbychat.cpp | 2 +- indra/newview/llfloaterimsession.cpp | 2 +- indra/newview/llfloaterimsessiontab.cpp | 2 + indra/newview/llviewerfloaterreg.cpp | 2 + .../default/xui/en/floater_chat_mention_picker.xml | 31 ++++ 24 files changed, 617 insertions(+), 24 deletions(-) create mode 100644 indra/llui/llchatmentionhelper.cpp create mode 100644 indra/llui/llchatmentionhelper.h create mode 100644 indra/newview/llfloaterchatmentionpicker.cpp create mode 100644 indra/newview/llfloaterchatmentionpicker.h create mode 100644 indra/newview/skins/default/xui/en/floater_chat_mention_picker.xml diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index a0314cb5f2..908e94b24c 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -18,6 +18,7 @@ set(llui_SOURCE_FILES llbadgeowner.cpp llbutton.cpp llchatentry.cpp + llchatmentionhelper.cpp llcheckboxctrl.cpp llclipboard.cpp llcombobox.cpp @@ -130,6 +131,7 @@ set(llui_HEADER_FILES llcallbackmap.h llchatentry.h llchat.h + llchatmentionhelper.h llcheckboxctrl.h llclipboard.h llcombobox.h diff --git a/indra/llui/llchatentry.cpp b/indra/llui/llchatentry.cpp index da5afd0386..55e4beafb6 100644 --- a/indra/llui/llchatentry.cpp +++ b/indra/llui/llchatentry.cpp @@ -51,6 +51,7 @@ LLChatEntry::LLChatEntry(const Params& p) mCurrentHistoryLine = mLineHistory.begin(); mAutoIndent = false; + mShowChatMentionPicker = true; keepSelectionOnReturn(true); } @@ -249,3 +250,21 @@ void LLChatEntry::enableSingleLineMode(bool single_line_mode) mPrevLinesCount = -1; setWordWrap(!single_line_mode); } + +LLWString LLChatEntry::getConvertedText() const +{ + LLWString text = getWText(); + S32 diff = 0; + for (auto segment : mSegments) + { + if (segment && segment->getStyle() && segment->getStyle()->getDrawHighlightBg()) + { + S32 seg_length = segment->getEnd() - segment->getStart(); + std::string slurl = segment->getStyle()->getLinkHREF(); + + text.replace(segment->getStart() + diff, seg_length, utf8str_to_wstring(slurl)); + diff += (S32)slurl.size() - seg_length; + } + } + return text; +} diff --git a/indra/llui/llchatentry.h b/indra/llui/llchatentry.h index 5621ede1e7..bb5eb8024d 100644 --- a/indra/llui/llchatentry.h +++ b/indra/llui/llchatentry.h @@ -68,6 +68,8 @@ public: void enableSingleLineMode(bool single_line_mode); boost::signals2::connection setTextExpandedCallback(const commit_signal_t::slot_type& cb); + LLWString getConvertedText() const; + private: /** diff --git a/indra/llui/llchatmentionhelper.cpp b/indra/llui/llchatmentionhelper.cpp new file mode 100644 index 0000000000..98d846b947 --- /dev/null +++ b/indra/llui/llchatmentionhelper.cpp @@ -0,0 +1,151 @@ +/** +* @file llchatmentionhelper.cpp +* +* $LicenseInfo:firstyear=2025&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2025, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ + +#include "linden_common.h" + +#include "llchatmentionhelper.h" +#include "llfloater.h" +#include "llfloaterreg.h" +#include "lluictrl.h" + +constexpr char CHAT_MENTION_HELPER_FLOATER[] = "chat_mention_picker"; + +bool LLChatMentionHelper::isActive(const LLUICtrl* ctrl) const +{ + return mHostHandle.get() == ctrl; +} + +bool LLChatMentionHelper::isCursorInNameMention(const LLWString& wtext, S32 cursor_pos, S32* mention_start_pos) +{ + if (cursor_pos <= 0 || cursor_pos > static_cast(wtext.size())) + return false; + + // Find the beginning of the current word + S32 start = cursor_pos - 1; + while (start > 0 && wtext[start - 1] != U32(' ') && wtext[start - 1] != U32('\n')) + { + --start; + } + + if (wtext[start] != U32('@')) + return false; + + if (mention_start_pos) + *mention_start_pos = start; + + S32 word_length = cursor_pos - start; + + if (word_length == 1) + { + return true; + } + + // Get the name after '@' + std::string name = wstring_to_utf8str(wtext.substr(start + 1, word_length - 1)); + LLStringUtil::toLower(name); + for (const auto& av_name : mAvatarNames) + { + if (av_name == name || av_name.find(name) == 0) + { + return true; + } + } + + return false; +} + +void LLChatMentionHelper::showHelper(LLUICtrl* host_ctrl, S32 local_x, S32 local_y, const std::string& av_name, std::function cb) +{ + if (mHelperHandle.isDead()) + { + LLFloater* av_picker_floater = LLFloaterReg::getInstance(CHAT_MENTION_HELPER_FLOATER); + mHelperHandle = av_picker_floater->getHandle(); + mHelperCommitConn = av_picker_floater->setCommitCallback([&](LLUICtrl* ctrl, const LLSD& param) { onCommitName(param.asString()); }); + } + setHostCtrl(host_ctrl); + mNameCommitCb = cb; + + S32 floater_x, floater_y; + if (!host_ctrl->localPointToOtherView(local_x, local_y, &floater_x, &floater_y, gFloaterView)) + { + LL_WARNS() << "Cannot show helper for non-floater controls." << LL_ENDL; + return; + } + + LLFloater* av_picker_floater = mHelperHandle.get(); + LLRect rect = av_picker_floater->getRect(); + rect.setLeftTopAndSize(floater_x, floater_y + rect.getHeight(), rect.getWidth(), rect.getHeight()); + av_picker_floater->setRect(rect); + av_picker_floater->openFloater(LLSD().with("av_name", av_name)); +} + +void LLChatMentionHelper::hideHelper(const LLUICtrl* ctrl) +{ + if ((ctrl && !isActive(ctrl))) + { + return; + } + setHostCtrl(nullptr); +} + +bool LLChatMentionHelper::handleKey(const LLUICtrl* ctrl, KEY key, MASK mask) +{ + if (mHelperHandle.isDead() || !isActive(ctrl)) + { + return false; + } + + return mHelperHandle.get()->handleKey(key, mask, true); +} + +void LLChatMentionHelper::onCommitName(std::string name_url) +{ + if (!mHostHandle.isDead() && mNameCommitCb) + { + mNameCommitCb(name_url); + } +} + +void LLChatMentionHelper::setHostCtrl(LLUICtrl* host_ctrl) +{ + const LLUICtrl* pCurHostCtrl = mHostHandle.get(); + if (pCurHostCtrl != host_ctrl) + { + mHostCtrlFocusLostConn.disconnect(); + mHostHandle.markDead(); + mNameCommitCb = {}; + + if (!mHelperHandle.isDead()) + { + mHelperHandle.get()->closeFloater(); + } + + if (host_ctrl) + { + mHostHandle = host_ctrl->getHandle(); + mHostCtrlFocusLostConn = host_ctrl->setFocusLostCallback(std::bind([&]() { hideHelper(getHostCtrl()); })); + } + } +} diff --git a/indra/llui/llchatmentionhelper.h b/indra/llui/llchatmentionhelper.h new file mode 100644 index 0000000000..4da8c8264e --- /dev/null +++ b/indra/llui/llchatmentionhelper.h @@ -0,0 +1,66 @@ +/** +* @file llchatmentionhelper.h +* @brief Header file for LLChatMentionHelper +* +* $LicenseInfo:firstyear=2025&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2025, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ + +#pragma once + +#include "llhandle.h" +#include "llsingleton.h" + +#include + +class LLFloater; +class LLUICtrl; + +class LLChatMentionHelper : public LLSingleton +{ + LLSINGLETON(LLChatMentionHelper) {} + ~LLChatMentionHelper() override {} + +public: + + bool isActive(const LLUICtrl* ctrl) const; + bool isCursorInNameMention(const LLWString& wtext, S32 cursor_pos, S32* mention_start_pos = nullptr); + void showHelper(LLUICtrl* host_ctrl, S32 local_x, S32 local_y, const std::string& av_name, std::function commit_cb); + void hideHelper(const LLUICtrl* ctrl = nullptr); + + bool handleKey(const LLUICtrl* ctrl, KEY key, MASK mask); + void onCommitName(std::string name_url); + + void updateAvatarList(std::vector av_names) { mAvatarNames = av_names; } + +protected: + void setHostCtrl(LLUICtrl* host_ctrl); + LLUICtrl* getHostCtrl() const { return mHostHandle.get(); } + +private: + LLHandle mHostHandle; + LLHandle mHelperHandle; + boost::signals2::connection mHostCtrlFocusLostConn; + boost::signals2::connection mHelperCommitConn; + std::function mNameCommitCb; + + std::vector mAvatarNames; +}; diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp index 53f39766c6..25fe9f2556 100644 --- a/indra/llui/llflatlistview.cpp +++ b/indra/llui/llflatlistview.cpp @@ -459,6 +459,7 @@ LLFlatListView::LLFlatListView(const LLFlatListView::Params& p) , mNoItemsCommentTextbox(NULL) , mIsConsecutiveSelection(false) , mKeepSelectionVisibleOnReshape(p.keep_selection_visible_on_reshape) + , mFocusOnItemClicked(true) { mBorderThickness = getBorderWidth(); @@ -610,7 +611,10 @@ void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask) return; } - setFocus(true); + if (mFocusOnItemClicked) + { + setFocus(true); + } bool select_item = !isSelected(item_pair); diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h index 6d75e9f282..2a06ded5cb 100644 --- a/indra/llui/llflatlistview.h +++ b/indra/llui/llflatlistview.h @@ -299,6 +299,8 @@ public: virtual S32 notify(const LLSD& info) ; + void setFocusOnItemClicked(bool b) { mFocusOnItemClicked = b; } + virtual ~LLFlatListView(); protected: @@ -423,6 +425,8 @@ private: bool mKeepSelectionVisibleOnReshape; + bool mFocusOnItemClicked; + /** All pairs of the list */ pairs_list_t mItemPairs; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index cb682a3625..5f62763683 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -2322,14 +2322,14 @@ static LLUIImagePtr image_from_icon_name(const std::string& icon_name) } -void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params) +void LLTextBase::appendTextImpl(const std::string& new_text, const LLStyle::Params& input_params, bool force_slurl) { LL_PROFILE_ZONE_SCOPED_CATEGORY_UI; LLStyle::Params style_params(getStyleParams()); style_params.overwriteFrom(input_params); S32 part = (S32)LLTextParser::WHOLE; - if (mParseHTML && !style_params.is_link) // Don't search for URLs inside a link segment (STORM-358). + if ((mParseHTML || force_slurl) && !style_params.is_link) // Don't search for URLs inside a link segment (STORM-358). { S32 start=0,end=0; LLUrlMatch match; diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index fa8d22c819..a2895e6bd6 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -676,7 +676,7 @@ protected: // avatar names are looked up. void replaceUrl(const std::string &url, const std::string &label, const std::string& icon); - void appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params = LLStyle::Params()); + void appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params = LLStyle::Params(), bool force_slurl = false); void appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, e_underline underline_link = e_underline::UNDERLINE_ALWAYS); S32 normalizeUri(std::string& uri); diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index fe4cce29ab..bd726c3d49 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -60,6 +60,7 @@ #include "llurlregistry.h" #include "lltooltip.h" #include "llmenugl.h" +#include "llchatmentionhelper.h" #include #include "llcombobox.h" @@ -270,6 +271,7 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) : mPrevalidator(p.prevalidator()), mShowContextMenu(p.show_context_menu), mShowEmojiHelper(p.show_emoji_helper), + mShowChatMentionPicker(false), mEnableTooltipPaste(p.enable_tooltip_paste), mPassDelete(false), mKeepSelectionOnReturn(false) @@ -714,6 +716,18 @@ void LLTextEditor::handleEmojiCommit(llwchar emoji) } } +void LLTextEditor::handleMentionCommit(std::string name_url) +{ + S32 mention_start_pos; + if (LLChatMentionHelper::instance().isCursorInNameMention(getWText(), mCursorPos, &mention_start_pos)) + { + remove(mention_start_pos, mCursorPos - mention_start_pos, true); + setCursorPos(mention_start_pos); + + appendTextImpl(name_url, LLStyle::Params(), true); + } +} + bool LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask) { bool handled = false; @@ -1103,6 +1117,7 @@ void LLTextEditor::removeCharOrTab() } tryToShowEmojiHelper(); + tryToShowMentionHelper(); } else { @@ -1128,6 +1143,7 @@ void LLTextEditor::removeChar() setCursorPos(mCursorPos - 1); removeChar(mCursorPos); tryToShowEmojiHelper(); + tryToShowMentionHelper(); } else { @@ -1189,6 +1205,7 @@ void LLTextEditor::addChar(llwchar wc) setCursorPos(mCursorPos + addChar( mCursorPos, wc )); tryToShowEmojiHelper(); + tryToShowMentionHelper(); if (!mReadOnly && mAutoreplaceCallback != NULL) { @@ -1247,6 +1264,31 @@ void LLTextEditor::tryToShowEmojiHelper() } } +void LLTextEditor::tryToShowMentionHelper() +{ + if (mReadOnly || !mShowChatMentionPicker) + return; + + S32 mention_start_pos; + LLWString text(getWText()); + if (LLChatMentionHelper::instance().isCursorInNameMention(text, mCursorPos, &mention_start_pos)) + { + const LLRect cursor_rect(getLocalRectFromDocIndex(mention_start_pos)); + std::string name_part(wstring_to_utf8str(text.substr(mention_start_pos, mCursorPos - mention_start_pos))); + name_part.erase(0, 1); + auto cb = [this](std::string name_url) + { + handleMentionCommit(name_url); + }; + LLChatMentionHelper::instance().showHelper(this, cursor_rect.mLeft, cursor_rect.mTop, name_part, cb); + } + else + { + LLChatMentionHelper::instance().hideHelper(); + } +} + + void LLTextEditor::addLineBreakChar(bool group_together) { if( !getEnabled() ) @@ -1884,9 +1926,13 @@ bool LLTextEditor::handleKeyHere(KEY key, MASK mask ) } else { - if (!mReadOnly && mShowEmojiHelper && LLEmojiHelper::instance().handleKey(this, key, mask)) + if (!mReadOnly) { - return true; + if ((mShowEmojiHelper && LLEmojiHelper::instance().handleKey(this, key, mask)) || + (mShowChatMentionPicker && LLChatMentionHelper::instance().handleKey(this, key, mask))) + { + return true; + } } if (mEnableTooltipPaste && diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index b2b14b01e2..e38908734f 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -95,6 +95,8 @@ public: void insertEmoji(llwchar emoji); void handleEmojiCommit(llwchar emoji); + void handleMentionCommit(std::string name_url); + // mousehandler overrides virtual bool handleMouseDown(S32 x, S32 y, MASK mask); virtual bool handleMouseUp(S32 x, S32 y, MASK mask); @@ -258,6 +260,7 @@ protected: S32 remove(S32 pos, S32 length, bool group_with_next_op); void tryToShowEmojiHelper(); + void tryToShowMentionHelper(); void focusLostHelper(); void updateAllowingLanguageInput(); bool hasPreeditString() const; @@ -295,6 +298,7 @@ protected: bool mAutoIndent; bool mParseOnTheFly; + bool mShowChatMentionPicker; void updateLinkSegments(); void keepSelectionOnReturn(bool keep) { mKeepSelectionOnReturn = keep; } diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index ce5ff0ff75..9657dc9527 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -580,7 +580,7 @@ LLUrlEntrySimpleSecondlifeURL::LLUrlEntrySimpleSecondlifeURL() // LLUrlEntryAgent::LLUrlEntryAgent() { - mPattern = boost::regex(APP_HEADER_REGEX "/agent/[\\da-f-]+/\\w+", + mPattern = boost::regex(APP_HEADER_REGEX "/agent/[\\da-f-]+/(mention|(?!mention)\\w+)", boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_agent.xml"; mIcon = "Generic_Person"; @@ -784,7 +784,7 @@ std::string LLUrlEntryAgent::getIcon(const std::string &url) { // *NOTE: Could look up a badge here by calling getIDStringFromUrl() // and looking up the badge for the agent. - return mIcon; + return LLStringUtil::endsWith(url, "/mention") ? std::string() : mIcon; } // diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index fff1597fd9..98151e2f4d 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -201,6 +201,7 @@ set(viewer_SOURCE_FILES llfloatercamera.cpp llfloatercamerapresets.cpp llfloaterchangeitemthumbnail.cpp + llfloaterchatmentionpicker.cpp llfloaterchatvoicevolume.cpp llfloaterclassified.cpp llfloatercolorpicker.cpp @@ -870,6 +871,7 @@ set(viewer_HEADER_FILES llfloaterbuyland.h llfloatercamerapresets.h llfloaterchangeitemthumbnail.h + llfloaterchatmentionpicker.h llfloatercamera.h llfloaterchatvoicevolume.h llfloaterclassified.h diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 8f858fe4e1..f206474e71 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -141,6 +141,7 @@ LLAvatarList::LLAvatarList(const Params& p) , mShowSpeakingIndicator(p.show_speaking_indicator) , mShowPermissions(p.show_permissions_granted) , mShowCompleteName(false) +, mForceCompleteName(false) { setCommitOnSelectionChange(true); @@ -177,7 +178,7 @@ void LLAvatarList::setShowIcons(std::string param_name) std::string LLAvatarList::getAvatarName(LLAvatarName av_name) { - return mShowCompleteName? av_name.getCompleteName(false) : av_name.getDisplayName(); + return mShowCompleteName? av_name.getCompleteName(false, mForceCompleteName) : av_name.getDisplayName(); } // virtual @@ -364,7 +365,7 @@ void LLAvatarList::updateAvatarNames() for( std::vector::const_iterator it = items.begin(); it != items.end(); it++) { LLAvatarListItem* item = static_cast(*it); - item->setShowCompleteName(mShowCompleteName); + item->setShowCompleteName(mShowCompleteName, mForceCompleteName); item->updateAvatarName(); } mNeedUpdateNames = false; @@ -404,6 +405,11 @@ boost::signals2::connection LLAvatarList::setItemDoubleClickCallback(const mouse return mItemDoubleClickSignal.connect(cb); } +boost::signals2::connection LLAvatarList::setItemClickedCallback(const mouse_signal_t::slot_type& cb) +{ + return mItemClickedSignal.connect(cb); +} + //virtual S32 LLAvatarList::notifyParent(const LLSD& info) { @@ -418,7 +424,7 @@ S32 LLAvatarList::notifyParent(const LLSD& info) void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, bool is_online, EAddPosition pos) { LLAvatarListItem* item = new LLAvatarListItem(); - item->setShowCompleteName(mShowCompleteName); + item->setShowCompleteName(mShowCompleteName, mForceCompleteName); // This sets the name as a side effect item->setAvatarId(id, mSessionID, mIgnoreOnlineStatus); item->setOnline(mIgnoreOnlineStatus ? true : is_online); @@ -432,6 +438,7 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, bool is item->setDoubleClickCallback(boost::bind(&LLAvatarList::onItemDoubleClicked, this, _1, _2, _3, _4)); + item->setMouseDownCallback(boost::bind(&LLAvatarList::onItemClicked, this, _1, _2, _3, _4)); addItem(item, id, pos); } @@ -550,6 +557,11 @@ void LLAvatarList::onItemDoubleClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask) mItemDoubleClickSignal(ctrl, x, y, mask); } +void LLAvatarList::onItemClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask) +{ + mItemClickedSignal(ctrl, x, y, mask); +} + bool LLAvatarItemComparator::compare(const LLPanel* item1, const LLPanel* item2) const { const LLAvatarListItem* avatar_item1 = dynamic_cast(item1); diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index af5bfefcde..f99da93a3d 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -96,11 +96,13 @@ public: boost::signals2::connection setItemDoubleClickCallback(const mouse_signal_t::slot_type& cb); + boost::signals2::connection setItemClickedCallback(const mouse_signal_t::slot_type& cb); + virtual S32 notifyParent(const LLSD& info); void handleDisplayNamesOptionChanged(); - void setShowCompleteName(bool show) { mShowCompleteName = show;}; + void setShowCompleteName(bool show, bool force = false) { mShowCompleteName = show; mForceCompleteName = force; }; protected: void refresh(); @@ -113,6 +115,7 @@ protected: void updateLastInteractionTimes(); void rebuildNames(); void onItemDoubleClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask); + void onItemClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask); void updateAvatarNames(); private: @@ -127,6 +130,7 @@ private: bool mShowSpeakingIndicator; bool mShowPermissions; bool mShowCompleteName; + bool mForceCompleteName; LLTimer* mLITUpdateTimer; // last interaction time update timer std::string mIconParamName; @@ -138,6 +142,7 @@ private: commit_signal_t mRefreshCompleteSignal; mouse_signal_t mItemDoubleClickSignal; + mouse_signal_t mItemClickedSignal; }; /** Abstract comparator for avatar items */ diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index 880910d18e..6ef45ed160 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -78,6 +78,7 @@ LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/) mShowProfileBtn(true), mShowPermissions(false), mShowCompleteName(false), + mForceCompleteName(false), mHovered(false), mAvatarNameCacheConnection(), mGreyOutUsername("") @@ -324,13 +325,11 @@ void LLAvatarListItem::setShowProfileBtn(bool show) void LLAvatarListItem::showSpeakingIndicator(bool visible) { - // Already done? Then do nothing. - if (mSpeakingIndicator->getVisible() == (bool)visible) - return; -// Disabled to not contradict with SpeakingIndicatorManager functionality. EXT-3976 -// probably this method should be totally removed. -// mSpeakingIndicator->setVisible(visible); -// updateChildren(); + if (mSpeakingIndicator) + { + mSpeakingIndicator->setIsActiveChannel(visible); + mSpeakingIndicator->setShowParticipantsSpeaking(visible); + } } void LLAvatarListItem::setAvatarIconVisible(bool visible) @@ -417,8 +416,8 @@ void LLAvatarListItem::onAvatarNameCache(const LLAvatarName& av_name) mAvatarNameCacheConnection.disconnect(); mGreyOutUsername = ""; - std::string name_string = mShowCompleteName? av_name.getCompleteName(false) : av_name.getDisplayName(); - if(av_name.getCompleteName() != av_name.getUserName()) + std::string name_string = mShowCompleteName? av_name.getCompleteName(false, mForceCompleteName) : av_name.getDisplayName(); + if(av_name.getCompleteName(false, mForceCompleteName) != av_name.getUserName()) { mGreyOutUsername = "[ " + av_name.getUserName(true) + " ]"; LLStringUtil::toLower(mGreyOutUsername); diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index 2e4c597d30..2ec7a41055 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -106,7 +106,7 @@ public: void setShowPermissions(bool show) { mShowPermissions = show; }; void showLastInteractionTime(bool show); void setAvatarIconVisible(bool visible); - void setShowCompleteName(bool show) { mShowCompleteName = show;}; + void setShowCompleteName(bool show, bool force = false) { mShowCompleteName = show; mForceCompleteName = force;}; const LLUUID& getAvatarId() const; std::string getAvatarName() const; @@ -220,6 +220,7 @@ private: bool mHovered; bool mShowCompleteName; + bool mForceCompleteName; std::string mGreyOutUsername; void fetchAvatarName(); diff --git a/indra/newview/llfloaterchatmentionpicker.cpp b/indra/newview/llfloaterchatmentionpicker.cpp new file mode 100644 index 0000000000..dda2cd83f6 --- /dev/null +++ b/indra/newview/llfloaterchatmentionpicker.cpp @@ -0,0 +1,183 @@ +/** + * @file llfloaterchatmentionpicker.cpp + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloaterchatmentionpicker.h" + +#include "llavatarlist.h" +#include "llfloaterimcontainer.h" +#include "llchatmentionhelper.h" +#include "llparticipantlist.h" + +LLUUID LLFloaterChatMentionPicker::sSessionID(LLUUID::null); + +LLFloaterChatMentionPicker::LLFloaterChatMentionPicker(const LLSD& key) +: LLFloater(key), mAvatarList(NULL) +{ + // This floater should hover on top of our dependent (with the dependent having the focus) + setFocusStealsFrontmost(false); + setBackgroundVisible(false); + setAutoFocus(false); +} + +bool LLFloaterChatMentionPicker::postBuild() +{ + mAvatarList = getChild("avatar_list"); + mAvatarList->setShowCompleteName(true, true); + mAvatarList->setFocusOnItemClicked(false); + mAvatarList->setItemClickedCallback([this](LLUICtrl* ctrl, S32 x, S32 y, MASK mask) + { + if (LLAvatarListItem* item = dynamic_cast(ctrl)) + { + selectResident(item->getAvatarId()); + } + }); + mAvatarList->setRefreshCompleteCallback([this](LLUICtrl* ctrl, const LLSD& param) + { + if (mAvatarList->numSelected() == 0) + { + mAvatarList->selectFirstItem(); + } + }); + + return LLFloater::postBuild(); +} + +void LLFloaterChatMentionPicker::onOpen(const LLSD& key) +{ + buildAvatarList(); + mAvatarList->setNameFilter(key.has("av_name") ? key["av_name"].asString() : ""); + + gFloaterView->adjustToFitScreen(this, false); +} + +uuid_vec_t LLFloaterChatMentionPicker::getParticipantIds() +{ + LLParticipantList* item = dynamic_cast(LLFloaterIMContainer::getInstance()->getSessionModel(sSessionID)); + if (!item) + { + LL_WARNS() << "Participant list is missing" << LL_ENDL; + return {}; + } + + uuid_vec_t avatar_ids; + LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = item->getChildrenBegin(); + LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = item->getChildrenEnd(); + while (current_participant_model != end_participant_model) + { + LLConversationItem* participant_model = dynamic_cast(*current_participant_model); + if (participant_model) + { + avatar_ids.push_back(participant_model->getUUID()); + } + current_participant_model++; + } + return avatar_ids; +} + +void LLFloaterChatMentionPicker::buildAvatarList() +{ + uuid_vec_t& avatar_ids = mAvatarList->getIDs(); + avatar_ids = getParticipantIds(); + updateAvatarList(avatar_ids); + mAvatarList->setDirty(); +} + +void LLFloaterChatMentionPicker::selectResident(const LLUUID& id) +{ + if (id.isNull()) + return; + + setValue(stringize("secondlife:///app/agent/", id.asString(), "/mention ")); + onCommit(); + LLChatMentionHelper::instance().hideHelper(); +} + +void LLFloaterChatMentionPicker::onClose(bool app_quitting) +{ + if (!app_quitting) + { + LLChatMentionHelper::instance().hideHelper(); + } +} + +bool LLFloaterChatMentionPicker::handleKey(KEY key, MASK mask, bool called_from_parent) +{ + if (mask == MASK_NONE) + { + switch (key) + { + case KEY_UP: + case KEY_DOWN: + return mAvatarList->handleKey(key, mask, called_from_parent); + case KEY_RETURN: + selectResident(mAvatarList->getSelectedUUID()); + return true; + case KEY_ESCAPE: + LLChatMentionHelper::instance().hideHelper(); + return true; + case KEY_LEFT: + case KEY_RIGHT: + return true; + default: + break; + } + } + return LLFloater::handleKey(key, mask, called_from_parent); +} + +void LLFloaterChatMentionPicker::goneFromFront() +{ + LLChatMentionHelper::instance().hideHelper(); +} + +void LLFloaterChatMentionPicker::updateSessionID(LLUUID session_id) +{ + sSessionID = session_id; + + LLParticipantList* item = dynamic_cast(LLFloaterIMContainer::getInstance()->getSessionModel(sSessionID)); + if (!item) + { + LL_WARNS() << "Participant list is missing" << LL_ENDL; + return; + } + + uuid_vec_t avatar_ids = getParticipantIds(); + updateAvatarList(avatar_ids); +} + +void LLFloaterChatMentionPicker::updateAvatarList(uuid_vec_t& avatar_ids) +{ + std::vector av_names; + for (auto& id : avatar_ids) + { + LLAvatarName av_name; + LLAvatarNameCache::get(id, &av_name); + av_names.push_back(utf8str_tolower(av_name.getAccountName())); + av_names.push_back(utf8str_tolower(av_name.getDisplayName())); + } + LLChatMentionHelper::instance().updateAvatarList(av_names); +} diff --git a/indra/newview/llfloaterchatmentionpicker.h b/indra/newview/llfloaterchatmentionpicker.h new file mode 100644 index 0000000000..8d221d7a89 --- /dev/null +++ b/indra/newview/llfloaterchatmentionpicker.h @@ -0,0 +1,58 @@ +/** + * @file llfloaterchatmentionpicker.h + * + * $LicenseInfo:firstyear=2025&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2025, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LLFLOATERCHATMENTIONPICKER_H +#define LLFLOATERCHATMENTIONPICKER_H + +#include "llfloater.h" + +class LLAvatarList; + +class LLFloaterChatMentionPicker : public LLFloater +{ +public: + LLFloaterChatMentionPicker(const LLSD& key); + + virtual bool postBuild() override; + virtual void goneFromFront() override; + + void buildAvatarList(); + + static uuid_vec_t getParticipantIds(); + static void updateSessionID(LLUUID session_id); + static void updateAvatarList(uuid_vec_t& avatar_ids); + +private: + + void onOpen(const LLSD& key) override; + void onClose(bool app_quitting) override; + virtual bool handleKey(KEY key, MASK mask, bool called_from_parent) override; + void selectResident(const LLUUID& id); + + static LLUUID sSessionID; + LLAvatarList* mAvatarList; +}; + +#endif diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp index db6f9ac22a..b649514bff 100644 --- a/indra/newview/llfloaterimnearbychat.cpp +++ b/indra/newview/llfloaterimnearbychat.cpp @@ -586,7 +586,7 @@ void LLFloaterIMNearbyChat::sendChat( EChatType type ) { if (mInputEditor) { - LLWString text = mInputEditor->getWText(); + LLWString text = mInputEditor->getConvertedText(); LLWStringUtil::trim(text); LLWStringUtil::replaceChar(text,182,'\n'); // Convert paragraph symbols back into newlines. if (!text.empty()) diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp index 185274981b..84a9fad708 100644 --- a/indra/newview/llfloaterimsession.cpp +++ b/indra/newview/llfloaterimsession.cpp @@ -251,7 +251,7 @@ void LLFloaterIMSession::sendMsgFromInputEditor() { if (mInputEditor) { - LLWString text = mInputEditor->getWText(); + LLWString text = mInputEditor->getConvertedText(); LLWStringUtil::trim(text); LLWStringUtil::replaceChar(text,182,'\n'); // Convert paragraph symbols back into newlines. if(!text.empty()) diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 50e765c236..96aac8c1e6 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -35,6 +35,7 @@ #include "llavatariconctrl.h" #include "llchatentry.h" #include "llchathistory.h" +#include "llfloaterchatmentionpicker.h" #include "llchiclet.h" #include "llchicletbar.h" #include "lldraghandle.h" @@ -485,6 +486,7 @@ void LLFloaterIMSessionTab::onFocusReceived() LLIMModel::instance().sendNoUnreadMessages(mSessionID); } + LLFloaterChatMentionPicker::updateSessionID(mSessionID); super::onFocusReceived(); } diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 95c2a77ba8..4d9c2f3281 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -58,6 +58,7 @@ #include "llfloatercamera.h" #include "llfloatercamerapresets.h" #include "llfloaterchangeitemthumbnail.h" +#include "llfloaterchatmentionpicker.h" #include "llfloaterchatvoicevolume.h" #include "llfloaterclassified.h" #include "llfloaterconversationlog.h" @@ -353,6 +354,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("chat_voice", "floater_voice_chat_volume.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("change_item_thumbnail", "floater_change_item_thumbnail.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("nearby_chat", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterIMNearbyChat::buildFloater); + LLFloaterReg::add("chat_mention_picker", "floater_chat_mention_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("classified", "floater_classified.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("compile_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("conversation", "floater_conversation_log.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); diff --git a/indra/newview/skins/default/xui/en/floater_chat_mention_picker.xml b/indra/newview/skins/default/xui/en/floater_chat_mention_picker.xml new file mode 100644 index 0000000000..bbad99f932 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_chat_mention_picker.xml @@ -0,0 +1,31 @@ + + + + -- cgit v1.2.3 From 4cccf8af43c8ebd9f947b9050a0403f65d0de7ee Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Fri, 18 Apr 2025 18:43:46 +0300 Subject: Restore missing 'override' --- indra/llui/llflatlistview.h | 24 ++++++++++++------------ indra/llui/lltextbox.h | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h index 3c40f91ab0..0ea3115f30 100644 --- a/indra/llui/llflatlistview.h +++ b/indra/llui/llflatlistview.h @@ -113,7 +113,7 @@ public: }; // disable traversal when finding widget to hand focus off to - /*virtual*/ bool canFocusChildren() const { return false; } + /*virtual*/ bool canFocusChildren() const override { return false; } /** * Connects callback to signal called when Return key is pressed. @@ -121,12 +121,12 @@ public: boost::signals2::connection setReturnCallback( const commit_signal_t::slot_type& cb ) { return mOnReturnSignal.connect(cb); } /** Overridden LLPanel's reshape, height is ignored, the list sets its height to accommodate all items */ - virtual void reshape(S32 width, S32 height, bool called_from_parent = true); + virtual void reshape(S32 width, S32 height, bool called_from_parent = true) override; /** Returns full rect of child panel */ const LLRect& getItemsRect() const; - LLRect getRequiredRect() const { return getItemsRect(); } + LLRect getRequiredRect() override { return getItemsRect(); } /** Returns distance between items */ const S32 getItemsPad() const { return mItemPad; } @@ -270,7 +270,7 @@ public: U32 size(const bool only_visible_items = true) const; /** Removes all items from the list */ - virtual void clear(); + virtual void clear() override; /** * Removes all items that can be detached from the list but doesn't destroy @@ -297,7 +297,7 @@ public: void selectFirstItem(); void selectLastItem(); - virtual S32 notify(const LLSD& info) ; + virtual S32 notify(const LLSD& info) override; virtual ~LLFlatListView(); @@ -346,8 +346,8 @@ protected: virtual bool selectNextItemPair(bool is_up_direction, bool reset_selection); - virtual bool canSelectAll() const; - virtual void selectAll(); + virtual bool canSelectAll() const override; + virtual void selectAll() override; virtual bool isSelected(item_pair_t* item_pair) const; @@ -364,15 +364,15 @@ protected: */ void notifyParentItemsRectChanged(); - virtual bool handleKeyHere(KEY key, MASK mask); + virtual bool handleKeyHere(KEY key, MASK mask) override; - virtual bool postBuild(); + virtual bool postBuild() override; - virtual void onFocusReceived(); + virtual void onFocusReceived() override; - virtual void onFocusLost(); + virtual void onFocusLost() override; - virtual void draw(); + virtual void draw() override; LLRect getLastSelectedItemRect(); diff --git a/indra/llui/lltextbox.h b/indra/llui/lltextbox.h index e60f528c72..507d8f3ee6 100644 --- a/indra/llui/lltextbox.h +++ b/indra/llui/lltextbox.h @@ -78,7 +78,7 @@ protected: bool mShowCursorHand; protected: - virtual std::string _getSearchText() const + virtual std::string _getSearchText() const override { return LLTextBase::_getSearchText() + mText.getString(); } -- cgit v1.2.3 From 44bbdc549a9a530850ffbb02c06059517c37d82d Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 21 Apr 2025 15:56:01 +0300 Subject: #3488 Reduce locking 1. 'sActive' variables are atomic, no locks needed 2. Fix trylocks. There are internal locks inside loadMeshLOD so without checking locks 3 and 4 viewer would be locked on each loadMeshLOD, potentially making main thread wait for threads to unlock. --- indra/newview/llmeshrepository.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 48c80842b9..3724ec26df 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1809,42 +1809,36 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id) //static void LLMeshRepoThread::incActiveLODRequests() { - LLMutexLock lock(gMeshRepo.mThread->mMutex); ++LLMeshRepoThread::sActiveLODRequests; } //static void LLMeshRepoThread::decActiveLODRequests() { - LLMutexLock lock(gMeshRepo.mThread->mMutex); --LLMeshRepoThread::sActiveLODRequests; } //static void LLMeshRepoThread::incActiveHeaderRequests() { - LLMutexLock lock(gMeshRepo.mThread->mMutex); ++LLMeshRepoThread::sActiveHeaderRequests; } //static void LLMeshRepoThread::decActiveHeaderRequests() { - LLMutexLock lock(gMeshRepo.mThread->mMutex); --LLMeshRepoThread::sActiveHeaderRequests; } //static void LLMeshRepoThread::incActiveSkinRequests() { - LLMutexLock lock(gMeshRepo.mThread->mMutex); ++LLMeshRepoThread::sActiveSkinRequests; } //static void LLMeshRepoThread::decActiveSkinRequests() { - LLMutexLock lock(gMeshRepo.mThread->mMutex); --LLMeshRepoThread::sActiveSkinRequests; } @@ -4495,13 +4489,20 @@ void LLMeshRepository::notifyLoadedMeshes() { LLMutexTrylock lock1(mMeshMutex); LLMutexTrylock lock2(mThread->mMutex); + LLMutexTrylock lock3(mThread->mHeaderMutex); + LLMutexTrylock lock4(mThread->mPendingMutex); static U32 hold_offs(0); - if (! lock1.isLocked() || ! lock2.isLocked()) + if (! lock1.isLocked() || ! lock2.isLocked() || ! lock3.isLocked() || ! lock4.isLocked()) { // If we can't get the locks, skip and pick this up later. + // Eventually thread queue will be free enough ++hold_offs; sMaxLockHoldoffs = llmax(sMaxLockHoldoffs, hold_offs); + if (hold_offs > 4) + { + LL_WARNS_ONCE() << "High mesh thread holdoff" << LL_ENDL; + } return; } hold_offs = 0; @@ -4598,8 +4599,6 @@ void LLMeshRepository::notifyLoadedMeshes() std::partial_sort(mPendingRequests.begin(), mPendingRequests.begin() + push_count, mPendingRequests.end(), PendingRequestBase::CompareScoreGreater()); } - LLMutexTrylock lock3(mThread->mHeaderMutex); - LLMutexTrylock lock4(mThread->mPendingMutex); while (!mPendingRequests.empty() && push_count > 0) { std::unique_ptr& req_p = mPendingRequests.front(); -- cgit v1.2.3 From 87b6428f5537238c970cabbc30e057914935a50c Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 21 Apr 2025 16:59:29 +0300 Subject: #3870 Added joint initialization for LLVOAvatarSelf Sometimes mesh thread crashes when allocating joints --- indra/newview/llmeshrepository.cpp | 1 + indra/newview/llvoavatar.cpp | 10 ++++++++++ indra/newview/llvoavatar.h | 1 + indra/newview/llvoavatarself.cpp | 2 ++ 4 files changed, 14 insertions(+) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 3724ec26df..663afe64a9 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -4549,6 +4549,7 @@ void LLMeshRepository::notifyLoadedMeshes() if (mPendingRequests.size() > push_count) { + LL_PROFILE_ZONE_NAMED("Mesh score_map"); // More requests than the high-water limit allows so // sort and forward the most important. diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 3306289f51..d9a3ec3004 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -6375,6 +6375,16 @@ LLJoint *LLVOAvatar::getJoint( S32 joint_num ) return pJoint; } +void LLVOAvatar::initAllJoints() +{ + getJointAliases(); + for (auto& alias : mJointAliasMap) + { + mJointMap[alias.first] = mRoot->findJoint(alias.second); + } + // ignore mScreen and mRoot +} + //----------------------------------------------------------------------------- // getRiggedMeshID // diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index a2232d21a2..ab27c5752d 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -204,6 +204,7 @@ public: virtual LLJoint* getJoint(const std::string &name); LLJoint* getJoint(S32 num); + void initAllJoints(); //if you KNOW joint_num is a valid animated joint index, use getSkeletonJoint for efficiency inline LLJoint* getSkeletonJoint(S32 joint_num) { return mSkeleton[joint_num]; } diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index f23af5afa4..90ff4067f2 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -225,6 +225,8 @@ void LLVOAvatarSelf::initInstance() doPeriodically(update_avatar_rez_metrics, 5.0); doPeriodically(boost::bind(&LLVOAvatarSelf::checkStuckAppearance, this), 30.0); + initAllJoints(); // mesh thread uses LLVOAvatarSelf as a joint source + mInitFlags |= 1<<2; } -- cgit v1.2.3 From b30283e5ef164ed84ad47d7d6f52ebc1c6c7d558 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 22 Apr 2025 19:45:48 +0300 Subject: #3960 Fix expensive mesh thread score calculations --- indra/newview/llmeshrepository.cpp | 189 +++++++++++++++++-------------------- indra/newview/llmeshrepository.h | 68 +++++++++++-- 2 files changed, 145 insertions(+), 112 deletions(-) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 663afe64a9..851107b3be 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -544,6 +544,66 @@ bool RequestStats::isDelayed() const return mTimer.getStarted() && !mTimer.hasExpired(); } +F32 calculate_score(LLVOVolume* object) +{ + if (!object) + { + return -1.f; + } + LLDrawable* drawable = object->mDrawable; + if (!drawable) + { + return -1; + } + if (drawable->isState(LLDrawable::RIGGED) || object->isAttachment()) + { + LLVOAvatar* avatar = object->getAvatar(); + LLDrawable* av_drawable = avatar ? avatar->mDrawable : nullptr; + if (avatar && av_drawable) + { + // See LLVOVolume::calcLOD() + F32 radius; + if (avatar->isControlAvatar()) + { + const LLVector3* box = avatar->getLastAnimExtents(); + LLVector3 diag = box[1] - box[0]; + radius = diag.magVec() * 0.5f; + } + else + { + // Volume in a rigged mesh attached to a regular avatar. + const LLVector3* box = avatar->getLastAnimExtents(); + LLVector3 diag = box[1] - box[0]; + radius = diag.magVec(); + + if (!avatar->isSelf() && !avatar->hasFirstFullAttachmentData()) + { + // slightly deprioritize avatars that are still receiving data + radius *= 0.9f; + } + } + return radius / llmax(av_drawable->mDistanceWRTCamera, 1.f); + } + } + return drawable->getRadius() / llmax(drawable->mDistanceWRTCamera, 1.f); +} + +void PendingRequestBase::updateScore() +{ + mScore = 0; + if (mTrackedData) + { + for (LLVOVolume* volume : mTrackedData->mVolumes) + { + F32 cur_score = calculate_score(volume); + if (cur_score > 0) + { + mScore = llmax(mScore, cur_score); + } + } + } +} + LLViewerFetchedTexture* LLMeshUploadThread::FindViewerTexture(const LLImportMaterial& material) { LLPointer< LLViewerFetchedTexture > * ppTex = static_cast< LLPointer< LLViewerFetchedTexture > * >(material.mOpaqueData); @@ -2220,7 +2280,7 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes if (gMeshRepo.mLoadingSkins.find(mesh_id) == gMeshRepo.mLoadingSkins.end()) { - gMeshRepo.mLoadingSkins[mesh_id] = {}; // add an empty vector to indicate to main thread that we are loading skin info + gMeshRepo.mLoadingSkins[mesh_id]; // add an empty vector to indicate to main thread that we are loading skin info } } @@ -4212,13 +4272,13 @@ void LLMeshRepository::unregisterMesh(LLVOVolume* vobj) { for (auto& param : lod) { - vector_replace_with_last(param.second, vobj); + vector_replace_with_last(param.second.mVolumes, vobj); } } for (auto& skin_pair : mLoadingSkins) { - vector_replace_with_last(skin_pair.second, vobj); + vector_replace_with_last(skin_pair.second.mVolumes, vobj); } } @@ -4241,16 +4301,17 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para mesh_load_map::iterator iter = mLoadingMeshes[new_lod].find(mesh_id); if (iter != mLoadingMeshes[new_lod].end()) { //request pending for this mesh, append volume id to list - auto it = std::find(iter->second.begin(), iter->second.end(), vobj); - if (it == iter->second.end()) { - iter->second.push_back(vobj); + auto it = std::find(iter->second.mVolumes.begin(), iter->second.mVolumes.end(), vobj); + if (it == iter->second.mVolumes.end()) { + iter->second.addVolume(vobj); } } else { //first request for this mesh - mLoadingMeshes[new_lod][mesh_id].push_back(vobj); - mPendingRequests.emplace_back(new PendingRequestLOD(mesh_params, new_lod)); + std::shared_ptr request(new PendingRequestLOD(mesh_params, new_lod)); + mPendingRequests.emplace_back(request); + mLoadingMeshes[new_lod][mesh_id].initData(vobj, request); LLMeshRepository::sLODPending++; } } @@ -4309,50 +4370,6 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para return new_lod; } -F32 calculate_score(LLVOVolume* object) -{ - if (!object) - { - return -1.f; - } - LLDrawable* drawable = object->mDrawable; - if (!drawable) - { - return -1; - } - if (drawable->isState(LLDrawable::RIGGED) || object->isAttachment()) - { - LLVOAvatar* avatar = object->getAvatar(); - LLDrawable* av_drawable = avatar ? avatar->mDrawable : nullptr; - if (avatar && av_drawable) - { - // See LLVOVolume::calcLOD() - F32 radius; - if (avatar->isControlAvatar()) - { - const LLVector3* box = avatar->getLastAnimExtents(); - LLVector3 diag = box[1] - box[0]; - radius = diag.magVec() * 0.5f; - } - else - { - // Volume in a rigged mesh attached to a regular avatar. - const LLVector3* box = avatar->getLastAnimExtents(); - LLVector3 diag = box[1] - box[0]; - radius = diag.magVec(); - - if (!avatar->isSelf() && !avatar->hasFirstFullAttachmentData()) - { - // slightly deprioritize avatars that are still receiving data - radius *= 0.9f; - } - } - return radius / llmax(av_drawable->mDistanceWRTCamera, 1.f); - } - } - return drawable->getRadius() / llmax(drawable->mDistanceWRTCamera, 1.f); -} - void LLMeshRepository::notifyLoadedMeshes() { //called from main thread LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; //LL_RECORD_BLOCK_TIME(FTM_MESH_FETCH); @@ -4549,51 +4566,14 @@ void LLMeshRepository::notifyLoadedMeshes() if (mPendingRequests.size() > push_count) { - LL_PROFILE_ZONE_NAMED("Mesh score_map"); + LL_PROFILE_ZONE_NAMED("Mesh score update"); // More requests than the high-water limit allows so // sort and forward the most important. - //calculate "score" for pending requests - - //create score map - std::map score_map; - - for (U32 i = 0; i < LLVolumeLODGroup::NUM_LODS; ++i) - { - for (mesh_load_map::iterator iter = mLoadingMeshes[i].begin(); iter != mLoadingMeshes[i].end(); ++iter) - { - F32 max_score = 0.f; - for (auto obj_iter = iter->second.begin(); obj_iter != iter->second.end(); ++obj_iter) - { - F32 cur_score = calculate_score(*obj_iter); - if (cur_score >= 0.f) - { - max_score = llmax(max_score, cur_score); - } - } - - score_map[iter->first] = max_score; - } - } - for (mesh_load_map::iterator iter = mLoadingSkins.begin(); iter != mLoadingSkins.end(); ++iter) - { - F32 max_score = 0.f; - for (auto obj_iter = iter->second.begin(); obj_iter != iter->second.end(); ++obj_iter) - { - F32 cur_score = calculate_score(*obj_iter); - if (cur_score >= 0.f) - { - max_score = llmax(max_score, cur_score); - } - } - - score_map[iter->first] = max_score; - } - - //set "score" for pending requests - for (std::unique_ptr& req_p : mPendingRequests) + // update "score" for pending requests + for (std::shared_ptr& req_p : mPendingRequests) { - req_p->setScore(score_map[req_p->getId()]); + req_p->checkScore(); } //sort by "score" @@ -4602,7 +4582,9 @@ void LLMeshRepository::notifyLoadedMeshes() } while (!mPendingRequests.empty() && push_count > 0) { - std::unique_ptr& req_p = mPendingRequests.front(); + std::shared_ptr& req_p = mPendingRequests.front(); + // todo: check hasTrackedData here and erase request if none + // since this is supposed to mean that request was removed switch (req_p->getRequestType()) { case MESH_REQUEST_LOD: @@ -4657,7 +4639,7 @@ void LLMeshRepository::notifySkinInfoReceived(LLMeshSkinInfo* info) skin_load_map::iterator iter = mLoadingSkins.find(info->mMeshID); if (iter != mLoadingSkins.end()) { - for (LLVOVolume* vobj : iter->second) + for (LLVOVolume* vobj : iter->second.mVolumes) { if (vobj) { @@ -4673,7 +4655,7 @@ void LLMeshRepository::notifySkinInfoUnavailable(const LLUUID& mesh_id) skin_load_map::iterator iter = mLoadingSkins.find(mesh_id); if (iter != mLoadingSkins.end()) { - for (LLVOVolume* vobj : iter->second) + for (LLVOVolume* vobj : iter->second.mVolumes) { if (vobj) { @@ -4737,7 +4719,7 @@ void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVol } //notify waiting LLVOVolume instances that their requested mesh is available - for (LLVOVolume* vobj : obj_iter->second) + for (LLVOVolume* vobj : obj_iter->second.mVolumes) { if (vobj) { @@ -4767,7 +4749,7 @@ void LLMeshRepository::notifyMeshUnavailable(const LLVolumeParams& mesh_params, LLPrimitive::getVolumeManager()->unrefVolume(sys_volume); } - for (LLVOVolume* vobj : obj_iter->second) + for (LLVOVolume* vobj : obj_iter->second.mVolumes) { if (vobj) { @@ -4810,16 +4792,17 @@ const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id, LLVOV skin_load_map::iterator iter = mLoadingSkins.find(mesh_id); if (iter != mLoadingSkins.end()) { //request pending for this mesh, append volume id to list - auto it = std::find(iter->second.begin(), iter->second.end(), requesting_obj); - if (it == iter->second.end()) { - iter->second.push_back(requesting_obj); + auto it = std::find(iter->second.mVolumes.begin(), iter->second.mVolumes.end(), requesting_obj); + if (it == iter->second.mVolumes.end()) { + iter->second.addVolume(requesting_obj); } } else { //first request for this mesh - mLoadingSkins[mesh_id].push_back(requesting_obj); - mPendingRequests.emplace_back(new PendingRequestUUID(mesh_id, MESH_REQUEST_SKIN)); + std::shared_ptr request(new PendingRequestUUID(mesh_id, MESH_REQUEST_SKIN)); + mLoadingSkins[mesh_id].initData(requesting_obj, request); + mPendingRequests.emplace_back(request); } } } diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index b9acb3573f..0847c29d0d 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -168,7 +168,6 @@ public: void submitRequest(Request* request); static S32 llcdCallback(const char*, S32, S32); - void cancel(); void setMeshData(LLCDMeshData& mesh, bool vertex_based); void doDecomposition(); @@ -206,19 +205,19 @@ private: LLFrameTimer mTimer; }; - +class MeshLoadData; class PendingRequestBase { public: struct CompareScoreGreater { - bool operator()(const std::unique_ptr& lhs, const std::unique_ptr& rhs) + bool operator()(const std::shared_ptr& lhs, const std::shared_ptr& rhs) { return lhs->mScore > rhs->mScore; // greatest = first } }; - PendingRequestBase() : mScore(0.f) {}; + PendingRequestBase() : mScore(0.f), mTrackedData(nullptr), mScoreDirty(true) {}; virtual ~PendingRequestBase() {} bool operator<(const PendingRequestBase& rhs) const @@ -226,14 +225,34 @@ public: return mId < rhs.mId; } - void setScore(F32 score) { mScore = score; } F32 getScore() const { return mScore; } + void checkScore() + { + constexpr F32 EXPIRE_TIME_SECS = 8.f; + if (mScoreTimer.getElapsedTimeF32() > EXPIRE_TIME_SECS || mScoreDirty) + { + updateScore(); + mScoreDirty = false; + mScoreTimer.reset(); + } + }; + LLUUID getId() const { return mId; } virtual EMeshRequestType getRequestType() const = 0; + void trackData(MeshLoadData* data) { mTrackedData = data; mScoreDirty = true; } + void untrackData() { mTrackedData = nullptr; } + bool hasTrackedData() { return mTrackedData != nullptr; } + void setScoreDirty() { mScoreDirty = true; } + protected: - F32 mScore; + void updateScore(); + LLUUID mId; + F32 mScore; + bool mScoreDirty; + LLTimer mScoreTimer; + MeshLoadData* mTrackedData; }; class PendingRequestLOD : public PendingRequestBase @@ -267,6 +286,37 @@ private: EMeshRequestType mRequestType; }; + +class MeshLoadData +{ +public: + MeshLoadData() {} + ~MeshLoadData() + { + if (std::shared_ptr request = mRequest.lock()) + { + request->untrackData(); + } + } + void initData(LLVOVolume* vol, std::shared_ptr& request) + { + mVolumes.push_back(vol); + request->trackData(this); + mRequest = request; + } + void addVolume(LLVOVolume* vol) + { + mVolumes.push_back(vol); + if (std::shared_ptr request = mRequest.lock()) + { + request->setScoreDirty(); + } + } + std::vector mVolumes; +private: + std::weak_ptr mRequest; +}; + class LLMeshHeader { public: @@ -814,7 +864,7 @@ public: static void metricsProgress(unsigned int count); static void metricsUpdate(); - typedef std::unordered_map > mesh_load_map; + typedef std::unordered_map mesh_load_map; mesh_load_map mLoadingMeshes[4]; typedef std::unordered_map> skin_map; @@ -825,11 +875,11 @@ public: LLMutex* mMeshMutex; - typedef std::vector > pending_requests_vec; + typedef std::vector > pending_requests_vec; pending_requests_vec mPendingRequests; //list of mesh ids awaiting skin info - typedef std::unordered_map > skin_load_map; + typedef std::unordered_map skin_load_map; skin_load_map mLoadingSkins; //list of mesh ids awaiting decompositions -- cgit v1.2.3 From 6239647aa3623f84fa6c596638ecdb10b33e6b1b Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Wed, 23 Apr 2025 02:01:01 +0300 Subject: #3962 allow Tab work the same way as picking name with Enter --- indra/llui/lltexteditor.cpp | 2 +- indra/newview/llfloaterchatmentionpicker.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index bd726c3d49..bc73090ff7 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1915,7 +1915,7 @@ bool LLTextEditor::handleKeyHere(KEY key, MASK mask ) // not handled and let the parent take care of field movement. if (KEY_TAB == key && mTabsToNextField) { - return false; + return mShowChatMentionPicker && LLChatMentionHelper::instance().handleKey(this, key, mask); } if (mReadOnly && mScroller) diff --git a/indra/newview/llfloaterchatmentionpicker.cpp b/indra/newview/llfloaterchatmentionpicker.cpp index dda2cd83f6..1cfed122a9 100644 --- a/indra/newview/llfloaterchatmentionpicker.cpp +++ b/indra/newview/llfloaterchatmentionpicker.cpp @@ -134,6 +134,7 @@ bool LLFloaterChatMentionPicker::handleKey(KEY key, MASK mask, bool called_from_ case KEY_DOWN: return mAvatarList->handleKey(key, mask, called_from_parent); case KEY_RETURN: + case KEY_TAB: selectResident(mAvatarList->getSelectedUUID()); return true; case KEY_ESCAPE: -- cgit v1.2.3 From da2234a563c9dfca0ce80371167ceef08300de53 Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Wed, 23 Apr 2025 17:36:50 +0300 Subject: #3952 insert @ name at the cursor position --- indra/llui/llchatentry.cpp | 18 ------------------ indra/llui/llchatentry.h | 2 -- indra/llui/lltexteditor.cpp | 34 ++++++++++++++++++++++++++++++++-- indra/llui/lltexteditor.h | 2 ++ 4 files changed, 34 insertions(+), 22 deletions(-) diff --git a/indra/llui/llchatentry.cpp b/indra/llui/llchatentry.cpp index 55e4beafb6..b01a8caf1f 100644 --- a/indra/llui/llchatentry.cpp +++ b/indra/llui/llchatentry.cpp @@ -250,21 +250,3 @@ void LLChatEntry::enableSingleLineMode(bool single_line_mode) mPrevLinesCount = -1; setWordWrap(!single_line_mode); } - -LLWString LLChatEntry::getConvertedText() const -{ - LLWString text = getWText(); - S32 diff = 0; - for (auto segment : mSegments) - { - if (segment && segment->getStyle() && segment->getStyle()->getDrawHighlightBg()) - { - S32 seg_length = segment->getEnd() - segment->getStart(); - std::string slurl = segment->getStyle()->getLinkHREF(); - - text.replace(segment->getStart() + diff, seg_length, utf8str_to_wstring(slurl)); - diff += (S32)slurl.size() - seg_length; - } - } - return text; -} diff --git a/indra/llui/llchatentry.h b/indra/llui/llchatentry.h index bb5eb8024d..5621ede1e7 100644 --- a/indra/llui/llchatentry.h +++ b/indra/llui/llchatentry.h @@ -68,8 +68,6 @@ public: void enableSingleLineMode(bool single_line_mode); boost::signals2::connection setTextExpandedCallback(const commit_signal_t::slot_type& cb); - LLWString getConvertedText() const; - private: /** diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index bc73090ff7..cfe729be06 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -722,9 +722,21 @@ void LLTextEditor::handleMentionCommit(std::string name_url) if (LLChatMentionHelper::instance().isCursorInNameMention(getWText(), mCursorPos, &mention_start_pos)) { remove(mention_start_pos, mCursorPos - mention_start_pos, true); - setCursorPos(mention_start_pos); + insert(mention_start_pos, utf8str_to_wstring(name_url), false, LLTextSegmentPtr()); - appendTextImpl(name_url, LLStyle::Params(), true); + std::string new_text(wstring_to_utf8str(getConvertedText())); + clear(); + appendTextImpl(new_text, LLStyle::Params(), true); + + segment_set_t::const_iterator it = getSegIterContaining(mention_start_pos); + if (it != mSegments.end()) + { + setCursorPos((*it)->getEnd() + 1); + } + else + { + setCursorPos(mention_start_pos); + } } } @@ -3129,3 +3141,21 @@ S32 LLTextEditor::spacesPerTab() { return SPACES_PER_TAB; } + +LLWString LLTextEditor::getConvertedText() const +{ + LLWString text = getWText(); + S32 diff = 0; + for (auto segment : mSegments) + { + if (segment && segment->getStyle() && segment->getStyle()->getDrawHighlightBg()) + { + S32 seg_length = segment->getEnd() - segment->getStart(); + std::string slurl = segment->getStyle()->getLinkHREF(); + + text.replace(segment->getStart() + diff, seg_length, utf8str_to_wstring(slurl)); + diff += (S32)slurl.size() - seg_length; + } + } + return text; +} diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index e38908734f..403ea3f4fc 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -215,6 +215,8 @@ public: void setPassDelete(bool b) { mPassDelete = b; } + LLWString getConvertedText() const; + protected: void showContextMenu(S32 x, S32 y); void drawPreeditMarker(); -- cgit v1.2.3 From 205b2282c7417d56433540fb4ee5df195545f9d2 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 23 Apr 2025 18:09:11 +0300 Subject: #3920 LLPanel::getString crash Make sure new floater can launch wihtout a key. It isn't supposed to be launched wihtout a key, but there are some ways to do that intentionally. --- indra/newview/llfloaternewfeaturenotification.cpp | 26 ++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/indra/newview/llfloaternewfeaturenotification.cpp b/indra/newview/llfloaternewfeaturenotification.cpp index 369727ff1e..1badcdd3d9 100644 --- a/indra/newview/llfloaternewfeaturenotification.cpp +++ b/indra/newview/llfloaternewfeaturenotification.cpp @@ -43,12 +43,28 @@ bool LLFloaterNewFeatureNotification::postBuild() setCanDrag(false); getChild("close_btn")->setCommitCallback(boost::bind(&LLFloaterNewFeatureNotification::onCloseBtn, this)); - const std::string title_txt = "title_txt"; - const std::string dsc_txt = "description_txt"; - std::string feature = "_" + getKey().asString(); + if (getKey().isString()) + { + const std::string title_txt = "title_txt"; + const std::string dsc_txt = "description_txt"; - getChild(title_txt)->setValue(getString(title_txt + feature)); - getChild(dsc_txt)->setValue(getString(dsc_txt + feature)); + std::string feature = "_" + getKey().asString(); + if (hasString(title_txt + feature)) + { + getChild(title_txt)->setValue(getString(title_txt + feature)); + getChild(dsc_txt)->setValue(getString(dsc_txt + feature)); + } + else + { + // Show blank + LL_WARNS() << "Feature \"" << getKey().asString() << "\" not found for feature notification" << LL_ENDL; + } + } + else + { + // Show blank + LL_WARNS() << "Feature notification without a feature" << LL_ENDL; + } if (getKey().asString() == "gltf") { -- cgit v1.2.3 From b1b0cdbcf0c7a579bcce73296d4225499b544617 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 23 Apr 2025 19:07:44 +0300 Subject: #3784 Increase gltf scale boundaries --- indra/newview/skins/default/xui/en/panel_tools_texture.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml index af6a9b94d9..b7db9dec96 100644 --- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml @@ -968,8 +968,8 @@ label_width="205" layout="topleft" left="10" - min_val="-100" - max_val="100" + min_val="-10000" + max_val="10000" name="gltfTextureScaleU" top_delta="34" width="265" /> @@ -981,8 +981,8 @@ label_width="205" layout="topleft" left="10" - min_val="-100" - max_val="100" + min_val="-10000" + max_val="10000" name="gltfTextureScaleV" width="265" /> Date: Wed, 23 Apr 2025 21:01:46 +0300 Subject: #3758 show mention name in bubble chat --- indra/llui/lltextbase.cpp | 2 +- indra/llui/llurlentry.cpp | 49 ++++++++++++++++++++++++++---------------- indra/llui/llurlentry.h | 14 +++++++++++- indra/llui/llurlregistry.cpp | 9 +++++++- indra/llui/llurlregistry.h | 3 ++- indra/newview/llviewerchat.cpp | 8 +++++++ 6 files changed, 62 insertions(+), 23 deletions(-) diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 5f62763683..677dc63b25 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -2335,7 +2335,7 @@ void LLTextBase::appendTextImpl(const std::string& new_text, const LLStyle::Para LLUrlMatch match; std::string text = new_text; while (LLUrlRegistry::instance().findUrl(text, match, - boost::bind(&LLTextBase::replaceUrl, this, _1, _2, _3), isContentTrusted() || mAlwaysShowIcons)) + boost::bind(&LLTextBase::replaceUrl, this, _1, _2, _3), isContentTrusted() || mAlwaysShowIcons, force_slurl)) { start = match.getStart(); end = match.getEnd()+1; diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 9657dc9527..a2062d077e 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -580,7 +580,7 @@ LLUrlEntrySimpleSecondlifeURL::LLUrlEntrySimpleSecondlifeURL() // LLUrlEntryAgent::LLUrlEntryAgent() { - mPattern = boost::regex(APP_HEADER_REGEX "/agent/[\\da-f-]+/(mention|(?!mention)\\w+)", + mPattern = boost::regex(APP_HEADER_REGEX "/agent/[\\da-f-]+/\\w+", boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_agent.xml"; mIcon = "Generic_Person"; @@ -673,19 +673,9 @@ LLUrlMatch::EUnderlineLink LLUrlEntryAgent::getUnderline(const std::string& stri { return LLUrlMatch::EUnderlineLink::UNDERLINE_ON_HOVER; } - else if (LLStringUtil::endsWith(url, "/mention")) - { - return LLUrlMatch::EUnderlineLink::UNDERLINE_NEVER; - } return LLUrlMatch::EUnderlineLink::UNDERLINE_ALWAYS; } -bool LLUrlEntryAgent::getSkipProfileIcon(const std::string& string) const -{ - std::string url = getUrl(string); - return (LLStringUtil::endsWith(url, "/mention")) ? true : false; -} - std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCallback &cb) { if (!gCacheName) @@ -730,14 +720,7 @@ LLStyle::Params LLUrlEntryAgent::getStyle(const std::string &url) const LLStyle::Params style_params = LLUrlEntryBase::getStyle(url); style_params.color = LLUIColorTable::instance().getColor("HTMLLinkColor"); style_params.readonly_color = LLUIColorTable::instance().getColor("HTMLLinkColor"); - if (LLStringUtil::endsWith(url, "/mention")) - { - style_params.font.style = "NORMAL"; - style_params.draw_highlight_bg = true; - LLUUID agent_id(getIDStringFromUrl(url)); - style_params.highlight_bg_color = LLUIColorTable::instance().getColor((agent_id == sAgentID) ? "ChatSelfMentionHighlight" : "ChatMentionHighlight"); - } return style_params; } @@ -784,7 +767,35 @@ std::string LLUrlEntryAgent::getIcon(const std::string &url) { // *NOTE: Could look up a badge here by calling getIDStringFromUrl() // and looking up the badge for the agent. - return LLStringUtil::endsWith(url, "/mention") ? std::string() : mIcon; + return mIcon; +} + +/// +/// LLUrlEntryAgentMention Describes a chat mention Url, e.g., +/// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/mention +/// +LLUrlEntryAgentMention::LLUrlEntryAgentMention() +{ + mPattern = boost::regex(APP_HEADER_REGEX "/agent/[\\da-f-]+/mention", boost::regex::perl | boost::regex::icase); + mMenuName = "menu_url_agent.xml"; + mIcon = std::string(); +} + +LLUrlMatch::EUnderlineLink LLUrlEntryAgentMention::getUnderline(const std::string& string) const +{ + return LLUrlMatch::EUnderlineLink::UNDERLINE_NEVER; +} + +LLStyle::Params LLUrlEntryAgentMention::getStyle(const std::string& url) const +{ + LLStyle::Params style_params = LLUrlEntryAgent::getStyle(url); + style_params.font.style = "NORMAL"; + style_params.draw_highlight_bg = true; + + LLUUID agent_id(getIDStringFromUrl(url)); + style_params.highlight_bg_color = LLUIColorTable::instance().getColor((agent_id == sAgentID) ? "ChatSelfMentionHighlight" : "ChatMentionHighlight"); + + return style_params; } // diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index af5b8f5d83..df3932b2a0 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -234,7 +234,6 @@ public: /*virtual*/ LLUUID getID(const std::string &string) const; LLUrlMatch::EUnderlineLink getUnderline(const std::string& string) const; - bool getSkipProfileIcon(const std::string& string) const; protected: /*virtual*/ void callObservers(const std::string &id, const std::string &label, const std::string& icon); @@ -245,6 +244,19 @@ private: avatar_name_cache_connection_map_t mAvatarNameCacheConnections; }; +/// +/// LLUrlEntryAgentMention Describes a chat mention Url, e.g., +/// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/mention +class LLUrlEntryAgentMention : public LLUrlEntryAgent +{ +public: + LLUrlEntryAgentMention(); + + LLStyle::Params getStyle(const std::string& url) const; + LLUrlMatch::EUnderlineLink getUnderline(const std::string& string) const; + bool getSkipProfileIcon(const std::string& string) const { return true; }; +}; + /// /// LLUrlEntryAgentName Describes a Second Life agent name Url, e.g., /// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/(completename|displayname|username) diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index 6e6e3be9b4..02d88c83fb 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -62,6 +62,8 @@ LLUrlRegistry::LLUrlRegistry() registerUrl(new LLUrlEntryAgentUserName()); // LLUrlEntryAgent*Name must appear before LLUrlEntryAgent since // LLUrlEntryAgent is a less specific (catchall for agent urls) + mUrlEntryAgentMention = new LLUrlEntryAgentMention(); + registerUrl(mUrlEntryAgentMention); registerUrl(new LLUrlEntryAgent()); registerUrl(new LLUrlEntryChat()); registerUrl(new LLUrlEntryGroup()); @@ -155,7 +157,7 @@ static bool stringHasUrl(const std::string &text) text.find("@") != std::string::npos); } -bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LLUrlLabelCallback &cb, bool is_content_trusted) +bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LLUrlLabelCallback &cb, bool is_content_trusted, bool skip_non_mentions) { // avoid costly regexes if there is clearly no URL in the text if (! stringHasUrl(text)) @@ -176,6 +178,11 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL continue; } + if (skip_non_mentions && (mUrlEntryAgentMention != *it)) + { + continue; + } + LLUrlEntryBase *url_entry = *it; U32 start = 0, end = 0; diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h index 64cfec3960..35c6c0d84f 100644 --- a/indra/llui/llurlregistry.h +++ b/indra/llui/llurlregistry.h @@ -76,7 +76,7 @@ public: /// your callback is invoked if the matched Url's label changes in the future bool findUrl(const std::string &text, LLUrlMatch &match, const LLUrlLabelCallback &cb = &LLUrlRegistryNullCallback, - bool is_content_trusted = false); + bool is_content_trusted = false, bool skip_non_mentions = false); /// a slightly less efficient version of findUrl for wide strings bool findUrl(const LLWString &text, LLUrlMatch &match, @@ -102,6 +102,7 @@ private: LLUrlEntryBase* mUrlEntrySLLabel; LLUrlEntryBase* mUrlEntryNoLink; LLUrlEntryBase* mUrlEntryKeybinding; + LLUrlEntryBase* mUrlEntryAgentMention; }; #endif diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp index 8b01c4ef88..2ca2c5c07d 100644 --- a/indra/newview/llviewerchat.cpp +++ b/indra/newview/llviewerchat.cpp @@ -36,6 +36,7 @@ #include "llviewerregion.h" #include "llworld.h" #include "llinstantmessage.h" //SYSTEM_FROM +#include "llurlregistry.h" // LLViewerChat LLViewerChat::font_change_signal_t LLViewerChat::sChatFontChangedSignal; @@ -222,6 +223,13 @@ void LLViewerChat::formatChatMsg(const LLChat& chat, std::string& formated_msg) { std::string tmpmsg = chat.mText; + // show @name instead of slurl for chat mentions + LLUrlMatch match; + while (LLUrlRegistry::instance().findUrl(tmpmsg, match, LLUrlRegistryNullCallback, false, true)) + { + tmpmsg.replace(match.getStart(), match.getEnd() - match.getStart() + 1, match.getLabel()); + } + if(chat.mChatStyle == CHAT_STYLE_IRC) { formated_msg = chat.mFromName + tmpmsg.substr(3); -- cgit v1.2.3 From 89f817194305243cb28499c70819656b8172dfa8 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 24 Apr 2025 20:42:27 +0300 Subject: #3975 Crash at LLSpatialGroup::dirtyGeom --- indra/newview/llvovolume.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 4e8932f912..63ff6bc79d 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -860,8 +860,11 @@ void LLVOVolume::updateTextureVirtualSize(bool forced) // animated faces get moved to a smaller partition to reduce // side-effects of their updates (see shrinkWrap in // LLVOVolume::animateTextures). - mDrawable->getSpatialGroup()->dirtyGeom(); - gPipeline.markRebuild(mDrawable->getSpatialGroup()); + if (mDrawable->getSpatialGroup()) + { + mDrawable->getSpatialGroup()->dirtyGeom(); + gPipeline.markRebuild(mDrawable->getSpatialGroup()); + } } } -- cgit v1.2.3 From d9468ecc59f75363d9b57a9c1f7419cc3c42599b Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Fri, 25 Apr 2025 14:37:19 +0300 Subject: #3758 disable editing of mention segment --- indra/llui/lltextbase.cpp | 1 + indra/llui/lltextbase.h | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 677dc63b25..c1b01f420b 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -3458,6 +3458,7 @@ LLNormalTextSegment::LLNormalTextSegment( LLStyleConstSP style, S32 start, S32 e mLastGeneration(-1) { mFontHeight = mStyle->getFont()->getLineHeight(); + mCanEdit = !mStyle->getDrawHighlightBg(); LLUIImagePtr image = mStyle->getImage(); if (image.notNull()) diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index a2895e6bd6..8eff3c51d9 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -140,7 +140,7 @@ public: /*virtual*/ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const; /*virtual*/ void updateLayout(const class LLTextBase& editor); /*virtual*/ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect); - /*virtual*/ bool canEdit() const { return true; } + /*virtual*/ bool canEdit() const { return mCanEdit; } /*virtual*/ const LLUIColor& getColor() const { return mStyle->getColor(); } /*virtual*/ LLStyleConstSP getStyle() const { return mStyle; } /*virtual*/ void setStyle(LLStyleConstSP style) { mStyle = style; } @@ -163,6 +163,8 @@ protected: virtual const LLWString& getWText() const; virtual const S32 getLength() const; + void setAllowEdit(bool can_edit) { mCanEdit = can_edit; } + protected: class LLTextBase& mEditor; LLStyleConstSP mStyle; @@ -171,6 +173,8 @@ protected: std::string mTooltip; boost::signals2::connection mImageLoadedConnection; + bool mCanEdit { true }; + // font rendering LLFontVertexBuffer mFontBufferPreSelection; LLFontVertexBuffer mFontBufferSelection; -- cgit v1.2.3 From f450b42acfd0ac118b07eaf16a1b4c0298edbeae Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Fri, 25 Apr 2025 17:07:00 +0300 Subject: post merge fix --- indra/llui/lltextbase.h | 1 - 1 file changed, 1 deletion(-) diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index f3eac811e7..897c910c2f 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -146,7 +146,6 @@ public: /*virtual*/ void setStyle(LLStyleConstSP style) { mStyle = style; } /*virtual*/ void setToken( LLKeywordToken* token ) { mToken = token; } /*virtual*/ LLKeywordToken* getToken() const { return mToken; } - /*virtual*/ bool getToolTip( std::string& msg ) const; /*virtual*/ void setToolTip(const std::string& tooltip); /*virtual*/ void dump() const; -- cgit v1.2.3 From 1eb34b43fb88a0b7551d9083ab46ba7df2feab14 Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Fri, 25 Apr 2025 20:22:33 +0300 Subject: #3758 clean up: move EUnderlineLink --- indra/llui/llchatmentionhelper.cpp | 2 +- indra/llui/llchatmentionhelper.h | 2 +- indra/llui/llstyle.h | 8 ++++++++ indra/llui/lltextbase.h | 2 +- indra/llui/llurlentry.cpp | 12 ++++++------ indra/llui/llurlentry.h | 9 ++++----- indra/llui/llurlmatch.cpp | 4 ++-- indra/llui/llurlmatch.h | 14 ++++---------- 8 files changed, 27 insertions(+), 26 deletions(-) diff --git a/indra/llui/llchatmentionhelper.cpp b/indra/llui/llchatmentionhelper.cpp index 98d846b947..f7769b2cbe 100644 --- a/indra/llui/llchatmentionhelper.cpp +++ b/indra/llui/llchatmentionhelper.cpp @@ -37,7 +37,7 @@ bool LLChatMentionHelper::isActive(const LLUICtrl* ctrl) const return mHostHandle.get() == ctrl; } -bool LLChatMentionHelper::isCursorInNameMention(const LLWString& wtext, S32 cursor_pos, S32* mention_start_pos) +bool LLChatMentionHelper::isCursorInNameMention(const LLWString& wtext, S32 cursor_pos, S32* mention_start_pos) const { if (cursor_pos <= 0 || cursor_pos > static_cast(wtext.size())) return false; diff --git a/indra/llui/llchatmentionhelper.h b/indra/llui/llchatmentionhelper.h index 4da8c8264e..5f95d06f31 100644 --- a/indra/llui/llchatmentionhelper.h +++ b/indra/llui/llchatmentionhelper.h @@ -42,7 +42,7 @@ class LLChatMentionHelper : public LLSingleton public: bool isActive(const LLUICtrl* ctrl) const; - bool isCursorInNameMention(const LLWString& wtext, S32 cursor_pos, S32* mention_start_pos = nullptr); + bool isCursorInNameMention(const LLWString& wtext, S32 cursor_pos, S32* mention_start_pos = nullptr) const; void showHelper(LLUICtrl* host_ctrl, S32 local_x, S32 local_y, const std::string& av_name, std::function commit_cb); void hideHelper(const LLUICtrl* ctrl = nullptr); diff --git a/indra/llui/llstyle.h b/indra/llui/llstyle.h index 2c86eb6db7..71c3f88109 100644 --- a/indra/llui/llstyle.h +++ b/indra/llui/llstyle.h @@ -54,6 +54,14 @@ public: Params(); }; LLStyle(const Params& p = Params()); + + enum EUnderlineLink + { + UNDERLINE_ALWAYS = 0, + UNDERLINE_ON_HOVER, + UNDERLINE_NEVER + }; + public: const LLUIColor& getColor() const { return mColor; } void setColor(const LLUIColor &color) { mColor = color; } diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 897c910c2f..8ca653acb9 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -611,7 +611,7 @@ protected: bool operator()(const LLTextSegmentPtr& a, const LLTextSegmentPtr& b) const; }; typedef std::multiset segment_set_t; - typedef LLUrlMatch::EUnderlineLink e_underline; + typedef LLStyle::EUnderlineLink e_underline; // member functions LLTextBase(const Params &p); diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index a2062d077e..34138da34d 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -666,14 +666,14 @@ std::string LLUrlEntryAgent::getTooltip(const std::string &string) const return LLTrans::getString("TooltipAgentUrl"); } -LLUrlMatch::EUnderlineLink LLUrlEntryAgent::getUnderline(const std::string& string) const +LLStyle::EUnderlineLink LLUrlEntryAgent::getUnderline(const std::string& string) const { std::string url = getUrl(string); if (LLStringUtil::endsWith(url, "/about") || LLStringUtil::endsWith(url, "/inspect")) { - return LLUrlMatch::EUnderlineLink::UNDERLINE_ON_HOVER; + return LLStyle::EUnderlineLink::UNDERLINE_ON_HOVER; } - return LLUrlMatch::EUnderlineLink::UNDERLINE_ALWAYS; + return LLStyle::EUnderlineLink::UNDERLINE_ALWAYS; } std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCallback &cb) @@ -781,9 +781,9 @@ LLUrlEntryAgentMention::LLUrlEntryAgentMention() mIcon = std::string(); } -LLUrlMatch::EUnderlineLink LLUrlEntryAgentMention::getUnderline(const std::string& string) const +LLStyle::EUnderlineLink LLUrlEntryAgentMention::getUnderline(const std::string& string) const { - return LLUrlMatch::EUnderlineLink::UNDERLINE_NEVER; + return LLStyle::EUnderlineLink::UNDERLINE_NEVER; } LLStyle::Params LLUrlEntryAgentMention::getStyle(const std::string& url) const @@ -1406,7 +1406,7 @@ std::string LLUrlEntrySLLabel::getTooltip(const std::string &string) const return LLUrlEntryBase::getTooltip(string); } -LLUrlMatch::EUnderlineLink LLUrlEntrySLLabel::getUnderline(const std::string& string) const +LLStyle::EUnderlineLink LLUrlEntrySLLabel::getUnderline(const std::string& string) const { std::string url = getUrl(string); LLUrlMatch match; diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index df3932b2a0..740e99acfd 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -34,7 +34,6 @@ #include "llavatarname.h" #include "llhost.h" // for resolving parcel name by parcel id -#include "llurlmatch.h" #include #include @@ -97,7 +96,7 @@ public: /// Return the name of a SL location described by this Url, if any virtual std::string getLocation(const std::string &url) const { return ""; } - virtual LLUrlMatch::EUnderlineLink getUnderline(const std::string& string) const { return LLUrlMatch::EUnderlineLink::UNDERLINE_ALWAYS; } + virtual LLStyle::EUnderlineLink getUnderline(const std::string& string) const { return LLStyle::EUnderlineLink::UNDERLINE_ALWAYS; } virtual bool isTrusted() const { return false; } @@ -233,7 +232,7 @@ public: /*virtual*/ LLStyle::Params getStyle(const std::string &url) const; /*virtual*/ LLUUID getID(const std::string &string) const; - LLUrlMatch::EUnderlineLink getUnderline(const std::string& string) const; + LLStyle::EUnderlineLink getUnderline(const std::string& string) const; protected: /*virtual*/ void callObservers(const std::string &id, const std::string &label, const std::string& icon); @@ -253,7 +252,7 @@ public: LLUrlEntryAgentMention(); LLStyle::Params getStyle(const std::string& url) const; - LLUrlMatch::EUnderlineLink getUnderline(const std::string& string) const; + LLStyle::EUnderlineLink getUnderline(const std::string& string) const; bool getSkipProfileIcon(const std::string& string) const { return true; }; }; @@ -505,7 +504,7 @@ public: /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); /*virtual*/ std::string getUrl(const std::string &string) const; /*virtual*/ std::string getTooltip(const std::string &string) const; - LLUrlMatch::EUnderlineLink getUnderline(const std::string& string) const; + LLStyle::EUnderlineLink getUnderline(const std::string& string) const; }; /// diff --git a/indra/llui/llurlmatch.cpp b/indra/llui/llurlmatch.cpp index 3e61abe118..f093934ca9 100644 --- a/indra/llui/llurlmatch.cpp +++ b/indra/llui/llurlmatch.cpp @@ -37,7 +37,7 @@ LLUrlMatch::LLUrlMatch() : mIcon(""), mMenuName(""), mLocation(""), - mUnderline(UNDERLINE_ALWAYS), + mUnderline(e_underline::UNDERLINE_ALWAYS), mTrusted(false), mSkipProfileIcon(false) { @@ -47,7 +47,7 @@ void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url, const std const std::string& query, const std::string &tooltip, const std::string &icon, const LLStyle::Params& style, const std::string &menu, const std::string &location, - const LLUUID& id, EUnderlineLink underline, bool trusted, bool skip_icon) + const LLUUID& id, e_underline underline, bool trusted, bool skip_icon) { mStart = start; mEnd = end; diff --git a/indra/llui/llurlmatch.h b/indra/llui/llurlmatch.h index 0c4fe4a782..418a21f963 100644 --- a/indra/llui/llurlmatch.h +++ b/indra/llui/llurlmatch.h @@ -46,13 +46,6 @@ class LLUrlMatch public: LLUrlMatch(); - enum EUnderlineLink - { - UNDERLINE_ALWAYS = 0, - UNDERLINE_ON_HOVER, - UNDERLINE_NEVER - }; - /// return true if this object does not contain a valid Url match yet bool empty() const { return mUrl.empty(); } @@ -86,7 +79,8 @@ public: /// return the SL location that this Url describes, or "" if none. std::string getLocation() const { return mLocation; } - EUnderlineLink getUnderline() const { return mUnderline; } + typedef LLStyle::EUnderlineLink e_underline; + e_underline getUnderline() const { return mUnderline; } /// Return true if Url is trusted. bool isTrusted() const { return mTrusted; } @@ -98,7 +92,7 @@ public: const std::string& query, const std::string &tooltip, const std::string &icon, const LLStyle::Params& style, const std::string &menu, const std::string &location, const LLUUID& id, - EUnderlineLink underline = UNDERLINE_ALWAYS, bool trusted = false, bool skip_icon = false); + e_underline underline = e_underline::UNDERLINE_ALWAYS, bool trusted = false, bool skip_icon = false); const LLUUID& getID() const { return mID; } private: @@ -113,7 +107,7 @@ private: std::string mLocation; LLUUID mID; LLStyle::Params mStyle; - EUnderlineLink mUnderline; + e_underline mUnderline; bool mTrusted; bool mSkipProfileIcon; }; -- cgit v1.2.3 From 8665cd3750767cf47246d1b89b8a668bc4dd4138 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 25 Apr 2025 21:31:43 +0300 Subject: #3986 Packet ring crash in memcpy packet_size was negative --- indra/llmessage/llpacketring.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/indra/llmessage/llpacketring.cpp b/indra/llmessage/llpacketring.cpp index eb6650c6c5..b8284334ea 100644 --- a/indra/llmessage/llpacketring.cpp +++ b/indra/llmessage/llpacketring.cpp @@ -209,8 +209,14 @@ S32 LLPacketRing::receiveOrDropBufferedPacket(char *datap, bool drop) if (!drop) { - assert(packet_size > 0); - memcpy(datap, packet->getData(), packet_size); + if (packet_size > 0) + { + memcpy(datap, packet->getData(), packet_size); + } + else + { + assert(false); + } } else { -- cgit v1.2.3 From 69a81d641abb7427d22a4bfd6014b696476dd8b7 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 25 Apr 2025 21:15:49 +0300 Subject: #3982 Crash at getChild Notification about inventory change from fetchInventoryFromCapCoro Looks like floater was closed a moment before receiving inventoryChanged --- indra/newview/llfloaterbulkpermission.cpp | 16 +++++++++++----- indra/newview/llfloaterbulkpermission.h | 7 ++++--- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp index c09c02d32b..74c5079268 100644 --- a/indra/newview/llfloaterbulkpermission.cpp +++ b/indra/newview/llfloaterbulkpermission.cpp @@ -89,9 +89,17 @@ bool LLFloaterBulkPermission::postBuild() { mBulkChangeNextOwnerTransfer = true; } + + mQueueOutputList = getChild("queue output"); return true; } +void LLFloaterBulkPermission::onClose(bool app_quitting) +{ + removeVOInventoryListener(); + LLFloater::onClose(app_quitting); +} + void LLFloaterBulkPermission::doApply() { // Inspects a stream of selected object contents and adds modifiable ones to the given array. @@ -216,7 +224,7 @@ void LLFloaterBulkPermission::onCommitCopy() bool LLFloaterBulkPermission::start() { // note: number of top-level objects to modify is mObjectIDs.size(). - getChild("queue output")->setCommentText(getString("start_text")); + mQueueOutputList->setCommentText(getString("start_text")); return nextObject(); } @@ -239,7 +247,7 @@ bool LLFloaterBulkPermission::nextObject() if(isDone() && !mDone) { - getChild("queue output")->setCommentText(getString("done_text")); + mQueueOutputList->setCommentText(getString("done_text")); mDone = true; } return successful_start; @@ -294,8 +302,6 @@ void LLFloaterBulkPermission::doCheckUncheckAll(bool check) void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, LLInventoryObject::object_list_t* inv) { - LLScrollListCtrl* list = getChild("queue output"); - LLInventoryObject::object_list_t::const_iterator it = inv->begin(); LLInventoryObject::object_list_t::const_iterator end = inv->end(); for ( ; it != end; ++it) @@ -362,7 +368,7 @@ void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, LLInve status_text.setArg("[STATUS]", ""); } - list->setCommentText(status_text.getString()); + mQueueOutputList->setCommentText(status_text.getString()); //TODO if we are an object inside an object we should check a recuse flag and if set //open the inventory of the object and recurse - Michelle2 Zenovka diff --git a/indra/newview/llfloaterbulkpermission.h b/indra/newview/llfloaterbulkpermission.h index 23ca45b611..0b61022e0c 100644 --- a/indra/newview/llfloaterbulkpermission.h +++ b/indra/newview/llfloaterbulkpermission.h @@ -41,7 +41,8 @@ class LLFloaterBulkPermission : public LLFloater, public LLVOInventoryListener friend class LLFloaterReg; public: - bool postBuild(); + bool postBuild() override; + void onClose(bool app_quitting) override; private: @@ -57,7 +58,7 @@ private: /*virtual*/ void inventoryChanged(LLViewerObject* obj, LLInventoryObject::object_list_t* inv, S32 serial_num, - void* queue); + void* queue) override; // This is called by inventoryChanged void handleInventory(LLViewerObject* viewer_obj, @@ -85,7 +86,7 @@ private: private: // UI - LLScrollListCtrl* mMessages; + LLScrollListCtrl* mQueueOutputList = nullptr; LLButton* mCloseBtn; // Object Queue -- cgit v1.2.3 From 04c0bc100401c8f4541b6eeda3a110291ee54166 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 28 Apr 2025 17:17:29 +0300 Subject: #3978 Fix offset in Land Owner highlights texture_stride with '-1' was added in DRTVWR-592 along with getMetersPerGrid multiplication. --- indra/newview/llsurfacepatch.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/indra/newview/llsurfacepatch.cpp b/indra/newview/llsurfacepatch.cpp index 6f99da5957..875af76c10 100644 --- a/indra/newview/llsurfacepatch.cpp +++ b/indra/newview/llsurfacepatch.cpp @@ -210,7 +210,6 @@ void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3 llassert_always(vertex && normal && tex1); U32 surface_stride = mSurfacep->getGridsPerEdge(); - U32 texture_stride = mSurfacep->getGridsPerEdge() - 1; U32 point_offset = x + y*surface_stride; *normal = getNormal(x, y); @@ -223,7 +222,7 @@ void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3 // tex0 is used for ownership overlay LLVector3 rel_pos = pos_agent - mSurfacep->getOriginAgent(); - LLVector3 tex_pos = rel_pos * (1.f / (texture_stride * mSurfacep->getMetersPerGrid())); + LLVector3 tex_pos = rel_pos * (1.f / (surface_stride * mSurfacep->getMetersPerGrid())); tex0->mV[0] = tex_pos.mV[0]; tex0->mV[1] = tex_pos.mV[1]; -- cgit v1.2.3 From 1f3ba13a632a751cc3217cbe02d8aa2190df6b41 Mon Sep 17 00:00:00 2001 From: Brad Linden <46733234+brad-linden@users.noreply.github.com> Date: Mon, 28 Apr 2025 10:51:47 -0700 Subject: Attempt to fix qatest.yaml CodeQL issues (#3987) --- .github/workflows/.gitattributes | 1 + .github/workflows/qatest.yaml | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/.gitattributes diff --git a/.github/workflows/.gitattributes b/.github/workflows/.gitattributes new file mode 100644 index 0000000000..6dc1cca42a --- /dev/null +++ b/.github/workflows/.gitattributes @@ -0,0 +1 @@ +qatest.yaml -text eol=crlf diff --git a/.github/workflows/qatest.yaml b/.github/workflows/qatest.yaml index 7f3a5242e9..4892cfaae3 100644 --- a/.github/workflows/qatest.yaml +++ b/.github/workflows/qatest.yaml @@ -1,4 +1,7 @@ name: Run QA Test # Runs automated tests on a self-hosted QA machine +permissions: + contents: read + #pull-requests: write # maybe need to re-add this later on: workflow_run: @@ -15,11 +18,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Debug Workflow Variables + env: + HEAD_BRANCH: ${{ github.event.workflow_run.head_branch }} + HEAD_COMMIT_MSG: ${{ github.event.workflow_run.head_commit.message }} run: | echo "Workflow Conclusion: ${{ github.event.workflow_run.conclusion }}" - echo "Workflow Head Branch: ${{ github.event.workflow_run.head_branch }}" + echo "Workflow Head Branch: $HEAD_BRANCH" echo "Workflow Run ID: ${{ github.event.workflow_run.id }}" - echo "Head Commit Message: ${{ github.event.workflow_run.head_commit.message }}" + echo "Head Commit Message: $HEAD_COMMIT_MSG" echo "GitHub Ref: ${{ github.ref }}" echo "GitHub Ref Name: ${{ github.ref_name }}" echo "GitHub Event Name: ${{ github.event_name }}" -- cgit v1.2.3 From 7bd18e256d70804f72d747ccc1e62c92679dd645 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 25 Apr 2025 18:57:58 +0300 Subject: viewerp#300 Fix inconsistency with copying textures vs pbr --- indra/newview/llinventorymodel.cpp | 1 + indra/newview/llpanelface.cpp | 462 ++++++++++++++++++++++++------------- indra/newview/llpanelface.h | 3 + indra/newview/lltexturectrl.cpp | 3 +- 4 files changed, 312 insertions(+), 157 deletions(-) diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 0a2d938bd0..cf1efd283a 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -2768,6 +2768,7 @@ bool LLInventoryModel::loadSkeleton( bool is_cache_obsolete = false; if (loadFromFile(inventory_filename, categories, items, categories_to_update, is_cache_obsolete)) { + LL_PROFILE_ZONE_NAMED("loadFromFile"); // We were able to find a cache of files. So, use what we // found to generate a set of categories we should add. We // will go through each category loaded and if the version diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 6e0b0d252e..2e57e2a5bd 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -4009,6 +4009,85 @@ void LLPanelFace::onPasteColor(LLViewerObject* objectp, S32 te) } } +void set_item_availability( + const LLUUID& id, + LLSD& dest, + const std::string& modifier, + bool is_creator, + std::map &asset_item_map, + LLViewerObject* objectp) +{ + if (id.isNull()) + { + return; + } + + LLUUID item_id; + bool from_library = get_is_predefined_texture(id); + bool full_perm = from_library; + full_perm |= is_creator; + + if (!full_perm) + { + std::map::iterator iter = asset_item_map.find(id); + if (iter != asset_item_map.end()) + { + item_id = iter->second; + } + else + { + // What this does is simply searches inventory for item with same asset id, + // as result it is Hightly unreliable, leaves little control to user, borderline hack + // but there are little options to preserve permissions - multiple inventory + // items might reference same asset and inventory search is expensive. + bool no_transfer = false; + if (objectp->getInventoryItemByAsset(id)) + { + no_transfer = !objectp->getInventoryItemByAsset(id)->getIsFullPerm(); + } + item_id = get_copy_free_item_by_asset_id(id, no_transfer); + // record value to avoid repeating inventory search when possible + asset_item_map[id] = item_id; + } + } + + if (item_id.notNull() && gInventory.isObjectDescendentOf(item_id, gInventory.getLibraryRootFolderID())) + { + full_perm = true; + from_library = true; + } + + dest[modifier + "itemfullperm"] = full_perm; + dest[modifier + "fromlibrary"] = from_library; + + // If full permission object, texture is free to copy, + // but otherwise we need to check inventory and extract permissions + // + // Normally we care only about restrictions for current user and objects + // don't inherit any 'next owner' permissions from texture, so there is + // no need to record item id if full_perm==true + if (!full_perm && item_id.notNull()) + { + LLViewerInventoryItem* itemp = gInventory.getItem(item_id); + if (itemp) + { + LLPermissions item_permissions = itemp->getPermissions(); + if (item_permissions.allowOperationBy(PERM_COPY, + gAgent.getID(), + gAgent.getGroupID())) + { + dest[modifier + "itemid"] = item_id; + dest[modifier + "itemfullperm"] = itemp->getIsFullPerm(); + if (!itemp->isFinished()) + { + // needed for dropTextureAllFaces + LLInventoryModelBackgroundFetch::instance().start(item_id, false); + } + } + } + } +} + void LLPanelFace::onCopyTexture() { LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject(); @@ -4046,6 +4125,7 @@ void LLPanelFace::onCopyTexture() if (tep) { LLSD te_data; + LLUUID pbr_id = objectp->getRenderMaterialID(te); // asLLSD() includes media te_data["te"] = tep->asLLSD(); @@ -4054,21 +4134,20 @@ void LLPanelFace::onCopyTexture() te_data["te"]["bumpshiny"] = tep->getBumpShiny(); te_data["te"]["bumpfullbright"] = tep->getBumpShinyFullbright(); te_data["te"]["texgen"] = tep->getTexGen(); - te_data["te"]["pbr"] = objectp->getRenderMaterialID(te); + te_data["te"]["pbr"] = pbr_id; if (tep->getGLTFMaterialOverride() != nullptr) { te_data["te"]["pbr_override"] = tep->getGLTFMaterialOverride()->asJSON(); } - if (te_data["te"].has("imageid")) + if (te_data["te"].has("imageid") || pbr_id.notNull()) { - LLUUID item_id; - LLUUID id = te_data["te"]["imageid"].asUUID(); - bool from_library = get_is_predefined_texture(id); - bool full_perm = from_library; + LLUUID img_id = te_data["te"]["imageid"].asUUID(); + bool pbr_from_library = false; + bool pbr_full_perm = false; + bool is_creator = false; - if (!full_perm - && objectp->permCopy() + if (objectp->permCopy() && objectp->permTransfer() && objectp->permModify()) { @@ -4078,66 +4157,31 @@ void LLPanelFace::onCopyTexture() std::string creator_app_link; LLUUID creator_id; LLSelectMgr::getInstance()->selectGetCreator(creator_id, creator_app_link); - full_perm = objectp->mOwnerID == creator_id; + is_creator = objectp->mOwnerID == creator_id; } - if (id.notNull() && !full_perm) + // check permissions for blin-phong/diffuse image and for pbr asset + if (img_id.notNull()) { - std::map::iterator iter = asset_item_map.find(id); - if (iter != asset_item_map.end()) - { - item_id = iter->second; - } - else - { - // What this does is simply searches inventory for item with same asset id, - // as result it is Hightly unreliable, leaves little control to user, borderline hack - // but there are little options to preserve permissions - multiple inventory - // items might reference same asset and inventory search is expensive. - bool no_transfer = false; - if (objectp->getInventoryItemByAsset(id)) - { - no_transfer = !objectp->getInventoryItemByAsset(id)->getIsFullPerm(); - } - item_id = get_copy_free_item_by_asset_id(id, no_transfer); - // record value to avoid repeating inventory search when possible - asset_item_map[id] = item_id; - } + set_item_availability(img_id, te_data["te"], "img", is_creator, asset_item_map, objectp); } - - if (item_id.notNull() && gInventory.isObjectDescendentOf(item_id, gInventory.getLibraryRootFolderID())) + if (pbr_id.notNull()) { - full_perm = true; - from_library = true; - } + set_item_availability(pbr_id, te_data["te"], "pbr", is_creator, asset_item_map, objectp); - { - te_data["te"]["itemfullperm"] = full_perm; - te_data["te"]["fromlibrary"] = from_library; - - // If full permission object, texture is free to copy, - // but otherwise we need to check inventory and extract permissions - // - // Normally we care only about restrictions for current user and objects - // don't inherit any 'next owner' permissions from texture, so there is - // no need to record item id if full_perm==true - if (!full_perm && !from_library && item_id.notNull()) + // permissions for overrides + // Overrides do not permit no-copy textures + LLGLTFMaterial* override = tep->getGLTFMaterialOverride(); + if (override != nullptr) { - LLViewerInventoryItem* itemp = gInventory.getItem(item_id); - if (itemp) + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) { - LLPermissions item_permissions = itemp->getPermissions(); - if (item_permissions.allowOperationBy(PERM_COPY, - gAgent.getID(), - gAgent.getGroupID())) + LLUUID& texture_id = override->mTextureId[i]; + if (texture_id.notNull()) { - te_data["te"]["imageitemid"] = item_id; - te_data["te"]["itemfullperm"] = itemp->getIsFullPerm(); - if (!itemp->isFinished()) - { - // needed for dropTextureAllFaces - LLInventoryModelBackgroundFetch::instance().start(item_id, false); - } + const std::string prefix = "pbr" + std::to_string(i); + te_data["te"][prefix + "imageid"] = texture_id; + set_item_availability(texture_id, te_data["te"], prefix, is_creator, asset_item_map, objectp); } } } @@ -4201,6 +4245,44 @@ void LLPanelFace::onCopyTexture() } } +bool get_full_permission(const LLSD& te, const std::string &prefix) +{ + return te.has(prefix + "itemfullperm") && te[prefix+"itemfullperm"].asBoolean(); +} + +bool LLPanelFace::validateInventoryItem(const LLSD& te, const std::string& prefix) +{ + if (te.has(prefix + "itemid")) + { + LLUUID item_id = te[prefix + "itemid"].asUUID(); + if (item_id.notNull()) + { + LLViewerInventoryItem* itemp = gInventory.getItem(item_id); + if (!itemp) + { + // image might be in object's inventory, but it can be not up to date + LLSD notif_args; + static std::string reason = getString("paste_error_inventory_not_found"); + notif_args["REASON"] = reason; + LLNotificationsUtil::add("FacePasteFailed", notif_args); + return false; + } + } + } + else + { + // Item was not found on 'copy' stage + // Since this happened at copy, might be better to either show this + // at copy stage or to drop clipboard here + LLSD notif_args; + static std::string reason = getString("paste_error_inventory_not_found"); + notif_args["REASON"] = reason; + LLNotificationsUtil::add("FacePasteFailed", notif_args); + return false; + } + return true; +} + void LLPanelFace::onPasteTexture() { if (!mClipboardParams.has("texture")) @@ -4265,39 +4347,49 @@ void LLPanelFace::onPasteTexture() for (; iter != end; ++iter) { const LLSD& te_data = *iter; - if (te_data.has("te") && te_data["te"].has("imageid")) + if (te_data.has("te")) { - bool full_perm = te_data["te"].has("itemfullperm") && te_data["te"]["itemfullperm"].asBoolean(); - full_perm_object &= full_perm; - if (!full_perm) + if (te_data["te"].has("imageid")) { - if (te_data["te"].has("imageitemid")) + bool full_perm = get_full_permission(te_data["te"], "img"); + full_perm_object &= full_perm; + if (!full_perm) { - LLUUID item_id = te_data["te"]["imageitemid"].asUUID(); - if (item_id.notNull()) + if (!validateInventoryItem(te_data["te"], "img")) { - LLViewerInventoryItem* itemp = gInventory.getItem(item_id); - if (!itemp) - { - // image might be in object's inventory, but it can be not up to date - LLSD notif_args; - static std::string reason = getString("paste_error_inventory_not_found"); - notif_args["REASON"] = reason; - LLNotificationsUtil::add("FacePasteFailed", notif_args); - return; - } + return; } } - else + } + if (te_data["te"].has("pbr")) + { + bool full_perm = get_full_permission(te_data["te"], "pbr"); + full_perm_object &= full_perm; + if (!full_perm) { - // Item was not found on 'copy' stage - // Since this happened at copy, might be better to either show this - // at copy stage or to drop clipboard here - LLSD notif_args; - static std::string reason = getString("paste_error_inventory_not_found"); - notif_args["REASON"] = reason; - LLNotificationsUtil::add("FacePasteFailed", notif_args); - return; + if (!validateInventoryItem(te_data["te"], "pbr")) + { + return; + } + } + if (te_data["te"].has("pbr_override")) + { + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + { + const std::string prefix = "pbr" + std::to_string(i); + if (te_data["te"].has(prefix + "imageid")) + { + bool full_perm = get_full_permission(te_data["te"], prefix); + full_perm_object &= full_perm; + if (!full_perm) + { + if (!validateInventoryItem(te_data["te"], prefix)) + { + return; + } + } + } + } } } } @@ -4322,6 +4414,71 @@ void LLPanelFace::onPasteTexture() selected_objects->applyToTEs(&navigate_home_func); } +void get_item_and_permissions(const LLUUID &id, LLViewerInventoryItem*& itemp, bool& full_perm, bool& from_library, const LLSD &data, const std::string &prefix) +{ + full_perm = get_full_permission(data, prefix); + from_library = data.has(prefix + "fromlibrary") && data.get(prefix + "fromlibrary").asBoolean(); + LLViewerInventoryItem* itemp_res = NULL; + + if (data.has(prefix + "itemid")) + { + LLUUID item_id = data.get(prefix + "itemid").asUUID(); + if (item_id.notNull()) + { + LLViewerInventoryItem* itemp = gInventory.getItem(item_id); + if (itemp && itemp->isFinished()) + { + // dropTextureAllFaces will fail if incomplete + itemp_res = itemp; + } + else + { + // Theoretically shouldn't happend, but if it does happen, we + // might need to add a notification to user that paste will fail + // since inventory isn't fully loaded + LL_WARNS() << "Item " << item_id << " is incomplete, paste might fail silently." << LL_ENDL; + } + } + } + + // for case when item got removed from inventory after we pressed 'copy' + // or texture got pasted into previous object + if (!itemp_res && !full_perm) + { + // Due to checks for imageitemid in LLPanelFace::onPasteTexture() this should no longer be reachable. + LL_INFOS() << "Item " << data.get(prefix + "itemid").asUUID() << " no longer in inventory." << LL_ENDL; + // Todo: fix this, we are often searching same texture multiple times (equal to number of faces) + // Perhaps just mPanelFace->onPasteTexture(objectp, te, &asset_to_item_id_map); ? Not pretty, but will work + LLViewerInventoryCategory::cat_array_t cats; + LLViewerInventoryItem::item_array_t items; + LLAssetIDMatches asset_id_matches(id); + gInventory.collectDescendentsIf(LLUUID::null, + cats, + items, + LLInventoryModel::INCLUDE_TRASH, + asset_id_matches); + + // Extremely unreliable and perfomance unfriendly. + // But we need this to check permissions and it is how texture control finds items + for (S32 i = 0; i < items.size(); i++) + { + LLViewerInventoryItem* itemp = items[i]; + if (itemp && itemp->isFinished()) + { + // dropTextureAllFaces will fail if incomplete + LLPermissions item_permissions = itemp->getPermissions(); + if (item_permissions.allowOperationBy(PERM_COPY, + gAgent.getID(), + gAgent.getGroupID())) + { + itemp_res = itemp; + break; // first match + } + } + } + } +} + void LLPanelFace::onPasteTexture(LLViewerObject* objectp, S32 te) { LLSD te_data; @@ -4345,77 +4502,22 @@ void LLPanelFace::onPasteTexture(LLViewerObject* objectp, S32 te) if (te_data.has("te")) { // Texture - bool full_perm = te_data["te"].has("itemfullperm") && te_data["te"]["itemfullperm"].asBoolean(); - bool from_library = te_data["te"].has("fromlibrary") && te_data["te"]["fromlibrary"].asBoolean(); if (te_data["te"].has("imageid")) { + bool img_full_perm = false; + bool img_from_library = false; const LLUUID& imageid = te_data["te"]["imageid"].asUUID(); //texture or asset id - LLViewerInventoryItem* itemp_res = NULL; + LLViewerInventoryItem* img_itemp_res = NULL; - if (te_data["te"].has("imageitemid")) - { - LLUUID item_id = te_data["te"]["imageitemid"].asUUID(); - if (item_id.notNull()) - { - LLViewerInventoryItem* itemp = gInventory.getItem(item_id); - if (itemp && itemp->isFinished()) - { - // dropTextureAllFaces will fail if incomplete - itemp_res = itemp; - } - else - { - // Theoretically shouldn't happend, but if it does happen, we - // might need to add a notification to user that paste will fail - // since inventory isn't fully loaded - LL_WARNS() << "Item " << item_id << " is incomplete, paste might fail silently." << LL_ENDL; - } - } - } - // for case when item got removed from inventory after we pressed 'copy' - // or texture got pasted into previous object - if (!itemp_res && !full_perm) - { - // Due to checks for imageitemid in LLPanelFace::onPasteTexture() this should no longer be reachable. - LL_INFOS() << "Item " << te_data["te"]["imageitemid"].asUUID() << " no longer in inventory." << LL_ENDL; - // Todo: fix this, we are often searching same texture multiple times (equal to number of faces) - // Perhaps just mPanelFace->onPasteTexture(objectp, te, &asset_to_item_id_map); ? Not pretty, but will work - LLViewerInventoryCategory::cat_array_t cats; - LLViewerInventoryItem::item_array_t items; - LLAssetIDMatches asset_id_matches(imageid); - gInventory.collectDescendentsIf(LLUUID::null, - cats, - items, - LLInventoryModel::INCLUDE_TRASH, - asset_id_matches); - - // Extremely unreliable and perfomance unfriendly. - // But we need this to check permissions and it is how texture control finds items - for (S32 i = 0; i < items.size(); i++) - { - LLViewerInventoryItem* itemp = items[i]; - if (itemp && itemp->isFinished()) - { - // dropTextureAllFaces will fail if incomplete - LLPermissions item_permissions = itemp->getPermissions(); - if (item_permissions.allowOperationBy(PERM_COPY, - gAgent.getID(), - gAgent.getGroupID())) - { - itemp_res = itemp; - break; // first match - } - } - } - } + get_item_and_permissions(imageid, img_itemp_res, img_full_perm, img_from_library, te_data["te"], "img"); - if (itemp_res) + if (img_itemp_res) { if (te == -1) // all faces { LLToolDragAndDrop::dropTextureAllFaces(objectp, - itemp_res, - from_library ? LLToolDragAndDrop::SOURCE_LIBRARY : LLToolDragAndDrop::SOURCE_AGENT, + img_itemp_res, + img_from_library ? LLToolDragAndDrop::SOURCE_LIBRARY : LLToolDragAndDrop::SOURCE_AGENT, LLUUID::null, false); } @@ -4423,15 +4525,15 @@ void LLPanelFace::onPasteTexture(LLViewerObject* objectp, S32 te) { LLToolDragAndDrop::dropTextureOneFace(objectp, te, - itemp_res, - from_library ? LLToolDragAndDrop::SOURCE_LIBRARY : LLToolDragAndDrop::SOURCE_AGENT, + img_itemp_res, + img_from_library ? LLToolDragAndDrop::SOURCE_LIBRARY : LLToolDragAndDrop::SOURCE_AGENT, LLUUID::null, false, 0); } } // not an inventory item or no complete items - else if (full_perm) + else if (img_full_perm) { // Either library, local or existed as fullperm when user made a copy LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture(imageid, FTT_DEFAULT, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); @@ -4459,17 +4561,65 @@ void LLPanelFace::onPasteTexture(LLViewerObject* objectp, S32 te) // PBR/GLTF if (te_data["te"].has("pbr")) { - objectp->setRenderMaterialID(te, te_data["te"]["pbr"].asUUID(), false /*managing our own update*/); - tep->setGLTFRenderMaterial(nullptr); - tep->setGLTFMaterialOverride(nullptr); + const LLUUID pbr_id = te_data["te"]["pbr"].asUUID(); + bool pbr_full_perm = false; + bool pbr_from_library = false; + LLViewerInventoryItem* pbr_itemp_res = NULL; + + get_item_and_permissions(pbr_id, pbr_itemp_res, pbr_full_perm, pbr_from_library, te_data["te"], "pbr"); + bool allow = true; + + // check overrides first since they don't need t be moved to inventory if (te_data["te"].has("pbr_override")) { - LLGLTFMaterialList::queueApply(objectp, te, te_data["te"]["pbr"].asUUID(), te_data["te"]["pbr_override"]); + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + { + const std::string prefix = "pbr" + std::to_string(i); + if (te_data["te"].has(prefix + "imageid")) + { + LLUUID tex_id = te_data["te"][prefix + "imageid"]; + + bool full_perm = false; + bool from_library = false; + LLViewerInventoryItem* itemp_res = NULL; + get_item_and_permissions(tex_id, itemp_res, full_perm, from_library, te_data["te"], prefix); + allow = full_perm; + if (!allow) break; + } + } + } + + if (allow && pbr_itemp_res) + { + if (pbr_itemp_res) + { + allow = LLToolDragAndDrop::handleDropMaterialProtections( + objectp, + pbr_itemp_res, + pbr_from_library ? LLToolDragAndDrop::SOURCE_LIBRARY : LLToolDragAndDrop::SOURCE_AGENT, + pbr_id); + } + else + { + allow = pbr_full_perm; + } } - else + + if (allow) { - LLGLTFMaterialList::queueApply(objectp, te, te_data["te"]["pbr"].asUUID()); + objectp->setRenderMaterialID(te, te_data["te"]["pbr"].asUUID(), false /*managing our own update*/); + tep->setGLTFRenderMaterial(nullptr); + tep->setGLTFMaterialOverride(nullptr); + + if (te_data["te"].has("pbr_override")) + { + LLGLTFMaterialList::queueApply(objectp, te, te_data["te"]["pbr"].asUUID(), te_data["te"]["pbr_override"]); + } + else + { + LLGLTFMaterialList::queueApply(objectp, te, te_data["te"]["pbr"].asUUID()); + } } } else diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h index 6e0d34cbd6..b59f7434af 100644 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -264,6 +264,9 @@ public: // needs to be accessible to selection manager void onCopyTexture(); void onPasteTexture(); void onPasteTexture(LLViewerObject* objectp, S32 te); +private: + // for copy/paste operations + bool validateInventoryItem(const LLSD& te, const std::string& prefix); protected: void menuDoToSelected(const LLSD& userdata); diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 35057a910a..20127f5f27 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -88,7 +88,8 @@ bool get_is_predefined_texture(LLUUID asset_id) || asset_id == DEFAULT_OBJECT_NORMAL || asset_id == BLANK_OBJECT_NORMAL || asset_id == IMG_WHITE - || asset_id == LLUUID(SCULPT_DEFAULT_TEXTURE)) + || asset_id == LLUUID(SCULPT_DEFAULT_TEXTURE) + || asset_id == BLANK_MATERIAL_ASSET_ID) { return true; } -- cgit v1.2.3 From fdda524ee1395c7dd5d5f65ce1f61c64e256c531 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Tue, 29 Apr 2025 00:50:38 +0300 Subject: #3791 check against alpha blending as a part of determining exclude water --- indra/newview/llpanelface.cpp | 111 ++++++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 54 deletions(-) diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 2e57e2a5bd..99471a2555 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -1106,6 +1106,63 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) updateVisibility(objectp); + bool missing_asset = false; + { + LLGLenum image_format = GL_RGB; + bool identical_image_format = false; + LLSelectedTE::getImageFormat(image_format, identical_image_format, missing_asset); + + if (!missing_asset) + { + mIsAlpha = false; + switch (image_format) + { + case GL_RGBA: + case GL_ALPHA: + { + mIsAlpha = true; + } + break; + + case GL_RGB: + break; + default: + { + LL_WARNS() << "Unexpected tex format in LLPanelFace...resorting to no alpha" << LL_ENDL; + } + break; + } + } + else + { + // Don't know image's properties, use material's mode value + mIsAlpha = true; + } + + // Diffuse Alpha Mode + // Init to the default that is appropriate for the alpha content of the asset + // + U8 alpha_mode = mIsAlpha ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : LLMaterial::DIFFUSE_ALPHA_MODE_NONE; + + bool identical_alpha_mode = false; + + // See if that's been overridden by a material setting for same... + // + LLSelectedTEMaterial::getCurrentDiffuseAlphaMode(alpha_mode, identical_alpha_mode, mIsAlpha); + + // it is invalid to have any alpha mode other than blend if transparency is greater than zero ... + // Want masking? Want emissive? Tough! You get BLEND! + alpha_mode = (transparency > 0.f) ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : alpha_mode; + + // ... unless there is no alpha channel in the texture, in which case alpha mode MUST be none + alpha_mode = mIsAlpha ? alpha_mode : LLMaterial::DIFFUSE_ALPHA_MODE_NONE; + + mComboAlphaMode->getSelectionInterface()->selectNthItem(alpha_mode); + updateAlphaControls(); + + mExcludeWater &= (LLMaterial::DIFFUSE_ALPHA_MODE_BLEND == alpha_mode); + } + // Water exclusion { mCheckHideWater->setEnabled(editable && !has_pbr_material && !isMediaTexSelected()); @@ -1188,65 +1245,11 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) // Texture { - LLGLenum image_format = GL_RGB; - bool identical_image_format = false; - bool missing_asset = false; - LLSelectedTE::getImageFormat(image_format, identical_image_format, missing_asset); - - if (!missing_asset) - { - mIsAlpha = false; - switch (image_format) - { - case GL_RGBA: - case GL_ALPHA: - { - mIsAlpha = true; - } - break; - - case GL_RGB: break; - default: - { - LL_WARNS() << "Unexpected tex format in LLPanelFace...resorting to no alpha" << LL_ENDL; - } - break; - } - } - else - { - // Don't know image's properties, use material's mode value - mIsAlpha = true; - } - if (LLViewerMedia::getInstance()->textureHasMedia(id)) { mBtnAlign->setEnabled(editable); } - // Diffuse Alpha Mode - - // Init to the default that is appropriate for the alpha content of the asset - // - U8 alpha_mode = mIsAlpha ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : LLMaterial::DIFFUSE_ALPHA_MODE_NONE; - - bool identical_alpha_mode = false; - - // See if that's been overridden by a material setting for same... - // - LLSelectedTEMaterial::getCurrentDiffuseAlphaMode(alpha_mode, identical_alpha_mode, mIsAlpha); - - // it is invalid to have any alpha mode other than blend if transparency is greater than zero ... - // Want masking? Want emissive? Tough! You get BLEND! - alpha_mode = (transparency > 0.f) ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : alpha_mode; - - // ... unless there is no alpha channel in the texture, in which case alpha mode MUST be none - alpha_mode = mIsAlpha ? alpha_mode : LLMaterial::DIFFUSE_ALPHA_MODE_NONE; - - mComboAlphaMode->getSelectionInterface()->selectNthItem(alpha_mode); - - updateAlphaControls(); - if (mTextureCtrl) { if (identical_diffuse) -- cgit v1.2.3 From d9e55c44152064133796bfb08f1da524387c1300 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 29 Apr 2025 17:09:19 +0300 Subject: #3997 Crash in a gltf asset enabled region --- indra/llrender/llglslshader.cpp | 6 +++--- indra/newview/gltfscenemanager.cpp | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 50e40a3eb6..3735a99109 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -1076,8 +1076,8 @@ void LLGLSLShader::bind() void LLGLSLShader::bind(U8 variant) { - llassert(mGLTFVariants.size() == LLGLSLShader::NUM_GLTF_VARIANTS); - llassert(variant < LLGLSLShader::NUM_GLTF_VARIANTS); + llassert_always(mGLTFVariants.size() == LLGLSLShader::NUM_GLTF_VARIANTS); + llassert_always(variant < LLGLSLShader::NUM_GLTF_VARIANTS); mGLTFVariants[variant].bind(); } @@ -1085,7 +1085,7 @@ void LLGLSLShader::bind(bool rigged) { if (rigged) { - llassert(mRiggedVariant); + llassert_always(mRiggedVariant); mRiggedVariant->bind(); } else diff --git a/indra/newview/gltfscenemanager.cpp b/indra/newview/gltfscenemanager.cpp index e0cd762776..9faead9533 100644 --- a/indra/newview/gltfscenemanager.cpp +++ b/indra/newview/gltfscenemanager.cpp @@ -643,6 +643,12 @@ void GLTFSceneManager::render(Asset& asset, U8 variant) return; } + if (gGLTFPBRMetallicRoughnessProgram.mGLTFVariants.size() <= variant) + { + llassert(false); // mGLTFVariants should have been initialized + return; + } + for (U32 ds = 0; ds < 2; ++ds) { RenderData& rd = asset.mRenderData[ds]; -- cgit v1.2.3 From 98078b9aade28c8e24f74103f57f96bcdacd4fa4 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Wed, 30 Apr 2025 15:06:56 +0300 Subject: #3748 Don't allow dropping material onto water exclusion surface --- indra/newview/lltooldraganddrop.cpp | 49 +++++++++++++++++++++- .../newview/skins/default/xui/en/notifications.xml | 9 ++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 9d6f44c096..ff4fcc2b0b 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -2351,6 +2351,47 @@ EAcceptance LLToolDragAndDrop::dad3dRezScript( return rv; } + +bool is_water_exclusion_face(LLViewerObject* obj, S32 face) +{ + LLViewerTexture* image = obj->getTEImage(face); + if (!image) + return false; + + // magic texture and alpha blending + bool exclude_water = (image->getID() == IMG_ALPHA_GRAD) && obj->isImageAlphaBlended(face); + + // transparency + exclude_water &= (obj->getTE(face)->getColor().mV[VALPHA] == 1); + + //absence of normal and specular textures + image = obj->getTENormalMap(face); + if (image && image != LLViewerFetchedTexture::sDefaultImagep) + exclude_water &= image->getID().isNull(); + image = obj->getTESpecularMap(face); + if (image && image != LLViewerFetchedTexture::sDefaultImagep) + exclude_water &= image->getID().isNull(); + + return exclude_water; +} + +bool is_water_exclusion_surface(LLViewerObject* obj, S32 face, bool all_faces) +{ + if (all_faces) + { + bool exclude_water = false; + for (S32 it_face = 0; it_face < obj->getNumTEs(); it_face++) + { + exclude_water |= is_water_exclusion_face(obj, it_face); + } + return exclude_water; + } + else + { + return is_water_exclusion_face(obj, face); + } +} + EAcceptance LLToolDragAndDrop::dad3dApplyToObject( LLViewerObject* obj, S32 face, MASK mask, bool drop, EDragAndDropType cargo_type) { @@ -2441,7 +2482,13 @@ EAcceptance LLToolDragAndDrop::dad3dApplyToObject( else if (cargo_type == DAD_MATERIAL) { bool all_faces = mask & MASK_SHIFT; - if (item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID())) + + if (is_water_exclusion_surface(obj, face, all_faces)) + { + LLNotificationsUtil::add("WaterExclusionNoMaterial"); + return ACCEPT_NO; + } + else if (item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID())) { dropMaterial(obj, face, item, mSource, mSourceID, all_faces); } diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 1a56d7e3a3..a51feeb7ab 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -12610,4 +12610,13 @@ are wearing now. notext="Cancel" yestext="Continue"/> + + + Unable to apply material to the water exclusion surface. + fail + -- cgit v1.2.3 From a0cbf22d64862aa9a2036541c39f868d1c384cf1 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 1 May 2025 10:50:56 +0300 Subject: #4001 Bump cache version --- indra/newview/llappviewer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 7e7aa521d3..677f34456e 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -4248,7 +4248,7 @@ U32 LLAppViewer::getTextureCacheVersion() U32 LLAppViewer::getDiskCacheVersion() { // Viewer disk cache version intorduced in Simple Cache Viewer, change if the cache format changes. - const U32 DISK_CACHE_VERSION = 2; + const U32 DISK_CACHE_VERSION = 3; return DISK_CACHE_VERSION ; } -- cgit v1.2.3 From 9ce012a0f4cb22de1e255b659d5d46192af35e92 Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Sat, 3 May 2025 10:28:34 +0300 Subject: #4015 Restore formatting for strings.xml and teleport_strings.xml translations --- indra/newview/skins/default/xui/da/strings.xml | 90 +- .../skins/default/xui/da/teleport_strings.xml | 4 +- indra/newview/skins/default/xui/de/strings.xml | 7898 ++++++++++++++----- .../skins/default/xui/de/teleport_strings.xml | 124 +- indra/newview/skins/default/xui/es/strings.xml | 7774 ++++++++++++++----- .../skins/default/xui/es/teleport_strings.xml | 120 +- indra/newview/skins/default/xui/fr/strings.xml | 7900 +++++++++++++++----- .../skins/default/xui/fr/teleport_strings.xml | 122 +- indra/newview/skins/default/xui/it/strings.xml | 7790 ++++++++++++++----- .../skins/default/xui/it/teleport_strings.xml | 118 +- indra/newview/skins/default/xui/ja/strings.xml | 2 +- indra/newview/skins/default/xui/pl/strings.xml | 24 +- .../skins/default/xui/pl/teleport_strings.xml | 2 +- indra/newview/skins/default/xui/pt/strings.xml | 7738 ++++++++++++++----- .../skins/default/xui/pt/teleport_strings.xml | 118 +- indra/newview/skins/default/xui/ru/strings.xml | 16 +- indra/newview/skins/default/xui/tr/strings.xml | 98 +- .../skins/default/xui/tr/teleport_strings.xml | 6 +- indra/newview/skins/default/xui/zh/strings.xml | 22 +- .../skins/default/xui/zh/teleport_strings.xml | 2 +- 20 files changed, 29624 insertions(+), 10344 deletions(-) diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml index c4275d43f7..e54995890c 100644 --- a/indra/newview/skins/default/xui/da/strings.xml +++ b/indra/newview/skins/default/xui/da/strings.xml @@ -1,8 +1,4 @@ - SECOND LIFE @@ -554,9 +550,9 @@ Prøv venligst om lidt igen. mesh - - indstillinger - + + indstillinger + (Redigering Udseende) @@ -819,10 +815,10 @@ Prøv venligst om lidt igen. Du vil nu blive dirigeret til lokal stemme chat - '[OBJECTNAME]', en genstand, ejet af '[OWNERNAME]', lokaliseret i [REGIONNAME] på [REGIONPOS], har fået tilladelse til: [PERMISSIONS]. + '[OBJECTNAME]', en genstand, ejet af '[OWNERNAME]', lokaliseret i [REGIONNAME] på [REGIONPOS], har fået tilladelse til: [PERMISSIONS]. - '[OBJECTNAME]', en genstand, ejet af '[OWNERNAME]', lokaliseret i [REGIONNAME] på [REGIONPOS], er afvist tilladelse til: [PERMISSIONS]. + '[OBJECTNAME]', en genstand, ejet af '[OWNERNAME]', lokaliseret i [REGIONNAME] på [REGIONPOS], er afvist tilladelse til: [PERMISSIONS]. Tag Linden dollars (L$) fra dig @@ -933,16 +929,16 @@ Prøv venligst om lidt igen. Vælg bibliotek - Sæt "til stede" + Sæt "til stede" - Sæt "væk" + Sæt "væk" - Sæt "ledig" + Sæt "ledig" - Sæt "optaget" + Sæt "optaget" Form @@ -1169,8 +1165,10 @@ Prøv venligst om lidt igen. Du har ikke en kopi af denne tekstur i din beholdning - Ikke låst - + + Ikke låst + + @@ -1568,16 +1566,16 @@ Prøv venligst om lidt igen. nulstil - Sæt "running" fremskridt + Sæt "running" fremskridt - sæt til "running" + sæt til "running" - Sæt "Not Running" fremskridt + Sæt "Not Running" fremskridt - sæt til "not running" + sæt til "not running" Kompleret uden fejl! @@ -1589,7 +1587,7 @@ Prøv venligst om lidt igen. Gemt. - Script ("object out of range") + Script ("object out of range") Objekt [OBJECT] ejet af [OWNER] @@ -1660,13 +1658,13 @@ Prøv venligst om lidt igen. Memory brugt: [COUNT] kb - Parcel Script URL'er + Parcel Script URL'er - URL'er brugt: [COUNT] ud af [MAX]; [AVAILABLE] tilgængelige + URL'er brugt: [COUNT] ud af [MAX]; [AVAILABLE] tilgængelige - URL'er brugt: [COUNT] + URL'er brugt: [COUNT] Fejl ved anmodning om information @@ -1813,7 +1811,7 @@ Prøv venligst om lidt igen. Nyt script - Beboeren du sendte en besked er 'optaget', hvilket betyder at han/hun ikke vil forstyrres. Din besked vil blive vis i hans/hendes IM panel til senere visning. + Beboeren du sendte en besked er 'optaget', hvilket betyder at han/hun ikke vil forstyrres. Din besked vil blive vis i hans/hendes IM panel til senere visning. (Efter navn) @@ -2121,11 +2119,11 @@ Hvis fejlen stadig bliver ved, kan det være nødvendigt at afinstallere [APP_NA [APP_NAME] kører allerede. -Undersøg din "task bar" for at se efter minimeret version af programmet. +Undersøg din "task bar" for at se efter minimeret version af programmet. Hvis fejlen fortsætter, prøv at genstarte din computer. - [APP_NAME] ser ud til at være "frosset" eller gået ned tidligere. + [APP_NAME] ser ud til at være "frosset" eller gået ned tidligere. Ønsker du at sende en fejlrapport? @@ -2161,39 +2159,39 @@ Afvikler i vindue. Fejl ved nedlukning - Kan ikke oprette "GL device context" + Kan ikke oprette "GL device context" - Kan ikke finde passende "pixel format" + Kan ikke finde passende "pixel format" - Kan ikke finde "pixel format" beskrivelse + Kan ikke finde "pixel format" beskrivelse - [APP_NAME] kræver "True Color (32-bit)" for at kunne køre. -Gå venligst til din computers skærmopsætning og sæt "color mode" til 32-bit. + [APP_NAME] kræver "True Color (32-bit)" for at kunne køre. +Gå venligst til din computers skærmopsætning og sæt "color mode" til 32-bit. - [APP_NAME] kan ikke køre, da den ikke kan finde en "8 bit alpha channel". Normalt skyldes dette et problem med en video driver. + [APP_NAME] kan ikke køre, da den ikke kan finde en "8 bit alpha channel". Normalt skyldes dette et problem med en video driver. Venligst undersøg om du har de nyeste drivere til dit videokort installeret. -Din skærm skal også være sat op til at køre "True Color (32-bit)" i din displayopsætning. +Din skærm skal også være sat op til at køre "True Color (32-bit)" i din displayopsætning. Hvis du bliver ved med at modtage denne besked, kontakt [SUPPORT_SITE]. - Kan ikke sætte "pixel format" + Kan ikke sætte "pixel format" - Kan ikke oprette "GL rendering context" + Kan ikke oprette "GL rendering context" - Kan ikke aktivere "GL rendering context" + Kan ikke aktivere "GL rendering context" [APP_NAME] kan ikke afvikles da driverne til dit videokort ikke blev installeret korrekt, er forældede, eller du benytter hardware der ikke er supporteret. Undersøg venligst om du har installeret de nyeste drivere til dit grafikkort, og selv om du har de nyeste, prøv at geninstallere dem. Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. - + Skægstubbe @@ -3328,7 +3326,7 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. Skævt ansigt - "Måne" + "Måne" Venstre op @@ -3463,7 +3461,7 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. Sparsomt - Hår med "spikes" + Hår med "spikes" Firkantet @@ -3724,7 +3722,7 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. Konference med [AGENT_NAME] -Du chatter med en bot, [NAME]. Del ikke personlige oplysninger. + Du chatter med en bot, [NAME]. Del ikke personlige oplysninger. Læs mere på https://second.life/scripted-agents. @@ -3767,7 +3765,7 @@ Læs mere på https://second.life/scripted-agents. En gruppe moderator har deaktiveret din tekst chat. - Du er blevet "blokeret". + Du er blevet "blokeret". Ikke muligt at tilføge brugere til samtale med [RECIPIENT]. @@ -3797,7 +3795,7 @@ Læs mere på https://second.life/scripted-agents. [SOURCES] har sagt noget nyt - Initialisering af session er "timed out" + Initialisering af session er "timed out" Hjemmeposition sat. @@ -4030,7 +4028,7 @@ Krænkelsesanmeldelse Kvinde - Latter - Kvinde - "Ser godt ud" + Kvinde - "Ser godt ud" Kvinde - Herovre @@ -4144,7 +4142,7 @@ Krænkelsesanmeldelse Kan ikke benytte deb eksterne editor der er angivet. Prøv at omkrandse stien til editor med anførselstegn. -(f.eks. "/stil til min editor" "%s") +(f.eks. "/stil til min editor" "%s") Fejl ved håndtering af kommando til ekstern editor. @@ -4468,10 +4466,10 @@ Prøv at omkrandse stien til editor med anførselstegn. Viser pejlelys for fysiske objekter (grøn) - Viser pejlelys for "scriptede" objekter (rød) + Viser pejlelys for "scriptede" objekter (rød) - Viser pejlelys for "scriptede" objekter med berøringsfunktion (rød) + Viser pejlelys for "scriptede" objekter med berøringsfunktion (rød) Viser pejlelys for lyd (gul) diff --git a/indra/newview/skins/default/xui/da/teleport_strings.xml b/indra/newview/skins/default/xui/da/teleport_strings.xml index 0d89fae986..79ec69fd9b 100644 --- a/indra/newview/skins/default/xui/da/teleport_strings.xml +++ b/indra/newview/skins/default/xui/da/teleport_strings.xml @@ -21,8 +21,8 @@ Hvis du stadig ikke kan teleporte, prøv venligst at logge ud og ligge ind for a Prøv igen om lidt. - Du kan ikke teleportere tilbage til Welcome Island. -Gå til 'Welcome Island Puclic' for at prøve tutorial igen. + Du kan ikke teleportere tilbage til Welcome Island. +Gå til 'Welcome Island Puclic' for at prøve tutorial igen. Beklager, du har ikke adgang til denne teleport destination. diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index e9ed7f4949..f0945234a6 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -1,2078 +1,5918 @@ - Second Life - Second Life - SECOND LIFE - Second Life-Grid: - Second Life Support-Portal - Hardware wird erfasst... - [APP_NAME] wird geladen... - Cache wird gelöscht... - Textur-Cache wird initialisiert... - Grafikinitialisierung fehlgeschlagen. Bitte aktualisieren Sie Ihren Grafiktreiber. - [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]Bit) [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] - Build-Konfiguration [BUILD_CONFIG] - Sie befinden sich an [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] auf <nolink>[HOSTNAME]</nolink> + + Second Life + + + Second Life + + + SECOND LIFE + + + Second Life-Grid: + + + Second Life Support-Portal + + + Hardware wird erfasst... + + + [APP_NAME] wird geladen... + + + Cache wird gelöscht... + + + Textur-Cache wird initialisiert... + + + Grafikinitialisierung fehlgeschlagen. Bitte aktualisieren Sie Ihren Grafiktreiber. + + + [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]Bit) [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] + + + Build-Konfiguration [BUILD_CONFIG] + + + Sie befinden sich an [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] auf <nolink>[HOSTNAME]</nolink> SLURL: <nolink>[SLURL]</nolink> (globale Koordinaten [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] -[SERVER_RELEASE_NOTES_URL] - CPU: [CPU] +[SERVER_RELEASE_NOTES_URL] + + + CPU: [CPU] Speicher: [MEMORY_MB] MB Betriebssystemversion: [OS_VERSION] Grafikkartenhersteller: [GRAPHICS_CARD_VENDOR] -Grafikkarte: [GRAPHICS_CARD] - Windows-Grafiktreiberversion: [GRAPHICS_DRIVER_VERSION] - OpenGL-Version: [OPENGL_VERSION] - Fenstergröße: [WINDOW_WIDTH]x[WINDOW_HEIGHT] +Grafikkarte: [GRAPHICS_CARD] + + + Windows-Grafiktreiberversion: [GRAPHICS_DRIVER_VERSION] + + + OpenGL-Version: [OPENGL_VERSION] + + + Fenstergröße: [WINDOW_WIDTH]x[WINDOW_HEIGHT] Schriftgrößenanpassung: [FONT_SIZE_ADJUSTMENT] pt UI-Skalierung: [UI_SCALE] Sichtweite: [DRAW_DISTANCE] m Bandbreite: [NET_BANDWITH] kbit/s LOD-Faktor: [LOD_FACTOR] Darstellungsqualität: [RENDER_QUALITY] -Texturspeicher: [TEXTURE_MEMORY] MB - HiDPI-Anzeigemodus: [HIDPI] - J2C-Decoderversion: [J2C_VERSION] +Texturspeicher: [TEXTURE_MEMORY] MB + + + HiDPI-Anzeigemodus: [HIDPI] + + + J2C-Decoderversion: [J2C_VERSION] Audiotreiberversion: [AUDIO_DRIVER_VERSION] [LIBCEF_VERSION] LibVLC-Version: [LIBVLC_VERSION] -Voice-Server-Version: [VOICE_VERSION] - Paketverlust: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1] %) - [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] - Fehler beim Abrufen der URL für die Server-Versionshinweise. - Build-Konfiguration - Wird wiederhergestellt... - Auflösung wird geändert... - Fullbright (Legacy) - Anmeldevorgang gestartet. [APP_NAME] reagiert möglicherweise nicht. Bitte warten. - Anmeldung erfolgt... - Authentifizierung - Account wird aktualisiert... - Ein früherer Anmeldeversuch ist fehlgeschlagen. Anmeldung, Versuch [NUMBER] - Welt wird geladen... - Integrierter Webbrowser wird initialisiert... - Multimedia wird initialisiert... - Schriftarten werden geladen... - Cache-Dateien werden überprüft (dauert 60-90 Sekunden)... - Antwort wird verarbeitet... - Welt wird initialisiert... - Bilder werden entpackt... - QuickTime wird initialisiert... - QuickTime nicht gefunden - Initialisierung nicht möglich. - QuickTime wurde initialisiert. - Regionsfähigkeiten anfordern... - Regionsfähigkeiten anfordern. Versuch [NUMBER]... - Region-Handshake... - Region-Verbindung... - Kleidung wird geladen... - Der Server hat ein ungültiges oder korruptes Zertifikate zurückgegeben. Bitte kontaktieren Sie den Grid-Administrator. - Ein ungültiger Hostname wurde verwendet, um auf den Server zuzugreifen. Bitte überprüfen Sie Ihre SLURL oder den Grid-Hostnamen. - Das vom Grid ausgegebene Zertifikate ist abgelaufen. Bitte überprüfen Sie Ihre Systemuhr oder kontaktieren Sie Ihren Grid-Administrator. - Das vom Server ausgegebene Zertifikat konnte nicht für SSL verwendet werden. Bitte kontaktieren Sie Ihren Grid-Administrator. - In der Zertifikatskette des Servers befanden sich zu viele Zertifikate. Bitte kontaktieren Sie Ihren Grid-Administrator. - Die Zertifikatsunterschrift des Gridservers konnte nicht bestätigt werden. Bitte kontaktieren Sie Ihren Grid-Administrator. - Netzwerkfehler: Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung. - Anmeldung fehlgeschlagen - Beenden - http://join.secondlife.com/?sourceid=[sourceid] - Second Life Main Grid (Agni) - Second Life Beta Test Grid (Aditi) - http://secondlife.com/download - Mit dem von Ihnen verwendeten Viewer ist der Zugriff auf Second Life nicht mehr möglich. Laden Sie von den folgenden Seite einen neuen Viewer herunter: +Voice-Server-Version: [VOICE_VERSION] + + + Paketverlust: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1] %) + + + [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] + + + Fehler beim Abrufen der URL für die Server-Versionshinweise. + + + Build-Konfiguration + + + Wird wiederhergestellt... + + + Auflösung wird geändert... + + + Fullbright (Legacy) + + + Anmeldevorgang gestartet. [APP_NAME] reagiert möglicherweise nicht. Bitte warten. + + + Anmeldung erfolgt... + + + Authentifizierung + + + Account wird aktualisiert... + + + Ein früherer Anmeldeversuch ist fehlgeschlagen. Anmeldung, Versuch [NUMBER] + + + Welt wird geladen... + + + Integrierter Webbrowser wird initialisiert... + + + Multimedia wird initialisiert... + + + Schriftarten werden geladen... + + + Cache-Dateien werden überprüft (dauert 60-90 Sekunden)... + + + Antwort wird verarbeitet... + + + Welt wird initialisiert... + + + Bilder werden entpackt... + + + QuickTime wird initialisiert... + + + QuickTime nicht gefunden - Initialisierung nicht möglich. + + + QuickTime wurde initialisiert. + + + Regionsfähigkeiten anfordern... + + + Regionsfähigkeiten anfordern. Versuch [NUMBER]... + + + Region-Handshake... + + + Region-Verbindung... + + + Kleidung wird geladen... + + + Der Server hat ein ungültiges oder korruptes Zertifikate zurückgegeben. Bitte kontaktieren Sie den Grid-Administrator. + + + Ein ungültiger Hostname wurde verwendet, um auf den Server zuzugreifen. Bitte überprüfen Sie Ihre SLURL oder den Grid-Hostnamen. + + + Das vom Grid ausgegebene Zertifikate ist abgelaufen. Bitte überprüfen Sie Ihre Systemuhr oder kontaktieren Sie Ihren Grid-Administrator. + + + Das vom Server ausgegebene Zertifikat konnte nicht für SSL verwendet werden. Bitte kontaktieren Sie Ihren Grid-Administrator. + + + In der Zertifikatskette des Servers befanden sich zu viele Zertifikate. Bitte kontaktieren Sie Ihren Grid-Administrator. + + + Die Zertifikatsunterschrift des Gridservers konnte nicht bestätigt werden. Bitte kontaktieren Sie Ihren Grid-Administrator. + + + Netzwerkfehler: Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung. + + + Anmeldung fehlgeschlagen + + + Beenden + + + http://join.secondlife.com/?sourceid=[sourceid] + + + Second Life Main Grid (Agni) + + + Second Life Beta Test Grid (Aditi) + + + http://secondlife.com/download + + + Mit dem von Ihnen verwendeten Viewer ist der Zugriff auf Second Life nicht mehr möglich. Laden Sie von den folgenden Seite einen neuen Viewer herunter: http://secondlife.com/download Weitere Informationen finden Sie auf der folgenden FAQ-Seite: -http://secondlife.com/viewer-access-faq - Optionales Viewer-Update verfügbar: [VERSION] - Erforderliches Viewer-Update: [VERSION] - Dieser Agent ist bereits angemeldet. - Wir bitten um Entschuldigung! Wir konnten Sie nicht anmelden. +http://secondlife.com/viewer-access-faq + + + Optionales Viewer-Update verfügbar: [VERSION] + + + Erforderliches Viewer-Update: [VERSION] + + + Dieser Agent ist bereits angemeldet. + + + Wir bitten um Entschuldigung! Wir konnten Sie nicht anmelden. Stellen Sie sicher, dass Sie die richtigen Informationen eingegeben haben: * Benutzername (wie robertschmidt12 oder warme.sonne) * Kennwort -Stellen Sie außerdem sicher, dass die Umschaltsperre deaktiviert ist. - Ihr Kennwort wurde aus Sicherheitsgründen geändert. +Stellen Sie außerdem sicher, dass die Umschaltsperre deaktiviert ist. + + + Ihr Kennwort wurde aus Sicherheitsgründen geändert. Gehen Sie zur Seite „Mein Account“ unter http://secondlife.com/password und beantworten Sie die Sicherheitsfrage, um Ihr Kennwort zurückzusetzen. -Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten. - Aufgrund von Systemänderungen müssen Sie Ihr Kennwort zurücksetzen. +Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten. + + + Aufgrund von Systemänderungen müssen Sie Ihr Kennwort zurücksetzen. Gehen Sie zur Seite „Mein Account“ unter http://secondlife.com/password und beantworten Sie die Sicherheitsfrage, um Ihr Kennwort zurückzusetzen. -Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten. - Second Life ist vorübergehend wegen Wartung geschlossen. +Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten. + + + Second Life ist vorübergehend wegen Wartung geschlossen. Nur Mitarbeiter können sich anmelden. -Aktuelle Informationen finden Sie unter www.secondlife.com/status. - Die Anmeldung bei Second Life ist vorübergehend eingeschränkt, um sicherzustellen, dass Einwohner, die sich bereits inworld aufhalten, das bestmögliche Erlebnis haben. +Aktuelle Informationen finden Sie unter www.secondlife.com/status. + + + Die Anmeldung bei Second Life ist vorübergehend eingeschränkt, um sicherzustellen, dass Einwohner, die sich bereits inworld aufhalten, das bestmögliche Erlebnis haben. -Benutzer mit kostenlosen Konten können sich während dieses Zeitraums nicht bei Second Life anmelden, damit die Kapazität Benutzern zur Verfügung steht, die ein gebührenpflichtiges Premium-Konto besitzen. - Der Zugriff auf Second Life ist von diesem Computer aus nicht möglich. +Benutzer mit kostenlosen Konten können sich während dieses Zeitraums nicht bei Second Life anmelden, damit die Kapazität Benutzern zur Verfügung steht, die ein gebührenpflichtiges Premium-Konto besitzen. + + + Der Zugriff auf Second Life ist von diesem Computer aus nicht möglich. Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an -support@secondlife.com. - Ihr Konto ist erst ab -[TIME] Pacific Time wieder verfügbar. - Ihre Anfrage kann derzeit nicht bearbeitet werden. -Bitte wenden Sie sich unter http://secondlife.com/support an den Second Life-Support. - Nicht übereinstimmende Daten bei der Anmeldung festgestellt. -Wenden Sie sich an support@secondlife.com. - An Ihrem Konto werden gerade kleinere Wartungsarbeiten durchgeführt. +support@secondlife.com. + + + Ihr Konto ist erst ab +[TIME] Pacific Time wieder verfügbar. + + + Ihre Anfrage kann derzeit nicht bearbeitet werden. +Bitte wenden Sie sich unter http://secondlife.com/support an den Second Life-Support. + + + Nicht übereinstimmende Daten bei der Anmeldung festgestellt. +Wenden Sie sich an support@secondlife.com. + + + An Ihrem Konto werden gerade kleinere Wartungsarbeiten durchgeführt. Ihr Konto ist erst ab [TIME] Pacific Time wieder verfügbar. -Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. - Abmeldeanforderung führte zu einem Simulatorfehler. - Das System meldet Sie gerade ab. -Bitte warten Sie eine Minute, bevor Sie sich erneut einloggen. - Es kann keine gültige Sitzung erstellt werden. - Es kann keine Simulatorverbindung hergestellt werden. - Mit Ihrem Konto ist der Zugriff auf Second Life +Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. + + + Abmeldeanforderung führte zu einem Simulatorfehler. + + + Das System meldet Sie gerade ab. +Bitte warten Sie eine Minute, bevor Sie sich erneut einloggen. + + + Es kann keine gültige Sitzung erstellt werden. + + + Es kann keine Simulatorverbindung hergestellt werden. + + + Mit Ihrem Konto ist der Zugriff auf Second Life nur zwischen [START] und [END] Pacific Time möglich. Schauen Sie während dieses Zeitraums vorbei. -Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. - Falsche Parameter. -Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. - Vorname muss alphanumerisch sein. -Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. - Nachname muss alphanumerisch sein. -Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. - Die Region wird gerade offline geschaltet. -Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. - Agent nicht in Region. -Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. - Die Region war gerade dabei, eine andere Sitzung anzumelden. -Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. - Die Region war gerade dabei, die vorherige Sitzung abzumelden. -Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. - Die Region ist noch immer dabei, die vorherige Sitzung abzumelden. -Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. - Die Region hat soeben die letzte Sitzung abgemeldet. -Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. - Die Region hat den Abmeldevorgang gestartet. -Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. - Das System hat begonnen, Ihre letzte Sitzung abzumelden. -Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. - In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung. - Ihr Einstellungen werden gespeichert... - Abmeldung erfolgt... - Programm wird beendet... - Die Verbindung zu der Region ist abgebrochen. - Sie wurden in eine ungültige Region geschickt. - Verbindungsabbruch wird getestet - Mit Facebook verbinden... - Posten... - Facebook-Verbindung trennen... - Problem beim Verbinden mit Facebook - Problem beim Posten auf Facebook - Problem beim Trennen der Facebook-Verbindung - Verbinden mit Flickr... - Posten... - Flickr-Verbindung wird getrennt... - Problem beim Verbinden mit Flickr - Problem beim Posten auf Flickr - Problem beim Trennen der Flickr-Verbindung - Verbinden mit Twitter... - Posten... - Twitter-Verbindung wird getrennt... - Problem beim Verbinden mit Twitter - Problem beim Posten auf Twitter - Problem beim Trennen der Twitter-Verbindung - Schwarzweiß - Farben der Siebziger Jahre - Intensiv - Zeitungspapier - Sepia - Spotlight - Video - Autokontrast - Blendenfleck - Miniatur - Spielzeugkamera - Person - (namenlos) - Eigentümer: - Öffentlich - (Gruppe) - Zum Verkauf: [AMOUNT] L$ - Gruppenbau - Bauen aus - Gruppenbau - Unsicher - Fliegen aus - Gruppenskripte - Skripte aus - Land: - Sie können nur ein einzelnes Objekt hierher ziehen - Sie können keinen Ordner tragen, der mehr als [AMOUNT] Elemente enthält. Sie können diesen Höchstwert unter „Erweitert“ > „Debug-Einstellungen anzeigen“ > „WearFolderLimit“ ändern. +Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. + + + Falsche Parameter. +Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. + + + Vorname muss alphanumerisch sein. +Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. + + + Nachname muss alphanumerisch sein. +Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. + + + Die Region wird gerade offline geschaltet. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + + + Agent nicht in Region. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + + + Die Region war gerade dabei, eine andere Sitzung anzumelden. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + + + Die Region war gerade dabei, die vorherige Sitzung abzumelden. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + + + Die Region ist noch immer dabei, die vorherige Sitzung abzumelden. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + + + Die Region hat soeben die letzte Sitzung abgemeldet. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + + + Die Region hat den Abmeldevorgang gestartet. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + + + Das System hat begonnen, Ihre letzte Sitzung abzumelden. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + + + In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung. + + + Ihr Einstellungen werden gespeichert... + + + Abmeldung erfolgt... + + + Programm wird beendet... + + + Die Verbindung zu der Region ist abgebrochen. + + + Sie wurden in eine ungültige Region geschickt. + + + Verbindungsabbruch wird getestet + + + Mit Facebook verbinden... + + + Posten... + + + Facebook-Verbindung trennen... + + + Problem beim Verbinden mit Facebook + + + Problem beim Posten auf Facebook + + + Problem beim Trennen der Facebook-Verbindung + + + Verbinden mit Flickr... + + + Posten... + + + Flickr-Verbindung wird getrennt... + + + Problem beim Verbinden mit Flickr + + + Problem beim Posten auf Flickr + + + Problem beim Trennen der Flickr-Verbindung + + + Verbinden mit Twitter... + + + Posten... + + + Twitter-Verbindung wird getrennt... + + + Problem beim Verbinden mit Twitter + + + Problem beim Posten auf Twitter + + + Problem beim Trennen der Twitter-Verbindung + + + Schwarzweiß + + + Farben der Siebziger Jahre + + + Intensiv + + + Zeitungspapier + + + Sepia + + + Spotlight + + + Video + + + Autokontrast + + + Blendenfleck + + + Miniatur + + + Spielzeugkamera + + + Person + + + (namenlos) + + + Eigentümer: + + + Öffentlich + + + (Gruppe) + + + Zum Verkauf: [AMOUNT] L$ + + + Gruppenbau + + + Bauen aus + + + Gruppenbau + + + Unsicher + + + Fliegen aus + + + Gruppenskripte + + + Skripte aus + + + Land: + + + Sie können nur ein einzelnes Objekt hierher ziehen + + + Sie können keinen Ordner tragen, der mehr als [AMOUNT] Elemente enthält. Sie können diesen Höchstwert unter „Erweitert“ > „Debug-Einstellungen anzeigen“ > „WearFolderLimit“ ändern. + - Führt zu einer Seite in der offiziellen Domäne SecondLife.com oder LindenLab.com. - Sie können keine Objekte aus dem Marktplatz-Auflistungsordner rezzen - Sie können Objekte, die Sie tragen, nicht in den Marktplatz-Auflistungsordner stellen - Tiefe der verschachtelten Ordner überschreitet [AMOUNT]. Reduzieren Sie die Ordnertiefe. Verpacken Sie ggf. einige Artikel. - Anzahl von Unterordnern überschreitet [AMOUNT]. Reduzieren Sie die Anzahl von Ordnern in Ihrer Auflistung. Verpacken Sie ggf. einige Artikel. - Anzahl von Objekten überschreitet [AMOUNT]. Um mehr als [AMOUNT] Objekte in einer Auflistung verkaufen zu können, müssen Sie einige davon verpacken. - Anzahl von Bestandsobjekten überschreitet [AMOUNT]. - Sie können Objekte oder Ordner nur in der Registerkarte „ALLE“ oder „NICHT VERKNüPFT“ ablegen. Klicken Sie auf eine dieser Registerkarten und versuchen Sie dann erneut, Ihre Objekte bzw. Ordner zu verschieben. - Mindestens eines dieser Objekte kann nicht verkauft oder übertragen werden - Sie können nur Objekte aus Ihrem Inventar in den Marktplatz einstellen - Sie können keine verknüpften Objekte oder Ordner in den Marktplatz einstellen - Sie können Visitenkarten nicht in den Marktplatz einstellen - Sie können keine gelistete Auflistung entfernen - Der Stammordner mit Marktplatz-Auflistungen kann nicht verschoben werden. - Alle Objekte in einem Bestandsordner müssen vom gleichen Typ sein und die gleiche Berechtigung haben - Sie können einen Ordner nicht in einen seiner untergeordneten Ordner verschieben - Sie können einen Ordner nicht in sich selbst verschieben - Anklicken, um Webseite anzuzeigen - Anklicken, um Informationen zu diesem Standort anzuzeigen - Anklicken, um das Profil dieses Einwohners anzuzeigen - Mehr über diesen Einwohner - Klicken, um diesen Einwohner stummzuschalten - Klicken, um diesen Einwohner freizuschalten - Klicken, um diesem Einwohner eine IM zu schicken. - Klicken, um diesen Einwohner zu bezahlen - Klicken, um diesem Einwohner einen Teleport anzubieten. - Klicken, um diesem Einwohner ein Freundschaftsangebot zu schicken. - Anklicken, um Beschreibung der Gruppe anzuzeigen - Anklicken, um Beschreibung der Veranstaltung anzuzeigen - Anklicken, um diese Anzeige anzuzeigen - Anklicken, um Beschreibung der Parzelle anzuzeigen - Anklicken, um zu diesem Standort zu teleportieren - Anklicken, um Beschreibung des Objekts anzuzeigen - Klicken, um diese Position auf der Karte anzuzeigen - Anklicken, um Befehl secondlife:// auszuführen + + Führt zu einer Seite in der offiziellen Domäne SecondLife.com oder LindenLab.com. + + + Sie können keine Objekte aus dem Marktplatz-Auflistungsordner rezzen + + + Sie können Objekte, die Sie tragen, nicht in den Marktplatz-Auflistungsordner stellen + + + Tiefe der verschachtelten Ordner überschreitet [AMOUNT]. Reduzieren Sie die Ordnertiefe. Verpacken Sie ggf. einige Artikel. + + + Anzahl von Unterordnern überschreitet [AMOUNT]. Reduzieren Sie die Anzahl von Ordnern in Ihrer Auflistung. Verpacken Sie ggf. einige Artikel. + + + Anzahl von Objekten überschreitet [AMOUNT]. Um mehr als [AMOUNT] Objekte in einer Auflistung verkaufen zu können, müssen Sie einige davon verpacken. + + + Anzahl von Bestandsobjekten überschreitet [AMOUNT]. + + + Sie können Objekte oder Ordner nur in der Registerkarte „ALLE“ oder „NICHT VERKNüPFT“ ablegen. Klicken Sie auf eine dieser Registerkarten und versuchen Sie dann erneut, Ihre Objekte bzw. Ordner zu verschieben. + + + Mindestens eines dieser Objekte kann nicht verkauft oder übertragen werden + + + Sie können nur Objekte aus Ihrem Inventar in den Marktplatz einstellen + + + Sie können keine verknüpften Objekte oder Ordner in den Marktplatz einstellen + + + Sie können Visitenkarten nicht in den Marktplatz einstellen + + + Sie können keine gelistete Auflistung entfernen + + + Der Stammordner mit Marktplatz-Auflistungen kann nicht verschoben werden. + + + Alle Objekte in einem Bestandsordner müssen vom gleichen Typ sein und die gleiche Berechtigung haben + + + Sie können einen Ordner nicht in einen seiner untergeordneten Ordner verschieben + + + Sie können einen Ordner nicht in sich selbst verschieben + + + Anklicken, um Webseite anzuzeigen + + + Anklicken, um Informationen zu diesem Standort anzuzeigen + + + Anklicken, um das Profil dieses Einwohners anzuzeigen + + + Mehr über diesen Einwohner + + + Klicken, um diesen Einwohner stummzuschalten + + + Klicken, um diesen Einwohner freizuschalten + + + Klicken, um diesem Einwohner eine IM zu schicken. + + + Klicken, um diesen Einwohner zu bezahlen + + + Klicken, um diesem Einwohner einen Teleport anzubieten. + + + Klicken, um diesem Einwohner ein Freundschaftsangebot zu schicken. + + + Anklicken, um Beschreibung der Gruppe anzuzeigen + + + Anklicken, um Beschreibung der Veranstaltung anzuzeigen + + + Anklicken, um diese Anzeige anzuzeigen + + + Anklicken, um Beschreibung der Parzelle anzuzeigen + + + Anklicken, um zu diesem Standort zu teleportieren + + + Anklicken, um Beschreibung des Objekts anzuzeigen + + + Klicken, um diese Position auf der Karte anzuzeigen + + + Anklicken, um Befehl secondlife:// auszuführen + - Klicken, um eine E-Mail zu verfassen - Teleportieren nach - Karte anzeigen für - Stummschalten - Stummschaltung aufheben - IM - Bezahlen - Teleportangebot an - Freundschaftsangebot - Entfernen von Freunden - Schließen (⌘W) - Schließen (Strg+W) - Schließen - Wiederherstellen - Minimieren - Abnehmen - Andocken - Hilfe anzeigen - Objekte dieses Typs können nicht an Notizkarten -für diese Region angehängt werden. - An Notizkarten können nur Objekte ohne + + Klicken, um eine E-Mail zu verfassen + + + Teleportieren nach + + + Karte anzeigen für + + + Stummschalten + + + Stummschaltung aufheben + + + IM + + + Bezahlen + + + Teleportangebot an + + + Freundschaftsangebot + + + Entfernen von Freunden + + + Schließen (⌘W) + + + Schließen (Strg+W) + + + Schließen + + + Wiederherstellen + + + Minimieren + + + Abnehmen + + + Andocken + + + Hilfe anzeigen + + + Objekte dieses Typs können nicht an Notizkarten +für diese Region angehängt werden. + + + An Notizkarten können nur Objekte ohne Berechtigungseinschränkungen für den -nächsten Eigentümer angehängt werden. - Suchen... - Nicht gefunden. - Laden... - Versionshinweise - https://releasenotes.secondlife.com/viewer/ - Wird geladen... - (niemand) - (wartet) - (mehrere) - (keiner) - Kein Fehler - Asset-Anforderung: fehlgeschlagen - Asset-Anforderung: Datei existiert nicht - Asset-Anforderung: Asset in Datenbank nicht gefunden - Ende der Datei - Datei kann nicht geöffnet werden - Datei nicht gefunden - Zeitüberschreitung bei Dateiübertragung - Verbindung verloren - Viewer und Server sind sich nicht über Preis einig - Status unbekannt - Dienst nicht verfügbar. - Auf dem Server sind unerwartete Probleme aufgetreten. - Dienst nicht verfügbar oder Zeitüberschreitung beim Upload. - Fehler bei der Upload-Anforderung. Um das Problem zu lösen, -besuchen Sie bitte http://secondlife.com/support - Validierung für das Importieren der Einstellungen [NAME] fehlgeschlagen - [FILE] konnte nicht geöffnet werden - [FILE] konnte nicht geöffnet werden - Altes Windlight [NAME] konnte nicht übernommen werden - Textur - Sound - Visitenkarte - Landmarke - Skript (veraltet) - Kleidung - Objekt - Notizkarte - Ordner - Hauptverzeichnis - LSL2 Skript - LSL Bytecode - tga-Textur - Körperteil - Foto - Fundbüro - targa-Bild - Papierkorb - jpeg-Bild - Animation - Geste - simstate - Favoriten - Link - Link zu Ordner - Einstellungen - mesh - (Aussehen wird bearbeitet) - Abwesend - Nicht stören - Ignoriert - Ängstlich - Verärgert - Abwesend - Rückwärtssalto - Lachkrampf - Grinsen - Kusshand - Gelangweilt - Verbeugen - Klatschen - Diener - Weinen - Tanz 1 - Tanz 2 - Tanz 3 - Tanz 4 - Tanz 5 - Tanz 6 - Tanz 7 - Tanz 8 - Verachten - Trinken - Verlegen - Drohen - Faust pumpen - Yogaflieger - Stirnrunzeln - Ungeduldig - Freudensprung - LMA - Küssen - Lachen - Posen - Nein (Bedauernd) - Nein - Ällabätsch - Eins-Zwei-Punch - Mund offen - Friede - Auf anderen zeigen - Auf mich zeigen - Linker Haken - Rechter Haken - SSP zählen - SSP Papier - SSP Stein - SSP Schere - Angewidert - Rundkick - Traurig - Salutieren - Rufen - Schulterzucken - Lächeln - Zigarette halten - Rauchen - Zigarette wegwerfen - Überraschung - Schwerthieb - Wutanfall - Zunge rausstrecken - Winken - Flüstern - Pfeifen - Zwinkern - Zwinkern (Hollywood) - Sorgenvoll - Ja (Erfreut) - Ja - Mehrfach - Textur verwenden - Zum Einrasten Mauscursor - über Lineal bewegen - Wird geladen... - Offline - [PRICE] L$ für [AREA] m² - Nicht gefunden. - OK - Unvollständige Datei - HAUPTVERZEICHNIS oder VERBINDUNG nicht gefunden. - Chat in der Nähe - (Chat in der Nähe) - flüstert: - ruft: - Verbindung mit In-Welt-Voice-Chat... - Verbunden - Der aktuelle Standort unterstützt keine Voice-Kommunikation - Verbindung mit In-Welt-Voice-Chat getrennt - Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden - Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung erteilt: [PERMISSIONS]. - Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung verweigert: [PERMISSIONS]. - Wenn Sie dem Objekt Zugriff auf Ihr Konto gewähren, kann dieses außerdem: - Linden-Dollar (L$) von Ihnen nehmen - Steuerung festlegen - Steuerung neu zuweisen - Avatar animieren - An Avatar anhängen - Eigentum aufgeben und öffentlich machen - Mit Objekten verknüpfen und davon trennen - Verbindungen zu anderen Objekten hinzufügen und entfernen - Berechtigungen ändern - Kameraverfolgung - Kamerasteuerung - Sie teleportieren - Ihren Avatar zwingen, sich zu setzen - Umgebungseinstellungen ändern - Nicht verbunden - (Sie) - - Beim Verwalten von Grundbesitzzugangslisten Warnhinweise unterdrücken - Ihre Standardanimationen ersetzen - Objekte in Ihrem Namen zurückgeben - (unbekannt) - Generell - Moderat - Adult - Offline - Unbekannt - (unbekannt) - Grundstück / Vollständige Region - Grundbesitz/Homestead - Mainland/Homestead - Mainland / Vollständige Region - Alle Dateien - Sounds - Animationen - Bilder - Speichern - Laden - Targa-Bilder - Bitmap-Bilder - PNG-Bilder - Targa- oder PNG-Bilder - AVI-Filmdatei - XAF Anim-Datei - XML-Datei - RAW-Datei - Komprimierte Bilder - Dateien laden - Verzeichnis auswählen - Skripts - Wörterbücher - Form - Haut - Haare - Augen - Hemd - Hose - Schuhe - Socken - Jacke - Handschuhe - Unterhemd - Unterhose - Rock - Alpha - Tätowierung - Universal - Physik - ungültig - keine - Hemd nicht getragen - Hosen nicht getragen - Schuhe nicht getragen - Socken nicht getragen - Jacke nicht getragen - Handschuhe nicht getragen - Unterhemd nicht getragen - Unterhose nicht getragen - Rock nicht getragen - Alpha nicht getragen - Tätowierung nicht getragen - Universal nicht getragen - Physik nicht getragen - ungültig - Neue Form/Gestalt erstellen - Neue Haut erstellen - Neue Haare erstellen - Neue Augen erstellen - Neues Hemd erstellen - Neue Hose erstellen - Neue Schuhe erstellen - Neue Socken erstellen - Neue Jacke erstellen - Neue Handschuhe erstellen - Neues Unterhemd erstellen - Neue Unterhose erstellen - Neuer Rock erstellen - Neue Alpha erstellen - Neue Tätowierung erstellen - Neues Universal erstellen - Neue Physik erstellen - ungültig - Neue/r/s [WEARABLE_ITEM] - Weiter - OK - Gruppenmitteilung - Gruppenmitteilungen - Gesendet von - Im Anhang: - Alte Mitteilungen anzeigen oder hier Auswahl treffen, um keine Mitteilungen mehr zu erhalten. - Anlage öffnen - Siehe Anhang - Teleport-Angebot - Sie haben neue Benachrichtigungen erhalten, während Sie abwesend waren. - Sie haben noch %d weitere Benachrichtigungen - Rechter Arm - Kopf - Linker Arm - Linkes Bein - Oberkörper - Rechtes Bein - Erweitertes Skelett - Niedrig - Mittel - Hoch - ESC drücken, um zur Normalansicht zurückzukehren - Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/all/[SEARCH_TERM] Suche]. - Sie haben nicht das Richtige gefunden? Versuchen Sie [secondlife:///app/inventory/filters Show filters]. - Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/places/[SEARCH_TERM] Suche]. - Landmarke hier hin ziehen, um diese hinzuzufügen. - Keine übereinstimmenden Objekte gefunden. Überprüfen Sie die Schreibweise des Suchbegriffs und versuchen Sie es noch einmal. - Sie haben keine Kopie dieser Textur in Ihrem Inventar. - Einkäufe aus dem Marktplatz erscheinen hier. Sie können diese dann zur Verwendung in Ihr Inventar ziehen. - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ - http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more - Fenster mit Spieloptionen öffnen. - Ausgewählte Geste inworld ausführen. - Fenster mit Spieloptionen öffnen. - Jeder kann Artikel im Marktplatz verkaufen. - - Wenn Sie als Händler aktiv werden möchten, müssen Sie einen [[MARKETPLACE_CREATE_STORE_URL] Laden im Marktplatz erstellen]. - Ihre Outbox ist leer. - - Ziehen Sie Ordner in dien Bereich und klicken Sie auf „In Marktplatz übertragen“, um sie im [[MARKETPLACE_DASHBOARD_URL] Marktplatz] zum Verkauf anzubieten. - Marktplatz wird initialisiert. - Wir greifen auf Ihr Konto im [[MARKETPLACE_CREATE_STORE_URL] Marktplatz-Laden] zu. - Marktplatzfehler. - Der [[MARKETPLACE_CREATE_STORE_URL] Marktplatz-Laden] gibt Fehler zurück. - Beim Öffnen der Marktplatz-Auflistungen ist ein Fehler aufgetreten. -Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich unter http://support.secondlife.com an den Support von Second Life. - Ihr Ordner mit Marktplatz-Auflistungen ist leer. - Ziehen Sie Ordner in diesen Bereich, um sie im [[MARKETPLACE_DASHBOARD_URL] Marktplatz] zum Verkauf anzubieten. - ( [ITEMS_COUNT] Artikel ) - Bestandsordner müssen in einem Versionsordner gespeichert sein - : Fehler: Alle Objekte in einem Bestandsordner müssen kopiergeschützt und vom gleichen Typ sein. - : Fehler: Bestandsordner kann keine Unterordner enthalten - : Warnung: Ordner enthält keine Objekte - : Warnung: Bestandsordner wird erstellt - : Warnung: Versionsordner wird erstellt - : Warnung: Objekte werden verschoben - : Warnung: Ordnerinhalte wurden in Bestandsordner übertragen; leerer Ordner wird entfernt - : Fehler: Kopiergeschützte Objekte müssen in einem Bestandsordner gespeichert sein - : Warnung: Objekte müssen in einem Versionsordner gespeichert sein - : Fehler: - : Warnung: - : Warnung: Versionsordner muss mindestens 1 Objekt enthalten - : Warnung: Bestandsordner muss mindestens 1 Objekt enthalten - Keine Fehler oder Warnungen - Keine Fehler - Fehler: - Bevor Sie Artikel in den Marktplatz übertragen können, müssen Sie sich als Händler registrieren (kostenlos). - Objekt kann nicht in diesen Ordner verschoben werden. - Dieses Objekt kann nicht im Marktplatz verkauft werden. - keine Mkt-ID - aufgelistet - aktiv - max. - Bestand - ausverkauft - Aktualisierung läuft... - Die Gebühr richtet sich nach deiner Abonnementstufe. Für höhere Stufen werden niedrigere Gebühren erhoben. [https://secondlife.com/my/account/membership.php? Mehr erfahren] - Wegweiser öffnen - Unbegrenzt - - - - - - - Inhalte werden geladen... - Keine Inhalte - - - - Ja - Nein - - - - - - - - - - - - - - - - - - - - - - - - Mein Inventar - Bibliothek - Texturen - Sounds - Visitenkarten - Landmarken - Skripts - Kleidung - Objekte - Notizkarten - Neuer Ordner - Inventar - Nicht-Komprimierte Bilder - Körperteile - Papierkorb - Fotoalbum - Fundbüro - Nicht-Komprimierte Sounds - Animationen - Gesten - Meine Favoriten - Meine Favoriten - Meine Favoriten - Meine Favoriten - Aktuelles Outfit - Ursprüngliche Outfits - Meine Outfits - Zubehör - Netze - Erhaltene Artikel - Händler-Outbox - Freunde - Alle - Keine Anhänge getragen - Anhänge (noch [COUNT] Positionen frei) - Kaufen - Kaufen für L$ - Stein - Metall - Glas - Holz - Fleisch - Plastik - Gummi - Hell - Umschalt-Taste - Strg - Brust - Schädel - Linke Schulter - Rechte Schulter - Linke Hand - Rechte Hand - Linker Fuß - Rechter Fuß - Wirbelsäule - Becken - Mund - Kinn - Linkes Ohr - Rechtes Ohr - Linker Augapfel - Rechter Augapfel - Nase - R Oberarm - R Unterarm - L Oberarm - L Unterarm - Rechte Hüfte - R Oberschenkel - R Unterschenkel - Linke Hüfte - L Oberschenkel - L Unterschenkel - Bauch - Linke Brust - Rechts - Hals - Avatar-Mitte - Linker Ringfinger - Rechter Ringfinger - Schwanzansatz - Schwanzspitze - Linker Flügel - Rechter Flügel - Kiefer - Alt. linkes Ohr - Alt. rechtes Ohr - Alt. linkes Auge - Alt. rechtes Auge - Zunge - Leiste - Linker hinterer Fuß - Rechter hinterer Fuß - Ungültige Stelle für Anhang - Fehler: fehlendes Objekt - Fehler: Basisobjekt fehlt - Fehler: Objekt ist im aktuellen Outfit, aber nicht angehängt - [AGEYEARS] [AGEMONTHS] alt - [AGEYEARS] alt - [AGEMONTHS] alt - [AGEWEEKS] alt - [AGEDAYS] alt - Seit heute Mitglied - Jetzt kann jeder Sie sehen. - Sie sind u. U. nicht für alle Leute in Ihrer Nähe sichtbar. - Sie sind u. U. für mehr als die Hälfte der Leute in Ihrer Nähe nicht sichtbar. - Sie sind u. U. für die meisten Leuten in Ihrer Nähe nicht sichtbar. - Sie sind u. U. für niemanden in Ihrer Nähe sichtbar. - Ihr HUD - [OBJ_NAME] (getragen von [JNT_NAME]) - [HUD_DETAILS] beansprucht viel Texturspeicher - [HUD_DETAILS] enthält zu viele ressourcenintensive Objekte und Texturen - [HUD_DETAILS] enthält viele große Texturen - [HUD_DETAILS] enthält zu viele Objekte - [HUD_DETAILS] enthält zu viele Texturen - [COUNT] Jahr - [COUNT] Jahre - [COUNT] Jahre - [COUNT] Monat - [COUNT] Monate - [COUNT] Monate - [COUNT] Woche - [COUNT] Wochen - [COUNT] Wochen - [COUNT] Tag - [COUNT] Tage - [COUNT] Tage - [COUNT] Mitglied - [COUNT] Mitglieder - [COUNT] Mitglieder - Einwohner - Test - Charta-Mitglied - Linden Lab-Mitarbeiter - Zahlungsinfo verwendet - Zahlungsinfo archiviert - Keine Zahlungsinfo archiviert - Altersgeprüft - Nicht altersgeprüft - Mitte 2 - Oben rechts - Oben - Oben links - Mitte - Unten links - Unten - Unten rechts - Heruntergeladen, wird kompiliert - Kein Skriptkompilierungsdienst verfügbar - Skript wurde auf Server nicht gefunden. - Beim Herunterladen ist ein Problem aufgetreten - Unzureichende Rechte zum Herunterladen eines Skripts. - Unzureichende Berechtigungen für - Unbekannter Fehler beim Herunterladen - Skript „[SCRIPT]“ mit Erlebnis „[EXPERIENCE]“ wird übersprungen. - Rekompilierung - rekompilieren - Zurücksetzen - Zurücksetzen - Skript ausführen - Skript ausführen - Skript anhalten - Skript anhalten - Kompilieren erfolgreich abgeschlossen! - Kompilieren erfolgreich abgeschlossen, speichern... - Speichervorgang abgeschlossen. - Datei-Upload fehlgeschlagen: - Skript (Objekt außerhalb des Bereichs) - Skript (aus Inventar gelöscht) - Objekt [OBJECT], Besitzer [OWNER] - keine - - (unbekannt) - - - [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc] - - - Kontostand - Danksagung - Soll - Gesamtbetrag - Für Gruppe wurden keine Gruppendaten gefunden - parent estate - Mainland - Teen - jeder - Fehler - alle Grundbesitze gehören [OWNER] - alle Grundbesitze, die Sie besitzen - alle Grundbesitze, die Sie für [OWNER] verwalten - Immer zulässig: ([ALLOWEDAGENTS], max. [MAXACCESS]) - Immer zugelassene Gruppen: ([ALLOWEDGROUPS], max. [MAXACCESS]) - Immer verbannt: ([BANNEDAGENTS], max. [MAXBANNED]) - Immer zugelassen - Immer verbannt - alle Grundbesitze - verwaltete Grundbesitze - dieser Grundbesitz - und [EXTRA_COUNT] weitere - Parzellenskript-Speicher - Aufgeführte Parzellen: [PARCELS] - Verwendeter Speicher: [COUNT] KB von [MAX] KB; [AVAILABLE] KB verfügbar - Verwendeter Speicher: [COUNT] KB - Parzelleskript-URLs - Verwendete URLs: [COUNT] von [MAX]; [AVAILABLE] verfügbar - Verwendete URLs: [COUNT] - Fehler bei Informationsabruf - Keine Parzellen wurden ausgewählt - Fehler: Skriptinformationen sind nur für Ihre aktuelle Region verfügbar - Informationen werden abgerufen... - Sie sind nicht berechtigt, diese Parzelle zu untersuchen. - sitzt auf - Brust - Schädel - Linke Schulter - Rechte Schulter - Linke Hand - Rechte Hand - Linker Fuß - Rechter Fuß - Wirbelsäule - Becken - Mund - Kinn - Linkes Ohr - Rechtes Ohr - Linkes Auge - Rechtes Auge - Nase - Rechter Oberarm - Rechter Unterarm - Linker Oberarm - Linker Unterarm - Rechte Hüfte - Rechter Oberschenkel - Rechter Unterschenkel - Linke Hüfte - Linker Oberschenkel - Linker Unterschenkel - Bauch - Linke Brust - Rechte Brust - HUD Mitte 2 - HUD oben rechts - HUD oben Mitte - HUD oben links - HUD Mitte 1 - HUD unten links - HUD unten - HUD unten rechts - Hals - Avatar-Mitte - Linker Ringfinger - Rechter Ringfinger - Schwanzansatz - Schwanzspitze - Linker Flügel - Rechter Flügel - Kiefer - Alt. linkes Ohr - Alt. rechtes Ohr - Alt. linkes Auge - Alt. rechtes Auge - Zunge - Leiste - Linker hinterer Fuß - Rechter hinterer Fuß - Zeile [LINE], Spalte [COLUMN] - [COUNT] gefunden - [hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt] - [mthnum,datetime,slt]/[day,datetime,slt] - Objektinhalt - Neues Skript - Dieser Einwohner hat den Nicht-stören-Modus aktiviert und wird Ihre Nachricht später sehen. - (Nach Namen) - (Einwohner) - (Objekt) - (Gruppe) - (Extern) - Für diesen Grundbesitz liegt kein Vertrag vor. - Für diesen Grundbesitz liegt kein Vertrag vor. Das Land auf diesem Grundbesitz wird vom Grundbesitzer und nicht von Linden Lab verkauft. Für Informationen zum Verkauf setzen Sie sich bitte mit dem Grundbesitzer in Verbindung. - - - - In Gruppenbesitz - Öffentlich - Lokale Einstellungen - Regionseinstellungen - Diese Region unterstützt keine Umgebungseinstellungen. - Sonne - Mond - Bloom - Wolkenrauschen - Normal-Map - Transparent - Klicks: [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil - (wird nach Veröffentlichung aktualisiert) - Sie haben keine Auswahl oder Anzeigen erstelllt. Klicken Sie auf die „Plus"-Schaltfläche, um eine Auswahl oder Anzeige zu erstellen. - Sie haben keine Auswahl erstellt. Klicken Sie auf die Schaltfläche "Neu", um eine Auswahl zu erstellen. - Sie haben keine Anzeigen erstellt. Klicken Sie auf die Schaltfläche "Neu", um eine Anzeige zu erstellen. - Der Einwohner hat keine Auswahl oder Anzeigen - Der Einwohner hat keine Auswahl - Der Einwohner hat keine Anzeigen - Wird geladen... - Vorschau - Eigenschaften - Ein Objekt namens - im Besitz der Gruppe - im Besitz einer unbekannten Gruppe - im Besitz von - im Besitz eines unbekannten Einwohners - hat Ihnen folgendes übergeben - Sie lehnen [DESC] von <nolink>[NAME]</nolink> ab. - Gesamtbetrag - gekauft - bezahlte Ihnen - bezahlte an - kaufte Pass für - bezahlte Gebühr für Event - bezahlte Preis für Event - Kontostand - Danksagung - Soll - [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] - Erworbene Artikel - Abbrechen - Das Hochladen von [NAME] kostet [AMOUNT] L$ - Die Kosten betragen: [AMOUNT] L$ - Unbekanntes Dateiformat .%s -Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh - Ignorieren - Ignorieren - Freischalten - Freischalten - Zu meinen Landmarken hinzufügen... - Meine Landmarken bearbeiten... - - - - - Strg+ - Alt+ - Umschalt+ - Datei wurde gespeichert - Daten werden empfangen - Uhr - Uhr - PST - PDT - Vorwärts - Links - Rechts - Zurück - Norden - Süden - Westen - Osten - Nach oben - Nach unten - Alle Kategorien - Shopping - Land mieten - Immobilie mieten - Attraktionen - Neue Produkte - Stellenangebote - Gesucht - Dienstleistungen - Sonstiges - Keiner - Lindenort - Adult - Kunst & Kultur - Firmen - Bildung - Spielen - Treffpunkt - Anfängergerecht - Parks und Natur - Wohngebiet - Phase - Sonstige - Vermietung - Alle - Sie - : - , - ... - *** - ( - ) - . - ' - --- - Mehrere Medien - Medien Abspielen/Pausieren - http://www.intel.com/p/en_US/support/detect/graphics - http://www.nvidia.com/Download/index.aspx?lang=de-de - http://support.amd.com/de/Pages/AMDSupportHub.aspx - Beim Parsen der Befehlszeile wurde ein Fehler festgestellt. -Weitere Informationen: http://wiki.secondlife.com/wiki/Client_parameters (EN) -Fehler: - [APP_NAME] Verwendung in Befehlszeile: - [APP_NAME] kann auf die erforderliche Datei nicht zugreifen. - -Grund hierfür ist, dass Sie entweder mehrere Instanzen gleichzeitig ausführen oder dass Ihr System denkt, eine Datei sei geöffnet. -Falls diese Nachricht erneut angezeigt wird, starten Sie bitte Ihren Computer neu und probieren Sie es noch einmal. -Falls der Fehler dann weiterhin auftritt, müssen Sie [APP_NAME] von Ihrem System de-installieren und erneut installieren. - Unbehebbarer Fehler - [APP_NAME] erfordert einen Prozessor mit AltiVec (G4 oder später). - [APP_NAME] läuft bereits. -Bitte sehen Sie in Ihrer Menüleiste nach, dort sollte ein Symbol für das Programm angezeigt werden. -Falls diese Nachricht erneut angezeigt wird, starten Sie Ihren Computer bitte neu. - [APP_NAME] scheint eingefroren zu sein oder ist abgestürzt. -Möchten Sie einen Absturz-Bericht einschicken? - Benachrichtigung - [APP_NAME] kann DirectX 9.0b oder höher nicht feststellen. -[APP_NAME] verwendet DirectX, um nach Hardware und/oder veralteten Treibern zu suchen, die zu Problemen mit der Stabilität, Leistung und Abstürzen führen können. Sie können [APP_NAME] auch so ausführen, wir empfehlen jedoch, dass DirectX 9.0b vorhanden ist und ausgeführt wird. - -Möchten Sie fortfahren? - Hinweis - Für Linux ist zur Zeit noch kein automatisches Aktualisieren möglich. -Bitte laden Sie die aktuellste Version von www.secondlife.com herunter. - RegisterClass fehlgeschlagen - Fehler - Vollbildschirm mit [WIDTH] x [HEIGHT] kann nicht ausgeführt werden. -Ausführung erfolgt in Fenster. - Fehler beim Herunterfahren während Fenster geschlossen wurde (DestroyWindow() fehlgeschlagen) - Fehler beim Herunterfahren - Kann keinen Kontext für GL-Gerät erstellen - Passendes Pixelformat wurde nicht gefunden - Beschreibung für Pixelformat nicht verfügbar - Um [APP_NAME] auszuführen, ist True Color (32-bit) erforderlich. -Klicken Sie öffnen Sie auf Ihrem Computer die Einstellungen für die Anzeige und stellen Sie den Bildschirm auf 32-bit Farbe ein. - [APP_NAME] kann nicht ausgeführt werden, da kein 8-Bit-Alpha-Kanal verfügbar ist. Dies geschieht normalerweise bei Problemen mit dem Treiber der Video-Karte. -Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für Ihre Videokarte installiert haben. -Vergewissern Sie sich außerdem, dass Ihr Bildschirm auf True Color (32-Bit) eingestellt ist (Systemsteuerung > Anzeige > Einstellungen). -Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. - Pixel-Format kann nicht eingestellt werden. - Kann keinen Kontext für GL-Gerät erstellen - Kann keinen Kontext für GL-Gerät aktivieren - [APP_NAME] kann nicht ausgeführt werden, da die Treiber Ihrer Videokarte entweder nicht richtig installiert oder veraltet sind, oder die entsprechende Hardware nicht unterstützt wird. Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für die Videokarte installiert haben. Falls Sie die aktuellsten Treiber bereits installiert haben, installieren Sie diese bitte erneut. - -Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. - Bartschatten - Ganz weiß - Anime-Augen - Gewölbt - Armlänge - Angewachsen - Angewachsene Ohrläppchen - Nackenfransen - Tränensäcke - Pony - Knopfaugen - Bauchgröße - Groß - Großer Hintern - Volumen: Hinten - Volumen: Vorne - Volumen: Oben - Groß - Große Brustmuskeln - Große Stacheln - Schwarz - Blond - Blondes Haar - Rouge - Rougefarbe - Rouge Deckkraft - Körperkonturen - Körperfett - Sommersprossen - breit - Körperbreite - schmal - o-beinig - Brust, Straffheit - Dekolleté - Brustgröße - Rückenbreite - Breit - Brauengröße - Glubschaugen - Hervortretend - Knollennase - Knollennase - Brust – Masse - Brust – Glättung - Brust – Schwerkraft - Brust – Luftwiderstand - Max. Effekt - Federn - Verstärkung - Dämpfung - Max. Effekt - Federn - Verstärkung - Dämpfung - Max. Effekt - Federn - Verstärkung - Dämpfung - Bauch – Masse - Bauch – Glättung - Bauch – Schwerkraft - Bauch – Luftwiderstand - Max. Effekt - Federn - Verstärkung - Dämpfung - Po – Masse - Po – Glättung - Po – Schwerkraft - Po – Luftwiderstand - Max. Effekt - Federn - Verstärkung - Dämpfung - Max. Effekt - Federn - Verstärkung - Dämpfung - Buschige Augenbrauen - Buschiges Haar - Hintern, Größe - Po – Schwerkraft - Tournürenrock - Ohne - Mit - Chaplin - Wangenknochen - Brustgröße - Kinnwinkel - Kinnspalte - Schifferfräse - Kinnlänge - Kinn ausgeprägt - Kinn zurück - Kinn nach vorne - Kinn-Hals - Transparent - Spalte - Eng stehende Augen - Geschlossen - Hinten geschlossen - Vorne geschlossen - Links geschlossen - Rechts geschlossen - Klein - Kragen hinten - Kragen vorne - Nach unten - Nach oben - Schlupflid - Krumme Nase - Hosenaufschlag - Dunkel - Dunkelgrün - Dunkler - Tief - Standardabsätze - Dicht - Doppelkinn - Nach unten - Groß - Ohrenwinkel - Ohrengröße - Ohrenspitzen - Eierkopf - Augenränder - Augenfarbe - Augentiefe - Helligkeit - Öffnung - Symmetrie - Augengröße - Augenstand - Brauenbogen - Brauendichte - Brauenhöhe - Brauenenden - Brauengröße - Wimpernlänge - Eyeliner - Farbe des Eyeliners - Glubschaugen - Gesichtsverzerrung - Gesichtskonturen - Weit auseinander - Volle Lippen - weiblich - Ohne Finger - Finger - Ausgestellt - Flach - Flacher Hintern - Flacher Kopf - Flache Spitze - Fußgröße - Stirnwinkel - Stirn ausgeprägt - Sommersprossen - Fransen, vorne - Hinten volles Haar - Starker Eyeliner - Vorne volles Haar - Seitlich volles Haar - Volle Seiten - Glänzend - Handschuhfinger - Handschuhlänge - Haare - Haare: Hinten - Haare: Vorne - Haare: Seiten - Haartolle - Haardicke - Haardicke - Haarneigung - Nach links - Nach rechts - Haare: Volumen - Handgröße - Zwirbelbart - Kopflänge - Kopfform - Kopfgröße - Kopfstreckung - Absatzhöhe - Absatzform - Größe - Hoch - Hohe Absätze - Hoch - Hohe Plattformsohlen - Hoch und eng - Höhere - Länge der Hüfte - Breite der Hüfte - Schweben - In - Farbe Innenseite - Deckkraft: innen - Ecke: Nasenseite - Innenlid - Innenlid - Jackenlänge - Jackenfalten - Kinnansatz - Kinnposition - Kinnform - Zusammen - Hängebacken - Kniewinkel - X-beinig - Groß - Große Hände - Linksscheitel - Beinlänge - Beinmuskeln - Weniger - Weniger Speck - Weniger - Weniger - Weniger - Weniger - Weniger - Weniger - Weniger - Weniger - Weniger - Weniger - Weniger - Weniger - Weniger - Heller - Amorbogen - Tiefe: Amorbogen - Fülle - Pinkton - Lippenproportionen - Lippendicke - Mundbreite - Lipgloss - Lippenstift - Farbe - Lang - Langer Kopf - Lange Hüften - Lange Beine - Langer Hals - Lange Zöpfe - Langer Pferdeschwanz - Langer Oberkörper - Lange Arme - Weite Hosen - Weites Hemd - Weite Ärmel - Fettpölsterchen - Niedrig - Niedrig - Niedrig - Niedrig - Weit - Absenken - Brücke, Unterer Teil - Wangen, unterer Bereich - Männlich - Mittelscheitel - Mehr - Mehr - Mehr Speck - Mehr - Mehr - Mehr - Voller - Mehr - Mehr - Mehr - Größer - Mehr - Mehr - Mehr - Runder - Mehr - Flach - Eckiger - Mehr - Steil - Mehr - Mehr - Schnauzer - Mundwinkel - Mundposition - Irokese - Muskulös - Koteletten - Nagellack - Farbe - Schmal - Wenig - Wenig - Schmale Lippen - Natürlich - Halslänge - Halsdicke - Kein Rouge - Kein Eyeliner - Kein Lidschatten - Kein Lipgloss - Kein Lippenstift - Kein Scheitel - Kein Nagellack - Nicht rot - Keine Stachel - Kein Weiß - Keine Falten - Normal unten - Normal oben - Links - Rechts - Größe - Dicke - Nasenspitze - Nasenspitze - Nasenbreite - Teilung - Größe - Deckend - Öffnen - Hinten offen - Vorne offen - Links offen - Rechts offen - Orange - Aus - Farbe: Oben - Deckkraft: Oben - Äußerer Augenwinkel - Lidschatten: Oben - Lidschatten: Oben - Überbiss - Ausbeulung - Lackierte Nägel - Blass - Schritt - Passform - Hosenlänge - Hüfte - Falten - Scheitel - Pony scheiteln - Brustmuskel - Pigmentierung - Zöpfe - Pink - Mehr Pink - Höhe - Breite - Spitz - Pfennigabsätze - Pferdeschwanz - Weit ausgestellt - Linkes Auge größer - Rechtes Auge größer - Geschwollen - Geschwollene Lider - Regenbogenfarben - Rote Haare - Normal - Scheitel rechts - Rosiger Teint - Rund - Röte - Rötlich - Zerzauste Haare - Hüftspeck - Dürres Bein - Auseinander - Flach - Hinterkopf rasiert - Gesicht verzerren - Vorne rasiert - Links - Rechts - Hinterkopf rasiert - Vorne rasiert - Nach links - Mund verschieben - Nach rechts - Hemdlänge - Passform - Falten - Schuhart - Klein - Kurze Arme - Kurze Beine - Kurzer Hals - Kurze Zöpfe - Kurzer Pferdeschwanz - Kurze Koteletten - Kurzer Oberkörper - Kurze Hüften - Schultern - Seitliche Fransen - Koteletten - Seitliches Haar - Lang - Kurz - Dünner Hals - Passform - Rocklänge - Fliehende Stirn - Ärmellänge - Passform Ärmel - Schlitz: Hinten - Schlitz: Vorne - Schlitz: Links - Schlitz: Rechts - Klein - Kleine Hände - Klein - Glätten - Glattes Haar - Strumpflänge - Unterlippenbart - Wenig - Stachelhaare - Rechteck - Eckig - Gestaucht - Gestreckt - Eingefallen - Trichterbrust - Eingesunkene Augen - Nach hinten - Nach vorne - Groß - Ansatzbreite hinten - Ansatzbreite vorne - Dicke Absätze - Dicker Hals - Dick - Dünn - Dünne Augenbrauen - Dünne Lippen - Dünne Nase - Straffes Kinn - Eng - Enge Hosen - Enges Hemd - Enger Rock - Enge Ärmel - Spitze - Dicke - Länge des Oberkörpers - Muskeln - Dürr - Frei - Straffes Lid - Unterbiss - Unnatürlich - Brücke, oberer Teil - Obere Wangen - Obere Kinnspalte - Obere Lidfalte - Stupsnase - Sehr rot - Bund - Gut genährt - Weiße Haare - Breit - Breit - Breit - Breit - Wild - Falten - Zu meinen Landmarken hinzufügen - Meine Landmarken bearbeiten - Weitere Informationen über die aktuelle Position - Mein Reiseverlauf - Dieses Land kaufen - Voice hier nicht möglich - Fliegen ist unzulässig - Kein Stoßen - Bauen/Fallen lassen von Objekten ist verboten - Skripte sind unzulässig - Gesundheit - Adult-Region - Moderate Region - Generelle Region - Avatare in dieser Parzelle können von Avataren außerhalb dieser Parzelle weder gesehen noch gehört werden - Bewegliche Objekte verhalten sich in dieser Region u. U. erst dann korrekt, wenn die Region neu geformt wird. - Dynamisches Pathfinding ist in dieser Region nicht aktiviert. - [APP_NAME] Aktualisierung - [APP_NAME] wird aktualisiert... - [APP_NAME] wird installiert... - Ihr [APP_NAME]-Viewer wird aktualisiert. Dies kann einen Moment dauern. Wir bitten um Ihr Verständnis. - Aktualisierung wird heruntergeladen... - Aktualisierung wird heruntergeladen - Herunterladen ist fehlgeschlagen - Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version von www.secondlife.com herunter. - Aktualisierung konnte nicht installiert werden - Viewer konnte nicht gestartet werden - [APP_NAME]: Zuviele Objekte auf einmal von [FROM_NAME]. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar. - [APP_NAME]: Zuviele Objekte auf einmal. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar. - -- Instant-Message-Protokoll aktiviert -- - [NAME] tippt... - (Nicht benannt) - (Moderiert: Stimmen in der Standardeinstellung stummgeschaltet) - Für diese Verbindung ist kein Text-Chat verfügbar. - Ihr Text-Chat wurde von einem Gruppenmoderator deaktiviert. - Für Instant Message hier klicken. - An - (Moderator) - (Gespeichert am [LONG_TIMESTAMP]) - Wenn Sie diese Meldung sehen, müssen Sie unter „Einstellungen“ > „Privatsphäre“ die Option „Nur IMs und Anrufe von Freunden oder Gruppen durchstellen“ deaktivieren. - Online - Offline - Benutzer nicht online – Nachricht wird gespeichert und später zugestellt. - Benutzer nicht online – Inventar gespeichert. - Ihr Anruf wurde entgegengenommen - Sie haben einen Voice-Anruf begonnen - Sie sind dem Gespräch beigetreten - Sie haben den Voice-Anruf automatisch abgelehnt, während der Nicht-stören-Modus aktiviert war. - [NAME] hat einen Voice-Anruf begonnen - Verbindung wird hergestellt... - Verbunden. Klicken Sie auf Anruf beenden, um die Verbindung zu trennen - Anruf wurde beendet - Wird verbunden... - Chat mit mehreren Personen - Konferenz mit [AGENT_NAME] - Inventarobjekt „[ITEM_NAME]“ angeboten - Inventarordner „[ITEM_NAME]“ angeboten - - Sie chatten mit einem Bot, [NAME]. Geben Sie keine persönlichen Informationen weiter. -Erfahren Sie mehr unter https://second.life/scripted-agents. +nächsten Eigentümer angehängt werden. - Objekte aus dem Inventar hier her ziehen - Sie haben auf Facebook gepostet. - Sie haben auf Flickr gepostet. - Sie haben auf Twitter gepostet. - (IM-Session nicht vorhanden) - Sie sind der einzige Benutzer in dieser Sitzung. - [NAME] ist offline. - Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen. - Sie haben diesen Einwohner ignoriert. Wenn Sie eine Nachricht senden, wird dieser freigeschaltet. - Fehler bei Anfrage, bitte versuchen Sie es später. - Fehler bei Anfrage, bitte versuchen Sie es später. - Sie sind dazu nicht berechtigt. - Die Sitzung ist abgelaufen - Sie besitzen diese Fähigkeit nicht. - Sie besitzen diese Fähigkeit nicht. - Sie sind kein Sitzungsmoderator. - Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert. - Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert. - Es konnten keine Benutzer zur Chat-Sitzung mit [RECIPIENT] hinzugefügt werden. - Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden. - Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden. - Fehler während Moderation. - Sie wurden von der Gruppe ausgeschlossen. - Sie wurden von der Gruppe ausgeschlossen. - Sie haben nicht mehr die Berechtigung an der Chat-Sitzung teilzunehmen. - [SOURCES] hat etwas Neues gesagt - [SOURCES] haben etwas Neues gesagt - Die Initialisierung der Sitzung ist fehlgeschlagen - Position für Zuhause festgelegt. - https://secondlife.com/destination/voice-island - https://secondlife.com/destination/voice-morphing-premium - [NAME] hat Ihnen [REASON] [AMOUNT] L$ bezahlt. - [NAME] hat Ihnen [AMOUNT] L$ bezahlt: [REASON] - [NAME] hat Ihnen [AMOUNT] L$ bezahlt. - Sie haben [REASON] [AMOUNT] L$ an [NAME] bezahlt. - Sie haben [NAME] [AMOUNT] L$ bezahlt: [REASON] - Sie haben [AMOUNT] L$ bezahlt. - Sie haben [AMOUNT] L$ an [NAME] bezahlt. - Sie haben [REASON] [AMOUNT] L$ bezahlt. - Sie haben [NAME] [AMOUNT] L$ [REASON] nicht bezahlt. - Sie haben [NAME] [AMOUNT] L$ nicht bezahlt: [REASON] - Sie haben [AMOUNT] L$ nicht bezahlt. - Sie haben [NAME] [AMOUNT] L$ nicht bezahlt. - Sie haben [AMOUNT] L$ [REASON] nicht bezahlt. - für [ITEM] - für eine Landparzelle - für einen Pass - für die Landübertragung - für die Gründung einer Gruppe - für den Beitritt zur Gruppe - fürs Hochladen - um eine Anzeige aufzugeben - [AMOUNT] L$ werden bezahlt - Kosten für Hochladen [AMOUNT] L$ - Kosten: [AMOUNT] L$ - Ausgewähltes Land wird für [AMOUNT] L$ gekauft. - Dieses Objekt kostet [AMOUNT] L$ - Jeder - Offiziere - Eigentümer - Online - Hochladen... - -Missbrauchsbericht - Neue Form/Gestalt - Neue Haut - Neues Haar - Neue Augen - Neues Hemd - Neue Hose - Neue Schuhe - Neue Socken - Neue Jacke - Neue Handschuhe - Neues Unterhemd - Neue Unterhose - Neuer Rock - Neues Alpha - Neue Tätowierung - Neues Universal - Neue Physik - Ungültiges Objekt - Neue Geste - Neues Skript - Neue Notiz - Neuer Ordner - Inhalt - Gesten - Männliche Gesten - Weibliche Gesten - Andere Gesten - Sprachgesten - Häufig verwendete Gesten - Männlich - Excuse me - Männlich - Get lost - Männlich - Kusshand - Männlich - Buh - Männlich - Gelangweilt - Männlich - Hey - Männlich - Lachen - Männlich - Angewidert - Männlich - Achselzucken - Männlich - Zunge herausstrecken - Männlich - Wow - Weiblich - Kichern - Weiblich - Weinen - Weiblich - Verlegen - Weiblich - Räuspern - Weiblich - Get lost - Weiblich - Kusshand - Weiblich - Buh - Weiblich - Gelangweilt - Weiblich - Hey - Weiblich - Hey Süße(r) - Weiblich - Lachen - Weiblich - Looking good - Weiblich - Over here - Weiblich - Please - Weiblich - Angewidert - Weiblich - Achselzucken - Weiblich - Zunge herausstrecken - Weiblich - Wow - Neuer Tageszyklus - Neues Wasser - Neuer Himmel - /verbeugen - /klatschen - /zählen - /löschen - /lmaa - /Muskel - /nein - /nein! - /Papier - /auf mich zeigen - /auf dich zeigen - /Stein - /Schere - /rauchen - /dehnen - /pfeifen - /ja - /ja! - afk - Tanzen1 - Tanzen2 - Tanzen3 - Tanzen4 - Tanzen5 - Tanzen6 - Tanzen7 - Tanzen8 - [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt] - Keine/Keiner - Bilder, die größer sind als [WIDTH]*[HEIGHT] können nicht geladen werden - Max. Fotogröße für Outfit ist [WIDTH]*[HEIGHT]. Bitte verkleinern Sie das Bild oder verwenden Sie ein anderes. - Max. Fotogröße für Outfit ist [WIDTH]*[HEIGHT]. Bitte wählen Sie eine andere Textur aus. - Fotoabmessungen können nicht bestätigt werden. Bitte warten Sie, bis die Fotogröße im Auswahlfenster angezeigt wird. - - Trotz all unserer Bemühungen ist ein unerwarteter Fehler aufgetreten. - -Bitte überprüfen Sie http://status.secondlifegrid.net, um herauszufinden, ob ein Problem mit dem Service vorliegt. - Falls Sie weiterhin Problem haben, überprüfen Sie bitte Ihre Netzwerk- und Firewalleinstellungen. - Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag - So:Mo:Di:Mi:Do:Fr:Sa - Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember - Jan:Feb:Mär:Apr:Mai:Jun:Jul:Aug:Sep:Okt:Nov:Dez - [MDAY] - Uhr - Uhr - [AMOUNT] US$ - Gruppenverbannung - Mitgliedschaft - Rollen - Gruppenidentität - Parzellenverwaltung - Parzellenidentität - Parzelleneinstellungen - Parzellenfähigkeiten - Parzellenzugang - Parzelleninhalt - Objektmanagement - Kontoführung - Mitteilungen - Chat - Basis - Premium - Premium Plus - Ausgewählte Objekte löschen? - Ausgewähltes Objekt löschen? - Keine Objekte in diesem Outfit - Wählen Sie über die Einstellung „ExternalEditor“ einen Editor aus - Angegebener externer Editor nicht gefunden. + + Suchen... + + + Nicht gefunden. + + + Laden... + + + Versionshinweise + + + https://releasenotes.secondlife.com/viewer/ + + + Wird geladen... + + + (niemand) + + + (wartet) + + + (mehrere) + + + (keiner) + + + Kein Fehler + + + Asset-Anforderung: fehlgeschlagen + + + Asset-Anforderung: Datei existiert nicht + + + Asset-Anforderung: Asset in Datenbank nicht gefunden + + + Ende der Datei + + + Datei kann nicht geöffnet werden + + + Datei nicht gefunden + + + Zeitüberschreitung bei Dateiübertragung + + + Verbindung verloren + + + Viewer und Server sind sich nicht über Preis einig + + + Status unbekannt + + + Dienst nicht verfügbar. + + + Auf dem Server sind unerwartete Probleme aufgetreten. + + + Dienst nicht verfügbar oder Zeitüberschreitung beim Upload. + + + Fehler bei der Upload-Anforderung. Um das Problem zu lösen, +besuchen Sie bitte http://secondlife.com/support + + + Validierung für das Importieren der Einstellungen [NAME] fehlgeschlagen + + + [FILE] konnte nicht geöffnet werden + + + [FILE] konnte nicht geöffnet werden + + + Altes Windlight [NAME] konnte nicht übernommen werden + + + Textur + + + Sound + + + Visitenkarte + + + Landmarke + + + Skript (veraltet) + + + Kleidung + + + Objekt + + + Notizkarte + + + Ordner + + + Hauptverzeichnis + + + LSL2 Skript + + + LSL Bytecode + + + tga-Textur + + + Körperteil + + + Foto + + + Fundbüro + + + targa-Bild + + + Papierkorb + + + jpeg-Bild + + + Animation + + + Geste + + + simstate + + + Favoriten + + + Link + + + Link zu Ordner + + + Einstellungen + + + mesh + + + (Aussehen wird bearbeitet) + + + Abwesend + + + Nicht stören + + + Ignoriert + + + Ängstlich + + + Verärgert + + + Abwesend + + + Rückwärtssalto + + + Lachkrampf + + + Grinsen + + + Kusshand + + + Gelangweilt + + + Verbeugen + + + Klatschen + + + Diener + + + Weinen + + + Tanz 1 + + + Tanz 2 + + + Tanz 3 + + + Tanz 4 + + + Tanz 5 + + + Tanz 6 + + + Tanz 7 + + + Tanz 8 + + + Verachten + + + Trinken + + + Verlegen + + + Drohen + + + Faust pumpen + + + Yogaflieger + + + Stirnrunzeln + + + Ungeduldig + + + Freudensprung + + + LMA + + + Küssen + + + Lachen + + + Posen + + + Nein (Bedauernd) + + + Nein + + + Ällabätsch + + + Eins-Zwei-Punch + + + Mund offen + + + Friede + + + Auf anderen zeigen + + + Auf mich zeigen + + + Linker Haken + + + Rechter Haken + + + SSP zählen + + + SSP Papier + + + SSP Stein + + + SSP Schere + + + Angewidert + + + Rundkick + + + Traurig + + + Salutieren + + + Rufen + + + Schulterzucken + + + Lächeln + + + Zigarette halten + + + Rauchen + + + Zigarette wegwerfen + + + Überraschung + + + Schwerthieb + + + Wutanfall + + + Zunge rausstrecken + + + Winken + + + Flüstern + + + Pfeifen + + + Zwinkern + + + Zwinkern (Hollywood) + + + Sorgenvoll + + + Ja (Erfreut) + + + Ja + + + Mehrfach + + + Textur verwenden + + + Zum Einrasten Mauscursor + + + über Lineal bewegen + + + Wird geladen... + + + Offline + + + [PRICE] L$ für [AREA] m² + + + Nicht gefunden. + + + OK + + + Unvollständige Datei + + + HAUPTVERZEICHNIS oder VERBINDUNG nicht gefunden. + + + Chat in der Nähe + + + (Chat in der Nähe) + + + flüstert: + + + ruft: + + + Verbindung mit In-Welt-Voice-Chat... + + + Verbunden + + + Der aktuelle Standort unterstützt keine Voice-Kommunikation + + + Verbindung mit In-Welt-Voice-Chat getrennt + + + Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden + + + Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung erteilt: [PERMISSIONS]. + + + Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung verweigert: [PERMISSIONS]. + + + Wenn Sie dem Objekt Zugriff auf Ihr Konto gewähren, kann dieses außerdem: + + + Linden-Dollar (L$) von Ihnen nehmen + + + Steuerung festlegen + + + Steuerung neu zuweisen + + + Avatar animieren + + + An Avatar anhängen + + + Eigentum aufgeben und öffentlich machen + + + Mit Objekten verknüpfen und davon trennen + + + Verbindungen zu anderen Objekten hinzufügen und entfernen + + + Berechtigungen ändern + + + Kameraverfolgung + + + Kamerasteuerung + + + Sie teleportieren + + + Ihren Avatar zwingen, sich zu setzen + + + Umgebungseinstellungen ändern + + + Nicht verbunden + + + (Sie) + + + + Beim Verwalten von Grundbesitzzugangslisten Warnhinweise unterdrücken + + + Ihre Standardanimationen ersetzen + + + Objekte in Ihrem Namen zurückgeben + + + (unbekannt) + + + Generell + + + Moderat + + + Adult + + + Offline + + + Unbekannt + + + (unbekannt) + + + Grundstück / Vollständige Region + + + Grundbesitz/Homestead + + + Mainland/Homestead + + + Mainland / Vollständige Region + + + Alle Dateien + + + Sounds + + + Animationen + + + Bilder + + + Speichern + + + Laden + + + Targa-Bilder + + + Bitmap-Bilder + + + PNG-Bilder + + + Targa- oder PNG-Bilder + + + AVI-Filmdatei + + + XAF Anim-Datei + + + XML-Datei + + + RAW-Datei + + + Komprimierte Bilder + + + Dateien laden + + + Verzeichnis auswählen + + + Skripts + + + Wörterbücher + + + Form + + + Haut + + + Haare + + + Augen + + + Hemd + + + Hose + + + Schuhe + + + Socken + + + Jacke + + + Handschuhe + + + Unterhemd + + + Unterhose + + + Rock + + + Alpha + + + Tätowierung + + + Universal + + + Physik + + + ungültig + + + keine + + + Hemd nicht getragen + + + Hosen nicht getragen + + + Schuhe nicht getragen + + + Socken nicht getragen + + + Jacke nicht getragen + + + Handschuhe nicht getragen + + + Unterhemd nicht getragen + + + Unterhose nicht getragen + + + Rock nicht getragen + + + Alpha nicht getragen + + + Tätowierung nicht getragen + + + Universal nicht getragen + + + Physik nicht getragen + + + ungültig + + + Neue Form/Gestalt erstellen + + + Neue Haut erstellen + + + Neue Haare erstellen + + + Neue Augen erstellen + + + Neues Hemd erstellen + + + Neue Hose erstellen + + + Neue Schuhe erstellen + + + Neue Socken erstellen + + + Neue Jacke erstellen + + + Neue Handschuhe erstellen + + + Neues Unterhemd erstellen + + + Neue Unterhose erstellen + + + Neuer Rock erstellen + + + Neue Alpha erstellen + + + Neue Tätowierung erstellen + + + Neues Universal erstellen + + + Neue Physik erstellen + + + ungültig + + + Neue/r/s [WEARABLE_ITEM] + + + Weiter + + + OK + + + Gruppenmitteilung + + + Gruppenmitteilungen + + + Gesendet von + + + Im Anhang: + + + Alte Mitteilungen anzeigen oder hier Auswahl treffen, um keine Mitteilungen mehr zu erhalten. + + + Anlage öffnen + + + Siehe Anhang + + + Teleport-Angebot + + + Sie haben neue Benachrichtigungen erhalten, während Sie abwesend waren. + + + Sie haben noch %d weitere Benachrichtigungen + + + Rechter Arm + + + Kopf + + + Linker Arm + + + Linkes Bein + + + Oberkörper + + + Rechtes Bein + + + Erweitertes Skelett + + + Niedrig + + + Mittel + + + Hoch + + + ESC drücken, um zur Normalansicht zurückzukehren + + + Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/all/[SEARCH_TERM] Suche]. + + + Sie haben nicht das Richtige gefunden? Versuchen Sie [secondlife:///app/inventory/filters Show filters]. + + + Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/places/[SEARCH_TERM] Suche]. + + + Landmarke hier hin ziehen, um diese hinzuzufügen. + + + Keine übereinstimmenden Objekte gefunden. Überprüfen Sie die Schreibweise des Suchbegriffs und versuchen Sie es noch einmal. + + + Sie haben keine Kopie dieser Textur in Ihrem Inventar. + + + Einkäufe aus dem Marktplatz erscheinen hier. Sie können diese dann zur Verwendung in Ihr Inventar ziehen. + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ + + + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more + + + Fenster mit Spieloptionen öffnen. + + + Ausgewählte Geste inworld ausführen. + + + Fenster mit Spieloptionen öffnen. + + + Jeder kann Artikel im Marktplatz verkaufen. + + + + Wenn Sie als Händler aktiv werden möchten, müssen Sie einen [[MARKETPLACE_CREATE_STORE_URL] Laden im Marktplatz erstellen]. + + + Ihre Outbox ist leer. + + + + Ziehen Sie Ordner in dien Bereich und klicken Sie auf „In Marktplatz übertragen“, um sie im [[MARKETPLACE_DASHBOARD_URL] Marktplatz] zum Verkauf anzubieten. + + + Marktplatz wird initialisiert. + + + Wir greifen auf Ihr Konto im [[MARKETPLACE_CREATE_STORE_URL] Marktplatz-Laden] zu. + + + Marktplatzfehler. + + + Der [[MARKETPLACE_CREATE_STORE_URL] Marktplatz-Laden] gibt Fehler zurück. + + + Beim Öffnen der Marktplatz-Auflistungen ist ein Fehler aufgetreten. +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich unter http://support.secondlife.com an den Support von Second Life. + + + Ihr Ordner mit Marktplatz-Auflistungen ist leer. + + + Ziehen Sie Ordner in diesen Bereich, um sie im [[MARKETPLACE_DASHBOARD_URL] Marktplatz] zum Verkauf anzubieten. + + + ( [ITEMS_COUNT] Artikel ) + + + Bestandsordner müssen in einem Versionsordner gespeichert sein + + + : Fehler: Alle Objekte in einem Bestandsordner müssen kopiergeschützt und vom gleichen Typ sein. + + + : Fehler: Bestandsordner kann keine Unterordner enthalten + + + : Warnung: Ordner enthält keine Objekte + + + : Warnung: Bestandsordner wird erstellt + + + : Warnung: Versionsordner wird erstellt + + + : Warnung: Objekte werden verschoben + + + : Warnung: Ordnerinhalte wurden in Bestandsordner übertragen; leerer Ordner wird entfernt + + + : Fehler: Kopiergeschützte Objekte müssen in einem Bestandsordner gespeichert sein + + + : Warnung: Objekte müssen in einem Versionsordner gespeichert sein + + + : Fehler: + + + : Warnung: + + + : Warnung: Versionsordner muss mindestens 1 Objekt enthalten + + + : Warnung: Bestandsordner muss mindestens 1 Objekt enthalten + + + Keine Fehler oder Warnungen + + + Keine Fehler + + + Fehler: + + + Bevor Sie Artikel in den Marktplatz übertragen können, müssen Sie sich als Händler registrieren (kostenlos). + + + Objekt kann nicht in diesen Ordner verschoben werden. + + + Dieses Objekt kann nicht im Marktplatz verkauft werden. + + + keine Mkt-ID + + + aufgelistet + + + aktiv + + + max. + + + Bestand + + + ausverkauft + + + Aktualisierung läuft... + + + Die Gebühr richtet sich nach deiner Abonnementstufe. Für höhere Stufen werden niedrigere Gebühren erhoben. [https://secondlife.com/my/account/membership.php? Mehr erfahren] + + + Wegweiser öffnen + + + Unbegrenzt + + + + + + + + + Inhalte werden geladen... + + + Keine Inhalte + + + + + + Ja + + + Nein + + + + + + + + + + + + + + + + + + + + + + + + + + Mein Inventar + + + Bibliothek + + + Texturen + + + Sounds + + + Visitenkarten + + + Landmarken + + + Skripts + + + Kleidung + + + Objekte + + + Notizkarten + + + Neuer Ordner + + + Inventar + + + Nicht-Komprimierte Bilder + + + Körperteile + + + Papierkorb + + + Fotoalbum + + + Fundbüro + + + Nicht-Komprimierte Sounds + + + Animationen + + + Gesten + + + Meine Favoriten + + + Meine Favoriten + + + Meine Favoriten + + + Meine Favoriten + + + Aktuelles Outfit + + + Ursprüngliche Outfits + + + Meine Outfits + + + Zubehör + + + Netze + + + Erhaltene Artikel + + + Händler-Outbox + + + Freunde + + + Alle + + + Keine Anhänge getragen + + + Anhänge (noch [COUNT] Positionen frei) + + + Kaufen + + + Kaufen für L$ + + + Stein + + + Metall + + + Glas + + + Holz + + + Fleisch + + + Plastik + + + Gummi + + + Hell + + + Umschalt-Taste + + + Strg + + + Brust + + + Schädel + + + Linke Schulter + + + Rechte Schulter + + + Linke Hand + + + Rechte Hand + + + Linker Fuß + + + Rechter Fuß + + + Wirbelsäule + + + Becken + + + Mund + + + Kinn + + + Linkes Ohr + + + Rechtes Ohr + + + Linker Augapfel + + + Rechter Augapfel + + + Nase + + + R Oberarm + + + R Unterarm + + + L Oberarm + + + L Unterarm + + + Rechte Hüfte + + + R Oberschenkel + + + R Unterschenkel + + + Linke Hüfte + + + L Oberschenkel + + + L Unterschenkel + + + Bauch + + + Linke Brust + + + Rechts + + + Hals + + + Avatar-Mitte + + + Linker Ringfinger + + + Rechter Ringfinger + + + Schwanzansatz + + + Schwanzspitze + + + Linker Flügel + + + Rechter Flügel + + + Kiefer + + + Alt. linkes Ohr + + + Alt. rechtes Ohr + + + Alt. linkes Auge + + + Alt. rechtes Auge + + + Zunge + + + Leiste + + + Linker hinterer Fuß + + + Rechter hinterer Fuß + + + Ungültige Stelle für Anhang + + + Fehler: fehlendes Objekt + + + Fehler: Basisobjekt fehlt + + + Fehler: Objekt ist im aktuellen Outfit, aber nicht angehängt + + + [AGEYEARS] [AGEMONTHS] alt + + + [AGEYEARS] alt + + + [AGEMONTHS] alt + + + [AGEWEEKS] alt + + + [AGEDAYS] alt + + + Seit heute Mitglied + + + Jetzt kann jeder Sie sehen. + + + Sie sind u. U. nicht für alle Leute in Ihrer Nähe sichtbar. + + + Sie sind u. U. für mehr als die Hälfte der Leute in Ihrer Nähe nicht sichtbar. + + + Sie sind u. U. für die meisten Leuten in Ihrer Nähe nicht sichtbar. + + + Sie sind u. U. für niemanden in Ihrer Nähe sichtbar. + + + Ihr HUD + + + [OBJ_NAME] (getragen von [JNT_NAME]) + + + [HUD_DETAILS] beansprucht viel Texturspeicher + + + [HUD_DETAILS] enthält zu viele ressourcenintensive Objekte und Texturen + + + [HUD_DETAILS] enthält viele große Texturen + + + [HUD_DETAILS] enthält zu viele Objekte + + + [HUD_DETAILS] enthält zu viele Texturen + + + [COUNT] Jahr + + + [COUNT] Jahre + + + [COUNT] Jahre + + + [COUNT] Monat + + + [COUNT] Monate + + + [COUNT] Monate + + + [COUNT] Woche + + + [COUNT] Wochen + + + [COUNT] Wochen + + + [COUNT] Tag + + + [COUNT] Tage + + + [COUNT] Tage + + + [COUNT] Mitglied + + + [COUNT] Mitglieder + + + [COUNT] Mitglieder + + + Einwohner + + + Test + + + Charta-Mitglied + + + Linden Lab-Mitarbeiter + + + Zahlungsinfo verwendet + + + Zahlungsinfo archiviert + + + Keine Zahlungsinfo archiviert + + + Altersgeprüft + + + Nicht altersgeprüft + + + Mitte 2 + + + Oben rechts + + + Oben + + + Oben links + + + Mitte + + + Unten links + + + Unten + + + Unten rechts + + + Heruntergeladen, wird kompiliert + + + Kein Skriptkompilierungsdienst verfügbar + + + Skript wurde auf Server nicht gefunden. + + + Beim Herunterladen ist ein Problem aufgetreten + + + Unzureichende Rechte zum Herunterladen eines Skripts. + + + Unzureichende Berechtigungen für + + + Unbekannter Fehler beim Herunterladen + + + Skript „[SCRIPT]“ mit Erlebnis „[EXPERIENCE]“ wird übersprungen. + + + Rekompilierung + + + rekompilieren + + + Zurücksetzen + + + Zurücksetzen + + + Skript ausführen + + + Skript ausführen + + + Skript anhalten + + + Skript anhalten + + + Kompilieren erfolgreich abgeschlossen! + + + Kompilieren erfolgreich abgeschlossen, speichern... + + + Speichervorgang abgeschlossen. + + + Datei-Upload fehlgeschlagen: + + + Skript (Objekt außerhalb des Bereichs) + + + Skript (aus Inventar gelöscht) + + + Objekt [OBJECT], Besitzer [OWNER] + + + keine + + + + (unbekannt) + + + + + [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc] + + + + + Kontostand + + + Danksagung + + + Soll + + + Gesamtbetrag + + + Für Gruppe wurden keine Gruppendaten gefunden + + + parent estate + + + Mainland + + + Teen + + + jeder + + + Fehler + + + alle Grundbesitze gehören [OWNER] + + + alle Grundbesitze, die Sie besitzen + + + alle Grundbesitze, die Sie für [OWNER] verwalten + + + Immer zulässig: ([ALLOWEDAGENTS], max. [MAXACCESS]) + + + Immer zugelassene Gruppen: ([ALLOWEDGROUPS], max. [MAXACCESS]) + + + Immer verbannt: ([BANNEDAGENTS], max. [MAXBANNED]) + + + Immer zugelassen + + + Immer verbannt + + + alle Grundbesitze + + + verwaltete Grundbesitze + + + dieser Grundbesitz + + + und [EXTRA_COUNT] weitere + + + Parzellenskript-Speicher + + + Aufgeführte Parzellen: [PARCELS] + + + Verwendeter Speicher: [COUNT] KB von [MAX] KB; [AVAILABLE] KB verfügbar + + + Verwendeter Speicher: [COUNT] KB + + + Parzelleskript-URLs + + + Verwendete URLs: [COUNT] von [MAX]; [AVAILABLE] verfügbar + + + Verwendete URLs: [COUNT] + + + Fehler bei Informationsabruf + + + Keine Parzellen wurden ausgewählt + + + Fehler: Skriptinformationen sind nur für Ihre aktuelle Region verfügbar + + + Informationen werden abgerufen... + + + Sie sind nicht berechtigt, diese Parzelle zu untersuchen. + + + sitzt auf + + + Brust + + + Schädel + + + Linke Schulter + + + Rechte Schulter + + + Linke Hand + + + Rechte Hand + + + Linker Fuß + + + Rechter Fuß + + + Wirbelsäule + + + Becken + + + Mund + + + Kinn + + + Linkes Ohr + + + Rechtes Ohr + + + Linkes Auge + + + Rechtes Auge + + + Nase + + + Rechter Oberarm + + + Rechter Unterarm + + + Linker Oberarm + + + Linker Unterarm + + + Rechte Hüfte + + + Rechter Oberschenkel + + + Rechter Unterschenkel + + + Linke Hüfte + + + Linker Oberschenkel + + + Linker Unterschenkel + + + Bauch + + + Linke Brust + + + Rechte Brust + + + HUD Mitte 2 + + + HUD oben rechts + + + HUD oben Mitte + + + HUD oben links + + + HUD Mitte 1 + + + HUD unten links + + + HUD unten + + + HUD unten rechts + + + Hals + + + Avatar-Mitte + + + Linker Ringfinger + + + Rechter Ringfinger + + + Schwanzansatz + + + Schwanzspitze + + + Linker Flügel + + + Rechter Flügel + + + Kiefer + + + Alt. linkes Ohr + + + Alt. rechtes Ohr + + + Alt. linkes Auge + + + Alt. rechtes Auge + + + Zunge + + + Leiste + + + Linker hinterer Fuß + + + Rechter hinterer Fuß + + + Zeile [LINE], Spalte [COLUMN] + + + [COUNT] gefunden + + + [hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt] + + + [mthnum,datetime,slt]/[day,datetime,slt] + + + Objektinhalt + + + Neues Skript + + + Dieser Einwohner hat den Nicht-stören-Modus aktiviert und wird Ihre Nachricht später sehen. + + + (Nach Namen) + + + (Einwohner) + + + (Objekt) + + + (Gruppe) + + + (Extern) + + + Für diesen Grundbesitz liegt kein Vertrag vor. + + + Für diesen Grundbesitz liegt kein Vertrag vor. Das Land auf diesem Grundbesitz wird vom Grundbesitzer und nicht von Linden Lab verkauft. Für Informationen zum Verkauf setzen Sie sich bitte mit dem Grundbesitzer in Verbindung. + + + + + + In Gruppenbesitz + + + Öffentlich + + + Lokale Einstellungen + + + Regionseinstellungen + + + Diese Region unterstützt keine Umgebungseinstellungen. + + + Sonne + + + Mond + + + Bloom + + + Wolkenrauschen + + + Normal-Map + + + Transparent + + + Klicks: [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil + + + (wird nach Veröffentlichung aktualisiert) + + + Sie haben keine Auswahl oder Anzeigen erstelllt. Klicken Sie auf die „Plus"-Schaltfläche, um eine Auswahl oder Anzeige zu erstellen. + + + Sie haben keine Auswahl erstellt. Klicken Sie auf die Schaltfläche "Neu", um eine Auswahl zu erstellen. + + + Sie haben keine Anzeigen erstellt. Klicken Sie auf die Schaltfläche "Neu", um eine Anzeige zu erstellen. + + + Der Einwohner hat keine Auswahl oder Anzeigen + + + Der Einwohner hat keine Auswahl + + + Der Einwohner hat keine Anzeigen + + + Wird geladen... + + + Vorschau + + + Eigenschaften + + + Ein Objekt namens + + + im Besitz der Gruppe + + + im Besitz einer unbekannten Gruppe + + + im Besitz von + + + im Besitz eines unbekannten Einwohners + + + hat Ihnen folgendes übergeben + + + Sie lehnen [DESC] von <nolink>[NAME]</nolink> ab. + + + Gesamtbetrag + + + gekauft + + + bezahlte Ihnen + + + bezahlte an + + + kaufte Pass für + + + bezahlte Gebühr für Event + + + bezahlte Preis für Event + + + Kontostand + + + Danksagung + + + Soll + + + [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] + + + Erworbene Artikel + + + Abbrechen + + + Das Hochladen von [NAME] kostet [AMOUNT] L$ + + + Die Kosten betragen: [AMOUNT] L$ + + + Unbekanntes Dateiformat .%s +Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh + + + Ignorieren + + + Ignorieren + + + Freischalten + + + Freischalten + + + Zu meinen Landmarken hinzufügen... + + + Meine Landmarken bearbeiten... + + + ⌃ + + + ⌘ + + + ⌥ + + + ⇧ + + + Strg+ + + + Alt+ + + + Umschalt+ + + + Datei wurde gespeichert + + + Daten werden empfangen + + + Uhr + + + Uhr + + + PST + + + PDT + + + Vorwärts + + + Links + + + Rechts + + + Zurück + + + Norden + + + Süden + + + Westen + + + Osten + + + Nach oben + + + Nach unten + + + Alle Kategorien + + + Shopping + + + Land mieten + + + Immobilie mieten + + + Attraktionen + + + Neue Produkte + + + Stellenangebote + + + Gesucht + + + Dienstleistungen + + + Sonstiges + + + Keiner + + + Lindenort + + + Adult + + + Kunst & Kultur + + + Firmen + + + Bildung + + + Spielen + + + Treffpunkt + + + Anfängergerecht + + + Parks und Natur + + + Wohngebiet + + + Phase + + + Sonstige + + + Vermietung + + + Alle + + + Sie + + + : + + + , + + + ... + + + *** + + + ( + + + ) + + + . + + + ' + + + --- + + + Mehrere Medien + + + Medien Abspielen/Pausieren + + + http://www.intel.com/p/en_US/support/detect/graphics + + + http://www.nvidia.com/Download/index.aspx?lang=de-de + + + http://support.amd.com/de/Pages/AMDSupportHub.aspx + + + Beim Parsen der Befehlszeile wurde ein Fehler festgestellt. +Weitere Informationen: http://wiki.secondlife.com/wiki/Client_parameters (EN) +Fehler: + + + [APP_NAME] Verwendung in Befehlszeile: + + + [APP_NAME] kann auf die erforderliche Datei nicht zugreifen. + +Grund hierfür ist, dass Sie entweder mehrere Instanzen gleichzeitig ausführen oder dass Ihr System denkt, eine Datei sei geöffnet. +Falls diese Nachricht erneut angezeigt wird, starten Sie bitte Ihren Computer neu und probieren Sie es noch einmal. +Falls der Fehler dann weiterhin auftritt, müssen Sie [APP_NAME] von Ihrem System de-installieren und erneut installieren. + + + Unbehebbarer Fehler + + + [APP_NAME] erfordert einen Prozessor mit AltiVec (G4 oder später). + + + [APP_NAME] läuft bereits. +Bitte sehen Sie in Ihrer Menüleiste nach, dort sollte ein Symbol für das Programm angezeigt werden. +Falls diese Nachricht erneut angezeigt wird, starten Sie Ihren Computer bitte neu. + + + [APP_NAME] scheint eingefroren zu sein oder ist abgestürzt. +Möchten Sie einen Absturz-Bericht einschicken? + + + Benachrichtigung + + + [APP_NAME] kann DirectX 9.0b oder höher nicht feststellen. +[APP_NAME] verwendet DirectX, um nach Hardware und/oder veralteten Treibern zu suchen, die zu Problemen mit der Stabilität, Leistung und Abstürzen führen können. Sie können [APP_NAME] auch so ausführen, wir empfehlen jedoch, dass DirectX 9.0b vorhanden ist und ausgeführt wird. + +Möchten Sie fortfahren? + + + Hinweis + + + Für Linux ist zur Zeit noch kein automatisches Aktualisieren möglich. +Bitte laden Sie die aktuellste Version von www.secondlife.com herunter. + + + RegisterClass fehlgeschlagen + + + Fehler + + + Vollbildschirm mit [WIDTH] x [HEIGHT] kann nicht ausgeführt werden. +Ausführung erfolgt in Fenster. + + + Fehler beim Herunterfahren während Fenster geschlossen wurde (DestroyWindow() fehlgeschlagen) + + + Fehler beim Herunterfahren + + + Kann keinen Kontext für GL-Gerät erstellen + + + Passendes Pixelformat wurde nicht gefunden + + + Beschreibung für Pixelformat nicht verfügbar + + + Um [APP_NAME] auszuführen, ist True Color (32-bit) erforderlich. +Klicken Sie öffnen Sie auf Ihrem Computer die Einstellungen für die Anzeige und stellen Sie den Bildschirm auf 32-bit Farbe ein. + + + [APP_NAME] kann nicht ausgeführt werden, da kein 8-Bit-Alpha-Kanal verfügbar ist. Dies geschieht normalerweise bei Problemen mit dem Treiber der Video-Karte. +Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für Ihre Videokarte installiert haben. +Vergewissern Sie sich außerdem, dass Ihr Bildschirm auf True Color (32-Bit) eingestellt ist (Systemsteuerung > Anzeige > Einstellungen). +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + + + Pixel-Format kann nicht eingestellt werden. + + + Kann keinen Kontext für GL-Gerät erstellen + + + Kann keinen Kontext für GL-Gerät aktivieren + + + [APP_NAME] kann nicht ausgeführt werden, da die Treiber Ihrer Videokarte entweder nicht richtig installiert oder veraltet sind, oder die entsprechende Hardware nicht unterstützt wird. Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für die Videokarte installiert haben. Falls Sie die aktuellsten Treiber bereits installiert haben, installieren Sie diese bitte erneut. + +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + + + Bartschatten + + + Ganz weiß + + + Anime-Augen + + + Gewölbt + + + Armlänge + + + Angewachsen + + + Angewachsene Ohrläppchen + + + Nackenfransen + + + Tränensäcke + + + Pony + + + Knopfaugen + + + Bauchgröße + + + Groß + + + Großer Hintern + + + Volumen: Hinten + + + Volumen: Vorne + + + Volumen: Oben + + + Groß + + + Große Brustmuskeln + + + Große Stacheln + + + Schwarz + + + Blond + + + Blondes Haar + + + Rouge + + + Rougefarbe + + + Rouge Deckkraft + + + Körperkonturen + + + Körperfett + + + Sommersprossen + + + breit + + + Körperbreite + + + schmal + + + o-beinig + + + Brust, Straffheit + + + Dekolleté + + + Brustgröße + + + Rückenbreite + + + Breit + + + Brauengröße + + + Glubschaugen + + + Hervortretend + + + Knollennase + + + Knollennase + + + Brust – Masse + + + Brust – Glättung + + + Brust – Schwerkraft + + + Brust – Luftwiderstand + + + Max. Effekt + + + Federn + + + Verstärkung + + + Dämpfung + + + Max. Effekt + + + Federn + + + Verstärkung + + + Dämpfung + + + Max. Effekt + + + Federn + + + Verstärkung + + + Dämpfung + + + Bauch – Masse + + + Bauch – Glättung + + + Bauch – Schwerkraft + + + Bauch – Luftwiderstand + + + Max. Effekt + + + Federn + + + Verstärkung + + + Dämpfung + + + Po – Masse + + + Po – Glättung + + + Po – Schwerkraft + + + Po – Luftwiderstand + + + Max. Effekt + + + Federn + + + Verstärkung + + + Dämpfung + + + Max. Effekt + + + Federn + + + Verstärkung + + + Dämpfung + + + Buschige Augenbrauen + + + Buschiges Haar + + + Hintern, Größe + + + Po – Schwerkraft + + + Tournürenrock + + + Ohne + + + Mit + + + Chaplin + + + Wangenknochen + + + Brustgröße + + + Kinnwinkel + + + Kinnspalte + + + Schifferfräse + + + Kinnlänge + + + Kinn ausgeprägt + + + Kinn zurück + + + Kinn nach vorne + + + Kinn-Hals + + + Transparent + + + Spalte + + + Eng stehende Augen + + + Geschlossen + + + Hinten geschlossen + + + Vorne geschlossen + + + Links geschlossen + + + Rechts geschlossen + + + Klein + + + Kragen hinten + + + Kragen vorne + + + Nach unten + + + Nach oben + + + Schlupflid + + + Krumme Nase + + + Hosenaufschlag + + + Dunkel + + + Dunkelgrün + + + Dunkler + + + Tief + + + Standardabsätze + + + Dicht + + + Doppelkinn + + + Nach unten + + + Groß + + + Ohrenwinkel + + + Ohrengröße + + + Ohrenspitzen + + + Eierkopf + + + Augenränder + + + Augenfarbe + + + Augentiefe + + + Helligkeit + + + Öffnung + + + Symmetrie + + + Augengröße + + + Augenstand + + + Brauenbogen + + + Brauendichte + + + Brauenhöhe + + + Brauenenden + + + Brauengröße + + + Wimpernlänge + + + Eyeliner + + + Farbe des Eyeliners + + + Glubschaugen + + + Gesichtsverzerrung + + + Gesichtskonturen + + + Weit auseinander + + + Volle Lippen + + + weiblich + + + Ohne Finger + + + Finger + + + Ausgestellt + + + Flach + + + Flacher Hintern + + + Flacher Kopf + + + Flache Spitze + + + Fußgröße + + + Stirnwinkel + + + Stirn ausgeprägt + + + Sommersprossen + + + Fransen, vorne + + + Hinten volles Haar + + + Starker Eyeliner + + + Vorne volles Haar + + + Seitlich volles Haar + + + Volle Seiten + + + Glänzend + + + Handschuhfinger + + + Handschuhlänge + + + Haare + + + Haare: Hinten + + + Haare: Vorne + + + Haare: Seiten + + + Haartolle + + + Haardicke + + + Haardicke + + + Haarneigung + + + Nach links + + + Nach rechts + + + Haare: Volumen + + + Handgröße + + + Zwirbelbart + + + Kopflänge + + + Kopfform + + + Kopfgröße + + + Kopfstreckung + + + Absatzhöhe + + + Absatzform + + + Größe + + + Hoch + + + Hohe Absätze + + + Hoch + + + Hohe Plattformsohlen + + + Hoch und eng + + + Höhere + + + Länge der Hüfte + + + Breite der Hüfte + + + Schweben + + + In + + + Farbe Innenseite + + + Deckkraft: innen + + + Ecke: Nasenseite + + + Innenlid + + + Innenlid + + + Jackenlänge + + + Jackenfalten + + + Kinnansatz + + + Kinnposition + + + Kinnform + + + Zusammen + + + Hängebacken + + + Kniewinkel + + + X-beinig + + + Groß + + + Große Hände + + + Linksscheitel + + + Beinlänge + + + Beinmuskeln + + + Weniger + + + Weniger Speck + + + Weniger + + + Weniger + + + Weniger + + + Weniger + + + Weniger + + + Weniger + + + Weniger + + + Weniger + + + Weniger + + + Weniger + + + Weniger + + + Weniger + + + Weniger + + + Heller + + + Amorbogen + + + Tiefe: Amorbogen + + + Fülle + + + Pinkton + + + Lippenproportionen + + + Lippendicke + + + Mundbreite + + + Lipgloss + + + Lippenstift + + + Farbe + + + Lang + + + Langer Kopf + + + Lange Hüften + + + Lange Beine + + + Langer Hals + + + Lange Zöpfe + + + Langer Pferdeschwanz + + + Langer Oberkörper + + + Lange Arme + + + Weite Hosen + + + Weites Hemd + + + Weite Ärmel + + + Fettpölsterchen + + + Niedrig + + + Niedrig + + + Niedrig + + + Niedrig + + + Weit + + + Absenken + + + Brücke, Unterer Teil + + + Wangen, unterer Bereich + + + Männlich + + + Mittelscheitel + + + Mehr + + + Mehr + + + Mehr Speck + + + Mehr + + + Mehr + + + Mehr + + + Voller + + + Mehr + + + Mehr + + + Mehr + + + Größer + + + Mehr + + + Mehr + + + Mehr + + + Runder + + + Mehr + + + Flach + + + Eckiger + + + Mehr + + + Steil + + + Mehr + + + Mehr + + + Schnauzer + + + Mundwinkel + + + Mundposition + + + Irokese + + + Muskulös + + + Koteletten + + + Nagellack + + + Farbe + + + Schmal + + + Wenig + + + Wenig + + + Schmale Lippen + + + Natürlich + + + Halslänge + + + Halsdicke + + + Kein Rouge + + + Kein Eyeliner + + + Kein Lidschatten + + + Kein Lipgloss + + + Kein Lippenstift + + + Kein Scheitel + + + Kein Nagellack + + + Nicht rot + + + Keine Stachel + + + Kein Weiß + + + Keine Falten + + + Normal unten + + + Normal oben + + + Links + + + Rechts + + + Größe + + + Dicke + + + Nasenspitze + + + Nasenspitze + + + Nasenbreite + + + Teilung + + + Größe + + + Deckend + + + Öffnen + + + Hinten offen + + + Vorne offen + + + Links offen + + + Rechts offen + + + Orange + + + Aus + + + Farbe: Oben + + + Deckkraft: Oben + + + Äußerer Augenwinkel + + + Lidschatten: Oben + + + Lidschatten: Oben + + + Überbiss + + + Ausbeulung + + + Lackierte Nägel + + + Blass + + + Schritt + + + Passform + + + Hosenlänge + + + Hüfte + + + Falten + + + Scheitel + + + Pony scheiteln + + + Brustmuskel + + + Pigmentierung + + + Zöpfe + + + Pink + + + Mehr Pink + + + Höhe + + + Breite + + + Spitz + + + Pfennigabsätze + + + Pferdeschwanz + + + Weit ausgestellt + + + Linkes Auge größer + + + Rechtes Auge größer + + + Geschwollen + + + Geschwollene Lider + + + Regenbogenfarben + + + Rote Haare + + + Normal + + + Scheitel rechts + + + Rosiger Teint + + + Rund + + + Röte + + + Rötlich + + + Zerzauste Haare + + + Hüftspeck + + + Dürres Bein + + + Auseinander + + + Flach + + + Hinterkopf rasiert + + + Gesicht verzerren + + + Vorne rasiert + + + Links + + + Rechts + + + Hinterkopf rasiert + + + Vorne rasiert + + + Nach links + + + Mund verschieben + + + Nach rechts + + + Hemdlänge + + + Passform + + + Falten + + + Schuhart + + + Klein + + + Kurze Arme + + + Kurze Beine + + + Kurzer Hals + + + Kurze Zöpfe + + + Kurzer Pferdeschwanz + + + Kurze Koteletten + + + Kurzer Oberkörper + + + Kurze Hüften + + + Schultern + + + Seitliche Fransen + + + Koteletten + + + Seitliches Haar + + + Lang + + + Kurz + + + Dünner Hals + + + Passform + + + Rocklänge + + + Fliehende Stirn + + + Ärmellänge + + + Passform Ärmel + + + Schlitz: Hinten + + + Schlitz: Vorne + + + Schlitz: Links + + + Schlitz: Rechts + + + Klein + + + Kleine Hände + + + Klein + + + Glätten + + + Glattes Haar + + + Strumpflänge + + + Unterlippenbart + + + Wenig + + + Stachelhaare + + + Rechteck + + + Eckig + + + Gestaucht + + + Gestreckt + + + Eingefallen + + + Trichterbrust + + + Eingesunkene Augen + + + Nach hinten + + + Nach vorne + + + Groß + + + Ansatzbreite hinten + + + Ansatzbreite vorne + + + Dicke Absätze + + + Dicker Hals + + + Dick + + + Dünn + + + Dünne Augenbrauen + + + Dünne Lippen + + + Dünne Nase + + + Straffes Kinn + + + Eng + + + Enge Hosen + + + Enges Hemd + + + Enger Rock + + + Enge Ärmel + + + Spitze + + + Dicke + + + Länge des Oberkörpers + + + Muskeln + + + Dürr + + + Frei + + + Straffes Lid + + + Unterbiss + + + Unnatürlich + + + Brücke, oberer Teil + + + Obere Wangen + + + Obere Kinnspalte + + + Obere Lidfalte + + + Stupsnase + + + Sehr rot + + + Bund + + + Gut genährt + + + Weiße Haare + + + Breit + + + Breit + + + Breit + + + Breit + + + Wild + + + Falten + + + Zu meinen Landmarken hinzufügen + + + Meine Landmarken bearbeiten + + + Weitere Informationen über die aktuelle Position + + + Mein Reiseverlauf + + + Dieses Land kaufen + + + Voice hier nicht möglich + + + Fliegen ist unzulässig + + + Kein Stoßen + + + Bauen/Fallen lassen von Objekten ist verboten + + + Skripte sind unzulässig + + + Gesundheit + + + Adult-Region + + + Moderate Region + + + Generelle Region + + + Avatare in dieser Parzelle können von Avataren außerhalb dieser Parzelle weder gesehen noch gehört werden + + + Bewegliche Objekte verhalten sich in dieser Region u. U. erst dann korrekt, wenn die Region neu geformt wird. + + + Dynamisches Pathfinding ist in dieser Region nicht aktiviert. + + + [APP_NAME] Aktualisierung + + + [APP_NAME] wird aktualisiert... + + + [APP_NAME] wird installiert... + + + Ihr [APP_NAME]-Viewer wird aktualisiert. Dies kann einen Moment dauern. Wir bitten um Ihr Verständnis. + + + Aktualisierung wird heruntergeladen... + + + Aktualisierung wird heruntergeladen + + + Herunterladen ist fehlgeschlagen + + + Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version von www.secondlife.com herunter. + + + Aktualisierung konnte nicht installiert werden + + + Viewer konnte nicht gestartet werden + + + [APP_NAME]: Zuviele Objekte auf einmal von [FROM_NAME]. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar. + + + [APP_NAME]: Zuviele Objekte auf einmal. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar. + + + -- Instant-Message-Protokoll aktiviert -- + + + [NAME] tippt... + + + (Nicht benannt) + + + (Moderiert: Stimmen in der Standardeinstellung stummgeschaltet) + + + Für diese Verbindung ist kein Text-Chat verfügbar. + + + Ihr Text-Chat wurde von einem Gruppenmoderator deaktiviert. + + + Für Instant Message hier klicken. + + + An + + + (Moderator) + + + (Gespeichert am [LONG_TIMESTAMP]) + + + Wenn Sie diese Meldung sehen, müssen Sie unter „Einstellungen“ > „Privatsphäre“ die Option „Nur IMs und Anrufe von Freunden oder Gruppen durchstellen“ deaktivieren. + + + Online + + + Offline + + + Benutzer nicht online – Nachricht wird gespeichert und später zugestellt. + + + Benutzer nicht online – Inventar gespeichert. + + + Ihr Anruf wurde entgegengenommen + + + Sie haben einen Voice-Anruf begonnen + + + Sie sind dem Gespräch beigetreten + + + Sie haben den Voice-Anruf automatisch abgelehnt, während der Nicht-stören-Modus aktiviert war. + + + [NAME] hat einen Voice-Anruf begonnen + + + Verbindung wird hergestellt... + + + Verbunden. Klicken Sie auf Anruf beenden, um die Verbindung zu trennen + + + Anruf wurde beendet + + + Wird verbunden... + + + Chat mit mehreren Personen + + + Konferenz mit [AGENT_NAME] + + + Inventarobjekt „[ITEM_NAME]“ angeboten + + + Inventarordner „[ITEM_NAME]“ angeboten + + + Sie chatten mit einem Bot, [NAME]. Geben Sie keine persönlichen Informationen weiter. +Erfahren Sie mehr unter https://second.life/scripted-agents. + + + Objekte aus dem Inventar hier her ziehen + + + Sie haben auf Facebook gepostet. + + + Sie haben auf Flickr gepostet. + + + Sie haben auf Twitter gepostet. + + + (IM-Session nicht vorhanden) + + + Sie sind der einzige Benutzer in dieser Sitzung. + + + [NAME] ist offline. + + + Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen. + + + Sie haben diesen Einwohner ignoriert. Wenn Sie eine Nachricht senden, wird dieser freigeschaltet. + + + Fehler bei Anfrage, bitte versuchen Sie es später. + + + Fehler bei Anfrage, bitte versuchen Sie es später. + + + Sie sind dazu nicht berechtigt. + + + Die Sitzung ist abgelaufen + + + Sie besitzen diese Fähigkeit nicht. + + + Sie besitzen diese Fähigkeit nicht. + + + Sie sind kein Sitzungsmoderator. + + + Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert. + + + Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert. + + + Es konnten keine Benutzer zur Chat-Sitzung mit [RECIPIENT] hinzugefügt werden. + + + Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden. + + + Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden. + + + Fehler während Moderation. + + + Sie wurden von der Gruppe ausgeschlossen. + + + Sie wurden von der Gruppe ausgeschlossen. + + + Sie haben nicht mehr die Berechtigung an der Chat-Sitzung teilzunehmen. + + + [SOURCES] hat etwas Neues gesagt + + + [SOURCES] haben etwas Neues gesagt + + + Die Initialisierung der Sitzung ist fehlgeschlagen + + + Position für Zuhause festgelegt. + + + https://secondlife.com/destination/voice-island + + + https://secondlife.com/destination/voice-morphing-premium + + + [NAME] hat Ihnen [REASON] [AMOUNT] L$ bezahlt. + + + [NAME] hat Ihnen [AMOUNT] L$ bezahlt: [REASON] + + + [NAME] hat Ihnen [AMOUNT] L$ bezahlt. + + + Sie haben [REASON] [AMOUNT] L$ an [NAME] bezahlt. + + + Sie haben [NAME] [AMOUNT] L$ bezahlt: [REASON] + + + Sie haben [AMOUNT] L$ bezahlt. + + + Sie haben [AMOUNT] L$ an [NAME] bezahlt. + + + Sie haben [REASON] [AMOUNT] L$ bezahlt. + + + Sie haben [NAME] [AMOUNT] L$ [REASON] nicht bezahlt. + + + Sie haben [NAME] [AMOUNT] L$ nicht bezahlt: [REASON] + + + Sie haben [AMOUNT] L$ nicht bezahlt. + + + Sie haben [NAME] [AMOUNT] L$ nicht bezahlt. + + + Sie haben [AMOUNT] L$ [REASON] nicht bezahlt. + + + für [ITEM] + + + für eine Landparzelle + + + für einen Pass + + + für die Landübertragung + + + für die Gründung einer Gruppe + + + für den Beitritt zur Gruppe + + + fürs Hochladen + + + um eine Anzeige aufzugeben + + + [AMOUNT] L$ werden bezahlt + + + Kosten für Hochladen [AMOUNT] L$ + + + Kosten: [AMOUNT] L$ + + + Ausgewähltes Land wird für [AMOUNT] L$ gekauft. + + + Dieses Objekt kostet [AMOUNT] L$ + + + Jeder + + + Offiziere + + + Eigentümer + + + Online + + + Hochladen... + +Missbrauchsbericht + + + Neue Form/Gestalt + + + Neue Haut + + + Neues Haar + + + Neue Augen + + + Neues Hemd + + + Neue Hose + + + Neue Schuhe + + + Neue Socken + + + Neue Jacke + + + Neue Handschuhe + + + Neues Unterhemd + + + Neue Unterhose + + + Neuer Rock + + + Neues Alpha + + + Neue Tätowierung + + + Neues Universal + + + Neue Physik + + + Ungültiges Objekt + + + Neue Geste + + + Neues Skript + + + Neue Notiz + + + Neuer Ordner + + + Inhalt + + + Gesten + + + Männliche Gesten + + + Weibliche Gesten + + + Andere Gesten + + + Sprachgesten + + + Häufig verwendete Gesten + + + Männlich - Excuse me + + + Männlich - Get lost + + + Männlich - Kusshand + + + Männlich - Buh + + + Männlich - Gelangweilt + + + Männlich - Hey + + + Männlich - Lachen + + + Männlich - Angewidert + + + Männlich - Achselzucken + + + Männlich - Zunge herausstrecken + + + Männlich - Wow + + + Weiblich - Kichern + + + Weiblich - Weinen + + + Weiblich - Verlegen + + + Weiblich - Räuspern + + + Weiblich - Get lost + + + Weiblich - Kusshand + + + Weiblich - Buh + + + Weiblich - Gelangweilt + + + Weiblich - Hey + + + Weiblich - Hey Süße(r) + + + Weiblich - Lachen + + + Weiblich - Looking good + + + Weiblich - Over here + + + Weiblich - Please + + + Weiblich - Angewidert + + + Weiblich - Achselzucken + + + Weiblich - Zunge herausstrecken + + + Weiblich - Wow + + + Neuer Tageszyklus + + + Neues Wasser + + + Neuer Himmel + + + /verbeugen + + + /klatschen + + + /zählen + + + /löschen + + + /lmaa + + + /Muskel + + + /nein + + + /nein! + + + /Papier + + + /auf mich zeigen + + + /auf dich zeigen + + + /Stein + + + /Schere + + + /rauchen + + + /dehnen + + + /pfeifen + + + /ja + + + /ja! + + + afk + + + Tanzen1 + + + Tanzen2 + + + Tanzen3 + + + Tanzen4 + + + Tanzen5 + + + Tanzen6 + + + Tanzen7 + + + Tanzen8 + + + [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt] + + + Keine/Keiner + + + Bilder, die größer sind als [WIDTH]*[HEIGHT] können nicht geladen werden + + + Max. Fotogröße für Outfit ist [WIDTH]*[HEIGHT]. Bitte verkleinern Sie das Bild oder verwenden Sie ein anderes. + + + Max. Fotogröße für Outfit ist [WIDTH]*[HEIGHT]. Bitte wählen Sie eine andere Textur aus. + + + Fotoabmessungen können nicht bestätigt werden. Bitte warten Sie, bis die Fotogröße im Auswahlfenster angezeigt wird. + + + + Trotz all unserer Bemühungen ist ein unerwarteter Fehler aufgetreten. + +Bitte überprüfen Sie http://status.secondlifegrid.net, um herauszufinden, ob ein Problem mit dem Service vorliegt. + Falls Sie weiterhin Problem haben, überprüfen Sie bitte Ihre Netzwerk- und Firewalleinstellungen. + + + Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag + + + So:Mo:Di:Mi:Do:Fr:Sa + + + Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember + + + Jan:Feb:Mär:Apr:Mai:Jun:Jul:Aug:Sep:Okt:Nov:Dez + + + [MDAY] + + + Uhr + + + Uhr + + + [AMOUNT] US$ + + + Gruppenverbannung + + + Mitgliedschaft + + + Rollen + + + Gruppenidentität + + + Parzellenverwaltung + + + Parzellenidentität + + + Parzelleneinstellungen + + + Parzellenfähigkeiten + + + Parzellenzugang + + + Parzelleninhalt + + + Objektmanagement + + + Kontoführung + + + Mitteilungen + + + Chat + + + Basis + + + Premium + + + Premium Plus + + + Ausgewählte Objekte löschen? + + + Ausgewähltes Objekt löschen? + + + Keine Objekte in diesem Outfit + + + Wählen Sie über die Einstellung „ExternalEditor“ einen Editor aus + + + Angegebener externer Editor nicht gefunden. Setzen Sie den Editorpfad in Anführungszeichen -(z. B. "/pfad/editor" "%s"). - Fehler beim Parsen des externen Editorbefehls. - Externer Editor konnte nicht ausgeführt werden. - Übersetzung fehlgeschlagen: [REASON] - Fehler beim Parsen der Übersetzungsantwort. - Esc - Space - Enter - Tab - Ins - Del - Backsp - Shift - Ctrl - Alt - CapsLock - Zuhause - End - PgUp - PgDn - F1 - F2 - F3 - F4 - F5 - F6 - F7 - F8 - F9 - F10 - F11 - F12 - Addieren - Subtrahieren - Multiplizieren - Dividieren - PAD_DIVIDE - PAD_LEFT - PAD_RIGHT - PAD_DOWN - PAD_UP - PAD_HOME - PAD_END - PAD_PGUP - PAD_PGDN - PAD_CENTER - PAD_INS - PAD_DEL - PAD_Enter - PAD_BUTTON0 - PAD_BUTTON1 - PAD_BUTTON2 - PAD_BUTTON3 - PAD_BUTTON4 - PAD_BUTTON5 - PAD_BUTTON6 - PAD_BUTTON7 - PAD_BUTTON8 - PAD_BUTTON9 - PAD_BUTTON10 - PAD_BUTTON11 - PAD_BUTTON12 - PAD_BUTTON13 - PAD_BUTTON14 - PAD_BUTTON15 - - - = - ` - ; - [ - ] - \ - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - A - B - C - D - E - F - G - H - I - J - K - L - M - N - O - P - Q - R - S - T - U - V - W - X - Y - Z - Partikel-Beacons werden angezeigt (blau) - Beacons für physische Objekte werden angezeigt (grün) - Beacons für Skriptobjekte werden angezeigt (rot) - Beacons für Skriptobjekte mit Berührungsfunktion werden angezeigt (rot) - Sound-Beacons werden angezeigt (gelb) - Medien-Beacons werden angezeigt (weiß) - Sonnenrichtungs-Beacon ansehen (orange) - Mondrichtungs-Beacon ansehen (lila) - Partikel werden ausgeblendet - Landinformationen - Aussehen - Avatar - Bauen - Chat - Unterhaltungen - Kompass - Ziele - Meine Umgebungen - Facebook - Flickr - Gesten - Grid-Status - Infos - Inventar - Karte - Marktplatz - Marktplatz - Minikarte - Gehen / Rennen / Fliegen - Händler-Outbox - Leute - Auswahlen - Orte - Einstellungen - Profil - Missbrauch melden - Suchen - Foto - Sprechen - Twitter - Kamerasteuerungen - Voice-Einstellungen - Informationen zu dem von Ihnen besuchten Land - Avatar ändern - Kompletten Avatar auswählen - Objekte bauen und Terrain umformen - Mit Leuten in der Nähe chatten - Mit allen unterhalten - Kompass - Ziele von Interesse - Meine Umgebungen - Auf Facebook posten - Auf Flickr hochladen - Gesten für Ihren Avatar - Aktuellen Grid-Status anzeigen - Wie führe ich gängige Aufgaben aus? - Ihr Eigentum anzeigen und benutzen - Weltkarte - Einkaufen gehen - Ihre Kreation verkaufen - Leute in der Nähe anzeigen - Ihren Avatar bewegen - Artikel zum Verkauf in den Marktplatz übertragen - Freunde, Gruppen und Leute in der Nähe - Orte, die in Ihrem Profil als Favoriten angezeigt werden sollen - Von Ihnen gespeicherte Orte - Einstellungen - Ihr Profil bearbeiten oder anzeigen - Missbrauch melden - Orte, Veranstaltungen, Leute finden - Foto aufnehmen - Über Ihr Mikrofon mit Leuten in der Nähe sprechen - Twitter - Kamerawinkel ändern - Lautstärkeregler für Anrufe und Leute in Ihrer Nähe in SL - gegenwärtig in der unteren Symbolleiste - gegenwärtig in der linken Symbolleiste - gegenwärtig in der rechten Symbolleiste - % zurückbehalten - Details - Bessere Details - Oberfläche - Fest - Wickeln - Vorschau - Normal - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - Keine - Wirkt sich auf Navmesh aus - Figur - (mehrere) - Sehr niedrig - Niedrig - Mittel - Hoch - Sehr hoch - Der Einwohner kann diese Region nicht besuchen. - [Benutzer] - Erlebnis - (kein Erlebnis) - (unbenanntes Erlebnis) - Landumfang - Gridumfang - ZULäSSIG - BLOCKIERT - CONTRIBUTOR - ADMIN - AKTUELL - EIGENE - ([EXPERIENCES], max. [MAXEXPERIENCES]) - Ihre Steuerungen übernehmen - Animationen Ihres Avatars auslösen - an Ihren Avatar anhängen - Ihre Kamera vorfolgen - Ihre Kamera steuern - Sie teleportieren - automatisch Erlebnisberechtigungen akzeptieren - ihren Avatar zwingen, sich zu setzen - Ändern Ihrer Umgebungseinstellungen - unbekannten Vorgang durchführen: [Permission] - Steuerungen übernehmen - Animationen auslösen - Anhängen - Kamera verfolgen - Kamera steuern - Teleportieren - Berechtigung - Sitzen - Umgebung - Unterhaltungen werden nicht protokolliert. Um ein Protokoll zu starten, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ > „Chat“. - Es werden keine Unterhaltungen mehr protokolliert. Um weiterhin ein Protokoll zu führen, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ > „Chat“. - Keine protokollierten Unterhaltungen verfügbar. Hier erscheint ein Protokolleintrag, wenn Sie eine Person kontaktieren oder von einer Person kontaktiert werden. - Laden... - Nicht zutreffend - -Leere Liste- - Standard - (Keine) - Keine Begrenzung - Die Physikform enthält Dreiecke, die zu klein sind. Versuchen Sie, das Physikmodell zu vereinfachen. - Die Physikform enthält ungültige Bestätigungsdaten. Versuchen Sie, das Physikmodell zu korrigieren. - Die Physikform hat keine korrekte Version. Legen Sie die korrekte Version für das Physikmodell fest. - Der DNS konnte den Hostnamen ([HOSTNAME]) nicht auflösen Prüfen +(z. B. "/pfad/editor" "%s"). + + + Fehler beim Parsen des externen Editorbefehls. + + + Externer Editor konnte nicht ausgeführt werden. + + + Übersetzung fehlgeschlagen: [REASON] + + + Fehler beim Parsen der Übersetzungsantwort. + + + Esc + + + Space + + + Enter + + + Tab + + + Ins + + + Del + + + Backsp + + + Shift + + + Ctrl + + + Alt + + + CapsLock + + + Zuhause + + + End + + + PgUp + + + PgDn + + + F1 + + + F2 + + + F3 + + + F4 + + + F5 + + + F6 + + + F7 + + + F8 + + + F9 + + + F10 + + + F11 + + + F12 + + + Addieren + + + Subtrahieren + + + Multiplizieren + + + Dividieren + + + PAD_DIVIDE + + + PAD_LEFT + + + PAD_RIGHT + + + PAD_DOWN + + + PAD_UP + + + PAD_HOME + + + PAD_END + + + PAD_PGUP + + + PAD_PGDN + + + PAD_CENTER + + + PAD_INS + + + PAD_DEL + + + PAD_Enter + + + PAD_BUTTON0 + + + PAD_BUTTON1 + + + PAD_BUTTON2 + + + PAD_BUTTON3 + + + PAD_BUTTON4 + + + PAD_BUTTON5 + + + PAD_BUTTON6 + + + PAD_BUTTON7 + + + PAD_BUTTON8 + + + PAD_BUTTON9 + + + PAD_BUTTON10 + + + PAD_BUTTON11 + + + PAD_BUTTON12 + + + PAD_BUTTON13 + + + PAD_BUTTON14 + + + PAD_BUTTON15 + + + - + + + = + + + ` + + + ; + + + [ + + + ] + + + \ + + + 0 + + + 1 + + + 2 + + + 3 + + + 4 + + + 5 + + + 6 + + + 7 + + + 8 + + + 9 + + + A + + + B + + + C + + + D + + + E + + + F + + + G + + + H + + + I + + + J + + + K + + + L + + + M + + + N + + + O + + + P + + + Q + + + R + + + S + + + T + + + U + + + V + + + W + + + X + + + Y + + + Z + + + Partikel-Beacons werden angezeigt (blau) + + + Beacons für physische Objekte werden angezeigt (grün) + + + Beacons für Skriptobjekte werden angezeigt (rot) + + + Beacons für Skriptobjekte mit Berührungsfunktion werden angezeigt (rot) + + + Sound-Beacons werden angezeigt (gelb) + + + Medien-Beacons werden angezeigt (weiß) + + + Sonnenrichtungs-Beacon ansehen (orange) + + + Mondrichtungs-Beacon ansehen (lila) + + + Partikel werden ausgeblendet + + + Landinformationen + + + Aussehen + + + Avatar + + + Bauen + + + Chat + + + Unterhaltungen + + + Kompass + + + Ziele + + + Meine Umgebungen + + + Facebook + + + Flickr + + + Gesten + + + Grid-Status + + + Infos + + + Inventar + + + Karte + + + Marktplatz + + + Marktplatz + + + Minikarte + + + Gehen / Rennen / Fliegen + + + Händler-Outbox + + + Leute + + + Auswahlen + + + Orte + + + Einstellungen + + + Profil + + + Missbrauch melden + + + Suchen + + + Foto + + + Sprechen + + + Twitter + + + Kamerasteuerungen + + + Voice-Einstellungen + + + Informationen zu dem von Ihnen besuchten Land + + + Avatar ändern + + + Kompletten Avatar auswählen + + + Objekte bauen und Terrain umformen + + + Mit Leuten in der Nähe chatten + + + Mit allen unterhalten + + + Kompass + + + Ziele von Interesse + + + Meine Umgebungen + + + Auf Facebook posten + + + Auf Flickr hochladen + + + Gesten für Ihren Avatar + + + Aktuellen Grid-Status anzeigen + + + Wie führe ich gängige Aufgaben aus? + + + Ihr Eigentum anzeigen und benutzen + + + Weltkarte + + + Einkaufen gehen + + + Ihre Kreation verkaufen + + + Leute in der Nähe anzeigen + + + Ihren Avatar bewegen + + + Artikel zum Verkauf in den Marktplatz übertragen + + + Freunde, Gruppen und Leute in der Nähe + + + Orte, die in Ihrem Profil als Favoriten angezeigt werden sollen + + + Von Ihnen gespeicherte Orte + + + Einstellungen + + + Ihr Profil bearbeiten oder anzeigen + + + Missbrauch melden + + + Orte, Veranstaltungen, Leute finden + + + Foto aufnehmen + + + Über Ihr Mikrofon mit Leuten in der Nähe sprechen + + + Twitter + + + Kamerawinkel ändern + + + Lautstärkeregler für Anrufe und Leute in Ihrer Nähe in SL + + + gegenwärtig in der unteren Symbolleiste + + + gegenwärtig in der linken Symbolleiste + + + gegenwärtig in der rechten Symbolleiste + + + % zurückbehalten + + + Details + + + Bessere Details + + + Oberfläche + + + Fest + + + Wickeln + + + Vorschau + + + Normal + + + http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer + + + Keine + + + Wirkt sich auf Navmesh aus + + + Figur + + + (mehrere) + + + Sehr niedrig + + + Niedrig + + + Mittel + + + Hoch + + + Sehr hoch + + + Der Einwohner kann diese Region nicht besuchen. + + + [Benutzer] + + + Erlebnis + + + (kein Erlebnis) + + + (unbenanntes Erlebnis) + + + Landumfang + + + Gridumfang + + + ZULäSSIG + + + BLOCKIERT + + + CONTRIBUTOR + + + ADMIN + + + AKTUELL + + + EIGENE + + + ([EXPERIENCES], max. [MAXEXPERIENCES]) + + + Ihre Steuerungen übernehmen + + + Animationen Ihres Avatars auslösen + + + an Ihren Avatar anhängen + + + Ihre Kamera vorfolgen + + + Ihre Kamera steuern + + + Sie teleportieren + + + automatisch Erlebnisberechtigungen akzeptieren + + + ihren Avatar zwingen, sich zu setzen + + + Ändern Ihrer Umgebungseinstellungen + + + unbekannten Vorgang durchführen: [Permission] + + + Steuerungen übernehmen + + + Animationen auslösen + + + Anhängen + + + Kamera verfolgen + + + Kamera steuern + + + Teleportieren + + + Berechtigung + + + Sitzen + + + Umgebung + + + Unterhaltungen werden nicht protokolliert. Um ein Protokoll zu starten, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ > „Chat“. + + + Es werden keine Unterhaltungen mehr protokolliert. Um weiterhin ein Protokoll zu führen, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ > „Chat“. + + + Keine protokollierten Unterhaltungen verfügbar. Hier erscheint ein Protokolleintrag, wenn Sie eine Person kontaktieren oder von einer Person kontaktiert werden. + + + Laden... + + + Nicht zutreffend + + + -Leere Liste- + + + Standard + + + (Keine) + + + Keine Begrenzung + + + Die Physikform enthält Dreiecke, die zu klein sind. Versuchen Sie, das Physikmodell zu vereinfachen. + + + Die Physikform enthält ungültige Bestätigungsdaten. Versuchen Sie, das Physikmodell zu korrigieren. + + + Die Physikform hat keine korrekte Version. Legen Sie die korrekte Version für das Physikmodell fest. + + + Der DNS konnte den Hostnamen ([HOSTNAME]) nicht auflösen Prüfen Sie bitte, ob Sie die Website www.secondlife.com aufrufen können. Wenn Sie die Website aufrufen können, jedoch weiterhin diese Fehlermeldung erhalten, -besuchen Sie bitte den Support-Bereich und melden Sie das Problem. - Der Anmeldeserver konnte sich nicht per SSL verifizieren. +besuchen Sie bitte den Support-Bereich und melden Sie das Problem. + + + Der Anmeldeserver konnte sich nicht per SSL verifizieren. Wenn Sie diese Fehlermeldung weiterhin erhalten, besuchen Sie bitte den Support-Bereich der Website Secondlife.com -und melden Sie das Problem. - Die Ursache hierfür ist häufig eine falsch eingestellte Uhrzeit auf Ihrem Computer. +und melden Sie das Problem. + + + Die Ursache hierfür ist häufig eine falsch eingestellte Uhrzeit auf Ihrem Computer. Bitte vergewissern Sie sich, dass Datum und Uhrzeit in der Systemsteuerung korrekt eingestellt sind. Überprüfen Sie außerdem, ob Ihre Netzwerk- und Firewall-Einstellungen korrekt sind. Wenn Sie diese Fehlermeldung weiterhin erhalten, besuchen Sie bitte den Support-Bereich der Website Secondlife.com und melden Sie das Problem. -[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Knowledge-Base] +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Knowledge-Base] + diff --git a/indra/newview/skins/default/xui/de/teleport_strings.xml b/indra/newview/skins/default/xui/de/teleport_strings.xml index 9f8a7a8045..1ed09f24b5 100644 --- a/indra/newview/skins/default/xui/de/teleport_strings.xml +++ b/indra/newview/skins/default/xui/de/teleport_strings.xml @@ -1,41 +1,97 @@ - Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden. -Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. - Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen eventuell neu anmelden, um die Region wechseln zu können. -Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. - Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal. -Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an. - Das System konnte das Landmarken-Ziel nicht finden. - Das System konnte keine Teleport-Verbindung herstellen. -Versuchen Sie es später noch einmal. - Sie können nicht zurück nach Welcome Island teleportieren. -Gehen Sie zu „Welcome Island Public“, um das Tutorial zu wiederholen. - Sie haben leider keinen Zugang zu diesem Teleport-Ziel. - Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen. - Die Asset-Warteschlange in dieser Region ist zurzeit überlastet. -Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region. - Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. - Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. - Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut. - Das Inventarsystem ist zurzeit nicht verfügbar. - Sie müssen mindestens 18 Jahre alt sein, um diese Region betreten zu können. - Betreten der Region nicht gestattet. „[REGION_NAME]“ ist eine Region für Geschicklichkeitsspiele. Der Zutritt ist Einwohnern vorbehalten, die bestimmte Kriterien erfüllen. Weitere Details finden Sie unter [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ]. - Entschuldigung, aber das System konnte deinen Teleport nicht starten. Versuche es bitte in ein paar Minuten noch einmal. + + Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden. +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + + + Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen eventuell neu anmelden, um die Region wechseln zu können. +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + + + Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal. +Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an. + + + Das System konnte das Landmarken-Ziel nicht finden. + + + Das System konnte keine Teleport-Verbindung herstellen. +Versuchen Sie es später noch einmal. + + + Sie können nicht zurück nach Welcome Island teleportieren. +Gehen Sie zu „Welcome Island Public“, um das Tutorial zu wiederholen. + + + Sie haben leider keinen Zugang zu diesem Teleport-Ziel. + + + Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen. + + + Die Asset-Warteschlange in dieser Region ist zurzeit überlastet. +Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region. + + + Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. + + + Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. + + + Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut. + + + Das Inventarsystem ist zurzeit nicht verfügbar. + + + Sie müssen mindestens 18 Jahre alt sein, um diese Region betreten zu können. + + + Betreten der Region nicht gestattet. „[REGION_NAME]“ ist eine Region für Geschicklichkeitsspiele. Der Zutritt ist Einwohnern vorbehalten, die bestimmte Kriterien erfüllen. Weitere Details finden Sie unter [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ]. + + + Entschuldigung, aber das System konnte deinen Teleport nicht starten. Versuche es bitte in ein paar Minuten noch einmal. + - Transport zum Ziel. - Weiterleitung an anderes Ziel. - Weiterleitung zum Ziel. - Zuhause-Position wird ermittelt. - Landmarken-Position wird ermittelt. - Teleport wird abgeschlossen. - Teleport aus [T_SLURL] wurde erfolgreich abgeschlossen. - Ziel wird ermittelt. - Verbindung zu neuer Region. - Ziel erreicht... - Teleport wird initialisiert... - Anstehender Teleport... + + Transport zum Ziel. + + + Weiterleitung an anderes Ziel. + + + Weiterleitung zum Ziel. + + + Zuhause-Position wird ermittelt. + + + Landmarken-Position wird ermittelt. + + + Teleport wird abgeschlossen. + + + Teleport aus [T_SLURL] wurde erfolgreich abgeschlossen. + + + Ziel wird ermittelt. + + + Verbindung zu neuer Region. + + + Ziel erreicht... + + + Teleport wird initialisiert... + + + Anstehender Teleport... + diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 93b34e3cca..86e454b83e 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -1,2046 +1,5820 @@ - SECOND LIFE - Portal de Soporte de Second Life - Identificando el hardware... - Instalando [APP_NAME]... - Limpiando la caché... - Iniciando la caché de las texturas... - Error de inicialización de gráficos. Actualiza tu controlador de gráficos. - [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) -[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] - Configuración de constitución [BUILD_CONFIG] - Estás en la posición [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1], de [REGION], alojada en <nolink>[HOSTNAME]</nolink> + + SECOND LIFE + + + Portal de Soporte de Second Life + + + Identificando el hardware... + + + Instalando [APP_NAME]... + + + Limpiando la caché... + + + Iniciando la caché de las texturas... + + + Error de inicialización de gráficos. Actualiza tu controlador de gráficos. + + + [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) +[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] + + + Configuración de constitución [BUILD_CONFIG] + + + Estás en la posición [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1], de [REGION], alojada en <nolink>[HOSTNAME]</nolink> SLURL: <nolink>[SLURL]</nolink> (coordenadas globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] -[SERVER_RELEASE_NOTES_URL] - CPU: [CPU] +[SERVER_RELEASE_NOTES_URL] + + + CPU: [CPU] Memoria: [MEMORY_MB] MB Versión del Sistema Operativo: [OS_VERSION] Fabricante de la tarjeta gráfica: [GRAPHICS_CARD_VENDOR] -Tarjeta gráfica: [GRAPHICS_CARD] - Versión de Windows Graphics Driver: [GRAPHICS_DRIVER_VERSION] - Versión de OpenGL: [OPENGL_VERSION] - Tamaño de la ventana: [WINDOW_WIDTH]x[WINDOW_HEIGHT] +Tarjeta gráfica: [GRAPHICS_CARD] + + + Versión de Windows Graphics Driver: [GRAPHICS_DRIVER_VERSION] + + + Versión de OpenGL: [OPENGL_VERSION] + + + Tamaño de la ventana: [WINDOW_WIDTH]x[WINDOW_HEIGHT] Ajuste del tamaño de fuente: [FONT_SIZE_ADJUSTMENT]pt Escala UI: [UI_SCALE] Distancia de dibujo: [DRAW_DISTANCE]m Ancho de banda: [NET_BANDWITH]kbit/s Factor LOD: [LOD_FACTOR] Calidad de renderización: [RENDER_QUALITY] -Memoria de textura: [TEXTURE_MEMORY]MB - Modo de visualización HiDPi: [HIDPI] - Versión de descodificador J2C: [J2C_VERSION] +Memoria de textura: [TEXTURE_MEMORY]MB + + + Modo de visualización HiDPi: [HIDPI] + + + Versión de descodificador J2C: [J2C_VERSION] Versión del controlador audio: [AUDIO_DRIVER_VERSION] [LIBCEF_VERSION] Versión LibVLC: [LIBVLC_VERSION] -Versión del servidor de voz: [VOICE_VERSION] - Paquetes perdidos: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) - [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] - Error al obtener la URL de las notas de la versión del servidor. - Configuración de constitución - Restaurando... - Cambiando la resolución... - Brillo al máximo (antiguo) - Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere. - Iniciando la sesión... - Autenticando - Realizando el mantenimiento de la cuenta... - Ha fallado el intento previo de iniciar sesión. Iniciando sesión, intento [NUMBER] - Cargando el mundo... - Iniciando el navegador web incorporado... - Iniciando multimedia... - Cargando las fuentes... - Comprobando los archivos de la caché (puede tardar entre 60 y 90 segundos)... - Procesando la respuesta... - Iniciando el mundo... - Decodificando las imágenes... - Iniciando QuickTime... - No se ha encontrado QuickTime. Imposible iniciarlo. - QuickTime se ha iniciado adecuadamente. - Solicitando capacidades de la región... - Solicitando capacidades de la región, intento [NUMBER]... - Esperando la conexión con la región... - Conectando con la región... - Descargando la ropa... - El servidor devolvió un certificado no válido o dañado. Ponte en contacto con el administrador de la cuadrícula. - El nombre de host utilizado para acceder al servidor no es válido. Comprueba tu SLURL o el nombre de host de la cuadrícula. - Parece que el certificado que devolvió la cuadrícula está caducado. Comprueba el reloj del sistema o consulta al administrador de la cuadrícula. - El certificado que devolvió el servidor no puede utilizarse para SSL. Ponte en contacto con el administrador de la cuadrícula. - La cadena de certificado del servidor contenía demasiados certificados. Ponte en contacto con el administrador de la cuadrícula. - No se pudo verificar la firma del certificado devuelta por el servidor de la cuadrícula. Ponte en contacto con el administrador de la cuadrícula. - Error de red: no se ha podido conectar; por favor, revisa tu conexión a internet. - Error en el inicio de sesión. - Salir - http://join.secondlife.com/?sourceid=[sourceid] - Grid principal de Second Life (Agni) - Grid de prueba beta de Second Life (Aditi) - http://secondlife.com/download. - Ya no puedes acceder a Second Life con el visor que estás utilizando. Visita la siguiente página para descargar un nuevo visor: +Versión del servidor de voz: [VOICE_VERSION] + + + Paquetes perdidos: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) + + + [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] + + + Error al obtener la URL de las notas de la versión del servidor. + + + Configuración de constitución + + + Restaurando... + + + Cambiando la resolución... + + + Brillo al máximo (antiguo) + + + Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere. + + + Iniciando la sesión... + + + Autenticando + + + Realizando el mantenimiento de la cuenta... + + + Ha fallado el intento previo de iniciar sesión. Iniciando sesión, intento [NUMBER] + + + Cargando el mundo... + + + Iniciando el navegador web incorporado... + + + Iniciando multimedia... + + + Cargando las fuentes... + + + Comprobando los archivos de la caché (puede tardar entre 60 y 90 segundos)... + + + Procesando la respuesta... + + + Iniciando el mundo... + + + Decodificando las imágenes... + + + Iniciando QuickTime... + + + No se ha encontrado QuickTime. Imposible iniciarlo. + + + QuickTime se ha iniciado adecuadamente. + + + Solicitando capacidades de la región... + + + Solicitando capacidades de la región, intento [NUMBER]... + + + Esperando la conexión con la región... + + + Conectando con la región... + + + Descargando la ropa... + + + El servidor devolvió un certificado no válido o dañado. Ponte en contacto con el administrador de la cuadrícula. + + + El nombre de host utilizado para acceder al servidor no es válido. Comprueba tu SLURL o el nombre de host de la cuadrícula. + + + Parece que el certificado que devolvió la cuadrícula está caducado. Comprueba el reloj del sistema o consulta al administrador de la cuadrícula. + + + El certificado que devolvió el servidor no puede utilizarse para SSL. Ponte en contacto con el administrador de la cuadrícula. + + + La cadena de certificado del servidor contenía demasiados certificados. Ponte en contacto con el administrador de la cuadrícula. + + + No se pudo verificar la firma del certificado devuelta por el servidor de la cuadrícula. Ponte en contacto con el administrador de la cuadrícula. + + + Error de red: no se ha podido conectar; por favor, revisa tu conexión a internet. + + + Error en el inicio de sesión. + + + Salir + + + http://join.secondlife.com/?sourceid=[sourceid] + + + Grid principal de Second Life (Agni) + + + Grid de prueba beta de Second Life (Aditi) + + + http://secondlife.com/download. + + + Ya no puedes acceder a Second Life con el visor que estás utilizando. Visita la siguiente página para descargar un nuevo visor: http://secondlife.com/download. Si deseas obtener más información, consulta las preguntas frecuentes que aparecen a continuación: -http://secondlife.com/viewer-access-faq - Actualización opcional del visor disponible: [VERSION] - Actualización necesaria del visor: [VERSION] - El agente ya ha iniciado sesión. - Lo sentimos. No ha sido posible iniciar sesión. +http://secondlife.com/viewer-access-faq + + + Actualización opcional del visor disponible: [VERSION] + + + Actualización necesaria del visor: [VERSION] + + + El agente ya ha iniciado sesión. + + + Lo sentimos. No ha sido posible iniciar sesión. Comprueba si has introducido correctamente * El nombre de usuario (como juangarcia12 o estrella.polar) * Contraseña -Asimismo, asegúrate de que la tecla Mayús esté desactivada. - Como precaución de seguridad, se ha modificado tu contraseña. +Asimismo, asegúrate de que la tecla Mayús esté desactivada. + + + Como precaución de seguridad, se ha modificado tu contraseña. Dirígete a la página de tu cuenta en http://secondlife.com/password y responde a la pregunta de seguridad para restablecer la contraseña. -Lamentamos las molestias. - Hemos realizado unos cambios en nuestro sistema, por lo que deberás restablecer la contraseña. +Lamentamos las molestias. + + + Hemos realizado unos cambios en nuestro sistema, por lo que deberás restablecer la contraseña. Dirígete a la página de tu cuenta en http://secondlife.com/password y responde a la pregunta de seguridad para restablecer la contraseña. -Lamentamos las molestias. - Second Life no está disponible temporalmente debido a tareas de mantenimiento. +Lamentamos las molestias. + + + Second Life no está disponible temporalmente debido a tareas de mantenimiento. Actualmente, solo se permite iniciar sesión a los empleados. -Consulta www.secondlife.com/status si deseas obtener actualizaciones. - Las conexiones a Second Life se han restringido provisionalmente para garantizar que los usuarios que ya están conectados tengan la mejor experiencia posible. +Consulta www.secondlife.com/status si deseas obtener actualizaciones. + + + Las conexiones a Second Life se han restringido provisionalmente para garantizar que los usuarios que ya están conectados tengan la mejor experiencia posible. -Durante este tiempo, las personas con cuentas gratuitas no podrán acceder a Second Life, ya que tienen prioridad los usuarios con una cuenta de pago. - No se puede acceder a Second Life desde este ordenador. +Durante este tiempo, las personas con cuentas gratuitas no podrán acceder a Second Life, ya que tienen prioridad los usuarios con una cuenta de pago. + + + No se puede acceder a Second Life desde este ordenador. Si crees que se trata de un error, ponte en contacto con -support@secondlife.com. - No se podrá acceder a tu cuenta hasta las -[TIME] (horario de la costa del Pacífico). - En este momento no podemos completar la solicitud. -Por favor solicita ayuda al personal de asistencia de Second Life en http://support.secondlife.com. - Se han detectado datos incorrectos en el inicio de sesión. -Ponte en contacto con support@secondlife.com. - Se están realizando tareas rutinarias de mantenimiento en tu cuenta. +support@secondlife.com. + + + No se podrá acceder a tu cuenta hasta las +[TIME] (horario de la costa del Pacífico). + + + En este momento no podemos completar la solicitud. +Por favor solicita ayuda al personal de asistencia de Second Life en http://support.secondlife.com. + + + Se han detectado datos incorrectos en el inicio de sesión. +Ponte en contacto con support@secondlife.com. + + + Se están realizando tareas rutinarias de mantenimiento en tu cuenta. No se podrá acceder a tu cuenta hasta las [TIME] (horario de la costa del Pacífico). -Si crees que se trata de un error, ponte en contacto con support@secondlife.com. - La solicitud de cierre de sesión ha obtenido como resultado un error del simulador. - El sistema te desconectará. -Por favor, aguarda un momento antes de intentar conectarte nuevamente. - No se ha podido crear una sesión válida. - No se ha podido establecer la conexión con un simulador. - Tu cuenta solo puede acceder a Second Life +Si crees que se trata de un error, ponte en contacto con support@secondlife.com. + + + La solicitud de cierre de sesión ha obtenido como resultado un error del simulador. + + + El sistema te desconectará. +Por favor, aguarda un momento antes de intentar conectarte nuevamente. + + + No se ha podido crear una sesión válida. + + + No se ha podido establecer la conexión con un simulador. + + + Tu cuenta solo puede acceder a Second Life entre las [START] y las [END] (horario de la costa del Pacífico). Inténtalo de nuevo durante ese horario. -Si crees que se trata de un error, ponte en contacto con support@secondlife.com. - Parámetros incorrectos. -Si crees que se trata de un error, ponte en contacto con support@secondlife.com. - El parámetro correspondiente al nombre debe contener caracteres alfanuméricos. -Si crees que se trata de un error, ponte en contacto con support@secondlife.com. - El parámetro correspondiente al apellido debe contener caracteres alfanuméricos. -Si crees que se trata de un error, ponte en contacto con support@secondlife.com. - La región se está desconectando. -Intenta iniciar sesión de nuevo en unos instantes. - El agente no se encuentra en la región. -Intenta iniciar sesión de nuevo en unos instantes. - A esta región ya se ha accedido en otra sesión. -Intenta iniciar sesión de nuevo en unos instantes. - Se ha salido de la región en la sesión anterior. -Intenta iniciar sesión de nuevo en unos instantes. - La región aún está cerrando la sesión anterior. -Intenta iniciar sesión de nuevo en unos instantes. - Se ha salido de la región en la última sesión. -Intenta iniciar sesión de nuevo en unos instantes. - La región ha comenzado el proceso de cierre de sesión. -Intenta iniciar sesión de nuevo en unos instantes. - El sistema ha comenzado a cerrar la última sesión. -Intenta iniciar sesión de nuevo en unos instantes. - Esta región puede estar teniendo problemas. Por favor, comprueba tu conexión a Internet. - Guardando tus configuraciones... - Cerrando sesión... - Cerrando... - Has sido desconectado de la región en la que estabas. - Has sido enviado a una región no válida. - Probando la desconexión del visor - Conectando con Facebook... - Publicando... - Desconectando de Facebook... - Problema al conectar con Facebook - Problema al publicar en Facebook - Problema al desconectar de Facebook - Conectándose a Flickr... - Publicando... - Desconectándose de Flickr... - Problema con la conexión a Flickr - Problema al publicar en Flickr - Problema con la desconexión de Flickr - Conectándose a Twitter... - Publicando... - Desconectándose de Twitter... - Problema con la conexión a Twitter - Problema al publicar en Twitter - Problema con la desconexión de Twitter - Blanco y negro - Colores de los 70 - Intenso - Periódico - Sepia - Foco - Vídeo - Contraste automático - Destello de lente - Miniatura - Cámara de juguete - Persona - (sin nombre) - Propietario: - Público - (Grupo) - En venta: [AMOUNT] L$ - Construir el grupo - No construir - Construir el grupo - No seguro - No volar - Scripts el grupo - No scripts - Terreno: - Aquí se puede arrastrar sólo un ítem - No puedes tener una carpeta de prendas que contenga más de [AMOUNT] elementos. Puedes cambiar este límite en Avanzado > Mostrar las configuraciones del depurador > WearFolderLimit. +Si crees que se trata de un error, ponte en contacto con support@secondlife.com. + + + Parámetros incorrectos. +Si crees que se trata de un error, ponte en contacto con support@secondlife.com. + + + El parámetro correspondiente al nombre debe contener caracteres alfanuméricos. +Si crees que se trata de un error, ponte en contacto con support@secondlife.com. + + + El parámetro correspondiente al apellido debe contener caracteres alfanuméricos. +Si crees que se trata de un error, ponte en contacto con support@secondlife.com. + + + La región se está desconectando. +Intenta iniciar sesión de nuevo en unos instantes. + + + El agente no se encuentra en la región. +Intenta iniciar sesión de nuevo en unos instantes. + + + A esta región ya se ha accedido en otra sesión. +Intenta iniciar sesión de nuevo en unos instantes. + + + Se ha salido de la región en la sesión anterior. +Intenta iniciar sesión de nuevo en unos instantes. + + + La región aún está cerrando la sesión anterior. +Intenta iniciar sesión de nuevo en unos instantes. + + + Se ha salido de la región en la última sesión. +Intenta iniciar sesión de nuevo en unos instantes. + + + La región ha comenzado el proceso de cierre de sesión. +Intenta iniciar sesión de nuevo en unos instantes. + + + El sistema ha comenzado a cerrar la última sesión. +Intenta iniciar sesión de nuevo en unos instantes. + + + Esta región puede estar teniendo problemas. Por favor, comprueba tu conexión a Internet. + + + Guardando tus configuraciones... + + + Cerrando sesión... + + + Cerrando... + + + Has sido desconectado de la región en la que estabas. + + + Has sido enviado a una región no válida. + + + Probando la desconexión del visor + + + Conectando con Facebook... + + + Publicando... + + + Desconectando de Facebook... + + + Problema al conectar con Facebook + + + Problema al publicar en Facebook + + + Problema al desconectar de Facebook + + + Conectándose a Flickr... + + + Publicando... + + + Desconectándose de Flickr... + + + Problema con la conexión a Flickr + + + Problema al publicar en Flickr + + + Problema con la desconexión de Flickr + + + Conectándose a Twitter... + + + Publicando... + + + Desconectándose de Twitter... + + + Problema con la conexión a Twitter + + + Problema al publicar en Twitter + + + Problema con la desconexión de Twitter + + + Blanco y negro + + + Colores de los 70 + + + Intenso + + + Periódico + + + Sepia + + + Foco + + + Vídeo + + + Contraste automático + + + Destello de lente + + + Miniatura + + + Cámara de juguete + + + Persona + + + (sin nombre) + + + Propietario: + + + Público + + + (Grupo) + + + En venta: [AMOUNT] L$ + + + Construir el grupo + + + No construir + + + Construir el grupo + + + No seguro + + + No volar + + + Scripts el grupo + + + No scripts + + + Terreno: + + + Aquí se puede arrastrar sólo un ítem + + + No puedes tener una carpeta de prendas que contenga más de [AMOUNT] elementos. Puedes cambiar este límite en Avanzado > Mostrar las configuraciones del depurador > WearFolderLimit. + - Esto crea un vínculo a una página del dominio oficial SecondLife.com o LindenLab.com. - No se pueden mostrar artículos desde la carpeta Artículos del mercado - Los artículos que tienes puestos no se pueden colocar en la carpeta Artículos del mercado - La profundidad de carpetas anidadas excede de [AMOUNT]. Disminuye la profundidad de las carpetas anidadas; si es necesario, agrupa los artículos. - La cantidad de subcarpetas excede de [AMOUNT]. Disminuye la cantidad de carpetas de tu lista de artículos; si es necesario, agrupa los artículos. - La cantidad de artículos excede de [AMOUNT]. Para vender más de [AMOUNT] artículos en la misma lista, debes agrupar algunos. - La cantidad de artículos en stock excede de [AMOUNT]. - Solo se pueden soltar artículos o carpetas en las pestañas TODOS o SIN ASOCIAR. Selecciona una de estas pestañas y mueve otra vez los artículos o carpetas. - Uno o varios de estos objetos no se pueden vender o transferir - Solo puedes colocar en el mercado artículos de tu inventario - No puedes poner carpetas o artículos vinculados en el Mercado - No puedes colocar tarjetas de visita en el Mercado - No se puede mover una lista de artículos publicada - No se puede mover la carpeta raíz de artículos del Mercado - Todos los artículos de una carpeta de stock deben tener el mismo tipo y permiso - No puedes mover una carpeta a su carpeta secundaria - No puedes mover una carpeta dentro de sí misma - Pulsa para ver esta página web - Pulsa para ver la información de este lugar - Pulsa para ver el perfil del Residente - Obtén más información acerca de este residente. - Pulsa para silenciar a este Residente - Pulsa para quitar el silencio a este Residente - Pulsa para enviar un MI a este Residente - Pulsa para pagar a este Residente - Pulsa para enviar una petición de teleporte a este Residente - Pulsa para enviar una petición de amistad a este Residente - Pulsa para ver la descripción de este grupo - Pulsa para ver la descripción de este evento - Pulsa para ver este clasificado - Pulsa para ver la descripción de esta parcela - Pulsa para teleportarte a esta posición - Pulsa para ver la descripción de este objeto - Pulsa para ver en el mapa esta localización - Pulsa para ejecutar el comando secondlife:// + + Esto crea un vínculo a una página del dominio oficial SecondLife.com o LindenLab.com. + + + No se pueden mostrar artículos desde la carpeta Artículos del mercado + + + Los artículos que tienes puestos no se pueden colocar en la carpeta Artículos del mercado + + + La profundidad de carpetas anidadas excede de [AMOUNT]. Disminuye la profundidad de las carpetas anidadas; si es necesario, agrupa los artículos. + + + La cantidad de subcarpetas excede de [AMOUNT]. Disminuye la cantidad de carpetas de tu lista de artículos; si es necesario, agrupa los artículos. + + + La cantidad de artículos excede de [AMOUNT]. Para vender más de [AMOUNT] artículos en la misma lista, debes agrupar algunos. + + + La cantidad de artículos en stock excede de [AMOUNT]. + + + Solo se pueden soltar artículos o carpetas en las pestañas TODOS o SIN ASOCIAR. Selecciona una de estas pestañas y mueve otra vez los artículos o carpetas. + + + Uno o varios de estos objetos no se pueden vender o transferir + + + Solo puedes colocar en el mercado artículos de tu inventario + + + No puedes poner carpetas o artículos vinculados en el Mercado + + + No puedes colocar tarjetas de visita en el Mercado + + + No se puede mover una lista de artículos publicada + + + No se puede mover la carpeta raíz de artículos del Mercado + + + Todos los artículos de una carpeta de stock deben tener el mismo tipo y permiso + + + No puedes mover una carpeta a su carpeta secundaria + + + No puedes mover una carpeta dentro de sí misma + + + Pulsa para ver esta página web + + + Pulsa para ver la información de este lugar + + + Pulsa para ver el perfil del Residente + + + Obtén más información acerca de este residente. + + + Pulsa para silenciar a este Residente + + + Pulsa para quitar el silencio a este Residente + + + Pulsa para enviar un MI a este Residente + + + Pulsa para pagar a este Residente + + + Pulsa para enviar una petición de teleporte a este Residente + + + Pulsa para enviar una petición de amistad a este Residente + + + Pulsa para ver la descripción de este grupo + + + Pulsa para ver la descripción de este evento + + + Pulsa para ver este clasificado + + + Pulsa para ver la descripción de esta parcela + + + Pulsa para teleportarte a esta posición + + + Pulsa para ver la descripción de este objeto + + + Pulsa para ver en el mapa esta localización + + + Pulsa para ejecutar el comando secondlife:// + - Haz clic para redactar un correo electrónico - Teleportarse a - Mostrarla en el mapa - Silenciar - Quitar el silencio - MI - Pagar - Ofrecer teleporte a - Petición de amistad - Eliminación de amigos - Cerrar (⌘W) - Cerrar (Ctrl+W) - Cerrar - Maximizar - Minimizar - Separar la ventana - Fijar - Ver la Ayuda - Los objetos de este tipo no se pueden adjuntar -a las notas de esta región. - Sólo los objetos con permisos + + Haz clic para redactar un correo electrónico + + + Teleportarse a + + + Mostrarla en el mapa + + + Silenciar + + + Quitar el silencio + + + MI + + + Pagar + + + Ofrecer teleporte a + + + Petición de amistad + + + Eliminación de amigos + + + Cerrar (⌘W) + + + Cerrar (Ctrl+W) + + + Cerrar + + + Maximizar + + + Minimizar + + + Separar la ventana + + + Fijar + + + Ver la Ayuda + + + Los objetos de este tipo no se pueden adjuntar +a las notas de esta región. + + + Sólo los objetos con permisos «próximo propietario» sin restricciones -pueden adjuntarse a las notas. - Buscando... - No se ha encontrado. - Reintentando... - Notas de la versión - https://releasenotes.secondlife.com/viewer/ - Cargando... - (nadie) - (esperando) - (ninguno) - No hay ningún error - Petición de asset: fallida - Petición de asset: el archivo no existe - Petición de asset: no se encontró el asset en la base de datos - Fin del archivo - No puede abrirse el archivo - No se ha encontrado el archivo - Tiempo de transferencia del archivo - Circuito desconectado - No concuerda el precio en el visor y en el servidor - Estado desconocido - El servicio no está disponible. - Se detectaron errores inesperados en el servidor. - El servicio no está disponible o se alcanzó el tiempo de carga máxima. - Error en la solicitud de carga. Por favor, ingresa a -http://secondlife.com/support para obtener ayuda sobre cómo solucionar este problema. - Error en la validación para importar los parámetros [NAME] - No se pudo abrir el archivo [FILE] - No se pudo abrir el archivo [FILE] - No se pudo traducir el Viento de luz legado [NAME] - la textura - el sonido - la tarjeta de visita - el hito - el script antiguo - esa ropa - el objeto - la nota - la carpeta - la ruta - ese script de LSL2 - el código intermedio de LSL - esa textura tga - esa parte del cuerpo - la foto - Objetos Perdidos - esa imagen targa - la Papelera - esa imagen jpeg - la animación - el gesto - simstate - ese favorito - el enlace - enlace de la carpeta - opciones - red - (Edición de Apariencia) - Ausente - No molestar - Ignorado - Susto - Enfado - Ausente - Salto mortal atrás - Carcajada - Gran sonrisa - Mandar un beso - Aburrimiento - Reverencia - Aplauso - Reverencia floreada - Llanto - Baile 1 - Baile 2 - Baile 3 - Baile 4 - Baile 5 - Baile 6 - Baile 7 - Baile 8 - Desdén - Beber - Azorarse - Negar con el dedo - Éxito con el puño - Yoga flotando - Fruncir el ceño - Impaciente - Salto de alegría - Bésame el culo - Besar - Reír - Sacar músculo - No (con enfado) - No - Ña-Ña-Ña - Puñetazo uno-dos - Abrir la boca - 'V' con los dedos - Señalar a otro/a - Señalarse - Puñetazo izquierdo - Puñetazo derecho - PPT cuenta - PPT papel - PPT piedra - PPT tijera - Repulsa - Patada circular - Triste - Saludo militar - Gritar - Encogerse de hombros - Sonreír - Fumar: en la mano - Fumar - Fumar: tirar el cigarro - Sorpresa - Estocadas - Berrinche - Sacar la lengua - Agitar la mano - Cuchichear - Pitar - Guiño - Guiño (Hollywood) - Preocuparse - Sí (contento) - - Usar textura - Pasa el cursor del ratón sobre la regla - para ajustar a la cuadrícula - Cargando... - Sin conexión - [PRICE] L$ por [AREA] m² - No se ha encontrado. - OK - Fin prematuro del archivo - No se puede encontrar ROOT o JOINT. - Chat - (Chat) - susurra: - grita: - Conectando al chat de voz... - Conectado - La voz no está disponible en su localización actual - Desconectado del chat de voz - Vas a ser reconectado al chat de voz con los cercanos - '[OBJECTNAME]', un objeto propiedad de '[OWNERNAME]', localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS]. - A '[OBJECTNAME]', un objeto propiedad de '[OWNERNAME]', localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS]. - Si autorizas el acceso a tu cuenta, también permitirás al objeto: - Cogerle a usted dólares Linden (L$) - Actuar en sus controles de entrada - Reconfigurar sus controles de entrada - Ejecutar animaciones en su avatar - Anexarse a su avatar - Anular la propiedad y que pase a ser público - Enlazar y desenlazar de otros objetos - Añadir y quitar uniones con otros objetos - Cambiar sus permisos - Seguir su cámara - Controlar su cámara - Teleportarte - Forzar que el avatar se siente - Cambiar tu configuración del entorno - (Tú) - - Suprimir alertas al gestionar las listas de acceso a un estado - Reemplazar tus animaciones predeterminadas - Devolver objetos en tu nombre - (desconocido) - General - Moderado - Adulto - Desconectado - Desconocido - (desconocido) - Estado /Región completa - Estado / Homestead - Continente / Homestead - Continente / Región completa - Todos los archivos - Sonidos - Animaciones - Imágenes - Guardar - Cargar - Imágenes Targa - Imágenes de mapa de bits - Imágenes PNG - Imágenes Targa o PNG - Archivo de película AVI - Archivo de anim. XAF - Archivo XML - Archivo RAW - Imágenes comprimidas - Cargar archivos - Elegir directorio - Scripts - Diccionarios - Forma - Piel - Pelo - Ojos - Camisa - Pantalón - Zapatos - Calcetines - Chaqueta - Guantes - Camiseta - Ropa interior - Falda - Alfa - Tatuaje - Universal - Física - inválido/a - ninguno - Camisa no puesta - Pantalones no puestos - Zapatos no puestos - Calcetines no puestos - Chaqueta no puesta - Guantes no puestos - Camiseta no puesta - Ropa interior no puesta - Falda no puesta - Alfa no puesta - Tatuaje no puesto - Universal no puesto - Física no puesta - no válido/a - Crear una anatomía nueva - Crear una piel nueva - Crear pelo nuevo - Crear ojos nuevos - Crear una camisa nueva - Crear unos pantalones nuevos - Crear unos zapatos nuevos - Crear unos calcetines nuevos - Crear una chaqueta nueva - Crear unos guantes nuevos - Crear una camiseta nueva - Crear ropa interior nueva - Crear una falda nueva - Crear una capa alfa nueva - Crear un tatuaje nuevo - Crear unos guantes nuevos - Crear nueva física - no válido/a - Nuevo [WEARABLE_ITEM] - Siguiente - OK - Aviso de grupo - Avisos del grupo - Enviado por - Adjunto: - Ver los avisos pasados u optar por dejar de recibir aquí estos mensajes. - Abrir el adjunto - Guardar el adjunto - Ofrecimiento de teleporte - Llegaron avisos nuevos mientras estabas ausente... - Tienes [%d] aviso/s más - Brazo der. - Cabeza - Brazo izq. - Pierna izq. - Torso - Pierna der. - Esqueleto mejorado - Bajo - Medio - Alto - Pulsa ESC para salir de la vista subjetiva - ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/all/[SEARCH_TERM] Buscar]. - ¿No encuentras lo que buscas? Intenta [secondlife:///app/inventory/filters Show filters]. - ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/places/[SEARCH_TERM] Buscar]. - Arrastra aquí un hito para tenerlo en tus favoritos. - No se han encontrado artículos. Comprueba si has escrito correctamente la cadena de búsqueda y vuelve a intentarlo. - No tienes en tu inventario una copia de esta textura - Aquí aparecerán algunos de los objetos que recibas, como los regalos Premium. Después puedes arrastrarlos a tu inventario. - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ - http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more - Abrir la ventana con las opciones del Juego - Realizar gesto seleccionado en el mundo. - Abrir la ventana con las opciones del Juego - Cualquier usuario puede vender objetos en el mercado. - - Para hacerte comerciante debes [[MARKETPLACE_CREATE_STORE_URL] crear una tienda del Mercado]. - El buzón de salida está vacío. - - Arrastra carpetas a esta sección y pulsa en "Enviar al Mercado" para incluirlas en la lista de venta del [[MARKETPLACE_DASHBOARD_URL] Mercado]. - Inicializando el Mercado. - Estamos accediendo a tu cuenta de la [[MARKETPLACE_CREATE_STORE_URL] tienda del Mercado]. - Errores del Mercado. - La [[MARKETPLACE_CREATE_STORE_URL] tienda del Mercado] devuelve errores. - Se ha producido un error al abrir Artículos del Mercado. -Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia de Second Life en http://support.secondlife.com - Tu carpeta Artículos del mercado está vacía. - Arrastra carpetas a esta sección para incluirlas en la lista de venta del [[MARKETPLACE_DASHBOARD_URL] Mercado]. - ( [ITEMS_COUNT] Objetos) - La carpeta de stock debe estar contenida en una carpeta de versión - : Error: todos los artículos de una carpeta de stock deben ser del mismo tipo y que no se puedan copiar - : Error: la carpeta de stock no puede contener subcarpetas - : Atención: la carpeta no contiene ningún artículo - : Atención: creando carpeta de stock - : Atención: creando la carpeta de versión - : Atención: moviendo artículos - : Atención: se ha transferido el contenido de la carpeta a la carpeta de stock, y se eliminará la carpeta vacía - : Error: los artículos que no se pueden copiar deben estar contenidos en una carpeta de stock - : Atención: los artículos deben estar contenidos en una carpeta de versión - : Error: - : Atención: - : Atención: la carpeta de versión debe contener al menos un artículo - : Atención: la carpeta de stock debe contener al menos un artículo - No se han producido errores ni advertencias - Sin errores - Error: - Para poder enviar objetos al mercado, debes registrarte como comerciante (es gratis). - No se puede mover el artículo a esa carpeta. - Este artículo no se puede vender en el Mercado. - no Mkt ID - en la lista - activa - máx. - stock - existencias agotadas - actualizando... - Las cuotas se basan en tu nivel de suscripcion. Niveles más altos tienen cuotas más bajas visita [https://secondlife.com/my/account/membership.php? para saber más] - Abrir puntos destacados - Sin Restricciones - - - - - - - Cargando el contenido... - No hay contenido - - - - - - - - - - - - - - - - - - - - - - - - - - - Mi Inventario - Biblioteca - Texturas - Sonidos - Tarjetas de visita - Hitos - Scripts - Ropa - Objetos - Notas - Carpeta nueva - Inventario - Imágenes sin comprimir - Partes del cuerpo - Papelera - Álbum de fotos - Objetos Perdidos - Sonidos sin comprimir - Animaciones - Gestos - Mis Favoritos - Mis Favoritos - Mis Favoritos - Mis Favoritos - Vestuario actual - Vestuario inicial - Mis vestuarios - Accesorios - Redes - Objetos recibidos - Buzón de salida de comerciante - Amigos - Todas - No tienes puestos anexos - Anexos (quedan [COUNT] ranuras) - Comprar - Comprar por L$ - Piedra - Metal - Cristal - Madera - Carne - Plástico - Goma - Claridad - Mayúsculas - Ctrl - Tórax - Cráneo - Hombro izquierdo - Hombro derecho - Mano izq. - Mano der. - Pie izq. - Pie der. - Columna - Pelvis - Boca - Barbilla - Oreja izq. - Oreja der. - Ojo izq. - Ojo der. - Nariz - Brazo der. - Antebrazo der. - Brazo izq. - Antebrazo izq. - Cadera der. - Muslo der. - Pantorrilla der. - Cadera izq. - Muslo izq. - Pantorrilla izq. - Abdomen - Pecho izquierdo - Pecho derecho - Cuello - Centro del avatar - Dedo anular izquierdo - Dedo anular derecho - Base de la cola - Extremo de la cola - Ala izquierda - Ala derecha - Mandíbula - Oreja izquierda alternativa - Oreja derecha alternativa - Ojo izquierdo alternativo - Ojo derecho alternativo - Lengua - Ingle - Pata trasera izquierda - Pata trasera derecha - Punto de colocación no válido - Error: falta un artículo - Error: falta el artículo de base - Error: el objeto se encuentra en el vestuario actual, pero no está anexado - [AGEYEARS] [AGEMONTHS] de edad - [AGEYEARS] de edad - [AGEMONTHS] de edad - [AGEWEEKS] de edad - [AGEDAYS] de edad - Registrado hoy - Ahora todos pueden verte. - Es posible que no todos los que están próximos puedan renderizarte. - Es posible que más de la mitad de los que están próximos no puedan renderizarte. - Es posible que la mayoría de los que están próximos no puedan renderizarte. - Es posible que ninguno de los que están próximos pueda renderizarte. - Tu HUD - [OBJ_NAME] (lo llevas en [JNT_NAME]) - [HUD_DETAILS] usa mucha memoria de textura - [HUD_DETAILS] contiene muchas texturas y objetos complicados - [HUD_DETAILS] contiene muchas texturas grandes - [HUD_DETAILS] contiene demasiados objetos - [HUD_DETAILS] contiene demasiadas texturas - [COUNT] año - [COUNT] años - [COUNT] años - [COUNT] mes - [COUNT] meses - [COUNT] meses - [COUNT] semana - [COUNT] semanas - [COUNT] semanas - [COUNT] día - [COUNT] días - [COUNT] días - [COUNT] miembro - [COUNT] miembros - [COUNT] miembros - Residente - Prueba - Miembro fundador - Empleado de Linden Lab - Ha usado información sobre la forma de pago - Hay información archivada sobre la forma de pago - No hay información archivada sobre la forma de pago - Edad verificada - Edad no verificada - Centro 2 - Arriba der. - Arriba - Arriba izq. - Centro - Abajo izq. - Abajo - Abajo der. - Descargado, compilándolo - El servicio de compilación de scripts no está disponible - No se encuentra el script en el servidor. - Problema al descargar - Permisos insuficientes para descargar un script. - Permisos insuficientes para - Fallo desconocido en la descarga - Omitiendo el script [SCRIPT] con la experiencia [EXPERIENCE]. - Recompilando - recompilar - Progreso del reinicio - restaurar - Configurar según se ejecuta - Configurando según se ejecuta - Configurar sin ejecutar - Configurando sin ejecutarlo - ¡Compilación correcta! - Compilación correcta, guardando... - Guardado. - Error al subir el archivo: - Script (objeto fuera de rango) - Script (eliminado del inventario) - El objeto [OBJECT] es propiedad de [OWNER] - ninguno - - (Desconocido) - - - [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc] - - - Saldo - Créditos - Débitos - Total - No se encontraron datos del grupo - parent estate - continente - teen - cualquiera - error - todos los estados propiedad de [OWNER] - todos los estados que posees - todos los estados que administras para [OWNER] - Siempre permitido: ([ALLOWEDAGENTS], de un máx. de [MAXACCESS]) - Grupos siempre permitidos: ([ALLOWEDGROUPS], de un máx. de [MAXACCESS]) - Siempre prohibido: ([BANNEDAGENTS], de un máx. de [MAXBANNED]) - Siempre permitido - Siempre prohibido - todos los estados - estados administrados - este estado - y [EXTRA_COUNT] más - Memoria de los scripts de la parcela - Parcelas listadas: [PARCELS] - Memoria usada: [COUNT] kb de un máx de [MAX] kb; [AVAILABLE] kb disponibles - Memoria usada: [COUNT] kb - URLs de los scripts de la parcela - URLs usadas: [COUNT] de un máx. de [MAX]; [AVAILABLE] disponibles - URLs usadas: [COUNT] - Error al obtener la información - No hay una parcela seleccionada - Error: la información del script sólo está disponible en tu región actual - Obteniendo la información... - No tienes permiso para examinar esta parcela - Sentado en - Tórax - Cráneo - Hombro izquierdo - Hombro derecho - Mano izq. - Mano der. - Pie izq. - Pie der. - Columna - Pelvis - Boca - Barbilla - Oreja izq. - Oreja der. - Ojo izq. - Ojo der. - Nariz - Brazo der. - Antebrazo derecho - Brazo izq. - Antebrazo izquierdo - Cadera der. - Muslo der. - Pantorrilla der. - Cadera izq. - Muslo izq. - Pantorrilla izq. - Abdomen - Pectoral izquierdo - Pectoral derecho - HUD: Centro 2 - HUD: arriba der. - HUD: arriba centro - HUD: arriba izq. - HUD: Centro 1 - HUD: abajo izq. - HUD: abajo - HUD: abajo der. - Cuello - Centro del avatar - Dedo anular izquierdo - Dedo anular derecho - Base de la cola - Extremo de la cola - Ala izquierda - Ala derecha - Mandíbula - Oreja izquierda alternativa - Oreja derecha alternativa - Ojo izquierdo alternativo - Ojo derecho alternativo - Lengua - Ingle - Pata trasera izquierda - Pata trasera derecha - Línea [LINE], Columna [COLUMN] - [COUNT] resultados - Contenido del objeto - Script nuevo - Este residente tiene activado 'No molestar' y verá tu mensaje más tarde. - (Por el nombre) - (Residente) - (Objeto) - (Grupo) - (Externo) - No se ha aportado un contrato para este estado. - No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab. Por favor, contacta con ese propietario para informarte sobre la venta. - - - - Propiedad del grupo - Público - Configuración local - Configuración de la región - Esta región no es compatible con las opciones de entorno. - Sol - Luna - Florecimiento - Ruido de nubes - Vista Normal - Transparente - Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil - (se actualizará tras la publicación) - No has creado destacados ni clasificados. Pulsa el botón Más para crear uno. - No has creado destacados. Haz clic en el botón Más para crear uno. - No has creado clasificados. Haz clic en el botón Nuevo para crear un anuncio clasificado. - El usuario no tiene clasificados ni destacados - El usuario no tiene destacados - El usuario no tiene clasificados - Cargando... - Vista previa - Propiedades - Un objeto de nombre - propiedad del grupo - propiedad de un grupo desconocido - propiedad de - propiedad de un usuario desconocido - te ha dado - Rechazas [DESC] de <nolink>[NAME]</nolink>. - Total - comprado - pagado a ti - pagado en - pase comprado a - cuotas pagadas para el evento - precio pagado por el evento - Saldo - Créditos - Débitos - [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] - Artículos adquiridos - Cancelar - Subir [NAME] cuesta [AMOUNT] L$ - Comprar esto cuesta [AMOUNT] L$ - Extensión de archivo desconocida [.%s] -Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh - Ignorar - Guardarme este hito... - Editar este hito... - - - - - Ctrl+ - Alt+ - Mayús+ - Archivo guardado - Recibiendo - AM - PM - PST - PDT - Adelante - Izquierda - Derecha - Atrás - Norte - Sur - Oeste - Este - Arriba - Abajo - Cualquier categoría - Compras - Terreno en alquiler - Propiedad en alquiler - Atracción especial - Nuevos productos - Empleo - Se busca - Servicios - Personal - Ninguno - Localización Linden - Adulto - Arte y Cultura - Negocios - Educativo - Juegos de azar - Entretenimiento - Para recién llegados - Parques y Naturaleza - Residencial - Artes escénicas - Otra - Terreno en alquiler - Cualquiera - - Múltiples medias - Play/Pausa los media - http://www.intel.com/p/en_US/support/detect/graphics - http://www.nvidia.com/Download/index.aspx?lang=es - http://support.amd.com/us/Pages/AMDSupportHub.aspx - Ha habido un error analizando la línea de comando. -Por favor, consulta: http://wiki.secondlife.com/wiki/Client_parameters -Error: - [APP_NAME] Uso de línea de comando: - [APP_NAME] no puede acceder a un archivo que necesita. - -Puede ser porque estés ejecutando varias copias, o porque tu sistema crea -equivocadamente- que el archivo está abierto. -Si este mensaje persiste, reinicia tu ordenador y vuelve a intentarlo. -Si aun así sigue apareciendo el mensaje, debes desinstalar completamente [APP_NAME] y reinstalarlo. - Error fatal - [APP_NAME] requiere un procesador con AltiVec (G4 o posterior). - [APP_NAME] ya se está ejecutando. -Revisa tu barra de tareas para encontrar una copia minimizada del programa. -Si este mensaje persiste, reinicia tu ordenador. - En su anterior ejecución, [APP_NAME] se congeló o se cayó. -¿Quieres enviar un informe de caída? - Alerta - [APP_NAME] no encuentra DirectX 9.0b o superior. -[APP_NAME] usa DirectX para detectar el hardware o los drivers no actualizados que pueden provocar problemas de estabilidad, ejecución pobre y caídas. Aunque puedes ejecutar [APP_NAME] sin él, recomendamos encarecidamente hacerlo con DirectX 9.0b. - -¿Quieres continuar? - ¡Atención! - Las actualizaciones automáticas no están todavía implementadas para Linux. -Por favor, descarga la última versión desde www.secondlife.com. - Fallo en RegisterClass - Error - No puede ejecutarse a pantalla completa de [WIDTH] x [HEIGHT]. -Ejecutándose en una ventana. - Error Shutdown destruyendo la ventana (DestroyWindow() failed) - Error Shutdown - No se puede construir el 'GL device context' - No se puede encontrar un formato adecuado de píxel - No se puede conseguir la descripción del formato de píxel - Para ejecutarse, [APP_NAME] necesita True Color (32-bit). -Por favor, en las configuraciones de tu ordenador ajusta el modo de color a 32-bit. - [APP_NAME] no puede ejecutarse porque no puede obtener un canal alpha de 8 bit. Generalmente, se debe a alguna cuestión de los drivers de la tarjeta de vídeo. -Por favor, comprueba que tienes instalados los últimos drivers para tu tarjeta de vídeo. -Comprueba también que tu monitor esta configurado para True Color (32-bit) en Panel de Control > Apariencia y temas > Pantalla. -Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. - No se puede configurar el formato de píxel - No se puede crear el 'GL rendering context' - No se puede activar el 'GL rendering context' - [APP_NAME] no puede ejecutarse porque los drivers de tu tarjeta de vídeo o no están bien instalados, o no están actualizados, o son para hardware no admitido. Por favor, comprueba que tienes los drivers más actuales para tu tarjeta de vídeo, y, aunque los tengas, intenta reinstalarlos. - -Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. - Barba del día - Blanco del todo - Ojos de cómic - Arqueadas - Brazos: longitud - Cortos - Lóbulos - Nuca: largo - Marcadas - Bangs - Ojos pequeños - Barriga: tamaño - Grande - Culo grande - Pelo: moño - Pelo: tupé - Pelo: melena alta - Cabeza grande - Grandes pectorales - Crestas grandes - Negro - Rubio - Pelo rubio - Colorete - Color del colorete - Opacidad del colorete - Definición del cuerpo - Cuerpo: gordura - Pecas del cuerpo - Cuerpo grueso - Cuerpo: grosor - Cuerpo delgado - Abiertas - Busto: firmeza - Busto: canalillo - Busto: tamaño - Puente: ancho - Aumentar - Arco ciliar - Bug Eyes - Ojos saltones - Bulbosa - Nariz de porra - Masa del busto - Suavizado del busto - Gravedad del busto - Aerodinámica del busto - Efecto máx. - Elasticidad - Ganancia - Amortiguación - Efecto máx. - Elasticidad - Ganancia - Amortiguación - Efecto máx. - Elasticidad - Ganancia - Amortiguación - Masa de la barriga - Suavizado de la barriga - Gravedad de la barriga - Aerodinámica de la barriga - Efecto máx. - Elasticidad - Ganancia - Amortiguación - Masa del culo - Suavizado del culo - Gravedad del culo - Aerodinámica del culo - Efecto máx. - Elasticidad - Ganancia - Amortiguación - Efecto máx. - Elasticidad - Ganancia - Amortiguación - Cejijuntas - Pelo tupido - Culo: tamaño - Gravedad del culo - Polisón - Sin polisón - Con polisón - Cortito - Pómulos - Tórax: tamaño - Barbilla: ángulo - Barbilla: contorno - Barba en collar - Barbilla: largo - Hacia la barbilla - Barbilla retraída - Barbilla prominente - Papada - Transparente - Remarcar - Ojos juntos - Cerrar - Trasera cerrada - Frontal cerrado - Cerrada - Cerrada - Poco abultada - Espalda - Escote - Hacia abajo - Hacia arriba - Caídos - Nariz torcida - Acampanado - Oscuridad - Verde oscuro - Más oscuros - Remarcar - Tacones por defecto - Densas - Mucha papada - Poco - Muy abultada - Orejas: ángulo - Orejas: tamaño - Orejas: forma - Cabeza: ahuevada - Ojos: bolsas - Ojos: color - Ojos: profundidad - Ojos: brillo - Ojos: apertura - Ojos: simetría - Ojos: tamaño - Ojos: separación - Cejas: arco - Cejas: densidad - Cejas: altura - Cejas: en V - Cejas: tamaño - Pestañas: longitud - Contorno de ojos - Contorno de ojos: color - Eyes Bugged - Cara: simetría - Rasgos marcados - Ojos separados - Prominentes - Mujer - Sin dedos - Con dedos - Campana - Redondeadas - Culo plano - Cabeza plana - Empeine bajo - Pie: tamaño - Frente: ángulo - Hacia la frente - Pecas - Flequillo - Sin cortar - Contorno completo - Sin cortar - Pelo: volumen a los lados - Volumen total - Con brillo - Guantes: dedos - Guantes: largo - Pelo - Pelo: nuca - Pelo: delante - Pelo: lados - Peinado: dirección - Pelo: espesor - Pelo: espesor - Pelo: inclinación - A la izq. - A la der. - Pelo: volumen - Manos: tamaño - Muy largo - Cabeza: longitud - Cabeza: forma - Cabeza: tamaño - Cabeza: estiramiento - Tacón: altura - Tacón: forma - Altura - Subir - Tacones altos - Mandíbula alta - Suela gorda - Pegada - Arrriba - Cadera: altura - Cadera: ancho - Pasa el cursor - Pegadas - Línea de ojos: color - Línea de ojos: opacidad - Ojos: lagrimal - Inner Eye Shadow - Línea de ojos - Chaqueta: largo - Chaqueta: arrugas - Mandíbula: ángulo - Maxilar inferior - Mandíbula: forma - Más junto - Mofletes - Rodillas: ángulo - Zambas - Aumentar - Manos grandes - Raya: izq. - Piernas: longitud - Piernas: musculatura - Menos - Menos gordura - Menos tupida - Menos pecas - Menos grosor - Más levantado - Menos michelines - Pocos músculos - Poca musculatura - Menos sonrosada - Menos redondeada - Menos cartucheras - Menos cuadrada - Menos volumen - Pequeña - Más luminosos - Labio: hoyuelo - Hoyuelo marcado - Labios: grosor - Labios sonrosados - Labios: ratio - Labios: prominencia - Labios: ancho - Brillo de labios - Barra de labios - Barra de labios: color - Más - Cabeza alargada - Cadera larga - Piernas largas - Cuello largo - Coletas largas - Cola de caballo larga - Torso largo - Brazos largos - Pantalón suelto - Camiseta suelta - Puños anchos - Michelines - Bajar - Tacones bajos - Mandíbula baja - Suela fina - Suelta - Abajo - Puente: abajo - Mejillas: abajo - Varón - Raya: en medio - Más - Más colorete - Más gordura - Más tupida - Más - Más pecas - Más grosor - Menos levantado - Más barra de labios - Más michelines - Más el inferior - Más músculos - Más musculatura - Más sonrosada - Más redondeada - Más cartucheras - Más inclinada - Más cuadrada - Más el superior - Más recta - Más volumen - Grande - Bigote - Comisuras - Boca: posición - Rapado - Muscular - Patillas largas - Uñas pintadas - Uñas pintadas: color - Disminuir - Rapada - Entradas - Labios estrechos - Natural - Cuello: longitud - Cuello: grosor - Sin colorete - Sin contorno - Menos - Sin brillo - Sin barra de labios - Sin raya - Sin pintar - Nada - Sin crestas - Sin blanco - Sin arrugas - Normal Lower - Normal Upper - Nariz a la izq. - Nariz a la der. - Nariz: tamaño - Nariz: grosor - Nariz: respingona - Nariz: punta - Nariz: ancho - Ventana: altura - Ventana: ancho - Opaco - Abrir - Apertura trasera - Apertura frontal - Abierta - Abierta - Anaranjado - De soplillo - Sombra de ojos: color - Sombra de ojos: opacidad - Ojos: comisura - Outer Eye Shadow - Sombra de ojos - Retraído - Pubis - Pintadas - Pálida - Pantalón: cruz - Ceñido - Pernera: largo - Caja - Pantalón: arrugas - Raya - Flequillo partido - Pectorales - Tono - Coletas - Rosa - Más sonrosados - Suela: altura - Suela: ancho - En punta - De aguja - Cola de caballo - Con vuelo - Izquierdo más grande - Derecho más grande - Hinchadas - Ojeras - Irisación - Pelirrojo - Regular - Raya: der. - Tez sonrosada - Redondear - Rubicundez - Rojiza - Pelo encrespado - Cartucheras - Piernas flacas - Más ancho - Sin marcar - Nuca: corte - Shear Face - Shear Front - Arriba - izq. - Arriba - der. - Rapada - Rapada - A la izq. - Boca: ladeada - A la der. - Alto de cintura - Ceñido - Camisa: arrugas - Caña: altura - Menos - Brazos cortos - Piernas cortas - Cuello corto - Coletas cortas - Cola de caballo corta - Patillas cortas - Torso corto - Cadera corta - Hombros - Lados: franja - Patillas - Pelo: lados - Bajar lados del pelo - Subir lados del pelo - Cuello estrecho - Falda: vuelo - Falda: largo - Slanted Forehead - Largo de manga - Ancho de puños - Raja trasera - Raja frontal - Raja a la izq. - Raja a la der. - Disminuir - Manos pequeñas - Cabeza pequeña - Leves - Pelo liso - Calcetines: largo - Perilla - Depiladas - Crestas - Cuadrada - Punta cuadrada - Cabeza aplastada - Cabeza estirada - Chupadas - Estrecho de pecho - Ojos hundidos - Sweep Back - Sweep Forward - Más - Cubierta trasera - Cubierta frontal - Tacones grandes - Cuello ancho - Empeine alto - Delgadas - Cejas finas - Hacia dentro - Nariz fina - Poca papada - Sin campana - Pantalón ceñido - Camisa ceñida - Falda ceñida - Puños ceñidos - Punta: forma - Empeine - Torso: longitud - Torso: musculatura - Torso flacucho - Largos - Abiertos - Prognatismo - No natural - Puente: arriba - Mejillas: arriba - Barbilla: prominencia - Párpados - Mucho - Del todo - Cintura - Mofletes - Pelo blanco - Aumentar - Completa - Completa - Labios anchos - Total - Arrugas - Añadir a mis hitos - Editar mis hitos - Ver más información de esta localización - Historial de mis localizaciones - Comprar este terreno - Región Adulta - Región Moderada - Región General - Los avatares que están en esta parcela no pueden ser vistos ni escuchados por los que están fuera de ella - Los objetos que se mueven pueden presentar un comportamiento incorrecto en la región hasta que ésta se recargue. - Esta región no tiene activado el pathfinding dinámico. - Actualizar [APP_NAME] - Actualizando [APP_NAME]... - Instalando [APP_NAME]... - Tu visor [APP_NAME] se está actualizando a la última versión. Llevará algún tiempo, paciencia. - Descargando la actualización... - Descargando la actualización - Fallo en la descarga de la actualización - Ha habido un error actualizando [APP_NAME]. Por favor, descarga la última versión desde www.secondlife.com. - Fallo al instalar la actualización - Fallo al iniciar el visor - [APP_NAME]: Los ítems se reciben muy rápido de [FROM_NAME]; desactivada la vista previa automática durante [TIME] sgs. - [APP_NAME]: Los ítems se reciben muy rápido; desactivada la vista previa automática durante [TIME] sgs. - -- Activado el registro de los mensajes instantáneos -- - [NAME] está escribiendo... - (sin nombre) - (Moderado: por defecto, desactivada la voz) - Para esta llamada no está disponible el chat de texto. - Un moderador del grupo ha desactivado tu chat de texto. - Pulsa aquí para enviar un mensaje instantáneo. - A - (Moderador) - (Guardado [LONG_TIMESTAMP]) - Conectado/a - Desconectado/a - El usuario no está conectado: el mensaje se almacenará para entregárselo más tarde. - El usuario no está conectado: el inventario se ha guardado. - Han respondido a tu llamada - Has iniciado una llamada de voz - Has entrado en la llamada de voz - Rechazaste la llamada de voz automáticamente porque estaba activado 'No molestar'. - [NAME] inició una llamada de voz - Haciendo la llamada de voz... - Conectado, pulsa Colgar para salir - Se colgó la llamada de voz - Chat multi-persona - Conferencia con [AGENT_NAME] - Ítem del inventario '[ITEM_NAME]' ofrecido - Carpeta del inventario '[ITEM_NAME]' ofrecida - -Estás conversando con un bot, [NAME]. No compartas información personal. -Más información en https://second.life/scripted-agents. +pueden adjuntarse a las notas. - Arrastra los ítems desde el invenbtario hasta aquí - Has publicado en Facebook. - Has publicado en Flickr. - Has publicado en Twitter. - (La sesión de MI no existe) - Usted es el único usuario en esta sesión. - [NAME] está desconectado. - Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz. - Has ignorado a este residente. Enviándole un mensaje, automáticamente dejarás de ignorarle. - Error en lo solicitado, por favor, inténtalo más tarde. - Error al hacer lo solicitado; por favor, inténtelo más tarde. - Usted no tiene permisos suficientes. - La sesión ya acabó - Usted no tiene esa capacidad. - Usted no tiene esa capacidad. - Usted no es un moderador de la sesión. - Un moderador del grupo ha desactivado tu chat de texto. - Un moderador del grupo le ha desactivado el chat de texto. - No se ha podido añadir usuarios a la sesión de chat con [RECIPIENT]. - No se ha podido enviar tu mensaje a la sesión de chat con [RECIPIENT]. - No se ha podido enviar su mensaje a la sesión de chat con [RECIPIENT]. - Error moderando. - Se te ha sacado del grupo. - Ha sido eliminado del grupo. - Usted ya no tendrá más la capacidad de estar en la sesión de chat. - [SOURCES] ha dicho algo nuevo - [SOURCES] ha dicho algo nuevo - Se ha agotado el tiempo del inicio de sesión - Posición inicial establecida. - https://secondlife.com/destination/voice-island - https://secondlife.com/destination/voice-morphing-premium - [NAME] te ha pagado [AMOUNT] L$ [REASON]. - [NAME] te ha pagado [AMOUNT] L$: [REASON] - [NAME] te ha pagado [AMOUNT] L$. - Has pagado [AMOUNT] L$ a [NAME] por [REASON]. - Has pagado [AMOUNT] L$ a [NAME]: [REASON] - Has pagado[AMOUNT] L$ - Has pagado [AMOUNT] L$ a [NAME]. - Has pagado [AMOUNT] L$ por [REASON]. - No has pagado a [NAME] [AMOUNT] L$ [REASON]. - No has pagado a [NAME] [AMOUNT] L$: [REASON] - No has pagado [AMOUNT] L$. - No has pagado a [NAME] [AMOUNT] L$. - No has pagado [AMOUNT] L$ [REASON]. - para [ITEM] - para una parcela de terreno - para un pase de acceso a terrenos - for deeding land - para crear un grupo - para entrar a un grupo - to upload - para publicar un anuncio clasificado - Dando [AMOUNT] L$ - Subir esto cuesta [AMOUNT] L$ - Esto cuesta [AMOUNT] L$ - Compra del terreno seleccionado por [AMOUNT] L$ - Este objeto cuesta [AMOUNT] L$ - Todos - Oficiales - Propietarios - Conectado/a - Subiendo... - -Denuncia de infracción - Anatomía nueva - Piel nueva - Pelo nuevo - Ojos nuevos - Camisa nueva - Pantalón nuevo - Zapatos nuevos - Calcetines nuevos - Chaqueta nueva - Guantes nuevos - Camiseta nueva - Ropa interior nueva - Falda nueva - Nueva Alfa - Tatuaje nuevo - Nuevo Universal - Nueva física - No se puede poner - Gesto nuevo - Script nuevo - Nota nueva - Carpeta nueva - Contenidos - Gestos - Gestos de hombre - Gestos de mujer - Otros gestos - Gestos al hablar - Gestos corrientes - Varón - Disculpa - Varón – Déjame en paz - Varón - Lanzar un beso - Varón - Abucheo - Varón - Aburrido - Varón – ¡Eh! - Varón - Risa - Varón - Rechazo - Varón - Encogimiento de hombros - Hombre - Sacando la lengua - Varón - Admiración - Mujer - Risa suave - Mujer - Llorar - Mujer - Ruborizada - Mujer - Disculpa - Mujer – Déjame en paz - Mujer - Lanzar un beso - Mujer - Abucheo - Mujer - Aburrida - Mujer - ¡Eh! - Mujer - ¡Eh, encanto! - Mujer - Risa - Mujer - Buen aspecto - Mujer - Por aquí - Mujer - Por favor - Mujer - Rechazo - Mujer - Encogimiento de hombros - Mujer - Sacando la lengua - Mujer - Admiración - Nuevo Ciclo del día - Nueva Agua - Nuevo Cielo - /reverencia - /aplaudir - /contar - /apagar - /bmc - /músculo - /no - /¡no! - /papel - /señalarme - /señalarte - /piedra - /tijera - /fumar - /estirar - /silbar - /sí - /¡sí! - ausente - baile1 - baile2 - baile3 - baile4 - baile5 - baile6 - baile7 - baile8 - [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt] - ninguno/ninguno - No se puede subir imágenes mayores de [WIDTH]*[HEIGHT] - La foto del vestuario puede tener como máx. un tamaño de [WIDTH]*[HEIGHT]. Cambia el tamaño o utiliza otra imagen - La foto del vestuario puede tener como máx. un tamaño de [WIDTH]*[HEIGHT]. Selecciona otra textura - No se pueden verificar las dimensiones de la foto. Espera hasta que aparezca el tamaño de la foto en el selector - - Parece que hay algún problema que ha escapado a nuestros controles. - -Visita http://status.secondlifegrid.net para ver si hay alguna incidencia conocida que esté afectando al servicio. - Si sigues teniendo problemas, comprueba la configuración de la red y del servidor de seguridad. - Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado - Dom:Lun:Mar:Mié:Jue:Vie:Sáb - Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre - Ene:Feb:Mar:Abr:May:Jun:Jul:Ago:Sep:Oct:Nov:Dic - [MDAY] - AM - PM - [AMOUNT] US$ - Expulsión de grupo - Membresía - Roles - Indentidad de grupo - Gestión de la parcela - Identidad de la parcela - Configuración de la parcela - Poder de la parcela - Acceso a la parcela - Contenido de la parcela - Manejo de objetos - Contabilidad - Avisos - Chat - ¿Deseas eliminar los elementos seleccionados? - ¿Deseas eliminar el elemento seleccionado? - No hay elementos en este vestuario - Selecciona un editor mediante la configuración de ExternalEditor. - No se encuentra el editor externo especificado. -Inténtalo incluyendo la ruta de acceso al editor entre comillas -(por ejemplo, "/ruta a mi/editor" "%s"). - Error al analizar el comando de editor externo. - Error al ejecutar el editor externo. - Error al traducir: [REASON] - Error al analizar la respuesta de la traducción. - Esc - Space - Enter - Tab - Ins - Del - Backsp - Shift - Ctrl - Alt - CapsLock - Base - End - PgUp - PgDn - F1 - F2 - F3 - F4 - F5 - F6 - F7 - F8 - F9 - F10 - F11 - F12 - Añadir - Restar - Multiplicar - Dividir - PAD_DIVIDE - PAD_LEFT - PAD_RIGHT - PAD_DOWN - PAD_UP - PAD_HOME - PAD_END - PAD_PGUP - PAD_PGDN - PAD_CENTER - PAD_INS - PAD_DEL - PAD_Enter - PAD_BUTTON0 - PAD_BUTTON1 - PAD_BUTTON2 - PAD_BUTTON3 - PAD_BUTTON4 - PAD_BUTTON5 - PAD_BUTTON6 - PAD_BUTTON7 - PAD_BUTTON8 - PAD_BUTTON9 - PAD_BUTTON10 - PAD_BUTTON11 - PAD_BUTTON12 - PAD_BUTTON13 - PAD_BUTTON14 - PAD_BUTTON15 - - - = - ` - ; - [ - ] - \ - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - A - B - C - D - E - F - G - H - I - J - K - L - M - N - O - P - Q - R - S - T - U - V - W - X - Y - Z - Viendo balizas de partículas (azules) - Viendo balizas de objetos materiales (verdes) - Viendo balizas de objetos con script (rojas) - Viendo el objeto con script con balizas de función táctil (rojas) - Viendo balizas de sonido (amarillas) - Viendo balizas de medios (blancas) - Visualización de la baliza de dirección del sol (naranja) - Visualización de la baliza de dirección de la luna (violeta) - Ocultando las partículas - Acerca del terreno - Apariencia - Avatar - Construir - Chat - Conversaciones - Brújula - Destinos - Mis entornos - Facebook - Flickr - Gestos - Estado del Grid - Cómo - Inventario - Mapa - Mercado - Mercado - Minimapa - Caminar / Correr / Volar - Buzón de salida de comerciante - Gente - Destacados - Lugares - Preferencias - Perfil - Denunciar una infracción - Buscar - Foto - Hablar - Twitter - Controles de la cámara - Configuración de voz - Información sobre el terreno que vas a visitar - Cambiar tu avatar - Elegir un avatar completo - Construir objetos y modificar la forma del terreno - Habla por chat de texto con las personas próximas - Conversar con todos - Brújula - Destinos de interés - Mis entornos - Publicar en Facebook - Subir a Flickr - Gestos para tu avatar - Mostrar el estado actual del Grid - Cómo hacer las tareas habituales - Ver y usar tus pertenencias - Mapa del mundo - Ir de compras - Vende tu creación - Mostrar la gente que está cerca - Desplazando el avatar - Transfiere objetos a tu mercado para venderlos - Amigos, grupos y personas próximas - Lugares que se mostrarán como favoritos en tu perfil - Lugares que has guardado - Preferencias - Consulta o edita tu perfil - Denunciar una infracción - Buscar lugares, eventos y personas - Tomar una fotografía - Utiliza el micrófono para hablar con las personas próximas - Twitter - Cambiando el ángulo de la cámara - Controles de volumen para las llamadas y la gente que se encuentre cerca de ti en el mundo virtual - actualmente en tu barra de herramientas inferior - actualmente en tu barra de herramientas izquierda - actualmente en tu barra de herramientas derecha - % retención - Detalle - Mejor detalle - Superficie - Sólido - Envoltura - Vista previa - Normal - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - Ninguno - Afecta al navmesh - Personaje - (Múltiple) - Muy bajo - Bajo - Medio - Alto - Muy alto - El Residente no puede visitar esta región. - [Usuario] - Experiencia - (sin experiencia) - (experiencia sin título) - Activa en el terreno - Activa en el Grid - PERMITIDO - BLOQUEADO - COLABORADOR - ADMIN. - RECIENTE - PROPIEDAD - ([EXPERIENCES], máx. [MAXEXPERIENCES]) - hacerte con tus controles - activar animaciones en tu avatar - anexar a tu avatar - seguimiento de la cámara - controlar tu cámara - teleportarte - aceptar automáticamente permisos de experiencias - forzar que el avatar se siente - cambiar tu configuración del entorno - realizar una operación desconocida: [Permission] - Ponerte al mando - Activar animaciones - Anexar - Seguir la cámara - Controlar la cámara - Teleporte - Otorgar permisos - Sentarte - Entorno - No se están registrando las conversaciones. Para empezar a grabar un registro, elige "Guardar: Solo registro" o "Guardar: Registro y transcripciones" en Preferencias > Chat. - No se registrarán más conversaciones. Para reanudar la grabación de un registro, elige "Guardar: Solo registro" o "Guardar: Registro y transcripciones" en Preferencias > Chat. - No hay conversaciones grabadas. Después de contactar con una persona, o de que alguien contacte contigo, aquí se mostrará una entrada de registro. - Cargando... - n/c - -Lista vacía- - Predeterminado - (ninguno) - Sin límite - La forma física contiene triángulos demasiado pequeños. Intenta simplificar el modelo físico. - La forma física contiene datos de confirmación erróneos. Intenta corregir el modelo físico. - La versión de la forma física no es correcta. Configura la versión correcta del modelo físico. - Error de DNS al resolver el nombre del host([HOSTNAME]). -Por favor verifica si puedes conectarte al sitio web www.secondlife.com. -Si puedes conectarte, pero aún recibes este error, por favor accede a -la sección Soporte y genera un informe del problema. - El servidor de inicio de sesión no pudo verificarse vía SSL. + + Buscando... + + + No se ha encontrado. + + + Reintentando... + + + Notas de la versión + + + https://releasenotes.secondlife.com/viewer/ + + + Cargando... + + + (nadie) + + + (esperando) + + + (ninguno) + + + No hay ningún error + + + Petición de asset: fallida + + + Petición de asset: el archivo no existe + + + Petición de asset: no se encontró el asset en la base de datos + + + Fin del archivo + + + No puede abrirse el archivo + + + No se ha encontrado el archivo + + + Tiempo de transferencia del archivo + + + Circuito desconectado + + + No concuerda el precio en el visor y en el servidor + + + Estado desconocido + + + El servicio no está disponible. + + + Se detectaron errores inesperados en el servidor. + + + El servicio no está disponible o se alcanzó el tiempo de carga máxima. + + + Error en la solicitud de carga. Por favor, ingresa a +http://secondlife.com/support para obtener ayuda sobre cómo solucionar este problema. + + + Error en la validación para importar los parámetros [NAME] + + + No se pudo abrir el archivo [FILE] + + + No se pudo abrir el archivo [FILE] + + + No se pudo traducir el Viento de luz legado [NAME] + + + la textura + + + el sonido + + + la tarjeta de visita + + + el hito + + + el script antiguo + + + esa ropa + + + el objeto + + + la nota + + + la carpeta + + + la ruta + + + ese script de LSL2 + + + el código intermedio de LSL + + + esa textura tga + + + esa parte del cuerpo + + + la foto + + + Objetos Perdidos + + + esa imagen targa + + + la Papelera + + + esa imagen jpeg + + + la animación + + + el gesto + + + simstate + + + ese favorito + + + el enlace + + + enlace de la carpeta + + + opciones + + + red + + + (Edición de Apariencia) + + + Ausente + + + No molestar + + + Ignorado + + + Susto + + + Enfado + + + Ausente + + + Salto mortal atrás + + + Carcajada + + + Gran sonrisa + + + Mandar un beso + + + Aburrimiento + + + Reverencia + + + Aplauso + + + Reverencia floreada + + + Llanto + + + Baile 1 + + + Baile 2 + + + Baile 3 + + + Baile 4 + + + Baile 5 + + + Baile 6 + + + Baile 7 + + + Baile 8 + + + Desdén + + + Beber + + + Azorarse + + + Negar con el dedo + + + Éxito con el puño + + + Yoga flotando + + + Fruncir el ceño + + + Impaciente + + + Salto de alegría + + + Bésame el culo + + + Besar + + + Reír + + + Sacar músculo + + + No (con enfado) + + + No + + + Ña-Ña-Ña + + + Puñetazo uno-dos + + + Abrir la boca + + + 'V' con los dedos + + + Señalar a otro/a + + + Señalarse + + + Puñetazo izquierdo + + + Puñetazo derecho + + + PPT cuenta + + + PPT papel + + + PPT piedra + + + PPT tijera + + + Repulsa + + + Patada circular + + + Triste + + + Saludo militar + + + Gritar + + + Encogerse de hombros + + + Sonreír + + + Fumar: en la mano + + + Fumar + + + Fumar: tirar el cigarro + + + Sorpresa + + + Estocadas + + + Berrinche + + + Sacar la lengua + + + Agitar la mano + + + Cuchichear + + + Pitar + + + Guiño + + + Guiño (Hollywood) + + + Preocuparse + + + Sí (contento) + + + Sí + + + Usar textura + + + Pasa el cursor del ratón sobre la regla + + + para ajustar a la cuadrícula + + + Cargando... + + + Sin conexión + + + [PRICE] L$ por [AREA] m² + + + No se ha encontrado. + + + OK + + + Fin prematuro del archivo + + + No se puede encontrar ROOT o JOINT. + + + Chat + + + (Chat) + + + susurra: + + + grita: + + + Conectando al chat de voz... + + + Conectado + + + La voz no está disponible en su localización actual + + + Desconectado del chat de voz + + + Vas a ser reconectado al chat de voz con los cercanos + + + '[OBJECTNAME]', un objeto propiedad de '[OWNERNAME]', localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS]. + + + A '[OBJECTNAME]', un objeto propiedad de '[OWNERNAME]', localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS]. + + + Si autorizas el acceso a tu cuenta, también permitirás al objeto: + + + Cogerle a usted dólares Linden (L$) + + + Actuar en sus controles de entrada + + + Reconfigurar sus controles de entrada + + + Ejecutar animaciones en su avatar + + + Anexarse a su avatar + + + Anular la propiedad y que pase a ser público + + + Enlazar y desenlazar de otros objetos + + + Añadir y quitar uniones con otros objetos + + + Cambiar sus permisos + + + Seguir su cámara + + + Controlar su cámara + + + Teleportarte + + + Forzar que el avatar se siente + + + Cambiar tu configuración del entorno + + + (Tú) + + + + Suprimir alertas al gestionar las listas de acceso a un estado + + + Reemplazar tus animaciones predeterminadas + + + Devolver objetos en tu nombre + + + (desconocido) + + + General + + + Moderado + + + Adulto + + + Desconectado + + + Desconocido + + + (desconocido) + + + Estado /Región completa + + + Estado / Homestead + + + Continente / Homestead + + + Continente / Región completa + + + Todos los archivos + + + Sonidos + + + Animaciones + + + Imágenes + + + Guardar + + + Cargar + + + Imágenes Targa + + + Imágenes de mapa de bits + + + Imágenes PNG + + + Imágenes Targa o PNG + + + Archivo de película AVI + + + Archivo de anim. XAF + + + Archivo XML + + + Archivo RAW + + + Imágenes comprimidas + + + Cargar archivos + + + Elegir directorio + + + Scripts + + + Diccionarios + + + Forma + + + Piel + + + Pelo + + + Ojos + + + Camisa + + + Pantalón + + + Zapatos + + + Calcetines + + + Chaqueta + + + Guantes + + + Camiseta + + + Ropa interior + + + Falda + + + Alfa + + + Tatuaje + + + Universal + + + Física + + + inválido/a + + + ninguno + + + Camisa no puesta + + + Pantalones no puestos + + + Zapatos no puestos + + + Calcetines no puestos + + + Chaqueta no puesta + + + Guantes no puestos + + + Camiseta no puesta + + + Ropa interior no puesta + + + Falda no puesta + + + Alfa no puesta + + + Tatuaje no puesto + + + Universal no puesto + + + Física no puesta + + + no válido/a + + + Crear una anatomía nueva + + + Crear una piel nueva + + + Crear pelo nuevo + + + Crear ojos nuevos + + + Crear una camisa nueva + + + Crear unos pantalones nuevos + + + Crear unos zapatos nuevos + + + Crear unos calcetines nuevos + + + Crear una chaqueta nueva + + + Crear unos guantes nuevos + + + Crear una camiseta nueva + + + Crear ropa interior nueva + + + Crear una falda nueva + + + Crear una capa alfa nueva + + + Crear un tatuaje nuevo + + + Crear unos guantes nuevos + + + Crear nueva física + + + no válido/a + + + Nuevo [WEARABLE_ITEM] + + + Siguiente + + + OK + + + Aviso de grupo + + + Avisos del grupo + + + Enviado por + + + Adjunto: + + + Ver los avisos pasados u optar por dejar de recibir aquí estos mensajes. + + + Abrir el adjunto + + + Guardar el adjunto + + + Ofrecimiento de teleporte + + + Llegaron avisos nuevos mientras estabas ausente... + + + Tienes [%d] aviso/s más + + + Brazo der. + + + Cabeza + + + Brazo izq. + + + Pierna izq. + + + Torso + + + Pierna der. + + + Esqueleto mejorado + + + Bajo + + + Medio + + + Alto + + + Pulsa ESC para salir de la vista subjetiva + + + ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/all/[SEARCH_TERM] Buscar]. + + + ¿No encuentras lo que buscas? Intenta [secondlife:///app/inventory/filters Show filters]. + + + ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/places/[SEARCH_TERM] Buscar]. + + + Arrastra aquí un hito para tenerlo en tus favoritos. + + + No se han encontrado artículos. Comprueba si has escrito correctamente la cadena de búsqueda y vuelve a intentarlo. + + + No tienes en tu inventario una copia de esta textura + + + Aquí aparecerán algunos de los objetos que recibas, como los regalos Premium. Después puedes arrastrarlos a tu inventario. + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ + + + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more + + + Abrir la ventana con las opciones del Juego + + + Realizar gesto seleccionado en el mundo. + + + Abrir la ventana con las opciones del Juego + + + Cualquier usuario puede vender objetos en el mercado. + + + + Para hacerte comerciante debes [[MARKETPLACE_CREATE_STORE_URL] crear una tienda del Mercado]. + + + El buzón de salida está vacío. + + + + Arrastra carpetas a esta sección y pulsa en "Enviar al Mercado" para incluirlas en la lista de venta del [[MARKETPLACE_DASHBOARD_URL] Mercado]. + + + Inicializando el Mercado. + + + Estamos accediendo a tu cuenta de la [[MARKETPLACE_CREATE_STORE_URL] tienda del Mercado]. + + + Errores del Mercado. + + + La [[MARKETPLACE_CREATE_STORE_URL] tienda del Mercado] devuelve errores. + + + Se ha producido un error al abrir Artículos del Mercado. +Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia de Second Life en http://support.secondlife.com + + + Tu carpeta Artículos del mercado está vacía. + + + Arrastra carpetas a esta sección para incluirlas en la lista de venta del [[MARKETPLACE_DASHBOARD_URL] Mercado]. + + + ( [ITEMS_COUNT] Objetos) + + + La carpeta de stock debe estar contenida en una carpeta de versión + + + : Error: todos los artículos de una carpeta de stock deben ser del mismo tipo y que no se puedan copiar + + + : Error: la carpeta de stock no puede contener subcarpetas + + + : Atención: la carpeta no contiene ningún artículo + + + : Atención: creando carpeta de stock + + + : Atención: creando la carpeta de versión + + + : Atención: moviendo artículos + + + : Atención: se ha transferido el contenido de la carpeta a la carpeta de stock, y se eliminará la carpeta vacía + + + : Error: los artículos que no se pueden copiar deben estar contenidos en una carpeta de stock + + + : Atención: los artículos deben estar contenidos en una carpeta de versión + + + : Error: + + + : Atención: + + + : Atención: la carpeta de versión debe contener al menos un artículo + + + : Atención: la carpeta de stock debe contener al menos un artículo + + + No se han producido errores ni advertencias + + + Sin errores + + + Error: + + + Para poder enviar objetos al mercado, debes registrarte como comerciante (es gratis). + + + No se puede mover el artículo a esa carpeta. + + + Este artículo no se puede vender en el Mercado. + + + no Mkt ID + + + en la lista + + + activa + + + máx. + + + stock + + + existencias agotadas + + + actualizando... + + + Las cuotas se basan en tu nivel de suscripcion. Niveles más altos tienen cuotas más bajas visita [https://secondlife.com/my/account/membership.php? para saber más] + + + Abrir puntos destacados + + + Sin Restricciones + + + + + + + + + Cargando el contenido... + + + No hay contenido + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mi Inventario + + + Biblioteca + + + Texturas + + + Sonidos + + + Tarjetas de visita + + + Hitos + + + Scripts + + + Ropa + + + Objetos + + + Notas + + + Carpeta nueva + + + Inventario + + + Imágenes sin comprimir + + + Partes del cuerpo + + + Papelera + + + Álbum de fotos + + + Objetos Perdidos + + + Sonidos sin comprimir + + + Animaciones + + + Gestos + + + Mis Favoritos + + + Mis Favoritos + + + Mis Favoritos + + + Mis Favoritos + + + Vestuario actual + + + Vestuario inicial + + + Mis vestuarios + + + Accesorios + + + Redes + + + Objetos recibidos + + + Buzón de salida de comerciante + + + Amigos + + + Todas + + + No tienes puestos anexos + + + Anexos (quedan [COUNT] ranuras) + + + Comprar + + + Comprar por L$ + + + Piedra + + + Metal + + + Cristal + + + Madera + + + Carne + + + Plástico + + + Goma + + + Claridad + + + Mayúsculas + + + Ctrl + + + Tórax + + + Cráneo + + + Hombro izquierdo + + + Hombro derecho + + + Mano izq. + + + Mano der. + + + Pie izq. + + + Pie der. + + + Columna + + + Pelvis + + + Boca + + + Barbilla + + + Oreja izq. + + + Oreja der. + + + Ojo izq. + + + Ojo der. + + + Nariz + + + Brazo der. + + + Antebrazo der. + + + Brazo izq. + + + Antebrazo izq. + + + Cadera der. + + + Muslo der. + + + Pantorrilla der. + + + Cadera izq. + + + Muslo izq. + + + Pantorrilla izq. + + + Abdomen + + + Pecho izquierdo + + + Pecho derecho + + + Cuello + + + Centro del avatar + + + Dedo anular izquierdo + + + Dedo anular derecho + + + Base de la cola + + + Extremo de la cola + + + Ala izquierda + + + Ala derecha + + + Mandíbula + + + Oreja izquierda alternativa + + + Oreja derecha alternativa + + + Ojo izquierdo alternativo + + + Ojo derecho alternativo + + + Lengua + + + Ingle + + + Pata trasera izquierda + + + Pata trasera derecha + + + Punto de colocación no válido + + + Error: falta un artículo + + + Error: falta el artículo de base + + + Error: el objeto se encuentra en el vestuario actual, pero no está anexado + + + [AGEYEARS] [AGEMONTHS] de edad + + + [AGEYEARS] de edad + + + [AGEMONTHS] de edad + + + [AGEWEEKS] de edad + + + [AGEDAYS] de edad + + + Registrado hoy + + + Ahora todos pueden verte. + + + Es posible que no todos los que están próximos puedan renderizarte. + + + Es posible que más de la mitad de los que están próximos no puedan renderizarte. + + + Es posible que la mayoría de los que están próximos no puedan renderizarte. + + + Es posible que ninguno de los que están próximos pueda renderizarte. + + + Tu HUD + + + [OBJ_NAME] (lo llevas en [JNT_NAME]) + + + [HUD_DETAILS] usa mucha memoria de textura + + + [HUD_DETAILS] contiene muchas texturas y objetos complicados + + + [HUD_DETAILS] contiene muchas texturas grandes + + + [HUD_DETAILS] contiene demasiados objetos + + + [HUD_DETAILS] contiene demasiadas texturas + + + [COUNT] año + + + [COUNT] años + + + [COUNT] años + + + [COUNT] mes + + + [COUNT] meses + + + [COUNT] meses + + + [COUNT] semana + + + [COUNT] semanas + + + [COUNT] semanas + + + [COUNT] día + + + [COUNT] días + + + [COUNT] días + + + [COUNT] miembro + + + [COUNT] miembros + + + [COUNT] miembros + + + Residente + + + Prueba + + + Miembro fundador + + + Empleado de Linden Lab + + + Ha usado información sobre la forma de pago + + + Hay información archivada sobre la forma de pago + + + No hay información archivada sobre la forma de pago + + + Edad verificada + + + Edad no verificada + + + Centro 2 + + + Arriba der. + + + Arriba + + + Arriba izq. + + + Centro + + + Abajo izq. + + + Abajo + + + Abajo der. + + + Descargado, compilándolo + + + El servicio de compilación de scripts no está disponible + + + No se encuentra el script en el servidor. + + + Problema al descargar + + + Permisos insuficientes para descargar un script. + + + Permisos insuficientes para + + + Fallo desconocido en la descarga + + + Omitiendo el script [SCRIPT] con la experiencia [EXPERIENCE]. + + + Recompilando + + + recompilar + + + Progreso del reinicio + + + restaurar + + + Configurar según se ejecuta + + + Configurando según se ejecuta + + + Configurar sin ejecutar + + + Configurando sin ejecutarlo + + + ¡Compilación correcta! + + + Compilación correcta, guardando... + + + Guardado. + + + Error al subir el archivo: + + + Script (objeto fuera de rango) + + + Script (eliminado del inventario) + + + El objeto [OBJECT] es propiedad de [OWNER] + + + ninguno + + + + (Desconocido) + + + + + [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc] + + + + + Saldo + + + Créditos + + + Débitos + + + Total + + + No se encontraron datos del grupo + + + parent estate + + + continente + + + teen + + + cualquiera + + + error + + + todos los estados propiedad de [OWNER] + + + todos los estados que posees + + + todos los estados que administras para [OWNER] + + + Siempre permitido: ([ALLOWEDAGENTS], de un máx. de [MAXACCESS]) + + + Grupos siempre permitidos: ([ALLOWEDGROUPS], de un máx. de [MAXACCESS]) + + + Siempre prohibido: ([BANNEDAGENTS], de un máx. de [MAXBANNED]) + + + Siempre permitido + + + Siempre prohibido + + + todos los estados + + + estados administrados + + + este estado + + + y [EXTRA_COUNT] más + + + Memoria de los scripts de la parcela + + + Parcelas listadas: [PARCELS] + + + Memoria usada: [COUNT] kb de un máx de [MAX] kb; [AVAILABLE] kb disponibles + + + Memoria usada: [COUNT] kb + + + URLs de los scripts de la parcela + + + URLs usadas: [COUNT] de un máx. de [MAX]; [AVAILABLE] disponibles + + + URLs usadas: [COUNT] + + + Error al obtener la información + + + No hay una parcela seleccionada + + + Error: la información del script sólo está disponible en tu región actual + + + Obteniendo la información... + + + No tienes permiso para examinar esta parcela + + + Sentado en + + + Tórax + + + Cráneo + + + Hombro izquierdo + + + Hombro derecho + + + Mano izq. + + + Mano der. + + + Pie izq. + + + Pie der. + + + Columna + + + Pelvis + + + Boca + + + Barbilla + + + Oreja izq. + + + Oreja der. + + + Ojo izq. + + + Ojo der. + + + Nariz + + + Brazo der. + + + Antebrazo derecho + + + Brazo izq. + + + Antebrazo izquierdo + + + Cadera der. + + + Muslo der. + + + Pantorrilla der. + + + Cadera izq. + + + Muslo izq. + + + Pantorrilla izq. + + + Abdomen + + + Pectoral izquierdo + + + Pectoral derecho + + + HUD: Centro 2 + + + HUD: arriba der. + + + HUD: arriba centro + + + HUD: arriba izq. + + + HUD: Centro 1 + + + HUD: abajo izq. + + + HUD: abajo + + + HUD: abajo der. + + + Cuello + + + Centro del avatar + + + Dedo anular izquierdo + + + Dedo anular derecho + + + Base de la cola + + + Extremo de la cola + + + Ala izquierda + + + Ala derecha + + + Mandíbula + + + Oreja izquierda alternativa + + + Oreja derecha alternativa + + + Ojo izquierdo alternativo + + + Ojo derecho alternativo + + + Lengua + + + Ingle + + + Pata trasera izquierda + + + Pata trasera derecha + + + Línea [LINE], Columna [COLUMN] + + + [COUNT] resultados + + + Contenido del objeto + + + Script nuevo + + + Este residente tiene activado 'No molestar' y verá tu mensaje más tarde. + + + (Por el nombre) + + + (Residente) + + + (Objeto) + + + (Grupo) + + + (Externo) + + + No se ha aportado un contrato para este estado. + + + No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab. Por favor, contacta con ese propietario para informarte sobre la venta. + + + + + + Propiedad del grupo + + + Público + + + Configuración local + + + Configuración de la región + + + Esta región no es compatible con las opciones de entorno. + + + Sol + + + Luna + + + Florecimiento + + + Ruido de nubes + + + Vista Normal + + + Transparente + + + Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil + + + (se actualizará tras la publicación) + + + No has creado destacados ni clasificados. Pulsa el botón Más para crear uno. + + + No has creado destacados. Haz clic en el botón Más para crear uno. + + + No has creado clasificados. Haz clic en el botón Nuevo para crear un anuncio clasificado. + + + El usuario no tiene clasificados ni destacados + + + El usuario no tiene destacados + + + El usuario no tiene clasificados + + + Cargando... + + + Vista previa + + + Propiedades + + + Un objeto de nombre + + + propiedad del grupo + + + propiedad de un grupo desconocido + + + propiedad de + + + propiedad de un usuario desconocido + + + te ha dado + + + Rechazas [DESC] de <nolink>[NAME]</nolink>. + + + Total + + + comprado + + + pagado a ti + + + pagado en + + + pase comprado a + + + cuotas pagadas para el evento + + + precio pagado por el evento + + + Saldo + + + Créditos + + + Débitos + + + [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] + + + Artículos adquiridos + + + Cancelar + + + Subir [NAME] cuesta [AMOUNT] L$ + + + Comprar esto cuesta [AMOUNT] L$ + + + Extensión de archivo desconocida [.%s] +Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh + + + Ignorar + + + Guardarme este hito... + + + Editar este hito... + + + ⌃ + + + ⌘ + + + ⌥ + + + ⇧ + + + Ctrl+ + + + Alt+ + + + Mayús+ + + + Archivo guardado + + + Recibiendo + + + AM + + + PM + + + PST + + + PDT + + + Adelante + + + Izquierda + + + Derecha + + + Atrás + + + Norte + + + Sur + + + Oeste + + + Este + + + Arriba + + + Abajo + + + Cualquier categoría + + + Compras + + + Terreno en alquiler + + + Propiedad en alquiler + + + Atracción especial + + + Nuevos productos + + + Empleo + + + Se busca + + + Servicios + + + Personal + + + Ninguno + + + Localización Linden + + + Adulto + + + Arte y Cultura + + + Negocios + + + Educativo + + + Juegos de azar + + + Entretenimiento + + + Para recién llegados + + + Parques y Naturaleza + + + Residencial + + + Artes escénicas + + + Otra + + + Terreno en alquiler + + + Cualquiera + + + Tú + + + Múltiples medias + + + Play/Pausa los media + + + http://www.intel.com/p/en_US/support/detect/graphics + + + http://www.nvidia.com/Download/index.aspx?lang=es + + + http://support.amd.com/us/Pages/AMDSupportHub.aspx + + + Ha habido un error analizando la línea de comando. +Por favor, consulta: http://wiki.secondlife.com/wiki/Client_parameters +Error: + + + [APP_NAME] Uso de línea de comando: + + + [APP_NAME] no puede acceder a un archivo que necesita. + +Puede ser porque estés ejecutando varias copias, o porque tu sistema crea -equivocadamente- que el archivo está abierto. +Si este mensaje persiste, reinicia tu ordenador y vuelve a intentarlo. +Si aun así sigue apareciendo el mensaje, debes desinstalar completamente [APP_NAME] y reinstalarlo. + + + Error fatal + + + [APP_NAME] requiere un procesador con AltiVec (G4 o posterior). + + + [APP_NAME] ya se está ejecutando. +Revisa tu barra de tareas para encontrar una copia minimizada del programa. +Si este mensaje persiste, reinicia tu ordenador. + + + En su anterior ejecución, [APP_NAME] se congeló o se cayó. +¿Quieres enviar un informe de caída? + + + Alerta + + + [APP_NAME] no encuentra DirectX 9.0b o superior. +[APP_NAME] usa DirectX para detectar el hardware o los drivers no actualizados que pueden provocar problemas de estabilidad, ejecución pobre y caídas. Aunque puedes ejecutar [APP_NAME] sin él, recomendamos encarecidamente hacerlo con DirectX 9.0b. + +¿Quieres continuar? + + + ¡Atención! + + + Las actualizaciones automáticas no están todavía implementadas para Linux. +Por favor, descarga la última versión desde www.secondlife.com. + + + Fallo en RegisterClass + + + Error + + + No puede ejecutarse a pantalla completa de [WIDTH] x [HEIGHT]. +Ejecutándose en una ventana. + + + Error Shutdown destruyendo la ventana (DestroyWindow() failed) + + + Error Shutdown + + + No se puede construir el 'GL device context' + + + No se puede encontrar un formato adecuado de píxel + + + No se puede conseguir la descripción del formato de píxel + + + Para ejecutarse, [APP_NAME] necesita True Color (32-bit). +Por favor, en las configuraciones de tu ordenador ajusta el modo de color a 32-bit. + + + [APP_NAME] no puede ejecutarse porque no puede obtener un canal alpha de 8 bit. Generalmente, se debe a alguna cuestión de los drivers de la tarjeta de vídeo. +Por favor, comprueba que tienes instalados los últimos drivers para tu tarjeta de vídeo. +Comprueba también que tu monitor esta configurado para True Color (32-bit) en Panel de Control > Apariencia y temas > Pantalla. +Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. + + + No se puede configurar el formato de píxel + + + No se puede crear el 'GL rendering context' + + + No se puede activar el 'GL rendering context' + + + [APP_NAME] no puede ejecutarse porque los drivers de tu tarjeta de vídeo o no están bien instalados, o no están actualizados, o son para hardware no admitido. Por favor, comprueba que tienes los drivers más actuales para tu tarjeta de vídeo, y, aunque los tengas, intenta reinstalarlos. + +Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. + + + Barba del día + + + Blanco del todo + + + Ojos de cómic + + + Arqueadas + + + Brazos: longitud + + + Cortos + + + Lóbulos + + + Nuca: largo + + + Marcadas + + + Bangs + + + Ojos pequeños + + + Barriga: tamaño + + + Grande + + + Culo grande + + + Pelo: moño + + + Pelo: tupé + + + Pelo: melena alta + + + Cabeza grande + + + Grandes pectorales + + + Crestas grandes + + + Negro + + + Rubio + + + Pelo rubio + + + Colorete + + + Color del colorete + + + Opacidad del colorete + + + Definición del cuerpo + + + Cuerpo: gordura + + + Pecas del cuerpo + + + Cuerpo grueso + + + Cuerpo: grosor + + + Cuerpo delgado + + + Abiertas + + + Busto: firmeza + + + Busto: canalillo + + + Busto: tamaño + + + Puente: ancho + + + Aumentar + + + Arco ciliar + + + Bug Eyes + + + Ojos saltones + + + Bulbosa + + + Nariz de porra + + + Masa del busto + + + Suavizado del busto + + + Gravedad del busto + + + Aerodinámica del busto + + + Efecto máx. + + + Elasticidad + + + Ganancia + + + Amortiguación + + + Efecto máx. + + + Elasticidad + + + Ganancia + + + Amortiguación + + + Efecto máx. + + + Elasticidad + + + Ganancia + + + Amortiguación + + + Masa de la barriga + + + Suavizado de la barriga + + + Gravedad de la barriga + + + Aerodinámica de la barriga + + + Efecto máx. + + + Elasticidad + + + Ganancia + + + Amortiguación + + + Masa del culo + + + Suavizado del culo + + + Gravedad del culo + + + Aerodinámica del culo + + + Efecto máx. + + + Elasticidad + + + Ganancia + + + Amortiguación + + + Efecto máx. + + + Elasticidad + + + Ganancia + + + Amortiguación + + + Cejijuntas + + + Pelo tupido + + + Culo: tamaño + + + Gravedad del culo + + + Polisón + + + Sin polisón + + + Con polisón + + + Cortito + + + Pómulos + + + Tórax: tamaño + + + Barbilla: ángulo + + + Barbilla: contorno + + + Barba en collar + + + Barbilla: largo + + + Hacia la barbilla + + + Barbilla retraída + + + Barbilla prominente + + + Papada + + + Transparente + + + Remarcar + + + Ojos juntos + + + Cerrar + + + Trasera cerrada + + + Frontal cerrado + + + Cerrada + + + Cerrada + + + Poco abultada + + + Espalda + + + Escote + + + Hacia abajo + + + Hacia arriba + + + Caídos + + + Nariz torcida + + + Acampanado + + + Oscuridad + + + Verde oscuro + + + Más oscuros + + + Remarcar + + + Tacones por defecto + + + Densas + + + Mucha papada + + + Poco + + + Muy abultada + + + Orejas: ángulo + + + Orejas: tamaño + + + Orejas: forma + + + Cabeza: ahuevada + + + Ojos: bolsas + + + Ojos: color + + + Ojos: profundidad + + + Ojos: brillo + + + Ojos: apertura + + + Ojos: simetría + + + Ojos: tamaño + + + Ojos: separación + + + Cejas: arco + + + Cejas: densidad + + + Cejas: altura + + + Cejas: en V + + + Cejas: tamaño + + + Pestañas: longitud + + + Contorno de ojos + + + Contorno de ojos: color + + + Eyes Bugged + + + Cara: simetría + + + Rasgos marcados + + + Ojos separados + + + Prominentes + + + Mujer + + + Sin dedos + + + Con dedos + + + Campana + + + Redondeadas + + + Culo plano + + + Cabeza plana + + + Empeine bajo + + + Pie: tamaño + + + Frente: ángulo + + + Hacia la frente + + + Pecas + + + Flequillo + + + Sin cortar + + + Contorno completo + + + Sin cortar + + + Pelo: volumen a los lados + + + Volumen total + + + Con brillo + + + Guantes: dedos + + + Guantes: largo + + + Pelo + + + Pelo: nuca + + + Pelo: delante + + + Pelo: lados + + + Peinado: dirección + + + Pelo: espesor + + + Pelo: espesor + + + Pelo: inclinación + + + A la izq. + + + A la der. + + + Pelo: volumen + + + Manos: tamaño + + + Muy largo + + + Cabeza: longitud + + + Cabeza: forma + + + Cabeza: tamaño + + + Cabeza: estiramiento + + + Tacón: altura + + + Tacón: forma + + + Altura + + + Subir + + + Tacones altos + + + Mandíbula alta + + + Suela gorda + + + Pegada + + + Arrriba + + + Cadera: altura + + + Cadera: ancho + + + Pasa el cursor + + + Pegadas + + + Línea de ojos: color + + + Línea de ojos: opacidad + + + Ojos: lagrimal + + + Inner Eye Shadow + + + Línea de ojos + + + Chaqueta: largo + + + Chaqueta: arrugas + + + Mandíbula: ángulo + + + Maxilar inferior + + + Mandíbula: forma + + + Más junto + + + Mofletes + + + Rodillas: ángulo + + + Zambas + + + Aumentar + + + Manos grandes + + + Raya: izq. + + + Piernas: longitud + + + Piernas: musculatura + + + Menos + + + Menos gordura + + + Menos tupida + + + Menos pecas + + + Menos grosor + + + Más levantado + + + Menos michelines + + + Pocos músculos + + + Poca musculatura + + + Menos sonrosada + + + Menos redondeada + + + Menos cartucheras + + + Menos cuadrada + + + Menos volumen + + + Pequeña + + + Más luminosos + + + Labio: hoyuelo + + + Hoyuelo marcado + + + Labios: grosor + + + Labios sonrosados + + + Labios: ratio + + + Labios: prominencia + + + Labios: ancho + + + Brillo de labios + + + Barra de labios + + + Barra de labios: color + + + Más + + + Cabeza alargada + + + Cadera larga + + + Piernas largas + + + Cuello largo + + + Coletas largas + + + Cola de caballo larga + + + Torso largo + + + Brazos largos + + + Pantalón suelto + + + Camiseta suelta + + + Puños anchos + + + Michelines + + + Bajar + + + Tacones bajos + + + Mandíbula baja + + + Suela fina + + + Suelta + + + Abajo + + + Puente: abajo + + + Mejillas: abajo + + + Varón + + + Raya: en medio + + + Más + + + Más colorete + + + Más gordura + + + Más tupida + + + Más + + + Más pecas + + + Más grosor + + + Menos levantado + + + Más barra de labios + + + Más michelines + + + Más el inferior + + + Más músculos + + + Más musculatura + + + Más sonrosada + + + Más redondeada + + + Más cartucheras + + + Más inclinada + + + Más cuadrada + + + Más el superior + + + Más recta + + + Más volumen + + + Grande + + + Bigote + + + Comisuras + + + Boca: posición + + + Rapado + + + Muscular + + + Patillas largas + + + Uñas pintadas + + + Uñas pintadas: color + + + Disminuir + + + Rapada + + + Entradas + + + Labios estrechos + + + Natural + + + Cuello: longitud + + + Cuello: grosor + + + Sin colorete + + + Sin contorno + + + Menos + + + Sin brillo + + + Sin barra de labios + + + Sin raya + + + Sin pintar + + + Nada + + + Sin crestas + + + Sin blanco + + + Sin arrugas + + + Normal Lower + + + Normal Upper + + + Nariz a la izq. + + + Nariz a la der. + + + Nariz: tamaño + + + Nariz: grosor + + + Nariz: respingona + + + Nariz: punta + + + Nariz: ancho + + + Ventana: altura + + + Ventana: ancho + + + Opaco + + + Abrir + + + Apertura trasera + + + Apertura frontal + + + Abierta + + + Abierta + + + Anaranjado + + + De soplillo + + + Sombra de ojos: color + + + Sombra de ojos: opacidad + + + Ojos: comisura + + + Outer Eye Shadow + + + Sombra de ojos + + + Retraído + + + Pubis + + + Pintadas + + + Pálida + + + Pantalón: cruz + + + Ceñido + + + Pernera: largo + + + Caja + + + Pantalón: arrugas + + + Raya + + + Flequillo partido + + + Pectorales + + + Tono + + + Coletas + + + Rosa + + + Más sonrosados + + + Suela: altura + + + Suela: ancho + + + En punta + + + De aguja + + + Cola de caballo + + + Con vuelo + + + Izquierdo más grande + + + Derecho más grande + + + Hinchadas + + + Ojeras + + + Irisación + + + Pelirrojo + + + Regular + + + Raya: der. + + + Tez sonrosada + + + Redondear + + + Rubicundez + + + Rojiza + + + Pelo encrespado + + + Cartucheras + + + Piernas flacas + + + Más ancho + + + Sin marcar + + + Nuca: corte + + + Shear Face + + + Shear Front + + + Arriba - izq. + + + Arriba - der. + + + Rapada + + + Rapada + + + A la izq. + + + Boca: ladeada + + + A la der. + + + Alto de cintura + + + Ceñido + + + Camisa: arrugas + + + Caña: altura + + + Menos + + + Brazos cortos + + + Piernas cortas + + + Cuello corto + + + Coletas cortas + + + Cola de caballo corta + + + Patillas cortas + + + Torso corto + + + Cadera corta + + + Hombros + + + Lados: franja + + + Patillas + + + Pelo: lados + + + Bajar lados del pelo + + + Subir lados del pelo + + + Cuello estrecho + + + Falda: vuelo + + + Falda: largo + + + Slanted Forehead + + + Largo de manga + + + Ancho de puños + + + Raja trasera + + + Raja frontal + + + Raja a la izq. + + + Raja a la der. + + + Disminuir + + + Manos pequeñas + + + Cabeza pequeña + + + Leves + + + Pelo liso + + + Calcetines: largo + + + Perilla + + + Depiladas + + + Crestas + + + Cuadrada + + + Punta cuadrada + + + Cabeza aplastada + + + Cabeza estirada + + + Chupadas + + + Estrecho de pecho + + + Ojos hundidos + + + Sweep Back + + + Sweep Forward + + + Más + + + Cubierta trasera + + + Cubierta frontal + + + Tacones grandes + + + Cuello ancho + + + Empeine alto + + + Delgadas + + + Cejas finas + + + Hacia dentro + + + Nariz fina + + + Poca papada + + + Sin campana + + + Pantalón ceñido + + + Camisa ceñida + + + Falda ceñida + + + Puños ceñidos + + + Punta: forma + + + Empeine + + + Torso: longitud + + + Torso: musculatura + + + Torso flacucho + + + Largos + + + Abiertos + + + Prognatismo + + + No natural + + + Puente: arriba + + + Mejillas: arriba + + + Barbilla: prominencia + + + Párpados + + + Mucho + + + Del todo + + + Cintura + + + Mofletes + + + Pelo blanco + + + Aumentar + + + Completa + + + Completa + + + Labios anchos + + + Total + + + Arrugas + + + Añadir a mis hitos + + + Editar mis hitos + + + Ver más información de esta localización + + + Historial de mis localizaciones + + + Comprar este terreno + + + Región Adulta + + + Región Moderada + + + Región General + + + Los avatares que están en esta parcela no pueden ser vistos ni escuchados por los que están fuera de ella + + + Los objetos que se mueven pueden presentar un comportamiento incorrecto en la región hasta que ésta se recargue. + + + Esta región no tiene activado el pathfinding dinámico. + + + Actualizar [APP_NAME] + + + Actualizando [APP_NAME]... + + + Instalando [APP_NAME]... + + + Tu visor [APP_NAME] se está actualizando a la última versión. Llevará algún tiempo, paciencia. + + + Descargando la actualización... + + + Descargando la actualización + + + Fallo en la descarga de la actualización + + + Ha habido un error actualizando [APP_NAME]. Por favor, descarga la última versión desde www.secondlife.com. + + + Fallo al instalar la actualización + + + Fallo al iniciar el visor + + + [APP_NAME]: Los ítems se reciben muy rápido de [FROM_NAME]; desactivada la vista previa automática durante [TIME] sgs. + + + [APP_NAME]: Los ítems se reciben muy rápido; desactivada la vista previa automática durante [TIME] sgs. + + + -- Activado el registro de los mensajes instantáneos -- + + + [NAME] está escribiendo... + + + (sin nombre) + + + (Moderado: por defecto, desactivada la voz) + + + Para esta llamada no está disponible el chat de texto. + + + Un moderador del grupo ha desactivado tu chat de texto. + + + Pulsa aquí para enviar un mensaje instantáneo. + + + A + + + (Moderador) + + + (Guardado [LONG_TIMESTAMP]) + + + Conectado/a + + + Desconectado/a + + + El usuario no está conectado: el mensaje se almacenará para entregárselo más tarde. + + + El usuario no está conectado: el inventario se ha guardado. + + + Han respondido a tu llamada + + + Has iniciado una llamada de voz + + + Has entrado en la llamada de voz + + + Rechazaste la llamada de voz automáticamente porque estaba activado 'No molestar'. + + + [NAME] inició una llamada de voz + + + Haciendo la llamada de voz... + + + Conectado, pulsa Colgar para salir + + + Se colgó la llamada de voz + + + Chat multi-persona + + + Conferencia con [AGENT_NAME] + + + Ítem del inventario '[ITEM_NAME]' ofrecido + + + Carpeta del inventario '[ITEM_NAME]' ofrecida + + + Estás conversando con un bot, [NAME]. No compartas información personal. +Más información en https://second.life/scripted-agents. + + + Arrastra los ítems desde el invenbtario hasta aquí + + + Has publicado en Facebook. + + + Has publicado en Flickr. + + + Has publicado en Twitter. + + + (La sesión de MI no existe) + + + Usted es el único usuario en esta sesión. + + + [NAME] está desconectado. + + + Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz. + + + Has ignorado a este residente. Enviándole un mensaje, automáticamente dejarás de ignorarle. + + + Error en lo solicitado, por favor, inténtalo más tarde. + + + Error al hacer lo solicitado; por favor, inténtelo más tarde. + + + Usted no tiene permisos suficientes. + + + La sesión ya acabó + + + Usted no tiene esa capacidad. + + + Usted no tiene esa capacidad. + + + Usted no es un moderador de la sesión. + + + Un moderador del grupo ha desactivado tu chat de texto. + + + Un moderador del grupo le ha desactivado el chat de texto. + + + No se ha podido añadir usuarios a la sesión de chat con [RECIPIENT]. + + + No se ha podido enviar tu mensaje a la sesión de chat con [RECIPIENT]. + + + No se ha podido enviar su mensaje a la sesión de chat con [RECIPIENT]. + + + Error moderando. + + + Se te ha sacado del grupo. + + + Ha sido eliminado del grupo. + + + Usted ya no tendrá más la capacidad de estar en la sesión de chat. + + + [SOURCES] ha dicho algo nuevo + + + [SOURCES] ha dicho algo nuevo + + + Se ha agotado el tiempo del inicio de sesión + + + Posición inicial establecida. + + + https://secondlife.com/destination/voice-island + + + https://secondlife.com/destination/voice-morphing-premium + + + [NAME] te ha pagado [AMOUNT] L$ [REASON]. + + + [NAME] te ha pagado [AMOUNT] L$: [REASON] + + + [NAME] te ha pagado [AMOUNT] L$. + + + Has pagado [AMOUNT] L$ a [NAME] por [REASON]. + + + Has pagado [AMOUNT] L$ a [NAME]: [REASON] + + + Has pagado[AMOUNT] L$ + + + Has pagado [AMOUNT] L$ a [NAME]. + + + Has pagado [AMOUNT] L$ por [REASON]. + + + No has pagado a [NAME] [AMOUNT] L$ [REASON]. + + + No has pagado a [NAME] [AMOUNT] L$: [REASON] + + + No has pagado [AMOUNT] L$. + + + No has pagado a [NAME] [AMOUNT] L$. + + + No has pagado [AMOUNT] L$ [REASON]. + + + para [ITEM] + + + para una parcela de terreno + + + para un pase de acceso a terrenos + + + for deeding land + + + para crear un grupo + + + para entrar a un grupo + + + to upload + + + para publicar un anuncio clasificado + + + Dando [AMOUNT] L$ + + + Subir esto cuesta [AMOUNT] L$ + + + Esto cuesta [AMOUNT] L$ + + + Compra del terreno seleccionado por [AMOUNT] L$ + + + Este objeto cuesta [AMOUNT] L$ + + + Todos + + + Oficiales + + + Propietarios + + + Conectado/a + + + Subiendo... + +Denuncia de infracción + + + Anatomía nueva + + + Piel nueva + + + Pelo nuevo + + + Ojos nuevos + + + Camisa nueva + + + Pantalón nuevo + + + Zapatos nuevos + + + Calcetines nuevos + + + Chaqueta nueva + + + Guantes nuevos + + + Camiseta nueva + + + Ropa interior nueva + + + Falda nueva + + + Nueva Alfa + + + Tatuaje nuevo + + + Nuevo Universal + + + Nueva física + + + No se puede poner + + + Gesto nuevo + + + Script nuevo + + + Nota nueva + + + Carpeta nueva + + + Contenidos + + + Gestos + + + Gestos de hombre + + + Gestos de mujer + + + Otros gestos + + + Gestos al hablar + + + Gestos corrientes + + + Varón - Disculpa + + + Varón – Déjame en paz + + + Varón - Lanzar un beso + + + Varón - Abucheo + + + Varón - Aburrido + + + Varón – ¡Eh! + + + Varón - Risa + + + Varón - Rechazo + + + Varón - Encogimiento de hombros + + + Hombre - Sacando la lengua + + + Varón - Admiración + + + Mujer - Risa suave + + + Mujer - Llorar + + + Mujer - Ruborizada + + + Mujer - Disculpa + + + Mujer – Déjame en paz + + + Mujer - Lanzar un beso + + + Mujer - Abucheo + + + Mujer - Aburrida + + + Mujer - ¡Eh! + + + Mujer - ¡Eh, encanto! + + + Mujer - Risa + + + Mujer - Buen aspecto + + + Mujer - Por aquí + + + Mujer - Por favor + + + Mujer - Rechazo + + + Mujer - Encogimiento de hombros + + + Mujer - Sacando la lengua + + + Mujer - Admiración + + + Nuevo Ciclo del día + + + Nueva Agua + + + Nuevo Cielo + + + /reverencia + + + /aplaudir + + + /contar + + + /apagar + + + /bmc + + + /músculo + + + /no + + + /¡no! + + + /papel + + + /señalarme + + + /señalarte + + + /piedra + + + /tijera + + + /fumar + + + /estirar + + + /silbar + + + /sí + + + /¡sí! + + + ausente + + + baile1 + + + baile2 + + + baile3 + + + baile4 + + + baile5 + + + baile6 + + + baile7 + + + baile8 + + + [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt] + + + ninguno/ninguno + + + No se puede subir imágenes mayores de [WIDTH]*[HEIGHT] + + + La foto del vestuario puede tener como máx. un tamaño de [WIDTH]*[HEIGHT]. Cambia el tamaño o utiliza otra imagen + + + La foto del vestuario puede tener como máx. un tamaño de [WIDTH]*[HEIGHT]. Selecciona otra textura + + + No se pueden verificar las dimensiones de la foto. Espera hasta que aparezca el tamaño de la foto en el selector + + + + Parece que hay algún problema que ha escapado a nuestros controles. + +Visita http://status.secondlifegrid.net para ver si hay alguna incidencia conocida que esté afectando al servicio. + Si sigues teniendo problemas, comprueba la configuración de la red y del servidor de seguridad. + + + Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado + + + Dom:Lun:Mar:Mié:Jue:Vie:Sáb + + + Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre + + + Ene:Feb:Mar:Abr:May:Jun:Jul:Ago:Sep:Oct:Nov:Dic + + + [MDAY] + + + AM + + + PM + + + [AMOUNT] US$ + + + Expulsión de grupo + + + Membresía + + + Roles + + + Indentidad de grupo + + + Gestión de la parcela + + + Identidad de la parcela + + + Configuración de la parcela + + + Poder de la parcela + + + Acceso a la parcela + + + Contenido de la parcela + + + Manejo de objetos + + + Contabilidad + + + Avisos + + + Chat + + + ¿Deseas eliminar los elementos seleccionados? + + + ¿Deseas eliminar el elemento seleccionado? + + + No hay elementos en este vestuario + + + Selecciona un editor mediante la configuración de ExternalEditor. + + + No se encuentra el editor externo especificado. +Inténtalo incluyendo la ruta de acceso al editor entre comillas +(por ejemplo, "/ruta a mi/editor" "%s"). + + + Error al analizar el comando de editor externo. + + + Error al ejecutar el editor externo. + + + Error al traducir: [REASON] + + + Error al analizar la respuesta de la traducción. + + + Esc + + + Space + + + Enter + + + Tab + + + Ins + + + Del + + + Backsp + + + Shift + + + Ctrl + + + Alt + + + CapsLock + + + Base + + + End + + + PgUp + + + PgDn + + + F1 + + + F2 + + + F3 + + + F4 + + + F5 + + + F6 + + + F7 + + + F8 + + + F9 + + + F10 + + + F11 + + + F12 + + + Añadir + + + Restar + + + Multiplicar + + + Dividir + + + PAD_DIVIDE + + + PAD_LEFT + + + PAD_RIGHT + + + PAD_DOWN + + + PAD_UP + + + PAD_HOME + + + PAD_END + + + PAD_PGUP + + + PAD_PGDN + + + PAD_CENTER + + + PAD_INS + + + PAD_DEL + + + PAD_Enter + + + PAD_BUTTON0 + + + PAD_BUTTON1 + + + PAD_BUTTON2 + + + PAD_BUTTON3 + + + PAD_BUTTON4 + + + PAD_BUTTON5 + + + PAD_BUTTON6 + + + PAD_BUTTON7 + + + PAD_BUTTON8 + + + PAD_BUTTON9 + + + PAD_BUTTON10 + + + PAD_BUTTON11 + + + PAD_BUTTON12 + + + PAD_BUTTON13 + + + PAD_BUTTON14 + + + PAD_BUTTON15 + + + - + + + = + + + ` + + + ; + + + [ + + + ] + + + \ + + + 0 + + + 1 + + + 2 + + + 3 + + + 4 + + + 5 + + + 6 + + + 7 + + + 8 + + + 9 + + + A + + + B + + + C + + + D + + + E + + + F + + + G + + + H + + + I + + + J + + + K + + + L + + + M + + + N + + + O + + + P + + + Q + + + R + + + S + + + T + + + U + + + V + + + W + + + X + + + Y + + + Z + + + Viendo balizas de partículas (azules) + + + Viendo balizas de objetos materiales (verdes) + + + Viendo balizas de objetos con script (rojas) + + + Viendo el objeto con script con balizas de función táctil (rojas) + + + Viendo balizas de sonido (amarillas) + + + Viendo balizas de medios (blancas) + + + Visualización de la baliza de dirección del sol (naranja) + + + Visualización de la baliza de dirección de la luna (violeta) + + + Ocultando las partículas + + + Acerca del terreno + + + Apariencia + + + Avatar + + + Construir + + + Chat + + + Conversaciones + + + Brújula + + + Destinos + + + Mis entornos + + + Facebook + + + Flickr + + + Gestos + + + Estado del Grid + + + Cómo + + + Inventario + + + Mapa + + + Mercado + + + Mercado + + + Minimapa + + + Caminar / Correr / Volar + + + Buzón de salida de comerciante + + + Gente + + + Destacados + + + Lugares + + + Preferencias + + + Perfil + + + Denunciar una infracción + + + Buscar + + + Foto + + + Hablar + + + Twitter + + + Controles de la cámara + + + Configuración de voz + + + Información sobre el terreno que vas a visitar + + + Cambiar tu avatar + + + Elegir un avatar completo + + + Construir objetos y modificar la forma del terreno + + + Habla por chat de texto con las personas próximas + + + Conversar con todos + + + Brújula + + + Destinos de interés + + + Mis entornos + + + Publicar en Facebook + + + Subir a Flickr + + + Gestos para tu avatar + + + Mostrar el estado actual del Grid + + + Cómo hacer las tareas habituales + + + Ver y usar tus pertenencias + + + Mapa del mundo + + + Ir de compras + + + Vende tu creación + + + Mostrar la gente que está cerca + + + Desplazando el avatar + + + Transfiere objetos a tu mercado para venderlos + + + Amigos, grupos y personas próximas + + + Lugares que se mostrarán como favoritos en tu perfil + + + Lugares que has guardado + + + Preferencias + + + Consulta o edita tu perfil + + + Denunciar una infracción + + + Buscar lugares, eventos y personas + + + Tomar una fotografía + + + Utiliza el micrófono para hablar con las personas próximas + + + Twitter + + + Cambiando el ángulo de la cámara + + + Controles de volumen para las llamadas y la gente que se encuentre cerca de ti en el mundo virtual + + + actualmente en tu barra de herramientas inferior + + + actualmente en tu barra de herramientas izquierda + + + actualmente en tu barra de herramientas derecha + + + % retención + + + Detalle + + + Mejor detalle + + + Superficie + + + Sólido + + + Envoltura + + + Vista previa + + + Normal + + + http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer + + + Ninguno + + + Afecta al navmesh + + + Personaje + + + (Múltiple) + + + Muy bajo + + + Bajo + + + Medio + + + Alto + + + Muy alto + + + El Residente no puede visitar esta región. + + + [Usuario] + + + Experiencia + + + (sin experiencia) + + + (experiencia sin título) + + + Activa en el terreno + + + Activa en el Grid + + + PERMITIDO + + + BLOQUEADO + + + COLABORADOR + + + ADMIN. + + + RECIENTE + + + PROPIEDAD + + + ([EXPERIENCES], máx. [MAXEXPERIENCES]) + + + hacerte con tus controles + + + activar animaciones en tu avatar + + + anexar a tu avatar + + + seguimiento de la cámara + + + controlar tu cámara + + + teleportarte + + + aceptar automáticamente permisos de experiencias + + + forzar que el avatar se siente + + + cambiar tu configuración del entorno + + + realizar una operación desconocida: [Permission] + + + Ponerte al mando + + + Activar animaciones + + + Anexar + + + Seguir la cámara + + + Controlar la cámara + + + Teleporte + + + Otorgar permisos + + + Sentarte + + + Entorno + + + No se están registrando las conversaciones. Para empezar a grabar un registro, elige "Guardar: Solo registro" o "Guardar: Registro y transcripciones" en Preferencias > Chat. + + + No se registrarán más conversaciones. Para reanudar la grabación de un registro, elige "Guardar: Solo registro" o "Guardar: Registro y transcripciones" en Preferencias > Chat. + + + No hay conversaciones grabadas. Después de contactar con una persona, o de que alguien contacte contigo, aquí se mostrará una entrada de registro. + + + Cargando... + + + n/c + + + -Lista vacía- + + + Predeterminado + + + (ninguno) + + + Sin límite + + + La forma física contiene triángulos demasiado pequeños. Intenta simplificar el modelo físico. + + + La forma física contiene datos de confirmación erróneos. Intenta corregir el modelo físico. + + + La versión de la forma física no es correcta. Configura la versión correcta del modelo físico. + + + Error de DNS al resolver el nombre del host([HOSTNAME]). +Por favor verifica si puedes conectarte al sitio web www.secondlife.com. +Si puedes conectarte, pero aún recibes este error, por favor accede a +la sección Soporte y genera un informe del problema. + + + El servidor de inicio de sesión no pudo verificarse vía SSL. Si aún recibes este error, por favor accede a la sección Soporte del sitio web Secondlife.com -y genera un informe del problema. - En general esto significa que el horario de tu computadora no está bien configurado. +y genera un informe del problema. + + + En general esto significa que el horario de tu computadora no está bien configurado. Por favor accede al Panel de control y asegúrate de que la hora y la fecha estén bien configurados. Verifica también que tu red y tu cortafuegos estén bien configurados. Si aún recibes este error, por favor accede a la sección Soporte del sitio web Secondlife.com y genera un informe del problema. -[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conocimientos] +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conocimientos] + diff --git a/indra/newview/skins/default/xui/es/teleport_strings.xml b/indra/newview/skins/default/xui/es/teleport_strings.xml index 44be93cd80..cc6089584a 100644 --- a/indra/newview/skins/default/xui/es/teleport_strings.xml +++ b/indra/newview/skins/default/xui/es/teleport_strings.xml @@ -1,39 +1,95 @@ - Ha habido un problema al procesar tu petición de teleporte. Debes volver a iniciar sesión antes de poder teleportarte de nuevo. -Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE]. - Ha habido un problema al procesar tu paso a otra región. Debes volver a iniciar sesión para poder pasar de región a región. -Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE]. - Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelve a intentarlo en un momento. Si sigues sin poder teleportarte, desconéctate y vuelve a iniciar sesión para solucionar el problema. - Lo sentimos, pero el sistema no ha podido localizar el destino de este hito. - Lo sentimos, pero el sistema no ha podido completar el teleporte. -Vuelva a intentarlo en un momento. - No te puedes volver a teleportar a la isla de bienvenida. -Para repetir el tutorial, visita la isla de bienvenida pública. - Lo sentimos, pero no tienes acceso al destino de este teleporte. - Aún no han llegado tus objetos anexados. Espera unos segundos más o desconéctate y vuelve a iniciar sesión antes de teleportarte. - La cola de espera en esta región está actualmente obstruida, por lo que tu petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos o ve a una zona menos ocupada. - Lo sentimos, pero el sistema no ha podido atender a tu petición de teleporte en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos. - Lo sentimos, pero el sistema no ha podido completar tu paso a otra región en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos. - Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelve a intentarlo en unos minutos. - En estos momentos no está disponible el sistema del inventario. - Solo pueden acceder a esta región los mayores de 18 años. - No puedes entrar en la región. '[REGION_NAME]' es una región de juegos de habilidad, y debes cumplir determinados criterios para poder entrar en ella. Consulta los detalles en las [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life P+F de juegos de habilidad]. - Lo sentimos, pero el sistema no pudo comenzar tu teleportacion. Por favor inténtalo de nuevo en unos minutos + + Ha habido un problema al procesar tu petición de teleporte. Debes volver a iniciar sesión antes de poder teleportarte de nuevo. +Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE]. + + + Ha habido un problema al procesar tu paso a otra región. Debes volver a iniciar sesión para poder pasar de región a región. +Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE]. + + + Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelve a intentarlo en un momento. Si sigues sin poder teleportarte, desconéctate y vuelve a iniciar sesión para solucionar el problema. + + + Lo sentimos, pero el sistema no ha podido localizar el destino de este hito. + + + Lo sentimos, pero el sistema no ha podido completar el teleporte. +Vuelva a intentarlo en un momento. + + + No te puedes volver a teleportar a la isla de bienvenida. +Para repetir el tutorial, visita la isla de bienvenida pública. + + + Lo sentimos, pero no tienes acceso al destino de este teleporte. + + + Aún no han llegado tus objetos anexados. Espera unos segundos más o desconéctate y vuelve a iniciar sesión antes de teleportarte. + + + La cola de espera en esta región está actualmente obstruida, por lo que tu petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos o ve a una zona menos ocupada. + + + Lo sentimos, pero el sistema no ha podido atender a tu petición de teleporte en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos. + + + Lo sentimos, pero el sistema no ha podido completar tu paso a otra región en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos. + + + Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelve a intentarlo en unos minutos. + + + En estos momentos no está disponible el sistema del inventario. + + + Solo pueden acceder a esta región los mayores de 18 años. + + + No puedes entrar en la región. '[REGION_NAME]' es una región de juegos de habilidad, y debes cumplir determinados criterios para poder entrar en ella. Consulta los detalles en las [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life P+F de juegos de habilidad]. + + + Lo sentimos, pero el sistema no pudo comenzar tu teleportacion. Por favor inténtalo de nuevo en unos minutos + - Llevando al destino. - Redireccionando a una posición diferente. - Reorientando el destino. - Enviando la petición de posición de la Base. - Enviando la petición de posición del hito. - Completando el teleporte. - Teleporte realizado desde [T_SLURL] - Especificando el destino. - Contactando con la nueva región. - Llegando... - Solicitando teleporte... - Teleporte pendiente... + + Llevando al destino. + + + Redireccionando a una posición diferente. + + + Reorientando el destino. + + + Enviando la petición de posición de la Base. + + + Enviando la petición de posición del hito. + + + Completando el teleporte. + + + Teleporte realizado desde [T_SLURL] + + + Especificando el destino. + + + Contactando con la nueva región. + + + Llegando... + + + Solicitando teleporte... + + + Teleporte pendiente... + diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index c929226c43..4fb5167d67 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -1,2079 +1,5919 @@ - Second Life - Second Life - SECOND LIFE - Grille de Second Life - Portail Assistance Second Life - Détection du matériel... - Chargement de [APP_NAME]... - Vidage du cache... - Initialisation du cache des textures... - Échec d'initialisation des graphiques. Veuillez mettre votre pilote graphique à jour. - [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) -[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] - Configuration de la construction [BUILD_CONFIG] - Vous êtes à [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] dans [REGION], se trouvant à <nolink>[HOSTNAME]</nolink> + + Second Life + + + Second Life + + + SECOND LIFE + + + Grille de Second Life + + + Portail Assistance Second Life + + + Détection du matériel... + + + Chargement de [APP_NAME]... + + + Vidage du cache... + + + Initialisation du cache des textures... + + + Échec d'initialisation des graphiques. Veuillez mettre votre pilote graphique à jour. + + + [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) +[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] + + + Configuration de la construction [BUILD_CONFIG] + + + Vous êtes à [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] dans [REGION], se trouvant à <nolink>[HOSTNAME]</nolink> SLURL : <nolink>[SLURL]</nolink> (coordonnées globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] -[SERVER_RELEASE_NOTES_URL] - CPU : [CPU] +[SERVER_RELEASE_NOTES_URL] + + + CPU : [CPU] Mémoire : [MEMORY_MB] Mo Version OS : [OS_VERSION] Distributeur de cartes graphiques : [GRAPHICS_CARD_VENDOR] -Carte graphique : [GRAPHICS_CARD] - Version Windows Graphics Driver : [GRAPHICS_DRIVER_VERSION] - Version OpenGL : [OPENGL_VERSION] - Taille de la fenêtre: [WINDOW_WIDTH]x[WINDOW_HEIGHT] +Carte graphique : [GRAPHICS_CARD] + + + Version Windows Graphics Driver : [GRAPHICS_DRIVER_VERSION] + + + Version OpenGL : [OPENGL_VERSION] + + + Taille de la fenêtre: [WINDOW_WIDTH]x[WINDOW_HEIGHT] Ajustement de la taille de la police : [FONT_SIZE_ADJUSTMENT]pt Échelle de l’interface : [UI_SCALE] Distance de dessin : [DRAW_DISTANCE]m Bande passante : [NET_BANDWITH] kbit/s Facteur LOD (niveau de détail) : [LOD_FACTOR] Qualité de rendu : [RENDER_QUALITY] -Mémoire textures : [TEXTURE_MEMORY] Mo - Mode d'affichage HiDPI : [HIDPI] - J2C Decoder Version: [J2C_VERSION] +Mémoire textures : [TEXTURE_MEMORY] Mo + + + Mode d'affichage HiDPI : [HIDPI] + + + J2C Decoder Version: [J2C_VERSION] Audio Driver Version: [AUDIO_DRIVER_VERSION] [LIBCEF_VERSION] LibVLC Version: [LIBVLC_VERSION] -Voice Server Version: [VOICE_VERSION] - Paquets perdus : [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) - [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] - Erreur lors de la récupération de l'URL des notes de version du serveur. - Configuration de la construction - Restauration... - Changement de la résolution... - Fullbright (Legacy) - La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter. - Connexion... - Authentification en cours - Maintenance du compte en cours… - La tentative de connexion précédente a échoué. Connexion, esssai [NUMBER] - Monde en cours de chargement… - Navigateur Web incorporé en cours d'initialisation… - Multimédia en cours d'initialisation… - Chargement des polices en cours... - Fichiers du cache en cours de vérification (peut prendre 60-90 s)... - Réponse en cours de traitement… - Monde en cours d'initialisation… - Décodage des images en cours... - Quicktime en cours d'initialisation - Quicktime introuvable, impossible de procéder à l'initialisation. - Initialisation de Quicktime réussie. - Capacités de la région demandées... - Capacités de la région demandées... Tentative n° [NUMBER]. - Liaison avec la région en cours de création... - Connexion avec la région en cours... - Habits en cours de téléchargement... - Certificat non valide ou corrompu renvoyé par le serveur. Contactez l'administrateur de la grille. - Nom d'hôte non valide utilisé pour accéder au serveur. Vérifiez votre nom d'hôte de grille ou SLURL. - Il semble que le certificat renvoyé par la grille ait expiré. Vérifiez votre horloge système ou contactez l'administrateur de la grille. - Impossible d'utiliser le certificat renvoyé par le serveur pour SSL. Contactez l'administrateur de la grille. - Certificats trop nombreux dans la chaîne des certificats du serveur. Contactez l'administrateur de la grille. - Impossible de vérifier la signature de certificat renvoyée par le serveur de la grille. Contactez l'administrateur de la grille. - Erreur réseau : impossible d'établir la connexion. Veuillez vérifier votre connexion réseau. - Échec de la connexion. - Quitter - http://join.secondlife.com/?sourceid=[sourceid] - Grille principale de Second Life (Agni) - Grille de test bêta Second Life (Aditi) - http://secondlife.com/download - Le client que vous utilisez ne permet plus d'accéder à Second Life. Téléchargez un nouveau client à la page suivante : +Voice Server Version: [VOICE_VERSION] + + + Paquets perdus : [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) + + + [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] + + + Erreur lors de la récupération de l'URL des notes de version du serveur. + + + Configuration de la construction + + + Restauration... + + + Changement de la résolution... + + + Fullbright (Legacy) + + + La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter. + + + Connexion... + + + Authentification en cours + + + Maintenance du compte en cours… + + + La tentative de connexion précédente a échoué. Connexion, esssai [NUMBER] + + + Monde en cours de chargement… + + + Navigateur Web incorporé en cours d'initialisation… + + + Multimédia en cours d'initialisation… + + + Chargement des polices en cours... + + + Fichiers du cache en cours de vérification (peut prendre 60-90 s)... + + + Réponse en cours de traitement… + + + Monde en cours d'initialisation… + + + Décodage des images en cours... + + + Quicktime en cours d'initialisation + + + Quicktime introuvable, impossible de procéder à l'initialisation. + + + Initialisation de Quicktime réussie. + + + Capacités de la région demandées... + + + Capacités de la région demandées... Tentative n° [NUMBER]. + + + Liaison avec la région en cours de création... + + + Connexion avec la région en cours... + + + Habits en cours de téléchargement... + + + Certificat non valide ou corrompu renvoyé par le serveur. Contactez l'administrateur de la grille. + + + Nom d'hôte non valide utilisé pour accéder au serveur. Vérifiez votre nom d'hôte de grille ou SLURL. + + + Il semble que le certificat renvoyé par la grille ait expiré. Vérifiez votre horloge système ou contactez l'administrateur de la grille. + + + Impossible d'utiliser le certificat renvoyé par le serveur pour SSL. Contactez l'administrateur de la grille. + + + Certificats trop nombreux dans la chaîne des certificats du serveur. Contactez l'administrateur de la grille. + + + Impossible de vérifier la signature de certificat renvoyée par le serveur de la grille. Contactez l'administrateur de la grille. + + + Erreur réseau : impossible d'établir la connexion. Veuillez vérifier votre connexion réseau. + + + Échec de la connexion. + + + Quitter + + + http://join.secondlife.com/?sourceid=[sourceid] + + + Grille principale de Second Life (Agni) + + + Grille de test bêta Second Life (Aditi) + + + http://secondlife.com/download + + + Le client que vous utilisez ne permet plus d'accéder à Second Life. Téléchargez un nouveau client à la page suivante : http://secondlife.com/download Pour plus d'informations, consultez la page FAQ ci-dessous : -http://secondlife.com/viewer-access-faq - Mise à jour facultative du client disponible : [VERSION] - Mise à jour du client requise : [VERSION] - L'agent est déjà connecté. - Désolé ! La connexion a échoué. +http://secondlife.com/viewer-access-faq + + + Mise à jour facultative du client disponible : [VERSION] + + + Mise à jour du client requise : [VERSION] + + + L'agent est déjà connecté. + + + Désolé ! La connexion a échoué. Veuillez vérifier que les éléments ci-dessous ont été correctement saisis : * Nom d'utilisateur (par exemple, bobsmith12 ou steller.sunshine) * Mot de passe -Assurez-vous également que la touche Verr. maj n'est pas activée. - Votre mot de passe a été modifié pour des raisons de sécurité. +Assurez-vous également que la touche Verr. maj n'est pas activée. + + + Votre mot de passe a été modifié pour des raisons de sécurité. Veuillez accéder à votre compte à la page http://secondlife.com/password et répondre à la question de sécurité afin de réinitialiser votre mot de passe. -Nous vous prions de nous excuser pour la gêne occasionnée. - Vous allez devoir réinitialiser votre mot de passe suite à quelques changements effectués sur notre système. +Nous vous prions de nous excuser pour la gêne occasionnée. + + + Vous allez devoir réinitialiser votre mot de passe suite à quelques changements effectués sur notre système. Pour cela, accédez à votre compte à la page http://secondlife.com/password et répondez à la question de sécurité. Votre mot de passe sera réinitialisé. -Nous vous prions de nous excuser pour la gêne occasionnée. - Second Life est temporairement fermé pour des raisons de maintenance. +Nous vous prions de nous excuser pour la gêne occasionnée. + + + Second Life est temporairement fermé pour des raisons de maintenance. Seuls les employés peuvent actuellement y accéder. -Consultez la page www.secondlife.com/status pour plus d'informations. - Les connexions à Second Life sont temporairement limitées afin de s'assurer que l'expérience des utilisateurs présents dans le monde virtuel soit optimale. +Consultez la page www.secondlife.com/status pour plus d'informations. + + + Les connexions à Second Life sont temporairement limitées afin de s'assurer que l'expérience des utilisateurs présents dans le monde virtuel soit optimale. -Les personnes disposant de comptes gratuits ne pourront pas accéder à Second Life pendant ce temps afin de permettre à celles qui ont payé pour pouvoir utiliser Second Life de le faire. - Impossible d'accéder à Second Life depuis cet ordinateur. +Les personnes disposant de comptes gratuits ne pourront pas accéder à Second Life pendant ce temps afin de permettre à celles qui ont payé pour pouvoir utiliser Second Life de le faire. + + + Impossible d'accéder à Second Life depuis cet ordinateur. Si vous pensez qu'il s'agit d'une erreur, contactez -l'Assistance à l'adresse suivante : support@secondlife.com. - Votre compte est inaccessible jusqu'à -[TIME], heure du Pacifique. - Impossible de traiter votre demande à l'heure actuelle. -Pour obtenir de l'aide, veuillez contacter l'Assistance Second Life à la page suivante : http://support.secondlife.com. - Incohérence des données lors de la connexion. -Veuillez contacter support@secondlife.com. - Des opérations de maintenance mineures sont actuellement effectuées sur votre compte. +l'Assistance à l'adresse suivante : support@secondlife.com. + + + Votre compte est inaccessible jusqu'à +[TIME], heure du Pacifique. + + + Impossible de traiter votre demande à l'heure actuelle. +Pour obtenir de l'aide, veuillez contacter l'Assistance Second Life à la page suivante : http://support.secondlife.com. + + + Incohérence des données lors de la connexion. +Veuillez contacter support@secondlife.com. + + + Des opérations de maintenance mineures sont actuellement effectuées sur votre compte. Votre compte est inaccessible jusqu'à [TIME], heure du Pacifique. -Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com - Le simulateur a renvoyé une erreur en réponse à la demande de déconnexion. - Le système est en train de vous déconnecter. -Veuillez réessayer de vous connecter dans une minute. - Impossible de créer de session valide. - Impossible de se connecter à un simulateur. - Votre compte permet uniquement d'accéder à Second Life +Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com + + + Le simulateur a renvoyé une erreur en réponse à la demande de déconnexion. + + + Le système est en train de vous déconnecter. +Veuillez réessayer de vous connecter dans une minute. + + + Impossible de créer de session valide. + + + Impossible de se connecter à un simulateur. + + + Votre compte permet uniquement d'accéder à Second Life entre [START] et [END], heure du Pacifique. Veuillez réessayer au cours de la période indiquée. -Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com - Paramètres incorrects. -Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com - Le paramètre Prénom doit être alphanumérique. -Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com - Le paramètre Nom doit être alphanumérique. -Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com - La région est en train d'être mise hors ligne. -Veuillez réessayer de vous connecter dans une minute. - Agent absent de la région. -Veuillez réessayer de vous connecter dans une minute. - Une autre session était en cours d'ouverture au sein de la région. -Veuillez réessayer de vous connecter dans une minute. - La session précédente était en cours de fermeture au sein de la région. -Veuillez réessayer de vous connecter dans une minute. - Fermeture de la session précédente toujours en cours pour la région. -Veuillez réessayer de vous connecter dans une minute. - Dernière session fermée au sein de la région. -Veuillez réessayer de vous connecter dans une minute. - Processus de déconnexion commencé pour la région. -Veuillez réessayer de vous connecter dans une minute. - Le système a commencé à fermer votre dernière session. -Veuillez réessayer de vous connecter dans une minute. - Il y a peut-être des problèmes techniques dans cette région. Veuillez vérifier votre connexion Internet. - Enregistrement des paramètres... - Déconnexion... - Arrêt en cours... - Vous avez été déconnecté de la région où vous étiez. - Vous avez été transféré vers une région non valide. - Test de déconnexion du client - Connexion à Facebook… - Publication… - Déconnexion de Facebook… - Un problème est survenu lors de la connexion à Facebook. - Un problème est survenu lors de la publication sur Facebook. - Un problème est survenu lors de la déconnexion à Facebook. - Connexion à Flickr... - Publication… - Déconnexion de Flickr... - Un problème est survenu lors de la connexion à Flickr. - Un problème est survenu lors de la publication sur Flickr. - Un problème est survenu lors de la déconnexion de Flickr. - Connexion à Twitter... - Publication… - Déconnexion de Twitter... - Un problème est survenu lors de la connexion à Twitter. - Un problème est survenu lors de la publication sur Twitter. - Un problème est survenu lors de la déconnexion de Twitter. - Noir et blanc - Couleurs des années 1970 - Intense - Presse - Sépia - Projecteur - Vidéo - Contraste automatique - Halo - Miniature - Toy Camera - Personne - (pas de nom) - Propriétaire : - Public - (Groupe) - À vendre : [AMOUNT] L$ - Contruction de groupe - Pas de construction - Contruction de groupe - Non sécurisé - Interdiction de voler - Scripts de groupe - Pas de scripts - Terrain : - Impossible de faire glisser plus d'un objet ici - Vous ne pouvez pas porter un dossier contenant plus de [AMOUNT] articles. Vous pouvez modifier cette limite dans Avancé > Afficher les paramètres de débogage > WearFolderLimit. +Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com + + + Paramètres incorrects. +Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com + + + Le paramètre Prénom doit être alphanumérique. +Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com + + + Le paramètre Nom doit être alphanumérique. +Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance à l'adresse suivante : support@secondlife.com + + + La région est en train d'être mise hors ligne. +Veuillez réessayer de vous connecter dans une minute. + + + Agent absent de la région. +Veuillez réessayer de vous connecter dans une minute. + + + Une autre session était en cours d'ouverture au sein de la région. +Veuillez réessayer de vous connecter dans une minute. + + + La session précédente était en cours de fermeture au sein de la région. +Veuillez réessayer de vous connecter dans une minute. + + + Fermeture de la session précédente toujours en cours pour la région. +Veuillez réessayer de vous connecter dans une minute. + + + Dernière session fermée au sein de la région. +Veuillez réessayer de vous connecter dans une minute. + + + Processus de déconnexion commencé pour la région. +Veuillez réessayer de vous connecter dans une minute. + + + Le système a commencé à fermer votre dernière session. +Veuillez réessayer de vous connecter dans une minute. + + + Il y a peut-être des problèmes techniques dans cette région. Veuillez vérifier votre connexion Internet. + + + Enregistrement des paramètres... + + + Déconnexion... + + + Arrêt en cours... + + + Vous avez été déconnecté de la région où vous étiez. + + + Vous avez été transféré vers une région non valide. + + + Test de déconnexion du client + + + Connexion à Facebook… + + + Publication… + + + Déconnexion de Facebook… + + + Un problème est survenu lors de la connexion à Facebook. + + + Un problème est survenu lors de la publication sur Facebook. + + + Un problème est survenu lors de la déconnexion à Facebook. + + + Connexion à Flickr... + + + Publication… + + + Déconnexion de Flickr... + + + Un problème est survenu lors de la connexion à Flickr. + + + Un problème est survenu lors de la publication sur Flickr. + + + Un problème est survenu lors de la déconnexion de Flickr. + + + Connexion à Twitter... + + + Publication… + + + Déconnexion de Twitter... + + + Un problème est survenu lors de la connexion à Twitter. + + + Un problème est survenu lors de la publication sur Twitter. + + + Un problème est survenu lors de la déconnexion de Twitter. + + + Noir et blanc + + + Couleurs des années 1970 + + + Intense + + + Presse + + + Sépia + + + Projecteur + + + Vidéo + + + Contraste automatique + + + Halo + + + Miniature + + + Toy Camera + + + Personne + + + (pas de nom) + + + Propriétaire : + + + Public + + + (Groupe) + + + À vendre : [AMOUNT] L$ + + + Contruction de groupe + + + Pas de construction + + + Contruction de groupe + + + Non sécurisé + + + Interdiction de voler + + + Scripts de groupe + + + Pas de scripts + + + Terrain : + + + Impossible de faire glisser plus d'un objet ici + + + Vous ne pouvez pas porter un dossier contenant plus de [AMOUNT] articles. Vous pouvez modifier cette limite dans Avancé > Afficher les paramètres de débogage > WearFolderLimit. + - Il s’agit d’un lien vers une page dans le domaine officiel SecondLife.com ou LindenLab.com. - Vous ne pouvez pas rezzer (charger) des articles du dossier Annonces de la Place de marché - Vous ne pouvez pas mettre d'articles que vous portez dans le dossier Annonces de la Place du marché - Le niveau de dossiers imbriqués dépasse [AMOUNT]. Diminuez le nombre de niveaux de dossiers imbriqués dans d'autres dossiers. Si nécessaire, placez certains articles dans une boîte. - Le nombre de sous-dossiers dépasse [AMOUNT]. Diminuez le nombre de sous-dossiers dans votre annonce. Si nécessaire, placez certains articles dans une boîte. - Le nombre d'articles dépasse [AMOUNT]. Pour pouvoir vendre plus de [AMOUNT] articles au sein d'une même annonce, vous devez placer certains de ces articles dans une boîte. - Le nombre d'articles de stock dépasse [AMOUNT]. - Vous pouvez uniquement déposer des articles ou des dossiers dans les onglets TOUS ou NON ASSOCIÉS. Sélectionnez l’un de ces onglets et déplacez à nouveau votre ou vos article ou dossiers. - Impossible de vendre ou de transférer un ou plusieurs de ces objets - Vous ne pouvez mettre sur la Place du marché que des articles de votre inventaire - Vous ne pouvez pas mettre des articles ou dossiers liés sur la Place du marché - Vous ne pouvez pas mettre des cartes de visite sur la Place du marché - vous ne pouvez pas déplacer une annonce publiée - Vous ne pouvez pas déplacer le dossier racine des annonces de la Place du marché - tous les articles d'un dossier de stock doivent avoir le même type et droit - Impossible de déplacer un dossier vers son enfant - Impossible de déplacer un dossier vers lui-même - Cliquez pour afficher cette page web - Cliquez pour en savoir plus sur cet endroit - Cliquez pour afficher le profil de ce résident - En savoir plus sur ce résident - Cliquer pour ignorer ce résident - Cliquer pour ne plus ignorer ce résident - Cliquer pour envoyer un IM à ce résident - Cliquer pour payer ce résident - Cliquer pour proposer une téléportation à ce résident - Cliquer pour demander à ce résident d'être votre ami - Cliquez pour afficher la description de ce groupe - Cliquez pour afficher la description de cet événement - Cliquez pour afficher cette petite annonce - Cliquez pour afficher la description de cette parcelle - Cliquez pour vous téléporter à cet endroit - Cliquez pour afficher la description de cet objet - Cliquez pour voir cet emplacement sur la carte - Cliquez pour exécuter la commande secondlife:// + + Il s’agit d’un lien vers une page dans le domaine officiel SecondLife.com ou LindenLab.com. + + + Vous ne pouvez pas rezzer (charger) des articles du dossier Annonces de la Place de marché + + + Vous ne pouvez pas mettre d'articles que vous portez dans le dossier Annonces de la Place du marché + + + Le niveau de dossiers imbriqués dépasse [AMOUNT]. Diminuez le nombre de niveaux de dossiers imbriqués dans d'autres dossiers. Si nécessaire, placez certains articles dans une boîte. + + + Le nombre de sous-dossiers dépasse [AMOUNT]. Diminuez le nombre de sous-dossiers dans votre annonce. Si nécessaire, placez certains articles dans une boîte. + + + Le nombre d'articles dépasse [AMOUNT]. Pour pouvoir vendre plus de [AMOUNT] articles au sein d'une même annonce, vous devez placer certains de ces articles dans une boîte. + + + Le nombre d'articles de stock dépasse [AMOUNT]. + + + Vous pouvez uniquement déposer des articles ou des dossiers dans les onglets TOUS ou NON ASSOCIÉS. Sélectionnez l’un de ces onglets et déplacez à nouveau votre ou vos article ou dossiers. + + + Impossible de vendre ou de transférer un ou plusieurs de ces objets + + + Vous ne pouvez mettre sur la Place du marché que des articles de votre inventaire + + + Vous ne pouvez pas mettre des articles ou dossiers liés sur la Place du marché + + + Vous ne pouvez pas mettre des cartes de visite sur la Place du marché + + + vous ne pouvez pas déplacer une annonce publiée + + + Vous ne pouvez pas déplacer le dossier racine des annonces de la Place du marché + + + tous les articles d'un dossier de stock doivent avoir le même type et droit + + + Impossible de déplacer un dossier vers son enfant + + + Impossible de déplacer un dossier vers lui-même + + + Cliquez pour afficher cette page web + + + Cliquez pour en savoir plus sur cet endroit + + + Cliquez pour afficher le profil de ce résident + + + En savoir plus sur ce résident + + + Cliquer pour ignorer ce résident + + + Cliquer pour ne plus ignorer ce résident + + + Cliquer pour envoyer un IM à ce résident + + + Cliquer pour payer ce résident + + + Cliquer pour proposer une téléportation à ce résident + + + Cliquer pour demander à ce résident d'être votre ami + + + Cliquez pour afficher la description de ce groupe + + + Cliquez pour afficher la description de cet événement + + + Cliquez pour afficher cette petite annonce + + + Cliquez pour afficher la description de cette parcelle + + + Cliquez pour vous téléporter à cet endroit + + + Cliquez pour afficher la description de cet objet + + + Cliquez pour voir cet emplacement sur la carte + + + Cliquez pour exécuter la commande secondlife:// + - Cliquez pour composer un message - Me téléporter vers - Afficher la carte pour - Ignorer - Ne plus ignorer - IM - Payer - Proposer une téléportation à - Demande d'amitié - Suppression d'un ami - Fermer (⌘W) - Fermer (Ctrl+W) - Fermer - Restaurer - Minimiser - Réduire - Attacher - Afficher l'aide - Les éléments de ce type ne peuvent pas être attachés -aux notes de cette région. - Seuls des éléments avec des autorisation + + Cliquez pour composer un message + + + Me téléporter vers + + + Afficher la carte pour + + + Ignorer + + + Ne plus ignorer + + + IM + + + Payer + + + Proposer une téléportation à + + + Demande d'amitié + + + Suppression d'un ami + + + Fermer (⌘W) + + + Fermer (Ctrl+W) + + + Fermer + + + Restaurer + + + Minimiser + + + Réduire + + + Attacher + + + Afficher l'aide + + + Les éléments de ce type ne peuvent pas être attachés +aux notes de cette région. + + + Seuls des éléments avec des autorisation illimitées pour le 'prochain propriétaire' -peuvent être joints aux notes. - Recherche... - Aucun résultat. - En cours d'extraction... - Notes de version - https://releasenotes.secondlife.com/viewer/ - Chargement... - (personne) - (en attente) - (multiple) - (aucun) - Aucune erreur - Requête de l'actif : échec - Requête de l'actif : fichier inexistant - Requête de l'actif : actif introuvable dans la base de données - Fin du ficher - Impossible d'ouvrir le fichier - Fichier introuvable - Délai d'attente du transfert du fichier dépassé - Disparition du circuit - Il y a une différence de prix entre le client et le serveur - Statut inconnu - Service inaccessible. - Le serveur rencontres des difficultés imprévues. - Services non disponible ou la durée du chargement est dépassée. - Erreur dans la demande de chargement. Veuillez consulter le site : -http://secondlife.com/support pour vous aider à résoudre ce problème. - Échec de la validation pour l'importation des paramètres [NAME] - Impossible d'ouvre le fichier [FILE] - Impossible d'ouvre le fichier [FILE] - Impossible de traduit les paramètres windlight hérités [NAME] - texture - son - carte de visite - repère - script (ancienne version) - habits - objet - note - dossier - racine - script LSL2 - bytecode LSL - texture tga - partie du corps - photo - Objets trouvés - image targa - Corbeille - image jpeg - animation - geste - simstate - favori - lien - lien du dossier - paramètres - maillage - (Apparence en cours de modification) - Absent - Ne pas déranger - Bloqué(e) - Effrayé - En colère - Absent - Salto arrière - Rire en se tenant le ventre - Grand sourire - Envoyer un baiser - Bailler d'ennui - S'incliner - Applaudir - Révérence de cour - Pleurer - Danse 1 - Danse 2 - Danse 3 - Danse 4 - Danse 5 - Danse 6 - Danse 7 - Danse 8 - Mépris - Boire - Gêne - Désapprobation - Victoire - Yoga - Froncer les sourcils - Impatient - Sauter de joie - Va te faire voir ! - Envoyer un baiser - Rire - Montrer ses muscles - Non (mécontent) - Non - Na na na na nère - Gauche-droite - Bouche ouverte - Paix - Montrer quelqu'un du doigt - Se montrer du doigt - Gauche - Droite - Compter (pierre-papier-ciseaux) - Papier (pierre-papier-ciseaux) - Pierre (pierre-papier-ciseaux) - Ciseaux (pierre-papier-ciseaux) - Dégoût - Coup de pied circulaire - Triste - Salut - Crier - Hausser les épaules - Sourire - Fumer, immobile - Fumer, prendre une bouffée - Fumer, jeter son mégot - Surprise - Coup d'épée - Caprice - Tirer la langue - Faire signe - Chuchoter - Siffler - Clin d'œil - Clin d'œil (Hollywood) - Soucis - Oui (Joie) - Oui - Multiples - Utiliser la texture - Faites glisser le curseur sur l'axe - pour le fixer sur la grille - Chargement... - Hors ligne - [AREA] m² [PRICE] L$ - Aucun résultat. - OK - Fichier incomplet - Impossible de trouver ROOT ou JOINT. - Chat près de moi - (Chat près de moi) - chuchote : - crie : - Connexion au chat vocal du Monde en cours… - Connecté(e) - Voix non disponible à l'endroit où vous êtes - Déconnecté du chat vocal - Vous allez maintenant être reconnecté(e) au chat vocal près de vous. - '[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu le droit de : [PERMISSIONS]. - '[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n'a pas reçu le droit de : [PERMISSIONS]. - Si vous autorisez un accès à votre compte, vous autorisez également l'objet à : - Débiter vos Linden dollars (L$) - Utiliser vos touches de commandes - Reconfigurer vos touches de commandes - Animer votre avatar - Attacher à votre avatar - Passer l'objet dans le domaine public (sans propriétaire) - Lier et délier d'autres objets - Créer et supprimer des liens avec d'autres objets - Modifier ses droits - Suivre votre caméra - Contrôler votre caméra - Vous téléporter - Forcez votre avatar à s’asseoir - Changer vos paramètres d'environnement - Pas connecté(e) - (Vous) - - Supprimer les alertes lors de la gestion des listes d'accès aux domaines - Remplacer vos animations par défaut - Renvoyer les objets de votre part - (inconnu) - Général - Modéré - Adulte - Hors ligne - Inconnu - (inconnu) - Domaine / Région entière - Domaine / Homestead - Continent / Homestead - Continent / Région entière - Tous fichiers - Sons - Animations - Images - Enregistrer - Charger - Images Targa - Images Bitmap - Images PNG - Images Targa ou PNG - Fichier de film AVI - Fichier d'animation XAF - Fichier XML - Fichier RAW - Images compressées - Charger des fichiers - Choisir le répertoire - Scripts - Dictionnaires - Silhouette - Peau - Cheveux - Yeux - Chemise - Pantalon - Chaussures - Chaussettes - Veste - Gants - Débardeur - Caleçon - Jupe - Alpha - Tatouage - Universel - Propriétés physiques - non valide - aucun - Chemise non portée - Pantalon non porté - Chaussures non portées - Chaussettes non portées - Veste non portée - Gants non portés - Débardeur non porté - Caleçon non porté - Jupe non portée - Alpha non porté - Tatouage non porté - Universel non porté - Propriétés physiques non portées - non valide - Créer une nouvelle silhouette - Créer une nouvelle peau - Créer de nouveaux cheveux - Créer de nouveaux yeux - Créer une nouvelle chemise - Créer un nouveau pantalon - Créer de nouvelles chaussures - Créer de nouvelles chaussettes - Créer une nouvelle veste - Créer de nouveaux gants - Créer un nouveau débardeur - Créer un nouveau caleçon - Créer une nouvelle jupe - Créer un nouvel alpha - Créer un nouveau tatouage - Créer un nouvel environnement universel - Créer de nouvelles propriétés physiques - non valide - Nouv. [WEARABLE_ITEM] - Suivant - OK - Note au groupe - Notices au groupe - Envoyée par - Pièce(s) jointe(s) : - Consultez les notices précédentes ou choisissez de ne plus recevoir ces messages ici. - Ouvrir pièce jointe - Enregistrer la pièce jointe - Offre de téléportation - De nouvelles notifications sont arrivées en votre absence. - Vous avez %d notification(s) supplémentaire(s) - Bras droit - Tête - Bras gauche - Jambe gauche - Torse - Jambe droite - Squelette amélioré - Faible - Moyen - Élevé - Appuyez sur ESC pour quitter la vue subjective - Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/[SEARCH_TERM] Rechercher]. - Avez-vous trouvé ce que vous cherchiez ? Essayez [secondlife:///app/inventory/filters Show filters]. - Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/[SEARCH_TERM] Rechercher]. - Faites glisser un repère ici pour l'ajouter à vos Favoris. - Aucun article trouvé. Vérifiez l'orthographe de votre chaîne de recherche et réessayez. - Vous n'avez pas de copie de cette texture dans votre inventaire - Les achats que vous avez effectués sur la Place du marché s'affichent ici. Vous pouvez alors les faire glisser vers votre inventaire afin de les utiliser. - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ - http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more - Ouvrir la fenêtre avec les options Jeu - Exécuter le geste sélectionné dans le monde virtuel. - Ouvrir la fenêtre avec les options Jeu - Tout le monde peut vendre des articles sur la Place du marché. - - Pour devenir vendeur, vous devez [[MARKETPLACE_CREATE_STORE_URL] créer une boutique sur la Place du marché]. - Votre boîte d'envoi est vide. - - Pour mettre des dossiers en vente sur la [[MARKETPLACE_DASHBOARD_URL] Place du marché], faites-les glisser vers cette zone et cliquez sur "Envoyer vers la Place du marché". - Initialisation de la Place du marché... - Nous sommes en train d'accéder à votre compte dans la [[MARKETPLACE_CREATE_STORE_URL] boutique de la Place du marché]. - Erreurs de la Place du marché. - La [[MARKETPLACE_CREATE_STORE_URL] boutique de la Place du marché] renvoie des erreurs. - Une erreur est survenue lors de l’ouverture des annonces de la Place du marché. -Si vous continuez de recevoir ce message, contactez l’assistance Second Life à http://support.secondlife.com pour obtenir de l’aide. - Votre dossier Annonces de la Place du marché est vide. - Pour mettre des dossiers en vente sur la [[MARKETPLACE_DASHBOARD_URL] Place du marché], faites-les glisser vers cette zone. - ( [ITEMS_COUNT] Articles ) - le dossier de stock doit être contenu dans un dossier de version - : Erreur : tous les articles d'un dossier de stock doivent être non reproductibles et de même type - : Erreur : un dossier de stock ne peut pas contenir de sous-dossiers - : Avertissement : le dossier ne contient aucun article - : Avertissement : création du dossier de stock - : Avertissement : création du dossier de version - : Avertissement : déplacement d'articles - : Avertissement : contenu du dossier transféré vers le dossier de stock, suppression du dossier vide - : Erreur : les articles non reproductibles doivent être contenus dans un dossier de stock - : Avertissement : les articles doivent être contenus dans un dossier de version - : Erreur : - : Avertissement : - : Avertissement : le dossier de version doit contenir au moins 1 article - : Avertissement : le dossier de stock doit contenir au moins 1 article - Pas d'erreur ni d'avertissement à signaler - Aucune erreur - Erreur : - Avant d'envoyer des articles vers la Place du marché, vous devez vous configurer comme vendeur (gratuit). - Impossible de déplacer l'article dans ce dossier. - Cet article ne peut pas être vendu sur la Place du marché. - no Mkt ID - publié - actif - max. - stock - rupture de stock - mise à jour... - Les frais dépendent de votre niveau d'abonnement. Les niveaux supérieurs sont soumis à des frais moins élevés. [https://secondlife.com/my/account/membership.php? En savoir plus] - Points de repère ouverts - Sans contrainte - - - - - - - chargement des contenus en cours... - Aucun contenu - - - - Oui - Non - - - - - - - - - - - - - - - - - - - - - - - - Mon inventaire - Bibliothèque - Textures - Sons - Cartes de visite - Repères - Scripts - Habits - Objets - Notes - Nouveau dossier - Inventaire - Images non compressées - Parties du corps - Corbeille - Albums photo - Objets trouvés - Sons non compressés - Animations - Gestes - Mes Favoris - Mes Favoris - Mes favoris - Mes favoris - Tenue actuelle - Tenues initiales - Mes tenues - Accessoires - Maillages - Articles reçus - Boîte d'envoi vendeur - Amis - Tout - Aucun élément attaché porté - Éléments attachés ([COUNT] emplacements restants) - Acheter - Acheter des L$ - Pierre - Métal - Verre - Bois - Chair - Plastique - Caoutchouc - Léger - Maj- - Ctrl - Poitrine - Crâne - Épaule gauche - Épaule droite - Main gauche - Main droite - Pied gauche - Pied droit - Colonne - Bassin - Bouche - Menton - Oreille gauche - Oreille droite - Globe oculaire gauche - Globe oculaire droit - Nez - Bras D - Avant-bras D - Bras G - Avant-bras G - Hanche droite - Cuisse D - Jambe D - Hanche gauche - Cuisse G - Jambe G - Estomac - Pectoral gauche - Pectoral droit - Cou - Centre de l'avatar - Annulaire gauche - Annulaire droit - Base de la queue - Bout de la queue - Aile gauche - Aile droite - Mâchoire - Oreille gauche différente - Oreille droite différente - Œil gauche différent - Œil droit différent - Langue - Aine - Pied arrière gauche - Pied arrière droit - Point d'attache non valide - Erreur : article manquant - Erreur : article de base manquant - Erreur : l'objet est dans une tenue actuelle, mais il n'est pas attaché - [AGEYEARS] [AGEMONTHS] - [AGEYEARS] - [AGEMONTHS] - [AGEWEEKS] - [AGEDAYS] - Inscrit aujourd'hui - Désormais, tout le monde peut vous voir. - Vous risquez de ne pas être rendu par tous les gens qui vous entourent. - Vous risquez de ne pas être rendu par plus de la moitié des gens qui vous entourent. - Vous risquez de ne pas être rendu par la plupart des gens qui vous entourent. - Vous risquez de n’être rendu par aucune des personnes qui vous entourent. - Votre HUD - [OBJ_NAME] (porté sur [JNT_NAME]) - [HUD_DETAILS] utilise beaucoup de mémoire textures - [HUD_DETAILS] contient beaucoup de textures et d’objets volumineux - [HUD_DETAILS] contient beaucoup de textures volumineuses - [HUD_DETAILS] contient trop d’objets - [HUD_DETAILS] contient trop de textures - [COUNT] an - [COUNT] ans - [COUNT] ans - [COUNT] mois - [COUNT] mois - [COUNT] mois - [COUNT] semaine - [COUNT] semaines - [COUNT] semaines - [COUNT] jour - [COUNT] jours - [COUNT] jours - [COUNT] membre - [COUNT] membres - [COUNT] membres - Résident - Essai - Membre originaire - Employé(e) de Linden Lab - Infos de paiement utilisées - Infos de paiement enregistrées - Aucune info de paiement enregistrée - Personne dont l'âge a été vérifié - Personne dont l'âge n'a pas été vérifié - Centre 2 - En haut à droite - En haut - En haut à gauche - Centre - En bas à gauche - Bas - En bas à droite - Téléchargé, compilation en cours - Service de compilation de script indisponible. - Script introuvable sur le serveur. - Problème lors du téléchargement - Droits insuffisants pour télécharger un script. - Droits insuffisants pour - Échec du téléchargement, erreur inconnue - En train d’ignorer le script [SCRIPT] avec l’expérience [EXPERIENCE]. - Recompilation - progrès - recompiler - Réinitialiser les progrès - réinitialiser - Lancer - lancer - Arrêter - arrêter - Compilation réussie ! - Compilation réussie, enregistrement en cours... - Enregistrement terminé. - Échec du chargement de fichier : - Script (objet hors de portée) - Script (supprimé de l’inventaire) - Objet [OBJECT] appartenant à [OWNER] - aucun - - (Inconnu) - - - [day,datetime,utc]/[mthnum,datetime,utc]/[year,datetime,utc] - - - Solde - Crédits - Débits - Total - Aucune donnée trouvée pour le groupe - domaine parent - continent - teen - n'importe qui - erreur - tous les domaines appartenant à [OWNER] - tous les domaines vous appartenant - tous les domaines que vous gérez pour [OWNER] - Toujours autorisé : ([ALLOWEDAGENTS], max [MAXACCESS]) - Groupes toujours autorisés : [ALLOWEDGROUPS], max [MAXACCESS]) - Toujours interdits : ([BANNEDAGENTS], max. [MAXBANNED]) - Toujours autorisé - Toujours interdit - tous les domaines - domaines gérés - ce domaine - et [EXTRA_COUNT] plus - Mémoire des scripts de parcelles - Parcelles répertoriées : [PARCELS] - Mémoire utilisée : [COUNT] Ko sur [MAX] ; [AVAILABLE] Ko disponibles - Mémoire utilisée : [COUNT] Ko - URL des scripts de parcelles - URL utilisées : [COUNT] sur [MAX] ; [AVAILABLE] disponible(s) - URL utilisées : [COUNT] - Une erreur est survenue pendant la requête d'informations. - Aucune parcelle sélectionnée - Erreur : les informations de script ne sont disponibles que dans votre région actuelle. - Extraction des informations en cours... - Vous n'avez pas le droit d'examiner cette parcelle. - Assis(e) dessus - Poitrine - Crâne - Épaule gauche - Épaule droite - Main gauche - Main droite - Pied gauche - Pied droit - Colonne vertébrale - Bassin - Bouche - Menton - Oreille gauche - Oreille droite - Œil gauche - Œil droit - Nez - Bras droit - Avant-bras droit - Bras gauche - Avant-bras gauche - Hanche droite - Cuisse droite - Jambe droite - Hanche gauche - Cuisse gauche - Jambe gauche - Estomac - Pectoral gauche - Pectoral droit - HUD centre 2 - HUD en haut à droite - HUD en haut au centre - HUD en haut à gauche - HUD centre 1 - HUD en bas à gauche - HUD en bas - HUD en bas à droite - Cou - Centre de l'avatar - Annulaire gauche - Annulaire droit - Base de la queue - Bout de la queue - Aile gauche - Aile droite - Mâchoire - Oreille gauche différente - Oreille droite différente - Œil gauche différent - Œil droit différent - Langue - Aine - Pied arrière gauche - Pied arrière droit - Ligne [LINE], colonne [COLUMN] - [COUNT] trouvé(s) - [hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt] - [mthnum,datetime,slt]/[day,datetime,slt] - Contenu de l'objet - Nouveau script - Ce résident a activé Ne pas déranger et verra votre message plus tard. - (par nom) - (résident) - (objet) - (groupe) - (externe) - Il n'y a aucun règlement pour ce domaine. - Il n'y a aucun règlement pour ce domaine. Le terrain sur ce domaine est vendu par le propriétaire, non par Linden Lab. Pour en savoir plus, veuillez contacter le propriétaire. - - - - Propriété du groupe - Public - Réglages locaux - Réglages de la région - Cette région ne prend pas en charge les paramètres environnementaux. - Soleil - Lune - Éclat - Bruit du nuage - Carte normale - Transparent - Clics : [TELEPORT] téléportation, [MAP] carte, [PROFILE] profil - (mise à jour après la publication) - Vous n'avez pas créé de favoris ni de petites annonces Cliquez sur le bouton Plus pour créer un favori ou une petite annonce. - Vous n'avez pas créé de favoris Cliquer sur le bouton Nouveau pour créer un favori - Vous n'avez pas créé de petites annonces Cliquer sur le bouton Nouveau pour créer une petite annonce. - L'utilisateur n'a ni favoris ni petites annonces. - L'utilisateur n'a pas de favoris - L'utilisateur n'a pas de petites annonces - Chargement... - Prévisualiser - Propriétés - Un objet appelé - possédé par le groupe - possédé par un groupe inconnu - possédé par - possédé par un résident inconnu - vous a donné - Vous refusez l'offre [DESC] de <nolink>[NAME]</nolink>. - Total - acheté - vous a payé - payé - a acheté un pass à - a payé des frais pour un événement - a payé un prix pour un événement - Solde - Crédits - Débits - [weekday,datetime,utc] [day,datetime,utc] [mth,datetime,utc] [year,datetime,utc] - Objets acquis - Annuler - Le chargement de [NAME] coûte [AMOUNT] L$ - Cet achat coûte [AMOUNT] L$ - Extension de fichier inconnue .%s -.wav, .tga, .bmp, .jpg, .jpeg, ou .bvh acceptés - Ignorer - Ignorer - Ne plus ignorer - Ne plus ignorer - Ajouter à mes repères... - Modifier mon repère... - - - - - Ctrl+ - Alt+ - Maj+ - Fichier enregistré - Réception - Matin - Après-midi - PST - PDT - Avant - Gauche - Droite - Arrière - Nord - Sud - Ouest - Est - Haut - Bas - Toutes catégories - Shopping - Terrains à louer - Propriétés à louer - Divertissements - Nouveaux produits - Emplois - Offres - Services - Divers - Aucun - Appartenant aux Lindens - Adulte - Arts et culture - Business - Éducation - Jeux - Favoris - Accueil pour les nouveaux - Parcs et nature - Résidentiel - Phase - Autre - Location - Aucun - Vous - : - , - ... - *** - ( - ) - . - ' - --- - Médias multiples - Lire/pauser le média - http://www.intel.com/p/fr_FR/support/detect/graphics - http://www.nvidia.com/Download/index.aspx?lang=fr - http://support.amd.com/us/Pages/AMDSupportHub.aspx - Une erreur est survenue lors de la lecture de la ligne de commande. -Merci de consulter : http://wiki.secondlife.com/wiki/Client_parameters -Erreur : - [APP_NAME] - Utilisation de la ligne de commande : - [APP_NAME] ne peut accéder à un fichier requis. - -Cela vient du fait que quelqu'un a ouvert plusieurs copies ou que votre système pense qu'un fichier est ouvert. -Si ce message persiste, veuillez redémarrer votre ordinateur. -Si le problème persiste, vous devrez peut-être complètement désinstaller puis réinstaller [APP_NAME]. - Erreur fatale - [APP_NAME] nécessite un microprocesseur AltiVec (version G4 ou antérieure). - [APP_NAME] est déjà en cours d'exécution. -Vérifiez si une version minimisée du programme apparaît dans votre barre de tâches. -Si ce message persiste, redémarrez votre ordinateur. - [APP_NAME] semble avoir crashé lors de l'utilisation précédente. -Voulez-vous envoyer un rapport de crash ? - Notification - [APP_NAME] ne peut détecter DirectX 9.0b ou une version supérieure. -[APP_NAME] utilise DirectX pour détecter les matériels et/ou les pilotes qui ne sont pas à jour et peuvent causer des problèmes de stabilité, de performance ou des plantages. Bien que vous puissiez utiliser [APP_NAME] sans DirectX, nous vous recommandons de l'utiliser avec DirectX 9.0b. - -Voulez-vous continuer ? - Avertissement - Les mises à jour automatiques n'existent pas encore pour Linux. -Veuillez télécharger la dernière version sur www.secondlife.com. - RegisterClass a échoué - Erreur - Impossible d'ouvrir le mode plein écran à [WIDTH] x [HEIGHT]. -Utilisation du mode fenêtré. - Erreur de fermeture lors de la destruction de la fenêtre (DestroyWindow() a échoué) - Erreur de fermeture - Impossible de créer le contexte GL - Impossible de trouver le format pixel approprié - Impossible de trouver la description du format pixel - [APP_NAME] nécessite True Color (32 bits) pour s'exécuter. -Accédez aux paramètres d'affichage de votre ordinateur et réglez le mode couleur sur 32 bits. - [APP_NAME] ne peut pas s'exécuter, car il n'y pas de canal alpha 8 bits accessible. En général, ceci vient de problèmes avec le pilote de la carte vidéo. -Assurez-vous d'avoir installé le pilote de carte vidéo le plus récent possible. -Assurez-vous aussi que votre écran est réglé sur True Color (32 bits) sous Panneau de configuration > Affichage > Paramètres. -Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. - Impossible de trouver le format pixel approprié - Impossible de créer le contexte de rendu GL - Impossible d'activer le contexte de rendu GL - [APP_NAME] ne peut pas s'exécuter car les pilotes de votre carte vidéo n'ont pas été installés correctement, ne sont pas à jour, ou sont pour du matériel non pris en charge. Assurez-vous d'avoir des pilotes de cartes vidéos récents, et même si vous avez les plus récents, réinstallez-les. - -Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. - Peu - Tout blancs - Grand yeux - Arqués - Longueur des bras - Attachés - Lobes - Mèches de derrière - Plus - Frange - Yeux perçants - Taille du ventre - Plus - Grosses fesses - Volume : Derrière - Volume : Devant - Volume : Haut - Plus - Gros pectoraux - Spikes - Noir - Blond - Cheveux blonds - Blush - Couleur du blush - Opacité du blush - Contour du corps - Graisse - Grains de beauté - Plus - Épaisseur du corps - Moins - Jambes arquées - Hauteur des seins - Clivage - Taille des seins - Arête du nez - Large - Taille du front - Yeux globuleux - Yeux globuleux - En bulbe - Nez en bulbe - Masse des seins - Lissage des seins - Gravité des seins - Résistance de l'air sur les seins - Effet max. - Élasticité - Amplification - Amortissement - Effet max. - Élasticité - Amplification - Amortissement - Effet max. - Élasticité - Amplification - Amortissement - Masse du ventre - Lissage du ventre - Gravité du ventre - Résistance de l'air sur le ventre - Effet max. - Élasticité - Amplification - Amortissement - Masse des fesses - Lissage des fesses - Gravité des fesses - Résistance de l'air sur les fesses - Effet max. - Élasticité - Amplification - Amortissement - Effet max. - Élasticité - Amplification - Amortissement - Sourcils touffus - Beaucoup - Taille des fesses - Gravité des fesses - Jupe gonflante - Pas gonflante - Plus gonflante - Moins - Pommettes - Taille de la poitrine - Angle du menton - Fente du menton - Favoris - Profondeur - Menton lourd - Menton rentré - Menton sorti - Menton-cou - Clair - Fendu - Yeux rapprochés - Fermé(s) - Fermé à l'arrière - Fermé devant - Fermé à gauche - Fermé à droite - Mini - Col arrière - Col devant - Coin vers le bas - Coin vers le haut - Fripée - Déviation du nez - Jambes - Sombre - Vert foncé - Plus foncé - Profonde - Talons par défaut - Dense - Double menton - Pointant vers le bas - Maxi - Angle de l'oreille - Taille - Extrémités - Proéminence - Cernes - Couleur des yeux - Profondeur - Clarté - Ouverture - Œil proéminent - Taille de l'œil - Espacement - Arc - Épaisseur sourcils - Hauteur - Direction - Taille - Longueur des cils - Eyeliner - Couleur de l'eyeliner - Yeux globuleux - Visage - Définition - Yeux écartés - Lèvres épaisses - Femme - Sans doigts - Doigts - Jambes larges - Moins - Fesses plates - Tête plate - Orteil plat - Pointure - Angle du front - Front lourd - Tâches de rousseur - Mèches de devant - Arrière touffu - Eyeliner marqué - Devant touffu - Côtés touffus - Côtés touffus - Brillant - Gants avec doigts - Longueur - Cheveux - Cheveux : Derrière - Cheveux : Devant - Cheveux : Côtés - Sens de la coiffure - Épaisseur cheveux - Épaisseur cheveux - Inclinaison - Vers la gauche - Vers la droite - Cheveux : Volume - Taille de la main - Plus - Longueur - Forme - Taille - Allongement - Talons - Forme des talons - Taille - Haut - Talons hauts - Haut - Haute - Haut et serré - Plus élevé - Longueur hanche - Largeur hanche - Survol - Rentré - Couleur ombre interne - Opacité ombre interne - Coin interne - Ombre de l'œil interne - Ombre interne - Longueur de la veste - Plis de la veste - Angle mâchoire - Saillie mâchoire - Mâchoire - Rapprochés - Bajoues - Angle du genou - Genoux rapprochés - Plus - Grandes mains - Raie à gauche - Longueur - Muscles - Moins - Moins - Moins - Moins - Moins - Moins - Moins - Moins - Moins - Moins - Moins ronde - Moins - Moins carrée - Moins - Moins - Plus léger - Fente labiale - Prof. fente labiale - Volume des lèvres - Rougeur des lèvres - Proportion des lèvres - Épaisseur - Largeur - Brillant à lèvres - Rouge à lèvres - Couleur du rouge à lèvres - Plus - Tête longue - Hanches longues - Jambes longues - Long cou - Longues couettes - Longue queue de cheval - Torse long - Bras longs - Pantalons amples - Chemise ample - Manches amples - Poignées d'amour - Bas - Talons bas - Bas - Basse - Bas et ample - Abaisser - Arête inférieure - Joue inférieure - Homme - Raie au milieu - Plus - Plus - Plus - Plus - Plus - Plus - Plus - Plus - Plus - Plus - Inférieure plus grosse - Plus - Plus - Plus - Plus - Plus - Plus - Plus - Supérieure plus grosse - Plus - Plus - Plus - Moustache - Coin de la bouche - Position - Mowhawk - Musclé - Longs - Vernis à ongles - Couleur du vernis - Moins - Arrière étroit - Devant étroit - Lèvres étroites - Naturel - Longueur du cou - Épaisseur du cou - Pas de blush - Pas d'eyeliner - Pas d'ombre à paupières - Pas de brillant à lèvres - Pas de rouge à lèvres - Pas de raie - Pas de vernis - Pas de rouge - Pas de spikes - Pas de blanc - Pas de rides - Normal plus bas - Normal plus haut - Nez à gauche - Nez à droite - Taille du nez - Épaisseur du nez - Angle bout du nez - Forme bout du nez - Largeur du nez - Division narines - Largeur narines - Opaque - Ouvert - Derrière ouvert - Devant ouvert - Ouvert à gauche - Ouvert à droite - Orange - Sorti - Couleur de l'ombre externe - Opacité de l'ombre externe - Coin externe - Ombre de l'œil externe - Ombre externe - Rentrée - Parties - Ongles vernis - Pâle - Entrejambe - Taille - Longueur - Taille - Plis - Raie - Séparation frange - Pectoraux - Pigmentation - Couettes - Rose - Plus rose - Platef. (hauteur) - Platef. (largeur) - Pointue - Talons pointus - Queue de cheval - Jupe bouffante - Œil gauche saillant - Œil droit saillant - Plus - Paup. gonflées - Couleur arc en ciel - Cheveux roux - Standard - Raie à droite - Teint rosé - Rond - Rougeur - Rouge - Texture - Culotte de cheval - Jambes maigres - Séparés - Creux - Coupe derrière - Visage - Front - Haut gauche décalé - Haut droit décalé - Dégagé derrière - Dégagé devant - Vers la gauche - Déplacement - Vers la droite - Chemise - Taille - Plis - Hauteur - Moins - Bras courts - Jambes courtes - Petit cou - Couettes courtes - Queue de cheval courte - Court - Torse court - Hanches courtes - Épaules - Mèches sur le côté - Favoris - Cheveux sur le côté - Cheveux sur le côté en bas - Cheveux sur le côté en haut - Cou maigre - Taille jupe - Longueur jupe - Front incliné - Longueur manche - Ampleur manche - Fente : Derrière - Fente : Devant - Fente : Gauche - Fente : Droite - Moins - Petites mains - Moins - Moins - Cheveux lisses - Longueur - Barbichette - Rares - Mèches en pointe - Carrée - Orteil carré - Écraser la tête - Allonger la tête - Saillante - Poitrine enfoncée - Yeux enfoncés - En arrière - Vers l'avant - Plus - Arrière - Avant - Talons épais - Cou épais - Orteil épais - Mince - Sourcils fins - Lèvres fines - Nez fin - Menton fin - Jambes serrées - Pantalons serrés - Chemise serrée - Jupe serrée - Manches serrées - Forme de l'orteil - Épaisseur orteil - Longueur du torse - Muscles du torse - Torse maigre - Séparés - Lisse - Sortie - Artificiel - Arête supérieure - Joue supérieure - Menton supérieur - Paupière sup. - En trompette - Très rouge - Hauteur taille - Ronde - Cheveux blancs - Plus - Derrière large - Devant large - Lèvres larges - Artificiel - Rides - Ajouter à mes repères - Modifier mon repère - En savoir plus sur l'emplacement actuel - Historique de mes emplacements - Acheter ce terrain - Chat vocal indisponible ici - Vol interdit - Pas de bousculades - Construction/placement d'objets interdit - Scripts interdits - Santé - Région de type Adulte - Région de type Modéré - Région de type Général - Les avatars à l'extérieur de cette parcelle ne peuvent pas voir ni entendre les avatars qui se trouvent à l'intérieur. - Les objets mobiles risquent de ne pas se comporter correctement dans cette région tant qu'elle n'est pas refigée. - La recherche de chemin dynamique n'est pas activée dans cette région. - [APP_NAME] - Mise à jour - Mise à jour de [APP_NAME]... - Installation de [APP_NAME]... - Le client [APP_NAME] est en train d'être mis à jour. Cela peut prendre un certain temps, merci de votre patience. - Mise à jour en cours... - Mise à jour en cours - Le téléchargement de la mise à jour a échoué - Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version sur www.secondlife.com. - L'installation de la mise à jour a échoué - Impossible de lancer le client - [APP_NAME] : transfert trop rapide des articles de [FROM_NAME] ; aperçu automatique désactivé pendant [TIME] secondes - [APP_NAME] : transfert trop rapide des articles ; aperçu automatique désactivé pendant [TIME] secondes - -- Archivage des IM activé -- - [NAME] est en train d'écrire... - (sans nom) - (Modéré : Voix désactivées par défaut) - Le chat écrit n'est pas disponible pour cet appel. - Votre chat écrit a été désactivé par un modérateur de groupe. - Cliquez ici pour envoyer un message instantané. - À - (Modérateur) - (Enregistrement : [LONG_TIMESTAMP]) - Pour afficher ce message, vous devez désactiver la case Seuls mes amis et groupes peuvent m'appeler ou m'envoyer un IM, sous Préférences/Confidentialité. - En ligne - Hors ligne - Utilisateur non connecté - le message sera enregistré et livré plus tard. - Utilisateur non connecté - l'inventaire a été enregistré - Votre appel a fait l'objet d'une réponse - Vous appelez. - Vous avez rejoint l'appel - Vous avez automatiquement refusé l'appel vocal quand le mode Ne pas déranger était activé. - [NAME] appelle. - En train de rejoindre l'appel... - Connecté(e), cliquez sur Quitter l'appel pour raccrocher - A quitté l'appel - Connexion en cours... - Chat à plusieurs - Conférence avec [AGENT_NAME] - Objet de l’inventaire [ITEM_NAME] offert - Dossier de l’inventaire [ITEM_NAME] offert - -Vous discutez avec un bot, [NAME]. Ne partagez pas d’informations personnelles. -En savoir plus sur https://second.life/scripted-agents. +peuvent être joints aux notes. - Faire glisser les objets de l'inventaire ici - Vous avez publié sur Facebook. - Vous avez publié sur Flickr. - Vous avez publié sur Twitter. - (Session IM inexistante) - Vous êtes le seul participant à cette session. - [NAME] est hors ligne. - Pour accepter ce chat vocal/vous connecter, cliquez sur le bouton [BUTTON NAME]. - Vous ignorez ce résident. Si vous lui envoyez un message, il ne sera plus ignoré. - Erreur lors de la requête, veuillez réessayer ultérieurement. - Erreur lors de la requête, veuillez réessayer ultérieurement. - Vous n'avez pas les droits requis. - La session a expiré - Vous n'avez pas ce pouvoir. - Vous n'avez pas ce pouvoir. - Vous n'êtes pas modérateur de session. - Un modérateur de groupe a désactivé votre chat écrit. - Un modérateur de groupe a désactivé votre chat écrit. - Impossible d'ajouter des participants à la session de chat avec [RECIPIENT]. - Impossible d'envoyer votre message à la session de chat avec [RECIPIENT]. - Impossible d'envoyer votre message à la session de chat avec [RECIPIENT]. - Erreur lors de la modération. - Vous avez été supprimé du groupe. - Vous avez été supprimé du groupe. - Vous ne pouvez plus participer à la session de chat. - [SOURCES] a dit quelque chose de nouveau - [SOURCES] ont dit quelque chose de nouveau - Expiration du délai d'initialisation de la session - Emplacement du domicile défini. - https://secondlife.com/destination/voice-island - https://secondlife.com/destination/voice-morphing-premium - [NAME] vous a payé [AMOUNT] L$ [REASON]. - [NAME] vous a payé [AMOUNT] L$ : [REASON] - [NAME] vous a payé [AMOUNT] L$. - Vous avez payé à [AMOUNT] L$ [REASON]. - Vous avez payé à [NAME] [AMOUNT] L$ : [REASON] - Vous avez payé [AMOUNT] L$. - Vous avez payé à [NAME] [AMOUNT] L$. - Vous avez payé à [AMOUNT] L$ [REASON]. - Votre paiement de [AMOUNT] L$ à [NAME] [REASON] a échoué. - Votre paiement de [AMOUNT] L$ à [NAME] a échoué : [REASON] - Votre paiement de [AMOUNT] L$ a échoué. - Votre paiement de [AMOUNT] L$ à [NAME] a échoué. - Votre paiement de [AMOUNT] L$ [REASON] a échoué. - pour l'article suivant : [ITEM] - pour une parcelle de terrain - pour un pass d'accès au terrain - pour une cession de terrain - pour créer un groupe - pour rejoindre un groupe - pour charger - pour publier une petite annonce - Donner [AMOUNT] L$ - Le chargement coûte [AMOUNT] L$ - Cela coûte [AMOUNT] L$ - Achat du terrain sélectionné pour [AMOUNT] L$ - Cet objet coûte [AMOUNT] L$ - Tous - Officiers - Propriétaires - En ligne - Chargement... - -du rapport d'infraction - Nouvelle silhouette - Nouvelle peau - Nouveaux cheveux - Nouveaux yeux - Nouvelle chemise - Nouveau pantalon - Nouvelles chaussures - Nouvelles chaussettes - Nouvelle veste - Nouveaux gants - Nouveau débardeur - Nouveau caleçon - Nouvelle jupe - Nouvel alpha - Nouveau tatouage - Nouvel environnement universel - Nouvelles propriétés physiques - Objet à porter non valide - Nouveau geste - Nouveau script - Nouvelle note - Nouveau dossier - Contenus - Geste - Gestes masculins - Gestes féminins - Autres gestes - Gestes liés à la parole - Gestes communs - Homme - Demander pardon - Homme - Get lost - Homme - Envoyer un baiser - Homme - Hou ! - Homme - Ennui - Homme - Hé ! - Homme - Rire - Homme - Dégoût - Homme - Hausser les épaules - Homme - Tirer la langue - Homme - Ouah ! - Femme - Glousser - Femme - Pleurer - Femme - Gêne - Femme - Demander pardon - Femme - Get lost - Femme - Envoyer un baiser - Femme - Hou ! - Femme - Ennui - Femme - Hé ! - Femme - Hey baby - Femme - Rire - Femme - Looking good - Femme - Over here - Femme - Please - Femme - Dégoût - Femme - Hausser les épaules - Femme - Tirer la langue - Femme - Ouah ! - Nouveau cycle du jour - Nouvelle eau - Nouveau ciel - /s'incliner - /applaudir - /compter - /éteindre - /vatefairevoir - /montrersesmuscles - /non - /non ! - /papier - /memontrerdudoigt - /montrerl'autredudoigt - /pierre - /ciseaux - /fumer - /bailler - /siffler - /oui - /oui ! - absent - danse1 - danse2 - danse3 - danse4 - danse5 - danse6 - danse7 - danse8 - [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt] - aucun/aucun - Impossible de charger des images de taille supérieure à [WIDTH]*[HEIGHT] - Taille max. de la photo de la tenue : [WIDTH]*[HEIGHT]. Redimensionnez l’image ou utilisez-en une autre. - Taille max. de la photo de la tenue : [WIDTH]*[HEIGHT]. Sélectionnez une autre texture. - Impossible de vérifier les dimensions de la photo. Attendez que la taille de la photo s’affiche dans le sélecteur. - - Malgré nos efforts, une erreur inattendue s’est produite. - -Veuillez vous reporter à http://status.secondlifegrid.net afin de déterminer si un problème connu existe avec ce service. - Si le problème persiste, vérifiez la configuration de votre réseau et de votre pare-feu. - Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday - Sun:Mon:Tue:Wed:Thu:Fri:Sat - January:February:March:April:May:June:July:August:September:October:November:December - Jan:Feb:Mar:Apr:May:Jun:Jul:Aug:Sep:Oct:Nov:Dec - [MDAY] - AM - PM - [AMOUNT] US$ - Bannissement de groupe - Inscription - Rôles - Identité du groupe - Gestion des parcelles - Identité des parcelles - Paramètres des parcelles - Pouvoirs sur les parcelles - Accès aux parcelles - Contenu des parcelles - Gestion des objets - Comptabilité - Notices - Chat - Base - Premium - Premium Plus - Supprimer les articles sélectionnés ? - Supprimer l'article sélectionné ? - Cette tenue ne contient aucun article. - Sélectionnez un éditeur à l'aide du paramètre ExternalEditor. - Éditeur externe spécifié introuvable. + + Recherche... + + + Aucun résultat. + + + En cours d'extraction... + + + Notes de version + + + https://releasenotes.secondlife.com/viewer/ + + + Chargement... + + + (personne) + + + (en attente) + + + (multiple) + + + (aucun) + + + Aucune erreur + + + Requête de l'actif : échec + + + Requête de l'actif : fichier inexistant + + + Requête de l'actif : actif introuvable dans la base de données + + + Fin du ficher + + + Impossible d'ouvrir le fichier + + + Fichier introuvable + + + Délai d'attente du transfert du fichier dépassé + + + Disparition du circuit + + + Il y a une différence de prix entre le client et le serveur + + + Statut inconnu + + + Service inaccessible. + + + Le serveur rencontres des difficultés imprévues. + + + Services non disponible ou la durée du chargement est dépassée. + + + Erreur dans la demande de chargement. Veuillez consulter le site : +http://secondlife.com/support pour vous aider à résoudre ce problème. + + + Échec de la validation pour l'importation des paramètres [NAME] + + + Impossible d'ouvre le fichier [FILE] + + + Impossible d'ouvre le fichier [FILE] + + + Impossible de traduit les paramètres windlight hérités [NAME] + + + texture + + + son + + + carte de visite + + + repère + + + script (ancienne version) + + + habits + + + objet + + + note + + + dossier + + + racine + + + script LSL2 + + + bytecode LSL + + + texture tga + + + partie du corps + + + photo + + + Objets trouvés + + + image targa + + + Corbeille + + + image jpeg + + + animation + + + geste + + + simstate + + + favori + + + lien + + + lien du dossier + + + paramètres + + + maillage + + + (Apparence en cours de modification) + + + Absent + + + Ne pas déranger + + + Bloqué(e) + + + Effrayé + + + En colère + + + Absent + + + Salto arrière + + + Rire en se tenant le ventre + + + Grand sourire + + + Envoyer un baiser + + + Bailler d'ennui + + + S'incliner + + + Applaudir + + + Révérence de cour + + + Pleurer + + + Danse 1 + + + Danse 2 + + + Danse 3 + + + Danse 4 + + + Danse 5 + + + Danse 6 + + + Danse 7 + + + Danse 8 + + + Mépris + + + Boire + + + Gêne + + + Désapprobation + + + Victoire + + + Yoga + + + Froncer les sourcils + + + Impatient + + + Sauter de joie + + + Va te faire voir ! + + + Envoyer un baiser + + + Rire + + + Montrer ses muscles + + + Non (mécontent) + + + Non + + + Na na na na nère + + + Gauche-droite + + + Bouche ouverte + + + Paix + + + Montrer quelqu'un du doigt + + + Se montrer du doigt + + + Gauche + + + Droite + + + Compter (pierre-papier-ciseaux) + + + Papier (pierre-papier-ciseaux) + + + Pierre (pierre-papier-ciseaux) + + + Ciseaux (pierre-papier-ciseaux) + + + Dégoût + + + Coup de pied circulaire + + + Triste + + + Salut + + + Crier + + + Hausser les épaules + + + Sourire + + + Fumer, immobile + + + Fumer, prendre une bouffée + + + Fumer, jeter son mégot + + + Surprise + + + Coup d'épée + + + Caprice + + + Tirer la langue + + + Faire signe + + + Chuchoter + + + Siffler + + + Clin d'œil + + + Clin d'œil (Hollywood) + + + Soucis + + + Oui (Joie) + + + Oui + + + Multiples + + + Utiliser la texture + + + Faites glisser le curseur sur l'axe + + + pour le fixer sur la grille + + + Chargement... + + + Hors ligne + + + [AREA] m² [PRICE] L$ + + + Aucun résultat. + + + OK + + + Fichier incomplet + + + Impossible de trouver ROOT ou JOINT. + + + Chat près de moi + + + (Chat près de moi) + + + chuchote : + + + crie : + + + Connexion au chat vocal du Monde en cours… + + + Connecté(e) + + + Voix non disponible à l'endroit où vous êtes + + + Déconnecté du chat vocal + + + Vous allez maintenant être reconnecté(e) au chat vocal près de vous. + + + '[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu le droit de : [PERMISSIONS]. + + + '[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n'a pas reçu le droit de : [PERMISSIONS]. + + + Si vous autorisez un accès à votre compte, vous autorisez également l'objet à : + + + Débiter vos Linden dollars (L$) + + + Utiliser vos touches de commandes + + + Reconfigurer vos touches de commandes + + + Animer votre avatar + + + Attacher à votre avatar + + + Passer l'objet dans le domaine public (sans propriétaire) + + + Lier et délier d'autres objets + + + Créer et supprimer des liens avec d'autres objets + + + Modifier ses droits + + + Suivre votre caméra + + + Contrôler votre caméra + + + Vous téléporter + + + Forcez votre avatar à s’asseoir + + + Changer vos paramètres d'environnement + + + Pas connecté(e) + + + (Vous) + + + + Supprimer les alertes lors de la gestion des listes d'accès aux domaines + + + Remplacer vos animations par défaut + + + Renvoyer les objets de votre part + + + (inconnu) + + + Général + + + Modéré + + + Adulte + + + Hors ligne + + + Inconnu + + + (inconnu) + + + Domaine / Région entière + + + Domaine / Homestead + + + Continent / Homestead + + + Continent / Région entière + + + Tous fichiers + + + Sons + + + Animations + + + Images + + + Enregistrer + + + Charger + + + Images Targa + + + Images Bitmap + + + Images PNG + + + Images Targa ou PNG + + + Fichier de film AVI + + + Fichier d'animation XAF + + + Fichier XML + + + Fichier RAW + + + Images compressées + + + Charger des fichiers + + + Choisir le répertoire + + + Scripts + + + Dictionnaires + + + Silhouette + + + Peau + + + Cheveux + + + Yeux + + + Chemise + + + Pantalon + + + Chaussures + + + Chaussettes + + + Veste + + + Gants + + + Débardeur + + + Caleçon + + + Jupe + + + Alpha + + + Tatouage + + + Universel + + + Propriétés physiques + + + non valide + + + aucun + + + Chemise non portée + + + Pantalon non porté + + + Chaussures non portées + + + Chaussettes non portées + + + Veste non portée + + + Gants non portés + + + Débardeur non porté + + + Caleçon non porté + + + Jupe non portée + + + Alpha non porté + + + Tatouage non porté + + + Universel non porté + + + Propriétés physiques non portées + + + non valide + + + Créer une nouvelle silhouette + + + Créer une nouvelle peau + + + Créer de nouveaux cheveux + + + Créer de nouveaux yeux + + + Créer une nouvelle chemise + + + Créer un nouveau pantalon + + + Créer de nouvelles chaussures + + + Créer de nouvelles chaussettes + + + Créer une nouvelle veste + + + Créer de nouveaux gants + + + Créer un nouveau débardeur + + + Créer un nouveau caleçon + + + Créer une nouvelle jupe + + + Créer un nouvel alpha + + + Créer un nouveau tatouage + + + Créer un nouvel environnement universel + + + Créer de nouvelles propriétés physiques + + + non valide + + + Nouv. [WEARABLE_ITEM] + + + Suivant + + + OK + + + Note au groupe + + + Notices au groupe + + + Envoyée par + + + Pièce(s) jointe(s) : + + + Consultez les notices précédentes ou choisissez de ne plus recevoir ces messages ici. + + + Ouvrir pièce jointe + + + Enregistrer la pièce jointe + + + Offre de téléportation + + + De nouvelles notifications sont arrivées en votre absence. + + + Vous avez %d notification(s) supplémentaire(s) + + + Bras droit + + + Tête + + + Bras gauche + + + Jambe gauche + + + Torse + + + Jambe droite + + + Squelette amélioré + + + Faible + + + Moyen + + + Élevé + + + Appuyez sur ESC pour quitter la vue subjective + + + Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/[SEARCH_TERM] Rechercher]. + + + Avez-vous trouvé ce que vous cherchiez ? Essayez [secondlife:///app/inventory/filters Show filters]. + + + Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/[SEARCH_TERM] Rechercher]. + + + Faites glisser un repère ici pour l'ajouter à vos Favoris. + + + Aucun article trouvé. Vérifiez l'orthographe de votre chaîne de recherche et réessayez. + + + Vous n'avez pas de copie de cette texture dans votre inventaire + + + Les achats que vous avez effectués sur la Place du marché s'affichent ici. Vous pouvez alors les faire glisser vers votre inventaire afin de les utiliser. + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ + + + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more + + + Ouvrir la fenêtre avec les options Jeu + + + Exécuter le geste sélectionné dans le monde virtuel. + + + Ouvrir la fenêtre avec les options Jeu + + + Tout le monde peut vendre des articles sur la Place du marché. + + + + Pour devenir vendeur, vous devez [[MARKETPLACE_CREATE_STORE_URL] créer une boutique sur la Place du marché]. + + + Votre boîte d'envoi est vide. + + + + Pour mettre des dossiers en vente sur la [[MARKETPLACE_DASHBOARD_URL] Place du marché], faites-les glisser vers cette zone et cliquez sur "Envoyer vers la Place du marché". + + + Initialisation de la Place du marché... + + + Nous sommes en train d'accéder à votre compte dans la [[MARKETPLACE_CREATE_STORE_URL] boutique de la Place du marché]. + + + Erreurs de la Place du marché. + + + La [[MARKETPLACE_CREATE_STORE_URL] boutique de la Place du marché] renvoie des erreurs. + + + Une erreur est survenue lors de l’ouverture des annonces de la Place du marché. +Si vous continuez de recevoir ce message, contactez l’assistance Second Life à http://support.secondlife.com pour obtenir de l’aide. + + + Votre dossier Annonces de la Place du marché est vide. + + + Pour mettre des dossiers en vente sur la [[MARKETPLACE_DASHBOARD_URL] Place du marché], faites-les glisser vers cette zone. + + + ( [ITEMS_COUNT] Articles ) + + + le dossier de stock doit être contenu dans un dossier de version + + + : Erreur : tous les articles d'un dossier de stock doivent être non reproductibles et de même type + + + : Erreur : un dossier de stock ne peut pas contenir de sous-dossiers + + + : Avertissement : le dossier ne contient aucun article + + + : Avertissement : création du dossier de stock + + + : Avertissement : création du dossier de version + + + : Avertissement : déplacement d'articles + + + : Avertissement : contenu du dossier transféré vers le dossier de stock, suppression du dossier vide + + + : Erreur : les articles non reproductibles doivent être contenus dans un dossier de stock + + + : Avertissement : les articles doivent être contenus dans un dossier de version + + + : Erreur : + + + : Avertissement : + + + : Avertissement : le dossier de version doit contenir au moins 1 article + + + : Avertissement : le dossier de stock doit contenir au moins 1 article + + + Pas d'erreur ni d'avertissement à signaler + + + Aucune erreur + + + Erreur : + + + Avant d'envoyer des articles vers la Place du marché, vous devez vous configurer comme vendeur (gratuit). + + + Impossible de déplacer l'article dans ce dossier. + + + Cet article ne peut pas être vendu sur la Place du marché. + + + no Mkt ID + + + publié + + + actif + + + max. + + + stock + + + rupture de stock + + + mise à jour... + + + Les frais dépendent de votre niveau d'abonnement. Les niveaux supérieurs sont soumis à des frais moins élevés. [https://secondlife.com/my/account/membership.php? En savoir plus] + + + Points de repère ouverts + + + Sans contrainte + + + + + + + + + chargement des contenus en cours... + + + Aucun contenu + + + + + + Oui + + + Non + + + + + + + + + + + + + + + + + + + + + + + + + + Mon inventaire + + + Bibliothèque + + + Textures + + + Sons + + + Cartes de visite + + + Repères + + + Scripts + + + Habits + + + Objets + + + Notes + + + Nouveau dossier + + + Inventaire + + + Images non compressées + + + Parties du corps + + + Corbeille + + + Albums photo + + + Objets trouvés + + + Sons non compressés + + + Animations + + + Gestes + + + Mes Favoris + + + Mes Favoris + + + Mes favoris + + + Mes favoris + + + Tenue actuelle + + + Tenues initiales + + + Mes tenues + + + Accessoires + + + Maillages + + + Articles reçus + + + Boîte d'envoi vendeur + + + Amis + + + Tout + + + Aucun élément attaché porté + + + Éléments attachés ([COUNT] emplacements restants) + + + Acheter + + + Acheter des L$ + + + Pierre + + + Métal + + + Verre + + + Bois + + + Chair + + + Plastique + + + Caoutchouc + + + Léger + + + Maj- + + + Ctrl + + + Poitrine + + + Crâne + + + Épaule gauche + + + Épaule droite + + + Main gauche + + + Main droite + + + Pied gauche + + + Pied droit + + + Colonne + + + Bassin + + + Bouche + + + Menton + + + Oreille gauche + + + Oreille droite + + + Globe oculaire gauche + + + Globe oculaire droit + + + Nez + + + Bras D + + + Avant-bras D + + + Bras G + + + Avant-bras G + + + Hanche droite + + + Cuisse D + + + Jambe D + + + Hanche gauche + + + Cuisse G + + + Jambe G + + + Estomac + + + Pectoral gauche + + + Pectoral droit + + + Cou + + + Centre de l'avatar + + + Annulaire gauche + + + Annulaire droit + + + Base de la queue + + + Bout de la queue + + + Aile gauche + + + Aile droite + + + Mâchoire + + + Oreille gauche différente + + + Oreille droite différente + + + Œil gauche différent + + + Œil droit différent + + + Langue + + + Aine + + + Pied arrière gauche + + + Pied arrière droit + + + Point d'attache non valide + + + Erreur : article manquant + + + Erreur : article de base manquant + + + Erreur : l'objet est dans une tenue actuelle, mais il n'est pas attaché + + + [AGEYEARS] [AGEMONTHS] + + + [AGEYEARS] + + + [AGEMONTHS] + + + [AGEWEEKS] + + + [AGEDAYS] + + + Inscrit aujourd'hui + + + Désormais, tout le monde peut vous voir. + + + Vous risquez de ne pas être rendu par tous les gens qui vous entourent. + + + Vous risquez de ne pas être rendu par plus de la moitié des gens qui vous entourent. + + + Vous risquez de ne pas être rendu par la plupart des gens qui vous entourent. + + + Vous risquez de n’être rendu par aucune des personnes qui vous entourent. + + + Votre HUD + + + [OBJ_NAME] (porté sur [JNT_NAME]) + + + [HUD_DETAILS] utilise beaucoup de mémoire textures + + + [HUD_DETAILS] contient beaucoup de textures et d’objets volumineux + + + [HUD_DETAILS] contient beaucoup de textures volumineuses + + + [HUD_DETAILS] contient trop d’objets + + + [HUD_DETAILS] contient trop de textures + + + [COUNT] an + + + [COUNT] ans + + + [COUNT] ans + + + [COUNT] mois + + + [COUNT] mois + + + [COUNT] mois + + + [COUNT] semaine + + + [COUNT] semaines + + + [COUNT] semaines + + + [COUNT] jour + + + [COUNT] jours + + + [COUNT] jours + + + [COUNT] membre + + + [COUNT] membres + + + [COUNT] membres + + + Résident + + + Essai + + + Membre originaire + + + Employé(e) de Linden Lab + + + Infos de paiement utilisées + + + Infos de paiement enregistrées + + + Aucune info de paiement enregistrée + + + Personne dont l'âge a été vérifié + + + Personne dont l'âge n'a pas été vérifié + + + Centre 2 + + + En haut à droite + + + En haut + + + En haut à gauche + + + Centre + + + En bas à gauche + + + Bas + + + En bas à droite + + + Téléchargé, compilation en cours + + + Service de compilation de script indisponible. + + + Script introuvable sur le serveur. + + + Problème lors du téléchargement + + + Droits insuffisants pour télécharger un script. + + + Droits insuffisants pour + + + Échec du téléchargement, erreur inconnue + + + En train d’ignorer le script [SCRIPT] avec l’expérience [EXPERIENCE]. + + + Recompilation - progrès + + + recompiler + + + Réinitialiser les progrès + + + réinitialiser + + + Lancer + + + lancer + + + Arrêter + + + arrêter + + + Compilation réussie ! + + + Compilation réussie, enregistrement en cours... + + + Enregistrement terminé. + + + Échec du chargement de fichier : + + + Script (objet hors de portée) + + + Script (supprimé de l’inventaire) + + + Objet [OBJECT] appartenant à [OWNER] + + + aucun + + + + (Inconnu) + + + + + [day,datetime,utc]/[mthnum,datetime,utc]/[year,datetime,utc] + + + + + Solde + + + Crédits + + + Débits + + + Total + + + Aucune donnée trouvée pour le groupe + + + domaine parent + + + continent + + + teen + + + n'importe qui + + + erreur + + + tous les domaines appartenant à [OWNER] + + + tous les domaines vous appartenant + + + tous les domaines que vous gérez pour [OWNER] + + + Toujours autorisé : ([ALLOWEDAGENTS], max [MAXACCESS]) + + + Groupes toujours autorisés : [ALLOWEDGROUPS], max [MAXACCESS]) + + + Toujours interdits : ([BANNEDAGENTS], max. [MAXBANNED]) + + + Toujours autorisé + + + Toujours interdit + + + tous les domaines + + + domaines gérés + + + ce domaine + + + et [EXTRA_COUNT] plus + + + Mémoire des scripts de parcelles + + + Parcelles répertoriées : [PARCELS] + + + Mémoire utilisée : [COUNT] Ko sur [MAX] ; [AVAILABLE] Ko disponibles + + + Mémoire utilisée : [COUNT] Ko + + + URL des scripts de parcelles + + + URL utilisées : [COUNT] sur [MAX] ; [AVAILABLE] disponible(s) + + + URL utilisées : [COUNT] + + + Une erreur est survenue pendant la requête d'informations. + + + Aucune parcelle sélectionnée + + + Erreur : les informations de script ne sont disponibles que dans votre région actuelle. + + + Extraction des informations en cours... + + + Vous n'avez pas le droit d'examiner cette parcelle. + + + Assis(e) dessus + + + Poitrine + + + Crâne + + + Épaule gauche + + + Épaule droite + + + Main gauche + + + Main droite + + + Pied gauche + + + Pied droit + + + Colonne vertébrale + + + Bassin + + + Bouche + + + Menton + + + Oreille gauche + + + Oreille droite + + + Œil gauche + + + Œil droit + + + Nez + + + Bras droit + + + Avant-bras droit + + + Bras gauche + + + Avant-bras gauche + + + Hanche droite + + + Cuisse droite + + + Jambe droite + + + Hanche gauche + + + Cuisse gauche + + + Jambe gauche + + + Estomac + + + Pectoral gauche + + + Pectoral droit + + + HUD centre 2 + + + HUD en haut à droite + + + HUD en haut au centre + + + HUD en haut à gauche + + + HUD centre 1 + + + HUD en bas à gauche + + + HUD en bas + + + HUD en bas à droite + + + Cou + + + Centre de l'avatar + + + Annulaire gauche + + + Annulaire droit + + + Base de la queue + + + Bout de la queue + + + Aile gauche + + + Aile droite + + + Mâchoire + + + Oreille gauche différente + + + Oreille droite différente + + + Œil gauche différent + + + Œil droit différent + + + Langue + + + Aine + + + Pied arrière gauche + + + Pied arrière droit + + + Ligne [LINE], colonne [COLUMN] + + + [COUNT] trouvé(s) + + + [hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt] + + + [mthnum,datetime,slt]/[day,datetime,slt] + + + Contenu de l'objet + + + Nouveau script + + + Ce résident a activé Ne pas déranger et verra votre message plus tard. + + + (par nom) + + + (résident) + + + (objet) + + + (groupe) + + + (externe) + + + Il n'y a aucun règlement pour ce domaine. + + + Il n'y a aucun règlement pour ce domaine. Le terrain sur ce domaine est vendu par le propriétaire, non par Linden Lab. Pour en savoir plus, veuillez contacter le propriétaire. + + + + + + Propriété du groupe + + + Public + + + Réglages locaux + + + Réglages de la région + + + Cette région ne prend pas en charge les paramètres environnementaux. + + + Soleil + + + Lune + + + Éclat + + + Bruit du nuage + + + Carte normale + + + Transparent + + + Clics : [TELEPORT] téléportation, [MAP] carte, [PROFILE] profil + + + (mise à jour après la publication) + + + Vous n'avez pas créé de favoris ni de petites annonces Cliquez sur le bouton Plus pour créer un favori ou une petite annonce. + + + Vous n'avez pas créé de favoris Cliquer sur le bouton Nouveau pour créer un favori + + + Vous n'avez pas créé de petites annonces Cliquer sur le bouton Nouveau pour créer une petite annonce. + + + L'utilisateur n'a ni favoris ni petites annonces. + + + L'utilisateur n'a pas de favoris + + + L'utilisateur n'a pas de petites annonces + + + Chargement... + + + Prévisualiser + + + Propriétés + + + Un objet appelé + + + possédé par le groupe + + + possédé par un groupe inconnu + + + possédé par + + + possédé par un résident inconnu + + + vous a donné + + + Vous refusez l'offre [DESC] de <nolink>[NAME]</nolink>. + + + Total + + + acheté + + + vous a payé + + + payé + + + a acheté un pass à + + + a payé des frais pour un événement + + + a payé un prix pour un événement + + + Solde + + + Crédits + + + Débits + + + [weekday,datetime,utc] [day,datetime,utc] [mth,datetime,utc] [year,datetime,utc] + + + Objets acquis + + + Annuler + + + Le chargement de [NAME] coûte [AMOUNT] L$ + + + Cet achat coûte [AMOUNT] L$ + + + Extension de fichier inconnue .%s +.wav, .tga, .bmp, .jpg, .jpeg, ou .bvh acceptés + + + Ignorer + + + Ignorer + + + Ne plus ignorer + + + Ne plus ignorer + + + Ajouter à mes repères... + + + Modifier mon repère... + + + ⌃ + + + ⌘ + + + ⌥ + + + ⇧ + + + Ctrl+ + + + Alt+ + + + Maj+ + + + Fichier enregistré + + + Réception + + + Matin + + + Après-midi + + + PST + + + PDT + + + Avant + + + Gauche + + + Droite + + + Arrière + + + Nord + + + Sud + + + Ouest + + + Est + + + Haut + + + Bas + + + Toutes catégories + + + Shopping + + + Terrains à louer + + + Propriétés à louer + + + Divertissements + + + Nouveaux produits + + + Emplois + + + Offres + + + Services + + + Divers + + + Aucun + + + Appartenant aux Lindens + + + Adulte + + + Arts et culture + + + Business + + + Éducation + + + Jeux + + + Favoris + + + Accueil pour les nouveaux + + + Parcs et nature + + + Résidentiel + + + Phase + + + Autre + + + Location + + + Aucun + + + Vous + + + : + + + , + + + ... + + + *** + + + ( + + + ) + + + . + + + ' + + + --- + + + Médias multiples + + + Lire/pauser le média + + + http://www.intel.com/p/fr_FR/support/detect/graphics + + + http://www.nvidia.com/Download/index.aspx?lang=fr + + + http://support.amd.com/us/Pages/AMDSupportHub.aspx + + + Une erreur est survenue lors de la lecture de la ligne de commande. +Merci de consulter : http://wiki.secondlife.com/wiki/Client_parameters +Erreur : + + + [APP_NAME] - Utilisation de la ligne de commande : + + + [APP_NAME] ne peut accéder à un fichier requis. + +Cela vient du fait que quelqu'un a ouvert plusieurs copies ou que votre système pense qu'un fichier est ouvert. +Si ce message persiste, veuillez redémarrer votre ordinateur. +Si le problème persiste, vous devrez peut-être complètement désinstaller puis réinstaller [APP_NAME]. + + + Erreur fatale + + + [APP_NAME] nécessite un microprocesseur AltiVec (version G4 ou antérieure). + + + [APP_NAME] est déjà en cours d'exécution. +Vérifiez si une version minimisée du programme apparaît dans votre barre de tâches. +Si ce message persiste, redémarrez votre ordinateur. + + + [APP_NAME] semble avoir crashé lors de l'utilisation précédente. +Voulez-vous envoyer un rapport de crash ? + + + Notification + + + [APP_NAME] ne peut détecter DirectX 9.0b ou une version supérieure. +[APP_NAME] utilise DirectX pour détecter les matériels et/ou les pilotes qui ne sont pas à jour et peuvent causer des problèmes de stabilité, de performance ou des plantages. Bien que vous puissiez utiliser [APP_NAME] sans DirectX, nous vous recommandons de l'utiliser avec DirectX 9.0b. + +Voulez-vous continuer ? + + + Avertissement + + + Les mises à jour automatiques n'existent pas encore pour Linux. +Veuillez télécharger la dernière version sur www.secondlife.com. + + + RegisterClass a échoué + + + Erreur + + + Impossible d'ouvrir le mode plein écran à [WIDTH] x [HEIGHT]. +Utilisation du mode fenêtré. + + + Erreur de fermeture lors de la destruction de la fenêtre (DestroyWindow() a échoué) + + + Erreur de fermeture + + + Impossible de créer le contexte GL + + + Impossible de trouver le format pixel approprié + + + Impossible de trouver la description du format pixel + + + [APP_NAME] nécessite True Color (32 bits) pour s'exécuter. +Accédez aux paramètres d'affichage de votre ordinateur et réglez le mode couleur sur 32 bits. + + + [APP_NAME] ne peut pas s'exécuter, car il n'y pas de canal alpha 8 bits accessible. En général, ceci vient de problèmes avec le pilote de la carte vidéo. +Assurez-vous d'avoir installé le pilote de carte vidéo le plus récent possible. +Assurez-vous aussi que votre écran est réglé sur True Color (32 bits) sous Panneau de configuration > Affichage > Paramètres. +Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. + + + Impossible de trouver le format pixel approprié + + + Impossible de créer le contexte de rendu GL + + + Impossible d'activer le contexte de rendu GL + + + [APP_NAME] ne peut pas s'exécuter car les pilotes de votre carte vidéo n'ont pas été installés correctement, ne sont pas à jour, ou sont pour du matériel non pris en charge. Assurez-vous d'avoir des pilotes de cartes vidéos récents, et même si vous avez les plus récents, réinstallez-les. + +Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. + + + Peu + + + Tout blancs + + + Grand yeux + + + Arqués + + + Longueur des bras + + + Attachés + + + Lobes + + + Mèches de derrière + + + Plus + + + Frange + + + Yeux perçants + + + Taille du ventre + + + Plus + + + Grosses fesses + + + Volume : Derrière + + + Volume : Devant + + + Volume : Haut + + + Plus + + + Gros pectoraux + + + Spikes + + + Noir + + + Blond + + + Cheveux blonds + + + Blush + + + Couleur du blush + + + Opacité du blush + + + Contour du corps + + + Graisse + + + Grains de beauté + + + Plus + + + Épaisseur du corps + + + Moins + + + Jambes arquées + + + Hauteur des seins + + + Clivage + + + Taille des seins + + + Arête du nez + + + Large + + + Taille du front + + + Yeux globuleux + + + Yeux globuleux + + + En bulbe + + + Nez en bulbe + + + Masse des seins + + + Lissage des seins + + + Gravité des seins + + + Résistance de l'air sur les seins + + + Effet max. + + + Élasticité + + + Amplification + + + Amortissement + + + Effet max. + + + Élasticité + + + Amplification + + + Amortissement + + + Effet max. + + + Élasticité + + + Amplification + + + Amortissement + + + Masse du ventre + + + Lissage du ventre + + + Gravité du ventre + + + Résistance de l'air sur le ventre + + + Effet max. + + + Élasticité + + + Amplification + + + Amortissement + + + Masse des fesses + + + Lissage des fesses + + + Gravité des fesses + + + Résistance de l'air sur les fesses + + + Effet max. + + + Élasticité + + + Amplification + + + Amortissement + + + Effet max. + + + Élasticité + + + Amplification + + + Amortissement + + + Sourcils touffus + + + Beaucoup + + + Taille des fesses + + + Gravité des fesses + + + Jupe gonflante + + + Pas gonflante + + + Plus gonflante + + + Moins + + + Pommettes + + + Taille de la poitrine + + + Angle du menton + + + Fente du menton + + + Favoris + + + Profondeur + + + Menton lourd + + + Menton rentré + + + Menton sorti + + + Menton-cou + + + Clair + + + Fendu + + + Yeux rapprochés + + + Fermé(s) + + + Fermé à l'arrière + + + Fermé devant + + + Fermé à gauche + + + Fermé à droite + + + Mini + + + Col arrière + + + Col devant + + + Coin vers le bas + + + Coin vers le haut + + + Fripée + + + Déviation du nez + + + Jambes + + + Sombre + + + Vert foncé + + + Plus foncé + + + Profonde + + + Talons par défaut + + + Dense + + + Double menton + + + Pointant vers le bas + + + Maxi + + + Angle de l'oreille + + + Taille + + + Extrémités + + + Proéminence + + + Cernes + + + Couleur des yeux + + + Profondeur + + + Clarté + + + Ouverture + + + Œil proéminent + + + Taille de l'œil + + + Espacement + + + Arc + + + Épaisseur sourcils + + + Hauteur + + + Direction + + + Taille + + + Longueur des cils + + + Eyeliner + + + Couleur de l'eyeliner + + + Yeux globuleux + + + Visage + + + Définition + + + Yeux écartés + + + Lèvres épaisses + + + Femme + + + Sans doigts + + + Doigts + + + Jambes larges + + + Moins + + + Fesses plates + + + Tête plate + + + Orteil plat + + + Pointure + + + Angle du front + + + Front lourd + + + Tâches de rousseur + + + Mèches de devant + + + Arrière touffu + + + Eyeliner marqué + + + Devant touffu + + + Côtés touffus + + + Côtés touffus + + + Brillant + + + Gants avec doigts + + + Longueur + + + Cheveux + + + Cheveux : Derrière + + + Cheveux : Devant + + + Cheveux : Côtés + + + Sens de la coiffure + + + Épaisseur cheveux + + + Épaisseur cheveux + + + Inclinaison + + + Vers la gauche + + + Vers la droite + + + Cheveux : Volume + + + Taille de la main + + + Plus + + + Longueur + + + Forme + + + Taille + + + Allongement + + + Talons + + + Forme des talons + + + Taille + + + Haut + + + Talons hauts + + + Haut + + + Haute + + + Haut et serré + + + Plus élevé + + + Longueur hanche + + + Largeur hanche + + + Survol + + + Rentré + + + Couleur ombre interne + + + Opacité ombre interne + + + Coin interne + + + Ombre de l'œil interne + + + Ombre interne + + + Longueur de la veste + + + Plis de la veste + + + Angle mâchoire + + + Saillie mâchoire + + + Mâchoire + + + Rapprochés + + + Bajoues + + + Angle du genou + + + Genoux rapprochés + + + Plus + + + Grandes mains + + + Raie à gauche + + + Longueur + + + Muscles + + + Moins + + + Moins + + + Moins + + + Moins + + + Moins + + + Moins + + + Moins + + + Moins + + + Moins + + + Moins + + + Moins ronde + + + Moins + + + Moins carrée + + + Moins + + + Moins + + + Plus léger + + + Fente labiale + + + Prof. fente labiale + + + Volume des lèvres + + + Rougeur des lèvres + + + Proportion des lèvres + + + Épaisseur + + + Largeur + + + Brillant à lèvres + + + Rouge à lèvres + + + Couleur du rouge à lèvres + + + Plus + + + Tête longue + + + Hanches longues + + + Jambes longues + + + Long cou + + + Longues couettes + + + Longue queue de cheval + + + Torse long + + + Bras longs + + + Pantalons amples + + + Chemise ample + + + Manches amples + + + Poignées d'amour + + + Bas + + + Talons bas + + + Bas + + + Basse + + + Bas et ample + + + Abaisser + + + Arête inférieure + + + Joue inférieure + + + Homme + + + Raie au milieu + + + Plus + + + Plus + + + Plus + + + Plus + + + Plus + + + Plus + + + Plus + + + Plus + + + Plus + + + Plus + + + Inférieure plus grosse + + + Plus + + + Plus + + + Plus + + + Plus + + + Plus + + + Plus + + + Plus + + + Supérieure plus grosse + + + Plus + + + Plus + + + Plus + + + Moustache + + + Coin de la bouche + + + Position + + + Mowhawk + + + Musclé + + + Longs + + + Vernis à ongles + + + Couleur du vernis + + + Moins + + + Arrière étroit + + + Devant étroit + + + Lèvres étroites + + + Naturel + + + Longueur du cou + + + Épaisseur du cou + + + Pas de blush + + + Pas d'eyeliner + + + Pas d'ombre à paupières + + + Pas de brillant à lèvres + + + Pas de rouge à lèvres + + + Pas de raie + + + Pas de vernis + + + Pas de rouge + + + Pas de spikes + + + Pas de blanc + + + Pas de rides + + + Normal plus bas + + + Normal plus haut + + + Nez à gauche + + + Nez à droite + + + Taille du nez + + + Épaisseur du nez + + + Angle bout du nez + + + Forme bout du nez + + + Largeur du nez + + + Division narines + + + Largeur narines + + + Opaque + + + Ouvert + + + Derrière ouvert + + + Devant ouvert + + + Ouvert à gauche + + + Ouvert à droite + + + Orange + + + Sorti + + + Couleur de l'ombre externe + + + Opacité de l'ombre externe + + + Coin externe + + + Ombre de l'œil externe + + + Ombre externe + + + Rentrée + + + Parties + + + Ongles vernis + + + Pâle + + + Entrejambe + + + Taille + + + Longueur + + + Taille + + + Plis + + + Raie + + + Séparation frange + + + Pectoraux + + + Pigmentation + + + Couettes + + + Rose + + + Plus rose + + + Platef. (hauteur) + + + Platef. (largeur) + + + Pointue + + + Talons pointus + + + Queue de cheval + + + Jupe bouffante + + + Œil gauche saillant + + + Œil droit saillant + + + Plus + + + Paup. gonflées + + + Couleur arc en ciel + + + Cheveux roux + + + Standard + + + Raie à droite + + + Teint rosé + + + Rond + + + Rougeur + + + Rouge + + + Texture + + + Culotte de cheval + + + Jambes maigres + + + Séparés + + + Creux + + + Coupe derrière + + + Visage + + + Front + + + Haut gauche décalé + + + Haut droit décalé + + + Dégagé derrière + + + Dégagé devant + + + Vers la gauche + + + Déplacement + + + Vers la droite + + + Chemise + + + Taille + + + Plis + + + Hauteur + + + Moins + + + Bras courts + + + Jambes courtes + + + Petit cou + + + Couettes courtes + + + Queue de cheval courte + + + Court + + + Torse court + + + Hanches courtes + + + Épaules + + + Mèches sur le côté + + + Favoris + + + Cheveux sur le côté + + + Cheveux sur le côté en bas + + + Cheveux sur le côté en haut + + + Cou maigre + + + Taille jupe + + + Longueur jupe + + + Front incliné + + + Longueur manche + + + Ampleur manche + + + Fente : Derrière + + + Fente : Devant + + + Fente : Gauche + + + Fente : Droite + + + Moins + + + Petites mains + + + Moins + + + Moins + + + Cheveux lisses + + + Longueur + + + Barbichette + + + Rares + + + Mèches en pointe + + + Carrée + + + Orteil carré + + + Écraser la tête + + + Allonger la tête + + + Saillante + + + Poitrine enfoncée + + + Yeux enfoncés + + + En arrière + + + Vers l'avant + + + Plus + + + Arrière + + + Avant + + + Talons épais + + + Cou épais + + + Orteil épais + + + Mince + + + Sourcils fins + + + Lèvres fines + + + Nez fin + + + Menton fin + + + Jambes serrées + + + Pantalons serrés + + + Chemise serrée + + + Jupe serrée + + + Manches serrées + + + Forme de l'orteil + + + Épaisseur orteil + + + Longueur du torse + + + Muscles du torse + + + Torse maigre + + + Séparés + + + Lisse + + + Sortie + + + Artificiel + + + Arête supérieure + + + Joue supérieure + + + Menton supérieur + + + Paupière sup. + + + En trompette + + + Très rouge + + + Hauteur taille + + + Ronde + + + Cheveux blancs + + + Plus + + + Derrière large + + + Devant large + + + Lèvres larges + + + Artificiel + + + Rides + + + Ajouter à mes repères + + + Modifier mon repère + + + En savoir plus sur l'emplacement actuel + + + Historique de mes emplacements + + + Acheter ce terrain + + + Chat vocal indisponible ici + + + Vol interdit + + + Pas de bousculades + + + Construction/placement d'objets interdit + + + Scripts interdits + + + Santé + + + Région de type Adulte + + + Région de type Modéré + + + Région de type Général + + + Les avatars à l'extérieur de cette parcelle ne peuvent pas voir ni entendre les avatars qui se trouvent à l'intérieur. + + + Les objets mobiles risquent de ne pas se comporter correctement dans cette région tant qu'elle n'est pas refigée. + + + La recherche de chemin dynamique n'est pas activée dans cette région. + + + [APP_NAME] - Mise à jour + + + Mise à jour de [APP_NAME]... + + + Installation de [APP_NAME]... + + + Le client [APP_NAME] est en train d'être mis à jour. Cela peut prendre un certain temps, merci de votre patience. + + + Mise à jour en cours... + + + Mise à jour en cours + + + Le téléchargement de la mise à jour a échoué + + + Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version sur www.secondlife.com. + + + L'installation de la mise à jour a échoué + + + Impossible de lancer le client + + + [APP_NAME] : transfert trop rapide des articles de [FROM_NAME] ; aperçu automatique désactivé pendant [TIME] secondes + + + [APP_NAME] : transfert trop rapide des articles ; aperçu automatique désactivé pendant [TIME] secondes + + + -- Archivage des IM activé -- + + + [NAME] est en train d'écrire... + + + (sans nom) + + + (Modéré : Voix désactivées par défaut) + + + Le chat écrit n'est pas disponible pour cet appel. + + + Votre chat écrit a été désactivé par un modérateur de groupe. + + + Cliquez ici pour envoyer un message instantané. + + + À + + + (Modérateur) + + + (Enregistrement : [LONG_TIMESTAMP]) + + + Pour afficher ce message, vous devez désactiver la case Seuls mes amis et groupes peuvent m'appeler ou m'envoyer un IM, sous Préférences/Confidentialité. + + + En ligne + + + Hors ligne + + + Utilisateur non connecté - le message sera enregistré et livré plus tard. + + + Utilisateur non connecté - l'inventaire a été enregistré + + + Votre appel a fait l'objet d'une réponse + + + Vous appelez. + + + Vous avez rejoint l'appel + + + Vous avez automatiquement refusé l'appel vocal quand le mode Ne pas déranger était activé. + + + [NAME] appelle. + + + En train de rejoindre l'appel... + + + Connecté(e), cliquez sur Quitter l'appel pour raccrocher + + + A quitté l'appel + + + Connexion en cours... + + + Chat à plusieurs + + + Conférence avec [AGENT_NAME] + + + Objet de l’inventaire [ITEM_NAME] offert + + + Dossier de l’inventaire [ITEM_NAME] offert + + + Vous discutez avec un bot, [NAME]. Ne partagez pas d’informations personnelles. +En savoir plus sur https://second.life/scripted-agents. + + + Faire glisser les objets de l'inventaire ici + + + Vous avez publié sur Facebook. + + + Vous avez publié sur Flickr. + + + Vous avez publié sur Twitter. + + + (Session IM inexistante) + + + Vous êtes le seul participant à cette session. + + + [NAME] est hors ligne. + + + Pour accepter ce chat vocal/vous connecter, cliquez sur le bouton [BUTTON NAME]. + + + Vous ignorez ce résident. Si vous lui envoyez un message, il ne sera plus ignoré. + + + Erreur lors de la requête, veuillez réessayer ultérieurement. + + + Erreur lors de la requête, veuillez réessayer ultérieurement. + + + Vous n'avez pas les droits requis. + + + La session a expiré + + + Vous n'avez pas ce pouvoir. + + + Vous n'avez pas ce pouvoir. + + + Vous n'êtes pas modérateur de session. + + + Un modérateur de groupe a désactivé votre chat écrit. + + + Un modérateur de groupe a désactivé votre chat écrit. + + + Impossible d'ajouter des participants à la session de chat avec [RECIPIENT]. + + + Impossible d'envoyer votre message à la session de chat avec [RECIPIENT]. + + + Impossible d'envoyer votre message à la session de chat avec [RECIPIENT]. + + + Erreur lors de la modération. + + + Vous avez été supprimé du groupe. + + + Vous avez été supprimé du groupe. + + + Vous ne pouvez plus participer à la session de chat. + + + [SOURCES] a dit quelque chose de nouveau + + + [SOURCES] ont dit quelque chose de nouveau + + + Expiration du délai d'initialisation de la session + + + Emplacement du domicile défini. + + + https://secondlife.com/destination/voice-island + + + https://secondlife.com/destination/voice-morphing-premium + + + [NAME] vous a payé [AMOUNT] L$ [REASON]. + + + [NAME] vous a payé [AMOUNT] L$ : [REASON] + + + [NAME] vous a payé [AMOUNT] L$. + + + Vous avez payé à [AMOUNT] L$ [REASON]. + + + Vous avez payé à [NAME] [AMOUNT] L$ : [REASON] + + + Vous avez payé [AMOUNT] L$. + + + Vous avez payé à [NAME] [AMOUNT] L$. + + + Vous avez payé à [AMOUNT] L$ [REASON]. + + + Votre paiement de [AMOUNT] L$ à [NAME] [REASON] a échoué. + + + Votre paiement de [AMOUNT] L$ à [NAME] a échoué : [REASON] + + + Votre paiement de [AMOUNT] L$ a échoué. + + + Votre paiement de [AMOUNT] L$ à [NAME] a échoué. + + + Votre paiement de [AMOUNT] L$ [REASON] a échoué. + + + pour l'article suivant : [ITEM] + + + pour une parcelle de terrain + + + pour un pass d'accès au terrain + + + pour une cession de terrain + + + pour créer un groupe + + + pour rejoindre un groupe + + + pour charger + + + pour publier une petite annonce + + + Donner [AMOUNT] L$ + + + Le chargement coûte [AMOUNT] L$ + + + Cela coûte [AMOUNT] L$ + + + Achat du terrain sélectionné pour [AMOUNT] L$ + + + Cet objet coûte [AMOUNT] L$ + + + Tous + + + Officiers + + + Propriétaires + + + En ligne + + + Chargement... + +du rapport d'infraction + + + Nouvelle silhouette + + + Nouvelle peau + + + Nouveaux cheveux + + + Nouveaux yeux + + + Nouvelle chemise + + + Nouveau pantalon + + + Nouvelles chaussures + + + Nouvelles chaussettes + + + Nouvelle veste + + + Nouveaux gants + + + Nouveau débardeur + + + Nouveau caleçon + + + Nouvelle jupe + + + Nouvel alpha + + + Nouveau tatouage + + + Nouvel environnement universel + + + Nouvelles propriétés physiques + + + Objet à porter non valide + + + Nouveau geste + + + Nouveau script + + + Nouvelle note + + + Nouveau dossier + + + Contenus + + + Geste + + + Gestes masculins + + + Gestes féminins + + + Autres gestes + + + Gestes liés à la parole + + + Gestes communs + + + Homme - Demander pardon + + + Homme - Get lost + + + Homme - Envoyer un baiser + + + Homme - Hou ! + + + Homme - Ennui + + + Homme - Hé ! + + + Homme - Rire + + + Homme - Dégoût + + + Homme - Hausser les épaules + + + Homme - Tirer la langue + + + Homme - Ouah ! + + + Femme - Glousser + + + Femme - Pleurer + + + Femme - Gêne + + + Femme - Demander pardon + + + Femme - Get lost + + + Femme - Envoyer un baiser + + + Femme - Hou ! + + + Femme - Ennui + + + Femme - Hé ! + + + Femme - Hey baby + + + Femme - Rire + + + Femme - Looking good + + + Femme - Over here + + + Femme - Please + + + Femme - Dégoût + + + Femme - Hausser les épaules + + + Femme - Tirer la langue + + + Femme - Ouah ! + + + Nouveau cycle du jour + + + Nouvelle eau + + + Nouveau ciel + + + /s'incliner + + + /applaudir + + + /compter + + + /éteindre + + + /vatefairevoir + + + /montrersesmuscles + + + /non + + + /non ! + + + /papier + + + /memontrerdudoigt + + + /montrerl'autredudoigt + + + /pierre + + + /ciseaux + + + /fumer + + + /bailler + + + /siffler + + + /oui + + + /oui ! + + + absent + + + danse1 + + + danse2 + + + danse3 + + + danse4 + + + danse5 + + + danse6 + + + danse7 + + + danse8 + + + [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt] + + + aucun/aucun + + + Impossible de charger des images de taille supérieure à [WIDTH]*[HEIGHT] + + + Taille max. de la photo de la tenue : [WIDTH]*[HEIGHT]. Redimensionnez l’image ou utilisez-en une autre. + + + Taille max. de la photo de la tenue : [WIDTH]*[HEIGHT]. Sélectionnez une autre texture. + + + Impossible de vérifier les dimensions de la photo. Attendez que la taille de la photo s’affiche dans le sélecteur. + + + + Malgré nos efforts, une erreur inattendue s’est produite. + +Veuillez vous reporter à http://status.secondlifegrid.net afin de déterminer si un problème connu existe avec ce service. + Si le problème persiste, vérifiez la configuration de votre réseau et de votre pare-feu. + + + Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday + + + Sun:Mon:Tue:Wed:Thu:Fri:Sat + + + January:February:March:April:May:June:July:August:September:October:November:December + + + Jan:Feb:Mar:Apr:May:Jun:Jul:Aug:Sep:Oct:Nov:Dec + + + [MDAY] + + + AM + + + PM + + + [AMOUNT] US$ + + + Bannissement de groupe + + + Inscription + + + Rôles + + + Identité du groupe + + + Gestion des parcelles + + + Identité des parcelles + + + Paramètres des parcelles + + + Pouvoirs sur les parcelles + + + Accès aux parcelles + + + Contenu des parcelles + + + Gestion des objets + + + Comptabilité + + + Notices + + + Chat + + + Base + + + Premium + + + Premium Plus + + + Supprimer les articles sélectionnés ? + + + Supprimer l'article sélectionné ? + + + Cette tenue ne contient aucun article. + + + Sélectionnez un éditeur à l'aide du paramètre ExternalEditor. + + + Éditeur externe spécifié introuvable. Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles -(par ex. : "/chemin_accès/editor" "%s"). - Erreur lors de l'analyse de la commande d'éditeur externe. - Échec d'exécution de l'éditeur externe. - Échec de traduction : [REASON] - Erreur lors de l'analyse de la réponse relative à la traduction. - Échap - Space - Enter - Tab - Ins - Del - Backsp - Maj - Ctrl - Alt - CapsLock - Début - End - PgUp - PgDn - F1 - F2 - F3 - F4 - F5 - F6 - F7 - F8 - F9 - F10 - F11 - F12 - Ajouter - Soustraire - Multiplier - Diviser - PAD_DIVIDE - PAD_LEFT - PAD_RIGHT - PAD_DOWN - PAD_UP - PAD_HOME - PAD_END - PAD_PGUP - PAD_PGDN - PAD_CENTER - PAD_INS - PAD_DEL - PAD_Enter - PAD_BUTTON0 - PAD_BUTTON1 - PAD_BUTTON2 - PAD_BUTTON3 - PAD_BUTTON4 - PAD_BUTTON5 - PAD_BUTTON6 - PAD_BUTTON7 - PAD_BUTTON8 - PAD_BUTTON9 - PAD_BUTTON10 - PAD_BUTTON11 - PAD_BUTTON12 - PAD_BUTTON13 - PAD_BUTTON14 - PAD_BUTTON15 - - - = - ` - ; - [ - ] - \ - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - A - B - C - D - E - F - G - H - I - J - K - L - M - N - O - P - Q - R - S - T - U - V - W - X - Y - Z - Affichage des balises de particule (bleu) - Affichage des balises d'objet physique (vert) - Affichage des balises d'objet scripté (rouge) - Affichage des balises d'objet scripté avec fonction de toucher (rouge) - Affichage des balises de son (jaune) - Affichage des balises de média (blanc) - Balise de visibilité du soleil (orange) - Observation de la balise de direction de la lune (violet) - Masquage des particules - À propos du terrain - Apparence - Avatar - Construire - Chat - Conversations - Boussole - Destinations - Mes environnements - Facebook - Flickr - Gestes - État de la grille - Aide rapide - Inventaire - Carte - Place du marché - Place du marché - Mini-carte - Marcher / Courir / Voler - Boîte d'envoi vendeur - Personnes - Favoris - Lieux - Préférences - Profil - Signaler une infraction - Recherche - Photo - Parler - Twitter - Caméra - Paramètres vocaux - Information sur le terrain que vous visitez - Modifier votre avatar - Choisir un avatar complet - Construction d'objets et remodelage du terrain - Parler aux personnes près de vous par chat écrit - Parler à quelqu'un - Boussole - Destinations intéressantes - Mes environnements - Publier sur Facebook - Charger sur Flickr - Gestes de votre avatar - Afficher l’état actuel de la grille - Comment effectuer les opérations courantes - Afficher et utiliser vos possessions - Carte du monde - Faire du shopping - Vendez votre création - Afficher les personnes près de vous - Faire bouger votre avatar - Transférer des articles vers votre place de marché afin de les vendre. - Amis, groupes et personnes près de vous - Lieux à afficher comme favoris dans votre profil - Lieux enregistrés - Préférences - Modifier ou afficher votre profil - Signaler une infraction - Trouver des lieux, personnes, événements - Prendre une photo - Parler aux personnes près de vous en utilisant votre micro - Twitter - Changer l'angle de la caméra - Commandes de réglage du volume des appels et des personnes près de vous dans Second Life. - actuellement dans la barre d'outils du bas - actuellement dans la barre d'outils de gauche - actuellement dans la barre d'outils de droite - Garder% - Détail - Meilleur détail - Surface - Solide - Wrap - Aperçu - Normal - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - Aucun - Maillage de navigation affecté - Personnage - (Multiple) - Très faible - Faible - Moyenne - Élevée - Très élevée - Le résident ne peut pas visiter cette région. - [User] - Expérience - (aucune expérience) - (expérience sans titre) - À l’échelle des terrains - À l’échelle de la grille - AUTORISÉE - BLOQUÉE - CONTRIBUTEUR - ADMIN - RÉCENTE - AVEC PROPRIÉTAIRE - ([EXPERIENCES], [MAXEXPERIENCES] max.) - assumer vos contrôles - déclencher des animations pour votre avatar - attacher à votre avatar - suivre votre caméra - contrôler votre caméra - vous téléporter - accepter automatiquement les permissions d’expérience - forcez votre avatar à s’asseoir - changer vos paramètres d'environnement - a effectué une opération inconnue : [Permission] - Prendre le contrôle - Déclencher des animations - Attacher - Suivre la caméra - Contrôler la caméra - Téléportation - Permission - M'asseoir - Environnement - Les conversations ne sont pas archivées. Pour commencer à tenir un journal, choisissez Enregistrer : Journal seul ou Enregistrer : Journal et transcriptions sous Préférences > Chat. - Aucune conversation ne sera plus enregistrée. Pour recommencer à tenir un journal, choisissez Enregistrer : Journal seul ou Enregistrer : Journal et transcriptions sous Préférences > Chat. - Il n'y a aucune conversation enregistrée. Quand quelqu'un vous contacte ou quand vous contactez quelqu'un, une entrée de journal s'affiche ici. - Chargement... - s.o. - -Liste vide- - Valeur par défaut - (Aucun/Aucune) - Aucune limite - La forme physique contient des triangles trop petits. Essayez de simplifier le modèle physique. - La forme physique contient de mauvaises données de confirmation. Essayez de corriger le modèle physique. - La forme physique n’a pas la version correcte. Configurez la version correcte pour le modèle physique. - DNS n'a pas pu résoudre le nom d'hôte([HOSTNAME]). +(par ex. : "/chemin_accès/editor" "%s"). + + + Erreur lors de l'analyse de la commande d'éditeur externe. + + + Échec d'exécution de l'éditeur externe. + + + Échec de traduction : [REASON] + + + Erreur lors de l'analyse de la réponse relative à la traduction. + + + Échap + + + Space + + + Enter + + + Tab + + + Ins + + + Del + + + Backsp + + + Maj + + + Ctrl + + + Alt + + + CapsLock + + + Début + + + End + + + PgUp + + + PgDn + + + F1 + + + F2 + + + F3 + + + F4 + + + F5 + + + F6 + + + F7 + + + F8 + + + F9 + + + F10 + + + F11 + + + F12 + + + Ajouter + + + Soustraire + + + Multiplier + + + Diviser + + + PAD_DIVIDE + + + PAD_LEFT + + + PAD_RIGHT + + + PAD_DOWN + + + PAD_UP + + + PAD_HOME + + + PAD_END + + + PAD_PGUP + + + PAD_PGDN + + + PAD_CENTER + + + PAD_INS + + + PAD_DEL + + + PAD_Enter + + + PAD_BUTTON0 + + + PAD_BUTTON1 + + + PAD_BUTTON2 + + + PAD_BUTTON3 + + + PAD_BUTTON4 + + + PAD_BUTTON5 + + + PAD_BUTTON6 + + + PAD_BUTTON7 + + + PAD_BUTTON8 + + + PAD_BUTTON9 + + + PAD_BUTTON10 + + + PAD_BUTTON11 + + + PAD_BUTTON12 + + + PAD_BUTTON13 + + + PAD_BUTTON14 + + + PAD_BUTTON15 + + + - + + + = + + + ` + + + ; + + + [ + + + ] + + + \ + + + 0 + + + 1 + + + 2 + + + 3 + + + 4 + + + 5 + + + 6 + + + 7 + + + 8 + + + 9 + + + A + + + B + + + C + + + D + + + E + + + F + + + G + + + H + + + I + + + J + + + K + + + L + + + M + + + N + + + O + + + P + + + Q + + + R + + + S + + + T + + + U + + + V + + + W + + + X + + + Y + + + Z + + + Affichage des balises de particule (bleu) + + + Affichage des balises d'objet physique (vert) + + + Affichage des balises d'objet scripté (rouge) + + + Affichage des balises d'objet scripté avec fonction de toucher (rouge) + + + Affichage des balises de son (jaune) + + + Affichage des balises de média (blanc) + + + Balise de visibilité du soleil (orange) + + + Observation de la balise de direction de la lune (violet) + + + Masquage des particules + + + À propos du terrain + + + Apparence + + + Avatar + + + Construire + + + Chat + + + Conversations + + + Boussole + + + Destinations + + + Mes environnements + + + Facebook + + + Flickr + + + Gestes + + + État de la grille + + + Aide rapide + + + Inventaire + + + Carte + + + Place du marché + + + Place du marché + + + Mini-carte + + + Marcher / Courir / Voler + + + Boîte d'envoi vendeur + + + Personnes + + + Favoris + + + Lieux + + + Préférences + + + Profil + + + Signaler une infraction + + + Recherche + + + Photo + + + Parler + + + Twitter + + + Caméra + + + Paramètres vocaux + + + Information sur le terrain que vous visitez + + + Modifier votre avatar + + + Choisir un avatar complet + + + Construction d'objets et remodelage du terrain + + + Parler aux personnes près de vous par chat écrit + + + Parler à quelqu'un + + + Boussole + + + Destinations intéressantes + + + Mes environnements + + + Publier sur Facebook + + + Charger sur Flickr + + + Gestes de votre avatar + + + Afficher l’état actuel de la grille + + + Comment effectuer les opérations courantes + + + Afficher et utiliser vos possessions + + + Carte du monde + + + Faire du shopping + + + Vendez votre création + + + Afficher les personnes près de vous + + + Faire bouger votre avatar + + + Transférer des articles vers votre place de marché afin de les vendre. + + + Amis, groupes et personnes près de vous + + + Lieux à afficher comme favoris dans votre profil + + + Lieux enregistrés + + + Préférences + + + Modifier ou afficher votre profil + + + Signaler une infraction + + + Trouver des lieux, personnes, événements + + + Prendre une photo + + + Parler aux personnes près de vous en utilisant votre micro + + + Twitter + + + Changer l'angle de la caméra + + + Commandes de réglage du volume des appels et des personnes près de vous dans Second Life. + + + actuellement dans la barre d'outils du bas + + + actuellement dans la barre d'outils de gauche + + + actuellement dans la barre d'outils de droite + + + Garder% + + + Détail + + + Meilleur détail + + + Surface + + + Solide + + + Wrap + + + Aperçu + + + Normal + + + http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer + + + Aucun + + + Maillage de navigation affecté + + + Personnage + + + (Multiple) + + + Très faible + + + Faible + + + Moyenne + + + Élevée + + + Très élevée + + + Le résident ne peut pas visiter cette région. + + + [User] + + + Expérience + + + (aucune expérience) + + + (expérience sans titre) + + + À l’échelle des terrains + + + À l’échelle de la grille + + + AUTORISÉE + + + BLOQUÉE + + + CONTRIBUTEUR + + + ADMIN + + + RÉCENTE + + + AVEC PROPRIÉTAIRE + + + ([EXPERIENCES], [MAXEXPERIENCES] max.) + + + assumer vos contrôles + + + déclencher des animations pour votre avatar + + + attacher à votre avatar + + + suivre votre caméra + + + contrôler votre caméra + + + vous téléporter + + + accepter automatiquement les permissions d’expérience + + + forcez votre avatar à s’asseoir + + + changer vos paramètres d'environnement + + + a effectué une opération inconnue : [Permission] + + + Prendre le contrôle + + + Déclencher des animations + + + Attacher + + + Suivre la caméra + + + Contrôler la caméra + + + Téléportation + + + Permission + + + M'asseoir + + + Environnement + + + Les conversations ne sont pas archivées. Pour commencer à tenir un journal, choisissez Enregistrer : Journal seul ou Enregistrer : Journal et transcriptions sous Préférences > Chat. + + + Aucune conversation ne sera plus enregistrée. Pour recommencer à tenir un journal, choisissez Enregistrer : Journal seul ou Enregistrer : Journal et transcriptions sous Préférences > Chat. + + + Il n'y a aucune conversation enregistrée. Quand quelqu'un vous contacte ou quand vous contactez quelqu'un, une entrée de journal s'affiche ici. + + + Chargement... + + + s.o. + + + -Liste vide- + + + Valeur par défaut + + + (Aucun/Aucune) + + + Aucune limite + + + La forme physique contient des triangles trop petits. Essayez de simplifier le modèle physique. + + + La forme physique contient de mauvaises données de confirmation. Essayez de corriger le modèle physique. + + + La forme physique n’a pas la version correcte. Configurez la version correcte pour le modèle physique. + + + DNS n'a pas pu résoudre le nom d'hôte([HOSTNAME]). Veuillez vérifier que vous parvenez à vous connecter au site www.secondlife.com. Si c'est le cas, et que vous continuez à recevoir ce message d'erreur, veuillez vous -rendre à la section Support et signaler ce problème - Le serveur d'identification a rencontré une erreur de connexion SSL. +rendre à la section Support et signaler ce problème + + + Le serveur d'identification a rencontré une erreur de connexion SSL. Si vous continuez à recevoir ce message d'erreur, veuillez vous rendre à la section Support du site web -SecondLife.com et signaler ce problème - Ceci est souvent dû à un mauvais réglage de l'horloge de votre ordinateur. +SecondLife.com et signaler ce problème + + + Ceci est souvent dû à un mauvais réglage de l'horloge de votre ordinateur. Veuillez aller à Tableaux de bord et assurez-vous que l'heure et la date sont réglés correctement. Vérifiez également que votre réseau et votre pare-feu sont configurés correctement. Si vous continuez à recevoir ce message d'erreur, veuillez vous rendre à la section Support du site web SecondLife.com et signaler ce problème. -[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de connaissances] +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de connaissances] + diff --git a/indra/newview/skins/default/xui/fr/teleport_strings.xml b/indra/newview/skins/default/xui/fr/teleport_strings.xml index 1272723c6b..cad8911fde 100644 --- a/indra/newview/skins/default/xui/fr/teleport_strings.xml +++ b/indra/newview/skins/default/xui/fr/teleport_strings.xml @@ -1,40 +1,96 @@ - Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir vous téléporter. -Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. - Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions. -Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. - Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment. -Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème. - Désolé, le système n'a pas réussi à localiser la destination de votre repère. - Désolé, la connexion vers votre lieu de téléportation n'a pas abouti. -Veuillez réessayer dans un moment. - Vous ne pouvez pas vous téléporter à nouveau vers Welcome Island. -Pour recommencer le didacticiel, accédez à Welcome Island Public. - Désolé, vous n'avez pas accès à cette destination. - Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d'essayer de vous téléporter. - Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée. - Désolé, votre demande de téléportation n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. - Désolé, votre demande pour passer dans une autre région n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. - Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu'elle n'existe plus. Veuillez réessayer dans quelques minutes. - L'inventaire est temporairement indisponible. - Pour accéder à cette région, vous devez avoir au moins 18 ans. - Impossible de pénétrer dans la région. « [REGION_NAME] » est une région de jeux d'adresse et vous devez satisfaire à certains critères pour y pénétrer. Pour en savoir plus, consultez la page [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life FAQ sur les jeux d'adresse]. - Désolé, mais le système n'a pas pu démarrer votre téléport. Veuillez réessayer dans quelques minutes. + + Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir vous téléporter. +Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. + + + Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions. +Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. + + + Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment. +Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème. + + + Désolé, le système n'a pas réussi à localiser la destination de votre repère. + + + Désolé, la connexion vers votre lieu de téléportation n'a pas abouti. +Veuillez réessayer dans un moment. + + + Vous ne pouvez pas vous téléporter à nouveau vers Welcome Island. +Pour recommencer le didacticiel, accédez à Welcome Island Public. + + + Désolé, vous n'avez pas accès à cette destination. + + + Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d'essayer de vous téléporter. + + + Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée. + + + Désolé, votre demande de téléportation n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. + + + Désolé, votre demande pour passer dans une autre région n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. + + + Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu'elle n'existe plus. Veuillez réessayer dans quelques minutes. + + + L'inventaire est temporairement indisponible. + + + Pour accéder à cette région, vous devez avoir au moins 18 ans. + + + Impossible de pénétrer dans la région. « [REGION_NAME] » est une région de jeux d'adresse et vous devez satisfaire à certains critères pour y pénétrer. Pour en savoir plus, consultez la page [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life FAQ sur les jeux d'adresse]. + + + Désolé, mais le système n'a pas pu démarrer votre téléport. Veuillez réessayer dans quelques minutes. + - Envoi vers la destination en cours. - Redirection vers un emplacement différent en cours. - Relai vers la destination en cours. - Requête de la demande d'envoi vers votre domicile en cours. - Requête de la demande d'envoi vers le repère en cours. - Téléportation sur le point d'aboutir. - Téléportation depuis [T_SLURL] terminée - Destination en cours de résolution. - Contact avec la nouvelle région en cours. - Vous arrivez... - Demande de téléportation en cours... - En attente de téléportation... + + Envoi vers la destination en cours. + + + Redirection vers un emplacement différent en cours. + + + Relai vers la destination en cours. + + + Requête de la demande d'envoi vers votre domicile en cours. + + + Requête de la demande d'envoi vers le repère en cours. + + + Téléportation sur le point d'aboutir. + + + Téléportation depuis [T_SLURL] terminée + + + Destination en cours de résolution. + + + Contact avec la nouvelle région en cours. + + + Vous arrivez... + + + Demande de téléportation en cours... + + + En attente de téléportation... + diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index d279f62d12..2ddb7d77d1 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -1,2050 +1,5834 @@ - Second Life - Second Life - SECOND LIFE - Portale di supporto di Second Life - Ricerca hardware... - Caricamento di [APP_NAME]... - Pulizia della cache... - Inizializzazione della cache texture... - Inizializzazione grafica non riuscita. Aggiorna il driver della scheda grafica! - [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) -[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] - Configurazione struttura [BUILD_CONFIG] - Tu sei a [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] che si trova a <nolink>[HOSTNAME]</nolink> + + Second Life + + + Second Life + + + SECOND LIFE + + + Portale di supporto di Second Life + + + Ricerca hardware... + + + Caricamento di [APP_NAME]... + + + Pulizia della cache... + + + Inizializzazione della cache texture... + + + Inizializzazione grafica non riuscita. Aggiorna il driver della scheda grafica! + + + [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) +[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] + + + Configurazione struttura [BUILD_CONFIG] + + + Tu sei a [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] che si trova a <nolink>[HOSTNAME]</nolink> SLURL: <nolink>[SLURL]</nolink> (coordinate globali [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] -[SERVER_RELEASE_NOTES_URL] - CPU: [CPU] +[SERVER_RELEASE_NOTES_URL] + + + CPU: [CPU] Memoria: [MEMORY_MB] MB Versione sistema operativo: [OS_VERSION] Venditore scheda grafica: [GRAPHICS_CARD_VENDOR] -Scheda grafica: [GRAPHICS_CARD] - Versione driver Windows per grafica: [GRAPHICS_DRIVER_VERSION] - Versione OpenGL: [OPENGL_VERSION] - Dimensione finestra: [WINDOW_WIDTH]x[WINDOW_HEIGHT] +Scheda grafica: [GRAPHICS_CARD] + + + Versione driver Windows per grafica: [GRAPHICS_DRIVER_VERSION] + + + Versione OpenGL: [OPENGL_VERSION] + + + Dimensione finestra: [WINDOW_WIDTH]x[WINDOW_HEIGHT] Regolazione dimensioni carattere: [FONT_SIZE_ADJUSTMENT]pt Scala UI: [UI_SCALE] Distanza visualizzazione: [DRAW_DISTANCE]m Larghezza banda: [NET_BANDWITH]kbit/s Fattore livello di dettaglio: [LOD_FACTOR] Qualità di rendering: [RENDER_QUALITY] -Memoria texture: [TEXTURE_MEMORY]MB - Modalità display HiDPI: [HIDPI] - J2C Versione decoder: [J2C_VERSION] +Memoria texture: [TEXTURE_MEMORY]MB + + + Modalità display HiDPI: [HIDPI] + + + J2C Versione decoder: [J2C_VERSION] Versione del driver audio: [AUDIO_DRIVER_VERSION][LIBCEF_VERSION] Versione LibVLC: [LIBVLC_VERSION] -Versione server voce: [VOICE_VERSION] - Pacchetti perduti: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) - [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] - Errore nel recupero URL note rilascio versione - Costruisci configurazione - Ripristino in corso... - Modifica della risoluzione... - Luminosità massima (vers. precedente) - In connessione. [APP_NAME] può sembrare rallentata. Attendi. - Accesso in corso... - In autenticazione - Aggiornamento account in corso... - Un precedente tentativo di login è fallito. Tentativo di connessione [NUMBER] - Sto caricando [SECOND_LIFE]... - Inizializzazione del browser web incorporato... - Inizializzazione dati multimediali... - Caricamento caratteri... - Verifica file della cache (tempo previsto 60-90 secondi)... - Elaborazione risposta... - Inizializzazione mondo... - Decodifica immagini... - Inizializzazione QuickTime... - QuickTime non trovato - impossibile inizializzare. - QuickTime configurato con successo. - Richiesta capacità regione... - Richiesta capacità regione, tentativo [NUMBER]... - In attesa della risposta della regione... - Connessione alla regione... - Sto caricando i vestiti... - Il server ha inviato un certificato non valido o errato. Rivolgiti all'amministratore della griglia. - Per accedere al server è stato utilizzato un nome host non valido; controlla lo SLURL o il nome host della griglia. - Il certificato inviato dalla griglia sembra essere scaduto. Controlla l'orologio del sistema o rivolgiti all'amministratore della griglia. - Impossibile utilizzare per SSl il certificato inviato dal server. Rivolgiti all'amministratore della griglia. - Nella catena dei certificati del server erano presenti troppi certificati. Rivolgiti all'amministratore della griglia. - Impossibile verificare la firma del certificato inviato dal server della griglia. Rivolgiti all'amministratore della griglia. - Errore di rete: Non è stato possibile stabilire un collegamento, controlla la tua connessione. - Accesso non riuscito. - Esci - http://join.secondlife.com/?sourceid=[sourceid] - Griglia principale di Second Life (Agni) - Griglia per beta test di Second Life (Aditi) - http://secondlife.com/download. - Il viewer utilizzato non è più in grado di accedere a Second Life. Visita la parina seguente per scaricare un nuovo viewer: +Versione server voce: [VOICE_VERSION] + + + Pacchetti perduti: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) + + + [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] + + + Errore nel recupero URL note rilascio versione + + + Costruisci configurazione + + + Ripristino in corso... + + + Modifica della risoluzione... + + + Luminosità massima (vers. precedente) + + + In connessione. [APP_NAME] può sembrare rallentata. Attendi. + + + Accesso in corso... + + + In autenticazione + + + Aggiornamento account in corso... + + + Un precedente tentativo di login è fallito. Tentativo di connessione [NUMBER] + + + Sto caricando [SECOND_LIFE]... + + + Inizializzazione del browser web incorporato... + + + Inizializzazione dati multimediali... + + + Caricamento caratteri... + + + Verifica file della cache (tempo previsto 60-90 secondi)... + + + Elaborazione risposta... + + + Inizializzazione mondo... + + + Decodifica immagini... + + + Inizializzazione QuickTime... + + + QuickTime non trovato - impossibile inizializzare. + + + QuickTime configurato con successo. + + + Richiesta capacità regione... + + + Richiesta capacità regione, tentativo [NUMBER]... + + + In attesa della risposta della regione... + + + Connessione alla regione... + + + Sto caricando i vestiti... + + + Il server ha inviato un certificato non valido o errato. Rivolgiti all'amministratore della griglia. + + + Per accedere al server è stato utilizzato un nome host non valido; controlla lo SLURL o il nome host della griglia. + + + Il certificato inviato dalla griglia sembra essere scaduto. Controlla l'orologio del sistema o rivolgiti all'amministratore della griglia. + + + Impossibile utilizzare per SSl il certificato inviato dal server. Rivolgiti all'amministratore della griglia. + + + Nella catena dei certificati del server erano presenti troppi certificati. Rivolgiti all'amministratore della griglia. + + + Impossibile verificare la firma del certificato inviato dal server della griglia. Rivolgiti all'amministratore della griglia. + + + Errore di rete: Non è stato possibile stabilire un collegamento, controlla la tua connessione. + + + Accesso non riuscito. + + + Esci + + + http://join.secondlife.com/?sourceid=[sourceid] + + + Griglia principale di Second Life (Agni) + + + Griglia per beta test di Second Life (Aditi) + + + http://secondlife.com/download. + + + Il viewer utilizzato non è più in grado di accedere a Second Life. Visita la parina seguente per scaricare un nuovo viewer: http://secondlife.com/download. Per maggiori informazioni, consulta le domande frequenti alla pagina seguente: -http://secondlife.com/viewer-access-faq - Disponibile aggiornamento facoltativo viewer: [VERSION] - Aggernamento viewer richiesto: [VERSION] - Questo agente ha già eseguito il login. - Siamo spiacenti. Il tentativo di accesso non è riuscito. +http://secondlife.com/viewer-access-faq + + + Disponibile aggiornamento facoltativo viewer: [VERSION] + + + Aggernamento viewer richiesto: [VERSION] + + + Questo agente ha già eseguito il login. + + + Siamo spiacenti. Il tentativo di accesso non è riuscito. Verifica di avere inserito correttamente * Nome utente (come robby12 o Stella Soleggiato) * Password -Verifica anche che il blocco delle maiuscole non sia attivato. - Come misura precauzionale, la tua password è stata cambiata. +Verifica anche che il blocco delle maiuscole non sia attivato. + + + Come misura precauzionale, la tua password è stata cambiata. Visita la pagina del tuo account a http://secondlife.com/password e rispondi alla domanda di sicurezza per reimpostare la password. -Ci scusiamo per l'inconveniente. - Abbiamo effettuato delle modifiche al sistema che richiedono di reimpostare la password. +Ci scusiamo per l'inconveniente. + + + Abbiamo effettuato delle modifiche al sistema che richiedono di reimpostare la password. Visita la pagina del tuo account a http://secondlife.com/password e rispondi alla domanda di sicurezza per reimpostare la password. -Ci scusiamo per l'inconveniente. - Second Life è chiuso temporaneamente per manutenzione. +Ci scusiamo per l'inconveniente. + + + Second Life è chiuso temporaneamente per manutenzione. Al momento, solo i dipendenti possono eseguire l'accesso. -Visita www.secondlife.com/status per aggiornamenti. - L'accesso a Second Life è temporaneamente limitato per garantire che chi è nel mondo virtuale abbia la migliore esperienza possibile. +Visita www.secondlife.com/status per aggiornamenti. + + + L'accesso a Second Life è temporaneamente limitato per garantire che chi è nel mondo virtuale abbia la migliore esperienza possibile. -Le persone con account gratuiti non potranno accedere a Second Life durante questo periodo, per lasciare spazio alle persone che hanno pagato per Second Life. - Non si può accedere a Second Life da questo computer. +Le persone con account gratuiti non potranno accedere a Second Life durante questo periodo, per lasciare spazio alle persone che hanno pagato per Second Life. + + + Non si può accedere a Second Life da questo computer. Se ritieni che si tratta di un errore, contatta -support@secondlife.com. - Il tuo account non è accessibile fino alle -[TIME] fuso orario del Pacifico. - Non siamo attualmente in grado di completare la tua richiesta. -Contatta l'assistenza Second Life alla pagina http://support.secondlife.com. - Dati incompatibili rilevati durante l'accesso. -Contattare support@secondlife.com. - Il tuo account è in fase di leggera manutenzione. +support@secondlife.com. + + + Il tuo account non è accessibile fino alle +[TIME] fuso orario del Pacifico. + + + Non siamo attualmente in grado di completare la tua richiesta. +Contatta l'assistenza Second Life alla pagina http://support.secondlife.com. + + + Dati incompatibili rilevati durante l'accesso. +Contattare support@secondlife.com. + + + Il tuo account è in fase di leggera manutenzione. Il tuo account non è accessibile fino alle [TIME] fuso orario del Pacifico. -Se ritieni che si tratta di un errore, contatta support@secondlife.com. - Errore del simulatore in seguito alla richiesta di logout. - Il sistema sta eseguendo il logout in questo momento. -Prova ad accedere nuovamente tra un minuto. - Non è possibile creare una sessione valida. - Non è possibile collegarsi a un simulatore. - Il tuo account può accedere a Second Life solo +Se ritieni che si tratta di un errore, contatta support@secondlife.com. + + + Errore del simulatore in seguito alla richiesta di logout. + + + Il sistema sta eseguendo il logout in questo momento. +Prova ad accedere nuovamente tra un minuto. + + + Non è possibile creare una sessione valida. + + + Non è possibile collegarsi a un simulatore. + + + Il tuo account può accedere a Second Life solo tra le [START] e le [END] fuso orario del Pacifico. Torna durante quell'orario. -Se ritieni che si tratta di un errore, contatta support@secondlife.com. - Parametri errati. -Se ritieni che si tratta di un errore, contatta support@secondlife.com. - Il parametro Nome deve includere solo caratteri alfanumerici. -Se ritieni che si tratta di un errore, contatta support@secondlife.com. - Il parametro Cognome deve includere solo caratteri alfanumerici. -Se ritieni che si tratta di un errore, contatta support@secondlife.com. - La regione sta passando allo stato non in linea. -Prova ad accedere nuovamente tra un minuto. - L'agente non è nella regione. -Prova ad accedere nuovamente tra un minuto. - La regione ha eseguito l'accesso in un'altre sessione. -Prova ad accedere nuovamente tra un minuto. - La regione stava eseguendo il logout della sessione precedente. -Prova ad accedere nuovamente tra un minuto. - La regione sta ancora eseguendo il logout della sessione precedente. -Prova ad accedere nuovamente tra un minuto. - La regione ha eseguito il logout dell'ultima sessione. -Prova ad accedere nuovamente tra un minuto. - La regione ha iniziato la procedura di logout. -Prova ad accedere nuovamente tra un minuto. - Il sistema ha iniziato il logout dell'ultima sessione. -Prova ad accedere nuovamente tra un minuto. - Questa regione sta avendo problemi. Verifica la tua connessione a Internet. - Salvataggio delle impostazioni... - Uscita... - Chiusura... - Sei scollegato dalla regione in cui ti trovavi. - Sei stato indirizzato in una regione non valida. - Verifica scollegamento viewer - Connessione a Facebook in corso... - Caricamento post... - Disconnessione da Facebook in corso... - Problemi con la connessione a Facebook - Problemi con la connessione a Facebook - Problemi con la disconnessione da Facebook - Collegamento a Flickr... - Caricamento post... - Interruzione del collegamento con Flickr... - Problema nel collegamento a Flickr - Problema nel caricamento post su Flickr - Problema nell'interruzione del collegamento da Flickr - Collegamento a Twitter... - Caricamento post... - Interruzione del collegamento con Twitter... - Problema nel collegamento a Twitter - Problema nel caricamento post su Twitter - Problema nell'interruzione del collegamento da Twitter - Bianco e nero - Colori anni '70 - Intenso - Giornale - Seppia - Faretto - Video - Auto contrasto - Bagliore - Miniatura - Toy camera - Persona - (nessun nome) - Proprietario: - Pubblico - (Gruppo) - In Vendita: [AMOUNT]L$ - Costruzione solo con gruppo - Divieto di Costruire - Costruzione solo con gruppo - Non Sicuro - Divieto di Volare - Script solo con gruppo - Script vietati - Terreno: - Solo un singolo oggetto può essere creato qui - Non puoi indossare una cartella che contiene più di [AMOUNT] elementi. Per modificare questo limite, accedi ad Avanzate > Mostra impostazioni di debug > WearFolderLimit. +Se ritieni che si tratta di un errore, contatta support@secondlife.com. + + + Parametri errati. +Se ritieni che si tratta di un errore, contatta support@secondlife.com. + + + Il parametro Nome deve includere solo caratteri alfanumerici. +Se ritieni che si tratta di un errore, contatta support@secondlife.com. + + + Il parametro Cognome deve includere solo caratteri alfanumerici. +Se ritieni che si tratta di un errore, contatta support@secondlife.com. + + + La regione sta passando allo stato non in linea. +Prova ad accedere nuovamente tra un minuto. + + + L'agente non è nella regione. +Prova ad accedere nuovamente tra un minuto. + + + La regione ha eseguito l'accesso in un'altre sessione. +Prova ad accedere nuovamente tra un minuto. + + + La regione stava eseguendo il logout della sessione precedente. +Prova ad accedere nuovamente tra un minuto. + + + La regione sta ancora eseguendo il logout della sessione precedente. +Prova ad accedere nuovamente tra un minuto. + + + La regione ha eseguito il logout dell'ultima sessione. +Prova ad accedere nuovamente tra un minuto. + + + La regione ha iniziato la procedura di logout. +Prova ad accedere nuovamente tra un minuto. + + + Il sistema ha iniziato il logout dell'ultima sessione. +Prova ad accedere nuovamente tra un minuto. + + + Questa regione sta avendo problemi. Verifica la tua connessione a Internet. + + + Salvataggio delle impostazioni... + + + Uscita... + + + Chiusura... + + + Sei scollegato dalla regione in cui ti trovavi. + + + Sei stato indirizzato in una regione non valida. + + + Verifica scollegamento viewer + + + Connessione a Facebook in corso... + + + Caricamento post... + + + Disconnessione da Facebook in corso... + + + Problemi con la connessione a Facebook + + + Problemi con la connessione a Facebook + + + Problemi con la disconnessione da Facebook + + + Collegamento a Flickr... + + + Caricamento post... + + + Interruzione del collegamento con Flickr... + + + Problema nel collegamento a Flickr + + + Problema nel caricamento post su Flickr + + + Problema nell'interruzione del collegamento da Flickr + + + Collegamento a Twitter... + + + Caricamento post... + + + Interruzione del collegamento con Twitter... + + + Problema nel collegamento a Twitter + + + Problema nel caricamento post su Twitter + + + Problema nell'interruzione del collegamento da Twitter + + + Bianco e nero + + + Colori anni '70 + + + Intenso + + + Giornale + + + Seppia + + + Faretto + + + Video + + + Auto contrasto + + + Bagliore + + + Miniatura + + + Toy camera + + + Persona + + + (nessun nome) + + + Proprietario: + + + Pubblico + + + (Gruppo) + + + In Vendita: [AMOUNT]L$ + + + Costruzione solo con gruppo + + + Divieto di Costruire + + + Costruzione solo con gruppo + + + Non Sicuro + + + Divieto di Volare + + + Script solo con gruppo + + + Script vietati + + + Terreno: + + + Solo un singolo oggetto può essere creato qui + + + Non puoi indossare una cartella che contiene più di [AMOUNT] elementi. Per modificare questo limite, accedi ad Avanzate > Mostra impostazioni di debug > WearFolderLimit. + - Questo link porta a una pagina nel dominio ufficiale SecondLife.com o LindenLab.com. - Non puoi rezzare articoli dalla cartella degli annunci di Marketplace - Non puoi inserire nella cartella degli annunci in Marketplace gli articoli che indossi - La profondità delle caselle nidificate è maggiore di [AMOUNT]. Diminuisci la profondità delle cartelle nidificate; se necessario, raggruppa gli articoli. - Il numero di sottocartelle è maggiore di [AMOUNT]. Diminuisci il numero delle cartelle nel tuo annuncio; se necessario, raggruppa gli articoli. - Il numero di articoli è maggiore di [AMOUNT]. Per vendere più di [AMOUNT] articoli in un annuncio, devi raggruppare alcuni di essi. - Il numero di articoli in magazzino è maggiore di [AMOUNT]. - Puoi trascinare elementi o cartelle solo nelle schede TUTTI o NON ASSOCIATO. Seleziona una di quelle schede e sposta nuovamente gli elementi o le cartelle. - Almeno uno di questi oggetti non può essere venduto o trasferito - Puoi aggiungere a Marketplace solo gli articoli nel tuo inventario - Non puoi inserire cartelle o articoli collegati tramite link nel Marketplace - Non puoi inserire biglietti da visita in Marketplace - non puoi muovere un annuncio attivo - Non puoi spostare la cartella principale degli annunci di Marketplace - Tutti gli articoli in una cartella di magazzino devono essere dello stesso tipo e con le stesse autorizzazioni - Non puoi spostare una cartella nella relativa cartella secondaria - Non puoi spostare una cartella in se stessa - Clicca per visitare questa pagina web - Clicca per avere maggiori informazioni sul luogo - Clicca per vedere il profilo di questo residente - Ulteriori informazioni su questo Residente - Clicca per disattivare l'audio di questo residente - Clicca per attivare l'audio del residente - Clicca per inviare un IM a questo residente - Clicca per pagare il residente - Fai clic per inviare un'offerta di teleport al residente - Fai clic per inviare una richiesta di amicizia al residente - Clicca per vedere la descrizione del gruppo - Clicca per vedere la descrizione dell'evento - Clicca per vedere questa inserzione - Clicca per vedere la descrizione del lotto - Clicca per effettuare il teleport a questa destinazione - Clicca per vedere la descrizione dell'oggetto - Clicca per vedere questo posto sulla mappa - Clicca per avviare il comando secondlife:// + + Questo link porta a una pagina nel dominio ufficiale SecondLife.com o LindenLab.com. + + + Non puoi rezzare articoli dalla cartella degli annunci di Marketplace + + + Non puoi inserire nella cartella degli annunci in Marketplace gli articoli che indossi + + + La profondità delle caselle nidificate è maggiore di [AMOUNT]. Diminuisci la profondità delle cartelle nidificate; se necessario, raggruppa gli articoli. + + + Il numero di sottocartelle è maggiore di [AMOUNT]. Diminuisci il numero delle cartelle nel tuo annuncio; se necessario, raggruppa gli articoli. + + + Il numero di articoli è maggiore di [AMOUNT]. Per vendere più di [AMOUNT] articoli in un annuncio, devi raggruppare alcuni di essi. + + + Il numero di articoli in magazzino è maggiore di [AMOUNT]. + + + Puoi trascinare elementi o cartelle solo nelle schede TUTTI o NON ASSOCIATO. Seleziona una di quelle schede e sposta nuovamente gli elementi o le cartelle. + + + Almeno uno di questi oggetti non può essere venduto o trasferito + + + Puoi aggiungere a Marketplace solo gli articoli nel tuo inventario + + + Non puoi inserire cartelle o articoli collegati tramite link nel Marketplace + + + Non puoi inserire biglietti da visita in Marketplace + + + non puoi muovere un annuncio attivo + + + Non puoi spostare la cartella principale degli annunci di Marketplace + + + Tutti gli articoli in una cartella di magazzino devono essere dello stesso tipo e con le stesse autorizzazioni + + + Non puoi spostare una cartella nella relativa cartella secondaria + + + Non puoi spostare una cartella in se stessa + + + Clicca per visitare questa pagina web + + + Clicca per avere maggiori informazioni sul luogo + + + Clicca per vedere il profilo di questo residente + + + Ulteriori informazioni su questo Residente + + + Clicca per disattivare l'audio di questo residente + + + Clicca per attivare l'audio del residente + + + Clicca per inviare un IM a questo residente + + + Clicca per pagare il residente + + + Fai clic per inviare un'offerta di teleport al residente + + + Fai clic per inviare una richiesta di amicizia al residente + + + Clicca per vedere la descrizione del gruppo + + + Clicca per vedere la descrizione dell'evento + + + Clicca per vedere questa inserzione + + + Clicca per vedere la descrizione del lotto + + + Clicca per effettuare il teleport a questa destinazione + + + Clicca per vedere la descrizione dell'oggetto + + + Clicca per vedere questo posto sulla mappa + + + Clicca per avviare il comando secondlife:// + - Fai clic per comporre un'email - Teleportati a - Mostra la mappa per - Disattiva audio - Riattiva audio - IM - Paga - Offri teleport a - Richiesta di amicizia - Rimozione amico - Chiudi (⌘W) - Chiudi (Ctrl+W) - Chiudi - Ripristina - Minimizza - Distacca - Àncora - Mostra Aiuto - Oggetti di questo tipo non possono essere allegati ai -biglietti in questa regione. - Solamente gli oggetti con autorizzazioni + + Fai clic per comporre un'email + + + Teleportati a + + + Mostra la mappa per + + + Disattiva audio + + + Riattiva audio + + + IM + + + Paga + + + Offri teleport a + + + Richiesta di amicizia + + + Rimozione amico + + + Chiudi (⌘W) + + + Chiudi (Ctrl+W) + + + Chiudi + + + Ripristina + + + Minimizza + + + Distacca + + + Àncora + + + Mostra Aiuto + + + Oggetti di questo tipo non possono essere allegati ai +biglietti in questa regione. + + + Solamente gli oggetti con autorizzazioni illimitate al “proprietario successivo” -possono essere allegati ai biglietti. - Ricerca in corso... - Nessun risultato. - Recupero dati in corso... - Note sulla versione - https://releasenotes.secondlife.com/viewer/ - In caricamento... - (nessuno) - (in attesa) - (nessuno) - Nessun errore - Richiesta risorsa: fallita - Richiesta risorsa: file non esistente - Richiesta risorsa: risorsa non trovata nel database - Fine del file - Apertura del file non possibile - File non trovato - Tempo esaurito per il trasferimento file - Circuito perso - Il programma e il server non combaciano nel prezzo - Stato sconosciuto - Servizio non raggiungibile. - Il servizio sta riscontrando difficoltà inaspettate. - Servizio non disponibile o limite di tempo per il caricamento raggiunto. - Errore nella richiesta di caricamento. Vai alla pagina -http://secondlife.com/support per risolvere il problema. - Impossibile convalidare le impostazioni importate [NAME] - Impossibile aprire il file [FILE] - Impossibile aprire il file [FILE] - Impossibile tradurre la legacy vento e luce [NAME] - texture - suono - biglietto da visita - punto di riferimento - script (vecchia versione) - vestiario - oggetto - biglietto - cartella - cartella principale - script LSL2 - bytecode LSL - tga texture - parte del corpo - fotografia - oggetti smarriti - immagine targa - Cestino - immagine jpeg - animazione - gesture - simstate - preferiti - link - link alla cartella - impostazioni - reticolo - (Modifica Aspetto) - Assente - Non disturbare - Mutato - Dispiaciuto - Arrabbiato - Assente - Salto all'indietro - Ridere a crepapelle - Gran sorriso - Lancia un bacio - Noia - Inchino - Applauso - Inchino a corte - Pianto - Ballo 1 - Ballo 2 - Ballo 3 - Ballo 4 - Ballo 5 - Ballo 6 - Ballo 7 - Dance 8 - Sdegno - Bere - Imbarazzo - Negare col dito - Esultare con pugno - Yoga fluttuante - Acciglio - Impazienza - Salto di gioia - Baciami il sedere - Bacio - Risata - Muscoli da spiaggia - No (Scontento) - No - Na-na-na - Uno-due pugno - Bocca aperta - Pace - Indicare altri - Indicare te stesso - Pugno a sinistra - Pugno a destra - Contare nella morra cinese - Carta nella morra cinese - Sasso nella morra cinese - Forbici nella morra cinese - Repulsione - Calcio con rotazione - Triste - Saluto - Urlo - Spallucce - Sorriso - Fumare - Fumare inspirazione - Fumare mandando giù - Sorpresa - Colpo di spada - Collera - Linguaccia - Saluto con mano - Sussurro - Fischio - Ammicca - Ammicca (Hollywood) - Preoccupato - Si (Felice) - Si - Multiple - Usa texture - Sposta il cursore sul righello - per bloccare sulla griglia - Caricamento in corso... - Offline - L$ [PRICE] - [AREA] m² - Nessun risultato. - OK - Fine prematura del file - Impossibile trovare ROOT o JOINT. - Chat nei dintorni - (Chat nei dintorni) - sussurra: - grida: - In connessione alla Voice Chat in-world... - Connesso - Il voice non è disponibile nel posto dove ti trovi ora - Disconnesso dalla Voice Chat in-world - Sarai riconnesso alla chat vocale nei dintorni - A '[OBJECTNAME]', un oggetto di proprietà di '[OWNERNAME]', situato in [REGIONNAME] [REGIONPOS], è stato concesso il permesso di: [PERMISSIONS]. - A '[OBJECTNAME]', un oggetto di proprietà di '[OWNERNAME]', situato in [REGIONNAME] [REGIONPOS], è stato negato il permesso di: [PERMISSIONS]. - Se consenti l'accesso al tuo account, consentirai anche all'oggetto di: - Prendere dollari Linden (L$) da te - Agire sul tuo controllo degli input - Rimappare il tuo controllo degli input - Animare il tuo avatar - Far indossare al tuo avatar - Rilasciare la propietà è far diventare pubblico. - Collegare e scollegare dagli altri oggetti - Aggiungere e rimuovere le giunzioni insieme con gli altri oggetti - Cambiare i permessi - Tracciare la fotocamera - Controllare la tua fotocamera - Teleportarti - Forza l'avatar a sedersi - Cambia le impostazioni dell’ambiente - (Tu) - - Omette gli avvisi durante la gestione degli elenchi di accesso alle proprietà immobiliari - Sostituisce le animazioni predefinite - Restituisce oggetti per conto tuo - (sconosciuto)! - Generale - Moderato - Adulti - Offline - Sconosciuto - (sconosciuto) - Proprietà immobiliare / Regione completa - Proprietà immobiliare / Homestead - Continente / Homestead - Continente / Regione completa - Tutti i file - Suoni - Animazioni - Immagini - Salva - Carica - Immagini Targa - Immagini Bitmap - Immagini PNG - Immagini Targa o PNG - File video AVI - File animazione XAF - File XML - File RAW - Immagini compresse - Carica i file - Scegli la cartella - Script - Dizionari - Figura corporea - Pelle - Capigliature - Occhi - Camicia - Pantaloni - Scarpe - Calzini - Giacca - Guanti - Maglietta intima - Slip - Gonna - Alfa (Trasparenza) - Tatuaggio - Universale - Fisica - non valido - nessuno - Camicia non indossata - Pantaloni non indossati - Scarpe non indossate - Calzini non indossati - Giacca non indossata - Guanti non indossati - Maglietta intima non indossata - Slip non indossati - Gonna non indossata - Alpha non portato - Tatuaggio non portato - Universale non indossato - Fisica non indossata - non valido - Crea nuova figura corporea - Crea nuova pelle - Crea nuovi capelli - Crea nuovi occhi - Crea nuova camicia - Crea nuovi pantaloni - Crea nuove scarpe - Crea nuove calze - Crea nuova giacca - Crea nuovi guanti - Crea nuova maglietta intima - Crea nuovi slip - Crea nuova gonna - Crea nuovo Alpha - Crea un nuovo tatuaggio - Crea nuovo universale - Crea nuova fisica - non valido - Nuovo [WEARABLE_ITEM] - Avanti - OK - Avviso di gruppo - Avvisi di gruppo - Inviato da - Allegato: - Visualizza gli avvisi precedenti o scegli qui di non riceverne. - Apri l'allegato - Salva l'allegato - Offerta di Teleport - Mentre eri assente sono arrivate nuove notifiche... - Hai ancora [%d] notifiche - Braccio destro - Testa - Braccio sinistro - Gamba sinistra - Torace - Gamba destra - Scheletro avanzato - Basso - Medio - Alto - Premi ESC per tornare in visualizzazione normale - Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/all/[SEARCH_TERM] Cerca]. - Non hai trovato ció che cercavi? Prova [secondlife:///app/inventory/filters Show filters]. - Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/places/[SEARCH_TERM] Cerca]. - Trascina qui un punto di riferimento per aggiungerlo ai Preferiti. - Nessun articolo trovato. Controlla di aver digitato la stringa di ricerca correttamente e riprova. - Non hai una copia di questa texture nel tuo inventario - Gli acquissti dal mercato verranno mostrati qui. Potrai quindi trascinarli nel tuo inventario per usarli. - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ - http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more - Apri finestra con opzioni di Gioco. - Esegui il movimento selezionato nel mondo virtuale. - Apri finestra con opzioni di Gioco. - Chiunque può vendere oggetti nel Marketplace. - - Per diventare un venditore, devi [[MARKETPLACE_CREATE_STORE_URL] creare un negozio nel Marketplace]. - La tua casella in uscita è vuota. - - Trascina le cartelle in questa area e clicca su "Invia a Marketplace" per metterle in vendita su [[MARKETPLACE_DASHBOARD_URL] Marketplace]. - Inizializzazione Marketplace.in corso - Stiamo eseguendo l'accesso al tuo account sul [[MARKETPLACE_CREATE_STORE_URL] negozio Marketplace]. - Errori in Marketplace. - Il [[MARKETPLACE_CREATE_STORE_URL] negozio nel Marketplace] ha riportato errori. - Errore nell'apertura degli annunci di Marketplace. -Se continui a ricevere questo messaggio, contatta l'assistenza Second Life su http://support.secondlife.com. - La cartella degli annunci di Marketplace è vuota. - Trascina le cartelle in questa area per metterle in vendita su [[MARKETPLACE_DASHBOARD_URL] Marketplace]. - ( [ITEMS_COUNT] oggetti ) - la cartella di magazzino deve essere inclusa in una cartella di versione - : Errore: tutti gli articoli un una cartella di magazzino devono essere non copiabili e dello stesso tipo - : Errore: la cartella di magazzino non può contenere sottocartelle - : Avviso: la cartella non contiene alcun articolo - : Avviso: creazione cartella di magazzino in corso - : Avviso: creazione cartella di versione in corso - : Avviso: spostamento articoli in corso - : Avviso: il contenuto della cartella è stato trasferito alla cartella di magazzino e la cartella vuota sta per essere rimossa - : Errore: gli articoli di cui non è permessa la copia devono essere all'interno di una cartella di magazzino - : Avviso: gli articoli devono essere inclusi in una cartella di versione - : Errore: - : Avviso: - : Avviso: la cartella di versione deve contenere almeno 1 articolo - : Avviso: la cartella di magazzino deve contenere almeno 1 articolo - Nessun errore o avviso da segnalare - Nessun errore - Errore: - Prima di inviare gli articoli al Marketplace devi essere impostato come rivenditore (gratis). - L'articolo non può essere spostato in quella cartella. - Questo articolo non può essere venduto nel Marketplace. - no Mkt ID - in elenco - attivi - massimo - magazzino - non in magazzino - in aggiornamento... - La tariffa è basata sul tuo livello di membership. Più alto è il livello più bassa sarà la tariffa. [https://secondlife.com/my/account/membership.php? Per saperne di più] - Luoghi aperti - Senza limitazioni - - - - - - - Caricamento del contenuto... - Nessun contenuto - - - - - - - - - - - - - - - - - - - - - - - - - - - Il mio inventario - Libreria - Texture - Suoni - Biglietti da visita - Punti di riferimento - Script - Vestiario - Oggetti - Biglietti - Nuova cartella - Inventario - Immagini non compresse - Parti del corpo - Cestino - Album fotografico - Oggetti smarriti - Suoni non compressi - Animazioni - Gesture - I miei preferiti - I miei preferiti - I miei preferiti - I miei preferiti - Abbigliamento attuale - Vestiario iniziale - Il mio vestiario - Accessori - Reticoli - Oggetti ricevuti - Casella venditore in uscita - Amici - Tutto - Nessun allegato indossato - Allegati ([COUNT] spazi restanti) - Acquista - Acquista per L$ - Pietra - Metallo - Vetro - Legno - Carne - Plastica - Gomma - Luce - Maiusc - Ctrl - Petto - Cranio - Spalla sinistra - Spalla destra - Mano sinistra - Mano destra - Piede sinisto - Piede destro - Spina dorsale - Pelvi - Bocca - Mento - Orecchio sinistro - Orecchio destro - Bulbo sinistro - Bulbo destro - Naso - Avambraccio destro - Braccio destro - Avambraccio sinistro - Braccio sinistro - Anca destra - Coscia destra - Gamba destra - Anca sinista - Coscia sinistra - Gamba sinistra - Stomaco - Petto sinistro - Petto destro - Collo - Centro avatar - Anulare sinistro - Anulare destro - Base della coda - Punta della coda - Ala sinistra - Ala destra - Mandibola - Altro orecchio sinistro - Altro orecchio destro - Altro occhio sinistro - Altro occhio destro - Lingua - Inguine - Piede posteriore sinistro - Piede posteriore destro - Punto di collegamento non valido - Errore: articolo mancante - Errore: articolo di base mancante - Errore: l'oggetto è nel vestiario corrente ma non è collegato - Nato da [AGEYEARS] [AGEMONTHS] - Nato da [AGEYEARS] - Nato da [AGEMONTHS] - Nato da [AGEWEEKS] - Nato da [AGEDAYS] - Iscritto oggi - Ora ti possono vedere tutti. - Alcune persone vicine a te potrebbero non eseguire il tuo rendering. - La maggioranza delle persone vicine a te potrebbe non eseguire il tuo rendering. - La gran parte delle persone vicine a te potrebbe non eseguire il tuo rendering. - Tutte le persone vicine a te potrebbero non eseguire il tuo rendering. - Il tuo HUD - [OBJ_NAME] (indossato su [JNT_NAME]) - [HUD_DETAILS] fa uso di molta memoria texture - [HUD_DETAILS] contiene molti oggetti e texture che occupano una grande quantità di risorse - [HUD_DETAILS] contiene molte texture di grandi dimensioni - [HUD_DETAILS] contiene troppi oggetti - [HUD_DETAILS] contiene troppe texture - [COUNT] anno - [COUNT] anni - [COUNT] anni - [COUNT] mese - [COUNT] mesi - [COUNT] mesi - [COUNT] settimana - [COUNT] settimane - [COUNT] settimane - [COUNT] giorno - [COUNT] giorni - [COUNT] giorni - [COUNT] iscritto - [COUNT] iscritti - [COUNT] iscritti - Residente - In prova - Socio onorario - Dipendente Linden Lab - Informazioni di pagamento usate - Informazioni di pagamento registrate - Nessuna informazione di pagamento disponibile - Età verificata - Età non verificata - Centro 2 - In alto a destra - in alto - In alto a sinistra - Al centro - In basso a sinistra - In basso - In basso a destra - Scaricato, in compilazione - Il servizio di compilazione degli script non è disponibile - Script non trovato sul server. - Problema nel download - Permessi insufficenti per scaricare lo script. - Permessi insufficenti per - Errore di dowload sconosciuto - Saltato lo script [SCRIPT] con l'esperienza [EXPERIENCE]. - Avanzamento ricompilazione - ricompila - Azzera avanzamento - azzera - Attiva avanzamento - attiva - Disattiva avanzamento - disattiva - Compilazione riuscita! - Compilazione riuscita, in salvataggio... - Salvataggio completato. - Caricamento file non riuscito: - Script (oggetto fuori portata) - Script (eliminato da inventario) - Oggetto [OBJECT] di proprietà di [OWNER] - nessuno - - (Sconosciuto) - - - [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc] - - - Saldo - Ringraziamenti - Debiti - Totale - Nessun dato trovato per questo gruppo - Proprietà principale - continente - teen - chiunque - errore - tutte le proprietà immobiliari di [OWNER] - tutte le tue proprietà immobiliari - tutte le proprietà immobiliari che gestisci per conto di [OWNER] - Sempre consentiti: ([ALLOWEDAGENTS], max [MAXACCESS]) - Gruppi sempre consentiti: ([ALLOWEDGROUPS], max [MAXACCESS]) - Sempre esclusi: ([BANNEDAGENTS], max [MAXBANNED]) - Sempre consentiti: - Sempre esclusi: - tutte le proprietà immobiliari - proprietà immobiliari che gestisci - questa proprietà immobiliare - e [EXTRA_COUNT] ancora - Memoria dello script del lotto - Lotti in elenco: [PARCELS] - Memoria utilizzata: [COUNT] kb di [MAX] kb; [AVAILABLE] kb disponibili - Memoria utilizzata: [COUNT] kb - URL degli script lotti - URL utilizzati: [COUNT] di [MAX]; [AVAILABLE] disponibili - URL utilizzati: [COUNT] - Errore nella richiesta di informazioni - Nessun lotto selezionato - Errore: le informazioni sullo script sono disponibili solo nella tua regione attuale - Recupero informazioni in corso... - Non hai il permesso di visionare questo lotto - Seduto su - Petto - Cranio - Spalla sinistra - Spalla destra - Mano sinistra - Mano destra - Piede sinisto - Piede destro - Spina dorsale - Pelvi - Bocca - Mento - Orecchio sinistro - Orecchio destro - Occhio sinistro - Occhio destro - Naso - Braccio destro - Avambraccio destro - Braccio sinistro - Avambraccio sinistro - Anca destra - Coscia destra - Coscia destra - Anca sinista - Coscia sinistra - Polpaccio sinistro - Stomaco - Petto sinistro - Petto destro - HUD in centro 2 - HUD alto a destra - HUD alto in centro - HUD alto a sinistra - HUD in centro 1 - HUD basso a sinistra - HUD basso - HUD basso a destra - Collo - Centro avatar - Anulare sinistro - Anulare destro - Base della coda - Punta della coda - Ala sinistra - Ala destra - Mandibola - Altro orecchio sinistro - Altro orecchio destro - Altro occhio sinistro - Altro occhio destro - Lingua - Inguine - Piede posteriore sinistro - Piede posteriore destro - Riga [LINE], Colonna [COLUMN] - [COUNT] trovato/i - Contenuto dell'oggetto - Nuovo script - Questo residente ha attivato la modalità 'Non disturbare' e vedrà il tuo messaggio più tardi. - (In base al nome) - (Residente) - (Oggetto) - (Gruppo) - (esterno) - Non esiste alcun regolamento per questa proprietà. - Non esiste alcun regolamento per questa proprietà. Il terreno di questa proprietà è messo in vendita dal proprietario, non dalla Linden Lab. Contatta il proprietario del terreno per i dettagli della vendita. - - - - Di proprietà di un gruppo - Pubblica - Impostazioni locali - Impostazioni regione - Questa regione non supporta le impostazioni per l’ambiente. - Sole - Luna - Fioritura - Rumore nuvole - Mappa normale - Transparent - Clicca: [TELEPORT] teleport, [MAP] mappa, [PROFILE] profilo - (si aggiornerà dopo la pubblicazione) - Non hai creato luoghi preferiti né inserzioni. Clicca il pulsante + qui sotto per creare un luogo preferito o un'inserzione. - Non hai creato Luoghi preferiti. Fai clic sul pulsante Nuovo per creare un Luogo preferito. - Non hai creato Annunci. Fai clic sul pulsante Nuovo per creare un Annuncio. - L'utente non ha luoghi preferiti né inserzioni - L'utente non ha luoghi preferiti - L'utente non ha annunci - Caricamento in corso... - Anteprima - Beni immobiliari - Un oggetto denominato - di proprietà del gruppo - di proprietà di un gruppo sconosciuto - di proprietà di - di proprietà di un utente sconosciuto - Ti ha offerto - Non hai accettato [DESC] da <nolink>[NAME]</nolink>. - Totale - comprato - ti ha pagato - ha pagato - ha comprato il pass - pagato la tassa per l'evento - pagato il premio per l'evento - Saldo - Ringraziamenti - Debiti - [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] - Oggetti acquisiti - Annulla - Il caricamento di [NAME] costa L$ [AMOUNT] - L'acquisto di [NAME] costa L$ [AMOUNT] - Estensione del file sconosciuta [.%s] -Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh - Blocca - Aggiungi punto di riferimento... - Modifica punto di riferimento... - - - - - Ctrl+ - Alt+ - Shift+ - File salvato - In ricezione - antemeridiane - pomeridiane - Ora Pacifico - Ora legale Pacifico - Avanti - Sinistra - Destra - Indietro - Nord - Sud - Ovest - Est - Su - Giù - Qualsiasi categoria - Acquisti - Affitto terreno - Affitto proprietà - Attrazioni speciali - Nuovi prodotti - Lavoro - Cercasi - Servizio - Personale - Nessuno - Luogo dei Linden - Adult - Arte & Cultura - Affari - Educazione - Gioco - Divertimento - Accoglienza nuovi residenti - Parchi & Natura - Residenziale - Fase - Altro - Affitto - Tutti - Tu - Più supporti - Riproduci/Pausa supporto - http://www.intel.com/p/en_US/support/detect/graphics - http://www.nvidia.com/Download/index.aspx?lang=en-us - http://support.amd.com/us/Pages/AMDSupportHub.aspx - Un errore è stato riscontrato analizzando la linea di comando. -Per informazioni: http://wiki.secondlife.com/wiki/Client_parameters -Errore: - Uso linea di comando del programma [APP_NAME] : - Il programma [APP_NAME] non è in grado di accedere ad un file necessario. - -Potrebbe darsi che tu abbia copie multiple attivate o che il tuo sistema reputi erroneamente che il file sia già aperto. -Se il problema persiste, riavvia il computer e riprova. -Se il problema continua ancora, dovresti completamente disinstallare l'applicazione [APP_NAME] e reinstallarla. - Errore critico - Il programma [APP_NAME] richiede un processore con AltiVec (G4 o superiore). - Il programma [APP_NAME] è già attivo. -Controlla che il programma non sia minimizzato nella tua barra degli strumenti. -Se il messaggio persiste, riavvia il computer. - Sembra che [APP_NAME] si sia bloccata o interrotta nella sessione precedente. -Vuoi mandare un crash report? - Avviso - Il programmma [APP_NAME] non riesce a trovare una DirectX 9.0b o superiore. -[APP_NAME] usa DirectX per rilevare hardware e/o i driver non aggiornati che possono causare problemi di stabilità, scarsa performance e interruzioni. Benché tu possa avviare il programma [APP_NAME] senza di esse, consigliamo caldamente l'esecuzione con DirectX 9.0b. - -Vuoi continuare? - Attenzione - L'aggiornamento automatico non è stato ancora realizzato per Linux. -Consigliamo di scaricare l'ultima versione direttamente da www.secondlife.com. - RegisterClass non riuscito - Errore - Impossibile visualizzare a schermo intero con risoluzione [WIDTH] x [HEIGHT]. -Visualizzazione corrente in modalità finestra. - Errore di arresto durante il tentativo di chiusura della finestra (DestroyWindow() non riuscito) - Errore di arresto - Impossibile caricare i driver GL - Impossibile trovare un formato pixel adatto - Impossibile ottenere una descrizione del formato pixel - [APP_NAME] richiede True Color (32 bit) per funzionare. -Vai alle impostazioni dello schermo del tuo computer e imposta il colore in modalità 32 bit. - [APP_NAME] non funziona poichè è impossibile trovare un canale alpha a 8 bit. Questo problema normalmente deriva dai driver della scheda video. -Assicurati di avere installato i driver della scheda video più recenti. -Assicurati anche che il monitor sia impostato a True Color (32 bit) nel Pannello di controllo > Schermo > Impostazioni. -Se il messaggio persiste, contatta [SUPPORT_SITE]. - Impossibile impostare il formato pixel - Impossibile creare il GL rendering - Impossibile attivare il GL rendering - [APP_NAME] Non riesce ad avviarsi perchè i driver della tua scheda video non sono stati installati correttamente, non sono aggiornati, o sono per un hardware non supportato. Assicurati di avere i driver della scheda video più recenti e anche se li hai installati, prova a installarli di nuovo. - -Se il messaggio persiste, contatta [SUPPORT_SITE]. - Barba leggera - Tutti bianchi - Occhi grandi - Arcuato - Lunghezza braccia - Attaccato - Lobi attaccati - Frangetta all'indietro - Larghi - Frange - Occhi piccoli - Punto vita - Grande - Sedere grande - Capigliatura grande: Indietro - Capigliatura grande: anteriore - Capigliatura grande: in alto - Grande testa - Grandi pettorali - Capelli con punte - Nero - Biondo - Capelli biondi - Fard - Colore fard - Opacità fard - Definizione muscolare - Grasso corporeo - Lentiggini e nei - Corpo più robusto - Robustezza del corpo - Corpo più magro - Gambe arcuate - Altezza del seno - Décolleté - Grandezza del seno - Larghezza setto - Largo - Grandezza delle sopracciglia - Occhi sporgenti - Occhi sporgenti - Bulboso - Naso bulboso - Massa seno - Lisciatura seno - Gravità seno - Resistenza seno - Massimo effetto - Elasticità - Guadagno - Attenuazione - Massimo effetto - Elasticità - Guadagno - Attenuazione - Massimo effetto - Elasticità - Guadagno - Attenuazione - Massa pancia - Lisciatura pancia - Gravità pancia - Resistenza pancia - Massimo effetto - Elasticità - Guadagno - Attenuazione - Massa natiche - Lisciatura natiche - Gravità natiche - Resistenza natiche - Massimo effetto - Elasticità - Guadagno - Attenuazione - Massimo effetto - Elasticità - Guadagno - Attenuazione - Sopracciglia cespugliose - Capelli a cespuglio - Grandezza del sedere - Gravità natiche - Crinolina - Nessuna crinolina - Più crinolina - Baffetti - Zigomi - Ampiezza del torace - Angolo del mento - Fossetta sul mento - Barba sottomento - Profondità mento - Mento forte - Mento in dentro - Mento sporgente - Mento-collo - Trasparente - Fossetta - Occhi ravvicinati - Chiusa - Chiuso dietro - Chiuso davanti - Chiuso sinistra - Chiuso destra - Meno pronunciati - Colletto posteriore - Colletto anteriore - Angolo all'ingiù - Angolo all'insù - Piega - Naso storto - Svasato con risvolto - Scuro - Verde scuro - Più scuro - Profondo - Tacchi standard - Folti - Doppio mento - All'ingiù - Più pronunciati - Angolo orecchie - Grandezza orecchie - Estremità orecchie - Ovalizzazione testa - Occhiaie - Colore degli occhi - Profondità degli occhi - Luminosità degli occhi - Apertura degli occhi - Prominenza degli occhi - Grandezza occhi - Distanza occhi - Arco delle sopracciglia - Densità delle sopracciglia - Altezza delle sopracciglia - Sopracciglia appuntite - Grandezza sopracciglia - Lunghezza delle ciglia - Eyeliner - Colore dell'eyeliner - Occhi sporgenti - Taglio del viso - Definizione del viso - Occhi distanti - Labbra carnose - Femmina - Senza dita - Dita - Risvolti svasati - Piatto - Sedere piatto - Testa piatta - Punta piatta - Misura piede - Angolo della fronte - Fronte sporgente - Lentiggini - Frangetta - Dietro gonfi - Eyeliner marcato - Anteriore gonfio - Lati capelli gonfi - Lati gonfi - Lucido - Dita con guanti - Lunghezza guanti - Capigliature - Capelli: Indietro - Capelli: anteriore - Capelli: lati - Direzione capigliatura - Foltezza - Foltezza - Inclinazione - Verso sinistra - Verso destra - Capelli: Volume - Grandezza mani - Baffi a manubrio - Lunghezza testa - Forma della testa - Grandezza della testa - Allungamento testa - Altezza tacchi - Forma tacchi - Altezza - Alto - Tacchi alti - Mandibola alta - Alta - Alto e stretto - Più alto - Altezza bacino - Larghezza bacino - Muovi sopra - Dentro - Colore ombretto interno - Opacità ombretto interno - Angolo interno - Ombretto interno - Ombretto interno - Lunghezza giacca - Grinze della giacca - Angolo mandibola - Prognatismo mento - Forma del mento - Iscriviti - Guance - Angolo ginocchia - Gambe ad X - Grande - Mani grandi - Riga a sinistra - Lunghezza gambe - Muscoli gambe - Meno - Meno grasso corporeo - Meno - Meno lentiggini - Meno piene - Più alto - Meno maniglie - Meno muscoli - Meno muscolari - Meno rosato - Meno rotondo - Meno a sella - Meno quadrato - Meno volume - Meno - Più leggero - Distanza fossetta labbro - Prof. fossetta labbro - Volume labbra - Tonalità rosa labbra - Proporzione labbra - Carnosità labbra - Larghezza labbra - Lipgloss - Rossetto - Colore rossetto - Lungo - Testa lunga - Bacino alto - Gambe lunghe - Collo lungo - Codini lunghi - Codino lungo - Torace lungo - Braccia lunghe - Pantaloni ampi - Camicia ampia - Maniche non attillate - Maniglie dell'amore - Basso - Tacchi bassi - Mandibola bassa - Bassa - Basso e ampio - Più basso - Parte bassa del setto - Guance inferiori - Maschio - Riga nel mezzo - Altro - Più fard - Più grasso corporeo - Più - Più ombretto - Più lentiggini - Più piene - Più calato - Più rossetto - Più maniglie - Labbro inf. pronunciato - Più muscoli - Più muscolatura - Più rosato - Più rotondo - Più a sella - Più orizzontale - Più quadrato - Labbro sup. pronunciato - Più verticale - Più volume - Più - Baffi - Angolo della bocca - Posizione della bocca - Moicana - Muscolatura - Basette lunghe - Smalto - Colore smalto - Socchiusi - Laterali post. vicini - Laterali ant. vicini - Labbra strette - Naturale - Lunghezza del collo - Grandezza del collo - Senza fard - Senza eyeliner - Senza ombretto - Senza lipgloss - Senza rossetto - Senza riga - Senza smalto - Senza rosso - Senza punte - Senza bianco - Senza pieghe - Inferiore normale - Superiore normale - Naso a sinistra - Naso a destra - Grandezza naso - Spessore naso - Angolo punta naso - Forma punta naso - Larghezza naso - Divisione narici - Larghezza narici - Opaco - Apri - Retro aperto - Davanti aperto - Lato sin. aperto - Lato des. aperto - Arancio - Fuori - Colore ombretto esterno - Opacità ombretto esterno - Angolo esterno occhio - Ombretto esterno - Ombreggiatura esterna - Denti sup. in fuori - Genitali - Unghie smaltate - Pallido - Cavallo - Vestibilità pantaloni - Lunghezza pantaloni - Taglia pantalone - Pantaloni con le grinze - Con riga - Frangetta divisa - Pettorali - Pigmento - Codini - Rosa - Più rosato - Altezza pianta - Larghezza pianta - Appuntito - Tacchi a spillo - Codino - Gonna gonfia - Sinistro più aperto - Destro più aperto - Paffute - Palpebre gonfie - Tonalità - Presenza di rosso nei capelli - Normale - Riga a destra - Incarnato - Rotondo - Rossore - Rosse - Capelli mossi - Rotondità fianchi - Gambe magre - Separati - Meno pronunciato - Taglio posteriore - Taglio del viso - Taglio anteriore - Distorto a sinistra - Distorto a destra - Taglio verso dietro - Taglio verso davanti - A sinistra - Spostamento bocca - A destra - Parte inferiore camicia - Vestibilità camicia - Camicia con le grinze - Altezza scarpe - Basso - Braccia corte - Gambe corte - Collo corto - Codini corti - Codino corto - Basette corte - Torace corto - Bacino corto - Spalle - Ciuffi laterali - Basette - Capigliatura di lato - Capigliatura di lato sciolta - Capigliatura di lato raccolta - Collo fino - Vestibilità gonna - Lunghezza gonna - Fronte inclinata - Lunghezza maniche - Morbidezza maniche - Spacco: Indietro - Spacco: anteriore - Spacco: Sinistra - Spacco: Destra - Piccola - Mani piccole - Testa piccola - Liscio - Capelli lisci - Lunghezza calze - Pizzetto labbro inferiore - Piu rade - Capelli a punta - Quadrato - Punta quadrata - Testa schiacciata - Testa allungata - Scarne - Senza pettorali - Occhi infossati - Indietro - Avanti - Alto - Ravv. lat. posteriore - Ravv. lat. frontale - Tacchi spessi - Collo grosso - Punta spessa - Sottili - Sopracciglia sottili - Labbra sottili - Naso sottile - Mento stretto - Fondo stretto - Pantaloni attillati - Camicia attillata - Gonna attillata - Maniche strette - Forma della punta - Spessore della punta - Lunghezza del torace - Muscoli del torace - Torso Scrawny - Distaccato - Senza piega - Denti inf. in fuori - Innaturale - Parte alta del setto - Parte alta degli zigomi - Fossetta sup. del mento - Piega palpebra sup. - All'insù - Molto rossi - Vita alta - Pienotte - Capelli bianchi - Largo - Dietro largo - Davanti largo - Labbra larghe - Colorati - Grinze - Aggiungi ai miei punti di riferimento - Modifica i miei punti di riferimento - Maggiori informazioni sulla posizione attuale - La cronologia delle mie posizioni - Regione con categoria adulti - Regione con categoria moderata - Regione generale - Gli avatar in questo lotto non possono essere visti o sentiti da avatar all'esterno del lotto - Gli oggetti che si muovono potrebbero non comportarsi correttamente in questa regione fino a quando non viene eseguito il rebake della regione. - Il pathfinding dinamico non è attivato in questa regione. - Aggiornamento [APP_NAME] - Aggiornamento di [APP_NAME]... - Installazione di [APP_NAME]... - Il Viewer del programma [APP_NAME] si sta aggiornando all'ultima versione. Potrebbe volerci del tempo, attendi. - Download dell'aggiornamento... - Download dell'aggiornamento - Download dell'aggiornamento non riuscito - Il programma [APP_NAME] ha riscontrato un'errore durante il tentativo di aggiornamento. Consigliamo di scaricare l'ultima versione direttamente da www.secondlife.com. - Installazione dell'aggiornamento non riuscita - Errore nell'avvio del viewer - [APP_NAME]: Oggetti in arrivo troppo velocemente da [FROM_NAME], anteprima automatica disattivata per [TIME] secondi - [APP_NAME]: Oggetti in arrivo troppo velocemente, anteprima automatica disattivata per [TIME] secondi - -- Registrazione messaggi instantanei abilitata -- - [NAME] sta scrivendo... - (anonimo) - (Moderato: Voci disattivate di default) - La chat di testo non è disponibile per questa chiamata. - La chat di testo è stata disabilitata da un moderatore di gruppo. - Clicca qui per inviare un messaggio instantaneo. - A - (Moderatore) - (Salvato [LONG_TIMESTAMP]) - Per vedere questo messaggio, devi deselezionare 'Solo amici e gruppi possono chiamarmi o mandarmi IM' in Preferenze/Privacy. - Online - Offline - Utente non online - il messaggio verrà memorizzato e inviato più tardi. - Utente non online - l'inventario è stato salvato - Risposto alla chiamata - Hai iniziato una chiamata vocale - Ti sei collegato alla chiamata in voce - Hai rifiutato automaticamente la chiamata voce mentre era attivata la modalità 'Non disturbare'. - [NAME] ha iniziato una chiamata vocale - Collegamento alla chiamata vocale... - Collegato, clicca Chiudi chiamata per agganciare - Chiusa la chiamata - Chat con più persone - Chiamata in conferenza con [AGENT_NAME] - Offerto oggetto di inventario "[ITEM_NAME]" - Offerta cartella di inventario "[ITEM_NAME]" - -Stai parlando con un bot, [NAME]. Non condividere informazioni personali. -Scopri di più su https://second.life/scripted-agents. +possono essere allegati ai biglietti. - Hai pubblicato su Facebook. - Hai pubblicato su Flickr. - Hai pubblicato su Twitter. - (La sessione IM non esiste) - Sei l'unico utente di questa sessione. - [NAME] è offline - Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat. - Hai bloccato questo residente. Quando gli invii un messaggio, verrà automaticamente sbloccato. - Errore nella richiesta, riprova più tardi. - Errore durante la richiesta, riprova più tardi. - Non hai sufficienti permessi. - Questa sessione non esiste più - Non hai questa abilitazione. - Non hai questa abilitazione. - Non sei un moderatore. - Il moderatore del gruppo ha disattivato la tua chat di testo. - Un moderatore di gruppo ti ha disabilitato dalla chat di testo. - Impossibile aggiungere utenti alla chat con [RECIPIENT]. - Impossibile spedire il tuo messaggio nella sessione chat con [RECIPIENT]. - Impossibile inviare il messaggio nella chat con [RECIPIENT]. - Errore durante la moderazione. - Sei stato rimosso dal gruppo. - Sei stato espulso dal gruppo. - Non hai più le abilitazioni per rimanere nella sessione chat. - [SOURCES] ha detto qualcosa di nuovo - [SOURCES] ha detto qualcosa di nuovo - Sessione di inizializzazione scaduta - Posizione di base impostata. - https://secondlife.com/destination/voice-island - https://secondlife.com/destination/voice-morphing-premium - [NAME] ti ha inviato un pagamento di L$[AMOUNT] [REASON]. - [NAME] ti ha inviato un pagamento di L$ [AMOUNT]: [REASON] - [NAME] ti ha inviato un pagamento di L$[AMOUNT]. - Hai inviato un pagamento di L$[AMOUNT] a [NAME] [REASON]. - Hai inviato un pagamento di L$ [AMOUNT] a [NAME]: [REASON] - Hai pagato L$ [AMOUNT]. - Hai inviato un pagamento di L$[AMOUNT] a [NAME]. - Hai pagato L$ [AMOUNT] [REASON]. - Non hai pagato [NAME] L$[AMOUNT] [REASON]. - Non hai inviato un pagamento di L$ [AMOUNT] a [NAME]: [REASON] - Non hai pagato L$ [AMOUNT]. - Non hai pagato [NAME] L$[AMOUNT]. - Non hai pagato L$ [AMOUNT] [REASON]. - per [ITEM] - per un lotto di terreno - per un permesso di accesso al terreno - per la cessione di terreno - per creare un gruppo - per aderire a un gruppo - per caricare - per pubblicare un annuncio - Contributo di L$ [AMOUNT] - Il costo per il caricamento è di L$ [AMOUNT] - Il costo è L$ [AMOUNT] - L'acquisto del terreno prescelto costa L$ [AMOUNT] - Il costo dell'oggetto è L$ [AMOUNT] - Tutti - Funzionari - Proprietari - Online - Caricamento in corso... - -Segnala abuso - Nuova figura corporea - Nuova pelle - Nuovi capelli - Nuovi occhi - Nuova camicia - Nuovi pantaloni - Nuove scarpe - Nuove calze - Nuova giacca - Nuovi guanti - Nuova maglietta intima - Nuovi slip - Nuova gonna - Nuovo Alpha (trasparenza) - Nuovo tatuaggio - Nuovo Universale - Nuova fisica - Capo da indossare non valido - Nuova gesture - Nuovo script - Nuovo appunto - Nuova cartella - Contenuto - Gesture - Gesture maschili - Gesture femminili - Altre gesture - Gesture del parlato - Gesture comuni - Maschio - Chiedere scusa - Maschio - Levati dai piedi! - Maschio - Butta un bacio - Maschio - Bu - Maschio - Annoiato - Maschio - Ehi - Maschio - Ridere - Maschio - Disgustato - Maschio - Spallucce - Maschio - Tira fuori la lingua - Maschio - Accipicchia - Femmina - Risatina - Femmina - Pianto - Femmina - Imbarazzata - Femmina - Chiedere scusa - Femmina - Levati dai piedi! - Femmina - Butta un bacio - Femmina - Bu - Femmina - Annoiata - Femmina - Ehi - Femmina - Ehi tu - Femmina - Ridere - Femmina - Sei in forma - Femmina - Per di qua - Femmina - Per cortesia - Femmina - Disgustata - Femmina - Spallucce - Femmina - Tira fuori la lingua - Femmina - Accipicchia - Nuovo ciclo giornata - Nuova acqua - Nuovo cielo - /inchino - /applausi - /numero - /estingui - /chissene - /muscolo - /no - /no! - /carta - /indicome - /indicotu - /sasso - /forbici - /fumo - /stiracchiata - /fischietto - /si - /si! - non alla tastiera - danza1 - danza2 - danza3 - danza4 - danza5 - danza6 - danza7 - danza8 - [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt] - nessuna/nessuna - Impossibile caricare immagini di dimensioni superiori a [WIDTH]*[HEIGHT] - Le dimensioni massime delle foto di vestiario sono [WIDTH]*[HEIGHT]. Ridimensiona l'immagine o usane un'altra - Le dimensioni massime delle foto di vestiario sono [WIDTH]*[HEIGHT]. Seleziona un'altra texture - Impossibile verificare le dimensioni della foto. Attendi che le dimensioni siano visualizzate nel selettore. - - Nonostante i nostri tentativi, si è verificato un errore imprevisto. - -Consulta la pagina http://status.secondlifegrid.net per determinare se il problema del servizio è già stato riscontrato. - Se il problema continua, ti consigliamo di controllare le tue impostazioni di rete e del firewall. - lunedì:martedì:mercoledì:giovedì:venerdì:sabato:domenica - lun:mar:mer:gio:ven:sab:dom - gennaio:febbraio:marzo:aprile:maggio:giugno:luglio:agosto:settembre:ottobre:novembre:dicembre - gen:feb:mar:apr:mag:giu:lug:ago:sett:ott:nov:dic - [MDAY] - antemeridiane - pomeridiane - US$ [AMOUNT] - Espulsione di gruppo - Abbonamento - Ruoli - Identità gruppo - Gestione lotto - Identità lotto - Impostazioni lotto - Poteri lotto - Accesso al lotto - Contenuto lotto - Gestione oggetti - Contabilità - Avvisi - Chat - Base - Premium - Premium Plus - Cancellare gli elementi selezionati? - Cancellare l’elemento selezionato? - Questo vestiario non contiene alcun elemento - Seleziona un editor usando le impostazioni ExternalEditor. - L'editor esterno specificato non è stato trovato. -Prova a racchiudere il percorso dell'editor in doppie virgolette. -(per es. "/percorso per il mio/editor" "%s") - Errore nell'elaborazione del comando dell'editor esterno. - L'editor esterno non è stato avviato. - Traduzione non riuscita: [REASON] - Errore di elaborazione della risposta della traduzione. - Esc - Space - Enter - Tab - Ins - Del - Backsp - Shift - Ctrl - Alt - CapsLock - Home - End - PgUp - PgDn - F1 - F2 - F3 - F4 - F5 - F6 - F7 - F8 - F9 - F10 - F11 - F12 - Aggiungi - Sottrai - Moltiplica - Dividi - PAD_DIVIDE - PAD_LEFT - PAD_RIGHT - PAD_DOWN - PAD_UP - PAD_HOME - PAD_END - PAD_PGUP - PAD_PGDN - PAD_CENTER - PAD_INS - PAD_DEL - PAD_Enter - PAD_BUTTON0 - PAD_BUTTON1 - PAD_BUTTON2 - PAD_BUTTON3 - PAD_BUTTON4 - PAD_BUTTON5 - PAD_BUTTON6 - PAD_BUTTON7 - PAD_BUTTON8 - PAD_BUTTON9 - PAD_BUTTON10 - PAD_BUTTON11 - PAD_BUTTON12 - PAD_BUTTON13 - PAD_BUTTON14 - PAD_BUTTON15 - - - = - ` - ; - [ - ] - \ - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - A - B - C - D - E - F - G - H - I - J - K - L - M - N - O - P - Q - R - S - T - U - V - W - X - Y - Z - Visualizzazione marcatori particelle (blu) - Visualizzazione marcatori oggetti fisici (verde) - Visualizzazione marcatori oggetti scriptati (rosso) - Visualizzazione marcatori oggetti scriptati con funzione tocco (rosso) - Visualizzazione marcatori suoni (giallo) - Visualizzazione marcatori multimedia (bianco) - Marcatore visualizza direzione sole (arancione) - Marcatore visualizza direzione luna (viola) - Particelle nascoste - Informazioni sul terreno - Aspetto fisico - Avatar - Costruisci - Chat - Conversazioni - Bussola - Destinazioni - I miei ambienti - Facebook - Flickr - Gesture - Stato della griglia - Istruzioni - Inventario - Mappa - Mercato - Marketplace - Mini mappa - Cammina / corri / vola - Casella in uscita del rivenditore - Persone - Preferiti - Luoghi - Preferenze - Profilo - Segnala abuso - Ricerca - Istantanea - Parla - Twitter - Controlli fotocamera - Impostazioni voce - Informazioni sul terreno che visiti - Cambia l'avatar - Seleziona un avatar completo - Costruzione oggetti e modifica terreno - Chatta con persone vicine usando il testo - Conversa con chiunque - Bussola - Destinazioni interessanti - I miei ambienti - Pubblica su Facebook - Carica su Flickr - Gesti per il tuo avatar - Mostra stato griglia corrente - Come eseguire le attività più comuni - Visualizza e usa le tue cose - Mappa del mondo - Vai allo shopping - Vendi le tue creazioni - Mostra le persone vicine - Movimento avatar - Trasferisci elementi al tuo mercato per la vendita - Amici, gruppi e persone vicine - Luoghi da mostrare come preferiti nel profilo - Luoghi salvati - Preferenze - Modifica o visualizza il tuo profilo - Segnala abuso - Trova luoghi, eventi, persone - Scatta una foto - Parla con persone vicine usando il microfono - Twitter - Modifica angolo fotocamera - I controlli per il volume per le chiamate e per le persone nelle vicinanze nel mondo virtuale - attualmente nella barra degli strumenti in basso - attualmente nella barra degli strumenti a sinistra - attualmente nella barra degli strumenti a destra - Mantieni% - Dettagli - Migliori dettagli - Superficie - Solido - Involucro - Anteprima - Normale - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - Nessuno - Influenza il navmesh - Personaggio - (Multiple) - Molto basso - Basso - Medio - Alto - Molto alto - Il Residente non può visitare questa regione. - [User] - Esperienza - (nessuna esperienza) - (esperienza senza titolo) - A livello di terreno - A livello di griglia - CONSENTITO - BLOCCATO - FORNITORE - AMMINISTRATORE - RECENTE - DI PROPRIETÀ - ([EXPERIENCES], massimo [MAXEXPERIENCES]) - gestione dei tuoi comandi - attivazione di animazioni per il tuo avatar - collegamento al tuo avatar - monitoraggio della tua videocamera - controllo della tua videocamera - ti teletrasporta - accettazione automatica delle autorizzazioni per le esperienze - obbliga l'avatar a sedersi - cambia le impostazioni dell’ambiente - ha eseguito un'operazione sconosciuta: [Permission] - Gestione dei comandi - Attivazione di animazioni - Collegamento - Monitoraggio videocamera - Controllo videocamera - Teleport - Autorizzazione - Siediti - Ambiente - Le conversazioni non vengono registrate. Per iniziare a registrare, seleziona "Salva: Solo registro" oppure "Salva: Registri e trascrizioni" in Preferenze > Chat. - Non verranno registrate più le conversazioni. Per riprendere a registrare, seleziona "Salva: Solo registro" oppure "Salva: Registri e trascrizioni" in Preferenze > Chat. - Nessuna conversazione in registro. Dopo che hai contattato qualcuno o se qualcuno ti contatta, una voce del registro verrà mostrata qui. - Caricamento in corso... - n/d - -Lista vuota- - Predefinita - (Nulla) - Senza limite - La forma della fisica contiene triangoli troppo piccoli. Prova a semplificare il modello della fisica. - La forma della fisica contiene dati di conferma errati. Prova a correggere il modello della fisica. - La versione della forma fisica non è corretta. Imposta la versione corretta per il modello della fisica. - Il DNS non ha potuto risolvere il nome dell’host([HOSTNAME]). + + Ricerca in corso... + + + Nessun risultato. + + + Recupero dati in corso... + + + Note sulla versione + + + https://releasenotes.secondlife.com/viewer/ + + + In caricamento... + + + (nessuno) + + + (in attesa) + + + (nessuno) + + + Nessun errore + + + Richiesta risorsa: fallita + + + Richiesta risorsa: file non esistente + + + Richiesta risorsa: risorsa non trovata nel database + + + Fine del file + + + Apertura del file non possibile + + + File non trovato + + + Tempo esaurito per il trasferimento file + + + Circuito perso + + + Il programma e il server non combaciano nel prezzo + + + Stato sconosciuto + + + Servizio non raggiungibile. + + + Il servizio sta riscontrando difficoltà inaspettate. + + + Servizio non disponibile o limite di tempo per il caricamento raggiunto. + + + Errore nella richiesta di caricamento. Vai alla pagina +http://secondlife.com/support per risolvere il problema. + + + Impossibile convalidare le impostazioni importate [NAME] + + + Impossibile aprire il file [FILE] + + + Impossibile aprire il file [FILE] + + + Impossibile tradurre la legacy vento e luce [NAME] + + + texture + + + suono + + + biglietto da visita + + + punto di riferimento + + + script (vecchia versione) + + + vestiario + + + oggetto + + + biglietto + + + cartella + + + cartella principale + + + script LSL2 + + + bytecode LSL + + + tga texture + + + parte del corpo + + + fotografia + + + oggetti smarriti + + + immagine targa + + + Cestino + + + immagine jpeg + + + animazione + + + gesture + + + simstate + + + preferiti + + + link + + + link alla cartella + + + impostazioni + + + reticolo + + + (Modifica Aspetto) + + + Assente + + + Non disturbare + + + Mutato + + + Dispiaciuto + + + Arrabbiato + + + Assente + + + Salto all'indietro + + + Ridere a crepapelle + + + Gran sorriso + + + Lancia un bacio + + + Noia + + + Inchino + + + Applauso + + + Inchino a corte + + + Pianto + + + Ballo 1 + + + Ballo 2 + + + Ballo 3 + + + Ballo 4 + + + Ballo 5 + + + Ballo 6 + + + Ballo 7 + + + Dance 8 + + + Sdegno + + + Bere + + + Imbarazzo + + + Negare col dito + + + Esultare con pugno + + + Yoga fluttuante + + + Acciglio + + + Impazienza + + + Salto di gioia + + + Baciami il sedere + + + Bacio + + + Risata + + + Muscoli da spiaggia + + + No (Scontento) + + + No + + + Na-na-na + + + Uno-due pugno + + + Bocca aperta + + + Pace + + + Indicare altri + + + Indicare te stesso + + + Pugno a sinistra + + + Pugno a destra + + + Contare nella morra cinese + + + Carta nella morra cinese + + + Sasso nella morra cinese + + + Forbici nella morra cinese + + + Repulsione + + + Calcio con rotazione + + + Triste + + + Saluto + + + Urlo + + + Spallucce + + + Sorriso + + + Fumare + + + Fumare inspirazione + + + Fumare mandando giù + + + Sorpresa + + + Colpo di spada + + + Collera + + + Linguaccia + + + Saluto con mano + + + Sussurro + + + Fischio + + + Ammicca + + + Ammicca (Hollywood) + + + Preoccupato + + + Si (Felice) + + + Si + + + Multiple + + + Usa texture + + + Sposta il cursore sul righello + + + per bloccare sulla griglia + + + Caricamento in corso... + + + Offline + + + L$ [PRICE] - [AREA] m² + + + Nessun risultato. + + + OK + + + Fine prematura del file + + + Impossibile trovare ROOT o JOINT. + + + Chat nei dintorni + + + (Chat nei dintorni) + + + sussurra: + + + grida: + + + In connessione alla Voice Chat in-world... + + + Connesso + + + Il voice non è disponibile nel posto dove ti trovi ora + + + Disconnesso dalla Voice Chat in-world + + + Sarai riconnesso alla chat vocale nei dintorni + + + A '[OBJECTNAME]', un oggetto di proprietà di '[OWNERNAME]', situato in [REGIONNAME] [REGIONPOS], è stato concesso il permesso di: [PERMISSIONS]. + + + A '[OBJECTNAME]', un oggetto di proprietà di '[OWNERNAME]', situato in [REGIONNAME] [REGIONPOS], è stato negato il permesso di: [PERMISSIONS]. + + + Se consenti l'accesso al tuo account, consentirai anche all'oggetto di: + + + Prendere dollari Linden (L$) da te + + + Agire sul tuo controllo degli input + + + Rimappare il tuo controllo degli input + + + Animare il tuo avatar + + + Far indossare al tuo avatar + + + Rilasciare la propietà è far diventare pubblico. + + + Collegare e scollegare dagli altri oggetti + + + Aggiungere e rimuovere le giunzioni insieme con gli altri oggetti + + + Cambiare i permessi + + + Tracciare la fotocamera + + + Controllare la tua fotocamera + + + Teleportarti + + + Forza l'avatar a sedersi + + + Cambia le impostazioni dell’ambiente + + + (Tu) + + + + Omette gli avvisi durante la gestione degli elenchi di accesso alle proprietà immobiliari + + + Sostituisce le animazioni predefinite + + + Restituisce oggetti per conto tuo + + + (sconosciuto)! + + + Generale + + + Moderato + + + Adulti + + + Offline + + + Sconosciuto + + + (sconosciuto) + + + Proprietà immobiliare / Regione completa + + + Proprietà immobiliare / Homestead + + + Continente / Homestead + + + Continente / Regione completa + + + Tutti i file + + + Suoni + + + Animazioni + + + Immagini + + + Salva + + + Carica + + + Immagini Targa + + + Immagini Bitmap + + + Immagini PNG + + + Immagini Targa o PNG + + + File video AVI + + + File animazione XAF + + + File XML + + + File RAW + + + Immagini compresse + + + Carica i file + + + Scegli la cartella + + + Script + + + Dizionari + + + Figura corporea + + + Pelle + + + Capigliature + + + Occhi + + + Camicia + + + Pantaloni + + + Scarpe + + + Calzini + + + Giacca + + + Guanti + + + Maglietta intima + + + Slip + + + Gonna + + + Alfa (Trasparenza) + + + Tatuaggio + + + Universale + + + Fisica + + + non valido + + + nessuno + + + Camicia non indossata + + + Pantaloni non indossati + + + Scarpe non indossate + + + Calzini non indossati + + + Giacca non indossata + + + Guanti non indossati + + + Maglietta intima non indossata + + + Slip non indossati + + + Gonna non indossata + + + Alpha non portato + + + Tatuaggio non portato + + + Universale non indossato + + + Fisica non indossata + + + non valido + + + Crea nuova figura corporea + + + Crea nuova pelle + + + Crea nuovi capelli + + + Crea nuovi occhi + + + Crea nuova camicia + + + Crea nuovi pantaloni + + + Crea nuove scarpe + + + Crea nuove calze + + + Crea nuova giacca + + + Crea nuovi guanti + + + Crea nuova maglietta intima + + + Crea nuovi slip + + + Crea nuova gonna + + + Crea nuovo Alpha + + + Crea un nuovo tatuaggio + + + Crea nuovo universale + + + Crea nuova fisica + + + non valido + + + Nuovo [WEARABLE_ITEM] + + + Avanti + + + OK + + + Avviso di gruppo + + + Avvisi di gruppo + + + Inviato da + + + Allegato: + + + Visualizza gli avvisi precedenti o scegli qui di non riceverne. + + + Apri l'allegato + + + Salva l'allegato + + + Offerta di Teleport + + + Mentre eri assente sono arrivate nuove notifiche... + + + Hai ancora [%d] notifiche + + + Braccio destro + + + Testa + + + Braccio sinistro + + + Gamba sinistra + + + Torace + + + Gamba destra + + + Scheletro avanzato + + + Basso + + + Medio + + + Alto + + + Premi ESC per tornare in visualizzazione normale + + + Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/all/[SEARCH_TERM] Cerca]. + + + Non hai trovato ció che cercavi? Prova [secondlife:///app/inventory/filters Show filters]. + + + Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/places/[SEARCH_TERM] Cerca]. + + + Trascina qui un punto di riferimento per aggiungerlo ai Preferiti. + + + Nessun articolo trovato. Controlla di aver digitato la stringa di ricerca correttamente e riprova. + + + Non hai una copia di questa texture nel tuo inventario + + + Gli acquissti dal mercato verranno mostrati qui. Potrai quindi trascinarli nel tuo inventario per usarli. + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ + + + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more + + + Apri finestra con opzioni di Gioco. + + + Esegui il movimento selezionato nel mondo virtuale. + + + Apri finestra con opzioni di Gioco. + + + Chiunque può vendere oggetti nel Marketplace. + + + + Per diventare un venditore, devi [[MARKETPLACE_CREATE_STORE_URL] creare un negozio nel Marketplace]. + + + La tua casella in uscita è vuota. + + + + Trascina le cartelle in questa area e clicca su "Invia a Marketplace" per metterle in vendita su [[MARKETPLACE_DASHBOARD_URL] Marketplace]. + + + Inizializzazione Marketplace.in corso + + + Stiamo eseguendo l'accesso al tuo account sul [[MARKETPLACE_CREATE_STORE_URL] negozio Marketplace]. + + + Errori in Marketplace. + + + Il [[MARKETPLACE_CREATE_STORE_URL] negozio nel Marketplace] ha riportato errori. + + + Errore nell'apertura degli annunci di Marketplace. +Se continui a ricevere questo messaggio, contatta l'assistenza Second Life su http://support.secondlife.com. + + + La cartella degli annunci di Marketplace è vuota. + + + Trascina le cartelle in questa area per metterle in vendita su [[MARKETPLACE_DASHBOARD_URL] Marketplace]. + + + ( [ITEMS_COUNT] oggetti ) + + + la cartella di magazzino deve essere inclusa in una cartella di versione + + + : Errore: tutti gli articoli un una cartella di magazzino devono essere non copiabili e dello stesso tipo + + + : Errore: la cartella di magazzino non può contenere sottocartelle + + + : Avviso: la cartella non contiene alcun articolo + + + : Avviso: creazione cartella di magazzino in corso + + + : Avviso: creazione cartella di versione in corso + + + : Avviso: spostamento articoli in corso + + + : Avviso: il contenuto della cartella è stato trasferito alla cartella di magazzino e la cartella vuota sta per essere rimossa + + + : Errore: gli articoli di cui non è permessa la copia devono essere all'interno di una cartella di magazzino + + + : Avviso: gli articoli devono essere inclusi in una cartella di versione + + + : Errore: + + + : Avviso: + + + : Avviso: la cartella di versione deve contenere almeno 1 articolo + + + : Avviso: la cartella di magazzino deve contenere almeno 1 articolo + + + Nessun errore o avviso da segnalare + + + Nessun errore + + + Errore: + + + Prima di inviare gli articoli al Marketplace devi essere impostato come rivenditore (gratis). + + + L'articolo non può essere spostato in quella cartella. + + + Questo articolo non può essere venduto nel Marketplace. + + + no Mkt ID + + + in elenco + + + attivi + + + massimo + + + magazzino + + + non in magazzino + + + in aggiornamento... + + + La tariffa è basata sul tuo livello di membership. Più alto è il livello più bassa sarà la tariffa. [https://secondlife.com/my/account/membership.php? Per saperne di più] + + + Luoghi aperti + + + Senza limitazioni + + + + + + + + + Caricamento del contenuto... + + + Nessun contenuto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Il mio inventario + + + Libreria + + + Texture + + + Suoni + + + Biglietti da visita + + + Punti di riferimento + + + Script + + + Vestiario + + + Oggetti + + + Biglietti + + + Nuova cartella + + + Inventario + + + Immagini non compresse + + + Parti del corpo + + + Cestino + + + Album fotografico + + + Oggetti smarriti + + + Suoni non compressi + + + Animazioni + + + Gesture + + + I miei preferiti + + + I miei preferiti + + + I miei preferiti + + + I miei preferiti + + + Abbigliamento attuale + + + Vestiario iniziale + + + Il mio vestiario + + + Accessori + + + Reticoli + + + Oggetti ricevuti + + + Casella venditore in uscita + + + Amici + + + Tutto + + + Nessun allegato indossato + + + Allegati ([COUNT] spazi restanti) + + + Acquista + + + Acquista per L$ + + + Pietra + + + Metallo + + + Vetro + + + Legno + + + Carne + + + Plastica + + + Gomma + + + Luce + + + Maiusc + + + Ctrl + + + Petto + + + Cranio + + + Spalla sinistra + + + Spalla destra + + + Mano sinistra + + + Mano destra + + + Piede sinisto + + + Piede destro + + + Spina dorsale + + + Pelvi + + + Bocca + + + Mento + + + Orecchio sinistro + + + Orecchio destro + + + Bulbo sinistro + + + Bulbo destro + + + Naso + + + Avambraccio destro + + + Braccio destro + + + Avambraccio sinistro + + + Braccio sinistro + + + Anca destra + + + Coscia destra + + + Gamba destra + + + Anca sinista + + + Coscia sinistra + + + Gamba sinistra + + + Stomaco + + + Petto sinistro + + + Petto destro + + + Collo + + + Centro avatar + + + Anulare sinistro + + + Anulare destro + + + Base della coda + + + Punta della coda + + + Ala sinistra + + + Ala destra + + + Mandibola + + + Altro orecchio sinistro + + + Altro orecchio destro + + + Altro occhio sinistro + + + Altro occhio destro + + + Lingua + + + Inguine + + + Piede posteriore sinistro + + + Piede posteriore destro + + + Punto di collegamento non valido + + + Errore: articolo mancante + + + Errore: articolo di base mancante + + + Errore: l'oggetto è nel vestiario corrente ma non è collegato + + + Nato da [AGEYEARS] [AGEMONTHS] + + + Nato da [AGEYEARS] + + + Nato da [AGEMONTHS] + + + Nato da [AGEWEEKS] + + + Nato da [AGEDAYS] + + + Iscritto oggi + + + Ora ti possono vedere tutti. + + + Alcune persone vicine a te potrebbero non eseguire il tuo rendering. + + + La maggioranza delle persone vicine a te potrebbe non eseguire il tuo rendering. + + + La gran parte delle persone vicine a te potrebbe non eseguire il tuo rendering. + + + Tutte le persone vicine a te potrebbero non eseguire il tuo rendering. + + + Il tuo HUD + + + [OBJ_NAME] (indossato su [JNT_NAME]) + + + [HUD_DETAILS] fa uso di molta memoria texture + + + [HUD_DETAILS] contiene molti oggetti e texture che occupano una grande quantità di risorse + + + [HUD_DETAILS] contiene molte texture di grandi dimensioni + + + [HUD_DETAILS] contiene troppi oggetti + + + [HUD_DETAILS] contiene troppe texture + + + [COUNT] anno + + + [COUNT] anni + + + [COUNT] anni + + + [COUNT] mese + + + [COUNT] mesi + + + [COUNT] mesi + + + [COUNT] settimana + + + [COUNT] settimane + + + [COUNT] settimane + + + [COUNT] giorno + + + [COUNT] giorni + + + [COUNT] giorni + + + [COUNT] iscritto + + + [COUNT] iscritti + + + [COUNT] iscritti + + + Residente + + + In prova + + + Socio onorario + + + Dipendente Linden Lab + + + Informazioni di pagamento usate + + + Informazioni di pagamento registrate + + + Nessuna informazione di pagamento disponibile + + + Età verificata + + + Età non verificata + + + Centro 2 + + + In alto a destra + + + in alto + + + In alto a sinistra + + + Al centro + + + In basso a sinistra + + + In basso + + + In basso a destra + + + Scaricato, in compilazione + + + Il servizio di compilazione degli script non è disponibile + + + Script non trovato sul server. + + + Problema nel download + + + Permessi insufficenti per scaricare lo script. + + + Permessi insufficenti per + + + Errore di dowload sconosciuto + + + Saltato lo script [SCRIPT] con l'esperienza [EXPERIENCE]. + + + Avanzamento ricompilazione + + + ricompila + + + Azzera avanzamento + + + azzera + + + Attiva avanzamento + + + attiva + + + Disattiva avanzamento + + + disattiva + + + Compilazione riuscita! + + + Compilazione riuscita, in salvataggio... + + + Salvataggio completato. + + + Caricamento file non riuscito: + + + Script (oggetto fuori portata) + + + Script (eliminato da inventario) + + + Oggetto [OBJECT] di proprietà di [OWNER] + + + nessuno + + + + (Sconosciuto) + + + + + [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc] + + + + + Saldo + + + Ringraziamenti + + + Debiti + + + Totale + + + Nessun dato trovato per questo gruppo + + + Proprietà principale + + + continente + + + teen + + + chiunque + + + errore + + + tutte le proprietà immobiliari di [OWNER] + + + tutte le tue proprietà immobiliari + + + tutte le proprietà immobiliari che gestisci per conto di [OWNER] + + + Sempre consentiti: ([ALLOWEDAGENTS], max [MAXACCESS]) + + + Gruppi sempre consentiti: ([ALLOWEDGROUPS], max [MAXACCESS]) + + + Sempre esclusi: ([BANNEDAGENTS], max [MAXBANNED]) + + + Sempre consentiti: + + + Sempre esclusi: + + + tutte le proprietà immobiliari + + + proprietà immobiliari che gestisci + + + questa proprietà immobiliare + + + e [EXTRA_COUNT] ancora + + + Memoria dello script del lotto + + + Lotti in elenco: [PARCELS] + + + Memoria utilizzata: [COUNT] kb di [MAX] kb; [AVAILABLE] kb disponibili + + + Memoria utilizzata: [COUNT] kb + + + URL degli script lotti + + + URL utilizzati: [COUNT] di [MAX]; [AVAILABLE] disponibili + + + URL utilizzati: [COUNT] + + + Errore nella richiesta di informazioni + + + Nessun lotto selezionato + + + Errore: le informazioni sullo script sono disponibili solo nella tua regione attuale + + + Recupero informazioni in corso... + + + Non hai il permesso di visionare questo lotto + + + Seduto su + + + Petto + + + Cranio + + + Spalla sinistra + + + Spalla destra + + + Mano sinistra + + + Mano destra + + + Piede sinisto + + + Piede destro + + + Spina dorsale + + + Pelvi + + + Bocca + + + Mento + + + Orecchio sinistro + + + Orecchio destro + + + Occhio sinistro + + + Occhio destro + + + Naso + + + Braccio destro + + + Avambraccio destro + + + Braccio sinistro + + + Avambraccio sinistro + + + Anca destra + + + Coscia destra + + + Coscia destra + + + Anca sinista + + + Coscia sinistra + + + Polpaccio sinistro + + + Stomaco + + + Petto sinistro + + + Petto destro + + + HUD in centro 2 + + + HUD alto a destra + + + HUD alto in centro + + + HUD alto a sinistra + + + HUD in centro 1 + + + HUD basso a sinistra + + + HUD basso + + + HUD basso a destra + + + Collo + + + Centro avatar + + + Anulare sinistro + + + Anulare destro + + + Base della coda + + + Punta della coda + + + Ala sinistra + + + Ala destra + + + Mandibola + + + Altro orecchio sinistro + + + Altro orecchio destro + + + Altro occhio sinistro + + + Altro occhio destro + + + Lingua + + + Inguine + + + Piede posteriore sinistro + + + Piede posteriore destro + + + Riga [LINE], Colonna [COLUMN] + + + [COUNT] trovato/i + + + Contenuto dell'oggetto + + + Nuovo script + + + Questo residente ha attivato la modalità 'Non disturbare' e vedrà il tuo messaggio più tardi. + + + (In base al nome) + + + (Residente) + + + (Oggetto) + + + (Gruppo) + + + (esterno) + + + Non esiste alcun regolamento per questa proprietà. + + + Non esiste alcun regolamento per questa proprietà. Il terreno di questa proprietà è messo in vendita dal proprietario, non dalla Linden Lab. Contatta il proprietario del terreno per i dettagli della vendita. + + + + + + Di proprietà di un gruppo + + + Pubblica + + + Impostazioni locali + + + Impostazioni regione + + + Questa regione non supporta le impostazioni per l’ambiente. + + + Sole + + + Luna + + + Fioritura + + + Rumore nuvole + + + Mappa normale + + + Transparent + + + Clicca: [TELEPORT] teleport, [MAP] mappa, [PROFILE] profilo + + + (si aggiornerà dopo la pubblicazione) + + + Non hai creato luoghi preferiti né inserzioni. Clicca il pulsante + qui sotto per creare un luogo preferito o un'inserzione. + + + Non hai creato Luoghi preferiti. Fai clic sul pulsante Nuovo per creare un Luogo preferito. + + + Non hai creato Annunci. Fai clic sul pulsante Nuovo per creare un Annuncio. + + + L'utente non ha luoghi preferiti né inserzioni + + + L'utente non ha luoghi preferiti + + + L'utente non ha annunci + + + Caricamento in corso... + + + Anteprima + + + Beni immobiliari + + + Un oggetto denominato + + + di proprietà del gruppo + + + di proprietà di un gruppo sconosciuto + + + di proprietà di + + + di proprietà di un utente sconosciuto + + + Ti ha offerto + + + Non hai accettato [DESC] da <nolink>[NAME]</nolink>. + + + Totale + + + comprato + + + ti ha pagato + + + ha pagato + + + ha comprato il pass + + + pagato la tassa per l'evento + + + pagato il premio per l'evento + + + Saldo + + + Ringraziamenti + + + Debiti + + + [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] + + + Oggetti acquisiti + + + Annulla + + + Il caricamento di [NAME] costa L$ [AMOUNT] + + + L'acquisto di [NAME] costa L$ [AMOUNT] + + + Estensione del file sconosciuta [.%s] +Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh + + + Blocca + + + Aggiungi punto di riferimento... + + + Modifica punto di riferimento... + + + ⌃ + + + ⌘ + + + ⌥ + + + ⇧ + + + Ctrl+ + + + Alt+ + + + Shift+ + + + File salvato + + + In ricezione + + + antemeridiane + + + pomeridiane + + + Ora Pacifico + + + Ora legale Pacifico + + + Avanti + + + Sinistra + + + Destra + + + Indietro + + + Nord + + + Sud + + + Ovest + + + Est + + + Su + + + Giù + + + Qualsiasi categoria + + + Acquisti + + + Affitto terreno + + + Affitto proprietà + + + Attrazioni speciali + + + Nuovi prodotti + + + Lavoro + + + Cercasi + + + Servizio + + + Personale + + + Nessuno + + + Luogo dei Linden + + + Adult + + + Arte & Cultura + + + Affari + + + Educazione + + + Gioco + + + Divertimento + + + Accoglienza nuovi residenti + + + Parchi & Natura + + + Residenziale + + + Fase + + + Altro + + + Affitto + + + Tutti + + + Tu + + + Più supporti + + + Riproduci/Pausa supporto + + + http://www.intel.com/p/en_US/support/detect/graphics + + + http://www.nvidia.com/Download/index.aspx?lang=en-us + + + http://support.amd.com/us/Pages/AMDSupportHub.aspx + + + Un errore è stato riscontrato analizzando la linea di comando. +Per informazioni: http://wiki.secondlife.com/wiki/Client_parameters +Errore: + + + Uso linea di comando del programma [APP_NAME] : + + + Il programma [APP_NAME] non è in grado di accedere ad un file necessario. + +Potrebbe darsi che tu abbia copie multiple attivate o che il tuo sistema reputi erroneamente che il file sia già aperto. +Se il problema persiste, riavvia il computer e riprova. +Se il problema continua ancora, dovresti completamente disinstallare l'applicazione [APP_NAME] e reinstallarla. + + + Errore critico + + + Il programma [APP_NAME] richiede un processore con AltiVec (G4 o superiore). + + + Il programma [APP_NAME] è già attivo. +Controlla che il programma non sia minimizzato nella tua barra degli strumenti. +Se il messaggio persiste, riavvia il computer. + + + Sembra che [APP_NAME] si sia bloccata o interrotta nella sessione precedente. +Vuoi mandare un crash report? + + + Avviso + + + Il programmma [APP_NAME] non riesce a trovare una DirectX 9.0b o superiore. +[APP_NAME] usa DirectX per rilevare hardware e/o i driver non aggiornati che possono causare problemi di stabilità, scarsa performance e interruzioni. Benché tu possa avviare il programma [APP_NAME] senza di esse, consigliamo caldamente l'esecuzione con DirectX 9.0b. + +Vuoi continuare? + + + Attenzione + + + L'aggiornamento automatico non è stato ancora realizzato per Linux. +Consigliamo di scaricare l'ultima versione direttamente da www.secondlife.com. + + + RegisterClass non riuscito + + + Errore + + + Impossibile visualizzare a schermo intero con risoluzione [WIDTH] x [HEIGHT]. +Visualizzazione corrente in modalità finestra. + + + Errore di arresto durante il tentativo di chiusura della finestra (DestroyWindow() non riuscito) + + + Errore di arresto + + + Impossibile caricare i driver GL + + + Impossibile trovare un formato pixel adatto + + + Impossibile ottenere una descrizione del formato pixel + + + [APP_NAME] richiede True Color (32 bit) per funzionare. +Vai alle impostazioni dello schermo del tuo computer e imposta il colore in modalità 32 bit. + + + [APP_NAME] non funziona poichè è impossibile trovare un canale alpha a 8 bit. Questo problema normalmente deriva dai driver della scheda video. +Assicurati di avere installato i driver della scheda video più recenti. +Assicurati anche che il monitor sia impostato a True Color (32 bit) nel Pannello di controllo > Schermo > Impostazioni. +Se il messaggio persiste, contatta [SUPPORT_SITE]. + + + Impossibile impostare il formato pixel + + + Impossibile creare il GL rendering + + + Impossibile attivare il GL rendering + + + [APP_NAME] Non riesce ad avviarsi perchè i driver della tua scheda video non sono stati installati correttamente, non sono aggiornati, o sono per un hardware non supportato. Assicurati di avere i driver della scheda video più recenti e anche se li hai installati, prova a installarli di nuovo. + +Se il messaggio persiste, contatta [SUPPORT_SITE]. + + + Barba leggera + + + Tutti bianchi + + + Occhi grandi + + + Arcuato + + + Lunghezza braccia + + + Attaccato + + + Lobi attaccati + + + Frangetta all'indietro + + + Larghi + + + Frange + + + Occhi piccoli + + + Punto vita + + + Grande + + + Sedere grande + + + Capigliatura grande: Indietro + + + Capigliatura grande: anteriore + + + Capigliatura grande: in alto + + + Grande testa + + + Grandi pettorali + + + Capelli con punte + + + Nero + + + Biondo + + + Capelli biondi + + + Fard + + + Colore fard + + + Opacità fard + + + Definizione muscolare + + + Grasso corporeo + + + Lentiggini e nei + + + Corpo più robusto + + + Robustezza del corpo + + + Corpo più magro + + + Gambe arcuate + + + Altezza del seno + + + Décolleté + + + Grandezza del seno + + + Larghezza setto + + + Largo + + + Grandezza delle sopracciglia + + + Occhi sporgenti + + + Occhi sporgenti + + + Bulboso + + + Naso bulboso + + + Massa seno + + + Lisciatura seno + + + Gravità seno + + + Resistenza seno + + + Massimo effetto + + + Elasticità + + + Guadagno + + + Attenuazione + + + Massimo effetto + + + Elasticità + + + Guadagno + + + Attenuazione + + + Massimo effetto + + + Elasticità + + + Guadagno + + + Attenuazione + + + Massa pancia + + + Lisciatura pancia + + + Gravità pancia + + + Resistenza pancia + + + Massimo effetto + + + Elasticità + + + Guadagno + + + Attenuazione + + + Massa natiche + + + Lisciatura natiche + + + Gravità natiche + + + Resistenza natiche + + + Massimo effetto + + + Elasticità + + + Guadagno + + + Attenuazione + + + Massimo effetto + + + Elasticità + + + Guadagno + + + Attenuazione + + + Sopracciglia cespugliose + + + Capelli a cespuglio + + + Grandezza del sedere + + + Gravità natiche + + + Crinolina + + + Nessuna crinolina + + + Più crinolina + + + Baffetti + + + Zigomi + + + Ampiezza del torace + + + Angolo del mento + + + Fossetta sul mento + + + Barba sottomento + + + Profondità mento + + + Mento forte + + + Mento in dentro + + + Mento sporgente + + + Mento-collo + + + Trasparente + + + Fossetta + + + Occhi ravvicinati + + + Chiusa + + + Chiuso dietro + + + Chiuso davanti + + + Chiuso sinistra + + + Chiuso destra + + + Meno pronunciati + + + Colletto posteriore + + + Colletto anteriore + + + Angolo all'ingiù + + + Angolo all'insù + + + Piega + + + Naso storto + + + Svasato con risvolto + + + Scuro + + + Verde scuro + + + Più scuro + + + Profondo + + + Tacchi standard + + + Folti + + + Doppio mento + + + All'ingiù + + + Più pronunciati + + + Angolo orecchie + + + Grandezza orecchie + + + Estremità orecchie + + + Ovalizzazione testa + + + Occhiaie + + + Colore degli occhi + + + Profondità degli occhi + + + Luminosità degli occhi + + + Apertura degli occhi + + + Prominenza degli occhi + + + Grandezza occhi + + + Distanza occhi + + + Arco delle sopracciglia + + + Densità delle sopracciglia + + + Altezza delle sopracciglia + + + Sopracciglia appuntite + + + Grandezza sopracciglia + + + Lunghezza delle ciglia + + + Eyeliner + + + Colore dell'eyeliner + + + Occhi sporgenti + + + Taglio del viso + + + Definizione del viso + + + Occhi distanti + + + Labbra carnose + + + Femmina + + + Senza dita + + + Dita + + + Risvolti svasati + + + Piatto + + + Sedere piatto + + + Testa piatta + + + Punta piatta + + + Misura piede + + + Angolo della fronte + + + Fronte sporgente + + + Lentiggini + + + Frangetta + + + Dietro gonfi + + + Eyeliner marcato + + + Anteriore gonfio + + + Lati capelli gonfi + + + Lati gonfi + + + Lucido + + + Dita con guanti + + + Lunghezza guanti + + + Capigliature + + + Capelli: Indietro + + + Capelli: anteriore + + + Capelli: lati + + + Direzione capigliatura + + + Foltezza + + + Foltezza + + + Inclinazione + + + Verso sinistra + + + Verso destra + + + Capelli: Volume + + + Grandezza mani + + + Baffi a manubrio + + + Lunghezza testa + + + Forma della testa + + + Grandezza della testa + + + Allungamento testa + + + Altezza tacchi + + + Forma tacchi + + + Altezza + + + Alto + + + Tacchi alti + + + Mandibola alta + + + Alta + + + Alto e stretto + + + Più alto + + + Altezza bacino + + + Larghezza bacino + + + Muovi sopra + + + Dentro + + + Colore ombretto interno + + + Opacità ombretto interno + + + Angolo interno + + + Ombretto interno + + + Ombretto interno + + + Lunghezza giacca + + + Grinze della giacca + + + Angolo mandibola + + + Prognatismo mento + + + Forma del mento + + + Iscriviti + + + Guance + + + Angolo ginocchia + + + Gambe ad X + + + Grande + + + Mani grandi + + + Riga a sinistra + + + Lunghezza gambe + + + Muscoli gambe + + + Meno + + + Meno grasso corporeo + + + Meno + + + Meno lentiggini + + + Meno piene + + + Più alto + + + Meno maniglie + + + Meno muscoli + + + Meno muscolari + + + Meno rosato + + + Meno rotondo + + + Meno a sella + + + Meno quadrato + + + Meno volume + + + Meno + + + Più leggero + + + Distanza fossetta labbro + + + Prof. fossetta labbro + + + Volume labbra + + + Tonalità rosa labbra + + + Proporzione labbra + + + Carnosità labbra + + + Larghezza labbra + + + Lipgloss + + + Rossetto + + + Colore rossetto + + + Lungo + + + Testa lunga + + + Bacino alto + + + Gambe lunghe + + + Collo lungo + + + Codini lunghi + + + Codino lungo + + + Torace lungo + + + Braccia lunghe + + + Pantaloni ampi + + + Camicia ampia + + + Maniche non attillate + + + Maniglie dell'amore + + + Basso + + + Tacchi bassi + + + Mandibola bassa + + + Bassa + + + Basso e ampio + + + Più basso + + + Parte bassa del setto + + + Guance inferiori + + + Maschio + + + Riga nel mezzo + + + Altro + + + Più fard + + + Più grasso corporeo + + + Più + + + Più ombretto + + + Più lentiggini + + + Più piene + + + Più calato + + + Più rossetto + + + Più maniglie + + + Labbro inf. pronunciato + + + Più muscoli + + + Più muscolatura + + + Più rosato + + + Più rotondo + + + Più a sella + + + Più orizzontale + + + Più quadrato + + + Labbro sup. pronunciato + + + Più verticale + + + Più volume + + + Più + + + Baffi + + + Angolo della bocca + + + Posizione della bocca + + + Moicana + + + Muscolatura + + + Basette lunghe + + + Smalto + + + Colore smalto + + + Socchiusi + + + Laterali post. vicini + + + Laterali ant. vicini + + + Labbra strette + + + Naturale + + + Lunghezza del collo + + + Grandezza del collo + + + Senza fard + + + Senza eyeliner + + + Senza ombretto + + + Senza lipgloss + + + Senza rossetto + + + Senza riga + + + Senza smalto + + + Senza rosso + + + Senza punte + + + Senza bianco + + + Senza pieghe + + + Inferiore normale + + + Superiore normale + + + Naso a sinistra + + + Naso a destra + + + Grandezza naso + + + Spessore naso + + + Angolo punta naso + + + Forma punta naso + + + Larghezza naso + + + Divisione narici + + + Larghezza narici + + + Opaco + + + Apri + + + Retro aperto + + + Davanti aperto + + + Lato sin. aperto + + + Lato des. aperto + + + Arancio + + + Fuori + + + Colore ombretto esterno + + + Opacità ombretto esterno + + + Angolo esterno occhio + + + Ombretto esterno + + + Ombreggiatura esterna + + + Denti sup. in fuori + + + Genitali + + + Unghie smaltate + + + Pallido + + + Cavallo + + + Vestibilità pantaloni + + + Lunghezza pantaloni + + + Taglia pantalone + + + Pantaloni con le grinze + + + Con riga + + + Frangetta divisa + + + Pettorali + + + Pigmento + + + Codini + + + Rosa + + + Più rosato + + + Altezza pianta + + + Larghezza pianta + + + Appuntito + + + Tacchi a spillo + + + Codino + + + Gonna gonfia + + + Sinistro più aperto + + + Destro più aperto + + + Paffute + + + Palpebre gonfie + + + Tonalità + + + Presenza di rosso nei capelli + + + Normale + + + Riga a destra + + + Incarnato + + + Rotondo + + + Rossore + + + Rosse + + + Capelli mossi + + + Rotondità fianchi + + + Gambe magre + + + Separati + + + Meno pronunciato + + + Taglio posteriore + + + Taglio del viso + + + Taglio anteriore + + + Distorto a sinistra + + + Distorto a destra + + + Taglio verso dietro + + + Taglio verso davanti + + + A sinistra + + + Spostamento bocca + + + A destra + + + Parte inferiore camicia + + + Vestibilità camicia + + + Camicia con le grinze + + + Altezza scarpe + + + Basso + + + Braccia corte + + + Gambe corte + + + Collo corto + + + Codini corti + + + Codino corto + + + Basette corte + + + Torace corto + + + Bacino corto + + + Spalle + + + Ciuffi laterali + + + Basette + + + Capigliatura di lato + + + Capigliatura di lato sciolta + + + Capigliatura di lato raccolta + + + Collo fino + + + Vestibilità gonna + + + Lunghezza gonna + + + Fronte inclinata + + + Lunghezza maniche + + + Morbidezza maniche + + + Spacco: Indietro + + + Spacco: anteriore + + + Spacco: Sinistra + + + Spacco: Destra + + + Piccola + + + Mani piccole + + + Testa piccola + + + Liscio + + + Capelli lisci + + + Lunghezza calze + + + Pizzetto labbro inferiore + + + Piu rade + + + Capelli a punta + + + Quadrato + + + Punta quadrata + + + Testa schiacciata + + + Testa allungata + + + Scarne + + + Senza pettorali + + + Occhi infossati + + + Indietro + + + Avanti + + + Alto + + + Ravv. lat. posteriore + + + Ravv. lat. frontale + + + Tacchi spessi + + + Collo grosso + + + Punta spessa + + + Sottili + + + Sopracciglia sottili + + + Labbra sottili + + + Naso sottile + + + Mento stretto + + + Fondo stretto + + + Pantaloni attillati + + + Camicia attillata + + + Gonna attillata + + + Maniche strette + + + Forma della punta + + + Spessore della punta + + + Lunghezza del torace + + + Muscoli del torace + + + Torso Scrawny + + + Distaccato + + + Senza piega + + + Denti inf. in fuori + + + Innaturale + + + Parte alta del setto + + + Parte alta degli zigomi + + + Fossetta sup. del mento + + + Piega palpebra sup. + + + All'insù + + + Molto rossi + + + Vita alta + + + Pienotte + + + Capelli bianchi + + + Largo + + + Dietro largo + + + Davanti largo + + + Labbra larghe + + + Colorati + + + Grinze + + + Aggiungi ai miei punti di riferimento + + + Modifica i miei punti di riferimento + + + Maggiori informazioni sulla posizione attuale + + + La cronologia delle mie posizioni + + + Regione con categoria adulti + + + Regione con categoria moderata + + + Regione generale + + + Gli avatar in questo lotto non possono essere visti o sentiti da avatar all'esterno del lotto + + + Gli oggetti che si muovono potrebbero non comportarsi correttamente in questa regione fino a quando non viene eseguito il rebake della regione. + + + Il pathfinding dinamico non è attivato in questa regione. + + + Aggiornamento [APP_NAME] + + + Aggiornamento di [APP_NAME]... + + + Installazione di [APP_NAME]... + + + Il Viewer del programma [APP_NAME] si sta aggiornando all'ultima versione. Potrebbe volerci del tempo, attendi. + + + Download dell'aggiornamento... + + + Download dell'aggiornamento + + + Download dell'aggiornamento non riuscito + + + Il programma [APP_NAME] ha riscontrato un'errore durante il tentativo di aggiornamento. Consigliamo di scaricare l'ultima versione direttamente da www.secondlife.com. + + + Installazione dell'aggiornamento non riuscita + + + Errore nell'avvio del viewer + + + [APP_NAME]: Oggetti in arrivo troppo velocemente da [FROM_NAME], anteprima automatica disattivata per [TIME] secondi + + + [APP_NAME]: Oggetti in arrivo troppo velocemente, anteprima automatica disattivata per [TIME] secondi + + + -- Registrazione messaggi instantanei abilitata -- + + + [NAME] sta scrivendo... + + + (anonimo) + + + (Moderato: Voci disattivate di default) + + + La chat di testo non è disponibile per questa chiamata. + + + La chat di testo è stata disabilitata da un moderatore di gruppo. + + + Clicca qui per inviare un messaggio instantaneo. + + + A + + + (Moderatore) + + + (Salvato [LONG_TIMESTAMP]) + + + Per vedere questo messaggio, devi deselezionare 'Solo amici e gruppi possono chiamarmi o mandarmi IM' in Preferenze/Privacy. + + + Online + + + Offline + + + Utente non online - il messaggio verrà memorizzato e inviato più tardi. + + + Utente non online - l'inventario è stato salvato + + + Risposto alla chiamata + + + Hai iniziato una chiamata vocale + + + Ti sei collegato alla chiamata in voce + + + Hai rifiutato automaticamente la chiamata voce mentre era attivata la modalità 'Non disturbare'. + + + [NAME] ha iniziato una chiamata vocale + + + Collegamento alla chiamata vocale... + + + Collegato, clicca Chiudi chiamata per agganciare + + + Chiusa la chiamata + + + Chat con più persone + + + Chiamata in conferenza con [AGENT_NAME] + + + Offerto oggetto di inventario "[ITEM_NAME]" + + + Offerta cartella di inventario "[ITEM_NAME]" + + + Stai parlando con un bot, [NAME]. Non condividere informazioni personali. +Scopri di più su https://second.life/scripted-agents. + + + Hai pubblicato su Facebook. + + + Hai pubblicato su Flickr. + + + Hai pubblicato su Twitter. + + + (La sessione IM non esiste) + + + Sei l'unico utente di questa sessione. + + + [NAME] è offline + + + Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat. + + + Hai bloccato questo residente. Quando gli invii un messaggio, verrà automaticamente sbloccato. + + + Errore nella richiesta, riprova più tardi. + + + Errore durante la richiesta, riprova più tardi. + + + Non hai sufficienti permessi. + + + Questa sessione non esiste più + + + Non hai questa abilitazione. + + + Non hai questa abilitazione. + + + Non sei un moderatore. + + + Il moderatore del gruppo ha disattivato la tua chat di testo. + + + Un moderatore di gruppo ti ha disabilitato dalla chat di testo. + + + Impossibile aggiungere utenti alla chat con [RECIPIENT]. + + + Impossibile spedire il tuo messaggio nella sessione chat con [RECIPIENT]. + + + Impossibile inviare il messaggio nella chat con [RECIPIENT]. + + + Errore durante la moderazione. + + + Sei stato rimosso dal gruppo. + + + Sei stato espulso dal gruppo. + + + Non hai più le abilitazioni per rimanere nella sessione chat. + + + [SOURCES] ha detto qualcosa di nuovo + + + [SOURCES] ha detto qualcosa di nuovo + + + Sessione di inizializzazione scaduta + + + Posizione di base impostata. + + + https://secondlife.com/destination/voice-island + + + https://secondlife.com/destination/voice-morphing-premium + + + [NAME] ti ha inviato un pagamento di L$[AMOUNT] [REASON]. + + + [NAME] ti ha inviato un pagamento di L$ [AMOUNT]: [REASON] + + + [NAME] ti ha inviato un pagamento di L$[AMOUNT]. + + + Hai inviato un pagamento di L$[AMOUNT] a [NAME] [REASON]. + + + Hai inviato un pagamento di L$ [AMOUNT] a [NAME]: [REASON] + + + Hai pagato L$ [AMOUNT]. + + + Hai inviato un pagamento di L$[AMOUNT] a [NAME]. + + + Hai pagato L$ [AMOUNT] [REASON]. + + + Non hai pagato [NAME] L$[AMOUNT] [REASON]. + + + Non hai inviato un pagamento di L$ [AMOUNT] a [NAME]: [REASON] + + + Non hai pagato L$ [AMOUNT]. + + + Non hai pagato [NAME] L$[AMOUNT]. + + + Non hai pagato L$ [AMOUNT] [REASON]. + + + per [ITEM] + + + per un lotto di terreno + + + per un permesso di accesso al terreno + + + per la cessione di terreno + + + per creare un gruppo + + + per aderire a un gruppo + + + per caricare + + + per pubblicare un annuncio + + + Contributo di L$ [AMOUNT] + + + Il costo per il caricamento è di L$ [AMOUNT] + + + Il costo è L$ [AMOUNT] + + + L'acquisto del terreno prescelto costa L$ [AMOUNT] + + + Il costo dell'oggetto è L$ [AMOUNT] + + + Tutti + + + Funzionari + + + Proprietari + + + Online + + + Caricamento in corso... + +Segnala abuso + + + Nuova figura corporea + + + Nuova pelle + + + Nuovi capelli + + + Nuovi occhi + + + Nuova camicia + + + Nuovi pantaloni + + + Nuove scarpe + + + Nuove calze + + + Nuova giacca + + + Nuovi guanti + + + Nuova maglietta intima + + + Nuovi slip + + + Nuova gonna + + + Nuovo Alpha (trasparenza) + + + Nuovo tatuaggio + + + Nuovo Universale + + + Nuova fisica + + + Capo da indossare non valido + + + Nuova gesture + + + Nuovo script + + + Nuovo appunto + + + Nuova cartella + + + Contenuto + + + Gesture + + + Gesture maschili + + + Gesture femminili + + + Altre gesture + + + Gesture del parlato + + + Gesture comuni + + + Maschio - Chiedere scusa + + + Maschio - Levati dai piedi! + + + Maschio - Butta un bacio + + + Maschio - Bu + + + Maschio - Annoiato + + + Maschio - Ehi + + + Maschio - Ridere + + + Maschio - Disgustato + + + Maschio - Spallucce + + + Maschio - Tira fuori la lingua + + + Maschio - Accipicchia + + + Femmina - Risatina + + + Femmina - Pianto + + + Femmina - Imbarazzata + + + Femmina - Chiedere scusa + + + Femmina - Levati dai piedi! + + + Femmina - Butta un bacio + + + Femmina - Bu + + + Femmina - Annoiata + + + Femmina - Ehi + + + Femmina - Ehi tu + + + Femmina - Ridere + + + Femmina - Sei in forma + + + Femmina - Per di qua + + + Femmina - Per cortesia + + + Femmina - Disgustata + + + Femmina - Spallucce + + + Femmina - Tira fuori la lingua + + + Femmina - Accipicchia + + + Nuovo ciclo giornata + + + Nuova acqua + + + Nuovo cielo + + + /inchino + + + /applausi + + + /numero + + + /estingui + + + /chissene + + + /muscolo + + + /no + + + /no! + + + /carta + + + /indicome + + + /indicotu + + + /sasso + + + /forbici + + + /fumo + + + /stiracchiata + + + /fischietto + + + /si + + + /si! + + + non alla tastiera + + + danza1 + + + danza2 + + + danza3 + + + danza4 + + + danza5 + + + danza6 + + + danza7 + + + danza8 + + + [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt] + + + nessuna/nessuna + + + Impossibile caricare immagini di dimensioni superiori a [WIDTH]*[HEIGHT] + + + Le dimensioni massime delle foto di vestiario sono [WIDTH]*[HEIGHT]. Ridimensiona l'immagine o usane un'altra + + + Le dimensioni massime delle foto di vestiario sono [WIDTH]*[HEIGHT]. Seleziona un'altra texture + + + Impossibile verificare le dimensioni della foto. Attendi che le dimensioni siano visualizzate nel selettore. + + + + Nonostante i nostri tentativi, si è verificato un errore imprevisto. + +Consulta la pagina http://status.secondlifegrid.net per determinare se il problema del servizio è già stato riscontrato. + Se il problema continua, ti consigliamo di controllare le tue impostazioni di rete e del firewall. + + + lunedì:martedì:mercoledì:giovedì:venerdì:sabato:domenica + + + lun:mar:mer:gio:ven:sab:dom + + + gennaio:febbraio:marzo:aprile:maggio:giugno:luglio:agosto:settembre:ottobre:novembre:dicembre + + + gen:feb:mar:apr:mag:giu:lug:ago:sett:ott:nov:dic + + + [MDAY] + + + antemeridiane + + + pomeridiane + + + US$ [AMOUNT] + + + Espulsione di gruppo + + + Abbonamento + + + Ruoli + + + Identità gruppo + + + Gestione lotto + + + Identità lotto + + + Impostazioni lotto + + + Poteri lotto + + + Accesso al lotto + + + Contenuto lotto + + + Gestione oggetti + + + Contabilità + + + Avvisi + + + Chat + + + Base + + + Premium + + + Premium Plus + + + Cancellare gli elementi selezionati? + + + Cancellare l’elemento selezionato? + + + Questo vestiario non contiene alcun elemento + + + Seleziona un editor usando le impostazioni ExternalEditor. + + + L'editor esterno specificato non è stato trovato. +Prova a racchiudere il percorso dell'editor in doppie virgolette. +(per es. "/percorso per il mio/editor" "%s") + + + Errore nell'elaborazione del comando dell'editor esterno. + + + L'editor esterno non è stato avviato. + + + Traduzione non riuscita: [REASON] + + + Errore di elaborazione della risposta della traduzione. + + + Esc + + + Space + + + Enter + + + Tab + + + Ins + + + Del + + + Backsp + + + Shift + + + Ctrl + + + Alt + + + CapsLock + + + Home + + + End + + + PgUp + + + PgDn + + + F1 + + + F2 + + + F3 + + + F4 + + + F5 + + + F6 + + + F7 + + + F8 + + + F9 + + + F10 + + + F11 + + + F12 + + + Aggiungi + + + Sottrai + + + Moltiplica + + + Dividi + + + PAD_DIVIDE + + + PAD_LEFT + + + PAD_RIGHT + + + PAD_DOWN + + + PAD_UP + + + PAD_HOME + + + PAD_END + + + PAD_PGUP + + + PAD_PGDN + + + PAD_CENTER + + + PAD_INS + + + PAD_DEL + + + PAD_Enter + + + PAD_BUTTON0 + + + PAD_BUTTON1 + + + PAD_BUTTON2 + + + PAD_BUTTON3 + + + PAD_BUTTON4 + + + PAD_BUTTON5 + + + PAD_BUTTON6 + + + PAD_BUTTON7 + + + PAD_BUTTON8 + + + PAD_BUTTON9 + + + PAD_BUTTON10 + + + PAD_BUTTON11 + + + PAD_BUTTON12 + + + PAD_BUTTON13 + + + PAD_BUTTON14 + + + PAD_BUTTON15 + + + - + + + = + + + ` + + + ; + + + [ + + + ] + + + \ + + + 0 + + + 1 + + + 2 + + + 3 + + + 4 + + + 5 + + + 6 + + + 7 + + + 8 + + + 9 + + + A + + + B + + + C + + + D + + + E + + + F + + + G + + + H + + + I + + + J + + + K + + + L + + + M + + + N + + + O + + + P + + + Q + + + R + + + S + + + T + + + U + + + V + + + W + + + X + + + Y + + + Z + + + Visualizzazione marcatori particelle (blu) + + + Visualizzazione marcatori oggetti fisici (verde) + + + Visualizzazione marcatori oggetti scriptati (rosso) + + + Visualizzazione marcatori oggetti scriptati con funzione tocco (rosso) + + + Visualizzazione marcatori suoni (giallo) + + + Visualizzazione marcatori multimedia (bianco) + + + Marcatore visualizza direzione sole (arancione) + + + Marcatore visualizza direzione luna (viola) + + + Particelle nascoste + + + Informazioni sul terreno + + + Aspetto fisico + + + Avatar + + + Costruisci + + + Chat + + + Conversazioni + + + Bussola + + + Destinazioni + + + I miei ambienti + + + Facebook + + + Flickr + + + Gesture + + + Stato della griglia + + + Istruzioni + + + Inventario + + + Mappa + + + Mercato + + + Marketplace + + + Mini mappa + + + Cammina / corri / vola + + + Casella in uscita del rivenditore + + + Persone + + + Preferiti + + + Luoghi + + + Preferenze + + + Profilo + + + Segnala abuso + + + Ricerca + + + Istantanea + + + Parla + + + Twitter + + + Controlli fotocamera + + + Impostazioni voce + + + Informazioni sul terreno che visiti + + + Cambia l'avatar + + + Seleziona un avatar completo + + + Costruzione oggetti e modifica terreno + + + Chatta con persone vicine usando il testo + + + Conversa con chiunque + + + Bussola + + + Destinazioni interessanti + + + I miei ambienti + + + Pubblica su Facebook + + + Carica su Flickr + + + Gesti per il tuo avatar + + + Mostra stato griglia corrente + + + Come eseguire le attività più comuni + + + Visualizza e usa le tue cose + + + Mappa del mondo + + + Vai allo shopping + + + Vendi le tue creazioni + + + Mostra le persone vicine + + + Movimento avatar + + + Trasferisci elementi al tuo mercato per la vendita + + + Amici, gruppi e persone vicine + + + Luoghi da mostrare come preferiti nel profilo + + + Luoghi salvati + + + Preferenze + + + Modifica o visualizza il tuo profilo + + + Segnala abuso + + + Trova luoghi, eventi, persone + + + Scatta una foto + + + Parla con persone vicine usando il microfono + + + Twitter + + + Modifica angolo fotocamera + + + I controlli per il volume per le chiamate e per le persone nelle vicinanze nel mondo virtuale + + + attualmente nella barra degli strumenti in basso + + + attualmente nella barra degli strumenti a sinistra + + + attualmente nella barra degli strumenti a destra + + + Mantieni% + + + Dettagli + + + Migliori dettagli + + + Superficie + + + Solido + + + Involucro + + + Anteprima + + + Normale + + + http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer + + + Nessuno + + + Influenza il navmesh + + + Personaggio + + + (Multiple) + + + Molto basso + + + Basso + + + Medio + + + Alto + + + Molto alto + + + Il Residente non può visitare questa regione. + + + [User] + + + Esperienza + + + (nessuna esperienza) + + + (esperienza senza titolo) + + + A livello di terreno + + + A livello di griglia + + + CONSENTITO + + + BLOCCATO + + + FORNITORE + + + AMMINISTRATORE + + + RECENTE + + + DI PROPRIETÀ + + + ([EXPERIENCES], massimo [MAXEXPERIENCES]) + + + gestione dei tuoi comandi + + + attivazione di animazioni per il tuo avatar + + + collegamento al tuo avatar + + + monitoraggio della tua videocamera + + + controllo della tua videocamera + + + ti teletrasporta + + + accettazione automatica delle autorizzazioni per le esperienze + + + obbliga l'avatar a sedersi + + + cambia le impostazioni dell’ambiente + + + ha eseguito un'operazione sconosciuta: [Permission] + + + Gestione dei comandi + + + Attivazione di animazioni + + + Collegamento + + + Monitoraggio videocamera + + + Controllo videocamera + + + Teleport + + + Autorizzazione + + + Siediti + + + Ambiente + + + Le conversazioni non vengono registrate. Per iniziare a registrare, seleziona "Salva: Solo registro" oppure "Salva: Registri e trascrizioni" in Preferenze > Chat. + + + Non verranno registrate più le conversazioni. Per riprendere a registrare, seleziona "Salva: Solo registro" oppure "Salva: Registri e trascrizioni" in Preferenze > Chat. + + + Nessuna conversazione in registro. Dopo che hai contattato qualcuno o se qualcuno ti contatta, una voce del registro verrà mostrata qui. + + + Caricamento in corso... + + + n/d + + + -Lista vuota- + + + Predefinita + + + (Nulla) + + + Senza limite + + + La forma della fisica contiene triangoli troppo piccoli. Prova a semplificare il modello della fisica. + + + La forma della fisica contiene dati di conferma errati. Prova a correggere il modello della fisica. + + + La versione della forma fisica non è corretta. Imposta la versione corretta per il modello della fisica. + + + Il DNS non ha potuto risolvere il nome dell’host([HOSTNAME]). Verifica di riuscire a connetterti al sito web www.secondlife.com. Se riesci ma continui a ricevere questo errore, visita la sezione -Assistenza e segnala il problema. - Il server per il login non ha potuto effettuare la verifica tramite SSL. +Assistenza e segnala il problema. + + + Il server per il login non ha potuto effettuare la verifica tramite SSL. Se continui a ricevere questo errore, visita la sezione Assistenza nel sito SecondLife.com -e segnala il problema. - Spesso l’errore è dovuto all’orologio del computer, impostato incorrettamente. +e segnala il problema. + + + Spesso l’errore è dovuto all’orologio del computer, impostato incorrettamente. Vai al Pannello di Controllo e assicurati che data e ora siano esatte. Controlla anche che il network e il firewall siano impostati correttamente. Se continui a ricevere questo errore, visita la sezione Assistenza nel sito SecondLife.com e segnala il problema. -[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base conoscenze] +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base conoscenze] + diff --git a/indra/newview/skins/default/xui/it/teleport_strings.xml b/indra/newview/skins/default/xui/it/teleport_strings.xml index 4a089fe7c3..b8a7bc8112 100644 --- a/indra/newview/skins/default/xui/it/teleport_strings.xml +++ b/indra/newview/skins/default/xui/it/teleport_strings.xml @@ -1,38 +1,94 @@ - C'è stato un problema nell'elaborare la tua richiesta di teleport. Potresti dover effettuare nuovamente l'accesso prima di poter usare il teleport. -Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE]. - Si è verificato un problema nel tentativo di attraversare regioni. È possibile che per potere attraversare le regioni, tu debba effettuare nuovamente l'accesso. -Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE]. - Spiacenti, il teletrasporto è bloccato al momento. Prova di nuovo tra pochi istanti. Se ancora non potrai teletrasportarti, per favore scollegati e ricollegati per risolvere il problema. - Spiacenti, ma il sistema non riesce a localizzare la destinazione del landmark - Spiacenti, il sistema non riesce a completare il teletrasporto. Riprova tra un attimo. - Non puoi teleportarti nuovamente a Welcome Island. -Per ripetere l'esercitazione, visita 'Welcome Island Public'. - Spiacenti, ma non hai accesso nel luogo di destinazione richiesto. - Gli oggetti da te indossati non sono ancoa arrivati. Attendi ancora qualche secondo o scollegati e ricollegati prima di provare a teleportarti. - Il server della regione è al momento occupato e la tua richiesta di teletrasporto non può essere soddisfatta entro breve tempo. Per favore prova di nuovo tra qualche minuto o spostati in un'area meno affollata. - Spiacenti, il sistema non riesce a soddisfare la tua richiesta di teletrasporto entro un tempo ragionevole. Riprova tra qualche minuto. - Spiacenti, il sistema non riesce a completare il cambio di regione entro un tempo ragionevole. Riprova tra qualche minuto. - Impossibile trovare la destinazione del teletrasporto; potrebbe essere temporaneamente non accessibile o non esistere più. Riprovaci tra qualche minuto. - L'inventario è temporaneamente inaccessibile. - Per poter entrare in questa regione devi avere almeno 18 anni. - Impossibile entrare nella regione. '[REGION_NAME]' è una regione per giochi di abilità e per entrare è necessario soddisfare alcuni requisiti. Per dettagli, leggi le [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life domande frequenti sui giochi di abilità]. - Mi dispiace, ma il sistema non è stato in grado di avviare il teletrasporto. Ti preghiamo di riprovare tra qualche minuto. + + C'è stato un problema nell'elaborare la tua richiesta di teleport. Potresti dover effettuare nuovamente l'accesso prima di poter usare il teleport. +Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE]. + + + Si è verificato un problema nel tentativo di attraversare regioni. È possibile che per potere attraversare le regioni, tu debba effettuare nuovamente l'accesso. +Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE]. + + + Spiacenti, il teletrasporto è bloccato al momento. Prova di nuovo tra pochi istanti. Se ancora non potrai teletrasportarti, per favore scollegati e ricollegati per risolvere il problema. + + + Spiacenti, ma il sistema non riesce a localizzare la destinazione del landmark + + + Spiacenti, il sistema non riesce a completare il teletrasporto. Riprova tra un attimo. + + + Non puoi teleportarti nuovamente a Welcome Island. +Per ripetere l'esercitazione, visita 'Welcome Island Public'. + + + Spiacenti, ma non hai accesso nel luogo di destinazione richiesto. + + + Gli oggetti da te indossati non sono ancoa arrivati. Attendi ancora qualche secondo o scollegati e ricollegati prima di provare a teleportarti. + + + Il server della regione è al momento occupato e la tua richiesta di teletrasporto non può essere soddisfatta entro breve tempo. Per favore prova di nuovo tra qualche minuto o spostati in un'area meno affollata. + + + Spiacenti, il sistema non riesce a soddisfare la tua richiesta di teletrasporto entro un tempo ragionevole. Riprova tra qualche minuto. + + + Spiacenti, il sistema non riesce a completare il cambio di regione entro un tempo ragionevole. Riprova tra qualche minuto. + + + Impossibile trovare la destinazione del teletrasporto; potrebbe essere temporaneamente non accessibile o non esistere più. Riprovaci tra qualche minuto. + + + L'inventario è temporaneamente inaccessibile. + + + Per poter entrare in questa regione devi avere almeno 18 anni. + + + Impossibile entrare nella regione. '[REGION_NAME]' è una regione per giochi di abilità e per entrare è necessario soddisfare alcuni requisiti. Per dettagli, leggi le [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life domande frequenti sui giochi di abilità]. + + + Mi dispiace, ma il sistema non è stato in grado di avviare il teletrasporto. Ti preghiamo di riprovare tra qualche minuto. + - In invio a destinazione. - In reindirizzamento ad una nuova destinazione. - In reinvio a destinazione. - In invio verso la destinazione casa. - In invio verso la destinazione del landmark. - Teletrasporto completato - Teleport completato da [T_SLURL] - Elaborazione della destinazione in corso... - Contatto in corso con la nuova regione. - In arrivo a destinazione... - Avvio teletrasporto.... - Teleport in sospeso... + + In invio a destinazione. + + + In reindirizzamento ad una nuova destinazione. + + + In reinvio a destinazione. + + + In invio verso la destinazione casa. + + + In invio verso la destinazione del landmark. + + + Teletrasporto completato + + + Teleport completato da [T_SLURL] + + + Elaborazione della destinazione in corso... + + + Contatto in corso con la nuova regione. + + + In arrivo a destinazione... + + + Avvio teletrasporto.... + + + Teleport in sospeso... + diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index 7d1cf9d146..2a338123f3 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -6150,7 +6150,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ フォルダ「[ITEM_NAME]」がインベントリに送られてきました。 -[NAME]とチャットしています。個人情報を共有しないでください。 + [NAME]とチャットしています。個人情報を共有しないでください。 詳細は https://second.life/scripted-agents をご覧ください。 diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index 65b487e1b3..7a61878618 100644 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -22,14 +22,14 @@ Konfiguracja budowania: [BUILD_CONFIG] -Położenie [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] w [REGION] zlokalizowanym w <nolink>[HOSTNAME]</nolink> + Położenie [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] w [REGION] zlokalizowanym w <nolink>[HOSTNAME]</nolink> SLURL: <nolink>[SLURL]</nolink> (koordynaty globalne [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] [SERVER_RELEASE_NOTES_URL] -Procesor (CPU): [CPU] + Procesor (CPU): [CPU] Pamięć (Memory): [MEMORY_MB] MB System operacyjny (OS Version): [OS_VERSION] Dostawca karty graficznej (Graphics Card Vendor): [GRAPHICS_CARD_VENDOR] @@ -42,7 +42,7 @@ Karta graficzna (Graphics Card): [GRAPHICS_CARD] Wersja OpenGL: [OPENGL_VERSION] -Rozmiar okna (Window size): [WINDOW_WIDTH]x[WINDOW_HEIGHT] + Rozmiar okna (Window size): [WINDOW_WIDTH]x[WINDOW_HEIGHT] Dostrojenie rozmiaru czcionki: [FONT_SIZE_ADJUSTMENT]pt Skalowanie interfejsu (UI Scaling): [UI_SCALE] Pole widzenia (Draw Distance): [DRAW_DISTANCE]m @@ -56,7 +56,7 @@ Pamięć podręczna dysku (Disk cache): [DISK_CACHE_INFO] Tryb obrazu HiDPI: [HIDPI] -Wersja dekodera J2C: [J2C_VERSION] + Wersja dekodera J2C: [J2C_VERSION] Wersja sterownika dźwięku (Audio Driver): [AUDIO_DRIVER_VERSION] [LIBCEF_VERSION] Wersja LibVLC: [LIBVLC_VERSION] @@ -572,7 +572,7 @@ Jeśli myślisz, że to błąd skontaktuj się z support@secondlife.com Usunięcie znajomego - Zamknij (⌘W) + Zamknij (⌘W) Zamknij (Ctrl+W) @@ -596,11 +596,11 @@ Jeśli myślisz, że to błąd skontaktuj się z support@secondlife.com Pokaż Pomoc -Przedmioty tego typu nie mogą być dołączane + Przedmioty tego typu nie mogą być dołączane do notek z tego regionu. -Tylko przedmioty z nieograniczonymi + Tylko przedmioty z nieograniczonymi uprawnieniami 'następnego właściciela' mogą być dołączane do notek. @@ -1622,7 +1622,7 @@ Jeśli ciągle otrzymujesz tą wiadomość, to skontaktuj się z pomocą technic - + @@ -4359,7 +4359,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE]. (Zapisano [LONG_TIMESTAMP]) - Aby zobaczyć tą wiadomość musisz odznaczyć 'Tylko znajomi i grupy mogą wysyłać mi wiad. prywatne (IM) oraz rozmowy głosowe' w Ustawieniach/Prywatności. + Aby zobaczyć tą wiadomość musisz odznaczyć 'Tylko znajomi i grupy mogą wysyłać mi wiad. prywatne (IM) oraz rozmowy głosowe' w Ustawieniach/Prywatności. dostępny/a @@ -4413,7 +4413,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE]. Zaoferowano folder: '[ITEM_NAME]' -Rozmawiasz z botem [NAME]. Nie udostępniaj żadnych danych osobowych. + Rozmawiasz z botem [NAME]. Nie udostępniaj żadnych danych osobowych. Dowiedz się więcej na https://second.life/scripted-agents. @@ -5290,10 +5290,10 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu. Otoczenie - Rozmowy nie są zapisywane do dziennika. Jeśli chcesz zacząć je logować wybierz "Zapisywanie: tylko dziennik" lub "Zapisywanie: dziennik i logi rozmów" w Preferencje > Czat. + Rozmowy nie są zapisywane do dziennika. Jeśli chcesz zacząć je logować wybierz "Zapisywanie: tylko dziennik" lub "Zapisywanie: dziennik i logi rozmów" w Preferencje > Czat. - Rozmowy nie będą więcej zapisywane. Jeśli chcesz kontynuować ich logowanie wybierz "Zapisywanie: tylko dziennik" lub "Zapisywanie: dziennik i logi rozmów" w Preferencje > Czat. + Rozmowy nie będą więcej zapisywane. Jeśli chcesz kontynuować ich logowanie wybierz "Zapisywanie: tylko dziennik" lub "Zapisywanie: dziennik i logi rozmów" w Preferencje > Czat. Nie ma zapisanych rozmów. Jeśli skontaktujesz się z kimś, lub ktoś z Tobą, to wpis dziennika pojawi się tutaj. diff --git a/indra/newview/skins/default/xui/pl/teleport_strings.xml b/indra/newview/skins/default/xui/pl/teleport_strings.xml index e86255100e..e091f79fe4 100644 --- a/indra/newview/skins/default/xui/pl/teleport_strings.xml +++ b/indra/newview/skins/default/xui/pl/teleport_strings.xml @@ -22,7 +22,7 @@ Spróbuj jeszcze raz. Brak możliwości ponownej teleportacji do Welcome Island. -Odwiedź 'Welcome Island Public' by powtórzyć szkolenie. +Odwiedź 'Welcome Island Public' by powtórzyć szkolenie. Przepraszamy, ale nie masz dostępu do miejsca docelowego. diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index ccd0336ed1..543fd45573 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -1,2011 +1,5787 @@ - SECOND LIFE - Portal de Supporte Second Life - Detectando hardware... - Carregando [APP_NAME]... - Limpando o cache... - Iniciando cache de texturas... - Falha na inicialização dos gráficos. Atualize seu driver gráfico! - [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) -[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] - Configuração do corpo [BUILD_CONFIG] - Você está em [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] em [REGION] localizado em <nolink>[HOSTNAME]</nolink> + + SECOND LIFE + + + Portal de Supporte Second Life + + + Detectando hardware... + + + Carregando [APP_NAME]... + + + Limpando o cache... + + + Iniciando cache de texturas... + + + Falha na inicialização dos gráficos. Atualize seu driver gráfico! + + + [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit) +[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] + + + Configuração do corpo [BUILD_CONFIG] + + + Você está em [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] em [REGION] localizado em <nolink>[HOSTNAME]</nolink> SLURL: <nolink>[SLURL]</nolink> (coordenadas globais [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] -[SERVER_RELEASE_NOTES_URL] - CPU: [CPU] +[SERVER_RELEASE_NOTES_URL] + + + CPU: [CPU] Memória: [MEMORY_MB] MBs Versão OS: [OS_VERSION] Placa de vídeo: [GRAPHICS_CARD_VENDOR] -Placa gráfica: [GRAPHICS_CARD] - Versão do driver de vídeo Windows: [GRAPHICS_DRIVER_VERSION] - Versão do OpenGL: [OPENGL_VERSION] - Tamanho da janela: [WINDOW_WIDTH]x[WINDOW_HEIGHT] +Placa gráfica: [GRAPHICS_CARD] + + + Versão do driver de vídeo Windows: [GRAPHICS_DRIVER_VERSION] + + + Versão do OpenGL: [OPENGL_VERSION] + + + Tamanho da janela: [WINDOW_WIDTH]x[WINDOW_HEIGHT] Ajuste do tamanho da fonte: [FONT_SIZE_ADJUSTMENT]pt UI Escala: [UI_SCALE] Estabelecer a distância: [DRAW_DISTANCE]m Largura da banda: [NET_BANDWITH]kbit/s LOD fator: [LOD_FACTOR] Qualidade de renderização: [RENDER_QUALITY] -Memória de textura: [TEXTURE_MEMORY]MB - HiDPI modo de exibição: [HIDPI] - Versão do J2C Decoder: [J2C_VERSION] +Memória de textura: [TEXTURE_MEMORY]MB + + + HiDPI modo de exibição: [HIDPI] + + + Versão do J2C Decoder: [J2C_VERSION] Versão do driver de áudio: [AUDIO_DRIVER_VERSION] [LIBCEF_VERSION] Versão do LibVLC: [LIBVLC_VERSION] -Versão do servidor de voz: [VOICE_VERSION] - Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) - [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] - Erro ao obter URL de notas de versão do servidor. - Configuração do corpo - Restaurando... - Alterando a resolução... - Fullbright (antigo) - Fazendo login. [APP_NAME] pode parecer congelado. Por favor, aguarde. - Logando... - Autenticando - Executando manutenção da conta... - Falha na tentativa anterior de login. Login, tentativa [NUMBER] - Carregando mundo... - Inicializando navegador embutido... - Inicializando multimídia... - Carregando fontes... - Verificando arquivos cache (pode levar de 60-90 segundos)... - Processando resposta... - Inicializando mundo... - Decodificando imagens... - Inicializando o QuickTime... - O QuickTime não foi encontrado - falha ao iniciar. - O QuickTime foi inicializado com sucesso. - Solicitando recursos da região... - Solicitando recursos da região, tentativa [NUMBER]... - Aguardando handshake com a região... - Conectando à região... - Baixando roupas... - O servidor respondeu com um certificado inválido ou corrompido. Por favor contate o administrador do Grid. - Um hostname inválido foi usado para acessar o servidor. Verifique o SLURL ou hostname do Grid. - O certificado dado pelo Grid parece estar vencido. Verifique o relógio do sistema ou contate o administrador do Grid. - O certificado dado pelo servidor não pôde ser usado para SSL. Por favor contate o administrador do Grid. - A cadeia de certificados do servidor tinha certificados demais. Por favor contate o administrador do Grid. - A assinatura do certificado dado pelo servidor do Grid não pôde ser verificada. Contate o administrador do seu Grid. - Erro de rede: Falha de conexão: verifique sua conexão à internet. - Falha do login. - Sair - http://join.secondlife.com/?sourceid=[sourceid] - Grade principal do Second Life (Agni) - Grade de teste beta do Second Life (Aditi) - http://secondlife.com/download - O visualizador utilizado já não é compatível com o Second Life. Visite a página abaixo para baixar uma versão atual: http://secondlife.com/download +Versão do servidor de voz: [VOICE_VERSION] + + + Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) + + + [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] + + + Erro ao obter URL de notas de versão do servidor. + + + Configuração do corpo + + + Restaurando... + + + Alterando a resolução... + + + Fullbright (antigo) + + + Fazendo login. [APP_NAME] pode parecer congelado. Por favor, aguarde. + + + Logando... + + + Autenticando + + + Executando manutenção da conta... + + + Falha na tentativa anterior de login. Login, tentativa [NUMBER] + + + Carregando mundo... + + + Inicializando navegador embutido... + + + Inicializando multimídia... + + + Carregando fontes... + + + Verificando arquivos cache (pode levar de 60-90 segundos)... + + + Processando resposta... + + + Inicializando mundo... + + + Decodificando imagens... + + + Inicializando o QuickTime... + + + O QuickTime não foi encontrado - falha ao iniciar. + + + O QuickTime foi inicializado com sucesso. + + + Solicitando recursos da região... + + + Solicitando recursos da região, tentativa [NUMBER]... + + + Aguardando handshake com a região... + + + Conectando à região... + + + Baixando roupas... + + + O servidor respondeu com um certificado inválido ou corrompido. Por favor contate o administrador do Grid. + + + Um hostname inválido foi usado para acessar o servidor. Verifique o SLURL ou hostname do Grid. + + + O certificado dado pelo Grid parece estar vencido. Verifique o relógio do sistema ou contate o administrador do Grid. + + + O certificado dado pelo servidor não pôde ser usado para SSL. Por favor contate o administrador do Grid. + + + A cadeia de certificados do servidor tinha certificados demais. Por favor contate o administrador do Grid. + + + A assinatura do certificado dado pelo servidor do Grid não pôde ser verificada. Contate o administrador do seu Grid. + + + Erro de rede: Falha de conexão: verifique sua conexão à internet. + + + Falha do login. + + + Sair + + + http://join.secondlife.com/?sourceid=[sourceid] + + + Grade principal do Second Life (Agni) + + + Grade de teste beta do Second Life (Aditi) + + + http://secondlife.com/download + + + O visualizador utilizado já não é compatível com o Second Life. Visite a página abaixo para baixar uma versão atual: http://secondlife.com/download -Para saber mais, visite as perguntas frequentes abaixo: http://secondlife.com/viewer-access-faq - Existe uma versão atualizada do seu visualizador: [VERSION] - Atualização de visualizador obrigatória: [VERSION] - Este agente já fez login. - Desculpe! Não foi possível fazer seu login. Verifique se digitou o nome de usuário correto* (como kiki45 ou astro.física) * e senha. Verifique também que a tecla Maiúscula está desativada. - Como medida de precaução, sua senha foi alterada. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente. - Fizemos algumas alterações a seu sistema. Você precisa selecionar outra senha. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente. - O Second Life está fechado para manutenção no momento. Somente funcionários podem acessá-lo. Consulte www.secondlife.com/status para as últimas atualizações. - Logons do Second Life estão temporariamente restritos para garantir a melhor experiência possível para os usuários no mundo virtual. +Para saber mais, visite as perguntas frequentes abaixo: http://secondlife.com/viewer-access-faq + + + Existe uma versão atualizada do seu visualizador: [VERSION] + + + Atualização de visualizador obrigatória: [VERSION] + + + Este agente já fez login. + + + Desculpe! Não foi possível fazer seu login. Verifique se digitou o nome de usuário correto* (como kiki45 ou astro.física) * e senha. Verifique também que a tecla Maiúscula está desativada. + + + Como medida de precaução, sua senha foi alterada. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente. + + + Fizemos algumas alterações a seu sistema. Você precisa selecionar outra senha. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente. + + + O Second Life está fechado para manutenção no momento. Somente funcionários podem acessá-lo. Consulte www.secondlife.com/status para as últimas atualizações. + + + Logons do Second Life estão temporariamente restritos para garantir a melhor experiência possível para os usuários no mundo virtual. -Pessoas com contas gratuitas não poderão acessar o Second Life no momento para dar espaço para aquelas que pagaram pelo Second Life. - O Second Life não pode ser acessado deste computador. Se você acredita que houve algum equívoco, contate support@secondlife.com. - Sua conta não está disponível para acesso até [TIME], horário do Pacífico nos EUA (GMT-08). - Não é possível concluir a solicitação neste momento. -Entre em contato com o suporte do Second Life para obter ajuda em http://support.secondlife.com. - Dados discrepantes detectados durante o login. Contate support@secondlife.com. - Sua conta está passando por um breve período de manutenção. Sua conta não está disponível para acesso até [TIME], horário do Pacífico nos EUA (GMT-08). Se você acredita que houve algum equívoco, contate support@secondlife.com. - Reação à solicitação de saída foi uma falha do simulador. - O sistema o está desconectando no momento. -Aguarde um minuto antes que tentar logar-se novamente. - Impossível criar sessão válida. - Não foi possível conectar o simulador. - Sua conta possui acesso ao Second Life das [START] às [END], horário da costa leste dos EUA. Volte novamente durante seu horário de acesso. Se você acredita que houve algum equívoco, contate support@secondlife.com. - Parâmetros incorretos. Se você acredita que houve algum equívoco, contate support@secondlife.com. - O parâmetro de primeiro nome deve ser alfanumérico. Se você acredita que houve algum equívoco, contate support@secondlife.com. - O parâmetro de sobrenome deve ser alfanumérico. Se você acredita que houve algum equívoco, contate support@secondlife.com. - Região passando para modo offline. Tente novamente dentro de alguns instantes. - Não há agente na região. Tente novamente dentro de alguns instantes. - A região estava acessada por outra sessão. Tente novamente dentro de alguns instantes. - A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes. - A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes. - A região passou para o modo offline na última sessão. Tente novamente dentro de alguns instantes. - A região inicou o modo offline. Tente novamente dentro de alguns instantes. - O sistema iniciou o modo offline em sua sessão anterior. Tente novamente dentro de alguns instantes. - Esta região pode estar passando por problemas. Por favor, verifique sua conexão com a internet. - Salvando configurações... - Saindo... - Fechando... - Você foi desconectado da região onde estava. - Você foi enviado para uma região inválida. - Teste de desconexão - Conectando ao Facebook... - Publicando... - Desconectando do Facebook... - Problema ao conectar ao Facebook - Problema ao publicar no Facebook - Problema ao desconectar do Facebook - Conectando ao Flickr... - Publicando... - Desconectando do Flickr... - Problema ao conectar ao Flickr - Problema ao publicar no Flickr - Problema ao desconectar do Flickr - Conectando ao Twitter... - Publicando... - Desconectando do Twitter... - Problema ao conectar ao Twitter - Problema ao publicar no Twitter - Problema ao desconectar do Twitter - Preto e branco - Cores dos anos 1970 - Intenso - Retícula - Sépia - Destaque - Vídeo - Autocontraste - Reflexo de flash - Miniatura - Câmera de brinquedo - Pessoa - (sem nome) - Proprietário: - Público - (Grupo) - À venda: L$[AMOUNT] - Construído por Grupo - Não é permitido construir - Construído por Grupo - Não é seguro - Não é permitido voar - Scripts de Grupo - Não são permitidos scripts - Terreno: - Apenas um item único pode ser arrastado para este local - Você não pode usar uma pasta que contenha mais de [AMOUNT] itens. Você pode mudar esse limite em Avançado > Mostrar configurações de depuração > WearFolderLimit. +Pessoas com contas gratuitas não poderão acessar o Second Life no momento para dar espaço para aquelas que pagaram pelo Second Life. + + + O Second Life não pode ser acessado deste computador. Se você acredita que houve algum equívoco, contate support@secondlife.com. + + + Sua conta não está disponível para acesso até [TIME], horário do Pacífico nos EUA (GMT-08). + + + Não é possível concluir a solicitação neste momento. +Entre em contato com o suporte do Second Life para obter ajuda em http://support.secondlife.com. + + + Dados discrepantes detectados durante o login. Contate support@secondlife.com. + + + Sua conta está passando por um breve período de manutenção. Sua conta não está disponível para acesso até [TIME], horário do Pacífico nos EUA (GMT-08). Se você acredita que houve algum equívoco, contate support@secondlife.com. + + + Reação à solicitação de saída foi uma falha do simulador. + + + O sistema o está desconectando no momento. +Aguarde um minuto antes que tentar logar-se novamente. + + + Impossível criar sessão válida. + + + Não foi possível conectar o simulador. + + + Sua conta possui acesso ao Second Life das [START] às [END], horário da costa leste dos EUA. Volte novamente durante seu horário de acesso. Se você acredita que houve algum equívoco, contate support@secondlife.com. + + + Parâmetros incorretos. Se você acredita que houve algum equívoco, contate support@secondlife.com. + + + O parâmetro de primeiro nome deve ser alfanumérico. Se você acredita que houve algum equívoco, contate support@secondlife.com. + + + O parâmetro de sobrenome deve ser alfanumérico. Se você acredita que houve algum equívoco, contate support@secondlife.com. + + + Região passando para modo offline. Tente novamente dentro de alguns instantes. + + + Não há agente na região. Tente novamente dentro de alguns instantes. + + + A região estava acessada por outra sessão. Tente novamente dentro de alguns instantes. + + + A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes. + + + A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes. + + + A região passou para o modo offline na última sessão. Tente novamente dentro de alguns instantes. + + + A região inicou o modo offline. Tente novamente dentro de alguns instantes. + + + O sistema iniciou o modo offline em sua sessão anterior. Tente novamente dentro de alguns instantes. + + + Esta região pode estar passando por problemas. Por favor, verifique sua conexão com a internet. + + + Salvando configurações... + + + Saindo... + + + Fechando... + + + Você foi desconectado da região onde estava. + + + Você foi enviado para uma região inválida. + + + Teste de desconexão + + + Conectando ao Facebook... + + + Publicando... + + + Desconectando do Facebook... + + + Problema ao conectar ao Facebook + + + Problema ao publicar no Facebook + + + Problema ao desconectar do Facebook + + + Conectando ao Flickr... + + + Publicando... + + + Desconectando do Flickr... + + + Problema ao conectar ao Flickr + + + Problema ao publicar no Flickr + + + Problema ao desconectar do Flickr + + + Conectando ao Twitter... + + + Publicando... + + + Desconectando do Twitter... + + + Problema ao conectar ao Twitter + + + Problema ao publicar no Twitter + + + Problema ao desconectar do Twitter + + + Preto e branco + + + Cores dos anos 1970 + + + Intenso + + + Retícula + + + Sépia + + + Destaque + + + Vídeo + + + Autocontraste + + + Reflexo de flash + + + Miniatura + + + Câmera de brinquedo + + + Pessoa + + + (sem nome) + + + Proprietário: + + + Público + + + (Grupo) + + + À venda: L$[AMOUNT] + + + Construído por Grupo + + + Não é permitido construir + + + Construído por Grupo + + + Não é seguro + + + Não é permitido voar + + + Scripts de Grupo + + + Não são permitidos scripts + + + Terreno: + + + Apenas um item único pode ser arrastado para este local + + + Você não pode usar uma pasta que contenha mais de [AMOUNT] itens. Você pode mudar esse limite em Avançado > Mostrar configurações de depuração > WearFolderLimit. + - Isso contém um link para uma página no domínio oficial do SecondLife.com ou LindenLab.com. - Não é possível fazer rez de itens da pasta Listagens do Marketplace - Não é possível colocar itens que você estiver usando na pasta Listagens do Marketplace - A profundidade das pastas aninhadas excede [AMOUNT]. Diminua a profundidade das pastas dentro de pastas. Agrupe os itens se necessário. - O número de subpastas excede [AMOUNT]. Diminua a o número de pastas em sua listagem. Agrupe os itens se necessário. - O número de itens excede [AMOUNT]. Para vender mais que [AMOUNT] itens em uma listagem, você deve agrupar alguns deles. - O número de itens de estoque excede [AMOUNT]. - Você pode soltar somente itens ou pastas na aba TUDO ou NÃO ASSOCIADOS. Selecione uma dessas abas e mova seus itens ou pastas novamente. - Um ou mais objetos não podem ser vendidos ou transferidos - É possível colocar somente itens do seu inventário no Marketplace - Não é possível colocar itens ou pastas vinculadas no Marketplace - Não é possível colocar cartões de visitas no Marketplace - Não é possível mover uma listagem publicada - Não é possível mover a pasta raiz das listagens do Marketplace - Todos os itens em uma pasta de estoque têm o mesmo tipo e permissão - Não é possível mover uma pasta para seu filho - Não é possível mover uma pasta para dentro dela mesma - Clique para ver a página web - Clique para ver os dados desta localização - Clique para ver o perfil deste residente - Saiba mais sobre este residente - Clique para silenciar este residente - Clique para desfazer silenciar neste residente - Clique para enviar uma MI para este residente - Clique para pagar este residente - Clique para enviar um pedido de amizade a este residente - Clique para enviar um pedido de amizade a este residente - Clique para ver a descrição deste Grupo - Clique para ver a descrição deste evento - Clique para ver este anúncio - Clique para ver a descrição desta parcela - Clique para teletransportar para esta localização - Clique para ver a descrição deste objeto - Clique para ver esta localização no mapa - Clique para ativar no secondlife:// comando + + Isso contém um link para uma página no domínio oficial do SecondLife.com ou LindenLab.com. + + + Não é possível fazer rez de itens da pasta Listagens do Marketplace + + + Não é possível colocar itens que você estiver usando na pasta Listagens do Marketplace + + + A profundidade das pastas aninhadas excede [AMOUNT]. Diminua a profundidade das pastas dentro de pastas. Agrupe os itens se necessário. + + + O número de subpastas excede [AMOUNT]. Diminua a o número de pastas em sua listagem. Agrupe os itens se necessário. + + + O número de itens excede [AMOUNT]. Para vender mais que [AMOUNT] itens em uma listagem, você deve agrupar alguns deles. + + + O número de itens de estoque excede [AMOUNT]. + + + Você pode soltar somente itens ou pastas na aba TUDO ou NÃO ASSOCIADOS. Selecione uma dessas abas e mova seus itens ou pastas novamente. + + + Um ou mais objetos não podem ser vendidos ou transferidos + + + É possível colocar somente itens do seu inventário no Marketplace + + + Não é possível colocar itens ou pastas vinculadas no Marketplace + + + Não é possível colocar cartões de visitas no Marketplace + + + Não é possível mover uma listagem publicada + + + Não é possível mover a pasta raiz das listagens do Marketplace + + + Todos os itens em uma pasta de estoque têm o mesmo tipo e permissão + + + Não é possível mover uma pasta para seu filho + + + Não é possível mover uma pasta para dentro dela mesma + + + Clique para ver a página web + + + Clique para ver os dados desta localização + + + Clique para ver o perfil deste residente + + + Saiba mais sobre este residente + + + Clique para silenciar este residente + + + Clique para desfazer silenciar neste residente + + + Clique para enviar uma MI para este residente + + + Clique para pagar este residente + + + Clique para enviar um pedido de amizade a este residente + + + Clique para enviar um pedido de amizade a este residente + + + Clique para ver a descrição deste Grupo + + + Clique para ver a descrição deste evento + + + Clique para ver este anúncio + + + Clique para ver a descrição desta parcela + + + Clique para teletransportar para esta localização + + + Clique para ver a descrição deste objeto + + + Clique para ver esta localização no mapa + + + Clique para ativar no secondlife:// comando + - Clique para escrever um email - Teletransportar para - Mostrar no mapa para - Silenciar - Desfazer silenciar - MI - Pagar - Oferecer teletransporte para - Pedido de amizade - Remoção de amigo - Fechar (⌘W) - Fechar (Ctrl+W) - Fechar - Restaurar - Minimizar - Separar-se da janela - conectar-se à barra - Mostrar ajuda - Os itens deste tipo não podem ser anexados -às anotações desta região. - Somente itens com permissões irrestritas + + Clique para escrever um email + + + Teletransportar para + + + Mostrar no mapa para + + + Silenciar + + + Desfazer silenciar + + + MI + + + Pagar + + + Oferecer teletransporte para + + + Pedido de amizade + + + Remoção de amigo + + + Fechar (⌘W) + + + Fechar (Ctrl+W) + + + Fechar + + + Restaurar + + + Minimizar + + + Separar-se da janela + + + conectar-se à barra + + + Mostrar ajuda + + + Os itens deste tipo não podem ser anexados +às anotações desta região. + + + Somente itens com permissões irrestritas do 'próximo proprietário’ pode -ser anexado às anotações. - Buscando... - Não encontrado. - Buscando... - Notas de versão - https://releasenotes.secondlife.com/viewer/ - Carregando... - (ninguém) - (aguardando) - (nenhum) - Nenhum erro - Item pedido falhou - Item pedido: arquivo inexistente - Item pedido: item não encontrado na base de dados. - Fim do arquivo - Não é possível abrir arquivo - Arquivo não encontrado - Tempo de transferência de arquivo expirado - Circuito caiu - Visualizador e servidor não concordam no preço - Status desconhecido - Serviço não disponível. - O servidor está enfrentando dificuldades inesperadas. - Serviço não disponível ou o tempo final para upload foi atingido. - Erro na solicitação de upload. Acesso -http://secondlife.com/support para ajuda ao resolver este problema. - Falha na validação para importação das configurações [NAME] - Não foi possível abrir o arquivo [FILE] - Não foi possível abrir o arquivo [FILE] - Não foi possível traduzir o vento antigo [NAME] - textura - som - cartão de visitas - landmark - script obsoleto - roupas - objeto - anotação - pasta - raiz - script LSL2 - bytecode LSL - textura tga - parte do corpo - fotografia - Achados e Perdidos - imagem targa - Lixo - imagem jpeg - animação - gesto - simstate - favorito - link - link da pasta - configurações - mesh - (Edição Aparência) - Distante - Não perturbe - Mudo - Temeroso - Bravo - Distante - Virar para trás - Rir segurando a barriga - Sorriso largo - Mandar beijo - Entediado - Reverência - Aplaudir - Saudação formal - Chorar - Dança 1 - Dança 2 - Dança 3 - Dança 4 - Dança 5 - Dança 6 - Dança 7 - Dança 8 - Desdém - Beber - Envergonhado - Negar com o dedo. - Vibrar provocando - Levitar Yoga - Careta - Impaciente - Pular de alegria - Beije meu bumbum - Beijar - Rir - Exibir músculos - Não (descontente) - Não - Nya-nya-nya - Soco um-dois - Abrir a boca - Paz - Apontar para o outro - Apontar para si - Soco esquerdo - Soco direito - RPS contar - RPS papel - RPS pedra - RPS tesoura - Repulsa - Chute giratório - Triste - Saúde - Gritar - Encolher ombros - Sorrir - Fumar à toa - Inalar fumaça - Expelir fumaça - Surpresa - Golpe de espada - Enraivecer - Mostrar a língua - Onda - Sussurrar - Assobiar - Piscar - Piscar (Hollywood) - Preocupar-se - Sim (Feliz) - Sim - Múltiplo - Usar textura - Mova o cursor do mouse sobre a regra - para ajustar à grade - Carregando... - Offline - L$[PRICE] por [AREA] m² - Nenhum encontrado. - OK - término prematuro do arquivo - Não é possível encontrar a raiz (ROOT) ou junção (JOINT). - Bate-papo local - (Bate-papo local) - sussurra: - grita: - Conectando à conversa de voz no mundo - Conectado - Voz não disponível na sua localização atual - Desconectado da conversa de Voz no mundo - Agora você será reconectado ao bate-papo local. - '[OBJECTNAME]', um objeto de '[OWNERNAME]', localizado em [REGIONNAME] a [REGIONPOS], obteve permissão para: [PERMISSIONS]. - '[OBJECTNAME]', um objeto de '[OWNERNAME]', localizado em [REGIONNAME] a [REGIONPOS], teve permissão negada para: [PERMISSIONS]. - Se você permitir acesso à sua conta, o objeto também poderá: - Tomar linden dólares (L$) de você - Atue nas suas entradas de controle - Remapeie suas entradas de controle - Faça uma animação para o seu avatar - Anexe ao seu avatar - Libere a propriedade e torne-a pública - Una e desuna de outros objetos - Adicione e remova junções com outros objetos - Modifique as permissões - Acompanhe sua câmera - Controle sua camera - Teletransportá-lo - Forçar o avatar a sentar - Alterar sua configurações de ambiente - (Você) - - Suprimir alertas ao gerenciar listas de acesso ao terreno - Substituir suas animações padrão - Retornar objetos em seu nome - (desconhecido)! - Público geral - Moderado - Adulto - Desconectado - Desconhecido - (desconhecido) - Propriedadade / Região inteira: - Imóvel / Homestead - Continente / Homestead - Continente / Região inteira: - Todos os arquivos - Sons - Animações - Imagens - Salvar - Carregar - Imagens Targa - Imagens Bitmap - Imagens PNG - Imagens targa ou PNG - Arquivo de vídeo AVI - Arquivo de animação XAF - Arquivo XML - Arquivo RAW - Imagens compactadas - Carregar arquivos - Selecionar pasta - Scripts - Dicionários - Silhueta - Pele - Cabelo - Olhos - Camisa - Calças - Sapatos - Meias - Blusa - Luvas - Camiseta - Roupa de baixo - Saia - Alpha - Tatuagem - Universal - Físico - Inválido - nenhum - Camisa não vestida - Calças não vestidas - Sapatos não calçados - Meias não calçadas - Jaqueta não vestida - Luvas não calçadas - Camiseta não vestida - Roupa de baixo não vestida - Saia não vestida - Alpha não vestido - Tatuagem não usada - Universal não usado - Físico não usado - inválido - Criar novo físico - Criar pele nova - Criar cabelo novo - Criar olhos novos - Criar camisa nova - Criar calças novas - Criar sapatos novos - Criar meias novas - Criar jaqueta nova - Criar luvas novas - Criar camiseta nova - Criar roupa de baixo nova - Criar saia nova - Criar Alpha novo - Criar nova tatuagem - Criar um novo universal - Criar novo físico - inválido - Novo [WEARABLE_ITEM] - Próximo - OK - Anúncio de grupo - Anúncios do grupo - Enviado por - Anexo: - Ver últimos anúncios ou optar por não receber essas mensagens aqui. - Abrir anexo - Salvar anexo - Oferta de teletransporte - Novas notificações chegaram enquanto você estava fora... - Você tem mais [%d] notificações - Braço direito - Cabeça - Braço esquerdo - Perna esquerda - Tronco - Perna direita - Esqueleto aprimorado - Baixo - Meio - Alto - Pressione ESC para retornar para visão do mundo - Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search]. - Não encontrou o que procura? Tente [secondlife:///app/inventory/filters Show filters]. - Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search]. - Arraste um marco para adicioná-lo aos seus favoritos. - Nenhum item correspondente encontrado. Verifique a ortografia de sua cadeia de pesquisa e tente novamente. - Você não possui uma cópia desta textura no seu inventário - Suas compras do Marketplace aparecerão aqui. Depois, você poderá arrastá-las para seu inventário para usá-las. - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ - http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports - https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more - Abrir a janela com as opções do Jogo. - Executar o gesto selecionado no mundo. - Abrir a janela com as opções do Jogo. - Qualquer um pode vender itens no Mercado. - - Se você deseja se tornar um lojista, precisará [[MARKETPLACE_CREATE_STORE_URL] criar uma loja no Mercado]. - Sua caixa de saída está vazia - - Arraste as pastas para estas áreas e então clique em "Enviar para Mercado" para listar os itens para venda no [[MARKETPLACE_DASHBOARD_URL] Mercado]. - Inicializando o Marketplace. - Estamos acessando sua conta na [loja [MARKETPLACE_CREATE_STORE_URL] do Marketplace]. - Erros do Marketplace. - A loja [[MARKETPLACE_CREATE_STORE_URL] no Marketplace] está retornando erros. - Erro ao abrir as listagens do Marketplace. -Se você continuar a receber essa mensagem, entre em contato com o suporte do Second Life para obter ajuda em http://support.secondlife.com - Sua pasta Listagens do Marketplace está vazia. - Arraste pastas para esta área para listá-las para venda no [Marketplace [MARKETPLACE_DASHBOARD_URL]]. - ( [ITEMS_COUNT] Items ) - a pasta de estoque deve estar em uma pasta de versões - : Erro: todos os itens em uma pasta de estoque devem ser de cópia proibida e todos do mesmo tipo - : Erro: a pasta de estoque não pode ter subpastas - : Aviso: a pasta não contém itens - : Aviso: criando pasta de estoque - : Aviso: criando pasta de versões - : Aviso: movendo itens - : Aviso: conteúdo da pasta transferido para pasta de estoque, removendo pasta vazia - : Erro: itens de cópia proibida devem estar em uma pasta de estoque - : Aviso: os itens devem estar em uma pasta de versões - : Erro: - : Aviso: - : Aviso: a pasta de versões deve conter pelo menos 1 item - : Aviso: a pasta de estoque deve conter pelo menos 1 item - Não há erros ou avisos - Sem erros - Erro: - antes de enviar os itens para o Marketplace, é necessário que você se defina como um lojista (sem custos). - Não é possível mover o item nessa pasta. - Este item não pode ser vendido no Marketplace. - no Mkt ID - publicada - ativo - máx - estoque - esgotado - atualizando... - A taxa é baseada em seu nível de inscrição. Níveis mais altos possuem taxas mais baixas. [https://secondlife.com/my/account/membership.php? Saiba mais] - Marcos em aberto - Ilimitado - - - - - - - Carregando conteúdo... - Nenhum conteúdo - - - - - - - - - - - - - - - - - - - - - - - - - - - Meu inventário - Biblioteca - Texturas - Sons - Cartões de visitas - Marcos - Scripts - Vestuário - Objetos - Anotações - Nova pasta - Inventário - Imagens descompactadas - Corpo - Lixo - Álbum de fotografias - Achados e Perdidos - Sons descompactados - Animações - Gestos - Meus favoritos - Meus favoritos - Meus favoritos - Meus favoritos - Look atual - Looks iniciais - Meus looks - Acessórios - Meshes: - Itens recebidos - Caixa de saída do lojista - Amigos - Tudo - Nenhum anexo vestido - Anexos ([COUNT] slots permanecem) - Comprar - Comprar por L$ - Pedra - Metal - Vidro - Madeira - Carne - Plástico - Borrracha - Luz - Shift - Ctrl - Peito - Crânio - Ombro esquerdo - Ombro direito - Mão esquerda - Mão direita - Pé esquerdo - Pé direito - Espinha - Pélvis - Boca - Queixo - Orelha esquerda - Orelha direita - Globo ocular esquerdo - Globo ocular direito - Nariz - Braço superior D - Antebraço D - Braço superior E - Antebraço E - Quadril direito - Coxa D - Perna inferior D - Quadril esquerdo - Coxa E - Perna inferior E - Estômago - Peitoral E - Peitoral D - Pescoço - Centro do avatar - Anelar esquerdo - Anelar direito - Base do rabo - Ponta do rabo - Asa esquerda - Asa direita - Maxilar - Orelha esquerda alt. - Orelha direita alt. - Olho esquerdo alt. - Olho direito alt. - Língua - Virilha - Pata esq. traseira - Pata dir. traseira - Ponto de encaixe inválido - Erro: item ausente - Erro: item base ausente - Erro: o objeto está no look atual, mas não foi anexado - [AGEYEARS] [AGEMONTHS] de idade - [AGEYEARS] de idade - [AGEMONTHS] de idade - [AGEWEEKS] de idade - [AGEDAYS] de idade - Cadastrado hoje - Agora, todos podem te ver. - Sua renderização pode não acontecer para todos ao seu redor. - Sua renderização pode não acontecer para metade das pessoas ao seu redor. - Sua renderização pode não acontecer para a maioria das pessoas ao seu redor. - Sua renderização pode não acontecer para ninguém ao seu redor. - Seu HUD - [OBJ_NAME] (vestido em [JNT_NAME]) - [HUD_DETAILS] usa muita memória de textura - [HUD_DETAILS] contém muitos objetos e texturas que utilizam o máximo de recursos - [HUD_DETAILS] contém muitas texturas grandes - [HUD_DETAILS] contém muitos objetos - [HUD_DETAILS] contém muitas texturas - [COUNT] ano - [COUNT] anos - [COUNT] anos - [COUNT] mês - [COUNT] meses - [COUNT] meses - [COUNT] semana - [COUNT] semanas - [COUNT] semanas - [COUNT] dia - [COUNT] dias - [COUNT] dias - [COUNT] membro - [COUNT] membros - [COUNT] membros - Residente - Prova - Lista de membros - Empregado da Linden Lab - Dados de pagamento usados - Dados de pagamento fornecidos - Nenhum dado de pagamento - Idade comprovada - Idade não comprovada - Centro 2 - Topo direita - Topo - Topo esquerda - Centro - Inferior esquerdo - Inferior - Inferior direito - Baixado, agora compilando - Serviço de compilação de scripts não disponível - Script não encontrado no servidor. - Problema no download - Permissões insuficientes para fazer o download do script. - Permissões insuficientes para - Falha desconhecida para download - Pulando script [SCRIPT] com experiência [EXPERIENCE] - Progresso do recompilamento - recompilar - Reset Progresso - Zerar - Definir funcionamento do progresso - deixar funcionando - Definir progresso não funcionando - não deixar funcionando - Compilação bem sucedida - Compilação bem sucedida, salvando... - Salvo. - Falha ao carregar arquivo: - Script (objeto fora de alcance) - Script (excluído do inventário) - Objeto [OBJECT] de propriedade de [OWNER] - nenhum - - (Desconhecido) - - - [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc] - - - Balanço - Créditos - Débitos - Total - Não há dados de grupo - Propriedade-pai - continente - adolescente - qualquer um - erro - todas as propriedades pertencem a [OWNER] - todas as propriedades que você possui - todas as propriedades que você gerencia para [OWNER] - Sempre permitido: ([ALLOWEDAGENTS], máx [MAXACCESS]) - Grupos sempre permitidos: ([ALLOWEDGROUPS], máx [MAXACCESS]) - Grupos banidos: ([BANNEDAGENTS], máx [MAXBANNED]) - Sempre permitido - Sempre banido - todos os terrenos - administre terrenos - este terreno - e [EXTRA_COUNT] mais - Memória de scripts no lote - Lotes listados: [PARCELS] - Memória usada: [COUNT] kb de [MAX] kb; [AVAILABLE] kb disponíveis - Memória usada: [COUNT] kb - URL dos scripts do lote - URLs usados: [COUNT] de [MAX]; [AVAILABLE] disponíveis - URLs usados: [COUNT] - Erro ao solicitar dados - Nenhum lote foi selecionado - Erro: dados de script só disponíveis na região da posição atual - Obtendo dados... - Você não está autorizado a examinar este lote. - Sentado em - Peito - Crânio - Ombro esquerdo - Ombro direito - Mão esquerda - Mão direita - Pé esquerdo - Pé direito - Coluna - Pélvis - Boca - Queixo - Orelha esquerda - Orelha direita - Olho esquerdo - Olho direito - Nariz - Braço direito - Antebraço direito - Braço esquerdo - Antebraço esquerdo - Quadril direito - Coxa direita - Perna direita - Quadril esquerdo - Coxa esquerda - Perna esquerda - Estômago - Peitorais E - Peitorais D - HUD Central 2 - HUD superior direito - HUD centro superior - HUD superior esquerdo - HUD Central 1 - HUD esquerda inferior - HUD inferior - HUD direito inferior - Pescoço - Centro do avatar - Anelar esquerdo - Anelar direito - Base do rabo - Ponta do rabo - Asa esquerda - Asa direita - Maxilar - Orelha esquerda alt. - Orelha direita alt. - Olho esquerdo alt. - Olho direito alt. - Língua - Virilha - Pata esq. traseira - Pata dir. traseira - Linha [LINE], Coluna [COLUMN] - [COUNT] encontrado - Conteúdo do objeto - Novo Script - Este residente ativou o "Não perturbe" e verá sua mensagem mais tarde. - (por nome) - (residente) - (objeto) - (grupo) - (Externo) - Não foi definido um contrato para essa região. - Não foi definido um contrato para essa Região. O terreno nesta região está sendo vendido pelo Proprietário, não pela Linden Lab. Favor contatar o Proprietário da região para detalhes de venda. - - - - Propriedade do Grupo - Público - Configurações locais - Configurações da região - Esta Região não suporta as configurações do ambiente. - Dom - Lua - Florescer - Ruído na nuvem - Mapa normal - Transparente - Cliques: [TELEPORT] teletransporte, [MAP] mapa, [PROFILE] perfil - (vai atualizar depois de publicado) - Você não criou nenhum Destaque ou Anúncio. Clique no botão "+" para criar um Destaque ou Anúncio. - Você não criou nenhuma Escolha. Clique em Novo Botão para criar um Escolher - Você criou nenhum Anúncio. Clique em Novo Botão para criar um Classificado - O usuário não tem nenhum destaque ou anúncio - Usuário não tem escolha - Usuário não tem anúncio - Carregando... - Preview - Propriedades - um objeto chamado - possuído pelo grupo - de um grupo desconhecido - de - de usuário desconhecido - deu a você - Você recusou um(a) [DESC] de <nolink>[NAME]</nolink>. - Total - comprou - pagou a você - depositado - comprou passe para - pagou taxa para o evento - pagou prêmio para o evento - Saldo - Créditos - Débitos - [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] - Itens adquiridos - Cancelar - Carregar [NAME] custa L$ [AMOUNT] - Isso custa L$ [AMOUNT] - Extensão de arquivo desconhecida [.%s] -Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh - Bloquear - Adicionar marco... - Editar marco... - - - - - Ctrl+ - Alt+ - Shift+ - Arquivo salvo - Recebendo - AM - PM - PST - PDT - Frente - Esquerda - Direita - Atrás - Norte - Sul - Oeste - Leste - P/ cima - P/ baixo - Qualquer categoria - Compras - Aluguel de terrenos - Aluguel de propriedade - Atração especial - Novos Produtos - Emprego - Desejado - Serviço - Pessoal - Nenhum - Locação Linden - Adulto - Artes e Cultura - Negócios - Educacional - Games - Moradia - Para recém-chegados - Parques & Natureza - Residencial - Estágio - Outros - Aluguel - Qualquer - Você - Mídia múltipla - Tocar/Pausar mídia - http://www.intel.com/p/en_US/support/detect/graphics - http://www.nvidia.com.br/Download/index.aspx?lang=br - http://support.amd.com/us/Pages/AMDSupportHub.aspx - Um erro foi encontrado analisando a linha de comando. -Consulte: http://wiki.secondlife.com/wiki/Client_parameters -Erro: - [APP_NAME] Uso de linha de comando: - [APP_NAME] não é capaz de acessar um arquivo que ele precisa. - -Isto pode ocorrer porque você de alguma maneira tem várias cópias em execução, ou o seu sistema acredita de maneira incorreta que um arquivo está aberto. -Se a mensagem persistir, reinicie o computador e tente novamente. -Se o error persistir, pode ser necessário desinstalar completamente [APP_NAME] e reinstalá-lo. - Erro fatal - [APP_NAME] exige processador com AltiVec (G4 ou superior). - [APP_NAME] já está em execução. -Verifique a sua barra de tarefas para obter uma cópia do programa minimizado. -Se a mensagem persistir, reinicie o computador. - [APP_NAME] parece ter congelado ou falhado na execução anterior. Enviar relatório de falha? - Alerta - [APP_NAME] é incapaz de detectar o DirectX 9.0b ou superior. -[APP_NAME] usa o DirectX para a detecção de hardware e / ou controladores desatualizados que podem causar problemas de estabilidade, desempenho ruim e falhas. Embora você possa executar [APP_NAME] sem ele, nós recomendamos fortemente que utilize o DirectX 9.0b. - -Deseja continuar? - Aviso - Atualização automática ainda não está implementada para o Linux. -Faça o download da versão mais recente do www.secondlife.com. - RegisterClass falhou - Erro - Incapaz de funcionar com tela cheia de [WIDTH] x [HEIGHT]. -Executando em janela. - Erro de desligamento ao destruir janela (DestroyWindow() failed) - Erro de desligamento - Não é possível fazer contexto do dispositivo GL - Não é possível encontrar um formato de pixel adequado - Não é possível encontrar descrição de formato de pixel - [APP_NAME] requer True Color (32-bit) para ser executado. -Por favor, vá para as configurações de vídeo do computador e defina o modo de cores para 32-bit. - [APP_NAME] é incapaz de executar porque ele não consegue obter um canal alpha de 8 bits. Geralmente isso ocorre devido a problemas de drivers da placa de vídeo. -Por favor, certifique-se que os últimos drivers da placa de vídeo estão instalados. -Também não se esqueça de definir seu monitor para True Color (32-bit), em painéis de controle Configurações> Display>. -Se você continuar a receber esta mensagem, contate o [SUPPORT_SITE]. - Não é possível definir o formato de pixel - Não é possível criar o contexto de renderização GL - Não é possível ativar o contexto de renderização GL - [APP_NAME] é incapaz de funcionar por causa do seu driver de video não ter sido instalado corretamente, estão desatualizados, ou não são suportados pelo hardware. Por favor certifique-se que você possui os drivers de placa de vídeo mais recente e mesmo assim, tente reinstalá-los. - -If you continue to receive this message, contact the [SUPPORT_SITE]. - Barba por fazer - Todo branco - Olhos de Anime - Arqueados - Comprimento do braço - Anexado - Lóbulos da orelha anexados - corte traseiro - folgado - Franja - Olhos pequenos - Tamanho da barriga - Grande - Bunda grande - Cabelo volumoso: Trás - Cabelo volumoso: Frente - Cabelo volumoso: Topo - cabeça grande - Peitorais grandes - Pontas grandes - Negro - Loiro - Cabelo loiro - Blush - Cor do blush - Opacidade do blush - Definição do corpo - Gordura - Sardas - Corpo cheio - Ossatura - Corpo magro - Pernas arqueadas - Caimento dos seios - Separação dos seios - Tamanho dos seios - Largura do nariz - Largo - Tamanho da sobrancelha - Olhos saltados - Olhos esbugalhados - Bulbos - Nariz em bulbo - Seios - massa - Seios - suavização - Seios - gravidade - Seios - resistência do ar - Efeito máximo - Vibração - Ganho - Duração - Efeito máximo - Vibração - Ganho - Duração - Efeito máximo - Vibração - Ganho - Duração - Barriga - massa - Barriga - suavização - Barriga - gravidade - Barriga - resistência do ar - Efeito máximo - Vibração - Ganho - Duração - Nádegas - massa - Nádegas - suavização - Nádegas - gravidade - Nádegas - resistência do ar - Efeito máximo - Vibração - Ganho - Duração - Efeito máximo - Vibração - Ganho - Duração - Sobrancelhas grossas - Cabelo grosso - Tamanho do traseiro - Nádegas - gravidade - Saia armada - Saia reta - Mais - Chaplin - Maçãs do rosto - Tamanho do peito - Ângulo do queixo - Fissura do queixo - Barba de contorno - Profundidade do queixo - Queixo pronunciado - Queixo para dentro - Queixo para fora - Queixo-pescoço - Limpar - Fenda - Fechar conjunto de olhos - Fechado - Trás fechada - Frente fechada - Esquerda fechada - Direita fechada - Pouco volume - Colarinho posterior - Colarinho anterior - Canto para baixo - Canto para cima - Vincado - Nariz torto - Bainha larga - Escuro - Verde escuro - Mais escuro - Profundidade - Salto padrão - Densidade - Queixo duplo - Curvado para baixo - Mais volume - Ângulo da orelha - Tamanho da orelha - Pontas das orelhas - Cabeça oval - Olheiras - Cor dos olhos - Profundidade dos olhos - Luminosidade dos olhos - Abertura dos olhos - Olho saltado - Tamanho dos olhos - Espaçamento dos olhos - Arco da sobrancelha - Densidade da sobrancelha - Altura da sobrancelha - Pontas da sobrancelha - Tamanho da sobrancelha - Comprimento das pestanas - Delineador - Cor do delineador - Olhos esbugalhados - Face raspada - Definição facial - Distância entre os olhos - Lábios carnudos - Feminino - Dedos - Dedos - Punhos largos - Chato - Traseiro chato - Cabeça chata - Dedos dos pés chatos - Tamanho dos pés - Ângulo da testa - Testa pronunciada - Sardas - Franja - Trás cheia - Delienador cheio - Frente cheia - Cabelos laterais cheios - Lados cheios - Brilhante - Dedos da luva - Comprimento das luvas - Cabelo - Cabelo: Trás - Cabelo: Frente - Cabelos: Lateral - Cabelo penteado - Espessura do cabelo - Espessura do cabelo - Divisão do cabelo - Divistão do cabelo esquerda - Divisão do cabelo direita - Cabelo: Volume - Tamanho das mãos - Bigode - Comprimento da cabeça - Formato da cabeça - Tamanho da cabeça - Extensão da cabeça - Altura do salto - Formato do salto - Altura - Alto - Salto alto - Maxilar alto - Plataformas altas - Alto e justo - Mais alto - Comprimento do quadril - Largura do quadril - Pairar - Dentro - Cor da sombra interna - Opacidade da sombra interna - Canto interno dos olhos - Sombra interna dos olhos - Sombra interna - Comprimento da blusa - Dobras da jaqueta - Ângulo da mandíbula - Posição do maxilar - Formato do maxilar - Juntar - Papo - Ângulo do joelho - Joelhos para dentro - Grande - Mãos grandes - Parte esquerda - Comprimento da perna - Musculatura da perna - Menos - Menos gordura - Menos barba - Menos sardas - Menos - Menos gravidade - Menos excesso - Menos músculos - Menos musculoso - Menos rosado - Menos arredondado - Menos ancas - Menos quadrado - Menos volume - Menos alma - Lighter - Fenda dos lábios - Profundidade da fenda dos lábios - Volume dos lábios - Rosado dos lábios - Proporção dos lábios - Espessura dos lábios - Largura dos lábios - Brilho dos lábios - Batom - Cor do batom - Longo - Cabeça alongada - Lábios longos - Pernas longas - Pescoço longo - Chiquinhas longas - Rabo de cavalo longo - Torso longo - Braços longos - Pantalonas - Camisa folgada - Mangas folgadas - Pneu - Baixo - Salto baixo - Maxilar baixo - Plataformas baixas - Baixo e solto - Mais baixo - Mais baixa - Bochechas abaixadas - Masculino - Parte do meio - Mais - Mais blush - Mais gordura - Mais barba - Mais sombra dos olhos - Mais sardas - Mais volume - Mais gravidade - Mais batom - Mais cintura - Mais lábio inferior - Mais músculos - Mais musculoso - Mais rosado - Mais arredondado - Mais ancas - Mais inclinado - Mais quadrado - Mais lábios superiores - Mais vertical - Mais volume - Mais alma - Bigode - Canto da boca - Posição da boca - Moicano - Muscular - Costeletas - Esmate das unhas - Cor do esmalte das unhas - Estreito - Costas estreitas - Frente estreita - Lábios estreitos - Natural - Comprimento do pescoço - Espessura do pescoço - Sem blush - Sem delineador - Sem sombra - Sem brilho - Sem batom - Sem parte - Sem esmalte - Sem vermelho - Sem pontas - Sem branco - Sem dobras - Normal inferior - Normal superior - Nariz para esquerda - Nariz para direita - Tamanho do nariz - Espessura do nariz - Ângulo da ponta do nariz - Formato da ponta do nariz - Largura do nariz - Divisão das narinas - Largura das narinas - Opaco - Abrir - Aberto atrás - Aberto na frente - Aberto esquerdo - Aberto direito - Laranja - Fora - Cor da sombra externa - Opacidade da sombra externa - Canto externo do olho - Sombra externa do olho - Sombra externa - Má oclusão - Púbis - Unhas pintadas - Pálido - Cavalo da calça - Caimento das calças - Comprimento das calças - Cintura da calça - Dobras das calças - Parte - Divisão da franja - Peitorais - Pigmento - Chiquinhas - Rosa - Mais rosado - Altura da plataforma - Largura da plataforma - Pontudo - Salto agulha - Rabo de cavalo - Saia bufante - Olho saltado esquerdo - Olho saltado direito - Inchado - Pálpebras inchadas - Cor do arco íris - Cabelo ruivo - Normal - Parte direita - Rosado da face - Arredondado - Rubor - Corado - Cabelo desalinhado - Culote - Pernas magricelas - Separar - Raso - Trás rente - Face raspada - Frente rente - Esquerda rente para cima - Trás rente para cima - Rente atrás - Rente frente - Deslocar p/ esquerda - Deslocar boca - Deslocar p/ direita - Barra da camisa - Ajuste da camisa - +/- amassada - Altura do sapato - Curto - Braços curtos - Pernas curtas - Pescoço curto - Chiquinhas curtas - Rabo de cavalo curto - Costeletas curtas - Tronco curto - Quadril curto - Ombros - pontas laterais - Costeletas - Cabelo lateral - Cabelo lateral long - Cabelo lateral superior - Pescoço fino - Ajuste de saia - Comprimento da saia - Testa inclinada - Comprimento da manga - Folga da manga - Abertura : Atrás - Abertura: Frente - Abertura: Esquerda - Abertura: Direita - Pequeno - Mãos pequenas - Cabeça pequena - Suavizar - Suavizar cabelo - Comprimento das meias - Cavanhaque - Disperso - Cabelo espetado - Quadrado - Dedo quadrado - Cabeça de Pera - Cabeça esticada - Afundar - Peito afundado - Olhos afundados - Pentear para trás - Pentear para frente - Alto - Afinar atrás - Afinar a frente - Salto grosso - Pescoço grosso - Dedo grosso - Fino - Sobrancelhas finas - Lábios finos - Nariz fino - Queixo apertado - Punho justo - Calça justa - Camisa justa - Saia justa - Tight Sleeves - Formato dos dedos - Espessura dos dos dedos - Comprimento do tronco - Músculos do tronco - Tronco magricela - Desanexado - Uncreased - Underbite - Não natural - Parte alta do nariz - Bochechas altas - fenda do queixo alta - Curvatura dos cílios supériores - Voltado para cima - Bem vermelho - Altura da cintura - Corpulento - Grisalho - Amplo - Costas largas - Testa larga - Lábios amplos - Selvagem - Rugas - Adicionar às minhas Landmarks - Editar minhas Landmarks - Ver mais informações sobre a localização atual - Histórico de localizações - Região Adulta - Região Moderada - Região em geral - Os avatares neste lote não podem ser vistos ou ouvidos por avatares fora dele - Os objetos que se movem podem não se comportar corretamente nesta região até que ela seja recarregada. - O pathfinding dinâmico não está habilitado nesta região. - [APP_NAME] Atualização - Atualizando agora o [APP_NAME]... - Instalando [APP_NAME]... - Seu visualizador [APP_NAME] está sendo atualizado para a versão mais recente. Isso pode levar algum tempo, então por favor seja paciente. - Fazendo o download da atualização... - Fazendo o download da atualização - Falha no download da atualização - Um erro ocorreu ao atualizar [APP_NAME]. Por favor, faça o download da versão mais recente em www.secondlife.com. - Falha ao instalar a atualização - Falha ao iniciar o visualizador - [APP_NAME]: Entrada de itens rápida demais de [FROM_NAME], visualização automática suspensa por [TIME] segundos - [APP_NAME]: Entrada de itens rápida demais, visualização automática suspensa por [TIME] segundos - -- Log de mensagem instantânea habilitado -- - [NAME] está digitando... - (Anônimo) - (Moderado: Voz desativado por padrão) - Bate-papo de texto não está disponível para esta chamada. - Seu bate- papo de texto foi desabilitado por um Moderador do Grupo. - Clique aqui para menagem instantânea. - Para - (Moderador) - (Salvo em [LONG_TIMESTAMP]) - Para visualizar esta mensagem, você deve desmarcar "Apenas amigos e grupos podem me ligar ou enviar MIs" em Preferências/Privacidade. - Conectado - Desconectado - O usuário não está online. As mensagens serão armazenadas e enviadas mais tarde. - O usuário não está online. O inventário foi salvo. - Ligação atendida - Você iniciou uma ligação de voz - Você entrou na ligação - Você recusou automaticamente a chamada de voz enquanto "Não perturbe" estava ativado. - [NAME] iniciou uma ligação de voz - Entrando em ligação de voz... - Conectado. Para sair, clique em Desligar - Saiu da ligação de voz - Bate-papo com várias pessoas - Conversa com [AGENT_NAME] - Item do inventário '[ITEM_NAME]' oferecido - Pasta do inventário '[ITEM_NAME]' oferecida - -Você está conversando com um bot, [NAME]. Não compartilhe informações pessoais. -Saiba mais em https://second.life/scripted-agents. +ser anexado às anotações. - Você publicou no Facebook. - Você publicou no Flickr. - Você publicou no Twitter. - (Sessão de MI inexistente) - Você é o único usuário desta sessão. - [NAME] está offline. - Clique no botão [BUTTON NAME] para aceitar/ conectar a este bate-papo em voz. - Você bloqueou este residente. Se quiser retirar o bloqueio, basta enviar uma mensagem. - Erro de solicitação, tente novamente mais tarde. - Erro na requisição, por favor, tente novamente. - Você não tem permissões suficientes. - A sessão deixou de existir - Você não possui esta habilidade. - Você não possui esta habilidade. - Você não é um moderador de sessão. - Bate-papo de texto desativado por um moderador. - Um moderador do grupo desabilitou seu bate-papo em texto. - Não foi possível adicionar usuários na sessão de bate-papo com [RECIPIENT]. - Não foi possível enviar sua mensagem para o bate-papo com [RECIPIENT]. - Não foi possível enviar sua mensagem na sessão de bate- papo com [RECIPIENT]. - Erro durante a moderação. - Você foi tirado do grupo. - Você foi removido do grupo. - Você não possui mais a habilidade de estar na sessão de bate-papo. - [SOURCES] disse alguma coisa - [SOURCES] disseram alguma coisa - A inicialização da sessão expirou - Posição inicial definida. - https://secondlife.com/destination/voice-island - https://secondlife.com/destination/voice-morphing-premium - [NAME] lhe pagou L$ [AMOUNT] [REASON]. - [NAME] lhe pagou L$ [AMOUNT]: [REASON] - [NAME] lhe pagou L$ [AMOUNT] - Você pagou L$[AMOUNT] por [REASON] a [NAME]. - Você pagou L$[AMOUNT] a [NAME]: [REASON] - Você acaba de pagar L$[AMOUNT]. - Você pagou L$[AMOUNT] a [NAME]. - Você pagou L$[AMOUNT] por [REASON]. - Você não pagou L$[AMOUNT] a [NAME] referentes a [REASON]. - Você não pagou L$[AMOUNT] a [NAME]: [REASON] - Você não pagou L$[AMOUNT]. - Você não pagou L$[AMOUNT] a [NAME]. - Você não pagou L$[AMOUNT] referentes a [REASON]. - por [ITEM] - por uma parcela - por um passe de acesso - para doar um terreno - para criar um grupo - para entrar em um grupo - para carregar - para publicar um anúncio - Dando L$ [AMOUNT] - O upload custa L$ [AMOUNT] - Isso custa L$ [AMOUNT] - Comprando terreno selecionado L$ [AMOUNT] - Esse objeto custa L$ [AMOUNT] - Todos - Oficiais - Proprietários - Conectado - Carregando... - -Denunciar abuso - Nova forma - Nova pele - Novo cabelo - Novos olhos - Nova camisa - Novas calças - Novos sapatos - Novas meias - Nova blusa - Novas luvas - Nova camiseta - Novas roupa de baixo - Nova saia - Novo alpha - Nova tatuagem - Novo universal - Novo físico - Item inválido - Novo gesto - Novo script - Nova nota - Nova pasta - Conteúdo - Gesto - Gestos masculinos - Gestos femininos - Outros gestos - Gestos da fala - Gestos comuns - Perdão - masculino - Deixe-me em paz - masculino - Mandar beijo - masculino - Vaia - masculino - Maçante - masculino - Ôpa! - masculino - Risada - masculino - Quero distância! - masculino - Encolher de ombros - masculino - Mostrar a língua - masculino - Wow - masculino - Engraçado - Feminino - Chorar - Feminino - Com vergonha - Feminino - Perdão - fem - Deixe-me em paz - feminino - Mandar beijo - fem - Vaia - fem - Maçante - feminino - Ôpa - feminino - E aí, beliza? - Feminino - Risada - feminina - Que chique - Feminino - Acenar - Feminino - Por favor - Feminino - Quero distância! - feminino - Encolher ombros - feminino - Mostrar a língua - feminino - Wow - feminino - Novo ciclo de dias - Nova água - Novo céu - /reverência - /palmas - /contar - /apagar - /dane_se - /músculos - /não - /não! - /papel - /apontar_eu - /apontar_você - /pedra - /tesoura - /fumar - /alongar - /assobiar - /sim - /sim! - ldt - dança1 - dança2 - dança3 - dança4 - dança5 - dança6 - dança7 - dança8 - [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt] - nenhum/nehum - A imagem excede o limite [WIDTH]*[HEIGHT] - O tamanho máx. do look é [WIDTH]*[HEIGHT]. Redimensione ou use outra imagem - O tamanho máx. do look é [WIDTH]*[HEIGHT]. Selecione outra textura - Não foi possível confirmar as dimensões da foto. Aguarde até que o tamanho da foto seja exibido no seletor - - Aconteceu algo inesperado, apesar de termos tentado impedir isso. - -Visite http://status.secondlifegrid.net para saber se foi detectado um problema com o serviço. - Se o problema persistir, cheque a configuração da sua rede e firewall. - Domingo:Segunda:Terça:Quarta:Quinta:Sexta:Sábado - Dom:Seg:Ter:Qua:Qui:Sex:Sab - Janeiro:Fevereiro:Março:Abril:Maio:Junho:Julho:Agosto:Setembro:Outubro:Novembro:Dezembro - Jan:Fev:Mar:Abr:Maio:Jun:Jul:Ago:Set:Out:Nov:Dez - [MDAY] - AM - PM - US$ [AMOUNT] - Banimento do grupo - Plano - Cargos - Identidade do lote - Gestão do lote - ID do lote - Configurações do lote - Poderes do lote - Acesso ao lote - Conteúdo do lote - Gestão de objetos - Contabilidade - Avisos - Bate-papo - Base - Excluir itens selecionados? - Excluir item selecionado? - Este look não possui nenhuma peça - Selecione um editor utilizando a configuração ExternalEditor. - O editor externo especificado não foi localizado. -Tente colocar o caminho do editor entre aspas. -(ex. "/caminho para/editor" "%s") - Error ao analisar o comando do editor externo. - Falha de execução do editor externo. - Falha na tradução: [REASON] - Erro ao analisar resposta de tradução. - Esc - Space - Enter - Tab - Ins - Del - Backsp - Shift - Ctrl - Alt - CapsLock - Início - End - PgUp - PgDn - F1 - F2 - F3 - F4 - F5 - F6 - F7 - F8 - F9 - F10 - F11 - F12 - Adicionar - Subtrair - Multiplicar - Dividir - PAD_DIVIDE - PAD_LEFT - PAD_RIGHT - PAD_DOWN - PAD_UP - PAD_HOME - PAD_END - PAD_PGUP - PAD_PGDN - PAD_CENTER - PAD_INS - PAD_DEL - PAD_Enter - PAD_BUTTON0 - PAD_BUTTON1 - PAD_BUTTON2 - PAD_BUTTON3 - PAD_BUTTON4 - PAD_BUTTON5 - PAD_BUTTON6 - PAD_BUTTON7 - PAD_BUTTON8 - PAD_BUTTON9 - PAD_BUTTON10 - PAD_BUTTON11 - PAD_BUTTON12 - PAD_BUTTON13 - PAD_BUTTON14 - PAD_BUTTON15 - - - = - ` - ; - [ - ] - \ - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - A - B - C - D - E - F - G - H - I - J - K - L - M - N - O - P - Q - R - S - T - U - V - W - X - Y - Z - Vendo balizas de partículas (azul) - Vendo balizas de objetos físicos (verde) - Vendo balizas de objetos com script (vermelho) - Vendo objeto com script com balizas com funcionalidade de toque (vermelho) - Vendo balizas de som (amarelo) - Vendo balizas de mídia (branco) - Visualizando farol de direção do sol (alaranjado) - Visualizando farol de direção da lua (roxo) - Ocultar partículas - Sobre terrenos - Aparência - Avatar - Construir - Bate-papo - Conversas - Bússola - Destinos - Meus ambientes - Facebook - Flickr - Gestos - Status da grade - Como - Inventário - Mapa - Mercado - Marketplace - Mini Mapa - Andar/correr/voar - Caixa de saída do lojista - Pessoas - Destaques - Lugares - Preferências - Perfil - Relatar abuso - Buscar - Foto - Falar - Twitter - Controles da câmera - Configurações de voz - Informações sobre o terreno que você está visitando - Mudar seu avatar - Escolha um avatar completo - Construindo objetos e redimensionando terreno - Bater papo com pessoas próximas usando texto - Conversar com todos - Bússola - Destinos de interesse - Meus ambientes - Publicar no Facebook - Carregar no Flickr - Gestos para seu avatar - Mostrar status da grade atual - Como executar tarefas comuns - Exibir e usar seus pertences - Mapa-múndi - Faça compras - Venda suas criações - Mostrar quem está aqui - Movendo seu avatar - Transferir itens para o seu mercado para venda - Amigos, grupos e pessoas próximas - Lugares mostrados como favoritos em seu perfil - Lugares salvos - Preferências - Edite ou visualize seu perfil - Relatar abuso - Encontre lugares, eventos, pessoas - Tirar uma foto - Fale com pessoas próximas usando seu microfone - Twitter - Alterar o ângulo da câmera - Controles de volume das chamadas e pessoas próximas a você no mundo virtual - atualmente na sua barra de ferramentas inferior - atualmente na sua barra de ferramentas esquerda - atualmente na sua barra de ferramentas direita - Reter% - Detalhe - Detalhamento maior - Superfície - Sólido - Conclusão - Visualizar - Normal - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - Nenhum - Afeta o navmesh - Personagem - (Múltiplo) - Muito baixo - Baixo - Médio - Alto - Muito alto - O residente não pode visitar a região. - [Usuário] - Experiência - (nenhuma experiência) - (experiência sem título) - Dentro do terreno - Dentro da grade - PERMITIDO - BLOQUEADO - COLABORADOR - ADMINISTRADOR - RECENTE - PRÓPRIAS - ([EXPERIENCES], máx. [MAXEXPERIENCES]) - assumir seus controles - acionar animações no seu avatar - anexar ao avatar - rastrear sua câmera - controlar sua câmera - teletransportar você - aceitar automaticamente permissões de experiência - forçar o avatar a sentar - alterar sua configurações de ambiente - realizar uma operação desconhecida: [Permission] - Assumir o controle - Acionar animações - Anexar - Rastrear câmera - Controlar câmera - Teletransportar - Autorização - Sentar - Ambiente - As conversas não estão sendo registradas. Para começar a manter um registro, selecione "Salvar: apenas registro" ou "Salvar: registro e transcrições" em Preferências> Bate-papo. - Nenhuma conversa será registrada. Para recomeçar a gravação de registros, selecione "Salvar: apenas registro" ou "Salvar: registro e transcrições" em Preferências> Bate-papo. - Não há conversas registradas. Depois que você entrar em contato com alguém, ou alguém entrar em contato com você, um registro será exibido aqui. - Carregando... - n/d - -Lista vazia- - Padrão - (nenhum) - Sem limite - A forma física contém triângulos muito pequenos. Tente simplificar o modelo físico. - A forma física contém dados de confirmação ruins. Tente consertar o modelo físico. - A forma física não tem a versão correta. Defina a versão correta para o modelo físico. - O DNS não pode resolver o nome do host([HOSTNAME]). -Verifique se você pode conectar ao site www.secondlife.com . Se você -puder, mas se continuar recebendo esta mensagem de erro, vá à sessão -Suporte no site Secondlife.com e informe o problema. - O servidor de acesso não pôde verificá-lo pelo SSL. -Se você continuar recebendo esta mensagem de erro, + + Buscando... + + + Não encontrado. + + + Buscando... + + + Notas de versão + + + https://releasenotes.secondlife.com/viewer/ + + + Carregando... + + + (ninguém) + + + (aguardando) + + + (nenhum) + + + Nenhum erro + + + Item pedido falhou + + + Item pedido: arquivo inexistente + + + Item pedido: item não encontrado na base de dados. + + + Fim do arquivo + + + Não é possível abrir arquivo + + + Arquivo não encontrado + + + Tempo de transferência de arquivo expirado + + + Circuito caiu + + + Visualizador e servidor não concordam no preço + + + Status desconhecido + + + Serviço não disponível. + + + O servidor está enfrentando dificuldades inesperadas. + + + Serviço não disponível ou o tempo final para upload foi atingido. + + + Erro na solicitação de upload. Acesso +http://secondlife.com/support para ajuda ao resolver este problema. + + + Falha na validação para importação das configurações [NAME] + + + Não foi possível abrir o arquivo [FILE] + + + Não foi possível abrir o arquivo [FILE] + + + Não foi possível traduzir o vento antigo [NAME] + + + textura + + + som + + + cartão de visitas + + + landmark + + + script obsoleto + + + roupas + + + objeto + + + anotação + + + pasta + + + raiz + + + script LSL2 + + + bytecode LSL + + + textura tga + + + parte do corpo + + + fotografia + + + Achados e Perdidos + + + imagem targa + + + Lixo + + + imagem jpeg + + + animação + + + gesto + + + simstate + + + favorito + + + link + + + link da pasta + + + configurações + + + mesh + + + (Edição Aparência) + + + Distante + + + Não perturbe + + + Mudo + + + Temeroso + + + Bravo + + + Distante + + + Virar para trás + + + Rir segurando a barriga + + + Sorriso largo + + + Mandar beijo + + + Entediado + + + Reverência + + + Aplaudir + + + Saudação formal + + + Chorar + + + Dança 1 + + + Dança 2 + + + Dança 3 + + + Dança 4 + + + Dança 5 + + + Dança 6 + + + Dança 7 + + + Dança 8 + + + Desdém + + + Beber + + + Envergonhado + + + Negar com o dedo. + + + Vibrar provocando + + + Levitar Yoga + + + Careta + + + Impaciente + + + Pular de alegria + + + Beije meu bumbum + + + Beijar + + + Rir + + + Exibir músculos + + + Não (descontente) + + + Não + + + Nya-nya-nya + + + Soco um-dois + + + Abrir a boca + + + Paz + + + Apontar para o outro + + + Apontar para si + + + Soco esquerdo + + + Soco direito + + + RPS contar + + + RPS papel + + + RPS pedra + + + RPS tesoura + + + Repulsa + + + Chute giratório + + + Triste + + + Saúde + + + Gritar + + + Encolher ombros + + + Sorrir + + + Fumar à toa + + + Inalar fumaça + + + Expelir fumaça + + + Surpresa + + + Golpe de espada + + + Enraivecer + + + Mostrar a língua + + + Onda + + + Sussurrar + + + Assobiar + + + Piscar + + + Piscar (Hollywood) + + + Preocupar-se + + + Sim (Feliz) + + + Sim + + + Múltiplo + + + Usar textura + + + Mova o cursor do mouse sobre a regra + + + para ajustar à grade + + + Carregando... + + + Offline + + + L$[PRICE] por [AREA] m² + + + Nenhum encontrado. + + + OK + + + término prematuro do arquivo + + + Não é possível encontrar a raiz (ROOT) ou junção (JOINT). + + + Bate-papo local + + + (Bate-papo local) + + + sussurra: + + + grita: + + + Conectando à conversa de voz no mundo + + + Conectado + + + Voz não disponível na sua localização atual + + + Desconectado da conversa de Voz no mundo + + + Agora você será reconectado ao bate-papo local. + + + '[OBJECTNAME]', um objeto de '[OWNERNAME]', localizado em [REGIONNAME] a [REGIONPOS], obteve permissão para: [PERMISSIONS]. + + + '[OBJECTNAME]', um objeto de '[OWNERNAME]', localizado em [REGIONNAME] a [REGIONPOS], teve permissão negada para: [PERMISSIONS]. + + + Se você permitir acesso à sua conta, o objeto também poderá: + + + Tomar linden dólares (L$) de você + + + Atue nas suas entradas de controle + + + Remapeie suas entradas de controle + + + Faça uma animação para o seu avatar + + + Anexe ao seu avatar + + + Libere a propriedade e torne-a pública + + + Una e desuna de outros objetos + + + Adicione e remova junções com outros objetos + + + Modifique as permissões + + + Acompanhe sua câmera + + + Controle sua camera + + + Teletransportá-lo + + + Forçar o avatar a sentar + + + Alterar sua configurações de ambiente + + + (Você) + + + + Suprimir alertas ao gerenciar listas de acesso ao terreno + + + Substituir suas animações padrão + + + Retornar objetos em seu nome + + + (desconhecido)! + + + Público geral + + + Moderado + + + Adulto + + + Desconectado + + + Desconhecido + + + (desconhecido) + + + Propriedadade / Região inteira: + + + Imóvel / Homestead + + + Continente / Homestead + + + Continente / Região inteira: + + + Todos os arquivos + + + Sons + + + Animações + + + Imagens + + + Salvar + + + Carregar + + + Imagens Targa + + + Imagens Bitmap + + + Imagens PNG + + + Imagens targa ou PNG + + + Arquivo de vídeo AVI + + + Arquivo de animação XAF + + + Arquivo XML + + + Arquivo RAW + + + Imagens compactadas + + + Carregar arquivos + + + Selecionar pasta + + + Scripts + + + Dicionários + + + Silhueta + + + Pele + + + Cabelo + + + Olhos + + + Camisa + + + Calças + + + Sapatos + + + Meias + + + Blusa + + + Luvas + + + Camiseta + + + Roupa de baixo + + + Saia + + + Alpha + + + Tatuagem + + + Universal + + + Físico + + + Inválido + + + nenhum + + + Camisa não vestida + + + Calças não vestidas + + + Sapatos não calçados + + + Meias não calçadas + + + Jaqueta não vestida + + + Luvas não calçadas + + + Camiseta não vestida + + + Roupa de baixo não vestida + + + Saia não vestida + + + Alpha não vestido + + + Tatuagem não usada + + + Universal não usado + + + Físico não usado + + + inválido + + + Criar novo físico + + + Criar pele nova + + + Criar cabelo novo + + + Criar olhos novos + + + Criar camisa nova + + + Criar calças novas + + + Criar sapatos novos + + + Criar meias novas + + + Criar jaqueta nova + + + Criar luvas novas + + + Criar camiseta nova + + + Criar roupa de baixo nova + + + Criar saia nova + + + Criar Alpha novo + + + Criar nova tatuagem + + + Criar um novo universal + + + Criar novo físico + + + inválido + + + Novo [WEARABLE_ITEM] + + + Próximo + + + OK + + + Anúncio de grupo + + + Anúncios do grupo + + + Enviado por + + + Anexo: + + + Ver últimos anúncios ou optar por não receber essas mensagens aqui. + + + Abrir anexo + + + Salvar anexo + + + Oferta de teletransporte + + + Novas notificações chegaram enquanto você estava fora... + + + Você tem mais [%d] notificações + + + Braço direito + + + Cabeça + + + Braço esquerdo + + + Perna esquerda + + + Tronco + + + Perna direita + + + Esqueleto aprimorado + + + Baixo + + + Meio + + + Alto + + + Pressione ESC para retornar para visão do mundo + + + Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search]. + + + Não encontrou o que procura? Tente [secondlife:///app/inventory/filters Show filters]. + + + Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search]. + + + Arraste um marco para adicioná-lo aos seus favoritos. + + + Nenhum item correspondente encontrado. Verifique a ortografia de sua cadeia de pesquisa e tente novamente. + + + Você não possui uma cópia desta textura no seu inventário + + + Suas compras do Marketplace aparecerão aqui. Depois, você poderá arrastá-las para seu inventário para usá-las. + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ + + + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports + + + https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more + + + Abrir a janela com as opções do Jogo. + + + Executar o gesto selecionado no mundo. + + + Abrir a janela com as opções do Jogo. + + + Qualquer um pode vender itens no Mercado. + + + + Se você deseja se tornar um lojista, precisará [[MARKETPLACE_CREATE_STORE_URL] criar uma loja no Mercado]. + + + Sua caixa de saída está vazia + + + + Arraste as pastas para estas áreas e então clique em "Enviar para Mercado" para listar os itens para venda no [[MARKETPLACE_DASHBOARD_URL] Mercado]. + + + Inicializando o Marketplace. + + + Estamos acessando sua conta na [loja [MARKETPLACE_CREATE_STORE_URL] do Marketplace]. + + + Erros do Marketplace. + + + A loja [[MARKETPLACE_CREATE_STORE_URL] no Marketplace] está retornando erros. + + + Erro ao abrir as listagens do Marketplace. +Se você continuar a receber essa mensagem, entre em contato com o suporte do Second Life para obter ajuda em http://support.secondlife.com + + + Sua pasta Listagens do Marketplace está vazia. + + + Arraste pastas para esta área para listá-las para venda no [Marketplace [MARKETPLACE_DASHBOARD_URL]]. + + + ( [ITEMS_COUNT] Items ) + + + a pasta de estoque deve estar em uma pasta de versões + + + : Erro: todos os itens em uma pasta de estoque devem ser de cópia proibida e todos do mesmo tipo + + + : Erro: a pasta de estoque não pode ter subpastas + + + : Aviso: a pasta não contém itens + + + : Aviso: criando pasta de estoque + + + : Aviso: criando pasta de versões + + + : Aviso: movendo itens + + + : Aviso: conteúdo da pasta transferido para pasta de estoque, removendo pasta vazia + + + : Erro: itens de cópia proibida devem estar em uma pasta de estoque + + + : Aviso: os itens devem estar em uma pasta de versões + + + : Erro: + + + : Aviso: + + + : Aviso: a pasta de versões deve conter pelo menos 1 item + + + : Aviso: a pasta de estoque deve conter pelo menos 1 item + + + Não há erros ou avisos + + + Sem erros + + + Erro: + + + antes de enviar os itens para o Marketplace, é necessário que você se defina como um lojista (sem custos). + + + Não é possível mover o item nessa pasta. + + + Este item não pode ser vendido no Marketplace. + + + no Mkt ID + + + publicada + + + ativo + + + máx + + + estoque + + + esgotado + + + atualizando... + + + A taxa é baseada em seu nível de inscrição. Níveis mais altos possuem taxas mais baixas. [https://secondlife.com/my/account/membership.php? Saiba mais] + + + Marcos em aberto + + + Ilimitado + + + + + + + + + Carregando conteúdo... + + + Nenhum conteúdo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Meu inventário + + + Biblioteca + + + Texturas + + + Sons + + + Cartões de visitas + + + Marcos + + + Scripts + + + Vestuário + + + Objetos + + + Anotações + + + Nova pasta + + + Inventário + + + Imagens descompactadas + + + Corpo + + + Lixo + + + Álbum de fotografias + + + Achados e Perdidos + + + Sons descompactados + + + Animações + + + Gestos + + + Meus favoritos + + + Meus favoritos + + + Meus favoritos + + + Meus favoritos + + + Look atual + + + Looks iniciais + + + Meus looks + + + Acessórios + + + Meshes: + + + Itens recebidos + + + Caixa de saída do lojista + + + Amigos + + + Tudo + + + Nenhum anexo vestido + + + Anexos ([COUNT] slots permanecem) + + + Comprar + + + Comprar por L$ + + + Pedra + + + Metal + + + Vidro + + + Madeira + + + Carne + + + Plástico + + + Borrracha + + + Luz + + + Shift + + + Ctrl + + + Peito + + + Crânio + + + Ombro esquerdo + + + Ombro direito + + + Mão esquerda + + + Mão direita + + + Pé esquerdo + + + Pé direito + + + Espinha + + + Pélvis + + + Boca + + + Queixo + + + Orelha esquerda + + + Orelha direita + + + Globo ocular esquerdo + + + Globo ocular direito + + + Nariz + + + Braço superior D + + + Antebraço D + + + Braço superior E + + + Antebraço E + + + Quadril direito + + + Coxa D + + + Perna inferior D + + + Quadril esquerdo + + + Coxa E + + + Perna inferior E + + + Estômago + + + Peitoral E + + + Peitoral D + + + Pescoço + + + Centro do avatar + + + Anelar esquerdo + + + Anelar direito + + + Base do rabo + + + Ponta do rabo + + + Asa esquerda + + + Asa direita + + + Maxilar + + + Orelha esquerda alt. + + + Orelha direita alt. + + + Olho esquerdo alt. + + + Olho direito alt. + + + Língua + + + Virilha + + + Pata esq. traseira + + + Pata dir. traseira + + + Ponto de encaixe inválido + + + Erro: item ausente + + + Erro: item base ausente + + + Erro: o objeto está no look atual, mas não foi anexado + + + [AGEYEARS] [AGEMONTHS] de idade + + + [AGEYEARS] de idade + + + [AGEMONTHS] de idade + + + [AGEWEEKS] de idade + + + [AGEDAYS] de idade + + + Cadastrado hoje + + + Agora, todos podem te ver. + + + Sua renderização pode não acontecer para todos ao seu redor. + + + Sua renderização pode não acontecer para metade das pessoas ao seu redor. + + + Sua renderização pode não acontecer para a maioria das pessoas ao seu redor. + + + Sua renderização pode não acontecer para ninguém ao seu redor. + + + Seu HUD + + + [OBJ_NAME] (vestido em [JNT_NAME]) + + + [HUD_DETAILS] usa muita memória de textura + + + [HUD_DETAILS] contém muitos objetos e texturas que utilizam o máximo de recursos + + + [HUD_DETAILS] contém muitas texturas grandes + + + [HUD_DETAILS] contém muitos objetos + + + [HUD_DETAILS] contém muitas texturas + + + [COUNT] ano + + + [COUNT] anos + + + [COUNT] anos + + + [COUNT] mês + + + [COUNT] meses + + + [COUNT] meses + + + [COUNT] semana + + + [COUNT] semanas + + + [COUNT] semanas + + + [COUNT] dia + + + [COUNT] dias + + + [COUNT] dias + + + [COUNT] membro + + + [COUNT] membros + + + [COUNT] membros + + + Residente + + + Prova + + + Lista de membros + + + Empregado da Linden Lab + + + Dados de pagamento usados + + + Dados de pagamento fornecidos + + + Nenhum dado de pagamento + + + Idade comprovada + + + Idade não comprovada + + + Centro 2 + + + Topo direita + + + Topo + + + Topo esquerda + + + Centro + + + Inferior esquerdo + + + Inferior + + + Inferior direito + + + Baixado, agora compilando + + + Serviço de compilação de scripts não disponível + + + Script não encontrado no servidor. + + + Problema no download + + + Permissões insuficientes para fazer o download do script. + + + Permissões insuficientes para + + + Falha desconhecida para download + + + Pulando script [SCRIPT] com experiência [EXPERIENCE] + + + Progresso do recompilamento + + + recompilar + + + Reset Progresso + + + Zerar + + + Definir funcionamento do progresso + + + deixar funcionando + + + Definir progresso não funcionando + + + não deixar funcionando + + + Compilação bem sucedida + + + Compilação bem sucedida, salvando... + + + Salvo. + + + Falha ao carregar arquivo: + + + Script (objeto fora de alcance) + + + Script (excluído do inventário) + + + Objeto [OBJECT] de propriedade de [OWNER] + + + nenhum + + + + (Desconhecido) + + + + + [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc] + + + + + Balanço + + + Créditos + + + Débitos + + + Total + + + Não há dados de grupo + + + Propriedade-pai + + + continente + + + adolescente + + + qualquer um + + + erro + + + todas as propriedades pertencem a [OWNER] + + + todas as propriedades que você possui + + + todas as propriedades que você gerencia para [OWNER] + + + Sempre permitido: ([ALLOWEDAGENTS], máx [MAXACCESS]) + + + Grupos sempre permitidos: ([ALLOWEDGROUPS], máx [MAXACCESS]) + + + Grupos banidos: ([BANNEDAGENTS], máx [MAXBANNED]) + + + Sempre permitido + + + Sempre banido + + + todos os terrenos + + + administre terrenos + + + este terreno + + + e [EXTRA_COUNT] mais + + + Memória de scripts no lote + + + Lotes listados: [PARCELS] + + + Memória usada: [COUNT] kb de [MAX] kb; [AVAILABLE] kb disponíveis + + + Memória usada: [COUNT] kb + + + URL dos scripts do lote + + + URLs usados: [COUNT] de [MAX]; [AVAILABLE] disponíveis + + + URLs usados: [COUNT] + + + Erro ao solicitar dados + + + Nenhum lote foi selecionado + + + Erro: dados de script só disponíveis na região da posição atual + + + Obtendo dados... + + + Você não está autorizado a examinar este lote. + + + Sentado em + + + Peito + + + Crânio + + + Ombro esquerdo + + + Ombro direito + + + Mão esquerda + + + Mão direita + + + Pé esquerdo + + + Pé direito + + + Coluna + + + Pélvis + + + Boca + + + Queixo + + + Orelha esquerda + + + Orelha direita + + + Olho esquerdo + + + Olho direito + + + Nariz + + + Braço direito + + + Antebraço direito + + + Braço esquerdo + + + Antebraço esquerdo + + + Quadril direito + + + Coxa direita + + + Perna direita + + + Quadril esquerdo + + + Coxa esquerda + + + Perna esquerda + + + Estômago + + + Peitorais E + + + Peitorais D + + + HUD Central 2 + + + HUD superior direito + + + HUD centro superior + + + HUD superior esquerdo + + + HUD Central 1 + + + HUD esquerda inferior + + + HUD inferior + + + HUD direito inferior + + + Pescoço + + + Centro do avatar + + + Anelar esquerdo + + + Anelar direito + + + Base do rabo + + + Ponta do rabo + + + Asa esquerda + + + Asa direita + + + Maxilar + + + Orelha esquerda alt. + + + Orelha direita alt. + + + Olho esquerdo alt. + + + Olho direito alt. + + + Língua + + + Virilha + + + Pata esq. traseira + + + Pata dir. traseira + + + Linha [LINE], Coluna [COLUMN] + + + [COUNT] encontrado + + + Conteúdo do objeto + + + Novo Script + + + Este residente ativou o "Não perturbe" e verá sua mensagem mais tarde. + + + (por nome) + + + (residente) + + + (objeto) + + + (grupo) + + + (Externo) + + + Não foi definido um contrato para essa região. + + + Não foi definido um contrato para essa Região. O terreno nesta região está sendo vendido pelo Proprietário, não pela Linden Lab. Favor contatar o Proprietário da região para detalhes de venda. + + + + + + Propriedade do Grupo + + + Público + + + Configurações locais + + + Configurações da região + + + Esta Região não suporta as configurações do ambiente. + + + Dom + + + Lua + + + Florescer + + + Ruído na nuvem + + + Mapa normal + + + Transparente + + + Cliques: [TELEPORT] teletransporte, [MAP] mapa, [PROFILE] perfil + + + (vai atualizar depois de publicado) + + + Você não criou nenhum Destaque ou Anúncio. Clique no botão "+" para criar um Destaque ou Anúncio. + + + Você não criou nenhuma Escolha. Clique em Novo Botão para criar um Escolher + + + Você criou nenhum Anúncio. Clique em Novo Botão para criar um Classificado + + + O usuário não tem nenhum destaque ou anúncio + + + Usuário não tem escolha + + + Usuário não tem anúncio + + + Carregando... + + + Preview + + + Propriedades + + + um objeto chamado + + + possuído pelo grupo + + + de um grupo desconhecido + + + de + + + de usuário desconhecido + + + deu a você + + + Você recusou um(a) [DESC] de <nolink>[NAME]</nolink>. + + + Total + + + comprou + + + pagou a você + + + depositado + + + comprou passe para + + + pagou taxa para o evento + + + pagou prêmio para o evento + + + Saldo + + + Créditos + + + Débitos + + + [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] + + + Itens adquiridos + + + Cancelar + + + Carregar [NAME] custa L$ [AMOUNT] + + + Isso custa L$ [AMOUNT] + + + Extensão de arquivo desconhecida [.%s] +Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh + + + Bloquear + + + Adicionar marco... + + + Editar marco... + + + ⌃ + + + ⌘ + + + ⌥ + + + ⇧ + + + Ctrl+ + + + Alt+ + + + Shift+ + + + Arquivo salvo + + + Recebendo + + + AM + + + PM + + + PST + + + PDT + + + Frente + + + Esquerda + + + Direita + + + Atrás + + + Norte + + + Sul + + + Oeste + + + Leste + + + P/ cima + + + P/ baixo + + + Qualquer categoria + + + Compras + + + Aluguel de terrenos + + + Aluguel de propriedade + + + Atração especial + + + Novos Produtos + + + Emprego + + + Desejado + + + Serviço + + + Pessoal + + + Nenhum + + + Locação Linden + + + Adulto + + + Artes e Cultura + + + Negócios + + + Educacional + + + Games + + + Moradia + + + Para recém-chegados + + + Parques & Natureza + + + Residencial + + + Estágio + + + Outros + + + Aluguel + + + Qualquer + + + Você + + + Mídia múltipla + + + Tocar/Pausar mídia + + + http://www.intel.com/p/en_US/support/detect/graphics + + + http://www.nvidia.com.br/Download/index.aspx?lang=br + + + http://support.amd.com/us/Pages/AMDSupportHub.aspx + + + Um erro foi encontrado analisando a linha de comando. +Consulte: http://wiki.secondlife.com/wiki/Client_parameters +Erro: + + + [APP_NAME] Uso de linha de comando: + + + [APP_NAME] não é capaz de acessar um arquivo que ele precisa. + +Isto pode ocorrer porque você de alguma maneira tem várias cópias em execução, ou o seu sistema acredita de maneira incorreta que um arquivo está aberto. +Se a mensagem persistir, reinicie o computador e tente novamente. +Se o error persistir, pode ser necessário desinstalar completamente [APP_NAME] e reinstalá-lo. + + + Erro fatal + + + [APP_NAME] exige processador com AltiVec (G4 ou superior). + + + [APP_NAME] já está em execução. +Verifique a sua barra de tarefas para obter uma cópia do programa minimizado. +Se a mensagem persistir, reinicie o computador. + + + [APP_NAME] parece ter congelado ou falhado na execução anterior. Enviar relatório de falha? + + + Alerta + + + [APP_NAME] é incapaz de detectar o DirectX 9.0b ou superior. +[APP_NAME] usa o DirectX para a detecção de hardware e / ou controladores desatualizados que podem causar problemas de estabilidade, desempenho ruim e falhas. Embora você possa executar [APP_NAME] sem ele, nós recomendamos fortemente que utilize o DirectX 9.0b. + +Deseja continuar? + + + Aviso + + + Atualização automática ainda não está implementada para o Linux. +Faça o download da versão mais recente do www.secondlife.com. + + + RegisterClass falhou + + + Erro + + + Incapaz de funcionar com tela cheia de [WIDTH] x [HEIGHT]. +Executando em janela. + + + Erro de desligamento ao destruir janela (DestroyWindow() failed) + + + Erro de desligamento + + + Não é possível fazer contexto do dispositivo GL + + + Não é possível encontrar um formato de pixel adequado + + + Não é possível encontrar descrição de formato de pixel + + + [APP_NAME] requer True Color (32-bit) para ser executado. +Por favor, vá para as configurações de vídeo do computador e defina o modo de cores para 32-bit. + + + [APP_NAME] é incapaz de executar porque ele não consegue obter um canal alpha de 8 bits. Geralmente isso ocorre devido a problemas de drivers da placa de vídeo. +Por favor, certifique-se que os últimos drivers da placa de vídeo estão instalados. +Também não se esqueça de definir seu monitor para True Color (32-bit), em painéis de controle Configurações> Display>. +Se você continuar a receber esta mensagem, contate o [SUPPORT_SITE]. + + + Não é possível definir o formato de pixel + + + Não é possível criar o contexto de renderização GL + + + Não é possível ativar o contexto de renderização GL + + + [APP_NAME] é incapaz de funcionar por causa do seu driver de video não ter sido instalado corretamente, estão desatualizados, ou não são suportados pelo hardware. Por favor certifique-se que você possui os drivers de placa de vídeo mais recente e mesmo assim, tente reinstalá-los. + +If you continue to receive this message, contact the [SUPPORT_SITE]. + + + Barba por fazer + + + Todo branco + + + Olhos de Anime + + + Arqueados + + + Comprimento do braço + + + Anexado + + + Lóbulos da orelha anexados + + + corte traseiro + + + folgado + + + Franja + + + Olhos pequenos + + + Tamanho da barriga + + + Grande + + + Bunda grande + + + Cabelo volumoso: Trás + + + Cabelo volumoso: Frente + + + Cabelo volumoso: Topo + + + cabeça grande + + + Peitorais grandes + + + Pontas grandes + + + Negro + + + Loiro + + + Cabelo loiro + + + Blush + + + Cor do blush + + + Opacidade do blush + + + Definição do corpo + + + Gordura + + + Sardas + + + Corpo cheio + + + Ossatura + + + Corpo magro + + + Pernas arqueadas + + + Caimento dos seios + + + Separação dos seios + + + Tamanho dos seios + + + Largura do nariz + + + Largo + + + Tamanho da sobrancelha + + + Olhos saltados + + + Olhos esbugalhados + + + Bulbos + + + Nariz em bulbo + + + Seios - massa + + + Seios - suavização + + + Seios - gravidade + + + Seios - resistência do ar + + + Efeito máximo + + + Vibração + + + Ganho + + + Duração + + + Efeito máximo + + + Vibração + + + Ganho + + + Duração + + + Efeito máximo + + + Vibração + + + Ganho + + + Duração + + + Barriga - massa + + + Barriga - suavização + + + Barriga - gravidade + + + Barriga - resistência do ar + + + Efeito máximo + + + Vibração + + + Ganho + + + Duração + + + Nádegas - massa + + + Nádegas - suavização + + + Nádegas - gravidade + + + Nádegas - resistência do ar + + + Efeito máximo + + + Vibração + + + Ganho + + + Duração + + + Efeito máximo + + + Vibração + + + Ganho + + + Duração + + + Sobrancelhas grossas + + + Cabelo grosso + + + Tamanho do traseiro + + + Nádegas - gravidade + + + Saia armada + + + Saia reta + + + Mais + + + Chaplin + + + Maçãs do rosto + + + Tamanho do peito + + + Ângulo do queixo + + + Fissura do queixo + + + Barba de contorno + + + Profundidade do queixo + + + Queixo pronunciado + + + Queixo para dentro + + + Queixo para fora + + + Queixo-pescoço + + + Limpar + + + Fenda + + + Fechar conjunto de olhos + + + Fechado + + + Trás fechada + + + Frente fechada + + + Esquerda fechada + + + Direita fechada + + + Pouco volume + + + Colarinho posterior + + + Colarinho anterior + + + Canto para baixo + + + Canto para cima + + + Vincado + + + Nariz torto + + + Bainha larga + + + Escuro + + + Verde escuro + + + Mais escuro + + + Profundidade + + + Salto padrão + + + Densidade + + + Queixo duplo + + + Curvado para baixo + + + Mais volume + + + Ângulo da orelha + + + Tamanho da orelha + + + Pontas das orelhas + + + Cabeça oval + + + Olheiras + + + Cor dos olhos + + + Profundidade dos olhos + + + Luminosidade dos olhos + + + Abertura dos olhos + + + Olho saltado + + + Tamanho dos olhos + + + Espaçamento dos olhos + + + Arco da sobrancelha + + + Densidade da sobrancelha + + + Altura da sobrancelha + + + Pontas da sobrancelha + + + Tamanho da sobrancelha + + + Comprimento das pestanas + + + Delineador + + + Cor do delineador + + + Olhos esbugalhados + + + Face raspada + + + Definição facial + + + Distância entre os olhos + + + Lábios carnudos + + + Feminino + + + Dedos + + + Dedos + + + Punhos largos + + + Chato + + + Traseiro chato + + + Cabeça chata + + + Dedos dos pés chatos + + + Tamanho dos pés + + + Ângulo da testa + + + Testa pronunciada + + + Sardas + + + Franja + + + Trás cheia + + + Delienador cheio + + + Frente cheia + + + Cabelos laterais cheios + + + Lados cheios + + + Brilhante + + + Dedos da luva + + + Comprimento das luvas + + + Cabelo + + + Cabelo: Trás + + + Cabelo: Frente + + + Cabelos: Lateral + + + Cabelo penteado + + + Espessura do cabelo + + + Espessura do cabelo + + + Divisão do cabelo + + + Divistão do cabelo esquerda + + + Divisão do cabelo direita + + + Cabelo: Volume + + + Tamanho das mãos + + + Bigode + + + Comprimento da cabeça + + + Formato da cabeça + + + Tamanho da cabeça + + + Extensão da cabeça + + + Altura do salto + + + Formato do salto + + + Altura + + + Alto + + + Salto alto + + + Maxilar alto + + + Plataformas altas + + + Alto e justo + + + Mais alto + + + Comprimento do quadril + + + Largura do quadril + + + Pairar + + + Dentro + + + Cor da sombra interna + + + Opacidade da sombra interna + + + Canto interno dos olhos + + + Sombra interna dos olhos + + + Sombra interna + + + Comprimento da blusa + + + Dobras da jaqueta + + + Ângulo da mandíbula + + + Posição do maxilar + + + Formato do maxilar + + + Juntar + + + Papo + + + Ângulo do joelho + + + Joelhos para dentro + + + Grande + + + Mãos grandes + + + Parte esquerda + + + Comprimento da perna + + + Musculatura da perna + + + Menos + + + Menos gordura + + + Menos barba + + + Menos sardas + + + Menos + + + Menos gravidade + + + Menos excesso + + + Menos músculos + + + Menos musculoso + + + Menos rosado + + + Menos arredondado + + + Menos ancas + + + Menos quadrado + + + Menos volume + + + Menos alma + + + Lighter + + + Fenda dos lábios + + + Profundidade da fenda dos lábios + + + Volume dos lábios + + + Rosado dos lábios + + + Proporção dos lábios + + + Espessura dos lábios + + + Largura dos lábios + + + Brilho dos lábios + + + Batom + + + Cor do batom + + + Longo + + + Cabeça alongada + + + Lábios longos + + + Pernas longas + + + Pescoço longo + + + Chiquinhas longas + + + Rabo de cavalo longo + + + Torso longo + + + Braços longos + + + Pantalonas + + + Camisa folgada + + + Mangas folgadas + + + Pneu + + + Baixo + + + Salto baixo + + + Maxilar baixo + + + Plataformas baixas + + + Baixo e solto + + + Mais baixo + + + Mais baixa + + + Bochechas abaixadas + + + Masculino + + + Parte do meio + + + Mais + + + Mais blush + + + Mais gordura + + + Mais barba + + + Mais sombra dos olhos + + + Mais sardas + + + Mais volume + + + Mais gravidade + + + Mais batom + + + Mais cintura + + + Mais lábio inferior + + + Mais músculos + + + Mais musculoso + + + Mais rosado + + + Mais arredondado + + + Mais ancas + + + Mais inclinado + + + Mais quadrado + + + Mais lábios superiores + + + Mais vertical + + + Mais volume + + + Mais alma + + + Bigode + + + Canto da boca + + + Posição da boca + + + Moicano + + + Muscular + + + Costeletas + + + Esmate das unhas + + + Cor do esmalte das unhas + + + Estreito + + + Costas estreitas + + + Frente estreita + + + Lábios estreitos + + + Natural + + + Comprimento do pescoço + + + Espessura do pescoço + + + Sem blush + + + Sem delineador + + + Sem sombra + + + Sem brilho + + + Sem batom + + + Sem parte + + + Sem esmalte + + + Sem vermelho + + + Sem pontas + + + Sem branco + + + Sem dobras + + + Normal inferior + + + Normal superior + + + Nariz para esquerda + + + Nariz para direita + + + Tamanho do nariz + + + Espessura do nariz + + + Ângulo da ponta do nariz + + + Formato da ponta do nariz + + + Largura do nariz + + + Divisão das narinas + + + Largura das narinas + + + Opaco + + + Abrir + + + Aberto atrás + + + Aberto na frente + + + Aberto esquerdo + + + Aberto direito + + + Laranja + + + Fora + + + Cor da sombra externa + + + Opacidade da sombra externa + + + Canto externo do olho + + + Sombra externa do olho + + + Sombra externa + + + Má oclusão + + + Púbis + + + Unhas pintadas + + + Pálido + + + Cavalo da calça + + + Caimento das calças + + + Comprimento das calças + + + Cintura da calça + + + Dobras das calças + + + Parte + + + Divisão da franja + + + Peitorais + + + Pigmento + + + Chiquinhas + + + Rosa + + + Mais rosado + + + Altura da plataforma + + + Largura da plataforma + + + Pontudo + + + Salto agulha + + + Rabo de cavalo + + + Saia bufante + + + Olho saltado esquerdo + + + Olho saltado direito + + + Inchado + + + Pálpebras inchadas + + + Cor do arco íris + + + Cabelo ruivo + + + Normal + + + Parte direita + + + Rosado da face + + + Arredondado + + + Rubor + + + Corado + + + Cabelo desalinhado + + + Culote + + + Pernas magricelas + + + Separar + + + Raso + + + Trás rente + + + Face raspada + + + Frente rente + + + Esquerda rente para cima + + + Trás rente para cima + + + Rente atrás + + + Rente frente + + + Deslocar p/ esquerda + + + Deslocar boca + + + Deslocar p/ direita + + + Barra da camisa + + + Ajuste da camisa + + + +/- amassada + + + Altura do sapato + + + Curto + + + Braços curtos + + + Pernas curtas + + + Pescoço curto + + + Chiquinhas curtas + + + Rabo de cavalo curto + + + Costeletas curtas + + + Tronco curto + + + Quadril curto + + + Ombros + + + pontas laterais + + + Costeletas + + + Cabelo lateral + + + Cabelo lateral long + + + Cabelo lateral superior + + + Pescoço fino + + + Ajuste de saia + + + Comprimento da saia + + + Testa inclinada + + + Comprimento da manga + + + Folga da manga + + + Abertura : Atrás + + + Abertura: Frente + + + Abertura: Esquerda + + + Abertura: Direita + + + Pequeno + + + Mãos pequenas + + + Cabeça pequena + + + Suavizar + + + Suavizar cabelo + + + Comprimento das meias + + + Cavanhaque + + + Disperso + + + Cabelo espetado + + + Quadrado + + + Dedo quadrado + + + Cabeça de Pera + + + Cabeça esticada + + + Afundar + + + Peito afundado + + + Olhos afundados + + + Pentear para trás + + + Pentear para frente + + + Alto + + + Afinar atrás + + + Afinar a frente + + + Salto grosso + + + Pescoço grosso + + + Dedo grosso + + + Fino + + + Sobrancelhas finas + + + Lábios finos + + + Nariz fino + + + Queixo apertado + + + Punho justo + + + Calça justa + + + Camisa justa + + + Saia justa + + + Tight Sleeves + + + Formato dos dedos + + + Espessura dos dos dedos + + + Comprimento do tronco + + + Músculos do tronco + + + Tronco magricela + + + Desanexado + + + Uncreased + + + Underbite + + + Não natural + + + Parte alta do nariz + + + Bochechas altas + + + fenda do queixo alta + + + Curvatura dos cílios supériores + + + Voltado para cima + + + Bem vermelho + + + Altura da cintura + + + Corpulento + + + Grisalho + + + Amplo + + + Costas largas + + + Testa larga + + + Lábios amplos + + + Selvagem + + + Rugas + + + Adicionar às minhas Landmarks + + + Editar minhas Landmarks + + + Ver mais informações sobre a localização atual + + + Histórico de localizações + + + Região Adulta + + + Região Moderada + + + Região em geral + + + Os avatares neste lote não podem ser vistos ou ouvidos por avatares fora dele + + + Os objetos que se movem podem não se comportar corretamente nesta região até que ela seja recarregada. + + + O pathfinding dinâmico não está habilitado nesta região. + + + [APP_NAME] Atualização + + + Atualizando agora o [APP_NAME]... + + + Instalando [APP_NAME]... + + + Seu visualizador [APP_NAME] está sendo atualizado para a versão mais recente. Isso pode levar algum tempo, então por favor seja paciente. + + + Fazendo o download da atualização... + + + Fazendo o download da atualização + + + Falha no download da atualização + + + Um erro ocorreu ao atualizar [APP_NAME]. Por favor, faça o download da versão mais recente em www.secondlife.com. + + + Falha ao instalar a atualização + + + Falha ao iniciar o visualizador + + + [APP_NAME]: Entrada de itens rápida demais de [FROM_NAME], visualização automática suspensa por [TIME] segundos + + + [APP_NAME]: Entrada de itens rápida demais, visualização automática suspensa por [TIME] segundos + + + -- Log de mensagem instantânea habilitado -- + + + [NAME] está digitando... + + + (Anônimo) + + + (Moderado: Voz desativado por padrão) + + + Bate-papo de texto não está disponível para esta chamada. + + + Seu bate- papo de texto foi desabilitado por um Moderador do Grupo. + + + Clique aqui para menagem instantânea. + + + Para + + + (Moderador) + + + (Salvo em [LONG_TIMESTAMP]) + + + Para visualizar esta mensagem, você deve desmarcar "Apenas amigos e grupos podem me ligar ou enviar MIs" em Preferências/Privacidade. + + + Conectado + + + Desconectado + + + O usuário não está online. As mensagens serão armazenadas e enviadas mais tarde. + + + O usuário não está online. O inventário foi salvo. + + + Ligação atendida + + + Você iniciou uma ligação de voz + + + Você entrou na ligação + + + Você recusou automaticamente a chamada de voz enquanto "Não perturbe" estava ativado. + + + [NAME] iniciou uma ligação de voz + + + Entrando em ligação de voz... + + + Conectado. Para sair, clique em Desligar + + + Saiu da ligação de voz + + + Bate-papo com várias pessoas + + + Conversa com [AGENT_NAME] + + + Item do inventário '[ITEM_NAME]' oferecido + + + Pasta do inventário '[ITEM_NAME]' oferecida + + + Você está conversando com um bot, [NAME]. Não compartilhe informações pessoais. +Saiba mais em https://second.life/scripted-agents. + + + Você publicou no Facebook. + + + Você publicou no Flickr. + + + Você publicou no Twitter. + + + (Sessão de MI inexistente) + + + Você é o único usuário desta sessão. + + + [NAME] está offline. + + + Clique no botão [BUTTON NAME] para aceitar/ conectar a este bate-papo em voz. + + + Você bloqueou este residente. Se quiser retirar o bloqueio, basta enviar uma mensagem. + + + Erro de solicitação, tente novamente mais tarde. + + + Erro na requisição, por favor, tente novamente. + + + Você não tem permissões suficientes. + + + A sessão deixou de existir + + + Você não possui esta habilidade. + + + Você não possui esta habilidade. + + + Você não é um moderador de sessão. + + + Bate-papo de texto desativado por um moderador. + + + Um moderador do grupo desabilitou seu bate-papo em texto. + + + Não foi possível adicionar usuários na sessão de bate-papo com [RECIPIENT]. + + + Não foi possível enviar sua mensagem para o bate-papo com [RECIPIENT]. + + + Não foi possível enviar sua mensagem na sessão de bate- papo com [RECIPIENT]. + + + Erro durante a moderação. + + + Você foi tirado do grupo. + + + Você foi removido do grupo. + + + Você não possui mais a habilidade de estar na sessão de bate-papo. + + + [SOURCES] disse alguma coisa + + + [SOURCES] disseram alguma coisa + + + A inicialização da sessão expirou + + + Posição inicial definida. + + + https://secondlife.com/destination/voice-island + + + https://secondlife.com/destination/voice-morphing-premium + + + [NAME] lhe pagou L$ [AMOUNT] [REASON]. + + + [NAME] lhe pagou L$ [AMOUNT]: [REASON] + + + [NAME] lhe pagou L$ [AMOUNT] + + + Você pagou L$[AMOUNT] por [REASON] a [NAME]. + + + Você pagou L$[AMOUNT] a [NAME]: [REASON] + + + Você acaba de pagar L$[AMOUNT]. + + + Você pagou L$[AMOUNT] a [NAME]. + + + Você pagou L$[AMOUNT] por [REASON]. + + + Você não pagou L$[AMOUNT] a [NAME] referentes a [REASON]. + + + Você não pagou L$[AMOUNT] a [NAME]: [REASON] + + + Você não pagou L$[AMOUNT]. + + + Você não pagou L$[AMOUNT] a [NAME]. + + + Você não pagou L$[AMOUNT] referentes a [REASON]. + + + por [ITEM] + + + por uma parcela + + + por um passe de acesso + + + para doar um terreno + + + para criar um grupo + + + para entrar em um grupo + + + para carregar + + + para publicar um anúncio + + + Dando L$ [AMOUNT] + + + O upload custa L$ [AMOUNT] + + + Isso custa L$ [AMOUNT] + + + Comprando terreno selecionado L$ [AMOUNT] + + + Esse objeto custa L$ [AMOUNT] + + + Todos + + + Oficiais + + + Proprietários + + + Conectado + + + Carregando... + +Denunciar abuso + + + Nova forma + + + Nova pele + + + Novo cabelo + + + Novos olhos + + + Nova camisa + + + Novas calças + + + Novos sapatos + + + Novas meias + + + Nova blusa + + + Novas luvas + + + Nova camiseta + + + Novas roupa de baixo + + + Nova saia + + + Novo alpha + + + Nova tatuagem + + + Novo universal + + + Novo físico + + + Item inválido + + + Novo gesto + + + Novo script + + + Nova nota + + + Nova pasta + + + Conteúdo + + + Gesto + + + Gestos masculinos + + + Gestos femininos + + + Outros gestos + + + Gestos da fala + + + Gestos comuns + + + Perdão - masculino + + + Deixe-me em paz - masculino + + + Mandar beijo - masculino + + + Vaia - masculino + + + Maçante - masculino + + + Ôpa! - masculino + + + Risada - masculino + + + Quero distância! - masculino + + + Encolher de ombros - masculino + + + Mostrar a língua - masculino + + + Wow - masculino + + + Engraçado - Feminino + + + Chorar - Feminino + + + Com vergonha - Feminino + + + Perdão - fem + + + Deixe-me em paz - feminino + + + Mandar beijo - fem + + + Vaia - fem + + + Maçante - feminino + + + Ôpa - feminino + + + E aí, beliza? - Feminino + + + Risada - feminina + + + Que chique - Feminino + + + Acenar - Feminino + + + Por favor - Feminino + + + Quero distância! - feminino + + + Encolher ombros - feminino + + + Mostrar a língua - feminino + + + Wow - feminino + + + Novo ciclo de dias + + + Nova água + + + Novo céu + + + /reverência + + + /palmas + + + /contar + + + /apagar + + + /dane_se + + + /músculos + + + /não + + + /não! + + + /papel + + + /apontar_eu + + + /apontar_você + + + /pedra + + + /tesoura + + + /fumar + + + /alongar + + + /assobiar + + + /sim + + + /sim! + + + ldt + + + dança1 + + + dança2 + + + dança3 + + + dança4 + + + dança5 + + + dança6 + + + dança7 + + + dança8 + + + [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt] + + + nenhum/nehum + + + A imagem excede o limite [WIDTH]*[HEIGHT] + + + O tamanho máx. do look é [WIDTH]*[HEIGHT]. Redimensione ou use outra imagem + + + O tamanho máx. do look é [WIDTH]*[HEIGHT]. Selecione outra textura + + + Não foi possível confirmar as dimensões da foto. Aguarde até que o tamanho da foto seja exibido no seletor + + + + Aconteceu algo inesperado, apesar de termos tentado impedir isso. + +Visite http://status.secondlifegrid.net para saber se foi detectado um problema com o serviço. + Se o problema persistir, cheque a configuração da sua rede e firewall. + + + Domingo:Segunda:Terça:Quarta:Quinta:Sexta:Sábado + + + Dom:Seg:Ter:Qua:Qui:Sex:Sab + + + Janeiro:Fevereiro:Março:Abril:Maio:Junho:Julho:Agosto:Setembro:Outubro:Novembro:Dezembro + + + Jan:Fev:Mar:Abr:Maio:Jun:Jul:Ago:Set:Out:Nov:Dez + + + [MDAY] + + + AM + + + PM + + + US$ [AMOUNT] + + + Banimento do grupo + + + Plano + + + Cargos + + + Identidade do lote + + + Gestão do lote + + + ID do lote + + + Configurações do lote + + + Poderes do lote + + + Acesso ao lote + + + Conteúdo do lote + + + Gestão de objetos + + + Contabilidade + + + Avisos + + + Bate-papo + + + Base + + + Excluir itens selecionados? + + + Excluir item selecionado? + + + Este look não possui nenhuma peça + + + Selecione um editor utilizando a configuração ExternalEditor. + + + O editor externo especificado não foi localizado. +Tente colocar o caminho do editor entre aspas. +(ex. "/caminho para/editor" "%s") + + + Error ao analisar o comando do editor externo. + + + Falha de execução do editor externo. + + + Falha na tradução: [REASON] + + + Erro ao analisar resposta de tradução. + + + Esc + + + Space + + + Enter + + + Tab + + + Ins + + + Del + + + Backsp + + + Shift + + + Ctrl + + + Alt + + + CapsLock + + + Início + + + End + + + PgUp + + + PgDn + + + F1 + + + F2 + + + F3 + + + F4 + + + F5 + + + F6 + + + F7 + + + F8 + + + F9 + + + F10 + + + F11 + + + F12 + + + Adicionar + + + Subtrair + + + Multiplicar + + + Dividir + + + PAD_DIVIDE + + + PAD_LEFT + + + PAD_RIGHT + + + PAD_DOWN + + + PAD_UP + + + PAD_HOME + + + PAD_END + + + PAD_PGUP + + + PAD_PGDN + + + PAD_CENTER + + + PAD_INS + + + PAD_DEL + + + PAD_Enter + + + PAD_BUTTON0 + + + PAD_BUTTON1 + + + PAD_BUTTON2 + + + PAD_BUTTON3 + + + PAD_BUTTON4 + + + PAD_BUTTON5 + + + PAD_BUTTON6 + + + PAD_BUTTON7 + + + PAD_BUTTON8 + + + PAD_BUTTON9 + + + PAD_BUTTON10 + + + PAD_BUTTON11 + + + PAD_BUTTON12 + + + PAD_BUTTON13 + + + PAD_BUTTON14 + + + PAD_BUTTON15 + + + - + + + = + + + ` + + + ; + + + [ + + + ] + + + \ + + + 0 + + + 1 + + + 2 + + + 3 + + + 4 + + + 5 + + + 6 + + + 7 + + + 8 + + + 9 + + + A + + + B + + + C + + + D + + + E + + + F + + + G + + + H + + + I + + + J + + + K + + + L + + + M + + + N + + + O + + + P + + + Q + + + R + + + S + + + T + + + U + + + V + + + W + + + X + + + Y + + + Z + + + Vendo balizas de partículas (azul) + + + Vendo balizas de objetos físicos (verde) + + + Vendo balizas de objetos com script (vermelho) + + + Vendo objeto com script com balizas com funcionalidade de toque (vermelho) + + + Vendo balizas de som (amarelo) + + + Vendo balizas de mídia (branco) + + + Visualizando farol de direção do sol (alaranjado) + + + Visualizando farol de direção da lua (roxo) + + + Ocultar partículas + + + Sobre terrenos + + + Aparência + + + Avatar + + + Construir + + + Bate-papo + + + Conversas + + + Bússola + + + Destinos + + + Meus ambientes + + + Facebook + + + Flickr + + + Gestos + + + Status da grade + + + Como + + + Inventário + + + Mapa + + + Mercado + + + Marketplace + + + Mini Mapa + + + Andar/correr/voar + + + Caixa de saída do lojista + + + Pessoas + + + Destaques + + + Lugares + + + Preferências + + + Perfil + + + Relatar abuso + + + Buscar + + + Foto + + + Falar + + + Twitter + + + Controles da câmera + + + Configurações de voz + + + Informações sobre o terreno que você está visitando + + + Mudar seu avatar + + + Escolha um avatar completo + + + Construindo objetos e redimensionando terreno + + + Bater papo com pessoas próximas usando texto + + + Conversar com todos + + + Bússola + + + Destinos de interesse + + + Meus ambientes + + + Publicar no Facebook + + + Carregar no Flickr + + + Gestos para seu avatar + + + Mostrar status da grade atual + + + Como executar tarefas comuns + + + Exibir e usar seus pertences + + + Mapa-múndi + + + Faça compras + + + Venda suas criações + + + Mostrar quem está aqui + + + Movendo seu avatar + + + Transferir itens para o seu mercado para venda + + + Amigos, grupos e pessoas próximas + + + Lugares mostrados como favoritos em seu perfil + + + Lugares salvos + + + Preferências + + + Edite ou visualize seu perfil + + + Relatar abuso + + + Encontre lugares, eventos, pessoas + + + Tirar uma foto + + + Fale com pessoas próximas usando seu microfone + + + Twitter + + + Alterar o ângulo da câmera + + + Controles de volume das chamadas e pessoas próximas a você no mundo virtual + + + atualmente na sua barra de ferramentas inferior + + + atualmente na sua barra de ferramentas esquerda + + + atualmente na sua barra de ferramentas direita + + + Reter% + + + Detalhe + + + Detalhamento maior + + + Superfície + + + Sólido + + + Conclusão + + + Visualizar + + + Normal + + + http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer + + + Nenhum + + + Afeta o navmesh + + + Personagem + + + (Múltiplo) + + + Muito baixo + + + Baixo + + + Médio + + + Alto + + + Muito alto + + + O residente não pode visitar a região. + + + [Usuário] + + + Experiência + + + (nenhuma experiência) + + + (experiência sem título) + + + Dentro do terreno + + + Dentro da grade + + + PERMITIDO + + + BLOQUEADO + + + COLABORADOR + + + ADMINISTRADOR + + + RECENTE + + + PRÓPRIAS + + + ([EXPERIENCES], máx. [MAXEXPERIENCES]) + + + assumir seus controles + + + acionar animações no seu avatar + + + anexar ao avatar + + + rastrear sua câmera + + + controlar sua câmera + + + teletransportar você + + + aceitar automaticamente permissões de experiência + + + forçar o avatar a sentar + + + alterar sua configurações de ambiente + + + realizar uma operação desconhecida: [Permission] + + + Assumir o controle + + + Acionar animações + + + Anexar + + + Rastrear câmera + + + Controlar câmera + + + Teletransportar + + + Autorização + + + Sentar + + + Ambiente + + + As conversas não estão sendo registradas. Para começar a manter um registro, selecione "Salvar: apenas registro" ou "Salvar: registro e transcrições" em Preferências> Bate-papo. + + + Nenhuma conversa será registrada. Para recomeçar a gravação de registros, selecione "Salvar: apenas registro" ou "Salvar: registro e transcrições" em Preferências> Bate-papo. + + + Não há conversas registradas. Depois que você entrar em contato com alguém, ou alguém entrar em contato com você, um registro será exibido aqui. + + + Carregando... + + + n/d + + + -Lista vazia- + + + Padrão + + + (nenhum) + + + Sem limite + + + A forma física contém triângulos muito pequenos. Tente simplificar o modelo físico. + + + A forma física contém dados de confirmação ruins. Tente consertar o modelo físico. + + + A forma física não tem a versão correta. Defina a versão correta para o modelo físico. + + + O DNS não pode resolver o nome do host([HOSTNAME]). +Verifique se você pode conectar ao site www.secondlife.com . Se você +puder, mas se continuar recebendo esta mensagem de erro, vá à sessão +Suporte no site Secondlife.com e informe o problema. + + + O servidor de acesso não pôde verificá-lo pelo SSL. +Se você continuar recebendo esta mensagem de erro, vá à sessão Suporte no site Secondlife.com -e informe o problema. - Geralmente, esse erro significa que o relógio do seu computador não está com o horário correto. +e informe o problema. + + + Geralmente, esse erro significa que o relógio do seu computador não está com o horário correto. Vá em Painel de Controles e certifique-se de que a hora e data estejam corretos. Além disso, verifique se a sua rede e firewall estejam corretos. Se você continuar recebendo esta mensagem de erro, vá à sessão Suporte no site Secondlife.com e informe o problema. -[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conhecimento] +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conhecimento] + diff --git a/indra/newview/skins/default/xui/pt/teleport_strings.xml b/indra/newview/skins/default/xui/pt/teleport_strings.xml index 0cbf4dccd8..014e44a175 100644 --- a/indra/newview/skins/default/xui/pt/teleport_strings.xml +++ b/indra/newview/skins/default/xui/pt/teleport_strings.xml @@ -1,38 +1,94 @@ - Houve um problema ao processar o teletransporte. Talvez seja preciso sair e entrar do Second Life para fazer o teletransporte. -Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE]. - Problema encontrado ao processar a passagem de regiões. Talvez seja preciso sair e entrar do Second Life atravessar regiões novamente. -Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE]. - Desculpe, teletransportes estão atualmente bloqueados. Tente novamente dentro de alguns instantes. Se você continuar com problemas de teletransporte, por favor tente deslogar e relogar para resolver o problema. - Desculpe, mas o sistema não conseguiu localizar a landmark de destino. - Desculpe, não foi possível para o sistema executar o teletransporte. Tente novamente dentro de alguns instantes. - Não é possível se teletransportar de volta à Ilha Welcome. -Vá para a 'Ilha Welcome Pública' para repetir o tutorial. - Desculpe, você não tem acesso ao destino deste teletransporte. - Seu anexos ainda não chegaram. Tente esperar por alguns momentos ou deslogar e logar antes de tentar teleransportar-se novamente. - Afluxo nesta região é atualmente tão alto que seu pedido de teletransporte não será possível em tempo oportuno. Por favor, tente novamente em alguns minutos ou vá a uma área menos ocupada. - Desculpe, mas o sistema não conseguiu concluir o seu pedido de teletransporte em tempo hábil. Por favor, tente novamente em alguns minutos. - Desculpe, mas o sistema não pôde concluir a sua travessia de região em tempo hábil. Por favor, tente novamente em alguns minutos. - Não foi possível encontrar o destino do teletransporte. O destino pode estar temporariamente indisponível ou não existir mais. Por favor, tente novamente em poucos minutos. - O sistema de inventário está indisponível no momento. - Você deve ter 18 anos ou mais para acessar esta região. - Não é possível inserir a região. '[REGION_NAME]' é uma Região de Skill Gaming, portanto você deve atender certos critérios para poder entrar. Para maiores detalhes, consulte as [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ]. - Desculpe, mas o sistema falhou ao iniciar o seu teletransporte. Por favor, tente novamente dentro de alguns minutos. + + Houve um problema ao processar o teletransporte. Talvez seja preciso sair e entrar do Second Life para fazer o teletransporte. +Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE]. + + + Problema encontrado ao processar a passagem de regiões. Talvez seja preciso sair e entrar do Second Life atravessar regiões novamente. +Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE]. + + + Desculpe, teletransportes estão atualmente bloqueados. Tente novamente dentro de alguns instantes. Se você continuar com problemas de teletransporte, por favor tente deslogar e relogar para resolver o problema. + + + Desculpe, mas o sistema não conseguiu localizar a landmark de destino. + + + Desculpe, não foi possível para o sistema executar o teletransporte. Tente novamente dentro de alguns instantes. + + + Não é possível se teletransportar de volta à Ilha Welcome. +Vá para a 'Ilha Welcome Pública' para repetir o tutorial. + + + Desculpe, você não tem acesso ao destino deste teletransporte. + + + Seu anexos ainda não chegaram. Tente esperar por alguns momentos ou deslogar e logar antes de tentar teleransportar-se novamente. + + + Afluxo nesta região é atualmente tão alto que seu pedido de teletransporte não será possível em tempo oportuno. Por favor, tente novamente em alguns minutos ou vá a uma área menos ocupada. + + + Desculpe, mas o sistema não conseguiu concluir o seu pedido de teletransporte em tempo hábil. Por favor, tente novamente em alguns minutos. + + + Desculpe, mas o sistema não pôde concluir a sua travessia de região em tempo hábil. Por favor, tente novamente em alguns minutos. + + + Não foi possível encontrar o destino do teletransporte. O destino pode estar temporariamente indisponível ou não existir mais. Por favor, tente novamente em poucos minutos. + + + O sistema de inventário está indisponível no momento. + + + Você deve ter 18 anos ou mais para acessar esta região. + + + Não é possível inserir a região. '[REGION_NAME]' é uma Região de Skill Gaming, portanto você deve atender certos critérios para poder entrar. Para maiores detalhes, consulte as [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ]. + + + Desculpe, mas o sistema falhou ao iniciar o seu teletransporte. Por favor, tente novamente dentro de alguns minutos. + - Enviando para o destino. - Redirecionando para uma localidade diferente. - Transferindo para o destino. - Enviando solicitação de localização de início. - Enviando solicitação de localização de landmark. - Completando teletransporte. - Teletransporte de [T_SLURL] concluído - Identificando destino. - Contactando nova região. - Chegando... - Solicitando teletransporte... - Teletransporte pendente... + + Enviando para o destino. + + + Redirecionando para uma localidade diferente. + + + Transferindo para o destino. + + + Enviando solicitação de localização de início. + + + Enviando solicitação de localização de landmark. + + + Completando teletransporte. + + + Teletransporte de [T_SLURL] concluído + + + Identificando destino. + + + Contactando nova região. + + + Chegando... + + + Solicitando teletransporte... + + + Teletransporte pendente... + diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index e542f7c4ef..8433f893b5 100644 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -1,8 +1,4 @@ - Second Life @@ -1657,7 +1653,7 @@ support@secondlife.com. Тариф зависит от типа вашей подписки. Тарифы для владельцев расширенных пакетов меньше. [https://secondlife.com/my/account/membership.php? Узнать больше] - Открыть сохраненные локации + Открыть сохраненные локации Без ограничений @@ -2870,8 +2866,8 @@ support@secondlife.com. . - - ' + + ' --- @@ -2983,7 +2979,7 @@ support@secondlife.com. Не удается запустить приложение [APP_NAME], поскольку драйверы видеокарты неправильно установлены, устарели или предназначены для оборудования, которое не поддерживается. Установите или переустановите последние драйверы видеокарты. Если это сообщение продолжает отображаться, обратитесь на сайт [SUPPORT_SITE]. - + Жидкие @@ -4577,7 +4573,7 @@ support@secondlife.com. Предложена папка инвентаря «[ITEM_NAME]» -Вы общаетесь с ботом [NAME]. Не передавайте личные данные. + Вы общаетесь с ботом [NAME]. Не передавайте личные данные. Подробнее на https://second.life/scripted-agents. @@ -5147,7 +5143,7 @@ support@secondlife.com. Не удается найти указанный внешний редактор. Попробуйте взять путь к редактору в двойные кавычки -(например "/path to my/editor" "%s") +(например "/path to my/editor" "%s") Ошибка анализа командной строки для внешнего редактора. diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index 67df275895..e68d000179 100644 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -1,8 +1,4 @@ - Second Life @@ -88,7 +84,7 @@ Ses Sunucusu Sürümü: [VOICE_VERSION] [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] - Sunucu sürümü notları URL'si alınırken hata oluştu. + Sunucu sürümü notları URL'si alınırken hata oluştu. Yapı Konfigürasyonu @@ -205,7 +201,7 @@ Ses Sunucusu Sürümü: [VOICE_VERSION] http://secondlife.com/download - Kullandığınız görüntüleyici ile artık Second Life'a erişemezsiniz. Yeni bir görüntüleyiciyi karşıdan yüklemek için lütfen şu sayfayı ziyaret edin: + Kullandığınız görüntüleyici ile artık Second Life'a erişemezsiniz. Yeni bir görüntüleyiciyi karşıdan yüklemek için lütfen şu sayfayı ziyaret edin: http://secondlife.com/download Daha fazla bilgi edinmek için asağıdaki SSS sayfamızı ziyaret edin: @@ -247,10 +243,10 @@ Güncelleştirmeler için www.secondlife.com/status adresini kontrol edin. Second Life üzerindeki aktif kullanıcıların olası en iyi deneyimi yaşamasını sağlamak için, oturum açılması geçici olarak kısıtlanmıştır. -Second Life için ödeme yapmış olan kişilere öncelik tanımak amacıyla, ücretsiz hesaplara sahip kişiler bu süre içerisinde Second Life'a erişemeyecekler. +Second Life için ödeme yapmış olan kişilere öncelik tanımak amacıyla, ücretsiz hesaplara sahip kişiler bu süre içerisinde Second Life'a erişemeyecekler. - Second Life'a bu bilgisayardan erişemezsiniz. + Second Life'a bu bilgisayardan erişemezsiniz. Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com. @@ -286,7 +282,7 @@ Lütfen yeniden oturum açmayı denemeden önce bir dakika bekleyin. Bir simülatöre bağlanılamadı. - Hesabınız Second Life'a sadece + Hesabınız Second Life'a sadece Pasifik Saati ile [START] ve [END] arasında erişebilir. Lütfen bu saatler arasında tekrar uğrayın. Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com @@ -369,7 +365,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. Facebook ile bağlantı kurulurken sorun oluştu - Facebook'ta yayınlarken sorun oluştu + Facebook'ta yayınlarken sorun oluştu Facebook bağlantısı kesilirken sorun oluştu @@ -387,7 +383,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. Flickr bağlantısı kurulurken sorun çıktı - Flickr'da yayınlarken sorun çıktı + Flickr'da yayınlarken sorun çıktı Flickr bağlantısı kesilirken sorun çıktı @@ -405,7 +401,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. Twitter bağlantısı kurulurken sorun çıktı - Twitter'da yayınlarken sorun çıktı + Twitter'da yayınlarken sorun çıktı Twitter bağlantısı kesilirken sorun çıktı @@ -414,7 +410,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. Siyah Beyaz - 70'lerin Renkleri + 70'lerin Renkleri Yoğun @@ -657,7 +653,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. not kartlarına eklenemez. - Sadece kısıtlamasız 'sonraki sahip' + Sadece kısıtlamasız 'sonraki sahip' izinlerini içeren öğeler not kartlarına eklenebilir. @@ -1107,10 +1103,10 @@ http://secondlife.com/support adresini ziyaret edin. Şimdi Yakındaki bir Sesli Sohbete yeniden bağlanılacaksınız. - '[OWNERNAME]' adlı kişiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan '[OBJECTNAME]' nesnesine şunu yapma izni verildi: [PERMISSIONS]. + '[OWNERNAME]' adlı kişiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan '[OBJECTNAME]' nesnesine şunu yapma izni verildi: [PERMISSIONS]. - '[OWNERNAME]' adlı kişiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan '[OBJECTNAME]' nesnesine şunu yapma izni verilmedi: [PERMISSIONS]. + '[OWNERNAME]' adlı kişiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan '[OBJECTNAME]' nesnesine şunu yapma izni verilmedi: [PERMISSIONS]. Eğer hesabınıza erişime izin verirseniz, bu nesneye aynı zamanda şunun için izin vermiş olacaksınız: @@ -1486,7 +1482,7 @@ http://secondlife.com/support adresini ziyaret edin. Yüksek - Dünya Görünümüne dönmek için ESC'e basın + Dünya Görünümüne dönmek için ESC'e basın Aradığınızı bulamadınız mı? [secondlife:///app/search/all/[SEARCH_TERM] Arama] ile bulmayı deneyin. @@ -1545,7 +1541,7 @@ http://secondlife.com/support adresini ziyaret edin. - Bu alana klasörleri sürükleyin ve bunları [[MARKETPLACE_DASHBOARD_URL] Pazaryerinde] satılık olarak duyurmak için "Pazaryerine Gönder" üzerine tıklayın. + Bu alana klasörleri sürükleyin ve bunları [[MARKETPLACE_DASHBOARD_URL] Pazaryerinde] satılık olarak duyurmak için "Pazaryerine Gönder" üzerine tıklayın. Pazaryeri Başlatılıyor. @@ -1815,7 +1811,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin Satın Al - L$'a Satın Al + L$'a Satın Al Taş @@ -2001,19 +1997,19 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin Hata: Nesne mevcut dış görünüme dahil ama eklenmemiş - [AGEYEARS] [AGEMONTHS]'lık + [AGEYEARS] [AGEMONTHS]'lık [AGEYEARS] yaşında - [AGEMONTHS]'lık + [AGEMONTHS]'lık - [AGEWEEKS]'lık + [AGEWEEKS]'lık - [AGEDAYS]'lük + [AGEDAYS]'lük Bugün katıldı @@ -2034,7 +2030,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin Çevrenizdeki kimse sizi işleyemeyebilir. - BÜG'niz + BÜG'niz [OBJ_NAME] ([JNT_NAME] üzerinde) @@ -2312,13 +2308,13 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin Kullanılan bellek: [COUNT] kb - Parsel Komut Dosyası URL'leri + Parsel Komut Dosyası URL'leri - Kullanılan URL'ler: [COUNT] / [MAX] içerisinden; [AVAILABLE] serbest + Kullanılan URL'ler: [COUNT] / [MAX] içerisinden; [AVAILABLE] serbest - Kullanılan URL'ler: [COUNT] + Kullanılan URL'ler: [COUNT] Bilgi talep edilirken hata oluştu @@ -2522,7 +2518,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin Yeni Komut Dosyası - Bu sakin "Rahatsız Etme" seçeneğini devreye almış, mesajınızı sonra görecek. + Bu sakin "Rahatsız Etme" seçeneğini devreye almış, mesajınızı sonra görecek. (Adına göre) @@ -2633,7 +2629,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin size verdi: - <nolink>[NAME]</nolink> tarafından gönderilen [DESC]'i reddettiniz. + <nolink>[NAME]</nolink> tarafından gönderilen [DESC]'i reddettiniz. Toplam @@ -2870,8 +2866,8 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin . - - ' + + ' --- @@ -2986,7 +2982,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. - + Bir Günlük Sakal @@ -4490,7 +4486,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Görüntüleyici başlatılamadı - [APP_NAME]: [FROM_NAME]'den öğeler çok hızlı geliyor, [TIME] saniye boyunca otomatik ön izleme devre dışı bırakıldı + [APP_NAME]: [FROM_NAME]'den öğeler çok hızlı geliyor, [TIME] saniye boyunca otomatik ön izleme devre dışı bırakıldı [APP_NAME]: Öğeler çok hızlı geliyor, [TIME] saniye boyunca otomatik ön izleme devre dışı bırakıldı @@ -4526,7 +4522,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. (Kaydedildi [LONG_TIMESTAMP]) - Bu mesajı görmek için Tercihler/Gizlilik'de 'Sadece arkadaşlar ve gruplar beni arasın veya Aİ göndersin' seçeneğinin işaretini kaldırmalısınız. + Bu mesajı görmek için Tercihler/Gizlilik'de 'Sadece arkadaşlar ve gruplar beni arasın veya Aİ göndersin' seçeneğinin işaretini kaldırmalısınız. Çevrimiçi @@ -4550,7 +4546,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. Sesli aramaya katıldınız - "Rahatsız Etme" seçeneğini devredeyken sesli aramayı otomatik olarak reddettiniz. + "Rahatsız Etme" seçeneğini devredeyken sesli aramayı otomatik olarak reddettiniz. [NAME] bir sesli arama başlattı @@ -4574,26 +4570,26 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun. [AGENT_NAME] ile konferans - "[ITEM_NAME]" envanter öğesi sunuldu + "[ITEM_NAME]" envanter öğesi sunuldu - "[ITEM_NAME]" envanter klasörü sunuldu + "[ITEM_NAME]" envanter klasörü sunuldu -Bir bot ile sohbet ediyorsunuz, [NAME]. Kişisel bilgilerinizi paylaşmayın. + Bir bot ile sohbet ediyorsunuz, [NAME]. Kişisel bilgilerinizi paylaşmayın. Daha fazla bilgi için: https://second.life/scripted-agents. Envanterinizden buraya öğeler sürükleyin - Facebook'ta yayınladınız. + Facebook'ta yayınladınız. - Flickr'da yayınladınız. + Flickr'da yayınladınız. - Twitter'da yayınladınız. + Twitter'da yayınladınız. (Aİ Oturumu Mevcut Değil) @@ -4686,7 +4682,7 @@ Daha fazla bilgi için: https://second.life/scripted-agents. [NAME] size L$[AMOUNT] ödedi. - [NAME]'e [REASON] L$[AMOUNT] ödediniz. + [NAME]'e [REASON] L$[AMOUNT] ödediniz. [NAME] adlı kullanıcıya [AMOUNT] L$ ödediniz. [REASON] @@ -4695,13 +4691,13 @@ Daha fazla bilgi için: https://second.life/scripted-agents. L$[AMOUNT] ödediniz. - [NAME]'e L$[AMOUNT] ödediniz. + [NAME]'e L$[AMOUNT] ödediniz. [REASON] L$[AMOUNT] ödediniz. - [REASON] [NAME]'e L$[AMOUNT] ödeyemediniz. + [REASON] [NAME]'e L$[AMOUNT] ödeyemediniz. [NAME] adlı kullanıcıya [AMOUNT] L$ ödeyemediniz. [REASON] @@ -4710,7 +4706,7 @@ Daha fazla bilgi için: https://second.life/scripted-agents. L$[AMOUNT] ödeyemediniz. - [NAME]'e L$[AMOUNT] ödeyemediniz. + [NAME]'e L$[AMOUNT] ödeyemediniz. [REASON] L$[AMOUNT] ödeyemediniz. @@ -5142,7 +5138,7 @@ Hizmetle ilişkili bilinen bir sorun olup olmadığını görmek için lütfen h Belirttiğiniz harici düzenleyici bulunamadı. Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. -(örn. "/yolum/duzenleyici" "%s") +(örn. "/yolum/duzenleyici" "%s") Harici düzenleyici komutu ayrıştırılırken hata oluştu. @@ -5631,10 +5627,10 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. Ortamlarım - Facebook'ta Yayınla + Facebook'ta Yayınla - Flickr'a yükle + Flickr'a yükle Avatarınız için mimikler @@ -5865,10 +5861,10 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. Ortam - Sohbetlerin günlüğü tutulmuyor. Bir günlük tutmaya başlamak için, Tercihler > Sohbet altında "Kaydet: Sadece günlük" veya "Kaydet: Günlük ve dökümler" seçimini yapın. + Sohbetlerin günlüğü tutulmuyor. Bir günlük tutmaya başlamak için, Tercihler > Sohbet altında "Kaydet: Sadece günlük" veya "Kaydet: Günlük ve dökümler" seçimini yapın. - Bundan böyle sohbetlerin günlükleri tutulmayacak. Bir günlük tutmaya devam etmek için, Tercihler > Sohbet altında "Kaydet: Sadece günlük" veya "Kaydet: Günlük ve dökümler" seçimini yapın. + Bundan böyle sohbetlerin günlükleri tutulmayacak. Bir günlük tutmaya devam etmek için, Tercihler > Sohbet altında "Kaydet: Sadece günlük" veya "Kaydet: Günlük ve dökümler" seçimini yapın. Günlüğü tutulmuş sohbet yok. Siz biriyle iletişime geçtikten sonra veya biri sizinle iletişime geçtikten sonra, burada bir günlük girişi gösterilir. @@ -5914,7 +5910,7 @@ bölümüne gidin ve sorunu bildirin. Çoğunlukla, bu durum, bilgisayarınızın saatinin yanlış ayarlandığı anlamına gelir. -Lütfen Denetim Masası'na gidin ve tarih ve saat ayarlarının doğru yapıldığından emin olun. +Lütfen Denetim Masası'na gidin ve tarih ve saat ayarlarının doğru yapıldığından emin olun. Ayrıca, ağınızın ve güvenlik duvarınızın doğru şekilde ayarlanıp ayarlanmadığını kontrol edin. Bu hatayı almaya devam ederseniz, lütfen SecondLife.com web sitesinin Destek bölümüne gidin ve sorunu bildirin. diff --git a/indra/newview/skins/default/xui/tr/teleport_strings.xml b/indra/newview/skins/default/xui/tr/teleport_strings.xml index e3a08e04b2..b403786bd2 100644 --- a/indra/newview/skins/default/xui/tr/teleport_strings.xml +++ b/indra/newview/skins/default/xui/tr/teleport_strings.xml @@ -21,8 +21,8 @@ Hala ışınlanamıyorsanız, sorunu çözmek için lütfen çıkış yapıp otu Bir dakika sonra tekrar deneyin. - Karşılama Ada'sına geri ışınlanamazsınız. -Öğreticiyi tekrarlamak için 'Karşılama Ada'sı Kamusal Alanı'na gidin. + Karşılama Ada'sına geri ışınlanamazsınız. +Öğreticiyi tekrarlamak için 'Karşılama Ada'sı Kamusal Alanı'na gidin. Üzgünüz, bu ışınlanma hedef konumuna erişim hakkına sahip değilsiniz. @@ -49,7 +49,7 @@ Bir dakika sonra tekrar deneyin. Bu bölgeye girebilmek için 18 veya üzeri bir yaşta olmanız gerekir. - Bölgeye girilemiyor. "[REGION_NAME]" bir Yetenek Oyunu Bölgesi. Buraya girebilmek için bazı ölçütleri karşılamanız gerekiyor. Ayrıntılar için lütfen [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ] adresini ziyaret edin. + Bölgeye girilemiyor. "[REGION_NAME]" bir Yetenek Oyunu Bölgesi. Buraya girebilmek için bazı ölçütleri karşılamanız gerekiyor. Ayrıntılar için lütfen [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ] adresini ziyaret edin. diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml index dee48b3d58..cf6fa1d85f 100644 --- a/indra/newview/skins/default/xui/zh/strings.xml +++ b/indra/newview/skins/default/xui/zh/strings.xml @@ -1,8 +1,4 @@ - 第二人生 @@ -1103,10 +1099,10 @@ http://secondlife.com/support 求助解決問題。 現在你將重新聯接到附近的語音聊天 - 物件「[OBJECTNAME]'」(所有人「[OWNERNAME]」,位於「[REGIONNAME]」,方位「[REGIONPOS]」)已獲得下列權限:[PERMISSIONS]。 + 物件「[OBJECTNAME]'」(所有人「[OWNERNAME]」,位於「[REGIONNAME]」,方位「[REGIONPOS]」)已獲得下列權限:[PERMISSIONS]。 - 物件「[OBJECTNAME]'」(所有人「[OWNERNAME]」,位於「[REGIONNAME]」,方位「[REGIONPOS]」)已被撤除下列權限:[PERMISSIONS]。 + 物件「[OBJECTNAME]'」(所有人「[OWNERNAME]」,位於「[REGIONNAME]」,方位「[REGIONPOS]」)已被撤除下列權限:[PERMISSIONS]。 你如果打開帳戶權限,也將一併允許該物件: @@ -2863,8 +2859,8 @@ http://secondlife.com/support 求助解決問題。 . - - ' + + ' --- @@ -2979,7 +2975,7 @@ http://secondlife.com/support 求助解決問題。 如果你繼續看到此訊息,請聯絡 [SUPPORT_SITE]。 - + 下午五點的新鬍渣 @@ -4567,13 +4563,13 @@ http://secondlife.com/support 求助解決問題。 和 [AGENT_NAME] 多方通話 - 收納區物品'[ITEM_NAME]'已向人提供 + 收納區物品'[ITEM_NAME]'已向人提供 - 收納區資料夾'[ITEM_NAME]'已向人提供 + 收納區資料夾'[ITEM_NAME]'已向人提供 -您正在与人工智能机器人 [NAME] 聊天。请勿分享任何个人信息。 + 您正在与人工智能机器人 [NAME] 聊天。请勿分享任何个人信息。 了解更多:https://second.life/scripted-agents。 @@ -5134,7 +5130,7 @@ http://secondlife.com/support 求助解決問題。 找不到你指定的外部編輯器。 請嘗試在編輯器路經前後加上英文雙括號。 -(例:"/path to my/editor" "%s") +(例:"/path to my/editor" "%s") 解析外部編輯器指令時出錯。 diff --git a/indra/newview/skins/default/xui/zh/teleport_strings.xml b/indra/newview/skins/default/xui/zh/teleport_strings.xml index 61db294272..5523c598b4 100644 --- a/indra/newview/skins/default/xui/zh/teleport_strings.xml +++ b/indra/newview/skins/default/xui/zh/teleport_strings.xml @@ -49,7 +49,7 @@ 你必須年滿 18 歲才可進入這地區。 - 無法進入地區。 '[REGION_NAME]' 是個「技巧性博奕」(Skill Gaming)地區,你必須符合一定條件才可進入。 欲知詳情,請參閱 [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life 技巧性博奕常見問題集]。 + 無法進入地區。 '[REGION_NAME]' 是個「技巧性博奕」(Skill Gaming)地區,你必須符合一定條件才可進入。 欲知詳情,請參閱 [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life 技巧性博奕常見問題集]。 -- cgit v1.2.3 From 929c9b2dd0e4ff0b1b08c29267be60493010ab29 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Mon, 5 May 2025 15:28:51 +0300 Subject: #4009 Add color settings for chat mentions to Preferences --- indra/llui/llurlentry.cpp | 2 + indra/newview/skins/default/colors.xml | 5 +- .../default/xui/en/panel_preferences_colors.xml | 101 +++++++++++++++++++++ 3 files changed, 107 insertions(+), 1 deletion(-) diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 34138da34d..7218211a44 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -789,6 +789,8 @@ LLStyle::EUnderlineLink LLUrlEntryAgentMention::getUnderline(const std::string& LLStyle::Params LLUrlEntryAgentMention::getStyle(const std::string& url) const { LLStyle::Params style_params = LLUrlEntryAgent::getStyle(url); + style_params.color = LLUIColorTable::instance().getColor("ChatMentionFont"); + style_params.readonly_color = LLUIColorTable::instance().getColor("ChatMentionFont"); style_params.font.style = "NORMAL"; style_params.draw_highlight_bg = true; diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index cb190d3d34..f0ada22d66 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -1000,10 +1000,13 @@ + + value="1 1 0 1" /> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml index 44df5354aa..8a09e15396 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml @@ -299,6 +299,107 @@ width="95"> URLs + + + + + + Mentions + + + Chat mentions highlight colors: + + + + + + + Me + + + + + + + Others + Date: Mon, 5 May 2025 19:38:07 +0300 Subject: #4027 Crash at adjustTexturesByScale --- indra/newview/llselectmgr.cpp | 62 ++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index be1e64ce54..8aa3693d60 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -3142,36 +3142,43 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch) F32 offset_x = 0; F32 offset_y = 0; - for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + if (te_num < selectNode->mGLTFScaleRatios.size()) { - LLVector3 scale_ratio = selectNode->mGLTFScaleRatios[te_num][i]; - - if (planar) - { - scale_x = scale_ratio.mV[s_axis] / object_scale.mV[s_axis]; - scale_y = scale_ratio.mV[t_axis] / object_scale.mV[t_axis]; - } - else - { - scale_x = scale_ratio.mV[s_axis] * object_scale.mV[s_axis]; - scale_y = scale_ratio.mV[t_axis] * object_scale.mV[t_axis]; - } - 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) + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) { - offset_x++; + LLVector3 scale_ratio = selectNode->mGLTFScaleRatios[te_num][i]; + + if (planar) + { + scale_x = scale_ratio.mV[s_axis] / object_scale.mV[s_axis]; + scale_y = scale_ratio.mV[t_axis] / object_scale.mV[t_axis]; + } + else + { + scale_x = scale_ratio.mV[s_axis] * object_scale.mV[s_axis]; + scale_y = scale_ratio.mV[t_axis] * object_scale.mV[t_axis]; + } + 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); } - 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); + } + else + { + llassert(false); // make sure mGLTFScaleRatios is filled } const LLGLTFMaterial* base_material = tep->getGLTFMaterial(); @@ -6927,7 +6934,6 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query) if (mObject.notNull()) { - LLVector3 scale = mObject->getScale(); for (U8 i = 0; i < mObject->getNumTEs(); i++) -- cgit v1.2.3 From 9180a110bd5b0e41f182c32017b5dccd2eb265be Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Mon, 5 May 2025 21:13:11 +0300 Subject: #4028 Crash at onEmojiPickerClosed --- indra/newview/llfloaterimsessiontab.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 96aac8c1e6..7c3d2b511b 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -106,6 +106,7 @@ LLFloaterIMSessionTab::~LLFloaterIMSessionTab() { delete mRefreshTimer; LLIMMgr::instance().removeSessionObserver(this); + mEmojiCloseConn.disconnect(); LLFloaterIMContainer* im_container = LLFloaterIMContainer::findInstance(); if (im_container) -- cgit v1.2.3 From b084d842c9900e532cba11e1e5a4e85299a0e184 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 6 May 2025 23:05:27 +0300 Subject: #4008 Fix media scale adjustments with pbr applied --- indra/newview/llpanelface.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 99471a2555..a7b50f8364 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -1099,6 +1099,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) } mRadioPbrType->setEnabled(editable); const bool pbr_selected = mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR; + const bool media_selected = mComboMatMedia->getCurrentIndex() == MATMEDIA_MEDIA; const bool texture_info_selected = pbr_selected && mRadioPbrType->getSelectedIndex() != PBRTYPE_RENDER_MATERIAL_ID; mCheckSyncSettings->setEnabled(editable); @@ -1402,7 +1403,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) mShinyScaleU->setValue(spec_scale_s); mBumpyScaleU->setValue(norm_scale_s); - mTexScaleU->setEnabled(editable && has_material); + mTexScaleU->setEnabled(editable && (has_material || media_selected)); mShinyScaleU->setEnabled(editable && has_material && specmap_id.notNull()); mBumpyScaleU->setEnabled(editable && has_material && normmap_id.notNull()); @@ -1441,7 +1442,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) bool norm_scale_tentative = !identical_norm_scale_t; bool spec_scale_tentative = !identical_spec_scale_t; - mTexScaleV->setEnabled(editable && has_material); + mTexScaleV->setEnabled(editable && (has_material || media_selected)); mShinyScaleV->setEnabled(editable && has_material && specmap_id.notNull()); mBumpyScaleV->setEnabled(editable && has_material && normmap_id.notNull()); @@ -1487,7 +1488,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) mShinyOffsetU->setTentative(LLSD(spec_offset_u_tentative)); mBumpyOffsetU->setTentative(LLSD(norm_offset_u_tentative)); - mTexOffsetU->setEnabled(editable && has_material); + mTexOffsetU->setEnabled(editable && (has_material || media_selected)); mShinyOffsetU->setEnabled(editable && has_material && specmap_id.notNull()); mBumpyOffsetU->setEnabled(editable && has_material && normmap_id.notNull()); } @@ -1517,7 +1518,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) mBumpyOffsetV->setTentative(LLSD(norm_offset_v_tentative)); mShinyOffsetV->setTentative(LLSD(spec_offset_v_tentative)); - mTexOffsetV->setEnabled(editable && has_material); + mTexOffsetV->setEnabled(editable && (has_material || media_selected)); mShinyOffsetV->setEnabled(editable && has_material && specmap_id.notNull()); mBumpyOffsetV->setEnabled(editable && has_material && normmap_id.notNull()); } @@ -1544,7 +1545,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) F32 norm_rot_deg = norm_rotation * RAD_TO_DEG; F32 spec_rot_deg = spec_rotation * RAD_TO_DEG; - mTexRotate->setEnabled(editable && has_material); + mTexRotate->setEnabled(editable && (has_material || media_selected)); mShinyRotate->setEnabled(editable && has_material && specmap_id.notNull()); mBumpyRotate->setEnabled(editable && has_material && normmap_id.notNull()); @@ -1661,7 +1662,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) mTexRepeat->setValue(editable ? repeats : 1.0f); } mTexRepeat->setTentative(LLSD(repeats_tentative)); - mTexRepeat->setEnabled(has_material && !identical_planar_texgen && enabled); + mTexRepeat->setEnabled(!identical_planar_texgen && enabled && (has_material || media_selected)); } } -- cgit v1.2.3 From ed705097c430fa0962f879a79aa10a1a68ca12ce Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 7 May 2025 17:52:20 +0300 Subject: Make builds support Python 3.13 --- indra/cmake/Python.cmake | 2 +- indra/llmessage/llproxy.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/indra/cmake/Python.cmake b/indra/cmake/Python.cmake index da5d2ef22c..7cce190f6a 100644 --- a/indra/cmake/Python.cmake +++ b/indra/cmake/Python.cmake @@ -13,7 +13,7 @@ elseif (WINDOWS) foreach(hive HKEY_CURRENT_USER HKEY_LOCAL_MACHINE) # prefer more recent Python versions to older ones, if multiple versions # are installed - foreach(pyver 3.12 3.11 3.10 3.9 3.8 3.7) + foreach(pyver 3.13 3.12 3.11 3.10 3.9 3.8 3.7) list(APPEND regpaths "[${hive}\\SOFTWARE\\Python\\PythonCore\\${pyver}\\InstallPath]") endforeach() endforeach() diff --git a/indra/llmessage/llproxy.cpp b/indra/llmessage/llproxy.cpp index d04ca52ad6..d79d5c3a11 100644 --- a/indra/llmessage/llproxy.cpp +++ b/indra/llmessage/llproxy.cpp @@ -506,6 +506,7 @@ static apr_status_t tcp_blocking_handshake(LLSocket::ptr_t handle, char * dataou rv = apr_socket_recv(apr_socket, datain, &maxinlen); if (rv != APR_SUCCESS) { + // if rv == 70060 it's WSAETIMEDOUT char buf[MAX_STRING]; LL_WARNS("Proxy") << "Error receiving data from proxy control channel, status: " << rv << " " << apr_strerror(rv, buf, MAX_STRING) << LL_ENDL; ll_apr_warn_status(rv); -- cgit v1.2.3 From 50108bf0b7953e1f44a13b0790fe8dd8e9f7d2ca Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Wed, 7 May 2025 18:59:00 +0300 Subject: #4011 Add conversation list highlight for chat mention --- indra/llui/llfolderviewitem.h | 2 +- indra/llui/llurlentry.cpp | 5 +++++ indra/llui/llurlentry.h | 3 +++ indra/llui/llurlregistry.cpp | 27 +++++++++++++++++++++++++++ indra/llui/llurlregistry.h | 2 ++ indra/newview/llconversationview.cpp | 9 ++++++--- indra/newview/llconversationview.h | 3 ++- indra/newview/llfloaterimcontainer.cpp | 4 ++-- indra/newview/llfloaterimcontainer.h | 2 +- indra/newview/llimview.cpp | 8 +++++--- indra/newview/llviewermessage.cpp | 2 ++ indra/newview/skins/default/colors.xml | 3 +++ 12 files changed, 59 insertions(+), 11 deletions(-) diff --git a/indra/llui/llfolderviewitem.h b/indra/llui/llfolderviewitem.h index 234d0dc7f9..2ee018a90a 100644 --- a/indra/llui/llfolderviewitem.h +++ b/indra/llui/llfolderviewitem.h @@ -154,7 +154,7 @@ protected: virtual bool isHighlightActive(); virtual bool isFadeItem(); virtual bool isFlashing() { return false; } - virtual void setFlashState(bool) { } + virtual void setFlashState(bool, bool) { } static LLFontGL* getLabelFontForStyle(U8 style); const LLFontGL* getLabelFont(); diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 7218211a44..bcd13b7f0b 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -630,6 +630,11 @@ LLUUID LLUrlEntryAgent::getID(const std::string &string) const return LLUUID(getIDStringFromUrl(string)); } +bool LLUrlEntryAgent::isAgentID(const std::string& url) const +{ + return sAgentID == getID(url); +} + std::string LLUrlEntryAgent::getTooltip(const std::string &string) const { // return a tooltip corresponding to the URL type instead of the generic one diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 740e99acfd..6e7d2fc80f 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -103,6 +103,7 @@ public: virtual bool getSkipProfileIcon(const std::string& string) const { return false; } virtual LLUUID getID(const std::string &string) const { return LLUUID::null; } + virtual bool isAgentID(const std::string& url) const { return false; } bool isLinkDisabled() const; @@ -232,6 +233,8 @@ public: /*virtual*/ LLStyle::Params getStyle(const std::string &url) const; /*virtual*/ LLUUID getID(const std::string &string) const; + bool isAgentID(const std::string& url) const; + LLStyle::EUnderlineLink getUnderline(const std::string& string) const; protected: diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index 02d88c83fb..cb101d325d 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -327,3 +327,30 @@ void LLUrlRegistry::setKeybindingHandler(LLKeyBindingToStringHandler* handler) LLUrlEntryKeybinding *entry = (LLUrlEntryKeybinding*)mUrlEntryKeybinding; entry->setHandler(handler); } + +bool LLUrlRegistry::containsAgentMention(const std::string& text) +{ + // avoid costly regexes if there is clearly no URL in the text + if (!stringHasUrl(text)) + { + return false; + } + + try + { + boost::sregex_iterator it(text.begin(), text.end(), mUrlEntryAgentMention->getPattern()); + boost::sregex_iterator end; + for (; it != end; ++it) + { + if (mUrlEntryAgentMention->isAgentID(it->str())) + { + return true; + } + } + } + catch (boost::regex_error&) + { + LL_INFOS() << "Regex error for: " << text << LL_ENDL; + } + return false; +} diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h index b9502f4592..592e422487 100644 --- a/indra/llui/llurlregistry.h +++ b/indra/llui/llurlregistry.h @@ -92,6 +92,8 @@ public: // Set handler for url registry to be capable of parsing and populating keybindings void setKeybindingHandler(LLKeyBindingToStringHandler* handler); + bool containsAgentMention(const std::string& text); + private: std::vector mUrlEntry; LLUrlEntryBase* mUrlEntryTrusted; diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index a1f627c8cc..0e0ab236d6 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -86,7 +86,8 @@ LLConversationViewSession::LLConversationViewSession(const LLConversationViewSes mHasArrow(true), mIsInActiveVoiceChannel(false), mFlashStateOn(false), - mFlashStarted(false) + mFlashStarted(false), + mIsAltFlashColor(false) { mFlashTimer = new LLFlashTimer(); mAreChildrenInited = true; // inventory only @@ -157,7 +158,7 @@ void LLConversationViewSession::destroyView() LLFolderViewFolder::destroyView(); } -void LLConversationViewSession::setFlashState(bool flash_state) +void LLConversationViewSession::setFlashState(bool flash_state, bool alternate_color) { if (flash_state && !mFlashStateOn) { @@ -170,6 +171,7 @@ void LLConversationViewSession::setFlashState(bool flash_state) mFlashStateOn = flash_state; mFlashStarted = false; + mIsAltFlashColor = mFlashStateOn && (alternate_color || mIsAltFlashColor); mFlashTimer->stopFlashing(); } @@ -288,7 +290,8 @@ void LLConversationViewSession::draw() startFlashing(); // draw highlight for selected items - drawHighlight(show_context, true, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor); + static LLUIColor alt_color = LLUIColorTable::instance().getColor("MentionFlashBgColor", DEFAULT_WHITE); + drawHighlight(show_context, true, sHighlightBgColor, mIsAltFlashColor ? alt_color : sFlashBgColor, sFocusOutlineColor, sMouseOverColor); // Draw children if root folder, or any other folder that is open. Do not draw children when animating to closed state or you get rendering overlap. bool draw_children = getRoot() == static_cast(this) || isOpen(); diff --git a/indra/newview/llconversationview.h b/indra/newview/llconversationview.h index 8eb6392121..a6d240ed84 100644 --- a/indra/newview/llconversationview.h +++ b/indra/newview/llconversationview.h @@ -90,7 +90,7 @@ public: virtual void refresh(); - /*virtual*/ void setFlashState(bool flash_state); + /*virtual*/ void setFlashState(bool flash_state, bool alternate_color = false); void setHighlightState(bool hihglight_state); LLFloater* getSessionFloater(); @@ -111,6 +111,7 @@ private: LLFlashTimer* mFlashTimer; bool mFlashStateOn; bool mFlashStarted; + bool mIsAltFlashColor; bool mCollapsedMode; bool mHasArrow; diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index e4b14d8df6..72d4d30dcf 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -2302,14 +2302,14 @@ bool LLFloaterIMContainer::isConversationLoggingAllowed() return gSavedPerAccountSettings.getS32("KeepConversationLogTranscripts") > 0; } -void LLFloaterIMContainer::flashConversationItemWidget(const LLUUID& session_id, bool is_flashes) +void LLFloaterIMContainer::flashConversationItemWidget(const LLUUID& session_id, bool is_flashes, bool alternate_color) { //Finds the conversation line item to flash using the session_id LLConversationViewSession * widget = dynamic_cast(get_ptr_in_map(mConversationsWidgets,session_id)); if (widget) { - widget->setFlashState(is_flashes); + widget->setFlashState(is_flashes, alternate_color); } } diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h index e5486e67da..30eed8be36 100644 --- a/indra/newview/llfloaterimcontainer.h +++ b/indra/newview/llfloaterimcontainer.h @@ -208,7 +208,7 @@ public: void reSelectConversation(); void updateSpeakBtnState(); static bool isConversationLoggingAllowed(); - void flashConversationItemWidget(const LLUUID& session_id, bool is_flashes); + void flashConversationItemWidget(const LLUUID& session_id, bool is_flashes, bool alternate_color = false); void highlightConversationItemWidget(const LLUUID& session_id, bool is_highlighted); bool isScrolledOutOfSight(LLConversationViewSession* conversation_item_widget); boost::signals2::connection mMicroChangedSignal; diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 474b7b66d7..23bba99ed6 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -71,6 +71,7 @@ #include "llviewerregion.h" #include "llcorehttputil.h" #include "lluiusage.h" +#include "llurlregistry.h" #include @@ -197,6 +198,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(session_id); bool store_dnd_message = false; // flag storage of a dnd message bool is_session_focused = session_floater->isTornOff() && session_floater->hasFocus(); + bool contains_mention = LLUrlRegistry::getInstance()->containsAgentMention(msg["message"].asString()); if (!LLFloater::isVisible(im_box) || im_box->isMinimized()) { conversations_floater_status = CLOSED; @@ -323,7 +325,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) if ("openconversations" == user_preferences || ON_TOP == conversations_floater_status || ("toast" == user_preferences && ON_TOP != conversations_floater_status) - || ("flash" == user_preferences && (CLOSED == conversations_floater_status + || (("flash" == user_preferences || contains_mention) && (CLOSED == conversations_floater_status || NOT_ON_TOP == conversations_floater_status)) || is_dnd_msg) { @@ -343,7 +345,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) } else { - im_box->flashConversationItemWidget(session_id, true); + im_box->flashConversationItemWidget(session_id, true, contains_mention); } } } @@ -3269,7 +3271,7 @@ void LLIMMgr::addMessage( { LLFloaterReg::showInstance("im_container"); LLFloaterReg::getTypedInstance("im_container")-> - flashConversationItemWidget(new_session_id, true); + flashConversationItemWidget(new_session_id, true, LLUrlRegistry::getInstance()->containsAgentMention(msg)); } } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index bdcfec34f6..1501ba41c2 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2583,6 +2583,8 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) msg_notify["session_id"] = LLUUID(); msg_notify["from_id"] = chat.mFromID; msg_notify["source_type"] = chat.mSourceType; + // used to check if there is agent mention in the message + msg_notify["message"] = mesg; on_new_message(msg_notify); } diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index f0ada22d66..0c34a3a5fb 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -1009,4 +1009,7 @@ + -- cgit v1.2.3 From d0324be669ac4ec7f63241bbc135d562b600095a Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Thu, 8 May 2025 17:26:39 +0800 Subject: Fix "Too many fragment shader texture samplers" Linux on M1 crash, caused by PBR Terrain. M1 only supports 16 image samplers in the fragment shader (GL_MAX_TEXTURE_IMAGE_UNITS). That's why we need to be able to mask RenderTerrainPBRDetail on Linux too by adding it to an also added TexUnit16orLess list to its feature table, and to the graphic settings lists above it in the file. --- indra/newview/featuretable_linux.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index d8d4f08429..f97ff28062 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -48,6 +48,7 @@ RenderLocalLights 1 1 RenderReflectionDetail 1 4 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTerrainPBRDetail 1 0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderVBOEnable 1 1 @@ -88,6 +89,7 @@ RenderObjectBump 1 0 RenderReflectionDetail 1 0 RenderTerrainDetail 1 0 RenderTerrainLODFactor 1 1 +RenderTerrainPBRDetail 1 -1 RenderTransparentWater 1 0 RenderTreeLODFactor 1 0 RenderVolumeLODFactor 1 1.125 @@ -128,6 +130,7 @@ RenderTerrainDetail 1 0 RenderTerrainLODFactor 1 1 RenderTransparentWater 1 0 RenderTreeLODFactor 1 0 +RenderTerrainPBRDetail 1 -1 RenderVolumeLODFactor 1 1.125 WindLightUseAtmosShaders 1 0 RenderDeferred 1 0 @@ -166,6 +169,7 @@ RenderTerrainLODFactor 1 1.0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.125 +RenderTerrainPBRDetail 1 -1 WindLightUseAtmosShaders 1 0 RenderDeferred 1 0 RenderDeferredSSAO 1 0 @@ -200,6 +204,7 @@ RenderLocalLights 1 1 RenderReflectionDetail 1 0 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTerrainPBRDetail 1 0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.125 @@ -237,6 +242,7 @@ RenderLocalLights 1 1 RenderReflectionDetail 1 0 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTerrainPBRDetail 1 0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.125 @@ -274,6 +280,7 @@ RenderLocalLights 1 1 RenderReflectionDetail 1 0 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTerrainPBRDetail 1 0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.125 @@ -311,6 +318,7 @@ RenderLocalLights 1 1 RenderReflectionDetail 1 0 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTerrainPBRDetail 1 0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderVolumeLODFactor 1 1.125 @@ -347,6 +355,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 4 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTerrainPBRDetail 1 0 RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderVolumeLODFactor 1 2.0 @@ -755,3 +764,5 @@ RenderShaderLightingMaxLevel 1 2 list NVIDIA_GeForce_Go_7900 RenderShaderLightingMaxLevel 1 2 +list TexUnit16orLess +RenderTerrainPBRDetail 1 -1 -- cgit v1.2.3 From 390ba2f4fdc8520192182f97d934c9f20367c6a1 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Thu, 8 May 2025 17:42:54 +0800 Subject: Build Dullahan in Linux aarch64 config stage GCC needs cstdint header inclusion for it to compile. include/cef needs to exist first otherwise configuration would fail. INSTALL_RPATH is needed in try_compile-ing. PROJECT_ARCH needs to be set on aarch64 to avoid -m64 and -march(=x86-64) settings which aren't recognised (and wouldn't be correct) on aarch64. ENABLE_CXX11_ABI needs to be set ON, otherwise it would use C++ 03's ABI and cause a linking failure. Dullahan headers don't seem to be included in the installation upstream, and dullahan_version.h gets generated only at least after Dullahan configuration, hence the 2 files copying. dullahan_host rpath removal is taken out of scope because the Fedora we support isn't only x86-64 now. The reindentations are just to make the uniform with the rest in the file. --- indra/cmake/CEFPlugin.cmake | 68 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 9 deletions(-) diff --git a/indra/cmake/CEFPlugin.cmake b/indra/cmake/CEFPlugin.cmake index 119a41f570..70e6c366a4 100644 --- a/indra/cmake/CEFPlugin.cmake +++ b/indra/cmake/CEFPlugin.cmake @@ -35,16 +35,66 @@ elseif (CMAKE_OSX_ARCHITECTURES MATCHES x86_64) ) file(WRITE ${PREBUILD_TRACKING_DIR}/dullahan_installed "0") endif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/dullahan_installed OR NOT ${dullahan_installed} EQUAL 0) +elseif (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64) + if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/dullahan_installed OR NOT ${dullahan_installed} EQUAL 0) + if (NOT EXISTS ${CMAKE_BINARY_DIR}/v1.14.0-r3.tar.gz) + file(DOWNLOAD + https://github.com/secondlife/dullahan/archive/refs/tags/v1.14.0-r3.tar.gz + ${CMAKE_BINARY_DIR}/v1.14.0-r3.tar.gz + ) + endif () + file(ARCHIVE_EXTRACT + INPUT ${CMAKE_BINARY_DIR}/v1.14.0-r3.tar.gz + DESTINATION ${CMAKE_BINARY_DIR} + ) + execute_process( + COMMAND sed -i "/#include /a #include " dullahan.h + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/dullahan-1.14.0-r3/src + ) + file(MAKE_DIRECTORY ${LIBS_PREBUILT_DIR}/include/cef) + try_compile(DULLAHAN_RESULT + PROJECT dullahan + SOURCE_DIR ${CMAKE_BINARY_DIR}/dullahan-1.14.0-r3 + BINARY_DIR ${CMAKE_BINARY_DIR}/dullahan-1.14.0-r3 + CMAKE_FLAGS + -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + -DCMAKE_OSX_ARCHITECTURES:STRING=${CMAKE_OSX_ARCHITECTURES} + -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${CMAKE_OSX_DEPLOYMENT_TARGET} + -DCMAKE_INSTALL_PREFIX:PATH=${LIBS_PREBUILT_DIR} + -DCMAKE_INSTALL_LIBDIR:PATH=${ARCH_PREBUILT_DIRS_RELEASE} + -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=ON + -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS} + -DUSE_SPOTIFY_CEF:BOOL=ON + -DSPOTIFY_CEF_URL:STRING=https://cef-builds.spotifycdn.com/cef_binary_118.4.1%2Bg3dd6078%2Bchromium-118.0.5993.54_linuxarm64_beta_minimal.tar.bz2 + -DPROJECT_ARCH:STRING=${CMAKE_SYSTEM_PROCESSOR} + -DENABLE_CXX11_ABI:BOOL=ON + ) + if (${DULLAHAN_RESULT}) + execute_process( + COMMAND ${CMAKE_MAKE_PROGRAM} install + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/dullahan-1.14.0-r3 + OUTPUT_VARIABLE dullahan_installed + ) + file( + COPY + ${CMAKE_BINARY_DIR}/dullahan-1.14.0-r3/src/dullahan.h + ${CMAKE_BINARY_DIR}/dullahan-1.14.0-r3/src/dullahan_version.h + DESTINATION ${LIBS_PREBUILT_DIR}/include/cef + ) + file(WRITE ${PREBUILD_TRACKING_DIR}/dullahan_installed "${dullahan_installed}") + endif (${DULLAHAN_RESULT}) + endif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/dullahan_installed OR NOT ${dullahan_installed} EQUAL 0) else (CMAKE_OSX_ARCHITECTURES MATCHES arm64) use_prebuilt_binary(dullahan) - if (${LINUX_DISTRO} MATCHES fedora) - execute_process( - COMMAND patchelf --remove-rpath bin/release/dullahan_host - WORKING_DIRECTORY ${LIBS_PREBUILT_DIR} - ) - endif (${LINUX_DISTRO} MATCHES fedora) endif (CMAKE_OSX_ARCHITECTURES MATCHES arm64) +if (${LINUX_DISTRO} MATCHES fedora) + execute_process( + COMMAND patchelf --remove-rpath bin/release/dullahan_host + WORKING_DIRECTORY ${LIBS_PREBUILT_DIR} + ) +endif (${LINUX_DISTRO} MATCHES fedora) + target_include_directories( ll::cef SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/cef) if (WINDOWS) @@ -73,8 +123,8 @@ elseif (DARWIN) elseif (LINUX) target_link_libraries( ll::cef INTERFACE - libdullahan.a - cef - cef_dll_wrapper.a + libdullahan.a + cef + cef_dll_wrapper.a ) endif (WINDOWS) -- cgit v1.2.3 From 37134720bce619a754ff097aff764d9a44bb0893 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 7 May 2025 22:29:08 +0300 Subject: #3757 Smarter subfolders dragndrop --- indra/newview/llinventorybridge.cpp | 38 ++++++++++++++++++++++++------- indra/newview/llinventoryfunctions.cpp | 41 +++++++++++++++++++++++++++++++++- indra/newview/llinventoryfunctions.h | 3 ++- indra/newview/llinventorygallery.cpp | 19 ++++++++++++---- 4 files changed, 87 insertions(+), 14 deletions(-) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 4018a89c5a..bff7138282 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2664,6 +2664,7 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, // bool is_movable = true; + bool create_outfit = false; if (is_movable && (marketplacelistings_id == cat_id)) { @@ -2708,7 +2709,12 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, tooltip_msg = LLTrans::getString("TooltipOutfitNotInInventory"); is_movable = false; } - else if (can_move_to_my_outfits(model, inv_cat, max_items_to_wear)) + else if (can_move_to_my_outfits_as_outfit(model, inv_cat, max_items_to_wear)) + { + is_movable = true; + create_outfit = true; + } + else if (can_move_to_my_outfits_as_subfolder(model, inv_cat)) { is_movable = true; } @@ -2742,7 +2748,12 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, is_movable = false; tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); } - else if (can_move_to_my_outfits(model, inv_cat, max_items_to_wear)) + else if (can_move_to_my_outfits_as_outfit(model, inv_cat, max_items_to_wear)) + { + is_movable = true; + create_outfit = true; + } + else if (can_move_to_my_outfits_as_subfolder(model, inv_cat)) { is_movable = true; } @@ -2943,7 +2954,7 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, if (mUUID == my_outifts_id) { EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); - if (inv_res == MY_OUTFITS_SUBFOLDER || inv_res == MY_OUTFITS_OUTFIT) + if (inv_res == MY_OUTFITS_SUBFOLDER || inv_res == MY_OUTFITS_OUTFIT || !create_outfit) { LLInvFVBridge::changeCategoryParent( model, @@ -2967,7 +2978,7 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, { case MY_OUTFITS_NO: // Moning from outside outfits into outfits - if (dest_res == MY_OUTFITS_SUBFOLDER) + if (dest_res == MY_OUTFITS_SUBFOLDER && create_outfit) { // turn it into outfit dropToMyOutfitsSubfolder(inv_cat, mUUID, LLFolderType::FT_OUTFIT, cb); @@ -4094,7 +4105,6 @@ void LLFolderBridge::perform_pasteFromClipboard() LLInventoryObject *obj = model->getObject(item_id); if (obj) { - if (move_is_into_lost_and_found) { if (LLAssetType::AT_CATEGORY == obj->getType()) @@ -4111,9 +4121,9 @@ void LLFolderBridge::perform_pasteFromClipboard() } else if (move_is_into_my_outfits && LLAssetType::AT_CATEGORY == obj->getType()) { - LLInventoryCategory* cat = model->getCategory(item_id); + LLViewerInventoryCategory* cat = model->getCategory(item_id); U32 max_items_to_wear = gSavedSettings.getU32("WearFolderLimit"); - if (cat && can_move_to_my_outfits(model, cat, max_items_to_wear)) + if (cat && can_move_to_my_outfits_as_outfit(model, cat, max_items_to_wear)) { if (mUUID == my_outifts_id) { @@ -4133,6 +4143,18 @@ void LLFolderBridge::perform_pasteFromClipboard() } } } + else if (cat && can_move_to_my_outfits_as_subfolder(model, cat)) + { + if (LLClipboard::instance().isCutMode()) + { + changeCategoryParent(model, cat, parent_id, false); + if (cb) cb->fire(item_id); + } + else + { + copy_inventory_category(model, cat, parent_id); + } + } else { LLNotificationsUtil::add("MyOutfitsPasteFailed"); @@ -4181,7 +4203,7 @@ void LLFolderBridge::perform_pasteFromClipboard() // move_inventory_item() is not enough, as we have to update inventory locally too if (LLAssetType::AT_CATEGORY == obj->getType()) { - LLViewerInventoryCategory* vicat = (LLViewerInventoryCategory *) model->getCategory(item_id); + LLViewerInventoryCategory* vicat = model->getCategory(item_id); llassert(vicat); if (vicat) { diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 7fff88fba7..9967318e92 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -2314,7 +2314,7 @@ bool can_move_to_landmarks(LLInventoryItem* inv_item) } // Returns true if folder's content can be moved to Current Outfit or any outfit folder. -bool can_move_to_my_outfits(LLInventoryModel* model, LLInventoryCategory* inv_cat, U32 wear_limit) +bool can_move_to_my_outfits_as_outfit(LLInventoryModel* model, LLInventoryCategory* inv_cat, U32 wear_limit) { LLInventoryModel::cat_array_t *cats; LLInventoryModel::item_array_t *items; @@ -2353,6 +2353,45 @@ bool can_move_to_my_outfits(LLInventoryModel* model, LLInventoryCategory* inv_ca return true; } +bool can_move_to_my_outfits_as_subfolder(LLInventoryModel* model, LLInventoryCategory* inv_cat, S32 depth) +{ + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + model->getDirectDescendentsOf(inv_cat->getUUID(), cats, items); + + if (items->size() > 0) + { + // subfolders don't allow items + return false; + } + + constexpr size_t MAX_CONTENT = 255; + if (cats->size() > MAX_CONTENT) + { + // don't allow massive folders + return false; + } + + for (LLPointer& cat : *cats) + { + // outfits are valid to move, check non-outfit folders + if (cat->getPreferredType() != LLFolderType::FT_OUTFIT) + { + if (depth == 3) + { + // don't allow massive folders + return false; + } + if (!can_move_to_my_outfits_as_subfolder(model, cat, depth + 1)) + { + return false; + } + } + } + + return true; +} + std::string get_localized_folder_name(LLUUID cat_uuid) { std::string localized_root_name; diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index 0ab045f2a0..f56413bf5d 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -112,7 +112,8 @@ std::string get_category_path(LLUUID cat_id); bool can_move_to_outfit(LLInventoryItem* inv_item, bool move_is_into_current_outfit); bool can_move_to_landmarks(LLInventoryItem* inv_item); -bool can_move_to_my_outfits(LLInventoryModel* model, LLInventoryCategory* inv_cat, U32 wear_limit); +bool can_move_to_my_outfits_as_outfit(LLInventoryModel* model, LLInventoryCategory* inv_cat, U32 wear_limit); +bool can_move_to_my_outfits_as_subfolder(LLInventoryModel* model, LLInventoryCategory* inv_cat, S32 depth = 0); std::string get_localized_folder_name(LLUUID cat_uuid); void new_folder_window(const LLUUID& folder_id); void ungroup_folder_items(const LLUUID& folder_id); diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index eb47af85fd..3222dff1b2 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -3714,6 +3714,7 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, // bool is_movable = true; + bool create_outfit = false; if (is_movable && (marketplacelistings_id == cat_id)) { @@ -3759,7 +3760,12 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, tooltip_msg = LLTrans::getString("TooltipOutfitNotInInventory"); is_movable = false; } - else if (can_move_to_my_outfits(model, inv_cat, max_items_to_wear)) + else if (can_move_to_my_outfits_as_outfit(model, inv_cat, max_items_to_wear)) + { + is_movable = true; + create_outfit = true; + } + else if (can_move_to_my_outfits_as_subfolder(model, inv_cat)) { is_movable = true; } @@ -3793,7 +3799,12 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, is_movable = false; tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); } - else if (can_move_to_my_outfits(model, inv_cat, max_items_to_wear)) + else if (can_move_to_my_outfits_as_outfit(model, inv_cat, max_items_to_wear)) + { + is_movable = true; + create_outfit = true; + } + else if (can_move_to_my_outfits_as_subfolder(model, inv_cat)) { is_movable = true; } @@ -3928,7 +3939,7 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, if (dest_id == my_outifts_id) { EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); - if (inv_res == MY_OUTFITS_SUBFOLDER || inv_res == MY_OUTFITS_OUTFIT) + if (inv_res == MY_OUTFITS_SUBFOLDER || inv_res == MY_OUTFITS_OUTFIT || !create_outfit) { gInventory.changeCategoryParent( (LLViewerInventoryCategory*)inv_cat, @@ -3950,7 +3961,7 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, { case MY_OUTFITS_NO: // Moning from outside outfits into outfits - if (dest_res == MY_OUTFITS_SUBFOLDER) + if (dest_res == MY_OUTFITS_SUBFOLDER && create_outfit) { // turn it into outfit dropToMyOutfitsSubfolder(inv_cat, dest_id, LLFolderType::FT_OUTFIT); -- cgit v1.2.3 From 377d1b3813077619fc795f54f93b0d478cf03cbd Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Thu, 8 May 2025 19:35:19 +0300 Subject: #4010 Add audio ping for chat mentions --- indra/newview/app_settings/settings.xml | 33 ++++++++++++++++++++++ indra/newview/llimview.cpp | 19 +++++++++---- indra/newview/llvieweraudio.cpp | 1 + .../default/xui/en/panel_preferences_chat.xml | 25 ++++++++++------ 4 files changed, 65 insertions(+), 13 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 1025c9299d..61d2013224 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -6361,6 +6361,17 @@ Value 0 + PlaySoundChatMention + + Comment + Plays a sound when got mentioned in a chat + Persist + 1 + Type + Boolean + Value + 0 + PluginAttachDebuggerToPlugins Comment @@ -12395,6 +12406,28 @@ Value 2ca849ba-2885-4bc3-90ef-d4987a5b983a + UISndChatMention + + Comment + Sound file for chat mention(uuid for sound asset) + Persist + 1 + Type + String + Value + 03e77cb5-592c-5b33-d271-2e46497c3fb3 + + UISndChatPing + + Comment + Sound file for chat ping(uuid for sound asset) + Persist + 1 + Type + String + Value + 7dd36df6-2624-5438-f988-fdf8588a0ad9 + UISndClick Comment diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 23bba99ed6..6f085adcbd 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -199,6 +199,8 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) bool store_dnd_message = false; // flag storage of a dnd message bool is_session_focused = session_floater->isTornOff() && session_floater->hasFocus(); bool contains_mention = LLUrlRegistry::getInstance()->containsAgentMention(msg["message"].asString()); + static LLCachedControl play_snd_mention_pref(gSavedSettings, "PlaySoundChatMention", false); + bool play_snd_mention = contains_mention && play_snd_mention_pref && (msg["source_type"].asInteger() != CHAT_SOURCE_OBJECT); if (!LLFloater::isVisible(im_box) || im_box->isMinimized()) { conversations_floater_status = CLOSED; @@ -232,7 +234,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) else { user_preferences = gSavedSettings.getString("NotificationNearbyChatOptions"); - if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNearbyChatIM"))) + if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNearbyChatIM")) && !play_snd_mention) { make_ui_sound("UISndNewIncomingIMSession"); } @@ -243,7 +245,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) if (LLAvatarTracker::instance().isBuddy(participant_id)) { user_preferences = gSavedSettings.getString("NotificationFriendIMOptions"); - if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundFriendIM"))) + if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundFriendIM")) && !play_snd_mention) { make_ui_sound("UISndNewIncomingIMSession"); } @@ -251,7 +253,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) else { user_preferences = gSavedSettings.getString("NotificationNonFriendIMOptions"); - if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNonFriendIM"))) + if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNonFriendIM")) && !play_snd_mention) { make_ui_sound("UISndNewIncomingIMSession"); } @@ -260,7 +262,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) else if (session->isAdHocSessionType()) { user_preferences = gSavedSettings.getString("NotificationConferenceIMOptions"); - if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundConferenceIM"))) + if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundConferenceIM")) && !play_snd_mention) { make_ui_sound("UISndNewIncomingIMSession"); } @@ -268,11 +270,18 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) else if(session->isGroupSessionType()) { user_preferences = gSavedSettings.getString("NotificationGroupChatOptions"); - if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundGroupChatIM"))) + if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundGroupChatIM")) && !play_snd_mention) { make_ui_sound("UISndNewIncomingIMSession"); } } + if (play_snd_mention) + { + if (!gAgent.isDoNotDisturb()) + { + make_ui_sound("UISndChatMention"); + } + } // actions: diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index 404297c58f..aa0cbac91f 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -390,6 +390,7 @@ void init_audio() gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowClose"))); gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowOpen"))); gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndRestart"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndChatMention"))); } audio_update_volume(true); diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index 88716c7f96..0aa1af7de6 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -409,7 +409,7 @@ layout="topleft" left="0" name="play_sound" - width="100" + width="90" top_pad="8" visible="true"> Play sound: @@ -419,10 +419,10 @@ height="16" label="New conversation" layout="topleft" - left_pad="15" + left_pad="5" top_pad="-10" name="new_conversation" - width="150" /> + width="130" /> + width="130" /> + width="130" /> + width="130" /> + -- cgit v1.2.3 From 9668d2f0eff761f1de71cea718a46e807f9c00a8 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Fri, 9 May 2025 18:46:56 +0300 Subject: #3758 do not reopen avatar picker floater --- indra/llui/llchatmentionhelper.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/indra/llui/llchatmentionhelper.cpp b/indra/llui/llchatmentionhelper.cpp index f7769b2cbe..5745389a58 100644 --- a/indra/llui/llchatmentionhelper.cpp +++ b/indra/llui/llchatmentionhelper.cpp @@ -98,7 +98,14 @@ void LLChatMentionHelper::showHelper(LLUICtrl* host_ctrl, S32 local_x, S32 local LLRect rect = av_picker_floater->getRect(); rect.setLeftTopAndSize(floater_x, floater_y + rect.getHeight(), rect.getWidth(), rect.getHeight()); av_picker_floater->setRect(rect); - av_picker_floater->openFloater(LLSD().with("av_name", av_name)); + if (av_picker_floater->isShown()) + { + av_picker_floater->onOpen(LLSD().with("av_name", av_name)); + } + else + { + av_picker_floater->openFloater(LLSD().with("av_name", av_name)); + } } void LLChatMentionHelper::hideHelper(const LLUICtrl* ctrl) -- cgit v1.2.3 From edb0032c95de23170521f33fea273a2844665b0a Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 8 May 2025 22:00:16 +0300 Subject: #3542 Microphone doesn't switch after plugging in an audio device --- indra/llwebrtc/llwebrtc.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/llwebrtc/llwebrtc.cpp b/indra/llwebrtc/llwebrtc.cpp index 0daa767766..a306600f85 100644 --- a/indra/llwebrtc/llwebrtc.cpp +++ b/indra/llwebrtc/llwebrtc.cpp @@ -430,9 +430,7 @@ void ll_set_device_module_capture_device(rtc::scoped_refptrSetRecordingDevice(device + 1); #endif - device_module->SetStereoRecording(false); device_module->InitMicrophone(); - device_module->InitRecording(); } void LLWebRTCImpl::setCaptureDevice(const std::string &id) @@ -473,6 +471,8 @@ void LLWebRTCImpl::setCaptureDevice(const std::string &id) ll_set_device_module_capture_device(mPeerDeviceModule, recordingDevice); if (recording) { + mPeerDeviceModule->SetStereoRecording(false); + mPeerDeviceModule->InitRecording(); mPeerDeviceModule->StartRecording(); } }); @@ -494,9 +494,7 @@ void ll_set_device_module_render_device(rtc::scoped_refptrSetPlayoutDevice(device + 1); #endif - device_module->SetStereoPlayout(true); device_module->InitSpeaker(); - device_module->InitPlayout(); } void LLWebRTCImpl::setRenderDevice(const std::string &id) @@ -540,6 +538,8 @@ void LLWebRTCImpl::setRenderDevice(const std::string &id) ll_set_device_module_render_device(mPeerDeviceModule, playoutDevice); if (playing) { + mPeerDeviceModule->SetStereoPlayout(true); + mPeerDeviceModule->InitPlayout(); mPeerDeviceModule->StartPlayout(); } }); -- cgit v1.2.3 From 872fd15cafc4f35214b44fbc187e413872bd4595 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Sat, 10 May 2025 10:10:42 +0300 Subject: #4056 Crash at childGetSelectionInterface in model importer --- indra/newview/llmodelpreview.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index 5a8fd299bf..0dbfa50769 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -2498,6 +2498,8 @@ void LLModelPreview::updateStatusMessages() S32 phys_tris = 0; S32 phys_hulls = 0; S32 phys_points = 0; + S32 which_mode = 0; + S32 file_mode = 1; //get the triangle count for the whole scene for (LLModelLoader::scene::iterator iter = mScene[LLModel::LOD_PHYSICS].begin(), endIter = mScene[LLModel::LOD_PHYSICS].end(); iter != endIter; ++iter) @@ -2619,18 +2621,16 @@ void LLModelPreview::updateStatusMessages() fmp->childEnable("simplify_cancel"); fmp->childEnable("decompose_cancel"); } - } - - LLCtrlSelectionInterface* iface = fmp->childGetSelectionInterface("physics_lod_combo"); - S32 which_mode = 0; - S32 file_mode = 1; - if (iface) - { - which_mode = iface->getFirstSelectedIndex(); - file_mode = iface->getItemCount() - 1; + LLCtrlSelectionInterface* iface = fmp->childGetSelectionInterface("physics_lod_combo"); + if (iface) + { + which_mode = iface->getFirstSelectedIndex(); + file_mode = iface->getItemCount() - 1; + } } + if (which_mode == file_mode) { mFMP->childEnable("physics_file"); -- cgit v1.2.3 From 49567c97fd8416b9130b3af52055cf973d9aa894 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sat, 31 Aug 2024 01:33:27 +0200 Subject: Minimal code needed to add RLVa with an on/off toggle --- indra/newview/CMakeLists.txt | 7 ++++ indra/newview/app_settings/settings.xml | 11 ++++++ indra/newview/llappviewer.cpp | 7 ++++ indra/newview/llstartup.cpp | 3 ++ indra/newview/rlvactions.cpp | 15 ++++++++ indra/newview/rlvactions.h | 19 ++++++++++ indra/newview/rlvcommon.cpp | 40 ++++++++++++++++++++ indra/newview/rlvcommon.h | 16 ++++++++ indra/newview/rlvdefines.h | 51 ++++++++++++++++++++++++++ indra/newview/rlvhandler.cpp | 40 ++++++++++++++++++++ indra/newview/rlvhandler.h | 25 +++++++++++++ indra/newview/skins/default/xui/en/strings.xml | 1 + 12 files changed, 235 insertions(+) create mode 100644 indra/newview/rlvactions.cpp create mode 100644 indra/newview/rlvactions.h create mode 100644 indra/newview/rlvcommon.cpp create mode 100644 indra/newview/rlvcommon.h create mode 100644 indra/newview/rlvdefines.h create mode 100644 indra/newview/rlvhandler.cpp create mode 100644 indra/newview/rlvhandler.h diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index b6100c05bc..7762dd4d03 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -742,6 +742,9 @@ set(viewer_SOURCE_FILES llxmlrpctransaction.cpp noise.cpp pipeline.cpp + rlvactions.cpp + rlvcommon.cpp + rlvhandler.cpp ) if (CMAKE_SYSTEM_NAME MATCHES FreeBSD) @@ -1410,6 +1413,10 @@ set(viewer_HEADER_FILES llxmlrpctransaction.h noise.h pipeline.h + rlvdefines.h + rlvactions.h + rlvcommon.h + rlvhandler.h roles_constants.h VertexCache.h VorbisFramework.h diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f8487c020e..c33f23585f 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -10063,6 +10063,17 @@ Value https://megapahit.com/enter_bug.cgi?product=Viewer + RestrainedLove + + Comment + Toggles RLVa features (requires restart) + Persist + 1 + Type + Boolean + Value + 1 + RevokePermsOnStopAnimation Comment diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index c5190fe486..bbba964604 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -255,6 +255,9 @@ using namespace LL; #include "llviewereventrecorder.h" #include +#include "rlvactions.h" +#include "rlvcommon.h" +#include "rlvhandler.h" // *FIX: These extern globals should be cleaned up. // The globals either represent state/config/resource-storage of either @@ -1710,6 +1713,9 @@ bool LLAppViewer::cleanup() //ditch LLVOAvatarSelf instance gAgentAvatarp = NULL; + // Sanity check to catch cases where someone forgot to do an RlvActions::isRlvEnabled() check + LL_ERRS_IF(!RlvHandler::isEnabled() && RlvHandler::instanceExists()) << "RLV handler instance exists even though RLVa is disabled" << LL_ENDL; + LLNotifications::instance().clear(); // workaround for DEV-35406 crash on shutdown @@ -3371,6 +3377,7 @@ LLSD LLAppViewer::getViewerInfo() const } #endif + info["RLV_VERSION"] = RlvActions::isRlvEnabled() ? RlvStrings::getVersionAbout() : "(disabled)"; info["OPENGL_VERSION"] = ll_safe_string((const char*)(glGetString(GL_VERSION))); // Settings diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 9a26ebc5f9..29ae386618 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -209,6 +209,7 @@ #include "threadpool.h" #include "llperfstats.h" +#include "rlvhandler.h" #if LL_WINDOWS #include "lldxhardware.h" @@ -934,6 +935,8 @@ bool idle_startup() return false; } + RlvHandler::setEnabled(gSavedSettings.get(Rlv::Settings::Main)); + // reset the values that could have come in from a slurl // DEV-42215: Make sure they're not empty -- gUserCredential // might already have been set from gSavedSettings, and it's too bad diff --git a/indra/newview/rlvactions.cpp b/indra/newview/rlvactions.cpp new file mode 100644 index 0000000000..1988c99ecf --- /dev/null +++ b/indra/newview/rlvactions.cpp @@ -0,0 +1,15 @@ +#include "llviewerprecompiledheaders.h" + +#include "rlvactions.h" +#include "rlvhandler.h" + +// ============================================================================ +// Helper functions +// + +bool RlvActions::isRlvEnabled() +{ + return RlvHandler::isEnabled(); +} + +// ============================================================================ diff --git a/indra/newview/rlvactions.h b/indra/newview/rlvactions.h new file mode 100644 index 0000000000..ac4fc73339 --- /dev/null +++ b/indra/newview/rlvactions.h @@ -0,0 +1,19 @@ +#pragma once + +// ============================================================================ +// RlvActions - developer-friendly non-RLVa code facing class, use in lieu of RlvHandler whenever possible +// + +class RlvActions +{ + // ================ + // Helper functions + // ================ +public: + /* + * Convenience function to check if RLVa is enabled without having to include rlvhandler.h + */ + static bool isRlvEnabled(); +}; + +// ============================================================================ diff --git a/indra/newview/rlvcommon.cpp b/indra/newview/rlvcommon.cpp new file mode 100644 index 0000000000..f641d56a85 --- /dev/null +++ b/indra/newview/rlvcommon.cpp @@ -0,0 +1,40 @@ +#include "llviewerprecompiledheaders.h" +#include "llversioninfo.h" + +#include "rlvdefines.h" +#include "rlvcommon.h" + +using namespace Rlv; + +// ============================================================================ +// RlvStrings +// + +std::string RlvStrings::getVersion(bool wants_legacy) +{ + return llformat("%s viewer v%d.%d.%d (RLVa %d.%d.%d)", + !wants_legacy ? "RestrainedLove" : "RestrainedLife", + SpecVersion::Major, SpecVersion::Minor, SpecVersion::Patch, + ImplVersion::Major, ImplVersion::Minor, ImplVersion::Patch); +} + +std::string RlvStrings::getVersionAbout() +{ + return llformat("RLV v%d.%d.%d / RLVa v%d.%d.%d.%d", + SpecVersion::Major, SpecVersion::Minor, SpecVersion::Patch, + ImplVersion::Major, ImplVersion::Minor, ImplVersion::Patch, LLVersionInfo::instance().getBuild()); +} + +std::string RlvStrings::getVersionNum() +{ + return llformat("%d%02d%02d%02d", + SpecVersion::Major, SpecVersion::Minor, SpecVersion::Patch, SpecVersion::Build); +} + +std::string RlvStrings::getVersionImplNum() +{ + return llformat("%d%02d%02d%02d", + ImplVersion::Major, ImplVersion::Minor, ImplVersion::Patch, ImplVersion::ImplId); +} + +// ============================================================================ diff --git a/indra/newview/rlvcommon.h b/indra/newview/rlvcommon.h new file mode 100644 index 0000000000..288d48e373 --- /dev/null +++ b/indra/newview/rlvcommon.h @@ -0,0 +1,16 @@ +#pragma once + +// ============================================================================ +// RlvStrings +// + +class RlvStrings +{ +public: + static std::string getVersion(bool wants_legacy); + static std::string getVersionAbout(); + static std::string getVersionImplNum(); + static std::string getVersionNum(); +}; + +// ============================================================================ diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h new file mode 100644 index 0000000000..dc1e58f47c --- /dev/null +++ b/indra/newview/rlvdefines.h @@ -0,0 +1,51 @@ +#pragma once + +// ============================================================================ +// Defines +// + +namespace Rlv +{ + // Version of the specification we report + struct SpecVersion { + static constexpr S32 Major = 4; + static constexpr S32 Minor = 0; + static constexpr S32 Patch = 0; + static constexpr S32 Build = 0; + }; + + // RLVa implementation version + struct ImplVersion { + static constexpr S32 Major = 3; + static constexpr S32 Minor = 0; + static constexpr S32 Patch = 0; + static constexpr S32 ImplId = 2; /* Official viewer */ + }; +} + +// Defining these makes it easier if we ever need to change our tag +#define RLV_WARNS LL_WARNS("RLV") +#define RLV_INFOS LL_INFOS("RLV") +#define RLV_DEBUGS LL_DEBUGS("RLV") +#define RLV_ENDL LL_ENDL + +// ============================================================================ +// Settings +// + +namespace Rlv +{ + namespace Settings + { + constexpr char Main[] = "RestrainedLove"; + constexpr char Debug[] = "RestrainedLoveDebug"; + + constexpr char DebugHideUnsetDup[] = "RLVaDebugHideUnsetDuplicate"; + constexpr char EnableIMQuery[] = "RLVaEnableIMQuery"; + constexpr char EnableTempAttach[] = "RLVaEnableTemporaryAttachments"; + constexpr char TopLevelMenu[] = "RLVaTopLevelMenu"; + }; + +}; + +// ============================================================================ diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp new file mode 100644 index 0000000000..3315ed1999 --- /dev/null +++ b/indra/newview/rlvhandler.cpp @@ -0,0 +1,40 @@ +#include "llviewerprecompiledheaders.h" +#include "llappviewer.h" +#include "llstartup.h" + +#include "rlvdefines.h" +#include "rlvcommon.h" +#include "rlvhandler.h" + +using namespace Rlv; + +// ============================================================================ +// Static variable initialization +// + +bool RlvHandler::mIsEnabled = false; + +// ============================================================================ +// Initialization helper functions +// + +bool RlvHandler::canEnable() +{ + return LLStartUp::getStartupState() <= STATE_LOGIN_CLEANUP; +} + +bool RlvHandler::setEnabled(bool enable) +{ + if (mIsEnabled == enable) + return enable; + + if (enable && canEnable()) + { + RLV_INFOS << "Enabling Restrained Love API support - " << RlvStrings::getVersionAbout() << RLV_ENDL; + mIsEnabled = true; + } + + return mIsEnabled; +} + +// ============================================================================ diff --git a/indra/newview/rlvhandler.h b/indra/newview/rlvhandler.h new file mode 100644 index 0000000000..0d4cbe98fb --- /dev/null +++ b/indra/newview/rlvhandler.h @@ -0,0 +1,25 @@ +#pragma once + +#include "llsingleton.h" + +#include "rlvdefines.h" + +// ============================================================================ +// RlvHandler class +// + +class RlvHandler : public LLSingleton +{ + LLSINGLETON_EMPTY_CTOR(RlvHandler); + +public: + // Initialization (deliberately static so they can safely be called in tight loops) + static bool canEnable(); + static bool isEnabled() { return mIsEnabled; } + static bool setEnabled(bool enable); + +private: + static bool mIsEnabled; +}; + +// ============================================================================ diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 44da9a8dac..afaa126c9c 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -60,6 +60,7 @@ Disk cache: [DISK_CACHE_INFO] HiDPI display mode: [HIDPI] +RestrainedLove API: [RLV_VERSION] J2C Decoder Version: [J2C_VERSION] Audio Driver Version: [AUDIO_DRIVER_VERSION] [LIBCEF_VERSION] -- cgit v1.2.3 From 3558444264ce3dce900f75156033bcf3956360b7 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 1 Sep 2024 01:21:00 +0200 Subject: Add owner say chat hook --- indra/newview/CMakeLists.txt | 2 + indra/newview/app_settings/settings.xml | 44 ++++++++ indra/newview/llviewermessage.cpp | 28 ++++- indra/newview/rlvdefines.h | 62 +++++++++++ indra/newview/rlvhandler.cpp | 44 +++++++- indra/newview/rlvhandler.h | 11 ++ indra/newview/rlvhelper.cpp | 136 +++++++++++++++++++++++++ indra/newview/rlvhelper.h | 24 +++++ indra/newview/skins/default/xui/en/strings.xml | 21 ++++ 9 files changed, 367 insertions(+), 5 deletions(-) create mode 100644 indra/newview/rlvhelper.cpp create mode 100644 indra/newview/rlvhelper.h diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 7762dd4d03..7d0848139b 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -744,6 +744,7 @@ set(viewer_SOURCE_FILES pipeline.cpp rlvactions.cpp rlvcommon.cpp + rlvhelper.cpp rlvhandler.cpp ) @@ -1416,6 +1417,7 @@ set(viewer_HEADER_FILES rlvdefines.h rlvactions.h rlvcommon.h + rlvhelper.h rlvhandler.h roles_constants.h VertexCache.h diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c33f23585f..29954d8c28 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -10072,6 +10072,50 @@ Type Boolean Value + 0 + + RestrainedLoveDebug + + Comment + Toggles RLVa debug mode (displays the commands when in debug mode) + Persist + 1 + Type + Boolean + Value + 0 + + RLVaBlockedExperiences + + Comment + List of experiences blocked from interacting with RLVa + Persist + 1 + Type + String + Value + bfe25fb4-222c-11e5-85a2-fa4c4ccaa202 + + RLVaDebugHideUnsetDuplicate + + Comment + Suppresses reporting "unset" or "duplicate" command restrictions when RestrainedLoveDebug is TRUE + Persist + 1 + Type + Boolean + Value + 0 + + RLVaEnableTemporaryAttachments + + Comment + Allows temporary attachments (regardless of origin) to issue RLV commands + Persist + 1 + Type + Boolean + Value 1 RevokePermsOnStopAnimation diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 5fd820f91d..4cd2622460 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -118,6 +118,8 @@ #include "llpanelplaceprofile.h" #include "llviewerregion.h" #include "llfloaterregionrestarting.h" +#include "rlvactions.h" +#include "rlvhandler.h" #include "llnotificationmanager.h" // #include "llexperiencecache.h" @@ -2382,15 +2384,16 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) } bool is_audible = (CHAT_AUDIBLE_FULLY == chat.mAudible); + bool show_script_chat_particles = chat.mSourceType == CHAT_SOURCE_OBJECT + && chat.mChatType != CHAT_TYPE_DEBUG_MSG + && gSavedSettings.getBOOL("EffectScriptChatParticles"); chatter = gObjectList.findObject(from_id); if (chatter) { chat.mPosAgent = chatter->getPositionAgent(); // Make swirly things only for talking objects. (not script debug messages, though) - if (chat.mSourceType == CHAT_SOURCE_OBJECT - && chat.mChatType != CHAT_TYPE_DEBUG_MSG - && gSavedSettings.getBOOL("EffectScriptChatParticles") ) + if (show_script_chat_particles && (!RlvActions::isRlvEnabled() || CHAT_TYPE_OWNER != chat.mChatType) ) { LLPointer psc = new LLViewerPartSourceChat(chatter->getPositionAgent()); psc->setSourceObject(chatter); @@ -2470,8 +2473,25 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) case CHAT_TYPE_WHISPER: chat.mText = LLTrans::getString("whisper") + " "; break; - case CHAT_TYPE_DEBUG_MSG: case CHAT_TYPE_OWNER: + if (RlvActions::isRlvEnabled()) + { + if (RlvHandler::instance().handleSimulatorChat(mesg, chat, chatter)) + { + break; + } + else if (show_script_chat_particles) + { + LLPointer psc = new LLViewerPartSourceChat(chatter->getPositionAgent()); + psc->setSourceObject(chatter); + psc->setColor(color); + //We set the particles to be owned by the object's owner, + //just in case they should be muted by the mute list + psc->setOwnerUUID(owner_id); + LLViewerPartSim::getInstance()->addPartSource(psc); + } + } + case CHAT_TYPE_DEBUG_MSG: case CHAT_TYPE_NORMAL: case CHAT_TYPE_DIRECT: break; diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index dc1e58f47c..6ba2afbc69 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -29,6 +29,68 @@ namespace Rlv #define RLV_DEBUGS LL_DEBUGS("RLV") #define RLV_ENDL LL_ENDL +#define RLV_RELEASE +#if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG + // Make sure we halt execution on errors + #define RLV_ERRS LL_ERRS("RLV") + // Keep our asserts separate from LL's + #define RLV_ASSERT(f) if (!(f)) { RLV_ERRS << "ASSERT (" << #f << ")" << RLV_ENDL; } + #define RLV_ASSERT_DBG(f) RLV_ASSERT(f) +#else + // We don't want to check assertions in release builds + #ifndef RLV_RELEASE + #define RLV_ASSERT(f) RLV_VERIFY(f) + #define RLV_ASSERT_DBG(f) + #else + #define RLV_ASSERT(f) + #define RLV_ASSERT_DBG(f) + #endif // RLV_RELEASE +#endif // LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG + +namespace Rlv +{ + namespace Constants + { + constexpr char CmdPrefix = '@'; + } +} + +// ============================================================================ +// Enumeration declarations +// + +namespace Rlv +{ + enum class ECmdRet{ + Unknown = 0x0000, // Unknown error (should only be used internally) + Retained, // Command was retained + Success = 0x0100, // Command executed successfully + SuccessUnset, // Command executed successfully (RLV_TYPE_REMOVE for an unrestricted behaviour) + SuccessDuplicate, // Command executed successfully (RLV_TYPE_ADD for an already restricted behaviour) + SuccessDeprecated, // Command executed successfully but has been marked as deprecated + SuccessDelayed, // Command parsed valid but will execute at a later time + Failed = 0x0200, // Command failed (general failure) + FailedSyntax, // Command failed (syntax error) + FailedOption, // Command failed (invalid option) + FailedParam, // Command failed (invalid param) + FailedLock, // Command failed (command is locked by another object) + FailedDisabled, // Command failed (command disabled by user) + FailedUnknown, // Command failed (unknown command) + FailedNoSharedRoot, // Command failed (missing #RLV) + FailedDeprecated, // Command failed (deprecated and no longer supported) + FailedNoBehaviour, // Command failed (force modifier on an object with no active restrictions) + FailedUnheldBehaviour, // Command failed (local modifier on an object that doesn't hold the base behaviour) + FailedBlocked, // Command failed (object is blocked) + FailedThrottled, // Command failed (throttled) + FailedNoProcessor // Command doesn't have a template processor define (legacy code) + }; + + constexpr bool isReturnCodeSuccess(ECmdRet eRet) + { + return (static_cast(eRet) & static_cast(ECmdRet::Success)) == static_cast(ECmdRet::Success); + } +} + // ============================================================================ // Settings // diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 3315ed1999..bf78a0a38a 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -1,10 +1,12 @@ #include "llviewerprecompiledheaders.h" #include "llappviewer.h" #include "llstartup.h" +#include "llviewercontrol.h" +#include "llviewerobject.h" -#include "rlvdefines.h" #include "rlvcommon.h" #include "rlvhandler.h" +#include "rlvhelper.h" using namespace Rlv; @@ -14,6 +16,46 @@ using namespace Rlv; bool RlvHandler::mIsEnabled = false; +// ============================================================================ +// Command processing functions +// + +bool RlvHandler::handleSimulatorChat(std::string& message, const LLChat& chat, const LLViewerObject* chatObj) +{ + static LLCachedControl enable_temp_attach(gSavedSettings, Settings::EnableTempAttach); + static LLCachedControl show_debug_output(gSavedSettings, Settings::Debug); + static LLCachedControl hide_unset_dupes(gSavedSettings, Settings::DebugHideUnsetDup); + + if ( message.length() <= 3 || Rlv::Constants::CmdPrefix != message[0] || CHAT_TYPE_OWNER != chat.mChatType || + (chatObj && chatObj->isTempAttachment() && !enable_temp_attach()) ) + { + return false; + } + + message.erase(0, 1); + LLStringUtil::toLower(message); + CommandDbgOut cmdDbgOut(message); + + boost_tokenizer tokens(message, boost::char_separator(",", "", boost::drop_empty_tokens)); + for (const std::string& strCmd : tokens) + { + ECmdRet eRet = (ECmdRet)processCommand(chat.mFromID, strCmd, true); + if ( show_debug_output() && + (!hide_unset_dupes() || (ECmdRet::SuccessUnset != eRet && ECmdRet::SuccessDuplicate != eRet)) ) + { + cmdDbgOut.add(strCmd, eRet); + } + } + + message = cmdDbgOut.get(); + return true; +} + +ECmdRet RlvHandler::processCommand(const LLUUID& idObj, const std::string& strCmd, bool fromObj) +{ + return ECmdRet::FailedNoProcessor; +} + // ============================================================================ // Initialization helper functions // diff --git a/indra/newview/rlvhandler.h b/indra/newview/rlvhandler.h index 0d4cbe98fb..8cf054e98e 100644 --- a/indra/newview/rlvhandler.h +++ b/indra/newview/rlvhandler.h @@ -1,9 +1,12 @@ #pragma once +#include "llchat.h" #include "llsingleton.h" #include "rlvdefines.h" +class LLViewerObject; + // ============================================================================ // RlvHandler class // @@ -13,6 +16,14 @@ class RlvHandler : public LLSingleton LLSINGLETON_EMPTY_CTOR(RlvHandler); public: + /* + * Helper functions + */ +public: + // Command processing helper functions + bool handleSimulatorChat(std::string& message, const LLChat& chat, const LLViewerObject* chatObj); + Rlv::ECmdRet processCommand(const LLUUID& idObj, const std::string& stCmd, bool fromObj); + // Initialization (deliberately static so they can safely be called in tight loops) static bool canEnable(); static bool isEnabled() { return mIsEnabled; } diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp new file mode 100644 index 0000000000..ade2b83dd7 --- /dev/null +++ b/indra/newview/rlvhelper.cpp @@ -0,0 +1,136 @@ +#include "llviewerprecompiledheaders.h" + +#include "lltrans.h" + +#include "rlvhelper.h" + +using namespace Rlv; + +// ========================================================================= +// Various helper classes/timers/functors +// + +namespace Rlv +{ + // =========================================================================== + // CommandDbgOut + // + + void CommandDbgOut::add(std::string strCmd, ECmdRet eRet) + { + ECmdRet resultBucket; + + // Successful and retained commands are added as-is + if (isReturnCodeSuccess(eRet)) + resultBucket = ECmdRet::Success; + else if (ECmdRet::Retained == eRet) + resultBucket = ECmdRet::Retained; + else + { + // Failed commands get the failure reason appended to help troubleshooting + resultBucket = ECmdRet::Failed; + strCmd.append(llformat(" (%s)", getReturnCodeString(eRet).c_str())); + } + + std::string& strResult = mCommandResults[resultBucket]; + if (!strResult.empty()) + strResult.append(", "); + strResult.append(strCmd); + } + + std::string CommandDbgOut::get() const { + std::ostringstream result; + + if (1 == mCommandResults.size()) + { + auto it = mCommandResults.begin(); + result << " " << getDebugVerbFromReturnCode(it->first) << ": @" << it->second;; + } + else if (mCommandResults.size() > 1) + { + auto appendResult = [&](ECmdRet eRet, const std::string& name) + { + auto it = mCommandResults.find(eRet); + if (it == mCommandResults.end()) return; + result << "\n - " << LLTrans::getString(name) << ": @" << it->second; + }; + result << ": @" << mOrigCmd; + appendResult(ECmdRet::Success, "RlvDebugExecuted"); + appendResult(ECmdRet::Failed, "RlvDebugFailed"); + appendResult(ECmdRet::Retained, "RlvDebugRetained"); + } + + return result.str(); + } + + std::string CommandDbgOut::getDebugVerbFromReturnCode(ECmdRet eRet) + { + switch (eRet) + { + case ECmdRet::Success: + return LLTrans::getString("RlvDebugExecuted"); + case ECmdRet::Failed: + return LLTrans::getString("RlvDebugFailed"); + case ECmdRet::Retained: + return LLTrans::getString("RlvDebugRetained"); + default: + RLV_ASSERT(false); + return LLStringUtil::null; + } + } + + std::string CommandDbgOut::getReturnCodeString(ECmdRet eRet) + { + switch (eRet) + { + case ECmdRet::SuccessUnset: + return LLTrans::getString("RlvReturnCodeUnset"); + case ECmdRet::SuccessDuplicate: + return LLTrans::getString("RlvReturnCodeDuplicate"); + case ECmdRet::SuccessDelayed: + return LLTrans::getString("RlvReturnCodeDelayed"); + case ECmdRet::SuccessDeprecated: + return LLTrans::getString("RlvReturnCodeDeprecated"); + case ECmdRet::FailedSyntax: + return LLTrans::getString("RlvReturnCodeSyntax"); + case ECmdRet::FailedOption: + return LLTrans::getString("RlvReturnCodeOption"); + case ECmdRet::FailedParam: + return LLTrans::getString("RlvReturnCodeParam"); + case ECmdRet::FailedLock: + return LLTrans::getString("RlvReturnCodeLock"); + case ECmdRet::FailedDisabled: + return LLTrans::getString("RlvReturnCodeDisabled"); + case ECmdRet::FailedUnknown: + return LLTrans::getString("RlvReturnCodeUnknown"); + case ECmdRet::FailedNoSharedRoot: + return LLTrans::getString("RlvReturnCodeNoSharedRoot"); + case ECmdRet::FailedDeprecated: + return LLTrans::getString("RlvReturnCodeDeprecatedAndDisabled"); + case ECmdRet::FailedNoBehaviour: + return LLTrans::getString("RlvReturnCodeNoBehaviour"); + case ECmdRet::FailedUnheldBehaviour: + return LLTrans::getString("RlvReturnCodeUnheldBehaviour"); + case ECmdRet::FailedBlocked: + return LLTrans::getString("RlvReturnCodeBlocked"); + case ECmdRet::FailedThrottled: + return LLTrans::getString("RlvReturnCodeThrottled"); + case ECmdRet::FailedNoProcessor: + return LLTrans::getString("RlvReturnCodeNoProcessor"); + // The following are identified by the chat verb + case ECmdRet::Retained: + case ECmdRet::Success: + case ECmdRet::Failed: + return LLStringUtil::null; + // The following shouldn't occur + case ECmdRet::Unknown: + default: + RLV_ASSERT(false); + return LLStringUtil::null; + } + } + + // =========================================================================== +} + +// ============================================================================ diff --git a/indra/newview/rlvhelper.h b/indra/newview/rlvhelper.h new file mode 100644 index 0000000000..89bdc709d5 --- /dev/null +++ b/indra/newview/rlvhelper.h @@ -0,0 +1,24 @@ +#pragma once + +#include "rlvdefines.h" + +// ============================================================================ +// Various helper classes/timers/functors +// + +namespace Rlv +{ + struct CommandDbgOut + { + CommandDbgOut(const std::string& orig_cmd) : mOrigCmd(orig_cmd) {} + void add(std::string strCmd, ECmdRet eRet); + std::string get() const; + static std::string getDebugVerbFromReturnCode(ECmdRet eRet); + static std::string getReturnCodeString(ECmdRet eRet); + private: + std::string mOrigCmd; + std::map mCommandResults; + }; +} + +// ============================================================================ diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index afaa126c9c..378846eb5a 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -4400,5 +4400,26 @@ and report the problem. Not available on this platform Now Playing GRID INFO + + executed + failed + retained + unset + duplicate + delayed + deprecated + thingy error + invalid option + invalid param + locked command + disabled command + unknown command + missing #RLV + deprecated and disabled + no active behaviours + base behaviour not held + blocked object + throttled + no command processor found -- cgit v1.2.3 From 838a398036ec96f2fd2149c0560182913e00860b Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Mon, 2 Sep 2024 01:39:17 +0200 Subject: Add basic scaffolding to support reply commands and handle @versionXXX as an illustration --- indra/newview/app_settings/settings.xml | 11 ++ indra/newview/llappviewer.cpp | 2 +- indra/newview/rlvcommon.cpp | 37 ++++- indra/newview/rlvcommon.h | 49 ++++-- indra/newview/rlvdefines.h | 142 +++++++++++------ indra/newview/rlvhandler.cpp | 93 ++++++++++- indra/newview/rlvhandler.h | 8 +- indra/newview/rlvhelper.cpp | 231 ++++++++++++++++++++++++++++ indra/newview/rlvhelper.h | 265 ++++++++++++++++++++++++++++++-- 9 files changed, 757 insertions(+), 81 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 29954d8c28..366afda019 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -10117,6 +10117,17 @@ Boolean Value 1 + + RLVaExperimentalCommands + + Comment + Enables the experimental command set + Persist + 1 + Type + Boolean + Value + 1 RevokePermsOnStopAnimation diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index bbba964604..1c0ad25a9e 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3377,7 +3377,7 @@ LLSD LLAppViewer::getViewerInfo() const } #endif - info["RLV_VERSION"] = RlvActions::isRlvEnabled() ? RlvStrings::getVersionAbout() : "(disabled)"; + info["RLV_VERSION"] = RlvActions::isRlvEnabled() ? Rlv::Strings::getVersionAbout() : "(disabled)"; info["OPENGL_VERSION"] = ll_safe_string((const char*)(glGetString(GL_VERSION))); // Settings diff --git a/indra/newview/rlvcommon.cpp b/indra/newview/rlvcommon.cpp index f641d56a85..898df3af42 100644 --- a/indra/newview/rlvcommon.cpp +++ b/indra/newview/rlvcommon.cpp @@ -1,5 +1,10 @@ #include "llviewerprecompiledheaders.h" +#include "llagent.h" +#include "llchat.h" +#include "lldbstrings.h" #include "llversioninfo.h" +#include "llviewerstats.h" +#include "message.h" #include "rlvdefines.h" #include "rlvcommon.h" @@ -10,7 +15,7 @@ using namespace Rlv; // RlvStrings // -std::string RlvStrings::getVersion(bool wants_legacy) +std::string Strings::getVersion(bool wants_legacy) { return llformat("%s viewer v%d.%d.%d (RLVa %d.%d.%d)", !wants_legacy ? "RestrainedLove" : "RestrainedLife", @@ -18,23 +23,47 @@ std::string RlvStrings::getVersion(bool wants_legacy) ImplVersion::Major, ImplVersion::Minor, ImplVersion::Patch); } -std::string RlvStrings::getVersionAbout() +std::string Strings::getVersionAbout() { return llformat("RLV v%d.%d.%d / RLVa v%d.%d.%d.%d", SpecVersion::Major, SpecVersion::Minor, SpecVersion::Patch, ImplVersion::Major, ImplVersion::Minor, ImplVersion::Patch, LLVersionInfo::instance().getBuild()); } -std::string RlvStrings::getVersionNum() +std::string Strings::getVersionNum() { return llformat("%d%02d%02d%02d", SpecVersion::Major, SpecVersion::Minor, SpecVersion::Patch, SpecVersion::Build); } -std::string RlvStrings::getVersionImplNum() +std::string Strings::getVersionImplNum() { return llformat("%d%02d%02d%02d", ImplVersion::Major, ImplVersion::Minor, ImplVersion::Patch, ImplVersion::ImplId); } // ============================================================================ +// RlvUtil +// + +bool Util::sendChatReply(S32 nChannel, const std::string& strUTF8Text) +{ + if (!isValidReplyChannel(nChannel)) + return false; + + // Copy/paste from send_chat_from_viewer() + gMessageSystem->newMessageFast(_PREHASH_ChatFromViewer); + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gMessageSystem->nextBlockFast(_PREHASH_ChatData); + gMessageSystem->addStringFast(_PREHASH_Message, utf8str_truncate(strUTF8Text, MAX_MSG_STR_LEN)); + gMessageSystem->addU8Fast(_PREHASH_Type, CHAT_TYPE_SHOUT); + gMessageSystem->addS32("Channel", nChannel); + gAgent.sendReliableMessage(); + add(LLStatViewer::CHAT_COUNT, 1); + + return true; +} + +// ============================================================================ diff --git a/indra/newview/rlvcommon.h b/indra/newview/rlvcommon.h index 288d48e373..79ac6e1704 100644 --- a/indra/newview/rlvcommon.h +++ b/indra/newview/rlvcommon.h @@ -1,16 +1,41 @@ #pragma once -// ============================================================================ -// RlvStrings -// - -class RlvStrings +namespace Rlv { -public: - static std::string getVersion(bool wants_legacy); - static std::string getVersionAbout(); - static std::string getVersionImplNum(); - static std::string getVersionNum(); -}; + // ============================================================================ + // RlvStrings + // + + class Strings + { + public: + static std::string getVersion(bool wants_legacy); + static std::string getVersionAbout(); + static std::string getVersionImplNum(); + static std::string getVersionNum(); + }; + + // ============================================================================ + // RlvUtil + // + + namespace Util + { + bool isValidReplyChannel(S32 nChannel, bool isLoopback = false); + bool sendChatReply(S32 nChannel, const std::string& strUTF8Text); + bool sendChatReply(const std::string& strChannel, const std::string& strUTF8Text); + }; + + inline bool Util::isValidReplyChannel(S32 nChannel, bool isLoopback) + { + return (nChannel > (!isLoopback ? 0 : -1)) && (CHAT_CHANNEL_DEBUG != nChannel); + } + + inline bool Util::sendChatReply(const std::string& strChannel, const std::string& strUTF8Text) + { + S32 nChannel; + return LLStringUtil::convertToS32(strChannel, nChannel) ? sendChatReply(nChannel, strUTF8Text) : false; + } -// ============================================================================ + // ============================================================================ +} diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index 6ba2afbc69..0459b59483 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -4,32 +4,14 @@ // Defines // -namespace Rlv -{ - // Version of the specification we report - struct SpecVersion { - static constexpr S32 Major = 4; - static constexpr S32 Minor = 0; - static constexpr S32 Patch = 0; - static constexpr S32 Build = 0; - }; - - // RLVa implementation version - struct ImplVersion { - static constexpr S32 Major = 3; - static constexpr S32 Minor = 0; - static constexpr S32 Patch = 0; - static constexpr S32 ImplId = 2; /* Official viewer */ - }; -} - // Defining these makes it easier if we ever need to change our tag #define RLV_WARNS LL_WARNS("RLV") #define RLV_INFOS LL_INFOS("RLV") #define RLV_DEBUGS LL_DEBUGS("RLV") #define RLV_ENDL LL_ENDL +#define RLV_VERIFY(f) (f) -#define RLV_RELEASE +#define RLV_DEBUG #if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG // Make sure we halt execution on errors #define RLV_ERRS LL_ERRS("RLV") @@ -37,18 +19,36 @@ namespace Rlv #define RLV_ASSERT(f) if (!(f)) { RLV_ERRS << "ASSERT (" << #f << ")" << RLV_ENDL; } #define RLV_ASSERT_DBG(f) RLV_ASSERT(f) #else + // Don't halt execution on errors in release + #define RLV_ERRS LL_WARNS("RLV") // We don't want to check assertions in release builds - #ifndef RLV_RELEASE + #ifdef RLV_DEBUG #define RLV_ASSERT(f) RLV_VERIFY(f) #define RLV_ASSERT_DBG(f) #else #define RLV_ASSERT(f) #define RLV_ASSERT_DBG(f) - #endif // RLV_RELEASE + #endif // RLV_DEBUG #endif // LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG namespace Rlv { + // Version of the specification we report + namespace SpecVersion { + constexpr S32 Major = 4; + constexpr S32 Minor = 0; + constexpr S32 Patch = 0; + constexpr S32 Build = 0; + }; + + // RLVa implementation version + namespace ImplVersion { + constexpr S32 Major = 3; + constexpr S32 Minor = 0; + constexpr S32 Patch = 0; + constexpr S32 ImplId = 13; + }; + namespace Constants { constexpr char CmdPrefix = '@'; @@ -61,33 +61,84 @@ namespace Rlv namespace Rlv { - enum class ECmdRet{ - Unknown = 0x0000, // Unknown error (should only be used internally) - Retained, // Command was retained - Success = 0x0100, // Command executed successfully - SuccessUnset, // Command executed successfully (RLV_TYPE_REMOVE for an unrestricted behaviour) - SuccessDuplicate, // Command executed successfully (RLV_TYPE_ADD for an already restricted behaviour) - SuccessDeprecated, // Command executed successfully but has been marked as deprecated - SuccessDelayed, // Command parsed valid but will execute at a later time - Failed = 0x0200, // Command failed (general failure) - FailedSyntax, // Command failed (syntax error) - FailedOption, // Command failed (invalid option) - FailedParam, // Command failed (invalid param) - FailedLock, // Command failed (command is locked by another object) - FailedDisabled, // Command failed (command disabled by user) - FailedUnknown, // Command failed (unknown command) - FailedNoSharedRoot, // Command failed (missing #RLV) - FailedDeprecated, // Command failed (deprecated and no longer supported) - FailedNoBehaviour, // Command failed (force modifier on an object with no active restrictions) - FailedUnheldBehaviour, // Command failed (local modifier on an object that doesn't hold the base behaviour) - FailedBlocked, // Command failed (object is blocked) - FailedThrottled, // Command failed (throttled) - FailedNoProcessor // Command doesn't have a template processor define (legacy code) + enum class EBehaviour { + Version = 0, + VersionNew, + VersionNum, + + Count, + Unknown, }; + enum class EBehaviourOptionType + { + None, // Behaviour takes no parameters + Exception, // Behaviour requires an exception as a parameter + NoneOrException, // Behaviour takes either no parameters or an exception + }; + + enum class EParamType { + Unknown = 0x00, + Add = 0x01, // == "n"|"add" + Remove = 0x02, // == "y"|"rem" + Force = 0x04, // == "force" + Reply = 0x08, // == + Clear = 0x10, + AddRem = Add | Remove + }; + + enum class ECmdRet { + Unknown = 0x0000, // Unknown error (should only be used internally) + Retained, // Command was retained + Success = 0x0100, // Command executed successfully + SuccessUnset, // Command executed successfully (RLV_TYPE_REMOVE for an unrestricted behaviour) + SuccessDuplicate, // Command executed successfully (RLV_TYPE_ADD for an already restricted behaviour) + SuccessDeprecated, // Command executed successfully but has been marked as deprecated + SuccessDelayed, // Command parsed valid but will execute at a later time + Failed = 0x0200, // Command failed (general failure) + FailedSyntax, // Command failed (syntax error) + FailedOption, // Command failed (invalid option) + FailedParam, // Command failed (invalid param) + FailedLock, // Command failed (command is locked by another object) + FailedDisabled, // Command failed (command disabled by user) + FailedUnknown, // Command failed (unknown command) + FailedNoSharedRoot, // Command failed (missing #RLV) + FailedDeprecated, // Command failed (deprecated and no longer supported) + FailedNoBehaviour, // Command failed (force modifier on an object with no active restrictions) + FailedUnheldBehaviour, // Command failed (local modifier on an object that doesn't hold the base behaviour) + FailedBlocked, // Command failed (object is blocked) + FailedThrottled, // Command failed (throttled) + FailedNoProcessor // Command doesn't have a template processor define (legacy code) + }; + + enum class EExceptionCheck + { + Permissive, // Exception can be set by any object + Strict, // Exception must be set by all objects holding the restriction + Default, // Permissive or strict will be determined by currently enforced restrictions + }; + + // Replace&remove in c++23 + template + constexpr std::enable_if_t && !std::is_convertible_v, std::underlying_type_t> to_underlying(E e) noexcept + { + return static_cast>(e); + } + + template + constexpr std::enable_if_t && !std::is_convertible_v, bool> has_flag(E value, E flag) noexcept + { + return (to_underlying(value) & to_underlying(flag)) != 0; + } + constexpr bool isReturnCodeSuccess(ECmdRet eRet) { - return (static_cast(eRet) & static_cast(ECmdRet::Success)) == static_cast(ECmdRet::Success); + return (to_underlying(eRet) & to_underlying(ECmdRet::Success)) == to_underlying(ECmdRet::Success); + } + + constexpr bool isReturnCodeFailed(ECmdRet eRet) + { + return (to_underlying(eRet) & to_underlying(ECmdRet::Failed)) == to_underlying(ECmdRet::Failed); } } @@ -103,6 +154,7 @@ namespace Rlv constexpr char Debug[] = "RestrainedLoveDebug"; constexpr char DebugHideUnsetDup[] = "RLVaDebugHideUnsetDuplicate"; + constexpr char EnableExperimentalCommands[] = "RLVaExperimentalCommands"; constexpr char EnableIMQuery[] = "RLVaEnableIMQuery"; constexpr char EnableTempAttach[] = "RLVaEnableTemporaryAttachments"; constexpr char TopLevelMenu[] = "RLVaTopLevelMenu"; diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index bf78a0a38a..3d7f73937f 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -1,4 +1,5 @@ #include "llviewerprecompiledheaders.h" +#include "llagent.h" #include "llappviewer.h" #include "llstartup.h" #include "llviewercontrol.h" @@ -22,11 +23,12 @@ bool RlvHandler::mIsEnabled = false; bool RlvHandler::handleSimulatorChat(std::string& message, const LLChat& chat, const LLViewerObject* chatObj) { + // *TODO: There's an edge case for temporary attachments when going from enabled -> disabled with restrictions already in place static LLCachedControl enable_temp_attach(gSavedSettings, Settings::EnableTempAttach); static LLCachedControl show_debug_output(gSavedSettings, Settings::Debug); static LLCachedControl hide_unset_dupes(gSavedSettings, Settings::DebugHideUnsetDup); - if ( message.length() <= 3 || Rlv::Constants::CmdPrefix != message[0] || CHAT_TYPE_OWNER != chat.mChatType || + if ( message.length() <= 3 || Constants::CmdPrefix != message[0] || CHAT_TYPE_OWNER != chat.mChatType || (chatObj && chatObj->isTempAttachment() && !enable_temp_attach()) ) { return false; @@ -39,7 +41,7 @@ bool RlvHandler::handleSimulatorChat(std::string& message, const LLChat& chat, c boost_tokenizer tokens(message, boost::char_separator(",", "", boost::drop_empty_tokens)); for (const std::string& strCmd : tokens) { - ECmdRet eRet = (ECmdRet)processCommand(chat.mFromID, strCmd, true); + ECmdRet eRet = processCommand(chat.mFromID, strCmd, true); if ( show_debug_output() && (!hide_unset_dupes() || (ECmdRet::SuccessUnset != eRet && ECmdRet::SuccessDuplicate != eRet)) ) { @@ -53,7 +55,44 @@ bool RlvHandler::handleSimulatorChat(std::string& message, const LLChat& chat, c ECmdRet RlvHandler::processCommand(const LLUUID& idObj, const std::string& strCmd, bool fromObj) { - return ECmdRet::FailedNoProcessor; + const RlvCommand rlvCmd(idObj, strCmd); + return processCommand(std::ref(rlvCmd), fromObj); +} + +ECmdRet RlvHandler::processCommand(std::reference_wrapper rlvCmd, bool fromObj) +{ + { + const RlvCommand& rlvCmdTmp = rlvCmd; // Reference to the temporary with limited variable scope since we don't want it to leak below + + RLV_DEBUGS << "[" << rlvCmdTmp.getObjectID() << "]: " << rlvCmdTmp.asString() << RLV_ENDL; + if (!rlvCmdTmp.isValid()) + { + RLV_DEBUGS << "\t-> invalid syntax" << RLV_ENDL; + return ECmdRet::FailedSyntax; + } + if (rlvCmdTmp.isBlocked()) + { + RLV_DEBUGS << "\t-> blocked command" << RLV_ENDL; + return ECmdRet::FailedDisabled; + } + } + + ECmdRet eRet = ECmdRet::Unknown; + switch (rlvCmd.get().getParamType()) + { + case EParamType::Reply: + eRet = rlvCmd.get().processCommand(); + break; + case EParamType::Unknown: + default: + eRet = ECmdRet::FailedParam; + break; + } + RLV_ASSERT(ECmdRet::Unknown != eRet); + + RLV_DEBUGS << "\t--> command " << (isReturnCodeSuccess(eRet) ? "succeeded" : "failed") << RLV_ENDL; + + return eRet; } // ============================================================================ @@ -72,7 +111,7 @@ bool RlvHandler::setEnabled(bool enable) if (enable && canEnable()) { - RLV_INFOS << "Enabling Restrained Love API support - " << RlvStrings::getVersionAbout() << RLV_ENDL; + RLV_INFOS << "Enabling Restrained Love API support - " << Strings::getVersionAbout() << RLV_ENDL; mIsEnabled = true; } @@ -80,3 +119,49 @@ bool RlvHandler::setEnabled(bool enable) } // ============================================================================ +// Command handlers (RLV_TYPE_REPLY) +// + +ECmdRet CommandHandlerBaseImpl::processCommand(const RlvCommand& rlvCmd, ReplyHandlerFunc* pHandler) +{ + // Sanity check - should specify a - valid - reply channel + S32 nChannel; + if (!LLStringUtil::convertToS32(rlvCmd.getParam(), nChannel) || !Util::isValidReplyChannel(nChannel, rlvCmd.getObjectID() == gAgent.getID())) + return ECmdRet::FailedParam; + + std::string strReply; + ECmdRet eRet = (*pHandler)(rlvCmd, strReply); + + // If we made it this far then: + // - the command was handled successfully so we send off the response + // - the command failed but we still send off an - empty - response to keep the issuing script from blocking + if (nChannel != 0) + { + Util::sendChatReply(nChannel, strReply); + } + + return eRet; +} + +// Handles: @version= and @versionnew= +template<> template<> +ECmdRet VersionReplyHandler::onCommand(const RlvCommand& rlvCmd, std::string& strReply) +{ + strReply = Strings::getVersion(EBehaviour::Version == rlvCmd.getBehaviourType()); + return ECmdRet::Success; +} + +// Handles: @versionnum[:impl]= +template<> template<> +ECmdRet ReplyHandler::onCommand(const RlvCommand& rlvCmd, std::string& strReply) +{ + if (!rlvCmd.hasOption()) + strReply = Strings::getVersionNum(); + else if ("impl" == rlvCmd.getOption()) + strReply = Strings::getVersionImplNum(); + else + return ECmdRet::FailedOption; + return ECmdRet::Success; +} + +// ============================================================================ diff --git a/indra/newview/rlvhandler.h b/indra/newview/rlvhandler.h index 8cf054e98e..a5e91548ef 100644 --- a/indra/newview/rlvhandler.h +++ b/indra/newview/rlvhandler.h @@ -3,7 +3,7 @@ #include "llchat.h" #include "llsingleton.h" -#include "rlvdefines.h" +#include "rlvhelper.h" class LLViewerObject; @@ -15,15 +15,17 @@ class RlvHandler : public LLSingleton { LLSINGLETON_EMPTY_CTOR(RlvHandler); -public: /* - * Helper functions + * Command processing */ public: // Command processing helper functions bool handleSimulatorChat(std::string& message, const LLChat& chat, const LLViewerObject* chatObj); Rlv::ECmdRet processCommand(const LLUUID& idObj, const std::string& stCmd, bool fromObj); +protected: + Rlv::ECmdRet processCommand(std::reference_wrapper rlvCmdRef, bool fromObj); +public: // Initialization (deliberately static so they can safely be called in tight loops) static bool canEnable(); static bool isEnabled() { return mIsEnabled; } diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index ade2b83dd7..c3f9e6f756 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -1,11 +1,242 @@ #include "llviewerprecompiledheaders.h" #include "lltrans.h" +#include "llviewercontrol.h" #include "rlvhelper.h" +#include + using namespace Rlv; +// ============================================================================ +// BehaviourDictionary +// + +BehaviourDictionary::BehaviourDictionary() +{ + // + // Restrictions + // + + // + // Reply-only + // + addEntry(new ReplyProcessor("version")); + addEntry(new ReplyProcessor("versionnew")); + addEntry(new ReplyProcessor("versionnum")); + + // Populate mString2InfoMap (the tuple should be unique) + for (const BehaviourInfo* bhvr_info_p : mBhvrInfoList) + { + RLV_VERIFY(mString2InfoMap.insert(std::make_pair(std::make_pair(bhvr_info_p->getBehaviour(), static_cast(bhvr_info_p->getParamTypeMask())), bhvr_info_p)).second); + } + + // Populate m_Bhvr2InfoMap (there can be multiple entries per ERlvBehaviour) + for (const BehaviourInfo* bhvr_info_p : mBhvrInfoList) + { + if ((bhvr_info_p->getParamTypeMask() & to_underlying(EParamType::AddRem)) && !bhvr_info_p->isSynonym()) + { +#ifdef RLV_DEBUG + for (const auto& itBhvr : boost::make_iterator_range(mBhvr2InfoMap.lower_bound(bhvr_info_p->getBehaviourType()), mBhvr2InfoMap.upper_bound(bhvr_info_p->getBehaviourType()))) + { + RLV_ASSERT((itBhvr.first != bhvr_info_p->getBehaviourType()) || (itBhvr.second->getBehaviourFlags() != bhvr_info_p->getBehaviourFlags())); + } +#endif // RLV_DEBUG + mBhvr2InfoMap.insert(std::pair(bhvr_info_p->getBehaviourType(), bhvr_info_p)); + } + } +} + +BehaviourDictionary::~BehaviourDictionary() +{ + for (const BehaviourInfo* bhvr_info_p : mBhvrInfoList) + { + delete bhvr_info_p; + } + mBhvrInfoList.clear(); +} + +void BehaviourDictionary::addEntry(const BehaviourInfo* entry_p) +{ + // Filter experimental commands (if disabled) + static LLCachedControl sEnableExperimental(gSavedSettings, Settings::EnableExperimentalCommands); + if (!entry_p || (!sEnableExperimental && entry_p->isExperimental())) + { + return; + } + + // Sanity check for duplicate entries +#ifndef LL_RELEASE_FOR_DOWNLOAD + std::for_each(mBhvrInfoList.begin(), mBhvrInfoList.end(), + [&entry_p](const BehaviourInfo* bhvr_info_p) { + RLV_ASSERT_DBG((bhvr_info_p->getBehaviour() != entry_p->getBehaviour()) || ((bhvr_info_p->getParamTypeMask() & entry_p->getParamTypeMask()) == 0)); + }); +#endif // LL_RELEASE_FOR_DOWNLOAD + + mBhvrInfoList.push_back(entry_p); +} + +const BehaviourInfo* BehaviourDictionary::getBehaviourInfo(EBehaviour eBhvr, EParamType eParamType) const +{ + const BehaviourInfo* bhvr_info_p = nullptr; + for (auto itBhvrLower = mBhvr2InfoMap.lower_bound(eBhvr), itBhvrUpper = mBhvr2InfoMap.upper_bound(eBhvr); + std::find_if(itBhvrLower, itBhvrUpper, [eParamType](const auto& bhvrEntry) { return bhvrEntry.second->getParamTypeMask() == to_underlying(eParamType); }) != itBhvrUpper; + ++itBhvrLower) + { + if (bhvr_info_p) + return nullptr; + bhvr_info_p = itBhvrLower->second; + } + return bhvr_info_p; +} + +const BehaviourInfo* BehaviourDictionary::getBehaviourInfo(const std::string& strBhvr, EParamType eParamType, bool* is_strict_p) const +{ + size_t idxBhvrLastPart = strBhvr.find_last_of('_'); + std::string strBhvrLastPart((std::string::npos != idxBhvrLastPart) && (idxBhvrLastPart < strBhvr.size()) ? strBhvr.substr(idxBhvrLastPart + 1) : LLStringUtil::null); + + bool isStrict = (strBhvrLastPart.compare("sec") == 0); + if (is_strict_p) + *is_strict_p = isStrict; + + auto itBhvr = mString2InfoMap.find(std::make_pair((!isStrict) ? strBhvr : strBhvr.substr(0, strBhvr.size() - 4), (has_flag(eParamType, EParamType::AddRem)) ? EParamType::AddRem : eParamType)); + if ((mString2InfoMap.end() == itBhvr) && (!isStrict) && (!strBhvrLastPart.empty()) && (EParamType::Force == eParamType)) + { + // No match found but it could still be a local scope modifier + auto itBhvrMod = mString2InfoMap.find(std::make_pair(strBhvr.substr(0, idxBhvrLastPart), EParamType::AddRem)); + } + + return ((itBhvr != mString2InfoMap.end()) && ((!isStrict) || (itBhvr->second->hasStrict()))) ? itBhvr->second : nullptr; +} + +EBehaviour BehaviourDictionary::getBehaviourFromString(const std::string& strBhvr, EParamType eParamType, bool* pisStrict) const +{ + const BehaviourInfo* bhvr_info_p = getBehaviourInfo(strBhvr, eParamType, pisStrict); + // Filter out locally scoped modifier commands since they don't actually have a unique behaviour value of their own + return bhvr_info_p->getBehaviourType(); +} + +bool BehaviourDictionary::getCommands(const std::string& strMatch, EParamType eParamType, std::list& cmdList) const +{ + cmdList.clear(); + for (const BehaviourInfo* bhvr_info_p : mBhvrInfoList) + { + if ((bhvr_info_p->getParamTypeMask() & to_underlying(eParamType)) || (EParamType::Unknown == eParamType)) + { + std::string strCmd = bhvr_info_p->getBehaviour(); + if ((std::string::npos != strCmd.find(strMatch)) || (strMatch.empty())) + cmdList.push_back(strCmd); + if ((bhvr_info_p->hasStrict()) && ((std::string::npos != strCmd.append("_sec").find(strMatch)) || (strMatch.empty()))) + cmdList.push_back(strCmd); + } + } + return !cmdList.empty(); +} + +bool BehaviourDictionary::getHasStrict(EBehaviour eBhvr) const +{ + for (const auto& itBhvr : boost::make_iterator_range(mBhvr2InfoMap.lower_bound(eBhvr), mBhvr2InfoMap.upper_bound(eBhvr))) + { + // Only restrictions can be strict + if (to_underlying(EParamType::AddRem) != itBhvr.second->getParamTypeMask()) + continue; + return itBhvr.second->hasStrict(); + } + RLV_ASSERT(false); + return false; +} + +void BehaviourDictionary::toggleBehaviourFlag(const std::string& strBhvr, EParamType eParamType, BehaviourInfo::EBehaviourFlags eBhvrFlag, bool fEnable) +{ + auto itBhvr = mString2InfoMap.find(std::make_pair(strBhvr, (has_flag(eParamType, EParamType::AddRem)) ? EParamType::AddRem : eParamType)); + if (mString2InfoMap.end() != itBhvr) + { + const_cast(itBhvr->second)->toggleBehaviourFlag(eBhvrFlag, fEnable); + } +} + +// ============================================================================ +// RlvCommmand +// + +RlvCommand::RlvCommand(const LLUUID& idObj, const std::string& strCmd) + : mObjId(idObj) +{ + if (parseCommand(strCmd, mBehaviour, mOption, mParam)) + { + if ("n" == mParam || "add" == mParam) + mParamType = EParamType::Add; + else if ("y" == mParam || "rem" == mParam) + mParamType = EParamType::Remove; + else if ("clear" == mBehaviour) // clear is the odd one out so just make it its own type + mParamType = EParamType::Clear; + else if ("force" == mParam) + mParamType = EParamType::Force; + else if (S32 nTemp; LLStringUtil::convertToS32(mParam, nTemp)) // Assume it's a reply command if we can convert to an S32 + mParamType = EParamType::Reply; + } + + mIsValid = mParamType != EParamType::Unknown; + if (!mIsValid) + { + mOption.clear(); + mParam.clear(); + return; + } + + mBhvrInfo = BehaviourDictionary::instance().getBehaviourInfo(mBehaviour, mParamType, &mIsStrict); +} + +RlvCommand::RlvCommand(const RlvCommand& rlvCmd, EParamType eParamType) + : mIsValid(rlvCmd.mIsValid), mObjId(rlvCmd.mObjId), mBehaviour(rlvCmd.mBehaviour), mBhvrInfo(rlvCmd.mBhvrInfo) + , mParamType( (EParamType::Unknown == eParamType) ? rlvCmd.mParamType : eParamType) + , mIsStrict(rlvCmd.mIsStrict), mOption(rlvCmd.mOption), mParam(rlvCmd.mParam), mIsRefCounted(rlvCmd.mIsRefCounted) +{ +} + +bool RlvCommand::parseCommand(const std::string& strCmd, std::string& strBhvr, std::string& strOption, std::string& strParam) +{ + // Format: [: + RLVaTopLevelMenu + + Comment + Show the RLVa specific menu as a top level menu + Persist + 1 + Type + Boolean + Value + 1 RevokePermsOnStopAnimation diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 598ad89907..9043a5a89e 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -76,6 +76,7 @@ #include "llslurl.h" #include "llstartup.h" #include "llperfstats.h" +#include "rlvcommon.h" #if LL_DARWIN #include "llwindowmacosx.h" @@ -972,6 +973,8 @@ void settings_setup_listeners() setting_setup_signal_listener(gSavedSettings, "TerrainPaintBitDepth", handleSetShaderChanged); setting_setup_signal_listener(gSavedPerAccountSettings, "AvatarHoverOffsetZ", handleAvatarHoverOffsetChanged); + + setting_setup_signal_listener(gSavedSettings, Rlv::Settings::TopLevelMenu, Rlv::Util::menuToggleVisible); } #if TEST_CACHED_CONTROL diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 1f8f960300..a308b8d8e9 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -152,6 +152,7 @@ #include "llviewershadermgr.h" #include "gltfscenemanager.h" #include "gltf/asset.h" +#include "rlvcommon.h" using namespace LLAvatarAppearanceDefines; @@ -6284,6 +6285,8 @@ void show_debug_menus() gMenuBarView->setItemVisible("Advanced", debug); // gMenuBarView->setItemEnabled("Advanced", debug); // Don't disable Advanced keyboard shortcuts when hidden + Rlv::Util::menuToggleVisible(); + gMenuBarView->setItemVisible("Debug", qamode); gMenuBarView->setItemEnabled("Debug", qamode); diff --git a/indra/newview/rlvcommon.cpp b/indra/newview/rlvcommon.cpp index eda2cdedc8..abb54b5b39 100644 --- a/indra/newview/rlvcommon.cpp +++ b/indra/newview/rlvcommon.cpp @@ -1,15 +1,18 @@ #include "llviewerprecompiledheaders.h" + #include "llagent.h" #include "llchat.h" #include "lldbstrings.h" #include "llversioninfo.h" +#include "llviewermenu.h" #include "llviewerstats.h" #include "message.h" +#include -#include "rlvdefines.h" #include "rlvcommon.h" -#include +#include "llviewercontrol.h" +#include "rlvhandler.h" using namespace Rlv; @@ -48,6 +51,32 @@ std::string Strings::getVersionImplNum() // RlvUtil // +void Util::menuToggleVisible() +{ + bool isTopLevel = gSavedSettings.getBOOL(Settings::TopLevelMenu); + bool isRlvEnabled = RlvHandler::isEnabled(); + + LLMenuGL* menuRLVaMain = gMenuBarView->findChildMenuByName("RLVa Main", false); + LLMenuGL* menuAdvanced = gMenuBarView->findChildMenuByName("Advanced", false); + LLMenuGL* menuRLVaEmbed= menuAdvanced->findChildMenuByName("RLVa Embedded", false); + + gMenuBarView->setItemVisible("RLVa Main", isRlvEnabled && isTopLevel); + menuAdvanced->setItemVisible("RLVa Embedded", isRlvEnabled && !isTopLevel); + + if ( isRlvEnabled && menuRLVaMain && menuRLVaEmbed && + ( (isTopLevel && 1 == menuRLVaMain->getItemCount()) || (!isTopLevel && 1 == menuRLVaEmbed->getItemCount())) ) + { + LLMenuGL* menuFrom = isTopLevel ? menuRLVaEmbed : menuRLVaMain; + LLMenuGL* menuTo = isTopLevel ? menuRLVaMain : menuRLVaEmbed; + while (LLMenuItemGL* pItem = menuFrom->getItem(1)) + { + menuFrom->removeChild(pItem); + menuTo->addChild(pItem); + pItem->updateBranchParent(menuTo); + } + } +} + bool Util::parseStringList(const std::string& strInput, std::vector& optionList, std::string_view strSeparator) { if (!strInput.empty()) diff --git a/indra/newview/rlvcommon.h b/indra/newview/rlvcommon.h index bec3e23e11..d18abcf1ac 100644 --- a/indra/newview/rlvcommon.h +++ b/indra/newview/rlvcommon.h @@ -24,6 +24,7 @@ namespace Rlv namespace Util { bool isValidReplyChannel(S32 nChannel, bool isLoopback = false); + void menuToggleVisible(); bool parseStringList(const std::string& strInput, std::vector& optionList, std::string_view strSeparator = Constants::OptionSeparator); bool sendChatReply(S32 nChannel, const std::string& strUTF8Text); bool sendChatReply(const std::string& strChannel, const std::string& strUTF8Text); diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 3de2473927..f52e1cc952 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -1834,6 +1834,71 @@ function="World.EnvPreset" parameter="sl_about" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From 4e6739da2fe7822565c7112ce67c4ef505102015 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Mon, 16 Sep 2024 15:41:09 +0200 Subject: Don't compose emojis on the RLVa console input --- indra/newview/skins/default/xui/en/floater_rlv_console.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/skins/default/xui/en/floater_rlv_console.xml b/indra/newview/skins/default/xui/en/floater_rlv_console.xml index 928d50cb41..708055d1b6 100644 --- a/indra/newview/skins/default/xui/en/floater_rlv_console.xml +++ b/indra/newview/skins/default/xui/en/floater_rlv_console.xml @@ -66,6 +66,7 @@ left="1" top="1" right="-1" + show_emoji_helper="false" wrap="true" /> -- cgit v1.2.3 From 135634205304d4009d943cf35c6dfbc51458265c Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Tue, 17 Sep 2024 19:12:55 +0200 Subject: Add proper file headers --- indra/newview/rlvactions.cpp | 27 +++++++++++++++++++++++++++ indra/newview/rlvactions.h | 27 +++++++++++++++++++++++++++ indra/newview/rlvcommon.cpp | 27 +++++++++++++++++++++++++++ indra/newview/rlvcommon.h | 27 +++++++++++++++++++++++++++ indra/newview/rlvdefines.h | 27 +++++++++++++++++++++++++++ indra/newview/rlvfloaters.cpp | 27 +++++++++++++++++++++++++++ indra/newview/rlvfloaters.h | 27 +++++++++++++++++++++++++++ indra/newview/rlvhandler.cpp | 27 +++++++++++++++++++++++++++ indra/newview/rlvhandler.h | 27 +++++++++++++++++++++++++++ indra/newview/rlvhelper.cpp | 27 +++++++++++++++++++++++++++ indra/newview/rlvhelper.h | 27 +++++++++++++++++++++++++++ 11 files changed, 297 insertions(+) diff --git a/indra/newview/rlvactions.cpp b/indra/newview/rlvactions.cpp index 1988c99ecf..110beeafc0 100644 --- a/indra/newview/rlvactions.cpp +++ b/indra/newview/rlvactions.cpp @@ -1,3 +1,30 @@ +/** + * @file rlvactions.cpp + * @author Kitty Barnett + * @brief RLVa public facing helper class to easily make RLV checks + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + #include "llviewerprecompiledheaders.h" #include "rlvactions.h" diff --git a/indra/newview/rlvactions.h b/indra/newview/rlvactions.h index ac4fc73339..cb0df95e37 100644 --- a/indra/newview/rlvactions.h +++ b/indra/newview/rlvactions.h @@ -1,3 +1,30 @@ +/** + * @file rlvactions.h + * @author Kitty Barnett + * @brief RLVa public facing helper class to easily make RLV checks + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + #pragma once // ============================================================================ diff --git a/indra/newview/rlvcommon.cpp b/indra/newview/rlvcommon.cpp index abb54b5b39..4140659715 100644 --- a/indra/newview/rlvcommon.cpp +++ b/indra/newview/rlvcommon.cpp @@ -1,3 +1,30 @@ +/** + * @file rlvcommon.h + * @author Kitty Barnett + * @brief RLVa helper functions and constants used throughout the viewer + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + #include "llviewerprecompiledheaders.h" #include "llagent.h" diff --git a/indra/newview/rlvcommon.h b/indra/newview/rlvcommon.h index d18abcf1ac..6f1bbbbdc6 100644 --- a/indra/newview/rlvcommon.h +++ b/indra/newview/rlvcommon.h @@ -1,3 +1,30 @@ +/** + * @file rlvcommon.h + * @author Kitty Barnett + * @brief RLVa helper functions and constants used throughout the viewer + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + #pragma once #include "rlvdefines.h" diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index 88dffa1127..15baf1ba49 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -1,3 +1,30 @@ +/** + * @file rlvdefines.h + * @author Kitty Barnett + * @brief RLVa common defines, constants and enums + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + #pragma once // ============================================================================ diff --git a/indra/newview/rlvfloaters.cpp b/indra/newview/rlvfloaters.cpp index 8d107b2540..8a074fd14d 100644 --- a/indra/newview/rlvfloaters.cpp +++ b/indra/newview/rlvfloaters.cpp @@ -1,3 +1,30 @@ +/** + * @file rlvfloaters.cpp + * @author Kitty Barnett + * @brief RLVa floaters class implementations + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + #include "llviewerprecompiledheaders.h" #include "llagentdata.h" diff --git a/indra/newview/rlvfloaters.h b/indra/newview/rlvfloaters.h index a599bb051a..1d560f32d4 100644 --- a/indra/newview/rlvfloaters.h +++ b/indra/newview/rlvfloaters.h @@ -1,3 +1,30 @@ +/** + * @file rlvfloaters.h + * @author Kitty Barnett + * @brief RLVa floaters class implementations + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + #pragma once #include "llfloater.h" diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 0a0da0e25d..bf086c1b4b 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -1,3 +1,30 @@ +/** + * @file rlvhandler.cpp + * @author Kitty Barnett + * @brief RLVa helper classes for internal use only + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + #include "llviewerprecompiledheaders.h" #include "llagent.h" #include "llstartup.h" diff --git a/indra/newview/rlvhandler.h b/indra/newview/rlvhandler.h index 7fa4da767a..38612485b1 100644 --- a/indra/newview/rlvhandler.h +++ b/indra/newview/rlvhandler.h @@ -1,3 +1,30 @@ +/** + * @file rlvhandler.h + * @author Kitty Barnett + * @brief Primary command process and orchestration class + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + #pragma once #include "llchat.h" diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index ecb76a1db3..a82de4b9b8 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -1,3 +1,30 @@ +/** + * @file rlvhelper.cpp + * @author Kitty Barnett + * @brief RLVa helper classes for internal use only + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + #include "llviewerprecompiledheaders.h" #include "lltrans.h" diff --git a/indra/newview/rlvhelper.h b/indra/newview/rlvhelper.h index 644cd0ee22..7f0435f791 100644 --- a/indra/newview/rlvhelper.h +++ b/indra/newview/rlvhelper.h @@ -1,3 +1,30 @@ +/** + * @file rlvhelper.h + * @author Kitty Barnett + * @brief RLVa helper classes for internal use only + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + #pragma once #include "rlvdefines.h" -- cgit v1.2.3 From 6559d023293aed529e338a31827cb2c78434e474 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Tue, 17 Sep 2024 23:07:29 +0200 Subject: Fix tab vs whitespace line --- indra/newview/llviewermenu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index a308b8d8e9..63527d8594 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -6285,7 +6285,7 @@ void show_debug_menus() gMenuBarView->setItemVisible("Advanced", debug); // gMenuBarView->setItemEnabled("Advanced", debug); // Don't disable Advanced keyboard shortcuts when hidden - Rlv::Util::menuToggleVisible(); + Rlv::Util::menuToggleVisible(); gMenuBarView->setItemVisible("Debug", qamode); gMenuBarView->setItemEnabled("Debug", qamode); -- cgit v1.2.3 From cde79c60f1def5282eac6b6d83470b71a67b9268 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Tue, 17 Sep 2024 23:44:22 +0200 Subject: Mac build fixes: Reapply the template fix in rlvhelper.h + point to LLFloaterReg in the global namespace --- indra/newview/rlvfloaters.h | 3 ++- indra/newview/rlvhelper.h | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/indra/newview/rlvfloaters.h b/indra/newview/rlvfloaters.h index 1d560f32d4..8acfa43f28 100644 --- a/indra/newview/rlvfloaters.h +++ b/indra/newview/rlvfloaters.h @@ -32,6 +32,7 @@ #include "rlvdefines.h" class LLChatEntry; +class LLFloaterReg; class LLLayoutPanel; class LLTextEditor; class RlvCommand; @@ -45,7 +46,7 @@ namespace Rlv class FloaterConsole : public LLFloater { - friend class LLFloaterReg; + friend class ::LLFloaterReg; FloaterConsole(const LLSD& sdKey) : LLFloater(sdKey) {} public: diff --git a/indra/newview/rlvhelper.h b/indra/newview/rlvhelper.h index 7f0435f791..f241332594 100644 --- a/indra/newview/rlvhelper.h +++ b/indra/newview/rlvhelper.h @@ -152,14 +152,20 @@ namespace Rlv // // CommandHandler - The actual command handler (Note that a handler is more general than a processor; a handler can - for instance - be used by multiple processors) // + #if LL_WINDOWS + #define RLV_TEMPL_FIX(x) template + #else + #define RLV_TEMPL_FIX(x) template + #endif // LL_WINDOWS + template struct CommandHandler { - template::type> static ECmdRet onCommand(const RlvCommand&, bool&); - template::type> static void onCommandToggle(EBehaviour, bool); - template::type> static ECmdRet onCommand(const RlvCommand&); - template::type> static ECmdRet onCommand(const RlvCommand&, std::string&); + RLV_TEMPL_FIX(typename = typename std::enable_if::type) static ECmdRet onCommand(const RlvCommand&, bool&); + RLV_TEMPL_FIX(typename = typename std::enable_if::type) static void onCommandToggle(EBehaviour, bool); + RLV_TEMPL_FIX(typename = typename std::enable_if::type) static ECmdRet onCommand(const RlvCommand&); + RLV_TEMPL_FIX(typename = typename std::enable_if::type) static ECmdRet onCommand(const RlvCommand&, std::string&); }; // Aliases to improve readability in definitions @@ -179,11 +185,11 @@ namespace Rlv { public: // Default constructor used by behaviour specializations - template::type> + RLV_TEMPL_FIX(typename = typename std::enable_if::type) CommandProcessor(const std::string& strBhvr, U32 nBhvrFlags = 0) : BehaviourInfo(strBhvr, templBhvr, templParamType, nBhvrFlags) {} // Constructor used when we don't want to specialize on behaviour (see BehaviourGenericProcessor) - template::type> + RLV_TEMPL_FIX(typename = typename std::enable_if::type) CommandProcessor(const std::string& strBhvr, EBehaviour eBhvr, U32 nBhvrFlags = 0) : BehaviourInfo(strBhvr, eBhvr, templParamType, nBhvrFlags) {} ECmdRet processCommand(const RlvCommand& rlvCmd) const override { return baseImpl::processCommand(rlvCmd, &handlerImpl::onCommand); } -- cgit v1.2.3 From ab89ea5e209a91689e06352e73635c735015ddbf Mon Sep 17 00:00:00 2001 From: Nicky Date: Sat, 28 Sep 2024 00:36:12 +0200 Subject: Replace None and Success. Those are X11 defines and thus lead to compile errors when compiling a Linux viewer. --- indra/newview/rlvdefines.h | 6 +++--- indra/newview/rlvhandler.cpp | 6 +++--- indra/newview/rlvhelper.cpp | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index 15baf1ba49..e3472ed4a8 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -102,7 +102,7 @@ namespace Rlv enum class EBehaviourOptionType { - None, // Behaviour takes no parameters + EmptyOrException, // Behaviour takes no parameters Exception, // Behaviour requires an exception as a parameter NoneOrException, // Behaviour takes either no parameters or an exception }; @@ -120,7 +120,7 @@ namespace Rlv enum class ECmdRet { Unknown = 0x0000, // Unknown error (should only be used internally) Retained, // Command was retained - Success = 0x0100, // Command executed successfully + Succeeded = 0x0100, // Command executed successfully SuccessUnset, // Command executed successfully (RLV_TYPE_REMOVE for an unrestricted behaviour) SuccessDuplicate, // Command executed successfully (RLV_TYPE_ADD for an already restricted behaviour) SuccessDeprecated, // Command executed successfully but has been marked as deprecated @@ -163,7 +163,7 @@ namespace Rlv constexpr bool isReturnCodeSuccess(ECmdRet eRet) { - return (to_underlying(eRet) & to_underlying(ECmdRet::Success)) == to_underlying(ECmdRet::Success); + return (to_underlying(eRet) & to_underlying(ECmdRet::Succeeded)) == to_underlying(ECmdRet::Succeeded); } constexpr bool isReturnCodeFailed(ECmdRet eRet) diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index bf086c1b4b..6c4b439105 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -198,7 +198,7 @@ ECmdRet ReplyHandler::onCommand(const RlvCommand& rlvCmd std::list cmdList; if (BehaviourDictionary::instance().getCommands(!optionList.empty() ? optionList[0] : LLStringUtil::null, eType, cmdList)) strReply = boost::algorithm::join(cmdList, optionList.size() >= 3 ? optionList[2] : Constants::OptionSeparator); - return ECmdRet::Success; + return ECmdRet::Succeeded; } // Handles: @version= and @versionnew= @@ -206,7 +206,7 @@ template<> template<> ECmdRet VersionReplyHandler::onCommand(const RlvCommand& rlvCmd, std::string& strReply) { strReply = Strings::getVersion(EBehaviour::Version == rlvCmd.getBehaviourType()); - return ECmdRet::Success; + return ECmdRet::Succeeded; } // Handles: @versionnum[:impl]= @@ -219,7 +219,7 @@ ECmdRet ReplyHandler::onCommand(const RlvCommand& rlvCmd strReply = Strings::getVersionImplNum(); else return ECmdRet::FailedOption; - return ECmdRet::Success; + return ECmdRet::Succeeded; } // ============================================================================ diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index a82de4b9b8..988fc9ca8b 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -283,7 +283,7 @@ namespace Rlv else if (mForConsole) return; // Only show console feedback on successful commands when there's an informational notice - std::string& strResult = mCommandResults[isReturnCodeSuccess(eRet) ? ECmdRet::Success : (ECmdRet::Retained == eRet ? ECmdRet::Retained : ECmdRet::Failed)]; + std::string& strResult = mCommandResults[isReturnCodeSuccess(eRet) ? ECmdRet::Succeeded : (ECmdRet::Retained == eRet ? ECmdRet::Retained : ECmdRet::Failed)]; if (!strResult.empty()) strResult.append(", "); strResult.append(strCmd); @@ -308,7 +308,7 @@ namespace Rlv }; if (!mForConsole) result << ": @" << mOrigCmd; - appendResult(ECmdRet::Success, !mForConsole ? "RlvDebugExecuted" : "RlvConsoleExecuted"); + appendResult(ECmdRet::Succeeded, !mForConsole ? "RlvDebugExecuted" : "RlvConsoleExecuted"); appendResult(ECmdRet::Failed, !mForConsole ? "RlvDebugFailed" : "RlvConsoleFailed"); appendResult(ECmdRet::Retained, !mForConsole ? "RlvDebugRetained" : "RlvConsoleRetained"); } @@ -320,7 +320,7 @@ namespace Rlv { switch (eRet) { - case ECmdRet::Success: + case ECmdRet::Succeeded: return LLTrans::getString("RlvDebugExecuted"); case ECmdRet::Failed: return LLTrans::getString("RlvDebugFailed"); @@ -372,7 +372,7 @@ namespace Rlv return LLTrans::getString("RlvReturnCodeNoProcessor"); // The following are identified by the chat verb case ECmdRet::Retained: - case ECmdRet::Success: + case ECmdRet::Succeeded: case ECmdRet::Failed: return LLStringUtil::null; // The following shouldn't occur -- cgit v1.2.3 From c996cdbe68c92313c311b9c8696ea3bd3ae69446 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 2 Oct 2024 00:34:09 +0200 Subject: Remove unneeded RLV_VERIFY + undefine accidental RLV_DEBUG define (should fix Linux build) --- indra/newview/rlvdefines.h | 1 - indra/newview/rlvhelper.cpp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index e3472ed4a8..e39328fdd6 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -38,7 +38,6 @@ #define RLV_ENDL LL_ENDL #define RLV_VERIFY(f) (f) -#define RLV_DEBUG #if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG // Make sure we halt execution on errors #define RLV_ERRS LL_ERRS("RLV") diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index 988fc9ca8b..7cb1473c8c 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -57,7 +57,7 @@ BehaviourDictionary::BehaviourDictionary() // Populate mString2InfoMap (the tuple should be unique) for (const BehaviourInfo* bhvr_info_p : mBhvrInfoList) { - RLV_VERIFY(mString2InfoMap.insert(std::make_pair(std::make_pair(bhvr_info_p->getBehaviour(), static_cast(bhvr_info_p->getParamTypeMask())), bhvr_info_p)).second); + mString2InfoMap.insert(std::make_pair(std::make_pair(bhvr_info_p->getBehaviour(), static_cast(bhvr_info_p->getParamTypeMask())), bhvr_info_p)); } // Populate m_Bhvr2InfoMap (there can be multiple entries per ERlvBehaviour) -- cgit v1.2.3 From 0500c78b1bccda71a8623785c9765a7adaec0071 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Mon, 12 May 2025 20:14:23 +0800 Subject: Have unencapsulated Expat headers in any condition The only condition where Expat headers would be encapsulated is when using LL's Autobuild-based prebuilt libraries, and we're never using any of LL's prebuilt binary for Expat on desktop, since Expat is practically available on any supported desktop platform. The system Expat headers are never encapsulated in any of those platforms. This is the beginning of not relying on the LL_USESYSTEMLIBS macro any more (eventually not relying on the custom USESYSTEMLIBS CMake setting either). Keeping the build system still flexible to have the option to use LL's prebuilt libraries *fully* (we still use some of them in cases where the platform may not have the related system library or for convenience, so the term USESYSTEMLIBS may not always be consistent), is getting harder to maintain. The way it's done is using #if 1, in order to minimise difference from upstream. --- indra/llcommon/llsdserialize_xml.cpp | 2 +- indra/llui/llxuiparser.cpp | 2 +- indra/llxml/llxmlnode.h | 2 +- indra/llxml/llxmlparser.h | 2 +- indra/newview/llvoicevivox.cpp | 2 +- indra/newview/llvoicevivox.h | 2 +- indra/newview/llvoicewebrtc.cpp | 2 +- indra/newview/llvoicewebrtc.h | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/indra/llcommon/llsdserialize_xml.cpp b/indra/llcommon/llsdserialize_xml.cpp index 6396caf8d5..ce416baa04 100644 --- a/indra/llcommon/llsdserialize_xml.cpp +++ b/indra/llcommon/llsdserialize_xml.cpp @@ -35,7 +35,7 @@ extern "C" { -#ifdef LL_USESYSTEMLIBS +#if 1 # include #else # include "expat/expat.h" diff --git a/indra/llui/llxuiparser.cpp b/indra/llui/llxuiparser.cpp index 8fd85a89a1..8cd11b86b3 100644 --- a/indra/llui/llxuiparser.cpp +++ b/indra/llui/llxuiparser.cpp @@ -30,7 +30,7 @@ #include "llxmlnode.h" #include "llfasttimer.h" -#ifdef LL_USESYSTEMLIBS +#if 1 #include #else #include "expat/expat.h" diff --git a/indra/llxml/llxmlnode.h b/indra/llxml/llxmlnode.h index 09c7c4fdad..769cf97ba2 100644 --- a/indra/llxml/llxmlnode.h +++ b/indra/llxml/llxmlnode.h @@ -30,7 +30,7 @@ #ifndef XML_STATIC #define XML_STATIC #endif -#ifdef LL_USESYSTEMLIBS +#if 1 #include #else #include "expat/expat.h" diff --git a/indra/llxml/llxmlparser.h b/indra/llxml/llxmlparser.h index 0f64def6df..9c25727e54 100644 --- a/indra/llxml/llxmlparser.h +++ b/indra/llxml/llxmlparser.h @@ -30,7 +30,7 @@ #ifndef XML_STATIC #define XML_STATIC #endif -#ifdef LL_USESYSTEMLIBS +#if 1 #include #else #include "expat/expat.h" diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 7faef8cc41..14f0b52174 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -36,7 +36,7 @@ #include "llbufferstream.h" #include "llfile.h" #include "llmenugl.h" -#ifdef LL_USESYSTEMLIBS +#if 1 # include "expat.h" #else # include "expat/expat.h" diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h index 3e0a237905..ca1258e05e 100644 --- a/indra/newview/llvoicevivox.h +++ b/indra/newview/llvoicevivox.h @@ -43,7 +43,7 @@ class LLVivoxProtocolParser; #include "llmutelist.h" #include -#ifdef LL_USESYSTEMLIBS +#if 1 # include "expat.h" #else # include "expat/expat.h" diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index 08fcec86ac..c2b74eb1dd 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -34,7 +34,7 @@ #include "llbufferstream.h" #include "llfile.h" #include "llmenugl.h" -#ifdef LL_USESYSTEMLIBS +#if 1 # include "expat.h" #else # include "expat/expat.h" diff --git a/indra/newview/llvoicewebrtc.h b/indra/newview/llvoicewebrtc.h index ff82d2739d..946a80e874 100644 --- a/indra/newview/llvoicewebrtc.h +++ b/indra/newview/llvoicewebrtc.h @@ -43,7 +43,7 @@ class LLWebRTCProtocolParser; #include #include "boost/json.hpp" -#ifdef LL_USESYSTEMLIBS +#if 1 # include "expat.h" #else # include "expat/expat.h" -- cgit v1.2.3 From 2a57b9f215fded116667a357c7f0d3992f803864 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Mon, 12 May 2025 20:35:42 +0800 Subject: Unencapsulated Meshoptimizer headers in any condition Pretty much similar to the previous commit (especially that the the encapsulating directory, in cases where LL's prebuilt is used, is already a searched directory by the last line in its .cmake file), except there had never been any use of LL_USESYSTEMLIBS for this one, so just replacing the single upstream lines would be the minimal difference. --- indra/llmath/llvolume.cpp | 4 ---- indra/newview/gltf/primitive.cpp | 4 ---- 2 files changed, 8 deletions(-) diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 6335da5b62..5bc1c3d742 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -55,11 +55,7 @@ #include "mikktspace/mikktspace.hh" -#if LL_USESYSTEMLIBS #include -#else -#include "meshoptimizer/meshoptimizer.h" -#endif #define DEBUG_SILHOUETTE_BINORMALS 0 #define DEBUG_SILHOUETTE_NORMALS 0 // TomY: Use this to display normals using the silhouette diff --git a/indra/newview/gltf/primitive.cpp b/indra/newview/gltf/primitive.cpp index 5de45119fc..388a6eee01 100644 --- a/indra/newview/gltf/primitive.cpp +++ b/indra/newview/gltf/primitive.cpp @@ -32,11 +32,7 @@ #include "mikktspace/mikktspace.hh" -#if LL_USESYSTEMLIBS #include -#else -#include "meshoptimizer/meshoptimizer.h" -#endif using namespace LL::GLTF; -- cgit v1.2.3 From a5dcf2912463f14818370d649a8c418e16fb6ff0 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Mon, 12 May 2025 20:43:55 +0800 Subject: Not rely on LL_USESYSTEMLIBS for choosing zlib impl with the effect of choosing zlib over zlib-ng in any condition, which has been the case so far. But this opens the way to relying on some other condition, such as which platform, for deciding whether we can use zlib-ng or not, instead of zlib. So we can freely use, for example LL's prebuilt, zlib-ng while still using system libraries for others. --- indra/llcommon/llsdserialize.cpp | 2 +- indra/llcommon/llsys.cpp | 2 +- indra/llprimitive/llmodel.cpp | 2 +- indra/newview/llviewerobjectlist.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp index 37af366a20..68a7bf0adf 100644 --- a/indra/llcommon/llsdserialize.cpp +++ b/indra/llcommon/llsdserialize.cpp @@ -37,7 +37,7 @@ #include #include -#ifdef LL_USESYSTEMLIBS +#if 1 # include #else # include "zlib-ng/zlib.h" // for davep's dirty little zip functions diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 94d59adf29..5c35aeb476 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -33,7 +33,7 @@ #include "llsys.h" #include -#ifdef LL_USESYSTEMLIBS +#if 1 # include #else # include "zlib-ng/zlib.h" diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index 4e3e49ec9f..6b4bb3a8b0 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -33,7 +33,7 @@ #include "llvector4a.h" #include "hbxxh.h" -#ifdef LL_USESYSTEMLIBS +#if 1 # include #else # include "zlib-ng/zlib.h" diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index d72d428c08..c15fd86f71 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -68,7 +68,7 @@ #include "u64.h" #include "llviewertexturelist.h" #include "lldatapacker.h" -#ifdef LL_USESYSTEMLIBS +#if 1 #include #else #include "zlib-ng/zlib.h" -- cgit v1.2.3 From 0de1d2018a6550e7dd1511ad3e15579a195c6463 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Mon, 12 May 2025 21:04:04 +0800 Subject: Similar to commit 0500c7 but for libjpeg(-turbo) --- indra/llimage/llimagejpeg.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llimage/llimagejpeg.h b/indra/llimage/llimagejpeg.h index 012b87a42d..f6d9f19ba5 100644 --- a/indra/llimage/llimagejpeg.h +++ b/indra/llimage/llimagejpeg.h @@ -32,7 +32,7 @@ #include "llimage.h" extern "C" { -#ifdef LL_USESYSTEMLIBS +#if 1 # include # include #else -- cgit v1.2.3 From d43c417a737d9f48fece51d084a85e3fad86382b Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Mon, 12 May 2025 21:07:02 +0800 Subject: Similar to commit 2a57b9 but for xxHash --- indra/llcommon/hbxxh.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/indra/llcommon/hbxxh.cpp b/indra/llcommon/hbxxh.cpp index 8ccf8dfcbe..decf908bb6 100644 --- a/indra/llcommon/hbxxh.cpp +++ b/indra/llcommon/hbxxh.cpp @@ -34,11 +34,7 @@ // in your build, in which case the latter would be used instead. For ARM64 // builds, this would also automatically enable NEON vectorization. #define XXH_INLINE_ALL -#if LL_USESYSTEMLIBS #include -#else -#include "xxhash/xxhash.h" -#endif #include "hbxxh.h" -- cgit v1.2.3 From abb32860d2a6e49e10d3ab243a62154d67f802b2 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Mon, 12 May 2025 21:14:24 +0800 Subject: Not redeclare DOM/DAE classes in any condition They haven't been used anyway because of LL_USESYSTEMLIBS (before), and it still works even though we reverted to using LL's fork in ColladaDOM's case, by building the fork instead of using any system library vanilla version. --- indra/llprimitive/lldaeloader.h | 2 +- indra/llprimitive/llmodel.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/llprimitive/lldaeloader.h b/indra/llprimitive/lldaeloader.h index c6e5ea42fc..92152fb8b8 100644 --- a/indra/llprimitive/lldaeloader.h +++ b/indra/llprimitive/lldaeloader.h @@ -29,7 +29,7 @@ #include "llmodelloader.h" -#ifndef LL_USESYSTEMLIBS +#if 0 class DAE; class daeElement; class domProfile_COMMON; diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h index 309c5df64c..4b5d079b48 100644 --- a/indra/llprimitive/llmodel.h +++ b/indra/llprimitive/llmodel.h @@ -35,7 +35,7 @@ #include -#ifndef LL_USESYSTEMLIBS +#if 0 class daeElement; class domMesh; #endif -- cgit v1.2.3 From fb34971786fd499d08ff42a76d1b1e458dc8fe24 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 12 May 2025 20:37:08 +0300 Subject: Revert "#4008 Fix media scale adjustments with pbr applied" This reverts commit b084d842c9900e532cba11e1e5a4e85299a0e184. --- indra/newview/llpanelface.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index a7b50f8364..99471a2555 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -1099,7 +1099,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) } mRadioPbrType->setEnabled(editable); const bool pbr_selected = mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR; - const bool media_selected = mComboMatMedia->getCurrentIndex() == MATMEDIA_MEDIA; const bool texture_info_selected = pbr_selected && mRadioPbrType->getSelectedIndex() != PBRTYPE_RENDER_MATERIAL_ID; mCheckSyncSettings->setEnabled(editable); @@ -1403,7 +1402,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) mShinyScaleU->setValue(spec_scale_s); mBumpyScaleU->setValue(norm_scale_s); - mTexScaleU->setEnabled(editable && (has_material || media_selected)); + mTexScaleU->setEnabled(editable && has_material); mShinyScaleU->setEnabled(editable && has_material && specmap_id.notNull()); mBumpyScaleU->setEnabled(editable && has_material && normmap_id.notNull()); @@ -1442,7 +1441,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) bool norm_scale_tentative = !identical_norm_scale_t; bool spec_scale_tentative = !identical_spec_scale_t; - mTexScaleV->setEnabled(editable && (has_material || media_selected)); + mTexScaleV->setEnabled(editable && has_material); mShinyScaleV->setEnabled(editable && has_material && specmap_id.notNull()); mBumpyScaleV->setEnabled(editable && has_material && normmap_id.notNull()); @@ -1488,7 +1487,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) mShinyOffsetU->setTentative(LLSD(spec_offset_u_tentative)); mBumpyOffsetU->setTentative(LLSD(norm_offset_u_tentative)); - mTexOffsetU->setEnabled(editable && (has_material || media_selected)); + mTexOffsetU->setEnabled(editable && has_material); mShinyOffsetU->setEnabled(editable && has_material && specmap_id.notNull()); mBumpyOffsetU->setEnabled(editable && has_material && normmap_id.notNull()); } @@ -1518,7 +1517,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) mBumpyOffsetV->setTentative(LLSD(norm_offset_v_tentative)); mShinyOffsetV->setTentative(LLSD(spec_offset_v_tentative)); - mTexOffsetV->setEnabled(editable && (has_material || media_selected)); + mTexOffsetV->setEnabled(editable && has_material); mShinyOffsetV->setEnabled(editable && has_material && specmap_id.notNull()); mBumpyOffsetV->setEnabled(editable && has_material && normmap_id.notNull()); } @@ -1545,7 +1544,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) F32 norm_rot_deg = norm_rotation * RAD_TO_DEG; F32 spec_rot_deg = spec_rotation * RAD_TO_DEG; - mTexRotate->setEnabled(editable && (has_material || media_selected)); + mTexRotate->setEnabled(editable && has_material); mShinyRotate->setEnabled(editable && has_material && specmap_id.notNull()); mBumpyRotate->setEnabled(editable && has_material && normmap_id.notNull()); @@ -1662,7 +1661,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) mTexRepeat->setValue(editable ? repeats : 1.0f); } mTexRepeat->setTentative(LLSD(repeats_tentative)); - mTexRepeat->setEnabled(!identical_planar_texgen && enabled && (has_material || media_selected)); + mTexRepeat->setEnabled(has_material && !identical_planar_texgen && enabled); } } -- cgit v1.2.3 From 733d65d0391f749608be599cefdd0a9c5b153ec0 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Mon, 12 May 2025 23:12:15 +0300 Subject: #4010 play only audio mention ping for new conversation --- indra/newview/llimview.cpp | 6 +++++- indra/newview/skins/default/colors.xml | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 6f085adcbd..f0f25089fa 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -3260,7 +3260,11 @@ void LLIMMgr::addMessage( //Play sound for new conversations if (!skip_message && !gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation"))) { - make_ui_sound("UISndNewIncomingIMSession"); + static LLCachedControl play_snd_mention_pref(gSavedSettings, "PlaySoundChatMention", false); + if (!play_snd_mention_pref || !LLUrlRegistry::getInstance()->containsAgentMention(msg)) + { + make_ui_sound("UISndNewIncomingIMSession"); + } } } else diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 0c34a3a5fb..5142e8ceff 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -1008,7 +1008,7 @@ value="0.82 0.91 0.98 0.15" /> + value="1 1 0 0.35" /> -- cgit v1.2.3 From f5ab6e11f13699c03a696611f67f8384434130a1 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Tue, 13 May 2025 10:22:54 +0800 Subject: Not rely on (LL_)USESYSTEMLIBS macro & CMake setting but the fact that we keep on using as many system libraries as we can (and only resort to other sources in certain cases), hasn't changed, of course. Also stop having to set USE_AUTOBUILD_3P to OFF. Lines are reindented, and when a system library can be found for a dependency, then that should be the way. If later we find out that using some other way is better, than stick to that. So, one option at a time, whichever is best for the situation. GLEXT hasn't been used, and in order to be not having to hack its .cmake file, we bypass it and refer to GLH (which is still used) right away in LLWindow. CMake commands that need to be bypassed, if it's a one-liner then it's just commented out, but if it's multiple lines, then scope them with if (FALSE) to minimise difference. --- README.md | 16 ++--- indra/CMakeLists.txt | 4 -- indra/cmake/APR.cmake | 14 ++-- indra/cmake/Audio.cmake | 14 ++-- indra/cmake/Boost.cmake | 49 ++++++------- indra/cmake/CMakeLists.txt | 1 - indra/cmake/CURL.cmake | 10 ++- indra/cmake/FMODSTUDIO.cmake | 8 +-- indra/cmake/FreeType.cmake | 15 ++-- indra/cmake/GLEXT.cmake | 7 +- indra/cmake/GLH.cmake | 4 +- indra/cmake/GLM.cmake | 11 ++- indra/cmake/LLPrimitive.cmake | 144 +++++++++++++++++++-------------------- indra/cmake/LLWindow.cmake | 4 +- indra/cmake/LibVLCPlugin.cmake | 77 +++++++++------------ indra/cmake/Meshoptimizer.cmake | 17 ++--- indra/cmake/NDOF.cmake | 7 +- indra/cmake/OPENAL.cmake | 16 ++--- indra/cmake/OpenJPEG.cmake | 8 +-- indra/cmake/OpenSSL.cmake | 16 ++--- indra/cmake/Prebuilt.cmake | 85 ++++++++++++----------- indra/cmake/UI.cmake | 5 +- indra/cmake/ViewerMiscLibs.cmake | 10 +-- indra/cmake/VulkanGltf.cmake | 2 - indra/cmake/ZLIBNG.cmake | 12 ++-- indra/cmake/xxHash.cmake | 8 +-- indra/llcommon/CMakeLists.txt | 33 ++++----- indra/llimage/CMakeLists.txt | 16 ++--- indra/llmath/CMakeLists.txt | 2 +- indra/llmessage/CMakeLists.txt | 7 +- indra/llwebrtc/CMakeLists.txt | 4 +- indra/llwindow/CMakeLists.txt | 5 +- indra/llwindow/llwindowsdl.cpp | 6 -- indra/newview/CMakeLists.txt | 67 ++++++++---------- 34 files changed, 310 insertions(+), 394 deletions(-) diff --git a/README.md b/README.md index ae3a178803..2621c522b8 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ $ cd build-`uname -s|tr '[:upper:]' '[:lower:]'`-`uname -m` ``` $ sudo pacman -S cmake base-devel python apr-util boost fltk glm glu hunspell minizip nanosvg libnghttp2 libpipewire sdl2 vlc libvorbis xxhash $ export LL_BUILD="-O3 -std=c++20 -fPIC -DLL_LINUX=1" -$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSESYSTEMLIBS:BOOL=ON -DUSE_OPENAL:BOOL=OFF -DUSE_FMODSTUDIO:BOOL=ON -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON -DCMAKE_INSTALL_PREFIX:PATH=/usr ../indra +$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=OFF -DUSE_FMODSTUDIO:BOOL=ON -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON -DCMAKE_INSTALL_PREFIX:PATH=/usr ../indra $ make -j`nproc` $ makepkg -R $ sudo pacman -U megapahit-`cat newview/viewer_version.txt|sed 's/\(.*\)\./\1-/'`-`uname -m`.pkg.tar.zst @@ -33,7 +33,7 @@ $ megapahit ``` $ sudo apt install cmake pkg-config libxml2-utils libalut-dev libaprutil1-dev libboost-fiber1.81-dev libboost-json1.81-dev libboost-program-options1.81-dev libboost-regex1.81-dev libboost-url1.81-dev libexpat1-dev libfltk1.3-dev libfontconfig-dev libfreetype-dev libglu1-mesa-dev libhunspell-dev libjpeg-dev libmeshoptimizer-dev libminizip-dev libnghttp2-dev libpipewire-0.3-dev libpng-dev libsdl2-dev libvlc-dev libvlccore-dev libvorbis-dev libxft-dev libxml2-dev libxxhash-dev $ export LL_BUILD="-O3 -std=c++20 -fPIC -DLL_LINUX=1" -$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSESYSTEMLIBS:BOOL=ON -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra +$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra $ make -j`nproc` $ cpack -G DEB $ sudo apt install ./megapahit-`cat newview/viewer_version.txt`-Linux.deb @@ -45,7 +45,7 @@ $ megapahit ``` $ sudo dnf install cmake gcc-c++ patch patchelf rpm-build perl-FindBin apr-util-devel boost-devel boost-url expat-devel fltk-devel glm-devel mesa-libGLU-devel hunspell-devel minizip-ng-compat-devel libnghttp2-devel nanosvg-devel pipewire-devel pulseaudio-libs-devel SDL2-devel vlc-devel libvorbis-devel libXcursor-devel libXfixes-devel libXinerama-devel xxhash-devel $ export LL_BUILD="-O3 -std=c++20 -fPIC -DLL_LINUX=1" -$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSESYSTEMLIBS:BOOL=ON -DUSE_OPENAL:BOOL=OFF -DUSE_FMODSTUDIO:BOOL=ON -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra +$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=OFF -DUSE_FMODSTUDIO:BOOL=ON -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra $ make -j`nproc` $ cpack -G RPM $ sudo dnf install megapahit-`cat newview/viewer_version.txt`-Linux.rpm @@ -58,7 +58,7 @@ $ sudo su - # portmaster devel/cmake devel/pkgconf audio/freealut devel/apr1 devel/boost-libs x11-toolkits/fltk math/glm textproc/hunspell misc/meshoptimizer archivers/minizip graphics/nanosvg www/libnghttp2 devel/sdl20 multimedia/vlc audio/libvorbis devel/xxhash # exit $ setenv LL_BUILD "-O3 -std=c++20 -fPIC" -$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSESYSTEMLIBS:BOOL=ON -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=OFF -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra +$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=OFF -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra $ make -j`nproc` $ sudo cpack -G FREEBSD $ sudo pkg add megapahit-`cat newview/viewer_version.txt`-FreeBSD.pkg @@ -81,7 +81,7 @@ $ megapahit ``` $ sudo port install cmake pkgconfig freealut +universal apr-util +universal boost187 +universal glm hunspell +universal freetype +universal libjpeg-turbo +universal minizip +universal libvorbis +universal xxhashlib $ export LL_BUILD="-O3 -gdwarf-2 -stdlib=libc++ -mmacosx-version-min=11 -iwithsysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -std=c++20 -fPIC -DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 -DNDEBUG -DPIC -DLL_DARWIN=1" -$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSESYSTEMLIBS:BOOL=ON -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=OFF -DCMAKE_INSTALL_PREFIX:PATH=newview/Megapahit.app/Contents/Resources -DCMAKE_OSX_ARCHITECTURES:STRING=`uname -m` -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=11 -DENABLE_SIGNING:BOOL=ON -DSIGNING_IDENTITY:STRING=- ../indra +$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=OFF -DCMAKE_INSTALL_PREFIX:PATH=newview/Megapahit.app/Contents/Resources -DCMAKE_OSX_ARCHITECTURES:STRING=`uname -m` -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=11 -DENABLE_SIGNING:BOOL=ON -DSIGNING_IDENTITY:STRING=- ../indra $ make -j`sysctl -n hw.ncpu` $ make install $ open newview/Megapahit.app @@ -92,7 +92,7 @@ $ open newview/Megapahit.app ``` $ sudo zypper install gcc-c++ patchelf apr-util-devel boost-devel libboost_program_options-devel libboost_url1_87_0-devel libboost_context-devel libboost_fiber-devel libboost_filesystem-devel libboost_regex-devel libboost_system-devel libboost_thread-devel libexpat-devel fltk-devel glu-devel hunspell-devel minizip-devel nanosvg-devel libnghttp2-devel pipewire-devel libpulse-devel libSDL2_gfx-1_0-0 libSDL2_gfx-devel sdl2-compat-devel vlc-devel libvorbis-devel xxhash-devel zlib-ng-devel libXrender-devel libXcursor-devel libXfixes-devel libXext-devel libXft-devel libXinerama-devel freetype2-devel fontconfig-devel libjpeg8-devel libjpeg8-devel freealut-devel $ export LL_BUILD="-O3 -std=c++20 -fPIC -DLL_LINUX=1" -$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSESYSTEMLIBS:BOOL=ON -DUSE_OPENAL:BOOL=ON -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra +$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra $ make -j`nproc` $ cpack -G RPM $ rpm --addsign megapahit-`cat newview/viewer_version.txt`-Linux.rpm (Set up pgp public key first) @@ -105,7 +105,7 @@ $ megapahit ``` $ sudo apt install cmake pkg-config libxml2-utils libaprutil1-dev libboost-fiber-dev libboost-json-dev libboost-program-options-dev libboost-regex-dev libboost-url-dev libexpat1-dev libfltk1.3-dev libfontconfig-dev libfreetype-dev libglu1-mesa-dev libhunspell-dev libjpeg-dev libmeshoptimizer-dev libminizip-dev libnanosvg-dev libnghttp2-dev libpipewire-0.3-dev libpng-dev libsdl2-dev libvlc-dev libvlccore-dev libvorbis-dev libxft-dev libxml2-dev libxxhash-dev $ export LL_BUILD="-O3 -std=c++20 -fPIC -DLL_LINUX=1" -$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSESYSTEMLIBS:BOOL=ON -DUSE_OPENAL:BOOL=OFF -DUSE_FMODSTUDIO:BOOL=ON -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra +$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=OFF -DUSE_FMODSTUDIO:BOOL=ON -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra $ make -j`nproc` $ cpack -G DEB $ sudo apt install ./megapahit-`cat newview/viewer_version.txt`-Linux.deb @@ -116,7 +116,7 @@ $ megapahit ``` $ pacman -S mingw-w64-clang-aarch64-cmake mingw-w64-clang-aarch64-pkgconf mingw-w64-clang-aarch64-freealut mingw-w64-clang-aarch64-apr-util mingw-w64-clang-aarch64-boost mingw-w64-clang-aarch64-fltk mingw-w64-clang-aarch64-glm mingw-w64-clang-aarch64-hunspell mingw-w64-clang-aarch64-minizip mingw-w64-clang-aarch64-nghttp2 mingw-w64-clang-aarch64-SDL2 mingw-w64-clang-aarch64-vlc mingw-w64-clang-aarch64-libvorbis mingw-w64-clang-aarch64-xxhash $ export LL_BUILD="-O3 -std=c++20 -fPIC -DLL_WINDOWS=1" -$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSESYSTEMLIBS:BOOL=ON -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=OFF -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=OFF -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=OFF -DPACKAGE:BOOL=OFF ../indra +$ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=OFF -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=OFF -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=OFF -DPACKAGE:BOOL=OFF ../indra ``` ## Contribute diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index 5bf08f63aa..74bb5c9355 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -24,10 +24,6 @@ if( USE_CONAN ) set( USE_AUTOBUILD_3P OFF ) conan_basic_setup(TARGETS NO_OUTPUT_DIRS) add_compile_definitions(LL_USESYSTEMLIBS USE_CONAN NO_AUTOBUILD_3P) -elseif( USESYSTEMLIBS ) - set( USE_CONAN OFF ) - set( USE_AUTOBUILD_3P OFF ) - add_compile_definitions(LL_USESYSTEMLIBS) else() set( USE_CONAN OFF ) set( USE_AUTOBUILD_3P ON ) diff --git a/indra/cmake/APR.cmake b/indra/cmake/APR.cmake index 78c536e9d4..cf31027c9a 100644 --- a/indra/cmake/APR.cmake +++ b/indra/cmake/APR.cmake @@ -5,14 +5,12 @@ include_guard() add_library( ll::apr INTERFACE IMPORTED ) -if (USESYSTEMLIBS) - include(FindPkgConfig) - pkg_check_modules(Apr REQUIRED apr-1 apr-util-1) - target_include_directories(ll::apr SYSTEM INTERFACE ${Apr_INCLUDE_DIRS}) - target_link_directories(ll::apr INTERFACE ${Apr_LIBRARY_DIRS}) - target_link_libraries(ll::apr INTERFACE ${Apr_LIBRARIES}) - return () -endif () +include(FindPkgConfig) +pkg_check_modules(Apr REQUIRED apr-1 apr-util-1) +target_include_directories(ll::apr SYSTEM INTERFACE ${Apr_INCLUDE_DIRS}) +target_link_directories(ll::apr INTERFACE ${Apr_LIBRARY_DIRS}) +target_link_libraries(ll::apr INTERFACE ${Apr_LIBRARIES}) +return () use_system_binary( apr apr-util ) use_prebuilt_binary(apr_suite) diff --git a/indra/cmake/Audio.cmake b/indra/cmake/Audio.cmake index 514d283e76..c569fba4e8 100644 --- a/indra/cmake/Audio.cmake +++ b/indra/cmake/Audio.cmake @@ -5,14 +5,12 @@ include(Prebuilt) include_guard() add_library( ll::vorbis INTERFACE IMPORTED ) -if (USESYSTEMLIBS) - include(FindPkgConfig) - pkg_check_modules(Vorbis REQUIRED ogg vorbis vorbisenc vorbisfile) - target_include_directories(ll::vorbis SYSTEM INTERFACE ${Vorbis_INCLUDE_DIRS}) - target_link_directories(ll::vorbis INTERFACE ${Vorbis_LIBRARY_DIRS}) - target_link_libraries(ll::vorbis INTERFACE ${Vorbis_LIBRARIES}) - return () -endif () +include(FindPkgConfig) +pkg_check_modules(Vorbis REQUIRED ogg vorbis vorbisenc vorbisfile) +target_include_directories(ll::vorbis SYSTEM INTERFACE ${Vorbis_INCLUDE_DIRS}) +target_link_directories(ll::vorbis INTERFACE ${Vorbis_LIBRARY_DIRS}) +target_link_libraries(ll::vorbis INTERFACE ${Vorbis_LIBRARIES}) +return () use_system_binary(vorbis) use_prebuilt_binary(ogg_vorbis) diff --git a/indra/cmake/Boost.cmake b/indra/cmake/Boost.cmake index c9688d0fe0..ba2eaccf63 100644 --- a/indra/cmake/Boost.cmake +++ b/indra/cmake/Boost.cmake @@ -4,34 +4,35 @@ include(Prebuilt) include_guard() add_library( ll::boost INTERFACE IMPORTED ) + +if (DARWIN) + set(sfx -mt) + target_include_directories( ll::boost SYSTEM INTERFACE /opt/local/libexec/boost/1.87/include) + target_link_directories( ll::boost INTERFACE /opt/local/libexec/boost/1.87/lib) +elseif (WINDOWS) + set(sfx -mt) + target_include_directories( ll::boost SYSTEM INTERFACE /opt/local/x86_64-w64-mingw32/include) + target_link_directories( ll::boost INTERFACE /opt/local/x86_64-w64-mingw32/lib) +else () + find_package( Boost REQUIRED ) +endif () +target_link_libraries( ll::boost INTERFACE + boost_context${sfx} + boost_fiber${sfx} + boost_filesystem${sfx} + boost_program_options${sfx} + boost_regex${sfx} + boost_system${sfx} + boost_thread${sfx} + boost_url${sfx} + ) +target_compile_definitions( ll::boost INTERFACE BOOST_BIND_GLOBAL_PLACEHOLDERS ) +return() + if( USE_CONAN ) target_link_libraries( ll::boost INTERFACE CONAN_PKG::boost ) target_compile_definitions( ll::boost INTERFACE BOOST_ALLOW_DEPRECATED_HEADERS BOOST_BIND_GLOBAL_PLACEHOLDERS ) return() -elseif( NOT USE_AUTOBUILD_3P ) - if (WINDOWS) - set(sfx -mt) - target_include_directories( ll::boost SYSTEM INTERFACE /opt/local/x86_64-w64-mingw32/include) - target_link_directories( ll::boost INTERFACE /opt/local/x86_64-w64-mingw32/lib) - elseif (DARWIN) - set(sfx -mt) - target_include_directories( ll::boost SYSTEM INTERFACE /opt/local/libexec/boost/1.87/include) - target_link_directories( ll::boost INTERFACE /opt/local/libexec/boost/1.87/lib) - else (WINDOWS) - find_package( Boost REQUIRED ) - endif (WINDOWS) - target_link_libraries( ll::boost INTERFACE - boost_context${sfx} - boost_fiber${sfx} - boost_filesystem${sfx} - boost_program_options${sfx} - boost_regex${sfx} - boost_system${sfx} - boost_thread${sfx} - boost_url${sfx} - ) - target_compile_definitions( ll::boost INTERFACE BOOST_BIND_GLOBAL_PLACEHOLDERS ) - return() endif() use_prebuilt_binary(boost) diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index 5525ac9f24..746d242560 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -24,7 +24,6 @@ set(cmake_SOURCE_FILES FindAutobuild.cmake FMODSTUDIO.cmake FreeType.cmake - GLEXT.cmake GLH.cmake GLM.cmake Havok.cmake diff --git a/indra/cmake/CURL.cmake b/indra/cmake/CURL.cmake index 9e9bbce47b..5868d41849 100644 --- a/indra/cmake/CURL.cmake +++ b/indra/cmake/CURL.cmake @@ -5,10 +5,8 @@ include(Linking) include_guard() add_library( ll::libcurl INTERFACE IMPORTED ) -if (NOT USESYSTEMLIBS) -use_system_binary(libcurl) -endif (NOT USESYSTEMLIBS) -if (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR DARWIN OR NOT USESYSTEMLIBS) +#use_system_binary(libcurl) +if (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR DARWIN) use_prebuilt_binary(curl) if (DARWIN) execute_process( @@ -86,8 +84,8 @@ elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRA ${ARCH_PREBUILT_DIRS}/libssl.a ) file(WRITE ${PREBUILD_TRACKING_DIR}/curl_installed "${curl_installed}") -endif (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR DARWIN OR NOT USESYSTEMLIBS) -if (WINDOWS AND NOT USESYSTEMLIBS) +endif () +if (WINDOWS) target_link_libraries(ll::libcurl INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libcurl.lib ll::openssl diff --git a/indra/cmake/FMODSTUDIO.cmake b/indra/cmake/FMODSTUDIO.cmake index 35ce932c1a..4ed9f94caf 100644 --- a/indra/cmake/FMODSTUDIO.cmake +++ b/indra/cmake/FMODSTUDIO.cmake @@ -30,7 +30,7 @@ if (USE_FMODSTUDIO) # Note: if you're not using INSTALL_PROPRIETARY, the package URL should be local (file:/// URL) # as accessing the private LL location will fail if you don't have the credential include(Prebuilt) - if (USESYSTEMLIBS AND (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/fmodstudio_installed OR NOT ${fmodstudio_installed} EQUAL 0)) + if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/fmodstudio_installed OR NOT ${fmodstudio_installed} EQUAL 0) file(MAKE_DIRECTORY ${ARCH_PREBUILT_DIRS_RELEASE}) if (DARWIN) execute_process( @@ -100,9 +100,9 @@ if (USE_FMODSTUDIO) endif (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64) file(WRITE ${PREBUILD_TRACKING_DIR}/fmodstudio_installed "0") endif (DARWIN) - else (USESYSTEMLIBS AND (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/fmodstudio_installed OR NOT ${fmodstudio_installed} EQUAL 0)) - use_prebuilt_binary(fmodstudio) - endif (USESYSTEMLIBS AND (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/fmodstudio_installed OR NOT ${fmodstudio_installed} EQUAL 0)) + endif () + + #use_prebuilt_binary(fmodstudio) if (WINDOWS) target_link_libraries( ll::fmodstudio INTERFACE fmod_vc) elseif (DARWIN) diff --git a/indra/cmake/FreeType.cmake b/indra/cmake/FreeType.cmake index 7683fe364a..d5c7891032 100644 --- a/indra/cmake/FreeType.cmake +++ b/indra/cmake/FreeType.cmake @@ -5,14 +5,13 @@ include(Linking) include_guard() add_library( ll::freetype INTERFACE IMPORTED ) -if (USESYSTEMLIBS) - include(FindPkgConfig) - pkg_check_modules(Freetype REQUIRED freetype2) - target_include_directories( ll::freetype SYSTEM INTERFACE ${Freetype_INCLUDE_DIRS} ) - target_link_directories( ll::freetype INTERFACE ${Freetype_LIBRARY_DIRS} ) - target_link_libraries( ll::freetype INTERFACE ${Freetype_LIBRARIES} ) - return () -endif (USESYSTEMLIBS) +include(FindPkgConfig) +pkg_check_modules(Freetype REQUIRED freetype2) +target_include_directories( ll::freetype SYSTEM INTERFACE ${Freetype_INCLUDE_DIRS} ) +target_link_directories( ll::freetype INTERFACE ${Freetype_LIBRARY_DIRS} ) +target_link_libraries( ll::freetype INTERFACE ${Freetype_LIBRARIES} ) +return () + use_system_binary(freetype) use_prebuilt_binary(freetype) target_include_directories( ll::freetype SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/freetype2/) diff --git a/indra/cmake/GLEXT.cmake b/indra/cmake/GLEXT.cmake index ea349237d3..a780966f0c 100644 --- a/indra/cmake/GLEXT.cmake +++ b/indra/cmake/GLEXT.cmake @@ -3,10 +3,7 @@ include(Prebuilt) include(GLH) add_library( ll::glext INTERFACE IMPORTED ) - -if (USESYSTEMLIBS) - return () -endif () - use_system_binary(glext) use_prebuilt_binary(glext) + + diff --git a/indra/cmake/GLH.cmake b/indra/cmake/GLH.cmake index 648a08454b..ac86f385c6 100644 --- a/indra/cmake/GLH.cmake +++ b/indra/cmake/GLH.cmake @@ -4,7 +4,5 @@ include(Prebuilt) add_library( ll::glh_linear INTERFACE IMPORTED ) target_include_directories( ll::glh_linear SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include) -if (NOT USESYSTEMLIBS) -use_system_binary( glh_linear ) -endif (NOT USESYSTEMLIBS) +#use_system_binary( glh_linear ) use_prebuilt_binary(glh_linear) diff --git a/indra/cmake/GLM.cmake b/indra/cmake/GLM.cmake index d411c049ec..fcf5e77cae 100644 --- a/indra/cmake/GLM.cmake +++ b/indra/cmake/GLM.cmake @@ -3,12 +3,9 @@ include(Prebuilt) add_library( ll::glm INTERFACE IMPORTED ) -if (NOT USESYSTEMLIBS) -use_system_binary( glm ) -elseif (NOT (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu) OR (${LINUX_DISTRO} MATCHES opensuse-tumbleweed))) - find_package( glm REQUIRED ) -endif (NOT USESYSTEMLIBS) - -if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu) OR (${LINUX_DISTRO} MATCHES opensuse-tumbleweed) OR NOT USESYSTEMLIBS) +#use_system_binary( glm ) +if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu) OR (${LINUX_DISTRO} MATCHES opensuse-tumbleweed)) use_prebuilt_binary(glm) +else () + find_package( glm REQUIRED ) endif () diff --git a/indra/cmake/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake index 335c2a9258..21952713ca 100644 --- a/indra/cmake/LLPrimitive.cmake +++ b/indra/cmake/LLPrimitive.cmake @@ -18,81 +18,81 @@ if( USE_CONAN ) "${CONAN_INCLUDE_DIRS_COLLADADOM}/collada-dom/1.4/" ) endif() -if( USESYSTEMLIBS ) - if( WINDOWS ) - include(FindPkgConfig) - pkg_check_modules(Colladadom REQUIRED collada-dom-141) - target_compile_definitions( ll::colladadom INTERFACE COLLADA_DOM_SUPPORT141 ) - target_include_directories( ll::colladadom SYSTEM INTERFACE ${Colladadom_INCLUDE_DIRS} ) - target_link_directories( ll::colladadom INTERFACE ${Colladadom_LIBRARY_DIRS} ) - target_link_libraries( ll::colladadom INTERFACE ${Colladadom_LIBRARIES} ) - return () - elseif( LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD ) - # Build of the collada-dom for Linux and FreeBSD is done in - # indra/llprimitive/CMakeLists.txt - return () - else( WINDOWS ) - include(FindPkgConfig) - pkg_check_modules(Minizip REQUIRED minizip) - pkg_check_modules(Libxml2 REQUIRED libxml-2.0) - target_link_libraries( ll::minizip-ng INTERFACE ${Minizip_LIBRARIES} ) - target_link_libraries( ll::libxml INTERFACE ${Libxml2_LIBRARIES} ) - if( ${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/colladadom_installed OR NOT ${colladadom_installed} EQUAL 0 ) - if( NOT EXISTS ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8.tar.gz ) - file(DOWNLOAD - https://github.com/secondlife/3p-colladadom/archive/refs/tags/v2.3-r8.tar.gz - ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8.tar.gz - ) - endif( NOT EXISTS ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8.tar.gz ) - file(ARCHIVE_EXTRACT - INPUT ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8.tar.gz - DESTINATION ${CMAKE_BINARY_DIR} +if( WINDOWS ) + include(FindPkgConfig) + pkg_check_modules(Colladadom REQUIRED collada-dom-141) + target_compile_definitions( ll::colladadom INTERFACE COLLADA_DOM_SUPPORT141 ) + target_include_directories( ll::colladadom SYSTEM INTERFACE ${Colladadom_INCLUDE_DIRS} ) + target_link_directories( ll::colladadom INTERFACE ${Colladadom_LIBRARY_DIRS} ) + target_link_libraries( ll::colladadom INTERFACE ${Colladadom_LIBRARIES} ) + return() +elseif( LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD ) + # Build of the collada-dom for Linux and FreeBSD is done in + # indra/llprimitive/CMakeLists.txt + return() +else() + include(FindPkgConfig) + pkg_check_modules(Minizip REQUIRED minizip) + pkg_check_modules(Libxml2 REQUIRED libxml-2.0) + target_link_libraries( ll::minizip-ng INTERFACE ${Minizip_LIBRARIES} ) + target_link_libraries( ll::libxml INTERFACE ${Libxml2_LIBRARIES} ) + if( ${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/colladadom_installed OR NOT ${colladadom_installed} EQUAL 0 ) + if( NOT EXISTS ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8.tar.gz ) + file(DOWNLOAD + https://github.com/secondlife/3p-colladadom/archive/refs/tags/v2.3-r8.tar.gz + ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8.tar.gz ) + endif() + file(ARCHIVE_EXTRACT + INPUT ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8.tar.gz + DESTINATION ${CMAKE_BINARY_DIR} + ) + execute_process( + COMMAND sed -i "" -e "s/SHARED/STATIC/g" CMakeLists.txt + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8/src/1.4 + ) + if( DARWIN ) + set(BOOST_CFLAGS -I${Libxml2_LIBRARY_DIRS}exec/boost/1.87/include) + set(BOOST_LIBS -L${Minizip_LIBRARY_DIRS}exec/boost/1.87/lib) + set(BOOST_LIBRARY_SUFFIX -mt) + endif() + try_compile(COLLADADOM_RESULT + PROJECT colladadom + SOURCE_DIR ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8 + BINARY_DIR ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8 + TARGET collada14dom + CMAKE_FLAGS + -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + -DCMAKE_OSX_ARCHITECTURES:STRING=${CMAKE_OSX_ARCHITECTURES} + -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${CMAKE_OSX_DEPLOYMENT_TARGET} + -DCMAKE_INSTALL_PREFIX:PATH=${LIBS_PREBUILT_DIR} + -DCMAKE_CXX_STANDARD:STRING=17 + -DCMAKE_CXX_FLAGS:STRING=-I${Minizip_INCLUDE_DIRS} + -DBoost_CFLAGS:STRING=${BOOST_CFLAGS} + -DEXTRA_COMPILE_FLAGS:STRING=-I${Libxml2_INCLUDE_DIRS} + "-DCMAKE_SHARED_LINKER_FLAGS:STRING=-L${Minizip_LIBRARY_DIRS} ${BOOST_LIBS}" + -DBoost_FILESYSTEM_LIBRARY:STRING=boost_filesystem${BOOST_LIBRARY_SUFFIX} + -DBoost_SYSTEM_LIBRARY:STRING=boost_system${BOOST_LIBRARY_SUFFIX} + -DZLIB_LIBRARIES:STRING=${Libxml2_LIBRARIES} + -DOPT_COLLADA14:BOOL=ON + -DCOLLADA_DOM_INCLUDE_INSTALL_DIR:PATH=${LIBS_PREBUILT_DIR}/include/collada + ) + if( ${COLLADADOM_RESULT} ) execute_process( - COMMAND sed -i "" -e "s/SHARED/STATIC/g" CMakeLists.txt - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8/src/1.4 + COMMAND ${CMAKE_MAKE_PROGRAM} install + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8 + OUTPUT_VARIABLE colladadom_installed ) - if( DARWIN ) - set(BOOST_CFLAGS -I${Libxml2_LIBRARY_DIRS}exec/boost/1.87/include) - set(BOOST_LIBS -L${Minizip_LIBRARY_DIRS}exec/boost/1.87/lib) - set(BOOST_LIBRARY_SUFFIX -mt) - endif() - try_compile(COLLADADOM_RESULT - PROJECT colladadom - SOURCE_DIR ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8 - BINARY_DIR ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8 - TARGET collada14dom - CMAKE_FLAGS - -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} - -DCMAKE_OSX_ARCHITECTURES:STRING=${CMAKE_OSX_ARCHITECTURES} - -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${CMAKE_OSX_DEPLOYMENT_TARGET} - -DCMAKE_INSTALL_PREFIX:PATH=${LIBS_PREBUILT_DIR} - -DCMAKE_CXX_STANDARD:STRING=17 - -DCMAKE_CXX_FLAGS:STRING=-I${Minizip_INCLUDE_DIRS} - -DBoost_CFLAGS:STRING=${BOOST_CFLAGS} - -DEXTRA_COMPILE_FLAGS:STRING=-I${Libxml2_INCLUDE_DIRS} - "-DCMAKE_SHARED_LINKER_FLAGS:STRING=-L${Minizip_LIBRARY_DIRS} ${BOOST_LIBS}" - -DBoost_FILESYSTEM_LIBRARY:STRING=boost_filesystem${BOOST_LIBRARY_SUFFIX} - -DBoost_SYSTEM_LIBRARY:STRING=boost_system${BOOST_LIBRARY_SUFFIX} - -DZLIB_LIBRARIES:STRING=${Libxml2_LIBRARIES} - -DOPT_COLLADA14:BOOL=ON - -DCOLLADA_DOM_INCLUDE_INSTALL_DIR:PATH=${LIBS_PREBUILT_DIR}/include/collada + file(RENAME + ${ARCH_PREBUILT_DIRS}/libcollada14dom.a + ${ARCH_PREBUILT_DIRS_RELEASE}/libcollada14dom.a ) - if( ${COLLADADOM_RESULT} ) - execute_process( - COMMAND ${CMAKE_MAKE_PROGRAM} install - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8 - OUTPUT_VARIABLE colladadom_installed - ) - file(RENAME - ${ARCH_PREBUILT_DIRS}/libcollada14dom.a - ${ARCH_PREBUILT_DIRS_RELEASE}/libcollada14dom.a - ) - file(WRITE ${PREBUILD_TRACKING_DIR}/colladadom_installed "${colladadom_installed}") - endif( ${COLLADADOM_RESULT} ) - endif( ${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/colladadom_installed OR NOT ${colladadom_installed} EQUAL 0 ) - endif( WINDOWS ) -else( USESYSTEMLIBS ) + file(WRITE ${PREBUILD_TRACKING_DIR}/colladadom_installed "${colladadom_installed}") + endif() + endif() +endif() + +if( FALSE ) use_system_binary( colladadom ) use_prebuilt_binary(colladadom) @@ -110,7 +110,7 @@ if (WINDOWS) else() target_link_libraries( ll::libxml INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libxml2.a) endif() -endif( USESYSTEMLIBS ) +endif( FALSE ) target_include_directories( ll::colladadom SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/collada diff --git a/indra/cmake/LLWindow.cmake b/indra/cmake/LLWindow.cmake index 31907d31df..00bf0b8ef7 100644 --- a/indra/cmake/LLWindow.cmake +++ b/indra/cmake/LLWindow.cmake @@ -1,13 +1,13 @@ # -*- cmake -*- include(Variables) -include(GLEXT) +include(GLH) include(Prebuilt) include_guard() add_library( ll::SDL INTERFACE IMPORTED ) -if (USESYSTEMLIBS AND NOT (WINDOWS OR DARWIN)) +if (NOT (WINDOWS OR DARWIN)) include(FindPkgConfig) pkg_check_modules(Sdl2 REQUIRED sdl2) target_compile_definitions( ll::SDL INTERFACE LL_SDL=1) diff --git a/indra/cmake/LibVLCPlugin.cmake b/indra/cmake/LibVLCPlugin.cmake index 779576a485..5ed77af0c2 100644 --- a/indra/cmake/LibVLCPlugin.cmake +++ b/indra/cmake/LibVLCPlugin.cmake @@ -5,56 +5,41 @@ include(Prebuilt) include_guard() add_library( ll::libvlc INTERFACE IMPORTED ) -if (USESYSTEMLIBS) - if (DARWIN) - if (CMAKE_OSX_ARCHITECTURES MATCHES arm64) - if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/vlc_installed OR NOT ${vlc_installed} EQUAL 0) - if (NOT EXISTS ${CMAKE_BINARY_DIR}/vlc-3.0.21-arm64.dmg) - file(DOWNLOAD - https://get.videolan.org/vlc/3.0.21/macosx/vlc-3.0.21-arm64.dmg - ${CMAKE_BINARY_DIR}/vlc-3.0.21-arm64.dmg - ) - endif (NOT EXISTS ${CMAKE_BINARY_DIR}/vlc-3.0.21-arm64.dmg) - file(WRITE ${PREBUILD_TRACKING_DIR}/vlc_installed "0") - endif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/vlc_installed OR NOT ${vlc_installed} EQUAL 0) - execute_process( - COMMAND hdiutil attach -noverify vlc-3.0.21-arm64.dmg - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} +if (DARWIN) + if (CMAKE_OSX_ARCHITECTURES MATCHES x86_64) + set(ARCHITECTURE intel64) + else () + set(ARCHITECTURE ${CMAKE_OSX_ARCHITECTURES}) + endif () + if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/vlc_installed OR NOT ${vlc_installed} EQUAL 0) + if (NOT EXISTS ${CMAKE_BINARY_DIR}/vlc-3.0.21-${ARCHITECTURE}.dmg) + file(DOWNLOAD + https://get.videolan.org/vlc/3.0.21/macosx/vlc-3.0.21-${ARCHITECTURE}.dmg + ${CMAKE_BINARY_DIR}/vlc-3.0.21-${ARCHITECTURE}.dmg ) - else (CMAKE_OSX_ARCHITECTURES MATCHES arm64) - if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/vlc_installed OR NOT ${vlc_installed} EQUAL 0) - if (NOT EXISTS ${CMAKE_BINARY_DIR}/vlc-3.0.21-intel64.dmg) - file(DOWNLOAD - https://get.videolan.org/vlc/3.0.21/macosx/vlc-3.0.21-intel64.dmg - ${CMAKE_BINARY_DIR}/vlc-3.0.21-intel64.dmg - ) - endif (NOT EXISTS ${CMAKE_BINARY_DIR}/vlc-3.0.21-intel64.dmg) - file(WRITE ${PREBUILD_TRACKING_DIR}/vlc_installed "0") - endif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/vlc_installed OR NOT ${vlc_installed} EQUAL 0) - execute_process( - COMMAND hdiutil attach -noverify vlc-3.0.21-intel64.dmg - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - ) - endif (CMAKE_OSX_ARCHITECTURES MATCHES arm64) - target_include_directories( ll::libvlc SYSTEM INTERFACE /Volumes/VLC\ media\ player/VLC.app/Contents/MacOS/include) - target_link_directories( ll::libvlc INTERFACE /Volumes/VLC\ media\ player/VLC.app/Contents/MacOS/lib) - target_link_libraries( ll::libvlc INTERFACE vlc vlccore ) - else (DARWIN) - include(FindPkgConfig) - pkg_check_modules(Libvlc REQUIRED libvlc vlc-plugin) - target_include_directories( ll::libvlc SYSTEM INTERFACE ${Libvlc_INCLUDE_DIRS} ) - target_link_directories( ll::libvlc INTERFACE ${Libvlc_LIBRARY_DIRS} ) - target_link_libraries( ll::libvlc INTERFACE ${Libvlc_LIBRARIES} ) - endif (DARWIN) - set(LIBVLCPLUGIN ON CACHE BOOL - "LIBVLCPLUGIN support for the llplugin/llmedia test apps.") - return() -else (USESYSTEMLIBS) + endif () + file(WRITE ${PREBUILD_TRACKING_DIR}/vlc_installed "0") + endif () + execute_process( + COMMAND hdiutil attach -noverify vlc-3.0.21-${ARCHITECTURE}.dmg + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) + target_include_directories( ll::libvlc SYSTEM INTERFACE /Volumes/VLC\ media\ player/VLC.app/Contents/MacOS/include) + target_link_directories( ll::libvlc INTERFACE /Volumes/VLC\ media\ player/VLC.app/Contents/MacOS/lib) + target_link_libraries( ll::libvlc INTERFACE vlc vlccore ) +else () + include(FindPkgConfig) + pkg_check_modules(Libvlc REQUIRED libvlc vlc-plugin) + target_include_directories( ll::libvlc SYSTEM INTERFACE ${Libvlc_INCLUDE_DIRS} ) + target_link_directories( ll::libvlc INTERFACE ${Libvlc_LIBRARY_DIRS} ) + target_link_libraries( ll::libvlc INTERFACE ${Libvlc_LIBRARIES} ) +endif () -use_prebuilt_binary(vlc-bin) +#use_prebuilt_binary(vlc-bin) set(LIBVLCPLUGIN ON CACHE BOOL "LIBVLCPLUGIN support for the llplugin/llmedia test apps.") -endif (USESYSTEMLIBS) + +return() if (WINDOWS) target_link_libraries( ll::libvlc INTERFACE diff --git a/indra/cmake/Meshoptimizer.cmake b/indra/cmake/Meshoptimizer.cmake index d5c6598d94..24be3a256d 100644 --- a/indra/cmake/Meshoptimizer.cmake +++ b/indra/cmake/Meshoptimizer.cmake @@ -6,15 +6,12 @@ include(Prebuilt) include_guard() add_library( ll::meshoptimizer INTERFACE IMPORTED ) -if (NOT USESYSTEMLIBS) -use_system_binary(meshoptimizer) -elseif (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu) OR CMAKE_SYSTEM_NAME MATCHES FreeBSD) +#use_system_binary(meshoptimizer) +if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu) OR CMAKE_SYSTEM_NAME MATCHES FreeBSD) find_package(meshoptimizer) target_link_libraries( ll::meshoptimizer INTERFACE meshoptimizer) return () -endif (NOT USESYSTEMLIBS) - -if (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 AND NOT (${LINUX_DISTRO} MATCHES gentoo) OR NOT USESYSTEMLIBS) +elseif (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 AND NOT (${LINUX_DISTRO} MATCHES gentoo)) use_prebuilt_binary(meshoptimizer) elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/meshoptimizer_installed OR NOT ${meshoptimizer_installed} EQUAL 0) if (NOT EXISTS ${CMAKE_BINARY_DIR}/meshoptimizer-0.21.tar.gz) @@ -48,12 +45,12 @@ elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRA ) file(WRITE ${PREBUILD_TRACKING_DIR}/meshoptimizer_installed "${meshoptimizer_installed}") endif (${MESHOPTIMIZER_RESULT}) -endif (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 AND NOT (${LINUX_DISTRO} MATCHES gentoo) OR NOT USESYSTEMLIBS) +endif () -if (NOT USESYSTEMLIBS AND WINDOWS) +if (WINDOWS) target_link_libraries( ll::meshoptimizer INTERFACE meshoptimizer.lib) -else (NOT USESYSTEMLIBS AND WINDOWS) +else () target_link_libraries( ll::meshoptimizer INTERFACE libmeshoptimizer.a) -endif (NOT USESYSTEMLIBS AND WINDOWS) +endif (WINDOWS) target_include_directories( ll::meshoptimizer SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/meshoptimizer) diff --git a/indra/cmake/NDOF.cmake b/indra/cmake/NDOF.cmake index 24fb23a0e3..4e93c1f9ca 100644 --- a/indra/cmake/NDOF.cmake +++ b/indra/cmake/NDOF.cmake @@ -8,9 +8,8 @@ add_library( ll::ndof INTERFACE IMPORTED ) if (NDOF) if (WINDOWS OR DARWIN) - if (NOT USESYSTEMLIBS) - use_prebuilt_binary(libndofdev) - elseif (DARWIN AND (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/libndofdev_installed OR NOT ${libndofdev_installed} EQUAL 0)) + #use_prebuilt_binary(libndofdev) + if (DARWIN AND (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/libndofdev_installed OR NOT ${libndofdev_installed} EQUAL 0)) file(DOWNLOAD https://github.com/secondlife/3p-libndofdev/archive/refs/tags/v0.1.8e9edc7.tar.gz ${CMAKE_BINARY_DIR}/3p-libndofdev-0.1.8e9edc7.tar.gz @@ -42,7 +41,7 @@ if (NDOF) ) file(WRITE ${PREBUILD_TRACKING_DIR}/libndofdev_installed "${libndofdev_installed}") endif (${LIBNDOFDEV_RESULT}) - endif (NOT USESYSTEMLIBS) + endif () elseif (LINUX) use_prebuilt_binary(open-libndofdev) endif (WINDOWS OR DARWIN) diff --git a/indra/cmake/OPENAL.cmake b/indra/cmake/OPENAL.cmake index f2eb956e2e..f63e55cdf3 100644 --- a/indra/cmake/OPENAL.cmake +++ b/indra/cmake/OPENAL.cmake @@ -19,15 +19,13 @@ endif() if (USE_OPENAL) add_library( ll::openal INTERFACE IMPORTED ) - if (USESYSTEMLIBS) - target_compile_definitions( ll::openal INTERFACE LL_OPENAL=1) - include(FindPkgConfig) - pkg_check_modules(Openal REQUIRED freealut) - target_include_directories(ll::openal SYSTEM INTERFACE ${Openal_INCLUDE_DIRS}) - target_link_directories(ll::openal INTERFACE ${Openal_LIBRARY_DIRS}) - target_link_libraries(ll::openal INTERFACE ${Openal_LIBRARIES}) - return () - endif () + target_compile_definitions( ll::openal INTERFACE LL_OPENAL=1) + include(FindPkgConfig) + pkg_check_modules(Openal REQUIRED freealut) + target_include_directories(ll::openal SYSTEM INTERFACE ${Openal_INCLUDE_DIRS}) + target_link_directories(ll::openal INTERFACE ${Openal_LIBRARY_DIRS}) + target_link_libraries(ll::openal INTERFACE ${Openal_LIBRARIES}) + return () target_include_directories( ll::openal SYSTEM INTERFACE "${LIBS_PREBUILT_DIR}/include/AL") target_compile_definitions( ll::openal INTERFACE LL_OPENAL=1) diff --git a/indra/cmake/OpenJPEG.cmake b/indra/cmake/OpenJPEG.cmake index cf008faebf..6b65145174 100644 --- a/indra/cmake/OpenJPEG.cmake +++ b/indra/cmake/OpenJPEG.cmake @@ -4,10 +4,8 @@ include(Prebuilt) include_guard() add_library( ll::openjpeg INTERFACE IMPORTED ) -if (NOT USESYSTEMLIBS) -use_system_binary(openjpeg) -endif (NOT USESYSTEMLIBS) -if (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR NOT USESYSTEMLIBS) +#use_system_binary(openjpeg) +if (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64) use_prebuilt_binary(openjpeg) elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/openjpeg_installed OR NOT ${openjpeg_installed} EQUAL 0) if (NOT EXISTS ${CMAKE_BINARY_DIR}/3p-openjpeg-2.5.0.ea12248.tar.gz) @@ -54,7 +52,7 @@ elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRA ) file(WRITE ${PREBUILD_TRACKING_DIR}/openjpeg_installed "${openjpeg_installed}") endif (${OPENJPEG_RESULT}) -endif (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR NOT USESYSTEMLIBS) +endif () target_link_libraries(ll::openjpeg INTERFACE openjp2 ) target_include_directories( ll::openjpeg SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include) diff --git a/indra/cmake/OpenSSL.cmake b/indra/cmake/OpenSSL.cmake index 8b9c737325..ecc9e30ac3 100644 --- a/indra/cmake/OpenSSL.cmake +++ b/indra/cmake/OpenSSL.cmake @@ -5,10 +5,8 @@ include(Linking) include_guard() add_library( ll::openssl INTERFACE IMPORTED ) -if (NOT USESYSTEMLIBS) -use_system_binary(openssl) -endif (NOT USESYSTEMLIBS) -if (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR DARWIN OR NOT USESYSTEMLIBS) +#use_system_binary(openssl) +if (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR DARWIN) use_prebuilt_binary(openssl) if (DARWIN) execute_process( @@ -67,15 +65,15 @@ elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRA RESULT_VARIABLE openssl_installed ) file(WRITE ${PREBUILD_TRACKING_DIR}/openssl_installed "${openssl_installed}") -endif (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR DARWIN OR NOT USESYSTEMLIBS) -if (WINDOWS AND NOT USESYSTEMLIBS) +endif () +if (WINDOWS) target_link_libraries(ll::openssl INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libssl.lib ${ARCH_PREBUILT_DIRS_RELEASE}/libcrypto.lib Crypt32.lib) elseif (LINUX) target_link_libraries(ll::openssl INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE}/libssl.a ${ARCH_PREBUILT_DIRS_RELEASE}/libcrypto.a dl) else() target_link_libraries(ll::openssl INTERFACE ssl crypto) -endif (WINDOWS AND NOT USESYSTEMLIBS) -if (NOT (WINDOWS AND USESYSTEMLIBS)) +endif (WINDOWS) +if (NOT WINDOWS) target_include_directories( ll::openssl SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include) -endif (NOT (WINDOWS AND USESYSTEMLIBS)) +endif () diff --git a/indra/cmake/Prebuilt.cmake b/indra/cmake/Prebuilt.cmake index 751e83051f..2d5eb5d805 100644 --- a/indra/cmake/Prebuilt.cmake +++ b/indra/cmake/Prebuilt.cmake @@ -40,38 +40,37 @@ macro (use_prebuilt_binary _binary) --install-dir=${AUTOBUILD_INSTALL_DIR} ${_binary} ") endif(DEBUG_PREBUILT) - if(USESYSTEMLIBS) + execute_process(COMMAND xmllint + --xpath + "//map/map/map/map/map/map/string[contains(text(),'${_binary}')][contains(text(),'common')]/text()" autobuild.xml + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/.. + OUTPUT_VARIABLE package_url + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if ("${package_url}" STREQUAL "") + string(TOLOWER ${CMAKE_SYSTEM_NAME} system_name) + if (${system_name} MATCHES freebsd) + set(system_name "linux") + endif (${system_name} MATCHES freebsd) execute_process(COMMAND xmllint --xpath - "//map/map/map/map/map/map/string[contains(text(),'${_binary}')][contains(text(),'common')]/text()" autobuild.xml + "//map/map/map/map/map/map/string[contains(text(),'${_binary}')][contains(text(),'${system_name}')]/text()" autobuild.xml WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/.. OUTPUT_VARIABLE package_url OUTPUT_STRIP_TRAILING_WHITESPACE ) - if ("${package_url}" STREQUAL "") - string(TOLOWER ${CMAKE_SYSTEM_NAME} system_name) - if (${system_name} MATCHES freebsd) - set(system_name "linux") - endif (${system_name} MATCHES freebsd) - execute_process(COMMAND xmllint - --xpath - "//map/map/map/map/map/map/string[contains(text(),'${_binary}')][contains(text(),'${system_name}')]/text()" autobuild.xml - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/.. - OUTPUT_VARIABLE package_url - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - endif ("${package_url}" STREQUAL "") - string(REGEX REPLACE "^https?://(megapahit.net/downloads|github.com/secondlife|automated-builds-secondlife-com.s3.amazonaws.com/ct2).*/" "" package_name ${package_url}) - file(DOWNLOAD - ${package_url} - ${CMAKE_BINARY_DIR}/${package_name} - ) - file(ARCHIVE_EXTRACT - INPUT ${CMAKE_BINARY_DIR}/${package_name} - DESTINATION ${AUTOBUILD_INSTALL_DIR} - ) - set(${_binary}_installed 0) - else(USESYSTEMLIBS) + endif ("${package_url}" STREQUAL "") + string(REGEX REPLACE "^https?://(megapahit.net/downloads|github.com/secondlife|automated-builds-secondlife-com.s3.amazonaws.com/ct2).*/" "" package_name ${package_url}) + file(DOWNLOAD + ${package_url} + ${CMAKE_BINARY_DIR}/${package_name} + ) + file(ARCHIVE_EXTRACT + INPUT ${CMAKE_BINARY_DIR}/${package_name} + DESTINATION ${AUTOBUILD_INSTALL_DIR} + ) + set(${_binary}_installed 0) + if(FALSE) execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}" install --install-dir=${AUTOBUILD_INSTALL_DIR} @@ -79,7 +78,7 @@ macro (use_prebuilt_binary _binary) WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" RESULT_VARIABLE ${_binary}_installed ) - endif(USESYSTEMLIBS) + endif() file(WRITE ${PREBUILD_TRACKING_DIR}/${_binary}_installed "${${_binary}_installed}") endif(${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0) @@ -92,6 +91,22 @@ endmacro (use_prebuilt_binary _binary) #Sadly we need a macro here, otherwise the return() will not properly work macro ( use_system_binary package ) + include(FindPkgConfig) + pkg_check_modules(${package} ${package}) + if( ${package}_FOUND ) + target_link_directories( ll::${package} INTERFACE ${${package}_LIBRARY_DIRS} ) + else() + pkg_check_modules(${package} lib${package}) + if( ${package}_FOUND ) + target_link_directories( ll::${package} INTERFACE ${${package}_LIBRARY_DIRS} ) + else() + find_package( ${package} REQUIRED ) + endif() + endif() + target_include_directories( ll::${package} SYSTEM INTERFACE ${${package}_INCLUDE_DIRS} ) + target_link_libraries( ll::${package} INTERFACE ${${package}_LIBRARIES} ) + return() + if( USE_CONAN ) target_link_libraries( ll::${package} INTERFACE CONAN_PKG::${package} ) foreach( extra_pkg "${ARGN}" ) @@ -100,22 +115,6 @@ macro ( use_system_binary package ) endif() endforeach() return() - elseif( NOT USE_AUTOBUILD_3P ) - include(FindPkgConfig) - pkg_check_modules(${package} ${package}) - if( ${package}_FOUND ) - target_link_directories( ll::${package} INTERFACE ${${package}_LIBRARY_DIRS} ) - else() - pkg_check_modules(${package} lib${package}) - if( ${package}_FOUND ) - target_link_directories( ll::${package} INTERFACE ${${package}_LIBRARY_DIRS} ) - else() - find_package( ${package} REQUIRED ) - endif() - endif() - target_include_directories( ll::${package} SYSTEM INTERFACE ${${package}_INCLUDE_DIRS} ) - target_link_libraries( ll::${package} INTERFACE ${${package}_LIBRARIES} ) - return() endif() endmacro() diff --git a/indra/cmake/UI.cmake b/indra/cmake/UI.cmake index a3423bb895..f1cde54807 100644 --- a/indra/cmake/UI.cmake +++ b/indra/cmake/UI.cmake @@ -6,9 +6,6 @@ include(GLIB) add_library( ll::uilibraries INTERFACE IMPORTED ) if (LINUX OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD") - if (NOT USESYSTEMLIBS) - use_prebuilt_binary(fltk) - endif () target_compile_definitions(ll::uilibraries INTERFACE LL_FLTK=1 LL_X11=1 ) if( USE_CONAN ) @@ -48,7 +45,7 @@ if( WINDOWS ) ) endif() -if (NOT USESYSTEMLIBS) +if (FALSE) target_include_directories( ll::uilibraries SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include ) diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake index 13f5ebf862..d8b94d5fba 100644 --- a/indra/cmake/ViewerMiscLibs.cmake +++ b/indra/cmake/ViewerMiscLibs.cmake @@ -8,16 +8,16 @@ if (NOT (WINDOWS OR DARWIN)) target_link_libraries( ll::fontconfig INTERFACE Fontconfig::Fontconfig ) endif (NOT (WINDOWS OR DARWIN)) -if( USE_AUTOBUILD_3P ) +if (FALSE) +if( NOT USE_CONAN ) use_prebuilt_binary(libhunspell) endif() -if (NOT USESYSTEMLIBS) use_prebuilt_binary(slvoice) -endif (NOT USESYSTEMLIBS) +endif (FALSE) -if ((${LINUX_DISTRO} MATCHES debian OR WINDOWS OR DARWIN) OR NOT USESYSTEMLIBS) +if (${LINUX_DISTRO} MATCHES debian OR DARWIN OR WINDOWS) use_prebuilt_binary(nanosvg) -endif ((${LINUX_DISTRO} MATCHES debian OR WINDOWS OR DARWIN) OR NOT USESYSTEMLIBS) +endif () use_prebuilt_binary(viewer-fonts) use_prebuilt_binary(emoji_shortcodes) diff --git a/indra/cmake/VulkanGltf.cmake b/indra/cmake/VulkanGltf.cmake index d7083a33c9..94541d5307 100644 --- a/indra/cmake/VulkanGltf.cmake +++ b/indra/cmake/VulkanGltf.cmake @@ -1,7 +1,5 @@ # -*- cmake -*- include(Prebuilt) -if (NOT USESYSTEMLIBS) use_prebuilt_binary(vulkan_gltf) -endif () diff --git a/indra/cmake/ZLIBNG.cmake b/indra/cmake/ZLIBNG.cmake index 5aa54b0152..7c2c59a68d 100644 --- a/indra/cmake/ZLIBNG.cmake +++ b/indra/cmake/ZLIBNG.cmake @@ -5,15 +5,15 @@ include(Prebuilt) include_guard() add_library( ll::zlib-ng INTERFACE IMPORTED ) +pkg_check_modules(Zlib REQUIRED zlib) +target_include_directories( ll::zlib-ng SYSTEM INTERFACE ${Zlib_INCLUDE_DIRS}) +target_link_directories( ll::zlib-ng INTERFACE ${Zlib_LIBRARY_DIRS} ) +target_link_libraries( ll::zlib-ng INTERFACE ${Zlib_LIBRARIES}) +return() + if(USE_CONAN ) target_link_libraries( ll::zlib-ng INTERFACE CONAN_PKG::zlib ) return() -elseif(NOT USE_AUTOBUILD_3P) - pkg_check_modules(Zlib REQUIRED zlib) - target_include_directories( ll::zlib-ng SYSTEM INTERFACE ${Zlib_INCLUDE_DIRS}) - target_link_directories( ll::zlib-ng INTERFACE ${Zlib_LIBRARY_DIRS} ) - target_link_libraries( ll::zlib-ng INTERFACE ${Zlib_LIBRARIES}) - return() endif() use_prebuilt_binary(zlib-ng) diff --git a/indra/cmake/xxHash.cmake b/indra/cmake/xxHash.cmake index 7e113feda2..84f4f4e0f2 100644 --- a/indra/cmake/xxHash.cmake +++ b/indra/cmake/xxHash.cmake @@ -6,10 +6,8 @@ set (XXHASH_CMAKE_INCLUDED TRUE) include(Prebuilt) -if (USESYSTEMLIBS) - include(FindPkgConfig) - pkg_check_modules(Xxhash REQUIRED libxxhash) - return () -endif () +include(FindPkgConfig) +pkg_check_modules(Xxhash REQUIRED libxxhash) +return () use_prebuilt_binary(xxhash) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 6aec3aada7..07f6eb95e0 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -8,9 +8,6 @@ include(bugsplat) include(Linking) include(Boost) include(LLSharedLibs) -if (NOT USESYSTEMLIBS) -include(Copy3rdPartyLibs) -endif () include(ZLIBNG) include(Tracy) @@ -306,23 +303,19 @@ if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu) OR (${LIN target_include_directories(llcommon PUBLIC ${LIBS_PREBUILT_DIR}/include) endif () -if (NOT USESYSTEMLIBS) -add_dependencies(llcommon stage_third_party_libs) -else () - target_compile_options(${PROJECT_NAME} PUBLIC -Wno-deprecated-declarations) - if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") - set_source_files_properties( - llapp.cpp - llsdutil.cpp - PROPERTIES COMPILE_FLAGS -Wno-stringop-truncation) - set_source_files_properties( - llevent.cpp - llfasttimer.cpp - PROPERTIES COMPILE_FLAGS -Wno-nonnull) - elseif (LINUX AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set_source_files_properties(llsys.cpp PROPERTIES - COMPILE_FLAGS -Wno-unused-but-set-variable) - endif() +target_compile_options(${PROJECT_NAME} PUBLIC -Wno-deprecated-declarations) +if (CMAKE_CXX_COMPILER_ID MATCHES GNU) + set_source_files_properties( + llapp.cpp + llsdutil.cpp + PROPERTIES COMPILE_FLAGS -Wno-stringop-truncation) + set_source_files_properties( + llevent.cpp + llfasttimer.cpp + PROPERTIES COMPILE_FLAGS -Wno-nonnull) +elseif (LINUX AND CMAKE_CXX_COMPILER_ID MATCHES Clang) + set_source_files_properties(llsys.cpp PROPERTIES + COMPILE_FLAGS -Wno-unused-but-set-variable) endif () include(LibraryInstall) diff --git a/indra/llimage/CMakeLists.txt b/indra/llimage/CMakeLists.txt index 30a79076ab..3abc85954b 100644 --- a/indra/llimage/CMakeLists.txt +++ b/indra/llimage/CMakeLists.txt @@ -67,15 +67,13 @@ target_link_libraries(llimage ll::libjpeg ) -if (USESYSTEMLIBS) - if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") - set_source_files_properties(llimageworker.cpp PROPERTIES COMPILE_FLAGS -Wno-int-in-bool-context) - set_source_files_properties( - llimage.cpp - llimagefilter.cpp - PROPERTIES COMPILE_FLAGS -Wno-stringop-overflow) - endif() -endif () +if (CMAKE_CXX_COMPILER_ID MATCHES GNU) + set_source_files_properties(llimageworker.cpp PROPERTIES COMPILE_FLAGS -Wno-int-in-bool-context) + set_source_files_properties( + llimage.cpp + llimagefilter.cpp + PROPERTIES COMPILE_FLAGS -Wno-stringop-overflow) +endif() include(LibraryInstall) diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt index c0a62ad225..e21b6fdb84 100644 --- a/indra/llmath/CMakeLists.txt +++ b/indra/llmath/CMakeLists.txt @@ -105,7 +105,7 @@ add_library (llmath ${llmath_SOURCE_FILES}) target_link_libraries(llmath llcommon llmeshoptimizer) target_include_directories( llmath INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) -if (USESYSTEMLIBS AND CMAKE_CXX_COMPILER_ID MATCHES "GNU") +if (CMAKE_CXX_COMPILER_ID MATCHES GNU) set_source_files_properties(llcalc.cpp PROPERTIES COMPILE_FLAGS -Wno-dangling-pointer) endif () diff --git a/indra/llmessage/CMakeLists.txt b/indra/llmessage/CMakeLists.txt index 43e9c580dc..f661e2c348 100644 --- a/indra/llmessage/CMakeLists.txt +++ b/indra/llmessage/CMakeLists.txt @@ -197,11 +197,8 @@ target_link_libraries( ) target_include_directories( llmessage INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) -if (USESYSTEMLIBS) - if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") - set_source_files_properties(llnamevalue.cpp PROPERTIES - COMPILE_FLAGS -Wno-stringop-truncation) - endif() +if (CMAKE_CXX_COMPILER_ID MATCHES GNU) + set_source_files_properties(llnamevalue.cpp PROPERTIES COMPILE_FLAGS -Wno-stringop-truncation) endif () include(LibraryInstall) diff --git a/indra/llwebrtc/CMakeLists.txt b/indra/llwebrtc/CMakeLists.txt index c4971d44b1..6c0216234c 100644 --- a/indra/llwebrtc/CMakeLists.txt +++ b/indra/llwebrtc/CMakeLists.txt @@ -28,9 +28,7 @@ list(APPEND llwebrtc_SOURCE_FILES ${llwebrtc_HEADER_FILES}) add_library (llwebrtc SHARED ${llwebrtc_SOURCE_FILES}) -if (NOT USESYSTEMLIBS) -set_target_properties(llwebrtc PROPERTIES PUBLIC_HEADER llwebrtc.h) -endif (NOT USESYSTEMLIBS) +#set_target_properties(llwebrtc PROPERTIES PUBLIC_HEADER llwebrtc.h) if (WINDOWS) cmake_policy(SET CMP0091 NEW) diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt index ce9134e7f1..d139a3373e 100644 --- a/indra/llwindow/CMakeLists.txt +++ b/indra/llwindow/CMakeLists.txt @@ -55,7 +55,6 @@ set(llwindow_LINK_LIBRARIES llfilesystem llxml ll::glm - ll::glext ll::uilibraries ll::SDL ) @@ -64,7 +63,7 @@ include_directories(${CMAKE_SOURCE_DIR}/llrender) # Libraries on which this library depends, needed for Linux builds # Sort by high-level to low-level -if (USESYSTEMLIBS AND NOT DARWIN) +if (NOT DARWIN) list(APPEND viewer_SOURCE_FILES llkeyboardsdl.cpp llwindowsdl.cpp @@ -86,7 +85,7 @@ if (USESYSTEMLIBS AND NOT DARWIN) fontconfig # For FCInit and other FC* functions. ) endif (BUILD_HEADLESS) -endif (USESYSTEMLIBS AND NOT DARWIN) +endif () if (DARWIN) list(APPEND llwindow_SOURCE_FILES diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 8c90f917b8..f667ff7542 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -2689,13 +2689,7 @@ void LLWindowSDL::spawnWebBrowser(const std::string& escaped_url, bool async) # endif // LL_X11 std::string cmd, arg; -#ifdef LL_USESYSTEMLIBS cmd = gDirUtilp->getExecutableDir(); -#else - cmd = gDirUtilp->getAppRODataDir(); - cmd += gDirUtilp->getDirDelimiter(); - cmd += "etc"; -#endif cmd += gDirUtilp->getDirDelimiter(); cmd += "launch_url.sh"; arg = escaped_url; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 18b39726aa..69b9022ddc 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -9,15 +9,11 @@ include(Linking) include(Boost) include(bugsplat) -if (NOT USESYSTEMLIBS) -include(BuildPackagesInfo) -endif () +#include(BuildPackagesInfo) include(BuildVersion) include(CMakeCopyIfDifferent) include(CubemapToEquirectangularJS) -if (NOT USESYSTEMLIBS) -include(DBusGlib) -endif () +#include(DBusGlib) include(DragDrop) include(EXPAT) include(Hunspell) @@ -45,11 +41,9 @@ include(ThreeJS) include(Tracy) include(UI) include(ViewerMiscLibs) -if (NOT USESYSTEMLIBS) -include(ViewerManager) -endif () +#include(ViewerManager) include(VisualLeakDetector) -include(VulkanGltf) +#include(VulkanGltf) include(ZLIBNG) include(LLPrimitive) @@ -1494,7 +1488,7 @@ if (DARWIN) list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) endif (DARWIN) -if (USESYSTEMLIBS AND NOT DARWIN) +if (NOT DARWIN) LIST(APPEND viewer_SOURCE_FILES llappviewerlinux.cpp) set_source_files_properties( llappviewerlinux.cpp @@ -1505,7 +1499,7 @@ if (USESYSTEMLIBS AND NOT DARWIN) SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed") endif () -endif (USESYSTEMLIBS AND NOT DARWIN) +endif () if (WINDOWS) @@ -1687,15 +1681,11 @@ set(viewer_APPSETTINGS_FILES app_settings/viewerart.xml ${CMAKE_SOURCE_DIR}/../etc/message.xml ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg - packages-info.txt + #packages-info.txt featuretable.txt featuretable_mac.txt ) -if (USESYSTEMLIBS) - list(REMOVE_ITEM viewer_APPSETTINGS_FILES packages-info.txt) -endif () - source_group("App Settings" FILES ${viewer_APPSETTINGS_FILES}) set_source_files_properties(${viewer_APPSETTINGS_FILES} @@ -2124,7 +2114,7 @@ foreach(elem ${country_codes}) configure_file(${emoji_mapping_src_file} ${emoji_mapping_dst_file} COPYONLY) endforeach() -if (PACKAGE AND USESYSTEMLIBS) +if (PACKAGE) set(CPACK_PACKAGE_NAME ${VIEWER_BINARY_NAME} CACHE STRING "Viewer binary name.") set(CPACK_PACKAGE_VERSION ${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION} @@ -2138,10 +2128,9 @@ if (PACKAGE AND USESYSTEMLIBS) set(VIEWER_PACKAGE_DOMAIN_NAME ${VIEWER_BINARY_NAME}.net ) -endif (PACKAGE AND USESYSTEMLIBS) +endif () if (LINUX) - if (USESYSTEMLIBS) add_custom_command( TARGET ${VIEWER_BINARY_NAME} POST_BUILD COMMAND ${CMAKE_SYSROOT}/usr/bin/sed @@ -2217,7 +2206,8 @@ if (LINUX) ) endif (${LINUX_DISTRO} MATCHES debian OR ${LINUX_DISTRO} MATCHES ubuntu) endif (PACKAGE) - else (USESYSTEMLIBS) + + if (FALSE) set(product SecondLife-${ARCH}-${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}) # These are the generated targets that are copied to package/ @@ -2292,8 +2282,8 @@ if (LINUX) add_dependencies(llpackage copy_l_viewer_manifest) check_message_template(llpackage) endif (PACKAGE) - endif (USESYSTEMLIBS) -elseif (USESYSTEMLIBS) + endif (FALSE) + add_custom_command( TARGET ${VIEWER_BINARY_NAME} POST_BUILD COMMAND sed @@ -2379,12 +2369,12 @@ if (DARWIN) "${VIEWER_APP_BUNDLE}/Contents/Info.plist" ) - if (USESYSTEMLIBS) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/English.lproj/InfoPlist.strings ${CMAKE_CURRENT_BINARY_DIR}/InfoPlist.strings ) - else (USESYSTEMLIBS) + + if (FALSE) add_custom_command( TARGET ${VIEWER_BINARY_NAME} POST_BUILD COMMAND ${PYTHON_EXECUTABLE} @@ -2409,7 +2399,7 @@ if (DARWIN) ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ) - endif (USESYSTEMLIBS) + endif () if (ENABLE_MEDIA_PLUGINS) add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_libvlc media_plugin_cef) @@ -2422,10 +2412,9 @@ if (DARWIN) endif (ENABLE_SIGNING) if (PACKAGE) - if (USESYSTEMLIBS) - set(CPACK_DMG_VOLUME_NAME "${product} Installer" - CACHE STRING "Disk image volume name.") - set(CPACK_DMG_FORMAT UDRW CACHE STRING "Disk image format.") + set(CPACK_DMG_VOLUME_NAME "${product} Installer" + CACHE STRING "Disk image volume name.") + set(CPACK_DMG_FORMAT UDRW CACHE STRING "Disk image format.") set(CPACK_DMG_DS_STORE ${CMAKE_CURRENT_SOURCE_DIR}/installers/darwin/release-dmg/_DS_Store CACHE STRING "Disk image .DS_Store file.") @@ -2435,13 +2424,13 @@ if (DARWIN) set(CPACK_DMG_BACKGROUND_IMAGE ${CMAKE_CURRENT_SOURCE_DIR}/installers/darwin/release-dmg/background.jpg CACHE STRING "Disk image background image.") - set(CPACK_BUNDLE_NAME ${product} CACHE STRING "Bundle name.") - set(CPACK_BUNDLE_PLIST ${VIEWER_APP_BUNDLE}/Contents/Info.plist - CACHE STRING "Bundle Property List file.") - set(CPACK_BUNDLE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/secondlife.icns - CACHE STRING "Bundle icon file.") + set(CPACK_BUNDLE_NAME ${product} CACHE STRING "Bundle name.") + set(CPACK_BUNDLE_PLIST ${VIEWER_APP_BUNDLE}/Contents/Info.plist + CACHE STRING "Bundle Property List file.") + set(CPACK_BUNDLE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/secondlife.icns + CACHE STRING "Bundle icon file.") - else (USESYSTEMLIBS) + if (FALSE) add_custom_target(llpackage ALL DEPENDS ${VIEWER_BINARY_NAME}) add_custom_command( @@ -2467,16 +2456,16 @@ if (DARWIN) DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ) - endif (USESYSTEMLIBS) + endif () endif (PACKAGE) endif (DARWIN) if (INSTALL) include(${CMAKE_CURRENT_SOURCE_DIR}/ViewerInstall.cmake) endif (INSTALL) -if (PACKAGE AND USESYSTEMLIBS) +if (PACKAGE) include(CPack) -endif (PACKAGE AND USESYSTEMLIBS) +endif () if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIEWER_SYMBOL_FILE) if (USE_BUGSPLAT) -- cgit v1.2.3 From 793bdbf972eca4c032813d6e2c4ef4e79d1628eb Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Tue, 13 May 2025 10:48:20 +0800 Subject: Empty CMake elses & endifs parentheses to make it more flexible the next time a value in the if's parentheses gets changed again, and also to reduce duplicate pattern matches when grepping those CMake files with certain keywords. --- indra/CMakeLists.txt | 2 +- indra/cmake/CURL.cmake | 10 +++++----- indra/cmake/FMODSTUDIO.cmake | 6 +++--- indra/cmake/Meshoptimizer.cmake | 4 ++-- indra/cmake/NDOF.cmake | 2 +- indra/cmake/OpenJPEG.cmake | 4 ++-- indra/cmake/OpenSSL.cmake | 6 +++--- indra/cmake/UI.cmake | 2 +- indra/cmake/ViewerMiscLibs.cmake | 4 ++-- indra/llcommon/CMakeLists.txt | 6 +++--- indra/newview/CMakeLists.txt | 16 ++++++++-------- 11 files changed, 31 insertions(+), 31 deletions(-) diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index 74bb5c9355..b1970fba35 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -61,7 +61,7 @@ add_subdirectory(${LIBS_OPEN_PREFIX}llrender) add_subdirectory(${LIBS_OPEN_PREFIX}llfilesystem) if (NOT CMAKE_SYSTEM_NAME MATCHES FreeBSD) add_subdirectory(${LIBS_OPEN_PREFIX}llwebrtc) -endif (NOT CMAKE_SYSTEM_NAME MATCHES FreeBSD) +endif () add_subdirectory(${LIBS_OPEN_PREFIX}llwindow) add_subdirectory(${LIBS_OPEN_PREFIX}llxml) diff --git a/indra/cmake/CURL.cmake b/indra/cmake/CURL.cmake index 5868d41849..b301819536 100644 --- a/indra/cmake/CURL.cmake +++ b/indra/cmake/CURL.cmake @@ -23,15 +23,15 @@ use_prebuilt_binary(curl) -output libcurl.a WORKING_DIRECTORY ${ARCH_PREBUILT_DIRS_RELEASE} ) - endif (NOT ${curl_archs} STREQUAL ${CMAKE_OSX_ARCHITECTURES}) - endif (DARWIN) + endif () + endif () elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/curl_installed OR NOT ${curl_installed} EQUAL 0) if (NOT EXISTS ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r1.tar.gz) file(DOWNLOAD https://github.com/secondlife/3p-curl/archive/refs/tags/v7.54.1-r1.tar.gz ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r1.tar.gz ) - endif (NOT EXISTS ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r1.tar.gz) + endif () file(ARCHIVE_EXTRACT INPUT ${CMAKE_BINARY_DIR}/3p-curl-7.54.1-r1.tar.gz DESTINATION ${CMAKE_BINARY_DIR} @@ -55,7 +55,7 @@ elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRA execute_process(COMMAND sudo mv /usr/lib/libcrypto.so /usr/lib/libcrypto.so.3) execute_process(COMMAND sudo mv /usr/lib/libssl.a /usr/lib/libssl.a.3) execute_process(COMMAND sudo mv /usr/lib/libssl.so /usr/lib/libssl.so.3) - endif (CMAKE_SYSTEM_NAME MATCHES FreeBSD) + endif () set(ENV{CFLAGS} "-std=c90") execute_process( COMMAND ./configure --disable-alt-svc --disable-dict --disable-doh --disable-file --disable-gopher --disable-headers-api --disable-hsts --disable-imap --disable-ldap --disable-ldaps --disable-libcurl-option --disable-manual --disable-mqtt --disable-ntlm --disable-ntlm-wb --disable-pop3 --disable-rtsp --disable-shared --disable-smb --disable-smtp --disable-sspi --disable-telnet --disable-tftp --disable-tls-srp --disable-unix-sockets --disable-verbose --disable-versioned-symbols --enable-threaded-resolver --with-ssl=${LIBS_PREBUILT_DIR} --without-libidn2 --without-libpsl --without-libssh2 --prefix=${LIBS_PREBUILT_DIR} --libdir=${ARCH_PREBUILT_DIRS_RELEASE} @@ -78,7 +78,7 @@ elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRA execute_process(COMMAND sudo mv /usr/lib/libssl.a.3 /usr/lib/libssl.a) execute_process(COMMAND sudo mv /usr/lib/libssl.so.3 /usr/lib/libssl.so) message("OpenSSL3 header directory and library names have been restored.") - endif (CMAKE_SYSTEM_NAME MATCHES FreeBSD) + endif () file(REMOVE ${ARCH_PREBUILT_DIRS}/libcrypto.a ${ARCH_PREBUILT_DIRS}/libssl.a diff --git a/indra/cmake/FMODSTUDIO.cmake b/indra/cmake/FMODSTUDIO.cmake index 4ed9f94caf..fb4734fe7b 100644 --- a/indra/cmake/FMODSTUDIO.cmake +++ b/indra/cmake/FMODSTUDIO.cmake @@ -62,7 +62,7 @@ if (USE_FMODSTUDIO) RESULT_VARIABLE fmodstudio_installed ) file(WRITE ${PREBUILD_TRACKING_DIR}/fmodstudio_installed "${fmodstudio_installed}") - else (DARWIN) + else () file(ARCHIVE_EXTRACT INPUT $ENV{HOME}/Downloads/fmodstudioapi20228linux.tar.gz DESTINATION ${CMAKE_BINARY_DIR} @@ -97,9 +97,9 @@ if (USE_FMODSTUDIO) DESTINATION ${ARCH_PREBUILT_DIRS_RELEASE} FOLLOW_SYMLINK_CHAIN ) - endif (CMAKE_SYSTEM_PROCESSOR MATCHES aarch64) + endif () file(WRITE ${PREBUILD_TRACKING_DIR}/fmodstudio_installed "0") - endif (DARWIN) + endif () endif () #use_prebuilt_binary(fmodstudio) diff --git a/indra/cmake/Meshoptimizer.cmake b/indra/cmake/Meshoptimizer.cmake index 24be3a256d..4b428e4b83 100644 --- a/indra/cmake/Meshoptimizer.cmake +++ b/indra/cmake/Meshoptimizer.cmake @@ -19,7 +19,7 @@ elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRA https://github.com/zeux/meshoptimizer/archive/refs/tags/v0.21.tar.gz ${CMAKE_BINARY_DIR}/meshoptimizer-0.21.tar.gz ) - endif (NOT EXISTS ${CMAKE_BINARY_DIR}/meshoptimizer-0.21.tar.gz) + endif () file(ARCHIVE_EXTRACT INPUT ${CMAKE_BINARY_DIR}/meshoptimizer-0.21.tar.gz DESTINATION ${CMAKE_BINARY_DIR} @@ -44,7 +44,7 @@ elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRA OUTPUT_VARIABLE meshoptimizer_installed ) file(WRITE ${PREBUILD_TRACKING_DIR}/meshoptimizer_installed "${meshoptimizer_installed}") - endif (${MESHOPTIMIZER_RESULT}) + endif () endif () if (WINDOWS) diff --git a/indra/cmake/NDOF.cmake b/indra/cmake/NDOF.cmake index 4e93c1f9ca..d6e5e53ac9 100644 --- a/indra/cmake/NDOF.cmake +++ b/indra/cmake/NDOF.cmake @@ -40,7 +40,7 @@ if (NDOF) DESTINATION ${ARCH_PREBUILT_DIRS_RELEASE} ) file(WRITE ${PREBUILD_TRACKING_DIR}/libndofdev_installed "${libndofdev_installed}") - endif (${LIBNDOFDEV_RESULT}) + endif () endif () elseif (LINUX) use_prebuilt_binary(open-libndofdev) diff --git a/indra/cmake/OpenJPEG.cmake b/indra/cmake/OpenJPEG.cmake index 6b65145174..781298afbd 100644 --- a/indra/cmake/OpenJPEG.cmake +++ b/indra/cmake/OpenJPEG.cmake @@ -13,7 +13,7 @@ elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRA https://github.com/secondlife/3p-openjpeg/archive/refs/tags/v2.5.0.ea12248.tar.gz ${CMAKE_BINARY_DIR}/3p-openjpeg-2.5.0.ea12248.tar.gz ) - endif (NOT EXISTS ${CMAKE_BINARY_DIR}/3p-openjpeg-2.5.0.ea12248.tar.gz) + endif () file(ARCHIVE_EXTRACT INPUT ${CMAKE_BINARY_DIR}/3p-openjpeg-2.5.0.ea12248.tar.gz DESTINATION ${CMAKE_BINARY_DIR} @@ -51,7 +51,7 @@ elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRA DESTINATION ${LIBS_PREBUILT_DIR}/include/openjpeg ) file(WRITE ${PREBUILD_TRACKING_DIR}/openjpeg_installed "${openjpeg_installed}") - endif (${OPENJPEG_RESULT}) + endif () endif () target_link_libraries(ll::openjpeg INTERFACE openjp2 ) diff --git a/indra/cmake/OpenSSL.cmake b/indra/cmake/OpenSSL.cmake index ecc9e30ac3..7cb59b04c3 100644 --- a/indra/cmake/OpenSSL.cmake +++ b/indra/cmake/OpenSSL.cmake @@ -23,7 +23,7 @@ use_prebuilt_binary(openssl) -output libcrypto.a WORKING_DIRECTORY ${ARCH_PREBUILT_DIRS_RELEASE} ) - endif (NOT ${crypto_archs} STREQUAL ${CMAKE_OSX_ARCHITECTURES}) + endif () execute_process( COMMAND lipo -archs libssl.a WORKING_DIRECTORY ${ARCH_PREBUILT_DIRS_RELEASE} @@ -38,8 +38,8 @@ use_prebuilt_binary(openssl) -output libssl.a WORKING_DIRECTORY ${ARCH_PREBUILT_DIRS_RELEASE} ) - endif (NOT ${ssl_archs} STREQUAL ${CMAKE_OSX_ARCHITECTURES}) - endif (DARWIN) + endif () + endif () elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/openssl_installed OR NOT ${openssl_installed} EQUAL 0) if (NOT EXISTS ${CMAKE_BINARY_DIR}/OpenSSL_1_1_1w.tar.gz) file(DOWNLOAD diff --git a/indra/cmake/UI.cmake b/indra/cmake/UI.cmake index f1cde54807..ada5b6da3b 100644 --- a/indra/cmake/UI.cmake +++ b/indra/cmake/UI.cmake @@ -27,7 +27,7 @@ if (LINUX OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD") ll::gio ) -endif (LINUX OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD") +endif () if( WINDOWS ) target_link_libraries( ll::uilibraries INTERFACE opengl32 diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake index d8b94d5fba..4ab69e30aa 100644 --- a/indra/cmake/ViewerMiscLibs.cmake +++ b/indra/cmake/ViewerMiscLibs.cmake @@ -1,12 +1,12 @@ # -*- cmake -*- include(Prebuilt) -if (NOT (WINDOWS OR DARWIN)) +if (NOT (DARWIN OR WINDOWS)) add_library( ll::fontconfig INTERFACE IMPORTED ) find_package(Fontconfig REQUIRED) target_link_libraries( ll::fontconfig INTERFACE Fontconfig::Fontconfig ) -endif (NOT (WINDOWS OR DARWIN)) +endif () if (FALSE) if( NOT USE_CONAN ) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 07f6eb95e0..ac35bec368 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -293,11 +293,11 @@ if (CMAKE_OSX_ARCHITECTURES MATCHES arm64 OR CMAKE_SYSTEM_PROCESSOR MATCHES aarc https://raw.githubusercontent.com/DLTcollab/sse2neon/master/sse2neon.h ${LIBS_PREBUILT_DIR}/include/sse2neon/sse2neon.h ) - endif (NOT EXISTS ${LIBS_PREBUILT_DIR}/include/sse2neon/sse2neon.h) + endif () file(WRITE ${PREBUILD_TRACKING_DIR}/sse2neon_installed "0") - endif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/sse2neon_installed OR NOT ${sse2neon_installed} EQUAL 0) + endif () target_include_directories(llcommon PUBLIC ${LIBS_PREBUILT_DIR}/include/sse2neon) -endif (CMAKE_OSX_ARCHITECTURES MATCHES arm64 OR CMAKE_SYSTEM_PROCESSOR MATCHES aarch64) +endif () if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu) OR (${LINUX_DISTRO} MATCHES opensuse-tumbleweed)) target_include_directories(llcommon PUBLIC ${LIBS_PREBUILT_DIR}/include) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 69b9022ddc..1b0cb9843d 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -50,7 +50,7 @@ include(LLPrimitive) if (ENABLE_MEDIA_PLUGINS) include(LibVLCPlugin) include(CEFPlugin) -endif (ENABLE_MEDIA_PLUGINS) +endif () if (NOT HAVOK_TPV) # When using HAVOK_TPV, the library is precompiled, so no need for this @@ -745,7 +745,7 @@ set(viewer_SOURCE_FILES if (CMAKE_SYSTEM_NAME MATCHES FreeBSD) list(REMOVE_ITEM viewer_SOURCE_FILES llvoicewebrtc.cpp) -endif (CMAKE_SYSTEM_NAME MATCHES FreeBSD) +endif () set(VIEWER_BINARY_NAME "secondlife-bin" CACHE STRING "The name of the viewer executable to create.") @@ -2016,14 +2016,14 @@ target_link_libraries(${VIEWER_BINARY_NAME} if (NOT CMAKE_SYSTEM_NAME MATCHES FreeBSD) target_link_libraries(${VIEWER_BINARY_NAME} llwebrtc ) -endif (NOT CMAKE_SYSTEM_NAME MATCHES FreeBSD) +endif () if (ENABLE_MEDIA_PLUGINS) target_link_libraries(${VIEWER_BINARY_NAME} ll::libvlc ) if (DARWIN OR LINUX) target_link_libraries(${VIEWER_BINARY_NAME} ll::cef ) - endif (DARWIN OR LINUX) -endif (ENABLE_MEDIA_PLUGINS) + endif () +endif () if( TARGET ll::intel_memops ) target_link_libraries(${VIEWER_BINARY_NAME} ll::intel_memops ) @@ -2324,7 +2324,7 @@ if (LINUX) set(CPACK_FREEBSD_PACKAGE_DEPS "audio/freealut;graphics/libGLU;textproc/hunspell;misc/meshoptimizer;archivers/minizip;www/libnghttp2;multimedia/vlc;audio/libvorbis" CACHE STRING "FreeBSD package dependencies.") - endif (CMAKE_SYSTEM_NAME MATCHES FreeBSD AND PACKAGE) + endif () endif (LINUX) if (DARWIN) @@ -2401,9 +2401,9 @@ if (DARWIN) ) endif () - if (ENABLE_MEDIA_PLUGINS) + if (ENABLE_MEDIA_PLUGINS) add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_libvlc media_plugin_cef) - endif () + endif () if (ENABLE_SIGNING) set(SIGNING_SETTING "--signature=${SIGNING_IDENTITY}") -- cgit v1.2.3 From dc0d8d283c07c374664bb94b52d288b9bcfb887c Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Tue, 13 May 2025 10:55:06 +0800 Subject: Like the previous commit, except the opposite cause this one spans a bit far, that we need to set some value in the parentheses as a reminder. --- indra/newview/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 1b0cb9843d..ea23032fd1 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -2284,6 +2284,7 @@ if (LINUX) endif (PACKAGE) endif (FALSE) +else (LINUX) add_custom_command( TARGET ${VIEWER_BINARY_NAME} POST_BUILD COMMAND sed @@ -2325,6 +2326,7 @@ if (LINUX) "audio/freealut;graphics/libGLU;textproc/hunspell;misc/meshoptimizer;archivers/minizip;www/libnghttp2;multimedia/vlc;audio/libvorbis" CACHE STRING "FreeBSD package dependencies.") endif () + endif (LINUX) if (DARWIN) -- cgit v1.2.3 From bdc8a1845666565c5e30228d7d57532df339bc94 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Tue, 13 May 2025 10:57:30 +0800 Subject: Lose the not really required double quotes on the CMake string match tests. --- indra/cmake/LLWindow.cmake | 3 +-- indra/cmake/UI.cmake | 2 +- indra/newview/CMakeLists.txt | 7 ++++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/cmake/LLWindow.cmake b/indra/cmake/LLWindow.cmake index 00bf0b8ef7..34df3ad33b 100644 --- a/indra/cmake/LLWindow.cmake +++ b/indra/cmake/LLWindow.cmake @@ -13,14 +13,13 @@ if (NOT (WINDOWS OR DARWIN)) target_compile_definitions( ll::SDL INTERFACE LL_SDL=1) target_include_directories(ll::SDL SYSTEM INTERFACE ${Sdl2_INCLUDE_DIRS}) target_link_directories(ll::SDL INTERFACE ${Sdl2_LIBRARY_DIRS}) - if (LINUX OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD") + if (LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD) list(APPEND Sdl2_LIBRARIES X11) endif () target_link_libraries(ll::SDL INTERFACE ${Sdl2_LIBRARIES}) return () endif () - if (LINUX) #Must come first as use_system_binary can exit this file early target_compile_definitions( ll::SDL INTERFACE LL_SDL_VERSION=2 LL_SDL) diff --git a/indra/cmake/UI.cmake b/indra/cmake/UI.cmake index ada5b6da3b..85e74f03e4 100644 --- a/indra/cmake/UI.cmake +++ b/indra/cmake/UI.cmake @@ -5,7 +5,7 @@ include(GLIB) add_library( ll::uilibraries INTERFACE IMPORTED ) -if (LINUX OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD") +if (LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD) target_compile_definitions(ll::uilibraries INTERFACE LL_FLTK=1 LL_X11=1 ) if( USE_CONAN ) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index ea23032fd1..4a2535c865 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1495,7 +1495,8 @@ if (NOT DARWIN) PROPERTIES COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" ) - if (NOT CMAKE_CXX_COMPILER_ID MATCHES "AppleClang") + #LIST(APPEND viewer_SOURCE_FILES llappviewerlinux_api_dbus.cpp) + if (NOT CMAKE_CXX_COMPILER_ID MATCHES AppleClang) SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed") endif () @@ -2038,13 +2039,13 @@ set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH set_source_files_properties(llinventorygallery.cpp PROPERTIES COMPILE_FLAGS -Wno-unused-but-set-variable) -if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") +if (CMAKE_CXX_COMPILER_ID MATCHES Clang) set_source_files_properties(llappviewerlinux.cpp PROPERTIES COMPILE_FLAGS -Wno-dangling-gsl ) set_source_files_properties(llviewerstats.cpp PROPERTIES COMPILE_FLAGS -Wno-unused-value) -elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU") +elseif (CMAKE_CXX_COMPILER_ID MATCHES GNU) set_source_files_properties( llface.cpp llhttpretrypolicy.cpp -- cgit v1.2.3 From cdda54e47ad17869acbe1e6f422f9d976f1e9712 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Tue, 13 May 2025 11:03:42 +0800 Subject: Reduce 2-line CPack settings clutter to 1-lines --- indra/newview/CMakeLists.txt | 136 ++++++++++++++++++------------------------- 1 file changed, 58 insertions(+), 78 deletions(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 4a2535c865..3277179581 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -2120,15 +2120,9 @@ if (PACKAGE) CACHE STRING "Viewer binary name.") set(CPACK_PACKAGE_VERSION ${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION} CACHE STRING "Viewer major.minor.patch.revision versions.") - set(VIEWER_PACKAGE_COMMENT - "A fork of the Second Life viewer" - ) - set(VIEWER_PACKAGE_DESCRIPTION - "An entrance to virtual empires in only megabytes. A shelter for the metaverse refugees, especially those from less supported operating systems." - ) - set(VIEWER_PACKAGE_DOMAIN_NAME - ${VIEWER_BINARY_NAME}.net - ) + set(VIEWER_PACKAGE_COMMENT "A fork of the Second Life viewer") + set(VIEWER_PACKAGE_DESCRIPTION "An entrance to virtual empires in only megabytes. A shelter for the metaverse refugees, especially those from less supported operating systems.") + set(VIEWER_PACKAGE_DOMAIN_NAME ${VIEWER_BINARY_NAME}.net) endif () if (LINUX) @@ -2153,60 +2147,52 @@ if (LINUX) COMMAND ${CMAKE_SYSROOT}/usr/bin/sed ARGS -i ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt -e 's/,/, /g' ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt ) - if (PACKAGE) - if (${LINUX_DISTRO} MATCHES debian OR ${LINUX_DISTRO} MATCHES ubuntu) - set(CPACK_BINARY_DEB ON CACHE BOOL "Able to package Debian DEB.") - set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE - amd64 - CACHE STRING "Debian package architecture.") - set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${VIEWER_PACKAGE_COMMENT} - CACHE STRING "Debian package description.") - set(CPACK_DEBIAN_PACKAGE_MAINTAINER - $ENV{USER}@${VIEWER_PACKAGE_DOMAIN_NAME} - CACHE STRING "Debian package maintainer.") - set(CPACK_DEBIAN_PACKAGE_SECTION net - CACHE STRING "Debian package section.") - if (${LINUX_DISTRO} MATCHES debian) - set(CPACK_DEBIAN_PACKAGE_DEPENDS - "libalut0, libaprutil1, libboost-fiber1.81.0, libboost-filesystem1.81.0, libboost-program-options1.81.0, libboost-regex1.81.0, libboost-thread1.81.0, libboost-url1.81.0, libexpat1, libfltk1.3, libgles-dev, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1, libnghttp2-14, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base" - CACHE STRING "Debian package dependencies.") - elseif (${LINUX_DISTRO} MATCHES ubuntu) - set(CPACK_DEBIAN_PACKAGE_DEPENDS - "libaprutil1t64, libboost-fiber1.83.0, libboost-filesystem1.83.0, libboost-program-options1.83.0, libboost-regex1.83.0, libboost-thread1.83.0, libboost-url1.83.0, libexpat1, libfltk1.3t64, libgles-dev, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1, libnghttp2-14, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base" - CACHE STRING "Debian package dependencies.") - endif (${LINUX_DISTRO} MATCHES debian) - elseif (${LINUX_DISTRO} MATCHES fedora OR (${LINUX_DISTRO} MATCHES opensuse-tumbleweed)) - set(CPACK_BINARY_RPM ON CACHE BOOL "Able to package Fedora RPM.") - set(CPACK_RPM_PACKAGE_SUMMARY ${VIEWER_PACKAGE_COMMENT} - CACHE STRING "RPM package summary.") - set(CPACK_RPM_PACKAGE_ARCHITECTURE - ${CMAKE_SYSTEM_PROCESSOR} - CACHE STRING "RPM package architecture.") - set(CPACK_RPM_PACKAGE_LICENSE LGPL-2.1-only - CACHE STRING "RPM package license.") - set(CPACK_RPM_PACKAGE_VENDOR ${VIEWER_CHANNEL} - CACHE STRING "RPM package vendor.") - set(CPACK_RPM_PACKAGE_URL - https://${VIEWER_PACKAGE_DOMAIN_NAME} - CACHE STRING "RPM package URL.") - set(CPACK_RPM_PACKAGE_DESCRIPTION ${VIEWER_PACKAGE_DESCRIPTION} - CACHE STRING "RPM package description.") - if (${LINUX_DISTRO} MATCHES fedora) - set(CPACK_RPM_PACKAGE_REQUIRES - "apr-util, boost-fiber, boost-program-options, boost-regex, boost-thread, boost-url, expat, fltk, mesa-libGLU, hunspell, libnghttp2, SDL2, vlc-libs, vlc-plugins-base, libvorbis" - CACHE STRING "RPM package requirements.") - elseif (${LINUX_DISTRO} MATCHES opensuse-tumbleweed) - set(CPACK_RPM_PACKAGE_REQUIRES - "libapr-util1-0, libboost_fiber1_87_0, libboost_program_options1_87_0, libboost_regex1_87_0, libboost_thread1_87_0, libboost_url1_87_0, libboost_url1_87_0-x86-64-v3, expat, libfltk1_3, libGLU1, libhunspell-1_7-0, libnghttp2-14, libSDL2-2_0-0, libvlc5, vlc-codecs, libvorbis0" - CACHE STRING "RPM package requirements.") - endif (${LINUX_DISTRO} MATCHES fedora) - elseif (${LINUX_DISTRO} MATCHES arch) - configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/PKGBUILD.in - ${CMAKE_BINARY_DIR}/PKGBUILD - ) - endif (${LINUX_DISTRO} MATCHES debian OR ${LINUX_DISTRO} MATCHES ubuntu) - endif (PACKAGE) + if (PACKAGE) + if (${LINUX_DISTRO} MATCHES arch) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/PKGBUILD.in + ${CMAKE_BINARY_DIR}/PKGBUILD + ) + elseif (${LINUX_DISTRO} MATCHES debian OR ${LINUX_DISTRO} MATCHES ubuntu) + set(CPACK_BINARY_DEB ON CACHE BOOL "Able to package Debian DEB.") + set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE amd64 + CACHE STRING "Debian package architecture.") + set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${VIEWER_PACKAGE_COMMENT} + CACHE STRING "Debian package description.") + set(CPACK_DEBIAN_PACKAGE_MAINTAINER $ENV{USER}@${VIEWER_PACKAGE_DOMAIN_NAME} + CACHE STRING "Debian package maintainer.") + set(CPACK_DEBIAN_PACKAGE_SECTION net + CACHE STRING "Debian package section.") + if (${LINUX_DISTRO} MATCHES debian) + set(CPACK_DEBIAN_PACKAGE_DEPENDS "libalut0, libaprutil1, libboost-fiber1.81.0, libboost-filesystem1.81.0, libboost-program-options1.81.0, libboost-regex1.81.0, libboost-thread1.81.0, libboost-url1.81.0, libexpat1, libfltk1.3, libgles-dev, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1, libnghttp2-14, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base" + CACHE STRING "Debian package dependencies.") + else () + set(CPACK_DEBIAN_PACKAGE_DEPENDS "libaprutil1t64, libboost-fiber1.83.0, libboost-filesystem1.83.0, libboost-program-options1.83.0, libboost-regex1.83.0, libboost-thread1.83.0, libboost-url1.83.0, libexpat1, libfltk1.3t64, libgles-dev, libglu1-mesa, libhunspell-1.7-0, libmeshoptimizer2d, libminizip1, libnghttp2-14, libsdl2-2.0-0, libvlc5, libvorbisenc2, libvorbisfile3, vlc-plugin-base" + CACHE STRING "Debian package dependencies.") + endif () + elseif (${LINUX_DISTRO} MATCHES fedora OR (${LINUX_DISTRO} MATCHES opensuse-tumbleweed)) + set(CPACK_BINARY_RPM ON CACHE BOOL "Able to package Fedora RPM.") + set(CPACK_RPM_PACKAGE_SUMMARY ${VIEWER_PACKAGE_COMMENT} + CACHE STRING "RPM package summary.") + set(CPACK_RPM_PACKAGE_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR} + CACHE STRING "RPM package architecture.") + set(CPACK_RPM_PACKAGE_LICENSE LGPL-2.1-only + CACHE STRING "RPM package license.") + set(CPACK_RPM_PACKAGE_VENDOR ${VIEWER_CHANNEL} + CACHE STRING "RPM package vendor.") + set(CPACK_RPM_PACKAGE_URL https://${VIEWER_PACKAGE_DOMAIN_NAME} + CACHE STRING "RPM package URL.") + set(CPACK_RPM_PACKAGE_DESCRIPTION ${VIEWER_PACKAGE_DESCRIPTION} + CACHE STRING "RPM package description.") + if (${LINUX_DISTRO} MATCHES fedora) + set(CPACK_RPM_PACKAGE_REQUIRES "apr-util, boost-fiber, boost-program-options, boost-regex, boost-thread, boost-url, expat, fltk, mesa-libGLU, hunspell, libnghttp2, SDL2, vlc-libs, vlc-plugins-base, libvorbis" + CACHE STRING "RPM package requirements.") + else () + set(CPACK_RPM_PACKAGE_REQUIRES "libapr-util1-0, libboost_fiber1_87_0, libboost_program_options1_87_0, libboost_regex1_87_0, libboost_thread1_87_0, libboost_url1_87_0, libboost_url1_87_0-x86-64-v3, expat, libfltk1_3, libGLU1, libhunspell-1_7-0, libnghttp2-14, libSDL2-2_0-0, libvlc5, vlc-codecs, libvorbis0" + CACHE STRING "RPM package requirements.") + endif () + endif () + endif (PACKAGE) if (FALSE) set(product SecondLife-${ARCH}-${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}) @@ -2313,18 +2299,15 @@ else (LINUX) CACHE STRING "FreeBSD package comment.") set(CPACK_FREEBSD_PACKAGE_DESCRIPTION ${VIEWER_PACKAGE_DESCRIPTION} CACHE STRING "FreeBSD package description.") - set(CPACK_FREEBSD_PACKAGE_WWW - https://${VIEWER_PACKAGE_DOMAIN_NAME} + set(CPACK_FREEBSD_PACKAGE_WWW https://${VIEWER_PACKAGE_DOMAIN_NAME} CACHE STRING "FreeBSD package WWW.") set(CPACK_FREEBSD_PACKAGE_LICENSE LGPL21 CACHE STRING "FreeBSD package license.") - set(CPACK_FREEBSD_PACKAGE_MAINTAINER - $ENV{USER}@${VIEWER_PACKAGE_DOMAIN_NAME} + set(CPACK_FREEBSD_PACKAGE_MAINTAINER $ENV{USER}@${VIEWER_PACKAGE_DOMAIN_NAME} CACHE STRING "FreeBSD package maintainer.") set(CPACK_FREEBSD_PACKAGE_ORIGIN net/${VIEWER_BINARY_NAME} CACHE STRING "FreeBSD package origin.") - set(CPACK_FREEBSD_PACKAGE_DEPS - "audio/freealut;graphics/libGLU;textproc/hunspell;misc/meshoptimizer;archivers/minizip;www/libnghttp2;multimedia/vlc;audio/libvorbis" + set(CPACK_FREEBSD_PACKAGE_DEPS "audio/freealut;graphics/libGLU;textproc/hunspell;misc/meshoptimizer;archivers/minizip;www/libnghttp2;multimedia/vlc;audio/libvorbis" CACHE STRING "FreeBSD package dependencies.") endif () @@ -2418,15 +2401,12 @@ if (DARWIN) set(CPACK_DMG_VOLUME_NAME "${product} Installer" CACHE STRING "Disk image volume name.") set(CPACK_DMG_FORMAT UDRW CACHE STRING "Disk image format.") - set(CPACK_DMG_DS_STORE - ${CMAKE_CURRENT_SOURCE_DIR}/installers/darwin/release-dmg/_DS_Store - CACHE STRING "Disk image .DS_Store file.") - set(CPACK_DMG_DS_STORE_SETUP_SCRIPT - ${CMAKE_CURRENT_SOURCE_DIR}/installers/darwin/dmg-cleanup.applescript - CACHE STRING "Disk image AppleScript file.") - set(CPACK_DMG_BACKGROUND_IMAGE - ${CMAKE_CURRENT_SOURCE_DIR}/installers/darwin/release-dmg/background.jpg - CACHE STRING "Disk image background image.") + set(CPACK_DMG_DS_STORE ${CMAKE_CURRENT_SOURCE_DIR}/installers/darwin/release-dmg/_DS_Store + CACHE STRING "Disk image .DS_Store file.") + set(CPACK_DMG_DS_STORE_SETUP_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/installers/darwin/dmg-cleanup.applescript + CACHE STRING "Disk image AppleScript file.") + set(CPACK_DMG_BACKGROUND_IMAGE ${CMAKE_CURRENT_SOURCE_DIR}/installers/darwin/release-dmg/background.jpg + CACHE STRING "Disk image background image.") set(CPACK_BUNDLE_NAME ${product} CACHE STRING "Bundle name.") set(CPACK_BUNDLE_PLIST ${VIEWER_APP_BUNDLE}/Contents/Info.plist CACHE STRING "Bundle Property List file.") -- cgit v1.2.3 From fe4c0bede1cd55395cebe80e8fa9a44f679e5d71 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Tue, 13 May 2025 11:10:31 +0800 Subject: GNU sed editing in place syntax without repetition --- indra/newview/CMakeLists.txt | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 3277179581..718579078a 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -2126,27 +2126,27 @@ if (PACKAGE) endif () if (LINUX) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_SYSROOT}/usr/bin/sed - ARGS -e '/Linden Lab.*/d' ${CMAKE_HOME_DIRECTORY}/../doc/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND ${CMAKE_SYSROOT}/usr/bin/sed - ARGS -i ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt -e '/following residents.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND ${CMAKE_SYSROOT}/usr/bin/sed - ARGS -i ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt -e '/along with.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND ${CMAKE_SYSROOT}/usr/bin/sed - ARGS -i ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt -e '/^$$/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND ${CMAKE_SYSROOT}/usr/bin/sed - ARGS -i ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt -e '/\t.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND ${CMAKE_SYSROOT}/usr/bin/sed - ARGS -i ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt -e '/^ .*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND sort - ARGS -R contributions.txt -o ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt - COMMAND paste - ARGS -s -d, ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt - COMMAND ${CMAKE_SYSROOT}/usr/bin/sed - ARGS -i ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt -e 's/,/, /g' ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt - ) + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND ${CMAKE_SYSROOT}/usr/bin/sed + ARGS -e '/Linden Lab.*/d' ${CMAKE_HOME_DIRECTORY}/../doc/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND ${CMAKE_SYSROOT}/usr/bin/sed + ARGS -i '/following residents.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND ${CMAKE_SYSROOT}/usr/bin/sed + ARGS -i '/along with.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND ${CMAKE_SYSROOT}/usr/bin/sed + ARGS -i '/^$$/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND ${CMAKE_SYSROOT}/usr/bin/sed + ARGS -i '/\t.*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND ${CMAKE_SYSROOT}/usr/bin/sed + ARGS -i '/^ .*/d' ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND sort + ARGS -R contributions.txt -o ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt + COMMAND paste + ARGS -s -d, ${CMAKE_CURRENT_BINARY_DIR}/contributions.txt > ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt + COMMAND ${CMAKE_SYSROOT}/usr/bin/sed + ARGS -i 's/,/, /g' ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt + ) if (PACKAGE) if (${LINUX_DISTRO} MATCHES arch) configure_file( -- cgit v1.2.3 From 90a13441c31ffe3e5afc0a2ea1b50b3182241992 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Tue, 13 May 2025 14:38:19 +0800 Subject: Include Expat *before* APR when configuring deps On some platforms where there's no such system library, and no prebuilt binaries for them, Expat needs to be built first before APR, because apr-util depends on Expat. --- indra/cmake/LLCommon.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/cmake/LLCommon.cmake b/indra/cmake/LLCommon.cmake index dd43ca4916..91e376352f 100644 --- a/indra/cmake/LLCommon.cmake +++ b/indra/cmake/LLCommon.cmake @@ -1,8 +1,8 @@ # -*- cmake -*- +include(EXPAT) include(APR) include(Boost) -include(EXPAT) include(Tracy) include(xxHash) include(ZLIBNG) -- cgit v1.2.3 From e466414be4621906cb4c9cfc5f4a7216ba3670aa Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 12 May 2025 22:07:49 +0300 Subject: #4055 Fix subfolder dragging --- indra/newview/llinventorybridge.cpp | 32 ++++++++++++++++++-------------- indra/newview/llinventorybridge.h | 2 +- indra/newview/llinventoryfunctions.cpp | 25 +++++++++++++++++++++++++ indra/newview/llinventoryfunctions.h | 1 + indra/newview/llinventorygallery.cpp | 13 ++++++++----- 5 files changed, 53 insertions(+), 20 deletions(-) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index bff7138282..e48fe69853 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2981,12 +2981,16 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, if (dest_res == MY_OUTFITS_SUBFOLDER && create_outfit) { // turn it into outfit - dropToMyOutfitsSubfolder(inv_cat, mUUID, LLFolderType::FT_OUTFIT, cb); + dropToMyOutfitsSubfolder(inv_cat, mUUID, cb); } else { - // or link it? - dropToMyOutfitsSubfolder(inv_cat, mUUID, LLFolderType::FT_NONE, cb); + LLInvFVBridge::changeCategoryParent( + model, + (LLViewerInventoryCategory*)inv_cat, + mUUID, + move_is_into_trash); + if (cb) cb->fire(inv_cat->getUUID()); } break; case MY_OUTFITS_SUBFOLDER: @@ -4123,11 +4127,13 @@ void LLFolderBridge::perform_pasteFromClipboard() { LLViewerInventoryCategory* cat = model->getCategory(item_id); U32 max_items_to_wear = gSavedSettings.getU32("WearFolderLimit"); + bool handled = false; if (cat && can_move_to_my_outfits_as_outfit(model, cat, max_items_to_wear)) { if (mUUID == my_outifts_id) { dropToMyOutfits(cat, cb); + handled = true; } else if (move_is_into_my_outfits) { @@ -4135,27 +4141,26 @@ void LLFolderBridge::perform_pasteFromClipboard() if (res == MY_OUTFITS_SUBFOLDER) { // turn it into outfit - dropToMyOutfitsSubfolder(cat, mUUID, LLFolderType::FT_OUTFIT, cb); - } - else - { - dropToMyOutfitsSubfolder(cat, mUUID, LLFolderType::FT_NONE, cb); + dropToMyOutfitsSubfolder(cat, mUUID, cb); + handled = true; } } } - else if (cat && can_move_to_my_outfits_as_subfolder(model, cat)) + if (!handled && cat && can_move_to_my_outfits_as_subfolder(model, cat)) { if (LLClipboard::instance().isCutMode()) { changeCategoryParent(model, cat, parent_id, false); - if (cb) cb->fire(item_id); } else { copy_inventory_category(model, cat, parent_id); } + if (cb) cb->fire(item_id); + handled = true; } - else + + if (!handled) { LLNotificationsUtil::add("MyOutfitsPasteFailed"); } @@ -5500,12 +5505,11 @@ void LLFolderBridge::dropToMyOutfits(LLInventoryCategory* inv_cat, LLPointergetThumbnailUUID()); } -void LLFolderBridge::dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id, LLFolderType::EType preferred_type, LLPointer cb) +void LLFolderBridge::dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id, LLPointer cb) { - const LLUUID outfits_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); inventory_func_type func = boost::bind(outfitFolderCreatedCallback, inv_cat->getUUID(), _1, cb, mInventoryPanel); getInventoryModel()->createNewCategory(dest_id, - preferred_type, + LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID()); diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index a101c7368a..b7bdef9b21 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -369,7 +369,7 @@ protected: void dropToFavorites(LLInventoryItem* inv_item, LLPointer cb = NULL); void dropToOutfit(LLInventoryItem* inv_item, bool move_is_into_current_outfit, LLPointer cb = NULL); void dropToMyOutfits(LLInventoryCategory* inv_cat, LLPointer cb = NULL); - void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest, LLFolderType::EType preferred_type, LLPointer cb = NULL); + void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest, LLPointer cb = NULL); //-------------------------------------------------------------------- // Messy hacks for handling folder options diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 9967318e92..3286eca265 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -460,6 +460,25 @@ void copy_inventory_category(LLInventoryModel* model, gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName(), func, cat->getThumbnailUUID()); } +void copy_inventory_category(LLInventoryModel* model, + LLViewerInventoryCategory* cat, + const LLUUID& parent_id, + const LLUUID& root_copy_id, + bool move_no_copy_items, + LLPointer callback) +{ + // Create the initial folder + inventory_func_type func = [model, cat, root_copy_id, move_no_copy_items, callback](const LLUUID& new_id) + { + copy_inventory_category_content(new_id, model, cat, root_copy_id, move_no_copy_items); + if (callback) + { + callback.get()->fire(new_id); + } + }; + gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName(), func, cat->getThumbnailUUID()); +} + void copy_cb(const LLUUID& dest_folder, const LLUUID& root_id) { // Decrement the count in root_id since that one item won't be copied over @@ -2365,6 +2384,12 @@ bool can_move_to_my_outfits_as_subfolder(LLInventoryModel* model, LLInventoryCat return false; } + if (inv_cat->getPreferredType() != LLFolderType::FT_NONE) + { + // only normal folders can become subfodlers + return false; + } + constexpr size_t MAX_CONTENT = 255; if (cats->size() > MAX_CONTENT) { diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index f56413bf5d..b23f82a189 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -78,6 +78,7 @@ void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::s void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id = LLUUID::null, bool move_no_copy_items = false); void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id, bool move_no_copy_items, inventory_func_type callback); +void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id, bool move_no_copy_items, LLPointer callback); void copy_inventory_category_content(const LLUUID& new_cat_uuid, LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& root_copy_id, bool move_no_copy_items); diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index 3222dff1b2..43d4edb069 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -65,7 +65,7 @@ const S32 FAST_LOAD_THUMBNAIL_TRSHOLD = 50; // load folders below this value imm bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, bool drop, std::string& tooltip_msg, bool is_link); bool dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, bool drop, std::string& tooltip_msg, bool user_confirm); void dropToMyOutfits(LLInventoryCategory* inv_cat); -void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id, LLFolderType::EType preferred_type); +void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id); class LLGalleryPanel: public LLPanel { @@ -3964,11 +3964,14 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, if (dest_res == MY_OUTFITS_SUBFOLDER && create_outfit) { // turn it into outfit - dropToMyOutfitsSubfolder(inv_cat, dest_id, LLFolderType::FT_OUTFIT); + dropToMyOutfitsSubfolder(inv_cat, dest_id); } else { - dropToMyOutfitsSubfolder(inv_cat, dest_id, LLFolderType::FT_NONE); + gInventory.changeCategoryParent( + (LLViewerInventoryCategory*)inv_cat, + dest_id, + move_is_into_trash); } break; case MY_OUTFITS_SUBFOLDER: @@ -4147,10 +4150,10 @@ void dropToMyOutfits(LLInventoryCategory* inv_cat) gInventory.createNewCategory(dest_id, LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID()); } -void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID &dest_id, LLFolderType::EType preferred_type) +void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID &dest_id) { // Note: creation will take time, so passing folder id to callback is slightly unreliable, // but so is collecting and passing descendants' ids inventory_func_type func = boost::bind(&outfitFolderCreatedCallback, inv_cat->getUUID(), _1); - gInventory.createNewCategory(dest_id, preferred_type, inv_cat->getName(), func, inv_cat->getThumbnailUUID()); + gInventory.createNewCategory(dest_id, LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID()); } -- cgit v1.2.3 From 6225eb8c86049a7ce52dbe092bb31afcbc679609 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 12 May 2025 23:14:22 +0300 Subject: #4060 Fix subfolders use through ctrl-v --- indra/newview/llinventorybridge.cpp | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index e48fe69853..279fb3ddf4 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -4118,16 +4118,17 @@ void LLFolderBridge::perform_pasteFromClipboard() } if (move_is_into_outfit) { + bool handled = false; if (!move_is_into_my_outfits && item && can_move_to_outfit(item, move_is_into_current_outfit)) { // todo: this is going to create dupplicate folders? dropToOutfit(item, move_is_into_current_outfit, cb); + handled = true; } else if (move_is_into_my_outfits && LLAssetType::AT_CATEGORY == obj->getType()) { LLViewerInventoryCategory* cat = model->getCategory(item_id); U32 max_items_to_wear = gSavedSettings.getU32("WearFolderLimit"); - bool handled = false; if (cat && can_move_to_my_outfits_as_outfit(model, cat, max_items_to_wear)) { if (mUUID == my_outifts_id) @@ -4135,10 +4136,10 @@ void LLFolderBridge::perform_pasteFromClipboard() dropToMyOutfits(cat, cb); handled = true; } - else if (move_is_into_my_outfits) + else { - EMyOutfitsSubfolderType res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); - if (res == MY_OUTFITS_SUBFOLDER) + EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); + if (dest_res == MY_OUTFITS_SUBFOLDER) { // turn it into outfit dropToMyOutfitsSubfolder(cat, mUUID, cb); @@ -4148,24 +4149,24 @@ void LLFolderBridge::perform_pasteFromClipboard() } if (!handled && cat && can_move_to_my_outfits_as_subfolder(model, cat)) { - if (LLClipboard::instance().isCutMode()) - { - changeCategoryParent(model, cat, parent_id, false); - } - else + EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); + if (dest_res == MY_OUTFITS_SUBFOLDER || mUUID == my_outifts_id) { - copy_inventory_category(model, cat, parent_id); + if (LLClipboard::instance().isCutMode()) + { + changeCategoryParent(model, cat, parent_id, false); + } + else + { + copy_inventory_category(model, cat, parent_id); + } + if (cb) cb->fire(item_id); + handled = true; } - if (cb) cb->fire(item_id); - handled = true; - } - - if (!handled) - { - LLNotificationsUtil::add("MyOutfitsPasteFailed"); } } - else + + if (!handled) { LLNotificationsUtil::add("MyOutfitsPasteFailed"); } -- cgit v1.2.3 From 6b0cebe9c96cf0a146d084ab7bca13f23561258f Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Tue, 13 May 2025 15:57:51 +0300 Subject: #2279 fix for View Angle setting --- indra/newview/llviewercamera.cpp | 19 ++++++++----------- indra/newview/llviewercamera.h | 4 ---- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp index 7d777162ed..89c28ee2f9 100644 --- a/indra/newview/llviewercamera.cpp +++ b/indra/newview/llviewercamera.cpp @@ -73,12 +73,14 @@ LLViewerCamera::LLViewerCamera() : LLCamera() mAverageSpeed = 0.f; mAverageAngularSpeed = 0.f; - mCameraAngleChangedSignal = gSavedSettings.getControl("CameraAngle")->getCommitSignal()->connect(boost::bind(&LLViewerCamera::updateCameraAngle, this, _2)); -} - -LLViewerCamera::~LLViewerCamera() -{ - mCameraAngleChangedSignal.disconnect(); + LLPointer cntrl_ptr = gSavedSettings.getControl("CameraAngle"); + if (cntrl_ptr.notNull()) + { + cntrl_ptr->getCommitSignal()->connect([](LLControlVariable* control, const LLSD& value, const LLSD& previous) + { + LLViewerCamera::getInstance()->setDefaultFOV((F32)value.asReal()); + }); + } } void LLViewerCamera::updateCameraLocation(const LLVector3 ¢er, const LLVector3 &up_direction, const LLVector3 &point_of_interest) @@ -814,8 +816,3 @@ bool LLViewerCamera::isDefaultFOVChanged() return false; } -void LLViewerCamera::updateCameraAngle(const LLSD& value) -{ - setDefaultFOV((F32)value.asReal()); -} - diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h index a204b85d88..91d26f09f2 100644 --- a/indra/newview/llviewercamera.h +++ b/indra/newview/llviewercamera.h @@ -43,7 +43,6 @@ class alignas(16) LLViewerCamera : public LLCamera, public LLSimpleton Date: Tue, 13 May 2025 18:21:23 +0300 Subject: #4069 Fix crash at handleToolTip --- indra/newview/lloutfitslist.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 9d8493549d..4ad4cb8d2c 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -1396,7 +1396,12 @@ bool LLOutfitAccordionCtrlTab::handleToolTip(S32 x, S32 y, MASK mask) { LLSD params; params["inv_type"] = LLInventoryType::IT_CATEGORY; - params["thumbnail_id"] = gInventory.getCategory(mFolderID)->getThumbnailUUID(); + LLViewerInventoryCategory* cat = gInventory.getCategory(mFolderID); + if (cat) + { + params["thumbnail_id"] = cat->getThumbnailUUID(); + } + // else consider returning params["item_id"] = mFolderID; LLToolTipMgr::instance().show(LLToolTip::Params() -- cgit v1.2.3 From 32cd3a608805264730933442b1fb8fabfb1603ea Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 13 May 2025 19:44:47 +0300 Subject: #4071 Permit pasting links into outfits Like it's permitted to drop them --- indra/newview/llinventorybridge.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 279fb3ddf4..f9e9049119 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -4119,9 +4119,11 @@ void LLFolderBridge::perform_pasteFromClipboard() if (move_is_into_outfit) { bool handled = false; - if (!move_is_into_my_outfits && item && can_move_to_outfit(item, move_is_into_current_outfit)) + if (mUUID != my_outifts_id + && dest_folder->getPreferredType() == LLFolderType::FT_OUTFIT + && item + && can_move_to_outfit(item, move_is_into_current_outfit)) { - // todo: this is going to create dupplicate folders? dropToOutfit(item, move_is_into_current_outfit, cb); handled = true; } -- cgit v1.2.3 From 888d4ae9dfaf7ba3866c668fbac92502ce252f3b Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 13 May 2025 21:39:10 +0300 Subject: #4072 Fix Appearance floater not updating --- indra/newview/app_settings/settings.xml | 2 +- indra/newview/lloutfitgallery.cpp | 11 ++++++ indra/newview/lloutfitslist.cpp | 70 ++++++++++++++++----------------- indra/newview/lloutfitslist.h | 2 + 4 files changed, 49 insertions(+), 36 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 61d2013224..8cfe4f3d97 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -7841,7 +7841,7 @@ RenderMinFreeMainMemoryThreshold Comment - Minimum of available physical memory in MB before textures get scaled down + If available free physical memory is below this value textures get agresively scaled down Persist 0 Type diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp index b1d5cd9e16..b84b0b3a8c 100644 --- a/indra/newview/lloutfitgallery.cpp +++ b/indra/newview/lloutfitgallery.cpp @@ -793,6 +793,17 @@ void LLOutfitGallery::updateAddedCategory(LLUUID cat_id) LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id); if (!cat) return; + if (!isOutfitFolder(cat)) + { + // Assume a subfolder that contains or will contain outfits, track it + const LLUUID outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + mOutfitsObserver->addCategory(cat_id, [this, outfits]() + { + observerCallback(outfits); + }); + return; + } + std::string name = cat->getName(); LLOutfitGalleryItem* item = buildGalleryItem(name, cat_id); mOutfitMap.insert(LLOutfitGallery::outfit_map_value_t(cat_id, item)); diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 4ad4cb8d2c..df53c66ec1 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -142,6 +142,17 @@ void LLOutfitsList::updateAddedCategory(LLUUID cat_id) LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id); if (!cat) return; + if (!isOutfitFolder(cat)) + { + // Assume a subfolder that contains or will contain outfits, track it + const LLUUID outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + mCategoriesObserver->addCategory(cat_id, [this, outfits]() + { + observerCallback(outfits); + }); + return; + } + std::string name = cat->getName(); outfit_accordion_tab_params tab_params(get_accordion_tab_params()); @@ -819,49 +830,38 @@ void LLOutfitListBase::observerCallback(const LLUUID& category_id) refreshList(category_id); } -class LLIsOutfitListFolder : public LLInventoryCollectFunctor +bool LLOutfitListBase::isOutfitFolder(LLViewerInventoryCategory* cat) const { -public: - LLIsOutfitListFolder() + if (!cat) { - mOutfitsId = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + return false; } - virtual ~LLIsOutfitListFolder() {} - - bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) override + if (cat->getPreferredType() == LLFolderType::FT_OUTFIT) { - if (cat) + return true; + } + // assumes that folder is somewhere inside MyOutfits + if (cat->getPreferredType() == LLFolderType::FT_NONE) + { + LLViewerInventoryCategory* inv_cat = dynamic_cast(cat); + if (inv_cat && inv_cat->getDescendentCount() > 3) { - if (cat->getPreferredType() == LLFolderType::FT_OUTFIT) + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf(inv_cat->getUUID(), cats, items); + if (cats->empty() // protection against outfits inside + && items->size() > 3) // arbitrary, if doesn't have at least base parts, not an outfit { + // For now assume this to be an old style outfit, not a subfolder + // but ideally no such 'outfits' should be left in My Outfits + // Todo: stop counting FT_NONE as outfits, + // convert obvious outfits into FT_OUTFIT return true; } - if (cat->getPreferredType() == LLFolderType::FT_NONE - && cat->getParentUUID() == mOutfitsId) - { - LLViewerInventoryCategory* inv_cat = dynamic_cast(cat); - if (inv_cat && inv_cat->getDescendentCount() > 3) - { - LLInventoryModel::cat_array_t* cats; - LLInventoryModel::item_array_t* items; - gInventory.getDirectDescendentsOf(inv_cat->getUUID(), cats, items); - if (cats->empty() // protection against outfits inside - && items->size() > 3) // eyes, skin, hair and shape are required - { - // For now assume this to be an old style outfit, not a subfolder - // but ideally no such 'outfits' should be left in My Outfits - // Todo: stop counting FT_NONE as outfits, - // convert obvious outfits into FT_OUTFIT - return true; - } - } - } } - return false; } -protected: - LLUUID mOutfitsId; -}; + return false; +} void LLOutfitListBase::refreshList(const LLUUID& category_id) { @@ -872,13 +872,13 @@ void LLOutfitListBase::refreshList(const LLUUID& category_id) LLInventoryModel::item_array_t item_array; // Collect all sub-categories of a given category. - LLIsOutfitListFolder is_outfit; + LLIsType is_category(LLAssetType::AT_CATEGORY); gInventory.collectDescendentsIf( category_id, cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, - is_outfit); + is_category); // Memorize item names for each UUID std::map names; diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h index f581b419d9..fad0e638fb 100644 --- a/indra/newview/lloutfitslist.h +++ b/indra/newview/lloutfitslist.h @@ -118,6 +118,8 @@ protected: void onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response); virtual void onChangeOutfitSelection(LLWearableItemsList* list, const LLUUID& category_id) = 0; + bool isOutfitFolder(LLViewerInventoryCategory* cat) const; + static void onIdle(void* userdata); void onIdleRefreshList(); -- cgit v1.2.3 From 060bebcd3cbb5fbf6045bd777364947a2d8963d3 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Wed, 14 May 2025 11:43:15 +0800 Subject: Revert "Revert to LL's OpenJPEG fork" This reverts commit 3a36cdf6ebd9d2795bdcd14162f38df568d51796. --- README.md | 12 ++--- indra/cmake/OpenJPEG.cmake | 89 ++++++++++++++++++------------- indra/llimagej2coj/llimagej2coj.cpp | 7 +-- indra/media_plugins/cef/CMakeLists.txt | 1 + indra/media_plugins/libvlc/CMakeLists.txt | 1 + indra/newview/CMakeLists.txt | 6 +-- indra/newview/FixBundle.cmake.in | 9 ++++ indra/newview/FixPackage.cmake.in | 9 ++++ indra/newview/PKGBUILD.in | 2 +- 9 files changed, 86 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 2621c522b8..78417ebde9 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ $ cd build-`uname -s|tr '[:upper:]' '[:lower:]'`-`uname -m` ### Arch ``` -$ sudo pacman -S cmake base-devel python apr-util boost fltk glm glu hunspell minizip nanosvg libnghttp2 libpipewire sdl2 vlc libvorbis xxhash +$ sudo pacman -S cmake base-devel python apr-util boost fltk glm glu hunspell minizip nanosvg libnghttp2 openjpeg2 libpipewire sdl2 vlc libvorbis xxhash $ export LL_BUILD="-O3 -std=c++20 -fPIC -DLL_LINUX=1" $ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=OFF -DUSE_FMODSTUDIO:BOOL=ON -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON -DCMAKE_INSTALL_PREFIX:PATH=/usr ../indra $ make -j`nproc` @@ -43,7 +43,7 @@ $ megapahit ### Fedora ``` -$ sudo dnf install cmake gcc-c++ patch patchelf rpm-build perl-FindBin apr-util-devel boost-devel boost-url expat-devel fltk-devel glm-devel mesa-libGLU-devel hunspell-devel minizip-ng-compat-devel libnghttp2-devel nanosvg-devel pipewire-devel pulseaudio-libs-devel SDL2-devel vlc-devel libvorbis-devel libXcursor-devel libXfixes-devel libXinerama-devel xxhash-devel +$ sudo dnf install cmake gcc-c++ patch patchelf rpm-build perl-FindBin apr-util-devel boost-devel boost-url expat-devel fltk-devel glm-devel mesa-libGLU-devel hunspell-devel minizip-ng-compat-devel libnghttp2-devel nanosvg-devel openjpeg-devel pipewire-devel pulseaudio-libs-devel SDL2-devel vlc-devel libvorbis-devel libXcursor-devel libXfixes-devel libXinerama-devel xxhash-devel $ export LL_BUILD="-O3 -std=c++20 -fPIC -DLL_LINUX=1" $ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=OFF -DUSE_FMODSTUDIO:BOOL=ON -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra $ make -j`nproc` @@ -55,14 +55,14 @@ $ megapahit ### FreeBSD ``` $ sudo su - -# portmaster devel/cmake devel/pkgconf audio/freealut devel/apr1 devel/boost-libs x11-toolkits/fltk math/glm textproc/hunspell misc/meshoptimizer archivers/minizip graphics/nanosvg www/libnghttp2 devel/sdl20 multimedia/vlc audio/libvorbis devel/xxhash +# portmaster devel/cmake devel/pkgconf audio/freealut devel/apr1 devel/boost-libs x11-toolkits/fltk math/glm textproc/hunspell misc/meshoptimizer archivers/minizip graphics/nanosvg graphics/openjpeg www/libnghttp2 devel/sdl20 multimedia/vlc audio/libvorbis devel/xxhash # exit $ setenv LL_BUILD "-O3 -std=c++20 -fPIC" $ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=OFF -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra $ make -j`nproc` $ sudo cpack -G FREEBSD $ sudo pkg add megapahit-`cat newview/viewer_version.txt`-FreeBSD.pkg -$ sudo pkg set -yA 1 freealut apr1 fltk hunspell meshoptimizer minizip nanosvg sdl20 vlc libvorbis +$ sudo pkg set -yA 1 freealut apr1 fltk hunspell meshoptimizer minizip nanosvg openjpeg sdl20 vlc libvorbis $ megapahit ``` @@ -79,7 +79,7 @@ $ megapahit ### macOS ``` -$ sudo port install cmake pkgconfig freealut +universal apr-util +universal boost187 +universal glm hunspell +universal freetype +universal libjpeg-turbo +universal minizip +universal libvorbis +universal xxhashlib +$ sudo port install cmake pkgconfig freealut +universal apr-util +universal boost187 +universal glm hunspell +universal freetype +universal minizip +universal openjpeg +universal libvorbis +universal xxhashlib $ export LL_BUILD="-O3 -gdwarf-2 -stdlib=libc++ -mmacosx-version-min=11 -iwithsysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -std=c++20 -fPIC -DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 -DNDEBUG -DPIC -DLL_DARWIN=1" $ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=OFF -DCMAKE_INSTALL_PREFIX:PATH=newview/Megapahit.app/Contents/Resources -DCMAKE_OSX_ARCHITECTURES:STRING=`uname -m` -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=11 -DENABLE_SIGNING:BOOL=ON -DSIGNING_IDENTITY:STRING=- ../indra $ make -j`sysctl -n hw.ncpu` @@ -90,7 +90,7 @@ $ open newview/Megapahit.app ### openSUSE Tumbleweed ``` -$ sudo zypper install gcc-c++ patchelf apr-util-devel boost-devel libboost_program_options-devel libboost_url1_87_0-devel libboost_context-devel libboost_fiber-devel libboost_filesystem-devel libboost_regex-devel libboost_system-devel libboost_thread-devel libexpat-devel fltk-devel glu-devel hunspell-devel minizip-devel nanosvg-devel libnghttp2-devel pipewire-devel libpulse-devel libSDL2_gfx-1_0-0 libSDL2_gfx-devel sdl2-compat-devel vlc-devel libvorbis-devel xxhash-devel zlib-ng-devel libXrender-devel libXcursor-devel libXfixes-devel libXext-devel libXft-devel libXinerama-devel freetype2-devel fontconfig-devel libjpeg8-devel libjpeg8-devel freealut-devel +$ sudo zypper install gcc-c++ patchelf apr-util-devel boost-devel libboost_program_options-devel libboost_url1_87_0-devel libboost_context-devel libboost_fiber-devel libboost_filesystem-devel libboost_regex-devel libboost_system-devel libboost_thread-devel libexpat-devel fltk-devel glu-devel hunspell-devel minizip-devel nanosvg-devel libnghttp2-devel openjpeg2-devel pipewire-devel libpulse-devel libSDL2_gfx-1_0-0 libSDL2_gfx-devel sdl2-compat-devel vlc-devel libvorbis-devel xxhash-devel zlib-ng-devel libXrender-devel libXcursor-devel libXfixes-devel libXext-devel libXft-devel libXinerama-devel freetype2-devel fontconfig-devel libjpeg8-devel libjpeg8-devel freealut-devel $ export LL_BUILD="-O3 -std=c++20 -fPIC -DLL_LINUX=1" $ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=ON -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra $ make -j`nproc` diff --git a/indra/cmake/OpenJPEG.cmake b/indra/cmake/OpenJPEG.cmake index 781298afbd..5729f6a10e 100644 --- a/indra/cmake/OpenJPEG.cmake +++ b/indra/cmake/OpenJPEG.cmake @@ -5,54 +5,69 @@ include_guard() add_library( ll::openjpeg INTERFACE IMPORTED ) #use_system_binary(openjpeg) -if (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64) -use_prebuilt_binary(openjpeg) -elseif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/openjpeg_installed OR NOT ${openjpeg_installed} EQUAL 0) - if (NOT EXISTS ${CMAKE_BINARY_DIR}/3p-openjpeg-2.5.0.ea12248.tar.gz) +#use_prebuilt_binary(openjpeg) + +if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/openjpeg_installed OR NOT ${openjpeg_installed} EQUAL 0) + if (NOT EXISTS ${CMAKE_BINARY_DIR}/openjpeg-2.5.3.tar.gz) file(DOWNLOAD - https://github.com/secondlife/3p-openjpeg/archive/refs/tags/v2.5.0.ea12248.tar.gz - ${CMAKE_BINARY_DIR}/3p-openjpeg-2.5.0.ea12248.tar.gz + https://github.com/uclouvain/openjpeg/archive/refs/tags/v2.5.3.tar.gz + ${CMAKE_BINARY_DIR}/openjpeg-2.5.3.tar.gz ) endif () file(ARCHIVE_EXTRACT - INPUT ${CMAKE_BINARY_DIR}/3p-openjpeg-2.5.0.ea12248.tar.gz + INPUT ${CMAKE_BINARY_DIR}/openjpeg-2.5.3.tar.gz DESTINATION ${CMAKE_BINARY_DIR} ) - try_compile(OPENJPEG_RESULT - PROJECT OPENJPEG - SOURCE_DIR ${CMAKE_BINARY_DIR}/3p-openjpeg-2.5.0.ea12248/openjpeg - BINARY_DIR ${CMAKE_BINARY_DIR}/3p-openjpeg-2.5.0.ea12248/openjpeg - TARGET openjp2 - CMAKE_FLAGS - -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} - -DCMAKE_OSX_ARCHITECTURES:STRING=${CMAKE_OSX_ARCHITECTURES} - -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${CMAKE_OSX_DEPLOYMENT_TARGET} - -DCMAKE_INSTALL_PREFIX:PATH=${LIBS_PREBUILT_DIR} - -DCMAKE_INSTALL_LIBDIR:PATH=${ARCH_PREBUILT_DIRS_RELEASE} - -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=ON - -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS} - -DBUILD_CODEC:BOOL=OFF - ) - if (${OPENJPEG_RESULT}) + + if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu)) + try_compile(OPENJPEG_RESULT + PROJECT OPENJPEG + SOURCE_DIR ${CMAKE_BINARY_DIR}/openjpeg-2.5.3 + BINARY_DIR ${CMAKE_BINARY_DIR}/openjpeg-2.5.3 + TARGET openjp2 + CMAKE_FLAGS + -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + -DCMAKE_OSX_ARCHITECTURES:STRING=${CMAKE_OSX_ARCHITECTURES} + -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${CMAKE_OSX_DEPLOYMENT_TARGET} + -DCMAKE_INSTALL_PREFIX:PATH=${LIBS_PREBUILT_DIR} + -DCMAKE_INSTALL_LIBDIR:PATH=${ARCH_PREBUILT_DIRS_RELEASE} + -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=ON + -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS} + -DBUILD_CODEC:BOOL=OFF + ) + if (${OPENJPEG_RESULT}) + execute_process( + COMMAND ${CMAKE_MAKE_PROGRAM} install + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/openjpeg-2.5.3 + OUTPUT_VARIABLE openjpeg_installed + ) + endif () + + else () execute_process( - COMMAND ${CMAKE_MAKE_PROGRAM} install - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-openjpeg-2.5.0.ea12248/openjpeg + COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} -DCMAKE_OSX_ARCHITECTURES:STRING=${CMAKE_OSX_ARCHITECTURES} -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${CMAKE_OSX_DEPLOYMENT_TARGET} -DCMAKE_INSTALL_PREFIX:PATH=${LIBS_PREBUILT_DIR} -DCMAKE_INSTALL_LIBDIR:PATH=${ARCH_PREBUILT_DIRS_RELEASE} -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=ON -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS} -DBUILD_CODEC:BOOL=OFF + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/openjpeg-2.5.3 OUTPUT_VARIABLE openjpeg_installed ) - file(RENAME - ${LIBS_PREBUILT_DIR}/include/openjpeg-2.5 - ${LIBS_PREBUILT_DIR}/include/openjpeg - ) - file( - COPY - ${CMAKE_BINARY_DIR}/3p-openjpeg-2.5.0.ea12248/openjpeg/src/lib/openjp2/cio.h - ${CMAKE_BINARY_DIR}/3p-openjpeg-2.5.0.ea12248/openjpeg/src/lib/openjp2/event.h - ${CMAKE_BINARY_DIR}/3p-openjpeg-2.5.0.ea12248/openjpeg/src/lib/openjp2/opj_config_private.h - DESTINATION ${LIBS_PREBUILT_DIR}/include/openjpeg - ) - file(WRITE ${PREBUILD_TRACKING_DIR}/openjpeg_installed "${openjpeg_installed}") endif () + + file( + COPY + ${CMAKE_BINARY_DIR}/openjpeg-2.5.3/src/lib/openjp2/cio.h + ${CMAKE_BINARY_DIR}/openjpeg-2.5.3/src/lib/openjp2/event.h + ${CMAKE_BINARY_DIR}/openjpeg-2.5.3/src/lib/openjp2/opj_config_private.h + DESTINATION ${LIBS_PREBUILT_DIR}/include/openjpeg-2.5 + ) + file(WRITE ${PREBUILD_TRACKING_DIR}/openjpeg_installed "${openjpeg_installed}") endif () +if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu)) target_link_libraries(ll::openjpeg INTERFACE openjp2 ) +else () + include(FindPkgConfig) + pkg_check_modules(Openjpeg REQUIRED libopenjp2) + target_include_directories(ll::openjpeg SYSTEM INTERFACE ${Openjpeg_INCLUDE_DIRS}) + target_link_directories(ll::openjpeg INTERFACE ${Openjpeg_LIBRARY_DIRS}) + target_link_libraries(ll::openjpeg INTERFACE ${Openjpeg_LIBRARIES}) +endif () target_include_directories( ll::openjpeg SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include) diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp index 1c6b9e423c..04b527d783 100644 --- a/indra/llimagej2coj/llimagej2coj.cpp +++ b/indra/llimagej2coj/llimagej2coj.cpp @@ -28,9 +28,9 @@ #include "llimagej2coj.h" // this is defined so that we get static linking. -#include -#include -#include +#include +#include +#include #define MAX_ENCODED_DISCARD_LEVELS 5 @@ -617,6 +617,7 @@ public: for (S32 c = 0; c < numcomps; c++) { cmptparm[c].prec = 8; + cmptparm[c].bpp = 8; cmptparm[c].sgnd = 0; cmptparm[c].dx = parameters.subsampling_dx; cmptparm[c].dy = parameters.subsampling_dy; diff --git a/indra/media_plugins/cef/CMakeLists.txt b/indra/media_plugins/cef/CMakeLists.txt index 99810d77d8..be016eadc4 100644 --- a/indra/media_plugins/cef/CMakeLists.txt +++ b/indra/media_plugins/cef/CMakeLists.txt @@ -112,6 +112,7 @@ if (DARWIN) add_custom_command(TARGET media_plugin_cef POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change "@executable_path/Chromium Embedded Framework" "@executable_path/../../../../Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" + -change "/opt/local/lib/libopenjp2.7.dylib" "@loader_path/../../Frameworks/libopenjp2.7.dylib" -change "/opt/local/lib/libpng16.16.dylib" "@loader_path/../../Frameworks/libpng16.16.dylib" -change "/opt/local/lib/libjpeg.8.dylib" "@loader_path/../../Frameworks/libjpeg.8.dylib" -change "/opt/local/lib/libfreetype.6.dylib" "@loader_path/../../Frameworks/libfreetype.6.dylib" diff --git a/indra/media_plugins/libvlc/CMakeLists.txt b/indra/media_plugins/libvlc/CMakeLists.txt index 547733496f..e99f25a1df 100644 --- a/indra/media_plugins/libvlc/CMakeLists.txt +++ b/indra/media_plugins/libvlc/CMakeLists.txt @@ -49,6 +49,7 @@ if (DARWIN) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL} + -change "/opt/local/lib/libopenjp2.7.dylib" "@loader_path/../../Frameworks/libopenjp2.7.dylib" -change "/opt/local/lib/libpng16.16.dylib" "@loader_path/../../Frameworks/libpng16.16.dylib" -change "/opt/local/lib/libjpeg.8.dylib" "@loader_path/../../Frameworks/libjpeg.8.dylib" -change "/opt/local/lib/libfreetype.6.dylib" "@loader_path/../../Frameworks/libfreetype.6.dylib" diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 718579078a..25c4926835 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -2185,10 +2185,10 @@ if (LINUX) set(CPACK_RPM_PACKAGE_DESCRIPTION ${VIEWER_PACKAGE_DESCRIPTION} CACHE STRING "RPM package description.") if (${LINUX_DISTRO} MATCHES fedora) - set(CPACK_RPM_PACKAGE_REQUIRES "apr-util, boost-fiber, boost-program-options, boost-regex, boost-thread, boost-url, expat, fltk, mesa-libGLU, hunspell, libnghttp2, SDL2, vlc-libs, vlc-plugins-base, libvorbis" + set(CPACK_RPM_PACKAGE_REQUIRES "apr-util, boost-fiber, boost-program-options, boost-regex, boost-thread, boost-url, expat, fltk, mesa-libGLU, hunspell, libnghttp2, openjpeg2, SDL2, vlc-libs, vlc-plugins-base, libvorbis" CACHE STRING "RPM package requirements.") else () - set(CPACK_RPM_PACKAGE_REQUIRES "libapr-util1-0, libboost_fiber1_87_0, libboost_program_options1_87_0, libboost_regex1_87_0, libboost_thread1_87_0, libboost_url1_87_0, libboost_url1_87_0-x86-64-v3, expat, libfltk1_3, libGLU1, libhunspell-1_7-0, libnghttp2-14, libSDL2-2_0-0, libvlc5, vlc-codecs, libvorbis0" + set(CPACK_RPM_PACKAGE_REQUIRES "libapr-util1-0, libboost_fiber1_87_0, libboost_program_options1_87_0, libboost_regex1_87_0, libboost_thread1_87_0, libboost_url1_87_0, libboost_url1_87_0-x86-64-v3, expat, libfltk1_3, libGLU1, libhunspell-1_7-0, libnghttp2-14, openjpeg2, libSDL2-2_0-0, libvlc5, vlc-codecs, libvorbis0" CACHE STRING "RPM package requirements.") endif () endif () @@ -2307,7 +2307,7 @@ else (LINUX) CACHE STRING "FreeBSD package maintainer.") set(CPACK_FREEBSD_PACKAGE_ORIGIN net/${VIEWER_BINARY_NAME} CACHE STRING "FreeBSD package origin.") - set(CPACK_FREEBSD_PACKAGE_DEPS "audio/freealut;graphics/libGLU;textproc/hunspell;misc/meshoptimizer;archivers/minizip;www/libnghttp2;multimedia/vlc;audio/libvorbis" + set(CPACK_FREEBSD_PACKAGE_DEPS "audio/freealut;graphics/libGLU;textproc/hunspell;misc/meshoptimizer;archivers/minizip;www/libnghttp2;graphics/openjpeg;multimedia/vlc;audio/libvorbis" CACHE STRING "FreeBSD package dependencies.") endif () diff --git a/indra/newview/FixBundle.cmake.in b/indra/newview/FixBundle.cmake.in index e2fa244577..829c19e5e4 100644 --- a/indra/newview/FixBundle.cmake.in +++ b/indra/newview/FixBundle.cmake.in @@ -9,6 +9,11 @@ file(CREATE_LINK "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libnghttp2.14.dylib" SYMBOLIC ) +file(CREATE_LINK + "../../../../Frameworks/libopenjp2.7.dylib" + "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libopenjp2.7.dylib" + SYMBOLIC + ) file(CREATE_LINK "../../../../Frameworks/libpng16.16.dylib" "${viewer_BINARY_DIR}/${VIEWER_CHANNEL}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libpng16.16.dylib" @@ -235,6 +240,9 @@ execute_process( COMMAND lipo libopenal.1.24.2.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libopenal.1.24.2.dylib + COMMAND lipo libopenjp2.2.5.3.dylib + -thin ${CMAKE_OSX_ARCHITECTURES} + -output libopenjp2.2.5.3.dylib COMMAND lipo libpng16.16.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libpng16.16.dylib @@ -301,6 +309,7 @@ execute_process( Frameworks/libnghttp2.14.dylib Frameworks/libogg.0.dylib Frameworks/libopenal.1.24.2.dylib + Frameworks/libopenjp2.2.5.3.dylib Frameworks/libpng16.16.dylib Frameworks/libvlc.5.dylib Frameworks/libvlccore.9.dylib diff --git a/indra/newview/FixPackage.cmake.in b/indra/newview/FixPackage.cmake.in index 909e07885d..49f7b75b4d 100644 --- a/indra/newview/FixPackage.cmake.in +++ b/indra/newview/FixPackage.cmake.in @@ -9,6 +9,11 @@ file(CREATE_LINK "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libnghttp2.14.dylib" SYMBOLIC ) +file(CREATE_LINK + "../../../../Frameworks/libopenjp2.7.dylib" + "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libopenjp2.7.dylib" + SYMBOLIC + ) file(CREATE_LINK "../../../../Frameworks/libpng16.16.dylib" "${CMAKE_CACHEFILE_DIR}/_CPack_Packages/${CMAKE_SYSTEM_NAME}/Bundle/${CPACK_BUNDLE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}/${CPACK_BUNDLE_NAME}.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/libpng16.16.dylib" @@ -235,6 +240,9 @@ execute_process( COMMAND lipo libopenal.1.24.2.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libopenal.1.24.2.dylib + COMMAND lipo libopenjp2.2.5.3.dylib + -thin ${CMAKE_OSX_ARCHITECTURES} + -output libopenjp2.2.5.3.dylib COMMAND lipo libpng16.16.dylib -thin ${CMAKE_OSX_ARCHITECTURES} -output libpng16.16.dylib @@ -301,6 +309,7 @@ execute_process( Frameworks/libnghttp2.14.dylib Frameworks/libogg.0.dylib Frameworks/libopenal.1.24.2.dylib + Frameworks/libopenjp2.2.5.3.dylib Frameworks/libpng16.16.dylib Frameworks/libvlc.5.dylib Frameworks/libvlccore.9.dylib diff --git a/indra/newview/PKGBUILD.in b/indra/newview/PKGBUILD.in index 4d617c132c..1f0c83cc41 100644 --- a/indra/newview/PKGBUILD.in +++ b/indra/newview/PKGBUILD.in @@ -6,7 +6,7 @@ pkgdesc="${VIEWER_PACKAGE_COMMENT}" arch=('${CMAKE_SYSTEM_PROCESSOR}') url="https://${VIEWER_PACKAGE_DOMAIN_NAME}" license=('LGPL-2.1') -depends=(apr-util boost-libs fltk glu hunspell libnghttp2 sdl2 vlc libvorbis) +depends=(apr-util boost-libs fltk glu hunspell libnghttp2 openjpeg2 sdl2 vlc libvorbis) package() { cd "$startdir" -- cgit v1.2.3 From 05557554c39ca938a488c534f74cf8d45e8f7c50 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 14 May 2025 20:14:10 +0300 Subject: #4081 Meshes missing after teleport --- indra/newview/llmeshrepository.cpp | 8 +------- indra/newview/llviewerregion.cpp | 6 ------ indra/newview/llviewerregion.h | 1 - 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 851107b3be..e7e95034b2 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -5976,13 +5976,7 @@ bool LLMeshRepository::meshUploadEnabled() bool LLMeshRepository::meshRezEnabled() { static LLCachedControl mesh_enabled(gSavedSettings, "MeshEnabled"); - LLViewerRegion *region = gAgent.getRegion(); - if(mesh_enabled && - region) - { - return region->meshRezEnabled(); - } - return false; + return mesh_enabled; } // Threading: main thread only diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 697433148b..b9f52e11aa 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -3720,12 +3720,6 @@ bool LLViewerRegion::bakesOnMeshEnabled() const mSimulatorFeatures["BakesOnMeshEnabled"].asBoolean()); } -bool LLViewerRegion::meshRezEnabled() const -{ - return (mSimulatorFeatures.has("MeshRezEnabled") && - mSimulatorFeatures["MeshRezEnabled"].asBoolean()); -} - bool LLViewerRegion::dynamicPathfindingEnabled() const { return ( mSimulatorFeatures.has("DynamicPathfindingEnabled") && diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index d0ec1fe877..244e2b7835 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -333,7 +333,6 @@ public: void getInfo(LLSD& info); - bool meshRezEnabled() const; bool meshUploadEnabled() const; bool bakesOnMeshEnabled() const; -- cgit v1.2.3 From b5db42e26b64952bdc485bd8a0e0731856f03ae9 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 15 May 2025 23:08:52 +0300 Subject: #4088 Fix Outfit folders changing to normal folders when parent copied and pasted --- indra/newview/llinventoryfunctions.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 3286eca265..1077ce74ae 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -438,7 +438,13 @@ void copy_inventory_category(LLInventoryModel* model, { copy_inventory_category_content(new_id, model, cat, root_copy_id, move_no_copy_items); }; - gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName(), func, cat->getThumbnailUUID()); + LLFolderType::EType type = LLFolderType::FT_NONE; + if (cat->getPreferredType() == LLFolderType::FT_OUTFIT) + { + // at the moment only permitting copy of outfits and normal folders + type = LLFolderType::FT_OUTFIT; + } + gInventory.createNewCategory(parent_id, type, cat->getName(), func, cat->getThumbnailUUID()); } void copy_inventory_category(LLInventoryModel* model, -- cgit v1.2.3 From d5313e7161bb99045adc4a1a34d7f85de609d97b Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Fri, 16 May 2025 17:41:56 +0300 Subject: #4091 fix speaker icon is showing all users speaking when anyone is talking --- indra/newview/llavatarlistitem.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index 6ef45ed160..80c7f8beca 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -325,7 +325,8 @@ void LLAvatarListItem::setShowProfileBtn(bool show) void LLAvatarListItem::showSpeakingIndicator(bool visible) { - if (mSpeakingIndicator) + // used only to hide indicator to not contradict with SpeakingIndicatorManager functionality + if (mSpeakingIndicator && !visible) { mSpeakingIndicator->setIsActiveChannel(visible); mSpeakingIndicator->setShowParticipantsSpeaking(visible); -- cgit v1.2.3 From b2b021feadafbff8735d3ab46343efdebab59dca Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 9 May 2025 09:14:46 -0700 Subject: adjust which webrtc tracks are enabled when the avatar crosses a region border --- indra/newview/llvoicewebrtc.cpp | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index 08fcec86ac..cda02b7e8a 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -985,7 +985,10 @@ void LLWebRTCVoiceClient::updatePosition(void) LLWebRTCVoiceClient::participantStatePtr_t participant = findParticipantByID("Estate", gAgentID); if(participant) { - participant->mRegion = gAgent.getRegion()->getRegionID(); + if (participant->mRegion != gAgent.getRegion()->getRegionID()) { + participant->mRegion = gAgent.getRegion()->getRegionID(); + setMuteMic(mMuteMic); + } } } } @@ -3104,23 +3107,20 @@ LLVoiceWebRTCSpatialConnection::~LLVoiceWebRTCSpatialConnection() void LLVoiceWebRTCSpatialConnection::setMuteMic(bool muted) { - if (mMuted != muted) + mMuted = muted; + if (mWebRTCAudioInterface) { - mMuted = muted; - if (mWebRTCAudioInterface) + LLViewerRegion *regionp = gAgent.getRegion(); + if (regionp && mRegionID == regionp->getRegionID()) { - LLViewerRegion *regionp = gAgent.getRegion(); - if (regionp && mRegionID == regionp->getRegionID()) - { - mWebRTCAudioInterface->setMute(muted); - } - else - { - // Always mute this agent with respect to neighboring regions. - // Peers don't want to hear this agent from multiple regions - // as that'll echo. - mWebRTCAudioInterface->setMute(true); - } + mWebRTCAudioInterface->setMute(muted); + } + else + { + // Always mute this agent with respect to neighboring regions. + // Peers don't want to hear this agent from multiple regions + // as that'll echo. + mWebRTCAudioInterface->setMute(true); } } } -- cgit v1.2.3 From 28edf9e0c0309943dc406b824fc628a66d28f4ce Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 9 May 2025 09:54:47 -0700 Subject: reuse region variable instead of multiple calls to gAgent.getRegion() --- indra/newview/llvoicewebrtc.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index cda02b7e8a..9835a69e4e 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -985,8 +985,8 @@ void LLWebRTCVoiceClient::updatePosition(void) LLWebRTCVoiceClient::participantStatePtr_t participant = findParticipantByID("Estate", gAgentID); if(participant) { - if (participant->mRegion != gAgent.getRegion()->getRegionID()) { - participant->mRegion = gAgent.getRegion()->getRegionID(); + if (participant->mRegion != region->getRegionID()) { + participant->mRegion = region->getRegionID(); setMuteMic(mMuteMic); } } -- cgit v1.2.3 From 5ee83e782d4c25989859124e963a4eac1e33f413 Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Tue, 20 May 2025 20:40:26 +0300 Subject: Update macos icons (#4042, #4112) according to https://developer.apple.com/design/human-interface-guidelines/app-icons --- indra/newview/icons/release/secondlife.icns | Bin 113020 -> 302511 bytes .../release/secondlife.iconset/icon_128x128.png | Bin 0 -> 8653 bytes .../release/secondlife.iconset/icon_128x128@2x.png | Bin 0 -> 19795 bytes .../release/secondlife.iconset/icon_16x16.png | Bin 0 -> 681 bytes .../release/secondlife.iconset/icon_16x16@2x.png | Bin 0 -> 1508 bytes .../release/secondlife.iconset/icon_256x256.png | Bin 0 -> 19795 bytes .../release/secondlife.iconset/icon_256x256@2x.png | Bin 0 -> 50874 bytes .../release/secondlife.iconset/icon_32x32.png | Bin 0 -> 1508 bytes .../release/secondlife.iconset/icon_32x32@2x.png | Bin 0 -> 3697 bytes .../release/secondlife.iconset/icon_512x512.png | Bin 0 -> 50874 bytes .../release/secondlife.iconset/icon_512x512@2x.png | Bin 0 -> 105494 bytes indra/newview/icons/release/secondlife_1024.png | Bin 0 -> 105494 bytes indra/newview/icons/release/secondlife_128.png | Bin 5320 -> 0 bytes indra/newview/icons/release/secondlife_16.png | Bin 669 -> 0 bytes indra/newview/icons/release/secondlife_256.png | Bin 11572 -> 0 bytes indra/newview/icons/release/secondlife_32.png | Bin 1283 -> 0 bytes indra/newview/icons/release/secondlife_48.png | Bin 1958 -> 0 bytes 17 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 indra/newview/icons/release/secondlife.iconset/icon_128x128.png create mode 100644 indra/newview/icons/release/secondlife.iconset/icon_128x128@2x.png create mode 100644 indra/newview/icons/release/secondlife.iconset/icon_16x16.png create mode 100644 indra/newview/icons/release/secondlife.iconset/icon_16x16@2x.png create mode 100644 indra/newview/icons/release/secondlife.iconset/icon_256x256.png create mode 100644 indra/newview/icons/release/secondlife.iconset/icon_256x256@2x.png create mode 100644 indra/newview/icons/release/secondlife.iconset/icon_32x32.png create mode 100644 indra/newview/icons/release/secondlife.iconset/icon_32x32@2x.png create mode 100644 indra/newview/icons/release/secondlife.iconset/icon_512x512.png create mode 100644 indra/newview/icons/release/secondlife.iconset/icon_512x512@2x.png create mode 100644 indra/newview/icons/release/secondlife_1024.png delete mode 100644 indra/newview/icons/release/secondlife_128.png delete mode 100644 indra/newview/icons/release/secondlife_16.png delete mode 100644 indra/newview/icons/release/secondlife_256.png delete mode 100644 indra/newview/icons/release/secondlife_32.png delete mode 100644 indra/newview/icons/release/secondlife_48.png diff --git a/indra/newview/icons/release/secondlife.icns b/indra/newview/icons/release/secondlife.icns index a30b51b67a..00d9867814 100644 Binary files a/indra/newview/icons/release/secondlife.icns and b/indra/newview/icons/release/secondlife.icns differ diff --git a/indra/newview/icons/release/secondlife.iconset/icon_128x128.png b/indra/newview/icons/release/secondlife.iconset/icon_128x128.png new file mode 100644 index 0000000000..4c519db265 Binary files /dev/null and b/indra/newview/icons/release/secondlife.iconset/icon_128x128.png differ diff --git a/indra/newview/icons/release/secondlife.iconset/icon_128x128@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_128x128@2x.png new file mode 100644 index 0000000000..2a3a0092b2 Binary files /dev/null and b/indra/newview/icons/release/secondlife.iconset/icon_128x128@2x.png differ diff --git a/indra/newview/icons/release/secondlife.iconset/icon_16x16.png b/indra/newview/icons/release/secondlife.iconset/icon_16x16.png new file mode 100644 index 0000000000..fda2f276ee Binary files /dev/null and b/indra/newview/icons/release/secondlife.iconset/icon_16x16.png differ diff --git a/indra/newview/icons/release/secondlife.iconset/icon_16x16@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_16x16@2x.png new file mode 100644 index 0000000000..aa4a74f204 Binary files /dev/null and b/indra/newview/icons/release/secondlife.iconset/icon_16x16@2x.png differ diff --git a/indra/newview/icons/release/secondlife.iconset/icon_256x256.png b/indra/newview/icons/release/secondlife.iconset/icon_256x256.png new file mode 100644 index 0000000000..2a3a0092b2 Binary files /dev/null and b/indra/newview/icons/release/secondlife.iconset/icon_256x256.png differ diff --git a/indra/newview/icons/release/secondlife.iconset/icon_256x256@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_256x256@2x.png new file mode 100644 index 0000000000..4c28add76c Binary files /dev/null and b/indra/newview/icons/release/secondlife.iconset/icon_256x256@2x.png differ diff --git a/indra/newview/icons/release/secondlife.iconset/icon_32x32.png b/indra/newview/icons/release/secondlife.iconset/icon_32x32.png new file mode 100644 index 0000000000..aa4a74f204 Binary files /dev/null and b/indra/newview/icons/release/secondlife.iconset/icon_32x32.png differ diff --git a/indra/newview/icons/release/secondlife.iconset/icon_32x32@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_32x32@2x.png new file mode 100644 index 0000000000..23a36f66cb Binary files /dev/null and b/indra/newview/icons/release/secondlife.iconset/icon_32x32@2x.png differ diff --git a/indra/newview/icons/release/secondlife.iconset/icon_512x512.png b/indra/newview/icons/release/secondlife.iconset/icon_512x512.png new file mode 100644 index 0000000000..4c28add76c Binary files /dev/null and b/indra/newview/icons/release/secondlife.iconset/icon_512x512.png differ diff --git a/indra/newview/icons/release/secondlife.iconset/icon_512x512@2x.png b/indra/newview/icons/release/secondlife.iconset/icon_512x512@2x.png new file mode 100644 index 0000000000..a53a6697f1 Binary files /dev/null and b/indra/newview/icons/release/secondlife.iconset/icon_512x512@2x.png differ diff --git a/indra/newview/icons/release/secondlife_1024.png b/indra/newview/icons/release/secondlife_1024.png new file mode 100644 index 0000000000..a53a6697f1 Binary files /dev/null and b/indra/newview/icons/release/secondlife_1024.png differ diff --git a/indra/newview/icons/release/secondlife_128.png b/indra/newview/icons/release/secondlife_128.png deleted file mode 100644 index 2f21c1c7fc..0000000000 Binary files a/indra/newview/icons/release/secondlife_128.png and /dev/null differ diff --git a/indra/newview/icons/release/secondlife_16.png b/indra/newview/icons/release/secondlife_16.png deleted file mode 100644 index 68f1427309..0000000000 Binary files a/indra/newview/icons/release/secondlife_16.png and /dev/null differ diff --git a/indra/newview/icons/release/secondlife_256.png b/indra/newview/icons/release/secondlife_256.png deleted file mode 100644 index 8f324910e7..0000000000 Binary files a/indra/newview/icons/release/secondlife_256.png and /dev/null differ diff --git a/indra/newview/icons/release/secondlife_32.png b/indra/newview/icons/release/secondlife_32.png deleted file mode 100644 index 2b7cdef03d..0000000000 Binary files a/indra/newview/icons/release/secondlife_32.png and /dev/null differ diff --git a/indra/newview/icons/release/secondlife_48.png b/indra/newview/icons/release/secondlife_48.png deleted file mode 100644 index c2ef372dd7..0000000000 Binary files a/indra/newview/icons/release/secondlife_48.png and /dev/null differ -- cgit v1.2.3 From 0296bd6ca78a8f962e42156265a57e07bb6c1164 Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Wed, 21 May 2025 02:50:39 +0300 Subject: #p430 don't show MFA dialog twice --- indra/newview/lllogininstance.cpp | 27 +++++++++++++++++++++++++++ indra/newview/lllogininstance.h | 2 ++ indra/newview/llstartup.cpp | 20 +------------------- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index cbc3744aa3..4bffe7feac 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -329,6 +329,15 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event) LL_DEBUGS("LLLogin") << "reason " << reason_response << " message " << message_response << LL_ENDL; + + if (response.has("mfa_hash")) + { + mRequestData["params"]["mfa_hash"] = response["mfa_hash"]; + mRequestData["params"]["token"] = ""; + + saveMFAHash(response); + } + // For the cases of critical message or TOS agreement, // start the TOS dialog. The dialog response will be handled // by the LLLoginInstance::handleTOSResponse() callback. @@ -593,6 +602,24 @@ bool LLLoginInstance::handleMFAChallenge(LLSD const & notif, LLSD const & respon return true; } +void LLLoginInstance::saveMFAHash(LLSD const& response) +{ + std::string grid(LLGridManager::getInstance()->getGridId()); + std::string user_id(LLStartUp::getUserId()); + + // Only save mfa_hash for future logins if the user wants their info remembered. + if (response.has("mfa_hash") && gSavedSettings.getBOOL("RememberUser") && LLLoginInstance::getInstance()->saveMFA()) + { + gSecAPIHandler->addToProtectedMap("mfa_hash", grid, user_id, response["mfa_hash"]); + } + else if (!LLLoginInstance::getInstance()->saveMFA()) + { + gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid, user_id); + } + // TODO(brad) - related to SL-17223 consider building a better interface that sync's automatically + gSecAPIHandler->syncProtectedMap(); +} + std::string construct_start_string() { std::string start; diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h index 748909c069..941b378b14 100644 --- a/indra/newview/lllogininstance.h +++ b/indra/newview/lllogininstance.h @@ -70,6 +70,8 @@ public: void setNotificationsInterface(LLNotificationsInterface* ni) { mNotifications = ni; } LLNotificationsInterface& getNotificationsInterface() const { return *mNotifications; } + void saveMFAHash(LLSD const& response); + private: typedef std::shared_ptr ResponsePtr; void constructAuthParams(LLPointer user_credentials); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 4f60f98b49..cc4f49c0b4 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -3884,25 +3884,7 @@ bool process_login_success_response() LLViewerMedia::getInstance()->openIDSetup(openid_url, openid_token); } - - // Only save mfa_hash for future logins if the user wants their info remembered. - if(response.has("mfa_hash") - && gSavedSettings.getBOOL("RememberUser") - && LLLoginInstance::getInstance()->saveMFA()) - { - std::string grid(LLGridManager::getInstance()->getGridId()); - std::string user_id(gUserCredential->userID()); - gSecAPIHandler->addToProtectedMap("mfa_hash", grid, user_id, response["mfa_hash"]); - // TODO(brad) - related to SL-17223 consider building a better interface that sync's automatically - gSecAPIHandler->syncProtectedMap(); - } - else if (!LLLoginInstance::getInstance()->saveMFA()) - { - std::string grid(LLGridManager::getInstance()->getGridId()); - std::string user_id(gUserCredential->userID()); - gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid, user_id); - gSecAPIHandler->syncProtectedMap(); - } + LLLoginInstance::getInstance()->saveMFAHash(response); bool success = false; // JC: gesture loading done below, when we have an asset system -- cgit v1.2.3 From 3fa76746616e13c6cc5ba8f2bb02d05262fafa3e Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Wed, 21 May 2025 15:44:48 +0300 Subject: fix test for lllogininstance.cpp --- indra/newview/tests/lllogininstance_test.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp index bff2289a7c..29ca903256 100644 --- a/indra/newview/tests/lllogininstance_test.cpp +++ b/indra/newview/tests/lllogininstance_test.cpp @@ -66,6 +66,7 @@ static LLEventStream gTestPump("test_pump"); #include "../llstartup.h" LLSLURL LLStartUp::sStartSLURL; LLSLURL& LLStartUp::getStartSLURL() { return sStartSLURL; } +std::string LLStartUp::getUserId() { return ""; }; #include "lllogin.h" -- cgit v1.2.3 From 25e68341272549905298cfd9ae122cb27ae72102 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Geenz\" Goodman" Date: Thu, 22 May 2025 08:14:41 -0400 Subject: Fix null outfit gallery observer pointer --- indra/newview/lloutfitgallery.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp index b84b0b3a8c..9d05276db4 100644 --- a/indra/newview/lloutfitgallery.cpp +++ b/indra/newview/lloutfitgallery.cpp @@ -793,6 +793,12 @@ void LLOutfitGallery::updateAddedCategory(LLUUID cat_id) LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id); if (!cat) return; + if (mOutfitsObserver == NULL) + { + mOutfitsObserver = new LLInventoryCategoriesObserver(); + gInventory.addObserver(mOutfitsObserver); + } + if (!isOutfitFolder(cat)) { // Assume a subfolder that contains or will contain outfits, track it @@ -820,12 +826,6 @@ void LLOutfitGallery::updateAddedCategory(LLUUID cat_id) if (!outfit_category) return; - if (mOutfitsObserver == NULL) - { - mOutfitsObserver = new LLInventoryCategoriesObserver(); - gInventory.addObserver(mOutfitsObserver); - } - // Start observing changes in "My Outfits" category. mOutfitsObserver->addCategory(cat_id, boost::bind(&LLOutfitGallery::refreshOutfit, this, cat_id), true); -- cgit v1.2.3 From b62e7f96c235dd5754e329fcf13c0eea2352bbb1 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Geenz\" Goodman" Date: Thu, 22 May 2025 12:53:37 -0400 Subject: Remove mOutfitsObserver, use mCategoriesObserver from our base. --- indra/newview/lloutfitgallery.cpp | 19 +++---------------- indra/newview/lloutfitgallery.h | 3 --- 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp index 9d05276db4..98b7d74cd2 100644 --- a/indra/newview/lloutfitgallery.cpp +++ b/indra/newview/lloutfitgallery.cpp @@ -69,7 +69,6 @@ const S32 GALLERY_ITEMS_PER_ROW_MIN = 2; LLOutfitGallery::LLOutfitGallery(const LLOutfitGallery::Params& p) : LLOutfitListBase(), - mOutfitsObserver(NULL), mScrollPanel(NULL), mGalleryPanel(NULL), mLastRowPanel(NULL), @@ -730,12 +729,6 @@ LLOutfitGallery::~LLOutfitGallery() { delete mOutfitGalleryMenu; - if (gInventory.containsObserver(mOutfitsObserver)) - { - gInventory.removeObserver(mOutfitsObserver); - } - delete mOutfitsObserver; - while (!mUnusedRowPanels.empty()) { LLPanel* panelp = mUnusedRowPanels.back(); @@ -793,17 +786,11 @@ void LLOutfitGallery::updateAddedCategory(LLUUID cat_id) LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id); if (!cat) return; - if (mOutfitsObserver == NULL) - { - mOutfitsObserver = new LLInventoryCategoriesObserver(); - gInventory.addObserver(mOutfitsObserver); - } - if (!isOutfitFolder(cat)) { // Assume a subfolder that contains or will contain outfits, track it const LLUUID outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); - mOutfitsObserver->addCategory(cat_id, [this, outfits]() + mCategoriesObserver->addCategory(cat_id, [this, outfits]() { observerCallback(outfits); }); @@ -827,7 +814,7 @@ void LLOutfitGallery::updateAddedCategory(LLUUID cat_id) return; // Start observing changes in "My Outfits" category. - mOutfitsObserver->addCategory(cat_id, + mCategoriesObserver->addCategory(cat_id, boost::bind(&LLOutfitGallery::refreshOutfit, this, cat_id), true); outfit_category->fetch(); @@ -840,7 +827,7 @@ void LLOutfitGallery::updateRemovedCategory(LLUUID cat_id) if (outfits_iter != mOutfitMap.end()) { // 0. Remove category from observer. - mOutfitsObserver->removeCategory(cat_id); + mCategoriesObserver->removeCategory(cat_id); //const LLUUID& outfit_id = outfits_iter->first; LLOutfitGalleryItem* item = outfits_iter->second; diff --git a/indra/newview/lloutfitgallery.h b/indra/newview/lloutfitgallery.h index 541ea2f9d4..a2a5fe26eb 100644 --- a/indra/newview/lloutfitgallery.h +++ b/indra/newview/lloutfitgallery.h @@ -184,9 +184,6 @@ private: typedef item_num_map_t::value_type item_numb_map_value_t; item_num_map_t mItemIndexMap; std::map mIndexToItemMap; - - - LLInventoryCategoriesObserver* mOutfitsObserver; }; class LLOutfitGalleryContextMenu : public LLOutfitContextMenu { -- cgit v1.2.3 From 5b12428e65a5edf56409cf3fdc858827da7460f0 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Thu, 22 May 2025 19:53:53 +0300 Subject: #4132 fix name mentions sometimes not being highlighted --- indra/llui/lltextbase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index c1b01f420b..778b253c3c 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -483,7 +483,7 @@ std::vector> LLTextBase::getHighlightedBgRects() F32 left_precise = (F32)line_iter->mRect.mLeft; F32 right_precise = (F32)line_iter->mRect.mLeft; - for (; segment_iter != mSegments.end(); ++segment_iter) + for (; segment_iter != mSegments.end(); ++segment_iter, segment_offset = 0) { LLTextSegmentPtr segmentp = *segment_iter; -- cgit v1.2.3 From 70a4ca3a0b971b1f3e838df30b0a2b46955d980a Mon Sep 17 00:00:00 2001 From: secretfoxtail Date: Sat, 24 May 2025 10:21:29 -0600 Subject: Slightly faster avatar zoom in bump ANIM_METERS_PER_SECOND to 20.0 --- indra/newview/llagentcamera.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 40cb6f6265..3b147707cf 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -2658,7 +2658,7 @@ void LLAgentCamera::setCameraPosAndFocusGlobal(const LLVector3d& camera_pos, con if (mCameraAnimating) { - const F64 ANIM_METERS_PER_SECOND = 15.0; + const F64 ANIM_METERS_PER_SECOND = 20.0; const F64 MIN_ANIM_SECONDS = 0.5; const F64 MAX_ANIM_SECONDS = 3.0; F64 anim_duration = llmax( MIN_ANIM_SECONDS, sqrt(focus_delta_squared) / ANIM_METERS_PER_SECOND ); -- cgit v1.2.3 From b1126521cae30e6a2494ed71c75ba1f95b807286 Mon Sep 17 00:00:00 2001 From: secretfoxtail Date: Sat, 24 May 2025 10:36:18 -0600 Subject: Fix mouselook attachment offset Disable shortening avatar skeleton in mouselook like other TPVs --- indra/newview/llagentcamera.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 3b147707cf..4856eb1199 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -1504,6 +1504,7 @@ void LLAgentCamera::updateCamera() LLVector3 chest_scale = chest_joint->getScale(); // shorten avatar skeleton to avoid foot interpenetration +#if 0 // This offsets mouselook attachments, is disabled in other TPVs if (!gAgentAvatarp->mInAir) { LLVector3 chest_offset = LLVector3(0.f, 0.f, chest_joint->getPosition().mV[VZ]) * torso_joint->getWorldRotation(); @@ -1517,6 +1518,7 @@ void LLAgentCamera::updateCamera() chest_joint->setScale(LLVector3(1.f, 1.f, scale_factor)); diff.mV[VZ] = 0.f; } +#endif // SL-315 gAgentAvatarp->mPelvisp->setPosition(gAgentAvatarp->mPelvisp->getPosition() + diff); -- cgit v1.2.3 From e1070f0d1261f794fae4c0e99dcefb0cc64c3855 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Sun, 25 May 2025 07:16:56 +0800 Subject: Install libvk_swiftshader.so to system lib folder Thank you Fritigern Gothly for noticing this lot of GPU/EGL and/or shader related errors. After the Megapahit process have exited, she still saw the system trying to find Vulkan libs in the Megapahit installation folder, [0522/173723.156996:FATAL:gpu_init.cc(500)] Passthrough is not supported, GL is angle, ANGLE is swiftshader Warning: Couldn't load Vulkan. Searched /usr/libexec/megapahit/libvk_swiftshader.so, /usr/lib/x86_64-linux-gnu/libvk_swiftshader.so, /usr/libexec/megapahit/libvk_swiftshader.so, libvk_swiftshader.so. at operator() (../../third_party/dawn/src/dawn/nativWarning: Couldn't load Vulkan. Searched /usr/libexec/megapahit/libvk_swiftshader.so, /usr/lib/x86_64-linux-gnu/libvk_swiftshadere/vulkan/BackendVk.cpp:299) at Initialize (../../third_party/dawn/src/dawn/native/vulkan/BackendVk.cpp:310) at Create (..so, /usr/libexec/megapahit/libvk_swiftshader.so, libvk_swiftshader.so. at operator() (../../third_party/dawn/src/dawn/nativ./../third_party/dawn/src/dawn/native/vulkan/BackendVk.cpp:266) at operator() (../../third_party/dawn/src/dawn/native/vulkane/vulkan/BackendVk.cpp:299) at Initialize (../../third_party/dawn/src/dawn/native/vulkan/BackendVk.cpp:310) at Create (./BackendVk.cpp:521) ./../third_party/dawn/src/dawn/native/vulkan/BackendVk.cpp:266) at operator() (../../third_party/dawn/src/dawn/native/vulkan/BackendVk.cpp:521) Warning: Couldn't load Vulkan. Searched /usr/libexec/megapahit/libvk_swiftshader.so, /usr/lib/x86_64-linux-gnu/libvk_swiftshader.so, /usr/libexec/megapahit/libvk_swiftshader.so, libvk_swiftshader.so. at operator() (../../third_party/dawn/src/dawn/native/vulkan/BackendVk.cpp:299) at Initialize (../../third_party/dawn/src/dawn/native/vulkan/BackendVk.cpp:310) at Create (../../third_party/dawn/src/dawn/native/vulkan/BackendVk.cpp:266) at operator() (../../third_party/dawn/src/dawn/native/vulkan/BackendVk.cpp:521) Since SwiftShader doesn't seem to be available on Linux distro repos, it's going to have to be bundled and just placed in normal paths since it wouldn't conflict, instead of having some SwiftShader system library being pulled. --- indra/media_plugins/cef/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/media_plugins/cef/CMakeLists.txt b/indra/media_plugins/cef/CMakeLists.txt index be016eadc4..9142a4516a 100644 --- a/indra/media_plugins/cef/CMakeLists.txt +++ b/indra/media_plugins/cef/CMakeLists.txt @@ -180,6 +180,7 @@ if (INSTALL) install( FILES ${ARCH_PREBUILT_DIRS_RELEASE}/libcef.so + ${ARCH_PREBUILT_DIRS_RELEASE}/libvk_swiftshader.so ${AUTOBUILD_INSTALL_DIR}/bin/release/snapshot_blob.bin ${AUTOBUILD_INSTALL_DIR}/bin/release/v8_context_snapshot.bin ${AUTOBUILD_INSTALL_DIR}/resources/chrome_100_percent.pak -- cgit v1.2.3 From 5360ea61d1de85444824636fbe45378b1d75c899 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Mon, 26 May 2025 09:01:53 +0800 Subject: Make appdelegate-objc compilable again on Monterey where the Xcode version is 14.2 and the SDK version is MacOSX13.1, by specifically excluding llappdelegate-objc.mm from being compiled using the C++20 standard. In this case, the standard is reverted to C++17 but specifically only for that file. The errors didn't happen on newer SDK versions such as the one in Sonoma or Sequoia, and the errors looked completely unrelatable: /Users/erik/Documents/Megapahit/viewer/indra/llwindow/llopenglview-objc.h:36:41: warning: cannot find protocol definition for 'NSTextInputClient' @interface LLOpenGLView : NSOpenGLView ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.1.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSTextInputClient.h:20:11: note: protocol 'NSTextInputClient' has no definition @protocol NSTextInputClient ^ In file included from /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:27: /Users/erik/Documents/Megapahit/viewer/indra/llwindow/llappdelegate-objc.h:30:38: warning: cannot find protocol definition for 'NSApplicationDelegate' @interface LLAppDelegate : NSObject { ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.1.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSApplication.h:318:11: note: protocol 'NSApplicationDelegate' has no definition @protocol NSApplicationDelegate ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:49:27: warning: instance method '-release' not found (return type defaults to 'id') [-Wobjc-method-access] [currentInputLanguage release]; ^~~~~~~ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSString.h:99:12: note: receiver is instance of class declared here @interface NSString : NSObject ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:107:33: warning: instance method '-UTF8String' not found (return type defaults to 'id') [-Wobjc-method-access] const char* url_utf8 = [url UTF8String]; ^~~~~~~~~~ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSString.h:99:12: note: receiver is instance of class declared here @interface NSString : NSObject ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:107:17: error: cannot initialize a variable of type 'const char *' with an rvalue of type 'id' const char* url_utf8 = [url UTF8String]; ^ ~~~~~~~~~~~~~~~~ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:140:38: warning: instance method '-stopModal' not found (return type defaults to 'id') [-Wobjc-method-access] [[NSApplication sharedApplication] stopModal]; ^~~~~~~~~ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.1.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSApplication.h:158:12: note: receiver is instance of class declared here @interface NSApplication : NSResponder ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:144:15: warning: instance method '-release' not found (return type defaults to 'id') [-Wobjc-method-access] [frameTimer release]; ^~~~~~~ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSTimer.h:10:12: note: receiver is instance of class declared here @interface NSTimer : NSObject ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:157:15: warning: instance method '-release' not found (return type defaults to 'id') [-Wobjc-method-access] [frameTimer release]; ^~~~~~~ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSTimer.h:10:12: note: receiver is instance of class declared here @interface NSTimer : NSObject ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:158:38: warning: instance method '-terminate:' not found (return type defaults to 'id') [-Wobjc-method-access] [[NSApplication sharedApplication] terminate:self]; ^~~~~~~~~ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.1.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSApplication.h:158:12: note: receiver is instance of class declared here @interface NSApplication : NSResponder ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:206:35: error: declaration of 'arrayWithObjects:count:' is missing in NSArray class NSArray* nonRomanScript = @[@"ja", @"ko", @"zh-Hant", @"zh-Hans"]; ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:207:29: warning: instance method '-containsObject:' not found (return type defaults to 'id') [-Wobjc-method-access] if ([nonRomanScript containsObject:currentInputLanguage]) ^~~~~~~~~~~~~~ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSArray.h:17:12: note: receiver is instance of class declared here @interface NSArray<__covariant ObjectType> : NSObject ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:40:17: warning: method 'isEqual:' in protocol 'NSObject' not implemented [-Wprotocol] @implementation LLAppDelegate ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/objc/NSObject.h:17:1: note: method 'isEqual:' declared here - (BOOL)isEqual:(id)object; ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:40:17: warning: method 'class' in protocol 'NSObject' not implemented [-Wprotocol] @implementation LLAppDelegate ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/objc/NSObject.h:21:1: note: method 'class' declared here - (Class)class OBJC_SWIFT_UNAVAILABLE("use 'type(of: anObject)' instead"); ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:40:17: warning: method 'self' in protocol 'NSObject' not implemented [-Wprotocol] @implementation LLAppDelegate ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/objc/NSObject.h:22:1: note: method 'self' declared here - (instancetype)self; ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:40:17: warning: method 'performSelector:' in protocol 'NSObject' not implemented [-Wprotocol] @implementation LLAppDelegate ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/objc/NSObject.h:24:1: note: method 'performSelector:' declared here - (id)performSelector:(SEL)aSelector; ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:40:17: warning: method 'performSelector:withObject:' in protocol 'NSObject' not implemented [-Wprotocol] @implementation LLAppDelegate ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/objc/NSObject.h:25:1: note: method 'performSelector:withObject:' declared here - (id)performSelector:(SEL)aSelector withObject:(id)object; ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:40:17: warning: method 'performSelector:withObject:withObject:' in protocol 'NSObject' not implemented [-Wprotocol] @implementation LLAppDelegate ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/objc/NSObject.h:26:1: note: method 'performSelector:withObject:withObject:' declared here - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2; ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:40:17: warning: method 'isProxy' in protocol 'NSObject' not implemented [-Wprotocol] @implementation LLAppDelegate ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/objc/NSObject.h:28:1: note: method 'isProxy' declared here - (BOOL)isProxy; ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:40:17: warning: method 'isKindOfClass:' in protocol 'NSObject' not implemented [-Wprotocol] @implementation LLAppDelegate ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/objc/NSObject.h:30:1: note: method 'isKindOfClass:' declared here - (BOOL)isKindOfClass:(Class)aClass; ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:40:17: warning: method 'isMemberOfClass:' in protocol 'NSObject' not implemented [-Wprotocol] @implementation LLAppDelegate ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/objc/NSObject.h:31:1: note: method 'isMemberOfClass:' declared here - (BOOL)isMemberOfClass:(Class)aClass; ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:40:17: warning: method 'conformsToProtocol:' in protocol 'NSObject' not implemented [-Wprotocol] @implementation LLAppDelegate ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/objc/NSObject.h:32:1: note: method 'conformsToProtocol:' declared here - (BOOL)conformsToProtocol:(Protocol *)aProtocol; ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:40:17: warning: method 'respondsToSelector:' in protocol 'NSObject' not implemented [-Wprotocol] @implementation LLAppDelegate ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/objc/NSObject.h:34:1: note: method 'respondsToSelector:' declared here - (BOOL)respondsToSelector:(SEL)aSelector; ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:40:17: warning: method 'retain' in protocol 'NSObject' not implemented [-Wprotocol] @implementation LLAppDelegate ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/objc/NSObject.h:36:1: note: method 'retain' declared here - (instancetype)retain OBJC_ARC_UNAVAILABLE; ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:40:17: warning: method 'release' in protocol 'NSObject' not implemented [-Wprotocol] @implementation LLAppDelegate ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/objc/NSObject.h:37:1: note: method 'release' declared here - (oneway void)release OBJC_ARC_UNAVAILABLE; ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:40:17: warning: method 'autorelease' in protocol 'NSObject' not implemented [-Wprotocol] @implementation LLAppDelegate ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/objc/NSObject.h:38:1: note: method 'autorelease' declared here - (instancetype)autorelease OBJC_ARC_UNAVAILABLE; ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:40:17: warning: method 'retainCount' in protocol 'NSObject' not implemented [-Wprotocol] @implementation LLAppDelegate ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/objc/NSObject.h:39:1: note: method 'retainCount' declared here - (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE; ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:40:17: warning: method 'zone' in protocol 'NSObject' not implemented [-Wprotocol] @implementation LLAppDelegate ^ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/objc/NSObject.h:41:1: note: method 'zone' declared here - (struct _NSZone *)zone OBJC_ARC_UNAVAILABLE; ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:374:12: warning: 'NSApplication' may not respond to 'sendEvent:' [super sendEvent:event]; ~~~~~ ^ /Users/erik/Documents/Megapahit/viewer/indra/newview/llappdelegate-objc.mm:377:27: warning: 'NSWindow' may not respond to 'sendEvent:' [[self keyWindow] sendEvent:event]; ~~~~~~~~~~~~~~~~ ^ --- indra/newview/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 25c4926835..6a7119d877 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1468,7 +1468,7 @@ if (DARWIN) # pointer variables. As of 2019-06-26, the BugsplatMac version we're using # does not yet do so in its own header files. This -W flag prevents fatal # warnings. - COMPILE_FLAGS "-fmodules -fcxx-modules -Wno-nullability-completeness" + COMPILE_FLAGS "-fmodules -fcxx-modules -Wno-nullability-completeness -std=c++17" ) # Add resource files to the project. -- cgit v1.2.3 From d038a69f60725296715285b23e5de049c7824c11 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Tue, 27 May 2025 08:58:29 +0800 Subject: Add missing FBSD building steps & fix its deps Even though the windlight file names containing %20 & %21 isn't liked by either CPack or FBSD packaging problem will eventually have to be solved, the hack steps are small that they should just be documented, in case (more) others would like to build the FBSD package. Use custom PYTHON environment setting instead of relying on creating links named python and/or python 3 to the system Python executable. Reorder build requirements, add missing dependencies that can be set to automatically installed. The absences of some were leftovers from dependency on system ColladaDOM and GTK2 (or my failure to add some package names to the CPack dependencies, caused by the gtk2 vs. gtk20, apr vs. apr1, sdl2 vs. sdl20, etc. FBSD package/port naming confusion). --- README.md | 12 +++++++++--- indra/newview/CMakeLists.txt | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 78417ebde9..45eb70439f 100644 --- a/README.md +++ b/README.md @@ -55,14 +55,20 @@ $ megapahit ### FreeBSD ``` $ sudo su - -# portmaster devel/cmake devel/pkgconf audio/freealut devel/apr1 devel/boost-libs x11-toolkits/fltk math/glm textproc/hunspell misc/meshoptimizer archivers/minizip graphics/nanosvg graphics/openjpeg www/libnghttp2 devel/sdl20 multimedia/vlc audio/libvorbis devel/xxhash +# portmaster devel/cmake devel/pkgconf audio/freealut devel/apr1 devel/boost-libs x11-toolkits/fltk math/glm textproc/hunspell misc/meshoptimizer archivers/minizip graphics/nanosvg www/libnghttp2 graphics/openjpeg devel/sdl20 multimedia/vlc audio/libvorbis devel/xxhash # exit $ setenv LL_BUILD "-O3 -std=c++20 -fPIC" +$ setenv PYTHON /usr/local/bin/python3.11 $ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=ON -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=OFF -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=ON -DPACKAGE:BOOL=ON ../indra $ make -j`nproc` +$ cd .. +$ mv -i indra/newview/app_settings/windlight .. +$ cd - $ sudo cpack -G FREEBSD -$ sudo pkg add megapahit-`cat newview/viewer_version.txt`-FreeBSD.pkg -$ sudo pkg set -yA 1 freealut apr1 fltk hunspell meshoptimizer minizip nanosvg openjpeg sdl20 vlc libvorbis +$ sudo pkg add megapahit-`cat newview/viewer_version.txt`-`uname -s`.pkg +$ cd .. +$ mv -i ../windlight indra/newview/app_settings/ +$ sudo pkg set -yA 1 freealut apr1 boost-libs fltk hunspell meshoptimizer minizip libnghttp2 openjpeg sdl20 vlc libvorbis $ megapahit ``` diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 6a7119d877..b937727b15 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -2307,7 +2307,7 @@ else (LINUX) CACHE STRING "FreeBSD package maintainer.") set(CPACK_FREEBSD_PACKAGE_ORIGIN net/${VIEWER_BINARY_NAME} CACHE STRING "FreeBSD package origin.") - set(CPACK_FREEBSD_PACKAGE_DEPS "audio/freealut;graphics/libGLU;textproc/hunspell;misc/meshoptimizer;archivers/minizip;www/libnghttp2;graphics/openjpeg;multimedia/vlc;audio/libvorbis" + set(CPACK_FREEBSD_PACKAGE_DEPS "audio/freealut;devel/apr;devel/boost-libs;x11-toolkits/fltk;textproc/hunspell;misc/meshoptimizer;archivers/minizip;www/libnghttp2;graphics/openjpeg;devel/sdl2;multimedia/vlc;audio/libvorbis" CACHE STRING "FreeBSD package dependencies.") endif () -- cgit v1.2.3 From 7ecde89008f9ed39c357b606d3bc231ba4360ee2 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Tue, 27 May 2025 10:01:21 +0800 Subject: Pass configuration phase with vcpkg replacing MSYS2 I happen to be using just Git Bash for convenience for running the commands on the Windows build instructions, hence the build folder pattern to be ignored from the result of running `uname -s` there. The instructions omit the part where you install vcpkg and set the VCPKG_ROOT environment variable, cause it depends on where you install vcpkg to your liking, but the next commands will rely on that variable being set correctly. The CMake used here is MS VS 2022 Community Edition's one, since it will know where the C++ compiler is. $VCPKG_ROOT/downloads/tools/msys2/21caed2f81ec917b/mingw64/bin is where pkg-config.exe can be found. $VCPKG_ROOT/installed/`uname -m|sed 's/86_//'`-windows/tools/libxml2 is where xmllint.exe can be found (from libxml2[tools]). PKG_CONFIG_LIBDIR and PYTHON environment settings are pretty self-explanatory. The flags set on LL_BUILD are now for Visual C++ and not MinGW(64)'s GCC or Clang any more, and copied from most of the flags in the variables file from LL's build-variables repo. vcpkg's apr & apr-util packages don't seem to install their .pc files, hence the manual target_include/link_directories/libraries settings, relying on some automatically generated INTERNAL CMake variable called prefix_result. vcpkg's Boost needs the same treatment, plus some suffix. We still use LL's prebuilt libs for OpenSSL, libcurl and WebRTC. Actually too for ColladaDOM for now, but we prepare Windows ColladaDOM self-building for later. For GLM and Meshoptimizer too, it's just the checking that's skipped otherwise it would fail (but the vcpkg packages can be used). Visual C++ doesn't recognise the no-deprecated-declarations compile option. On Visual C++, the macro to denote x86-64 seems to be _M_X64 (if not added there, it would try to find sse2neon :)) We still aren't using Autobuild here for Windows either, hence the FALSE-d viewer_manifest.py based file bundling. --- .gitignore | 2 +- README.md | 7 +++++-- indra/cmake/APR.cmake | 17 ++++++++++++----- indra/cmake/Boost.cmake | 8 ++++---- indra/cmake/CURL.cmake | 2 +- indra/cmake/GLM.cmake | 2 +- indra/cmake/LLPrimitive.cmake | 35 +++++++++++++++++++---------------- indra/cmake/Meshoptimizer.cmake | 6 ++++-- indra/cmake/OpenSSL.cmake | 2 +- indra/cmake/WebRTC.cmake | 14 +++++++------- indra/llcommon/CMakeLists.txt | 5 ++++- indra/llcommon/llmemory.h | 2 +- indra/llmath/llsimdmath.h | 2 +- indra/newview/CMakeLists.txt | 4 ++++ 14 files changed, 65 insertions(+), 43 deletions(-) diff --git a/.gitignore b/.gitignore index c4b559f016..72187e23f2 100755 --- a/.gitignore +++ b/.gitignore @@ -23,7 +23,7 @@ LICENSES build-darwin-* build-freebsd-* build-linux-* -build-mingw-* +build-mingw64_nt* debian/files debian/secondlife-appearance-utility* debian/secondlife-viewer* diff --git a/README.md b/README.md index 45eb70439f..a5fd7a08e0 100644 --- a/README.md +++ b/README.md @@ -120,8 +120,11 @@ $ megapahit ### Windows ``` -$ pacman -S mingw-w64-clang-aarch64-cmake mingw-w64-clang-aarch64-pkgconf mingw-w64-clang-aarch64-freealut mingw-w64-clang-aarch64-apr-util mingw-w64-clang-aarch64-boost mingw-w64-clang-aarch64-fltk mingw-w64-clang-aarch64-glm mingw-w64-clang-aarch64-hunspell mingw-w64-clang-aarch64-minizip mingw-w64-clang-aarch64-nghttp2 mingw-w64-clang-aarch64-SDL2 mingw-w64-clang-aarch64-vlc mingw-w64-clang-aarch64-libvorbis mingw-w64-clang-aarch64-xxhash -$ export LL_BUILD="-O3 -std=c++20 -fPIC -DLL_WINDOWS=1" +$ vcpkg install pkgconf python3 freealut apr-util boost freetype glm hunspell libjpeg-turbo meshoptimizer minizip nghttp2 openjpeg libvorbis libxml2[tools] xxhash +$ export LL_BUILD="/MD /O2 /Ob2 /std:c++20 /Zc:wchar_t- /Zi /GR /DLL_RELEASE=1 /DLL_RELEASE_FOR_DOWNLOAD=1 /DNDEBUG /D_SECURE_STL=0 /D_HAS_ITERATOR_DEBUGGING=0 /DWIN32 /D_WINDOWS /DLL_WINDOWS=1 /DUNICODE /D_UNICODE /DWINVER=0x0602 /D_WIN32_WINNT=0x0602" +$ export PATH="/c/Program Files/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/bin:$VCPKG_ROOT/downloads/tools/msys2/21caed2f81ec917b/mingw64/bin:$VCPKG_ROOT/installed/`uname -m|sed 's/86_//'`-windows/tools/libxml2:$PATH" +$ export PKG_CONFIG_LIBDIR="$VCPKG_ROOT/installed/`uname -m|sed 's/86_//'`-windows/lib/pkgconfig" +$ export PYTHON="$VCPKG_ROOT/installed/`uname -m|sed 's/86_//'`-windows/tools/python3/python.exe" $ cmake -DCMAKE_BUILD_TYPE:STRING=Release -DADDRESS_SIZE:STRING=64 -DUSE_OPENAL:BOOL=ON -DUSE_FMODSTUDIO:BOOL=OFF -DENABLE_MEDIA_PLUGINS:BOOL=OFF -DLL_TESTS:BOOL=OFF -DNDOF:BOOL=OFF -DROOT_PROJECT_NAME:STRING=Megapahit -DVIEWER_CHANNEL:STRING=Megapahit -DVIEWER_BINARY_NAME:STRING=megapahit -DBUILD_SHARED_LIBS:BOOL=OFF -DINSTALL:BOOL=OFF -DPACKAGE:BOOL=OFF ../indra ``` diff --git a/indra/cmake/APR.cmake b/indra/cmake/APR.cmake index cf31027c9a..fa3b8a4ffb 100644 --- a/indra/cmake/APR.cmake +++ b/indra/cmake/APR.cmake @@ -5,11 +5,18 @@ include_guard() add_library( ll::apr INTERFACE IMPORTED ) -include(FindPkgConfig) -pkg_check_modules(Apr REQUIRED apr-1 apr-util-1) -target_include_directories(ll::apr SYSTEM INTERFACE ${Apr_INCLUDE_DIRS}) -target_link_directories(ll::apr INTERFACE ${Apr_LIBRARY_DIRS}) -target_link_libraries(ll::apr INTERFACE ${Apr_LIBRARIES}) +if (WINDOWS) + target_include_directories(ll::apr SYSTEM INTERFACE ${prefix_result}/../include) + target_link_directories(ll::apr INTERFACE ${prefix_result}) + target_link_libraries(ll::apr INTERFACE apr-1 apr-util-1) +else () + include(FindPkgConfig) + pkg_check_modules(Apr REQUIRED apr-1 apr-util-1) + target_include_directories(ll::apr SYSTEM INTERFACE ${Apr_INCLUDE_DIRS}) + target_link_directories(ll::apr INTERFACE ${Apr_LIBRARY_DIRS}) + target_link_libraries(ll::apr INTERFACE ${Apr_LIBRARIES}) +endif () + return () use_system_binary( apr apr-util ) diff --git a/indra/cmake/Boost.cmake b/indra/cmake/Boost.cmake index ba2eaccf63..9ea1f6c9a6 100644 --- a/indra/cmake/Boost.cmake +++ b/indra/cmake/Boost.cmake @@ -6,13 +6,13 @@ include_guard() add_library( ll::boost INTERFACE IMPORTED ) if (DARWIN) - set(sfx -mt) target_include_directories( ll::boost SYSTEM INTERFACE /opt/local/libexec/boost/1.87/include) target_link_directories( ll::boost INTERFACE /opt/local/libexec/boost/1.87/lib) -elseif (WINDOWS) set(sfx -mt) - target_include_directories( ll::boost SYSTEM INTERFACE /opt/local/x86_64-w64-mingw32/include) - target_link_directories( ll::boost INTERFACE /opt/local/x86_64-w64-mingw32/lib) +elseif (WINDOWS) + target_include_directories( ll::boost SYSTEM INTERFACE ${prefix_result}/../include) + target_link_directories( ll::boost INTERFACE ${prefix_result}) + set(sfx -vc143-mt-x64-1_88) else () find_package( Boost REQUIRED ) endif () diff --git a/indra/cmake/CURL.cmake b/indra/cmake/CURL.cmake index b301819536..06d5927174 100644 --- a/indra/cmake/CURL.cmake +++ b/indra/cmake/CURL.cmake @@ -6,7 +6,7 @@ include_guard() add_library( ll::libcurl INTERFACE IMPORTED ) #use_system_binary(libcurl) -if (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR DARWIN) +if (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR DARWIN OR WINDOWS) use_prebuilt_binary(curl) if (DARWIN) execute_process( diff --git a/indra/cmake/GLM.cmake b/indra/cmake/GLM.cmake index fcf5e77cae..db6acc065e 100644 --- a/indra/cmake/GLM.cmake +++ b/indra/cmake/GLM.cmake @@ -6,6 +6,6 @@ add_library( ll::glm INTERFACE IMPORTED ) #use_system_binary( glm ) if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu) OR (${LINUX_DISTRO} MATCHES opensuse-tumbleweed)) use_prebuilt_binary(glm) -else () +elseif (NOT WINDOWS) find_package( glm REQUIRED ) endif () diff --git a/indra/cmake/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake index 21952713ca..bbda10fbaa 100644 --- a/indra/cmake/LLPrimitive.cmake +++ b/indra/cmake/LLPrimitive.cmake @@ -18,19 +18,11 @@ if( USE_CONAN ) "${CONAN_INCLUDE_DIRS_COLLADADOM}/collada-dom/1.4/" ) endif() -if( WINDOWS ) - include(FindPkgConfig) - pkg_check_modules(Colladadom REQUIRED collada-dom-141) - target_compile_definitions( ll::colladadom INTERFACE COLLADA_DOM_SUPPORT141 ) - target_include_directories( ll::colladadom SYSTEM INTERFACE ${Colladadom_INCLUDE_DIRS} ) - target_link_directories( ll::colladadom INTERFACE ${Colladadom_LIBRARY_DIRS} ) - target_link_libraries( ll::colladadom INTERFACE ${Colladadom_LIBRARIES} ) - return() -elseif( LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD ) +if( LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD ) # Build of the collada-dom for Linux and FreeBSD is done in # indra/llprimitive/CMakeLists.txt return() -else() +elseif ( WINDOWS ) include(FindPkgConfig) pkg_check_modules(Minizip REQUIRED minizip) pkg_check_modules(Libxml2 REQUIRED libxml-2.0) @@ -47,15 +39,24 @@ else() INPUT ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8.tar.gz DESTINATION ${CMAKE_BINARY_DIR} ) - execute_process( - COMMAND sed -i "" -e "s/SHARED/STATIC/g" CMakeLists.txt - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8/src/1.4 - ) + if ( WINDOWS ) + execute_process( + COMMAND sed -i "s/SHARED/STATIC/g" CMakeLists.txt + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8/src/1.4 + ) + set(BOOST_LIBRARY_SUFFIX -vc143-mt-x64-1_88) + else () + execute_process( + COMMAND sed -i "" -e "s/SHARED/STATIC/g" CMakeLists.txt + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8/src/1.4 + ) + endif () if( DARWIN ) set(BOOST_CFLAGS -I${Libxml2_LIBRARY_DIRS}exec/boost/1.87/include) set(BOOST_LIBS -L${Minizip_LIBRARY_DIRS}exec/boost/1.87/lib) set(BOOST_LIBRARY_SUFFIX -mt) endif() + file(MAKE_DIRECTORY ${LIBS_PREBUILT_DIR}/include/collada/1.4) try_compile(COLLADADOM_RESULT PROJECT colladadom SOURCE_DIR ${CMAKE_BINARY_DIR}/3p-colladadom-2.3-r8 @@ -92,10 +93,12 @@ else() endif() endif() -if( FALSE ) -use_system_binary( colladadom ) +#use_system_binary( colladadom ) +if (WINDOWS) use_prebuilt_binary(colladadom) +endif () +if( FALSE ) use_prebuilt_binary(minizip-ng) # needed for colladadom use_prebuilt_binary(libxml2) diff --git a/indra/cmake/Meshoptimizer.cmake b/indra/cmake/Meshoptimizer.cmake index 4b428e4b83..5058614580 100644 --- a/indra/cmake/Meshoptimizer.cmake +++ b/indra/cmake/Meshoptimizer.cmake @@ -7,8 +7,10 @@ include_guard() add_library( ll::meshoptimizer INTERFACE IMPORTED ) #use_system_binary(meshoptimizer) -if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu) OR CMAKE_SYSTEM_NAME MATCHES FreeBSD) - find_package(meshoptimizer) +if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu) OR CMAKE_SYSTEM_NAME MATCHES FreeBSD OR WINDOWS) + if (NOT WINDOWS) + find_package(meshoptimizer) + endif () target_link_libraries( ll::meshoptimizer INTERFACE meshoptimizer) return () elseif (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 AND NOT (${LINUX_DISTRO} MATCHES gentoo)) diff --git a/indra/cmake/OpenSSL.cmake b/indra/cmake/OpenSSL.cmake index 7cb59b04c3..ef90068993 100644 --- a/indra/cmake/OpenSSL.cmake +++ b/indra/cmake/OpenSSL.cmake @@ -6,7 +6,7 @@ include_guard() add_library( ll::openssl INTERFACE IMPORTED ) #use_system_binary(openssl) -if (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR DARWIN) +if (LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES x86_64 OR DARWIN OR WINDOWS) use_prebuilt_binary(openssl) if (DARWIN) execute_process( diff --git a/indra/cmake/WebRTC.cmake b/indra/cmake/WebRTC.cmake index 19457924d8..454ed8c0a1 100644 --- a/indra/cmake/WebRTC.cmake +++ b/indra/cmake/WebRTC.cmake @@ -6,9 +6,9 @@ include_guard() add_library( ll::webrtc INTERFACE IMPORTED ) target_include_directories( ll::webrtc SYSTEM INTERFACE "${LIBS_PREBUILT_DIR}/include/webrtc" "${LIBS_PREBUILT_DIR}/include/webrtc/third_party/abseil-cpp") -if (${LINUX_DISTRO} MATCHES debian OR CMAKE_OSX_ARCHITECTURES MATCHES x86_64) +if (${LINUX_DISTRO} MATCHES debian OR CMAKE_OSX_ARCHITECTURES MATCHES x86_64 OR WINDOWS) use_prebuilt_binary(webrtc) -elseif (NOT (WINDOWS OR CMAKE_SYSTEM_NAME MATCHES FreeBSD)) +elseif (NOT CMAKE_SYSTEM_NAME MATCHES FreeBSD) target_compile_definitions(ll::webrtc INTERFACE CM_WEBRTC=1) if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/webrtc_installed OR NOT ${webrtc_installed} EQUAL 0) if (DARWIN) @@ -17,14 +17,14 @@ elseif (NOT (WINDOWS OR CMAKE_SYSTEM_NAME MATCHES FreeBSD)) set(WEBRTC_PLATFORM linux-arm64) else () set(WEBRTC_PLATFORM linux-x64) - endif (DARWIN) + endif () if (NOT EXISTS ${CMAKE_BINARY_DIR}/libwebrtc-${WEBRTC_PLATFORM}.tar.xz) file(DOWNLOAD https://github.com/crow-misia/libwebrtc-bin/releases/download/114.5735.6.1/libwebrtc-${WEBRTC_PLATFORM}.tar.xz ${CMAKE_BINARY_DIR}/libwebrtc-${WEBRTC_PLATFORM}.tar.xz SHOW_PROGRESS ) - endif (NOT EXISTS ${CMAKE_BINARY_DIR}/libwebrtc-${WEBRTC_PLATFORM}.tar.xz) + endif () file(ARCHIVE_EXTRACT INPUT ${CMAKE_BINARY_DIR}/libwebrtc-${WEBRTC_PLATFORM}.tar.xz DESTINATION ${LIBS_PREBUILT_DIR} @@ -74,10 +74,10 @@ elseif (NOT (WINDOWS OR CMAKE_SYSTEM_NAME MATCHES FreeBSD)) ${ARCH_PREBUILT_DIRS_RELEASE}/WebRTC.framework ) file(REMOVE_RECURSE ${LIBS_PREBUILT_DIR}/Frameworks) - endif (CMAKE_OSX_ARCHITECTURES MATCHES arm64) + endif () file(WRITE ${PREBUILD_TRACKING_DIR}/webrtc_installed "0") - endif (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/webrtc_installed OR NOT ${webrtc_installed} EQUAL 0) -endif (${LINUX_DISTRO} MATCHES debian OR CMAKE_OSX_ARCHITECTURES MATCHES x86_64) + endif () +endif () if (WINDOWS) target_link_libraries( ll::webrtc INTERFACE webrtc.lib ) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index ac35bec368..6c1e1ef64a 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -303,7 +303,10 @@ if (${LINUX_DISTRO} MATCHES debian OR (${LINUX_DISTRO} MATCHES ubuntu) OR (${LIN target_include_directories(llcommon PUBLIC ${LIBS_PREBUILT_DIR}/include) endif () -target_compile_options(${PROJECT_NAME} PUBLIC -Wno-deprecated-declarations) +if (NOT WINDOWS) + target_compile_options(${PROJECT_NAME} PUBLIC -Wno-deprecated-declarations) +endif () + if (CMAKE_CXX_COMPILER_ID MATCHES GNU) set_source_files_properties( llapp.cpp diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h index 4a9359f8e2..d5802b9d95 100644 --- a/indra/llcommon/llmemory.h +++ b/indra/llcommon/llmemory.h @@ -71,7 +71,7 @@ LL_COMMON_API void ll_assert_aligned_func(uintptr_t ptr,U32 alignment); #define ll_assert_aligned(ptr,alignment) #endif -#if defined(__i386__) || defined(__x86_64__) +#if defined(__i386__) || defined(__x86_64__) || _M_X64 #include #else #include diff --git a/indra/llmath/llsimdmath.h b/indra/llmath/llsimdmath.h index 590d8de92f..6242095456 100644 --- a/indra/llmath/llsimdmath.h +++ b/indra/llmath/llsimdmath.h @@ -39,7 +39,7 @@ #include #endif -#if defined(__i386__) || defined(__x86_64__) +#if defined(__i386__) || defined(__x86_64__) || _M_X64 #include #include #else diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index b937727b15..8c895246de 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1760,6 +1760,8 @@ if (WINDOWS) ) target_compile_options(${VIEWER_BINARY_NAME} PRIVATE /bigobj) + if (FALSE) + # If adding a file to viewer_manifest.py in the WindowsManifest.construct() method, be sure to add the dependency # here. # *NOTE:Mani - This is a crappy hack to have important dependencies for the viewer_manifest copy action @@ -1887,6 +1889,8 @@ if (WINDOWS) add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts) endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) + endif (FALSE) + add_dependencies(${VIEWER_BINARY_NAME} SLPlugin) # sets the 'working directory' for debugging from visual studio. -- cgit v1.2.3 From 8be1586159f511882f477ac7f50a8d15b6aacc63 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Tue, 27 May 2025 14:43:16 +0800 Subject: Exempt logging that prints build-time path on FBSD --- indra/llcommon/llapr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp index 01763c49aa..04aba817f8 100644 --- a/indra/llcommon/llapr.cpp +++ b/indra/llcommon/llapr.cpp @@ -230,7 +230,7 @@ bool LLVolatileAPRPool::isFull() bool _ll_apr_warn_status(apr_status_t status, const char* file, int line) { if(APR_SUCCESS == status) return false; -#if !LL_LINUX +#if !LL_LINUX && !__FreeBSD__ char buf[MAX_STRING]; /* Flawfinder: ignore */ apr_strerror(status, buf, sizeof(buf)); LL_WARNS("APR") << "APR: " << file << ":" << line << " " << buf << LL_ENDL; -- cgit v1.2.3 From a53da62ed888575c4b4560fec2e87b91538f821c Mon Sep 17 00:00:00 2001 From: secretfoxtail Date: Tue, 27 May 2025 04:35:38 -0600 Subject: res-sdl cursor tweaks misc adjustments to some of the red-sdl cursors --- indra/newview/res-sdl/cross.BMP | Bin 2102 -> 2186 bytes indra/newview/res-sdl/lltoolcamera.BMP | Bin 2102 -> 2186 bytes indra/newview/res-sdl/lltoolcreate.BMP | Bin 2102 -> 2186 bytes indra/newview/res-sdl/lltoolpipette.BMP | Bin 3126 -> 3210 bytes indra/newview/res-sdl/lltoolrotate.BMP | Bin 2186 -> 2186 bytes indra/newview/res-sdl/toolmediaopen.BMP | Bin 4234 -> 3210 bytes indra/newview/res-sdl/toolopen.BMP | Bin 4234 -> 3210 bytes indra/newview/res-sdl/toolplay.BMP | Bin 4234 -> 3210 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/indra/newview/res-sdl/cross.BMP b/indra/newview/res-sdl/cross.BMP index 0b4672d4d6..96ed7a4d60 100644 Binary files a/indra/newview/res-sdl/cross.BMP and b/indra/newview/res-sdl/cross.BMP differ diff --git a/indra/newview/res-sdl/lltoolcamera.BMP b/indra/newview/res-sdl/lltoolcamera.BMP index c961d7a49c..f281181091 100644 Binary files a/indra/newview/res-sdl/lltoolcamera.BMP and b/indra/newview/res-sdl/lltoolcamera.BMP differ diff --git a/indra/newview/res-sdl/lltoolcreate.BMP b/indra/newview/res-sdl/lltoolcreate.BMP index 08a4a9322d..4b7a144143 100644 Binary files a/indra/newview/res-sdl/lltoolcreate.BMP and b/indra/newview/res-sdl/lltoolcreate.BMP differ diff --git a/indra/newview/res-sdl/lltoolpipette.BMP b/indra/newview/res-sdl/lltoolpipette.BMP index 2d27118289..6580ab0e68 100644 Binary files a/indra/newview/res-sdl/lltoolpipette.BMP and b/indra/newview/res-sdl/lltoolpipette.BMP differ diff --git a/indra/newview/res-sdl/lltoolrotate.BMP b/indra/newview/res-sdl/lltoolrotate.BMP index 6115984c62..4d29e99177 100644 Binary files a/indra/newview/res-sdl/lltoolrotate.BMP and b/indra/newview/res-sdl/lltoolrotate.BMP differ diff --git a/indra/newview/res-sdl/toolmediaopen.BMP b/indra/newview/res-sdl/toolmediaopen.BMP index 670f07235e..5d70cb0463 100644 Binary files a/indra/newview/res-sdl/toolmediaopen.BMP and b/indra/newview/res-sdl/toolmediaopen.BMP differ diff --git a/indra/newview/res-sdl/toolopen.BMP b/indra/newview/res-sdl/toolopen.BMP index ae4908fd35..3e26ceec28 100644 Binary files a/indra/newview/res-sdl/toolopen.BMP and b/indra/newview/res-sdl/toolopen.BMP differ diff --git a/indra/newview/res-sdl/toolplay.BMP b/indra/newview/res-sdl/toolplay.BMP index d0e14838e9..7edf03d86a 100644 Binary files a/indra/newview/res-sdl/toolplay.BMP and b/indra/newview/res-sdl/toolplay.BMP differ -- cgit v1.2.3 From f0f92d7cade5c6c71c2b9f31d7e2c0edc0f44efc Mon Sep 17 00:00:00 2001 From: secretfoxtail Date: Tue, 27 May 2025 05:07:15 -0600 Subject: Icons adjustment Restore default SL_logo.png and hand.png, change MP_Logo.png to downscale of app icon. --- .../newview/skins/default/textures/icons/MP_Logo.png | Bin 7297 -> 1410 bytes .../newview/skins/default/textures/icons/SL_Logo.png | Bin 10535 -> 1484 bytes indra/newview/skins/default/textures/icons/hand.png | Bin 5338 -> 899 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/indra/newview/skins/default/textures/icons/MP_Logo.png b/indra/newview/skins/default/textures/icons/MP_Logo.png index e33a830d3b..54c47d4508 100644 Binary files a/indra/newview/skins/default/textures/icons/MP_Logo.png and b/indra/newview/skins/default/textures/icons/MP_Logo.png differ diff --git a/indra/newview/skins/default/textures/icons/SL_Logo.png b/indra/newview/skins/default/textures/icons/SL_Logo.png index 943265e240..5e376c72f9 100644 Binary files a/indra/newview/skins/default/textures/icons/SL_Logo.png and b/indra/newview/skins/default/textures/icons/SL_Logo.png differ diff --git a/indra/newview/skins/default/textures/icons/hand.png b/indra/newview/skins/default/textures/icons/hand.png index 3f497eefbb..5fbdb70c2b 100644 Binary files a/indra/newview/skins/default/textures/icons/hand.png and b/indra/newview/skins/default/textures/icons/hand.png differ -- cgit v1.2.3 From e024b81c2660a1183fa014f36932c8daca244d35 Mon Sep 17 00:00:00 2001 From: Erik Kundiman Date: Tue, 27 May 2025 20:26:07 +0800 Subject: Fix mistake, don't self-build ColladaDOM on Windows for now --- indra/cmake/LLPrimitive.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/cmake/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake index bbda10fbaa..3429a744f5 100644 --- a/indra/cmake/LLPrimitive.cmake +++ b/indra/cmake/LLPrimitive.cmake @@ -22,7 +22,7 @@ if( LINUX OR CMAKE_SYSTEM_NAME MATCHES FreeBSD ) # Build of the collada-dom for Linux and FreeBSD is done in # indra/llprimitive/CMakeLists.txt return() -elseif ( WINDOWS ) +elseif ( NOT WINDOWS ) include(FindPkgConfig) pkg_check_modules(Minizip REQUIRED minizip) pkg_check_modules(Libxml2 REQUIRED libxml-2.0) -- cgit v1.2.3 From cf11376a6f371afa1b7bcfbc8b366a60e38ace8b Mon Sep 17 00:00:00 2001 From: Nicky Date: Fri, 26 Jul 2024 16:23:54 +0200 Subject: Post merge cleanup of Linux code --- indra/llwindow/llwindowsdl.cpp | 2 +- indra/llwindow/llwindowsdl.h | 7 +++---- indra/newview/lldirpicker.cpp | 1 + indra/newview/viewer_manifest.py | 28 ---------------------------- 4 files changed, 5 insertions(+), 33 deletions(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index f667ff7542..079fca00c0 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -427,7 +427,7 @@ LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks, #if LL_X11 mSDL_XWindowID = None; - mSDL_Display = NULL; + mSDL_Display = nullptr; #endif // LL_X11 // Assume 4:3 aspect ratio until we know better diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h index 3ed2811572..3acda71157 100644 --- a/indra/llwindow/llwindowsdl.h +++ b/indra/llwindow/llwindowsdl.h @@ -285,7 +285,6 @@ protected: int mHaveInputFocus; /* 0=no, 1=yes, else unknown */ int mIsMinimized; /* 0=no, 1=yes, else unknown */ - int mIsActive; /* 0=no, 1=yes, else unknown */ friend class LLWindowManager; @@ -316,6 +315,8 @@ public: void clearSecondaryText() { mSecondaryClipboard.clear(); } private: + void tryFindFullscreenSize(int &aWidth, int &aHeight); + void initialiseX11Clipboard(); bool getSelectionText(Atom selection, LLWString &text); @@ -323,10 +324,8 @@ private: bool getSelectionText(Atom selection, Atom type, LLWString &text); bool setSelectionText(Atom selection, const LLWString &text); -#endif - - void tryFindFullscreenSize(int &aWidth, int &aHeight); +#endif LLWString mPrimaryClipboard; LLWString mSecondaryClipboard; }; diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp index 1425aab947..fa8acac2ce 100644 --- a/indra/newview/lldirpicker.cpp +++ b/indra/newview/lldirpicker.cpp @@ -272,6 +272,7 @@ bool LLDirPicker::getDir(std::string* filename, bool blocking) } return !mDir.empty(); #endif + return false; } std::string LLDirPicker::getDirName() diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index e9112694d9..c778f1e838 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -1803,34 +1803,6 @@ class Linux_x86_64_Manifest(LinuxManifest): self.path("libalut.so*") self.path("libopenal.so*") self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname - # KLUDGE: As of 2012-04-11, the 'fontconfig' package installs - # libfontconfig.so.1.4.4, along with symlinks libfontconfig.so.1 - # and libfontconfig.so. Before we added support for library-file - # wildcards, though, this self.path() call specifically named - # libfontconfig.so.1.4.4 WITHOUT also copying the symlinks. When I - # (nat) changed the call to self.path("libfontconfig.so.*"), we - # ended up with the libfontconfig.so.1 symlink in the target - # directory as well. But guess what! At least on Ubuntu 10.04, - # certain viewer fonts look terrible with libfontconfig.so.1 - # present in the target directory. Removing that symlink suffices - # to improve them. I suspect that means we actually do better when - # the viewer fails to find our packaged libfontconfig.so*, falling - # back on the system one instead -- but diagnosing and fixing that - # is a bit out of scope for the present project. Meanwhile, this - # particular wildcard specification gets us exactly what the - # previous call did, without having to explicitly state the - # version number. - self.path("libfontconfig.so.*.*") - - # Include libfreetype.so. but have it work as libfontconfig does. - self.path("libfreetype.so.*.*") - - try: - self.path("libtcmalloc.so*") #formerly called google perf tools - pass - except: - print("tcmalloc files not found, skipping") - pass # Vivox runtimes with self.prefix(src=relpkgdir, dst="bin"): -- cgit v1.2.3 From 031a29625d40215e8715e4eccac17578984c6907 Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Sat, 27 Jul 2024 18:01:29 +0300 Subject: Fix trailing whitespace --- indra/llwindow/llwindowsdl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h index 3acda71157..cdb8a888d5 100644 --- a/indra/llwindow/llwindowsdl.h +++ b/indra/llwindow/llwindowsdl.h @@ -177,7 +177,7 @@ public: void *getPlatformWindow() override; void bringToFront() override; - + void setLanguageTextInput(const LLCoordGL& pos) override; void spawnWebBrowser(const std::string &escaped_url, bool async) override; -- cgit v1.2.3 From 619fdda6279341fdb52f98c09c202cf038851a31 Mon Sep 17 00:00:00 2001 From: Ansariel Hiller Date: Wed, 4 Sep 2024 21:24:14 +0200 Subject: Fix name of vsync param in LLWindowSDL (#2502) --- indra/llwindow/llwindowsdl.cpp | 11 +++++------ indra/llwindow/llwindowsdl.h | 6 +++--- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 079fca00c0..1f2b8aaac3 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -398,11 +398,10 @@ LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks, const std::string& title, S32 x, S32 y, S32 width, S32 height, U32 flags, bool fullscreen, bool clearBg, - bool disable_vsync, bool use_gl, + bool enable_vsync, bool use_gl, bool ignore_pixel_depth, U32 fsaa_samples) : LLWindow(callbacks, fullscreen, flags), Lock_Display(NULL), - //Unlock_Display(NULL), mGamma(1.0f) Unlock_Display(NULL), mGamma(1.0f) { // Initialize the keyboard @@ -439,7 +438,7 @@ LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks, mWindowTitle = title; // Create the GL context and set it up for windowed or fullscreen, as appropriate. - if(createContext(x, y, width, height, 32, fullscreen, disable_vsync)) + if(createContext(x, y, width, height, 32, fullscreen, enable_vsync)) { gGLManager.initGL(); @@ -675,7 +674,7 @@ void LLWindowSDL::tryFindFullscreenSize( int &width, int &height ) } } -bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, bool fullscreen, bool disable_vsync) +bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, bool fullscreen, bool enable_vsync) { //bool glneedsinit = false; @@ -981,7 +980,7 @@ bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, b // changing fullscreen resolution, or switching between windowed and fullscreen mode. -bool LLWindowSDL::switchContext(bool fullscreen, const LLCoordScreen &size, bool disable_vsync, const LLCoordScreen * const posp) +bool LLWindowSDL::switchContext(bool fullscreen, const LLCoordScreen &size, bool enable_vsync, const LLCoordScreen * const posp) { const bool needsRebuild = true; // Just nuke the context and start over. bool result = true; @@ -991,7 +990,7 @@ bool LLWindowSDL::switchContext(bool fullscreen, const LLCoordScreen &size, bool if(needsRebuild) { destroyContext(); - result = createContext(0, 0, size.mX, size.mY, 0, fullscreen, disable_vsync); + result = createContext(0, 0, size.mX, size.mY, 0, fullscreen, enable_vsync); if (result) { gGLManager.initGL(); diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h index cdb8a888d5..36bdf0e80a 100644 --- a/indra/llwindow/llwindowsdl.h +++ b/indra/llwindow/llwindowsdl.h @@ -84,7 +84,7 @@ public: bool setSizeImpl(LLCoordWindow size) override; - bool switchContext(bool fullscreen, const LLCoordScreen &size, bool disable_vsync, + bool switchContext(bool fullscreen, const LLCoordScreen &size, bool enable_vsync, const LLCoordScreen *const posp = NULL) override; bool setCursorPosition(LLCoordWindow position) override; @@ -222,7 +222,7 @@ public: protected: LLWindowSDL(LLWindowCallbacks *callbacks, const std::string &title, int x, int y, int width, int height, U32 flags, - bool fullscreen, bool clearBg, bool disable_vsync, bool use_gl, + bool fullscreen, bool clearBg, bool enable_vsync, bool use_gl, bool ignore_pixel_depth, U32 fsaa_samples); ~LLWindowSDL(); @@ -251,7 +251,7 @@ protected: // // create or re-create the GL context/window. Called from the constructor and switchContext(). - bool createContext(int x, int y, int width, int height, int bits, bool fullscreen, bool disable_vsync); + bool createContext(int x, int y, int width, int height, int bits, bool fullscreen, bool enable_vsync); void destroyContext(); -- cgit v1.2.3 From 2caab6e9aefc5c2538434af0c49d3bd398977c14 Mon Sep 17 00:00:00 2001 From: Rye Cogtail Date: Sat, 28 Sep 2024 23:38:11 -0400 Subject: Update SDL clipboard, icon flash, and url opening handlers to use native SDL functions --- indra/llwindow/llwindowsdl.cpp | 487 ++++------------------------------------- indra/llwindow/llwindowsdl.h | 34 --- 2 files changed, 40 insertions(+), 481 deletions(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 1f2b8aaac3..be98a0d6e0 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -152,248 +152,6 @@ Display* LLWindowSDL::get_SDL_Display(void) } #endif // LL_X11 -#if LL_X11 - -// Clipboard handing via native X11, base on the implementation in Cool VL by Henri Beauchamp - -namespace -{ - std::array gSupportedAtoms; - - Atom XA_CLIPBOARD; - Atom XA_TARGETS; - Atom PVT_PASTE_BUFFER; - long const MAX_PASTE_BUFFER_SIZE = 16383; - - void filterSelectionRequest( XEvent aEvent ) - { - auto *display = LLWindowSDL::getSDLDisplay(); - auto &request = aEvent.xselectionrequest; - - XSelectionEvent reply { SelectionNotify, aEvent.xany.serial, aEvent.xany.send_event, display, - request.requestor, request.selection, request.target, - request.property,request.time }; - - if (request.target == XA_TARGETS) - { - XChangeProperty(display, request.requestor, request.property, - XA_ATOM, 32, PropModeReplace, - (unsigned char *) &gSupportedAtoms.front(), gSupportedAtoms.size()); - } - else if (std::find(gSupportedAtoms.begin(), gSupportedAtoms.end(), request.target) != - gSupportedAtoms.end()) - { - std::string utf8; - if (request.selection == XA_PRIMARY) - utf8 = wstring_to_utf8str(gWindowImplementation->getPrimaryText()); - else - utf8 = wstring_to_utf8str(gWindowImplementation->getSecondaryText()); - - XChangeProperty(display, request.requestor, request.property, - request.target, 8, PropModeReplace, - (unsigned char *) utf8.c_str(), utf8.length()); - } - else if (request.selection == XA_CLIPBOARD) - { - // Did not have what they wanted, so no property set - reply.property = None; - } - else - return; - - XSendEvent(request.display, request.requestor, False, NoEventMask, (XEvent *) &reply); - XSync(display, False); - } - - void filterSelectionClearRequest( XEvent aEvent ) - { - auto &request = aEvent.xselectionrequest; - if (request.selection == XA_PRIMARY) - gWindowImplementation->clearPrimaryText(); - else if (request.selection == XA_CLIPBOARD) - gWindowImplementation->clearSecondaryText(); - } - - int x11_clipboard_filter(void*, SDL_Event *evt) - { - Display *display = LLWindowSDL::getSDLDisplay(); - if (!display) - return 1; - - if (evt->type != SDL_SYSWMEVENT) - return 1; - - auto xevent = evt->syswm.msg->msg.x11.event; - - if (xevent.type == SelectionRequest) - filterSelectionRequest( xevent ); - else if (xevent.type == SelectionClear) - filterSelectionClearRequest( xevent ); - return 1; - } - - bool grab_property(Display* display, Window window, Atom selection, Atom target) - { - if( !display ) - return false; - - maybe_lock_display(); - - XDeleteProperty(display, window, PVT_PASTE_BUFFER); - XFlush(display); - - XConvertSelection(display, selection, target, PVT_PASTE_BUFFER, window, CurrentTime); - - // Unlock the connection so that the SDL event loop may function - maybe_unlock_display(); - - const auto start{ SDL_GetTicks() }; - const auto end{ start + 1000 }; - - XEvent xevent {}; - bool response = false; - - do - { - SDL_Event event {}; - - // Wait for an event - SDL_WaitEvent(&event); - - // If the event is a window manager event - if (event.type == SDL_SYSWMEVENT) - { - xevent = event.syswm.msg->msg.x11.event; - - if (xevent.type == SelectionNotify && xevent.xselection.requestor == window) - response = true; - } - } while (!response && SDL_GetTicks() < end ); - - return response && xevent.xselection.property != None; - } -} - -void LLWindowSDL::initialiseX11Clipboard() -{ - if (!mSDL_Display) - return; - - SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE); - SDL_SetEventFilter(x11_clipboard_filter, nullptr); - - maybe_lock_display(); - - XA_CLIPBOARD = XInternAtom(mSDL_Display, "CLIPBOARD", False); - - gSupportedAtoms[0] = XInternAtom(mSDL_Display, "UTF8_STRING", False); - gSupportedAtoms[1] = XInternAtom(mSDL_Display, "COMPOUND_TEXT", False); - gSupportedAtoms[2] = XA_STRING; - - // TARGETS atom - XA_TARGETS = XInternAtom(mSDL_Display, "TARGETS", False); - - // SL_PASTE_BUFFER atom - PVT_PASTE_BUFFER = XInternAtom(mSDL_Display, "FS_PASTE_BUFFER", False); - - maybe_unlock_display(); -} - -bool LLWindowSDL::getSelectionText( Atom aSelection, Atom aType, LLWString &text ) -{ - if( !mSDL_Display ) - return false; - - if( !grab_property(mSDL_Display, mSDL_XWindowID, aSelection,aType ) ) - return false; - - maybe_lock_display(); - - Atom type; - int format{}; - unsigned long len{},remaining {}; - unsigned char* data = nullptr; - int res = XGetWindowProperty(mSDL_Display, mSDL_XWindowID, - PVT_PASTE_BUFFER, 0, MAX_PASTE_BUFFER_SIZE, False, - AnyPropertyType, &type, &format, &len, - &remaining, &data); - if (data && len) - { - text = LLWString( - utf8str_to_wstring(reinterpret_cast< char const *>( data ) ) - ); - XFree(data); - } - - maybe_unlock_display(); - return res == Success; -} - -bool LLWindowSDL::getSelectionText(Atom selection, LLWString& text) -{ - if (!mSDL_Display) - return false; - - maybe_lock_display(); - - Window owner = XGetSelectionOwner(mSDL_Display, selection); - if (owner == None) - { - if (selection == XA_PRIMARY) - { - owner = DefaultRootWindow(mSDL_Display); - selection = XA_CUT_BUFFER0; - } - else - { - maybe_unlock_display(); - return false; - } - } - - maybe_unlock_display(); - - for( Atom atom : gSupportedAtoms ) - { - if(getSelectionText(selection, atom, text ) ) - return true; - } - - return false; -} - -bool LLWindowSDL::setSelectionText(Atom selection, const LLWString& text) -{ - maybe_lock_display(); - - if (selection == XA_PRIMARY) - { - std::string utf8 = wstring_to_utf8str(text); - XStoreBytes(mSDL_Display, utf8.c_str(), utf8.length() + 1); - mPrimaryClipboard = text; - } - else - mSecondaryClipboard = text; - - XSetSelectionOwner(mSDL_Display, selection, mSDL_XWindowID, CurrentTime); - - auto owner = XGetSelectionOwner(mSDL_Display, selection); - - maybe_unlock_display(); - - return owner == mSDL_XWindowID; -} - -Display* LLWindowSDL::getSDLDisplay() -{ - if (gWindowImplementation) - return gWindowImplementation->mSDL_Display; - return nullptr; -} - -#endif - - LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks, const std::string& title, S32 x, S32 y, S32 width, S32 height, U32 flags, @@ -452,10 +210,7 @@ LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks, // Stash an object pointer for OSMessageBox() gWindowImplementation = this; -#if LL_X11 mFlashing = false; - initialiseX11Clipboard(); -#endif // LL_X11 mKeyVirtualKey = 0; mKeyModifiers = KMOD_NONE; @@ -1478,116 +1233,70 @@ void LLWindowSDL::afterDialog() } } - -#if LL_X11 -// set/reset the XWMHints flag for 'urgency' that usually makes the icon flash -void LLWindowSDL::x11_set_urgent(bool urgent) -{ - if (mSDL_Display && !mFullscreen) - { - XWMHints *wm_hints; - - LL_INFOS() << "X11 hint for urgency, " << urgent << LL_ENDL; - - maybe_lock_display(); - wm_hints = XGetWMHints(mSDL_Display, mSDL_XWindowID); - if (!wm_hints) - wm_hints = XAllocWMHints(); - - if (urgent) - wm_hints->flags |= XUrgencyHint; - else - wm_hints->flags &= ~XUrgencyHint; - - XSetWMHints(mSDL_Display, mSDL_XWindowID, wm_hints); - XFree(wm_hints); - XSync(mSDL_Display, False); - maybe_unlock_display(); - } -} -#endif // LL_X11 - void LLWindowSDL::flashIcon(F32 seconds) { - if (getMinimized()) - { -#if !LL_X11 - LL_INFOS() << "Stub LLWindowSDL::flashIcon(" << seconds << ")" << LL_ENDL; -#else - LL_INFOS() << "X11 LLWindowSDL::flashIcon(" << seconds << ")" << LL_ENDL; + LL_INFOS() << "LLWindowSDL::flashIcon(" << seconds << ")" << LL_ENDL; - F32 remaining_time = mFlashTimer.getRemainingTimeF32(); - if (remaining_time < seconds) - remaining_time = seconds; - mFlashTimer.reset(); - mFlashTimer.setTimerExpirySec(remaining_time); + F32 remaining_time = mFlashTimer.getRemainingTimeF32(); + if (remaining_time < seconds) + remaining_time = seconds; + mFlashTimer.reset(); + mFlashTimer.setTimerExpirySec(remaining_time); - x11_set_urgent(true); - mFlashing = true; -#endif // LL_X11 - } + SDL_FlashWindow(mWindow, SDL_FLASH_UNTIL_FOCUSED); + mFlashing = true; } bool LLWindowSDL::isClipboardTextAvailable() { -#if LL_X11 - return mSDL_Display && XGetSelectionOwner(mSDL_Display, XA_CLIPBOARD) != None; -#else - return SDL_HasClipboardText(); -#endif + return SDL_HasClipboardText() == SDL_TRUE; } bool LLWindowSDL::pasteTextFromClipboard(LLWString &dst) { -#if LL_X11 - return getSelectionText(XA_CLIPBOARD, dst); -#else - auto data = SDL_GetClipboardText(); - if (data) + if (isClipboardTextAvailable()) { - dst = LLWString(utf8str_to_wstring(data)); - SDL_free(data); - return true; + char* data = SDL_GetClipboardText(); + if (data) + { + dst = LLWString(utf8str_to_wstring(data)); + SDL_free(data); + return true; + } } return false; -#endif } -bool LLWindowSDL::copyTextToClipboard(const LLWString &s) +bool LLWindowSDL::copyTextToClipboard(const LLWString& text) { -#if LL_X11 - return setSelectionText(XA_CLIPBOARD, s); -#else - return !SDL_SetClipboardText(wstring_to_utf8str(s).c_str()); -#endif + const std::string utf8 = wstring_to_utf8str(text); + return SDL_SetClipboardText(utf8.c_str()) == 0; // success == 0 } bool LLWindowSDL::isPrimaryTextAvailable() { -#if LL_X11 - LLWString text; - return getSelectionText(XA_PRIMARY, text) && !text.empty(); -#else - return false; // unsupported -#endif + return SDL_HasPrimarySelectionText() == SDL_TRUE; } bool LLWindowSDL::pasteTextFromPrimary(LLWString &dst) { -#if LL_X11 - return getSelectionText(XA_PRIMARY, dst); -#else - return false; // unsupported -#endif + if (isPrimaryTextAvailable()) + { + char* data = SDL_GetPrimarySelectionText(); + if (data) + { + dst = LLWString(utf8str_to_wstring(data)); + SDL_free(data); + return true; + } + } + return false; } -bool LLWindowSDL::copyTextToPrimary(const LLWString &s) +bool LLWindowSDL::copyTextToPrimary(const LLWString& text) { -#if LL_X11 - return setSelectionText(XA_PRIMARY, s); -#else - return false; // unsupported -#endif + const std::string utf8 = wstring_to_utf8str(text); + return SDL_SetPrimarySelectionText(utf8.c_str()) == 0; // success == 0 } LLWindow::LLWindowResolution* LLWindowSDL::getSupportedResolutions(S32 &num_resolutions) @@ -1692,9 +1401,6 @@ bool LLWindowSDL::convertCoords(LLCoordGL from, LLCoordScreen *to) return(convertCoords(from, &window_coord) && convertCoords(window_coord, to)); } - - - void LLWindowSDL::setupFailure(const std::string& text, const std::string& caption, U32 type) { destroyContext(); @@ -1899,7 +1605,7 @@ void check_vm_bloat() last_rss_size = this_rss_size; last_vm_size = this_vm_size; - finally: +finally: if (NULL != ptr) { free(ptr); @@ -2222,20 +1928,18 @@ void LLWindowSDL::gatherInput() updateCursor(); -#if LL_X11 // This is a good time to stop flashing the icon if our mFlashTimer has // expired. if (mFlashing && mFlashTimer.hasExpired()) { - x11_set_urgent(false); + SDL_FlashWindow(mWindow, SDL_FLASH_CANCEL); mFlashing = false; } -#endif // LL_X11 } static SDL_Cursor *makeSDLCursorFromBMP(const char *filename, int hotx, int hoty) { - SDL_Cursor *sdlcursor = NULL; + SDL_Cursor *sdlcursor = nullptr; SDL_Surface *bmpsurface; // Load cursor pixel data from BMP file @@ -2597,62 +2301,6 @@ LLSD LLWindowSDL::getNativeKeyData() } #endif // LL_DARWIN -#if LL_LINUX || LL_SOLARIS || __FreeBSD__ -// extracted from spawnWebBrowser for clarity and to eliminate -// compiler confusion regarding close(int fd) vs. LLWindow::close() -void exec_cmd(const std::string& cmd, const std::string& arg) -{ - char* const argv[] = {(char*)cmd.c_str(), (char*)arg.c_str(), NULL}; - fflush(NULL); - pid_t pid = fork(); - if (pid == 0) - { // child - // disconnect from stdin/stdout/stderr, or child will - // keep our output pipe undesirably alive if it outlives us. - // close(0); - // close(1); - // close(2); - // Reopen stdin, stdout, and stderr to /dev/null. - // It's good practice to always have those file - // descriptors open to something, lest the exec'd - // program actually try to use them. - FILE *result; - result = freopen("/dev/null","r",stdin); - if (result == NULL) - { - LL_WARNS() << "Error reopening stdin for web browser: " - << strerror(errno) << LL_ENDL; - } - result = freopen("/dev/null","w",stdout); - if (result == NULL) - { - LL_WARNS() << "Error reopening stdout for web browser: " - << strerror(errno) << LL_ENDL; - } - result = freopen("/dev/null","w",stderr); - if (result == NULL) - { - LL_WARNS() << "Error reopening stderr for web browser: " - << strerror(errno) << LL_ENDL; - } - // end ourself by running the command - execv(cmd.c_str(), argv); /* Flawfinder: ignore */ - // if execv returns at all, there was a problem. - LL_WARNS() << "execv failure when trying to start " << cmd << LL_ENDL; - _exit(1); // _exit because we don't want atexit() clean-up! - } else { - if (pid > 0) - { - // parent - wait for child to die - int childExitStatus; - waitpid(pid, &childExitStatus, 0); - } else { - LL_WARNS() << "fork failure." << LL_ENDL; - } - } -} -#endif - // Open a URL with the user's default web browser. // Must begin with protocol identifier. void LLWindowSDL::spawnWebBrowser(const std::string& escaped_url, bool async) @@ -2676,69 +2324,14 @@ void LLWindowSDL::spawnWebBrowser(const std::string& escaped_url, bool async) LL_INFOS() << "spawn_web_browser: " << escaped_url << LL_ENDL; -#if LL_LINUX || __FreeBSD__ -# if LL_X11 - if (mSDL_Display) + if (SDL_OpenURL(escaped_url.c_str()) != 0) { - maybe_lock_display(); - // Just in case - before forking. - XSync(mSDL_Display, False); - maybe_unlock_display(); - } -# endif // LL_X11 - - std::string cmd, arg; - cmd = gDirUtilp->getExecutableDir(); - cmd += gDirUtilp->getDirDelimiter(); - cmd += "launch_url.sh"; - arg = escaped_url; - exec_cmd(cmd, arg); - -#elif LL_DARWIN - - S32 result = 0; - CFURLRef urlRef = NULL; - - LL_INFOS() << "Opening URL " << escaped_url << LL_ENDL; - - CFStringRef stringRef = CFStringCreateWithCString(NULL, escaped_url.c_str(), kCFStringEncodingUTF8); - if (stringRef) - { - // This will succeed if the string is a full URL, including the http:// - // Note that URLs specified this way need to be properly percent-escaped. - urlRef = CFURLCreateWithString(NULL, stringRef, NULL); - - // Don't use CRURLCreateWithFileSystemPath -- only want valid URLs - - CFRelease(stringRef); + LL_WARNS() << "spawn_web_browser failed with error: " << SDL_GetError() << LL_ENDL; } - if (urlRef) - { - result = LSOpenCFURLRef(urlRef, NULL); - - if (result != noErr) - { - LL_INFOS() << "Error " << result << " on open." << LL_ENDL; - } - - CFRelease(urlRef); - } - else - { - LL_INFOS() << "Error: couldn't create URL." << LL_ENDL; - } - -#endif // LL_LINUX - LL_INFOS() << "spawn_web_browser returning." << LL_ENDL; } -void LLWindowSDL::openFile(const std::string& file_name) -{ - spawnWebBrowser("file://"+file_name,true); -} - void *LLWindowSDL::getPlatformWindow() { return NULL; diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h index 36bdf0e80a..f86a277391 100644 --- a/indra/llwindow/llwindowsdl.h +++ b/indra/llwindow/llwindowsdl.h @@ -182,8 +182,6 @@ public: void spawnWebBrowser(const std::string &escaped_url, bool async) override; - void openFile(const std::string &file_name); - void setTitle(const std::string title) override; static std::vector getDynamicFallbackFontList(); @@ -257,8 +255,6 @@ protected: void setupFailure(const std::string &text, const std::string &caption, U32 type); - void fixWindowSize(void); - U32 SDLCheckGrabbyKeys(U32 keysym, bool gain); bool SDLReallyCaptureInput(bool capture); @@ -289,45 +285,15 @@ protected: friend class LLWindowManager; private: -#if LL_X11 - - void x11_set_urgent(bool urgent); - bool mFlashing; LLTimer mFlashTimer; -#endif //LL_X11 - U32 mKeyVirtualKey; U32 mKeyModifiers; std::string mInputType; -public: -#if LL_X11 - - static Display *getSDLDisplay(); - - LLWString const &getPrimaryText() const { return mPrimaryClipboard; } - - LLWString const &getSecondaryText() const { return mSecondaryClipboard; } - - void clearPrimaryText() { mPrimaryClipboard.clear(); } - - void clearSecondaryText() { mSecondaryClipboard.clear(); } private: void tryFindFullscreenSize(int &aWidth, int &aHeight); - - void initialiseX11Clipboard(); - - bool getSelectionText(Atom selection, LLWString &text); - - bool getSelectionText(Atom selection, Atom type, LLWString &text); - - bool setSelectionText(Atom selection, const LLWString &text); - -#endif - LLWString mPrimaryClipboard; - LLWString mSecondaryClipboard; }; class LLSplashScreenSDL : public LLSplashScreen -- cgit v1.2.3 From 387c4012a10615da31f24784e9eb9c79a48529c4 Mon Sep 17 00:00:00 2001 From: Rye Cogtail Date: Sun, 29 Sep 2024 01:03:24 -0400 Subject: Implement various missing functions and callbacks in SDL window backend --- indra/llwindow/llwindowsdl.cpp | 166 +++++++++++++++++++---------------------- 1 file changed, 75 insertions(+), 91 deletions(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index be98a0d6e0..54abd10490 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -798,7 +798,6 @@ LLWindowSDL::~LLWindowSDL() void LLWindowSDL::show() { - // *FIX: What to do with SDL? if (mWindow) { SDL_ShowWindow(mWindow); @@ -807,7 +806,6 @@ void LLWindowSDL::show() void LLWindowSDL::hide() { - // *FIX: What to do with SDL? if (mWindow) { SDL_HideWindow(mWindow); @@ -817,7 +815,6 @@ void LLWindowSDL::hide() //virtual void LLWindowSDL::minimize() { - // *FIX: What to do with SDL? if (mWindow) { SDL_MinimizeWindow(mWindow); @@ -827,14 +824,12 @@ void LLWindowSDL::minimize() //virtual void LLWindowSDL::restore() { - // *FIX: What to do with SDL? if (mWindow) { SDL_RestoreWindow(mWindow); } } - // close() destroys all OS-specific code associated with a window. // Usually called from LLWindowManager::destroyWindow() void LLWindowSDL::close() @@ -860,56 +855,54 @@ bool LLWindowSDL::isValid() bool LLWindowSDL::getVisible() { bool result = false; - - // *FIX: This isn't really right... - // Then what is? if (mWindow) { - if( SDL_GetWindowFlags(mWindow) & SDL_WINDOW_SHOWN ) result = true; + Uint32 flags = SDL_GetWindowFlags(mWindow); + if (flags & SDL_WINDOW_SHOWN) + { + result = TRUE; + } } - - return(result); + return result; } bool LLWindowSDL::getMinimized() { bool result = false; - - if (mWindow/*&& (1 == mIsMinimized)*/) + if (mWindow) { - if( SDL_GetWindowFlags(mWindow) & SDL_WINDOW_MINIMIZED ) result = true; + Uint32 flags = SDL_GetWindowFlags(mWindow); + if (flags & SDL_WINDOW_MINIMIZED) + { + result = true; + } } - - mIsMinimized = result; - return(result); + return result; } bool LLWindowSDL::getMaximized() { bool result = false; - if (mWindow) { - // TODO - if( SDL_GetWindowFlags(mWindow) & SDL_WINDOW_MAXIMIZED ) result = true; - else result = false; + Uint32 flags = SDL_GetWindowFlags(mWindow); + if (flags & SDL_WINDOW_MAXIMIZED) + { + result = true; + } } - return(result); + return result; } bool LLWindowSDL::maximize() { - // TODO - bool result = false; - if (mWindow) { SDL_MaximizeWindow(mWindow); - result = true; + return TRUE; } - - return result; + return FALSE; } bool LLWindowSDL::getFullscreen() @@ -919,10 +912,12 @@ bool LLWindowSDL::getFullscreen() bool LLWindowSDL::getPosition(LLCoordScreen *position) { - // *FIX: can anything be done with this? - position->mX = 0; - position->mY = 0; - return true; + if (mWindow) + { + SDL_GetWindowPosition(mWindow, &position->mX, &position->mY); + return true; + } + return false; } bool LLWindowSDL::getSize(LLCoordScreen *size) @@ -957,17 +952,13 @@ bool LLWindowSDL::getSize(LLCoordWindow *size) bool LLWindowSDL::setPosition(const LLCoordScreen position) { - bool result = false; - - if(mWindow) + if (mWindow) { - // *FIX: (?) - //MacMoveWindow(mWindow, position.mX, position.mY, false); SDL_SetWindowPosition(mWindow, position.mX, position.mY); - result = true; + return true; } - return result; + return false; } template< typename T > bool setSizeImpl( const T& newSize, SDL_Window *pWin ) @@ -1024,28 +1015,33 @@ void LLWindowSDL::setFSAASamples(const U32 samples) F32 LLWindowSDL::getGamma() { - return 1/mGamma; + return 1.f / mGamma; } bool LLWindowSDL::restoreGamma() { - //CGDisplayRestoreColorSyncSettings(); - // SDL_SetGamma(1.0f, 1.0f, 1.0f); - Uint16 ramp; - SDL_CalculateGammaRamp(1.0f, &ramp); - SDL_SetWindowGammaRamp(mWindow, &ramp, &ramp, &ramp); + if (mWindow) + { + Uint16 ramp[256]; + SDL_CalculateGammaRamp(1.f, ramp); + SDL_SetWindowGammaRamp(mWindow, ramp, ramp, ramp); + } return true; } bool LLWindowSDL::setGamma(const F32 gamma) { - mGamma = gamma; - if (mGamma == 0) mGamma = 0.1f; - mGamma = 1/mGamma; - // SDL_SetGamma(mGamma, mGamma, mGamma); - Uint16 ramp; - SDL_CalculateGammaRamp(mGamma, &ramp); - SDL_SetWindowGammaRamp(mWindow, &ramp, &ramp, &ramp); + if (mWindow) + { + Uint16 ramp[256]; + + mGamma = gamma; + if (mGamma == 0) mGamma = 0.1f; + mGamma = 1.f / mGamma; + + SDL_CalculateGammaRamp(mGamma, ramp); + SDL_SetWindowGammaRamp(mWindow, ramp, ramp, ramp); + } return true; } @@ -1054,10 +1050,8 @@ bool LLWindowSDL::isCursorHidden() return mCursorHidden; } - - // Constrains the mouse to the window. -void LLWindowSDL::setMouseClipping( bool b ) +void LLWindowSDL::setMouseClipping(bool b) { //SDL_WM_GrabInput(b ? SDL_GRAB_ON : SDL_GRAB_OFF); } @@ -1067,18 +1061,10 @@ void LLWindowSDL::setMinSize(U32 min_width, U32 min_height, bool enforce_immedia { LLWindow::setMinSize(min_width, min_height, enforce_immediately); -#if LL_X11 - // Set the minimum size limits for X11 window - // so the window manager doesn't allow resizing below those limits. - XSizeHints* hints = XAllocSizeHints(); - hints->flags |= PMinSize; - hints->min_width = mMinWindowWidth; - hints->min_height = mMinWindowHeight; - - XSetWMNormalHints(mSDL_Display, mSDL_XWindowID, hints); - - XFree(hints); -#endif + if (mWindow && min_width > 0 && min_height > 0) + { + SDL_SetWindowMinimumSize(mWindow, mMinWindowWidth, mMinWindowHeight); + } } bool LLWindowSDL::setCursorPosition(const LLCoordWindow position) @@ -2030,10 +2016,13 @@ void LLWindowSDL::updateCursor() sdlcursor = mSDLCursors[UI_CURSOR_ARROW]; if (sdlcursor) SDL_SetCursor(sdlcursor); - } else { + + mCurrentCursor = mNextCursor; + } + else + { LL_WARNS() << "Tried to set invalid cursor number " << mNextCursor << LL_ENDL; } - mCurrentCursor = mNextCursor; } } @@ -2043,24 +2032,24 @@ void LLWindowSDL::initCursors() // Blank the cursor pointer array for those we may miss. for (i=0; i Date: Sun, 29 Sep 2024 03:16:54 -0400 Subject: Clean up SDL window event handling and implement missing functionality Horizontal Scrollwheels Proper extra mouse button handling SDL native double click handling --- indra/llwindow/llwindowsdl.cpp | 183 +++++++++++++---------------------------- 1 file changed, 58 insertions(+), 125 deletions(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 54abd10490..4ca4fc6001 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -1099,7 +1099,6 @@ bool LLWindowSDL::getCursorPosition(LLCoordWindow *position) //Point cursor_point; LLCoordScreen screen_pos; - //GetMouse(&cursor_point); int x, y; SDL_GetMouseState(&x, &y); @@ -1627,11 +1626,6 @@ void LLWindowSDL::processMiscNativeEvents() void LLWindowSDL::gatherInput() { - const Uint32 CLICK_THRESHOLD = 300; // milliseconds - static int leftClick = 0; - static int rightClick = 0; - static Uint32 lastLeftDown = 0; - static Uint32 lastRightDown = 0; SDL_Event event; // Handle all outstanding SDL events @@ -1640,13 +1634,21 @@ void LLWindowSDL::gatherInput() switch (event.type) { case SDL_MOUSEWHEEL: + { if( event.wheel.y != 0 ) + { mCallbacks->handleScrollWheel(this, -event.wheel.y); + } + if (event.wheel.x != 0) + { + mCallbacks->handleScrollHWheel(this, -event.wheel.x); + } break; + } case SDL_MOUSEMOTION: { - LLCoordWindow winCoord(event.button.x, event.button.y); + LLCoordWindow winCoord(event.motion.x, event.motion.y); LLCoordGL openGlCoord; convertCoords(winCoord, &openGlCoord); @@ -1725,7 +1727,6 @@ void LLWindowSDL::gatherInput() case SDL_MOUSEBUTTONDOWN: { - bool isDoubleClick = false; LLCoordWindow winCoord(event.button.x, event.button.y); LLCoordGL openGlCoord; convertCoords(winCoord, &openGlCoord); @@ -1735,58 +1736,25 @@ void LLWindowSDL::gatherInput() MASK mask = gKeyboard->currentMask(true); - if (event.button.button == SDL_BUTTON_LEFT) // SDL doesn't manage double clicking... - { - Uint32 now = SDL_GetTicks(); - if ((now - lastLeftDown) > CLICK_THRESHOLD) - leftClick = 1; - else - { - if (++leftClick >= 2) - { - leftClick = 0; - isDoubleClick = true; - } - } - lastLeftDown = now; - } - else if (event.button.button == SDL_BUTTON_RIGHT) - { - Uint32 now = SDL_GetTicks(); - if ((now - lastRightDown) > CLICK_THRESHOLD) - rightClick = 1; - else - { - if (++rightClick >= 2) - { - rightClick = 0; - isDoubleClick = true; - } - } - lastRightDown = now; - } - if (event.button.button == SDL_BUTTON_LEFT) // left { - if (isDoubleClick) + if (event.button.clicks >= 2) mCallbacks->handleDoubleClick(this, openGlCoord, mask); else mCallbacks->handleMouseDown(this, openGlCoord, mask); } - else if (event.button.button == SDL_BUTTON_RIGHT) // right { mCallbacks->handleRightMouseDown(this, openGlCoord, mask); } - else if (event.button.button == SDL_BUTTON_MIDDLE) // middle { mCallbacks->handleMiddleMouseDown(this, openGlCoord, mask); } - else if (event.button.button == 4) // mousewheel up...thanks to X11 for making SDL consider these "buttons". - mCallbacks->handleScrollWheel(this, -1); - else if (event.button.button == 5) // mousewheel down...thanks to X11 for making SDL consider these "buttons". - mCallbacks->handleScrollWheel(this, 1); + else + { + mCallbacks->handleOtherMouseDown(this, openGlCoord, mask, event.button.button); + } break; } @@ -1803,99 +1771,64 @@ void LLWindowSDL::gatherInput() MASK mask = gKeyboard->currentMask(true); if (event.button.button == SDL_BUTTON_LEFT) // left + { mCallbacks->handleMouseUp(this, openGlCoord, mask); + } else if (event.button.button == SDL_BUTTON_RIGHT) // right + { mCallbacks->handleRightMouseUp(this, openGlCoord, mask); + } else if (event.button.button == SDL_BUTTON_MIDDLE) // middle + { mCallbacks->handleMiddleMouseUp(this, openGlCoord, mask); - // don't handle mousewheel here... + } + else + { + mCallbacks->handleOtherMouseUp(this, openGlCoord, mask, event.button.button); + } break; } - case SDL_WINDOWEVENT: // *FIX: handle this? + case SDL_WINDOWEVENT: { - if( event.window.event == SDL_WINDOWEVENT_RESIZED - /* || event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED*/ ) // SDL_WINDOWEVENT_SIZE_CHANGED is followed by SDL_WINDOWEVENT_RESIZED, so handling one shall be enough + switch(event.window.event) { - LL_INFOS() << "Handling a resize event: " << event.window.data1 << "x" << event.window.data2 << LL_ENDL; - - S32 width = llmax(event.window.data1, (S32)mMinWindowWidth); - S32 height = llmax(event.window.data2, (S32)mMinWindowHeight); - - // *FIX: I'm not sure this is necessary! - // I think is is not - // SDL_SetWindowSize(mWindow, width, height); - // - - mCallbacks->handleResize(this, width * getSystemUISize(), height * getSystemUISize()); - } - else if(event.window.event == SDL_WINDOWEVENT_ENTER) - { - LL_INFOS() << "SDL_WINDOWEVENT_ENTER" << LL_ENDL; - if(!mHaveInputFocus) mCallbacks->handleFocus(this); - mHaveInputFocus = true; - } - else if(event.window.event == SDL_WINDOWEVENT_LEAVE) - { - LL_INFOS() << "SDL_WINDOWEVENT_LEAVE" << LL_ENDL; - if(mHaveInputFocus) mCallbacks->handleFocusLost(this); - mHaveInputFocus = false; - } - else if( event.window.event == SDL_WINDOWEVENT_FOCUS_GAINED ) // What about SDL_WINDOWEVENT_ENTER (mouse focus) - { - // We have to do our own state massaging because SDL - // can send us two unfocus events in a row for example, - // which confuses the focus code [SL-24071]. - mHaveInputFocus = true; - - mCallbacks->handleFocus(this); - } - else if( event.window.event == SDL_WINDOWEVENT_FOCUS_LOST ) // What about SDL_WINDOWEVENT_LEAVE (mouse focus) - { - // We have to do our own state massaging because SDL - // can send us two unfocus events in a row for example, - // which confuses the focus code [SL-24071]. - mHaveInputFocus = false; - - mCallbacks->handleFocusLost(this); - } - /* - - Bug : the app remains inactive when maximized .. - - else if(event.window.event == SDL_WINDOWEVENT_MINIMIZED) - { - LL_INFOS() << "SDL_WINDOWEVENT_MINIMIZED" << LL_ENDL; - if(!mIsMinimized) mCallbacks->handleActivate(this,false); - mIsMinimized = true; - } - else if(event.window.event == SDL_WINDOWEVENT_MAXIMIZED) - { - LL_INFOS() << "SDL_WINDOWEVENT_MAXIMIZED" << LL_ENDL; - if(mIsMinimized) mCallbacks->handleActivate(this,true); - mIsMinimized = false; - } - */ - else if (event.window.event == SDL_WINDOWEVENT_EXPOSED) - { - int w, h; - SDL_GL_GetDrawableSize(mWindow, &w, &h); + //case SDL_WINDOWEVENT_SIZE_CHANGED: SDL_WINDOWEVENT_SIZE_CHANGED is followed by SDL_WINDOWEVENT_RESIZED, so handling one shall be enough + case SDL_WINDOWEVENT_RESIZED: + { + LL_INFOS() << "Handling a resize event: " << event.window.data1 << "x" << event.window.data2 << LL_ENDL; + S32 width = llmax(event.window.data1, (S32)mMinWindowWidth); + S32 height = llmax(event.window.data2, (S32)mMinWindowHeight); - mCallbacks->handlePaint(this, 0, 0, w, h); - } - else if( event.window.event == SDL_WINDOWEVENT_MINIMIZED || - event.window.event == SDL_WINDOWEVENT_MAXIMIZED || - event.window.event == SDL_WINDOWEVENT_RESTORED || - event.window.event == SDL_WINDOWEVENT_EXPOSED || - event.window.event == SDL_WINDOWEVENT_SHOWN ) - { - mIsMinimized = (event.window.event == SDL_WINDOWEVENT_MINIMIZED); + mCallbacks->handleResize(this, width * getSystemUISize(), height * getSystemUISize()); + break; + } + case SDL_WINDOWEVENT_LEAVE: + mCallbacks->handleMouseLeave(this); + break; + case SDL_WINDOWEVENT_FOCUS_GAINED: + mCallbacks->handleFocus(this); + break; + case SDL_WINDOWEVENT_FOCUS_LOST: + mCallbacks->handleFocusLost(this); + break; + case SDL_WINDOWEVENT_EXPOSED: + case SDL_WINDOWEVENT_SHOWN: + case SDL_WINDOWEVENT_HIDDEN: + case SDL_WINDOWEVENT_MINIMIZED: + case SDL_WINDOWEVENT_MAXIMIZED: + case SDL_WINDOWEVENT_RESTORED: + { + Uint32 flags = SDL_GetWindowFlags(mWindow); + bool minimized = (flags & SDL_WINDOW_MINIMIZED); + bool hidden = (flags & SDL_WINDOW_HIDDEN); - mCallbacks->handleActivate(this, !mIsMinimized); - LL_INFOS() << "SDL deiconification state switched to " << mIsMinimized << LL_ENDL; + mCallbacks->handleActivate(this, !minimized || !hidden); + LL_INFOS() << "SDL deiconification state switched to " << minimized << LL_ENDL; + break; + } } - break; } case SDL_QUIT: -- cgit v1.2.3 From 300e52d800112fab9f0137d067e9117bb2f9bba8 Mon Sep 17 00:00:00 2001 From: Rye Cogtail Date: Sun, 29 Sep 2024 03:17:43 -0400 Subject: Fix shutdown crash from failing to clean up SDL window properly --- indra/llwindow/llwindowsdl.cpp | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 4ca4fc6001..982f10503e 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -765,7 +765,13 @@ void LLWindowSDL::destroyContext() { LL_INFOS() << "destroyContext begins" << LL_ENDL; + // Stop unicode input SDL_StopTextInput(); + + // Clean up remaining GL state before blowing away window + LL_INFOS() << "shutdownGL begins" << LL_ENDL; + gGLManager.shutdownGL(); + #if LL_X11 mSDL_Display = NULL; mSDL_XWindowID = None; @@ -773,18 +779,38 @@ void LLWindowSDL::destroyContext() Unlock_Display = NULL; #endif // LL_X11 - // Clean up remaining GL state before blowing away window - LL_INFOS() << "shutdownGL begins" << LL_ENDL; - gGLManager.shutdownGL(); + LL_INFOS() << "Destroying SDL cursors" << LL_ENDL; + quitCursors(); + + if (mContext) + { + LL_INFOS() << "Destroying SDL GL Context" << LL_ENDL; + SDL_GL_DeleteContext(mContext); + mContext = nullptr; + } + else + { + LL_INFOS() << "SDL GL Context already destroyed" << LL_ENDL; + } + + if (mWindow) + { + LL_INFOS() << "Destroying SDL Window" << LL_ENDL; + SDL_DestroyWindow(mWindow); + mWindow = nullptr; + } + else + { + LL_INFOS() << "SDL Window already destroyed" << LL_ENDL; + } + LL_INFOS() << "destroyContext end" << LL_ENDL; + LL_INFOS() << "SDL_QuitSS/VID begins" << LL_ENDL; SDL_QuitSubSystem(SDL_INIT_VIDEO); // *FIX: this might be risky... - - mWindow = NULL; } LLWindowSDL::~LLWindowSDL() { - quitCursors(); destroyContext(); if(mSupportedResolutions != NULL) @@ -999,8 +1025,9 @@ void LLWindowSDL::swapBuffers() { if (mWindow) { - SDL_GL_SwapWindow( mWindow ); + SDL_GL_SwapWindow(mWindow); } + LL_PROFILER_GPU_COLLECT; } U32 LLWindowSDL::getFSAASamples() -- cgit v1.2.3 From 643e3d13dda050e20ae4535f67f99a134d53419a Mon Sep 17 00:00:00 2001 From: Rye Cogtail Date: Sun, 29 Sep 2024 03:19:43 -0400 Subject: Clean up SDL window creation and fix various bugs Add support for Core and Debug GL context creation Fix window position support Fix vsync handling Add minimum GL context support --- indra/llwindow/llwindow.cpp | 2 +- indra/llwindow/llwindowsdl.cpp | 283 ++++++++++++++++++++++------------------- indra/llwindow/llwindowsdl.h | 2 +- 3 files changed, 152 insertions(+), 135 deletions(-) diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp index 302d038a79..4f3cc69c75 100644 --- a/indra/llwindow/llwindow.cpp +++ b/indra/llwindow/llwindow.cpp @@ -421,7 +421,7 @@ LLWindow* LLWindowManager::createWindow( fullscreen, clearBg, enable_vsync, use_gl, ignore_pixel_depth); #elif LL_SDL new_window = new LLWindowSDL(callbacks, - title, x, y, width, height, flags, + title, name, x, y, width, height, flags, fullscreen, clearBg, enable_vsync, use_gl, ignore_pixel_depth, fsaa_samples); #elif LL_WINDOWS new_window = new LLWindowWin32(callbacks, diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 982f10503e..3495b8347d 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -153,7 +153,7 @@ Display* LLWindowSDL::get_SDL_Display(void) #endif // LL_X11 LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks, - const std::string& title, S32 x, S32 y, S32 width, + const std::string& title, const std::string& name, S32 x, S32 y, S32 width, S32 height, U32 flags, bool fullscreen, bool clearBg, bool enable_vsync, bool use_gl, @@ -191,7 +191,7 @@ LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks, mOriginalAspectRatio = 1024.0 / 768.0; if (title.empty()) - mWindowTitle = "SDL Window"; // *FIX: (?) + mWindowTitle = "Second Life"; else mWindowTitle = title; @@ -488,6 +488,10 @@ bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, b width = 1024; if (height == 0) width = 768; + if (x == 0) + x = SDL_WINDOWPOS_UNDEFINED; + if (y == 0) + y = SDL_WINDOWPOS_UNDEFINED; mFullscreen = fullscreen; @@ -503,23 +507,22 @@ bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, b mSDLFlags = sdlflags; + // Setup default backing colors GLint redBits{8}, greenBits{8}, blueBits{8}, alphaBits{8}; - GLint depthBits{(bits <= 16) ? 16 : 24}, stencilBits{8}; if (getenv("LL_GL_NO_STENCIL")) stencilBits = 0; - SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, alphaBits); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, redBits); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, greenBits); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, blueBits); - SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, depthBits ); + SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, alphaBits); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, depthBits); // We need stencil support for a few (minor) things. if (stencilBits) SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, stencilBits); - // *FIX: try to toggle vsync here? SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4); #if LL_DARWIN @@ -531,30 +534,51 @@ bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, b SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - if (mFSAASamples > 0) + if (LLRender::sGLCoreProfile) { - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, mFSAASamples); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); } + // This is requesting a minimum context version + int major_gl_version = 3; + int minor_gl_version = 2; + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major_gl_version); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor_gl_version); + + U32 context_flags = 0; + if (gDebugGL) + { + context_flags |= SDL_GL_CONTEXT_DEBUG_FLAG; + } + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, context_flags); SDL_GL_SetAttribute(SDL_GL_SHARE_WITH_CURRENT_CONTEXT, 1); - mWindow = SDL_CreateWindow( mWindowTitle.c_str(), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, mSDLFlags ); - if( mWindow ) + // Create the window + mWindow = SDL_CreateWindow(mWindowTitle.c_str(), x, y, width, height, mSDLFlags); + if (mWindow == nullptr) { - mContext = SDL_GL_CreateContext( mWindow ); + LL_WARNS() << "Window creation failure. SDL: " << SDL_GetError() << LL_ENDL; + setupFailure("Window creation error", "Error", OSMB_OK); + return FALSE; + } - if( mContext == 0 ) - { - LL_WARNS() << "Cannot create GL context " << SDL_GetError() << LL_ENDL; - setupFailure("GL Context creation error creation error", "Error", OSMB_OK); - return false; - } - // SDL_GL_SetSwapInterval(1); + // Create the context + mContext = SDL_GL_CreateContext(mWindow); + if(!mContext) + { + LL_WARNS() << "Cannot create GL context " << SDL_GetError() << LL_ENDL; + setupFailure("GL Context creation error", "Error", OSMB_OK); + return false; } + if (SDL_GL_MakeCurrent(mWindow, mContext) != 0) + { + LL_WARNS() << "Failed to make context current. SDL: " << SDL_GetError() << LL_ENDL; + setupFailure("GL Context failed to set current failure", "Error", OSMB_OK); + return FALSE; + } - if( mFullscreen ) + if(mFullscreen) { if (mWindow) { @@ -598,70 +622,6 @@ bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, b } } - // Set the application icon. - SDL_Surface *bmpsurface; - bmpsurface = Load_BMP_Resource("ll_icon.BMP"); - if (bmpsurface) - { - SDL_SetWindowIcon(mWindow, bmpsurface); - SDL_FreeSurface(bmpsurface); - bmpsurface = NULL; - } - - // Detect video memory size. -# if LL_X11 - gGLManager.mVRAM = x11_detect_VRAM_kb() / 1024; - if (gGLManager.mVRAM != 0) - { - LL_INFOS() << "X11 log-parser detected " << gGLManager.mVRAM << "MB VRAM." << LL_ENDL; - } else - { - PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC queryInteger; - queryInteger = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC) - glXGetProcAddressARB((const GLubyte *)"glXQueryCurrentRendererIntegerMESA"); - unsigned int vram_megabytes = 0; - queryInteger(GLX_RENDERER_VIDEO_MEMORY_MESA, &vram_megabytes); - if (!vram_megabytes) { - glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, (int *)&vram_megabytes); - vram_megabytes /= 1024; - } - if (!vram_megabytes) { - glGetIntegerv(GL_VBO_FREE_MEMORY_ATI, (int *)&vram_megabytes); - vram_megabytes /= 1024; - } - gGLManager.mVRAM = vram_megabytes; - } -#elif LL_DARWIN - CGLRendererInfoObj info = 0; - GLint vram_megabytes = 0; - int num_renderers = 0; - auto err = CGLQueryRendererInfo(CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), - &info, &num_renderers); - if (!err) { - CGLDescribeRenderer(info, 0, kCGLRPVideoMemoryMegabytes, &vram_megabytes); - CGLDestroyRendererInfo(info); - } else - vram_megabytes = 256; - gGLManager.mVRAM = vram_megabytes; -# endif // LL_X11 -/* - { - // fallback to letting SDL detect VRAM. - // note: I've not seen SDL's detection ever actually find - // VRAM != 0, but if SDL *does* detect it then that's a bonus. - gGLManager.mVRAM = 0; - if (gGLManager.mVRAM != 0) - { - LL_INFOS() << "SDL detected " << gGLManager.mVRAM << "MB VRAM." << LL_ENDL; - } - } -*/ - // If VRAM is not detected, that is handled later - - // *TODO: Now would be an appropriate time to check for some - // explicitly unsupported cards. - //const char* RENDERER = (const char*) glGetString(GL_RENDERER); - SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &redBits); SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &greenBits); SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &blueBits); @@ -697,6 +657,20 @@ bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, b #endif } + LL_PROFILER_GPU_CONTEXT; + + // Enable vertical sync + toggleVSync(enable_vsync); + + // Set the application icon. + SDL_Surface* bmpsurface = Load_BMP_Resource("ll_icon.BMP"); + if (bmpsurface) + { + SDL_SetWindowIcon(mWindow, bmpsurface); + SDL_FreeSurface(bmpsurface); + bmpsurface = NULL; + } + #if LL_X11 /* Grab the window manager specific information */ SDL_SysWMinfo info; @@ -722,6 +696,58 @@ bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, b } #endif // LL_X11 + // Detect video memory size. +# if LL_X11 + gGLManager.mVRAM = x11_detect_VRAM_kb() / 1024; + if (gGLManager.mVRAM != 0) + { + LL_INFOS() << "X11 log-parser detected " << gGLManager.mVRAM << "MB VRAM." << LL_ENDL; + } else + { + PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC queryInteger; + queryInteger = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC)glXGetProcAddressARB((const GLubyte *)"glXQueryCurrentRendererIntegerMESA"); + unsigned int vram_megabytes = 0; + queryInteger(GLX_RENDERER_VIDEO_MEMORY_MESA, &vram_megabytes); + if (!vram_megabytes) + { + glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, (int *)&vram_megabytes); + vram_megabytes /= 1024; + } + if (!vram_megabytes) + { + glGetIntegerv(GL_VBO_FREE_MEMORY_ATI, (int *)&vram_megabytes); + vram_megabytes /= 1024; + } + gGLManager.mVRAM = vram_megabytes; + } +#elif LL_DARWIN + CGLRendererInfoObj info = 0; + GLint vram_megabytes = 0; + int num_renderers = 0; + auto err = CGLQueryRendererInfo(CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), + &info, &num_renderers); + if (!err) + { + CGLDescribeRenderer(info, 0, kCGLRPVideoMemoryMegabytes, &vram_megabytes); + CGLDestroyRendererInfo(info); + } + else + { + vram_megabytes = 256; + } + gGLManager.mVRAM = vram_megabytes; +# endif // LL_X11 + { + // fallback to letting SDL detect VRAM. + // note: I've not seen SDL's detection ever actually find + // VRAM != 0, but if SDL *does* detect it then that's a bonus. + gGLManager.mVRAM = 0; + if (gGLManager.mVRAM != 0) + { + LL_INFOS() << "SDL detected " << gGLManager.mVRAM << "MB VRAM." << LL_ENDL; + } + } + // If VRAM is not detected, that is handled later SDL_StartTextInput(); //make sure multisampling is disabled by default @@ -733,6 +759,45 @@ bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, b return true; } +void* LLWindowSDL::createSharedContext() +{ + SDL_GLContext pContext = SDL_GL_CreateContext(mWindow); + if (pContext) + { + LL_DEBUGS() << "Creating shared OpenGL context successful!" << LL_ENDL; + return (void*)pContext; + } + + LL_WARNS() << "Creating shared OpenGL context failed!" << LL_ENDL; + return nullptr; +} + +void LLWindowSDL::makeContextCurrent(void* contextPtr) +{ + SDL_GL_MakeCurrent(mWindow, contextPtr); + LL_PROFILER_GPU_CONTEXT; +} + +void LLWindowSDL::destroySharedContext(void* contextPtr) +{ + SDL_GL_DeleteContext(contextPtr); +} + +void LLWindowSDL::toggleVSync(bool enable_vsync) +{ + if (!enable_vsync) + { + LL_INFOS("Window") << "Disabling vertical sync" << LL_ENDL; + SDL_GL_SetSwapInterval(0); + SDL_SetHintWithPriority(SDL_HINT_RENDER_VSYNC,"0",SDL_HINT_OVERRIDE); + } + else + { + LL_INFOS("Window") << "Enabling vertical sync" << LL_ENDL; + SDL_GL_SetSwapInterval(1); + SDL_SetHintWithPriority(SDL_HINT_RENDER_VSYNC,"1",SDL_HINT_OVERRIDE); + } +} // changing fullscreen resolution, or switching between windowed and fullscreen mode. bool LLWindowSDL::switchContext(bool fullscreen, const LLCoordScreen &size, bool enable_vsync, const LLCoordScreen * const posp) @@ -745,7 +810,7 @@ bool LLWindowSDL::switchContext(bool fullscreen, const LLCoordScreen &size, bool if(needsRebuild) { destroyContext(); - result = createContext(0, 0, size.mX, size.mY, 0, fullscreen, enable_vsync); + result = createContext(0, 0, size.mX, size.mY, 32, fullscreen, enable_vsync); if (result) { gGLManager.initGL(); @@ -2398,54 +2463,6 @@ std::vector LLWindowSDL::getDynamicFallbackFontList() return rtns; } - -void* LLWindowSDL::createSharedContext() -{ - auto *pContext = SDL_GL_CreateContext(mWindow); - if ( pContext) - { - SDL_GL_SetSwapInterval(0); - SDL_GL_MakeCurrent(mWindow, mContext); - - LLCoordScreen size; - if (getSize(&size)) - setSize(size); - - LL_DEBUGS() << "Creating shared OpenGL context successful!" << LL_ENDL; - - return (void*)pContext; - } - - LL_WARNS() << "Creating shared OpenGL context failed!" << LL_ENDL; - - return nullptr; -} - -void LLWindowSDL::makeContextCurrent(void* contextPtr) -{ - LL_PROFILER_GPU_CONTEXT; - SDL_GL_MakeCurrent( mWindow, contextPtr ); -} - -void LLWindowSDL::destroySharedContext(void* contextPtr) -{ - SDL_GL_DeleteContext( contextPtr ); -} - -void LLWindowSDL::toggleVSync(bool enable_vsync) -{ - if( !enable_vsync) - { - SDL_GL_SetSwapInterval(0); - SDL_SetHintWithPriority(SDL_HINT_RENDER_VSYNC,"0",SDL_HINT_OVERRIDE); - } - else - { - SDL_GL_SetSwapInterval(1); - SDL_SetHintWithPriority(SDL_HINT_RENDER_VSYNC,"1",SDL_HINT_OVERRIDE); - } -} - void LLWindowSDL::setLanguageTextInput(const LLCoordGL& position) { LLCoordWindow win_pos; diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h index f86a277391..144216f658 100644 --- a/indra/llwindow/llwindowsdl.h +++ b/indra/llwindow/llwindowsdl.h @@ -219,7 +219,7 @@ public: protected: LLWindowSDL(LLWindowCallbacks *callbacks, - const std::string &title, int x, int y, int width, int height, U32 flags, + const std::string &title, const std::string& name, int x, int y, int width, int height, U32 flags, bool fullscreen, bool clearBg, bool enable_vsync, bool use_gl, bool ignore_pixel_depth, U32 fsaa_samples); -- cgit v1.2.3 From 883ca816ce7398ae26e1c87bb403d2586fcce8f2 Mon Sep 17 00:00:00 2001 From: Rye Cogtail Date: Sun, 29 Sep 2024 04:14:39 -0400 Subject: Clean up old linux workarounds --- indra/llwindow/llwindowsdl.cpp | 26 ++++++-------------------- indra/newview/linux_tools/wrapper.sh | 23 ----------------------- 2 files changed, 6 insertions(+), 43 deletions(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 3495b8347d..3ac0a2eab1 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -61,9 +61,6 @@ extern bool gDebugWindowProc; const S32 MAX_NUM_RESOLUTIONS = 200; -// static variable for ATI mouse cursor crash work-around: -static bool ATIbug = false; - #if LL_DARWIN #include @@ -1843,10 +1840,10 @@ void LLWindowSDL::gatherInput() { mCallbacks->handleMiddleMouseDown(this, openGlCoord, mask); } - else - { + else + { mCallbacks->handleOtherMouseDown(this, openGlCoord, mask, event.button.button); - } + } break; } @@ -1874,10 +1871,10 @@ void LLWindowSDL::gatherInput() { mCallbacks->handleMiddleMouseUp(this, openGlCoord, mask); } - else - { + else + { mCallbacks->handleOtherMouseUp(this, openGlCoord, mask, event.button.button); - } + } break; } @@ -2024,12 +2021,6 @@ static SDL_Cursor *makeSDLCursorFromBMP(const char *filename, int hotx, int hoty void LLWindowSDL::updateCursor() { - if (ATIbug) { - // cursor-updating is very flaky when this bug is - // present; do nothing. - return; - } - if (mCurrentCursor != mNextCursor) { if (mNextCursor < UI_CURSOR_COUNT) @@ -2107,11 +2098,6 @@ void LLWindowSDL::initCursors() mSDLCursors[UI_CURSOR_TOOLPATHFINDING_PATH_END] = makeSDLCursorFromBMP("lltoolpathfindingpathend.BMP", 16, 16); mSDLCursors[UI_CURSOR_TOOLPATHFINDING_PATH_END_ADD] = makeSDLCursorFromBMP("lltoolpathfindingpathendadd.BMP", 16, 16); mSDLCursors[UI_CURSOR_TOOLNO] = makeSDLCursorFromBMP("llno.BMP",8,8); - - if (getenv("LL_ATI_MOUSE_CURSOR_BUG") != NULL) { - LL_INFOS() << "Disabling cursor updating due to LL_ATI_MOUSE_CURSOR_BUG" << LL_ENDL; - ATIbug = true; - } } void LLWindowSDL::quitCursors() diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index a027aaf6d1..3019e844d2 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -4,16 +4,9 @@ ## These options are for self-assisted troubleshooting during this beta ## testing phase; you should not usually need to touch them. -## - Avoids using any FMOD STUDIO audio driver. -#export LL_BAD_FMODSTUDIO_DRIVER=x ## - Avoids using any OpenAL audio driver. #export LL_BAD_OPENAL_DRIVER=x -## - Avoids using the FMOD Studio or FMOD Ex PulseAudio audio driver. -#export LL_BAD_FMOD_PULSEAUDIO=x -## - Avoids using the FMOD Studio or FMOD Ex ALSA audio driver. -#export LL_BAD_FMOD_ALSA=x - ## - Avoids the optional OpenGL extensions which have proven most problematic ## on some hardware. Disabling this option may cause BETTER PERFORMANCE but ## may also cause CRASHES and hangs on some unstable combinations of drivers @@ -34,16 +27,10 @@ ## LL_GL_BLACKLIST which solves your problems. #export LL_GL_BLACKLIST=abcdefghijklmno -## - Some ATI/Radeon users report random X server crashes when the mouse -## cursor changes shape. If you suspect that you are a victim of this -## driver bug, try enabling this option and report whether it helps: -#export LL_ATI_MOUSE_CURSOR_BUG=x - if [ "`uname -m`" = "x86_64" ]; then echo '64-bit Linux detected.' fi - ## Everything below this line is just for advanced troubleshooters. ##------------------------------------------------------------------- @@ -55,9 +42,6 @@ fi #export LL_WRAPPER='gdb --args' #export LL_WRAPPER='valgrind --smc-check=all --error-limit=no --log-file=secondlife.vg --leak-check=full --suppressions=/usr/lib/valgrind/glibc-2.5.supp --suppressions=secondlife-i686.supp' -## - Avoids an often-buggy X feature that doesn't really benefit us anyway. -export SDL_VIDEO_X11_DGAMOUSE=0 - ## - The 'scim' GTK IM module widely crashes the viewer. Avoid it. if [ "$GTK_IM_MODULE" = "scim" ]; then export GTK_IM_MODULE=xim @@ -67,13 +51,6 @@ if [ "$XMODIFIERS" = "" ]; then 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) -#if lsmod | grep fglrx &>/dev/null ; then -# export LL_ATI_MOUSE_CURSOR_BUG=x -#fi - - ## Nothing worth editing below this line. ##------------------------------------------------------------------- -- cgit v1.2.3 From e599dc3fc04e7ff48a215643920ec79fe2f99087 Mon Sep 17 00:00:00 2001 From: Rye Cogtail Date: Tue, 1 Oct 2024 02:16:23 -0400 Subject: Clean up more dead X11 code from SDL impl and modernize mouse capture with SDL_CaptureMouse --- indra/llwindow/llwindowsdl.cpp | 233 +++++------------------------------------ 1 file changed, 25 insertions(+), 208 deletions(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 3ac0a2eab1..dd4a7593a3 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -229,145 +229,6 @@ static SDL_Surface *Load_BMP_Resource(const char *basename) return SDL_LoadBMP(path_buffer); } -#if LL_X11 -// This is an XFree86/XOrg-specific hack for detecting the amount of Video RAM -// on this machine. It works by searching /var/log/var/log/Xorg.?.log or -// /var/log/XFree86.?.log for a ': (VideoRAM ?|Memory): (%d+) kB' regex, where -// '?' is the X11 display number derived from $DISPLAY -static int x11_detect_VRAM_kb_fp(FILE *fp, const char *prefix_str) -{ - const int line_buf_size = 1000; - char line_buf[line_buf_size]; - while (fgets(line_buf, line_buf_size, fp)) - { - //LL_DEBUGS() << "XLOG: " << line_buf << LL_ENDL; - - // Why the ad-hoc parser instead of using a regex? Our - // favourite regex implementation - libboost_regex - is - // quite a heavy and troublesome dependency for the client, so - // it seems a shame to introduce it for such a simple task. - // *FIXME: libboost_regex is a dependency now anyway, so we may - // as well use it instead of this hand-rolled nonsense. - const char *part1_template = prefix_str; - const char part2_template[] = " kB"; - char *part1 = strstr(line_buf, part1_template); - if (part1) // found start of matching line - { - part1 = &part1[strlen(part1_template)]; // -> after - char *part2 = strstr(part1, part2_template); - if (part2) // found end of matching line - { - // now everything between part1 and part2 is - // supposed to be numeric, describing the - // number of kB of Video RAM supported - int rtn = 0; - for (; part1 < part2; ++part1) - { - if (*part1 < '0' || *part1 > '9') - { - // unexpected char, abort parse - rtn = 0; - break; - } - rtn *= 10; - rtn += (*part1) - '0'; - } - if (rtn > 0) - { - // got the kB number. return it now. - return rtn; - } - } - } - } - return 0; // 'could not detect' -} - -static int x11_detect_VRAM_kb() -{ - std::string x_log_location("/var/log/"); - std::string fname; - int rtn = 0; // 'could not detect' - int display_num = 0; - FILE *fp; - char *display_env = getenv("DISPLAY"); // e.g. :0 or :0.0 or :1.0 etc - // parse DISPLAY number so we can go grab the right log file - if (display_env[0] == ':' && - display_env[1] >= '0' && display_env[1] <= '9') - { - display_num = display_env[1] - '0'; - } - - // *TODO: we could be smarter and see which of Xorg/XFree86 has the - // freshest time-stamp. - - // Try Xorg log first - fname = x_log_location; - fname += "Xorg."; - fname += ('0' + display_num); - fname += ".log"; - fp = fopen(fname.c_str(), "r"); - if (fp) - { - LL_INFOS() << "Looking in " << fname - << " for VRAM info..." << LL_ENDL; - rtn = x11_detect_VRAM_kb_fp(fp, ": VideoRAM: "); - fclose(fp); - if (0 == rtn) - { - fp = fopen(fname.c_str(), "r"); - if (fp) - { - rtn = x11_detect_VRAM_kb_fp(fp, ": Video RAM: "); - fclose(fp); - if (0 == rtn) - { - fp = fopen(fname.c_str(), "r"); - if (fp) - { - rtn = x11_detect_VRAM_kb_fp(fp, ": Memory: "); - fclose(fp); - } - } - } - } - } - else - { - LL_INFOS() << "Could not open " << fname - << " - skipped." << LL_ENDL; - // Try old XFree86 log otherwise - fname = x_log_location; - fname += "XFree86."; - fname += ('0' + display_num); - fname += ".log"; - fp = fopen(fname.c_str(), "r"); - if (fp) - { - LL_INFOS() << "Looking in " << fname - << " for VRAM info..." << LL_ENDL; - rtn = x11_detect_VRAM_kb_fp(fp, ": VideoRAM: "); - fclose(fp); - if (0 == rtn) - { - fp = fopen(fname.c_str(), "r"); - if (fp) - { - rtn = x11_detect_VRAM_kb_fp(fp, ": Memory: "); - fclose(fp); - } - } - } - else - { - LL_INFOS() << "Could not open " << fname - << " - skipped." << LL_ENDL; - } - } - return rtn; -} -#endif // LL_X11 - void LLWindowSDL::setTitle(const std::string title) { SDL_SetWindowTitle( mWindow, title.c_str() ); @@ -693,36 +554,27 @@ bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, b } #endif // LL_X11 - // Detect video memory size. # if LL_X11 - gGLManager.mVRAM = x11_detect_VRAM_kb() / 1024; - if (gGLManager.mVRAM != 0) + PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC queryInteger; + queryInteger = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC)glXGetProcAddressARB((const GLubyte *)"glXQueryCurrentRendererIntegerMESA"); + unsigned int vram_megabytes = 0; + queryInteger(GLX_RENDERER_VIDEO_MEMORY_MESA, &vram_megabytes); + if (!vram_megabytes) { - LL_INFOS() << "X11 log-parser detected " << gGLManager.mVRAM << "MB VRAM." << LL_ENDL; - } else + glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, (int *)&vram_megabytes); + vram_megabytes /= 1024; + } + if (!vram_megabytes) { - PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC queryInteger; - queryInteger = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC)glXGetProcAddressARB((const GLubyte *)"glXQueryCurrentRendererIntegerMESA"); - unsigned int vram_megabytes = 0; - queryInteger(GLX_RENDERER_VIDEO_MEMORY_MESA, &vram_megabytes); - if (!vram_megabytes) - { - glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, (int *)&vram_megabytes); - vram_megabytes /= 1024; - } - if (!vram_megabytes) - { - glGetIntegerv(GL_VBO_FREE_MEMORY_ATI, (int *)&vram_megabytes); - vram_megabytes /= 1024; - } - gGLManager.mVRAM = vram_megabytes; + glGetIntegerv(GL_VBO_FREE_MEMORY_ATI, (int *)&vram_megabytes); + vram_megabytes /= 1024; } + gGLManager.mVRAM = vram_megabytes; #elif LL_DARWIN CGLRendererInfoObj info = 0; GLint vram_megabytes = 0; int num_renderers = 0; - auto err = CGLQueryRendererInfo(CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), - &info, &num_renderers); + auto err = CGLQueryRendererInfo(CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), &info, &num_renderers); if (!err) { CGLDescribeRenderer(info, 0, kCGLRPVideoMemoryMegabytes, &vram_megabytes); @@ -733,19 +585,7 @@ bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, b vram_megabytes = 256; } gGLManager.mVRAM = vram_megabytes; -# endif // LL_X11 - { - // fallback to letting SDL detect VRAM. - // note: I've not seen SDL's detection ever actually find - // VRAM != 0, but if SDL *does* detect it then that's a bonus. - gGLManager.mVRAM = 0; - if (gGLManager.mVRAM != 0) - { - LL_INFOS() << "SDL detected " << gGLManager.mVRAM << "MB VRAM." << LL_ENDL; - } - } - // If VRAM is not detected, that is handled later - +# endif SDL_StartTextInput(); //make sure multisampling is disabled by default #if GL_VERSION_1_3 @@ -1509,47 +1349,24 @@ bool LLWindowSDL::SDLReallyCaptureInput(bool capture) bool newGrab = wantGrab; -#if LL_X11 if (!mFullscreen) /* only bother if we're windowed anyway */ { - if (mSDL_Display) + int result; + if (wantGrab == true) { - /* we dirtily mix raw X11 with SDL so that our pointer - isn't (as often) constrained to the limits of the - window while grabbed, which feels nicer and - hopefully eliminates some reported 'sticky pointer' - problems. We use raw X11 instead of - SDL_WM_GrabInput() because the latter constrains - the pointer to the window and also steals all - *keyboard* input from the window manager, which was - frustrating users. */ - int result; - if (wantGrab == true) - { - maybe_lock_display(); - result = XGrabPointer(mSDL_Display, mSDL_XWindowID, - True, 0, GrabModeAsync, - GrabModeAsync, - None, None, CurrentTime); - maybe_unlock_display(); - if (GrabSuccess == result) - newGrab = true; - else - newGrab = false; - } + result = SDL_CaptureMouse(SDL_TRUE); + if (0 == result) + newGrab = true; else - { newGrab = false; - - maybe_lock_display(); - XUngrabPointer(mSDL_Display, CurrentTime); - // Make sure the ungrab happens RIGHT NOW. - XSync(mSDL_Display, False); - maybe_unlock_display(); - } + } + else + { + newGrab = false; + result = SDL_CaptureMouse(SDL_FALSE); } } -#endif // LL_X11 + // return boolean success for whether we ended up in the desired state return capture == newGrab; } -- cgit v1.2.3 From b6c3d47c007c59cbd3c9913a0b99f9d42bdb8d75 Mon Sep 17 00:00:00 2001 From: Rye Cogtail Date: Thu, 3 Oct 2024 01:52:14 -0400 Subject: Fix GL init on Linux/SDL on various combinations of GPU driver --- indra/llwindow/llwindowsdl.cpp | 31 +++++++------------------------ 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index dd4a7593a3..69332e36b6 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -367,20 +367,14 @@ bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, b // Setup default backing colors GLint redBits{8}, greenBits{8}, blueBits{8}, alphaBits{8}; - GLint depthBits{(bits <= 16) ? 16 : 24}, stencilBits{8}; - - if (getenv("LL_GL_NO_STENCIL")) - stencilBits = 0; + GLint depthBits{24}, stencilBits{8}; SDL_GL_SetAttribute(SDL_GL_RED_SIZE, redBits); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, greenBits); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, blueBits); SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, alphaBits); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, depthBits); - - // We need stencil support for a few (minor) things. - if (stencilBits) - SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, stencilBits); + SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, stencilBits); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4); #if LL_DARWIN @@ -392,17 +386,6 @@ bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, b SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - if (LLRender::sGLCoreProfile) - { - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); - } - - // This is requesting a minimum context version - int major_gl_version = 3; - int minor_gl_version = 2; - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major_gl_version); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor_gl_version); - U32 context_flags = 0; if (gDebugGL) { @@ -417,7 +400,7 @@ bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, b { LL_WARNS() << "Window creation failure. SDL: " << SDL_GetError() << LL_ENDL; setupFailure("Window creation error", "Error", OSMB_OK); - return FALSE; + return false; } // Create the context @@ -433,7 +416,7 @@ bool LLWindowSDL::createContext(int x, int y, int width, int height, int bits, b { LL_WARNS() << "Failed to make context current. SDL: " << SDL_GetError() << LL_ENDL; setupFailure("GL Context failed to set current failure", "Error", OSMB_OK); - return FALSE; + return false; } if(mFullscreen) @@ -788,7 +771,7 @@ bool LLWindowSDL::getVisible() Uint32 flags = SDL_GetWindowFlags(mWindow); if (flags & SDL_WINDOW_SHOWN) { - result = TRUE; + result = true; } } return result; @@ -828,9 +811,9 @@ bool LLWindowSDL::maximize() if (mWindow) { SDL_MaximizeWindow(mWindow); - return TRUE; + return true; } - return FALSE; + return false; } bool LLWindowSDL::getFullscreen() -- cgit v1.2.3