diff options
Diffstat (limited to 'indra/newview')
132 files changed, 2717 insertions, 1906 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 001cdf2de4..05483c4608 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -44,7 +44,6 @@ include(OPENAL) include(OpenGL) include(OpenSSL) include(PNG) -include(Prebuilt) include(TemplateCheck) include(UI) include(UnixInstall) @@ -62,9 +61,6 @@ if(FMODEX) include_directories(${FMODEX_INCLUDE_DIR}) endif(FMODEX) -# install SLPlugin host executable and its dynamic-library plugins -use_prebuilt_binary(slplugins) - include_directories( ${DBUSGLIB_INCLUDE_DIRS} ${JSONCPP_INCLUDE_DIR} @@ -1375,7 +1371,6 @@ if (DARWIN) set(viewer_RESOURCE_FILES secondlife.icns macview.r - gpu_table.txt Info-SecondLife.plist SecondLife.xib/ # CMake doesn't seem to support Xcode language variants well just yet @@ -1770,44 +1765,12 @@ if (WINDOWS) ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt ${CMAKE_CURRENT_SOURCE_DIR}/featuretable_xp.txt ${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/qtcore4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/qtgui4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/qtnetwork4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/qtopengl4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/qtwebkit4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/qtxmlpatterns4.dll ${ARCH_PREBUILT_DIRS_RELEASE}/ssleay32.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qgif4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qico4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qjpeg4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qmng4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qsvg4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qtiff4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qcncodecs4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qjpcodecs4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qkrcodecs4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qtwcodecs4.dll ${ARCH_PREBUILT_DIRS_DEBUG}/libeay32.dll - ${ARCH_PREBUILT_DIRS_DEBUG}/qtcored4.dll - ${ARCH_PREBUILT_DIRS_DEBUG}/qtguid4.dll - ${ARCH_PREBUILT_DIRS_DEBUG}/qtnetworkd4.dll - ${ARCH_PREBUILT_DIRS_DEBUG}/qtopengld4.dll - ${ARCH_PREBUILT_DIRS_DEBUG}/qtwebkitd4.dll - ${ARCH_PREBUILT_DIRS_DEBUG}/qtxmlpatternsd4.dll ${ARCH_PREBUILT_DIRS_DEBUG}/ssleay32.dll - ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qgifd4.dll - ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qicod4.dll - ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qjpegd4.dll - ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qmngd4.dll - ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qsvgd4.dll - ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qtiffd4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qcncodecsd4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qjpcodecsd4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qkrcodecsd4.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qtwcodecsd4.dll SLPlugin media_plugin_quicktime - media_plugin_webkit + media_plugin_cef winmm_shim windows-crash-logger ) @@ -1852,10 +1815,10 @@ if (WINDOWS) add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts) endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) -## add_dependencies(${VIEWER_BINARY_NAME} -## SLPlugin -## windows-crash-logger -## ) + add_dependencies(${VIEWER_BINARY_NAME} + SLPlugin + windows-crash-logger + ) # sets the 'working directory' for debugging from visual studio. if (NOT UNATTENDED) @@ -2022,9 +1985,8 @@ if (LINUX) set(COPY_INPUT_DEPENDENCIES ${VIEWER_BINARY_NAME} linux-crash-logger -## SLPlugin -## media_plugin_webkit -## media_plugin_gstreamer010 + SLPlugin + media_plugin_gstreamer010 llcommon ) @@ -2136,7 +2098,7 @@ if (DARWIN) ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ) -##add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit mac-crash-logger) + add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_cef mac-crash-logger) add_dependencies(${VIEWER_BINARY_NAME} mac-crash-logger) if (ENABLE_SIGNING) @@ -2191,20 +2153,19 @@ if (PACKAGE) if (DARWIN) list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") # *TODO: Generate these search dirs in the cmake files related to each binary. -## list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/llplugin/slplugin/${CMAKE_CFG_INTDIR}") + list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/llplugin/slplugin/${CMAKE_CFG_INTDIR}") list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/mac_crash_logger/${CMAKE_CFG_INTDIR}") -## list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/gstreamer010/${CMAKE_CFG_INTDIR}") -## list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}") -## list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/webkit/${CMAKE_CFG_INTDIR}") + list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/gstreamer010/${CMAKE_CFG_INTDIR}") + list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}") set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-darwin.tar.bz2") -## set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin mac-crash-logger") + set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin mac-crash-logger") set(VIEWER_EXE_GLOBS "'Second Life' mac-crash-logger") set(VIEWER_LIB_GLOB "*.dylib") endif (DARWIN) if (LINUX) list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/packaged") set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-linux.tar.bz2") -## set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin") + set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin") set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin") set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*") set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest) diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 4351a7e3a3..4d54daddb6 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -3.8.7 +4.0.2 diff --git a/indra/newview/ViewerInstall.cmake b/indra/newview/ViewerInstall.cmake index 0b0d3e2adc..ac2247c815 100755 --- a/indra/newview/ViewerInstall.cmake +++ b/indra/newview/ViewerInstall.cmake @@ -19,7 +19,7 @@ else (IS_ARTWORK_PRESENT) message(STATUS "WARNING: Artwork is not present, and will not be installed") endif (IS_ARTWORK_PRESENT) -install(FILES featuretable_linux.txt featuretable_solaris.txt gpu_table.txt +install(FILES featuretable_linux.txt featuretable_solaris.txt DESTINATION ${APP_SHARE_DIR} ) diff --git a/indra/newview/app_settings/keywords_lsl_default.xml b/indra/newview/app_settings/keywords_lsl_default.xml index cea7a58949..ddd287faf4 100755 --- a/indra/newview/app_settings/keywords_lsl_default.xml +++ b/indra/newview/app_settings/keywords_lsl_default.xml @@ -2314,6 +2314,15 @@ <key>tooltip</key> <string>Gets the attachment point to which the object is attached.\nReturns 0 if the object is not an attachment (or is an avatar, etc).</string> </map> + <key>OBJECT_BODY_SHAPE_TYPE</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>26</integer> + <key>tooltip</key> + <string>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'</string> + </map> <key>OBJECT_CHARACTER_TIME</key> <map> <key>type</key> @@ -2323,6 +2332,15 @@ <key>tooltip</key> <string>Units in seconds</string> </map> + <key>OBJECT_CLICK_ACTION</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>28</integer> + <key>tooltip</key> + <string>This is a flag used with llGetObjectDetails to get the click action.\nThe default is 0</string> + </map> <key>OBJECT_CREATOR</key> <map> <key>type</key> @@ -2350,6 +2368,24 @@ <key>tooltip</key> <string>Gets the prims's group key. If id is an avatar, a NULL_KEY is returned.</string> </map> + <key>OBJECT_HOVER_HEIGHT</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>25</integer> + <key>tooltip</key> + <string>This is a flag used with llGetObjectDetails to get hover height of the avatar\nIf no data is available, 0.0 is returned.</string> + </map> + <key>OBJECT_LAST_OWNER_ID</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>27</integer> + <key>tooltip</key> + <string>Gets the object's last owner ID.</string> + </map> <key>OBJECT_NAME</key> <map> <key>type</key> @@ -3277,6 +3313,51 @@ <key>tooltip</key> <string>Play animation going forwards, then backwards.</string> </map> + <key>PRIM_ALPHA_MODE</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>38</integer> + <key>tooltip</key> + <string>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.</string> + </map> + <key>PRIM_ALPHA_MODE_NONE</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>0</integer> + <key>tooltip</key> + <string>Prim parameter setting for PRIM_ALPHA_MODE.\nIndicates that the diffuse texture's alpha channel should be ignored.</string> + </map> + <key>PRIM_ALPHA_MODE_BLEND</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>1</integer> + <key>tooltip</key> + <string>Prim parameter setting for PRIM_ALPHA_MODE.\nIndicates that the diffuse texture's alpha channel should be rendered as alpha-blended.</string> + </map> + <key>PRIM_ALPHA_MODE_MASK</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>2</integer> + <key>tooltip</key> + <string>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.</string> + </map> + <key>PRIM_ALPHA_MODE_EMISSIVE</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>3</integer> + <key>tooltip</key> + <string>Prim parameter setting for PRIM_ALPHA_MODE.\nIndicates that the diffuse texture's alpha channel should be rendered as an emissivity mask.</string> + </map> <key>PRIM_BUMP_BARK</key> <map> <key>type</key> @@ -3882,6 +3963,15 @@ <key>tooltip</key> <string/> </map> + <key>PRIM_NORMAL</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>37</integer> + <key>tooltip</key> + <string>Prim parameter for materials using integer face, string texture, vector repeats, vector offsets, float rotation_in_radians</string> + </map> <key>PRIM_OMEGA</key> <map> <key>type</key> @@ -4108,6 +4198,15 @@ <key>tooltip</key> <string/> </map> + <key>PRIM_SPECULAR</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>36</integer> + <key>tooltip</key> + <string>Prim parameter for materials using integer face, string texture, vector repeats, vector offsets, float rotation_in_radians, vector color, integer glossy, integer environment</string> + </map> <key>PRIM_TEMP_ON_REZ</key> <map> <key>type</key> @@ -5020,6 +5119,15 @@ <key>tooltip</key> <string/> </map> + <key>REGION_FLAG_BLOCK_FLYOVER</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <string>0x8000000</string> + <key>tooltip</key> + <string/> + </map> <key>REGION_FLAG_BLOCK_TERRAFORM</key> <map> <key>type</key> @@ -5979,6 +6087,177 @@ <key>tooltip</key> <string/> </map> + <key>XP_ERROR_EXPERIENCES_DISABLED</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>2</integer> + <key>tooltip</key> + <string>The region currently has experiences disabled.</string> + </map> + <key>XP_ERROR_EXPERIENCE_DISABLED</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>8</integer> + <key>tooltip</key> + <string>The experience owner has temporarily disabled the experience.</string> + </map> + <key>XP_ERROR_EXPERIENCE_SUSPENDED</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>9</integer> + <key>tooltip</key> + <string>The experience has been suspended by Linden Customer Support.</string> + </map> + <key>XP_ERROR_INVALID_EXPERIENCE</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>7</integer> + <key>tooltip</key> + <string>The script is associated with an experience that no longer exists.</string> + </map> + <key>XP_ERROR_INVALID_PARAMETERS</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>3</integer> + <key>tooltip</key> + <string>One of the string arguments was too big to fit in the key-value store.</string> + </map> + <key>XP_ERROR_KEY_NOT_FOUND</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>14</integer> + <key>tooltip</key> + <string>The requested key does not exist.</string> + </map> + <key>XP_ERROR_MATURITY_EXCEEDED</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>16</integer> + <key>tooltip</key> + <string>The content rating of the experience exceeds that of the region.</string> + </map> + <key>XP_ERROR_NONE</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>0</integer> + <key>tooltip</key> + <string>No error was detected.</string> + </map> + <key>XP_ERROR_NOT_FOUND</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>6</integer> + <key>tooltip</key> + <string>The sim was unable to verify the validity of the experience. Retrying after a short wait is advised.</string> + </map> + <key>XP_ERROR_NOT_PERMITTED</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>4</integer> + <key>tooltip</key> + <string>This experience is not allowed to run by the requested agent.</string> + </map> + <key>XP_ERROR_NOT_PERMITTED_LAND</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>17</integer> + <key>tooltip</key> + <string>This experience is not allowed to run on the current region.</string> + </map> + <key>XP_ERROR_NO_EXPERIENCE</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>5</integer> + <key>tooltip</key> + <string>This script is not associated with an experience.</string> + </map> + <key>XP_ERROR_QUOTA_EXCEEDED</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>11</integer> + <key>tooltip</key> + <string>An attempted write data to the key-value store failed due to the data quota being met.</string> + </map> + <key>LSL_XP_ERROR_REQUEST_PERM_TIMEOUT</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>18</integer> + <key>tooltip</key> + <string>The request for experience permissions was ignored and timed out.</string> + </map> + <key>XP_ERROR_RETRY_UPDATE</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>15</integer> + <key>tooltip</key> + <string>A checked update failed due to an out of date request.</string> + </map> + <key>XP_ERROR_STORAGE_EXCEPTION</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>13</integer> + <key>tooltip</key> + <string>Unable to communicate with the key-value store.</string> + </map> + <key>XP_ERROR_STORE_DISABLED</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>12</integer> + <key>tooltip</key> + <string>The key-value store is currently disabled on this region.</string> + </map> + <key>XP_ERROR_THROTTLED</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>1</integer> + <key>tooltip</key> + <string>The call failed due to too many recent calls.</string> + </map> + <key>XP_ERROR_UNKNOWN_ERROR</key> + <map> + <key>type</key> + <string>integer</string> + <key>value</key> + <integer>10</integer> + <key>tooltip</key> + <string>Other unknown error.</string> + </map> <key>ZERO_ROTATION</key> <map> <key>type</key> @@ -6280,6 +6559,34 @@ <string>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.</string> </map> + <key>experience_permissions</key> + <map> + <key>arguments</key> + <map> + <key>agent_id</key> + <map> + <key>type</key> + <string>key</string> + <key>tooltip</key> + <string>ID of the agent approving permission for the Experience.</string> + </map> + </map> + </map> + <key>experience_permissions_denied</key> + <map> + <key>arguments</key> + <map> + <key>agent_id</key> + <map> + <key>type</key> + <string>key</string> + <key>tooltip</key> + <string>ID of the agent denying permission for the Experience.</string> + </map> + </map> + <key>tooltip</key> + <string>One of the XP_ERROR_... constants describing the reason why the Experience permissions were denied for the agent.</string> + </map> <key>http_request</key> <map> <key>arguments</key> @@ -6965,6 +7272,29 @@ <key>tooltip</key> <string>Adjusts the volume (0.0 - 1.0) of the currently playing attached sound.\nThis function has no effect on sounds started with llTriggerSound.</string> </map> + <key>llAgentInExperience</key> + <map> + <key>energy</key> + <real>10.0</real> + <key>sleep</key> + <real>0.0</real> + <key>return</key> + <string>integer</string> + <key>arguments</key> + <map> + <key>AgentID</key> + <map> + <key>type</key> + <string>key</string> + <key>tooltip</key> + <string></string> + </map> + </map> + <key>tooltip</key> + <string> + Returns TRUE if the agent is in the Experience and the Experience can run in the current location. + </string> + </map> <key>llAllowInventoryDrop</key> <map> <key>energy</key> @@ -7696,6 +8026,36 @@ <key>tooltip</key> <string>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.</string> </map> + <key>llCreateKeyValue</key> + <map> + <key>energy</key> + <real>10.0</real> + <key>sleep</key> + <real>0.0</real> + <key>return</key> + <string>key</string> + <key>arguments</key> + <map> + <key>Key</key> + <map> + <key>type</key> + <string>string</string> + <key>tooltip</key> + <string></string> + </map> + <key>Value</key> + <map> + <key>type</key> + <string>string</string> + <key>tooltip</key> + <string></string> + </map> + </map> + <key>tooltip</key> + <string> + 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. + </string> + </map> <key>llCreateLink</key> <map> <key>energy</key> @@ -7751,6 +8111,21 @@ <key>tooltip</key> <string>Create a list from a string of comma separated values specified in Text.</string> </map> + <key>llDataSizeKeyValue</key> + <map> + <key>energy</key> + <real>10.0</real> + <key>sleep</key> + <real>0.0</real> + <key>return</key> + <string>key</string> + <key>arguments</key> + <undef/> + <key>tooltip</key> + <string> + 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. + </string> + </map> <key>llDeleteCharacter</key> <map> <key>energy</key> @@ -7764,6 +8139,29 @@ <key>tooltip</key> <string>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.</string> </map> + <key>llDeleteKeyValue</key> + <map> + <key>energy</key> + <real>10.0</real> + <key>sleep</key> + <real>0.0</real> + <key>return</key> + <string>key</string> + <key>arguments</key> + <map> + <key>Key</key> + <map> + <key>type</key> + <string>string</string> + <key>tooltip</key> + <string></string> + </map> + </map> + <key>tooltip</key> + <string> + 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. + </string> + </map> <key>llDeleteSubList</key> <map> <key>energy</key> @@ -8915,7 +9313,30 @@ <key>arguments</key> <undef/> <key>tooltip</key> - <string>Returns the object's attachment point, or 0 if not attached.\nReturns the object attachment point, or 0 if not attached.</string> + <string>Returns the object's attachment point, or 0 if not attached.</string> + </map> + <key>llGetAttachedList</key> + <map> + <key>energy</key> + <real>10.0</real> + <key>sleep</key> + <real>0.0</real> + <key>return</key> + <string>list</string> + <key>arguments</key> + <array> + <map> + <key>ID</key> + <map> + <key>type</key> + <string>key</string> + <key>tooltip</key> + <string>Avatar to get attachments</string> + </map> + </map> + </array> + <key>tooltip</key> + <string>Returns a list of keys of all visible (not HUD) attachments on the avatar identified by the ID argument</string> </map> <key>llGetBoundingBox</key> <map> @@ -9119,6 +9540,52 @@ <key>tooltip</key> <string>Returns a string with the requested data about the region.</string> </map> + <key>llGetExperienceDetails</key> + <map> + <key>energy</key> + <real>10.0</real> + <key>sleep</key> + <real>0.0</real> + <key>return</key> + <string>list</string> + <key>arguments</key> + <map> + <key>ExperienceID</key> + <map> + <key>type</key> + <string>key</string> + <key>tooltip</key> + <string>May be NULL_KEY to retrieve the details for the script's Experience</string> + </map> + </map> + <key>tooltip</key> + <string> + 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. + </string> + </map> + <key>llGetExperienceErrorMessage</key> + <map> + <key>energy</key> + <real>10.0</real> + <key>sleep</key> + <real>0.0</real> + <key>return</key> + <string>string</string> + <key>arguments</key> + <map> + <key>Error</key> + <map> + <key>type</key> + <string>integer</string> + <key>tooltip</key> + <string>An Experience error code to translate.</string> + </map> + </map> + <key>tooltip</key> + <string> + 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. + </string> + </map> <key>llGetForce</key> <map> <key>energy</key> @@ -11446,6 +11913,51 @@ <key>tooltip</key> <string>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</string> </map> + <key>llKeyCountKeyValue</key> + <map> + <key>energy</key> + <real>10.0</real> + <key>sleep</key> + <real>0.0</real> + <key>return</key> + <string>key</string> + <key>arguments</key> + <undef/> + <key>tooltip</key> + <string> + 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. + </string> + </map> + <key>llKeysKeyValue</key> + <map> + <key>energy</key> + <real>10.0</real> + <key>sleep</key> + <real>0.0</real> + <key>return</key> + <string>key</string> + <key>arguments</key> + <map> + <key>First</key> + <map> + <key>type</key> + <string>string</string> + <key>tooltip</key> + <string>Index of the first key to return.</string> + </map> + <key>Count</key> + <map> + <key>type</key> + <string>string</string> + <key>tooltip</key> + <string>The number of keys to return.</string> + </map> + </map> + <key>tooltip</key> + <string> + 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. + </string> + </map> <key>llLinkParticleSystem</key> <map> <key>energy</key> @@ -13577,6 +14089,29 @@ <key>tooltip</key> <string>Applies Impulse and AngularImpulse to ObjectID.\nApplies the supplied impulse and angular impulse to the object specified.</string> </map> + <key>llReadKeyValue</key> + <map> + <key>energy</key> + <real>10.0</real> + <key>sleep</key> + <real>0.0</real> + <key>return</key> + <string>key</string> + <key>arguments</key> + <map> + <key>Key</key> + <map> + <key>type</key> + <string>string</string> + <key>tooltip</key> + <string></string> + </map> + </map> + <key>tooltip</key> + <string> + 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. + </string> + </map> <key>llRefreshPrimURL</key> <map> <key>energy</key> @@ -13997,6 +14532,36 @@ <key>tooltip</key> <string>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.</string> </map> + <key>llRequestExperiencePermissions</key> + <map> + <key>energy</key> + <real>10.0</real> + <key>sleep</key> + <real>0.0</real> + <key>return</key> + <string>void</string> + <key>arguments</key> + <map> + <key>AvatarID</key> + <map> + <key>type</key> + <string>key</string> + <key>tooltip</key> + <string/> + </map> + <key>unused</key> + <map> + <key>type</key> + <string>string</string> + <key>tooltip</key> + <string>Not used, should be ""</string> + </map> + </map> + <key>tooltip</key> + <string> + 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. + </string> + </map> <key>llRequestInventoryData</key> <map> <key>energy</key> @@ -17913,6 +18478,50 @@ <key>tooltip</key> <string>Updates settings for a pathfinding character.</string> </map> + <key>llUpdateKeyValue</key> + <map> + <key>energy</key> + <real>10.0</real> + <key>sleep</key> + <real>0.0</real> + <key>return</key> + <string>key</string> + <key>arguments</key> + <map> + <key>Key</key> + <map> + <key>type</key> + <string>string</string> + <key>tooltip</key> + <string></string> + </map> + <key>Value</key> + <map> + <key>type</key> + <string>string</string> + <key>tooltip</key> + <string></string> + </map> + <key>Checked</key> + <map> + <key>type</key> + <string>integer</string> + <key>tooltip</key> + <string></string> + </map> + <key>OriginalValue</key> + <map> + <key>type</key> + <string>string</string> + <key>tooltip</key> + <string></string> + </map> + </map> + <key>tooltip</key> + <string> + 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. + </string> + </map> <key>llVecDist</key> <map> <key>energy</key> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 5f378c64e8..1fdfdb51a8 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -734,7 +734,7 @@ <string>F32</string> <key>Value</key> <integer>60</integer> - </map> + </map> <key>AvatarRotateThresholdFast</key> <map> <key>Comment</key> @@ -745,7 +745,7 @@ <string>F32</string> <key>Value</key> <integer>2</integer> - </map> + </map> <key>AvatarBakedTextureUploadTimeout</key> <map> <key>Comment</key> @@ -1339,7 +1339,7 @@ <string>String</string> <key>Value</key> <string /> - </map> + </map> <key>CacheNumberOfRegionsForObjects</key> <map> <key>Comment</key> @@ -3788,7 +3788,7 @@ <string>Boolean</string> <key>Value</key> <integer>0</integer> - </map> + </map> <key>FirstSelectedEnabledPopups</key> <map> <key>Comment</key> @@ -3799,7 +3799,7 @@ <string>Boolean</string> <key>Value</key> <integer>0</integer> - </map> + </map> <key>FixedWeather</key> <map> <key>Comment</key> @@ -3921,7 +3921,7 @@ <key>Value</key> <string>SW</string> </map> - + <key>FloaterStatisticsRect</key> <map> <key>Comment</key> @@ -4448,7 +4448,7 @@ <string>String</string> <key>Value</key> <string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/howto/index.html</string> - </map> + </map> <key>HomeSidePanelURL</key> <map> <key>Comment</key> @@ -4514,7 +4514,7 @@ <string>Boolean</string> <key>Value</key> <integer>0</integer> - </map> + </map> <key>HostID</key> <map> <key>Comment</key> @@ -4602,7 +4602,7 @@ <string>Boolean</string> <key>Value</key> <integer>0</integer> - </map> + </map> <key>IgnorePixelDepth</key> <map> <key>Comment</key> @@ -4657,7 +4657,7 @@ <string>F32</string> <key>Value</key> <real>0.5</real> - </map> + </map> <key>InspectorShowTime</key> <map> <key>Comment</key> @@ -4668,7 +4668,7 @@ <string>F32</string> <key>Value</key> <real>3.0</real> - </map> + </map> <key>InstallLanguage</key> <map> <key>Comment</key> @@ -5230,7 +5230,7 @@ <key>Value</key> <string>0.0.0</string> </map> - + <key>LastSnapshotToProfileHeight</key> <map> <key>Comment</key> @@ -6309,7 +6309,7 @@ <string>Boolean</string> <key>Value</key> <integer>0</integer> - </map> + </map> <key>MenuAccessKeyTime</key> <map> <key>Comment</key> @@ -6474,7 +6474,7 @@ <string>Boolean</string> <key>Value</key> <integer>0</integer> - </map> + </map> <key>MouseSun</key> <map> <key>Comment</key> @@ -6639,7 +6639,7 @@ <string>String</string> <key>Value</key> <string /> - </map> + </map> <key>NextLoginLocation</key> <map> <key>Comment</key> @@ -6763,7 +6763,7 @@ <string>String</string> <key>Value</key> <string>toast</string> - </map> + </map> <key>NotificationFriendIMOptions</key> <map> <key>Comment</key> @@ -6819,7 +6819,7 @@ <string>String</string> <key>Value</key> <string>toast</string> - </map> + </map> <key>NotificationObjectIMOptions</key> <map> <key>Comment</key> @@ -6833,7 +6833,7 @@ <string>String</string> <key>Value</key> <string>toast</string> - </map> + </map> <key>NotificationToastLifeTime</key> <map> <key>Comment</key> @@ -7392,7 +7392,7 @@ <string>Boolean</string> <key>Value</key> <integer>0</integer> - </map> + </map> <key>PlaySoundFriendIM</key> <map> <key>Comment</key> @@ -7503,7 +7503,7 @@ <key>Value</key> <real>0.9</real> </map> - + <key>PlainTextChatHistory</key> <map> <key>Comment</key> @@ -7515,7 +7515,7 @@ <key>Value</key> <integer>0</integer> </map> - + <key>PluginInstancesLow</key> <map> <key>Comment</key> @@ -7769,7 +7769,7 @@ <real>0.4</real> </array> </map> - + <key>PreviewDirection2</key> <map> <key>Comment</key> @@ -8081,7 +8081,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>5.0</real> + <real>10.0</real> </map> <key>MediaRollOffMax</key> <map> @@ -8379,7 +8379,7 @@ <key>RenderComplexityStaticMax</key> <map> <key>Comment</key> - <string>Sets a static max value for scaling of RenderComplexity + <string>Sets a static max value for scaling of RenderComplexity display (-1 for dynamic scaling)</string> <key>Persist</key> <integer>1</integer> @@ -8457,7 +8457,7 @@ <key>Value</key> <integer>0</integer> </map> - + <key>RenderLocalLights</key> <map> <key>Comment</key> @@ -8684,7 +8684,7 @@ <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>Boolean</string> + <string>Boolean</string> <key>Value</key> <integer>0</integer> </map> @@ -8721,7 +8721,7 @@ <key>Value</key> <integer>0</integer> </map> - + <key>RenderAnimateRes</key> <map> <key>Comment</key> @@ -8894,7 +8894,7 @@ <key>Value</key> <integer>0</integer> </map> - + <key>RenderDepthOfField</key> <map> <key>Comment</key> @@ -9023,7 +9023,7 @@ <key>Value</key> <real>0.1</real> </map> - + <key>RenderHighlightBrightness</key> <map> <key>Comment</key> @@ -9047,7 +9047,7 @@ <key>Value</key> <real>0.6</real> </map> - + <key>RenderHighlightColor</key> <map> <key>Comment</key> @@ -9076,7 +9076,7 @@ <key>Value</key> <integer>0</integer> </map> - + <key>RenderSpecularResX</key> <map> <key>Comment</key> @@ -9981,7 +9981,7 @@ <key>Value</key> <integer>1</integer> </map> - + <key>RenderAutoMuteByteLimit</key> <map> <key>Comment</key> @@ -10036,7 +10036,7 @@ <string>Boolean</string> <key>Value</key> <integer>0</integer> - </map> + </map> <key>RenderAutoHideSurfaceAreaLimit</key> <map> <key>Comment</key> @@ -10522,7 +10522,7 @@ <string>Boolean</string> <key>Value</key> <integer>0</integer> - </map> + </map> <key>SelectMovableOnly</key> <map> <key>Comment</key> @@ -10764,7 +10764,7 @@ <string>Boolean</string> <key>Value</key> <integer>1</integer> - </map> + </map> <key>ShowCrosshairs</key> <map> <key>Comment</key> @@ -10841,7 +10841,7 @@ <string>Boolean</string> <key>Value</key> <integer>0</integer> - </map> + </map> <key>ShowMiniMapButton</key> <map> <key>Comment</key> @@ -10908,7 +10908,7 @@ <key>Value</key> <integer>1</integer> </map> - <key>ShowObjectRenderingCost</key> + <key>ShowObjectRenderingCost</key> <map> <key>Comment</key> <string>Show the object rendering cost in build tools</string> @@ -10917,9 +10917,9 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> - </map> - <key>ShowNavbarFavoritesPanel</key> + <integer>1</integer> + </map> + <key>ShowNavbarFavoritesPanel</key> <map> <key>Comment</key> <string>Show/hide navigation bar favorites panel</string> @@ -10928,9 +10928,9 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>1</integer> </map> - <key>ShowNavbarNavigationPanel</key> + <key>ShowNavbarNavigationPanel</key> <map> <key>Comment</key> <string>Show/hide navigation bar navigation panel</string> @@ -10939,7 +10939,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>1</integer> </map> <key>ShowWorldMapButton</key> <map> @@ -11095,7 +11095,7 @@ <key>Value</key> <integer>1</integer> </map> - <key>ShowPGSearchAll</key> + <key>ShowPGSearchAll</key> <map> <key>Comment</key> <string>Display results of search All that are flagged as general</string> @@ -11611,7 +11611,7 @@ <string>S32</string> <key>Value</key> <integer>0</integer> - </map> + </map> <key>SnapshotQuality</key> <map> <key>Comment</key> @@ -12480,7 +12480,7 @@ <string>String</string> <key>Value</key> <string>B56AF90D-6684-48E4-B1E4-722D3DEB2CB6</string> - </map> + </map> <key>NearByChatChannelUUID</key> <map> <key>Comment</key> @@ -12491,7 +12491,7 @@ <string>String</string> <key>Value</key> <string>E1158BD6-661C-4981-9DAD-4DCBFF062502</string> - </map> + </map> <key>NotificationChannelUUID</key> <map> <key>Comment</key> @@ -12502,7 +12502,7 @@ <string>String</string> <key>Value</key> <string>AEED3193-8709-4693-8558-7452CCA97AE5</string> - </map> + </map> <key>AlertChannelUUID</key> <map> <key>Comment</key> @@ -12513,7 +12513,7 @@ <string>String</string> <key>Value</key> <string>F3E07BC8-A973-476D-8C7F-F3B7293975D1</string> - </map> + </map> <key>UIImgWhiteUUID</key> <map> <key>Comment</key> @@ -12535,7 +12535,7 @@ <string>S32</string> <key>Value</key> <integer>2</integer> - </map> + </map> <key>UIMaxComboWidth</key> <map> <key>Comment</key> @@ -13448,7 +13448,7 @@ <string>String</string> <key>Value</key> <string>[i800,i600]</string> - </map> + </map> <key>sourceid</key> <map> <key>Comment</key> @@ -14669,7 +14669,7 @@ <string>Boolean</string> <key>Value</key> <integer>1</integer> - </map> + </map> <key>EnablePlaceProfile</key> <map> <key>Comment</key> @@ -15491,7 +15491,7 @@ <key>Value</key> <integer>0</integer> </map> - + <key>PathfindingLineWidth</key> <map> <key>Comment</key> @@ -15532,7 +15532,7 @@ <real>1.0</real> </array> </map> - + <key>HideUIControls</key> <map> <key>Comment</key> diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt deleted file mode 100755 index badbe486b9..0000000000 --- a/indra/newview/gpu_table.txt +++ /dev/null @@ -1,663 +0,0 @@ -//GPU_TABLE - that token on line 1 tags this as a gpu table file -// -// Categorizes graphics chips into various classes by name -// -// The table contains regular expressions to match -// against driver strings, a class number, and whether we claim -// to support them or not. -// -// Case is not significant in either the regular expressions or the -// driver strings; the recognizer code lowercases both before using -// them. -// -// If you modify this table, use the (perl) gpu_table_tester -// to compare the results of recognizing known cards (it is easy -// to mess this up by putting things in the wrong order): -// -// perl ../../scripts/gpu_table_tester -g gpu_table.txt tests/gpus_seen.txt | diff - tests/gpus_results.txt -// -// Format: -// Fields are separated by one or more tab (not space) characters -// <recognizer name> <regular expression> <class> <supported> <stats based> <expected OpenGL version> -// -// Class Numbers: -// 0 - Defaults to low graphics settings. No shaders on by default -// 1 - Defaults to low-mid graphics settings. Basic shaders on by default -// 2 - Defaults to mid graphics settings. Atmospherics on by default -// 3 - Defaults to mid-high graphics settings. Advanced Lighting Model on by default -// 4 - Defaults to high graphics settings. Ambient Occlusion on by default -// 5 - Defaults to high-ultra graphics settings. Shadows set to "Sun/Moon+Projectors." -// -// Supported Number: -// 0 - We claim to not support this card. -// 1 - We claim to support this card. -// - -3Dfx .*3Dfx.* 0 0 0 0 -3Dlabs .*3Dlabs.* 0 0 0 0 -Hijacker .*Mohr.*Hijacker.* 0 0 0 0 -ATI 3D-Analyze .*ATI.*3D-Analyze.* 0 0 0 0 -ATI ARES .*ATI.*ARES.* 0 0 0 0 -ATI All-in-Wonder 7500 .*ATI.*All-in-Wonder 75.* 0 1 0 0 -ATI All-in-Wonder 8500 .*ATI.*All-in-Wonder 85.* 0 1 0 0 -ATI All-in-Wonder 9200 .*ATI.*All-in-Wonder 92.* 0 1 0 0 -ATI All-in-Wonder 9xxx .*ATI.*All-in-Wonder 9.* 1 1 0 2.1 -ATI All-in-Wonder HD .*ATI.*All-in-Wonder HD.* 1 1 1 3.3 -ATI All-in-Wonder X600 .*ATI.*All-in-Wonder X6.* 1 1 0 0 -ATI All-in-Wonder X800 .*ATI.*All-in-Wonder X8.* 1 1 1 2.1 -ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3 1 0 0 -ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3 1 0 0 -ATI All-in-Wonder PCI-E .*ATI.*All-in-Wonder.*PCI-E.* 1 1 0 0 -ATI All-in-Wonder Radeon .*ATI.*All-in-Wonder Radeon.* 0 1 0 0 -ATI Radeon X1300 .*ATI.*(Radeon|Diamond|ASUS) *X13.* ?.* 2 1 1 2.1 -ATI Radeon X1400 .*ATI.*(Radeon|Diamond|ASUS) *X14.* ?.* 2 1 1 2.1 -ATI Radeon X1500 .*ATI.*(Radeon|Diamond|ASUS) *X15.* ?.* 2 1 1 2.1 -ATI Radeon X1600 .*ATI.*(Radeon|Diamond|ASUS) *X16.* ?.* 2 1 1 2.1 -ATI Radeon X1700 .*ATI.*(Radeon|Diamond|ASUS) *X17.* ?.* 2 1 1 2.1 -ATI Radeon X1800 .*ATI.*(Radeon|Diamond|ASUS) *X18.* ?.* 3 1 1 2.1 -ATI Radeon X1900 .*ATI.*(Radeon|Diamond|ASUS) *X19.* ?.* 2 1 1 2.1 -ATI Radeon X2800 .*ATI.*(Radeon|Diamond|ASUS) *X28.* ?.* 2 1 1 2.1 -ATI Display Adapter .*ATI.*display adapter.* 1 1 1 4.1 -ATI FireGL 5200 .*ATI.*FireGL V52.* 1 1 1 2.1 -ATI FireGL 5xxx .*ATI.*FireGL V5.* 2 1 1 3.3 -ATI FireGL .*ATI.*Fire.*GL.* 4 1 1 4.2 -ATI FirePro M3900 .*ATI.*FirePro.*M39.* 2 1 0 4.1 -ATI FirePro M5800 .*ATI.*FirePro.*M58.* 3 1 0 0 -ATI FirePro M7740 .*ATI.*FirePro.*M77.* 3 1 0 0 -ATI FirePro M7820 .*ATI.*FirePro.*M78.* 5 1 1 4.2 -ATI FireMV .*ATI.*FireMV.* 0 1 1 3.2 -ATI Generic .*ATI.*Generic.* 0 0 0 0 -ATI Hercules 9800 .*ATI.*Hercules.* 9800.* 1 1 0 0 -ATI IGP 340M .*ATI.*IGP.* 34[0-9]M.* 0 0 0 1.3 -ATI M52 .*ATI.*M52.* 1 1 0 0 -ATI M54 .*ATI.*M54.* 1 1 0 0 -ATI M56 .*ATI.*M56.* 1 1 0 0 -ATI M71 .*ATI.*M71.* 1 1 0 0 -ATI M72 .*ATI.*M72.* 1 1 0 0 -ATI M76 .*ATI.*M76.* 3 1 0 0 -ATI Mobility Radeon 4100 .*ATI.*Mobility.* 41.. 1 1 1 3.3 -ATI Mobility Radeon 5000 .*ATI.*Mobility.* 50.. 1 1 1 4.2 -ATI Mobility Radeon 7xxx .*ATI.*Mobility.*Radeon 7.* 0 1 1 1.3 -ATI Mobility Radeon 8xxx .*ATI.*Mobility.*Radeon 8.* 0 1 0 0 -ATI Mobility Radeon 9800 .*ATI.*Mobility.* 98.* 1 1 0 0 -ATI Mobility Radeon 9700 .*ATI.*Mobility.* 97.* 0 1 1 2.1 -ATI Mobility Radeon 9600 .*ATI.*Mobility.* 96.* 1 1 1 2.1 -ATI Mobility Radeon HD 530v .*ATI.*Mobility.*HD 530v.* 1 1 1 3.3 -ATI Mobility Radeon HD 540v .*ATI.*Mobility.*HD 540v.* 1 1 1 3.3 -ATI Mobility Radeon HD 545v .*ATI.*Mobility.*HD 545v.* 2 1 1 4 -ATI Mobility Radeon HD 550v .*ATI.*Mobility.*HD 550v.* 3 1 1 4 -ATI Mobility Radeon HD 560v .*ATI.*Mobility.*HD 560v.* 3 1 1 3.2 -ATI Mobility Radeon HD 565v .*ATI.*Mobility.*HD 565v.* 3 1 1 3.3 -ATI Mobility Radeon HD 2300 .*ATI.*Mobility.*HD 23.* 0 1 1 2.1 -ATI Mobility Radeon HD 2400 .*ATI.*Mobility.*HD 24.* 1 1 1 3.3 -ATI Mobility Radeon HD 2600 .*ATI.*Mobility.*HD 26.* 1 1 1 3.3 -ATI Mobility Radeon HD 2700 .*ATI.*Mobility.*HD 27.* 3 1 0 0 -ATI Mobility Radeon HD 3100 .*ATI.*Mobility.*HD 31.* 0 1 0 0 -ATI Mobility Radeon HD 3200 .*ATI.*Mobility.*HD 32.* 0 1 0 0 -ATI Mobility Radeon HD 3400 .*ATI.*Mobility.*HD 34.* 1 1 1 4 -ATI Mobility Radeon HD 3600 .*ATI.*Mobility.*HD 36.* 1 1 1 4 -ATI Mobility Radeon HD 3800 .*ATI.*Mobility.*HD 38.* 3 1 1 3.3 -ATI Mobility Radeon HD 4200 .*ATI.*Mobility.*HD 42.* 1 1 1 4 -ATI Mobility Radeon HD 4300 .*ATI.*Mobility.*(HD |HD)43.* 1 1 1 4 -ATI Mobility Radeon HD 4500 .*ATI.*Mobility.*HD 45.* 1 1 1 4 -ATI Mobility Radeon HD 4600 .*ATI.*Mobility.*HD 46.* 2 1 1 3.3 -ATI Mobility Radeon HD 4800 .*ATI.*Mobility.*HD 48.* 3 1 1 3.3 -ATI Mobility Radeon HD 5000 Series .*ATI.*Mobility.*HD 50.* 3 1 1 3.2 -ATI Mobility Radeon HD 5100 .*ATI.*Mobility.*HD 51.* 3 1 1 3.2 -ATI Mobility Radeon HD 5300 .*ATI.*Mobility.*HD 53.* 3 1 0 0 -ATI Mobility Radeon HD 5400 .*ATI.*Mobility.*HD 54.* 2 1 1 4.2 -ATI Mobility Radeon HD 5500 .*ATI.*Mobility.*HD 55.* 3 1 0 4.2 -ATI Mobility Radeon HD 5600 .*ATI.*Mobility.*HD 56.* 3 1 1 4.2 -ATI Mobility Radeon HD 5700 .*ATI.*Mobility.*HD 57.* 3 1 1 4.1 -ATI Mobility Radeon X1000 .*ATI.*Mobility.*Radeon ?X1..* 2 1 0 2.1 -ATI Mobility Radeon X1200 .*ATI.*Mobility.*Radeon ?X12.* 2 1 0 2.1 -ATI Mobility Radeon X2000 .*ATI.*Mobility.*Radeon ?X20.* 2 1 0 2.1 -ATI Mobility Radeon X2300 .*ATI.*Mobility.*Radeon ?X23.* 2 1 0 2.1 -ATI Mobility Radeon X2500 .*ATI.*Mobility.*Radeon ?X25.* 2 1 0 2.1 -ATI Mobility Radeon XX000 .*ATI.*Mobility.*Radeon ?Xx.* 2 1 0 2.1 -ATI Radeon HD 5xx .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)5x. 1 1 1 4 -ATI Radeon HD 6200D/G/M .*ATI.*AMD Radeon.* (HD|HD )62..[DGM].* 3 1 0 4.2 -ATI Radeon HD 6300D/G/M .*ATI.*AMD Radeon.* (HD|HD )63..[DGM].* 3 1 1 4.2 -ATI Radeon HD 6400D/G/M .*ATI.*AMD Radeon.* (HD|HD )64..[DGM].* 3 1 0 4.2 -ATI Radeon HD 6500D/G/M .*ATI.*AMD Radeon.* (HD|HD )65..[DGM].* 4 1 1 4.2 -ATI Radeon HD 6600D/G/M .*ATI.*AMD Radeon.* (HD|HD )66..[DGM].* 4 1 0 4.2 -ATI Radeon HD 6700D/G/M .*ATI.*AMD Radeon.* (HD|HD )67..[DGM].* 4 1 0 4.2 -ATI Radeon HD 6800D/G/M .*ATI.*AMD Radeon.* (HD|HD )68..[DGM].* 4 1 0 4.2 -ATI Radeon HD 6900D/G/M .*ATI.*AMD Radeon.* (HD|HD )69..[DGM].* 4 1 0 4.2 -ATI Radeon HD 7200D/G/M .*ATI.*AMD Radeon.* (HD|HD )72..[DGM].* 3 1 0 4.2 -ATI Radeon HD 7300D/G/M .*ATI.*AMD Radeon.* (HD|HD )73..[DGM].* 3 1 0 4.2 -ATI Radeon HD 7400D/G/M .*ATI.*AMD Radeon.* (HD|HD )74..[DGM].* 3 1 0 4.2 -ATI Radeon HD 7500D/G/M .*ATI.*AMD Radeon.* (HD|HD )75..[DGM].* 4 1 0 4.2 -ATI Radeon HD 7600D/G/M .*ATI.*AMD Radeon.* (HD|HD )76..[DGM].* 4 1 0 4.2 -ATI Radeon HD 7700D/G/M .*ATI.*AMD Radeon.* (HD|HD )77..[DGM].* 4 1 0 4.2 -ATI Radeon HD 7800D/G/M .*ATI.*AMD Radeon.* (HD|HD )78..[DGM].* 4 1 0 4.2 -ATI Radeon HD 7900D/G/M .*ATI.*AMD Radeon.* (HD|HD )79..[DGM].* 4 1 0 4.2 -ATI Radeon HD 8200D/G/M .*ATI.*AMD Radeon.* (HD|HD )82..[DGM].* 3 1 0 4.2 -ATI Radeon HD 8300D/G/M .*ATI.*AMD Radeon.* (HD|HD )83..[DGM].* 3 1 0 4.2 -ATI Radeon HD 8400D/G/M .*ATI.*AMD Radeon.* (HD|HD )84..[DGM].* 4 1 0 4.2 -ATI Radeon HD 8500D/G/M .*ATI.*AMD Radeon.* (HD|HD )85..[DGM].* 4 1 0 4.2 -ATI Radeon HD 8600D/G/M .*ATI.*AMD Radeon.* (HD|HD )86..[DGM].* 4 1 0 4.2 -ATI Radeon HD 8700D/G/M .*ATI.*AMD Radeon.* (HD|HD )87..[DGM].* 4 1 0 4.2 -ATI Radeon HD 8800D/G/M .*ATI.*AMD Radeon.* (HD|HD )88..[DGM].* 4 1 0 4.2 -ATI Radeon HD 8900D/G/M .*ATI.*AMD Radeon.* (HD|HD )89..[DGM].* 4 1 0 4.2 -ATI Radeon HD 2300 .*ATI.*Radeon.* (HD|HD )23.. 0 1 1 3.3 -ATI Radeon HD 2400 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)24.. 1 1 1 4 -ATI Radeon HD 2600 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)26.. 2 1 1 4 -ATI Radeon HD 2900 .*ATI.*Radeon.* (HD|HD )29.. 3 1 1 3.3 -ATI Radeon HD 3000 .*ATI.*Radeon.* (HD|HD )30.. 0 1 0 0 -ATI Radeon HD 3100 .*ATI.*Radeon.* (HD|HD )31.. 1 1 0 0 -ATI Radeon HD 3200 .*ATI.*Radeon.* (HD|HD )32.. 1 1 1 4 -ATI Radeon HD 3300 .*ATI.*Radeon.* (HD|HD )33.. 1 1 1 3.3 -ATI Radeon HD 3400 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |AH||AX|EAH)34.. 1 1 1 4 -ATI Radeon HD 3500 .*ATI.*Radeon.* (HD|HD )35.. 2 1 0 0 -ATI Radeon HD 3600 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |AH||AX|EAH)36.. 3 1 1 4 -ATI Radeon HD 3700 .*ATI.*Radeon.* (HD|HD )37.. 3 1 0 3.3 -ATI HD3700 .*ATI.* HD37.. 3 1 0 3.3 -ATI Radeon HD 3800 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH|AX|)38.. 3 1 1 4 -ATI Radeon HD 4100 .*ATI.*Radeon.* (HD|HD )41.. 1 1 0 0 -ATI Radeon HD 4200 .*ATI.*Radeon.* (HD|HD )42.. 1 1 1 4 -ATI Radeon HD 4300 .*ATI.*(Radeon|ASUS).* (AH|AX|HD4|HD 4|EAH4|4)3.. 2 1 1 4 -ATI Radeon HD 4400 .*ATI.*Radeon.* (HD|HD )44.. 2 1 0 0 -ATI Radeon HD 4500 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)45.. 2 1 1 3.3 -ATI RADEON E4690 .*ATI.*RADEON.* E46.. 3 1 1 4 -ATI Radeon HD 4600 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)46.. 3 1 1 4 -ATI Radeon HD 4700 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)47.. 3 1 1 3.3 -ATI Radeon HD 4800 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)48.. 3 1 1 4 -ATI Radeon HD 5000 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)50.. 3 1 1 4.2 -ATI Radeon HD 5400 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)54.. 3 1 1 4.2 -ATI Radeon HD 5500 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)55.. 3 1 1 4.2 -ATI Radeon HD 5600 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)56.. 3 1 1 4.2 -ATI Radeon HD 5700 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)57.. 3 1 1 4.2 -ATI Radeon HD 5800 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)58.. 4 1 1 4.2 -ATI Radeon HD 5900 .*ATI.*Radeon.* (HD|HD )59.. 4 1 1 4.2 -ATI Radeon HD 6200 .*ATI.*Radeon.* (HD|HD )62.. 0 1 1 4.2 -ATI Radeon HD 6300 .*ATI.*Radeon.* (HD|HD )63.. 1 1 1 4.2 -ATI Radeon HD 6400 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)64.. 3 1 1 4.2 -ATI Radeon HD 6500 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)65.. 3 1 1 4.2 -ATI Radeon HD 6600 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)66.. 3 1 1 4.2 -ATI Radeon HD 6700 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)67.. 3 1 1 4.2 -ATI Radeon HD 6800 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)68.. 4 1 1 4.2 -ATI Radeon HD 6900 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)69.. 5 1 1 4.2 -ATI Radeon HD 6x00 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)6x.. 5 1 1 4.2 -ATI Radeon HD 7100 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)71.* 2 1 0 0 -ATI Radeon HD 7200 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)72.* 2 1 0 4.2 -ATI Radeon HD 7300 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)73.* 2 1 0 4.2 -ATI Radeon HD 7400 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)74.* 2 1 0 4.2 -ATI Radeon HD 7500 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)75.* 3 1 1 4.2 -ATI Radeon HD 7600 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)76.* 3 1 0 4.2 -ATI Radeon HD 7700 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)77.* 4 1 1 4.2 -ATI Radeon HD 7800 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)78.* 5 1 1 4.2 -ATI Radeon HD 7900 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)79.* 5 1 1 4.2 -ATI Radeon HD 7000 Series .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)7000 Series.* 3 1 1 4.2 -ATI Radeon HD 8200 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)82.* 2 1 0 4.2 -ATI Radeon HD 8300 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)83.* 2 1 0 4.2 -ATI Radeon HD 8400 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)84.* 2 1 0 4.2 -ATI Radeon HD 8500 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)85.* 3 1 1 4.2 -ATI Radeon HD 8600 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)86.* 3 1 0 4.2 -ATI Radeon HD 8700 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)87.* 4 1 1 4.2 -ATI Radeon HD 8800 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)88.* 5 1 1 4.2 -ATI Radeon HD 8900 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)89.* 5 1 1 4.2 -ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0 0 0 -ATI Radeon 2100 .*ATI.*Radeon 21.. 0 1 1 2.1 -ATI Radeon 3000 .*ATI.*Radeon 30.. 1 1 1 4 -ATI Radeon 3100 .*ATI.*Radeon 31.. 0 1 1 3.3 -ATI Radeon 5xxx .*ATI.*Radeon 5... 3 1 0 0 -ATI Radeon 6xxx .*ATI.*Radeon 6... 0 1 0 0 -ATI Radeon 7xxx .*ATI.*Radeon 7... 0 1 1 2 -ATI Radeon 8xxx .*ATI.*Radeon 8... 0 1 0 0 -ATI Radeon 9000 .*ATI.*Radeon 90.. 0 1 1 1.3 -ATI Radeon 9100 .*ATI.*Radeon 91.. 0 1 0 0 -ATI Radeon 9200 .*ATI.*Radeon 92.. 0 1 1 1.3 -ATI Radeon 9500 .*ATI.*Radeon 95.. 0 1 1 2.1 -ATI Radeon 9600 .*ATI.*Radeon 96.. 0 1 1 2.1 -ATI Radeon 9700 .*ATI.*Radeon 97.. 1 1 0 0 -ATI Radeon 9800 .*ATI.*Radeon 98.. 1 1 1 2.1 -ATI Radeon R7 .*ATI.*(Radeon|ASUS).* R7.* 4 1 0 4.2 -ATI Radeon R9 .*ATI.*(Radeon|ASUS).* R9.* 5 1 0 4.2 -ATI Radeon RV250 .*ATI.*RV250.* 0 1 0 0 -ATI Radeon RV600 .*ATI.*RV6.* 1 1 0 0 -ATI Radeon RX700 .*ATI.*RX70.* 1 1 0 0 -ATI Radeon RX800 .*ATI.*Radeon RX80.* 2 1 0 0 -ATI RS880M .*ATI.*RS880M 1 1 0 0 -ATI Radeon RX9550 .*ATI.*RX9550.* 1 1 0 0 -ATI Radeon VE .*ATI.*Radeon.*VE.* 0 0 0 0 -ATI Radeon X300 .*ATI.*Radeon X3.* 1 1 1 2.1 -ATI RADEON X300SE .*ATI.*RADEON[ ]*X300SE* 1 1 1 2.1 -ATI Radeon X400 .*ATI.*Radeon ?X4.* 0 1 0 0 -ATI Radeon X500 .*ATI.*Radeon ?X5.* 1 1 1 2.1 -ATI Radeon X600 .*ATI.*(Radeon |ASUS Extreme A)X6.* 1 1 1 2.1 -ATI Radeon X700 .*ATI.*Radeon ?X7.* 2 1 1 2.1 -ATI Radeon X800 .*ATI.*Radeon ?X8.* 1 1 1 2.1 -ATI Radeon X900 .*ATI.*Radeon ?X9.* 2 1 0 0 -ATI Radeon X1000 .*ATI.*Radeon ?X10.* 2 1 0 2.1 -ATI Radeon X1100 .*ATI.*Radeon ?X11.* 2 1 0 2.1 -ATI Radeon X1200 .*ATI.*Radeon ?X12.* 2 1 0 2.1 -ATI Radeon X1xxx .*ATI.*Radeon ?X1xx.* 2 1 0 2.1 -ATI Radeon X12xx .*ATI.*Radeon ?X12x.* 2 1 0 2.1 -ATI Radeon X2xxx .*ATI.*Radeon ?X2x.* 2 1 0 2.1 -ATI Radeon X2300 .*ATI.*Radeon ?X23.* 2 1 0 2.1 -ATI Radeon Xpress .*ATI.*Radeon Xpress.* 0 1 1 2.1 -ATI Radeon .*ATI.*Radeon$ 3 1 0 0 -ATI Rage 128 .*ATI.*Rage 128.* 0 1 0 0 -ATI R300 (9700) .*R300.* 0 1 1 2.1 -ATI R350 (9800) .*R350.* 1 1 0 0 -ATI R580 (X1900) .*R580.* 3 1 0 0 -ATI RC410 (Xpress 200) .*RC410.* 0 0 0 0 -ATI RS48x (Xpress 200x) .*RS48.* 0 0 0 0 -ATI RS600 (Xpress 3200) .*RS600.* 0 0 0 0 -ATI RV350 (9600) .*RV350.* 0 1 0 0 -ATI RV370 (X300) .*RV370.* 0 1 0 0 -ATI RV410 (X700) .*RV410.* 1 1 0 0 -ATI RV515 .*RV515.* 1 1 0 0 -ATI RV570 (X1900 GT/PRO) .*RV570.* 3 1 0 0 -ATI RV380 .*RV380.* 0 1 0 0 -ATI RV530 .*RV530.* 1 1 0 0 -ATI RX480 (Xpress 200P) .*RX480.* 0 1 0 0 -ATI RX700 .*RX700.* 1 1 0 0 -AMD ANTILLES (HD 6990) .*(AMD|ATI).*Antilles.* 3 1 0 0 -ATI ROBSON .*(AMD|ATI).*ROBSON.* 3 1 0 4 -AMD ARUBA (HD 6800) .*(AMD|ATI).*ARUBA.* 3 1 1 2.1 -AMD BARTS (HD 6800) .*(AMD|ATI).*Barts.* 3 1 1 2.1 -AMD BA (HD 6800) .*(AMD|ATI).*BA.* 3 1 1 2.1 -AMD WRESTLER .*(AMD|ATI).*WRESTLER.* 3 1 1 4 -AMD SUMO .*(AMD|ATI).*SUMO.* 3 1 1 4.1 -AMD CAICOS (HD 6400) .*(AMD|ATI).*Caicos.* 3 1 0 0 -AMD CAYMAN (HD 6900) .*(AMD|ATI).*(Cayman|CAYMAM).* 3 1 0 0 -AMD CEDAR (HD 5450) .*(AMD|ATI).*Cedar.* 2 1 0 2.1 -AMD CYPRESS (HD 5800) .*(AMD|ATI).*Cypress.* 3 1 0 0 -AMD HEMLOCK (HD 5970) .*(AMD|ATI).*Hemlock.* 3 1 0 0 -AMD JUNIPER (HD 5700) .*(AMD|ATI).*Juniper.* 3 1 0 0 -AMD PARK .*(AMD|ATI).*Park.* 3 1 0 0 -AMD REDWOOD (HD 5500/5600) .*(AMD|ATI).*Redwood.* 3 1 0 1.4 -AMD TURKS (HD 6500/6600) .*(AMD|ATI).*Turks.* 3 1 0 2.1 -AMD PITCAIRN (HD 7870) .*(AMD|ATI).*Pitcairn.* 3 1 0 2.1 -AMD TAHITI (HD 7000) .*(AMD|ATI).*Tahiti.* 3 1 0 2.1 -AMD RS780 (HD 3200) .*RS780.* 0 1 1 2.1 -AMD RS880 (HD 4200) .*RS880.* 0 1 1 3.2 -AMD RV610 (HD 2400) .*RV610.* 1 1 0 0 -AMD RV620 (HD 3400) .*RV620.* 1 1 0 0 -AMD RV630 (HD 2600) .*RV630.* 2 1 0 0 -AMD RV635 (HD 3600) .*RV635.* 3 1 0 1.4 -AMD RV670 (HD 3800) .*RV670.* 3 1 0 0 -AMD R680 (HD 3870 X2) .*R680.* 3 1 0 0 -AMD R700 (HD 4800 X2) .*R700.* 3 1 0 0 -AMD RV710 (HD 4300) .*RV710.* 0 1 1 1.4 -AMD RV730 (HD 4600) .*RV730.* 3 1 0 1.4 -AMD RV740 (HD 4700) .*RV740.* 3 1 0 0 -AMD RV770 (HD 4800) .*RV770.* 3 1 0 0 -AMD RV790 (HD 4800) .*RV790.* 3 1 0 0 -ATI 760G/Radeon 3000 .*ATI.*AMD 760G.* 1 1 1 3.3 -ATI 780L/Radeon 3000 .*ATI.*AMD 780L.* 1 1 0 0 -ATI Radeon DDR .*ATI.*Radeon ?DDR.* 0 1 0 0 -ATI FirePro 2000 .*ATI.*FirePro [V]*2.* 2 1 1 4.2 -ATI FirePro 3000 .*ATI.*FirePro [V]*3.* 2 1 0 0 -ATI FirePro 4000 .*ATI.*FirePro [V]*4.* 2 1 0 4.1 -ATI FirePro 5000 .*ATI.*FirePro [V]*5.* 3 1 0 0 -ATI FirePro 7000 .*ATI.*FirePro [V]*7.* 3 1 0 0 -ATI FirePro M .*ATI.*FirePro M.* 3 1 1 4.2 -Intel X3100 .*Intel.*X3100.* 1 1 1 2.1 -Intel GMA 3600 .*Intel.* 3600.* 0 1 1 3 -Intel Royal BNA .*Intel.*Royal[ ]*BNA.* 0 0 0 0 -Intel 830M .*Intel.*830M 0 0 0 0 -Intel 845G .*Intel.*845G 0 0 1 1.4 -Intel 855GM .*Intel.*855GM 0 0 1 1.4 -Intel 865G .*Intel.*865G 0 0 1 1.4 -Intel 900 .*Intel.*900.*900 0 0 0 0 -Intel 915GM .*Intel.*915GM 0 0 1 1.4 -Intel 915G .*Intel.*915G 0 0 1 1.4 -Intel 945GM .*Intel.*945GM.* 0 1 1 1.4 -Intel 945G .*Intel.*945G.* 0 1 1 1.4 -Intel 950 .*Intel.*950.* 0 1 1 1.4 -Intel 965 .*Intel.*965.* 0 1 1 2.1 -Intel G33 .*Intel.*G33.* 1 0 1 1.4 -Intel G41 .*Intel.*G41.* 1 1 1 2.1 -Intel G45 .*Intel.*G45.* 1 1 1 2.1 -Intel Bear Lake .*Intel.*Bear Lake.* 1 0 1 1.4 -Intel Broadwater .*Intel.*Broadwater.* 0 0 1 1.4 -Intel Brookdale .*Intel.*Brookdale.* 0 0 1 1.3 -Intel Cantiga .*Intel.*Cantiga.* 0 0 1 2 -Intel Eaglelake .*Intel.*Eaglelake.* 1 1 1 2 -Intel Graphics Media HD .*Intel.*Graphics Media.*HD.* 1 1 1 2.1 -Intel HD Graphics 2500 .*Intel.*HD Graphics 25.* 2 1 0 4.2 -Intel HD Graphics 2000 .*Intel.*HD Graphics 2.* 2 1 0 3.1 -Intel HD Graphics 3000 .*Intel.*HD Graphics 3.* 3 1 1 3.1 -Intel HD Graphics 4200 .*Intel.*HD Graphics 42.* 3 1 0 4.2 -Intel HD Graphics 4400 .*Intel.*HD Graphics 44.* 3 1 0 4.2 -Intel HD Graphics 4600 .*Intel.*HD Graphics 46.* 3 1 0 4.2 -Intel HD Graphics 4000 .*Intel.*HD Graphics 4.* 3 1 1 4.2 -Intel Intel Iris Pro Graphics 5200 .*Intel.*Iris Pro Graphics 52.* 4 1 0 4 -Intel Intel Iris Graphics 5100 .*Intel.*Iris Graphics 51.* 4 1 0 4 -Intel Intel Iris OpenGL Engine .*Intel.*Iris OpenGL.* 4 1 0 4 -Intel Intel Iris Pro OpenGL Engine .*Intel.*Iris Pro OpenGL.* 5 1 0 4 -Intel HD Graphics 5000 .*Intel.*HD Graphics 5.* 4 1 0 4 -Intel HD Graphics .*Intel.*HD Graphics.* 2 1 1 4 -Intel Mobile 4 Series .*Intel.*Mobile.* 4 Series.* 0 1 1 2.1 -Intel Mobile 45 Express .*Intel.*Mobile.* 45 Express Chipset.* 0 1 0 2.1 -Intel 4 Series Internal .*Intel.* 4 Series Internal.* 1 1 1 2.1 -Intel Media Graphics HD .*Intel.*Media Graphics HD.* 0 1 0 0 -Intel Montara .*Intel.*Montara.* 0 0 1 1.3 -Intel Pineview .*Intel.*Pineview.* 0 1 1 1.4 -Intel Springdale .*Intel.*Springdale.* 0 0 1 1.3 -Intel Grantsdale .*Intel.*Grantsdale.* 1 1 0 0 -Intel Q45/Q43 .*Intel.*Q4.* 1 1 1 2.1 -Intel B45/B43 .*Intel.*B4.* 1 1 1 2.1 -Intel 3D-Analyze .*Intel.*3D-Analyze.* 2 1 0 0 -Matrox .*Matrox.* 0 0 0 0 -Mesa .*Mesa.* 1 0 1 3 -Gallium .*Gallium.* 1 1 1 2.1 -NVIDIA GeForce Pre-Release .*NVIDIA .*GeForce[ ]Pre-Release.* 2 1 1 3.3 -NVIDIA D1xP1 .*NVIDIA .*D1[0-4]P1.* 0 0 0 0 -NVIDIA Mystery PCI Card .*NVIDIA .Corporation [/]PCI]/]SSE2.* 0 0 0 0 -NVIDIA Quadro FX 770M .*Quadro.*FX 77[0-9]M.* 2 1 0 3.3 -NVIDIA Quadro FX 1500M .*Quadro.*FX 150[0-9]M.* 1 1 0 2.1 -NVIDIA Quadro FX 1600M .*Quadro.*FX 160[0-9]M.* 2 1 0 3.3 -NVIDIA Quadro FX 2500M .*Quadro.*FX 250[0-9]M.* 2 1 0 2.1 -NVIDIA Quadro FX 2700M .*Quadro.*FX 270[0-9]M.* 3 1 0 3.3 -NVIDIA Quadro FX 2800M .*Quadro.*FX 280[0-9]M.* 3 1 0 3.3 -NVIDIA Quadro FX 3500 .*Quadro.*FX 3500.* 2 1 0 2.1 -NVIDIA Quadro FX 3600 .*Quadro.*FX 3600.* 3 1 0 3.3 -NVIDIA Quadro FX 3700 .*Quadro.*FX 3700.* 3 1 0 3.3 -NVIDIA Quadro FX 3800 .*Quadro.*FX 3800.* 3 1 0 3.3 -NVIDIA Quadro FX 4500 .*Quadro.*FX 45.* 3 1 0 2.1 -NVIDIA Quadro FX 880M .*Quadro.*FX 88[0-9]M.* 3 1 0 3.3 -NVIDIA Quadro FX 4800 .*NVIDIA .*Quadro FX 4800.* 3 1 0 3.1 -NVIDIA Quadro FX .*NVIDIA .*Quadro FX.* 1 1 0 3.3 -NVIDIA Quadro NVS 1xxM .*NVIDIA .*(Quadro)* NVS *1.[05]M.* 0 1 1 3.3 -NVIDIA Quadro NVS 300M .*NVIDIA .*(Quadro)*[ ]+NVS *30[0-9]M.* 2 1 0 0 -NVIDIA Quadro NVS 320M .*NVIDIA .*(Quadro)*[ ]+NVS *32[0-9]M.* 2 1 0 0 -NVIDIA Quadro NVS 2100M .*NVIDIA .*(Quadro)*[ ]+NVS *210[0-9]M.* 2 1 0 3.3 -NVIDIA Quadro NVS 3100M .*NVIDIA .*(Quadro)*[ ]+NVS *310[0-9]M.* 2 1 0 3.3 -NVIDIA Quadro NVS 4200M .*NVIDIA .*(Quadro)*[ ]+NVS *420[0-9]M.* 2 1 0 4.2 -NVIDIA Quadro NVS 5100M .*NVIDIA .*(Quadro)*[ ]+NVS *510[0-9]M.* 2 1 0 0 -NVIDIA Quadro NVS 5200M .*NVIDIA .*(Quadro)*[ ]+NVS *520[0-9]M.* 2 1 0 0 -NVIDIA Quadro NVS 5400M .*NVIDIA .*(Quadro)*[ ]+NVS *540[0-9]M.* 2 1 0 0 -NVIDIA Quadro NVS .*NVIDIA .*(Quadro)*[ ]+NVS 0 1 0 4.2 -NVIDIA Quadro2 .*Quadro2.* 0 1 0 1.5 -NVIDIA Quadro 1000M .*Quadro.* (K1|1)00[0-9]M.* 2 1 0 4.2 -NVIDIA Quadro 1100M .*Quadro.* *110[0-9]M.* 2 1 0 3.3 -NVIDIA Quadro K600 .*Quadro.* (K6|6)0[0-9][^0].* 2 1 0 4.2 -NVIDIA Quadro K1000 .*Quadro.* (K1|1)00[0-9].* 2 1 0 4.2 -NVIDIA Quadro 2000 M/D .*Quadro.* (K2|2)000.* 3 1 0 4.2 -NVIDIA Quadro 3000M .*Quadro.* (K3|3)00[0-9]M.* 3 1 0 4.2 -NVIDIA Quadro 4000M .*Quadro.* (K4|4)00[0-9]M.* 3 1 0 4.2 -NVIDIA Quadro 4000 .*Quadro.* (K4|4)000.* 3 1 0 4.2 -NVIDIA Quadro 50x0 M .*Quadro.* (K5|5)0.0.* 3 1 0 4.2 -NVIDIA Quadro 6000 .*Quadro.* (K6|6)000.* 3 1 0 0 -NVIDIA Quadro 400 .*Quadro.* 400.* 2 1 0 3.3 -NVIDIA Quadro 600 .*Quadro.* 600.* 2 1 0 4.2 -NVIDIA Quadro4 .*Quadro4.* 0 1 0 1.5 -NVIDIA Quadro DCC .*Quadro DCC.* 0 1 0 0 -NVIDIA Quadro CX .*Quadro.*CX.* 3 1 0 0 -NVIDIA G 100M .*NVIDIA .*G *10[0-9]M.* 1 1 1 3.3 -NVIDIA G 110M .*NVIDIA .*G *11[0-9]M.* 1 1 1 3.3 -NVIDIA G 120M .*NVIDIA .*G *12[0-9]M.* 1 1 1 3.3 -NVIDIA G 200M .*NVIDIA .*G *20[0-9]M.* 1 1 0 0 -NVIDIA G 410M .*NVIDIA .*G *41[0-9]M.* 3 1 1 4.2 -NVIDIA GT 130M .*NVIDIA .*GT *13[0-9]M.* 3 1 1 3.3 -NVIDIA GT 140M .*NVIDIA .*GT *14[0-9]M.* 3 1 1 3.3 -NVIDIA GT 150M .*NVIDIA .*GTS *15[0-9]M.* 2 1 0 0 -NVIDIA GTS 160M .*NVIDIA .*GTS *16[0-9]M.* 2 1 0 0 -NVIDIA G210M .*NVIDIA .*G *21[0-9]M.* 3 1 0 3.3 -NVIDIA GT 220M .*NVIDIA .*GT 22[0-9]M.* 3 1 1 3.3 -NVIDIA GT 230M .*NVIDIA .*GT 23[0-9]M.* 3 1 1 3.3 -NVIDIA GT 240M .*NVIDIA .*GT 24[0-9]M.* 3 1 1 3.3 -NVIDIA GT 260M .*NVIDIA .*GT 26[0-9]M.* 3 1 1 3.3 -NVIDIA GTS 250M .*NVIDIA .*GTS 25[0-9]M.* 3 1 0 3.3 -NVIDIA GTS 260M .*NVIDIA .*GTS 26[0-9]M.* 3 1 0 0 -NVIDIA GTX 260M .*NVIDIA .*GTX 26[0-9]M.* 3 1 0 3.3 -NVIDIA GTX 270M .*NVIDIA .*GTX 27[0-9]M.* 3 1 0 0 -NVIDIA GTX 280M .*NVIDIA .*GTX 28[0-9]M.* 3 1 0 3.3 -NVIDIA 300M .*NVIDIA .*GT 30[0-9]M.* 3 1 1 4.2 -NVIDIA G 310M .*NVIDIA .*G[T]* 31[0-9]M.* 2 1 0 3.3 -NVIDIA GT 320M .*NVIDIA .*G[T]* 32[0-9]M.* 3 1 0 3.3 -NVIDIA GT 330M .*NVIDIA .*G[T]* 33[0-9]M.* 3 1 1 3.3 -NVIDIA GT 340M .*NVIDIA .*G[T]* 34[0-9]M.* 4 1 1 3.3 -NVIDIA GTS 350M .*NVIDIA .*GTS 35[0-9]M.* 4 1 1 3.3 -NVIDIA GTS 360M .*NVIDIA .*GTS 36[0-9]M.* 5 1 1 3.3 -NVIDIA 310M .*NVIDIA .*31[0-9]M.* 2 1 0 3.3 -NVIDIA 320M .*NVIDIA .*320M.* 2 1 0 3.3 -NVIDIA 400M .*NVIDIA .*[ ]+40[0-9]M.* 2 1 0 0 -NVIDIA 410M .*NVIDIA .*[ ]+41[0-9]M.* 3 1 0 0 -NVIDIA GT 420M .*NVIDIA .*GT *42[0-9]M.* 3 1 1 4.3 -NVIDIA GT 430M .*NVIDIA .*GT *43[0-9]M.* 3 1 1 4.3 -NVIDIA GT 440M .*NVIDIA .*GT *44[0-9]M.* 3 1 1 4.3 -NVIDIA GT 450M .*NVIDIA .*GT *45[0-9]M.* 3 1 0 0 -NVIDIA GTX 460M .*NVIDIA .*GTX *46[0-9]M.* 4 1 1 4.3 -NVIDIA GTX 470M .*NVIDIA .*GTX *47[0-9]M.* 3 1 0 4.3 -NVIDIA GTX 480M .*NVIDIA .*GTX *48[0-9]M.* 3 1 1 4.3 -NVIDIA GT 520M .*NVIDIA .*GT *52[0-9]M.* 3 1 1 4.3 -NVIDIA GT 530M .*NVIDIA .*GT *53[0-9]M.* 3 1 1 4.3 -NVIDIA GT 540M .*NVIDIA .*GT *54[0-9]M.* 3 1 1 4.3 -NVIDIA GT 550M .*NVIDIA .*GT *55[0-9]M.* 3 1 1 4.3 -NVIDIA GTX 560M .*NVIDIA .*GTX *56[0-9]M.* 3 1 0 4.3 -NVIDIA GTX 570M .*NVIDIA .*GTX *57[0-9]M.* 5 1 0 4.3 -NVIDIA GTX 580M .*NVIDIA .*GTX *58[0-9]M.* 5 1 1 4.3 -NVIDIA 610M .*NVIDIA.* 61[0-9]M.* 3 1 1 4.3 -NVIDIA GT 620M .*NVIDIA .*GT *62[0-9]M.* 3 1 0 4.3 -NVIDIA GT 630M .*NVIDIA .*GT *63[0-9]M.* 3 1 0 4.3 -NVIDIA GT 640M .*NVIDIA .*GT *64[0-9]M.* 3 1 0 4.3 -NVIDIA GT 650M .*NVIDIA .*GT *65[0-9]M.* 3 1 0 4.3 -NVIDIA GTX 660M .*NVIDIA .*GTX *66[0-9]M.* 5 1 0 4.3 -NVIDIA GTX 670M .*NVIDIA .*GTX *67[0-9]M.* 5 1 1 4.3 -NVIDIA GTX 680M .*NVIDIA .*GTX *68[0-9]M.* 5 1 0 4.3 -NVIDIA GTX 690M .*NVIDIA .*GTX *69[0-9]M.* 5 1 0 4.3 -NVIDIA 710M .*NVIDIA.* 71[0-9]M.* 3 1 0 4.3 -NVIDIA GT 720M .*NVIDIA .*GT *72[0-9]M.* 3 1 0 4.3 -NVIDIA GT 730M .*NVIDIA .*GT *73[0-9]M.* 3 1 0 4.3 -NVIDIA GT 740M .*NVIDIA .*GT *74[0-9]M.* 3 1 0 4.3 -NVIDIA GT 750M .*NVIDIA .*GT *75[0-9]M.* 3 1 0 4.3 -NVIDIA GTX 760M .*NVIDIA .*GTX *76[0-9]M.* 5 1 0 4.3 -NVIDIA GTX 770M .*NVIDIA .*GTX *77[0-9]M.* 5 1 0 4.3 -NVIDIA GTX 780M .*NVIDIA .*GTX *78[0-9]M.* 5 1 0 4.3 -NVIDIA G100 .*NVIDIA .*G10.* 3 1 1 4.2 -NVIDIA GT 120 .*NVIDIA .*GT 12.* 2 1 0 3.3 -NVIDIA GT 130 .*NVIDIA .*GT 13.* 2 1 0 3.3 -NVIDIA GT 140 .*NVIDIA .*GT 14.* 2 1 0 3.3 -NVIDIA GT 150 .*NVIDIA .*GT 15.* 2 1 1 3.3 -NVIDIA GTS 150 .*NVIDIA .*GTS 15.* 2 1 0 0 -NVIDIA 200 .*NVIDIA .[ ]+200[^0].* 2 1 1 3.3 -NVIDIA G200 .*NVIDIA .*G[ ]*200.* 2 1 1 3.3 -NVIDIA G210 .*NVIDIA .*G[ ]*210.* 3 1 1 3.3 -NVIDIA 205 .*NVIDIA .*205[^0]*.* 3 1 1 3.3 -NVIDIA 210 .*NVIDIA .*210$ 3 1 1 3.3 -NVIDIA GeForce 210 .*NVIDIA .*(GeForce)[ ]210[^0]*$ 3 1 1 3.3 -NVIDIA GT 220 .*NVIDIA .*GT *22.* 2 1 1 3.3 -NVIDIA GT 230 .*NVIDIA .*GT *23.* 2 1 1 3.3 -NVIDIA GT 240 .*NVIDIA .*GT *24.* 4 1 1 3.3 -NVIDIA GTS 240 .*NVIDIA .*GTS *24.* 4 1 1 3.3 -NVIDIA GTS 250 .*NVIDIA .*GTS *25.* 4 1 1 3.3 -NVIDIA GTS 360 .*NVIDIA .*GTS *36.* 4 1 1 3.3 -NVIDIA GTX 260 .*NVIDIA .*GTX *26.* 4 1 1 3.3 -NVIDIA GTX 270 .*NVIDIA .*GTX *27.* 4 1 0 3.3 -NVIDIA GTX 280 .*NVIDIA .*GTX *28.* 4 1 1 3.3 -NVIDIA GTX 290 .*NVIDIA .*GTX *29.* 5 1 0 3.3 -NVIDIA GT 320 .*NVIDIA .*GT *32.* 3 1 0 3.3 -NVIDIA GT 330 .*NVIDIA .*GT *33.* 3 1 0 3.3 -NVIDIA GT 340 .*NVIDIA .*GT *34.* 3 1 0 0 -NVIDIA 310 .*NVIDIA .*310[^0M]*.* 3 1 1 3.3 -NVIDIA 315 .*NVIDIA .*315[^0M]*.* 3 1 1 3.3 -NVIDIA 320 .*NVIDIA .*320[^0M]*.* 3 1 1 3.3 -NVIDIA 405 .*NVIDIA .*405[^0]*.* 3 1 0 3.3 -NVIDIA 410 .*NVIDIA .*410[^0]*.* 3 1 0 3.3 -NVIDIA GT 415 .*NVIDIA .*GT *415.* 3 1 1 4.3 -NVIDIA GT 420 .*NVIDIA .*GT *42.* 3 1 1 4.3 -NVIDIA GT 430 .*NVIDIA .*GT *43.* 3 1 1 4.3 -NVIDIA GT 440 .*NVIDIA .*GT *44.* 4 1 1 4.3 -NVIDIA GT 450 .*NVIDIA .*GT *45.* 4 1 1 4.3 -NVIDIA GTS 450 .*NVIDIA .*GTS *45.* 4 1 1 4.3 -NVIDIA GTX 460 .*NVIDIA .*GTX *46.* 5 1 1 4.3 -NVIDIA GTX 470 .*NVIDIA .*GTX *47.* 5 1 1 4.3 -NVIDIA GTX 480 .*NVIDIA .*GTX *48.* 5 1 1 4.3 -NVIDIA 505 .*NVIDIA .*505[^0]*.* 3 1 0 0 -NVIDIA 510 .*NVIDIA .*510[^0]*.* 3 1 0 0 -NVIDIA GT 520 .*NVIDIA .*GT *52.* 3 1 1 4.3 -NVIDIA GT 530 .*NVIDIA .*GT *53.* 3 1 1 4.3 -NVIDIA GT 540 .*NVIDIA .*GT *54.* 3 1 1 4.3 -NVIDIA GT 550 .*NVIDIA .*GT *55.* 3 1 1 4.3 -NVIDIA GTX 550 .*NVIDIA .*GTX *55.* 5 1 1 4.3 -NVIDIA GTX 560 .*NVIDIA .*GTX *56.* 5 1 1 4.3 -NVIDIA GTX 570 .*NVIDIA .*GTX *57.* 5 1 1 4.3 -NVIDIA GTX 580 .*NVIDIA .*GTX *58.* 5 1 1 4.3 -NVIDIA GTX 590 .*NVIDIA .*GTX *59.* 5 1 1 4.3 -NVIDIA 605 .*NVIDIA .*605[^0]*.* 3 1 1 4.3 -NVIDIA GT 61x .*NVIDIA .*GT 61.* 3 1 1 4.3 -NVIDIA GT 62x .*NVIDIA .*GT 62.* 3 1 0 4.3 -NVIDIA GT 63x .*NVIDIA .*GT 63.* 3 1 0 4.3 -NVIDIA GT 64x .*NVIDIA .*GT 64.* 3 1 0 4.3 -NVIDIA GT 65x .*NVIDIA .*GT 65.* 3 1 1 4.3 -NVIDIA GTX 64x .*NVIDIA .*GTX 64.* 3 1 1 4.3 -NVIDIA GTX 65x .*NVIDIA .*GTX 65.* 3 1 1 4.3 -NVIDIA GTX 66x .*NVIDIA .*GTX 66.* 5 1 0 4.3 -NVIDIA GTX 67x .*NVIDIA .*GTX 67.* 5 1 1 4.3 -NVIDIA GTX 68x .*NVIDIA .*GTX 68.* 5 1 1 4.3 -NVIDIA GTX 69x .*NVIDIA .*GTX 69.* 5 1 1 4.3 -NVIDIA GT 71x .*NVIDIA .*GT *71.* 3 1 0 4.3 -NVIDIA GT 72x .*NVIDIA .*GT *72.* 3 1 0 4.3 -NVIDIA GT 73x .*NVIDIA .*GT *73.* 3 1 0 4.3 -NVIDIA GT 74x .*NVIDIA .*GT *74.* 3 1 0 4.3 -NVIDIA GTX 75x .*NVIDIA .*GTX *75.* 3 1 0 4.3 -NVIDIA GTX 76x .*NVIDIA .*GTX *76.* 5 1 0 4.3 -NVIDIA GTX 77x .*NVIDIA .*GTX *77.* 5 1 0 4.3 -NVIDIA GTX 78x .*NVIDIA .*GTX *78.* 5 1 0 4.3 -NVIDIA GTX TITAN .*NVIDIA .*GTX *TITAN.* 5 1 0 4.3 -NVIDIA C51 .*NVIDIA .*C51.* 0 1 1 2 -NVIDIA G72 .*NVIDIA .*G72.* 1 1 0 0 -NVIDIA G73 .*NVIDIA .*G73.* 1 1 0 0 -NVIDIA G84 .*NVIDIA .*G84.* 2 1 0 0 -NVIDIA G86 .*NVIDIA .*G86.* 3 1 0 0 -NVIDIA G92 .*NVIDIA .*G92.* 3 1 0 0 -NVIDIA GK106 .*NVIDIA .*GK106.* 5 1 0 4.3 -NVIDIA GeForce .*GeForce 256.* 0 0 0 0 -NVIDIA GeForce 2 .*GeForce ?2 ?.* 0 1 1 1.5 -NVIDIA GeForce 3 .*GeForce ?3 ?.* 2 1 1 2.1 -NVIDIA GeForce 3 Ti .*GeForce ?3 Ti.* 0 1 0 0 -NVIDIA GeForce 4 .*NVIDIA .*GeForce ?4.* 0 1 1 1.5 -NVIDIA GeForce 4 Go .*NVIDIA .*GeForce ?4.*Go.* 0 1 0 0 -NVIDIA GeForce 4 MX .*NVIDIA .*GeForce ?4 MX.* 0 1 0 0 -NVIDIA GeForce 4 PCX .*NVIDIA .*GeForce ?4 PCX.* 0 1 0 0 -NVIDIA GeForce 4 Ti .*NVIDIA .*GeForce ?4 Ti.* 0 1 0 0 -NVIDIA GeForce 6100 .*NVIDIA .*GeForce 61.* 3 1 1 4.2 -NVIDIA GeForce 6200 .*NVIDIA .*GeForce 62.* 0 1 1 2.1 -NVIDIA GeForce 6500 .*NVIDIA .*GeForce 65.* 1 1 1 2.1 -NVIDIA GeForce 6600 .*NVIDIA .*GeForce 66.* 2 1 1 2.1 -NVIDIA GeForce 6700 .*NVIDIA .*GeForce 67.* 2 1 1 2.1 -NVIDIA GeForce 6800 .*NVIDIA .*GeForce 68.* 1 1 1 2.1 -NVIDIA GeForce 7000 .*NVIDIA .*GeForce 70.* 1 1 1 2.1 -NVIDIA GeForce 7100 .*NVIDIA .*GeForce 71.* 1 1 1 2.1 -NVIDIA GeForce 7200 .*NVIDIA .*GeForce 72.* 1 1 0 0 -NVIDIA GeForce 7300 .*NVIDIA .*GeForce 73.* 1 1 1 2.1 -NVIDIA GeForce 7500 .*NVIDIA .*GeForce 75.* 2 1 1 2.1 -NVIDIA GeForce 7600 .*NVIDIA .*GeForce 76.* 2 1 1 2.1 -NVIDIA GeForce 7800 .*NVIDIA .*GeForce 78.* 2 1 1 2.1 -NVIDIA GeForce 7900 .*NVIDIA .*GeForce 79.* 3 1 1 2.1 -NVIDIA GeForce 8100 .*NVIDIA .*GeForce 81.* 1 1 0 3.3 -NVIDIA GeForce 8200M .*NVIDIA .*GeForce 820[0-9]M.* 1 1 0 3.3 -NVIDIA GeForce 8200 .*NVIDIA .*GeForce 82.* 1 1 0 3.3 -NVIDIA GeForce 8300 .*NVIDIA .*GeForce 83.* 3 1 1 3.3 -NVIDIA GeForce 8400M .*NVIDIA .*GeForce 840[0-9]M.* 1 1 1 3.3 -NVIDIA GeForce 8400 .*NVIDIA .*GeForce 84.* 2 1 1 3.3 -NVIDIA GeForce 8500 .*NVIDIA .*GeForce 85.* 2 1 1 3.3 -NVIDIA GeForce 8600M .*NVIDIA .*GeForce 860[0-9]M.* 2 1 1 3.3 -NVIDIA GeForce 8600 .*NVIDIA .*GeForce 86.* 3 1 1 3.3 -NVIDIA GeForce 8700M .*NVIDIA .*GeForce 870[0-9]M.* 2 1 1 3.3 -NVIDIA GeForce 8700 .*NVIDIA .*GeForce 87.* 3 1 0 0 -NVIDIA GeForce 8800M .*NVIDIA .*GeForce 880[0-9]M.* 2 1 1 3.3 -NVIDIA GeForce 8800 .*NVIDIA .*GeForce 88.* 3 1 1 3.3 -NVIDIA GeForce 9100M .*NVIDIA .*GeForce 910[0-9]M.* 0 1 0 3.3 -NVIDIA GeForce 9100 .*NVIDIA .*GeForce 91.* 0 1 0 3.3 -NVIDIA GeForce 9200M .*NVIDIA .*GeForce 920[0-9]M.* 1 1 0 3.3 -NVIDIA GeForce 9200 .*NVIDIA .*GeForce 92.* 1 1 0 3.3 -NVIDIA GeForce 9300M .*NVIDIA .*GeForce 930[0-9]M.* 1 1 1 3.3 -NVIDIA GeForce 9300 .*NVIDIA .*GeForce 93.* 1 1 1 3.3 -NVIDIA GeForce 9400M .*NVIDIA .*GeForce 940[0-9]M.* 2 1 1 3.3 -NVIDIA GeForce 9400 .*NVIDIA .*GeForce 94.* 3 1 1 3.3 -NVIDIA GeForce 9500M .*NVIDIA .*GeForce 950[0-9]M.* 1 1 1 3.3 -NVIDIA GeForce 9500 .*NVIDIA .*GeForce 95.* 3 1 1 3.3 -NVIDIA GeForce 9600M .*NVIDIA .*GeForce 960[0-9]M.* 2 1 1 3.3 -NVIDIA GeForce 9600 .*NVIDIA .*GeForce 96.* 3 1 1 3.3 -NVIDIA GeForce 9700M .*NVIDIA .*GeForce 970[0-9]M.* 0 1 1 3.3 -NVIDIA GeForce 9800M .*NVIDIA .*GeForce 980[0-9]M.* 2 1 1 3.3 -NVIDIA GeForce 9800 .*NVIDIA .*GeForce 98.* 3 1 1 3.3 -NVIDIA GeForce FX 5100 .*NVIDIA .*GeForce FX 51.* 0 1 0 0 -NVIDIA GeForce FX 5200 .*NVIDIA .*GeForce FX 52.* 0 1 0 2.1 -NVIDIA GeForce FX 5300 .*NVIDIA .*GeForce FX 53.* 0 1 0 0 -NVIDIA GeForce FX 5500 .*NVIDIA .*GeForce FX 55.* 0 1 1 2.1 -NVIDIA GeForce FX 5600 .*NVIDIA .*GeForce FX 56.* 1 1 1 2.1 -NVIDIA GeForce FX 5700 .*NVIDIA .*GeForce FX 57.* 0 1 1 2.1 -NVIDIA GeForce FX 5800 .*NVIDIA .*GeForce FX 58.* 1 1 0 0 -NVIDIA GeForce FX 5900 .*NVIDIA .*GeForce FX 59.* 1 1 1 2.1 -NVIDIA GeForce FX Go5100 .*NVIDIA .*GeForce FX Go51.* 0 1 0 0 -NVIDIA GeForce FX Go5200 .*NVIDIA .*GeForce FX Go52.* 0 1 0 1.5 -NVIDIA GeForce FX Go5300 .*NVIDIA .*GeForce FX Go53.* 0 1 0 0 -NVIDIA GeForce FX Go5500 .*NVIDIA .*GeForce FX Go55.* 0 1 0 0 -NVIDIA GeForce FX Go5600 .*NVIDIA .*GeForce FX Go56.* 0 1 1 2.1 -NVIDIA GeForce FX Go5700 .*NVIDIA .*GeForce FX Go57.* 1 1 1 1.5 -NVIDIA GeForce FX Go5800 .*NVIDIA .*GeForce FX Go58.* 1 1 0 0 -NVIDIA GeForce FX Go5900 .*NVIDIA .*GeForce FX Go59.* 1 1 0 0 -NVIDIA GeForce FX Go5xxx .*NVIDIA .*GeForce FX Go.* 0 1 0 0 -NVIDIA GeForce Go 6100 .*NVIDIA .*GeForce Go 61.* 0 1 1 2.1 -NVIDIA GeForce Go 6200 .*NVIDIA .*GeForce Go 62.* 0 1 0 1.5 -NVIDIA GeForce Go 6400 .*NVIDIA .*GeForce Go 64.* 1 1 1 2.1 -NVIDIA GeForce Go 6500 .*NVIDIA .*GeForce Go 65.* 1 1 0 0 -NVIDIA GeForce Go 6600 .*NVIDIA .*GeForce Go 66.* 0 1 1 2.1 -NVIDIA GeForce Go 6700 .*NVIDIA .*GeForce Go 67.* 1 1 0 0 -NVIDIA GeForce Go 6800 .*NVIDIA .*GeForce Go 68.* 0 1 1 2.1 -NVIDIA GeForce Go 7200 .*NVIDIA .*GeForce Go 72.* 1 1 0 2.1 -NVIDIA GeForce Go 7300 LE .*NVIDIA .*GeForce Go 73.*LE.* 1 1 0 0 -NVIDIA GeForce Go 7300 .*NVIDIA .*GeForce Go 73.* 1 1 1 2.1 -NVIDIA GeForce Go 7400 .*NVIDIA .*GeForce Go 74.* 1 1 1 2.1 -NVIDIA GeForce Go 7600 .*NVIDIA .*GeForce Go 76.* 1 1 1 2.1 -NVIDIA GeForce Go 7700 .*NVIDIA .*GeForce Go 77.* 0 1 1 2.1 -NVIDIA GeForce Go 7800 .*NVIDIA .*GeForce Go 78.* 2 1 0 0 -NVIDIA GeForce Go 7900 .*NVIDIA .*GeForce Go 79.* 1 1 1 2.1 -NVIDIA D9M .*NVIDIA .*D9M.* 1 1 0 0 -NVIDIA G94 .*NVIDIA .*G94.* 3 1 0 0 -NVIDIA GeForce Go 6 .*GeForce Go 6.* 1 1 0 0 -NVIDIA NB8M .*NVIDIA .*NB8M.* 1 1 0 0 -NVIDIA NB8P .*NVIDIA .*NB8P.* 2 1 0 0 -NVIDIA NB9E .*NVIDIA .*NB9E.* 3 1 0 0 -NVIDIA NB9M .*NVIDIA .*NB9M.* 1 1 0 0 -NVIDIA NB9P .*NVIDIA .*NB9P.* 2 1 0 0 -NVIDIA N10 .*NVIDIA .*N10.* 1 1 0 2.1 -NVIDIA GeForce PCX .*GeForce PCX.* 0 1 0 1.5 -NVIDIA PCI .*NVIDIA PCI[ ]* 0 0 0 2.1 -NVIDIA Generic .*NVIDIA Generic.* 0 0 0 2.1 -NVIDIA Generic Unknown .*NVIDIA .*Unknown.* 0 0 0 2.1 -NVIDIA NV17 .*NVIDIA .*NV17.* 0 1 0 0 -NVIDIA NV34 .*NVIDIA .*NV34.* 0 1 0 0 -NVIDIA NV35 .*NVIDIA .*NV35.* 0 1 0 0 -NVIDIA NV36 .*NVIDIA .*NV36.* 1 1 0 0 -NVIDIA NV41 .*NVIDIA .*NV41.* 1 1 0 0 -NVIDIA NV43 .*NVIDIA .*NV43.* 1 1 0 0 -NVIDIA NV44 .*NVIDIA .*NV44.* 1 1 0 0 -NVIDIA nForce .*NVIDIA .*nForce.* 0 0 0 3.3 -NVIDIA MCP51 .*NVIDIA .*MCP51.* 1 1 0 0 -NVIDIA MCP61 .*NVIDIA .*MCP61.* 1 1 0 2.1 -NVIDIA MCP67 .*NVIDIA .*MCP67.* 1 1 0 0 -NVIDIA MCP68 .*NVIDIA .*MCP68.* 1 1 0 0 -NVIDIA MCP73 .*NVIDIA .*MCP73.* 1 1 0 0 -NVIDIA MCP77 .*NVIDIA .*MCP77.* 1 1 0 0 -NVIDIA MCP78 .*NVIDIA .*MCP78.* 1 1 0 0 -NVIDIA MCP79 .*NVIDIA .*MCP79.* 1 1 0 0 -NVIDIA MCP7A .*NVIDIA .*MCP7A.* 1 1 0 0 -NVIDIA Corporation N12P .*NVIDIA .*N12P.* 1 1 1 4.1 -NVIDIA Corporation N11M .*NVIDIA .*N11M.* 2 1 0 3.1 -NVIDIA RIVA TNT .*RIVA TNT.* 0 0 0 1.5 -NVIDIA GRID .*NVIDIA .*GRID.* 0 0 0 1.5 -NVIDIA ION 2 .*NVIDIA .* *[I][O][N] 2.* 2 1 0 0 -NVIDIA ION a .*NVIDIA .*[I][O][N]$ 2 1 1 3.3 -NVIDIA ION b .*NVIDIA .*(Corporation) [I][O][N].* 2 1 1 3.3 -S3 .*S3 *(Graphics)*.* 0 0 1 1.4 -SiS SiS.* 0 0 1 1.5 -Trident Trident.* 0 0 0 0 -Tungsten Graphics Tungsten.* 0 0 0 0 -XGI XGI.* 0 0 0 0 -VIA VIA.* 0 0 0 0 -Apple Generic Apple.*Generic.* 0 0 0 0 -Apple Software Renderer Apple.*Software Renderer.* 0 0 0 0 -Oracle VirtualBox.* 0 1 1 2.1 -Humper Humper.* 0 1 1 2.1 -PowerVR SGX545 .*PowerVR SGX.* 1 1 1 3 -ATI GeForce Lulz .*ATI.*GeForce.* 0 0 0 0 - - diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 297bd9a05b..3f32be1d68 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -275,9 +275,24 @@ bool LLAgent::isActionAllowed(const LLSD& sdname) if (param == "speak") { - if ( gAgent.isVoiceConnected() && - LLViewerParcelMgr::getInstance()->allowAgentVoice() && - ! 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 cce1eb5895..b76a66ab39 100755 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -1043,7 +1043,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; } @@ -1100,7 +1100,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 142a3250c8..3d9b1a72a8 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1869,7 +1869,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(); } @@ -3825,6 +3825,10 @@ void LLAppearanceMgr::removeItemsFromAvatar(const uuid_vec_t& ids_to_remove) { LL_DEBUGS("Avatar") << "ATT removing attachment " << item->getName() << " id " << item->getUUID() << LL_ENDL; } + if (item && item->getType() == LLAssetType::AT_BODYPART) + { + continue; + } removeCOFItemLinks(linked_item_id, cb); addDoomedTempAttachment(linked_item_id); } diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index fbf2a04bcc..4fb6607723 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -124,6 +124,9 @@ #include "llleap.h" #include "stringize.h" #include "llcoros.h" +#if !LL_LINUX +#include "cef/llceflib.h" +#endif // Third party library includes #include <boost/bind.hpp> @@ -131,7 +134,6 @@ #include <boost/algorithm/string.hpp> #include <boost/regex.hpp> - #if LL_WINDOWS # include <share.h> // For _SH_DENYWR in processMarkerFiles #else @@ -327,7 +329,10 @@ BOOL gDisconnected = FALSE; // used to restore texture state after a mode switch LLFrameTimer gRestoreGLTimer; BOOL gRestoreGL = FALSE; -BOOL gUseWireframe = FALSE; +BOOL gUseWireframe = FALSE; + +//use for remember deferred mode in wireframe switch +BOOL gInitialDeferredModeForWireframe = FALSE; // VFS globals - see llappviewer.h LLVFS* gStaticVFS = NULL; @@ -1728,6 +1733,9 @@ bool LLAppViewer::cleanup() // to ensure shutdown order LLMortician::setZealous(TRUE); + // Give any remaining SLPlugin instances a chance to exit cleanly. + LLPluginProcessParent::shutdown(); + LLVoiceClient::getInstance()->terminate(); disconnectViewer(); @@ -2784,11 +2792,11 @@ bool LLAppViewer::initConfiguration() // gWindowTitle = LLTrans::getString("APP_NAME"); #if LL_DEBUG - gWindowTitle += std::string(" [DEBUG]") + gWindowTitle += std::string(" [DEBUG]"); #endif if (!gArgs.empty()) { - gWindowTitle += std::string(" ") + gArgs; + gWindowTitle += std::string(" ") + gArgs; } LLStringUtil::truncate(gWindowTitle, 255); @@ -3372,8 +3380,11 @@ LLSD LLAppViewer::getViewerInfo() const info["VOICE_VERSION"] = LLTrans::getString("NotConnected"); } - // TODO: Implement media plugin version query - info["QT_WEBKIT_VERSION"] = "4.7.1 (version number hard-coded)"; +#if !LL_LINUX + info["LLCEFLIB_VERSION"] = LLCEFLIB_VERSION; +#else + info["LLCEFLIB_VERSION"] = "Undefined"; +#endif S32 packets_in = LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_IN); if (packets_in > 0) diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 718871138e..ad5268496b 100755 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -375,6 +375,7 @@ extern BOOL gDisconnected; extern LLFrameTimer gRestoreGLTimer; extern BOOL gRestoreGL; extern BOOL gUseWireframe; +extern BOOL gInitialDeferredModeForWireframe; // VFS globals - gVFS is for general use // gStaticVFS is read-only and is shipped w/ the viewer diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index d2b1dcbf35..121ce647a6 100755 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -618,7 +618,10 @@ void LLUpdateTaskInventoryResponder::uploadComplete(const LLSD& content) case LLAssetType::AT_NOTECARD: { // Update the UI with the new asset. - LLPreviewNotecard* nc = LLFloaterReg::findTypedInstance<LLPreviewNotecard>("preview_notecard", LLSD(item_id)); + LLSD floater_key; + floater_key["taskid"] = task_id; + floater_key["itemid"] = item_id; + LLPreviewNotecard* nc = LLFloaterReg::findTypedInstance<LLPreviewNotecard>("preview_notecard", floater_key); if(nc) { // *HACK: we have to delete the asset in the VFS so diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index dc0835eb1c..4b426081d0 100755 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -526,7 +526,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 8ce5aca909..307f93e28c 100755 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -483,7 +483,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/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp index 33ce3d0111..33675bd261 100755 --- a/indra/newview/lldrawpoolterrain.cpp +++ b/indra/newview/lldrawpoolterrain.cpp @@ -220,24 +220,7 @@ void LLDrawPoolTerrain::render(S32 pass) // Special-case for land ownership feedback if (gSavedSettings.getBOOL("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(); } } @@ -265,7 +248,15 @@ void LLDrawPoolTerrain::renderDeferred(S32 pass) { return; } + renderFullShader(); + + // Special-case for land ownership feedback + if (gSavedSettings.getBOOL("ShowParcelOwners")) + { + hilightParcelOwners(); + } + } void LLDrawPoolTerrain::beginShadowPass(S32 pass) @@ -454,6 +445,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<LLTextBoxEx>(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 8f3eaaa207..b779d8f461 100755 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -655,11 +655,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()) { @@ -751,7 +752,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; } @@ -778,7 +783,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 @@ -1617,7 +1622,7 @@ void LLFavoritesOrderStorage::removeFavoritesRecordOfUser() { LLSD user_llsd = fav_llsd[av_name.getUserName()]; - if (user_llsd.beginArray()->has("id")) + if ((user_llsd.beginArray()!= user_llsd.endArray()) && user_llsd.beginArray()->has("id")) { for (LLSD::array_iterator iter = user_llsd.beginArray();iter != user_llsd.endArray(); ++iter) { @@ -1783,10 +1788,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; + + for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); it++) + { + if(mFavoriteNames[(*it)->getUUID()] != ((*it)->getName())) + { + mFavoriteNames[(*it)->getUUID()] = (*it)->getName(); + name_changed = true; + } + } - if((items != mPrevFavorites) || pref_changed) + if((items != mPrevFavorites) || name_changed || pref_changed) { - std::string filename = getStoredFavoritesFilename(); + std::string filename = getStoredFavoritesFilename(); if (!filename.empty()) { llifstream in_file; diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index 66fc8b2ae7..846d62227a 100755 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -218,6 +218,7 @@ public: const static S32 NO_INDEX; static bool mSaveOnExit; bool mUpdateRequired; + std::map<LLUUID,std::string> mFavoriteNames; private: friend class LLSingleton<LLFavoritesOrderStorage>; diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index ea39f812fd..b1e3f2bb14 100755 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -60,8 +60,6 @@ #include "lldxhardware.h" #endif -#define LL_EXPORT_GPU_TABLE 0 - #if LL_DARWIN const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt"; const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_mac.%s.txt"; diff --git a/indra/newview/llfloaterexperienceprofile.cpp b/indra/newview/llfloaterexperienceprofile.cpp index 197162487d..fd226d656c 100644 --- a/indra/newview/llfloaterexperienceprofile.cpp +++ b/indra/newview/llfloaterexperienceprofile.cpp @@ -117,12 +117,20 @@ LLExperienceHandler gExperienceHandler; LLFloaterExperienceProfile::LLFloaterExperienceProfile(const LLSD& data) : LLFloater(data) - , mExperienceId(data.asUUID()) , mSaveCompleteAction(NOTHING) , mDirty(false) , mForceClose(false) { - + if (data.has("experience_id")) + { + mExperienceId = data["experience_id"].asUUID(); + mPostEdit = data.has("edit_experience") && data["edit_experience"].asBoolean(); + } + else + { + mExperienceId = data.asUUID(); + mPostEdit = false; + } } @@ -329,7 +337,13 @@ BOOL LLFloaterExperienceProfile::postBuild() LLEventPumps::instance().obtain("experience_permission").listen(mExperienceId.asString()+"-profile", boost::bind(&LLFloaterExperienceProfile::experiencePermission, getDerivedHandle<LLFloaterExperienceProfile>(this), _1)); - + + if (mPostEdit && mExperienceId.notNull()) + { + mPostEdit = false; + changeToEdit(); + } + return TRUE; } @@ -356,9 +370,7 @@ bool LLFloaterExperienceProfile::experiencePermission( LLHandle<LLFloaterExperie void LLFloaterExperienceProfile::onClickEdit() { - LLTabContainer* tabs = getChild<LLTabContainer>("tab_container"); - - tabs->selectTabByName("edit_panel_experience_info"); + changeToEdit(); } @@ -829,6 +841,13 @@ void LLFloaterExperienceProfile::changeToView() } } +void LLFloaterExperienceProfile::changeToEdit() +{ + LLTabContainer* tabs = getChild<LLTabContainer>("tab_container"); + + tabs->selectTabByName("edit_panel_experience_info"); +} + void LLFloaterExperienceProfile::onClickLocation() { LLViewerRegion* region = gAgent.getRegion(); diff --git a/indra/newview/llfloaterexperienceprofile.h b/indra/newview/llfloaterexperienceprofile.h index 78d54eb447..14e033d240 100644 --- a/indra/newview/llfloaterexperienceprofile.h +++ b/indra/newview/llfloaterexperienceprofile.h @@ -76,6 +76,7 @@ protected: void setEditGroup(LLUUID group_id); void changeToView(); + void changeToEdit(); void experienceForgotten(); void experienceBlocked(); @@ -99,6 +100,7 @@ protected: int mSaveCompleteAction; bool mDirty; bool mForceClose; + bool mPostEdit; // edit experience after opening and updating it }; #endif // LL_LLFLOATEREXPERIENCEPROFILE_H diff --git a/indra/newview/llfloaterexperiences.cpp b/indra/newview/llfloaterexperiences.cpp index 777dc382cd..63f1fab823 100644 --- a/indra/newview/llfloaterexperiences.cpp +++ b/indra/newview/llfloaterexperiences.cpp @@ -303,6 +303,32 @@ void LLFloaterExperiences::checkPurchaseInfo(LLPanelExperiences* panel, const LL LLFloaterExperiences::findInstance()->updateInfo("GetCreatorExperiences","Contrib_Experiences_Tab"); } +void LLFloaterExperiences::checkAndOpen(LLPanelExperiences* panel, const LLSD& content) const +{ + checkPurchaseInfo(panel, content); + + // determine new item + const LLSD& response_ids = content["experience_ids"]; + + if (mPrepurchaseIds.size() + 1 == response_ids.size()) + { + // we have a new element + for (LLSD::array_const_iterator it = response_ids.beginArray(); it != response_ids.endArray(); ++it) + { + LLUUID experience_id = it->asUUID(); + if (std::find(mPrepurchaseIds.begin(), mPrepurchaseIds.end(), experience_id) == mPrepurchaseIds.end()) + { + // new element found, open it + LLSD args; + args["experience_id"] = experience_id; + args["edit_experience"] = true; + LLFloaterReg::showInstance("experience_profile", args, true); + break; + } + } + } +} + void LLFloaterExperiences::updateInfo(std::string experiences, std::string tab) { LLViewerRegion* region = gAgent.getRegion(); @@ -318,18 +344,28 @@ void LLFloaterExperiences::updateInfo(std::string experiences, std::string tab) } } -void LLFloaterExperiences::sendPurchaseRequest() const +void LLFloaterExperiences::sendPurchaseRequest() { LLViewerRegion* region = gAgent.getRegion(); std::string url = region->getCapability("AgentExperiences"); if(!url.empty()) { LLSD content; + const std::string tab_owned_name = "Owned_Experiences_Tab"; + + // extract ids for experiences that we already have + LLTabContainer* tabs = getChild<LLTabContainer>("xp_tabs"); + LLPanelExperiences* tab_owned = (LLPanelExperiences*)tabs->getPanelByName(tab_owned_name); + mPrepurchaseIds.clear(); + if (tab_owned) + { + tab_owned->getExperienceIdsList(mPrepurchaseIds); + } LLExperienceListResponder::NameMap nameMap; - nameMap["experience_ids"]="Owned_Experiences_Tab"; + nameMap["experience_ids"] = tab_owned_name; LLExperienceListResponder* responder = new LLExperienceListResponder(getDerivedHandle<LLFloaterExperiences>(), nameMap, "ExperienceAcquireFailed"); - responder->mCallback = boost::bind(&LLFloaterExperiences::checkPurchaseInfo, this, _1, _2); + responder->mCallback = boost::bind(&LLFloaterExperiences::checkAndOpen, this, _1, _2); LLHTTPClient::post(url, content, responder); } } diff --git a/indra/newview/llfloaterexperiences.h b/indra/newview/llfloaterexperiences.h index 769283ff07..06fd6c93d6 100644 --- a/indra/newview/llfloaterexperiences.h +++ b/indra/newview/llfloaterexperiences.h @@ -49,12 +49,14 @@ protected: LLPanelExperiences* addTab(const std::string& name, bool select); bool updatePermissions(const LLSD& permission); - void sendPurchaseRequest() const; + void sendPurchaseRequest(); void checkPurchaseInfo(LLPanelExperiences* panel, const LLSD& content)const; + void checkAndOpen(LLPanelExperiences* panel, const LLSD& content) const; void updateInfo(std::string experiences, std::string tab); private: + std::vector<LLUUID> mPrepurchaseIds; }; #endif //LL_LLFLOATEREXPERIENCES_H diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index f1a6ef78a6..15b67b905d 100755 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -1916,19 +1916,17 @@ bool LLFloaterIMContainer::canBanSelectedMember(const LLUUID& participant_uuid) if (gdatap->isRoleMemberDataComplete()) { - if (!gdatap->mMembers.size()) - { - return false; - } - - LLGroupMgrGroupData::member_list_t::iterator mi = gdatap->mMembers.find((participant_uuid)); - if (mi != gdatap->mMembers.end()) - { - LLGroupMemberData* member_data = (*mi).second; - // Is the member an owner? - if (member_data && member_data->isInRole(gdatap->mOwnerRole)) + if (gdatap->mMembers.size()) + { + LLGroupMgrGroupData::member_list_t::iterator mi = gdatap->mMembers.find((participant_uuid)); + if (mi != gdatap->mMembers.end()) { - return false; + LLGroupMemberData* member_data = (*mi).second; + // Is the member an owner? + if (member_data && member_data->isInRole(gdatap->mOwnerRole)) + { + return false; + } } } } diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 41005144a7..861dc88983 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -2573,6 +2573,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<LLVector3> v_list; + v_list.resize(4); + std::map<U8, std::vector<LLVector3> > 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<U8, std::vector<LLVector3> >(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<U8, std::vector<LLVector3> >(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<U8, std::vector<LLVector3> >(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<U8, std::vector<LLVector3> >(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<U8, std::vector<LLVector3> >(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<U8, std::vector<LLVector3> >(5, v_list)); + + U16 Idx[] = { 0, 1, 2, 3, 0, 2, }; + + U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0; + LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(type_mask, 0); + buff->allocateBuffer(4, 6, true); + + LLStrider<LLVector3> pos; + LLStrider<U16> idx; + LLStrider<LLVector3> norm; + LLStrider<LLVector2> 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<std::string, LLImportMaterial> materials; + std::vector<LLModelInstance> 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<LLMatrix4, std::vector<LLModelInstance> >(mat, instance_list)); + } + } +} void LLModelPreview::updateStatusMessages() { @@ -3563,6 +3669,7 @@ BOOL LLModelPreview::render() fmp->enableViewOption("show_skin_weight"); fmp->setViewOptionEnabled("show_joint_positions", skin_weight); mFMP->childEnable("upload_skin"); + mFMP->childSetValue("show_skin_weight", skin_weight); } } else @@ -3683,7 +3790,7 @@ BOOL LLModelPreview::render() } else { - LL_INFOS(" ") << "Vertex Buffer[" << mPreviewLOD << "]" << " is EMPTY!!!" << LL_ENDL; + LL_INFOS() << "Vertex Buffer[" << mPreviewLOD << "]" << " is EMPTY!!!" << LL_ENDL; regen = TRUE; } } diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 7a518c798b..07e29d09c7 100755 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -262,6 +262,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/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index dac610eda1..f7861fb4fd 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -108,6 +108,7 @@ #include "llpluginclassmedia.h" #include "llteleporthistorystorage.h" #include "llproxy.h" +#include "llweb.h" #include "lllogininstance.h" // to check if logged in yet #include "llsdserialize.h" @@ -1942,6 +1943,16 @@ BOOL LLPanelPreference::postBuild() gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&LLPanelPreference::Updater::update, mBandWidthUpdater, _2)); } +#ifdef EXTERNAL_TOS + LLRadioGroup* ext_browser_settings = getChild<LLRadioGroup>("preferred_browser_behavior"); + if (ext_browser_settings) + { + // turn off ability to set external/internal browser + ext_browser_settings->setSelectedByValue(LLWeb::BROWSER_EXTERNAL_ONLY, true); + ext_browser_settings->setEnabled(false); + } +#endif + apply(); return true; } diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 6dbb202c9d..987a7449ee 100755 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -370,6 +370,7 @@ LLFloaterTools::LLFloaterTools(const LLSD& key) mLandImpactsObserver(NULL), mDirty(TRUE), + mHasSelection(TRUE), mNeedMediaTitle(TRUE) { gFloaterTools = this; @@ -541,7 +542,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 df481b8d4c..8f586f7da6 100755 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -198,6 +198,7 @@ public: private: BOOL mDirty; + BOOL mHasSelection; std::map<std::string, std::string> mStatusText; diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp index d604b8619a..f8681fe098 100755 --- a/indra/newview/llfloatertopobjects.cpp +++ b/indra/newview/llfloatertopobjects.cpp @@ -118,25 +118,32 @@ void LLFloaterTopObjects::setMode(U32 mode) // static void LLFloaterTopObjects::handle_land_reply(LLMessageSystem* msg, void** data) { - LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("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<LLFloaterTopObjects>("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<LLFloaterRegionInfo>("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/llfloatertos.cpp b/indra/newview/llfloatertos.cpp index ae33acb842..4cb1ca6cc0 100755 --- a/indra/newview/llfloatertos.cpp +++ b/indra/newview/llfloatertos.cpp @@ -46,7 +46,6 @@ #include "message.h" #include "llstartup.h" // login_alert_done - LLFloaterTOS::LLFloaterTOS(const LLSD& data) : LLModalDialog( data["message"].asString() ), mMessage(data["message"].asString()), @@ -85,7 +84,7 @@ protected: { if ( mParent ) { - mParent->setSiteIsAlive( true ); + mParent->setSiteIsAlive(true); } } @@ -136,6 +135,20 @@ BOOL LLFloaterTOS::postBuild() LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("tos_html"); if ( web_browser ) { +// if we are forced to send users to an external site in their system browser +// (e.g.) Linux users because of lack of media support for HTML ToS page +// remove exisiting UI and replace with a link to external page where users can accept ToS +#ifdef EXTERNAL_TOS + LLTextBox* header = getChild<LLTextBox>("tos_heading"); + if (header) + header->setVisible(false); + + LLTextBox* external_prompt = getChild<LLTextBox>("external_tos_required"); + if (external_prompt) + external_prompt->setVisible(true); + + web_browser->setVisible(false); +#else web_browser->addObserver(this); // Don't use the start_url parameter for this browser instance -- it may finish loading before we get to add our observer. @@ -147,6 +160,7 @@ BOOL LLFloaterTOS::postBuild() // All links from tos_html should be opened in external browser media_plugin->setOverrideClickTarget("_external"); } +#endif } return TRUE; @@ -154,6 +168,13 @@ BOOL LLFloaterTOS::postBuild() void LLFloaterTOS::setSiteIsAlive( bool alive ) { +// if we are forced to send users to an external site in their system browser +// (e.g.) Linux users because of lack of media support for HTML ToS page +// force the regular HTML UI to deactivate so alternative is rendered instead. +#ifdef EXTERNAL_TOS + mSiteAlive = false; +#else + mSiteAlive = alive; // only do this for TOS pages @@ -182,6 +203,7 @@ void LLFloaterTOS::setSiteIsAlive( bool alive ) tos_agreement->setEnabled( true ); } } +#endif } LLFloaterTOS::~LLFloaterTOS() diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 4d92fee04f..e1315adfde 100755 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -772,7 +772,7 @@ void LLGroupMgrGroupData::banMemberById(const LLUUID& participant_uuid) mPendingBanRequest = true; mPendingBanMemberID = participant_uuid; - if (!mMemberDataComplete) + if (!mMemberDataComplete || !mMembers.size()) { LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mID); } diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index c990eda074..9782c792c9 100755 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -80,6 +80,8 @@ #include "lllandmarkactions.h" #include "llpanellandmarks.h" +#include <boost/shared_ptr.hpp> + void copy_slurl_to_clipboard_callback_inv(const std::string& slurl); typedef std::pair<LLUUID, LLUUID> two_uuids_t; @@ -99,7 +101,7 @@ struct LLMoveInv using namespace LLOldEvents; // Function declarations -bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*); +bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, boost::shared_ptr<LLMoveInv>); bool confirm_attachment_rez(const LLSD& notification, const LLSD& response); void teleport_via_landmark(const LLUUID& asset_id); static BOOL can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit); @@ -295,7 +297,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; } @@ -2789,7 +2795,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, return accept; } -void warn_move_inventory(LLViewerObject* object, LLMoveInv* move_inv) +void warn_move_inventory(LLViewerObject* object, boost::shared_ptr<LLMoveInv> move_inv) { const char* dialog = NULL; if (object->flagScripted()) @@ -2800,7 +2806,34 @@ void warn_move_inventory(LLViewerObject* object, LLMoveInv* move_inv) { dialog = "MoveInventoryFromObject"; } - LLNotificationsUtil::add(dialog, LLSD(), LLSD(), boost::bind(move_task_inventory_callback, _1, _2, move_inv)); + + static LLNotificationPtr notification_ptr; + static boost::shared_ptr<LLMoveInv> inv_ptr; + + // Notification blocks user from interacting with inventories so everything that comes after first message + // is part of this message - don'r show it again + // Note: workaround for MAINT-5495 untill proper refactoring and warning system for Drag&Drop can be made. + if (notification_ptr == NULL + || !notification_ptr->isActive() + || LLNotificationsUtil::find(notification_ptr->getID()) == NULL + || inv_ptr->mCategoryID != move_inv->mCategoryID + || inv_ptr->mObjectID != move_inv->mObjectID) + { + notification_ptr = LLNotificationsUtil::add(dialog, LLSD(), LLSD(), boost::bind(move_task_inventory_callback, _1, _2, move_inv)); + inv_ptr = move_inv; + } + else + { + // Notification is alive and not responded, operating inv_ptr should be safe so attach new data + two_uuids_list_t::iterator move_it; + for (move_it = move_inv->mMoveList.begin(); + move_it != move_inv->mMoveList.end(); + ++move_it) + { + inv_ptr->mMoveList.push_back(*move_it); + } + move_inv.reset(); + } } // Move/copy all inventory items from the Contents folder of an in-world @@ -2888,7 +2921,7 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id, if(drop && accept) { it = inventory_objects.begin(); - LLMoveInv* move_inv = new LLMoveInv; + boost::shared_ptr<LLMoveInv> move_inv(new LLMoveInv); move_inv->mObjectID = object_id; move_inv->mCategoryID = category_id; move_inv->mCallback = callback; @@ -4404,7 +4437,7 @@ LLFontGL::StyleFlags LLMarketplaceFolderBridge::getLabelStyle() const // helper stuff -bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv* move_inv) +bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, boost::shared_ptr<LLMoveInv> move_inv) { LLFloaterOpenObject::LLCatAndWear* cat_and_wear = (LLFloaterOpenObject::LLCatAndWear* )move_inv->mUserData; LLViewerObject* object = gObjectList.findObject(move_inv->mObjectID); @@ -4440,7 +4473,7 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response move_inv->mCallback(option, move_inv->mUserData); } - delete move_inv; + move_inv.reset(); //since notification will persist return false; } @@ -4856,7 +4889,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, if (accept && drop) { - LLMoveInv* move_inv = new LLMoveInv; + boost::shared_ptr<LLMoveInv> move_inv (new LLMoveInv()); move_inv->mObjectID = inv_item->getParentUUID(); two_uuids_t item_pair(mUUID, inv_item->getUUID()); move_inv->mMoveList.push_back(item_pair); diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 6aaf45c35d..984c650128 100755 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -1605,7 +1605,7 @@ bool sort_alpha(const LLViewerInventoryCategory* cat1, const LLViewerInventoryCa void dump_trace(std::string& message, S32 depth, LLError::ELevel log_level) { - llinfos << "validate_marketplacelistings : error = "<< log_level << ", depth = " << depth << ", message = " << message << llendl; + LL_INFOS() << "validate_marketplacelistings : error = "<< log_level << ", depth = " << depth << ", message = " << message << LL_ENDL; } // Make all relevant business logic checks on the marketplace listings starting with the folder as argument. 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,17 +749,19 @@ void LLManipRotate::renderActiveRing( F32 radius, F32 width, const LLColor4& fro void LLManipRotate::renderSnapGuides() { + static LLCachedControl<bool> snap_enabled(gSavedSettings, "SnapEnabled", true); + if (!snap_enabled) + { + return; + } + LLVector3 grid_origin; LLVector3 grid_scale; LLQuaternion grid_rotation; - LLVector3 constraint_axis = getConstraintAxis(); - LLSelectMgr::getInstance()->getGrid(grid_origin, grid_rotation, grid_scale); + LLSelectMgr::getInstance()->getGrid(grid_origin, grid_rotation, grid_scale, true); - if (!gSavedSettings.getBOOL("SnapEnabled")) - { - return; - } + LLVector3 constraint_axis = getConstraintAxis(); LLVector3 center = gAgent.getPosAgentFromGlobal( mRotationCenter ); LLVector3 cam_at_axis; @@ -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/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 73faed7ef5..9cf3249983 100755 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -57,6 +57,7 @@ #include "llbutton.h" #include "llcheckboxctrl.h" #include "llnotifications.h" +#include "llnotificationsutil.h" #include "lllineeditor.h" #include "llfloaterwebcontent.h" #include "llwindowshade.h" @@ -428,6 +429,23 @@ BOOL LLMediaCtrl::handleKeyHere( KEY key, MASK mask ) //////////////////////////////////////////////////////////////////////////////// // +BOOL LLMediaCtrl::handleKeyUpHere(KEY key, MASK mask) +{ + BOOL result = FALSE; + + if (mMediaSource) + { + result = mMediaSource->handleKeyUpHere(key, mask); + } + + if (!result) + result = LLPanel::handleKeyUpHere(key, mask); + + return result; +} + +//////////////////////////////////////////////////////////////////////////////// +// void LLMediaCtrl::onVisibilityChange ( BOOL new_visibility ) { LL_INFOS() << "visibility changed to " << (new_visibility?"true":"false") << LL_ENDL; @@ -989,19 +1007,23 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) std::string uuid = self->getClickUUID(); LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << target << "\", uri is " << url << LL_ENDL; - LLNotification::Params notify_params; - notify_params.name = "PopupAttempt"; - notify_params.payload = LLSD().with("target", target).with("url", url).with("uuid", uuid).with("media_id", mMediaTextureID); - notify_params.functor.function = boost::bind(&LLMediaCtrl::onPopup, this, _1, _2); - - if (mTrusted) - { - LLNotifications::instance().forceResponse(notify_params, 0); - } - else - { - LLNotifications::instance().add(notify_params); - } + LLWeb::loadURL(url, target, std::string()); + + // CP: removing this code because we no longer support popups so this breaks the flow. + // replaced with a bare call to LLWeb::LoadURL(...) + //LLNotification::Params notify_params; + //notify_params.name = "PopupAttempt"; + //notify_params.payload = LLSD().with("target", target).with("url", url).with("uuid", uuid).with("media_id", mMediaTextureID); + //notify_params.functor.function = boost::bind(&LLMediaCtrl::onPopup, this, _1, _2); + + //if (mTrusted) + //{ + // LLNotifications::instance().forceResponse(notify_params, 0); + //} + //else + //{ + // LLNotifications::instance().add(notify_params); + //} break; }; @@ -1072,6 +1094,13 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) }; break; + case MEDIA_EVENT_FILE_DOWNLOAD: + { + //llinfos << "Media event - file download requested - filename is " << self->getFileDownloadFilename() << llendl; + //LLNotificationsUtil::add("MediaFileDownloadUnsupported"); + }; + break; + case MEDIA_EVENT_DEBUG_MESSAGE: { LL_INFOS("media") << self->getDebugMessageText() << LL_ENDL; @@ -1150,3 +1179,13 @@ void LLMediaCtrl::updateContextMenuParent(LLView* pNewParent) { mContextMenu->updateParent(pNewParent); } + +bool LLMediaCtrl::wantsKeyUpKeyDown() const +{ + return true; +} + +bool LLMediaCtrl::wantsReturnKey() const +{ + return true; +} diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 988733b85a..291d87073e 100755 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -151,6 +151,7 @@ public: // over-rides virtual BOOL handleKeyHere( KEY key, MASK mask); + virtual BOOL handleKeyUpHere(KEY key, MASK mask); virtual void onVisibilityChange ( BOOL new_visibility ); virtual BOOL handleUnicodeCharHere(llwchar uni_char); virtual void reshape( S32 width, S32 height, BOOL called_from_parent = TRUE); @@ -171,6 +172,10 @@ public: void updateContextMenuParent(LLView* pNewParent); + // The Browser windows want keyup and keydown events. Overridden from LLFocusableElement to return true. + virtual bool wantsKeyUpKeyDown() const; + virtual bool wantsReturnKey() const; + protected: void convertInputCoords(S32& x, S32& y); diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index d79baf90e7..3f4f2446e8 100755 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -315,6 +315,11 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags) { LLPipeline::removeMutedAVsLights(avatarp); } + //remove agent's notifications as well + if (localmute.mType == LLMute::AGENT) + { + LLNotifications::instance().cancelByOwner(localmute.mID); + } return TRUE; } } 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<LLSpinCtrl>("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/llpanelexperiences.cpp b/indra/newview/llpanelexperiences.cpp index 3ee4b5e968..37981b36a9 100644 --- a/indra/newview/llpanelexperiences.cpp +++ b/indra/newview/llpanelexperiences.cpp @@ -98,6 +98,16 @@ void LLPanelExperiences::setExperienceList( const LLSD& experiences ) mExperiencesList->sort(); } +void LLPanelExperiences::getExperienceIdsList(std::vector<LLUUID>& result) +{ + std::vector<LLSD> ids; + mExperiencesList->getValues(ids); + for (LLSD::array_const_iterator it = ids.begin(); it != ids.end(); ++it) + { + result.push_back(it->asUUID()); + } +} + LLPanelExperiences* LLPanelExperiences::create(const std::string& name) { LLPanelExperiences* panel= new LLPanelExperiences(); diff --git a/indra/newview/llpanelexperiences.h b/indra/newview/llpanelexperiences.h index 0370499583..f29fdfdecb 100644 --- a/indra/newview/llpanelexperiences.h +++ b/indra/newview/llpanelexperiences.h @@ -58,6 +58,7 @@ public: /*virtual*/ void onClosePanel(); void setExperienceList(const LLSD& experiences); + void getExperienceIdsList(std::vector<LLUUID>& result); LLExperienceItem* getSelectedExperienceItem(); void removeExperiences( const LLSD& ids ); diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index afc1a789c4..21d8b4248c 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" @@ -90,10 +91,10 @@ std::string USE_TEXTURE; LLRender::eTexIndex LLPanelFace::getTextureChannelToEdit() { LLComboBox* combobox_matmedia = getChild<LLComboBox>("combobox matmedia"); - LLComboBox* combobox_mattype = getChild<LLComboBox>("combobox mattype"); + LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("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; @@ -162,7 +163,6 @@ BOOL LLPanelFace::postBuild() LLComboBox* mComboTexGen; LLComboBox* mComboMatMedia; - LLComboBox* mComboMatType; LLCheckBoxCtrl *mCheckFullbright; @@ -283,12 +283,12 @@ BOOL LLPanelFace::postBuild() mComboMatMedia->selectNthItem(MATMEDIA_MATERIAL); } - mComboMatType = getChild<LLComboBox>("combobox mattype"); - if(mComboMatType) - { - mComboMatType->setCommitCallback(LLPanelFace::onCommitMaterialType, this); - mComboMatType->selectNthItem(MATTYPE_DIFFUSE); - } + LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type"); + if(radio_mat_type) + { + radio_mat_type->setCommitCallback(LLPanelFace::onCommitMaterialType, this); + radio_mat_type->selectNthItem(MATTYPE_DIFFUSE); + } mCtrlGlow = getChild<LLSpinCtrl>("glow"); if(mCtrlGlow) @@ -676,20 +676,21 @@ void LLPanelFace::updateUI() } getChildView("combobox matmedia")->setEnabled(editable); - LLComboBox* combobox_mattype = getChild<LLComboBox>("combobox mattype"); - if (combobox_mattype) + LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type"); + if(radio_mat_type) { - if (combobox_mattype->getCurrentIndex() < MATTYPE_DIFFUSE) - { - combobox_mattype->selectNthItem(MATTYPE_DIFFUSE); - } + if (radio_mat_type->getSelectedIndex() < MATTYPE_DIFFUSE) + { + radio_mat_type->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; } - getChildView("combobox mattype")->setEnabled(editable); + getChildView("radio_material_type")->setEnabled(editable); updateVisibility(); bool identical = true; // true because it is anded below @@ -1200,8 +1201,7 @@ void LLPanelFace::updateUI() BOOL identical_repeats = true; F32 repeats = 1.0f; - U32 material_type = (combobox_matmedia->getCurrentIndex() == MATMEDIA_MATERIAL) ? combobox_mattype->getCurrentIndex() : MATTYPE_DIFFUSE; - + U32 material_type = (combobox_matmedia->getCurrentIndex() == MATMEDIA_MATERIAL) ? radio_mat_type->getSelectedIndex() : MATTYPE_DIFFUSE; LLSelectMgr::getInstance()->setTextureChannel(LLRender::eTexIndex(material_type)); switch (material_type) @@ -1466,22 +1466,21 @@ void LLPanelFace::onCommitMaterialsMedia(LLUICtrl* ctrl, void* userdata) void LLPanelFace::updateVisibility() { LLComboBox* combo_matmedia = getChild<LLComboBox>("combobox matmedia"); - LLComboBox* combo_mattype = getChild<LLComboBox>("combobox mattype"); + LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type"); LLComboBox* combo_shininess = getChild<LLComboBox>("combobox shininess"); LLComboBox* combo_bumpiness = getChild<LLComboBox>("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("rptctrl")->setVisible(true); + getChildView("radio_material_type")->setVisible(!show_media); // Media controls getChildView("media_info")->setVisible(show_media); @@ -1608,9 +1607,9 @@ void LLPanelFace::updateShinyControls(bool is_setting_texture, bool mess_with_sh } LLComboBox* combo_matmedia = getChild<LLComboBox>("combobox matmedia"); - LLComboBox* combo_mattype = getChild<LLComboBox>("combobox mattype"); + LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("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(); @@ -1693,11 +1692,11 @@ void LLPanelFace::updateAlphaControls() mat_media = combobox_matmedia->getCurrentIndex(); } - LLComboBox* combobox_mattype = getChild<LLComboBox>("combobox mattype"); U32 mat_type = MATTYPE_DIFFUSE; - if (combobox_mattype) + LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type"); + if(radio_mat_type) { - mat_type = combobox_mattype->getCurrentIndex(); + mat_type = radio_mat_type->getSelectedIndex(); } show_alphactrls = show_alphactrls && (mat_media == MATMEDIA_MATERIAL); @@ -1985,12 +1984,11 @@ void LLPanelFace::onCommitRepeatsPerMeter(LLUICtrl* ctrl, void* userdata) LLUICtrl* repeats_ctrl = self->getChild<LLUICtrl>("rptctrl"); LLComboBox* combo_matmedia = self->getChild<LLComboBox>("combobox matmedia"); - LLComboBox* combo_mattype = self->getChild<LLComboBox>("combobox mattype"); + LLRadioGroup* radio_mat_type = self->getChild<LLRadioGroup>("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; @@ -2114,12 +2112,12 @@ void LLPanelFace::onCommitPlanarAlign(LLUICtrl* ctrl, void* userdata) void LLPanelFace::onTextureSelectionChanged(LLInventoryItem* itemp) { LL_DEBUGS("Materials") << "item asset " << itemp->getAssetUUID() << LL_ENDL; - LLComboBox* combo_mattype = getChild<LLComboBox>("combobox mattype"); - if (!combo_mattype) + LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type"); + if(radio_mat_type) { - return; + return; } - U32 mattype = combo_mattype->getCurrentIndex(); + U32 mattype = radio_mat_type->getSelectedIndex(); std::string which_control="texture control"; switch (mattype) { diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h index d7e89b4832..9823e84cd9 100755 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -307,7 +307,7 @@ private: LLMaterialMgr::getInstance()->put(object->getID(),face,*new_material); } - object->setTEMaterialParams(face, new_material, TRUE); + object->setTEMaterialParams(face, new_material); return new_material; } return NULL; diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index c8af5b6718..c4211d5508 100755 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -905,7 +905,11 @@ void LLTaskTextureBridge::openItem() LLPreviewTexture* preview = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); if(preview) { - preview->setAuxItem(findItem()); + LLInventoryItem* item = findItem(); + if(item) + { + preview->setAuxItem(item); + } preview->setObjectID(mPanel->getTaskUUID()); } } @@ -1171,7 +1175,10 @@ void LLTaskNotecardBridge::openItem() || object->permModify() || gAgent.isGodlike()) { - LLPreviewNotecard* preview = LLFloaterReg::showTypedInstance<LLPreviewNotecard>("preview_notecard", LLSD(mUUID), TAKE_FOCUS_YES); + LLSD floater_key; + floater_key["taskid"] = mPanel->getTaskUUID(); + floater_key["itemid"] = mUUID; + LLPreviewNotecard* preview = LLFloaterReg::showTypedInstance<LLPreviewNotecard>("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 496168229d..01a22df9e1 100755 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -1059,6 +1059,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 de4efc8612..73b928f014 100755 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -587,7 +587,12 @@ BOOL LLPanelPeople::postBuild() getChild<LLFilterEditor>("groups_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2)); getChild<LLFilterEditor>("recent_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2)); getChild<LLFilterEditor>("fbc_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2)); - getChild<LLTextBox>("groupcount")->setURLClickedCallback(boost::bind(&LLPanelPeople::onGroupLimitInfo, this)); + + if(gMaxAgentGroups <= BASE_MAX_AGENT_GROUPS) + { + getChild<LLTextBox>("groupcount")->setText(getString("GroupCountWithInfo")); + getChild<LLTextBox>("groupcount")->setURLClickedCallback(boost::bind(&LLPanelPeople::onGroupLimitInfo, this)); + } mTabContainer = getChild<LLTabContainer>("tabs"); mTabContainer->setCommitCallback(boost::bind(&LLPanelPeople::onTabSelected, this, _2)); 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<LLTextEditor>(XML_DESC); + text_desc->setContentTrusted(false); + return TRUE; } diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp index e62b5a4f1d..32b72fdd68 100755 --- a/indra/newview/llpanelplaceinfo.cpp +++ b/indra/newview/llpanelplaceinfo.cpp @@ -201,7 +201,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 1a665d4c1d..2fa4ee376a 100755 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -224,6 +224,8 @@ void LLPanelPlaceProfile::resetLocation() mSubdivideText->setValue(loading); mResaleText->setValue(loading); mSaleToText->setValue(loading); + + getChild<LLAccordionCtrlTab>("sales_tab")->setVisible(TRUE); } // virtual @@ -538,6 +540,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(); @@ -556,8 +559,6 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, mSaleToText->setText(getString("anyone")); } - mForSalePanel->setVisible(for_sale); - const U8* sign = (U8*)getString("price_text").c_str(); const U8* sqm = (U8*)getString("area_text").c_str(); @@ -614,6 +615,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, mYouAreHerePanel->setVisible(is_current_parcel); getChild<LLAccordionCtrlTab>("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 75e0ed3741..d86a8b4480 100755 --- a/indra/newview/llpanelwearing.cpp +++ b/indra/newview/llpanelwearing.cpp @@ -131,7 +131,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 9f88b0db5f..f100c996b3 100755 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -233,6 +233,7 @@ void LLPreviewNotecard::loadAsset() else { LLHost source_sim = LLHost::invalid; + LLSD* user_data = new LLSD(); if (mObjectUUID.notNull()) { LLViewerObject *objectp = gObjectList.findObject(mObjectUUID); @@ -251,7 +252,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(), @@ -261,7 +268,7 @@ void LLPreviewNotecard::loadAsset() item->getAssetUUID(), item->getType(), &onLoadComplete, - (void*)new LLUUID(mItemUUID), + (void*)user_data, TRUE); mAssetStatus = PREVIEW_ASSET_LOADING; } @@ -304,9 +311,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<LLPreviewNotecard>("preview_notecard", LLSD(*item_id)); + LLSD* floater_key = (LLSD*)user_data; + LLPreviewNotecard* preview = LLFloaterReg::findTypedInstance<LLPreviewNotecard>("preview_notecard", *floater_key); if( preview ) { if(0 == status) @@ -362,7 +368,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 55bcb3dc65..7620046ee3 100755 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -1210,7 +1210,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(); @@ -1235,7 +1235,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); @@ -2127,7 +2135,7 @@ void LLSelectMgr::selectionRemoveMaterial() { LL_DEBUGS("Materials") << "Removing material from object " << object->getID() << " face " << face << LL_ENDL; LLMaterialMgr::getInstance()->remove(object->getID(),face); - object->setTEMaterialParams(face, NULL, FALSE); + object->setTEMaterialParams(face, NULL); } return true; } diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 87d25e3a8c..90f7fdfe13 100755 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -527,7 +527,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 6af9d61a54..8561a89ae5 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -463,7 +463,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 5e342099d7..22944493c9 100755 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -3770,8 +3770,9 @@ public: LLVector4a *mTangent; LLDrawable* mHit; BOOL mPickTransparent; + BOOL mPickRigged; - LLOctreeIntersect(const LLVector4a& start, const LLVector4a& end, BOOL pick_transparent, + 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) : mStart(start), mEnd(end), @@ -3781,7 +3782,8 @@ public: mNormal(normal), mTangent(tangent), mHit(NULL), - mPickTransparent(pick_transparent) + mPickTransparent(pick_transparent), + mPickRigged(pick_rigged) { } @@ -3864,9 +3866,9 @@ public: if (vobj->isAvatar()) { LLVOAvatar* avatar = (LLVOAvatar*) vobj; - if (avatar->isSelf() && LLFloater::isVisible(gFloaterTools)) + if ((mPickRigged) || ((avatar->isSelf()) && (LLFloater::isVisible(gFloaterTools)))) { - LLViewerObject* hit = avatar->lineSegmentIntersectRiggedAttachments(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mTangent); + LLViewerObject* hit = avatar->lineSegmentIntersectRiggedAttachments(mStart, mEnd, -1, mPickTransparent, mPickRigged, mFaceHit, &intersection, mTexCoord, mNormal, mTangent); if (hit) { mEnd = intersection; @@ -3882,7 +3884,7 @@ public: } } - if (!skip_check && vobj->lineSegmentIntersect(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mTangent)) + if (!skip_check && vobj->lineSegmentIntersect(mStart, mEnd, -1, mPickTransparent, mPickRigged, mFaceHit, &intersection, mTexCoord, mNormal, mTangent)) { mEnd = intersection; // shorten ray so we only find CLOSER hits if (mIntersection) @@ -3900,7 +3902,8 @@ public: } LL_ALIGN_POSTFIX(16); LLDrawable* LLSpatialPartition::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, - BOOL pick_transparent, + BOOL pick_transparent, + BOOL pick_rigged, S32* face_hit, // return the face hit LLVector4a* intersection, // return the intersection point LLVector2* tex_coord, // return the texture coordinates of the intersection point @@ -3909,7 +3912,7 @@ LLDrawable* LLSpatialPartition::lineSegmentIntersect(const LLVector4a& start, co ) { - LLOctreeIntersect intersect(start, end, pick_transparent, face_hit, intersection, tex_coord, normal, tangent); + LLOctreeIntersect intersect(start, end, pick_transparent, pick_rigged, face_hit, intersection, tex_coord, normal, tangent); LLDrawable* drawable = intersect.check(mOctree); return drawable; diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 08a4d00d0f..7633e46200 100755 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -386,6 +386,7 @@ public: LLDrawable* lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, BOOL pick_transparent, + BOOL pick_rigged, 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/llstartup.cpp b/indra/newview/llstartup.cpp index 965aad517d..8a027fdbfa 100755 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -3245,12 +3245,15 @@ bool process_login_success_response() gAgentUsername = first_name; } - if(response.has("last_name") && !gAgentUsername.empty() && (gAgentUsername != "Resident")) + if(response.has("last_name") && !gAgentUsername.empty()) { std::string last_name = response["last_name"].asString(); - LLStringUtil::replaceChar(last_name, '"', ' '); - LLStringUtil::trim(last_name); - gAgentUsername = gAgentUsername + " " + last_name; + if (last_name != "Resident") + { + LLStringUtil::replaceChar(last_name, '"', ' '); + LLStringUtil::trim(last_name); + gAgentUsername = gAgentUsername + " " + last_name; + } } if(gDisplayName.empty()) 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<LLTextBox>("title"); mCloseBtn = getChild<LLButton>("close_btn"); + mTitle->setContentTrusted(false); mTitle->setValue(p.title); mCloseBtn->setClickedCallback(boost::bind(&LLSysWellItem::onClickCloseBtn,this)); diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index fab4203ec3..17b273f316 100755 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -2522,7 +2522,8 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image mFetchDebugger(NULL), mFetchSource(LLTextureFetch::FROM_ALL), mOriginFetchSource(LLTextureFetch::FROM_ALL), - mFetcherLocked(FALSE) + mFetcherLocked(FALSE), + mTextureInfoMainThread(false) { mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS"); mTextureInfo.setUpLogging(gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog"), gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"), U32Bytes(gSavedSettings.getU32("TextureLoggingThreshold"))); @@ -3128,6 +3129,7 @@ void LLTextureFetch::shutDownImageDecodeThread() // Threads: Ttf void LLTextureFetch::startThread() { + mTextureInfo.startRecording(); } // Threads: Ttf @@ -3138,6 +3140,8 @@ void LLTextureFetch::endThread() << ", ResWaits: " << mTotalResourceWaitCount << ", TotalHTTPReq: " << getTotalNumHTTPRequests() << LL_ENDL; + + mTextureInfo.stopRecording(); } // Threads: Ttf @@ -3541,8 +3545,8 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1 if (log_to_viewer_log || log_to_sim) { U64Microseconds timeNow = LLTimer::getTotalTime(); - mTextureInfo.setRequestSize(id, worker->mFileSize); - mTextureInfo.setRequestCompleteTimeAndLog(id, timeNow); + mTextureInfoMainThread.setRequestSize(id, worker->mFileSize); + mTextureInfoMainThread.setRequestCompleteTimeAndLog(id, timeNow); } } worker->unlockWorkMutex(); // -Mw diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h index 27779a31e0..a2658ecd85 100755 --- a/indra/newview/lltexturefetch.h +++ b/indra/newview/lltexturefetch.h @@ -332,6 +332,7 @@ private: F32 mTextureBandwidth; // <none> F32 mMaxBandwidth; // Mfnq LLTextureInfo mTextureInfo; + LLTextureInfo mTextureInfoMainThread; // XXX possible delete U32Bits mHTTPTextureBits; // Mfnq diff --git a/indra/newview/lltextureinfo.cpp b/indra/newview/lltextureinfo.cpp index 59d692b287..473d8ce709 100755 --- a/indra/newview/lltextureinfo.cpp +++ b/indra/newview/lltextureinfo.cpp @@ -36,14 +36,16 @@ static LLTrace::CountStatHandle<S32> sTextureDownloadsCompleted("texture_downloa static LLTrace::CountStatHandle<S32Bytes > sTextureDataDownloaded("texture_data_downloaded", "amount of texture data downloaded"); static LLTrace::CountStatHandle<U32Milliseconds > sTexureDownloadTime("texture_download_time", "amount of time spent fetching textures"); -LLTextureInfo::LLTextureInfo() : +LLTextureInfo::LLTextureInfo(bool postponeStartRecoreder) : mLogTextureDownloadsToViewerLog(false), mLogTextureDownloadsToSimulator(false), mTextureDownloadProtocol("NONE"), mTextureLogThreshold(LLUnits::Kilobytes::fromValue(100)) { - mTextures.clear(); - mRecording.start(); + if (!postponeStartRecoreder) + { + startRecording(); + } } void LLTextureInfo::setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold) @@ -78,15 +80,7 @@ U32 LLTextureInfo::getTextureInfoMapSize() bool LLTextureInfo::has(const LLUUID& id) { - std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id); - if (iterator == mTextures.end()) - { - return false; - } - else - { - return true; - } + return mTextures.end() != mTextures.find(id); } void LLTextureInfo::setRequestStartTime(const LLUUID& id, U64 startTime) @@ -192,15 +186,12 @@ void LLTextureInfo::setRequestCompleteTimeAndLog(const LLUUID& id, U64Microsecon LLSD LLTextureInfo::getAverages() { LLSD averagedTextureData; - S32 averageDownloadRate; - U32Milliseconds download_time = mRecording.getSum(sTexureDownloadTime); - if(download_time == (U32Milliseconds)0) - { - averageDownloadRate = 0; - } - else + S32 averageDownloadRate = 0; + unsigned int download_time = mRecording.getSum(sTexureDownloadTime).valueInUnits<LLUnits::Seconds>(); + + if (0 != download_time) { - averageDownloadRate = mRecording.getSum(sTextureDataDownloaded).valueInUnits<LLUnits::Bits>() / download_time.valueInUnits<LLUnits::Seconds>(); + averageDownloadRate = mRecording.getSum(sTextureDataDownloaded).valueInUnits<LLUnits::Bits>() / download_time; } averagedTextureData["bits_per_second"] = averageDownloadRate; @@ -212,6 +203,16 @@ LLSD LLTextureInfo::getAverages() return averagedTextureData; } +void LLTextureInfo::startRecording() +{ + mRecording.start(); +} + +void LLTextureInfo::stopRecording() +{ + mRecording.stop(); +} + void LLTextureInfo::resetTextureStatistics() { mRecording.restart(); diff --git a/indra/newview/lltextureinfo.h b/indra/newview/lltextureinfo.h index 176f2cbb74..03721bdd73 100755 --- a/indra/newview/lltextureinfo.h +++ b/indra/newview/lltextureinfo.h @@ -35,7 +35,7 @@ class LLTextureInfo { public: - LLTextureInfo(); + LLTextureInfo(bool postponeStartRecoreder = true); ~LLTextureInfo(); void setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold); @@ -53,6 +53,8 @@ public: void resetTextureStatistics(); U32 getTextureInfoMapSize(); LLSD getAverages(); + void startRecording(); + void stopRecording(); private: void addRequest(const LLUUID& id); diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index e22f527a65..cafe757c1a 100755 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -98,6 +98,7 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(const LLNotificationPtr& notifi LLStringUtil::format(timeStr, substitution); LLViewerTextEditor* pMessageText = getChild<LLViewerTextEditor>("message"); + pMessageText->setContentTrusted(false); pMessageText->clear(); LLStyle::Params style; diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp index 5a63f6e286..76a791c6e9 100755 --- a/indra/newview/lltoolcomp.cpp +++ b/indra/newview/lltoolcomp.cpp @@ -267,7 +267,7 @@ BOOL LLToolCompTranslate::handleHover(S32 x, S32 y, MASK mask) BOOL LLToolCompTranslate::handleMouseDown(S32 x, S32 y, MASK mask) { mMouseDown = TRUE; - gViewerWindow->pickAsync(x, y, mask, pickCallback, TRUE); + gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ TRUE); return TRUE; } diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 5c9aedcf8f..78d9c7a3f4 100755 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -861,12 +861,12 @@ void LLToolDragAndDrop::dragOrDrop3D( S32 x, S32 y, MASK mask, BOOL drop, EAccep if (mDrop) { // don't allow drag and drop onto transparent objects - pick(gViewerWindow->pickImmediate(x, y, FALSE)); + pick(gViewerWindow->pickImmediate(x, y, FALSE, FALSE)); } else { // don't allow drag and drop onto transparent objects - gViewerWindow->pickAsync(x, y, mask, pickCallback, FALSE); + gViewerWindow->pickAsync(x, y, mask, pickCallback, FALSE, FALSE); } *acceptance = mLastAccept; @@ -1013,13 +1013,10 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj, // causing a dirty inventory) and we can do an update, stall the user // while fetching the inventory. // - // Note: fetch only if inventory is both dirty and not present since previously checked faces - // could have requested new fetch for same item (removed inventory and marked as dirty=false). - // Objects without listeners (dirty==true and inventory!=NULL. In this specific case - before - // first fetch) shouldn't be updated either since we won't receive any changes. - if (hit_obj->isInventoryDirty() && hit_obj->getInventoryRoot() == NULL) + // Fetch if inventory is dirty and listener is present (otherwise we will not receive update) + if (hit_obj->isInventoryDirty() && hit_obj->hasInventoryListeners()) { - hit_obj->fetchInventoryFromServer(); + hit_obj->requestInventory(); LLSD args; args["ERROR_MESSAGE"] = "Unable to add texture.\nPlease wait a few seconds and try again."; LLNotificationsUtil::add("ErrorMessage", args); @@ -1099,10 +1096,12 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj, { hit_obj->updateInventory(new_item, TASK_INVENTORY_ITEM_KEY, true); } - // Force the object to update its refetch its inventory so it has this texture. - hit_obj->fetchInventoryFromServer(); - // TODO: Check to see if adding the item was successful; if not, then - // we should return false here. + // Force the object to update and refetch its inventory so it has this texture. + hit_obj->dirtyInventory(); + hit_obj->requestInventory(); + // TODO: Check to see if adding the item was successful; if not, then + // we should return false here. This will requre a separate listener + // since without listener, we have no way to receive update } return TRUE; } diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp index 15f3c36674..c4696c3a01 100755 --- a/indra/newview/lltoolfocus.cpp +++ b/indra/newview/lltoolfocus.cpp @@ -135,7 +135,7 @@ BOOL LLToolCamera::handleMouseDown(S32 x, S32 y, MASK mask) gViewerWindow->hideCursor(); - gViewerWindow->pickAsync(x, y, mask, pickCallback, FALSE, TRUE); + gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ FALSE, /*BOOL pick_rigged*/ FALSE, /*BOOL pick_unselectable*/ TRUE); return TRUE; } diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp index fa6694b93b..92e8af985b 100755 --- a/indra/newview/lltoolgrab.cpp +++ b/indra/newview/lltoolgrab.cpp @@ -146,7 +146,7 @@ BOOL LLToolGrab::handleMouseDown(S32 x, S32 y, MASK mask) if (!gAgent.leftButtonGrabbed()) { // can grab transparent objects (how touch event propagates, scripters rely on this) - gViewerWindow->pickAsync(x, y, mask, pickCallback, TRUE); + gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ TRUE); } mClickedInMouselook = gAgentCamera.cameraMouselook(); return TRUE; diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 2081297717..abb9a63238 100755 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -106,8 +106,8 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask) mMouseDownX = x; mMouseDownY = y; - //left mouse down always picks transparent - mPick = gViewerWindow->pickImmediate(x, y, TRUE); + //left mouse down always picks transparent (but see handleMouseUp) + mPick = gViewerWindow->pickImmediate(x, y, TRUE, FALSE); mPick.mKeyMask = mask; mMouseButtonDown = true; @@ -122,7 +122,7 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLToolPie::handleRightMouseDown(S32 x, S32 y, MASK mask) { // don't pick transparent so users can't "pay" transparent objects - mPick = gViewerWindow->pickImmediate(x, y, FALSE, TRUE); + mPick = gViewerWindow->pickImmediate(x, y, /*BOOL pick_transparent*/ FALSE, /*BOOL pick_rigged*/ TRUE, /*BOOL pick_particle*/ TRUE); mPick.mKeyMask = mask; // claim not handled so UI focus stays same @@ -546,7 +546,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); LLViewerObject *parent = NULL; LLViewerObject *object = mHoverPick.getObject(); LLSelectMgr::getInstance()->setHoverObject(object, mHoverPick.mObjectFace); @@ -592,7 +592,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); LLViewerObject* click_action_object = click_action_pick.getObject(); @@ -661,30 +661,52 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) && gAgentAvatarp && !gAgentAvatarp->isSitting() && !mBlockClickToWalk // another behavior hasn't cancelled click to walk - && !mPick.mPosGlobal.isExactlyZero() // valid coordinates for pick - && (mPick.mPickType == LLPickInfo::PICK_LAND // we clicked on land - || mPick.mObjectID.notNull())) // or on an object - { - // handle special cases of steering picks - LLViewerObject* avatar_object = mPick.getObject(); - - // get pointer to avatar - while (avatar_object && !avatar_object->isAvatar()) - { - avatar_object = (LLViewerObject*)avatar_object->getParent(); - } - - if (avatar_object && ((LLVOAvatar*)avatar_object)->isSelf()) - { - const F64 SELF_CLICK_WALK_DISTANCE = 3.0; - // pretend we picked some point a bit in front of avatar - mPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * SELF_CLICK_WALK_DISTANCE; - } - gAgentCamera.setFocusOnAvatar(TRUE, TRUE); - walkToClickedLocation(); - LLFirstUse::notMoving(false); - - return TRUE; + ) + { + // We may be doing click to walk, but we don't want to use a target on + // a transparent object because the user thought they were clicking on + // whatever they were seeing through it, so recompute what was clicked on + // ignoring transparent objects + LLPickInfo savedPick = mPick; + mPick = gViewerWindow->pickImmediate(savedPick.mMousePt.mX, savedPick.mMousePt.mY, + FALSE /* ignore transparent */, + FALSE /* ignore particles */); + + if (!mPick.mPosGlobal.isExactlyZero() // valid coordinates for pick + && (mPick.mPickType == LLPickInfo::PICK_LAND // we clicked on land + || mPick.mObjectID.notNull())) // or on an object + { + // handle special cases of steering picks + LLViewerObject* avatar_object = mPick.getObject(); + + // get pointer to avatar + while (avatar_object && !avatar_object->isAvatar()) + { + avatar_object = (LLViewerObject*)avatar_object->getParent(); + } + + if (avatar_object && ((LLVOAvatar*)avatar_object)->isSelf()) + { + const F64 SELF_CLICK_WALK_DISTANCE = 3.0; + // pretend we picked some point a bit in front of avatar + mPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * SELF_CLICK_WALK_DISTANCE; + } + gAgentCamera.setFocusOnAvatar(TRUE, TRUE); + walkToClickedLocation(); + LLFirstUse::notMoving(false); + + return TRUE; + } + else + { + LL_DEBUGS("maint5901") << "walk target was " + << (mPick.mPosGlobal.isExactlyZero() ? "zero" : "not zero") + << ", pick type was " << (mPick.mPickType == LLPickInfo::PICK_LAND ? "land" : "not land") + << ", pick object was " << mPick.mObjectID + << LL_ENDL; + // we didn't click to walk, so restore the original target + mPick = savedPick; + } } gViewerWindow->setCursor(UI_CURSOR_ARROW); if (hasMouseCapture()) @@ -716,14 +738,33 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask) LL_INFOS() << "LLToolPie handleDoubleClick (becoming mouseDown)" << LL_ENDL; } + if (handleMediaDblClick(mPick)) + { + return TRUE; + } + if (gSavedSettings.getBOOL("DoubleClickAutoPilot")) { + // We may be doing double click to walk, but we don't want to use a target on + // a transparent object because the user thought they were clicking on + // whatever they were seeing through it, so recompute what was clicked on + // ignoring transparent objects + LLPickInfo savedPick = mPick; + mPick = gViewerWindow->pickImmediate(savedPick.mMousePt.mX, savedPick.mMousePt.mY, + FALSE /* ignore transparent */, + FALSE /* ignore particles */); + if ((mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) || (mPick.mObjectID.notNull() && !mPick.mPosGlobal.isExactlyZero())) { walkToClickedLocation(); return TRUE; } + else + { + // restore the original pick for any other purpose + mPick = savedPick; + } } else if (gSavedSettings.getBOOL("DoubleClickTeleport")) { @@ -1404,56 +1445,110 @@ static void handle_click_action_play() bool LLToolPie::handleMediaClick(const LLPickInfo& pick) { - //FIXME: how do we handle object in different parcel than us? - LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); - LLPointer<LLViewerObject> objectp = pick.getObject(); - - - if (!parcel || - objectp.isNull() || - pick.mObjectFace < 0 || - pick.mObjectFace >= objectp->getNumTEs()) - { - LLViewerMediaFocus::getInstance()->clearFocus(); - - return false; - } - - // Does this face have media? - const LLTextureEntry* tep = objectp->getTE(pick.mObjectFace); - if(!tep) - return false; - - LLMediaEntry* mep = (tep->hasMedia()) ? tep->getMediaData() : NULL; - if(!mep) - return false; - - viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID()); - - if (gSavedSettings.getBOOL("MediaOnAPrimUI")) - { - if (!LLViewerMediaFocus::getInstance()->isFocusedOnFace(pick.getObject(), pick.mObjectFace) || media_impl.isNull()) - { - // It's okay to give this a null impl - LLViewerMediaFocus::getInstance()->setFocusFace(pick.getObject(), pick.mObjectFace, media_impl, pick.mNormal); - } - else - { - // Make sure keyboard focus is set to the media focus object. - gFocusMgr.setKeyboardFocus(LLViewerMediaFocus::getInstance()); - LLEditMenuHandler::gEditMenuHandler = LLViewerMediaFocus::instance().getFocusedMediaImpl(); - - media_impl->mouseDown(pick.mUVCoords, gKeyboard->currentMask(TRUE)); - mMediaMouseCaptureID = mep->getMediaID(); - setMouseCapture(TRUE); // This object will send a mouse-up to the media when it loses capture. - } - - return true; - } - - LLViewerMediaFocus::getInstance()->clearFocus(); + //FIXME: how do we handle object in different parcel than us? + LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); + LLPointer<LLViewerObject> objectp = pick.getObject(); + + + if (!parcel || + objectp.isNull() || + pick.mObjectFace < 0 || + pick.mObjectFace >= objectp->getNumTEs()) + { + LLViewerMediaFocus::getInstance()->clearFocus(); + + return false; + } + + // Does this face have media? + const LLTextureEntry* tep = objectp->getTE(pick.mObjectFace); + if (!tep) + return false; + + LLMediaEntry* mep = (tep->hasMedia()) ? tep->getMediaData() : NULL; + if (!mep) + return false; + + viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID()); + + if (gSavedSettings.getBOOL("MediaOnAPrimUI")) + { + if (!LLViewerMediaFocus::getInstance()->isFocusedOnFace(pick.getObject(), pick.mObjectFace) || media_impl.isNull()) + { + // It's okay to give this a null impl + LLViewerMediaFocus::getInstance()->setFocusFace(pick.getObject(), pick.mObjectFace, media_impl, pick.mNormal); + } + else + { + // Make sure keyboard focus is set to the media focus object. + gFocusMgr.setKeyboardFocus(LLViewerMediaFocus::getInstance()); + LLEditMenuHandler::gEditMenuHandler = LLViewerMediaFocus::instance().getFocusedMediaImpl(); + + media_impl->mouseDown(pick.mUVCoords, gKeyboard->currentMask(TRUE)); + mMediaMouseCaptureID = mep->getMediaID(); + setMouseCapture(TRUE); // This object will send a mouse-up to the media when it loses capture. + } + + return true; + } + + LLViewerMediaFocus::getInstance()->clearFocus(); + + return false; +} - return false; +bool LLToolPie::handleMediaDblClick(const LLPickInfo& pick) +{ + //FIXME: how do we handle object in different parcel than us? + LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); + LLPointer<LLViewerObject> objectp = pick.getObject(); + + + if (!parcel || + objectp.isNull() || + pick.mObjectFace < 0 || + pick.mObjectFace >= objectp->getNumTEs()) + { + LLViewerMediaFocus::getInstance()->clearFocus(); + + return false; + } + + // Does this face have media? + const LLTextureEntry* tep = objectp->getTE(pick.mObjectFace); + if (!tep) + return false; + + LLMediaEntry* mep = (tep->hasMedia()) ? tep->getMediaData() : NULL; + if (!mep) + return false; + + viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID()); + + if (gSavedSettings.getBOOL("MediaOnAPrimUI")) + { + if (!LLViewerMediaFocus::getInstance()->isFocusedOnFace(pick.getObject(), pick.mObjectFace) || media_impl.isNull()) + { + // It's okay to give this a null impl + LLViewerMediaFocus::getInstance()->setFocusFace(pick.getObject(), pick.mObjectFace, media_impl, pick.mNormal); + } + else + { + // Make sure keyboard focus is set to the media focus object. + gFocusMgr.setKeyboardFocus(LLViewerMediaFocus::getInstance()); + LLEditMenuHandler::gEditMenuHandler = LLViewerMediaFocus::instance().getFocusedMediaImpl(); + + media_impl->mouseDoubleClick(pick.mUVCoords, gKeyboard->currentMask(TRUE)); + mMediaMouseCaptureID = mep->getMediaID(); + setMouseCapture(TRUE); // This object will send a mouse-up to the media when it loses capture. + } + + return true; + } + + LLViewerMediaFocus::getInstance()->clearFocus(); + + return false; } bool LLToolPie::handleMediaHover(const LLPickInfo& pick) diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h index 68fe8bc4a5..c4a2f4a35b 100755 --- a/indra/newview/lltoolpie.h +++ b/indra/newview/lltoolpie.h @@ -88,7 +88,8 @@ private: ECursorType cursorFromObject(LLViewerObject* object); bool handleMediaClick(const LLPickInfo& info); - bool handleMediaHover(const LLPickInfo& info); + bool handleMediaDblClick(const LLPickInfo& info); + bool handleMediaHover(const LLPickInfo& info); bool handleMediaMouseUp(); BOOL handleTooltipLand(std::string line, std::string tooltip_msg); BOOL handleTooltipObject( LLViewerObject* hover_object, std::string line, std::string tooltip_msg); diff --git a/indra/newview/lltoolplacer.cpp b/indra/newview/lltoolplacer.cpp index ceb57d0172..814bade56a 100755 --- a/indra/newview/lltoolplacer.cpp +++ b/indra/newview/lltoolplacer.cpp @@ -80,7 +80,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); // Note: use the frontmost non-flora version because (a) plants usually have lots of alpha and (b) pants' Havok // representations (if any) are NOT the same as their viewer representation. diff --git a/indra/newview/lltoolselect.cpp b/indra/newview/lltoolselect.cpp index 812abe9dbd..1fcc9a0711 100755 --- a/indra/newview/lltoolselect.cpp +++ b/indra/newview/lltoolselect.cpp @@ -63,7 +63,7 @@ LLToolSelect::LLToolSelect( LLToolComposite* composite ) BOOL LLToolSelect::handleMouseDown(S32 x, S32 y, MASK mask) { // do immediate pick query - 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 c5616fb208..71dc8001d4 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)); LLTool::handleMouseDown(x, y, mask); diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index ada829eb4b..2186ed3c52 100755 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -423,7 +423,7 @@ void camera_move_backward( EKeystate s ) void camera_move_forward_sitting( EKeystate s ) { if( KEYSTATE_UP == s && gAgent.mDoubleTapRunMode != LLAgent::DOUBLETAP_FORWARD ) return; - if (gAgent.forwardGrabbed() || gAgentCamera.sitCameraEnabled() || gAgent.getRunning()) + if (gAgent.forwardGrabbed() || gAgentCamera.sitCameraEnabled() || (gAgent.getRunning() && !gAgent.getAlwaysRun())) { agent_push_forward(s); } @@ -438,7 +438,7 @@ void camera_move_backward_sitting( EKeystate s ) { if( KEYSTATE_UP == s && gAgent.mDoubleTapRunMode != LLAgent::DOUBLETAP_BACKWARD ) return; - if (gAgent.backwardGrabbed() || gAgentCamera.sitCameraEnabled() || gAgent.getRunning()) + if (gAgent.backwardGrabbed() || gAgentCamera.sitCameraEnabled() || (gAgent.getRunning() && !gAgent.getAlwaysRun())) { agent_push_backward(s); } @@ -729,7 +729,10 @@ BOOL LLViewerKeyboard::handleKey(KEY translated_key, MASK translated_mask, BOOL return mKeyHandledByUI[translated_key]; } - +BOOL LLViewerKeyboard::handleKeyUp(KEY translated_key, MASK translated_mask) +{ + return gViewerWindow->handleKeyUp(translated_key, translated_mask); +} BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name) { diff --git a/indra/newview/llviewerkeyboard.h b/indra/newview/llviewerkeyboard.h index ca73212ed1..110dc89d28 100755 --- a/indra/newview/llviewerkeyboard.h +++ b/indra/newview/llviewerkeyboard.h @@ -89,6 +89,7 @@ public: LLViewerKeyboard(); BOOL handleKey(KEY key, MASK mask, BOOL repeated); + BOOL handleKeyUp(KEY key, MASK mask); S32 loadBindings(const std::string& filename); // returns number bound, 0 on error S32 loadBindingsXML(const std::string& filename); // returns number bound, 0 on error diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 3eae0f8d86..ffae3c0e1f 100755 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -5,21 +5,21 @@ * $LicenseInfo:firstyear=2007&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -66,6 +66,7 @@ #include "llvoavatar.h" #include "llvoavatarself.h" #include "llvovolume.h" +#include "llfloaterreg.h" #include "llwebprofile.h" #include "llwindow.h" #include "llvieweraudio.h" @@ -167,7 +168,7 @@ public: { LL_ERRS() << "impl already has an outstanding responder" << LL_ENDL; } - + mMediaImpl->mMimeTypeProbe = this; } @@ -189,19 +190,19 @@ private: std::string mime_type = media_type.substr(0, idx1); LL_DEBUGS() << "status is " << getStatus() << ", media type \"" << media_type << "\"" << LL_ENDL; - + // 2xx status codes indicate success. // Most 4xx status codes are successful enough for our purposes. // 499 is the error code for host not found, timeout, etc. - // 500 means "Internal Server error" but we decided it's okay to + // 500 means "Internal Server error" but we decided it's okay to // accept this and go past it in the MIME type probe // 302 means the resource can be found temporarily in a different place - added this for join.secondlife.com // 499 is a code specifc to join.secondlife.com apparently safe to ignore // if( ((status >= 200) && (status < 300)) || -// ((status >= 400) && (status < 499)) || +// ((status >= 400) && (status < 499)) || // (status == 500) || // (status == 302) || -// (status == 499) +// (status == 499) // ) // We now no longer check the error code returned from the probe. // If we have a mime type, use it. If not, default to the web plugin and let it handle error reporting. @@ -229,7 +230,7 @@ private: // the call to initializeMedia may disconnect the responder, which will clear mMediaImpl. // Make a local copy so we can call loadURI() afterwards. LLViewerMediaImpl *impl = mMediaImpl; - + if(impl && !mInitialized && ! mime_type.empty()) { if(impl->initializeMedia(mime_type)) @@ -240,13 +241,13 @@ private: } } } - + public: void cancelRequest() { disconnectOwner(); } - + private: void disconnectOwner() { @@ -261,8 +262,8 @@ private: } mMediaImpl = NULL; } - - + + public: LLViewerMediaImpl *mMediaImpl; bool mInitialized; @@ -284,13 +285,12 @@ public: const LLChannelDescriptors& channels, const LLIOPipe::buffer_ptr_t& buffer) { - // We don't care about the content of the response, only the Set-Cookie header. - LL_DEBUGS("MediaAuth") << dumpResponse() - << " [headers:" << getResponseHeaders() << "]" << LL_ENDL; + const std::string url = getURL(); + const std::string& cookie = getResponseHeader(HTTP_IN_HEADER_SET_COOKIE); - + // *TODO: What about bad status codes? Does this destroy previous cookies? - LLViewerMedia::openIDCookieResponse(cookie); + LLViewerMedia::openIDCookieResponse(url, cookie); } }; @@ -313,7 +313,7 @@ public: const LLIOPipe::buffer_ptr_t& buffer) { // We don't care about the content of the response, only the set-cookie header. - LL_WARNS("MediaAuth") << dumpResponse() + LL_WARNS("MediaAuth") << dumpResponse() << " [headers:" << getResponseHeaders() << "]" << LL_ENDL; LLSD stripped_content = getResponseHeaders(); @@ -364,7 +364,7 @@ static void remove_media_impl(LLViewerMediaImpl* media) { LLViewerMedia::impl_list::iterator iter = sViewerMediaImplList.begin(); LLViewerMedia::impl_list::iterator end = sViewerMediaImplList.end(); - + for(; iter != end; iter++) { if(media == *iter) @@ -391,8 +391,8 @@ static bool sViewerMediaMuteListObserverInitialized = false; // static viewer_media_t LLViewerMedia::newMediaImpl( const LLUUID& texture_id, - S32 media_width, - S32 media_height, + S32 media_width, + S32 media_height, U8 media_auto_scale, U8 media_loop) { @@ -416,24 +416,24 @@ viewer_media_t LLViewerMedia::newMediaImpl( } viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const std::string& previous_url, bool update_from_self) -{ +{ // Try to find media with the same media ID viewer_media_t media_impl = getMediaImplFromTextureID(media_entry->getMediaID()); - - LL_DEBUGS() << "called, current URL is \"" << media_entry->getCurrentURL() - << "\", previous URL is \"" << previous_url + + LL_DEBUGS() << "called, current URL is \"" << media_entry->getCurrentURL() + << "\", previous URL is \"" << previous_url << "\", update_from_self is " << (update_from_self?"true":"false") << LL_ENDL; - + bool was_loaded = false; bool needs_navigate = false; - + if(media_impl) - { + { was_loaded = media_impl->hasMedia(); - + media_impl->setHomeURL(media_entry->getHomeURL()); - + media_impl->mMediaAutoScale = media_entry->getAutoScale(); media_impl->mMediaLoop = media_entry->getAutoLoop(); media_impl->mMediaWidth = media_entry->getWidthPixels(); @@ -446,7 +446,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s media_impl->mMediaSource->setLoop(media_impl->mMediaLoop); media_impl->mMediaSource->setSize(media_entry->getWidthPixels(), media_entry->getHeightPixels()); } - + bool url_changed = (media_impl->mMediaEntryURL != previous_url); if(media_impl->mMediaEntryURL.empty()) { @@ -454,7 +454,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s { // The current media URL is now empty. Unload the media source. media_impl->unload(); - + LL_DEBUGS() << "Unloading media instance (new current URL is empty)." << LL_ENDL; } } @@ -463,26 +463,26 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s // The current media URL is not empty. // If (the media was already loaded OR the media was set to autoplay) AND this update didn't come from this agent, // do a navigate. - bool auto_play = media_impl->isAutoPlayable(); + bool auto_play = media_impl->isAutoPlayable(); if((was_loaded || auto_play) && !update_from_self) { needs_navigate = url_changed; } - - LL_DEBUGS() << "was_loaded is " << (was_loaded?"true":"false") - << ", auto_play is " << (auto_play?"true":"false") + + LL_DEBUGS() << "was_loaded is " << (was_loaded?"true":"false") + << ", auto_play is " << (auto_play?"true":"false") << ", needs_navigate is " << (needs_navigate?"true":"false") << LL_ENDL; } } else { media_impl = newMediaImpl( - media_entry->getMediaID(), + media_entry->getMediaID(), media_entry->getWidthPixels(), - media_entry->getHeightPixels(), - media_entry->getAutoScale(), + media_entry->getHeightPixels(), + media_entry->getAutoScale(), media_entry->getAutoLoop()); - + media_impl->setHomeURL(media_entry->getHomeURL()); media_impl->mMediaAutoPlay = media_entry->getAutoPlay(); media_impl->mMediaEntryURL = media_entry->getCurrentURL(); @@ -491,7 +491,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s needs_navigate = true; } } - + if(media_impl) { if(needs_navigate) @@ -510,7 +510,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s LL_DEBUGS() << "updating URL in the media impl to " << media_impl->mMediaEntryURL << LL_ENDL; } } - + return media_impl; } @@ -519,7 +519,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s LLViewerMediaImpl* LLViewerMedia::getMediaImplFromTextureID(const LLUUID& texture_id) { LLViewerMediaImpl* result = NULL; - + // Look up the texture ID in the texture id->impl map. impl_id_map::iterator iter = sViewerMediaTextureIDMap.find(texture_id); if(iter != sViewerMediaTextureIDMap.end()) @@ -534,7 +534,7 @@ LLViewerMediaImpl* LLViewerMedia::getMediaImplFromTextureID(const LLUUID& textur // static std::string LLViewerMedia::getCurrentUserAgent() { - // Don't use user-visible string to avoid + // Don't use user-visible string to avoid // punctuation and strange characters. std::string skin_name = gSavedSettings.getString("SkinCurrent"); @@ -553,7 +553,7 @@ std::string LLViewerMedia::getCurrentUserAgent() codec << LLVersionInfo::getVersion(); codec << " (" << channel << "; " << skin_name << " skin)"; LL_INFOS() << codec.str() << LL_ENDL; - + return codec.str(); } @@ -562,7 +562,7 @@ std::string LLViewerMedia::getCurrentUserAgent() void LLViewerMedia::updateBrowserUserAgent() { std::string user_agent = getCurrentUserAgent(); - + impl_list::iterator iter = sViewerMediaImplList.begin(); impl_list::iterator end = sViewerMediaImplList.end(); @@ -651,7 +651,7 @@ void LLViewerMedia::muteListChanged() bool LLViewerMedia::isInterestingEnough(const LLVOVolume *object, const F64 &object_interest) { bool result = false; - + if (NULL == object) { result = false; @@ -667,13 +667,13 @@ bool LLViewerMedia::isInterestingEnough(const LLVOVolume *object, const F64 &obj { result = true; } - else + else { LL_DEBUGS() << "object interest = " << object_interest << ", lowest loadable = " << sLowestLoadableImplInterest << LL_ENDL; if(object_interest >= sLowestLoadableImplInterest) result = true; } - + return result; } @@ -780,13 +780,13 @@ static LLTrace::BlockTimerStatHandle FTM_MEDIA_MISC("Misc"); void LLViewerMedia::updateMedia(void *dummy_arg) { LL_RECORD_BLOCK_TIME(FTM_MEDIA_UPDATE); - + // Enable/disable the plugin read thread LLPluginProcessParent::setUseReadThread(gSavedSettings.getBOOL("PluginUseReadThread")); - + // HACK: we always try to keep a spare running webkit plugin around to improve launch times. createSpareBrowserMediaSource(); - + sAnyMediaShowing = false; sUpdatedCookies = getCookieStore()->getChangedCookies(); if(!sUpdatedCookies.empty()) @@ -794,7 +794,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg) LL_DEBUGS() << "updated cookies will be sent to all loaded plugins: " << LL_ENDL; LL_DEBUGS() << sUpdatedCookies << LL_ENDL; } - + impl_list::iterator iter = sViewerMediaImplList.begin(); impl_list::iterator end = sViewerMediaImplList.end(); @@ -807,14 +807,14 @@ void LLViewerMedia::updateMedia(void *dummy_arg) pimpl->calculateInterest(); } } - + // Let the spare media source actually launch if(sSpareBrowserMediaSource) { LL_RECORD_BLOCK_TIME(FTM_MEDIA_SPARE_IDLE); sSpareBrowserMediaSource->idle(); } - + { LL_RECORD_BLOCK_TIME(FTM_MEDIA_SORT); // Sort the static instance list using our interest criteria @@ -824,14 +824,14 @@ void LLViewerMedia::updateMedia(void *dummy_arg) // Go through the list again and adjust according to priority. iter = sViewerMediaImplList.begin(); end = sViewerMediaImplList.end(); - + F64 total_cpu = 0.0f; int impl_count_total = 0; int impl_count_interest_low = 0; int impl_count_interest_normal = 0; - + std::vector<LLViewerMediaImpl*> proximity_order; - + bool inworld_media_enabled = gSavedSettings.getBOOL("AudioStreamingMedia"); bool inworld_audio_enabled = gSavedSettings.getBOOL("AudioStreamingMusic"); U32 max_instances = gSavedSettings.getU32("PluginInstancesTotal"); @@ -840,19 +840,19 @@ void LLViewerMedia::updateMedia(void *dummy_arg) F32 max_cpu = gSavedSettings.getF32("PluginInstancesCPULimit"); // Setting max_cpu to 0.0 disables CPU usage checking. bool check_cpu_usage = (max_cpu != 0.0f); - + LLViewerMediaImpl* lowest_interest_loadable = NULL; - + // Notes on tweakable params: // max_instances must be set high enough to allow the various instances used in the UI (for the help browser, search, etc.) to be loaded. // If max_normal + max_low is less than max_instances, things will tend to get unloaded instead of being set to slideshow. - + { LL_RECORD_BLOCK_TIME(FTM_MEDIA_MISC); for(; iter != end; iter++) { LLViewerMediaImpl* pimpl = *iter; - + LLPluginClassMedia::EPriority new_priority = LLPluginClassMedia::PRIORITY_NORMAL; if(pimpl->isForcedUnloaded() || (impl_count_total >= (int)max_instances)) @@ -883,7 +883,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg) else { // Look at interest and CPU usage for instances that aren't in any of the above states. - + // Heuristic -- if the media texture's approximate screen area is less than 1/4 of the native area of the texture, // turn it down to low instead of normal. This may downsample for plugins that support it. bool media_is_small = false; @@ -897,7 +897,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg) { media_is_small = true; } - + if(pimpl->getInterest() == 0.0f) { // This media is completely invisible, due to being outside the view frustrum or out of range. @@ -919,11 +919,11 @@ void LLViewerMedia::updateMedia(void *dummy_arg) // The next max_low inworld get turned down new_priority = LLPluginClassMedia::PRIORITY_LOW; impl_count_interest_low++; - + // Set the low priority size for downsampling to approximately the size the texture is displayed at. { F32 approximate_interest_dimension = (F32) sqrt(pimpl->getInterest()); - + pimpl->setLowPrioritySizeLimit(ll_round(approximate_interest_dimension)); } } @@ -933,18 +933,18 @@ void LLViewerMedia::updateMedia(void *dummy_arg) new_priority = LLPluginClassMedia::PRIORITY_SLIDESHOW; } } - + if(!pimpl->getUsedInUI() && (new_priority != LLPluginClassMedia::PRIORITY_UNLOADED)) { // This is a loadable inworld impl -- the last one in the list in this class defines the lowest loadable interest. lowest_interest_loadable = pimpl; - + impl_count_total++; } // Overrides if the window is minimized or we lost focus (taking care // not to accidentally "raise" the priority either) - if (!gViewerWindow->getActive() /* viewer window minimized? */ + if (!gViewerWindow->getActive() /* viewer window minimized? */ && new_priority > LLPluginClassMedia::PRIORITY_HIDDEN) { new_priority = LLPluginClassMedia::PRIORITY_HIDDEN; @@ -954,7 +954,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg) { new_priority = LLPluginClassMedia::PRIORITY_LOW; } - + if(!inworld_media_enabled) { // If inworld media is locked out, force all inworld media to stay unloaded. @@ -972,7 +972,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg) } } pimpl->setPriority(new_priority); - + if(pimpl->getUsedInUI()) { // Any impls used in the UI should not be in the proximity list. @@ -984,7 +984,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg) } total_cpu += pimpl->getCPUUsage(); - + if (!pimpl->getUsedInUI() && pimpl->hasMedia()) { sAnyMediaShowing = true; @@ -1008,7 +1008,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg) sLowestLoadableImplInterest = object->getPixelArea(); } } - + if(gSavedSettings.getBOOL("MediaPerformanceManagerDebug")) { // Give impls the same ordering as the priority list @@ -1017,7 +1017,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg) else { LL_RECORD_BLOCK_TIME(FTM_MEDIA_SORT2); - // Use a distance-based sort for proximity values. + // Use a distance-based sort for proximity values. std::stable_sort(proximity_order.begin(), proximity_order.end(), proximity_comparitor); } @@ -1026,7 +1026,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg) { proximity_order[i]->mProximity = i; } - + LL_DEBUGS("PluginPriority") << "Total reported CPU usage is " << total_cpu << LL_ENDL; } @@ -1045,11 +1045,11 @@ void LLViewerMedia::setAllMediaEnabled(bool val) // Set "tentative" autoplay first. We need to do this here or else // re-enabling won't start up the media below. gSavedSettings.setBOOL("MediaTentativeAutoPlay", val); - - // Then + + // Then impl_list::iterator iter = sViewerMediaImplList.begin(); impl_list::iterator end = sViewerMediaImplList.end(); - + for(; iter != end; iter++) { LLViewerMediaImpl* pimpl = *iter; @@ -1058,18 +1058,18 @@ void LLViewerMedia::setAllMediaEnabled(bool val) pimpl->setDisabled(!val); } } - + // Also do Parcel Media and Parcel Audio if (val) { if (!LLViewerMedia::isParcelMediaPlaying() && LLViewerMedia::hasParcelMedia()) - { + { LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel()); } - + if (gSavedSettings.getBOOL("AudioStreamingMusic") && !LLViewerMedia::isParcelAudioPlaying() && - gAudiop && + gAudiop && LLViewerMedia::hasParcelAudio()) { if (LLAudioEngine::AUDIO_PAUSED == gAudiop->isInternetStreamPlaying()) @@ -1142,26 +1142,26 @@ void LLViewerMedia::clearAllCookies() pimpl->mMediaSource->clear_cookies(); } } - + // Clear all cookies from the cookie store getCookieStore()->setAllCookies(""); // FIXME: this may not be sufficient, since the on-disk cookie file won't get written until some browser instance exits cleanly. // It also won't clear cookies for other accounts, or for any account if we're not logged in, and won't do anything at all if there are no webkit plugins loaded. // Until such time as we can centralize cookie storage, the following hack should cover these cases: - + // HACK: Look for cookie files in all possible places and delete them. // NOTE: this assumes knowledge of what happens inside the webkit plugin (it's what adds 'browser_profile' to the path and names the cookie file) - + // Places that cookie files can be: // <getOSUserAppDir>/browser_profile/cookies // <getOSUserAppDir>/first_last/browser_profile/cookies (note that there may be any number of these!) // <getOSUserAppDir>/first_last/plugin_cookies.txt (note that there may be any number of these!) - + std::string base_dir = gDirUtilp->getOSUserAppDir() + gDirUtilp->getDirDelimiter(); std::string target; std::string filename; - + LL_DEBUGS() << "base dir = " << base_dir << LL_ENDL; // The non-logged-in version is easy @@ -1174,7 +1174,7 @@ void LLViewerMedia::clearAllCookies() { LLFile::remove(target); } - + // the hard part: iterate over all user directories and delete the cookie file from each one LLDirIterator dir_iter(base_dir, "*_*"); while (dir_iter.next(filename)) @@ -1184,26 +1184,26 @@ void LLViewerMedia::clearAllCookies() gDirUtilp->append(target, "cookies"); LL_DEBUGS() << "target = " << target << LL_ENDL; if(LLFile::isfile(target)) - { + { LLFile::remove(target); } - + // Other accounts may have new-style cookie files too -- delete them as well target = gDirUtilp->add(base_dir, filename); gDirUtilp->append(target, PLUGIN_COOKIE_FILE_NAME); LL_DEBUGS() << "target = " << target << LL_ENDL; if(LLFile::isfile(target)) - { + { LLFile::remove(target); } } - + // If we have an OpenID cookie, re-add it to the cookie store. - setOpenIDCookie(); + setOpenIDCookie(std::string()); } - + ///////////////////////////////////////////////////////////////////////////////////////// -// static +// static void LLViewerMedia::clearAllCaches() { // Clear all plugins' caches @@ -1215,9 +1215,9 @@ void LLViewerMedia::clearAllCaches() pimpl->clearCache(); } } - + ///////////////////////////////////////////////////////////////////////////////////////// -// static +// static void LLViewerMedia::setCookiesEnabled(bool enabled) { // Set the "cookies enabled" flag for all loaded plugins @@ -1232,9 +1232,9 @@ void LLViewerMedia::setCookiesEnabled(bool enabled) } } } - + ///////////////////////////////////////////////////////////////////////////////////////// -// static +// static void LLViewerMedia::setProxyConfig(bool enable, const std::string &host, int port) { // Set the proxy config for all loaded plugins @@ -1251,7 +1251,7 @@ void LLViewerMedia::setProxyConfig(bool enable, const std::string &host, int por } ///////////////////////////////////////////////////////////////////////////////////////// -// static +// static ///////////////////////////////////////////////////////////////////////////////////////// // static LLPluginCookieStore *LLViewerMedia::getCookieStore() @@ -1260,7 +1260,7 @@ LLPluginCookieStore *LLViewerMedia::getCookieStore() { sCookieStore = new LLPluginCookieStore; } - + return sCookieStore; } @@ -1276,7 +1276,7 @@ void LLViewerMedia::loadCookieFile() LL_INFOS() << "can't get path to plugin cookie file - probably not logged in yet." << LL_ENDL; return; } - + // open the file for reading llifstream file(resolved_filename.c_str()); if (!file.is_open()) @@ -1284,11 +1284,11 @@ void LLViewerMedia::loadCookieFile() LL_WARNS() << "can't load plugin cookies from file \"" << PLUGIN_COOKIE_FILE_NAME << "\"" << LL_ENDL; return; } - + getCookieStore()->readAllCookies(file, true); file.close(); - + // send the clear_cookies message to all loaded plugins impl_list::iterator iter = sViewerMediaImplList.begin(); impl_list::iterator end = sViewerMediaImplList.end(); @@ -1300,9 +1300,9 @@ void LLViewerMedia::loadCookieFile() pimpl->mMediaSource->clear_cookies(); } } - + // If we have an OpenID cookie, re-add it to the cookie store. - setOpenIDCookie(); + setOpenIDCookie(std::string()); } @@ -1337,23 +1337,23 @@ void LLViewerMedia::saveCookieFile() void LLViewerMedia::addCookie(const std::string &name, const std::string &value, const std::string &domain, const LLDate &expires, const std::string &path, bool secure) { std::stringstream cookie; - + cookie << name << "=" << LLPluginCookieStore::quoteString(value); - + if(expires.notNull()) { cookie << "; expires=" << expires.asRFC1123(); } - + cookie << "; domain=" << domain; cookie << "; path=" << path; - + if(secure) { cookie << "; secure"; } - + getCookieStore()->setCookies(cookie.str()); } @@ -1370,7 +1370,7 @@ void LLViewerMedia::addSessionCookie(const std::string &name, const std::string void LLViewerMedia::removeCookie(const std::string &name, const std::string &domain, const std::string &path ) { // To remove a cookie, add one with the same name, domain, and path that expires in the past. - + addCookie(name, "", domain, LLDate(LLDate::now().secondsSinceEpoch() - 1.0), path); } @@ -1388,9 +1388,34 @@ LLSD LLViewerMedia::getHeaders() return headers; } + ///////////////////////////////////////////////////////////////////////////////////////// + // static +bool LLViewerMedia::parseRawCookie(const std::string raw_cookie, std::string& name, std::string& value, std::string& path, bool& httponly, bool& secure) +{ + std::size_t name_pos = raw_cookie.find_first_of("="); + if (name_pos != std::string::npos) + { + name = raw_cookie.substr(0, name_pos); + std::size_t value_pos = raw_cookie.find_first_of(";", name_pos); + if (value_pos != std::string::npos) + { + value = raw_cookie.substr(name_pos + 1, value_pos - name_pos - 1); + path = "/"; // assume root path for now + + httponly = true; // hard coded for now + secure = true; + + return true; + } + } + + return false; +} + + ///////////////////////////////////////////////////////////////////////////////////////// // static -void LLViewerMedia::setOpenIDCookie() +void LLViewerMedia::setOpenIDCookie(const std::string& url) { if(!sOpenIDCookie.empty()) { @@ -1398,7 +1423,7 @@ void LLViewerMedia::setOpenIDCookie() // We want just the hostname for the cookie code, but LLURL doesn't seem to have a way to extract that. // We therefore do it here. std::string authority = sOpenIDURL.mAuthority; - std::string::size_type host_start = authority.find('@'); + std::string::size_type host_start = authority.find('@'); if(host_start == std::string::npos) { // no username/password @@ -1406,20 +1431,43 @@ void LLViewerMedia::setOpenIDCookie() } else { - // Hostname starts after the @. + // Hostname starts after the @. // (If the hostname part is empty, this may put host_start at the end of the string. In that case, it will end up passing through an empty hostname, which is correct.) ++host_start; } - std::string::size_type host_end = authority.rfind(':'); + std::string::size_type host_end = authority.rfind(':'); if((host_end == std::string::npos) || (host_end < host_start)) { // no port host_end = authority.size(); } - + getCookieStore()->setCookiesFromHost(sOpenIDCookie, authority.substr(host_start, host_end - host_start)); - // Do a web profile get so we can store the cookie + if (url.length()) + { + LLMediaCtrl* media_instance = LLFloaterReg::getInstance("destinations")->getChild<LLMediaCtrl>("destination_guide_contents"); + if (media_instance) + { + std::string cookie_host = authority.substr(host_start, host_end - host_start); + std::string cookie_name = ""; + std::string cookie_value = ""; + std::string cookie_path = ""; + bool httponly = true; + bool secure = true; + if (parseRawCookie(sOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure) && + media_instance->getMediaPlugin()) + { + media_instance->getMediaPlugin()->setCookie(url, cookie_name, cookie_value, cookie_host, cookie_path, httponly, secure); + } + } + } + + // NOTE: this is the original OpenID cookie code, so of which is no longer needed now that we + // are using CEF - it's very intertwined with other code so, for the moment, I'm going to + // leave it alone and make a task to come back to it once we're sure the CEF cookie code is robust. + + // Do a web profile get so we can store the cookie LLSD headers = LLSD::emptyMap(); headers[HTTP_OUT_HEADER_ACCEPT] = "*/*"; headers[HTTP_OUT_HEADER_COOKIE] = sOpenIDCookie; @@ -1430,7 +1478,7 @@ void LLViewerMedia::setOpenIDCookie() LL_DEBUGS("MediaAuth") << "Requesting " << profile_url << LL_ENDL; LL_DEBUGS("MediaAuth") << "sOpenIDCookie = [" << sOpenIDCookie << "]" << LL_ENDL; - LLHTTPClient::get(profile_url, + LLHTTPClient::get(profile_url, new LLViewerMediaWebProfileResponder(raw_profile_url.getAuthority()), headers); } @@ -1442,12 +1490,12 @@ void LLViewerMedia::openIDSetup(const std::string &openid_url, const std::string { LL_DEBUGS("MediaAuth") << "url = \"" << openid_url << "\", token = \"" << openid_token << "\"" << LL_ENDL; - // post the token to the url + // post the token to the url // the responder will need to extract the cookie(s). // Save the OpenID URL for later -- we may need the host when adding the cookie. sOpenIDURL.init(openid_url.c_str()); - + // We shouldn't ever do this twice, but just in case this code gets repurposed later, clear existing cookies. sOpenIDCookie.clear(); @@ -1462,24 +1510,24 @@ void LLViewerMedia::openIDSetup(const std::string &openid_url, const std::string U8 *data = new U8[size]; memcpy(data, openid_token.data(), size); - LLHTTPClient::postRaw( - openid_url, - data, - size, + LLHTTPClient::postRaw( + openid_url, + data, + size, new LLViewerMediaOpenIDResponder(), headers); - + } ///////////////////////////////////////////////////////////////////////////////////////// // static -void LLViewerMedia::openIDCookieResponse(const std::string &cookie) +void LLViewerMedia::openIDCookieResponse(const std::string& url, const std::string &cookie) { LL_DEBUGS("MediaAuth") << "Cookie received: \"" << cookie << "\"" << LL_ENDL; - + sOpenIDCookie += cookie; - setOpenIDCookie(); + setOpenIDCookie(url); } ///////////////////////////////////////////////////////////////////////////////////////// @@ -1488,7 +1536,7 @@ void LLViewerMedia::proxyWindowOpened(const std::string &target, const std::stri { if(uuid.empty()) return; - + for (impl_list::iterator iter = sViewerMediaImplList.begin(); iter != sViewerMediaImplList.end(); iter++) { if((*iter)->mMediaSource && (*iter)->mMediaSource->pluginSupportsMediaBrowser()) @@ -1525,7 +1573,7 @@ void LLViewerMedia::createSpareBrowserMediaSource() if (!sSpareBrowserMediaSource && !gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins")) { // The null owner will keep the browser plugin from fully initializing - // (specifically, it keeps LLPluginClassMedia from negotiating a size change, + // (specifically, it keeps LLPluginClassMedia from negotiating a size change, // which keeps MediaPluginWebkit::initBrowserWindow from doing anything until we have some necessary data, like the background color) sSpareBrowserMediaSource = LLViewerMediaImpl::newSourceFromMediaType(HTTP_CONTENT_TEXT_HTML, NULL, 0, 0); } @@ -1537,7 +1585,7 @@ LLPluginClassMedia* LLViewerMedia::getSpareBrowserMediaSource() { LLPluginClassMedia* result = sSpareBrowserMediaSource; sSpareBrowserMediaSource = NULL; - return result; + return result; }; bool LLViewerMedia::hasInWorldMedia() @@ -1626,12 +1674,12 @@ void LLViewerMedia::setOnlyAudibleMediaTextureID(const LLUUID& texture_id) ////////////////////////////////////////////////////////////////////////////////////////// // LLViewerMediaImpl ////////////////////////////////////////////////////////////////////////////////////////// -LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id, - S32 media_width, - S32 media_height, - U8 media_auto_scale, +LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id, + S32 media_width, + S32 media_height, + U8 media_auto_scale, U8 media_loop) -: +: mMediaSource( NULL ), mMovieImageHasMips(false), mMediaWidth(media_width), @@ -1672,7 +1720,7 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id, mTrustedBrowser(false), mZoomFactor(1.0), mCleanBrowser(false) -{ +{ // Set up the mute list observer if it hasn't been set up already. if(!sViewerMediaMuteListObserverInitialized) @@ -1680,11 +1728,11 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id, LLMuteList::getInstance()->addObserver(&sViewerMediaMuteListObserver); sViewerMediaMuteListObserverInitialized = true; } - + add_media_impl(this); setTextureID(texture_id); - + // connect this media_impl to the media texture, creating it if it doesn't exist.0 // This is necessary because we need to be able to use getMaxVirtualSize() even if the media plugin is not loaded. LLViewerMediaTexture* media_tex = LLViewerTextureManager::getMediaTexture(mTextureId); @@ -1699,7 +1747,7 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id, LLViewerMediaImpl::~LLViewerMediaImpl() { destroyMediaSource(); - + LLViewerMediaTexture::removeMediaImplFromTexture(mTextureId) ; setTextureID(); @@ -1711,7 +1759,7 @@ void LLViewerMediaImpl::emitEvent(LLPluginClassMedia* plugin, LLViewerMediaObser { // Broadcast to observers using the superclass version LLViewerMediaEventEmitter::emitEvent(plugin, event); - + // If this media is on one or more LLVOVolume objects, tell them about the event as well. std::list< LLVOVolume* >::iterator iter = mObjectList.begin() ; while(iter != mObjectList.end()) @@ -1727,7 +1775,7 @@ bool LLViewerMediaImpl::initializeMedia(const std::string& mime_type) { bool mimeTypeChanged = (mMimeType != mime_type); bool pluginChanged = (LLMIMETypes::implType(mCurrentMimeType) != LLMIMETypes::implType(mime_type)); - + if(!mMediaSource || pluginChanged) { // We don't have a plugin at all, or the new mime type is handled by a different plugin than the old mime type. @@ -1750,7 +1798,7 @@ void LLViewerMediaImpl::createMediaSource() // This media shouldn't be created yet. return; } - + if(! mMediaURL.empty()) { navigateInternal(); @@ -1776,15 +1824,15 @@ void LLViewerMediaImpl::destroyMediaSource() { oldImage->setPlaying(FALSE) ; } - + cancelMimeTypeProbe(); - + if(mMediaSource) { mMediaSource->setDeleteOK(true) ; delete mMediaSource; mMediaSource = NULL; - } + } } ////////////////////////////////////////////////////////////////////////////////////////// @@ -1799,11 +1847,11 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ { std::string plugin_basename = LLMIMETypes::implType(media_type); LLPluginClassMedia* media_source = NULL; - + // HACK: we always try to keep a spare running webkit plugin around to improve launch times. // If a spare was already created before PluginAttachDebuggerToPlugins was set, don't use it. // Do not use a spare if launching with full viewer control (e.g. Facebook, Twitter and few others) - if ((plugin_basename == "media_plugin_webkit") && + if ((plugin_basename == "media_plugin_cef") && !gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins") && !clean_browser) { media_source = LLViewerMedia::getSpareBrowserMediaSource(); @@ -1812,7 +1860,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ media_source->setOwner(owner); media_source->setTarget(target); media_source->setSize(default_width, default_height); - + return media_source; } } @@ -1824,8 +1872,12 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ { std::string launcher_name = gDirUtilp->getLLPluginLauncher(); std::string plugin_name = gDirUtilp->getLLPluginFilename(plugin_basename); - std::string user_data_path = gDirUtilp->getOSUserAppDir(); - user_data_path += gDirUtilp->getDirDelimiter(); + + std::string user_data_path_cache = gDirUtilp->getCacheDir(false); + user_data_path_cache += gDirUtilp->getDirDelimiter(); + + std::string user_data_path_cookies = gDirUtilp->getOSUserAppDir(); + user_data_path_cookies += gDirUtilp->getDirDelimiter(); // Fix for EXT-5960 - make browser profile specific to user (cache, cookies etc.) // If the linden username returned is blank, that can only mean we are @@ -1836,8 +1888,8 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ if ( ! linden_user_dir.empty() ) { // gDirUtilp->getLindenUserDir() is whole path, not just Linden name - user_data_path = linden_user_dir; - user_data_path += gDirUtilp->getDirDelimiter(); + user_data_path_cookies = linden_user_dir; + user_data_path_cookies += gDirUtilp->getDirDelimiter(); }; // See if the plugin executable exists @@ -1854,7 +1906,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ { media_source = new LLPluginClassMedia(owner); media_source->setSize(default_width, default_height); - media_source->setUserDataPath(user_data_path); + media_source->setUserDataPath(user_data_path_cache, user_data_path_cookies); media_source->setLanguageCode(LLUI::getLanguage()); // collect 'cookies enabled' setting from prefs and send to embedded browser @@ -1868,12 +1920,15 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ // collect 'javascript enabled' setting from prefs and send to embedded browser bool javascript_enabled = gSavedSettings.getBOOL( "BrowserJavascriptEnabled" ); media_source->setJavascriptEnabled( javascript_enabled || clean_browser); - + bool media_plugin_debugging_enabled = gSavedSettings.getBOOL("MediaPluginDebugging"); media_source->enableMediaPluginDebugging( media_plugin_debugging_enabled || clean_browser); + // need to set agent string here before instance created + media_source->setBrowserUserAgent(LLViewerMedia::getCurrentUserAgent()); + media_source->setTarget(target); - + const std::string plugin_dir = gDirUtilp->getLLPluginDir(); if (media_source->init(launcher_name, plugin_dir, plugin_name, gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins"))) { @@ -1886,14 +1941,14 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ } } } - + LL_WARNS_ONCE("Plugin") << "plugin initialization failed for mime type: " << media_type << LL_ENDL; LLSD args; args["MIME_TYPE"] = media_type; LLNotificationsUtil::add("NoPlugin", args); return NULL; -} +} ////////////////////////////////////////////////////////////////////////////////////////// bool LLViewerMediaImpl::initializePlugin(const std::string& media_type) @@ -1904,10 +1959,10 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type) mMediaWidth = mMediaSource->getSetWidth(); mMediaHeight = mMediaSource->getSetHeight(); } - + // Always delete the old media impl first. destroyMediaSource(); - + // and unconditionally set the mime type mMimeType = media_type; @@ -1915,7 +1970,7 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type) { // This impl should not be loaded at this time. LL_DEBUGS("PluginPriority") << this << "Not loading (PRIORITY_UNLOADED)" << LL_ENDL; - + return false; } @@ -1926,7 +1981,7 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type) mCurrentMimeType = mMimeType; LLPluginClassMedia* media_source = newSourceFromMediaType(mMimeType, this, mMediaWidth, mMediaHeight, mTarget, mCleanBrowser); - + if (media_source) { media_source->setDisableTimeout(gSavedSettings.getBOOL("DebugPluginDisableTimeout")); @@ -1935,7 +1990,7 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type) media_source->setBrowserUserAgent(LLViewerMedia::getCurrentUserAgent()); media_source->focus(mHasFocus); media_source->setBackgroundColor(mBackgroundColor); - + if(gSavedSettings.getBOOL("BrowserIgnoreSSLCertErrors")) { media_source->ignore_ssl_cert_errors(true); @@ -1943,19 +1998,19 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type) // the correct way to deal with certs it to load ours from CA.pem and append them to the ones // Qt/WebKit loads from your system location. - // Note: This needs the new CA.pem file with the Equifax Secure Certificate Authority + // Note: This needs the new CA.pem file with the Equifax Secure Certificate Authority // cert at the bottom: (MIIDIDCCAomgAwIBAgIENd70zzANBg) std::string ca_path = gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "CA.pem" ); media_source->addCertificateFilePath( ca_path ); media_source->proxy_setup(gSavedSettings.getBOOL("BrowserProxyEnabled"), gSavedSettings.getString("BrowserProxyAddress"), gSavedSettings.getS32("BrowserProxyPort")); - + if(mClearCache) { mClearCache = false; media_source->clear_cache(); } - + // TODO: Only send cookies to plugins that need them // Ideally, the plugin should tell us whether it handles cookies or not -- either via the init response or through a separate message. // Due to the ordering of messages, it's possible we wouldn't get that information back in time to send cookies before sending a navigate message, @@ -1966,7 +2021,7 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type) { media_source->set_cookies(all_cookies); } - + mMediaSource = media_source; mMediaSource->setDeleteOK(false) ; updateVolume(); @@ -2009,16 +2064,16 @@ void LLViewerMediaImpl::loadURI() std::string sanitized_uri = (u.query().empty() ? uri : u.scheme() + "://" + u.authority() + u.path()); LL_INFOS() << "Asking media source to load URI: " << sanitized_uri << LL_ENDL; } - + mMediaSource->loadURI( uri ); - - // A non-zero mPreviousMediaTime means that either this media was previously unloaded by the priority code while playing/paused, + + // A non-zero mPreviousMediaTime means that either this media was previously unloaded by the priority code while playing/paused, // or a seek happened before the media loaded. In either case, seek to the saved time. if(mPreviousMediaTime != 0.0f) { seek(mPreviousMediaTime); } - + if(mPreviousMediaState == MEDIA_PLAYING) { // This media was playing before this instance was unloaded. @@ -2071,11 +2126,11 @@ void LLViewerMediaImpl::play() // This may be the case where the plugin's priority is PRIORITY_UNLOADED return; } - + // Only do this if the media source was just loaded. loadURI(); } - + // always start the media start(); } @@ -2176,10 +2231,10 @@ void LLViewerMediaImpl::updateVolume() { if(mMediaSource) { - // always scale the volume by the global media volume + // always scale the volume by the global media volume F32 volume = mRequestedVolume * LLViewerMedia::getVolume(); - if (mProximityCamera > 0) + if (mProximityCamera > 0) { if (mProximityCamera > gSavedSettings.getF32("MediaRollOffMax")) { @@ -2218,7 +2273,7 @@ F32 LLViewerMediaImpl::getVolume() void LLViewerMediaImpl::focus(bool focus) { mHasFocus = focus; - + if (mMediaSource) { // call focus just for the hell of it, even though this apopears to be a nop @@ -2246,7 +2301,7 @@ std::string LLViewerMediaImpl::getCurrentMediaURL() { return mCurrentMediaURL; } - + return mMediaURL; } @@ -2314,17 +2369,17 @@ void LLViewerMediaImpl::mouseMove(S32 x, S32 y, MASK mask) } ////////////////////////////////////////////////////////////////////////////////////////// -//static +//static void LLViewerMediaImpl::scaleTextureCoords(const LLVector2& texture_coords, S32 *x, S32 *y) { F32 texture_x = texture_coords.mV[VX]; F32 texture_y = texture_coords.mV[VY]; - + // Deal with repeating textures by wrapping the coordinates into the range [0, 1.0) texture_x = fmodf(texture_x, 1.0f); if(texture_x < 0.0f) texture_x = 1.0 + texture_x; - + texture_y = fmodf(texture_y, 1.0f); if(texture_y < 0.0f) texture_y = 1.0 + texture_y; @@ -2352,7 +2407,7 @@ void LLViewerMediaImpl::mouseDown(const LLVector2& texture_coords, MASK mask, S3 void LLViewerMediaImpl::mouseUp(const LLVector2& texture_coords, MASK mask, S32 button) { if(mMediaSource) - { + { S32 x, y; scaleTextureCoords(texture_coords, &x, &y); @@ -2363,7 +2418,7 @@ void LLViewerMediaImpl::mouseUp(const LLVector2& texture_coords, MASK mask, S32 void LLViewerMediaImpl::mouseMove(const LLVector2& texture_coords, MASK mask) { if(mMediaSource) - { + { S32 x, y; scaleTextureCoords(texture_coords, &x, &y); @@ -2371,6 +2426,17 @@ void LLViewerMediaImpl::mouseMove(const LLVector2& texture_coords, MASK mask) } } +void LLViewerMediaImpl::mouseDoubleClick(const LLVector2& texture_coords, MASK mask) +{ + if (mMediaSource) + { + S32 x, y; + scaleTextureCoords(texture_coords, &x, &y); + + mouseDoubleClick(x, y, mask); + } +} + ////////////////////////////////////////////////////////////////////////////////////////// void LLViewerMediaImpl::mouseDoubleClick(S32 x, S32 y, MASK mask, S32 button) { @@ -2405,18 +2471,18 @@ void LLViewerMediaImpl::onMouseCaptureLost() } ////////////////////////////////////////////////////////////////////////////////////////// -BOOL LLViewerMediaImpl::handleMouseUp(S32 x, S32 y, MASK mask) -{ +BOOL LLViewerMediaImpl::handleMouseUp(S32 x, S32 y, MASK mask) +{ // NOTE: this is called when the mouse is released when we have capture. // Due to the way mouse coordinates are mapped to the object, we can't use the x and y coordinates that come in with the event. - + if(hasMouseCapture()) { // Release the mouse -- this will also send a mouseup to the media gFocusMgr.setMouseCapture( FALSE ); } - return TRUE; + return TRUE; } ////////////////////////////////////////////////////////////////////////////////////////// @@ -2492,14 +2558,14 @@ void LLViewerMediaImpl::updateJavascriptObject() } ////////////////////////////////////////////////////////////////////////////////////////// -const std::string& LLViewerMediaImpl::getName() const -{ +const std::string& LLViewerMediaImpl::getName() const +{ if (mMediaSource) { return mMediaSource->getMediaName(); } - - return LLStringUtil::null; + + return LLStringUtil::null; }; ////////////////////////////////////////////////////////////////////////////////////////// @@ -2555,21 +2621,21 @@ void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mi // Don't carry media play state across distinct URLs. resetPreviousMediaState(); } - + // Always set the current URL and MIME type. mMediaURL = url; mMimeType = mime_type; mCleanBrowser = clean_browser; - + // Clear the current media URL, since it will no longer be correct. mCurrentMediaURL.clear(); - + // if mime type discovery was requested, we'll need to do it when the media loads mNavigateRediscoverType = rediscover_type; - + // and if this was a server request, the navigate on load will also need to be one. mNavigateServerRequest = server_request; - + // An explicit navigate resets the "failed" flag. mMediaSourceFailed = false; @@ -2585,7 +2651,7 @@ void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mi // This impl should not be loaded at this time. LL_DEBUGS("PluginPriority") << this << "Not loading (PRIORITY_UNLOADED)" << LL_ENDL; - + return; } @@ -2609,13 +2675,13 @@ void LLViewerMediaImpl::navigateInternal() mNavigateSuspendedDeferred = true; return; } - + if(mMimeTypeProbe != NULL) { LL_WARNS() << "MIME type probe already in progress -- bailing out." << LL_ENDL; return; } - + if(mNavigateServerRequest) { setNavState(MEDIANAVSTATE_SERVER_SENT); @@ -2624,12 +2690,12 @@ void LLViewerMediaImpl::navigateInternal() { setNavState(MEDIANAVSTATE_NONE); } - + // If the caller has specified a non-empty MIME type, look that up in our MIME types list. // If we have a plugin for that MIME type, use that instead of attempting auto-discovery. // This helps in supporting legacy media content where the server the media resides on returns a bogus MIME type // but the parcel owner has correctly set the MIME type in the parcel media settings. - + if(!mMimeType.empty() && (mMimeType != LLMIMETypes::getDefaultMimeType())) { std::string plugin_basename = LLMIMETypes::implType(mMimeType); @@ -2698,27 +2764,47 @@ void LLViewerMediaImpl::navigateStop() bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask) { bool result = false; - + + if (mMediaSource) + { + // FIXME: THIS IS SO WRONG. + // Menu keys should be handled by the menu system and not passed to UI elements, but this is how LLTextEditor and LLLineEditor do it... + if (MASK_CONTROL & mask && key != KEY_LEFT && key != KEY_RIGHT && key != KEY_HOME && key != KEY_END) + { + result = true; + } + + if (!result) + { + LLSD native_key_data = gViewerWindow->getWindow()->getNativeKeyData(); + result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN, key, mask, native_key_data); + } + } + + return result; +} + +////////////////////////////////////////////////////////////////////////////////////////// +bool LLViewerMediaImpl::handleKeyUpHere(KEY key, MASK mask) +{ + bool result = false; + if (mMediaSource) { // FIXME: THIS IS SO WRONG. // Menu keys should be handled by the menu system and not passed to UI elements, but this is how LLTextEditor and LLLineEditor do it... - if( MASK_CONTROL & mask && key != KEY_LEFT && key != KEY_RIGHT && key != KEY_HOME && key != KEY_END) + if (MASK_CONTROL & mask && key != KEY_LEFT && key != KEY_RIGHT && key != KEY_HOME && key != KEY_END) { result = true; } - - if(!result) + + if (!result) { - LLSD native_key_data = gViewerWindow->getWindow()->getNativeKeyData(); - - result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN ,key, mask, native_key_data); - // Since the viewer internal event dispatching doesn't give us key-up events, simulate one here. - (void)mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_UP ,key, mask, native_key_data); + result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_UP, key, mask, native_key_data); } } - + return result; } @@ -2726,7 +2812,7 @@ bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask) bool LLViewerMediaImpl::handleUnicodeCharHere(llwchar uni_char) { bool result = false; - + if (mMediaSource) { // only accept 'printable' characters, sigh... @@ -2734,11 +2820,11 @@ bool LLViewerMediaImpl::handleUnicodeCharHere(llwchar uni_char) && uni_char != 127) // SDL thinks this is 'delete' - yuck. { LLSD native_key_data = gViewerWindow->getWindow()->getNativeKeyData(); - + mMediaSource->textInput(wstring_to_utf8str(LLWString(1, uni_char)), gKeyboard->currentMask(FALSE), native_key_data); } } - + return result; } @@ -2817,15 +2903,15 @@ void LLViewerMediaImpl::update() } } - + if(mMediaSource == NULL) { return; } - + // Make sure a navigate doesn't happen during the idle -- it can cause mMediaSource to get destroyed, which can cause a crash. setNavigateSuspended(true); - + mMediaSource->idle(); setNavigateSuspended(false); @@ -2834,7 +2920,7 @@ void LLViewerMediaImpl::update() { return; } - + if(mMediaSource->isPluginExited()) { resetPreviousMediaState(); @@ -2846,18 +2932,18 @@ void LLViewerMediaImpl::update() { return; } - + if(mSuspendUpdates || !mVisible) { return; } - + LLViewerMediaTexture* placeholder_image = updatePlaceholderImage(); - + if(placeholder_image) { LLRect dirty_rect; - + // Since we're updating this texture, we know it's playing. Tell the texture to do its replacement magic so it gets rendered. placeholder_image->setPlaying(TRUE); @@ -2868,7 +2954,7 @@ void LLViewerMediaImpl::update() S32 y_pos = llmax(dirty_rect.mBottom, 0); S32 width = llmin(dirty_rect.mRight, placeholder_image->getWidth()) - x_pos; S32 height = llmin(dirty_rect.mTop, placeholder_image->getHeight()) - y_pos; - + if(width > 0 && height > 0) { @@ -2881,21 +2967,21 @@ void LLViewerMediaImpl::update() // Offset the pixels pointer to match x_pos and y_pos data += ( x_pos * mMediaSource->getTextureDepth() * mMediaSource->getBitsWidth() ); data += ( y_pos * mMediaSource->getTextureDepth() ); - + { LL_RECORD_BLOCK_TIME(FTM_MEDIA_SET_SUBIMAGE); placeholder_image->setSubImage( - data, - mMediaSource->getBitsWidth(), + data, + mMediaSource->getBitsWidth(), mMediaSource->getBitsHeight(), - x_pos, - y_pos, - width, + x_pos, + y_pos, + width, height); } } - + mMediaSource->resetDirty(); } } @@ -2916,10 +3002,10 @@ LLViewerMediaTexture* LLViewerMediaImpl::updatePlaceholderImage() // The code that created this instance will read from the plugin's bits. return NULL; } - + LLViewerMediaTexture* placeholder_image = LLViewerTextureManager::getMediaTexture( mTextureId ); - - if (mNeedsNewTexture + + if (mNeedsNewTexture || placeholder_image->getUseMipMaps() || (placeholder_image->getWidth() != mMediaSource->getTextureWidth()) || (placeholder_image->getHeight() != mMediaSource->getTextureHeight()) @@ -2933,7 +3019,7 @@ LLViewerMediaTexture* LLViewerMediaImpl::updatePlaceholderImage() int texture_width = mMediaSource->getTextureWidth(); int texture_height = mMediaSource->getTextureHeight(); int texture_depth = mMediaSource->getTextureDepth(); - + // MEDIAOPT: check to see if size actually changed before doing work placeholder_image->destroyGLTexture(); // MEDIAOPT: apparently just calling setUseMipMaps(FALSE) doesn't work? @@ -2959,13 +3045,13 @@ LLViewerMediaTexture* LLViewerMediaImpl::updatePlaceholderImage() // FIXME // placeholder_image->mIsMediaTexture = true; mNeedsNewTexture = false; - - // If the amount of the texture being drawn by the media goes down in either width or height, + + // If the amount of the texture being drawn by the media goes down in either width or height, // recreate the texture to avoid leaving parts of the old image behind. mTextureUsedWidth = mMediaSource->getWidth(); mTextureUsedHeight = mMediaSource->getHeight(); } - + return placeholder_image; } @@ -2980,14 +3066,14 @@ LLUUID LLViewerMediaImpl::getMediaTextureID() const void LLViewerMediaImpl::setVisible(bool visible) { mVisible = visible; - + if(mVisible) { if(mMediaSource && mMediaSource->isPluginExited()) { destroyMediaSource(); } - + if(!mMediaSource) { createMediaSource(); @@ -3021,12 +3107,12 @@ void LLViewerMediaImpl::scaleMouse(S32 *mouse_x, S32 *mouse_y) bool LLViewerMediaImpl::isMediaTimeBased() { bool result = false; - + if(mMediaSource) { result = mMediaSource->pluginSupportsMediaTime(); } - + return result; } @@ -3034,14 +3120,14 @@ bool LLViewerMediaImpl::isMediaTimeBased() bool LLViewerMediaImpl::isMediaPlaying() { bool result = false; - + if(mMediaSource) { EMediaStatus status = mMediaSource->getStatus(); if(status == MEDIA_PLAYING || status == MEDIA_LOADING) result = true; } - + return result; } ////////////////////////////////////////////////////////////////////////////////////////// @@ -3054,7 +3140,7 @@ bool LLViewerMediaImpl::isMediaPaused() if(mMediaSource->getStatus() == MEDIA_PAUSED) result = true; } - + return result; } @@ -3082,7 +3168,7 @@ void LLViewerMediaImpl::setDisabled(bool disabled, bool forcePlayOnEnable) { // Only do this on actual state transitions. mIsDisabled = disabled; - + if(mIsDisabled) { // We just disabled this media. Clear all state. @@ -3108,13 +3194,13 @@ bool LLViewerMediaImpl::isForcedUnloaded() const { return true; } - + // If this media's class is not supposed to be shown, unload if (!shouldShowBasedOnClass()) { return true; } - + return false; } @@ -3127,19 +3213,19 @@ bool LLViewerMediaImpl::isPlayable() const // All of the forced-unloaded criteria also imply not playable. return false; } - + if(hasMedia()) { // Anything that's already playing is, by definition, playable. return true; } - + if(!mMediaURL.empty()) { // If something has navigated the instance, it's ready to be played. return true; } - + return false; } @@ -3151,7 +3237,7 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla { case MEDIA_EVENT_CLICK_LINK_NOFOLLOW: { - LL_DEBUGS("Media") << "MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is: " << plugin->getClickURL() << LL_ENDL; + LL_DEBUGS("Media") << "MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is: " << plugin->getClickURL() << LL_ENDL; std::string url = plugin->getClickURL(); std::string nav_type = plugin->getClickNavType(); LLURLDispatcher::dispatch(url, nav_type, NULL, mTrustedBrowser); @@ -3170,7 +3256,7 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla // Reset the last known state of the media to defaults. resetPreviousMediaState(); - + // TODO: may want a different message for this case? LLSD args; args["PLUGIN"] = LLMIMETypes::implType(mCurrentMimeType); @@ -3192,13 +3278,13 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla //LLNotificationsUtil::add("MediaPluginFailed", args); } break; - + case MEDIA_EVENT_CURSOR_CHANGED: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CURSOR_CHANGED, new cursor is " << plugin->getCursorName() << LL_ENDL; std::string cursor = plugin->getCursorName(); - + if(cursor == "arrow") mLastSetCursor = UI_CURSOR_ARROW; else if(cursor == "ibeam") @@ -3214,6 +3300,13 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla } break; + case LLViewerMediaObserver::MEDIA_EVENT_FILE_DOWNLOAD: + { + //llinfos << "Media event - file download requested - filename is " << self->getFileDownloadFilename() << llendl; + LLNotificationsUtil::add("MediaFileDownloadUnsupported"); + } + break; + case LLViewerMediaObserver::MEDIA_EVENT_NAVIGATE_BEGIN: { LL_DEBUGS("Media") << "MEDIA_EVENT_NAVIGATE_BEGIN, uri is: " << plugin->getNavigateURI() << LL_ENDL; @@ -3259,7 +3352,7 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla } } break; - + case LLViewerMediaObserver::MEDIA_EVENT_LOCATION_CHANGED: { LL_DEBUGS("Media") << "MEDIA_EVENT_LOCATION_CHANGED, uri is: " << plugin->getLocation() << LL_ENDL; @@ -3296,15 +3389,15 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla { // Display a file picker std::string response; - + LLFilePicker& picker = LLFilePicker::instance(); if (!picker.getOpenFile(LLFilePicker::FFLOAD_ALL)) { // The user didn't pick a file -- the empty response string will indicate this. } - + response = picker.getFirstFile(); - + plugin->sendPickFileResponse(response); } break; @@ -3460,7 +3553,7 @@ void LLViewerMediaImpl::calculateInterest() { LL_RECORD_BLOCK_TIME(FTM_MEDIA_CALCULATE_INTEREST); LLViewerMediaTexture* texture = LLViewerTextureManager::findMediaTexture( mTextureId ); - + if(texture != NULL) { mInterest = texture->getMaxVirtualSize(); @@ -3470,7 +3563,7 @@ void LLViewerMediaImpl::calculateInterest() // This will be a relatively common case now, since it will always be true for unloaded media. mInterest = 0.0f; } - + // Calculate distance from the avatar, for use in the proximity calculation. mProximityDistance = 0.0f; mProximityCamera = 0.0f; @@ -3480,7 +3573,7 @@ void LLViewerMediaImpl::calculateInterest() std::list< LLVOVolume* >::iterator iter = mObjectList.begin() ; LLVOVolume* objp = *iter ; llassert_always(objp != NULL) ; - + // The distance calculation is invalid for HUD attachments -- leave both mProximityDistance and mProximityCamera at 0 for them. if(!objp->isHUDAttachment()) { @@ -3493,12 +3586,12 @@ void LLViewerMediaImpl::calculateInterest() mProximityCamera = camera_delta.magVec(); } } - + if(mNeedsMuteCheck) { // Check all objects this instance is associated with, and those objects' owners, against the mute list mIsMuted = false; - + std::list< LLVOVolume* >::iterator iter = mObjectList.begin() ; for(; iter != mObjectList.end() ; ++iter) { @@ -3525,7 +3618,7 @@ void LLViewerMediaImpl::calculateInterest() } } } - + mNeedsMuteCheck = false; } } @@ -3533,7 +3626,7 @@ void LLViewerMediaImpl::calculateInterest() F64 LLViewerMediaImpl::getApproximateTextureInterest() { F64 result = 0.0f; - + if(mMediaSource) { result = mMediaSource->getFullWidth(); @@ -3551,8 +3644,8 @@ F64 LLViewerMediaImpl::getApproximateTextureInterest() void LLViewerMediaImpl::setUsedInUI(bool used_in_ui) { - mUsedInUI = used_in_ui; - + mUsedInUI = used_in_ui; + // HACK: Force elements used in UI to load right away. // This fixes some issues where UI code that uses the browser instance doesn't expect it to be unloaded. if(mUsedInUI && (mPriority == LLPluginClassMedia::PRIORITY_UNLOADED)) @@ -3572,7 +3665,7 @@ void LLViewerMediaImpl::setUsedInUI(bool used_in_ui) void LLViewerMediaImpl::setBackgroundColor(LLColor4 color) { - mBackgroundColor = color; + mBackgroundColor = color; if(mMediaSource) { @@ -3583,12 +3676,12 @@ void LLViewerMediaImpl::setBackgroundColor(LLColor4 color) F64 LLViewerMediaImpl::getCPUUsage() const { F64 result = 0.0f; - + if(mMediaSource) { result = mMediaSource->getCPUUsage(); } - + return result; } @@ -3602,19 +3695,19 @@ void LLViewerMediaImpl::setPriority(LLPluginClassMedia::EPriority priority) << " to " << LLPluginClassMedia::priorityToString(priority) << LL_ENDL; } - + mPriority = priority; - + if(priority == LLPluginClassMedia::PRIORITY_UNLOADED) { if(mMediaSource) { // Need to unload the media source - + // First, save off previous media state mPreviousMediaState = mMediaSource->getStatus(); mPreviousMediaTime = mMediaSource->getCurrentTime(); - + destroyMediaSource(); } } @@ -3623,7 +3716,7 @@ void LLViewerMediaImpl::setPriority(LLPluginClassMedia::EPriority priority) { mMediaSource->setPriority(mPriority); } - + // NOTE: loading (or reloading) media sources whose priority has risen above PRIORITY_UNLOADED is done in update(). } @@ -3638,8 +3731,8 @@ void LLViewerMediaImpl::setLowPrioritySizeLimit(int size) void LLViewerMediaImpl::setNavState(EMediaNavState state) { mMediaNavState = state; - - switch (state) + + switch (state) { case MEDIANAVSTATE_NONE: LL_DEBUGS("Media") << "Setting nav state to MEDIANAVSTATE_NONE" << LL_ENDL; break; case MEDIANAVSTATE_BEGUN: LL_DEBUGS("Media") << "Setting nav state to MEDIANAVSTATE_BEGUN" << LL_ENDL; break; @@ -3678,7 +3771,7 @@ void LLViewerMediaImpl::cancelMimeTypeProbe() // There doesn't seem to be a way to actually cancel an outstanding request. // Simulate it by telling the LLMimeDiscoveryResponder not to write back any results. mMimeTypeProbe->cancelRequest(); - + // The above should already have set mMimeTypeProbe to NULL. if(mMimeTypeProbe != NULL) { @@ -3687,7 +3780,7 @@ void LLViewerMediaImpl::cancelMimeTypeProbe() } } -void LLViewerMediaImpl::addObject(LLVOVolume* obj) +void LLViewerMediaImpl::addObject(LLVOVolume* obj) { std::list< LLVOVolume* >::iterator iter = mObjectList.begin() ; for(; iter != mObjectList.end() ; ++iter) @@ -3701,14 +3794,14 @@ void LLViewerMediaImpl::addObject(LLVOVolume* obj) mObjectList.push_back(obj) ; mNeedsMuteCheck = true; } - -void LLViewerMediaImpl::removeObject(LLVOVolume* obj) + +void LLViewerMediaImpl::removeObject(LLVOVolume* obj) { - mObjectList.remove(obj) ; + mObjectList.remove(obj) ; mNeedsMuteCheck = true; } - -const std::list< LLVOVolume* >* LLViewerMediaImpl::getObjectList() const + +const std::list< LLVOVolume* >* LLViewerMediaImpl::getObjectList() const { return &mObjectList ; } @@ -3716,13 +3809,13 @@ const std::list< LLVOVolume* >* LLViewerMediaImpl::getObjectList() const LLVOVolume *LLViewerMediaImpl::getSomeObject() { LLVOVolume *result = NULL; - + std::list< LLVOVolume* >::iterator iter = mObjectList.begin() ; if(iter != mObjectList.end()) { result = *iter; } - + return result; } @@ -3735,12 +3828,12 @@ void LLViewerMediaImpl::setTextureID(LLUUID id) // Remove this item's entry from the map sViewerMediaTextureIDMap.erase(mTextureId); } - + if(id.notNull()) { sViewerMediaTextureIDMap.insert(LLViewerMedia::impl_id_map::value_type(id, this)); } - + mTextureId = id; } } @@ -3749,7 +3842,7 @@ void LLViewerMediaImpl::setTextureID(LLUUID id) // bool LLViewerMediaImpl::isAutoPlayable() const { - return (mMediaAutoPlay && + return (mMediaAutoPlay && gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) && gSavedSettings.getBOOL("MediaTentativeAutoPlay")); } @@ -3760,20 +3853,20 @@ bool LLViewerMediaImpl::shouldShowBasedOnClass() const { // If this is parcel media or in the UI, return true always if (getUsedInUI() || isParcelMedia()) return true; - + bool attached_to_another_avatar = isAttachedToAnotherAvatar(); bool inside_parcel = isInAgentParcel(); - + // LL_INFOS() << " hasFocus = " << hasFocus() << // " others = " << (attached_to_another_avatar && gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING)) << // " within = " << (inside_parcel && gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING)) << // " outside = " << (!inside_parcel && gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING)) << LL_ENDL; - + // If it has focus, we should show it // This is incorrect, and causes EXT-6750 (disabled attachment media still plays) // if (hasFocus()) // return true; - + // If it is attached to an avatar and the pref is off, we shouldn't show it if (attached_to_another_avatar) { @@ -3786,7 +3879,7 @@ bool LLViewerMediaImpl::shouldShowBasedOnClass() const return show_media_within_parcel; } - else + else { static LLCachedControl<bool> show_media_outside_parcel(gSavedSettings, LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING, true); @@ -3799,7 +3892,7 @@ bool LLViewerMediaImpl::shouldShowBasedOnClass() const bool LLViewerMediaImpl::isAttachedToAnotherAvatar() const { bool result = false; - + std::list< LLVOVolume* >::const_iterator iter = mObjectList.begin(); std::list< LLVOVolume* >::const_iterator end = mObjectList.end(); for ( ; iter != end; iter++) @@ -3843,7 +3936,7 @@ bool LLViewerMediaImpl::isObjectAttachedToAnotherAvatar(LLVOVolume *obj) bool LLViewerMediaImpl::isInAgentParcel() const { bool result = false; - + std::list< LLVOVolume* >::const_iterator iter = mObjectList.begin(); std::list< LLVOVolume* >::const_iterator end = mObjectList.end(); for ( ; iter != end; iter++) diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 1ce42e97b8..ede408dd0c 100755 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -150,7 +150,7 @@ public: static void removeCookie(const std::string &name, const std::string &domain, const std::string &path = std::string("/") ); static void openIDSetup(const std::string &openid_url, const std::string &openid_token); - static void openIDCookieResponse(const std::string &cookie); + static void openIDCookieResponse(const std::string& url, const std::string &cookie); static void proxyWindowOpened(const std::string &target, const std::string &uuid); static void proxyWindowClosed(const std::string &uuid); @@ -163,7 +163,8 @@ public: static LLSD getHeaders(); private: - static void setOpenIDCookie(); + static bool parseRawCookie(const std::string raw_cookie, std::string& name, std::string& value, std::string& path, bool& httponly, bool& secure); + static void setOpenIDCookie(const std::string& url); static void onTeleportFinished(); static LLPluginCookieStore *sCookieStore; @@ -225,7 +226,8 @@ public: void mouseDown(const LLVector2& texture_coords, MASK mask, S32 button = 0); void mouseUp(const LLVector2& texture_coords, MASK mask, S32 button = 0); void mouseMove(const LLVector2& texture_coords, MASK mask); - void mouseDoubleClick(S32 x,S32 y, MASK mask, S32 button = 0); + void mouseDoubleClick(const LLVector2& texture_coords, MASK mask); + void mouseDoubleClick(S32 x, S32 y, MASK mask, S32 button = 0); void scrollWheel(S32 x, S32 y, MASK mask); void mouseCapture(); @@ -238,6 +240,7 @@ public: void navigateInternal(); void navigateStop(); bool handleKeyHere(KEY key, MASK mask); + bool handleKeyUpHere(KEY key, MASK mask); bool handleUnicodeCharHere(llwchar uni_char); bool canNavigateForward(); bool canNavigateBack(); diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index aa019dfdd8..7b4df3d3da 100755 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -352,6 +352,18 @@ BOOL LLViewerMediaFocus::handleKey(KEY key, MASK mask, BOOL called_from_parent) return true; } +BOOL LLViewerMediaFocus::handleKeyUp(KEY key, MASK mask, BOOL called_from_parent) +{ + LLViewerMediaImpl* media_impl = getFocusedMediaImpl(); + if (media_impl) + { + media_impl->handleKeyUpHere(key, mask); + } + return true; +} + + + BOOL LLViewerMediaFocus::handleUnicodeChar(llwchar uni_char, BOOL called_from_parent) { LLViewerMediaImpl* media_impl = getFocusedMediaImpl(); @@ -603,3 +615,13 @@ LLUUID LLViewerMediaFocus::getControlsMediaID() return LLUUID::null; } + +bool LLViewerMediaFocus::wantsKeyUpKeyDown() const +{ + return true; +} + +bool LLViewerMediaFocus::wantsReturnKey() const +{ + return true; +} diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h index f03dd8751e..0b2a64868e 100755 --- a/indra/newview/llviewermediafocus.h +++ b/indra/newview/llviewermediafocus.h @@ -56,6 +56,7 @@ public: /*virtual*/ bool getFocus(); /*virtual*/ BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent); + /*virtual*/ BOOL handleKeyUp(KEY key, MASK mask, BOOL called_from_parent); /*virtual*/ BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent); BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); @@ -87,6 +88,10 @@ public: // Return the ID of the media instance the controls are currently attached to (either focus or hover). LLUUID getControlsMediaID(); + // The MoaP object wants keyup and keydown events. Overridden to return true. + virtual bool wantsKeyUpKeyDown() const; + virtual bool wantsReturnKey() const; + protected: /*virtual*/ void onFocusReceived(); /*virtual*/ void onFocusLost(); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 38d62dee5e..de219edcff 100755 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -1245,9 +1245,24 @@ class LLAdvancedToggleWireframe : public view_listener_t bool handleEvent(const LLSD& userdata) { gUseWireframe = !(gUseWireframe); + + if (gUseWireframe) + { + gInitialDeferredModeForWireframe = LLPipeline::sRenderDeferred; + } + gWindowResized = TRUE; LLPipeline::updateRenderDeferred(); gPipeline.resetVertexBuffers(); + + if (!gUseWireframe && !gInitialDeferredModeForWireframe && LLPipeline::sRenderDeferred != gInitialDeferredModeForWireframe && gPipeline.isInit()) + { + LLPipeline::refreshCachedSettings(); + gPipeline.releaseGLBuffers(); + gPipeline.createGLBuffers(); + LLViewerShaderMgr::instance()->setShaders(); + } + return true; } }; diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 05d116704e..d79c84bee3 100755 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -232,6 +232,8 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe mRenderMedia(FALSE), mBestUpdatePrecision(0), mText(), + mHudText(""), + mHudTextColor(LLColor4::white), mLastInterpUpdateSecs(0.f), mLastMessageUpdateSecs(0.f), mLatestRecvPacketID(0), @@ -1413,12 +1415,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, // Setup object text if (!mText) { - mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT); - mText->setFont(LLFontGL::getFontSansSerif()); - mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP); - mText->setMaxLines(-1); - mText->setSourceObject(this); - mText->setOnHUDAttachment(isHUDAttachment()); + initHudText(); } std::string temp_string; @@ -1432,6 +1429,9 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, mText->setColor(LLColor4(coloru)); mText->setString(temp_string); + mHudText = temp_string; + mHudTextColor = LLColor4(coloru); + setChanged(MOVED | SILHOUETTE); } else if (mText.notNull()) @@ -1794,12 +1794,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, // Setup object text if (!mText && (value & 0x4)) { - mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT); - mText->setFont(LLFontGL::getFontSansSerif()); - mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP); - mText->setMaxLines(-1); // Set to match current agni behavior. - mText->setSourceObject(this); - mText->setOnHUDAttachment(isHUDAttachment()); + initHudText(); } if (value & 0x4) @@ -1812,6 +1807,9 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, mText->setColor(LLColor4(coloru)); mText->setString(temp_string); + mHudText = temp_string; + mHudTextColor = LLColor4(coloru); + setChanged(TEXTURE); } else if(mText.notNull()) @@ -2840,6 +2838,11 @@ void LLViewerObject::clearInventoryListeners() mInventoryCallbacks.clear(); } +bool LLViewerObject::hasInventoryListeners() +{ + return !mInventoryCallbacks.empty(); +} + void LLViewerObject::requestInventory() { if(mInventoryDirty && mInventory && !mInventoryCallbacks.empty()) @@ -2847,15 +2850,20 @@ void LLViewerObject::requestInventory() mInventory->clear(); // will deref and delete entries delete mInventory; mInventory = NULL; - mInventoryDirty = FALSE; //since we are going to request it now } + if(mInventory) { + // inventory is either up to date or doesn't has a listener + // if it is dirty, leave it this way in case we gain a listener doInventoryCallback(); } - // throw away duplicate requests else { + // since we are going to request it now + mInventoryDirty = FALSE; + + // Note: throws away duplicate requests fetchInventoryFromServer(); } } @@ -2865,8 +2873,6 @@ void LLViewerObject::fetchInventoryFromServer() if (!mInventoryPending) { delete mInventory; - mInventory = NULL; - mInventoryDirty = FALSE; LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_RequestTaskInventory); msg->nextBlockFast(_PREHASH_AgentData); @@ -4090,6 +4096,7 @@ LLViewerObject* LLViewerObject::getRootEdit() const BOOL LLViewerObject::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, + BOOL pick_rigged, S32* face_hit, LLVector4a* intersection, LLVector2* tex_coord, @@ -4652,7 +4659,7 @@ S32 LLViewerObject::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID return retval; } -S32 LLViewerObject::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams, bool isInitFromServer) +S32 LLViewerObject::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams) { S32 retval = 0; const LLTextureEntry *tep = getTE(te); @@ -4662,14 +4669,13 @@ S32 LLViewerObject::setTEMaterialParams(const U8 te, const LLMaterialPtr pMateri return 0; } - setTENormalMap(te, (pMaterialParams) ? pMaterialParams->getNormalID() : LLUUID::null); - setTESpecularMap(te, (pMaterialParams) ? pMaterialParams->getSpecularID() : LLUUID::null); - - retval = LLPrimitive::setTEMaterialParams(te, pMaterialParams, isInitFromServer); + retval = LLPrimitive::setTEMaterialParams(te, pMaterialParams); LL_DEBUGS("Material") << "Changing material params for te " << (S32)te << ", object " << mID << " (" << retval << ")" << LL_ENDL; + setTENormalMap(te, (pMaterialParams) ? pMaterialParams->getNormalID() : LLUUID::null); + setTESpecularMap(te, (pMaterialParams) ? pMaterialParams->getSpecularID() : LLUUID::null); refreshMaterials(); return retval; @@ -4963,12 +4969,7 @@ void LLViewerObject::setDebugText(const std::string &utf8text) if (!mText) { - mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT); - mText->setFont(LLFontGL::getFontSansSerif()); - mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP); - mText->setMaxLines(-1); - mText->setSourceObject(this); - mText->setOnHUDAttachment(isHUDAttachment()); + initHudText(); } mText->setColor(LLColor4::white); mText->setString(utf8text); @@ -4977,6 +4978,25 @@ void LLViewerObject::setDebugText(const std::string &utf8text) updateText(); } +void LLViewerObject::initHudText() +{ + mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT); + mText->setFont(LLFontGL::getFontSansSerif()); + mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP); + mText->setMaxLines(-1); + mText->setSourceObject(this); + mText->setOnHUDAttachment(isHUDAttachment()); +} + +void LLViewerObject::restoreHudText() +{ + if(mText) + { + mText->setColor(mHudTextColor); + mText->setString(mHudText); + } +} + void LLViewerObject::setIcon(LLViewerTexture* icon_image) { if (!mIcon) @@ -5023,7 +5043,13 @@ void LLViewerObject::updateText() { if (mText.notNull()) { - LLVector3 up_offset(0,0,0); + LLVOAvatar* avatar = getAvatar(); + if (avatar) + { + mText->setHidden(avatar->isInMuteList()); + } + + LLVector3 up_offset(0,0,0); up_offset.mV[2] = getScale().mV[VZ]*0.6f; if (mDrawable.notNull()) diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index db2749f413..cb8acfdcf8 100755 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -268,6 +268,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, + BOOL pick_rigged = FALSE, 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 @@ -330,7 +331,7 @@ public: /*virtual*/ S32 setTEMediaFlags(const U8 te, const U8 media_flags ); /*virtual*/ S32 setTEGlow(const U8 te, const F32 glow); /*virtual*/ S32 setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID); - /*virtual*/ S32 setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams, bool isInitFromServer); + /*virtual*/ S32 setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams); // Used by Materials update functions to properly kick off rebuilds // of VBs etc when materials updates require changes. @@ -403,6 +404,8 @@ public: void setCanSelect(BOOL canSelect); void setDebugText(const std::string &utf8text); + void initHudText(); + void restoreHudText(); void setIcon(LLViewerTexture* icon_image); void clearIcon(); @@ -436,8 +439,8 @@ public: void removeInventoryListener(LLVOInventoryListener* listener); BOOL isInventoryPending() { return mInventoryPending; } void clearInventoryListeners(); + bool hasInventoryListeners(); void requestInventory(); - void fetchInventoryFromServer(); static void processTaskInv(LLMessageSystem* msg, void** user_data); void removeInventory(const LLUUID& item_id); @@ -593,6 +596,9 @@ private: static void initObjectDataMap(); + // forms task inventory request if none are pending + void fetchInventoryFromServer(); + public: // // Viewer-side only types - use the LL_PCODE_APP mask. @@ -670,6 +676,9 @@ public: LLPointer<LLHUDText> mText; LLPointer<class LLHUDIcon> mIcon; + std::string mHudText; + LLColor4 mHudTextColor; + static BOOL sUseSharedDrawables; protected: diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 75732a1e19..61e918215c 100755 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -1282,7 +1282,7 @@ void LLViewerObjectList::clearDebugText() { for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter) { - (*iter)->setDebugText(""); + (*iter)->restoreHudText(); } } diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index 37b249dddd..fc275eb2f0 100755 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -590,7 +590,13 @@ void LLViewerParcelMedia::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_PICK_FILE_REQUEST" << LL_ENDL; } break; - + + case MEDIA_EVENT_FILE_DOWNLOAD: + { + LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_FILE_DOWNLOAD" << LL_ENDL; + } + break; + case MEDIA_EVENT_GEOMETRY_CHANGE: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_GEOMETRY_CHANGE, uuid is " << self->getClickUUID() << LL_ENDL; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index ba84d7aa2c..f96c4b7bf0 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1137,7 +1137,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 ); LLUUID object_id = pick_info.getObjectID(); S32 object_face = pick_info.mObjectFace; @@ -1381,7 +1381,11 @@ BOOL LLViewerWindow::handleTranslatedKeyDown(KEY key, MASK mask, BOOL repeated) // it's all entered/processed. if (key == KEY_RETURN && mask == MASK_NONE) { - return FALSE; + // RIDER: although, at times some of the controlls (in particular the CEF viewer + // would like to know about the KEYDOWN for an enter key... so ask and pass it along. + LLFocusableElement* keyboard_focus = gFocusMgr.getKeyboardFocus(); + if (keyboard_focus && !keyboard_focus->wantsReturnKey()) + return FALSE; } return gViewerKeyboard.handleKey(key, mask, repeated); @@ -1399,10 +1403,9 @@ BOOL LLViewerWindow::handleTranslatedKeyUp(KEY key, MASK mask) tool_inspectp->keyUp(key, mask); } - return FALSE; + return gViewerKeyboard.handleKeyUp(key, mask); } - void LLViewerWindow::handleScanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level) { LLViewerJoystick::getInstance()->setCameraNeedsUpdate(true); @@ -2019,6 +2022,7 @@ void LLViewerWindow::initWorldUI() } gHUDView = new LLHUDView(hud_rect); getRootView()->addChild(gHUDView); + getRootView()->sendChildToBack(gHUDView); } LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("state_management_buttons_container"); @@ -2544,21 +2548,67 @@ void LLViewerWindow::draw() //#endif } +// Takes a single keyup event, usually when UI is visible +BOOL LLViewerWindow::handleKeyUp(KEY key, MASK mask) +{ + LLFocusableElement* keyboard_focus = gFocusMgr.getKeyboardFocus(); + + if (keyboard_focus + && !(mask & (MASK_CONTROL | MASK_ALT)) + && !gFocusMgr.getKeystrokesOnly()) + { + // We have keyboard focus, and it's not an accelerator + if (keyboard_focus && keyboard_focus->wantsKeyUpKeyDown()) + { + return keyboard_focus->handleKeyUp(key, mask, FALSE); + } + else if (key < 0x80) + { + // Not a special key, so likely (we hope) to generate a character. Let it fall through to character handler first. + return (gFocusMgr.getKeyboardFocus() != NULL); + } + } + + if (keyboard_focus) + { + if (keyboard_focus->handleKeyUp(key, mask, FALSE)) + { + LL_DEBUGS() << "LLviewerWindow::handleKeyUp - in 'traverse up' - no loops seen... just called keyboard_focus->handleKeyUp an it returned true" << LL_ENDL; + LLViewerEventRecorder::instance().logKeyEvent(key, mask); + return TRUE; + } + else { + LL_DEBUGS() << "LLviewerWindow::handleKeyUp - in 'traverse up' - no loops seen... just called keyboard_focus->handleKeyUp an it returned FALSE" << LL_ENDL; + } + } + + // don't pass keys on to world when something in ui has focus + return gFocusMgr.childHasKeyboardFocus(mRootView) + || LLMenuGL::getKeyboardMode() + || (gMenuBarView && gMenuBarView->getHighlightedItem() && gMenuBarView->getHighlightedItem()->isActive()); +} + // Takes a single keydown event, usually when UI is visible BOOL LLViewerWindow::handleKey(KEY key, MASK mask) { // hide tooltips on keypress LLToolTipMgr::instance().blockToolTips(); - if (gFocusMgr.getKeyboardFocus() + LLFocusableElement* keyboard_focus = gFocusMgr.getKeyboardFocus(); + + if (keyboard_focus && !(mask & (MASK_CONTROL | MASK_ALT)) && !gFocusMgr.getKeystrokesOnly()) { // We have keyboard focus, and it's not an accelerator - if (key < 0x80) + if (keyboard_focus && keyboard_focus->wantsKeyUpKeyDown()) + { + return keyboard_focus->handleKey(key, mask, FALSE ); + } + else if (key < 0x80) { // Not a special key, so likely (we hope) to generate a character. Let it fall through to character handler first. - return (gFocusMgr.getKeyboardFocus() != NULL); + return (keyboard_focus != NULL); } } @@ -2572,7 +2622,6 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) return TRUE; } - LLFocusableElement* keyboard_focus = gFocusMgr.getKeyboardFocus(); // give menus a chance to handle modified (Ctrl, Alt) shortcut keys before current focus // as long as focus isn't locked @@ -2598,7 +2647,7 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) // give floaters first chance to handle TAB key // so frontmost floater gets focus // if nothing has focus, go to first or last UI element as appropriate - if (key == KEY_TAB && (mask & MASK_CONTROL || gFocusMgr.getKeyboardFocus() == NULL)) + if (key == KEY_TAB && (mask & MASK_CONTROL || keyboard_focus == NULL)) { LL_WARNS() << "LLviewerWindow::handleKey give floaters first chance at tab key " << LL_ENDL; if (gMenuHolder) gMenuHolder->hideMenus(); @@ -2936,7 +2985,7 @@ void LLViewerWindow::updateUI() if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RAYCAST)) { gDebugRaycastFaceHit = -1; - gDebugRaycastObject = cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, + gDebugRaycastObject = cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, FALSE, &gDebugRaycastFaceHit, &gDebugRaycastIntersection, &gDebugRaycastTexCoord, @@ -3764,6 +3813,7 @@ void LLViewerWindow::pickAsync( S32 x, MASK mask, void (*callback)(const LLPickInfo& info), BOOL pick_transparent, + BOOL pick_rigged, BOOL pick_unselectable) { BOOL in_build_mode = LLFloaterReg::instanceVisible("build"); @@ -3774,7 +3824,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); + LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, pick_rigged, FALSE, TRUE, pick_unselectable, callback); schedulePick(pick_info); } @@ -3830,7 +3880,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) +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) @@ -3842,7 +3892,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); + mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, pick_rigged, pick_particle, TRUE, FALSE, NULL); mLastPick.fetchResults(); return mLastPick; @@ -3878,6 +3928,7 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de LLViewerObject *this_object, S32 this_face, BOOL pick_transparent, + BOOL pick_rigged, S32* face_hit, LLVector4a *intersection, LLVector2 *uv, @@ -3948,7 +3999,7 @@ 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, + if (this_object->lineSegmentIntersect(mh_start, mh_end, this_face, pick_transparent, pick_rigged, face_hit, intersection, uv, normal, tangent)) { found = this_object; @@ -3956,7 +4007,7 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de } else // is a world object { - if (this_object->lineSegmentIntersect(mw_start, mw_end, this_face, pick_transparent, + if (this_object->lineSegmentIntersect(mw_start, mw_end, this_face, pick_transparent, pick_rigged, face_hit, intersection, uv, normal, tangent)) { found = this_object; @@ -3970,7 +4021,7 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de if (!found) // if not found in HUD, look in world: { - found = gPipeline.lineSegmentIntersectInWorld(mw_start, mw_end, pick_transparent, + found = gPipeline.lineSegmentIntersectInWorld(mw_start, mw_end, pick_transparent, pick_rigged, face_hit, intersection, uv, normal, tangent); if (found && !pick_transparent) { @@ -5246,6 +5297,7 @@ LLPickInfo::LLPickInfo() mBinormal(), mHUDIcon(NULL), mPickTransparent(FALSE), + mPickRigged(FALSE), mPickParticle(FALSE) { } @@ -5253,6 +5305,7 @@ LLPickInfo::LLPickInfo() LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos, MASK keyboard_mask, BOOL pick_transparent, + BOOL pick_rigged, BOOL pick_particle, BOOL pick_uv_coords, BOOL pick_unselectable, @@ -5271,6 +5324,7 @@ LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos, mBinormal(), mHUDIcon(NULL), mPickTransparent(pick_transparent), + mPickRigged(pick_rigged), mPickParticle(pick_particle), mPickUnselectable(pick_unselectable) { @@ -5302,7 +5356,7 @@ void LLPickInfo::fetchResults() } LLViewerObject* hit_object = gViewerWindow->cursorIntersect(mMousePt.mX, mMousePt.mY, 512.f, - NULL, -1, mPickTransparent, &face_hit, + NULL, -1, mPickTransparent, mPickRigged, &face_hit, &intersection, &uv, &normal, &tangent, &start, &end); mPickPt = mMousePt; @@ -5447,7 +5501,7 @@ void LLPickInfo::getSurfaceInfo() if (objectp) { if (gViewerWindow->cursorIntersect(ll_round((F32)mMousePt.mX), ll_round((F32)mMousePt.mY), 1024.f, - objectp, -1, mPickTransparent, + objectp, -1, mPickTransparent, mPickRigged, &mObjectFace, &intersection, &mSTCoords, diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 7fde52d4e1..d34e76f6f6 100755 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -89,6 +89,7 @@ public: LLPickInfo(const LLCoordGL& mouse_pos, MASK keyboard_mask, BOOL pick_transparent, + BOOL pick_rigged, BOOL pick_particle, BOOL pick_surface_info, BOOL pick_unselectable, @@ -123,6 +124,7 @@ public: LLVector4 mTangent; LLVector3 mBinormal; BOOL mPickTransparent; + BOOL mPickRigged; BOOL mPickParticle; BOOL mPickUnselectable; void getSurfaceInfo(); @@ -314,6 +316,7 @@ public: LLView* getHintHolder() { return mHintHolder.get(); } LLView* getLoginPanelHolder() { return mLoginPanelHolder.get(); } BOOL handleKey(KEY key, MASK mask); + BOOL handleKeyUp(KEY key, MASK mask); void handleScrollWheel (S32 clicks); // add and remove views from "popup" layer @@ -367,8 +370,9 @@ public: MASK mask, void (*callback)(const LLPickInfo& pick_info), BOOL pick_transparent = FALSE, + BOOL pick_rigged = FALSE, BOOL pick_unselectable = FALSE); - LLPickInfo pickImmediate(S32 x, S32 y, BOOL pick_transparent, BOOL pick_particle = 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); @@ -376,6 +380,7 @@ public: LLViewerObject *this_object = NULL, S32 this_face = -1, BOOL pick_transparent = FALSE, + BOOL pick_rigged = FALSE, S32* face_hit = NULL, LLVector4a *intersection = NULL, LLVector2 *uv = NULL, diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index b97a1bde99..6f7b23ba01 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1511,6 +1511,7 @@ void LLVOAvatar::renderJoints() BOOL LLVOAvatar::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, + BOOL pick_rigged, S32* face_hit, LLVector4a* intersection, LLVector2* tex_coord, @@ -1610,6 +1611,7 @@ BOOL LLVOAvatar::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& LLViewerObject* LLVOAvatar::lineSegmentIntersectRiggedAttachments(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, + BOOL pick_rigged, S32* face_hit, LLVector4a* intersection, LLVector2* tex_coord, @@ -1640,7 +1642,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)) + if (attached_object->lineSegmentIntersect(start, local_end, face, pick_transparent, pick_rigged, face_hit, &local_intersection, tex_coord, normal, tangent)) { local_end = local_intersection; if (intersection) diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 5b4379165a..09d8662034 100755 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -165,6 +165,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, + BOOL pick_rigged = FALSE, 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 @@ -173,6 +174,7 @@ public: LLViewerObject* lineSegmentIntersectRiggedAttachments(const LLVector4a& start, const LLVector4a& end, S32 face = -1, // which face to check, -1 = ALL_SIDES BOOL pick_transparent = FALSE, + BOOL pick_rigged = FALSE, 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 8d8f33b601..de63a3963c 100755 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -770,7 +770,7 @@ void LLVOGrass::updateDrawable(BOOL force_damped) } // virtual -BOOL LLVOGrass::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, S32 *face_hitp, +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) { diff --git a/indra/newview/llvograss.h b/indra/newview/llvograss.h index 71d358362d..5634e048eb 100755 --- a/indra/newview/llvograss.h +++ b/indra/newview/llvograss.h @@ -78,6 +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, + BOOL pick_rigged = FALSE, 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/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index 1ba0868544..6e5db526b0 100755 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -469,6 +469,7 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable) BOOL LLVOPartGroup::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, + BOOL pick_rigged, S32* face_hit, LLVector4a* intersection, LLVector2* tex_coord, diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h index a94a2291ed..2ef8b1c848 100755 --- a/indra/newview/llvopartgroup.h +++ b/indra/newview/llvopartgroup.h @@ -72,6 +72,7 @@ public: /*virtual*/ BOOL lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, + BOOL pick_rigged, S32* face_hit, LLVector4a* intersection, LLVector2* tex_coord, diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp index 79e1921f1b..897bace4e1 100755 --- a/indra/newview/llvosurfacepatch.cpp +++ b/indra/newview/llvosurfacepatch.cpp @@ -936,7 +936,7 @@ 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, +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) { diff --git a/indra/newview/llvosurfacepatch.h b/indra/newview/llvosurfacepatch.h index 3383b16dd9..884dbb3be3 100755 --- a/indra/newview/llvosurfacepatch.h +++ b/indra/newview/llvosurfacepatch.h @@ -84,6 +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, + BOOL pick_rigged = FALSE, 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 367fa21b91..4dcc267e96 100755 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -1110,7 +1110,7 @@ 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, +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) { diff --git a/indra/newview/llvotree.h b/indra/newview/llvotree.h index c862de8230..c16ed70bb4 100755 --- a/indra/newview/llvotree.h +++ b/indra/newview/llvotree.h @@ -108,6 +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, + BOOL pick_rigged = FALSE, 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 19d61f6e33..b0eb60cc76 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -2022,7 +2022,7 @@ void LLVOVolume::setTEMaterialParamsCallbackTE(const LLUUID& objectID, const LLM LLTextureEntry* texture_entry = pVol->getTE(te); if (texture_entry && (texture_entry->getMaterialID() == pMaterialID)) { - pVol->setTEMaterialParams(te, pMaterialParams, FALSE); + pVol->setTEMaterialParams(te, pMaterialParams); } } } @@ -2093,7 +2093,7 @@ bool LLVOVolume::notifyAboutCreatingTexture(LLViewerTexture *texture) for(map_te_material::const_iterator it = new_material.begin(), end = new_material.end(); it != end; ++it) { LLMaterialMgr::getInstance()->put(getID(), it->first, *it->second); - LLViewerObject::setTEMaterialParams(it->first, it->second, FALSE); + LLViewerObject::setTEMaterialParams(it->first, it->second); } //clear wait-list @@ -2170,7 +2170,7 @@ bool LLVOVolume::notifyAboutMissingAsset(LLViewerTexture *texture) for(map_te_material::const_iterator it = new_material.begin(), end = new_material.end(); it != end; ++it) { LLMaterialMgr::getInstance()->put(getID(), it->first, *it->second); - LLViewerObject::setTEMaterialParams(it->first, it->second, FALSE); + LLViewerObject::setTEMaterialParams(it->first, it->second); } //clear wait-list @@ -2179,7 +2179,7 @@ bool LLVOVolume::notifyAboutMissingAsset(LLViewerTexture *texture) return 0 != new_material.size(); } -S32 LLVOVolume::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams, bool isInitFromServer) +S32 LLVOVolume::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams) { LLMaterialPtr pMaterial = const_cast<LLMaterialPtr&>(pMaterialParams); @@ -2276,7 +2276,7 @@ S32 LLVOVolume::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialPa } } - S32 res = LLViewerObject::setTEMaterialParams(te, pMaterial, isInitFromServer); + S32 res = LLViewerObject::setTEMaterialParams(te, pMaterial); LL_DEBUGS("MaterialTEs") << "te " << (S32)te << " material " << ((pMaterial) ? pMaterial->asLLSD() : LLSD("null")) << " res " << res << ( LLSelectMgr::getInstance()->getSelection()->contains(const_cast<LLVOVolume*>(this), te) ? " selected" : " not selected" ) @@ -3883,7 +3883,7 @@ LLVector3 LLVOVolume::volumeDirectionToAgent(const LLVector3& dir) const } -BOOL LLVOVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face, BOOL pick_transparent, S32 *face_hitp, +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) { @@ -3902,9 +3902,9 @@ 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)))) { - updateRiggedVolume(); + updateRiggedVolume(true); volume = mRiggedVolume; transform = false; } @@ -4083,10 +4083,8 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& bool LLVOVolume::treatAsRigged() { - return LLFloater::isVisible(gFloaterTools) && - isAttachment() && - getAvatar() && - getAvatar()->isSelf() && + return isSelected() && + isAttachment() && mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED); } @@ -4105,12 +4103,12 @@ void LLVOVolume::clearRiggedVolume() } } -void LLVOVolume::updateRiggedVolume() +void LLVOVolume::updateRiggedVolume(bool force_update) { //Update mRiggedVolume to match current animation frame of avatar. //Also update position/size in octree. - if (!treatAsRigged()) + if ((!force_update) && (!treatAsRigged())) { clearRiggedVolume(); diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index ff7438ac09..a331908320 100755 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -140,6 +140,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, + BOOL pick_rigged = FALSE, 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 @@ -192,7 +193,7 @@ public: static void setTEMaterialParamsCallbackTE(const LLUUID& objectID, const LLMaterialID& pMaterialID, const LLMaterialPtr pMaterialParams, U32 te); - /*virtual*/ S32 setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams, bool isInitFromServer); + /*virtual*/ S32 setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams); /*virtual*/ S32 setTEScale(const U8 te, const F32 s, const F32 t); /*virtual*/ S32 setTEScaleS(const U8 te, const F32 s); /*virtual*/ S32 setTEScaleT(const U8 te, const F32 t); @@ -312,7 +313,7 @@ public: //rigged volume update (for raycasting) - void updateRiggedVolume(); + void updateRiggedVolume(bool force_update = false); 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 1c3808ce68..f8981d0c51 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" #include "llvoavatarself.h" @@ -55,7 +56,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; } @@ -491,6 +493,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) @@ -989,6 +992,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/llweb.cpp b/indra/newview/llweb.cpp index 0be6e49834..b37e41fb85 100755 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -234,6 +234,9 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url, //static bool LLWeb::useExternalBrowser(const std::string &url) { +#ifdef EXTERNAL_TOS + return true; +#else if (gSavedSettings.getU32("PreferredBrowserBehavior") == BROWSER_EXTERNAL_ONLY) { return true; @@ -250,4 +253,5 @@ bool LLWeb::useExternalBrowser(const std::string &url) return !(boost::regex_search(uri_string, matches, pattern)); } return false; +#endif } diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 03712c1065..3c58ce0c09 100755 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -7059,7 +7059,7 @@ LLVOPartGroup* LLPipeline::lineSegmentIntersectParticle(const LLVector4a& start, LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_PARTICLE); if (part && hasRenderType(part->mDrawableType)) { - LLDrawable* hit = part->lineSegmentIntersect(start, local_end, TRUE, face_hit, &position, NULL, NULL, NULL); + LLDrawable* hit = part->lineSegmentIntersect(start, local_end, TRUE, FALSE, face_hit, &position, NULL, NULL, NULL); if (hit) { drawable = hit; @@ -7085,7 +7085,8 @@ LLVOPartGroup* LLPipeline::lineSegmentIntersectParticle(const LLVector4a& start, } LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start, const LLVector4a& end, - BOOL pick_transparent, + BOOL pick_transparent, + BOOL pick_rigged, S32* face_hit, LLVector4a* intersection, // return the intersection point LLVector2* tex_coord, // return the texture coordinates of the intersection point @@ -7117,7 +7118,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); + LLDrawable* hit = part->lineSegmentIntersect(start, local_end, pick_transparent, pick_rigged, face_hit, &position, tex_coord, normal, tangent); if (hit) { drawable = hit; @@ -7174,7 +7175,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); + LLDrawable* hit = part->lineSegmentIntersect(start, local_end, pick_transparent, pick_rigged, face_hit, &position, tex_coord, normal, tangent); if (hit) { LLVector4a delta; @@ -7262,7 +7263,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); + LLDrawable* hit = part->lineSegmentIntersect(start, end, pick_transparent, FALSE, face_hit, intersection, tex_coord, normal, tangent); if (hit) { drawable = hit; @@ -7709,7 +7710,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) LLVector4a result; result.clear(); - gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, + gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, FALSE, NULL, &result); diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index ce2f4b17b1..97e11a151f 100755 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -183,6 +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, + BOOL pick_rigged, 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/de/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/de/floater_animation_bvh_preview.xml index 9a6f5e0166..d427376574 100755 --- a/indra/newview/skins/default/xui/de/floater_animation_bvh_preview.xml +++ b/indra/newview/skins/default/xui/de/floater_animation_bvh_preview.xml @@ -141,35 +141,35 @@ Maximal erlaubt sind [MAX_LENGTH] Sekunden. Ausdruck </text> <combo_box name="emote_combo" tool_tip="Steuert Gesichtsregungen während der Animation"> - <item label="(Keine)" name="[None]" value=""/> - <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/> - <item label="Ängstlich" name="Afraid" value="Ängstlich"/> - <item label="Verärgert" name="Angry" value="Verärgert"/> - <item label="Grinst" name="BigSmile" value="Grinst"/> - <item label="Gelangweilt" name="Bored" value="Gelangweilt"/> - <item label="Weinen" name="Cry" value="Weinen"/> - <item label="Verachtung" name="Disdain" value="Verachtung"/> - <item label="Verlegen" name="Embarrassed" value="Verlegen"/> - <item label="Stirnrunzeln" name="Frown" value="Stirnrunzeln"/> - <item label="Küssen" name="Kiss" value="Küssen"/> - <item label="Lachen" name="Laugh" value="Lachen"/> - <item label="Bäääh" name="Plllppt" value="Bäääh"/> - <item label="Angewidert" name="Repulsed" value="Angewidert"/> - <item label="Traurig" name="Sad" value="Traurig"/> - <item label="Achselzucken" name="Shrug" value="Achselzucken"/> - <item label="Lächeln" name="Smile" value="Lächeln"/> - <item label="Überraschung" name="Surprise" value="Überraschung"/> - <item label="Zwinkern" name="Wink" value="Zwinkern"/> - <item label="Sorgenvoll" name="Worry" value="Sorgenvoll"/> + <item label="(Keine)" name="[None]"/> + <item label="Aaaaah" name="Aaaaah"/> + <item label="Ängstlich" name="Afraid"/> + <item label="Verärgert" name="Angry"/> + <item label="Grinst" name="BigSmile"/> + <item label="Gelangweilt" name="Bored"/> + <item label="Weinen" name="Cry"/> + <item label="Verachtung" name="Disdain"/> + <item label="Verlegen" name="Embarrassed"/> + <item label="Stirnrunzeln" name="Frown"/> + <item label="Küssen" name="Kiss"/> + <item label="Lachen" name="Laugh"/> + <item label="Bäääh" name="Plllppt"/> + <item label="Angewidert" name="Repulsed"/> + <item label="Traurig" name="Sad"/> + <item label="Achselzucken" name="Shrug"/> + <item label="Lächeln" name="Smile"/> + <item label="Überraschung" name="Surprise"/> + <item label="Zwinkern" name="Wink"/> + <item label="Sorgenvoll" name="Worry"/> </combo_box> <text name="preview_label"> Vorschau während: </text> <combo_box name="preview_base_anim" tool_tip="Hiermit können Sie das Verhalten Ihres Avatars testen, während Ihr Avatar normale Bewegungen ausführt."> - <item label="Stehen" name="Standing" value="Stehen"/> - <item label="Gehen" name="Walking" value="Gehen"/> - <item label="Sitzen" name="Sitting" value="Sitzen"/> - <item label="Fliegen" name="Flying" value="Fliegen"/> + <item label="Stehen" name="Standing"/> + <item label="Gehen" name="Walking"/> + <item label="Sitzen" name="Sitting"/> + <item label="Fliegen" name="Flying"/> </combo_box> <spinner label="Einblenden (s)" name="ease_in_time" tool_tip="Einblendungszeit für Animationen (in Sekunden)"/> <spinner label="Ausblenden (s)" name="ease_out_time" tool_tip="Ausblendungszeit für Animationen (in Sekunden)"/> diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index edf028bf60..384ae6bb1e 100755 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -2,13 +2,13 @@ <floater positioning="cascading" can_tear_off="false" - height="420" + height="396" layout="topleft" name="floaterland" help_topic="floaterland" save_rect="true" title="ABOUT LAND" - width="490"> + width="634"> <floater.string name="maturity_icon_general"> "Parcel_PG_Dark" @@ -39,17 +39,18 @@ </floater.string> <tab_container follows="all" - height="410" + halign="left" + height="386" layout="topleft" left="0" name="landtab" - tab_position="top" - tab_height="25" - tab_min_width="67" - top="10" - width="489"> + tab_position="left" + tab_width="140" + tab_padding_right="3" + top="6" + width="633"> <panel - border="false" + border="true" follows="all" label="GENERAL" layout="topleft" @@ -145,7 +146,7 @@ Description: </text> <text_editor - follows="left|top|right" + follows="left|top" height="52" layout="topleft" left_pad="2" @@ -281,7 +282,7 @@ label="Set" layout="topleft" left_pad="4" - right="-10" + right="-154" name="Set..." width="90" top_delta="-2"/> @@ -302,7 +303,7 @@ label="Deed" layout="topleft" left_pad="2" - right="-10" + right="-154" name="Deed..." tool_tip="You may only deed land if you are an officer in the selected group." top_delta="-2" @@ -365,7 +366,7 @@ label="Sell Land" layout="topleft" left_pad="5" - right="-10" + right="-154" name="Sell Land..." width="145" top_delta="-25"/> @@ -412,7 +413,7 @@ label="Cancel Land Sale" label_selected="Cancel Land Sale" layout="topleft" - right="-10" + right="-154" name="Cancel Land Sale" left_pad="5" top_pad="7" @@ -527,7 +528,7 @@ height="23" label="Buy For Group" layout="topleft" - right="-10" + right="-154" name="Buy For Group..." top_delta="0" width="180" /> @@ -547,7 +548,7 @@ height="23" label="Abandon Land" layout="topleft" - right="-10" + right="-154" name="Abandon Land..." top_pad="-47" width="180" /> @@ -645,8 +646,8 @@ type="string" length="1" enabled="false" - follows="all" - height="200" + follows="top|left" + height="175" layout="topleft" left="10" max_length="65535" @@ -663,7 +664,7 @@ halign="right" layout="topleft" right="-10" - top_pad="0" + top_pad="25" mouse_opaque="false" name="covenant_timestamp_text" width="460"> @@ -930,7 +931,7 @@ label_selected="Show" layout="topleft" name="ShowOwner" - right="-140" + right="-284" width="60" top_delta="-6"/> <button @@ -941,7 +942,7 @@ label="Return" layout="topleft" name="ReturnOwner..." - right="-10" + right="-154" tool_tip="Return objects to their owners." width="119" top_delta="0"/> @@ -978,7 +979,7 @@ label_selected="Show" layout="topleft" name="ShowGroup" - right="-140" + right="-284" width="60" top_delta="-6"/> <button @@ -989,7 +990,7 @@ label="Return" layout="topleft" name="ReturnGroup..." - right="-10" + right="-154" tool_tip="Return objects to their owners." width="119" top_delta="0"/> @@ -1026,7 +1027,7 @@ label_selected="Show" layout="topleft" name="ShowOther" - right="-140" + right="-284" width="60" top_delta="-6"/> <button @@ -1037,7 +1038,7 @@ label="Return" layout="topleft" name="ReturnOther..." - right="-10" + right="-154" tool_tip="Return objects to their owners." width="119" top_delta="0"/> @@ -1122,13 +1123,13 @@ left_pad="6" name="Return objects..." top_delta="0" - right="-10" + right="-154" width="164" /> <name_list column_padding="0" draw_heading="true" - follows="all" - height="180" + follows="top|left" + height="150" layout="topleft" left="10" name="owner list" @@ -1321,8 +1322,8 @@ Only large parcels can be listed in search. <panel bevel_style="none" border="true" - top="146" - bottom="146" + top="121" + bottom="121" follows="left|bottom|right" left="20" right="-20"/> @@ -1357,7 +1358,7 @@ Only large parcels can be listed in search. enabled="true" height="23" layout="topleft" - left="20" + left="164" top="194" name="land category" visible="true" @@ -1494,7 +1495,7 @@ Only large parcels can be listed in search. label_selected="Set" layout="topleft" name="Set" - left="255" + left="399" tool_tip="Sets the landing point where visitors arrive. Sets to your avatar's location inside this parcel." width="50" /> <button @@ -1525,6 +1526,7 @@ Only large parcels can be listed in search. layout="topleft" name="landing type" top_pad="0" + left="399" tool_tip="Teleport Routing -- select how to handle teleports onto your land" width="120"> <combo_box.item @@ -1568,7 +1570,7 @@ Only large parcels can be listed in search. <combo_box height="23" layout="topleft" - left_pad="0" + left_pad="144" name="media type" tool_tip="Specify if the URL is a movie, web page, or other media" width="120" @@ -1577,7 +1579,7 @@ Only large parcels can be listed in search. follows="left|top" height="16" layout="topleft" - left_pad="10" + left_pad="-134" name="mime_type" width="200" /> <text @@ -1607,7 +1609,7 @@ Only large parcels can be listed in search. height="23" label="Set" layout="topleft" - left_pad="5" + left_pad="149" name="set_media_url" width="70" top_delta="0"/> @@ -1952,7 +1954,7 @@ Only large parcels can be listed in search. <combo_box height="23" layout="topleft" - left_pad="22" + left_pad="166" name="pass_combo" top_delta="0" width="100"> @@ -2050,7 +2052,7 @@ Only large parcels can be listed in search. follows="top|right" height="170" width="240" - left_pad="2"> + left_pad="146"> <text type="string" length="1" diff --git a/indra/newview/skins/default/xui/en/floater_my_inventory.xml b/indra/newview/skins/default/xui/en/floater_my_inventory.xml index 178987962b..f182d27da8 100755 --- a/indra/newview/skins/default/xui/en/floater_my_inventory.xml +++ b/indra/newview/skins/default/xui/en/floater_my_inventory.xml @@ -6,7 +6,7 @@ height="570" help_topic="sidebar_inventory" min_width="333" - min_height="570" + min_height="590" name="floater_my_inventory" save_rect="true" save_visibility="true" diff --git a/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml b/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml index afc609de52..c17d2a1f37 100644 --- a/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml +++ b/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml @@ -136,15 +136,15 @@ </tab_container> <layout_stack width="336" height="26" enabled="true" orientation="horizontal" follows="left|right" name="ButtonsStack"> - <layout_panel width="336" height="30" enabled="true" orientation="horizontal" name="CondenseAllButtonPanel"> + <layout_panel width="336" height="30" enabled="true" name="CondenseAllButtonPanel"> <button width="93" height="21" left="2" label="Collapse all" name="collapse_all_button"> </button> </layout_panel> - <layout_panel width="336" height="30" enabled="true" orientation="horizontal" name="GapLayoutPanel"> + <layout_panel width="336" height="30" enabled="true" name="GapLayoutPanel"> <panel width="90" height="21" left="2" label="Gap Panel" border="false" name="GapPanel"> </panel> </layout_panel> - <layout_panel width="336" height="30" enabled="true" orientation="horizontal" name="DeleteAllButtonPanel"> + <layout_panel width="336" height="30" enabled="true" name="DeleteAllButtonPanel"> <button width="93" height="21" left="2" label="Delete all" name="delete_all_button"> </button> </layout_panel> diff --git a/indra/newview/skins/default/xui/en/floater_tos.xml b/indra/newview/skins/default/xui/en/floater_tos.xml index af1617eb39..590d9d1844 100755 --- a/indra/newview/skins/default/xui/en/floater_tos.xml +++ b/indra/newview/skins/default/xui/en/floater_tos.xml @@ -57,6 +57,21 @@ width="552"> Please read the following Terms of Service and Privacy Policy carefully. To continue logging in to [SECOND_LIFE], you must accept the agreement. </text> + <text + type="string" + length="1" + follows="left|top" + font="SansSerif" + height="30" + layout="topleft" + left="16" + name="external_tos_required" + visible="false" + top="32" + word_wrap="true" + width="552"> + You will need to go to my.secondlife.com and log in to accept the Terms of Service before you can proceed. Thank you! + </text> <web_browser trusted_content="true" follows="left|top" diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index 73ca7c529d..419ec359a6 100755 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -236,7 +236,7 @@ name="Web Content Floater Debug Test"> <menu_item_call.on_click function="Advanced.WebContentTest" - parameter="http://google.com"/> + parameter="https://callum-linden.s3.amazonaws.com/ceftests.html"/> </menu_item_call> <menu create_jump_keys="true" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 3f557d0d0f..8de9a1a99a 100755 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -1438,7 +1438,7 @@ function="Floater.Show" parameter="bumps" /> </menu_item_call> - <menu_item_separator/> + <menu_item_separator/> <menu_item_call label="About [APP_NAME]" name="About Second Life"> @@ -3191,7 +3191,7 @@ shortcut="control|shift|Z"> <menu_item_call.on_click function="Advanced.WebContentTest" - parameter="http://google.com"/> + parameter="https://callum-linden.s3.amazonaws.com/ceftests.html"/> </menu_item_call> <menu_item_call label="FB Connect Test" diff --git a/indra/newview/skins/default/xui/en/mime_types.xml b/indra/newview/skins/default/xui/en/mime_types.xml index f5f2223330..7cb4a6e53b 100755 --- a/indra/newview/skins/default/xui/en/mime_types.xml +++ b/indra/newview/skins/default/xui/en/mime_types.xml @@ -7,7 +7,7 @@ none </defaultwidget> <defaultimpl> - media_plugin_webkit + media_plugin_cef </defaultimpl> <widgetset name="web"> <label name="web_label"> @@ -141,7 +141,7 @@ none </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="none/none"> @@ -152,7 +152,7 @@ none </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="audio/*"> @@ -185,7 +185,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype menu="1" name="video/vnd.secondlife.qt.legacy"> @@ -207,7 +207,7 @@ web </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="application/ogg"> @@ -229,7 +229,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="application/postscript"> @@ -240,7 +240,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="application/rtf"> @@ -251,7 +251,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="application/smil"> @@ -262,7 +262,7 @@ movie </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="application/xhtml+xml"> @@ -273,7 +273,7 @@ web </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="application/x-director"> @@ -284,7 +284,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="audio/mid"> @@ -339,7 +339,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype menu="1" name="image/gif"> @@ -350,7 +350,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype menu="1" name="image/jpeg"> @@ -361,7 +361,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype menu="1" name="image/png"> @@ -372,7 +372,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="image/svg+xml"> @@ -383,7 +383,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype menu="1" name="image/tiff"> @@ -394,7 +394,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype menu="1" name="text/html"> @@ -405,7 +405,7 @@ web </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype menu="1" name="text/plain"> @@ -416,7 +416,7 @@ text </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="text/xml"> @@ -427,7 +427,7 @@ text </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype menu="1" name="video/mpeg"> diff --git a/indra/newview/skins/default/xui/en/mime_types_mac.xml b/indra/newview/skins/default/xui/en/mime_types_mac.xml index 90230f12dd..f71c24b2e4 100755 --- a/indra/newview/skins/default/xui/en/mime_types_mac.xml +++ b/indra/newview/skins/default/xui/en/mime_types_mac.xml @@ -7,7 +7,7 @@ none </defaultwidget> <defaultimpl> - media_plugin_webkit + media_plugin_cef </defaultimpl> <widgetset name="web"> <label name="web_label"> @@ -152,7 +152,7 @@ none </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="audio/*"> @@ -185,7 +185,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype menu="1" name="video/vnd.secondlife.qt.legacy"> @@ -207,7 +207,7 @@ web </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="application/ogg"> @@ -229,7 +229,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="application/postscript"> @@ -240,7 +240,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="application/rtf"> @@ -251,7 +251,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="application/smil"> @@ -262,7 +262,7 @@ movie </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="application/xhtml+xml"> @@ -273,7 +273,7 @@ web </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="application/x-director"> @@ -284,7 +284,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="audio/mid"> @@ -339,7 +339,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype menu="1" name="image/gif"> @@ -350,7 +350,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype menu="1" name="image/jpeg"> @@ -361,7 +361,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype menu="1" name="image/png"> @@ -372,7 +372,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="image/svg+xml"> @@ -383,7 +383,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype menu="1" name="image/tiff"> @@ -394,7 +394,7 @@ image </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype menu="1" name="text/html"> @@ -405,7 +405,7 @@ web </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype menu="1" name="text/plain"> @@ -416,7 +416,7 @@ text </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype name="text/xml"> @@ -427,7 +427,7 @@ text </widgettype> <impl> - media_plugin_webkit + media_plugin_cef </impl> </mimetype> <mimetype menu="1" name="video/mpeg"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 70ba4d5077..b4c5cba1fd 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -1592,11 +1592,24 @@ The object may be out of range or may have been deleted. icon="alertmodal.tga" name="CannotDownloadFile" type="alertmodal"> -Unable to download file - <tag>fail</tag> + Unable to download file + <tag>fail</tag> </notification> <notification + name="MediaFileDownloadUnsupported" + label="" + type="alert"> + <unique/> + <tag>confirm</tag> + You have requested a file download, which is not supported within [SECOND_LIFE]. + <usetemplate + ignoretext="Warn about unsupported file downloads" + name="okignore" + yestext="OK"/> + </notification> + + <notification icon="alertmodal.tga" name="CannotWriteFile" type="alertmodal"> diff --git a/indra/newview/skins/default/xui/en/panel_notification_list_item.xml b/indra/newview/skins/default/xui/en/panel_notification_list_item.xml index a909028f9f..efaaefd0e4 100644 --- a/indra/newview/skins/default/xui/en/panel_notification_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_notification_list_item.xml @@ -9,7 +9,6 @@ left="0" width="331" height="202" - can_resize="true" layout="topleft" follows="left|top|right|bottom" > <!-- background_opaque="false" --> @@ -45,12 +44,12 @@ <layout_panel top="0" left="0" height="30" follows="left|top|right|bottom" layout="topleft" name="layout_panel_condensed_view" visible="false" background_opaque="false" background_visible="true" bg_alpha_color="SysWellItemUnselected"> <panel border="true" top="0" left="5" height="30" bevel_style="none" layout="topleft" follows="left|top|right|bottom" name="panel_condensed_view"> <layout_stack top="0" left="0" width="325" height="50" orientation="horizontal" follows="left|top|right|bottom" name="horizontal_stack"> - <layout_panel width="30" height="39" orientation="horizontal" follows="left|top|right|bottom" name="layout_panel_right"> + <layout_panel width="30" height="39" follows="left|top|right|bottom" name="layout_panel_right"> <group_icon left="5" top="6" width="25" height="25" mouse_opaque="true" name="group_icon" tool_tip="Group" default_icon_name="Generic_Group" visible="true"/> <avatar_icon left="5" top="6" width="25" height="25" mouse_opaque="true" name="avatar_icon" tool_tip="Avatar" default_icon_name="Generic_Person" visible="false"/> <icon left="5" top="6" width="25" height="25" mouse_opaque="true" name="system_notification_icon" tool_tip="Icon" image_name="System_Notification" visible="false"/> </layout_panel> - <layout_panel width="260" height="50" orientation="horizontal" name="layout_panel_middle"> + <layout_panel width="260" height="50" name="layout_panel_middle"> <panel border="false" top="0" width="260" height="38" bevel_style="none" follows="left|top|right" layout="topleft" name="main_info_panel"> <panel border="false" top="0" left="0" width="260" height="19" bevel_style="none" follows="left|top|right|bottom" layout="topleft" name="notification_title_panel"> <text allow_scroll="false" font="SansSerifSmall" top="6" left="0" width="260" height="12" layout="topleft" follows="right|left" text_color="White" @@ -69,7 +68,7 @@ </panel> </panel> </layout_panel> - <layout_panel width="18" height="48" orientation="horizontal" follows="right|top|bottom" name="layout_panel_right"> + <layout_panel width="18" height="48" follows="right|top|bottom" name="layout_panel_right"> <panel top="0" left="0" width="17" height="39" follows="left|top|right|bottom" layout="topleft" name="close_expand_panel"> <button top="0" left="0" width="17" height="17" layout="topleft" follows="top" name="close_btn" mouse_opaque="true" tab_stop="false" image_unselected="Icon_Close_Foreground" image_selected="Icon_Close_Press" /> @@ -83,13 +82,13 @@ <layout_panel top="0" left="0" height="196" follows="left|top|right|bottom" layout="topleft" name="layout_panel_expanded_view" visible="true" background_opaque="false" background_visible="true" bg_alpha_color="SysWellItemUnselected"> <panel border="true" top="0" left="5" height="196" bevel_style="none" follows="left|top|right|bottom" layout="topleft" name="panel_expanded_view"> <layout_stack top="0" left="0" width="325" height="196" orientation="horizontal" follows="left|top|right|bottom" name="horizontal_stack"> - <layout_panel width="30" height="170" orientation="horizontal" follows="left|top|bottom" name="layout_panel_right_exp"> + <layout_panel width="30" height="170" follows="left|top|bottom" name="layout_panel_right_exp"> <group_icon left="5" top="6" width="25" height="25" mouse_opaque="true" name="group_icon_exp" tool_tip="Group" default_icon_name="Generic_Group" visible="true"/> <avatar_icon left="5" top="6" width="25" height="25" mouse_opaque="true" name="avatar_icon_exp" tool_tip="Avatar" default_icon_name="Generic_Person" visible="false"/> <icon left="5" top="6" width="25" height="25" mouse_opaque="true" name="system_notification_icon_exp" tool_tip="Icon" image_name="System_Notification" visible="false"/> <icon left="12" top="144" width="20" height="20" name="attachment_icon_exp" tool_tip="Attachment" image_name="Icon_Attachment_Large" follows="left" mouse_opaque="true" visible="false"/> </layout_panel> - <layout_panel width="230" height="196" orientation="horizontal" follows="left|top|right|bottom" name="layout_panel_middle_exp"> + <layout_panel width="230" height="196" follows="left|top|right|bottom" name="layout_panel_middle_exp"> <panel border="false" top="0" width="230" height="196" bevel_style="none" follows="left|top|right|bottom" layout="topleft" name="main_info_panel_expanded"> <panel border="false" top="0" left="0" width="230" height="30" bevel_style="none" follows="left|top|right" layout="topleft" name="notification_title_panel_exp" > <text allow_scroll="false" font="SansSerif" top="6" left="0" width="233" height="10" layout="topleft" follows="right|left" text_color="White" @@ -128,7 +127,7 @@ </panel> </panel> </layout_panel> - <layout_panel width="18" orientation="horizontal" follows="right|top|bottom" name="layout_panel_left_exp"> + <layout_panel width="18" follows="right|top|bottom" name="layout_panel_left_exp"> <panel top="0" left="0" width="17" follows="left|top|right|bottom" layout="topleft" name="close_expand_panel_exp"> <button top="0" left="2" width="17" height="17" layout="topleft" follows="top" name="close_expanded_btn" mouse_opaque="true" tab_stop="false" image_unselected="Icon_Close_Foreground" image_selected="Icon_Close_Press" /> diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 4fb8b9a67f..2cb06d6877 100755 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -53,6 +53,9 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M <string name="AltMiniMapToolTipMsg" value="[REGION](Double-click to teleport, shift-drag to pan)"/> + <string + name="GroupCountWithInfo" + value="You belong to [COUNT] groups, and can join [REMAINING] more. [secondlife:/// Want more?]"/> <tab_container bottom="-10" follows="all" @@ -506,7 +509,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M left="3" use_ellipses="true" name="groupcount"> - You belong to [COUNT] groups, and can join [REMAINING] more. [secondlife:/// Want more?] + You belong to [COUNT] groups, and can join [REMAINING] more. </text> <group_list allow_select="true" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index b201e071ef..45b2b6ec27 100755 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -224,19 +224,6 @@ radio_style="false" width="400" top_pad="5"/> - <check_box - top_delta="4" - enabled="true" - follows="left|top" - height="14" - initial_value="false" - control_name="MediaEnablePopups" - label="Enable media browser pop-ups" - left_delta="0" - mouse_opaque="true" - name="media_popup_enabled" - width="400" - top_pad="5"/> <text type="string" length="1" 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 cb6b2fafd8..2dae1025ec 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" /> </combo_box> - <combo_box - height="23" - layout="topleft" - left_pad="10" - name="combobox mattype" - top_delta="0" - width="155"> - <combo_box.item - label="Texture (diffuse)" - name="Texture (diffuse)" - value="Texture (diffuse)" /> - <combo_box.item - label="Bumpiness (normal)" - name="Bumpiness (normal)" - value="Bumpiness (normal)" /> - <combo_box.item - label="Shininess (specular)" - name="Shininess (specular)" - value="Shininess (specular)" /> - </combo_box> + <radio_group + control_name="ComboMaterialType" + height="50" + layout="topleft" + left_pad="20" + top_delta="-10" + width="150" + visible = "false" + name="radio_material_type"> + <radio_item + label="Texture (diffuse)" + name="Texture (diffuse)" + top="0" + layout="topleft" + height="16" + value="0"/> + <radio_item + label="Bumpiness (normal)" + layout="topleft" + top_pad="1" + height="16" + name="Bumpiness (normal)" + value="1"/> + <radio_item + label="Shininess (specular)" + name="Shininess (specular)" + height="16" + layout="topleft" + top_pad="1" + value="2"/> + </radio_group> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -148,7 +159,7 @@ left="10" name="texture control" tool_tip="Click to choose a picture" - top_pad="8" + top_pad="7" width="64" /> <text type="string" @@ -350,7 +361,7 @@ name="label shininess" left_pad="10" text_readonly_color="LabelDisabledColor" - top_delta="6" + top_delta="4" width="90"> Shininess </text> @@ -394,7 +405,7 @@ left_delta="-100" name="label glossiness" text_readonly_color="LabelDisabledColor" - top_pad="8" + top_pad="7" width="116"> Glossiness </text> @@ -520,7 +531,7 @@ left="10" name="tex gen" text_readonly_color="LabelDisabledColor" - top_pad="60" + top_pad="46" width="140"> Mapping </text> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 4eb6e2462d..f2eddbb38e 100755 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -50,7 +50,7 @@ OpenGL Version: [OPENGL_VERSION] libcurl Version: [LIBCURL_VERSION] J2C Decoder Version: [J2C_VERSION] Audio Driver Version: [AUDIO_DRIVER_VERSION] -Qt Webkit Version: [QT_WEBKIT_VERSION] +LLCEFLib/CEF Version: [LLCEFLIB_VERSION] Voice Server Version: [VOICE_VERSION] </string> <string name="AboutTraffic">Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)</string> diff --git a/indra/newview/skins/default/xui/fr/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/fr/floater_animation_bvh_preview.xml index 84c40b5987..a20b8cdf72 100755 --- a/indra/newview/skins/default/xui/fr/floater_animation_bvh_preview.xml +++ b/indra/newview/skins/default/xui/fr/floater_animation_bvh_preview.xml @@ -141,35 +141,35 @@ La limite maximale est de [MAX_LENGTH] secondes. Expression </text> <combo_box name="emote_combo" tool_tip="Contrôle ce que fait le visage pendant l'animation."> - <item label="(Aucune)" name="[None]" value=""/> - <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/> - <item label="Effrayé" name="Afraid" value="Effrayé"/> - <item label="En colère" name="Angry" value="En colère"/> - <item label="Grand sourire" name="BigSmile" value="Grand sourire"/> - <item label="Ennui" name="Bored" value="Ennui"/> - <item label="Pleurer" name="Cry" value="Pleurer"/> - <item label="Mépris" name="Disdain" value="Mépris"/> - <item label="Gêne" name="Embarrassed" value="Gêne"/> - <item label="Froncer les sourcils" name="Frown" value="Froncer les sourcils"/> - <item label="Embrasser" name="Kiss" value="Embrasser"/> - <item label="Rire" name="Laugh" value="Rire"/> - <item label="Tirer la langue" name="Plllppt" value="Tirer la langue"/> - <item label="Dégoût" name="Repulsed" value="Dégoût"/> - <item label="Triste" name="Sad" value="Triste"/> - <item label="Hausser les épaules" name="Shrug" value="Hausser les épaules"/> - <item label="Sourire" name="Smile" value="Sourire"/> - <item label="Surprise" name="Surprise" value="Surprise"/> - <item label="Clin d'œil" name="Wink" value="Clin d'œil"/> - <item label="Inquiétude" name="Worry" value="Inquiétude"/> + <item label="(Aucune)" name="[None]"/> + <item label="Aaaaah" name="Aaaaah"/> + <item label="Effrayé" name="Afraid"/> + <item label="En colère" name="Angry"/> + <item label="Grand sourire" name="BigSmile"/> + <item label="Ennui" name="Bored"/> + <item label="Pleurer" name="Cry"/> + <item label="Mépris" name="Disdain"/> + <item label="Gêne" name="Embarrassed"/> + <item label="Froncer les sourcils" name="Frown"/> + <item label="Embrasser" name="Kiss"/> + <item label="Rire" name="Laugh"/> + <item label="Tirer la langue" name="Plllppt"/> + <item label="Dégoût" name="Repulsed"/> + <item label="Triste" name="Sad"/> + <item label="Hausser les épaules" name="Shrug"/> + <item label="Sourire" name="Smile"/> + <item label="Surprise" name="Surprise"/> + <item label="Clin d'œil" name="Wink"/> + <item label="Inquiétude" name="Worry"/> </combo_box> <text name="preview_label"> Aperçu </text> <combo_box name="preview_base_anim" tool_tip="Permet de tester le comportement de l'animation lorsque votre avatar effectue certaines actions courantes."> - <item label="Debout" name="Standing" value="Debout"/> - <item label="En marche" name="Walking" value="En marche"/> - <item label="Assis" name="Sitting" value="Assis"/> - <item label="En vol" name="Flying" value="En vol"/> + <item label="Debout" name="Standing"/> + <item label="En marche" name="Walking"/> + <item label="Assis" name="Sitting"/> + <item label="En vol" name="Flying"/> </combo_box> <spinner label="Transition début (s)" name="ease_in_time" tool_tip="Durée (en secondes) de l'entrée en fondu de l'animation."/> <spinner label="Transition fin (s)" name="ease_out_time" tool_tip="Durée (en secondes) de la sortie en fondu de l'animation."/> diff --git a/indra/newview/skins/default/xui/it/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/it/floater_animation_bvh_preview.xml index a4319f2e77..34ee9aaed5 100755 --- a/indra/newview/skins/default/xui/it/floater_animation_bvh_preview.xml +++ b/indra/newview/skins/default/xui/it/floater_animation_bvh_preview.xml @@ -141,35 +141,35 @@ La lunghezza massima dell'animazione è [MAX_LENGTH] secondi. Espressione </text> <combo_box name="emote_combo" tool_tip="Definisce ciò che fa il viso durante l'animazione"> - <item label="(Nulla)" name="[None]" value=""/> - <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/> - <item label="Spavento" name="Afraid" value="Spavento"/> - <item label="Arrabbiato" name="Angry" value="Arrabbiato"/> - <item label="Grande sorriso" name="BigSmile" value="Grande sorriso"/> - <item label="Annoiato" name="Bored" value="Annoiato"/> - <item label="Pianto" name="Cry" value="Pianto"/> - <item label="Disdegno" name="Disdain" value="Disdegno"/> - <item label="Imbarazzato" name="Embarrassed" value="Imbarazzato"/> - <item label="Accigliato" name="Frown" value="Accigliato"/> - <item label="Bacio" name="Kiss" value="Bacio"/> - <item label="Risata" name="Laugh" value="Risata"/> - <item label="Linguaccia" name="Plllppt" value="Linguaccia"/> - <item label="Repulsione" name="Repulsed" value="Repulsione"/> - <item label="Triste" name="Sad" value="Triste"/> - <item label="Scrollata di spalle" name="Shrug" value="Scrollata di spalle"/> - <item label="Sorriso" name="Smile" value="Sorriso"/> - <item label="Stupore" name="Surprise" value="Stupore"/> - <item label="Occhiolino" name="Wink" value="Occhiolino"/> - <item label="Preoccupato" name="Worry" value="Preoccupato"/> + <item label="(Nulla)" name="[None]"/> + <item label="Aaaaah" name="Aaaaah"/> + <item label="Spavento" name="Afraid" /> + <item label="Arrabbiato" name="Angry"/> + <item label="Grande sorriso" name="BigSmile"/> + <item label="Annoiato" name="Bored"/> + <item label="Pianto" name="Cry"/> + <item label="Disdegno" name="Disdain"/> + <item label="Imbarazzato" name="Embarrassed"/> + <item label="Accigliato" name="Frown"/> + <item label="Bacio" name="Kiss"/> + <item label="Risata" name="Laugh"/> + <item label="Linguaccia" name="Plllppt"/> + <item label="Repulsione" name="Repulsed"/> + <item label="Triste" name="Sad"/> + <item label="Scrollata di spalle" name="Shrug"/> + <item label="Sorriso" name="Smile"/> + <item label="Stupore" name="Surprise"/> + <item label="Occhiolino" name="Wink"/> + <item label="Preoccupato" name="Worry"/> </combo_box> <text name="preview_label"> Anteprima mentre </text> <combo_box name="preview_base_anim" tool_tip="Prova il comportamento dell'animazione mentre l'avatar esegue attività comuni."> - <item label="In piedi" name="Standing" value="In piedi"/> - <item label="Camminare" name="Walking" value="Camminare"/> - <item label="Seduto" name="Sitting" value="Seduto"/> - <item label="Volare" name="Flying" value="Volare"/> + <item label="In piedi" name="Standing"/> + <item label="Camminare" name="Walking"/> + <item label="Seduto" name="Sitting"/> + <item label="Volare" name="Flying"/> </combo_box> <spinner label="Transizione in ingresso (sec)" name="ease_in_time" tool_tip="Durata (in secondi) della fusione in entrata delle animazioni"/> <spinner label="Transizione in uscita (sec)" name="ease_out_time" tool_tip="Durata (in secondi) della fusione in uscita delle animazioni"/> diff --git a/indra/newview/skins/default/xui/ja/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/ja/floater_animation_bvh_preview.xml index f74bab3598..20c7298462 100755 --- a/indra/newview/skins/default/xui/ja/floater_animation_bvh_preview.xml +++ b/indra/newview/skins/default/xui/ja/floater_animation_bvh_preview.xml @@ -141,35 +141,35 @@ 表情 </text> <combo_box name="emote_combo" tool_tip="アニメーション再生中の顔の表情を決めます"> - <item label="(なし)" name="[None]" value=""/> - <item label="アーーーーー" name="Aaaaah" value="アーーーーー"/> - <item label="恐れる" name="Afraid" value="恐れる"/> - <item label="怒る" name="Angry" value="怒る"/> - <item label="満面の笑み" name="BigSmile" value="満面の笑み"/> - <item label="退屈" name="Bored" value="退屈"/> - <item label="泣く" name="Cry" value="泣く"/> - <item label="軽蔑" name="Disdain" value="軽蔑"/> - <item label="恥ずかしがる" name="Embarrassed" value="恥ずかしがる"/> - <item label="しかめっ面" name="Frown" value="しかめっ面"/> - <item label="キス" name="Kiss" value="キス"/> - <item label="笑う" name="Laugh" value="笑う"/> - <item label="むかつく" name="Plllppt" value="むかつく"/> - <item label="嫌悪感" name="Repulsed" value="嫌悪感"/> - <item label="悲しい" name="Sad" value="悲しい"/> - <item label="肩をすくめる" name="Shrug" value="肩をすくめる"/> - <item label="微笑む" name="Smile" value="微笑む"/> - <item label="驚く" name="Surprise" value="驚く"/> - <item label="ウィンク" name="Wink" value="ウィンク"/> - <item label="心配する" name="Worry" value="心配する"/> + <item label="(なし)" name="[None]"/> + <item label="アーーーーー" name="Aaaaah"/> + <item label="恐れる" name="Afraid"/> + <item label="怒る" name="Angry"/> + <item label="満面の笑み" name="BigSmile"/> + <item label="退屈" name="Bored"/> + <item label="泣く" name="Cry"/> + <item label="軽蔑" name="Disdain"/> + <item label="恥ずかしがる" name="Embarrassed"/> + <item label="しかめっ面" name="Frown"/> + <item label="キス" name="Kiss"/> + <item label="笑う" name="Laugh"/> + <item label="むかつく" name="Plllppt"/> + <item label="嫌悪感" name="Repulsed"/> + <item label="悲しい" name="Sad"/> + <item label="肩をすくめる" name="Shrug"/> + <item label="微笑む" name="Smile"/> + <item label="驚く" name="Surprise"/> + <item label="ウィンク" name="Wink"/> + <item label="心配する" name="Worry"/> </combo_box> <text name="preview_label"> プレビュー中の動作 </text> <combo_box name="preview_base_anim" tool_tip="これを使用して、アバターが一般的なアクションを実行している間にアニメーションの動作をテストします。"> - <item label="立つ" name="Standing" value="立つ"/> - <item label="歩く" name="Walking" value="歩く"/> - <item label="座る" name="Sitting" value="座る"/> - <item label="飛ぶ" name="Flying" value="飛ぶ"/> + <item label="立つ" name="Standing"/> + <item label="歩く" name="Walking"/> + <item label="座る" name="Sitting"/> + <item label="飛ぶ" name="Flying"/> </combo_box> <spinner label="イーズイン(秒)" name="ease_in_time" tool_tip="アニメーションのブレンドイン時間(秒)"/> <spinner label="イーズアウト(秒)" name="ease_out_time" tool_tip="アニメーションのブレンドアウト時間(秒)"/> diff --git a/indra/newview/skins/default/xui/pt/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/pt/floater_animation_bvh_preview.xml index 5cae581045..64515dfa61 100755 --- a/indra/newview/skins/default/xui/pt/floater_animation_bvh_preview.xml +++ b/indra/newview/skins/default/xui/pt/floater_animation_bvh_preview.xml @@ -141,35 +141,35 @@ A duração máxima da animação é de [MAX_LENGTH] segundos. Expressão </text> <combo_box name="emote_combo" tool_tip="Controla as expressões faciais durante a animação"> - <item label="(nenhum)" name="[None]" value=""/> - <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/> - <item label="Com medo" name="Afraid" value="Com medo"/> - <item label="Bravo" name="Angry" value="Bravo"/> - <item label="Sorriso contagiante" name="BigSmile" value="Sorriso contagiante"/> - <item label="À toa" name="Bored" value="À toa"/> - <item label="Chorar" name="Cry" value="Chorar"/> - <item label="Desdenho" name="Disdain" value="Desdenho"/> - <item label="Com vergonha" name="Embarrassed" value="Com vergonha"/> - <item label="Franzir testa" name="Frown" value="Franzir testa"/> - <item label="Beijo" name="Kiss" value="Beijo"/> - <item label="Rir" name="Laugh" value="Rir"/> - <item label="Mostrar a língua" name="Plllppt" value="Mostrar a língua"/> - <item label="Asco" name="Repulsed" value="Asco"/> - <item label="Triste" name="Sad" value="Triste"/> - <item label="Encolher os ombros" name="Shrug" value="Encolher os ombros"/> - <item label="Sorriso" name="Smile" value="Sorriso"/> - <item label="Surpresa" name="Surprise" value="Surpresa"/> - <item label="Piscar" name="Wink" value="Piscar"/> - <item label="Preocupado" name="Worry" value="Preocupado"/> + <item label="(nenhum)" name="[None]"/> + <item label="Aaaaah" name="Aaaaah"/> + <item label="Com medo" name="Afraid"/> + <item label="Bravo" name="Angry"/> + <item label="Sorriso contagiante" name="BigSmile"/> + <item label="À toa" name="Bored"/> + <item label="Chorar" name="Cry"/> + <item label="Desdenho" name="Disdain"/> + <item label="Com vergonha" name="Embarrassed"/> + <item label="Franzir testa" name="Frown"/> + <item label="Beijo" name="Kiss"/> + <item label="Rir" name="Laugh"/> + <item label="Mostrar a língua" name="Plllppt"/> + <item label="Asco" name="Repulsed"/> + <item label="Triste" name="Sad"/> + <item label="Encolher os ombros" name="Shrug"/> + <item label="Sorriso" name="Smile"/> + <item label="Surpresa" name="Surprise"/> + <item label="Piscar" name="Wink"/> + <item label="Preocupado" name="Worry"/> </combo_box> <text name="preview_label"> Visualizar enquanto </text> <combo_box name="preview_base_anim" tool_tip="Use para testar o comportamento de sua animação enquanto seu avatar executa ações comuns."> - <item label="Em pé" name="Standing" value="Em pé"/> - <item label="Andar" name="Walking" value="Andar"/> - <item label="Sentado" name="Sitting" value="Sentado"/> - <item label="Voar" name="Flying" value="Voar"/> + <item label="Em pé" name="Standing"/> + <item label="Andar" name="Walking"/> + <item label="Sentado" name="Sitting"/> + <item label="Voar" name="Flying"/> </combo_box> <spinner label="Aproximação (seg)" name="ease_in_time" tool_tip="Tempo (em segundos) da transição inicial da animação"/> <spinner label="Afastamento (seg)" name="ease_out_time" tool_tip="Tempo (em segundos) da transição de saída da animação"/> diff --git a/indra/newview/skins/default/xui/ru/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/ru/floater_animation_bvh_preview.xml index 8ad9d8657a..d709987147 100755 --- a/indra/newview/skins/default/xui/ru/floater_animation_bvh_preview.xml +++ b/indra/newview/skins/default/xui/ru/floater_animation_bvh_preview.xml @@ -141,35 +141,35 @@ Выражение лица </text> <combo_box name="emote_combo" tool_tip="Контролирует выражение лица во время анимации"> - <item label="(нет)" name="[None]" value=""/> - <item label="Ааааах" name="Aaaaah" value="Ааааах"/> - <item label="Боится" name="Afraid" value="Боится"/> - <item label="Злится" name="Angry" value="Злится"/> - <item label="Широко улыбается" name="BigSmile" value="Широко улыбается"/> - <item label="Скучает" name="Bored" value="Скучает"/> - <item label="Плачет" name="Cry" value="Плачет"/> - <item label="Презирает" name="Disdain" value="Презирает"/> - <item label="Смущается" name="Embarrassed" value="Смущается"/> - <item label="Хмурится" name="Frown" value="Хмурится"/> - <item label="Целует" name="Kiss" value="Целует"/> - <item label="Смеется" name="Laugh" value="Смеется"/> - <item label="Дразнится" name="Plllppt" value="Дразнится"/> - <item label="Не соглашается" name="Repulsed" value="Не соглашается"/> - <item label="Грустит" name="Sad" value="Грустит"/> - <item label="Не понимает" name="Shrug" value="Не понимает"/> - <item label="Улыбается" name="Smile" value="Улыбается"/> - <item label="Удивляется" name="Surprise" value="Удивляется"/> - <item label="Подмигивает" name="Wink" value="Подмигивает"/> - <item label="Беспокоится" name="Worry" value="Беспокоится"/> + <item label="(нет)" name="[None]"/> + <item label="Ааааах" name="Aaaaah"/> + <item label="Боится" name="Afraid"/> + <item label="Злится" name="Angry"/> + <item label="Широко улыбается" name="BigSmile"/> + <item label="Скучает" name="Bored"/> + <item label="Плачет" name="Cry"/> + <item label="Презирает" name="Disdain"/> + <item label="Смущается" name="Embarrassed"/> + <item label="Хмурится" name="Frown"/> + <item label="Целует" name="Kiss"/> + <item label="Смеется" name="Laugh"/> + <item label="Дразнится" name="Plllppt"/> + <item label="Не соглашается" name="Repulsed"/> + <item label="Грустит" name="Sad"/> + <item label="Не понимает" name="Shrug"/> + <item label="Улыбается" name="Smile"/> + <item label="Удивляется" name="Surprise"/> + <item label="Подмигивает" name="Wink"/> + <item label="Беспокоится" name="Worry"/> </combo_box> <text name="preview_label"> Просмотр во время </text> <combo_box name="preview_base_anim" tool_tip="Просмотр вашей анимации во время выполнения аватаром действий."> - <item label="Стояние" name="Standing" value="Стояние"/> - <item label="Ходьба" name="Walking" value="Ходьба"/> - <item label="Сидение" name="Sitting" value="Сидение"/> - <item label="Полет" name="Flying" value="Полет"/> + <item label="Стояние" name="Standing"/> + <item label="Ходьба" name="Walking"/> + <item label="Сидение" name="Sitting"/> + <item label="Полет" name="Flying"/> </combo_box> <spinner label="Вход (сек.)" name="ease_in_time" tool_tip="Количество времени (в секундах) для входа в стартовое положение"/> <spinner label="Выход (сек.)" name="ease_out_time" tool_tip="Количество времени (в секундах) для выхода из анимации"/> diff --git a/indra/newview/skins/default/xui/tr/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/tr/floater_animation_bvh_preview.xml index f8800c674d..c4e2fd2a93 100755 --- a/indra/newview/skins/default/xui/tr/floater_animation_bvh_preview.xml +++ b/indra/newview/skins/default/xui/tr/floater_animation_bvh_preview.xml @@ -141,35 +141,35 @@ Maksimum animasyon uzunluğu [LENGTH] saniye. İfade </text> <combo_box name="emote_combo" tool_tip="Yüzün animasyon sırasındaki ifadesini kontrol eder"> - <item label="(Hiçbiri)" name="[None]" value=""/> - <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/> - <item label="Korkmuş" name="Afraid" value="Korkmuş"/> - <item label="Kızgın" name="Angry" value="Kızgın"/> - <item label="Yaygın Gülümseyiş" name="BigSmile" value="Yaygın Gülümseyiş"/> - <item label="Canı Sıkılmış" name="Bored" value="Canı Sıkılmış"/> - <item label="Ağlama" name="Cry" value="Ağlama"/> - <item label="Dudak Bükme" name="Disdain" value="Dudak Bükme"/> - <item label="Utanmış" name="Embarrassed" value="Utanmış"/> - <item label="Kaş Çatma" name="Frown" value="Kaş Çatma"/> - <item label="Öpücük" name="Kiss" value="Öpücük"/> - <item label="Gülme" name="Laugh" value="Gülme"/> - <item label="Kahkaha" name="Plllppt" value="Kahkaha"/> - <item label="Tiksinmiş" name="Repulsed" value="Tiksinmiş"/> - <item label="Üzgün" name="Sad" value="Üzgün"/> - <item label="Omuz Silkme" name="Shrug" value="Omuz Silkme"/> - <item label="Gülümseme" name="Smile" value="Gülümseme"/> - <item label="Sürpriz" name="Surprise" value="Sürpriz"/> - <item label="Göz Kırpma" name="Wink" value="Göz Kırpma"/> - <item label="Endişelenme" name="Worry" value="Endişelenme"/> + <item label="(Hiçbiri)" name="[None]"/> + <item label="Aaaaah" name="Aaaaah"/> + <item label="Korkmuş" name="Afraid"/> + <item label="Kızgın" name="Angry"/> + <item label="Yaygın Gülümseyiş" name="BigSmile"/> + <item label="Canı Sıkılmış" name="Bored"/> + <item label="Ağlama" name="Cry"/> + <item label="Dudak Bükme" name="Disdain"/> + <item label="Utanmış" name="Embarrassed"/> + <item label="Kaş Çatma" name="Frown"/> + <item label="Öpücük" name="Kiss"/> + <item label="Gülme" name="Laugh"/> + <item label="Kahkaha" name="Plllppt"/> + <item label="Tiksinmiş" name="Repulsed"/> + <item label="Üzgün" name="Sad"/> + <item label="Omuz Silkme" name="Shrug"/> + <item label="Gülümseme" name="Smile"/> + <item label="Sürpriz" name="Surprise"/> + <item label="Göz Kırpma" name="Wink"/> + <item label="Endişelenme" name="Worry"/> </combo_box> <text name="preview_label"> Şu sırada önizle </text> <combo_box name="preview_base_anim" tool_tip="Animasyon davranışınızı avatarınız genel hareketleri yaparken test etmek için bunu kullanın."> - <item label="Ayakta Duruyor" name="Standing" value="Ayakta Duruyor"/> - <item label="Yürüyor" name="Walking" value="Yürüyor"/> - <item label="Oturuyor" name="Sitting" value="Oturuyor"/> - <item label="Uçuyor" name="Flying" value="Uçuyor"/> + <item label="Ayakta Duruyor" name="Standing"/> + <item label="Yürüyor" name="Walking"/> + <item label="Oturuyor" name="Sitting"/> + <item label="Uçuyor" name="Flying"/> </combo_box> <spinner label="Yavaş Başlangıç (saniye)" name="ease_in_time" tool_tip="Animasyonun kaynaştığı süre (saniye olarak)"/> <spinner label="Yavaş Bitiş (saniye)" name="ease_out_time" tool_tip="Animasyonun ayrıştığı süre (saniye olarak)"/> diff --git a/indra/newview/skins/default/xui/zh/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/zh/floater_animation_bvh_preview.xml index ffb0de8a68..756cca825d 100755 --- a/indra/newview/skins/default/xui/zh/floater_animation_bvh_preview.xml +++ b/indra/newview/skins/default/xui/zh/floater_animation_bvh_preview.xml @@ -141,35 +141,35 @@ 表情 </text> <combo_box name="emote_combo" tool_tip="控制動作演繹時臉部的姿態"> - <item label="(無)" name="[None]" value=""/> - <item label="張口吶喊貌" name="Aaaaah" value="張口吶喊貌"/> - <item label="害怕" name="Afraid" value="害怕"/> - <item label="生氣" name="Angry" value="生氣"/> - <item label="燦爛笑容" name="BigSmile" value="燦爛笑容"/> - <item label="無聊" name="Bored" value="無聊"/> - <item label="哭泣" name="Cry" value="哭泣"/> - <item label="鄙視" name="Disdain" value="鄙視"/> - <item label="尷尬" name="Embarrassed" value="尷尬"/> - <item label="皺眉" name="Frown" value="皺眉"/> - <item label="親吻" name="Kiss" value="親吻"/> - <item label="笑" name="Laugh" value="笑"/> - <item label="嫌惡貌" name="Plllppt" value="嫌惡貌"/> - <item label="作噁" name="Repulsed" value="作噁"/> - <item label="傷心" name="Sad" value="傷心"/> - <item label="聳聳肩" name="Shrug" value="聳聳肩"/> - <item label="微笑" name="Smile" value="微笑"/> - <item label="驚喜" name="Surprise" value="驚喜"/> - <item label="眨眼" name="Wink" value="眨眼"/> - <item label="擔心" name="Worry" value="擔心"/> + <item label="(無)" name="[None]"/> + <item label="張口吶喊貌" name="Aaaaah"/> + <item label="害怕" name="Afraid"/> + <item label="生氣" name="Angry"/> + <item label="燦爛笑容" name="BigSmile"/> + <item label="無聊" name="Bored"/> + <item label="哭泣" name="Cry"/> + <item label="鄙視" name="Disdain"/> + <item label="尷尬" name="Embarrassed"/> + <item label="皺眉" name="Frown"/> + <item label="親吻" name="Kiss"/> + <item label="笑" name="Laugh"/> + <item label="嫌惡貌" name="Plllppt"/> + <item label="作噁" name="Repulsed"/> + <item label="傷心" name="Sad"/> + <item label="聳聳肩" name="Shrug"/> + <item label="微笑" name="Smile"/> + <item label="驚喜" name="Surprise"/> + <item label="眨眼" name="Wink"/> + <item label="擔心" name="Worry"/> </combo_box> <text name="preview_label"> 預覽… </text> <combo_box name="preview_base_anim" tool_tip="用這個來測試你的化身從一般動作轉入動作演繹時的情況。"> - <item label="站立" name="Standing" value="站立"/> - <item label="步行中" name="Walking" value="步行中"/> - <item label="坐著" name="Sitting" value="坐著"/> - <item label="飛行" name="Flying" value="飛行"/> + <item label="站立" name="Standing"/> + <item label="步行中" name="Walking"/> + <item label="坐著" name="Sitting"/> + <item label="飛行" name="Flying"/> </combo_box> <spinner label="淡入(秒)" name="ease_in_time" tool_tip="動作攙混植入的時間長度(秒)"/> <spinner label="淡出(秒)" name="ease_out_time" tool_tip="動作攙混淡出的時間長度(秒)"/> diff --git a/indra/newview/tests/llmediadataclient_test.cpp b/indra/newview/tests/llmediadataclient_test.cpp index 6f57daf151..7cb4aeb121 100755 --- a/indra/newview/tests/llmediadataclient_test.cpp +++ b/indra/newview/tests/llmediadataclient_test.cpp @@ -26,7 +26,7 @@ #include "linden_common.h" #include "../llviewerprecompiledheaders.h" - + #include <iostream> #include "../test/lltut.h" diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index cae6bded9f..f7992dba90 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -340,9 +340,9 @@ class Windows_i686_Manifest(ViewerManifest): self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) # Plugin host application - # The current slplugin package places slplugin.exe right into the - # packages base directory. - self.path2basename(pkgdir, "slplugin.exe") + self.path2basename(os.path.join(os.pardir, + 'llplugin', 'slplugin', self.args['configuration']), + "slplugin.exe") self.path2basename("../viewer_components/updater/scripts/windows", "update_install.bat") # Get shared libs from the shared libs staging directory @@ -428,54 +428,121 @@ class Windows_i686_Manifest(ViewerManifest): self.path("featuretable_xp.txt") # Media plugins - QuickTime - # Media plugins - WebKit/Qt - if self.prefix(src=os.path.join(pkgdir, "llplugin"), dst="llplugin"): + if self.prefix(src='../media_plugins/quicktime/%s' % self.args['configuration'], dst="llplugin"): self.path("media_plugin_quicktime.dll") - self.path("media_plugin_webkit.dll") - self.path("qtcore4.dll") - self.path("qtgui4.dll") - self.path("qtnetwork4.dll") - self.path("qtopengl4.dll") - self.path("qtwebkit4.dll") - self.path("qtxmlpatterns4.dll") - - # For WebKit/Qt plugin runtimes (image format plugins) - if self.prefix(src="imageformats", dst="imageformats"): - self.path("qgif4.dll") - self.path("qico4.dll") - self.path("qjpeg4.dll") - self.path("qmng4.dll") - self.path("qsvg4.dll") - self.path("qtiff4.dll") - self.end_prefix() - - # For WebKit/Qt plugin runtimes (codec/character encoding plugins) - if self.prefix(src="codecs", dst="codecs"): - self.path("qcncodecs4.dll") - self.path("qjpcodecs4.dll") - self.path("qkrcodecs4.dll") - self.path("qtwcodecs4.dll") - self.end_prefix() + self.end_prefix() - self.end_prefix() + # Media plugins - CEF + if self.prefix(src='../media_plugins/cef/%s' % self.args['configuration'], dst="llplugin"): + self.path("media_plugin_cef.dll") + self.end_prefix() # winmm.dll shim if self.prefix(src='../media_plugins/winmmshim/%s' % self.args['configuration'], dst=""): self.path("winmm.dll") self.end_prefix() + # CEF runtime files - debug if self.args['configuration'].lower() == 'debug': - if self.prefix(src=debpkgdir, dst="llplugin"): - self.path("libeay32.dll") - self.path("ssleay32.dll") + if self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'debug'), dst="llplugin"): + self.path("d3dcompiler_43.dll") + self.path("d3dcompiler_47.dll") + self.path("libcef.dll") + self.path("libEGL.dll") + self.path("libGLESv2.dll") + self.path("llceflib_host.exe") + self.path("natives_blob.bin") + self.path("snapshot_blob.bin") + self.path("widevinecdmadapter.dll") + self.path("wow_helper.exe") self.end_prefix() - else: - if self.prefix(src=relpkgdir, dst="llplugin"): - self.path("libeay32.dll") - self.path("ssleay32.dll") + # CEF runtime files - not debug (release, relwithdebinfo etc.) + if self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="llplugin"): + self.path("d3dcompiler_43.dll") + self.path("d3dcompiler_47.dll") + self.path("libcef.dll") + self.path("libEGL.dll") + self.path("libGLESv2.dll") + self.path("llceflib_host.exe") + self.path("natives_blob.bin") + self.path("snapshot_blob.bin") + self.path("widevinecdmadapter.dll") + self.path("wow_helper.exe") self.end_prefix() + # MSVC DLLs needed for CEF and have to be in same directory as plugin + if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', 'Release'), dst="llplugin"): + self.path("msvcp120.dll") + self.path("msvcr120.dll") + self.end_prefix() + + # CEF files common to all configurations + if self.prefix(src=os.path.join(os.pardir, 'packages', 'resources'), dst="llplugin"): + self.path("cef.pak") + self.path("cef_100_percent.pak") + self.path("cef_200_percent.pak") + self.path("cef_extensions.pak") + self.path("devtools_resources.pak") + self.path("icudtl.dat") + self.end_prefix() + + if self.prefix(src=os.path.join(os.pardir, 'packages', 'resources', 'locales'), dst=os.path.join('llplugin', 'locales')): + self.path("am.pak") + self.path("ar.pak") + self.path("bg.pak") + self.path("bn.pak") + self.path("ca.pak") + self.path("cs.pak") + self.path("da.pak") + self.path("de.pak") + self.path("el.pak") + self.path("en-GB.pak") + self.path("en-US.pak") + self.path("es-419.pak") + self.path("es.pak") + self.path("et.pak") + self.path("fa.pak") + self.path("fi.pak") + self.path("fil.pak") + self.path("fr.pak") + self.path("gu.pak") + self.path("he.pak") + self.path("hi.pak") + self.path("hr.pak") + self.path("hu.pak") + self.path("id.pak") + self.path("it.pak") + self.path("ja.pak") + self.path("kn.pak") + self.path("ko.pak") + self.path("lt.pak") + self.path("lv.pak") + self.path("ml.pak") + self.path("mr.pak") + self.path("ms.pak") + self.path("nb.pak") + self.path("nl.pak") + self.path("pl.pak") + self.path("pt-BR.pak") + self.path("pt-PT.pak") + self.path("ro.pak") + self.path("ru.pak") + self.path("sk.pak") + self.path("sl.pak") + self.path("sr.pak") + self.path("sv.pak") + self.path("sw.pak") + self.path("ta.pak") + self.path("te.pak") + self.path("th.pak") + self.path("tr.pak") + self.path("uk.pak") + self.path("vi.pak") + self.path("zh-CN.pak") + self.path("zh-TW.pak") + self.end_prefix() + # pull in the crash logger and updater from other projects # tag:"crash-logger" here as a cue to the exporter self.path(src='../win_crash_logger/%s/windows-crash-logger.exe' % self.args['configuration'], @@ -739,14 +806,13 @@ class Darwin_i386_Manifest(ViewerManifest): dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile) # our apps - for app_bld_dir, app in ((os.path.join(os.pardir, - "mac_crash_logger", - self.args['configuration']), - "mac-crash-logger.app"), + for app_bld_dir, app in (("mac_crash_logger", "mac-crash-logger.app"), # plugin launcher - (pkgdir, "SLPlugin.app"), + (os.path.join("llplugin", "slplugin"), "SLPlugin.app"), ): - self.path2basename(app_bld_dir, app) + self.path2basename(os.path.join(os.pardir, + app_bld_dir, self.args['configuration']), + app) # our apps dependencies on shared libs # for each app, for each dylib we collected in dylibs, @@ -759,46 +825,57 @@ class Darwin_i386_Manifest(ViewerManifest): symlinkf(src, dst) except OSError as err: print "Can't symlink %s -> %s: %s" % (src, dst, err) - # SLPlugin.app/Contents/Resources gets those Qt4 libraries it needs. - if self.prefix(src="", dst="SLPlugin.app/Contents/Resources"): - for libfile in ('libQtCore.4.dylib', - 'libQtCore.4.7.1.dylib', - 'libQtGui.4.dylib', - 'libQtGui.4.7.1.dylib', - 'libQtNetwork.4.dylib', - 'libQtNetwork.4.7.1.dylib', - 'libQtOpenGL.4.dylib', - 'libQtOpenGL.4.7.1.dylib', - 'libQtSvg.4.dylib', - 'libQtSvg.4.7.1.dylib', - 'libQtWebKit.4.dylib', - 'libQtWebKit.4.7.1.dylib', - 'libQtXml.4.dylib', - 'libQtXml.4.7.1.dylib'): - self.path2basename(relpkgdir, libfile) - self.end_prefix("SLPlugin.app/Contents/Resources") - - # Qt4 codecs go to llplugin. Not certain why but this is the first - # location probed according to dtruss so we'll go with that. - if self.prefix(src=os.path.join(pkgdir, "llplugin/codecs/"), dst="llplugin/codecs"): - self.path("libq*.dylib") - self.end_prefix("llplugin/codecs") - - # Similarly for imageformats. - if self.prefix(src=os.path.join(pkgdir, "llplugin/imageformats/"), dst="llplugin/imageformats"): - self.path("libq*.dylib") - self.end_prefix("llplugin/imageformats") - - # SLPlugin plugins proper - if self.prefix(src=os.path.join(pkgdir, "llplugin"), dst="llplugin"): - self.path("media_plugin_quicktime.dylib") - self.path("media_plugin_webkit.dylib") + + # LLCefLib helper apps go inside SLPlugin.app + if self.prefix(src="", dst="SLPlugin.app/Contents/Frameworks"): + for helperappfile in ('LLCefLib Helper.app', + 'LLCefLib Helper EH.app'): + self.path2basename(relpkgdir, helperappfile) + + pluginframeworkpath = self.dst_path_of('Chromium Embedded Framework.framework'); + + self.end_prefix() + + # SLPlugin plugins + if self.prefix(src="", dst="llplugin"): + self.path2basename("../media_plugins/quicktime/" + self.args['configuration'], + "media_plugin_quicktime.dylib") + self.path2basename("../media_plugins/cef/" + self.args['configuration'], + "media_plugin_cef.dylib") self.end_prefix("llplugin") self.end_prefix("Resources") + # CEF framework goes inside Second Life.app/Contents/Frameworks + if self.prefix(src="", dst="Frameworks"): + frameworkfile="Chromium Embedded Framework.framework" + self.path2basename(relpkgdir, frameworkfile) + self.end_prefix("Frameworks") + + # This code constructs a relative path from the + # target framework folder back to the location of the symlink. + # It needs to be relative so that the symlink still works when + # (as is normal) the user moves the app bunlde out of the DMG + # and into the /Applications folder. Note we also call 'raise' + # to terminate the process if we get an error since without + # this symlink, Second Life web media can't possibly work. + # Real Framework folder: + # Second Life.app/Contents/Frameworks/Chromium Embedded Framework.framework/ + # Location of symlink and why it'ds relavie + # Second Life.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework/ + frameworkpath = os.path.join(os.pardir, os.pardir, os.pardir, os.pardir, "Frameworks", "Chromium Embedded Framework.framework") + try: + symlinkf(frameworkpath, pluginframeworkpath) + except OSError as err: + print "Can't symlink %s -> %s: %s" % (frameworkpath, pluginframeworkpath, err) + raise + self.end_prefix("Contents") + # fix up media_plugin.dylib so it knows where to look for CEF files it needs + self.run_command('install_name_tool -change "@executable_path/Chromium Embedded Framework" "@executable_path/../Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%(config)s/Second Life.app/Contents/Resources/llplugin/media_plugin_cef.dylib"' % + { 'config' : self.args['configuration'] }) + # NOTE: the -S argument to strip causes it to keep enough info for # annotated backtraces (i.e. function names in the crash log). 'strip' with no # arguments yields a slightly smaller binary but makes crash logs mostly useless. @@ -808,7 +885,6 @@ class Darwin_i386_Manifest(ViewerManifest): self.run_command('strip -S %(viewer_binary)r' % { 'viewer_binary' : self.dst_path_of('Contents/MacOS/Second Life')}) - def copy_finish(self): # Force executable permissions to be set for scripts # see CHOP-223 and http://mercurial.selenic.com/bts/issue1802 @@ -985,7 +1061,7 @@ class LinuxManifest(ViewerManifest): if self.prefix(src="", dst="bin"): self.path("secondlife-bin","do-not-directly-run-secondlife-bin") self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin") - self.path2basename(pkgdir, "SLPlugin") + self.path2basename("../llplugin/slplugin", "SLPlugin") self.path2basename("../viewer_components/updater/scripts/linux", "update_install") self.end_prefix("bin") @@ -1005,9 +1081,8 @@ class LinuxManifest(ViewerManifest): self.end_prefix(icon_path) # plugins - if self.prefix(src=os.path.join(pkgdir, "llplugin"), dst="bin/llplugin"): - self.path("libmedia_plugin_webkit.so") - self.path("libmedia_plugin_gstreamer.so") + if self.prefix(src="", dst="bin/llplugin"): + self.path("../media_plugins/gstreamer010/libmedia_plugin_gstreamer010.so", "libmedia_plugin_gstreamer.so") self.end_prefix("bin/llplugin") # llcommon @@ -1147,37 +1222,6 @@ class Linux_i686_Manifest(LinuxManifest): self.path("libvivoxplatform.so") self.end_prefix("lib") - # plugin runtime - if self.prefix(src=os.path.join(pkgdir, "lib"), dst="lib"): - self.path("libQtCore.so*") - self.path("libQtGui.so*") - self.path("libQtNetwork.so*") - self.path("libQtOpenGL.so*") - self.path("libQtSvg.so*") - self.path("libQtWebKit.so*") - self.path("libQtXml.so*") - self.end_prefix("lib") - - # For WebKit/Qt plugin runtimes (image format plugins) - if self.prefix(src=os.path.join(pkgdir, "llplugin", "imageformats"), - dst="bin/llplugin/imageformats"): - self.path("libqgif.so") - self.path("libqico.so") - self.path("libqjpeg.so") - self.path("libqmng.so") - self.path("libqsvg.so") - self.path("libqtiff.so") - self.end_prefix("bin/llplugin/imageformats") - - # For WebKit/Qt plugin runtimes (codec/character encoding plugins) - if self.prefix(src=os.path.join(pkgdir, "llplugin", "codecs"), - dst="bin/llplugin/codecs"): - self.path("libqcncodecs.so") - self.path("libqjpcodecs.so") - self.path("libqkrcodecs.so") - self.path("libqtwcodecs.so") - self.end_prefix("bin/llplugin/codecs") - self.strip_binaries() |