Merge branch 'release/2025.04' of https://github.com/secondlife/viewer
# Conflicts: # indra/cmake/Python.cmake # indra/newview/llimview.cpp # indra/newview/llpanelface.cpp # indra/newview/skins/default/colors.xmlmaster
commit
9df4d7ba96
|
|
@ -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);
|
rv = apr_socket_recv(apr_socket, datain, &maxinlen);
|
||||||
if (rv != APR_SUCCESS)
|
if (rv != APR_SUCCESS)
|
||||||
{
|
{
|
||||||
|
// if rv == 70060 it's WSAETIMEDOUT
|
||||||
char buf[MAX_STRING];
|
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_WARNS("Proxy") << "Error receiving data from proxy control channel, status: " << rv << " " << apr_strerror(rv, buf, MAX_STRING) << LL_ENDL;
|
||||||
ll_apr_warn_status(rv);
|
ll_apr_warn_status(rv);
|
||||||
|
|
|
||||||
|
|
@ -164,7 +164,7 @@ protected:
|
||||||
virtual bool isHighlightActive();
|
virtual bool isHighlightActive();
|
||||||
virtual bool isFadeItem();
|
virtual bool isFadeItem();
|
||||||
virtual bool isFlashing() { return false; }
|
virtual bool isFlashing() { return false; }
|
||||||
virtual void setFlashState(bool) { }
|
virtual void setFlashState(bool, bool) { }
|
||||||
|
|
||||||
static LLFontGL* getLabelFontForStyle(U8 style);
|
static LLFontGL* getLabelFontForStyle(U8 style);
|
||||||
const LLFontGL* getLabelFont();
|
const LLFontGL* getLabelFont();
|
||||||
|
|
|
||||||
|
|
@ -698,6 +698,11 @@ LLUUID LLUrlEntryAgent::getID(const std::string &string) const
|
||||||
return LLUUID(getIDStringFromUrl(string));
|
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
|
std::string LLUrlEntryAgent::getTooltip(const std::string &string) const
|
||||||
{
|
{
|
||||||
// return a tooltip corresponding to the URL type instead of the generic one
|
// return a tooltip corresponding to the URL type instead of the generic one
|
||||||
|
|
|
||||||
|
|
@ -103,6 +103,7 @@ public:
|
||||||
virtual bool getSkipProfileIcon(const std::string& string) const { return false; }
|
virtual bool getSkipProfileIcon(const std::string& string) const { return false; }
|
||||||
|
|
||||||
virtual LLUUID getID(const std::string &string) const { return LLUUID::null; }
|
virtual LLUUID getID(const std::string &string) const { return LLUUID::null; }
|
||||||
|
virtual bool isAgentID(const std::string& url) const { return false; }
|
||||||
|
|
||||||
bool isLinkDisabled() const;
|
bool isLinkDisabled() const;
|
||||||
|
|
||||||
|
|
@ -247,6 +248,8 @@ public:
|
||||||
/*virtual*/ LLStyle::Params getStyle(const std::string &url) const;
|
/*virtual*/ LLStyle::Params getStyle(const std::string &url) const;
|
||||||
/*virtual*/ LLUUID getID(const std::string &string) const;
|
/*virtual*/ LLUUID getID(const std::string &string) const;
|
||||||
|
|
||||||
|
bool isAgentID(const std::string& url) const;
|
||||||
|
|
||||||
LLStyle::EUnderlineLink getUnderline(const std::string& string) const;
|
LLStyle::EUnderlineLink getUnderline(const std::string& string) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
||||||
|
|
@ -417,3 +417,30 @@ void LLUrlRegistry::setKeybindingHandler(LLKeyBindingToStringHandler* handler)
|
||||||
LLUrlEntryKeybinding *entry = (LLUrlEntryKeybinding*)mUrlEntryKeybinding;
|
LLUrlEntryKeybinding *entry = (LLUrlEntryKeybinding*)mUrlEntryKeybinding;
|
||||||
entry->setHandler(handler);
|
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;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -92,6 +92,8 @@ public:
|
||||||
// Set handler for url registry to be capable of parsing and populating keybindings
|
// Set handler for url registry to be capable of parsing and populating keybindings
|
||||||
void setKeybindingHandler(LLKeyBindingToStringHandler* handler);
|
void setKeybindingHandler(LLKeyBindingToStringHandler* handler);
|
||||||
|
|
||||||
|
bool containsAgentMention(const std::string& text);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<LLUrlEntryBase *> mUrlEntry;
|
std::vector<LLUrlEntryBase *> mUrlEntry;
|
||||||
LLUrlEntryBase* mUrlEntryTrusted;
|
LLUrlEntryBase* mUrlEntryTrusted;
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,8 @@ LLConversationViewSession::LLConversationViewSession(const LLConversationViewSes
|
||||||
mHasArrow(true),
|
mHasArrow(true),
|
||||||
mIsInActiveVoiceChannel(false),
|
mIsInActiveVoiceChannel(false),
|
||||||
mFlashStateOn(false),
|
mFlashStateOn(false),
|
||||||
mFlashStarted(false)
|
mFlashStarted(false),
|
||||||
|
mIsAltFlashColor(false)
|
||||||
{
|
{
|
||||||
mFlashTimer = new LLFlashTimer();
|
mFlashTimer = new LLFlashTimer();
|
||||||
mAreChildrenInited = true; // inventory only
|
mAreChildrenInited = true; // inventory only
|
||||||
|
|
@ -159,7 +160,7 @@ void LLConversationViewSession::destroyView()
|
||||||
LLFolderViewFolder::destroyView();
|
LLFolderViewFolder::destroyView();
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLConversationViewSession::setFlashState(bool flash_state)
|
void LLConversationViewSession::setFlashState(bool flash_state, bool alternate_color)
|
||||||
{
|
{
|
||||||
if (flash_state && !mFlashStateOn)
|
if (flash_state && !mFlashStateOn)
|
||||||
{
|
{
|
||||||
|
|
@ -172,6 +173,7 @@ void LLConversationViewSession::setFlashState(bool flash_state)
|
||||||
|
|
||||||
mFlashStateOn = flash_state;
|
mFlashStateOn = flash_state;
|
||||||
mFlashStarted = false;
|
mFlashStarted = false;
|
||||||
|
mIsAltFlashColor = mFlashStateOn && (alternate_color || mIsAltFlashColor);
|
||||||
mFlashTimer->stopFlashing();
|
mFlashTimer->stopFlashing();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -290,7 +292,8 @@ void LLConversationViewSession::draw()
|
||||||
startFlashing();
|
startFlashing();
|
||||||
|
|
||||||
// draw highlight for selected items
|
// 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.
|
// 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<LLFolderViewFolder*>(this) || isOpen();
|
bool draw_children = getRoot() == static_cast<LLFolderViewFolder*>(this) || isOpen();
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@ public:
|
||||||
|
|
||||||
virtual void refresh();
|
virtual void refresh();
|
||||||
|
|
||||||
/*virtual*/ void setFlashState(bool flash_state);
|
/*virtual*/ void setFlashState(bool flash_state, bool alternate_color = false);
|
||||||
void setHighlightState(bool hihglight_state);
|
void setHighlightState(bool hihglight_state);
|
||||||
|
|
||||||
LLFloater* getSessionFloater();
|
LLFloater* getSessionFloater();
|
||||||
|
|
@ -113,6 +113,7 @@ private:
|
||||||
LLFlashTimer* mFlashTimer;
|
LLFlashTimer* mFlashTimer;
|
||||||
bool mFlashStateOn;
|
bool mFlashStateOn;
|
||||||
bool mFlashStarted;
|
bool mFlashStarted;
|
||||||
|
bool mIsAltFlashColor;
|
||||||
|
|
||||||
bool mCollapsedMode;
|
bool mCollapsedMode;
|
||||||
bool mHasArrow;
|
bool mHasArrow;
|
||||||
|
|
|
||||||
|
|
@ -2314,14 +2314,14 @@ bool LLFloaterIMContainer::isConversationLoggingAllowed()
|
||||||
return gSavedPerAccountSettings.getS32("KeepConversationLogTranscripts") > 0;
|
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
|
//Finds the conversation line item to flash using the session_id
|
||||||
LLConversationViewSession * widget = dynamic_cast<LLConversationViewSession *>(get_ptr_in_map(mConversationsWidgets,session_id));
|
LLConversationViewSession * widget = dynamic_cast<LLConversationViewSession *>(get_ptr_in_map(mConversationsWidgets,session_id));
|
||||||
|
|
||||||
if (widget)
|
if (widget)
|
||||||
{
|
{
|
||||||
widget->setFlashState(is_flashes);
|
widget->setFlashState(is_flashes, alternate_color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -210,7 +210,7 @@ public:
|
||||||
void reSelectConversation();
|
void reSelectConversation();
|
||||||
void updateSpeakBtnState();
|
void updateSpeakBtnState();
|
||||||
static bool isConversationLoggingAllowed();
|
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);
|
void highlightConversationItemWidget(const LLUUID& session_id, bool is_highlighted);
|
||||||
bool isScrolledOutOfSight(LLConversationViewSession* conversation_item_widget);
|
bool isScrolledOutOfSight(LLConversationViewSession* conversation_item_widget);
|
||||||
boost::signals2::connection mMicroChangedSignal;
|
boost::signals2::connection mMicroChangedSignal;
|
||||||
|
|
|
||||||
|
|
@ -108,6 +108,7 @@ LLFloaterIMSessionTab::~LLFloaterIMSessionTab()
|
||||||
{
|
{
|
||||||
delete mRefreshTimer;
|
delete mRefreshTimer;
|
||||||
LLIMMgr::instance().removeSessionObserver(this);
|
LLIMMgr::instance().removeSessionObserver(this);
|
||||||
|
mEmojiCloseConn.disconnect();
|
||||||
|
|
||||||
LLFloaterIMContainer* im_container = LLFloaterIMContainer::findInstance();
|
LLFloaterIMContainer* im_container = LLFloaterIMContainer::findInstance();
|
||||||
if (im_container)
|
if (im_container)
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,7 @@
|
||||||
#include "llviewerregion.h"
|
#include "llviewerregion.h"
|
||||||
#include "llcorehttputil.h"
|
#include "llcorehttputil.h"
|
||||||
#include "lluiusage.h"
|
#include "lluiusage.h"
|
||||||
|
#include "llurlregistry.h"
|
||||||
// [RLVa:KB] - Checked: 2013-05-10 (RLVa-1.4.9)
|
// [RLVa:KB] - Checked: 2013-05-10 (RLVa-1.4.9)
|
||||||
#include "rlvactions.h"
|
#include "rlvactions.h"
|
||||||
#include "rlvcommon.h"
|
#include "rlvcommon.h"
|
||||||
|
|
@ -236,6 +237,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg)
|
||||||
LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(session_id);
|
LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(session_id);
|
||||||
bool store_dnd_message = false; // flag storage of a dnd message
|
bool store_dnd_message = false; // flag storage of a dnd message
|
||||||
bool is_session_focused = session_floater->isTornOff() && session_floater->hasFocus();
|
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())
|
if (!LLFloater::isVisible(im_box) || im_box->isMinimized())
|
||||||
{
|
{
|
||||||
conversations_floater_status = CLOSED;
|
conversations_floater_status = CLOSED;
|
||||||
|
|
@ -362,7 +364,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg)
|
||||||
if ("openconversations" == user_preferences
|
if ("openconversations" == user_preferences
|
||||||
|| ON_TOP == conversations_floater_status
|
|| ON_TOP == conversations_floater_status
|
||||||
|| ("toast" == 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))
|
|| NOT_ON_TOP == conversations_floater_status))
|
||||||
|| is_dnd_msg)
|
|| is_dnd_msg)
|
||||||
{
|
{
|
||||||
|
|
@ -382,7 +384,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
im_box->flashConversationItemWidget(session_id, true);
|
im_box->flashConversationItemWidget(session_id, true, contains_mention);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -3730,7 +3732,7 @@ void LLIMMgr::addMessage(
|
||||||
{
|
{
|
||||||
// LLFloaterReg::showInstance("im_container");
|
// LLFloaterReg::showInstance("im_container");
|
||||||
// LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container")->
|
// LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container")->
|
||||||
// flashConversationItemWidget(new_session_id, true);
|
// flashConversationItemWidget(new_session_id, true, LLUrlRegistry::getInstance()->containsAgentMention(msg));
|
||||||
LLFloaterReg::showInstance("fs_im_container");
|
LLFloaterReg::showInstance("fs_im_container");
|
||||||
// </FS:CR>
|
// </FS:CR>
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1147,6 +1147,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
|
||||||
}
|
}
|
||||||
mRadioPbrType->setEnabled(editable);
|
mRadioPbrType->setEnabled(editable);
|
||||||
const bool pbr_selected = mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR;
|
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;
|
const bool texture_info_selected = pbr_selected && mRadioPbrType->getSelectedIndex() != PBRTYPE_RENDER_MATERIAL_ID;
|
||||||
|
|
||||||
mCheckSyncSettings->setEnabled(editable);
|
mCheckSyncSettings->setEnabled(editable);
|
||||||
|
|
@ -1450,7 +1451,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
|
||||||
mShinyScaleU->setValue(spec_scale_s);
|
mShinyScaleU->setValue(spec_scale_s);
|
||||||
mBumpyScaleU->setValue(norm_scale_s);
|
mBumpyScaleU->setValue(norm_scale_s);
|
||||||
|
|
||||||
mTexScaleU->setEnabled(editable && has_material);
|
mTexScaleU->setEnabled(editable && (has_material || media_selected));
|
||||||
// <FS:CR> Materials alignment
|
// <FS:CR> Materials alignment
|
||||||
//mShinyScaleU->setEnabled(editable && has_material && specmap_id.notNull());
|
//mShinyScaleU->setEnabled(editable && has_material && specmap_id.notNull());
|
||||||
//mBumpyScaleU->setEnabled(editable && has_material && normmap_id.notNull());
|
//mBumpyScaleU->setEnabled(editable && has_material && normmap_id.notNull());
|
||||||
|
|
@ -1495,7 +1496,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
|
||||||
bool norm_scale_tentative = !identical_norm_scale_t;
|
bool norm_scale_tentative = !identical_norm_scale_t;
|
||||||
bool spec_scale_tentative = !identical_spec_scale_t;
|
bool spec_scale_tentative = !identical_spec_scale_t;
|
||||||
|
|
||||||
mTexScaleV->setEnabled(editable && has_material);
|
mTexScaleV->setEnabled(editable && (has_material || media_selected));
|
||||||
// <FS:CR> Materials alignment
|
// <FS:CR> Materials alignment
|
||||||
//mShinyScaleV->setEnabled(editable && has_material && specmap_id.notNull());
|
//mShinyScaleV->setEnabled(editable && has_material && specmap_id.notNull());
|
||||||
//mBumpyScaleV->setEnabled(editable && has_material && normmap_id.notNull());
|
//mBumpyScaleV->setEnabled(editable && has_material && normmap_id.notNull());
|
||||||
|
|
@ -1544,7 +1545,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
|
||||||
mShinyOffsetU->setTentative(LLSD(spec_offset_u_tentative));
|
mShinyOffsetU->setTentative(LLSD(spec_offset_u_tentative));
|
||||||
mBumpyOffsetU->setTentative(LLSD(norm_offset_u_tentative));
|
mBumpyOffsetU->setTentative(LLSD(norm_offset_u_tentative));
|
||||||
|
|
||||||
mTexOffsetU->setEnabled(editable && has_material);
|
mTexOffsetU->setEnabled(editable && (has_material || media_selected));
|
||||||
// <FS:CR> Materials alignment
|
// <FS:CR> Materials alignment
|
||||||
//mShinyOffsetU->setEnabled(editable && has_material && specmap_id.notNull());
|
//mShinyOffsetU->setEnabled(editable && has_material && specmap_id.notNull());
|
||||||
//mBumpyOffsetU->setEnabled(editable && has_material && normmap_id.notNull());
|
//mBumpyOffsetU->setEnabled(editable && has_material && normmap_id.notNull());
|
||||||
|
|
@ -1577,7 +1578,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
|
||||||
mBumpyOffsetV->setTentative(LLSD(norm_offset_v_tentative));
|
mBumpyOffsetV->setTentative(LLSD(norm_offset_v_tentative));
|
||||||
mShinyOffsetV->setTentative(LLSD(spec_offset_v_tentative));
|
mShinyOffsetV->setTentative(LLSD(spec_offset_v_tentative));
|
||||||
|
|
||||||
mTexOffsetV->setEnabled(editable && has_material);
|
mTexOffsetV->setEnabled(editable && (has_material || media_selected));
|
||||||
// <FS:CR> Materials alignment
|
// <FS:CR> Materials alignment
|
||||||
//mShinyOffsetV->setEnabled(editable && has_material && specmap_id.notNull());
|
//mShinyOffsetV->setEnabled(editable && has_material && specmap_id.notNull());
|
||||||
//mBumpyOffsetV->setEnabled(editable && has_material && normmap_id.notNull());
|
//mBumpyOffsetV->setEnabled(editable && has_material && normmap_id.notNull());
|
||||||
|
|
@ -1607,7 +1608,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
|
||||||
F32 norm_rot_deg = norm_rotation * RAD_TO_DEG;
|
F32 norm_rot_deg = norm_rotation * RAD_TO_DEG;
|
||||||
F32 spec_rot_deg = spec_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));
|
||||||
// <FS:CR> Materials alignment
|
// <FS:CR> Materials alignment
|
||||||
//mShinyRotate->setEnabled(editable && has_material && specmap_id.notNull());
|
//mShinyRotate->setEnabled(editable && has_material && specmap_id.notNull());
|
||||||
//mBumpyRotate->setEnabled(editable && has_material && normmap_id.notNull());
|
//mBumpyRotate->setEnabled(editable && has_material && normmap_id.notNull());
|
||||||
|
|
@ -1729,7 +1730,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
|
||||||
mTexRepeat->setValue(editable ? repeats : 1.0f);
|
mTexRepeat->setValue(editable ? repeats : 1.0f);
|
||||||
}
|
}
|
||||||
mTexRepeat->setTentative(LLSD(repeats_tentative));
|
mTexRepeat->setTentative(LLSD(repeats_tentative));
|
||||||
mTexRepeat->setEnabled(has_material && !identical_planar_texgen && enabled);
|
mTexRepeat->setEnabled(!identical_planar_texgen && enabled && (has_material || media_selected));
|
||||||
// <FS:CR> FIRE-11407 - Flip buttons
|
// <FS:CR> FIRE-11407 - Flip buttons
|
||||||
mBtnTexFlipScaleU->setEnabled(enabled);
|
mBtnTexFlipScaleU->setEnabled(enabled);
|
||||||
mBtnTexFlipScaleV->setEnabled(enabled);
|
mBtnTexFlipScaleV->setEnabled(enabled);
|
||||||
|
|
|
||||||
|
|
@ -3295,36 +3295,43 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch)
|
||||||
F32 offset_x = 0;
|
F32 offset_x = 0;
|
||||||
F32 offset_y = 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];
|
for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
|
||||||
|
{
|
||||||
|
LLVector3 scale_ratio = selectNode->mGLTFScaleRatios[te_num][i];
|
||||||
|
|
||||||
if (planar)
|
if (planar)
|
||||||
{
|
{
|
||||||
scale_x = scale_ratio.mV[s_axis] / object_scale.mV[s_axis];
|
scale_x = scale_ratio.mV[s_axis] / object_scale.mV[s_axis];
|
||||||
scale_y = scale_ratio.mV[t_axis] / object_scale.mV[t_axis];
|
scale_y = scale_ratio.mV[t_axis] / object_scale.mV[t_axis];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
scale_x = scale_ratio.mV[s_axis] * object_scale.mV[s_axis];
|
scale_x = scale_ratio.mV[s_axis] * object_scale.mV[s_axis];
|
||||||
scale_y = scale_ratio.mV[t_axis] * object_scale.mV[t_axis];
|
scale_y = scale_ratio.mV[t_axis] * object_scale.mV[t_axis];
|
||||||
}
|
}
|
||||||
material->mTextureTransform[i].mScale.set(scale_x, scale_y);
|
material->mTextureTransform[i].mScale.set(scale_x, scale_y);
|
||||||
|
|
||||||
LLVector2 scales = selectNode->mGLTFScales[te_num][i];
|
LLVector2 scales = selectNode->mGLTFScales[te_num][i];
|
||||||
LLVector2 offsets = selectNode->mGLTFOffsets[te_num][i];
|
LLVector2 offsets = selectNode->mGLTFOffsets[te_num][i];
|
||||||
F64 int_part = 0;
|
F64 int_part = 0;
|
||||||
offset_x = (F32)modf((offsets[VX] + (scales[VX] - scale_x)) / 2, &int_part);
|
offset_x = (F32)modf((offsets[VX] + (scales[VX] - scale_x)) / 2, &int_part);
|
||||||
if (offset_x < 0)
|
if (offset_x < 0)
|
||||||
{
|
{
|
||||||
offset_x++;
|
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)
|
else
|
||||||
{
|
{
|
||||||
offset_y++;
|
llassert(false); // make sure mGLTFScaleRatios is filled
|
||||||
}
|
|
||||||
material->mTextureTransform[i].mOffset.set(offset_x, offset_y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const LLGLTFMaterial* base_material = tep->getGLTFMaterial();
|
const LLGLTFMaterial* base_material = tep->getGLTFMaterial();
|
||||||
|
|
@ -7202,7 +7209,6 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)
|
||||||
|
|
||||||
if (mObject.notNull())
|
if (mObject.notNull())
|
||||||
{
|
{
|
||||||
|
|
||||||
LLVector3 scale = mObject->getScale();
|
LLVector3 scale = mObject->getScale();
|
||||||
|
|
||||||
for (U8 i = 0; i < mObject->getNumTEs(); i++)
|
for (U8 i = 0; i < mObject->getNumTEs(); i++)
|
||||||
|
|
|
||||||
|
|
@ -3347,6 +3347,8 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
|
||||||
msg_notify["session_id"] = LLUUID();
|
msg_notify["session_id"] = LLUUID();
|
||||||
msg_notify["from_id"] = chat.mFromID;
|
msg_notify["from_id"] = chat.mFromID;
|
||||||
msg_notify["source_type"] = chat.mSourceType;
|
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);
|
on_new_message(msg_notify);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1405,4 +1405,7 @@
|
||||||
<color
|
<color
|
||||||
name="ChatSelfMentionHighlight"
|
name="ChatSelfMentionHighlight"
|
||||||
value="0.709 0.250 0.190 1" />
|
value="0.709 0.250 0.190 1" />
|
||||||
|
<color
|
||||||
|
name="MentionFlashBgColor"
|
||||||
|
value="1 1 0 0.5" />
|
||||||
</colors>
|
</colors>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue