diff --git a/doc/contributions.txt b/doc/contributions.txt index 9dc0423f5c..6e355816ae 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -187,6 +187,7 @@ Ansariel Hiller STORM-1979 STORM-2105 MAINT-5533 + MAINT-5756 Aralara Rajal Arare Chantilly CHUIBUG-191 @@ -769,6 +770,7 @@ Kitty Barnett STORM-1905 VWR-24217 STORM-1804 + MAINT-5416 Kolor Fall Komiko Okamoto Korvel Noh diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index 8ccfcd2adb..76e7166db0 100755 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -289,7 +289,7 @@ if (DARWIN) add_definitions(-DLL_DARWIN=1) set(CMAKE_CXX_LINK_FLAGS "-Wl,-no_compact_unwind -Wl,-headerpad_max_install_names,-search_paths_first") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_LINK_FLAGS}") - set(DARWIN_extra_cstar_flags "-g") + set(DARWIN_extra_cstar_flags "-g -Wno-unused-local-typedef -Wno-deprecated-declarations") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${DARWIN_extra_cstar_flags}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${DARWIN_extra_cstar_flags}") # NOTE: it's critical that the optimization flag is put in front. diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 007d4588e0..50c912053c 100755 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -150,10 +150,10 @@ endif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(DARWIN 1) - # now we only support Xcode 6.0 using 10.9 (Mavericks), minimum OS 10.7 (Lion) - set(XCODE_VERSION 6.0) + # now we only support Xcode 7.0 using 10.11 (El Capitan), minimum OS 10.7 (Lion) + set(XCODE_VERSION 7.0) set(CMAKE_OSX_DEPLOYMENT_TARGET 10.7) - set(CMAKE_OSX_SYSROOT macosx10.9) + set(CMAKE_OSX_SYSROOT macosx10.11) set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "com.apple.compilers.llvm.clang.1_0") set(CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL 3) diff --git a/indra/llcommon/llprocess.cpp b/indra/llcommon/llprocess.cpp index 715df36f39..e0aa30cc1a 100755 --- a/indra/llcommon/llprocess.cpp +++ b/indra/llcommon/llprocess.cpp @@ -738,8 +738,11 @@ LLProcess::LLProcess(const LLSDOrParams& params): { mPipes.replace(i, new ReadPipeImpl(desc, pipe, FILESLOT(i))); } - LL_DEBUGS("LLProcess") << "Instantiating " << typeid(mPipes[i]).name() - << "('" << desc << "')" << LL_ENDL; + // Removed temporaily for Xcode 7 build tests: error was: + // "error: expression with side effects will be evaluated despite + // being used as an operand to 'typeid' [-Werror,-Wpotentially-evaluated-expression]"" + //LL_DEBUGS("LLProcess") << "Instantiating " << typeid(mPipes[i]).name() + // << "('" << desc << "')" << LL_ENDL; } } diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index b8e999a702..753e24159a 100755 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -705,77 +705,102 @@ GLint LLGLSLShader::mapUniformTextureChannel(GLint location, GLenum type) BOOL LLGLSLShader::mapUniforms(const vector * uniforms) { - BOOL res = TRUE; - - mTotalUniformSize = 0; - mActiveTextureChannels = 0; - mUniform.clear(); - mUniformMap.clear(); - mUniformNameMap.clear(); - mTexture.clear(); - mValue.clear(); - //initialize arrays - U32 numUniforms = (uniforms == NULL) ? 0 : uniforms->size(); - mUniform.resize(numUniforms + LLShaderMgr::instance()->mReservedUniforms.size(), -1); - mTexture.resize(numUniforms + LLShaderMgr::instance()->mReservedUniforms.size(), -1); - - bind(); + BOOL res = TRUE; - //get the number of active uniforms - GLint activeCount; - glGetObjectParameterivARB(mProgramObject, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &activeCount); + mTotalUniformSize = 0; + mActiveTextureChannels = 0; + mUniform.clear(); + mUniformMap.clear(); + mUniformNameMap.clear(); + mTexture.clear(); + mValue.clear(); + //initialize arrays + U32 numUniforms = (uniforms == NULL) ? 0 : uniforms->size(); + mUniform.resize(numUniforms + LLShaderMgr::instance()->mReservedUniforms.size(), -1); + mTexture.resize(numUniforms + LLShaderMgr::instance()->mReservedUniforms.size(), -1); + + bind(); + + //get the number of active uniforms + GLint activeCount; + glGetObjectParameterivARB(mProgramObject, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &activeCount); //........................................................................................................................................ //........................................................................................ /* EXPLANATION: - This is part of code is temporary because as the final result the mapUniform() should be rewrited. - But it's a huge a volume of work which is need to be a more carefully performed for avoid possible + This is part of code is temporary because as the final result the mapUniform() should be rewrited. + But it's a huge a volume of work which is need to be a more carefully performed for avoid possible regression's (i.e. it should be formalized a separate ticket in JIRA). RESON: - The reason of this code is that SL engine is very sensitive to fact that "diffuseMap" should be appear - first as uniform parameter which is should get 0-"texture channel" index (see mapUniformTextureChannel() and mActiveTextureChannels) + The reason of this code is that SL engine is very sensitive to fact that "diffuseMap" should be appear + first as uniform parameter which is should get 0-"texture channel" index (see mapUniformTextureChannel() and mActiveTextureChannels) it influence to which is texture matrix will be updated during rendering. But, order of indexe's of uniform variables is not defined and GLSL compiler can change it as want , even if the "diffuseMap" will be appear and use first in shader code. As example where this situation appear see: "Deferred Material Shader 28/29/30/31" - And tickets: MAINT-4165, MAINT-4839 + And tickets: MAINT-4165, MAINT-4839, MAINT-3568 */ - + S32 diffuseMap = glGetUniformLocationARB(mProgramObject, "diffuseMap"); S32 bumpMap = glGetUniformLocationARB(mProgramObject, "bumpMap"); + S32 environmentMap = glGetUniformLocationARB(mProgramObject, "environmentMap"); std::set skip_index; - if(diffuseMap != -1 && bumpMap != -1) + if (-1 != diffuseMap && (-1 != bumpMap || -1 != environmentMap)) { GLenum type; GLsizei length; GLint size = -1; - char name[1024]; + char name[1024]; + + diffuseMap = bumpMap = environmentMap = -1; - //diffuse map for (S32 i = 0; i < activeCount; i++) { - name[0] = 0; - + name[0] = '\0'; + glGetActiveUniformARB(mProgramObject, i, 1024, &length, &size, &type, (GLcharARB *)name); - if(std::string(name) == "diffuseMap") { + if (-1 == diffuseMap && std::string(name) == "diffuseMap") + { diffuseMap = i; + continue; } - if(std::string(name) == "bumpMap") { + if (-1 == bumpMap && std::string(name) == "bumpMap") + { bumpMap = i; + continue; + } + + if (-1 == environmentMap && std::string(name) == "environmentMap") + { + environmentMap = i; + continue; } } - - if(bumpMap < diffuseMap) + + bool bumpLessDiff = bumpMap < diffuseMap && -1 != bumpMap; + bool envLessDiff = environmentMap < diffuseMap && -1 != environmentMap; + + if (bumpLessDiff && envLessDiff) + { + mapUniform(diffuseMap, uniforms); + mapUniform(bumpMap, uniforms); + mapUniform(environmentMap, uniforms); + + skip_index.insert(diffuseMap); + skip_index.insert(bumpMap); + skip_index.insert(environmentMap); + } + else if (bumpLessDiff) { mapUniform(diffuseMap, uniforms); mapUniform(bumpMap, uniforms); @@ -783,26 +808,35 @@ BOOL LLGLSLShader::mapUniforms(const vector * uniforms) skip_index.insert(diffuseMap); skip_index.insert(bumpMap); } + else if (envLessDiff) + { + mapUniform(diffuseMap, uniforms); + mapUniform(environmentMap, uniforms); + + skip_index.insert(diffuseMap); + skip_index.insert(environmentMap); + } } //........................................................................................ - - for (S32 i = 0; i < activeCount; i++) - { + + for (S32 i = 0; i < activeCount; i++) + { //........................................................................................ - if(skip_index.end() != skip_index.find(i)) continue; + if (skip_index.end() != skip_index.find(i)) continue; //........................................................................................ - - mapUniform(i, uniforms); - } + + mapUniform(i, uniforms); + } //........................................................................................................................................ - unbind(); + unbind(); - LL_DEBUGS("ShaderLoading") << "Total Uniform Size: " << mTotalUniformSize << LL_ENDL; - return res; + LL_DEBUGS("ShaderLoading") << "Total Uniform Size: " << mTotalUniformSize << LL_ENDL; + return res; } + BOOL LLGLSLShader::link(BOOL suppress_errors) { BOOL success = LLShaderMgr::instance()->linkProgramObject(mProgramObject, suppress_errors); diff --git a/indra/llui/llkeywords.cpp b/indra/llui/llkeywords.cpp index 19866c9960..784e023239 100755 --- a/indra/llui/llkeywords.cpp +++ b/indra/llui/llkeywords.cpp @@ -319,7 +319,7 @@ void LLKeywords::processTokensGroup(const LLSD& tokens, const std::string& group } color_group = getColorGroup(group); - LL_INFOS("SyntaxLSL") << "Group: '" << group << "', using color: '" << color_group << "'" << LL_ENDL; + LL_DEBUGS("SyntaxLSL") << "Group: '" << group << "', using color: '" << color_group << "'" << LL_ENDL; if (tokens.isMap()) { @@ -354,7 +354,14 @@ void LLKeywords::processTokensGroup(const LLSD& tokens, const std::string& group switch (token_type) { case LLKeywordToken::TT_CONSTANT: - color_group = getColorGroup(group + "-" + getAttribute("type")); + if (getAttribute("type").length() > 0) + { + color_group = getColorGroup(group + "-" + getAttribute("type")); + } + else + { + color_group = getColorGroup(group); + } tooltip = "Type: " + getAttribute("type") + ", Value: " + getAttribute("value"); break; case LLKeywordToken::TT_EVENT: diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index efdd0ffb91..7a4709cdb8 100755 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -523,7 +523,10 @@ std::string LLUrlEntrySLURL::getLocation(const std::string &url) const // LLUrlEntrySecondlifeURL::LLUrlEntrySecondlifeURL() { - mPattern = boost::regex("https?://([-\\w\\.]*\\.)?(secondlife|lindenlab)\\.com(:\\d{1,5})?\\/\\S*", + mPattern = boost::regex("((http://([-\\w\\.]*\\.)?(secondlife|lindenlab)\\.com)" + "|" + "(https://([-\\w\\.]*\\.)?(secondlife|lindenlab)\\.com(:\\d{1,5})?))" + "\\/\\S*", boost::regex::perl|boost::regex::icase); mIcon = "Hand"; diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index d496f9b353..dac959c2b3 100755 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -45,11 +45,8 @@ LLUrlRegistry::LLUrlRegistry() // [/RLVa:KB] // Urls are matched in the order that they were registered - // Fix the "nolink>" fail; Fix from Alchemy viewer, courtesy of Drake Arconis - //registerUrl(new LLUrlEntryNoLink()); mUrlEntryNoLink = new LLUrlEntryNoLink(); registerUrl(mUrlEntryNoLink); - // mUrlEntryIcon = new LLUrlEntryIcon(); registerUrl(mUrlEntryIcon); mLLUrlEntryInvalidSLURL = new LLUrlEntryInvalidSLURL(); @@ -276,7 +273,6 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL // did we find a match? if so, return its details in the match object if (match_entry) { - // Skip if link is an email with an empty username (starting with @). See MAINT-5371. if (match_start > 0 && text.substr(match_start - 1, 1) == "@") return false; @@ -285,7 +281,8 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL std::string url = text.substr(match_start, match_end - match_start + 1); LLUrlEntryBase *stripped_entry = NULL; - if(LLStringUtil::containsNonprintable(url)) + if((match_entry != mUrlEntryNoLink) && (match_entry != mUrlEntryHTTPLabel) && (match_entry !=mUrlEntrySLLabel) + && LLStringUtil::containsNonprintable(url)) { LLStringUtil::stripNonprintable(url); diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h index 7fc1c06cb1..43132d17d7 100755 --- a/indra/llui/llurlregistry.h +++ b/indra/llui/llurlregistry.h @@ -98,7 +98,6 @@ private: LLUrlEntryBase* mLLUrlEntryInvalidSLURL; LLUrlEntryBase* mUrlEntryHTTPLabel; LLUrlEntryBase* mUrlEntrySLLabel; - // Fix the "nolink>" fail; Fix from Alchemy viewer, courtesy of Drake Arconis LLUrlEntryBase* mUrlEntryNoLink; // Normalize only trusted URL LLUrlEntryBase* mUrlEntryTrustedUrl; diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp index 96e94c0f80..dde54c78c4 100755 --- a/indra/llui/tests/llurlentry_test.cpp +++ b/indra/llui/tests/llurlentry_test.cpp @@ -838,17 +838,21 @@ namespace tut "search something https://marketplace.secondlife.com/products/search on marketplace and test the https", "https://marketplace.secondlife.com/products/search"); - testRegex("match urls with port", url, - "let's specify some port http://secondlife.com:888/status", - "http://secondlife.com:888/status"); + testRegex("match HTTPS urls with port", url, + "let's specify some port https://secondlife.com:888/status", + "https://secondlife.com:888/status"); + + testRegex("don't match HTTP urls with port", url, + "let's specify some port for HTTP http://secondlife.com:888/status", + ""); testRegex("don't match urls w/o protocol", url, "looks like an url something www.marketplace.secondlife.com/products but no https prefix", ""); testRegex("but with a protocol www is fine", url, - "so let's add a protocol http://www.marketplace.secondlife.com:8888/products", - "http://www.marketplace.secondlife.com:8888/products"); + "so let's add a protocol https://www.marketplace.secondlife.com:8888/products", + "https://www.marketplace.secondlife.com:8888/products"); testRegex("don't match urls w/o protocol", url, "and even no www something secondlife.com/status", diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm index b0e8ea6cf3..5315e1b488 100644 --- a/indra/llwindow/llopenglview-objc.mm +++ b/indra/llwindow/llopenglview-objc.mm @@ -248,7 +248,11 @@ attributedStringInfo getSegments(NSAttributedString *str) // { // [glContext setValues:(const GLint*)1 forParameter:NSOpenGLCPSwapInterval]; // } else { - // [glContext setValues:(const GLint*)0 forParameter:NSOpenGLCPSwapInterval]; + // // supress this error after move to Xcode 7: + // // error: null passed to a callee that requires a non-null argument [-Werror,-Wnonnull] + // // Tried using ObjC 'nonnull' keyword as per SO article but didn't build + // GLint swapInterval=0; + // [glContext setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval]; // } GLint glVsync = 0; diff --git a/indra/newview/app_settings/keywords_lsl_default.xml b/indra/newview/app_settings/keywords_lsl_default.xml index 5d9cb37a3a..dc1efb7a5f 100755 --- a/indra/newview/app_settings/keywords_lsl_default.xml +++ b/indra/newview/app_settings/keywords_lsl_default.xml @@ -2314,6 +2314,15 @@ tooltip Gets the attachment point to which the object is attached.\nReturns 0 if the object is not an attachment (or is an avatar, etc). + OBJECT_BODY_SHAPE_TYPE + + type + integer + value + 26 + tooltip + This is a flag used with llGetObjectDetails to get the body type of the avatar, based on shape data.\nIf no data is available, -1.0 is returned.\nThis is normally between 0 and 1.0, with 0.5 and larger considered 'male' + OBJECT_CHARACTER_TIME type @@ -2323,6 +2332,15 @@ tooltip Units in seconds + OBJECT_CLICK_ACTION + + type + integer + value + 28 + tooltip + This is a flag used with llGetObjectDetails to get the click action.\nThe default is 0 + OBJECT_CREATOR type @@ -2350,6 +2368,24 @@ tooltip Gets the prims's group key. If id is an avatar, a NULL_KEY is returned. + OBJECT_HOVER_HEIGHT + + type + integer + value + 25 + tooltip + This is a flag used with llGetObjectDetails to get hover height of the avatar\nIf no data is available, 0.0 is returned. + + OBJECT_LAST_OWNER_ID + + type + integer + value + 27 + tooltip + Gets the object's last owner ID. + OBJECT_NAME type @@ -3277,6 +3313,51 @@ tooltip Play animation going forwards, then backwards. + PRIM_ALPHA_MODE + + type + integer + value + 38 + tooltip + Prim parameter for materials using integer face, integer alpha_mode, integer alpha_cutoff.\nDefines how the alpha channel of the diffuse texture should be rendered.\nValid options for alpha_mode are PRIM_ALPHA_MODE_BLEND, _NONE, _MASK, and _EMISSIVE.\nalpha_cutoff is used only for PRIM_ALPHA_MODE_MASK. + + PRIM_ALPHA_MODE_NONE + + type + integer + value + 0 + tooltip + Prim parameter setting for PRIM_ALPHA_MODE.\nIndicates that the diffuse texture's alpha channel should be ignored. + + PRIM_ALPHA_MODE_BLEND + + type + integer + value + 1 + tooltip + Prim parameter setting for PRIM_ALPHA_MODE.\nIndicates that the diffuse texture's alpha channel should be rendered as alpha-blended. + + PRIM_ALPHA_MODE_MASK + + type + integer + value + 2 + tooltip + Prim parameter setting for PRIM_ALPHA_MODE.\nIndicates that the diffuse texture's alpha channel should be rendered as fully opaque for alpha values above alpha_cutoff and fully transparent otherwise. + + PRIM_ALPHA_MODE_EMISSIVE + + type + integer + value + 3 + tooltip + Prim parameter setting for PRIM_ALPHA_MODE.\nIndicates that the diffuse texture's alpha channel should be rendered as an emissivity mask. + PRIM_BUMP_BARK type @@ -3882,6 +3963,15 @@ tooltip + PRIM_NORMAL + + type + integer + value + 37 + tooltip + Prim parameter for materials using integer face, string texture, vector repeats, vector offsets, float rotation_in_radians + PRIM_OMEGA type @@ -4108,6 +4198,15 @@ tooltip + PRIM_SPECULAR + + type + integer + value + 36 + tooltip + Prim parameter for materials using integer face, string texture, vector repeats, vector offsets, float rotation_in_radians, vector color, integer glossy, integer environment + PRIM_TEMP_ON_REZ type @@ -5020,6 +5119,15 @@ tooltip + REGION_FLAG_BLOCK_FLYOVER + + type + integer + value + 0x8000000 + tooltip + + REGION_FLAG_BLOCK_TERRAFORM type @@ -5979,6 +6087,177 @@ tooltip + XP_ERROR_EXPERIENCES_DISABLED + + type + integer + value + 2 + tooltip + The region currently has experiences disabled. + + XP_ERROR_EXPERIENCE_DISABLED + + type + integer + value + 8 + tooltip + The experience owner has temporarily disabled the experience. + + XP_ERROR_EXPERIENCE_SUSPENDED + + type + integer + value + 9 + tooltip + The experience has been suspended by Linden Customer Support. + + XP_ERROR_INVALID_EXPERIENCE + + type + integer + value + 7 + tooltip + The script is associated with an experience that no longer exists. + + XP_ERROR_INVALID_PARAMETERS + + type + integer + value + 3 + tooltip + One of the string arguments was too big to fit in the key-value store. + + XP_ERROR_KEY_NOT_FOUND + + type + integer + value + 14 + tooltip + The requested key does not exist. + + XP_ERROR_MATURITY_EXCEEDED + + type + integer + value + 16 + tooltip + The content rating of the experience exceeds that of the region. + + XP_ERROR_NONE + + type + integer + value + 0 + tooltip + No error was detected. + + XP_ERROR_NOT_FOUND + + type + integer + value + 6 + tooltip + The sim was unable to verify the validity of the experience. Retrying after a short wait is advised. + + XP_ERROR_NOT_PERMITTED + + type + integer + value + 4 + tooltip + This experience is not allowed to run by the requested agent. + + XP_ERROR_NOT_PERMITTED_LAND + + type + integer + value + 17 + tooltip + This experience is not allowed to run on the current region. + + XP_ERROR_NO_EXPERIENCE + + type + integer + value + 5 + tooltip + This script is not associated with an experience. + + XP_ERROR_QUOTA_EXCEEDED + + type + integer + value + 11 + tooltip + An attempted write data to the key-value store failed due to the data quota being met. + + LSL_XP_ERROR_REQUEST_PERM_TIMEOUT + + type + integer + value + 18 + tooltip + The request for experience permissions was ignored and timed out. + + XP_ERROR_RETRY_UPDATE + + type + integer + value + 15 + tooltip + A checked update failed due to an out of date request. + + XP_ERROR_STORAGE_EXCEPTION + + type + integer + value + 13 + tooltip + Unable to communicate with the key-value store. + + XP_ERROR_STORE_DISABLED + + type + integer + value + 12 + tooltip + The key-value store is currently disabled on this region. + + XP_ERROR_THROTTLED + + type + integer + value + 1 + tooltip + The call failed due to too many recent calls. + + XP_ERROR_UNKNOWN_ERROR + + type + integer + value + 10 + tooltip + Other unknown error. + ZERO_ROTATION type @@ -6280,6 +6559,34 @@ This event is triggered when an email sent to this script arrives. The number remaining tells how many more emails are known to be still pending. + experience_permissions + + arguments + + agent_id + + type + key + tooltip + ID of the agent approving permission for the Experience. + + + + experience_permissions_denied + + arguments + + agent_id + + type + key + tooltip + ID of the agent denying permission for the Experience. + + + tooltip + One of the XP_ERROR_... constants describing the reason why the Experience permissions were denied for the agent. + http_request arguments @@ -6965,6 +7272,29 @@ tooltip Adjusts the volume (0.0 - 1.0) of the currently playing attached sound.\nThis function has no effect on sounds started with llTriggerSound. + llAgentInExperience + + energy + 10.0 + sleep + 0.0 + return + integer + arguments + + AgentID + + type + key + tooltip + + + + tooltip + + Returns TRUE if the agent is in the Experience and the Experience can run in the current location. + + llAllowInventoryDrop energy @@ -7696,6 +8026,36 @@ tooltip Convert link-set to AI/Physics character.\nCreates a path-finding entity, known as a "character", from the object containing the script. Required to activate use of path-finding functions.\nOptions is a list of key/value pairs. + llCreateKeyValue + + energy + 10.0 + sleep + 0.0 + return + key + arguments + + Key + + type + string + tooltip + + + Value + + type + string + tooltip + + + + tooltip + + Starts an asychronous transaction to create a key-value pair. Will fail with XP_ERROR_STORAGE_EXCEPTION if the key already exists. The dataserver callback will be executed with the key returned from this call and a string describing the result. The result is a two element commma-delimited list. The first item is an integer specifying if the transaction succeeded (1) or not (0). In the failure case, the second item will be an integer corresponding to one of the XP_ERROR_... constants. In the success case the second item will be the value passed to the function. + + llCreateLink energy @@ -7751,6 +8111,21 @@ tooltip Create a list from a string of comma separated values specified in Text. + llDataSizeKeyValue + + energy + 10.0 + sleep + 0.0 + return + key + arguments + + tooltip + + Starts an asychronous transaction the request the used and total amount of data allocated for the Experience. The dataserver callback will be executed with the key returned from this call and a string describing the result. The result is commma-delimited list. The first item is an integer specifying if the transaction succeeded (1) or not (0). In the failure case, the second item will be an integer corresponding to one of the XP_ERROR_... constants. In the success case the second item will be the the amount in use and the third item will be the total available. + + llDeleteCharacter energy @@ -7764,6 +8139,29 @@ tooltip Convert link-set from AI/Physics character to Physics object.\nConvert the current link-set back to a standard object, removing all path-finding properties. + llDeleteKeyValue + + energy + 10.0 + sleep + 0.0 + return + key + arguments + + Key + + type + string + tooltip + + + + tooltip + + Starts an asychronous transaction to delete a key-value pair. The dataserver callback will be executed with the key returned from this call and a string describing the result. The result is a two element commma-delimited list. The first item is an integer specifying if the transaction succeeded (1) or not (0). In the failure case, the second item will be an integer corresponding to one of the XP_ERROR_... constants. In the success case the second item will be the value associated with the key. + + llDeleteSubList energy @@ -8915,7 +9313,30 @@ arguments tooltip - Returns the object's attachment point, or 0 if not attached.\nReturns the object attachment point, or 0 if not attached. + Returns the object's attachment point, or 0 if not attached. + + llGetAttachedList + + energy + 10.0 + sleep + 0.0 + return + list + arguments + + + ID + + type + key + tooltip + Avatar to get attachments + + + + tooltip + Returns a list of keys of all visible (not HUD) attachments on the avatar identified by the ID argument llGetBoundingBox @@ -9119,6 +9540,52 @@ tooltip Returns a string with the requested data about the region. + llGetExperienceDetails + + energy + 10.0 + sleep + 0.0 + return + list + arguments + + ExperienceID + + type + key + tooltip + May be NULL_KEY to retrieve the details for the script's Experience + + + tooltip + + Returns a list with the following Experience properties: [Experience Name, Owner ID, Group ID, Experience ID, State, State Message]. State is an integer corresponding to one of the constants XP_ERROR_... and State Message is the string returned by llGetExperienceErrorMessage for that integer. + + + llGetExperienceErrorMessage + + energy + 10.0 + sleep + 0.0 + return + string + arguments + + Error + + type + integer + tooltip + An Experience error code to translate. + + + tooltip + + Returns a string describing the error code passed or the string corresponding with XP_ERROR_UNKNOWN_ERROR if the value is not a valid Experience error code. + + llGetForce energy @@ -11446,6 +11913,51 @@ tooltip Returns the name of the prim or avatar specified by ID. The ID must be a valid rezzed prim or avatar key in the current simulator, otherwise an empty string is returned.\nFor avatars, the returned name is the legacy name + llKeyCountKeyValue + + energy + 10.0 + sleep + 0.0 + return + key + arguments + + tooltip + + Starts an asychronous transaction the request the number of keys in the data store. The dataserver callback will be executed with the key returned from this call and a string describing the result. The result is commma-delimited list. The first item is an integer specifying if the transaction succeeded (1) or not (0). In the failure case, the second item will be an integer corresponding to one of the XP_ERROR_... constants. In the success case the second item will the the number of keys in the system. + + + llKeysKeyValue + + energy + 10.0 + sleep + 0.0 + return + key + arguments + + First + + type + string + tooltip + Index of the first key to return. + + Count + + type + string + tooltip + The number of keys to return. + + + tooltip + + Starts an asychronous transaction the request a number of keys from the data store. The dataserver callback will be executed with the key returned from this call and a string describing the result. The result is commma-delimited list. The first item is an integer specifying if the transaction succeeded (1) or not (0). In the failure case, the second item will be an integer corresponding to one of the XP_ERROR_... constants. The error XP_ERROR_KEY_NOT_FOUND is returned if First is greater than or equal to the number of keys in the data store. In the success case the subsequent items will be the keys requested. The number of keys returned may be less than requested if the return value is too large or if there is not enough keys remaining. The order keys are returned is not guaranteed but is stable between subsequent calls as long as no keys are added or removed. Because the keys are returned in a comma-delimited list it is not recommended to use commas in key names if this function is used. + + llLinkParticleSystem energy @@ -13577,6 +14089,29 @@ tooltip Applies Impulse and AngularImpulse to ObjectID.\nApplies the supplied impulse and angular impulse to the object specified. + llReadKeyValue + + energy + 10.0 + sleep + 0.0 + return + key + arguments + + Key + + type + string + tooltip + + + + tooltip + + Starts an asychronous transaction to retrieve the value associated with the key given. Will fail with XP_ERROR_KEY_NOT_FOUND if the key does not exist. The dataserver callback will be executed with the key returned from this call and a string describing the result. The result is a two element commma-delimited list. The first item is an integer specifying if the transaction succeeded (1) or not (0). In the failure case, the second item will be an integer corresponding to one of the XP_ERROR_... constants. In the success case the second item will be the value associated with the key. + + llRefreshPrimURL energy @@ -13997,6 +14532,36 @@ tooltip Requests the display name of the agent. When the display name is available the dataserver event will be raised.\nThe avatar identified does not need to be in the same region or online at the time of the request.\nReturns a key that is used to identify the dataserver event when it is raised. + llRequestExperiencePermissions + + energy + 10.0 + sleep + 0.0 + return + void + arguments + + AvatarID + + type + key + tooltip + + + unused + + type + string + tooltip + Not used, should be "" + + + tooltip + + Ask the agent for permission to participate in an experience. This request is similar to llRequestPermissions with the following permissions: PERMISSION_TAKE_CONTROLS, PERMISSION_TRIGGER_ANIMATION, PERMISSION_ATTACH, PERMISSION_TRACK_CAMERA, PERMISSION_CONTROL_CAMERA and PERMISSION_TELEPORT. However, unlike llRequestPermissions the decision to allow or block the request is persistent and applies to all scripts using the experience grid wide. Subsequent calls to llRequestExperiencePermissions from scripts in the experience will receive the same response automatically with no user interaction. One of experience_permissions or experience_permissions_denied will be generated in response to this call. Outstanding permission requests will be lost if the script is derezzed, moved to another region or reset. + + llRequestInventoryData energy @@ -17913,6 +18478,50 @@ tooltip Updates settings for a pathfinding character. + llUpdateKeyValue + + energy + 10.0 + sleep + 0.0 + return + key + arguments + + Key + + type + string + tooltip + + + Value + + type + string + tooltip + + + Checked + + type + integer + tooltip + + + OriginalValue + + type + string + tooltip + + + + tooltip + + Starts an asychronous transaction to update the value associated with the key given. The dataserver callback will be executed with the key returned from this call and a string describing the result. The result is a two element commma-delimited list. The first item is an integer specifying if the transaction succeeded (1) or not (0). In the failure case, the second item will be an integer corresponding to one of the XP_ERROR_... constants. In the success case the second item will be the value associated with the key. If Checked is 1 the existing value in the data store must match the OriginalValue passed or XP_ERROR_RETRY_UPDATE will be returned. If Checked is 0 the key will be created if necessary. + + llVecDist energy diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 64fdebd383..b3d6fb0592 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3240,6 +3240,17 @@ Value 1 + ChatShowIcons + + Comment + Show/hide people icons in chat + Persist + 1 + Type + Boolean + Value + 1 + CheesyBeacon Comment @@ -13672,6 +13683,17 @@ Change of this parameter will affect the layout of buttons in notification toast Value 1 + GlobalShowIconsOverride + + Comment + Show/hide people icons in any list. This option should be set back to 0 when icons are enabled locally for the lists + Persist + 1 + Type + Boolean + Value + 0 + FriendsSortOrder Comment diff --git a/indra/newview/fsparticipantlist.cpp b/indra/newview/fsparticipantlist.cpp index 02b1abfb2f..7596955856 100644 --- a/indra/newview/fsparticipantlist.cpp +++ b/indra/newview/fsparticipantlist.cpp @@ -248,7 +248,7 @@ FSParticipantList::FSParticipantList(LLSpeakerMgr* data_source, if (use_context_menu && can_toggle_icons) { mAvatarList->setShowIcons("ParticipantListShowIcons"); - mAvatarListToggleIconsConnection = gSavedSettings.getControl("ParticipantListShowIcons")->getSignal()->connect(boost::bind(&LLAvatarList::toggleIcons, mAvatarList)); + mAvatarListToggleIconsConnection = gSavedSettings.getControl("ParticipantListShowIcons")->getSignal()->connect(boost::bind(&FSParticipantList::onParticipantListIconToggle, this)); } //Lets fill avatarList with existing speakers @@ -475,6 +475,14 @@ void FSParticipantList::onAvalineCallerRemoved(const LLUUID& participant_id) mSpeakerMgr->removeAvalineSpeaker(participant_id); } +void FSParticipantList::onParticipantListIconToggle() +{ + std::string param = mAvatarList->getIconParamName(); + gSavedSettings.setBOOL(param, !(gSavedSettings.getBOOL(param) && !gSavedSettings.getBOOL("GlobalShowIconsOverride"))); + gSavedSettings.setBOOL("GlobalShowIconsOverride", (!gSavedSettings.getBOOL(param) && gSavedSettings.getBOOL("GlobalShowIconsOverride"))); + mAvatarList->setIconsVisible(gSavedSettings.getBOOL(param)); +} + void FSParticipantList::setSortOrder(EParticipantSortOrder order) { const U32 speaker_sort_order = gSavedSettings.getU32("SpeakerParticipantDefaultOrder"); diff --git a/indra/newview/fsparticipantlist.h b/indra/newview/fsparticipantlist.h index 5f7f9c0b91..0607043223 100644 --- a/indra/newview/fsparticipantlist.h +++ b/indra/newview/fsparticipantlist.h @@ -263,6 +263,8 @@ private: void onAvalineCallerFound(const LLUUID& participant_id); void onAvalineCallerRemoved(const LLUUID& participant_id); + void onParticipantListIconToggle(); + /** * Adjusts passed participant to work properly. * diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 5615f128e3..c5404f7559 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -289,12 +289,24 @@ bool LLAgent::isActionAllowed(const LLSD& sdname) if (param == "speak") { - if ( gAgent.isVoiceConnected() && - // FS::LO FIRE-5564: Speak button disabled in private call when entering no-voice parcel - // LLViewerParcelMgr::getInstance()->allowAgentVoice() && - ( LLViewerParcelMgr::getInstance()->allowAgentVoice() || - LLVoiceChannel::getCurrentVoiceChannel()->isActive() ) && - ! LLVoiceClient::getInstance()->inTuningMode() ) + bool allow_agent_voice = false; + LLVoiceChannel* channel = LLVoiceChannel::getCurrentVoiceChannel(); + if (channel != NULL) + { + if (channel->getSessionName().empty() && channel->getSessionID().isNull()) + { + // default channel + allow_agent_voice = LLViewerParcelMgr::getInstance()->allowAgentVoice(); + } + else + { + allow_agent_voice = channel->isActive() && channel->callStarted(); + } + } + + if (gAgent.isVoiceConnected() && + allow_agent_voice && + !LLVoiceClient::getInstance()->inTuningMode()) { retval = true; } diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 682e910b6c..f68c18f81c 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -1162,7 +1162,7 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it if (mismatched == 0 && !update_inventory) { LL_DEBUGS("Avatar") << "no changes, bailing out" << LL_ENDL; - mCOFChangeInProgress = false; + notifyLoadingFinished(); return; } @@ -1219,7 +1219,7 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it if (mismatched == 0) { LL_DEBUGS("Avatar") << "inventory updated, wearable assets not changed, bailing out" << LL_ENDL; - mCOFChangeInProgress = false; + notifyLoadingFinished(); return; } diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 8c25627733..fcf0689e13 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1980,7 +1980,7 @@ bool LLAppearanceMgr::canAddWearables(const uuid_vec_t& item_ids) { ++n_clothes; } - else if (item->getType() == LLAssetType::AT_BODYPART) + else if (item->getType() == LLAssetType::AT_BODYPART || item->getType() == LLAssetType::AT_GESTURE) { return isAgentAvatarValid(); } diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index a4622df6c8..a0ccfe0587 100755 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -694,7 +694,10 @@ void LLUpdateTaskInventoryResponder::uploadComplete(const LLSD& content) case LLAssetType::AT_NOTECARD: { // Update the UI with the new asset. - LLPreviewNotecard* nc = LLFloaterReg::findTypedInstance("preview_notecard", LLSD(item_id)); + LLSD floater_key; + floater_key["taskid"] = task_id; + floater_key["itemid"] = item_id; + LLPreviewNotecard* nc = LLFloaterReg::findTypedInstance("preview_notecard", floater_key); if(nc) { // *HACK: we have to delete the asset in the VFS so diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 15d760ba44..18df5adbc9 100755 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -71,21 +71,20 @@ LLAvatarListItem* LLAvatarList::getAvatarListItem(const LLUUID& id) return (LLAvatarListItem*)getItemByValue(id); } -void LLAvatarList::toggleIcons() +void LLAvatarList::setIconsVisible(bool visible) { - if (!mIgnoreGlobalIcons) + if (visible == mShowIcons) // nothing to be done here. + return; + + // Save the new value for new items to use. + mShowIcons = visible; + + // Show/hide icons for all existing items. + std::vector items; + getItems(items); + for (std::vector::const_iterator it = items.begin(); it != items.end(); it++) { - // Save the new value for new items to use. - mShowIcons = !mShowIcons; - gSavedSettings.setBOOL(mIconParamName, mShowIcons); - - // Show/hide avatar icons for all existing items. - std::vector items; - getItems(items); - for( std::vector::const_iterator it = items.begin(); it != items.end(); it++) - { - static_cast(*it)->setAvatarIconVisible(mShowIcons); - } + static_cast(*it)->setAvatarIconVisible(mShowIcons); } } @@ -389,6 +388,8 @@ void LLAvatarList::draw() updateAvatarNames(); } + setIconsVisible(gSavedSettings.getBOOL(mIconParamName) && !gSavedSettings.getBOOL("GlobalShowIconsOverride")); + if (mDirty) refresh(); diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index f99ed63cd0..152b66f5e5 100755 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -80,7 +80,7 @@ public: void setSessionID(const LLUUID& session_id) { mSessionID = session_id; } const LLUUID& getSessionID() { return mSessionID; } - void toggleIcons(); + void setIconsVisible(bool visible); void setSpeakingIndicatorsVisible(bool visible); void setItemHeight(S32 height); void showPermissions(bool visible); diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 08bad53291..36c1ed813b 100755 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -572,7 +572,7 @@ protected: showSystemContextMenu(x,y); if(mAvatarID.notNull() && mSourceType == CHAT_SOURCE_AGENT) showAvatarContextMenu(x,y); - if(mAvatarID.notNull() && mSourceType == CHAT_SOURCE_OBJECT && SYSTEM_FROM != mFrom) + if(mAvatarID.notNull() && mSourceType == CHAT_SOURCE_OBJECT) showObjectContextMenu(x,y); } diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index 7c91701456..7afc4cc9d6 100755 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -503,7 +503,7 @@ void LLCOFWearables::populateAttachmentsAndBodypartsLists(const LLInventoryModel const LLAssetType::EType item_type = item->getType(); if (item_type == LLAssetType::AT_CLOTHING) continue; LLPanelInventoryListItemBase* item_panel = NULL; - if (item_type == LLAssetType::AT_OBJECT) + if (item_type == LLAssetType::AT_OBJECT || item_type == LLAssetType::AT_GESTURE) { item_panel = buildAttachemntListItem(item); mAttachments->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false); diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index 64fac00468..b551958c5b 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -87,7 +87,8 @@ LLConversationViewSession::LLConversationViewSession(const LLConversationViewSes mHasArrow(true), mIsInActiveVoiceChannel(false), mFlashStateOn(false), - mFlashStarted(false) + mFlashStarted(false), + mShowIcons(true) { mFlashTimer = new LLFlashTimer(); } @@ -175,7 +176,7 @@ BOOL LLConversationViewSession::postBuild() if (session) { LLAvatarIconCtrl* icon = mItemPanel->getChild("avatar_icon"); - icon->setVisible(true); + icon->setVisible(mShowIcons); icon->setValue(session->mOtherParticipantID); mSpeakingIndicator->setSpeakerId(gAgentID, session->mSessionID, true); mHasArrow = false; @@ -428,6 +429,49 @@ void LLConversationViewSession::showVoiceIndicator(bool visible) requestArrange(); } +void LLConversationViewSession::setIconsVisible(bool visible) +{ + if (visible == mShowIcons) // nothing to be done here. + return; + + // Save the new value for new items to use. + mShowIcons = visible; + + // Show/hide icons for the 1-n-1 chat. + LLConversationItem* vmi = dynamic_cast(getViewModelItem()); + if (vmi) + { + switch (vmi->getType()) + { + case LLConversationItem::CONV_PARTICIPANT: + case LLConversationItem::CONV_SESSION_1_ON_1: + { + LLIconCtrl* icon = mItemPanel->getChild("avatar_icon"); + icon->setVisible(mShowIcons); + break; + } + /* + case LLConversationItem::CONV_SESSION_AD_HOC: + case LLConversationItem::CONV_SESSION_GROUP: + { + LLIconCtrl* icon = mItemPanel->getChild("group_icon"); + icon->setVisible(mShowIcons); + break; + } + */ + default: + break; + } + } + + // Show/hide icons for all existing items. + items_t::const_iterator iter; + for (iter = getItemsBegin(); iter != getItemsEnd(); iter++) + { + dynamic_cast(*iter)->setAvatarIconVisible(mShowIcons); + } +} + void LLConversationViewSession::refresh() { // Refresh the session view from its model data @@ -460,6 +504,9 @@ void LLConversationViewSession::refresh() } } } + + setIconsVisible(gSavedSettings.getBOOL("ChatShowIcons") && !gSavedSettings.getBOOL("GlobalShowIconsOverride")); + requestArrange(); // Do the regular upstream refresh LLFolderViewFolder::refresh(); @@ -511,7 +558,7 @@ void LLConversationViewParticipant::initFromParams(const LLConversationViewParti LLAvatarIconCtrl::Params avatar_icon_params(params.avatar_icon()); applyXUILayout(avatar_icon_params, this); LLAvatarIconCtrl * avatarIcon = LLUICtrlFactory::create(avatar_icon_params); - addChild(avatarIcon); + addChild(avatarIcon); LLButton::Params info_button_params(params.info_button()); applyXUILayout(info_button_params, this); @@ -527,6 +574,7 @@ void LLConversationViewParticipant::initFromParams(const LLConversationViewParti BOOL LLConversationViewParticipant::postBuild() { mAvatarIcon = getChild("avatar_icon"); + mAvatarIcon->setVisible(gSavedSettings.getBOOL("ChatShowIcons") && !gSavedSettings.getBOOL("GlobalShowIconsOverride")); mInfoBtn = getChild("info_btn"); mInfoBtn->setClickedCallback(boost::bind(&LLConversationViewParticipant::onInfoBtnClick, this)); @@ -590,12 +638,12 @@ S32 LLConversationViewParticipant::arrange(S32* width, S32* height) S32 arranged = LLFolderViewItem::arrange(width, height); //Adjusts the avatar icon based upon the indentation - LLRect avatarRect(getIndentation(), - mAvatarIcon->getRect().mTop, - getIndentation() + mAvatarIcon->getRect().getWidth(), - mAvatarIcon->getRect().mBottom); - mAvatarIcon->setShape(avatarRect); - + LLRect avatarRect(getIndentation(), + mAvatarIcon->getRect().mTop, + getIndentation() + mAvatarIcon->getRect().getWidth(), + mAvatarIcon->getRect().mBottom); + mAvatarIcon->setShape(avatarRect); + //Since dimensions changed, adjust the children (info button, speaker indicator) updateChildren(); @@ -667,7 +715,7 @@ void LLConversationViewParticipant::onMouseLeave(S32 x, S32 y, MASK mask) S32 LLConversationViewParticipant::getLabelXPos() { - return getIndentation() + mAvatarIcon->getRect().getWidth() + mIconPad; + return getIndentation() + (mAvatarIcon->getVisible() ? mAvatarIcon->getRect().getWidth() : 0) + mIconPad; } // static @@ -746,6 +794,19 @@ void LLConversationViewParticipant::hideSpeakingIndicator() mSpeakingIndicator->setVisible(false); } +void LLConversationViewParticipant::setAvatarIconVisible(bool visible) +{ + // Already done? Then do nothing. + if (mAvatarIcon->getVisible() == (BOOL)visible) + { + return; + } + + // Show/hide avatar icon. + mAvatarIcon->setVisible(visible); + updateChildren(); +} + // EOF #endif diff --git a/indra/newview/llconversationview.h b/indra/newview/llconversationview.h index 76da653c26..fba9ad98eb 100644 --- a/indra/newview/llconversationview.h +++ b/indra/newview/llconversationview.h @@ -85,7 +85,7 @@ public: LLConversationViewParticipant* findParticipant(const LLUUID& participant_id); void showVoiceIndicator(bool visible); - + void setIconsVisible(bool visible); virtual void refresh(); /*virtual*/ void setFlashState(bool flash_state); @@ -112,6 +112,8 @@ private: bool mIsInActiveVoiceChannel; + bool mShowIcons; + LLVoiceClientStatusObserver* mVoiceClientObserver; boost::signals2::connection mActiveVoiceChannelConnection; @@ -147,6 +149,7 @@ public: /*virtual*/ S32 getLabelXPos(); /*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask ); void hideSpeakingIndicator(); + void setAvatarIconVisible(bool visible); protected: friend class LLUICtrlFactory; diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp index aaaab1ad4b..764d49b1c0 100755 --- a/indra/newview/lldrawpoolterrain.cpp +++ b/indra/newview/lldrawpoolterrain.cpp @@ -236,24 +236,7 @@ void LLDrawPoolTerrain::render(S32 pass) if (showParcelOwners) // { - if (mVertexShaderLevel > 1) - { //use fullbright shader for highlighting - LLGLSLShader* old_shader = sShader; - sShader->unbind(); - sShader = &gHighlightProgram; - sShader->bind(); - gGL.diffuseColor4f(1,1,1,1); - LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL); - glPolygonOffset(-1.0f, -1.0f); - renderOwnership(); - sShader = old_shader; - sShader->bind(); - } - else - { - gPipeline.disableLights(); - renderOwnership(); - } + hilightParcelOwners(); } } @@ -281,7 +264,15 @@ void LLDrawPoolTerrain::renderDeferred(S32 pass) { return; } + renderFullShader(); + + // Special-case for land ownership feedback + if (gSavedSettings.getBOOL("ShowParcelOwners")) + { + hilightParcelOwners(); + } + } void LLDrawPoolTerrain::beginShadowPass(S32 pass) @@ -470,6 +461,28 @@ void LLDrawPoolTerrain::renderFullShader() gGL.matrixMode(LLRender::MM_MODELVIEW); } +void LLDrawPoolTerrain::hilightParcelOwners() +{ + if (mVertexShaderLevel > 1) + { //use fullbright shader for highlighting + LLGLSLShader* old_shader = sShader; + sShader->unbind(); + sShader = &gHighlightProgram; + sShader->bind(); + gGL.diffuseColor4f(1, 1, 1, 1); + LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(-1.0f, -1.0f); + renderOwnership(); + sShader = old_shader; + sShader->bind(); + } + else + { + gPipeline.disableLights(); + renderOwnership(); + } +} + void LLDrawPoolTerrain::renderFull4TU() { // Hack! Get the region that this draw pool is rendering from! diff --git a/indra/newview/lldrawpoolterrain.h b/indra/newview/lldrawpoolterrain.h index 2163d087e1..55f75e2644 100755 --- a/indra/newview/lldrawpoolterrain.h +++ b/indra/newview/lldrawpoolterrain.h @@ -76,6 +76,7 @@ public: static S32 sDetailMode; static F32 sDetailScale; // meters per texture + protected: void renderSimple(); void renderOwnership(); @@ -84,6 +85,9 @@ protected: void renderFull4TU(); void renderFullShader(); void drawLoop(); + +private: + void hilightParcelOwners(); }; #endif // LL_LLDRAWPOOLSIMPLE_H diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index f2602c8c7d..61b5748201 100755 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -237,6 +237,7 @@ LLExpandableTextBox::LLExpandableTextBox(const Params& p) LLTextBoxEx::Params textbox_params = p.textbox; textbox_params.rect(rc); mTextBox = LLUICtrlFactory::create(textbox_params); + mTextBox->setContentTrusted(false); mScroll->addChild(mTextBox); updateTextBoxRect(); @@ -260,6 +261,11 @@ void LLExpandableTextBox::draw() LLUICtrl::draw(); } +void LLExpandableTextBox::setContentTrusted(bool trusted_content) +{ + mTextBox->setContentTrusted(trusted_content); +} + void LLExpandableTextBox::collapseIfPosChanged() { if(mExpanded) diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h index 5dea35bb82..90d46ab262 100755 --- a/indra/newview/llexpandabletextbox.h +++ b/indra/newview/llexpandabletextbox.h @@ -194,6 +194,8 @@ protected: */ virtual S32 recalculateTextDelta(S32 text_delta); + void setContentTrusted(bool trusted_content); + protected: std::string mText; diff --git a/indra/newview/llexperienceassociationresponder.cpp b/indra/newview/llexperienceassociationresponder.cpp index 7f2363aadc..f62ca7d75f 100644 --- a/indra/newview/llexperienceassociationresponder.cpp +++ b/indra/newview/llexperienceassociationresponder.cpp @@ -51,10 +51,18 @@ void ExperienceAssociationResponder::fetchAssociatedExperience(LLSD& request, ca LLViewerObject* object = gObjectList.findObject(request["object-id"]); if (!object) { - LL_WARNS() << "Failed to find object with ID " << request["object-id"] << " in fetchAssociatedExperience" << LL_ENDL; - return; + LL_DEBUGS() << "Object with ID " << request["object-id"] << " not found via gObjectList.findObject() in fetchAssociatedExperience" << LL_ENDL; + LL_DEBUGS() << "Using gAgent.getRegion() instead of object->getRegion()" << LL_ENDL; + } + LLViewerRegion* region = NULL; + if (object) + { + region = object->getRegion(); + } + else + { + region = gAgent.getRegion(); } - LLViewerRegion* region = object->getRegion(); if (region) { std::string lookup_url=region->getCapability("GetMetadata"); @@ -66,6 +74,10 @@ void ExperienceAssociationResponder::fetchAssociatedExperience(LLSD& request, ca LLHTTPClient::post(lookup_url, request, new ExperienceAssociationResponder(callback)); } } + else + { + LL_WARNS() << "Failed to lookup region in fetchAssociatedExperience. Fetch request not sent." << LL_ENDL; + } } void ExperienceAssociationResponder::httpFailure() diff --git a/indra/newview/llexperiencelog.cpp b/indra/newview/llexperiencelog.cpp index ec6134a4b3..ee5d561927 100644 --- a/indra/newview/llexperiencelog.cpp +++ b/indra/newview/llexperiencelog.cpp @@ -112,6 +112,7 @@ void LLExperienceLog::handleExperienceMessage(LLSD& message) } message["Time"] = time_of_day; mEvents[day].append(message); + mEventsToSave[day].append(message); mSignals(message); } @@ -180,9 +181,8 @@ void LLExperienceLog::notify( LLSD& message ) void LLExperienceLog::saveEvents() { - eraseExpired(); std::string filename = getFilename(); - LLSD settings = LLSD::emptyMap().with("Events", mEvents); + LLSD settings = LLSD::emptyMap().with("Events", mEventsToSave); settings["MaxDays"] = (int)mMaxDays; settings["Notify"] = mNotifyNewEvent; @@ -217,9 +217,8 @@ void LLExperienceLog::loadEvents() if(mMaxDays > 0 && settings.has("Events")) { mEvents = settings["Events"]; + mEventsToSave = mEvents; } - - eraseExpired(); } LLExperienceLog::~LLExperienceLog() @@ -235,6 +234,26 @@ void LLExperienceLog::eraseExpired() } } +bool LLExperienceLog::isNotExpired(std::string& date) +{ + LLDate event_date; + S32 month, day, year; + S32 matched = sscanf(date.c_str(), "%d-%d-%d", &year, &month, &day); + if (matched != 3) return false; + event_date.fromYMDHMS(year, month, day); + const U32 seconds_in_day = 24 * 60 * 60; + S32 curr_year = 0, curr_month = 0, curr_day = 0; + + + LLDate curr_date = LLDate::now(); + curr_date.split(&curr_year, &curr_month, &curr_day); + curr_date.fromYMDHMS(curr_year, curr_month, curr_day); // Set hour, min, and sec to 0 + + LLDate boundary_date = LLDate(curr_date.secondsSinceEpoch() - seconds_in_day*getMaxDays()); + return event_date >= boundary_date; + +} + const LLSD& LLExperienceLog::getEvents() const { return mEvents; @@ -248,10 +267,6 @@ void LLExperienceLog::clear() void LLExperienceLog::setMaxDays( U32 val ) { mMaxDays = val; - if(mMaxDays > 0) - { - eraseExpired(); - } } LLExperienceLog::callback_connection_t LLExperienceLog::addUpdateSignal( const callback_slot_t& cb ) diff --git a/indra/newview/llexperiencelog.h b/indra/newview/llexperiencelog.h index 1e473e27d5..ac227db336 100644 --- a/indra/newview/llexperiencelog.h +++ b/indra/newview/llexperiencelog.h @@ -59,6 +59,8 @@ public: static void notify(LLSD& message); static std::string getFilename(); static std::string getPermissionString(const LLSD& message, const std::string& base); + void setEventsToSave(LLSD new_events){mEventsToSave = new_events; } + bool isNotExpired(std::string& date); protected: LLExperienceLog(); void handleExperienceMessage(LLSD& message); @@ -68,7 +70,10 @@ protected: void saveEvents(); void eraseExpired(); + + LLSD mEvents; + LLSD mEventsToSave; callback_signal_t mSignals; callback_connection_t mNotifyConnection; U32 mMaxDays; diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 769a15ba09..59d196749c 100755 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -676,11 +676,12 @@ void LLFavoritesBarCtrl::changed(U32 mask) LLInventoryModel::cat_array_t cats; LLIsType is_type(LLAssetType::AT_LANDMARK); gInventory.collectDescendentsIf(mFavoriteFolderId, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); - + for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) { LLFavoritesOrderStorage::instance().getSLURL((*i)->getAssetUUID()); } + updateButtons(); if (!mItemsChangedTimer.getStarted()) { @@ -772,7 +773,11 @@ void LLFavoritesBarCtrl::updateButtons() if(mGetPrevItems) { - LLFavoritesOrderStorage::instance().mPrevFavorites = mItems; + for (LLInventoryModel::item_array_t::iterator it = mItems.begin(); it != mItems.end(); it++) + { + LLFavoritesOrderStorage::instance().mFavoriteNames[(*it)->getUUID()]= (*it)->getName(); + } + LLFavoritesOrderStorage::instance().mPrevFavorites = mItems; mGetPrevItems = false; } @@ -802,7 +807,7 @@ void LLFavoritesBarCtrl::updateButtons() const LLViewerInventoryItem *item = mItems[first_changed_item_index].get(); if (item) { - // an child's order and mItems should be same + // an child's order and mItems should be same if (button->getLandmarkId() != item->getUUID() // sort order has been changed || button->getLabelSelected() != item->getName() // favorite's name has been changed || button->getRect().mRight < rightest_point) // favbar's width has been changed @@ -1860,10 +1865,20 @@ BOOL LLFavoritesOrderStorage::saveFavoritesRecord(bool pref_changed) gInventory.collectDescendentsIf(favorite_folder, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); std::sort(items.begin(), items.end(), LLFavoritesSort()); + bool name_changed = false; - if((items != mPrevFavorites) || pref_changed) + for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); it++) { - std::string filename = getStoredFavoritesFilename(); + if(mFavoriteNames[(*it)->getUUID()] != ((*it)->getName())) + { + mFavoriteNames[(*it)->getUUID()] = (*it)->getName(); + name_changed = true; + } + } + + if((items != mPrevFavorites) || name_changed || pref_changed) + { + std::string filename = getStoredFavoritesFilename(); if (!filename.empty()) { llifstream in_file; diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index 2f98acddbe..66ed2aa8ab 100755 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -225,6 +225,7 @@ public: const static S32 NO_INDEX; static bool mSaveOnExit; bool mUpdateRequired; + std::map mFavoriteNames; private: friend class LLSingleton; diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 9c390b5165..60b72d2525 100755 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -925,6 +925,11 @@ void LLFloaterIMContainer::onCustomAction(const LLSD& userdata) { setSortOrderParticipants(LLConversationFilter::SO_DISTANCE); } + if ("view_icons" == command) + { + gSavedSettings.setBOOL("ChatShowIcons", !(gSavedSettings.getBOOL("ChatShowIcons") && !gSavedSettings.getBOOL("GlobalShowIconsOverride"))); + gSavedSettings.setBOOL("GlobalShowIconsOverride", (!gSavedSettings.getBOOL("ChatShowIcons") && gSavedSettings.getBOOL("GlobalShowIconsOverride"))); + } if ("chat_preferences" == command) { LLFloaterPreference * floater_prefp = LLFloaterReg::showTypedInstance("preferences"); @@ -975,6 +980,10 @@ BOOL LLFloaterIMContainer::isActionChecked(const LLSD& userdata) { return (order.getSortOrderParticipants() == LLConversationFilter::SO_DISTANCE); } + if ("view_icons" == command) + { + return gSavedSettings.getBOOL("ChatShowIcons") && !gSavedSettings.getBOOL("GlobalShowIconsOverride"); + } if ("Translating.Enabled" == command) { return gSavedPerAccountSettings.getBOOL("TranslatingEnabled"); diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 45d125f901..d61c25ea24 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -2652,6 +2652,112 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim shader->bind(); } } +void LLModelPreview::genModelBBox() +{ + LLVector3 min, max; + min = this->mModelLoader->mExtents[0]; + max = this->mModelLoader->mExtents[1]; + std::vector v_list; + v_list.resize(4); + std::map > face_list; + + // Face 0 + v_list[0] = LLVector3(min.mV[VX], max.mV[VY], max.mV[VZ]); + v_list[1] = LLVector3(min.mV[VX], min.mV[VY], max.mV[VZ]); + v_list[2] = LLVector3(max.mV[VX], min.mV[VY], max.mV[VZ]); + v_list[3] = LLVector3(max.mV[VX], max.mV[VY], max.mV[VZ]); + face_list.insert(std::pair >(0, v_list)); + + // Face 1 + v_list[0] = LLVector3(max.mV[VX], min.mV[VY], max.mV[VZ]); + v_list[1] = LLVector3(max.mV[VX], min.mV[VY], min.mV[VZ]); + v_list[2] = LLVector3(max.mV[VX], max.mV[VY], min.mV[VZ]); + v_list[3] = LLVector3(max.mV[VX], max.mV[VY], max.mV[VZ]); + face_list.insert(std::pair >(1, v_list)); + + // Face 2 + v_list[0] = LLVector3(min.mV[VX], max.mV[VY], min.mV[VZ]); + v_list[1] = LLVector3(min.mV[VX], max.mV[VY], max.mV[VZ]); + v_list[2] = LLVector3(max.mV[VX], max.mV[VY], max.mV[VZ]); + v_list[3] = LLVector3(max.mV[VX], max.mV[VY], min.mV[VZ]); + face_list.insert(std::pair >(2, v_list)); + + // Face 3 + v_list[0] = LLVector3(min.mV[VX], max.mV[VY], max.mV[VZ]); + v_list[1] = LLVector3(min.mV[VX], max.mV[VY], min.mV[VZ]); + v_list[2] = LLVector3(min.mV[VX], min.mV[VY], min.mV[VZ]); + v_list[3] = LLVector3(min.mV[VX], min.mV[VY], max.mV[VZ]); + face_list.insert(std::pair >(3, v_list)); + + // Face 4 + v_list[0] = LLVector3(min.mV[VX], min.mV[VY], max.mV[VZ]); + v_list[1] = LLVector3(min.mV[VX], min.mV[VY], min.mV[VZ]); + v_list[2] = LLVector3(max.mV[VX], min.mV[VY], min.mV[VZ]); + v_list[3] = LLVector3(max.mV[VX], min.mV[VY], max.mV[VZ]); + face_list.insert(std::pair >(4, v_list)); + + // Face 5 + v_list[0] = LLVector3(min.mV[VX], min.mV[VY], min.mV[VZ]); + v_list[1] = LLVector3(min.mV[VX], max.mV[VY], min.mV[VZ]); + v_list[2] = LLVector3(max.mV[VX], max.mV[VY], min.mV[VZ]); + v_list[3] = LLVector3(max.mV[VX], min.mV[VY], min.mV[VZ]); + face_list.insert(std::pair >(5, v_list)); + + U16 Idx[] = { 0, 1, 2, 3, 0, 2, }; + + U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0; + LLPointer buff = new LLVertexBuffer(type_mask, 0); + buff->allocateBuffer(4, 6, true); + + LLStrider pos; + LLStrider idx; + LLStrider norm; + LLStrider tc; + + buff->getVertexStrider(pos); + buff->getIndexStrider(idx); + + buff->getNormalStrider(norm); + buff->getTexCoord0Strider(tc); + + for (U32 i = 0; i < 6; ++i) + { + idx[i] = Idx[i]; + } + + LLVolumeParams volume_params; + volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE); + LLModel* mdl = new LLModel(volume_params, 0.f); + mdl->mLabel = "BBOX"; // please adopt name from high LOD (mBaseModel) or from original model otherwise it breaks search mechanics which is name based + + mdl->setNumVolumeFaces(6); + for (U8 i = 0; i < 6; ++i) + { + for (U8 j = 0; j < 4; ++j) + { + pos[j] = face_list[i][j]; + } + + mdl->setVolumeFaceData(i, pos, norm, tc, idx, buff->getNumVerts(), buff->getNumIndices()); + } + + if (validate_model(mdl)) + { + LLMatrix4 mat; + std::map materials; + std::vector instance_list; + instance_list.push_back(LLModelInstance(mdl, mdl->mLabel, mat, materials)); + + for (S32 i = LLModel::LOD_HIGH - 1; i >= 0; i--) + { + mModel[i].clear(); + mModel[i].push_back(mdl); + + mScene[i].clear(); + mScene[i].insert(std::pair >(mat, instance_list)); + } + } +} void LLModelPreview::updateStatusMessages() { diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index e29c4baee8..1a0e7be762 100755 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -265,6 +265,7 @@ public: void loadModel(std::string filename, S32 lod, bool force_disable_slm = false); void loadModelCallback(S32 lod); void genLODs(S32 which_lod = -1, U32 decimation = 3, bool enforce_tri_limit = false); + void genModelBBox(); // Generate just a model BBox if we can't generate proper LOD void generateNormals(); void restoreNormals(); U32 calcResourceCost(); diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 8cfeab77f0..c73bc09b3d 100755 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -441,6 +441,7 @@ LLFloaterTools::LLFloaterTools(const LLSD& key) mLandImpactsObserver(NULL), mDirty(TRUE), + mHasSelection(TRUE), mNeedMediaTitle(TRUE) { gFloaterTools = this; @@ -725,7 +726,14 @@ void LLFloaterTools::refresh() void LLFloaterTools::draw() { - if (mDirty) + BOOL has_selection = !LLSelectMgr::getInstance()->getSelection()->isEmpty(); + if(!has_selection && (mHasSelection != has_selection)) + { + mDirty = TRUE; + } + mHasSelection = has_selection; + + if (mDirty) { refresh(); mDirty = FALSE; diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h index 32cb3b9316..4742d05fbe 100755 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -223,6 +223,7 @@ public: private: BOOL mDirty; + BOOL mHasSelection; BOOL mOrginalShowHighlight; //Phoenix:KC BOOL mOpen; //Phoenix:KC diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp index 4be5a8eae2..41a7636341 100755 --- a/indra/newview/llfloatertopobjects.cpp +++ b/indra/newview/llfloatertopobjects.cpp @@ -132,25 +132,32 @@ void LLFloaterTopObjects::setMode(U32 mode) // static void LLFloaterTopObjects::handle_land_reply(LLMessageSystem* msg, void** data) { - LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance("top_objects"); - if(!instance) return; - // Make sure dialog is on screen - LLFloaterReg::showInstance("top_objects"); - instance->handleReply(msg, data); - - //HACK: for some reason sometimes top scripts originally comes back - //with no results even though they're there - if (!instance->mObjectListIDs.size() && !instance->mInitialized) + LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance("top_objects"); + if(instance && instance->isInVisibleChain()) + { + instance->handleReply(msg, data); + //HACK: for some reason sometimes top scripts originally comes back + //with no results even though they're there + if (!instance->mObjectListIDs.size() && !instance->mInitialized) + { + instance->onRefresh(); + instance->mInitialized = TRUE; + } + } + else { - instance->onRefresh(); - instance->mInitialized = TRUE; + LLFloaterRegionInfo* region_info_floater = LLFloaterReg::getTypedInstance("region_info"); + if(region_info_floater) + { + region_info_floater->enableTopButtons(); + } } } void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data) { - U32 request_flags; + U32 request_flags; U32 total_count; msg->getU32Fast(_PREHASH_RequestData, _PREHASH_RequestFlags, request_flags); diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 7d7478d005..755da0f58f 100755 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -320,7 +320,11 @@ BOOL LLInvFVBridge::callback_cutToClipboard(const LLSD& notification, const LLSD S32 option = LLNotificationsUtil::getSelectedOption(notification, response); if (option == 0) // YES { - return perform_cutToClipboard(); + const LLInventoryObject* obj = gInventory.getObject(mUUID); + LLUUID parent_uuid = obj->getParentUUID(); + BOOL result = perform_cutToClipboard(); + gInventory.addChangedMask(LLInventoryObserver::STRUCTURE, parent_uuid); + return result; } return FALSE; } diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index f172aa0955..ed40483029 100755 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -749,18 +749,20 @@ void LLManipRotate::renderActiveRing( F32 radius, F32 width, const LLColor4& fro void LLManipRotate::renderSnapGuides() { - LLVector3 grid_origin; - LLVector3 grid_scale; - LLQuaternion grid_rotation; - LLVector3 constraint_axis = getConstraintAxis(); - - LLSelectMgr::getInstance()->getGrid(grid_origin, grid_rotation, grid_scale); - - if (!gSavedSettings.getBOOL("SnapEnabled")) + static LLCachedControl snap_enabled(gSavedSettings, "SnapEnabled", true); + if (!snap_enabled) { return; } + LLVector3 grid_origin; + LLVector3 grid_scale; + LLQuaternion grid_rotation; + + LLSelectMgr::getInstance()->getGrid(grid_origin, grid_rotation, grid_scale, true); + + LLVector3 constraint_axis = getConstraintAxis(); + LLVector3 center = gAgent.getPosAgentFromGlobal( mRotationCenter ); LLVector3 cam_at_axis; if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) @@ -1294,7 +1296,7 @@ LLVector3 LLManipRotate::getConstraintAxis() else { S32 axis_dir = mManipPart - LL_ROT_X; - if ((axis_dir >= 0) && (axis_dir < 3)) + if ((axis_dir >= LL_NO_PART) && (axis_dir < LL_Z_ARROW)) { axis.mV[axis_dir] = 1.f; } diff --git a/indra/newview/llpanelexperiencelog.cpp b/indra/newview/llpanelexperiencelog.cpp index df03ef7526..30576a8d67 100644 --- a/indra/newview/llpanelexperiencelog.cpp +++ b/indra/newview/llpanelexperiencelog.cpp @@ -54,7 +54,6 @@ LLPanelExperienceLog::LLPanelExperienceLog( ) buildFromFile("panel_experience_log.xml"); } - BOOL LLPanelExperienceLog::postBuild( void ) { LLExperienceLog* log = LLExperienceLog::getInstance(); @@ -112,7 +111,7 @@ void LLPanelExperienceLog::refresh() int itemsToSkip = mPageSize*mCurrentPage; int items = 0; bool moreItems = false; - + LLSD events_to_save = events; if (!events.emptyMap()) { LLSD::map_const_iterator day = events.endMap(); @@ -120,6 +119,13 @@ void LLPanelExperienceLog::refresh() { --day; const LLSD& dayArray = day->second; + + std::string date = day->first; + if(!LLExperienceLog::instance().isNotExpired(date)) + { + events_to_save.erase(day->first); + continue; + } int size = dayArray.size(); if(itemsToSkip > size) { @@ -164,6 +170,7 @@ void LLPanelExperienceLog::refresh() } } while (day != events.beginMap()); } + LLExperienceLog::getInstance()->setEventsToSave(events_to_save); if(waiting) { mEventList->deleteAllItems(); @@ -237,12 +244,8 @@ void LLPanelExperienceLog::notifyChanged() void LLPanelExperienceLog::logSizeChanged() { int value = (int)(getChild("logsizespinner")->get()); - bool dirty = value > 0 && value < LLExperienceLog::instance().getMaxDays(); LLExperienceLog::instance().setMaxDays(value); - if(dirty) - { - refresh(); - } + refresh(); } void LLPanelExperienceLog::onSelectionChanged() diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 57e21e1c0a..410bc240ef 100755 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -49,6 +49,7 @@ #include "llmaterialmgr.h" #include "llmediaentry.h" #include "llnotificationsutil.h" +#include "llradiogroup.h" #include "llresmgr.h" #include "llselectmgr.h" #include "llspinctrl.h" @@ -92,10 +93,10 @@ std::string USE_TEXTURE; LLRender::eTexIndex LLPanelFace::getTextureChannelToEdit() { LLComboBox* combobox_matmedia = getChild("combobox matmedia"); - LLComboBox* combobox_mattype = getChild("combobox mattype"); + LLRadioGroup* radio_mat_type = getChild("radio_material_type"); LLRender::eTexIndex channel_to_edit = (combobox_matmedia && combobox_matmedia->getCurrentIndex() == MATMEDIA_MATERIAL) ? - (combobox_mattype ? (LLRender::eTexIndex)combobox_mattype->getCurrentIndex() : LLRender::DIFFUSE_MAP) : LLRender::DIFFUSE_MAP; + (radio_mat_type ? (LLRender::eTexIndex)radio_mat_type->getSelectedIndex() : LLRender::DIFFUSE_MAP) : LLRender::DIFFUSE_MAP; channel_to_edit = (channel_to_edit == LLRender::NORMAL_MAP) ? (getCurrentNormalMap().isNull() ? LLRender::DIFFUSE_MAP : channel_to_edit) : channel_to_edit; channel_to_edit = (channel_to_edit == LLRender::SPECULAR_MAP) ? (getCurrentSpecularMap().isNull() ? LLRender::DIFFUSE_MAP : channel_to_edit) : channel_to_edit; @@ -262,7 +263,6 @@ BOOL LLPanelFace::postBuild() //LLComboBox* mComboTexGen; //LLComboBox* mComboMatMedia; - //LLComboBox* mComboMatType; //LLCheckBoxCtrl *mCheckFullbright; @@ -383,12 +383,12 @@ BOOL LLPanelFace::postBuild() mComboMatMedia->selectNthItem(MATMEDIA_MATERIAL); } - mComboMatType = getChild("combobox mattype"); - if(mComboMatType) - { - mComboMatType->setCommitCallback(LLPanelFace::onCommitMaterialType, this); - mComboMatType->selectNthItem(MATTYPE_DIFFUSE); - } + mRadioMatType = getChild("radio_material_type"); + if(mRadioMatType) + { + mRadioMatType->setCommitCallback(LLPanelFace::onCommitMaterialType, this); + mRadioMatType->selectNthItem(MATTYPE_DIFFUSE); + } mCtrlGlow = getChild("glow"); if(mCtrlGlow) @@ -786,20 +786,21 @@ void LLPanelFace::updateUI() } mComboMatMedia->setEnabled(editable); - //LLComboBox* combobox_mattype = getChild("combobox mattype"); - if (mComboMatType) + //LLRadioGroup* radio_mat_type = getChild("radio_material_type"); + if(mRadioMatType) { - if (mComboMatType->getCurrentIndex() < MATTYPE_DIFFUSE) - { - mComboMatType->selectNthItem(MATTYPE_DIFFUSE); - } + if (mRadioMatType->getSelectedIndex() < MATTYPE_DIFFUSE) + { + mRadioMatType->selectNthItem(MATTYPE_DIFFUSE); + } + } else { - LL_WARNS("Materials") << "failed getChild for 'combobox mattype'" << LL_ENDL; + LL_WARNS("Materials") << "failed getChild for 'radio_material_type'" << LL_ENDL; } - mComboMatType->setEnabled(editable); + mRadioMatType->setEnabled(editable); updateVisibility(); bool identical = true; // true because it is anded below @@ -1329,8 +1330,7 @@ void LLPanelFace::updateUI() BOOL identical_repeats = true; F32 repeats = 1.0f; - U32 material_type = (mComboMatMedia->getCurrentIndex() == MATMEDIA_MATERIAL) ? mComboMatType->getCurrentIndex() : MATTYPE_DIFFUSE; - + U32 material_type = (mComboMatMedia->getCurrentIndex() == MATMEDIA_MATERIAL) ? mRadioMatType->getSelectedIndex() : MATTYPE_DIFFUSE; LLSelectMgr::getInstance()->setTextureChannel(LLRender::eTexIndex(material_type)); switch (material_type) @@ -1601,23 +1601,22 @@ void LLPanelFace::onCommitMaterialsMedia(LLUICtrl* ctrl, void* userdata) void LLPanelFace::updateVisibility() { LLComboBox* combo_matmedia = getChild("combobox matmedia"); - LLComboBox* combo_mattype = getChild("combobox mattype"); + LLRadioGroup* radio_mat_type = getChild("radio_material_type"); LLComboBox* combo_shininess = getChild("combobox shininess"); LLComboBox* combo_bumpiness = getChild("combobox bumpiness"); - if (!combo_mattype || !combo_matmedia || !combo_shininess || !combo_bumpiness) + if (!radio_mat_type || !combo_matmedia || !combo_shininess || !combo_bumpiness) { LL_WARNS("Materials") << "Combo box not found...exiting." << LL_ENDL; return; } U32 materials_media = combo_matmedia->getCurrentIndex(); - U32 material_type = combo_mattype->getCurrentIndex(); + U32 material_type = radio_mat_type->getSelectedIndex(); bool show_media = (materials_media == MATMEDIA_MEDIA) && combo_matmedia->getEnabled(); bool show_texture = (show_media || ((material_type == MATTYPE_DIFFUSE) && combo_matmedia->getEnabled())); bool show_bumpiness = (!show_media) && (material_type == MATTYPE_NORMAL) && combo_matmedia->getEnabled(); bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled(); - getChildView("combobox mattype")->setVisible(!show_media); + getChildView("radio_material_type")->setVisible(!show_media); // FIRE-11407 - Be consistant and hide this with the other controls - //getChildView("rptctrl")->setVisible(true); getChildView("rptctrl")->setVisible(combo_matmedia->getEnabled()); // and other additions... getChildView("flipTextureScaleU")->setVisible(combo_matmedia->getEnabled()); @@ -1747,9 +1746,9 @@ void LLPanelFace::updateShinyControls(bool is_setting_texture, bool mess_with_sh } LLComboBox* combo_matmedia = getChild("combobox matmedia"); - LLComboBox* combo_mattype = getChild("combobox mattype"); + LLRadioGroup* radio_mat_type = getChild("radio_material_type"); U32 materials_media = combo_matmedia->getCurrentIndex(); - U32 material_type = combo_mattype->getCurrentIndex(); + U32 material_type = radio_mat_type->getSelectedIndex(); bool show_media = (materials_media == MATMEDIA_MEDIA) && combo_matmedia->getEnabled(); bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled(); U32 shiny_value = comboShiny->getCurrentIndex(); @@ -1831,11 +1830,11 @@ void LLPanelFace::updateAlphaControls() mat_media = mComboMatMedia->getCurrentIndex(); } - //LLComboBox* combobox_mattype = getChild("combobox mattype"); U32 mat_type = MATTYPE_DIFFUSE; - if (mComboMatType) + //LLRadioGroup* radio_mat_type = getChild("radio_material_type"); + if(mRadioMatType) { - mat_type = mComboMatType->getCurrentIndex(); + mat_type = mRadioMatType->getSelectedIndex(); } show_alphactrls = show_alphactrls && (mat_media == MATMEDIA_MATERIAL); @@ -2130,12 +2129,11 @@ void LLPanelFace::onCommitRepeatsPerMeter(LLUICtrl* ctrl, void* userdata) LLUICtrl* repeats_ctrl = self->getChild("rptctrl"); LLComboBox* combo_matmedia = self->getChild("combobox matmedia"); - LLComboBox* combo_mattype = self->getChild("combobox mattype"); + LLRadioGroup* radio_mat_type = self->getChild("radio_material_type"); U32 materials_media = combo_matmedia->getCurrentIndex(); - - U32 material_type = (materials_media == MATMEDIA_MATERIAL) ? combo_mattype->getCurrentIndex() : 0; + U32 material_type = (materials_media == MATMEDIA_MATERIAL) ? radio_mat_type->getSelectedIndex() : 0; F32 repeats_per_meter = repeats_ctrl->getValue().asReal(); F32 obj_scale_s = 1.0f; @@ -2259,11 +2257,13 @@ void LLPanelFace::onCommitPlanarAlign(LLUICtrl* ctrl, void* userdata) void LLPanelFace::onTextureSelectionChanged(LLInventoryItem* itemp) { LL_DEBUGS("Materials") << "item asset " << itemp->getAssetUUID() << LL_ENDL; - if (!mComboMatType) + //LLRadioGroup* radio_mat_type = getChild("radio_material_type"); + //if(radio_mat_type) + if (!mRadioMatType) { - return; + return; } - U32 mattype = mComboMatType->getCurrentIndex(); + U32 mattype = mRadioMatType->getSelectedIndex(); std::string which_control="texture control"; switch (mattype) { diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h index 8ea93e7eb1..0b024afa84 100755 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -40,6 +40,7 @@ class LLColorSwatchCtrl; class LLComboBox; class LLInventoryItem; class LLLineEditor; +class LLRadioGroup; class LLSpinCtrl; class LLTextBox; class LLTextureCtrl; @@ -263,7 +264,7 @@ private: LLComboBox* mComboTexGen; LLComboBox* mComboMatMedia; - LLComboBox* mComboMatType; + LLRadioGroup* mRadioMatType; LLCheckBoxCtrl *mCheckFullbright; diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 362e0218b2..2e01d84399 100755 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -1015,7 +1015,11 @@ void LLTaskTextureBridge::openItem() LLPreviewTexture* preview = LLFloaterReg::showTypedInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); if(preview) { - preview->setAuxItem(findItem()); + LLInventoryItem* item = findItem(); + if(item) + { + preview->setAuxItem(item); + } preview->setObjectID(mPanel->getTaskUUID()); } } @@ -1305,7 +1309,10 @@ void LLTaskNotecardBridge::openItem() || object->permModify() || gAgent.isGodlike()) { - LLPreviewNotecard* preview = LLFloaterReg::showTypedInstance("preview_notecard", LLSD(mUUID), TAKE_FOCUS_YES); + LLSD floater_key; + floater_key["taskid"] = mPanel->getTaskUUID(); + floater_key["itemid"] = mUUID; + LLPreviewNotecard* preview = LLFloaterReg::showTypedInstance("preview_notecard", floater_key, TAKE_FOCUS_YES); if (preview) { preview->setObjectID(mPanel->getTaskUUID()); diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 678a2cadd2..f3b2cc540c 100755 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -1066,6 +1066,9 @@ void LLPanelOutfitEdit::filterWearablesBySelectedItem(void) case LLAssetType::AT_BODYPART: applyListViewFilter(LVIT_BODYPART); break; + case LLAssetType::AT_GESTURE: + applyListViewFilter(LVIT_GESTURES); + break; case LLAssetType::AT_CLOTHING: default: applyListViewFilter(LVIT_CLOTHING); diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index 30870daf40..841bb4337a 100755 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -80,6 +80,7 @@ public: { LVIT_ALL = 0, LVIT_CLOTHING, + LVIT_GESTURES, LVIT_BODYPART, LVIT_ATTACHMENT, LVIT_SHAPE, diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 9316e6145a..b901ba2608 100755 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -1495,8 +1495,12 @@ void LLPanelPeople::onFriendsViewSortMenuItemClicked(const LLSD& userdata) } else if (chosen_item == "view_icons") { - mAllFriendList->toggleIcons(); - mOnlineFriendList->toggleIcons(); + std::string param = mAllFriendList->getIconParamName(); + gSavedSettings.setBOOL(param, !(gSavedSettings.getBOOL(param) && !gSavedSettings.getBOOL("GlobalShowIconsOverride"))); + gSavedSettings.setBOOL("GlobalShowIconsOverride", (!gSavedSettings.getBOOL(param) && gSavedSettings.getBOOL("GlobalShowIconsOverride"))); + gSavedSettings.setBOOL(mOnlineFriendList->getIconParamName(), gSavedSettings.getBOOL(param)); + mAllFriendList->setIconsVisible(gSavedSettings.getBOOL(param)); + mOnlineFriendList->setIconsVisible(gSavedSettings.getBOOL(param)); } else if (chosen_item == "view_permissions") { @@ -1532,7 +1536,10 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata) } else if (chosen_item == "view_icons") { - mNearbyList->toggleIcons(); + std::string param = mNearbyList->getIconParamName(); + gSavedSettings.setBOOL(param, !(gSavedSettings.getBOOL(param) && !gSavedSettings.getBOOL("GlobalShowIconsOverride"))); + gSavedSettings.setBOOL("GlobalShowIconsOverride", (!gSavedSettings.getBOOL(param) && gSavedSettings.getBOOL("GlobalShowIconsOverride"))); + mNearbyList->setIconsVisible(gSavedSettings.getBOOL(param)); } else if (chosen_item == "sort_distance") { @@ -1551,6 +1558,8 @@ bool LLPanelPeople::onNearbyViewSortMenuItemCheck(const LLSD& userdata) return sort_order == E_SORT_BY_NAME; if (item == "sort_distance") return sort_order == E_SORT_BY_DISTANCE; + if (item == "view_icons") + return gSavedSettings.getBOOL(mNearbyList->getIconParamName()) && !gSavedSettings.getBOOL("GlobalShowIconsOverride"); return false; } @@ -1569,7 +1578,10 @@ void LLPanelPeople::onRecentViewSortMenuItemClicked(const LLSD& userdata) } else if (chosen_item == "view_icons") { - mRecentList->toggleIcons(); + std::string param = mRecentList->getIconParamName(); + gSavedSettings.setBOOL(param, !(gSavedSettings.getBOOL(param) && !gSavedSettings.getBOOL("GlobalShowIconsOverride"))); + gSavedSettings.setBOOL("GlobalShowIconsOverride", (!gSavedSettings.getBOOL(param) && gSavedSettings.getBOOL("GlobalShowIconsOverride"))); + mRecentList->setIconsVisible(gSavedSettings.getBOOL(param)); } } @@ -1582,6 +1594,8 @@ bool LLPanelPeople::onFriendsViewSortMenuItemCheck(const LLSD& userdata) return sort_order == E_SORT_BY_NAME; if (item == "sort_status") return sort_order == E_SORT_BY_STATUS; + if (item == "view_icons") + return gSavedSettings.getBOOL(mAllFriendList->getIconParamName()) && !gSavedSettings.getBOOL("GlobalShowIconsOverride"); // FIRE-5283: Sort by username if (item == "sort_username") return sort_order == E_SORT_BY_USERNAME; @@ -1599,6 +1613,8 @@ bool LLPanelPeople::onRecentViewSortMenuItemCheck(const LLSD& userdata) return sort_order == E_SORT_BY_MOST_RECENT; if (item == "sort_name") return sort_order == E_SORT_BY_NAME; + if (item == "view_icons") + return gSavedSettings.getBOOL(mRecentList->getIconParamName()) && !gSavedSettings.getBOOL("GlobalShowIconsOverride"); return false; } diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp index 8fa9aac024..40326cfb39 100755 --- a/indra/newview/llpanelpick.cpp +++ b/indra/newview/llpanelpick.cpp @@ -148,6 +148,9 @@ BOOL LLPanelPickInfo::postBuild() mScrollingPanelMinHeight = mScrollContainer->getScrolledViewRect().getHeight(); mScrollingPanelWidth = mScrollingPanel->getRect().getWidth(); + LLTextEditor* text_desc = getChild(XML_DESC); + text_desc->setContentTrusted(false); + return TRUE; } diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp index 3bddb76ed9..1f911a1f11 100755 --- a/indra/newview/llpanelplaceinfo.cpp +++ b/indra/newview/llpanelplaceinfo.cpp @@ -223,7 +223,7 @@ void LLPanelPlaceInfo::setErrorStatus(S32 status, const std::string& reason) // virtual void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data) { - if(parcel_data.snapshot_id.notNull()) + if(mSnapshotCtrl) { mSnapshotCtrl->setImageAssetID(parcel_data.snapshot_id); } diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index a93153f1b0..9761631f3d 100755 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -242,6 +242,8 @@ void LLPanelPlaceProfile::resetLocation() mSubdivideText->setValue(loading); mResaleText->setValue(loading); mSaleToText->setValue(loading); + + getChild("sales_tab")->setVisible(TRUE); } // virtual @@ -556,6 +558,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, F32 dwell; BOOL for_sale; vpm->getDisplayInfo(&area, &claim_price, &rent_price, &for_sale, &dwell); + mForSalePanel->setVisible(for_sale); if (for_sale) { const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID(); @@ -574,8 +577,6 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, mSaleToText->setText(getString("anyone")); } - mForSalePanel->setVisible(for_sale); - // getString returns a temporary, taking the c_str will point to a location that is destroyed. // const U8* sign = (U8*)getString("price_text").c_str(); @@ -644,6 +645,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, mYouAreHerePanel->setVisible(is_current_parcel && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))); // [/RLVa:KB] getChild("sales_tab")->setVisible(for_sale); + mAccordionCtrl->arrange(); } void LLPanelPlaceProfile::updateEstateName(const std::string& name) diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp index ce2d63c6cb..43c0732098 100755 --- a/indra/newview/llpanelwearing.cpp +++ b/indra/newview/llpanelwearing.cpp @@ -168,7 +168,7 @@ protected: { bp_selected = true; } - else if (type == LLAssetType::AT_OBJECT) + else if (type == LLAssetType::AT_OBJECT || type == LLAssetType::AT_GESTURE) { attachments_selected = true; } diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index 55a921c3aa..796cfb8654 100755 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -262,6 +262,7 @@ void LLPreviewNotecard::loadAsset() else { LLHost source_sim = LLHost::invalid; + LLSD* user_data = new LLSD(); if (mObjectUUID.notNull()) { LLViewerObject *objectp = gObjectList.findObject(mObjectUUID); @@ -280,7 +281,13 @@ void LLPreviewNotecard::loadAsset() mAssetStatus = PREVIEW_ASSET_LOADED; return; } + user_data->with("taskid", mObjectUUID).with("itemid", mItemUUID); } + else + { + user_data = new LLSD(mItemUUID); + } + gAssetStorage->getInvItemAsset(source_sim, gAgent.getID(), gAgent.getSessionID(), @@ -290,7 +297,7 @@ void LLPreviewNotecard::loadAsset() item->getAssetUUID(), item->getType(), &onLoadComplete, - (void*)new LLUUID(mItemUUID), + (void*)user_data, TRUE); mAssetStatus = PREVIEW_ASSET_LOADING; } @@ -333,9 +340,8 @@ void LLPreviewNotecard::onLoadComplete(LLVFS *vfs, void* user_data, S32 status, LLExtStat ext_status) { LL_INFOS() << "LLPreviewNotecard::onLoadComplete()" << LL_ENDL; - LLUUID* item_id = (LLUUID*)user_data; - - LLPreviewNotecard* preview = LLFloaterReg::findTypedInstance("preview_notecard", LLSD(*item_id)); + LLSD* floater_key = (LLSD*)user_data; + LLPreviewNotecard* preview = LLFloaterReg::findTypedInstance("preview_notecard", *floater_key); if( preview ) { if(0 == status) @@ -395,7 +401,7 @@ void LLPreviewNotecard::onLoadComplete(LLVFS *vfs, preview->mAssetStatus = PREVIEW_ASSET_ERROR; } } - delete item_id; + delete floater_key; } // static diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 000fdcbc48..d36948755e 100755 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -1285,7 +1285,7 @@ void LLSelectMgr::setGridMode(EGridMode mode) updateSelectionCenter(); } -void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &scale) +void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &scale, bool for_snap_guides) { mGridObjects.cleanupNodes(); @@ -1310,7 +1310,15 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 & } else if (mGridMode == GRID_MODE_REF_OBJECT && first_grid_object && first_grid_object->mDrawable.notNull()) { - mGridRotation = first_grid_object->getRenderRotation(); + LLSelectNode *node = mSelectedObjects->findNode(first_grid_object); + if (!for_snap_guides && node) + { + mGridRotation = node->mSavedRotation; + } + else + { + mGridRotation = first_grid_object->getRenderRotation(); + } LLVector4a min_extents(F32_MAX); LLVector4a max_extents(-F32_MAX); diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 00a7b39db9..bb1e0908f9 100755 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -591,7 +591,7 @@ public: void clearGridObjects(); void setGridMode(EGridMode mode); EGridMode getGridMode() { return mGridMode; } - void getGrid(LLVector3& origin, LLQuaternion& rotation, LLVector3 &scale); + void getGrid(LLVector3& origin, LLQuaternion& rotation, LLVector3 &scale, bool for_snap_guides = false); BOOL getTEMode() { return mTEMode; } void setTEMode(BOOL b) { mTEMode = b; } diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp index 496e3b233c..185c73cc16 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -467,7 +467,10 @@ void LLSnapshotLivePreview::reshape(S32 width, S32 height, BOOL called_from_pare if (old_rect.getWidth() != width || old_rect.getHeight() != height) { LL_DEBUGS() << "window reshaped, updating thumbnail" << LL_ENDL; - updateSnapshot(TRUE); + if (mViewContainer && mViewContainer->isInVisibleChain()) + { + updateSnapshot(TRUE); + } } } diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 05cfb469ef..295eb1491b 100755 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -3855,16 +3855,10 @@ public: LLVector4a *mTangent; LLDrawable* mHit; BOOL mPickTransparent; -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL mPickRigged; -// [/SL:KB] -// LLOctreeIntersect(const LLVector4a& start, const LLVector4a& end, BOOL pick_transparent, -// S32* face_hit, LLVector4a* intersection, LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent) -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) LLOctreeIntersect(const LLVector4a& start, const LLVector4a& end, BOOL pick_transparent, BOOL pick_rigged, - S32* face_hit, LLVector4a* intersection, LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent) -// [/SL:KB] + S32* face_hit, LLVector4a* intersection, LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent) : mStart(start), mEnd(end), mFaceHit(face_hit), @@ -3873,11 +3867,8 @@ public: mNormal(normal), mTangent(tangent), mHit(NULL), -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) mPickTransparent(pick_transparent), mPickRigged(pick_rigged) -// [/SL:KB] -// mPickTransparent(pick_transparent) { } @@ -4015,15 +4006,9 @@ public: if (vobj->isAvatar()) { LLVOAvatar* avatar = (LLVOAvatar*) vobj; -// if (avatar->isSelf() && LLFloater::isVisible(gFloaterTools)) -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) - if ( (mPickRigged) || ((avatar->isSelf()) && (LLFloater::isVisible(gFloaterTools))) ) -// [/SL:KB] + if ((mPickRigged) || ((avatar->isSelf()) && (LLFloater::isVisible(gFloaterTools)))) { -// LLViewerObject* hit = avatar->lineSegmentIntersectRiggedAttachments(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mTangent); -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) LLViewerObject* hit = avatar->lineSegmentIntersectRiggedAttachments(mStart, mEnd, -1, mPickTransparent, mPickRigged, mFaceHit, &intersection, mTexCoord, mNormal, mTangent); -// [/SL:KB] if (hit) { mEnd = intersection; @@ -4039,10 +4024,7 @@ public: } } -// if (!skip_check && vobj->lineSegmentIntersect(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mTangent)) -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) if (!skip_check && vobj->lineSegmentIntersect(mStart, mEnd, -1, mPickTransparent, mPickRigged, mFaceHit, &intersection, mTexCoord, mNormal, mTangent)) -// [/SL:KB] { mEnd = intersection; // shorten ray so we only find CLOSER hits if (mIntersection) @@ -4060,10 +4042,8 @@ public: } LL_ALIGN_POSTFIX(16); LLDrawable* LLSpatialPartition::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, - BOOL pick_transparent, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) + BOOL pick_transparent, BOOL pick_rigged, -// [/SL:KB] S32* face_hit, // return the face hit LLVector4a* intersection, // return the intersection point LLVector2* tex_coord, // return the texture coordinates of the intersection point @@ -4072,10 +4052,7 @@ LLDrawable* LLSpatialPartition::lineSegmentIntersect(const LLVector4a& start, co ) { -// LLOctreeIntersect intersect(start, end, pick_transparent, face_hit, intersection, tex_coord, normal, tangent); -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) LLOctreeIntersect intersect(start, end, pick_transparent, pick_rigged, face_hit, intersection, tex_coord, normal, tangent); -// [/SL:KB] LLDrawable* drawable = intersect.check(mOctree); return drawable; diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index a1c1205ff8..7633e46200 100755 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -386,9 +386,7 @@ public: LLDrawable* lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, BOOL pick_transparent, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL pick_rigged, -// [/SL:KB] S32* face_hit, // return the face hit LLVector4a* intersection = NULL, // return the intersection point LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point diff --git a/indra/newview/llsyswellitem.cpp b/indra/newview/llsyswellitem.cpp index 057d80457c..2a58f018e7 100755 --- a/indra/newview/llsyswellitem.cpp +++ b/indra/newview/llsyswellitem.cpp @@ -43,6 +43,7 @@ LLSysWellItem::LLSysWellItem(const Params& p) : LLPanel(p), mTitle = getChild("title"); mCloseBtn = getChild("close_btn"); + mTitle->setContentTrusted(false); mTitle->setValue(p.title); mCloseBtn->setClickedCallback(boost::bind(&LLSysWellItem::onClickCloseBtn,this)); diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index 6062cedfcb..0d4214a146 100755 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -111,6 +111,7 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(const LLNotificationPtr& notifi LLStringUtil::format(timeStr, substitution); LLViewerTextEditor* pMessageText = getChild("message"); + pMessageText->setContentTrusted(false); pMessageText->clear(); LLStyle::Params style; diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index ef543967d9..13a2af1d8b 100755 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -872,7 +872,7 @@ void LLToolDragAndDrop::dragOrDrop3D( S32 x, S32 y, MASK mask, BOOL drop, EAccep // [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) pick(gViewerWindow->pickImmediate(x, y, FALSE, FALSE, FALSE)); // [/SL:KB] -// pick(gViewerWindow->pickImmediate(x, y, FALSE)); +// pick(gViewerWindow->pickImmediate(x, y, FALSE, FALSE)); } else { @@ -880,7 +880,7 @@ void LLToolDragAndDrop::dragOrDrop3D( S32 x, S32 y, MASK mask, BOOL drop, EAccep // [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) gViewerWindow->pickAsync(x, y, mask, pickCallback, FALSE, FALSE, FALSE); // [/SL:KB] -// gViewerWindow->pickAsync(x, y, mask, pickCallback, FALSE); +// gViewerWindow->pickAsync(x, y, mask, pickCallback, FALSE, FALSE); } *acceptance = mLastAccept; diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp index b0f814bd46..f1ff3229ee 100755 --- a/indra/newview/lltoolfocus.cpp +++ b/indra/newview/lltoolfocus.cpp @@ -136,7 +136,10 @@ BOOL LLToolCamera::handleMouseDown(S32 x, S32 y, MASK mask) gViewerWindow->hideCursor(); - gViewerWindow->pickAsync(x, y, mask, pickCallback, FALSE, TRUE); + // Viewer-Bear merge (MAINT-5416: select rigged attachments): Since LL swapped parameter order, we need to take account of that or we produce fail like LL did :) + //gViewerWindow->pickAsync(x, y, mask, pickCallback, FALSE, TRUE); + gViewerWindow->pickAsync(x, y, mask, pickCallback, FALSE, FALSE, TRUE); + // return TRUE; } diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 8779f84db3..e5ee96e1f4 100755 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -115,7 +115,7 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask) mMouseDownY = y; //left mouse down always picks transparent -// mPick = gViewerWindow->pickImmediate(x, y, TRUE); +// mPick = gViewerWindow->pickImmediate(x, y, TRUE, FALSE); // [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) mPick = gViewerWindow->pickImmediate(x, y, TRUE, FALSE, FALSE); // [/SL:KB] @@ -593,7 +593,7 @@ void LLToolPie::selectionPropertiesReceived() BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask) { -// mHoverPick = gViewerWindow->pickImmediate(x, y, FALSE); +// mHoverPick = gViewerWindow->pickImmediate(x, y, FALSE, FALSE); // [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) mHoverPick = gViewerWindow->pickImmediate(x, y, FALSE, FALSE, FALSE); // [/SL:KB] @@ -662,7 +662,7 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask) else { // perform a separate pick that detects transparent objects since they respond to 1-click actions -// LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, TRUE); +// LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, TRUE, FALSE); // [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, TRUE, FALSE, FALSE); // [/SL:KB] diff --git a/indra/newview/lltoolplacer.cpp b/indra/newview/lltoolplacer.cpp index 350e3f3497..74cd07e1e3 100755 --- a/indra/newview/lltoolplacer.cpp +++ b/indra/newview/lltoolplacer.cpp @@ -117,7 +117,7 @@ BOOL LLToolPlacer::raycastForNewObjPos( S32 x, S32 y, LLViewerObject** hit_obj, // Viewer-side pick to find the right sim to create the object on. // First find the surface the object will be created on. -// LLPickInfo pick = gViewerWindow->pickImmediate(x, y, FALSE); +// LLPickInfo pick = gViewerWindow->pickImmediate(x, y, FALSE, FALSE); // [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) LLPickInfo pick = gViewerWindow->pickImmediate(x, y, FALSE, FALSE, FALSE); // [/SL:KB] diff --git a/indra/newview/lltoolselect.cpp b/indra/newview/lltoolselect.cpp index bdb686ecc2..df24f36318 100755 --- a/indra/newview/lltoolselect.cpp +++ b/indra/newview/lltoolselect.cpp @@ -70,7 +70,7 @@ BOOL LLToolSelect::handleMouseDown(S32 x, S32 y, MASK mask) // [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) mPick = gViewerWindow->pickImmediate(x, y, TRUE, FALSE, FALSE); // [/SL:KB] -// mPick = gViewerWindow->pickImmediate(x, y, TRUE); +// mPick = gViewerWindow->pickImmediate(x, y, TRUE, FALSE); // Pass mousedown to agent LLTool::handleMouseDown(x, y, mask); diff --git a/indra/newview/lltoolselectrect.cpp b/indra/newview/lltoolselectrect.cpp index f05c3bcd53..eb56859e43 100755 --- a/indra/newview/lltoolselectrect.cpp +++ b/indra/newview/lltoolselectrect.cpp @@ -71,7 +71,7 @@ void dialog_refresh_all(void); BOOL LLToolSelectRect::handleMouseDown(S32 x, S32 y, MASK mask) { -// handlePick(gViewerWindow->pickImmediate(x, y, TRUE)); +// handlePick(gViewerWindow->pickImmediate(x, y, TRUE, FALSE)); // [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) handlePick(gViewerWindow->pickImmediate(x, y, TRUE, FALSE, FALSE)); // [/SL:KB] diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index b545620c06..3b664bc50e 100755 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -4192,9 +4192,7 @@ LLViewerObject* LLViewerObject::getRootEdit() const BOOL LLViewerObject::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL pick_rigged, -// [/SL:KB] S32* face_hit, LLVector4a* intersection, LLVector2* tex_coord, diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 1b6078795a..62b2875d24 100755 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -271,9 +271,7 @@ public: virtual BOOL lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face = -1, // which face to check, -1 = ALL_SIDES BOOL pick_transparent = FALSE, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL pick_rigged = FALSE, -// [/SL:KB] S32* face_hit = NULL, // which face was hit LLVector4a* intersection = NULL, // return the intersection point LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 80ea22b93d..0a2630ba93 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1216,7 +1216,7 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi if (prim_media_dnd_enabled) { -// LLPickInfo pick_info = pickImmediate( pos.mX, pos.mY, TRUE /*BOOL pick_transparent*/ ); +// LLPickInfo pick_info = pickImmediate( pos.mX, pos.mY, TRUE /*BOOL pick_transparent*/, FALSE ); // [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) LLPickInfo pick_info = pickImmediate( pos.mX, pos.mY, TRUE /*BOOL pick_transparent*/, FALSE, FALSE); // [/SL:KB] @@ -3360,7 +3360,6 @@ void LLViewerWindow::updateUI() if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RAYCAST)) { gDebugRaycastFaceHit = -1; -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) gDebugRaycastObject = cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, FALSE, &gDebugRaycastFaceHit, &gDebugRaycastIntersection, @@ -3369,15 +3368,6 @@ void LLViewerWindow::updateUI() &gDebugRaycastTangent, &gDebugRaycastStart, &gDebugRaycastEnd); -// [/SL:KB] -// gDebugRaycastObject = cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, -// &gDebugRaycastFaceHit, -// &gDebugRaycastIntersection, -// &gDebugRaycastTexCoord, -// &gDebugRaycastNormal, -// &gDebugRaycastBinormal, -// &gDebugRaycastStart, -// &gDebugRaycastEnd); gDebugRaycastParticle = gPipeline.lineSegmentIntersectParticle(gDebugRaycastStart, gDebugRaycastEnd, &gDebugRaycastParticleIntersection, NULL); } @@ -4214,11 +4204,8 @@ void LLViewerWindow::pickAsync( S32 x, MASK mask, void (*callback)(const LLPickInfo& info), BOOL pick_transparent, -// BOOL pick_unselectable) -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) - BOOL pick_unselectable, - BOOL pick_rigged) -// [/SL:KB] + BOOL pick_rigged, + BOOL pick_unselectable) { BOOL in_build_mode = LLFloaterReg::instanceVisible("build"); if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha) @@ -4228,10 +4215,7 @@ void LLViewerWindow::pickAsync( S32 x, pick_transparent = TRUE; } -// LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, FALSE, TRUE, pick_unselectable, callback); -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) - LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, FALSE, pick_rigged, TRUE, pick_unselectable, callback); -// [/SL:KB] + LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, pick_rigged, FALSE, TRUE, pick_unselectable, callback); schedulePick(pick_info); } @@ -4287,10 +4271,7 @@ void LLViewerWindow::returnEmptyPicks() } // Performs the GL object/land pick. -//LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot, BOOL pick_transparent, BOOL pick_particle) -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) -LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot, BOOL pick_transparent, BOOL pick_particle, BOOL pick_rigged) -// [/SL:KB] +LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot, BOOL pick_transparent, BOOL pick_rigged, BOOL pick_particle) { BOOL in_build_mode = LLFloaterReg::instanceVisible("build"); if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha) @@ -4302,10 +4283,7 @@ LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot, BOOL pick_trans // shortcut queueing in mPicks and just update mLastPick in place MASK key_mask = gKeyboard->currentMask(TRUE); - //mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, pick_particle, TRUE, FALSE, NULL); -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) - mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, pick_particle, pick_rigged, TRUE, FALSE, NULL); -// [/SL:KB] + mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, pick_rigged, pick_particle, TRUE, FALSE, NULL); mLastPick.fetchResults(); return mLastPick; @@ -4341,9 +4319,7 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de LLViewerObject *this_object, S32 this_face, BOOL pick_transparent, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL pick_rigged, -// [/SL:KB] S32* face_hit, LLVector4a *intersection, LLVector2 *uv, @@ -4414,25 +4390,16 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de { if (this_object->isHUDAttachment()) // is a HUD object? { -// if (this_object->lineSegmentIntersect(mh_start, mh_end, this_face, pick_transparent, -// face_hit, intersection, uv, normal, tangent)) -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) if (this_object->lineSegmentIntersect(mh_start, mh_end, this_face, pick_transparent, pick_rigged, face_hit, intersection, uv, normal, tangent)) - -// [/SL:KB] { found = this_object; } } else // is a world object { -// if (this_object->lineSegmentIntersect(mw_start, mw_end, this_face, pick_transparent, -// face_hit, intersection, uv, normal, tangent)) -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) if (this_object->lineSegmentIntersect(mw_start, mw_end, this_face, pick_transparent, pick_rigged, face_hit, intersection, uv, normal, tangent)) -// [/SL:KB] { found = this_object; } @@ -4452,13 +4419,8 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de // [/RLVa:KB] if (!found) // if not found in HUD, look in world: { -// found = gPipeline.lineSegmentIntersectInWorld(mw_start, mw_end, pick_transparent, -// face_hit, intersection, uv, normal, tangent); -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) found = gPipeline.lineSegmentIntersectInWorld(mw_start, mw_end, pick_transparent, pick_rigged, face_hit, intersection, uv, normal, tangent); - -// [/SL:KB] if (found && !pick_transparent) { gDebugRaycastIntersection = *intersection; @@ -5913,21 +5875,16 @@ LLPickInfo::LLPickInfo() mBinormal(), mHUDIcon(NULL), mPickTransparent(FALSE), -// mPickParticle(FALSE) -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) - mPickParticle(FALSE), - mPickRigged(FALSE) -// [/SL:KB] + mPickRigged(FALSE), + mPickParticle(FALSE) { } LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos, MASK keyboard_mask, BOOL pick_transparent, + BOOL pick_rigged, BOOL pick_particle, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) - BOOL pick_rigged, -// [/SL:KB] BOOL pick_uv_coords, BOOL pick_unselectable, void (*pick_callback)(const LLPickInfo& pick_info)) @@ -5945,12 +5902,9 @@ LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos, mBinormal(), mHUDIcon(NULL), mPickTransparent(pick_transparent), + mPickRigged(pick_rigged), mPickParticle(pick_particle), -// mPickUnselectable(pick_unselectable) -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) - mPickUnselectable(pick_unselectable), - mPickRigged(pick_rigged) -// [/SL:KB] + mPickUnselectable(pick_unselectable) { } @@ -5978,14 +5932,9 @@ void LLPickInfo::fetchResults() delta.setSub(intersection, origin); icon_dist = delta.getLength3().getF32(); } -// LLViewerObject* hit_object = gViewerWindow->cursorIntersect(mMousePt.mX, mMousePt.mY, 512.f, -// NULL, -1, mPickTransparent, &face_hit, -// &intersection, &uv, &normal, &binormal); -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) LLViewerObject* hit_object = gViewerWindow->cursorIntersect(mMousePt.mX, mMousePt.mY, 512.f, NULL, -1, mPickTransparent, mPickRigged, &face_hit, &intersection, &uv, &normal, &tangent, &start, &end); -// [/SL:KB] mPickPt = mMousePt; @@ -6128,14 +6077,6 @@ void LLPickInfo::getSurfaceInfo() if (objectp) { -// if (gViewerWindow->cursorIntersect(ll_round((F32)mMousePt.mX), ll_round((F32)mMousePt.mY), 1024.f, -// objectp, -1, mPickTransparent, -// &mObjectFace, -// &mIntersection, -// &mSTCoords, -// &mNormal, -// &mBinormal)) -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) if (gViewerWindow->cursorIntersect(ll_round((F32)mMousePt.mX), ll_round((F32)mMousePt.mY), 1024.f, objectp, -1, mPickTransparent, mPickRigged, &mObjectFace, @@ -6143,7 +6084,6 @@ void LLPickInfo::getSurfaceInfo() &mSTCoords, &normal, &tangent)) -// [/SL:KB] { // if we succeeded with the intersect above, compute the texture coordinates: diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 45489c269f..7b8301c6a6 100755 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -90,10 +90,8 @@ public: LLPickInfo(const LLCoordGL& mouse_pos, MASK keyboard_mask, BOOL pick_transparent, - BOOL pick_particle, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL pick_rigged, -// [/SL:KB] + BOOL pick_particle, BOOL pick_surface_info, BOOL pick_unselectable, void (*pick_callback)(const LLPickInfo& pick_info)); @@ -127,11 +125,9 @@ public: LLVector4 mTangent; LLVector3 mBinormal; BOOL mPickTransparent; + BOOL mPickRigged; BOOL mPickParticle; BOOL mPickUnselectable; -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) - BOOL mPickRigged; -// [/SL:KB] void getSurfaceInfo(); private: @@ -371,23 +367,14 @@ public: void performPick(); void returnEmptyPicks(); -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) void pickAsync( S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& pick_info), BOOL pick_transparent = FALSE, - BOOL pick_unselectable = FALSE, - BOOL pick_rigged = FALSE); - LLPickInfo pickImmediate(S32 x, S32 y, BOOL pick_transparent, BOOL pick_particle = FALSE, BOOL pick_rigged = FALSE); -// [/SL:KB] -// void pickAsync( S32 x, -// S32 y_from_bot, -// MASK mask, -// void (*callback)(const LLPickInfo& pick_info), -// BOOL pick_transparent = FALSE, -// BOOL pick_unselectable = FALSE); -// LLPickInfo pickImmediate(S32 x, S32 y, BOOL pick_transparent, BOOL pick_particle = FALSE); + BOOL pick_rigged = FALSE, + BOOL pick_unselectable = FALSE); + LLPickInfo pickImmediate(S32 x, S32 y, BOOL pick_transparent, BOOL pick_rigged = FALSE, BOOL pick_particle = FALSE); LLHUDIcon* cursorIntersectIcon(S32 mouse_x, S32 mouse_y, F32 depth, LLVector4a* intersection); @@ -395,9 +382,7 @@ public: LLViewerObject *this_object = NULL, S32 this_face = -1, BOOL pick_transparent = FALSE, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL pick_rigged = FALSE, -// [/SL:KB] S32* face_hit = NULL, LLVector4a *intersection = NULL, LLVector2 *uv = NULL, diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index d63465a523..5eed93b52e 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1588,9 +1588,7 @@ void LLVOAvatar::renderJoints() BOOL LLVOAvatar::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL pick_rigged, -// [/SL:KB] S32* face_hit, LLVector4a* intersection, LLVector2* tex_coord, @@ -1697,9 +1695,7 @@ BOOL LLVOAvatar::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& LLViewerObject* LLVOAvatar::lineSegmentIntersectRiggedAttachments(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL pick_rigged, -// [/SL:KB] S32* face_hit, LLVector4a* intersection, LLVector2* tex_coord, @@ -1737,10 +1733,7 @@ LLViewerObject* LLVOAvatar::lineSegmentIntersectRiggedAttachments(const LLVector { LLViewerObject* attached_object = (*attachment_iter); -// if (attached_object->lineSegmentIntersect(start, local_end, face, pick_transparent, face_hit, &local_intersection, tex_coord, normal, tangent)) -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) if (attached_object->lineSegmentIntersect(start, local_end, face, pick_transparent, pick_rigged, face_hit, &local_intersection, tex_coord, normal, tangent)) -// [/SL:KB] { local_end = local_intersection; if (intersection) diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 3710cb97c3..5d397f7532 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -166,9 +166,7 @@ public: /*virtual*/ BOOL lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face = -1, // which face to check, -1 = ALL_SIDES BOOL pick_transparent = FALSE, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL pick_rigged = FALSE, -// [/SL:KB] S32* face_hit = NULL, // which face was hit LLVector4a* intersection = NULL, // return the intersection point LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point @@ -177,9 +175,7 @@ public: LLViewerObject* lineSegmentIntersectRiggedAttachments(const LLVector4a& start, const LLVector4a& end, S32 face = -1, // which face to check, -1 = ALL_SIDES BOOL pick_transparent = FALSE, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL pick_rigged = FALSE, -// [/SL:KB] S32* face_hit = NULL, // which face was hit LLVector4a* intersection = NULL, // return the intersection point LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp index a141fd4bb6..508c3155d9 100755 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -814,12 +814,8 @@ void LLVOGrass::updateDrawable(BOOL force_damped) } // virtual -//BOOL LLVOGrass::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, S32 *face_hitp, -// LLVector4a* intersection,LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent) -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL LLVOGrass::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, BOOL pick_rigged, S32 *face_hitp, LLVector4a* intersection,LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent) -// [/SL:KB] { BOOL ret = FALSE; if (!mbCanSelect || diff --git a/indra/newview/llvograss.h b/indra/newview/llvograss.h index 132a0d3da3..a0b956796c 100755 --- a/indra/newview/llvograss.h +++ b/indra/newview/llvograss.h @@ -78,9 +78,7 @@ public: /*virtual*/ BOOL lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face = -1, // which face to check, -1 = ALL_SIDES BOOL pick_transparent = FALSE, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL pick_rigged = FALSE, -// [/SL:KB] S32* face_hit = NULL, // which face was hit LLVector4a* intersection = NULL, // return the intersection point LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp index da716b721c..eab561d05f 100755 --- a/indra/newview/llvosurfacepatch.cpp +++ b/indra/newview/llvosurfacepatch.cpp @@ -936,12 +936,8 @@ void LLVOSurfacePatch::getGeomSizesEast(const S32 stride, const S32 east_stride, } } -//BOOL LLVOSurfacePatch::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, S32 *face_hitp, -// LLVector4a* intersection,LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent) -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL LLVOSurfacePatch::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, BOOL pick_rigged, S32 *face_hitp, LLVector4a* intersection,LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent) -// [/SL:KB] { diff --git a/indra/newview/llvosurfacepatch.h b/indra/newview/llvosurfacepatch.h index 550400b476..884dbb3be3 100755 --- a/indra/newview/llvosurfacepatch.h +++ b/indra/newview/llvosurfacepatch.h @@ -84,9 +84,7 @@ public: /*virtual*/ BOOL lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face = -1, // which face to check, -1 = ALL_SIDES BOOL pick_transparent = FALSE, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL pick_rigged = FALSE, -// [/SL:KB] S32* face_hit = NULL, // which face was hit LLVector4a* intersection = NULL, // return the intersection point LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 2c318a89bf..c9ca6d10e7 100755 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -1121,13 +1121,8 @@ void LLVOTree::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax) mDrawable->setPositionGroup(pos); } -//BOOL LLVOTree::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, S32 *face_hitp, -// LLVector4a* intersection,LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent) -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL LLVOTree::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, BOOL pick_rigged, S32 *face_hitp, LLVector4a* intersection,LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent) - -// [/SL:KB] { if (!lineSegmentBoundingBox(start, end)) diff --git a/indra/newview/llvotree.h b/indra/newview/llvotree.h index 99fe34e24f..1b66add14f 100755 --- a/indra/newview/llvotree.h +++ b/indra/newview/llvotree.h @@ -108,9 +108,7 @@ public: /*virtual*/ BOOL lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face = -1, // which face to check, -1 = ALL_SIDES BOOL pick_transparent = FALSE, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL pick_rigged = FALSE, -// [/SL:KB] S32* face_hit = NULL, // which face was hit LLVector4a* intersection = NULL, // return the intersection point LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 725e282755..aed6d9cead 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -3966,13 +3966,8 @@ LLVector3 LLVOVolume::volumeDirectionToAgent(const LLVector3& dir) const } -//BOOL LLVOVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, S32 *face_hitp, -// LLVector4a* intersection,LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent) -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL LLVOVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, BOOL pick_rigged, S32 *face_hitp, LLVector4a* intersection,LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent) - -// [/SL:KB] { if (!mbCanSelect || mDrawable->isDead() @@ -3989,15 +3984,12 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& if (mDrawable->isState(LLDrawable::RIGGED)) { -// if (LLFloater::isVisible(gFloaterTools) && getAvatar()->isSelf()) + if ((pick_rigged) || ((getAvatar()->isSelf()) && (LLFloater::isVisible(gFloaterTools)))) // [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) if ( (pick_rigged) || ( getAvatar() && getAvatar()->isSelf() && (LLFloater::isVisible(gFloaterTools))) ) // [/SL:KB] { -// updateRiggedVolume(); -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) updateRiggedVolume(true); -// [/SL:KB] volume = mRiggedVolume; transform = false; } @@ -4176,13 +4168,8 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& bool LLVOVolume::treatAsRigged() { -// return LLFloater::isVisible(gFloaterTools) && -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) return isSelected() && -// [/SL:KB] - isAttachment() && -// getAvatar() && -// getAvatar()->isSelf() && + isAttachment() && mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED); } @@ -4201,18 +4188,12 @@ void LLVOVolume::clearRiggedVolume() } } -//void LLVOVolume::updateRiggedVolume() -// [SL:KB] void LLVOVolume::updateRiggedVolume(bool force_update) -// [/SL:KB] { //Update mRiggedVolume to match current animation frame of avatar. //Also update position/size in octree. -// if (!treatAsRigged()) -// [SL:KB] - if ( (!force_update) && (!treatAsRigged()) ) -// [/SL:KB] + if ((!force_update) && (!treatAsRigged())) { clearRiggedVolume(); diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index b300b5046c..3ab12a1dd8 100755 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -141,9 +141,7 @@ public: /*virtual*/ BOOL lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face = -1, // which face to check, -1 = ALL_SIDES BOOL pick_transparent = FALSE, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL pick_rigged = FALSE, -// [/SL:KB] S32* face_hit = NULL, // which face was hit LLVector4a* intersection = NULL, // return the intersection point LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point @@ -316,10 +314,7 @@ public: //rigged volume update (for raycasting) -// void updateRiggedVolume(); -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) void updateRiggedVolume(bool force_update = false); -// [/SL:KB] LLRiggedVolume* getRiggedVolume(); //returns true if volume should be treated as a rigged volume diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index 8bae5a28b3..35d21ebe12 100755 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -35,6 +35,7 @@ #include "llappearancemgr.h" #include "llinventoryfunctions.h" #include "llinventoryicon.h" +#include "llgesturemgr.h" #include "lltransutil.h" #include "llviewerattachmenu.h" // [SL:KB] - Patch: Inventory-AttachmentEdit - Checked: 2010-09-04 (Catznip-2.2.0a) | Added: Catznip-2.1.2a @@ -62,7 +63,8 @@ bool LLFindOutfitItems::operator()(LLInventoryCategory* cat, { if((item->getType() == LLAssetType::AT_CLOTHING) || (item->getType() == LLAssetType::AT_BODYPART) - || (item->getType() == LLAssetType::AT_OBJECT)) + || (item->getType() == LLAssetType::AT_OBJECT) + || (item->getType() == LLAssetType::AT_GESTURE)) { return TRUE; } @@ -498,6 +500,7 @@ LLWearableItemTypeNameComparator::LLWearableItemTypeNameComparator() mWearableOrder[LLAssetType::AT_CLOTHING] = LLWearableTypeOrder(ORDER_RANK_1, false, false); mWearableOrder[LLAssetType::AT_OBJECT] = LLWearableTypeOrder(ORDER_RANK_2, true, true); mWearableOrder[LLAssetType::AT_BODYPART] = LLWearableTypeOrder(ORDER_RANK_3, false, true); + mWearableOrder[LLAssetType::AT_GESTURE] = LLWearableTypeOrder(ORDER_RANK_4, true, false); } void LLWearableItemTypeNameComparator::setOrder(LLAssetType::EType items_of_type, LLWearableItemTypeNameComparator::ETypeListOrder order_priority, bool sort_asset_items_by_name, bool sort_wearable_items_by_name) @@ -1070,6 +1073,10 @@ void LLWearableItemsList::ContextMenu::updateMask(U32& mask, LLAssetType::EType { mask |= MASK_ATTACHMENT; } + else if (at == LLAssetType::AT_GESTURE) + { + mask |= MASK_GESTURE; + } else { mask |= MASK_UNKNOWN; diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index e6788ab249..df4b1a8a50 100755 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -310,6 +310,7 @@ public: ORDER_RANK_1 = 1, ORDER_RANK_2, ORDER_RANK_3, + ORDER_RANK_4, ORDER_RANK_UNKNOWN }; @@ -419,7 +420,8 @@ public: MASK_CLOTHING = 0x01, MASK_BODYPART = 0x02, MASK_ATTACHMENT = 0x04, - MASK_UNKNOWN = 0x08, + MASK_GESTURE = 0x08, + MASK_UNKNOWN = 0x16, }; /* virtual */ LLContextMenu* createMenu(); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index a5601fb25b..9d3f01034d 100755 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -7171,10 +7171,8 @@ LLVOPartGroup* LLPipeline::lineSegmentIntersectParticle(const LLVector4a& start, } LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start, const LLVector4a& end, - BOOL pick_transparent, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) + BOOL pick_transparent, BOOL pick_rigged, -// [/SL:KB] S32* face_hit, LLVector4a* intersection, // return the intersection point LLVector2* tex_coord, // return the texture coordinates of the intersection point @@ -7206,10 +7204,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start, LLSpatialPartition* part = region->getSpatialPartition(j); if (part && hasRenderType(part->mDrawableType)) { -// LLDrawable* hit = part->lineSegmentIntersect(start, local_end, pick_transparent, face_hit, &position, tex_coord, normal, tangent); -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) LLDrawable* hit = part->lineSegmentIntersect(start, local_end, pick_transparent, pick_rigged, face_hit, &position, tex_coord, normal, tangent); -// [/SL:KB] if (hit) { drawable = hit; @@ -7266,10 +7261,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start, LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_BRIDGE); if (part && hasRenderType(part->mDrawableType)) { -// LLDrawable* hit = part->lineSegmentIntersect(start, local_end, pick_transparent, face_hit, &position, tex_coord, normal, tangent); -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) LLDrawable* hit = part->lineSegmentIntersect(start, local_end, pick_transparent, pick_rigged, face_hit, &position, tex_coord, normal, tangent); -// [/SL:KB] if (hit) { LLVector4a delta; @@ -7357,10 +7349,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInHUD(const LLVector4a& start, c LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_HUD); if (part) { -// LLDrawable* hit = part->lineSegmentIntersect(start, end, pick_transparent, face_hit, intersection, tex_coord, normal, tangent); -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) LLDrawable* hit = part->lineSegmentIntersect(start, end, pick_transparent, FALSE, face_hit, intersection, tex_coord, normal, tangent); -// [/SL:KB] if (hit) { drawable = hit; diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 93aabf68b0..cbfbd159d0 100755 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -183,9 +183,7 @@ public: //get the object between start and end that's closest to start. LLViewerObject* lineSegmentIntersectInWorld(const LLVector4a& start, const LLVector4a& end, BOOL pick_transparent, -// [SL:KB] - Patch: UI-PickRiggedAttachment | Checked: 2012-07-12 (Catznip-3.3) BOOL pick_rigged, -// [/SL:KB] S32* face_hit, // return the face hit LLVector4a* intersection = NULL, // return the intersection point LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point diff --git a/indra/newview/skins/default/xui/en/menu_participant_view.xml b/indra/newview/skins/default/xui/en/menu_participant_view.xml index 7ea87ee05c..658238bf41 100755 --- a/indra/newview/skins/default/xui/en/menu_participant_view.xml +++ b/indra/newview/skins/default/xui/en/menu_participant_view.xml @@ -59,6 +59,19 @@ function="IMFloaterContainer.Check" parameter="sort_participants_by_recent" /> + + + + + + function="People.Friends.ViewSort.CheckItem" + parameter="view_icons" /> + function="People.Nearby.ViewSort.CheckItem" + parameter="view_icons"/> + function="People.Recent.ViewSort.CheckItem" + parameter="view_icons" /> 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 526068b752..bf46fb68f8 100644 --- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml @@ -117,26 +117,37 @@ name="Media" value="Media" /> - - - - - + + + + + Mapping