diff --git a/README_BUILD_FIRESTORM_LINUX.txt b/README_BUILD_FIRESTORM_LINUX.txt index 8b1eec1314..29d7a3220f 100755 --- a/README_BUILD_FIRESTORM_LINUX.txt +++ b/README_BUILD_FIRESTORM_LINUX.txt @@ -1,4 +1,4 @@ -First, make sure gcc-4.7 and g++-4.7 are installed. +First, make sure gcc-4.9 and g++-4.9 are installed. Ensure you can build a stock viewer-development try as described in the SL wiki. Before asking for any help compiling Firestorm, make sure you can build viewer-development first. If you try and skip this step, you may @@ -15,16 +15,16 @@ mailing list. We've created a non-KDU build target to make this easier. Everywhe "ReleaseFS_open" instead. This will perform the same build, using openjpeg instead of KDU. Available premade firestorm-specific build targets: - ReleaseFS (includes KDU, FMODEX) - ReleaseFS_open (no KDU, no FMODEX) - RelWithDebInfoFS_open (no KDU, no FMODEX) + ReleaseFS (includes KDU, FMODSTUDIO) + ReleaseFS_open (no KDU, no FMODSTUDIO) + RelWithDebInfoFS_open (no KDU, no FMODSTUDIO) To build firestorm: autobuild build -A64 -c ReleaseFS Other examples: - autobuild configure -A64 -c ReleaseFS # basic configuration step, don't build, just configure - autobuild configure -A64 -c ReleaseFS -- --clean # clean the output area first, then configure + autobuild configure -A64 -c ReleaseFS # basic configuration step, don't build, just configure + autobuild configure -A64 -c ReleaseFS -- --clean # clean the output area first, then configure autobuild configure -A64 -c ReleaseFS -- --chan Private-Yourname # configure with a custom channel autobuild build -A64 -c ReleaseFS --no-configure # default quick rebuild diff --git a/indra/llappearance/lltexlayer.cpp b/indra/llappearance/lltexlayer.cpp index f53fe21f85..2bfaf0ddbe 100644 --- a/indra/llappearance/lltexlayer.cpp +++ b/indra/llappearance/lltexlayer.cpp @@ -44,6 +44,7 @@ #include "llvertexbuffer.h" #include "llviewervisualparam.h" #include "llfasttimer.h" +#include "llrendertarget.h" // For copyContents //#include "../tools/imdebug/imdebug.h" @@ -1577,14 +1578,19 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC } alpha_data = new U8[width * height]; mAlphaCache[cache_index] = alpha_data; - + // nSight doesn't support use of glReadPixels if (!LLRender::sNsightDebugSupport) { // Format GL_ALPHA is invalid for glReadPixels //glReadPixels(x, y, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, alpha_data); + U8* alpha_buffer = new U8[width * height * 4]; - glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, alpha_buffer); + if (!LLRenderTarget::getCurrentBoundTarget()) + glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, alpha_buffer); + else + LLRenderTarget::getCurrentBoundTarget()->copyContents(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, alpha_buffer); + for (S32 i = 0; i < width * height; ++i) { alpha_data[i] = alpha_buffer[i * 4 + 3]; diff --git a/indra/llaudio/llaudioengine_fmodex.cpp b/indra/llaudio/llaudioengine_fmodex.cpp index db34ffc19e..9000e1b99a 100644 --- a/indra/llaudio/llaudioengine_fmodex.cpp +++ b/indra/llaudio/llaudioengine_fmodex.cpp @@ -75,14 +75,16 @@ void set_device(FMOD::System* system, const LLUUID& device_uuid) for (int i = 0; i < drivercount; ++i) { - system->getDriverInfo(i, NULL, 0, &guid); - LLUUID driver_guid = FMOD_GUID_to_LLUUID(guid); - - if (driver_guid == device_uuid) + if (!Check_FMOD_Error(system->getDriverInfo(i, NULL, 0, &guid), "FMOD::System::getDriverInfo")) { - LL_INFOS() << "Setting driver " << i << ": " << driver_guid << LL_ENDL; - Check_FMOD_Error(system->setDriver(i), "FMOD::System::setDriver"); - return; + LLUUID driver_guid = FMOD_GUID_to_LLUUID(guid); + + if (driver_guid == device_uuid) + { + LL_INFOS() << "Setting driver " << i << ": " << driver_guid << LL_ENDL; + Check_FMOD_Error(system->setDriver(i), "FMOD::System::setDriver"); + return; + } } } @@ -423,12 +425,14 @@ LLAudioEngine_FMODEX::output_device_map_t LLAudioEngine_FMODEX::getDevices() { for (int i = 0; i < drivercount; ++i) { - memset(r_name, 0, 512); - mSystem->getDriverInfo(i, r_name, 511, &guid); - LLUUID driver_guid = FMOD_GUID_to_LLUUID(guid); - driver_map.insert(std::make_pair(driver_guid, r_name)); + memset(r_name, 0, sizeof(r_name)); + if (!Check_FMOD_Error(mSystem->getDriverInfo(i, r_name, 511, &guid), "FMOD::System::getDriverInfo")) + { + LLUUID driver_guid = FMOD_GUID_to_LLUUID(guid); + driver_map.insert(std::make_pair(driver_guid, r_name)); - LL_INFOS("AppInit") << "LLAudioEngine_FMODEX::getDevices(): r_name=\"" << r_name << "\" - guid: " << driver_guid << LL_ENDL; + LL_INFOS("AppInit") << "LLAudioEngine_FMODEX::getDevices(): r_name=\"" << r_name << "\" - guid: " << driver_guid << LL_ENDL; + } } } diff --git a/indra/llaudio/llaudioengine_fmodstudio.cpp b/indra/llaudio/llaudioengine_fmodstudio.cpp index 2bd17d8d6a..48203b0371 100644 --- a/indra/llaudio/llaudioengine_fmodstudio.cpp +++ b/indra/llaudio/llaudioengine_fmodstudio.cpp @@ -95,14 +95,16 @@ void set_device(FMOD::System* system, const LLUUID& device_uuid) for (int i = 0; i < drivercount; ++i) { - system->getDriverInfo(i, NULL, 0, &guid, &r_samplerate, NULL, &r_channels); - LLUUID driver_guid = FMOD_GUID_to_LLUUID(guid); - - if (driver_guid == device_uuid) + if (!Check_FMOD_Error(system->getDriverInfo(i, NULL, 0, &guid, &r_samplerate, NULL, &r_channels), "FMOD::System::getDriverInfo")) { - LL_INFOS() << "Setting driver " << i << ": " << driver_guid << LL_ENDL; - Check_FMOD_Error(system->setDriver(i), "FMOD::System::setDriver"); - return; + LLUUID driver_guid = FMOD_GUID_to_LLUUID(guid); + + if (driver_guid == device_uuid) + { + LL_INFOS() << "Setting driver " << i << ": " << driver_guid << LL_ENDL; + Check_FMOD_Error(system->setDriver(i), "FMOD::System::setDriver"); + return; + } } } @@ -353,12 +355,14 @@ LLAudioEngine_FMODSTUDIO::output_device_map_t LLAudioEngine_FMODSTUDIO::getDevic { for (int i = 0; i < drivercount; ++i) { - memset(r_name, 0, 512); - mSystem->getDriverInfo(i, r_name, 511, &guid, &r_samplerate, NULL, &r_channels); - LLUUID driver_guid = FMOD_GUID_to_LLUUID(guid); - driver_map.insert(std::make_pair(driver_guid, r_name)); + memset(r_name, 0, sizeof(r_name)); + if (!Check_FMOD_Error(mSystem->getDriverInfo(i, r_name, 511, &guid, &r_samplerate, NULL, &r_channels), "FMOD::System::getDriverInfo")) + { + LLUUID driver_guid = FMOD_GUID_to_LLUUID(guid); + driver_map.insert(std::make_pair(driver_guid, r_name)); - LL_INFOS("AppInit") << "LLAudioEngine_FMODSTUDIO::getDevices(): r_name=\"" << r_name << "\" - guid: " << driver_guid << LL_ENDL; + LL_INFOS("AppInit") << "LLAudioEngine_FMODSTUDIO::getDevices(): r_name=\"" << r_name << "\" - guid: " << driver_guid << LL_ENDL; + } } } diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index 9fb4f7f2b0..86bd22f521 100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -656,5 +656,133 @@ void LLRenderTarget::getViewport(S32* viewport) viewport[3] = mResY; } +// Determine version of intel driver. We know anything >= 24 is problematic with glReadPixels +#if LL_WINDOWS && ADDRESS_SIZE == 64 +U32 getIntelDriverVersionMajor() +{ + if (!gGLManager.mIsIntel) + return 0; + std::string strVersion = gGLManager.mDriverVersionVendorString; + auto i = strVersion.find("Build "); + if (i != std::string::npos) + { + i += sizeof("Build"); + while (isspace(strVersion[i]) && strVersion[i]) + ++i; + auto start = i; + while (strVersion[i] != '.' && strVersion[i]) + i++; + if( strVersion[i] ) + { + std::string strMajor(strVersion.begin() + start, strVersion.begin() + i); + U32 version = 0; + if (LLStringUtil::convertToU32(strMajor, version)) + return version; + } + } + + return 0; +} +#endif +//ND> +// Copy the contents of this FBO into memory +void LLRenderTarget::copyContents(S32 x, S32 y, S32 w, S32 h, U32 format, U32 type, U8 *buffer) +{ +#if LL_WINDOWS && ADDRESS_SIZE == 64 + // If not Intel or driver < 24.*, be done with it + if (!gGLManager.mIsIntel || getIntelDriverVersionMajor() < 24) + { + glReadPixels(x, y, w, h, (GLenum)format, (GLenum)type, buffer); + return; + } + + std::vector< GLenum > vErrors; + + // BUG-225655/FIRE-24049 some drivers (Intel 64 bit >= 24.* are behaving buggy when glReadPixels is called + if (mFBO) + { + // When a FBO is bound unbind/rebind it. + vErrors.push_back(glGetError()); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + vErrors.push_back(glGetError()); + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); + vErrors.push_back(glGetError()); + + glReadPixels(x, y, w, h, (GLenum)format, (GLenum)type, buffer); + vErrors.push_back(glGetError()); + } + else + { + llassert_always(type == GL_UNSIGNED_BYTE); + llassert_always(format == GL_RGBA || format == GL_ALPHA); + + if (mUsage != LLTexUnit::TT_TEXTURE && mUsage != LLTexUnit::TT_RECT_TEXTURE ) + { + LL_WARNS() << "Expected type TT_TEXTURE or TT_RECT_TEXTURE got 0x" << std::setw(8) << std::setfill('0') << std::hex << LLTexUnit::getInternalType(mUsage) << + " internal type 0x" << std::setw(8) << std::setfill('0') << std::hex << mUsage << LL_ENDL; + } + + // When using no FBO and avoid glReadPixels altogether, instead bind the texture and call glGetTexImage + vErrors.push_back(glGetError()); + flush(); + vErrors.push_back(glGetError()); + gGL.getTexUnit(0)->bind(this); + vErrors.push_back(glGetError()); + + std::string sBuffer(mResX*mResY * 4, 0); + + // Would be nice if GL_ALPHA would be allowed for glGetTexImage + glGetTexImage(LLTexUnit::getInternalType(mUsage), 0, GL_RGBA, GL_UNSIGNED_BYTE, &sBuffer[0]); + vErrors.push_back(glGetError()); + + // Now copy out the data. + // n.b. in case of: + // format == GL_RGBA && x == 0 ** y == 0 and w == mResX && h == mResY + // would could safe all this and glGetTexImage right into buffer + U8 const *pBuffer = reinterpret_cast(sBuffer.c_str()); + pBuffer += (y * mResX * 4); // Adjust to skip to requested y coord + pBuffer += x * 4; // Skip to requested x coord + + if (format == GL_RGBA) + { + for (S32 i = y; i < h; ++i) + { + std::memcpy(buffer, pBuffer, w * 4); + pBuffer += mResX * 4; // Skip one full row, row is already x adjusted + buffer += w * 4; + } + } + else if (format == GL_ALPHA) + { + for (S32 i = y; i < h; ++i) + { + for (S32 j = 0; j < w; ++j) + { + *buffer = pBuffer[3]; + ++buffer; + pBuffer += 4; + } + pBuffer += (mResX - w) * 4; // Skip to end of row + pBuffer += x * 4; // Skip to requested x coordinate again + } + } + gGL.getTexUnit(0)->disable(); + vErrors.push_back(glGetError()); + } + + std::stringstream strm; + for (GLenum err : vErrors ) + strm << "0x" << std::hex << (U32)err << " "; + + if (vErrors.end() != std::find_if(vErrors.begin(), vErrors.end(), [](GLenum err){return err != GL_NO_ERROR; })) + { + LL_WARNS() << "GL error occured: " << strm.str() << LL_ENDL; + } +#else + // Every other OS just gets glReadPixels + glReadPixels(x, y, w, h, (GLenum)format, (GLenum)type, buffer); +#endif +} +// diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h index 6c07ac5b1c..8453e54552 100644 --- a/indra/llrender/llrendertarget.h +++ b/indra/llrender/llrendertarget.h @@ -160,6 +160,10 @@ protected: LLTexUnit::eTextureType mUsage; static LLRenderTarget* sBoundTarget; + // Copy the contents of this FBO into memory +public: + void copyContents(S32 x, S32 y, S32 w, S32 h, U32 format, U32 type, U8 *buffer); + // }; #endif diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index b6ddeda7a8..6039cf19e1 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -524,9 +524,9 @@ std::string LLUrlEntrySLURL::getLocation(const std::string &url) const // LLUrlEntrySecondlifeURL::LLUrlEntrySecondlifeURL() { - mPattern = boost::regex("((http://([-\\w\\.]*\\.)?(secondlife|lindenlab)\\.com)" + mPattern = boost::regex("((http://([-\\w\\.]*\\.)?(secondlife|lindenlab|tilia-inc)\\.com)" "|" - "(https://([-\\w\\.]*\\.)?(secondlife|lindenlab)\\.com(:\\d{1,5})?))" + "(https://([-\\w\\.]*\\.)?(secondlife|lindenlab|tilia-inc)\\.com(:\\d{1,5})?))" "\\/\\S*", boost::regex::perl|boost::regex::icase); @@ -568,7 +568,7 @@ std::string LLUrlEntrySecondlifeURL::getTooltip(const std::string &url) const // LLUrlEntrySimpleSecondlifeURL::LLUrlEntrySimpleSecondlifeURL() { - mPattern = boost::regex("https?://([-\\w\\.]*\\.)?(secondlife|lindenlab)\\.com(?!\\S)", + mPattern = boost::regex("https?://([-\\w\\.]*\\.)?(secondlife|lindenlab|tilia-inc)\\.com(?!\\S)", boost::regex::perl|boost::regex::icase); mIcon = "Hand"; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 13a732f752..0c6c7b5507 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1732,7 +1732,11 @@ if (LINUX) set_source_files_properties( llappviewerlinux.cpp PROPERTIES - COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" +# The next line causes a full rebuild of the entire newview +# directory every time the Mercurial revision number changes. +# Instead of doing that, we use the configure tool to build +# fsversionstrings.h with the right numbers in it. +# COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" ) LIST(APPEND viewer_SOURCE_FILES llappviewerlinux_api_dbus.cpp) # [FS] Growl support diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 19b860c187..a6534bb333 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -6.4.0 +6.2.5 diff --git a/indra/newview/aoengine.cpp b/indra/newview/aoengine.cpp index a13f40f103..8646b4f165 100644 --- a/indra/newview/aoengine.cpp +++ b/indra/newview/aoengine.cpp @@ -81,6 +81,7 @@ AOEngine::~AOEngine() void AOEngine::init() { BOOL do_enable = gSavedPerAccountSettings.getBOOL("UseAO"); + BOOL do_enable_stands = gSavedPerAccountSettings.getBOOL("UseAOStands"); if (do_enable) { // enable_stands() calls enable(), but we need to set the @@ -91,6 +92,7 @@ void AOEngine::init() } else { + enable_stands(do_enable_stands); enable(FALSE); } } @@ -189,15 +191,37 @@ void AOEngine::setLastOverriddenMotion(const LLUUID& motion) BOOL AOEngine::foreignAnimations(const LLUUID& seat) { + LL_DEBUGS("AOEngine") << "Checking for foreign animation on seat " << seat << LL_ENDL; + for (LLVOAvatar::AnimSourceIterator sourceIterator = gAgentAvatarp->mAnimationSources.begin(); sourceIterator != gAgentAvatarp->mAnimationSources.end(); ++sourceIterator) { + LL_DEBUGS("AOEngine") << "Source " << sourceIterator->first << " runs animation " << sourceIterator->second << LL_ENDL; + if (sourceIterator->first != gAgentID) { - if (seat.isNull() || sourceIterator->first == seat) + // special case when the AO gets disabled while sitting + if (seat.isNull()) { return TRUE; } + + // find the source object where the animation came from + LLViewerObject* source=gObjectList.findObject(sourceIterator->first); + + // proceed if it's not an attachment + if(!source->isAttachment()) + { + // get the source's root prim + LLViewerObject* sourceRoot=dynamic_cast(source->getRoot()); + + // if the root prim is the same as the animation source, report back as TRUE + if (sourceRoot && source->getID() == seat) + { + LL_DEBUGS("AOEngine") << "foreign animation " << sourceIterator->second << " found on seat." << LL_ENDL; + return TRUE; + } + } } } return FALSE; @@ -598,10 +622,6 @@ const LLUUID AOEngine::override(const LLUUID& pMotion, BOOL start) { stopAllSitVariants(); } - - LL_DEBUGS("AOEngine") << "stopping cycle timer for motion " << gAnimLibrary.animationName(motion) << - " using animation " << animation << - " in state " << state->mName << LL_ENDL; } return animation; @@ -1626,6 +1646,17 @@ void AOEngine::setSmart(AOSet* set, BOOL yes) { set->setSmart(yes); set->setDirty(TRUE); + + if (yes) + { + // make sure to restart the sit cancel timer to fix sit overrides when the object we are + // sitting on is playing its own animation + const LLViewerObject* agentRoot = dynamic_cast(gAgentAvatarp->getRoot()); + if (agentRoot && agentRoot->getID() != gAgentID) + { + mSitCancelTimer.oneShot(); + } + } } void AOEngine::setDisableStands(AOSet* set, BOOL yes) diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml index 28a6480d54..047d8fc78d 100644 --- a/indra/newview/app_settings/commands.xml +++ b/indra/newview/app_settings/commands.xml @@ -625,6 +625,14 @@ is_running_function="Floater.IsOpen" is_running_parameters="beacons" /> + Value 1 - FSSupportGroupChatPrefix2 + FSSupportGroupChatPrefix3 Comment Adds (FS 1.2.3) to support group chat @@ -15400,7 +15400,7 @@ Change of this parameter will affect the layout of buttons in notification toast 0 SanityComment - This might cause textures to look blurry and sculpties might fail to load properly. Please see "Prefrences -> Graphics -> Rendering -> Max Texture Quality Level" to change. + This might cause textures to look blurry and sculpties might fail to load properly. Please see "Preferences -> Graphics -> Rendering -> Max Texture Quality Level" to change. Backup 0 diff --git a/indra/newview/fsfloaterim.cpp b/indra/newview/fsfloaterim.cpp index 288292860e..eb8a9aaebb 100644 --- a/indra/newview/fsfloaterim.cpp +++ b/indra/newview/fsfloaterim.cpp @@ -386,7 +386,7 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type) utf8_text = FSCommon::applyMuPose(utf8_text); // Support group chat prefix - static LLCachedControl chat_prefix_support(gSavedSettings, "FSSupportGroupChatPrefix2"); + static LLCachedControl chat_prefix_support(gSavedSettings, "FSSupportGroupChatPrefix3"); static LLCachedControl chat_prefix_testing(gSavedSettings, "FSSupportGroupChatPrefixTesting"); if ((chat_prefix_support || chat_prefix_testing) && FSData::getInstance()->isFirestormGroup(mSessionID)) { @@ -427,9 +427,8 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type) #endif //RLV check - static LLCachedControl chat_prefix_rlv(gSavedSettings, "RestrainedLove"); std::string str_rlv_enabled = ""; - if(chat_prefix_rlv) + if(RlvHandler::isEnabled()) str_rlv_enabled = "*"; @@ -917,20 +916,23 @@ BOOL FSFloaterIM::postBuild() getChild("send_chat")->setCommitCallback(boost::bind(&FSFloaterIM::sendMsgFromInputEditor, this, CHAT_TYPE_NORMAL)); bool isFSSupportGroup = FSData::getInstance()->isFirestormGroup(mSessionID); - - childSetVisible("testing_panel", FSData::getInstance()->isTestingGroup(mSessionID)); - childSetVisible("support_panel", isFSSupportGroup); + bool isFSTestingGroup = FSData::getInstance()->isTestingGroup(mSessionID); + + //We can show the testing group button simply by checking testing group + childSetVisible("testing_panel", isFSTestingGroup); + //But we cannot with the support group button, because testing groups are also support groups + childSetVisible("support_panel", isFSSupportGroup && !isFSTestingGroup); // Viewer version popup - if (isFSSupportGroup) + if (isFSSupportGroup || isFSTestingGroup) { // check if the dialog was set to ignore - LLNotificationTemplatePtr templatep = LLNotifications::instance().getTemplate("FirstJoinSupportGroup"); + LLNotificationTemplatePtr templatep = LLNotifications::instance().getTemplate("FirstJoinSupportGroup2"); if (!templatep.get()->mForm->getIgnored()) { // if not, give the user a choice, whether to enable the version prefix or not LLSD args; - LLNotificationsUtil::add("FirstJoinSupportGroup", args, LLSD(),boost::bind(&FSFloaterIM::enableViewerVersionCallback, this, _1, _2)); + LLNotificationsUtil::add("FirstJoinSupportGroup2", args, LLSD(),boost::bind(&FSFloaterIM::enableViewerVersionCallback, this, _1, _2)); } } // Viewer version popup @@ -2181,7 +2183,8 @@ BOOL FSFloaterIM::enableViewerVersionCallback(const LLSD& notification,const LLS result=TRUE; } - gSavedSettings.setBOOL("FSSupportGroupChatPrefix2",result); + gSavedSettings.setBOOL("FSSupportGroupChatPrefix3",result); + gSavedSettings.setBOOL("FSSupportGroupChatPrefixTesting",result); return result; } // diff --git a/indra/newview/fspanelprofile.cpp b/indra/newview/fspanelprofile.cpp index b9f69adec7..f74e2f8e45 100644 --- a/indra/newview/fspanelprofile.cpp +++ b/indra/newview/fspanelprofile.cpp @@ -476,6 +476,12 @@ void FSPanelProfileSecondLife::fillCommonData(const LLAvatarData* avatar_data) mDescriptionEdit->setValue(avatar_data->about_text); mSecondLifePic->setValue(avatar_data->image_id); + LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(avatar_data->image_id); + if (!imagep->getFullHeight()) + { + imagep->forceToRefetchTexture(); + } + if (getSelfProfile()) { mShowInSearchCheckbox->setValue((BOOL)(avatar_data->flags & AVATAR_ALLOW_PUBLISH)); diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index 2fa1c60d12..6f924f50b3 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -78,14 +78,17 @@ fi export SDL_VIDEO_X11_DGAMOUSE=0 ## - Works around a problem with misconfigured 64-bit systems not finding GL -exportMutliArchDRIPath "i386" exportMutliArchDRIPath "amd64" + if [ -z ${LIBGL_DRIVERS_PATH} ] then - export LIBGL_DRIVERS_PATH="/usr/lib64/dri:/usr/lib32/dri:/usr/lib/dri:/usr/lib/i386-linux-gnu/dri:/usr/lib/x86_64-linux-gnu/dri" + export LIBGL_DRIVERS_PATH="/usr/lib64/dri:/usr/lib/dri:/usr/lib/x86_64-linux-gnu/dri" else - export LIBGL_DRIVERS_PATH="${LIBGL_DRIVERS_PATH}:/usr/lib64/dri:/usr/lib32/dri:/usr/lib/dri:/usr/lib/i386-linux-gnu/dri:/usr/lib/x86_64-linux-gnu/dri" + export LIBGL_DRIVERS_PATH="${LIBGL_DRIVERS_PATH}:/usr/lib64/dri:/usr/lib/dri:/usr/lib/x86_64-linux-gnu/dri" fi + +export LIBGL_DRIVERS_PATH="${LIBGL_DRIVERS_PATH}:/usr/lib64/xorg/modules/dri" + echo "LIBGL_DRIVERS_PATH is ${LIBGL_DRIVERS_PATH}" ## - The 'scim' GTK IM module widely crashes the viewer. Avoid it. diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index ec3e3301c6..0558869451 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -2992,13 +2992,26 @@ bool LLAgentCamera::isfollowCamLocked() BOOL LLAgentCamera::setPointAt(EPointAtType target_type, LLViewerObject *object, LLVector3 position) { - // Ansariel: Remember the current object point pointed at - we might need it later + // Remember the current object point pointed at - we might need it later mPointAtObject = object; + // Private point at + static LLCachedControl private_pointat(gSavedSettings, "PrivatePointAtTarget", false); + if (private_pointat) + { + if (mPointAt && !mPointAt->isDead()) + { + mPointAt->clearPointAtTarget(); + mPointAt->markDead(); + } + + return FALSE; + } + // + // disallow pointing at attachments and avatars //this is the editing arm motion - static LLCachedControl private_pointat(gSavedSettings, "PrivatePointAtTarget", false); - if (object && (object->isAttachment() || object->isAvatar() || private_pointat)) + if (object && (object->isAttachment() || object->isAvatar())) { return FALSE; } diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index 83a6e9f279..2e5b77a895 100644 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp @@ -125,11 +125,16 @@ BOOL LLViewerDynamicTexture::render() //----------------------------------------------------------------------------- void LLViewerDynamicTexture::preRender(BOOL clear_depth) { + // changes to support higher resolution rendering in the preview + ////only images up to 512x512 are supported + //llassert(mFullHeight <= 512); + //llassert(mFullWidth <= 512); gPipeline.allocatePhysicsBuffer(); llassert(mFullWidth <= static_cast(gPipeline.mPhysicsDisplay.getWidth())); llassert(mFullHeight <= static_cast(gPipeline.mPhysicsDisplay.getHeight())); if (gGLManager.mHasFramebufferObject && gPipeline.mPhysicsDisplay.isComplete() && !gGLManager.mIsATI) + // { //using offscreen render target, just use the bottom left corner mOrigin.set(0, 0); } @@ -216,9 +221,12 @@ BOOL LLViewerDynamicTexture::updateAllInstances() return TRUE; } + // changes to support higher resolution rendering in the preview + // bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI; bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mPhysicsDisplay.isComplete() && !gGLManager.mIsATI; if (use_fbo) { + // gPipeline.mWaterDis.bindTarget(); gPipeline.mPhysicsDisplay.bindTarget(); } // @@ -257,7 +265,10 @@ BOOL LLViewerDynamicTexture::updateAllInstances() if (use_fbo) { + // changes to support higher resolution rendering in the preview + // gPipeline.mWaterDis.flush(); gPipeline.mPhysicsDisplay.flush(); + // } return ret; diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp index 737c75fc7d..93fa43cd21 100644 --- a/indra/newview/llfloatersettingsdebug.cpp +++ b/indra/newview/llfloatersettingsdebug.cpp @@ -60,7 +60,7 @@ LLFloaterSettingsDebug::LLFloaterSettingsDebug(const LLSD& key) mCommitCallbackRegistrar.add("ClickDefault", boost::bind(&LLFloaterSettingsDebug::onClickDefault, this)); mCommitCallbackRegistrar.add("UpdateFilter", boost::bind(&LLFloaterSettingsDebug::onUpdateFilter, this)); mCommitCallbackRegistrar.add("ClickCopy", boost::bind(&LLFloaterSettingsDebug::onCopyToClipboard, this)); - mCommitCallbackRegistrar.add("ClickSanityIcon", boost::bind(&LLFloaterSettingsDebug::onSanityCheck, this)); + mCommitCallbackRegistrar.add("ClickSanityIcon", boost::bind(&LLFloaterSettingsDebug::onClickSanityWarning, this)); // make sure that the first filter update succeeds mOldSearchTerm = std::string("---"); @@ -249,6 +249,13 @@ void LLFloaterSettingsDebug::onSanityCheck() SanityCheck::instance().onSanity(mCurrentControlVariable); } +void LLFloaterSettingsDebug::onClickSanityWarning() +{ + // pass "true" to tell the sanity checker to pop up the warning, even when + // it was shown before and would be suppressed otherwise + SanityCheck::instance().onSanity(mCurrentControlVariable, true); +} + void LLFloaterSettingsDebug::onCommitSettings() { if (!mCurrentControlVariable) diff --git a/indra/newview/llfloatersettingsdebug.h b/indra/newview/llfloatersettingsdebug.h index 1c0c3ed3bf..f9d0a8af6d 100644 --- a/indra/newview/llfloatersettingsdebug.h +++ b/indra/newview/llfloatersettingsdebug.h @@ -60,6 +60,7 @@ public: void onClickDefault(); void onCopyToClipboard(); void onSanityCheck(); + void onClickSanityWarning(); static void showControl(const std::string& control); private: diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index dd68d247d9..cf8f890a3b 100644 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -514,6 +514,9 @@ BOOL LLHUDEffectLookAt::setLookAt(ELookAtType target_type, LLViewerObject *objec bool lookAtShouldClamp = s_EnableLimiter && (*mAttentions)[mTargetType].mName != "None" && (*mAttentions)[mTargetType].mName != "Idle" && + (*mAttentions)[mTargetType].mName != "Respond" && + (*mAttentions)[mTargetType].mName != "Conversation" && + (*mAttentions)[mTargetType].mName != "FreeLook" && (*mAttentions)[mTargetType].mName != "AutoListen"; if (!lookAtShouldClamp) //We do a similar but seperate calculation if we are doing limited distances diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 0a28e99955..e6d65f72b3 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -6821,6 +6821,37 @@ void handle_attachment_touch(const LLUUID& idItem) } // +// Texture Refresh on worn attachments +void handle_attachment_texture_refresh(const LLUUID& idItem) +{ + // get the associated worn attachment's UUID + const LLInventoryItem* pItem = gInventory.getItem(idItem); + if ( (!isAgentAvatarValid()) || (!pItem) ) + { + return; + } + + LLViewerObject* pAttachObj = gAgentAvatarp->getWornAttachment(pItem->getLinkedUUID()); + if (!pAttachObj) + return; + + // iterate through the list of child prims, call texture refresh on each one of them + LLViewerObject::const_child_list_t& children = pAttachObj->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = children.begin(); + iter != children.end(); iter++) + { + LLViewerObject* child = *iter; + + // NULL means, we don't have individual texture faces selected, + // so refresh them all + handle_object_tex_refresh(child, NULL); + } + + // texture refresh the root prim, too + handle_object_tex_refresh(pAttachObj, NULL); +} +// + // virtual void LLObjectBridge::performAction(LLInventoryModel* model, std::string action) { @@ -6867,6 +6898,12 @@ void LLObjectBridge::performAction(LLInventoryModel* model, std::string action) handle_attachment_touch(mUUID); } // + // Texture Refresh on worn attachments + else if ("texture_refresh_attachment" == action) + { + handle_attachment_texture_refresh(mUUID); + } + // else if (isRemoveAction(action)) { LLAppearanceMgr::instance().removeItemFromAvatar(mUUID); @@ -7057,6 +7094,13 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) if ( ((flags & FIRST_SELECTED_ITEM) == 0) || (!enable_attachment_touch(mUUID)) ) disabled_items.push_back(std::string("Touch Attachment")); + // Texture Refresh on worn attachments + if (item->getType() == LLAssetType::AT_OBJECT) + { + items.push_back(std::string("Texture Refresh Attachment")); + } + // + items.push_back(std::string("Detach From Yourself")); // [RLVa:KB] - Checked: 2010-02-27 (RLVa-1.2.0a) | Modified: RLVa-1.2.0a if ( (rlv_handler_t::isEnabled()) && (!gRlvAttachmentLocks.canDetach(item)) ) diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 6af410eda1..b27ce9b398 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -149,16 +149,44 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti if (item_id.isNull()) { mInventoryPanel->getRootFolder()->clearSelection(); + // Clear out the UUID instead of keeping the last value + getChild("TextureKey")->setText(LLUUID::null.asString()); + // } else { LLInventoryItem* itemp = gInventory.getItem(image_id); - if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID())) + // Texture UUID picker + //if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID())) + if (itemp) { - // no copy texture - getChild("apply_immediate_check")->setValue(FALSE); - mNoCopyTextureSelected = TRUE; + BOOL copy = itemp->getPermissions().allowCopyBy(gAgent.getID()); + BOOL mod = itemp->getPermissions().allowModifyBy(gAgent.getID()); + BOOL xfer = itemp->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()); + + if(!copy) + { + // no copy texture + getChild("apply_immediate_check")->setValue(FALSE); + mNoCopyTextureSelected = TRUE; + } + + //Verify permissions before revealing UUID. + //Replicates behaviour of "Copy UUID" on inventory. If you can't copy it there, you can't copy it here. + if(copy&&mod&&xfer) + { + getChild("TextureKey")->setText(image_id.asString()); + } + else + { + getChild("TextureKey")->setText(LLUUID::null.asString()); + } } + else + { + getChild("TextureKey")->setText(LLUUID::null.asString()); + } + // } if (set_selection) @@ -416,6 +444,9 @@ BOOL LLFloaterTexturePicker::postBuild() } getChild("Pipette")->setCommitCallback( boost::bind(&LLFloaterTexturePicker::onBtnPipette, this)); + // UUID picker + childSetAction("TextureKeyApply", LLFloaterTexturePicker::onBtnApplyTexture,this); + // childSetAction("Cancel", LLFloaterTexturePicker::onBtnCancel,this); childSetAction("Select", LLFloaterTexturePicker::onBtnSelect,this); @@ -655,6 +686,17 @@ void LLFloaterTexturePicker::onBtnRevert(void* userdata) self->mViewModel->resetDirty(); }*/ +// UUID texture picker +// static +void LLFloaterTexturePicker::onBtnApplyTexture(void* userdata) +{ + LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata; + self->setCanApply(true, true); + self->setImageID(LLUUID(self->getChild("TextureKey")->getText())); + self->commitIfImmediateSet(); +} +// + // static void LLFloaterTexturePicker::onBtnCancel(void* userdata) { @@ -715,16 +757,39 @@ void LLFloaterTexturePicker::onSelectionChange(const std::dequegetPermissions().allowCopyBy(gAgent.getID())) + // UUID texture picker uses extra permissions, so we do all the fancy stuff here + + BOOL copy = itemp->getPermissions().allowCopyBy(gAgent.getID()); + BOOL mod = itemp->getPermissions().allowModifyBy(gAgent.getID()); + BOOL xfer = itemp->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()); + + //if (!itemp->getPermissions().allowCopyBy(gAgent.getID())) + if (!copy) { mNoCopyTextureSelected = TRUE; } + // // FIRE-8298: Apply now checkbox has no effect setCanApply(true, true); // setImageID(itemp->getAssetUUID(),false); + + // UUID texture picker permissions continued + //We also have to set this here because above passes the asset ID, not the inventory ID. + //Verify permissions before revealing UUID. + //Replicates behaviour of "Copy UUID" on inventory. If you can't copy it there, you can't copy it here. + if(copy&&mod&&xfer) + { + getChild("TextureKey")->setText(itemp->getAssetUUID().asString()); + } + else + { + getChild("TextureKey")->setText(LLUUID::null.asString()); + } + // + mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here? - + if(!mPreviewSettingChanged) { mCanPreview = gSavedSettings.getBOOL("TextureLivePreview"); @@ -740,6 +805,12 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque Clear texture key when item cant be found + else + { + getChild("TextureKey")->setText(LLUUID::null.asString()); + } + // } } diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h index 24dc42cf48..612110aa1f 100644 --- a/indra/newview/lltexturectrl.h +++ b/indra/newview/lltexturectrl.h @@ -319,6 +319,9 @@ public: const LLUUID& getBlankImageAssetID() { return mBlankImageAssetID; } static void onBtnSetToDefault(void* userdata); + // UUID texture picker + static void onBtnApplyTexture(void* userdata); + // static void onBtnSelect(void* userdata); static void onBtnCancel(void* userdata); void onBtnPipette(); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index b78923209c..aea8916a77 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -3117,6 +3117,67 @@ void destroy_texture(const LLUUID& id) // will be used by the texture refresh f LLAppViewer::getTextureCache()->removeFromCache(id); } +void handle_object_tex_refresh(LLViewerObject* object, LLSelectNode* node) +{ + U8 te_count = object->getNumTEs(); + // map from texture ID to list of faces using it + typedef std::map< LLUUID, std::vector > map_t; + map_t faces_per_texture; + for (U8 i = 0; i < te_count; ++i) + { + // "node" will be NULL when invoked from inventory menu, + // otherwise it will hold the root node of the selection and we + // need to make sure only to refresh the selected faces + if (node && !node->isTESelected(i)) continue; + + LLViewerTexture* img = object->getTEImage(i); + faces_per_texture[img->getID()].push_back(i); + + if (object->getTE(i)->getMaterialParams().notNull()) + { + LLViewerTexture* norm_img = object->getTENormalMap(i); + faces_per_texture[norm_img->getID()].push_back(i); + + LLViewerTexture* spec_img = object->getTESpecularMap(i); + faces_per_texture[spec_img->getID()].push_back(i); + } + } + + map_t::iterator it; + for (it = faces_per_texture.begin(); it != faces_per_texture.end(); ++it) + { + destroy_texture(it->first); + } + + // Refresh sculpt texture + if (object->isSculpted()) + { + LLSculptParams *sculpt_params = (LLSculptParams *)object->getParameterEntry(LLNetworkData::PARAMS_SCULPT); + if (sculpt_params) + { + LLUUID sculpt_uuid = sculpt_params->getSculptTexture(); + + LLViewerFetchedTexture* tx = LLViewerTextureManager::getFetchedTexture(sculpt_uuid); + if (tx) + { + S32 num_volumes = tx->getNumVolumes(LLRender::SCULPT_TEX); + const LLViewerTexture::ll_volume_list_t* pVolumeList = tx->getVolumeList(LLRender::SCULPT_TEX); + + destroy_texture(sculpt_uuid); + + for (S32 idxVolume = 0; idxVolume < num_volumes; ++idxVolume) + { + LLVOVolume* pVolume = pVolumeList->at(idxVolume); + if (pVolume) + { + pVolume->notifyMeshLoaded(); + } + } + } + } + } +} + class LLObjectTexRefresh : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -3126,61 +3187,7 @@ class LLObjectTexRefresh : public view_listener_t iter != LLSelectMgr::getInstance()->getSelection()->valid_end(); iter++) { LLSelectNode* node = *iter; - - U8 te_count = node->getObject()->getNumTEs(); - // map from texture ID to list of faces using it - typedef std::map< LLUUID, std::vector > map_t; - map_t faces_per_texture; - for (U8 i = 0; i < te_count; ++i) - { - if (!node->isTESelected(i)) continue; - - LLViewerTexture* img = node->getObject()->getTEImage(i); - faces_per_texture[img->getID()].push_back(i); - - if (node->getObject()->getTE(i)->getMaterialParams().notNull()) - { - LLViewerTexture* norm_img = node->getObject()->getTENormalMap(i); - faces_per_texture[norm_img->getID()].push_back(i); - - LLViewerTexture* spec_img = node->getObject()->getTESpecularMap(i); - faces_per_texture[spec_img->getID()].push_back(i); - } - } - - map_t::iterator it; - for (it = faces_per_texture.begin(); it != faces_per_texture.end(); ++it) - { - destroy_texture(it->first); - } - - // Refresh sculpt texture - if (node->getObject()->isSculpted()) - { - LLSculptParams *sculpt_params = (LLSculptParams *)node->getObject()->getParameterEntry(LLNetworkData::PARAMS_SCULPT); - if (sculpt_params) - { - LLUUID sculpt_uuid = sculpt_params->getSculptTexture(); - - LLViewerFetchedTexture* tx = LLViewerTextureManager::getFetchedTexture(sculpt_uuid); - if (tx) - { - S32 num_volumes = tx->getNumVolumes(LLRender::SCULPT_TEX); - const LLViewerTexture::ll_volume_list_t* pVolumeList = tx->getVolumeList(LLRender::SCULPT_TEX); - - destroy_texture(sculpt_uuid); - - for (S32 idxVolume = 0; idxVolume < num_volumes; ++idxVolume) - { - LLVOVolume* pVolume = pVolumeList->at(idxVolume); - if (pVolume) - { - pVolume->notifyMeshLoaded(); - } - } - } - } - } + handle_object_tex_refresh(node->getObject(),node); } return true; diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index d40dcdfce4..b84d55ff83 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -38,6 +38,7 @@ class LLView; class LLParcelSelection; class LLObjectSelection; class LLSelectNode; +class LLViewerObject; // [RLVa:KB] - Checked: RLVa-2.0.0 void set_use_wireframe(bool useWireframe); @@ -103,6 +104,7 @@ void handle_object_build(void*); void handle_object_touch(); bool enable_object_open(); void handle_object_open(); +void handle_object_tex_refresh(LLViewerObject* object, LLSelectNode* node); bool visible_take_object(); bool tools_visible_take_object(); diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 3bc2f78f54..7b0be41620 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1325,8 +1325,14 @@ void LLVOAvatarSelf::idleUpdateTractorBeam() { LLColor4U rgb = gLggBeamMaps.getCurrentColor(LLColor4U(gAgent.getEffectColor())); + // Private point at + static LLCachedControl private_pointat(gSavedSettings, "PrivatePointAtTarget", false); + // This is only done for yourself (maybe it should be in the agent?) - if (!needsRenderBeam() || !isBuilt()) + // Private point at + //if (!needsRenderBeam() || !isBuilt()) + if (!needsRenderBeam() || !isBuilt() || private_pointat) + // { mBeam = NULL; gLggBeamMaps.stopBeamChat(); diff --git a/indra/newview/sanitycheck.cpp b/indra/newview/sanitycheck.cpp index 547503d7b0..6044e36bf4 100644 --- a/indra/newview/sanitycheck.cpp +++ b/indra/newview/sanitycheck.cpp @@ -22,11 +22,14 @@ #include "llviewerprecompiledheaders.h" #include "llcontrol.h" +#include "llnotifications.h" #include "llnotificationsutil.h" #include "lltrans.h" #include "llviewercontrol.h" #include "sanitycheck.h" +#define SANITY_CHECK "SanityCheck" // name of the notification we display + void SanityCheck::init() { struct f : public LLControlGroup::ApplyFunctor @@ -37,7 +40,7 @@ void SanityCheck::init() { if (control->getSanityType() != SANITY_TYPE_NONE) { - control->getSanitySignal()->connect(boost::bind(&SanityCheck::onSanity, _1)); + control->getSanitySignal()->connect(boost::bind(&SanityCheck::onSanity, _1, false)); SanityCheck::instance().onSanity(control); } } @@ -48,19 +51,28 @@ void SanityCheck::init() } // static -void SanityCheck::onSanity(LLControlVariable* controlp) +void SanityCheck::onSanity(LLControlVariable* controlp, bool disregardLastControl /*= false*/) { - static LLControlVariable* lastControl = NULL; + static LLControlVariable* lastControl = nullptr; if (controlp->isSane()) + { return; + } - if (controlp == lastControl) + if (disregardLastControl) + { + // clear "ignored" status for this control, so it can actually show up + LLNotifications::instance().setIgnored(SANITY_CHECK, false); + } + else if (controlp == lastControl) + { return; + } lastControl = controlp; - std::string checkType = "SanityCheck" + LLControlGroup::sanityTypeEnumToString(controlp->getSanityType()); + std::string checkType = SANITY_CHECK + LLControlGroup::sanityTypeEnumToString(controlp->getSanityType()); std::vector sanityValues = controlp->getSanityValues(); LLSD args; @@ -71,7 +83,7 @@ void SanityCheck::onSanity(LLControlVariable* controlp) args["SANITY_MESSAGE"] = LLTrans::getString(checkType, map); args["SANITY_COMMENT"] = controlp->getSanityComment(); args["CURRENT_VALUE"] = controlp->getValue().asString(); - LLNotificationsUtil::add("SanityCheck", args, LLSD(), boost::bind(SanityCheck::onFixIt, _1, _2, controlp)); + LLNotificationsUtil::add(SANITY_CHECK, args, LLSD(), boost::bind(SanityCheck::onFixIt, _1, _2, controlp)); } void SanityCheck::onFixIt(const LLSD& notification, const LLSD& response, LLControlVariable* controlp) diff --git a/indra/newview/sanitycheck.h b/indra/newview/sanitycheck.h index d2faf23ea8..c5c66b6cb3 100644 --- a/indra/newview/sanitycheck.h +++ b/indra/newview/sanitycheck.h @@ -34,7 +34,7 @@ class SanityCheck : public LLSingleton public: void init(); - static void onSanity(LLControlVariable* controlp); + static void onSanity(LLControlVariable* controlp, bool disregardLastControl = false); static void onFixIt(const LLSD& notification, const LLSD& response, LLControlVariable* controlp); }; diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index c02a1cc425..891716ac24 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -804,6 +804,7 @@ with the same filename but different name + diff --git a/indra/newview/skins/default/textures/toolbar_icons/stop_animations.png b/indra/newview/skins/default/textures/toolbar_icons/stop_animations.png new file mode 100644 index 0000000000..978ed2ddce Binary files /dev/null and b/indra/newview/skins/default/textures/toolbar_icons/stop_animations.png differ diff --git a/indra/newview/skins/default/xui/de/floater_fs_im_session.xml b/indra/newview/skins/default/xui/de/floater_fs_im_session.xml index 20fd70b615..694ed38c7b 100644 --- a/indra/newview/skins/default/xui/de/floater_fs_im_session.xml +++ b/indra/newview/skins/default/xui/de/floater_fs_im_session.xml @@ -46,10 +46,10 @@