diff options
Diffstat (limited to 'indra/newview')
668 files changed, 18422 insertions, 18849 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index d0496b193b..0836b1de8c 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -10,9 +10,9 @@ include(DirectX) include(OpenSSL) include(DragDrop) include(EXPAT) -include(FMOD) +include(FMODEX) include(OPENAL) -include(FindOpenGL) +include(OpenGL) include(Hunspell) include(JsonCpp) include(LLAudio) @@ -46,12 +46,17 @@ include(LLLogin) include(VisualLeakDetector) include(GLOD) include(CMakeCopyIfDifferent) +include(LLAppearance) if (NOT HAVOK_TPV) # When using HAVOK_TPV, the library is precompiled, so no need for this add_subdirectory(${LLPHYSICSEXTENSIONS_SRC_DIR} llphysicsextensions) endif (NOT HAVOK_TPV) +if(FMODEX) + include_directories(${FMODEX_INCLUDE_DIR}) +endif(FMODEX) + include_directories( ${DBUSGLIB_INCLUDE_DIRS} ${JSONCPP_INCLUDE_DIR} @@ -61,13 +66,11 @@ include_directories( ${LLCOMMON_INCLUDE_DIRS} ${LLCOREHTTP_INCLUDE_DIRS} ${LLPHYSICS_INCLUDE_DIRS} - ${FMOD_INCLUDE_DIR} ${LLIMAGE_INCLUDE_DIRS} ${LLKDU_INCLUDE_DIRS} ${LLINVENTORY_INCLUDE_DIRS} ${LLMATH_INCLUDE_DIRS} ${LLMESSAGE_INCLUDE_DIRS} - ${LLPHYSICSEXTENSIONS_INCLUDE_DIRS} ${LLPLUGIN_INCLUDE_DIRS} ${LLPRIMITIVE_INCLUDE_DIRS} ${LLRENDER_INCLUDE_DIRS} @@ -83,6 +86,13 @@ include_directories( ${LIBS_PREBUILD_DIR}/include/hunspell ${OPENAL_LIB_INCLUDE_DIRS} ${LIBS_PREBUILT_DIR}/include/collada/1.4 + ${LLAPPEARANCE_INCLUDE_DIRS} + ) + +include_directories(SYSTEM + ${LLCOMMON_SYSTEM_INCLUDE_DIRS} + ${LLXML_SYSTEM_INCLUDE_DIRS} + ${LLPHYSICSEXTENSIONS_INCLUDE_DIRS} ) set(viewer_SOURCE_FILES @@ -170,7 +180,6 @@ set(viewer_SOURCE_FILES lldrawpooltree.cpp lldrawpoolwater.cpp lldrawpoolwlsky.cpp - lldriverparam.cpp lldynamictexture.cpp llemote.cpp llenvmanager.cpp @@ -335,7 +344,6 @@ set(viewer_SOURCE_FILES lllistcontextmenu.cpp lllistview.cpp lllocalbitmaps.cpp - lllocaltextureobject.cpp lllocationhistory.cpp lllocationinputctrl.cpp lllogchat.cpp @@ -456,12 +464,11 @@ set(viewer_SOURCE_FILES llpersistentnotificationstorage.cpp llphysicsmotion.cpp llphysicsshapebuilderutil.cpp + llpipelinelistener.cpp llplacesinventorybridge.cpp llplacesinventorypanel.cpp llplacesfolderview.cpp llpopupview.cpp - llpolymesh.cpp - llpolymorph.cpp llpostcard.cpp llpreview.cpp llpreviewanim.cpp @@ -512,9 +519,6 @@ set(viewer_SOURCE_FILES llsyswellwindow.cpp llteleporthistory.cpp llteleporthistorystorage.cpp - lltexglobalcolor.cpp - lltexlayer.cpp - lltexlayerparams.cpp lltextureatlas.cpp lltextureatlasmanager.cpp lltexturecache.cpp @@ -612,18 +616,18 @@ set(viewer_SOURCE_FILES llviewershadermgr.cpp llviewerstats.cpp llviewerstatsrecorder.cpp + llviewertexlayer.cpp llviewertexteditor.cpp llviewertexture.cpp llviewertextureanim.cpp llviewertexturelist.cpp llviewerthrottle.cpp - llviewervisualparam.cpp + llviewerwearable.cpp llviewerwindow.cpp llviewerwindowlistener.cpp llvlcomposition.cpp llvlmanager.cpp llvoavatar.cpp - llvoavatardefines.cpp llvoavatarself.cpp llvocache.cpp llvograss.cpp @@ -644,10 +648,8 @@ set(viewer_SOURCE_FILES llwatchdog.cpp llwaterparammanager.cpp llwaterparamset.cpp - llwearable.cpp llwearableitemslist.cpp llwearablelist.cpp - llwearabletype.cpp llweb.cpp llwebprofile.cpp llwebsharing.cpp @@ -760,7 +762,6 @@ set(viewer_HEADER_FILES lldrawpooltree.h lldrawpoolwater.h lldrawpoolwlsky.h - lldriverparam.h lldynamictexture.h llemote.h llenvmanager.h @@ -924,7 +925,6 @@ set(viewer_HEADER_FILES lllistcontextmenu.h lllistview.h lllocalbitmaps.h - lllocaltextureobject.h lllocationhistory.h lllocationinputctrl.h lllogchat.h @@ -1034,11 +1034,10 @@ set(viewer_HEADER_FILES llpersistentnotificationstorage.h llphysicsmotion.h llphysicsshapebuilderutil.h + llpipelinelistener.h llplacesinventorybridge.h llplacesinventorypanel.h llplacesfolderview.h - llpolymesh.h - llpolymorph.h llpopupview.h llpostcard.h llpreview.h @@ -1092,9 +1091,6 @@ set(viewer_HEADER_FILES lltable.h llteleporthistory.h llteleporthistorystorage.h - lltexglobalcolor.h - lltexlayer.h - lltexlayerparams.h lltextureatlas.h lltextureatlasmanager.h lltexturecache.h @@ -1193,18 +1189,18 @@ set(viewer_HEADER_FILES llviewershadermgr.h llviewerstats.h llviewerstatsrecorder.h + llviewertexlayer.h llviewertexteditor.h llviewertexture.h llviewertextureanim.h llviewertexturelist.h llviewerthrottle.h - llviewervisualparam.h + llviewerwearable.h llviewerwindow.h llviewerwindowlistener.h llvlcomposition.h llvlmanager.h llvoavatar.h - llvoavatardefines.h llvoavatarself.h llvocache.h llvograss.h @@ -1225,10 +1221,8 @@ set(viewer_HEADER_FILES llwatchdog.h llwaterparammanager.h llwaterparamset.h - llwearable.h llwearableitemslist.h llwearablelist.h - llwearabletype.h llweb.h llwebprofile.h llwebsharing.h @@ -1548,27 +1542,10 @@ if (OPENAL) set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_OPENAL") endif (OPENAL) -if (FMOD) - set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_FMOD") - - if (DARWIN) - set(fmodwrapper_SOURCE_FILES fmodwrapper.cpp) - add_library(fmodwrapper SHARED ${fmodwrapper_SOURCE_FILES}) - set(fmodwrapper_needed_LIBRARIES ${FMOD_LIBRARY} ${CARBON_LIBRARY}) - set_target_properties( - fmodwrapper - PROPERTIES - BUILD_WITH_INSTALL_RPATH 1 - INSTALL_NAME_DIR "@executable_path/../Resources" - LINK_FLAGS "-unexported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/fmod_hidden_symbols.exp" - ) - set(FMODWRAPPER_LIBRARY fmodwrapper) - target_link_libraries(fmodwrapper ${fmodwrapper_needed_LIBRARIES}) - else (DARWIN) - # fmodwrapper unnecessary on linux or windows - set(FMODWRAPPER_LIBRARY ${FMOD_LIBRARY}) - endif (DARWIN) -endif (FMOD) +if (FMODEX) + set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_FMODEX") + set(FMODWRAPPER_LIBRARY ${FMODEX_LIBRARY}) +endif (FMODEX) set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}") @@ -1583,6 +1560,12 @@ add_executable(${VIEWER_BINARY_NAME} ${viewer_SOURCE_FILES} ) +if (SDL_FOUND) + set_property(TARGET ${VIEWER_BINARY_NAME} + PROPERTY COMPILE_DEFINITIONS LL_SDL=1 + ) +endif (SDL_FOUND) + # add package files file(GLOB EVENT_HOST_SCRIPT_GLOB_LIST ${CMAKE_CURRENT_SOURCE_DIR}/../viewer_components/*.py) @@ -1643,9 +1626,6 @@ if (WINDOWS) ${SHARED_LIB_STAGING_DIR}/Release/openjpeg.dll ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/openjpeg.dll ${SHARED_LIB_STAGING_DIR}/Debug/openjpegd.dll - ${SHARED_LIB_STAGING_DIR}/Release/fmod.dll - ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/fmod.dll - ${SHARED_LIB_STAGING_DIR}/Debug/fmod.dll ${SHARED_LIB_STAGING_DIR}/Release/msvcr100.dll ${SHARED_LIB_STAGING_DIR}/Release/msvcp100.dll ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcr100.dll @@ -1710,6 +1690,14 @@ if (WINDOWS) windows-updater ) + if (FMODEX) + list(APPEND COPY_INPUT_DEPENDENCIES + ${SHARED_LIB_STAGING_DIR}/Release/fmodex.dll + ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/fmodex.dll + ${SHARED_LIB_STAGING_DIR}/Debug/fmodexL.dll + ) + endif (FMODEX) + add_custom_command( OUTPUT ${CMAKE_CFG_INTDIR}/copy_touched.bat COMMAND ${PYTHON_EXECUTABLE} @@ -1868,6 +1856,7 @@ target_link_libraries(${VIEWER_BINARY_NAME} ${LLPHYSICS_LIBRARIES} ${LLPHYSICSEXTENSIONS_LIBRARIES} ${TCMALLOC_LIBRARIES} + ${LLAPPEARANCE_LIBRARIES} ) if (USE_KDU) @@ -2119,20 +2108,18 @@ if (LL_TESTS) set_source_files_properties( llworldmap.cpp - PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}" - ) - - set_source_files_properties( llworldmipmap.cpp PROPERTIES + LL_TEST_ADDITIONAL_SOURCE_FILES + tests/llviewertexture_stub.cpp + #llviewertexturelist.cpp LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}" ) set_source_files_properties( llmediadataclient.cpp PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}" + LL_TEST_ADDITIONAL_LIBRARIES "${LLPRIMITIVE_LIBRARIES}" ) set_source_files_properties( @@ -2147,11 +2134,26 @@ if (LL_TESTS) LL_TEST_ADDITIONAL_LIBRARIES "${BOOST_SYSTEM_LIBRARY}" ) + ################################################## + # DISABLING PRECOMPILED HEADERS USAGE FOR TESTS + ################################################## + # if(USE_PRECOMPILED_HEADERS) + # set_source_files_properties( + # ${viewer_TEST_SOURCE_FILES} + # PROPERTIES + # LL_TEST_ADDITIONAL_SOURCE_FILES llviewerprecompiledheaders.cpp + # ) + # endif(USE_PRECOMPILED_HEADERS) LL_ADD_PROJECT_UNIT_TESTS(${VIEWER_BINARY_NAME} "${viewer_TEST_SOURCE_FILES}") #set(TEST_DEBUG on) set(test_sources llcapabilitylistener.cpp) - + ################################################## + # DISABLING PRECOMPILED HEADERS USAGE FOR TESTS + ################################################## + # if(USE_PRECOMPILED_HEADERS) + # set(test_sources "${test_sources}" llviewerprecompiledheaders.cpp) + # endif(USE_PRECOMPILED_HEADERS) set(test_libs ${LLMESSAGE_LIBRARIES} ${WINDOWS_LIBRARIES} diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings index 5c7cacedec..774ade714b 100644 --- a/indra/newview/English.lproj/InfoPlist.strings +++ b/indra/newview/English.lproj/InfoPlist.strings @@ -2,6 +2,6 @@ CFBundleName = "Second Life"; -CFBundleShortVersionString = "Second Life version 2.1.0.13828"; -CFBundleGetInfoString = "Second Life version 2.1.0.13828, Copyright 2004-2009 Linden Research, Inc."; +CFBundleShortVersionString = "Second Life version 3.5.1.288888"; +CFBundleGetInfoString = "Second Life version 3.5.1.288888, Copyright 2004-2009 Linden Research, Inc."; diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist index f7b11b217c..035d6cbe6c 100644 --- a/indra/newview/Info-SecondLife.plist +++ b/indra/newview/Info-SecondLife.plist @@ -60,7 +60,7 @@ </dict> </array> <key>CFBundleVersion</key> - <string>2.1.0.13828</string> + <string>3.4.1.264760</string> <key>CSResourcesFileMapped</key> <true/> </dict> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c064b420f3..448fdaadba 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -291,6 +291,17 @@ <key>Value</key> <real>1.0</real> </map> + <key>AudioLevelUnderwaterRolloff</key> + <map> + <key>Comment</key> + <string>Controls the distance-based dropoff of audio volume underwater(fraction or multiple of default audio rolloff)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>5.0</real> + </map> <key>AudioLevelSFX</key> <map> <key>Comment</key> @@ -2004,6 +2015,39 @@ <key>Value</key> <string /> </map> + <key>DebugAvatarAppearanceMessage</key> + <map> + <key>Comment</key> + <string>Dump a bunch of XML files when handling appearance messages</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>DebugAvatarExperimentalServerAppearanceUpdate</key> + <map> + <key>Comment</key> + <string>Experiment with sending full cof_contents instead of cof_version</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>DebugAvatarAppearanceServiceURLOverride</key> + <map> + <key>Comment</key> + <string>URL to use for baked texture requests; overrides value returned by login server.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string /> + </map> <key>DebugAvatarRezTime</key> <map> <key>Comment</key> @@ -2026,6 +2070,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>DebugAvatarCompositeBaked</key> + <map> + <key>Comment</key> + <string>Colorize avatar meshes based on baked/composite state.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>DebugBeaconLineWidth</key> <map> <key>Comment</key> @@ -2037,6 +2092,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>DebugForceAppearanceRequestFailure</key> + <map> + <key>Comment</key> + <string>Request wrong cof version to test the failure path for server appearance update requests.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>DebugHideEmptySystemFolders</key> <map> <key>Comment</key> @@ -4370,6 +4436,28 @@ <key>Value</key> <real>1.0</real> </map> + <key>InventoryDebugSimulateOpFailureRate</key> + <map> + <key>Comment</key> + <string>Rate at which we simulate failures of copy/link requests in some operations</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.0</real> + </map> + <key>InventoryDebugSimulateLateOpRate</key> + <map> + <key>Comment</key> + <string>Rate at which we simulate late-completing copy/link requests in some operations</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.0</real> + </map> <key>InventoryDisplayInbox</key> <map> <key>Comment</key> @@ -8892,6 +8980,28 @@ <key>Value</key> <integer>1</integer> </map> + <key>DisableAllRenderTypes</key> + <map> + <key>Comment</key> + <string>Disables all rendering types.</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>DisableAllRenderFeatures</key> + <map> + <key>Comment</key> + <string>Disables all rendering features.</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>RenderHUDInSnapshot</key> <map> <key>Comment</key> @@ -13329,6 +13439,28 @@ <key>Value</key> <integer>-1</integer> </map> + <key>MaxFPS</key> + <map> + <key>Comment</key> + <string>Yield some time to the local host if we reach a threshold framerate.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <integer>-1.0</integer> + </map> + <key>ForcePeriodicRenderingTime</key> + <map> + <key>Comment</key> + <string>Periodically enable all rendering masks for a single frame.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <integer>-1.0</integer> + </map> <key>ZoomDirect</key> <map> <key>Comment</key> @@ -14314,5 +14446,60 @@ <key>Value</key> <integer>0</integer> </map> + <key>DisablePrecacheDelayAfterTeleporting</key> + <map> + <key>Comment</key> + <string>Disables the artificial delay in the viewer that precaches some incoming assets</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>FMODExProfilerEnable</key> + <map> + <key>Comment</key> + <string>Enable profiler tool if using FMOD Ex</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>FMODExDecodeBufferSize</key> + <map> + <key>Comment</key> + <string>Sets the streaming decode buffer size (in milliseconds)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>1000</integer> + </map> + <key>FMODExStreamBufferSize</key> + <map> + <key>Comment</key> + <string>Sets the streaming buffer size (in milliseconds)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>7000</integer> + </map> + <key>DisablePrecacheDelayAfterTeleporting</key> + <map> + <key>Comment</key> + <string>Disables the artificial delay in the viewer that precaches some incoming assets</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> </map> </llsd> diff --git a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl index f66ba1d2d9..a2a567eff1 100644 --- a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl @@ -28,6 +28,7 @@ uniform mat4 modelview_projection_matrix; ATTRIBUTE vec3 position; + void calcAtmospherics(vec3 inPositionEye); uniform vec2 d1; diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterAlphaMaskF.glsl index 99a6fe85fe..9c82056fd7 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterAlphaMaskF.glsl @@ -31,7 +31,7 @@ out vec4 frag_color; uniform float minimum_alpha; -vec4 diffuseLookup(vec2 texcoord); +/* vec4 diffuseLookup(vec2 texcoord); */ vec3 fullbrightAtmosTransport(vec3 light); vec4 applyWaterFog(vec4 color); diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl index df182168f3..d3dacf9bc4 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl @@ -32,7 +32,7 @@ out vec4 frag_color; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; -vec4 diffuseLookup(vec2 texcoord); +/* vec4 diffuseLookup(vec2 texcoord); */ vec3 fullbrightAtmosTransport(vec3 light); vec4 applyWaterFog(vec4 color); diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 99dbfcae51..41080818c9 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -1084,6 +1084,22 @@ scale="0 0 .5" /> </param_skeleton> </param> + <param + id="11001" + group="0" + name="Hover" + wearable="shape" + edit_group="shape_body" + edit_group_order="4" + label_min="Lower" + label_max="Higher" + value_min="-2" + value_max="2" + value_default="0" + camera_distance="2.5"> + <param_skeleton /> + </param> + </skeleton> <mesh @@ -12291,6 +12307,17 @@ render_pass="bump"> <param_driver /> </param> + <param + id="11000" + group="0" + name="AppearanceMessage_Version" + label="AppearanceMessage Version" + value_default="0" + value_min="0" + value_max="255"> + <param_driver /> + </param> + </driver_parameters> <morph_masks> diff --git a/indra/newview/fmod_hidden_symbols.exp b/indra/newview/fmod_hidden_symbols.exp deleted file mode 100644 index 1e790255bc..0000000000 --- a/indra/newview/fmod_hidden_symbols.exp +++ /dev/null @@ -1,240 +0,0 @@ -_CarbonSndPlayDoubleBuffer -_ConvertFromIeeeExtended -__book_maptype1_quantvals -__book_unquantize -__float32_pack -__float32_unpack -__ilog -__make_words -_lpc_clear -_lpc_init -__vorbis_block_alloc -__vorbis_block_ripcord -__vorbis_apply_window -__vorbis_window_get -_vorbis_analysis_blockout -_vorbis_analysis_buffer -_vorbis_analysis_wrote -_vorbis_block_clear -_vorbis_block_init -_vorbis_dsp_clear -_vorbis_synthesis_blockin -_vorbis_synthesis_init -_vorbis_synthesis_pcmout -_vorbis_synthesis_read -_vorbis_packet_blocksize -_vorbis_synthesis -_vorbis_book_clear -_vorbis_book_decode -_vorbis_book_decodev_add -_vorbis_book_decodev_set -_vorbis_book_decodevs_add -_vorbis_book_decodevv_add -_vorbis_book_init_decode -_vorbis_comment_add -_vorbis_comment_add_tag -_vorbis_comment_clear -_vorbis_comment_init -_vorbis_comment_query -_vorbis_comment_query_count -_vorbis_coslook -_vorbis_fromdBlook -_vorbis_info_blocksize -_vorbis_info_clear -_vorbis_info_init -_vorbis_invsq2explook -_vorbis_invsqlook -_vorbis_lpc_from_curve -_vorbis_lpc_from_data -_vorbis_lpc_predict -_vorbis_lsp_to_curve -_vorbis_staticbook_clear -_vorbis_staticbook_destroy -_vorbis_staticbook_unpack -_vorbis_synthesis_headerin -_vorbis_synthesis_lapout -_vorbis_synthesis_restart -_vorbis_synthesis_trackonly -_vorbis_window -_ogg_packet_clear -_ogg_page_bos -_ogg_page_checksum_set -_ogg_page_continued -_ogg_page_eos -_ogg_page_granulepos -_ogg_page_packets -_ogg_page_pageno -_ogg_page_serialno -_ogg_page_version -_ogg_stream_reset_serialno -_ogg_stream_clear -_ogg_stream_destroy -_ogg_stream_eos -_ogg_stream_flush -_ogg_stream_init -_ogg_stream_packetout -_ogg_stream_packetpeek -_ogg_stream_pagein -_ogg_stream_pageout -_ogg_stream_reset -_ogg_sync_buffer -_ogg_sync_clear -_ogg_sync_destroy -_ogg_sync_init -_ogg_sync_pageout -_ogg_sync_pageseek -_ogg_sync_reset -_ogg_sync_wrote -_ov_bitrate -_ov_bitrate_instant -_ov_clear -_ov_comment -_ov_info -_ov_open -_ov_open_callbacks -_ov_pcm_seek -_ov_pcm_seek_page -_ov_pcm_tell -_ov_pcm_total -_ov_raw_seek -_ov_raw_tell -_ov_raw_total -_ov_read -_ov_read_float -_ov_seekable -_ov_serialnumber -_ov_streams -_ov_test -_ov_test_callbacks -_ov_test_open -_ov_time_seek -_ov_time_seek_page -_ov_time_tell -_ov_time_total -_ogg_toupper -_oggpackB_adv -_oggpackB_adv1 -_oggpackB_bits -_oggpackB_bytes -_oggpackB_get_buffer -_oggpackB_look -_oggpackB_look1 -_oggpackB_read -_oggpackB_read1 -_oggpackB_readinit -_oggpackB_reset -_oggpack_adv -_oggpack_adv1 -_oggpack_bits -_oggpack_bytes -_oggpack_get_buffer -_oggpack_look -_oggpack_look1 -_oggpack_read -_oggpack_read1 -_oggpack_readinit -_oggpack_reset -_ov_crosslap -_ov_pcm_seek_lap -_ov_pcm_seek_page_lap -_ov_raw_seek_lap -_ov_time_seek_lap -_ov_time_seek_page_lap -_II_step_one -_II_step_two -_MyRecComp -_SampleRates -_Sinfo -_ValidStepIndex -__Z11fmodwrapperv -__Z11fmodwrapperv.eh -__floor_P -__mapping_P -__residue_P -__ve_envelope_clear -__ve_envelope_init -__ve_envelope_mark -__ve_envelope_search -__ve_envelope_shift -__vi_gpsy_free -__vi_psy_free -__vorbis_window_init -__vp_ampmax_decay -__vp_couple -__vp_global_free -__vp_global_look -__vp_noise_normalize -__vp_noise_normalize_sort -__vp_noisemask -__vp_offset_and_mix -__vp_psy_clear -__vp_psy_init -__vp_quantize_couple_memo -__vp_quantize_couple_sort -__vp_remove_floor -__vp_tonemask -_alloc_0 -_alloc_1 -_alloc_2 -_alloc_3 -_alloc_4 -_bandInfo -_cdcallback -_cdchannel -_cdmode -_cdnumtracks -_cdstream -_cdtrack -_drft_backward -_drft_clear -_drft_forward -_drft_init -_eatwhite -_floor0_exportbundle -_floor1_exportbundle -_gFreeList -_gNMRecBusy -_gNMRecPtr -_gSilenceOnes -_gSilenceTwos -_longLimit -_mapping0_exportbundle -_mdct_backward -_mdct_clear -_mdct_forward -_mdct_init -_muls -_mystrdup -_res0_free_info -_res0_free_look -_res0_inverse -_res0_look -_res0_unpack -_res1_class -_res1_inverse -_res2_inverse -_residue0_exportbundle -_residue1_exportbundle -_residue2_exportbundle -_scale -_shortLimit -_tabsel_123 -_F_Free -_F_Malloc -_F_ReAlloc -_F_memcmp -_F_memmove -_F_strcat -_F_strchr -_F_strcmp -_F_strcpy -_F_stricmp -_F_strlen -_F_strncat -_F_strncmp -_F_strncpy -_F_strnicmp -_F_strstr -_F_strupr -_F_tolower -_F_toupper diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt index 122577b132..c64e11929d 100644 --- a/indra/newview/gpu_table.txt +++ b/indra/newview/gpu_table.txt @@ -38,7 +38,7 @@ ATI 3D-Analyze .*ATI.*3D-Analyze.* 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 9xxx .*ATI.*All-in-Wonder 9.* 1 1 0 0 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 @@ -46,132 +46,162 @@ 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.*(ASUS|Radeon).*X13.* 2 1 1 2.1 -ATI Radeon X1500 .*ATI.*(ASUS|Radeon).*X15.* 2 1 1 2.1 -ATI Radeon X1600 .*ATI.*(ASUS|Radeon).*X16.* 2 1 1 2.1 -ATI Radeon X1700 .*ATI.*(ASUS|Radeon).*X17.* 2 1 1 2.1 -ATI Radeon X1800 .*ATI.*(Radeon|Diamond) X18.* ?.* 3 1 1 2.1 -ATI Radeon X1900 .*ATI.*(Radeon|Diamond|ASUS) X19.* ?.* 2 1 1 2.1 +ATI ASUS ARES .*ATI.*ASUS.*ARES.* 3 1 0 0 +ATI ASUS A9xxx .*ATI.*ASUS.*A9.* 1 1 0 0 +ATI ASUS AH24xx .*ATI.*ASUS.*AH24.* 1 1 1 3.3 +ATI ASUS AH26xx .*ATI.*ASUS.*AH26.* 1 1 1 3.3 +ATI ASUS AH34xx .*ATI.*ASUS.*AH34.* 1 1 1 3.3 +ATI ASUS AH36xx .*ATI.*ASUS.*AH36.* 1 1 1 3.3 +ATI ASUS AH46xx .*ATI.*ASUS.*AH46.* 2 1 1 3.3 +ATI ASUS AX3xx .*ATI.*ASUS.*AX3.* 1 1 0 0 +ATI ASUS AX5xx .*ATI.*ASUS.*AX5.* 1 1 0 0 +ATI ASUS AX8xx .*ATI.*ASUS.*AX8.* 2 1 0 0 +ATI ASUS EAH24xx .*ATI.*ASUS.*EAH24.* 2 1 0 0 +ATI ASUS EAH26xx .*ATI.*ASUS.*EAH26.* 3 1 0 0 +ATI ASUS EAH29xx .*ATI.*ASUS.*EAH29.* 3 1 0 0 +ATI ASUS EAH34xx .*ATI.*ASUS.*EAH34.* 1 1 0 0 +ATI ASUS EAH36xx .*ATI.*ASUS.*EAH36.* 2 1 0 0 +ATI ASUS EAH38xx .*ATI.*ASUS.*EAH38.* 2 1 1 3.3 +ATI ASUS EAH43xx .*ATI.*ASUS.*EAH43.* 2 1 1 3.3 +ATI ASUS EAH45xx .*ATI.*ASUS.*EAH45.* 2 1 0 0 +ATI ASUS EAH48xx .*ATI.*ASUS.*EAH48.* 3 1 1 3.3 +ATI ASUS EAH57xx .*ATI.*ASUS.*EAH57.* 3 1 1 4.1 +ATI ASUS EAH58xx .*ATI.*ASUS.*EAH58.* 5 1 1 4.1 +ATI ASUS EAH62xx .*ATI.*ASUS.*EAH62.* 2 1 0 0 +ATI ASUS EAH63xx .*ATI.*ASUS.*EAH63.* 2 1 0 0 +ATI ASUS EAH64xx .*ATI.*ASUS.*EAH64.* 2 1 0 0 +ATI ASUS EAH65xx .*ATI.*ASUS.*EAH65.* 2 1 0 4.1 +ATI ASUS EAH66xx .*ATI.*ASUS.*EAH66.* 3 1 0 4.1 +ATI ASUS EAH67xx .*ATI.*ASUS.*EAH67.* 3 1 0 0 +ATI ASUS EAH68xx .*ATI.*ASUS.*EAH68.* 5 1 0 4 +ATI ASUS EAH69xx .*ATI.*ASUS.*EAH69.* 5 1 0 4.1 +ATI ASUS Radeon X1xxx .*ATI.*ASUS.*X1.* 2 1 1 2.1 +ATI Radeon X7xx .*ATI.*ASUS.*X7.* 1 1 0 0 +ATI Radeon X19xx .*ATI.*(Radeon|Diamond) X19.* ?.* 2 1 1 2.1 +ATI Radeon X18xx .*ATI.*(Radeon|Diamond) X18.* ?.* 3 1 1 2.1 ATI Radeon X17xx .*ATI.*(Radeon|Diamond) X17.* ?.* 1 1 1 2.1 -ATI Radeon X16xx .*ATI.*(Radeon|Diamond) X17.* ?.* 1 1 1 2.1 -ATI Radeon X28xx .*ATI.*(Radeon|Diamond) X28.. ?.* 1 1 1 2.1 +ATI Radeon X16xx .*ATI.*(Radeon|Diamond) X16.* ?.* 1 1 1 2.1 +ATI Radeon X15xx .*ATI.*(Radeon|Diamond) X15.* ?.* 1 1 1 2.1 +ATI Radeon X13xx .*ATI.*(Radeon|Diamond) X13.* ?.* 1 1 1 2.1 +ATI Radeon X1xxx .*ATI.*(Radeon|Diamond) X1.. ?.* 0 1 1 2.1 +ATI Radeon X2xxx .*ATI.*(Radeon|Diamond) X2.. ?.* 1 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 M3900 .*ATI.*FirePro.*M39.* 2 1 0 0 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 FireMV .*ATI.*FireMV.* 0 1 1 1.3 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 IGP 340M .*ATI.*IGP.*340M.* 0 0 0 0 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 Radeon HD 6300M .*ATI.*AMD Radeon.* (HD|HD )63..M 2 1 1 4.2 -ATI Radeon HD 6400M .*ATI.*AMD Radeon.* (HD|HD )64..M 2 1 1 4.2 -ATI Radeon HD 6500M .*ATI.*AMD Radeon.* (HD|HD )65..M 2 1 1 4.2 -ATI Radeon HD 6600M .*ATI.*AMD Radeon.* (HD 6|6)6..M 3 1 1 4.2 -ATI Radeon HD 6700M .*ATI.*AMD Radeon.* (HD|HD )67..M 3 1 1 4.2 -ATI Radeon HD 6800M .*ATI.*AMD Radeon.* (HD|HD )68..M 3 1 1 4.2 -ATI Radeon HD 6300G .*ATI.*AMD Radeon.* (HD|HD )63..G 2 1 1 4.2 -ATI Radeon HD 6400G .*ATI.*AMD Radeon.* (HD|HD )64..G 2 1 1 4.2 -ATI Radeon HD 6500G .*ATI.*AMD Radeon.* (HD|HD )65..G 2 1 1 4.2 -ATI Radeon HD 6600G .*ATI.*AMD Radeon.* (HD|HD )66..G 3 1 1 4.2 -ATI Radeon HD 7100 .*ATI.*(Radeon|ASUS).* (HD|HD )71.* 2 1 0 0 -ATI Radeon HD 7200 .*ATI.*(Radeon|ASUS).* (HD|HD )72.* 2 1 0 4.2 -ATI Radeon HD 7300 .*ATI.*(Radeon|ASUS).* (HD|HD )73.* 2 1 0 4.2 -ATI Radeon HD 7400 .*ATI.*(Radeon|ASUS).* (HD|HD )74.* 2 1 0 4.2 -ATI Radeon HD 7500 .*ATI.*(Radeon|ASUS).* (HD|HD )75.* 3 1 1 4.2 -ATI Radeon HD 7600 .*ATI.*(Radeon|ASUS).* (HD|HD )76.* 3 1 0 4.2 -ATI Radeon HD 7700 .*ATI.*(Radeon|ASUS).* (HD|HD )77.* 4 1 1 4.2 -ATI Radeon HD 7800 .*ATI.*(Radeon|ASUS).* (HD|HD )78.* 5 1 1 4.2 -ATI Radeon HD 7900 .*ATI.*(Radeon|ASUS).* (HD|HD )79.* 5 1 1 4.2 -ATI Radeon HD 7000 Series .*ATI.*(Radeon|ASUS).* (HD|HD )7000 Series.* 3 1 1 4.2 +ATI Radeon HD 64xx .*ATI.*AMD Radeon.* HD [67]4..[MG] 2 1 1 4.2 +ATI Radeon HD 65xx .*ATI.*AMD Radeon.* HD [67]5..[MG] 2 1 1 4.2 +ATI Radeon HD 66xx .*ATI.*AMD Radeon.* HD [67]6..[MG] 3 1 1 4.2 +ATI Radeon HD 7100 .*ATI.*AMD Radeon.* HD 71.* 2 1 0 0 +ATI Radeon HD 7200 .*ATI.*AMD Radeon.* HD 72.* 2 1 0 0 +ATI Radeon HD 7300 .*ATI.*AMD Radeon.* HD 73.* 2 1 0 4.2 +ATI Radeon HD 7400 .*ATI.*AMD Radeon.* HD 74.* 2 1 0 4.2 +ATI Radeon HD 7500 .*ATI.*AMD Radeon.* HD 75.* 3 1 1 4.2 +ATI Radeon HD 7600 .*ATI.*AMD Radeon.* HD 76.* 3 1 0 4.2 +ATI Radeon HD 7700 .*ATI.*AMD Radeon.* HD 77.* 4 1 1 4.2 +ATI Radeon HD 7800 .*ATI.*AMD Radeon.* HD 78.* 5 1 1 4.2 +ATI Radeon HD 7900 .*ATI.*AMD Radeon.* HD 79.* 5 1 1 4.2 +ATI ASUS HD7100 .*ATI.*ASUS.* HD71.* 2 1 0 0 +ATI ASUS HD7200 .*ATI.*ASUS.* HD72.* 2 1 0 0 +ATI ASUS HD7300 .*ATI.*ASUS.* HD73.* 2 1 0 0 +ATI ASUS HD7400 .*ATI.*ASUS.* HD74.* 2 1 0 0 +ATI ASUS HD7500 .*ATI.*ASUS.* HD75.* 3 1 1 4.2 +ATI ASUS HD7600 .*ATI.*ASUS.* HD76.* 3 1 0 0 +ATI ASUS HD7700 .*ATI.*ASUS.* HD77.* 4 1 1 4.2 +ATI ASUS HD7800 .*ATI.*ASUS.* HD78.* 5 1 1 4.2 +ATI ASUS HD7900 .*ATI.*ASUS.* HD79.* 5 1 1 4.2 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 HD 6200 .*ATI.*Mobility.*HD 62.* 3 1 0 0 -ATI Mobility Radeon HD 6300 .*ATI.*Mobility.*HD 63.* 3 1 1 4.2 -ATI Mobility Radeon HD 6400M .*ATI.*Mobility.*HD 64.* 3 1 0 0 -ATI Mobility Radeon HD 6500M .*ATI.*Mobility.*HD 65.* 5 1 1 4.2 -ATI Mobility Radeon HD 6600M .*ATI.*Mobility.*HD 66.* 5 1 0 0 -ATI Mobility Radeon HD 6700M .*ATI.*Mobility.*HD 67.* 5 1 0 0 -ATI Mobility Radeon HD 6800M .*ATI.*Mobility.*HD 68.* 5 1 0 0 -ATI Mobility Radeon HD 6900M .*ATI.*Mobility.*HD 69.* 5 1 0 0 -ATI Mobility Radeon Graphics .*ATI Mobility Radeon Graphics.* 1 1 0 4 -ATI Radeon HD 2300 .*ATI.*Radeon.* (HD|HD )23.. 0 1 1 3.3 -ATI Radeon HD 2400 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)24.. 1 1 1 4 -ATI Radeon HD 2600 .*ATI.*(Radeon|ASUS).* (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).* (HD|HD |AH|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).* (HD|HD |AH|EAH)36.. 3 1 1 4 -ATI Radeon HD 3700 .*ATI.*Radeon.* (HD|HD )37.. 3 1 0 3.3 +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 3.3 +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 *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 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 0 +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 HD 6200 .*ATI.*Mobility.*HD *62.* 3 1 0 0 +ATI Mobility Radeon HD 6300 .*ATI.*Mobility.*HD *63.* 3 1 1 4.2 +ATI Mobility Radeon HD 6400M .*ATI.*Mobility.*HD *64.* 3 1 0 0 +ATI Mobility Radeon HD 6500M .*ATI.*Mobility.*HD *65.* 5 1 1 4.2 +ATI Mobility Radeon HD 6600M .*ATI.*Mobility.*HD *66.* 5 1 0 0 +ATI Mobility Radeon HD 6700M .*ATI.*Mobility.*HD *67.* 5 1 0 0 +ATI Mobility Radeon HD 6800M .*ATI.*Mobility.*HD *68.* 5 1 0 0 +ATI Mobility Radeon HD 6900M .*ATI.*Mobility.*HD *69.* 5 1 0 0 +ATI Radeon HD 2300 .*ATI.*Radeon HD *23.. 0 1 1 3.3 +ATI Radeon HD 2400 .*ATI.*Radeon HD *24.. 1 1 1 4 +ATI Radeon HD 2600 .*ATI.*Radeon HD *26.. 2 1 1 3.3 +ATI Radeon HD 2900 .*ATI.*Radeon HD *29.. 3 1 1 3.3 +ATI Radeon HD 3000 .*ATI.*Radeon HD *30.. 0 1 0 0 +ATI Radeon HD 3100 .*ATI.*Radeon HD *31.. 1 1 0 0 +ATI Radeon HD 3200 .*ATI.*Radeon HD *32.. 1 1 1 4 +ATI Radeon HD 3300 .*ATI.*Radeon HD *33.. 1 1 1 3.3 +ATI Radeon HD 3400 .*ATI.*Radeon HD *34.. 1 1 1 4 +ATI Radeon HD 3500 .*ATI.*Radeon HD *35.. 2 1 0 0 +ATI Radeon HD 3600 .*ATI.*Radeon HD *36.. 3 1 1 3.3 +ATI Radeon HD 3700 .*ATI.*Radeon HD *37.. 3 1 0 0 ATI HD3700 .*ATI.* HD37.. 3 1 0 3.3 -ATI Radeon HD 3800 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)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).* (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).* (HD|HD |EAH)45.. 2 1 1 3.3 -ATI Radeon HD 4600 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)46.. 3 1 1 4 -ATI Radeon HD 4700 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)47.. 3 1 1 3.3 -ATI Radeon HD 4800 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)48.. 3 1 1 4 -ATI Radeon HD 5400 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)54.. 3 1 1 4.2 -ATI Radeon HD 5500 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)55.. 3 1 1 4.2 -ATI Radeon HD 5600 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)56.. 3 1 1 4.2 -ATI Radeon HD 5700 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)57.. 3 1 1 4.2 -ATI Radeon HD 5800 .*ATI.*(Radeon|ASUS).* (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 3800 .*ATI.*Radeon HD *38.. 3 1 1 4 +ATI Radeon HD 4100 .*ATI.*Radeon HD *41.. 1 1 0 0 +ATI Radeon HD 4200 .*ATI.*Radeon HD *42.. 1 1 1 4 +ATI Radeon HD 4300 .*ATI.*Radeon HD *43.. 2 1 1 4 +ATI Radeon HD 4400 .*ATI.*Radeon HD *44.. 2 1 0 0 +ATI Radeon HD 4500 .*ATI.*Radeon HD *45.. 2 1 1 3.3 +ATI Radeon HD 4600 .*ATI.*Radeon HD *46.. 3 1 1 4 +ATI Radeon HD 4700 .*ATI.*Radeon HD *47.. 3 1 1 3.3 +ATI Radeon HD 4800 .*ATI.*Radeon HD *48.. 3 1 1 4 +ATI ASUS EAH5400 .*ATI.*ASUS EAH54.. 3 1 1 4.2 +ATI Radeon HD 5400 .*ATI.*Radeon HD *54.. 3 1 1 4.2 +ATI Radeon HD 5500 .*ATI.*Radeon HD *55.. 3 1 1 4.2 +ATI ASUS EAH5500 .*ATI.*ASUS EAH55.. 3 1 1 4.2 +ATI Radeon HD 5600 .*ATI.*Radeon HD *56.. 3 1 1 4.2 +ATI Radeon HD 5700 .*ATI.*Radeon HD *57.. 3 1 1 4.2 +ATI Radeon HD 5800 .*ATI.*Radeon HD *58.. 4 1 1 4.2 +ATI Radeon HD 5900 .*ATI.*Radeon HD *59.. 4 1 1 4.2 +ATI Radeon HD 6200 .*ATI.*Radeon HD *62.. 0 1 1 4.2 +ATI Radeon HD 6300 .*ATI.*Radeon HD *63.. 1 1 1 4.2 +ATI Radeon HD 6400 .*ATI.*Radeon HD *64.. 3 1 1 4.2 +ATI Radeon HD 6500 .*ATI.*Radeon HD *65.. 3 1 1 4.2 +ATI Radeon HD 6600 .*ATI.*Radeon HD *66.. 3 1 1 4.2 +ATI Radeon HD 6700 .*ATI.*Radeon HD *67.. 3 1 1 4.2 +ATI Radeon HD 6800 .*ATI.*Radeon HD *68.. 4 1 1 4.2 +ATI Radeon HD 6900 .*ATI.*Radeon HD *69.. 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 @@ -189,21 +219,17 @@ ATI Radeon 9800 .*ATI.*Radeon 98.. 1 1 1 2.1 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 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 X300 .*ATI.*Radeon *X3.* 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 X600 .*ATI.*Radeon ?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 X1200 .*ATI.*Radeon ?X12.* 2 1 0 2.1 -ATI Radeon X1400 .*ATI.*Radeon ?X14.* 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 Rage 128 .*ATI.*Rage 128.* 0 1 0 0 ATI R300 (9700) .*R300.* 0 1 1 2.1 @@ -222,43 +248,41 @@ 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 BARTS (HD 6800) .*(AMD|ATI).*Barts.* 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 CEDAR (HD 5450) .*(AMD|ATI).*Cedar.* 2 1 0 0 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 REDWOOD (HD 5500/5600) .*(AMD|ATI).*Redwood.* 3 1 0 0 +AMD TURKS (HD 6500/6600) .*(AMD|ATI).*Turks.* 3 1 0 0 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 RV635 (HD 3600) .*RV635.* 3 1 0 0 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 RV730 (HD 4600) .*RV730.* 3 1 0 0 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 2.* 2 1 1 4.2 +ATI FirePro 2000 .*ATI.*FirePro 2.* 2 1 1 4.1 ATI FirePro 3000 .*ATI.*FirePro V3.* 2 1 0 0 -ATI FirePro 4000 .*ATI.*FirePro V4.* 2 1 0 4.1 +ATI FirePro 4000 .*ATI.*FirePro V4.* 2 1 0 0 ATI FirePro 5000 .*ATI.*FirePro V5.* 3 1 0 0 ATI FirePro 7000 .*ATI.*FirePro V7.* 3 1 0 0 ATI FirePro M .*ATI.*FirePro M.* 3 1 1 4.2 ATI R300 (9700) .*R300.* 0 1 1 2.1 +ATI Radeon .*ATI.*(Diamond|Radeon).* 0 1 0 4.2 Intel X3100 .*Intel.*X3100.* 1 1 1 2.1 Intel GMA 3600 .*Intel.* 3600.* 0 1 1 3 Intel 830M .*Intel.*830M 0 0 0 0 @@ -284,6 +308,8 @@ Intel Graphics Media HD .*Intel.*Graphics Media.*HD.* 1 1 1 2.1 Intel HD Graphics 2000 .*Intel.*HD Graphics 2.* 2 1 0 4 Intel HD Graphics 3000 .*Intel.*HD Graphics 3.* 3 1 1 3.1 Intel HD Graphics 4000 .*Intel.*HD Graphics 4.* 3 1 1 4 +Intel HD2000 .*Intel.*HD2000.* 2 1 0 0 +Intel HD3000 .*Intel.*HD3000.* 3 1 0 0 Intel HD Graphics .*Intel.*HD Graphics.* 2 1 1 4 Intel Mobile 4 Series .*Intel.*Mobile.* 4 Series.* 0 1 1 2.1 Intel 4 Series Internal .*Intel.* 4 Series Internal.* 1 1 1 2.1 @@ -296,109 +322,113 @@ 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 +Mesa .*Mesa.* 1 0 1 2.1 Gallium .*Gallium.* 1 1 1 2.1 -NVIDIA G100M .*NVIDIA .* 10[0-9]M.* 4 1 1 3.3 -NVIDIA G 110M .*NVIDIA .* 11[0-9]M.* 1 1 1 3.3 -NVIDIA G 120M .*NVIDIA .* 12[0-9]M.* 1 1 1 3.3 -NVIDIA G 200M .*NVIDIA .* 20[0-9]M.* 1 1 0 0 -NVIDIA G 410M .*NVIDIA .* 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 .*G21[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 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 .* 31[0-9]M.* 2 1 0 3.3 -NVIDIA GT 320M .*NVIDIA .* 32[0-9]M.* 3 1 0 3.3 -NVIDIA GT 330M .*NVIDIA .*GT 33[0-9]M.* 3 1 1 3.3 -NVIDIA GT 340M .*NVIDIA .*GT 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 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.2 -NVIDIA GT 430M .*NVIDIA .*GT 43[0-9]M.* 3 1 1 4.2 -NVIDIA GT 440M .*NVIDIA .*GT 44[0-9]M.* 3 1 1 4.2 -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.2 -NVIDIA GTX 480M .*NVIDIA .*GTX 48[0-9]M.* 3 1 1 4.2 -NVIDIA GT 520M .*NVIDIA .*GT 52[0-9]M.* 3 1 1 4.2 -NVIDIA GT 530M .*NVIDIA .*GT 53[0-9]M.* 3 1 1 4.2 -NVIDIA GT 540M .*NVIDIA .*GT 54[0-9]M.* 3 1 1 4.2 -NVIDIA GT 550M .*GeForce GT 55[0-9]M.* 3 1 1 4.2 -NVIDIA GTX 560M .*NVIDIA .*GTX 56[0-9]M.* 3 1 0 4.2 -NVIDIA GTX 570M .*NVIDIA .*GTX 57[0-9]M.* 5 1 0 4.2 -NVIDIA GTX 580M .*NVIDIA .*GTX 58[0-9]M.* 5 1 1 4.2 -NVIDIA 610M .*NVIDIA.* 61[0-9]M.* 3 1 1 4.2 -NVIDIA GT 620M .*NVIDIA .*GT 62[0-9]M.* 3 1 0 4.2 -NVIDIA GT 630M .*NVIDIA .*GT 63[0-9]M.* 3 1 0 4.2 -NVIDIA GT 640M .*NVIDIA .*GT 64[0-9]M.* 3 1 0 4.2 -NVIDIA GT 650M .*NVIDIA .*GT 65[0-9]M.* 3 1 0 4.2 -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.2 -NVIDIA GTX 680M .*NVIDIA .*GTX 68[0-9]M.* 5 1 0 4.2 -NVIDIA GTX 690M .*NVIDIA .*GTX 69[0-9]M.* 5 1 0 0 +NVIDIA G100M .*NVIDIA .*100M.* 4 1 1 3.3 +NVIDIA G102M .*NVIDIA .*102M.* 1 1 1 3.3 +NVIDIA G103M .*NVIDIA .*103M.* 2 1 1 3.3 +NVIDIA G105M .*NVIDIA .*105M.* 2 1 1 3.3 +NVIDIA G 110M .*NVIDIA .*110M.* 1 1 1 3.3 +NVIDIA G 120M .*NVIDIA .*120M.* 1 1 1 3.3 +NVIDIA G 205M .*NVIDIA .*205M.* 1 1 0 0 +NVIDIA G 410M .*NVIDIA .*410M.* 3 1 1 4.2 +NVIDIA GT 120M .*NVIDIA .*GT *12*M.* 3 1 1 3.3 +NVIDIA GT 130M .*NVIDIA .*GT *13*M.* 3 1 1 3.3 +NVIDIA GT 140M .*NVIDIA .*GT *14*M.* 3 1 1 3.3 +NVIDIA GT 150M .*NVIDIA .*GTS *15*M.* 2 1 0 0 +NVIDIA GTS 160M .*NVIDIA .*GTS *16*M.* 2 1 0 0 +NVIDIA G210M .*NVIDIA .*G21*M.* 3 1 0 0 +NVIDIA GT 220M .*NVIDIA .*GT *22*M.* 3 1 1 3.3 +NVIDIA GT 230M .*NVIDIA .*GT *23*M.* 3 1 1 3.3 +NVIDIA GT 240M .*NVIDIA .*GT *24*M.* 3 1 1 3.3 +NVIDIA GTS 250M .*NVIDIA .*GTS *25*M.* 3 1 0 0 +NVIDIA GTS 260M .*NVIDIA .*GTS *26*M.* 3 1 0 0 +NVIDIA GTX 260M .*NVIDIA .*GTX *26*M.* 3 1 0 0 +NVIDIA GTX 270M .*NVIDIA .*GTX *27*M.* 3 1 0 0 +NVIDIA GTX 280M .*NVIDIA .*GTX *28*M.* 3 1 0 0 +NVIDIA 300M .*NVIDIA .*30*M.* 3 1 1 4.2 +NVIDIA G 310M .*NVIDIA .*31*M.* 2 1 0 0 +NVIDIA GT 320M .*NVIDIA .*GT *32*M.* 3 1 0 0 +NVIDIA GT 325M .*NVIDIA .*GT *32*M.* 3 1 1 3.3 +NVIDIA GT 330M .*NVIDIA .*GT *33*M.* 3 1 1 3.3 +NVIDIA GT 340M .*NVIDIA .*GT *34*M.* 4 1 1 3.3 +NVIDIA GTS 350M .*NVIDIA .*GTS *35*M.* 4 1 1 3.3 +NVIDIA GTS 360M .*NVIDIA .*GTS *360M.* 5 1 1 3.3 +NVIDIA 405M .*NVIDIA .* 40*M.* 2 1 0 4.2 +NVIDIA 410M .*NVIDIA .* 41*M.* 3 1 0 0 +NVIDIA GT 415M .*NVIDIA .*GT *41*M.* 3 1 1 4.2 +NVIDIA GT 420M .*NVIDIA .*GT *42*M.* 3 1 1 4.2 +NVIDIA GT 430M .*NVIDIA .*GT *43*M.* 3 1 1 4.2 +NVIDIA GT 440M .*NVIDIA .*GT *44*M.* 3 1 1 4.2 +NVIDIA GT 450M .*NVIDIA .*GT *45*M.* 3 1 0 0 +NVIDIA GTX 460M .*NVIDIA .*GTX *46*M.* 4 1 1 4.2 +NVIDIA GTX 470M .*NVIDIA .*GTX *47*M.* 3 1 0 0 +NVIDIA GTX 480M .*NVIDIA .*GTX *48*M.* 3 1 1 4.2 +NVIDIA GT 520M .*NVIDIA .*GT *52*M.* 3 1 1 4.2 +NVIDIA GT 530M .*NVIDIA .*GT *53*M.* 3 1 1 4.2 +NVIDIA GT 540M .*NVIDIA .*GT *54*M.* 3 1 1 4.2 +NVIDIA GT 550M .*NVIDIA .*GT *55*M.* 3 1 1 4.2 +NVIDIA GTX 560M .*NVIDIA .*GTX *56*M.* 3 1 0 0 +NVIDIA GTX 570M .*NVIDIA .*GTX *57*M.* 5 1 0 0 +NVIDIA GTX 580M .*NVIDIA .*GTX *58*M.* 5 1 1 4.2 +NVIDIA 610M .*NVIDIA.* 61*M.* 3 1 1 4.2 +NVIDIA GT 620M .*NVIDIA .*GT *62*M.* 3 1 0 0 +NVIDIA GT 630M .*NVIDIA .*GT *63*M.* 3 1 0 0 +NVIDIA GT 640M .*NVIDIA .*GT *64*M.* 3 1 0 0 +NVIDIA GT 650M .*NVIDIA .*GT *65*M.* 3 1 0 0 +NVIDIA GTX 660M .*NVIDIA .*GTX *66*M.* 5 1 0 0 +NVIDIA GTX 670M .*NVIDIA .*GTX *67*M.* 5 1 1 4.2 +NVIDIA GTX 680M .*NVIDIA .*GTX *68*M.* 5 1 0 0 +NVIDIA GTX 690M .*NVIDIA .*GTX *69*M.* 5 1 0 0 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 GTS 150 .*NVIDIA .*GTS 15.* 2 1 0 0 +NVIDIA GT 120 .*NVIDIA .*GT *12.* 2 1 0 3 +NVIDIA GT 130 .*NVIDIA .*GT *13.* 2 1 0 3.3 +NVIDIA GTS 150 .*NVIDIA .*GTS *15.* 2 1 0 0 NVIDIA 200 .*NVIDIA .*GeForce 20.* 2 1 1 3.3 NVIDIA G200 .*NVIDIA .*GeForce G20.* 2 1 1 3.3 NVIDIA G210 .*NVIDIA .*GeForce G210.* 3 1 1 3.3 NVIDIA 210 .*NVIDIA .*GeForce 210.* 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 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 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 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 310 .*NVIDIA .*GeForce 310.* 3 1 1 3.3 NVIDIA 315 .*NVIDIA .*GeForce 315.* 3 1 1 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 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 405 .*NVIDIA .* 405.* 3 1 0 3.3 -NVIDIA GT 420 .*NVIDIA .*GT 42.* 3 1 1 4.2 -NVIDIA GT 430 .*NVIDIA .*GT 43.* 3 1 1 4.3 -NVIDIA GT 440 .*NVIDIA .*GT 44.* 4 1 0 4.3 -NVIDIA GTS 450 .*NVIDIA .*GTS 45.* 4 1 1 4.2 -NVIDIA GTX 460 .*NVIDIA .*GTX 46.* 5 1 1 4.3 -NVIDIA GTX 470 .*NVIDIA .*GTX 47.* 5 1 1 4.2 -NVIDIA GTX 480 .*NVIDIA .*GTX 48.* 5 1 1 4.2 -NVIDIA 510 .*NVIDIA .* 510.* 3 1 0 4.2 -NVIDIA GT 520 .*NVIDIA .*GT 52.* 3 1 1 4.2 -NVIDIA GT 530 .*NVIDIA .*GT 53.* 3 1 1 4.2 -NVIDIA GT 540 .*NVIDIA .*GT 54.* 3 1 1 4.2 -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.2 -NVIDIA GTX 580 .*NVIDIA .*GTX 58.* 5 1 1 4.3 -NVIDIA GTX 590 .*NVIDIA .*GTX 59.* 5 1 1 4.2 -NVIDIA 605 .*NVIDIA .* 605.* 3 1 1 4.2 -NVIDIA GT 610 .*NVIDIA .*GT 61.* 3 1 1 4.2 -NVIDIA GT 620 .*NVIDIA .*GT 62.* 3 1 0 4.2 -NVIDIA GT 630 .*NVIDIA .*GT 63.* 3 1 0 4.2 -NVIDIA GT 640 .*NVIDIA .*GT 64.* 3 1 0 4.2 -NVIDIA GT 650 .*NVIDIA .*GT 65.* 3 1 1 4.2 -NVIDIA GTX 650 .*NVIDIA .*GTX 65.* 3 1 1 4.2 -NVIDIA GTX 660 .*NVIDIA .*GTX 66.* 5 1 0 4.3 -NVIDIA GTX 670 .*NVIDIA .*GTX 67.* 5 1 1 4.2 -NVIDIA GTX 680 .*NVIDIA .*GTX 68.* 5 1 1 4.2 -NVIDIA GTX 690 .*NVIDIA .*GTX 69.* 5 1 1 4.2 +NVIDIA GT 420 .*NVIDIA .*GT *42.* 3 1 1 4.2 +NVIDIA GT 430 .*NVIDIA .*GT *43.* 3 1 1 4.2 +NVIDIA GT 440 .*NVIDIA .*GT *44.* 4 1 0 4.2 +NVIDIA GTS 450 .*NVIDIA .*GTS *45.* 4 1 1 4.2 +NVIDIA GTX 460 .*NVIDIA .*GTX *46.* 5 1 1 4.3 +NVIDIA GTX 470 .*NVIDIA .*GTX *47.* 5 1 1 4.2 +NVIDIA GTX 480 .*NVIDIA .*GTX *48.* 5 1 1 4.2 +NVIDIA 510 .*NVIDIA .* 510.* 3 1 0 0 +NVIDIA GT 520 .*NVIDIA .*GT *52.* 3 1 1 4.2 +NVIDIA GT 530 .*NVIDIA .*GT *53.* 3 1 1 4.2 +NVIDIA GT 540 .*NVIDIA .*GT *54.* 3 1 1 4.2 +NVIDIA GTX 550 .*NVIDIA .*GTX *55.* 5 1 1 4.3 +NVIDIA GTX 560 .*NVIDIA .*GTX *56.* 5 1 1 4.2 +NVIDIA GTX 570 .*NVIDIA .*GTX *57.* 5 1 1 4.2 +NVIDIA GTX 580 .*NVIDIA .*GTX *58.* 5 1 1 4.3 +NVIDIA GTX 590 .*NVIDIA .*GTX *59.* 5 1 1 4.2 +NVIDIA GT 610 .*NVIDIA .*GT *61.* 3 1 1 4.2 +NVIDIA GT 620 .*NVIDIA .*GT *62.* 3 1 0 4.2 +NVIDIA GT 630 .*NVIDIA .*GT *63.* 3 1 0 4.2 +NVIDIA GT 640 .*NVIDIA .*GT *64.* 3 1 0 4.3 +NVIDIA GT 650 .*NVIDIA .*GT *65.* 3 1 1 4.2 +NVIDIA GTX 650 .*NVIDIA .*GTX *65.* 3 1 1 4.2 +NVIDIA GTX 660 .*NVIDIA .*GTX *66.* 5 1 0 4.3 +NVIDIA GTX 670 .*NVIDIA .*GTX *67.* 5 1 1 4.2 +NVIDIA GTX 680 .*NVIDIA .*GTX *68.* 5 1 1 4.2 +NVIDIA GTX 690 .*NVIDIA .*GTX *69.* 5 1 1 4.2 NVIDIA C51 .*NVIDIA .*C51.* 0 1 1 2 NVIDIA G72 .*NVIDIA .*G72.* 1 1 0 0 NVIDIA G73 .*NVIDIA .*G73.* 1 1 0 0 @@ -407,7 +437,13 @@ NVIDIA G86 .*NVIDIA .*G86.* 3 1 0 0 NVIDIA G92 .*NVIDIA .*G92.* 3 1 0 0 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 @@ -422,33 +458,33 @@ 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 8100 .*NVIDIA .*GeForce 81.* 1 1 0 0 +NVIDIA GeForce 8200M .*NVIDIA .*GeForce 8200M.* 1 1 0 3.3 +NVIDIA GeForce 8200 .*NVIDIA .*GeForce 82.* 1 1 0 2.1 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 8400M .*NVIDIA .*GeForce 8400M.* 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 8600M .*NVIDIA .*GeForce 8600M.* 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 8700M .*NVIDIA .*GeForce 8700M.* 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 8800M .*NVIDIA .*GeForce 8800M.* 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 9100M .*NVIDIA .*GeForce 9100M.* 0 1 0 0 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 9200M .*NVIDIA .*GeForce 9200M.* 1 1 0 3.1 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 9300M .*NVIDIA .*GeForce 9300M.* 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 9400M .*NVIDIA .*GeForce 9400M.* 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 9500M .*NVIDIA .*GeForce 9500M.* 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 9600M .*NVIDIA .*GeForce 9600M.* 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 9700M .*NVIDIA .*GeForce 9700M.* 0 1 1 3.3 +NVIDIA GeForce 9800M .*NVIDIA .*GeForce 9800M.* 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 @@ -459,7 +495,7 @@ 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 Go5200 .*NVIDIA .*GeForce FX Go52.* 0 1 0 0 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 @@ -468,13 +504,13 @@ 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 6200 .*NVIDIA .*GeForce Go 62.* 0 1 0 0 +NVIDIA GeForce Go 6400 .*NVIDIA .*GeForce Go 64.* 1 1 1 2 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 7200 .*NVIDIA .*GeForce Go 72.* 1 1 0 0 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 @@ -492,9 +528,9 @@ 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 Generic .*NVIDIA .*Unknown.* 0 0 0 2.1 +NVIDIA N10 .*NVIDIA .*N10.* 1 1 0 0 +NVIDIA GeForce PCX .*GeForce PCX.* 0 1 0 0 +NVIDIA Generic .*NVIDIA .*Unknown.* 0 0 0 3 NVIDIA NV17 .*NVIDIA .*NV17.* 0 1 0 0 NVIDIA NV34 .*NVIDIA .*NV34.* 0 1 0 0 NVIDIA NV35 .*NVIDIA .*NV35.* 0 1 0 0 @@ -504,7 +540,7 @@ 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 MCP61 .*NVIDIA .*MCP61.* 1 1 0 0 NVIDIA MCP67 .*NVIDIA .*MCP67.* 1 1 0 0 NVIDIA MCP68 .*NVIDIA .*MCP68.* 1 1 0 0 NVIDIA MCP73 .*NVIDIA .*MCP73.* 1 1 0 0 @@ -512,44 +548,44 @@ 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 Quadro2 .*Quadro2.* 0 1 0 1.5 -NVIDIA Quadro 1000M .*Quadro.* (K1|1)00[0-9]M.* 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 4000.* 3 1 0 4.2 -NVIDIA Quadro 50x0 M .*Quadro.* 50.0.* 3 1 0 4.2 +NVIDIA Quadro2 .*Quadro2.* 0 1 0 0 +NVIDIA Quadro 1000M .*Quadro.*1000M.* 2 1 0 4.2 +NVIDIA Quadro 2000 M/D .*Quadro.*2000.* 3 1 0 4.2 +NVIDIA Quadro 3000M .*Quadro.*3000M.* 3 1 0 0 +NVIDIA Quadro 4000M .*Quadro.*4000M.* 3 1 0 0 +NVIDIA Quadro 4000 .*Quadro *4000.* 3 1 0 4.2 +NVIDIA Quadro 50x0 M .*Quadro.*50.0.* 3 1 0 0 NVIDIA Quadro 6000 .*Quadro.* 6000.* 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 600 .*Quadro.*600.* 2 1 0 3.3 +NVIDIA Quadro4 .*Quadro4.* 0 1 0 0 NVIDIA Quadro DCC .*Quadro DCC.* 0 1 0 0 NVIDIA Quadro CX .*Quadro.*CX.* 3 1 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 770M .*Quadro.*FX *770M.* 2 1 0 0 +NVIDIA Quadro FX 1500M .*Quadro.*FX *1500M.* 1 1 0 2.1 +NVIDIA Quadro FX 1600M .*Quadro.*FX *1600M.* 2 1 0 0 +NVIDIA Quadro FX 2500M .*Quadro.*FX *2500M.* 2 1 0 0 +NVIDIA Quadro FX 2700M .*Quadro.*FX *2700M.* 3 1 0 0 +NVIDIA Quadro FX 2800M .*Quadro.*FX *2800M.* 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 0 +NVIDIA Quadro FX 3700 .*Quadro.*FX *3700.* 3 1 0 3.3 +NVIDIA Quadro FX 3800 .*Quadro.*FX *3800.* 3 1 0 3.2 +NVIDIA Quadro FX 4500 .*Quadro.*FX *45.* 3 1 0 0 +NVIDIA Quadro FX 880M .*Quadro.*FX *880M.* 3 1 0 3.3 +NVIDIA Quadro FX 4800 .*NVIDIA .*Quadro *FX *4800.* 3 1 0 0 NVIDIA Quadro FX .*Quadro FX.* 1 1 0 3.3 -NVIDIA Quadro NVS 1xxM .*Quadro NVS 1.[05]M.* 0 1 1 3.3 -NVIDIA Quadro NVS 300M .*NVIDIA .*NVS 30[0-9]M.* 2 1 0 0 -NVIDIA Quadro NVS 320M .*NVIDIA .*NVS 32[0-9]M.* 2 1 0 0 -NVIDIA Quadro NVS 2100M .*NVIDIA .*NVS 210[0-9]M.* 2 1 0 3.3 -NVIDIA Quadro NVS 3100M .*NVIDIA .*NVS 310[0-9]M.* 2 1 0 3.3 -NVIDIA Quadro NVS 4200M .*NVIDIA .*NVS 420[0-9]M.* 2 1 0 4.2 -NVIDIA Quadro NVS 5100M .*NVIDIA .*NVS 510[0-9]M.* 2 1 0 0 -NVIDIA Quadro NVS .*NVIDIA .*NVS 0 1 0 4.2 +NVIDIA Quadro NVS 1xxM .*Quadro NVS *1.[05]M.* 0 1 1 3.3 +NVIDIA Quadro NVS 300M .*NVIDIA .*NVS *300M.* 2 1 0 0 +NVIDIA Quadro NVS 320M .*NVIDIA .*NVS *320M.* 2 1 0 0 +NVIDIA Quadro NVS 2100M .*NVIDIA .*NVS *2100M.* 2 1 0 0 +NVIDIA Quadro NVS 3100M .*NVIDIA .*NVS *3100M.* 2 1 0 0 +NVIDIA Quadro NVS 4200M .*NVIDIA .*NVS *4200M.* 2 1 0 4.1 +NVIDIA Quadro NVS 5100M .*NVIDIA .*NVS *5100M.* 2 1 0 0 +NVIDIA Quadro NVS .*NVIDIA .*NVS 0 1 0 3.2 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 Corporation N11M .*NVIDIA .*N11M.* 2 1 0 0 +NVIDIA RIVA TNT .*RIVA TNT.* 0 0 0 0 S3 .*S3 Graphics.* 0 0 1 1.4 SiS SiS.* 0 0 1 1.5 Trident Trident.* 0 0 0 0 diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index 20936c6460..9e2e37c202 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -4,17 +4,17 @@ ## These options are for self-assisted troubleshooting during this beta ## testing phase; you should not usually need to touch them. +## - Avoids using any FMOD Ex audio driver. +#export LL_BAD_FMODEX_DRIVER=x ## - Avoids using any OpenAL audio driver. #export LL_BAD_OPENAL_DRIVER=x -## - Avoids using any FMOD audio driver. -#export LL_BAD_FMOD_DRIVER=x -## - Avoids using the FMOD ESD audio driver. -#export LL_BAD_FMOD_ESD=x -## - Avoids using the FMOD OSS audio driver. -#export LL_BAD_FMOD_OSS=x -## - Avoids using the FMOD ALSA audio driver. +## - Avoids using the FMOD Ex PulseAudio audio driver. +#export LL_BAD_FMOD_PULSEAUDIO=x +## - Avoids using the FMOD or FMOD Ex ALSA audio driver. #export LL_BAD_FMOD_ALSA=x +## - Avoids using the FMOD or FMOD Ex OSS audio driver. +#export LL_BAD_FMOD_OSS=x ## - Avoids the optional OpenGL extensions which have proven most problematic ## on some hardware. Disabling this option may cause BETTER PERFORMANCE but @@ -45,6 +45,7 @@ if [ "`uname -m`" = "x86_64" ]; then echo '64-bit Linux detected.' fi + ## Everything below this line is just for advanced troubleshooters. ##------------------------------------------------------------------- @@ -60,7 +61,15 @@ fi export SDL_VIDEO_X11_DGAMOUSE=0 ## - Works around a problem with misconfigured 64-bit systems not finding GL -export LIBGL_DRIVERS_PATH="${LIBGL_DRIVERS_PATH}":/usr/lib64/dri:/usr/lib32/dri:/usr/lib/dri +I386_MULTIARCH="$(dpkg-architecture -ai386 -qDEB_HOST_MULTIARCH 2>/dev/null)" +MULTIARCH_ERR=$? +if [ $MULTIARCH_ERR -eq 0 ]; then + echo 'Multi-arch support detected.' + MULTIARCH_GL_DRIVERS="/usr/lib/${I386_MULTIARCH}/dri" + export LIBGL_DRIVERS_PATH="${LIBGL_DRIVERS_PATH}:${MULTIARCH_GL_DRIVERS}:/usr/lib64/dri:/usr/lib32/dri:/usr/lib/dri" +else + export LIBGL_DRIVERS_PATH="${LIBGL_DRIVERS_PATH}:/usr/lib64/dri:/usr/lib32/dri:/usr/lib/dri" +fi ## - The 'scim' GTK IM module widely crashes the viewer. Avoid it. if [ "$GTK_IM_MODULE" = "scim" ]; then @@ -117,18 +126,32 @@ export LD_LIBRARY_PATH="$PWD/lib:${LD_LIBRARY_PATH}" # Simply embedding $(<etc/gridargs.dat) into a command line treats each of # Second, Life and Developer as separate args -- no good. We need bash to # process quotes using eval. -# First read it without scanning, then scan that string. Break quoted words +# First, check if we have been instructed to skip reading in gridargs.dat: +skip_gridargs=false +argnum=0 +for ARG in "$@"; do + if [ "--skip-gridargs" == "$ARG" ]; then + skip_gridargs=true + else + ARGS[$argnum]="$ARG" + argnum=$(($argnum+1)) + fi +done + +# Second, read it without scanning, then scan that string. Break quoted words # into a bash array. Note that if gridargs.dat is empty, or contains only # whitespace, the resulting gridargs array will be empty -- zero entries -- # therefore "${gridargs[@]}" entirely vanishes from the command line below, # just as we want. +if ! $skip_gridargs ; then eval gridargs=("$(<etc/gridargs.dat)") +fi # Run the program. # Don't quote $LL_WRAPPER because, if empty, it should simply vanish from the # command line. But DO quote "$@": preserve separate args as individually # quoted. Similar remarks about the contents of gridargs. -$LL_WRAPPER bin/do-not-directly-run-secondlife-bin "${gridargs[@]}" "$@" +$LL_WRAPPER bin/do-not-directly-run-secondlife-bin "${gridargs[@]}" "${ARGS[@]}" LL_RUN_ERR=$? # Handle any resulting errors diff --git a/indra/newview/llaccountingcostmanager.cpp b/indra/newview/llaccountingcostmanager.cpp index 8767955fcb..7662a9689d 100644 --- a/indra/newview/llaccountingcostmanager.cpp +++ b/indra/newview/llaccountingcostmanager.cpp @@ -56,9 +56,9 @@ public: } } - void error( U32 statusNum, const std::string& reason ) + void errorWithContent( U32 statusNum, const std::string& reason, const LLSD& content ) { - llwarns << "Transport error "<<reason<<llendl; + llwarns << "Transport error [status:" << statusNum << "]: " << content <<llendl; clearPendingRequests(); LLAccountingCostObserver* observer = mObserverHandle.get(); diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 094d502078..3e94c5edf7 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -35,6 +35,7 @@ #include "llagentlistener.h" #include "llagentwearables.h" #include "llagentui.h" +#include "llappearancemgr.h" #include "llanimationstates.h" #include "llcallingcard.h" #include "llcapabilitylistener.h" @@ -91,7 +92,7 @@ #include "llworldmap.h" #include "stringize.h" -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines; extern LLMenuBarGL* gMenuBarView; @@ -808,6 +809,29 @@ void LLAgent::standUp() } +void LLAgent::handleServerBakeRegionTransition(const LLUUID& region_id) +{ + llinfos << "called" << llendl; + + + // Old-style appearance entering a server-bake region. + if (isAgentAvatarValid() && + !gAgentAvatarp->isUsingServerBakes() && + (mRegionp->getCentralBakeVersion()>0)) + { + llinfos << "update requested due to region transition" << llendl; + LLAppearanceMgr::instance().requestServerAppearanceUpdate(); + } + // new-style appearance entering a non-bake region, + // need to check for existence of the baking service. + else if (isAgentAvatarValid() && + gAgentAvatarp->isUsingServerBakes() && + mRegionp->getCentralBakeVersion()==0) + { + gAgentAvatarp->checkForUnsupportedServerBakeAppearance(); + } +} + //----------------------------------------------------------------------------- // setRegion() //----------------------------------------------------------------------------- @@ -903,6 +927,19 @@ void LLAgent::setRegion(LLViewerRegion *regionp) { LLEnvManagerNew::instance().onRegionCrossing(); } + + // If the newly entered region is using server bakes, and our + // current appearance is non-baked, request appearance update from + // server. + if (mRegionp->capabilitiesReceived()) + { + handleServerBakeRegionTransition(mRegionp->getRegionID()); + } + else + { + // Need to handle via callback after caps arrive. + mRegionp->setCapabilitiesReceivedCallback(boost::bind(&LLAgent::handleServerBakeRegionTransition,this,_1)); + } } @@ -1685,13 +1722,11 @@ void LLAgent::autoPilot(F32 *delta_yaw) *delta_yaw = yaw; - // Compute when to start slowing down and when to stop - F32 stop_distance = mAutoPilotStopDistance; + // Compute when to start slowing down F32 slow_distance; if (getFlying()) { slow_distance = llmax(6.f, mAutoPilotStopDistance + 5.f); - stop_distance = llmax(2.f, mAutoPilotStopDistance); } else { @@ -2277,7 +2312,7 @@ void LLAgent::setStartPosition( U32 location_id ) if (isAgentAvatarValid()) { // the z height is at the agent's feet - agent_pos.mV[VZ] -= 0.5f * gAgentAvatarp->mBodySize.mV[VZ]; + agent_pos.mV[VZ] -= 0.5f * (gAgentAvatarp->mBodySize.mV[VZ] + gAgentAvatarp->mAvatarOffset.mV[VZ]); } agent_pos.mV[VX] = llclamp( agent_pos.mV[VX], INSET, REGION_WIDTH - INSET ); @@ -2496,7 +2531,7 @@ public: virtual ~LLMaturityPreferencesResponder(); virtual void result(const LLSD &pContent); - virtual void error(U32 pStatus, const std::string& pReason); + virtual void errorWithContent(U32 pStatus, const std::string& pReason, const LLSD& pContent); protected: @@ -2534,11 +2569,11 @@ void LLMaturityPreferencesResponder::result(const LLSD &pContent) mAgent->handlePreferredMaturityResult(actualMaturity); } -void LLMaturityPreferencesResponder::error(U32 pStatus, const std::string& pReason) +void LLMaturityPreferencesResponder::errorWithContent(U32 pStatus, const std::string& pReason, const LLSD& pContent) { llwarns << "while attempting to change maturity preference from '" << LLViewerRegion::accessToString(mPreviousMaturity) - << "' to '" << LLViewerRegion::accessToString(mPreferredMaturity) << "', we got an error because '" - << pReason << "' [status:" << pStatus << "]" << llendl; + << "' to '" << LLViewerRegion::accessToString(mPreferredMaturity) << "', we got an error with [status:" + << pStatus << "]: " << (pContent.isDefined() ? pContent : LLSD(pReason)) << llendl; mAgent->handlePreferredMaturityError(); } @@ -2698,7 +2733,7 @@ void LLAgent::sendMaturityPreferenceToServer(U8 pPreferredMaturity) // If we don't have a region, report it as an error if (getRegion() == NULL) { - responderPtr->error(0U, "region is not defined"); + responderPtr->errorWithContent(0U, "region is not defined", LLSD()); } else { @@ -2708,7 +2743,8 @@ void LLAgent::sendMaturityPreferenceToServer(U8 pPreferredMaturity) // If the capability is not defined, report it as an error if (url.empty()) { - responderPtr->error(0U, "capability 'UpdateAgentInformation' is not defined for region"); + responderPtr->errorWithContent(0U, + "capability 'UpdateAgentInformation' is not defined for region", LLSD()); } else { @@ -3576,7 +3612,7 @@ void LLAgent::processAgentCachedTextureResponse(LLMessageSystem *mesgsys, void * return; } - if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures()) + if (isAgentAvatarValid() && gAgentAvatarp->isEditingAppearance()) { // ignore baked textures when in customize mode return; @@ -3600,7 +3636,7 @@ void LLAgent::processAgentCachedTextureResponse(LLMessageSystem *mesgsys, void * if ((S32)texture_index < TEX_NUM_INDICES ) { - const LLVOAvatarDictionary::TextureEntry *texture_entry = LLVOAvatarDictionary::instance().getTexture((ETextureIndex)texture_index); + const LLAvatarAppearanceDictionary::TextureEntry *texture_entry = LLAvatarAppearanceDictionary::instance().getTexture((ETextureIndex)texture_index); if (texture_entry) { EBakedTextureIndex baked_index = texture_entry->mBakedTextureIndex; @@ -4207,27 +4243,82 @@ void LLAgent::requestLeaveGodMode() sendReliableMessage(); } +// For debugging, trace agent state at times appearance message are sent out. +void LLAgent::dumpSentAppearance(const std::string& dump_prefix) +{ + std::string outfilename = get_sequential_numbered_file_name(dump_prefix,".xml"); + + LLAPRFile outfile; + std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,outfilename); + outfile.open(fullpath, LL_APR_WB ); + apr_file_t* file = outfile.getFileHandle(); + if (!file) + { + return; + } + else + { + LL_DEBUGS("Avatar") << "dumping sent appearance message to " << fullpath << llendl; + } + + LLVisualParam* appearance_version_param = gAgentAvatarp->getVisualParam(11000); + if (appearance_version_param) + { + F32 value = appearance_version_param->getWeight(); + dump_visual_param(file, appearance_version_param, value); + } + for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); + iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); + ++iter) + { + const ETextureIndex index = iter->first; + const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second; + if (texture_dict->mIsBakedTexture) + { + LLTextureEntry* entry = gAgentAvatarp->getTE((U8) index); + const LLUUID& uuid = entry->getID(); + apr_file_printf( file, "\t\t<texture te=\"%i\" uuid=\"%s\"/>\n", index, uuid.asString().c_str()); + } + } +} + //----------------------------------------------------------------------------- // sendAgentSetAppearance() //----------------------------------------------------------------------------- void LLAgent::sendAgentSetAppearance() { - if (!isAgentAvatarValid()) return; - - if (gAgentQueryManager.mNumPendingQueries > 0 && (isAgentAvatarValid() && gAgentAvatarp->isUsingBakedTextures())) + if (gAgentQueryManager.mNumPendingQueries > 0) { return; } - if (!gAgentWearables.changeInProgress()) + if (!isAgentAvatarValid() || (getRegion() && getRegion()->getCentralBakeVersion())) return; + + // At this point we have a complete appearance to send and are in a non-baking region. + // DRANO FIXME + //gAgentAvatarp->setIsUsingServerBakes(FALSE); + S32 sb_count, host_count, both_count, neither_count; + gAgentAvatarp->bakedTextureOriginCounts(sb_count, host_count, both_count, neither_count); + if (both_count != 0 || neither_count != 0) { - // Change is fully resolved, can close some open phases. - gAgentAvatarp->getPhases().stopPhase("process_initial_wearables_update"); - gAgentAvatarp->getPhases().stopPhase("wear_inventory_category"); + llwarns << "bad bake texture state " << sb_count << "," << host_count << "," << both_count << "," << neither_count << llendl; } + if (sb_count != 0 && host_count == 0) + { + gAgentAvatarp->setIsUsingServerBakes(true); + } + else if (sb_count == 0 && host_count != 0) + { + gAgentAvatarp->setIsUsingServerBakes(false); + } + else if (sb_count + host_count > 0) + { + llwarns << "unclear baked texture state, not sending appearance" << llendl; + return; + } + - gAgentAvatarp->sendAppearanceChangeMetrics(); - LL_INFOS("Avatar") << gAgentAvatarp->avString() << "TAT: Sent AgentSetAppearance: " << gAgentAvatarp->getBakedStatusForPrintout() << LL_ENDL; + LL_DEBUGS("Avatar") << gAgentAvatarp->avString() << "TAT: Sent AgentSetAppearance: " << gAgentAvatarp->getBakedStatusForPrintout() << LL_ENDL; //dumpAvatarTEs( "sendAgentSetAppearance()" ); LLMessageSystem* msg = gMessageSystem; @@ -4241,7 +4332,7 @@ void LLAgent::sendAgentSetAppearance() // NOTE -- when we start correcting all of the other Havok geometry // to compensate for the COLLISION_TOLERANCE ugliness we will have // to tweak this number again - const LLVector3 body_size = gAgentAvatarp->mBodySize; + const LLVector3 body_size = gAgentAvatarp->mBodySize + gAgentAvatarp->mAvatarOffset; msg->addVector3Fast(_PREHASH_Size, body_size); // To guard against out of order packets @@ -4255,7 +4346,7 @@ void LLAgent::sendAgentSetAppearance() for(U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++ ) { - const ETextureIndex texture_index = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)baked_index); + const ETextureIndex texture_index = LLAvatarAppearanceDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)baked_index); // if we're not wearing a skirt, we don't need the texture to be baked if (texture_index == TEX_SKIRT_BAKED && !gAgentAvatarp->isWearingWearableType(LLWearableType::WT_SKIRT)) @@ -4266,19 +4357,30 @@ void LLAgent::sendAgentSetAppearance() // IMG_DEFAULT_AVATAR means not baked. 0 index should be ignored for baked textures if (!gAgentAvatarp->isTextureDefined(texture_index, 0)) { + LL_DEBUGS("Avatar") << "texture not current for baked " << (S32)baked_index << " local " << (S32)texture_index << llendl; textures_current = FALSE; break; } } // only update cache entries if we have all our baked textures + + // FIXME DRANO need additional check for not in appearance editing + // mode, if still using local composites need to set using local + // composites to false, and update mesh textures. if (textures_current) { - LL_INFOS("Avatar") << gAgentAvatarp->avString() << "TAT: Sending cached texture data" << LL_ENDL; + bool enable_verbose_dumps = gSavedSettings.getBOOL("DebugAvatarAppearanceMessage"); + std::string dump_prefix = gAgentAvatarp->getFullname() + "_sent_appearance"; + if (enable_verbose_dumps) + { + dumpSentAppearance(dump_prefix); + } + LL_DEBUGS("Avatar") << gAgentAvatarp->avString() << "TAT: Sending cached texture data" << LL_ENDL; for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++) { BOOL generate_valid_hash = TRUE; - if (isAgentAvatarValid() && !gAgentAvatarp->isBakedTextureFinal((LLVOAvatarDefines::EBakedTextureIndex)baked_index)) + if (isAgentAvatarValid() && !gAgentAvatarp->isBakedTextureFinal((LLAvatarAppearanceDefines::EBakedTextureIndex)baked_index)) { generate_valid_hash = FALSE; LL_DEBUGS("Avatar") << gAgentAvatarp->avString() << "Not caching baked texture upload for " << (U32)baked_index << " due to being uploaded at low resolution." << LL_ENDL; @@ -4287,7 +4389,7 @@ void LLAgent::sendAgentSetAppearance() const LLUUID hash = gAgentWearables.computeBakedTextureHash((EBakedTextureIndex) baked_index, generate_valid_hash); if (hash.notNull()) { - ETextureIndex texture_index = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex) baked_index); + ETextureIndex texture_index = LLAvatarAppearanceDictionary::bakedToLocalTextureIndex((EBakedTextureIndex) baked_index); msg->nextBlockFast(_PREHASH_WearableData); msg->addUUIDFast(_PREHASH_CacheID, hash); msg->addU8Fast(_PREHASH_TextureIndex, (U8)texture_index); diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index daa15b0c1a..f5f26f69d8 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -33,7 +33,8 @@ #include "llagentdata.h" // gAgentID, gAgentSessionID #include "llcharacter.h" #include "llcoordframe.h" // for mFrameAgent -#include "llvoavatardefines.h" +#include "llavatarappearancedefines.h" +#include "llpermissionsflags.h" #include <boost/function.hpp> #include <boost/shared_ptr.hpp> @@ -608,6 +609,7 @@ private: void handleTeleportFinished(); void handleTeleportFailed(); + void handleServerBakeRegionTransition(const LLUUID& region_id); //-------------------------------------------------------------------- // Teleport State @@ -842,6 +844,7 @@ private: public: void sendMessage(); // Send message to this agent's region void sendReliableMessage(); + void dumpSentAppearance(const std::string& dump_prefix); void sendAgentSetAppearance(); void sendAgentDataUpdateRequest(); void sendAgentUserInfoRequest(); @@ -900,7 +903,7 @@ private: S32 mNumPendingQueries; S32 mWearablesCacheQueryID; U32 mUpdateSerialNum; - S32 mActiveCacheQueries[LLVOAvatarDefines::BAKED_NUM_INDICES]; + S32 mActiveCacheQueries[LLAvatarAppearanceDefines::BAKED_NUM_INDICES]; }; extern LLAgentQueryManager gAgentQueryManager; diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 9025c7af8b..488a134aa2 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -50,7 +50,7 @@ #include "llwindow.h" #include "llworld.h" -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines; extern LLMenuBarGL* gMenuBarView; @@ -594,7 +594,6 @@ BOOL LLAgentCamera::calcCameraMinDistance(F32 &obj_min_distance) abs_target_offset.abs(); LLVector3 target_offset_dir = target_offset_origin; - F32 object_radius = mFocusObject->getVObjRadius(); BOOL target_outside_object_extents = FALSE; @@ -689,17 +688,6 @@ BOOL LLAgentCamera::calcCameraMinDistance(F32 &obj_min_distance) LLVector3 camera_offset_object(getCameraPositionAgent() - mFocusObject->getPositionAgent()); - // length projected orthogonal to target offset - F32 camera_offset_dist = (camera_offset_object - target_offset_dir * (camera_offset_object * target_offset_dir)).magVec(); - - // calculate whether the target point would be "visible" if it were outside the bounding box - // on the opposite of the splitting plane defined by object_split_axis; - BOOL exterior_target_visible = FALSE; - if (camera_offset_dist > object_radius) - { - // target is visible from camera, so turn off fov zoom - exterior_target_visible = TRUE; - } F32 camera_offset_clip = camera_offset_object * object_split_axis; F32 target_offset_clip = target_offset_dir * object_split_axis; @@ -1079,8 +1067,8 @@ void LLAgentCamera::updateLookAt(const S32 mouse_x, const S32 mouse_y) if (!isAgentAvatarValid()) return; - LLQuaternion av_inv_rot = ~gAgentAvatarp->mRoot.getWorldRotation(); - LLVector3 root_at = LLVector3::x_axis * gAgentAvatarp->mRoot.getWorldRotation(); + LLQuaternion av_inv_rot = ~gAgentAvatarp->mRoot->getWorldRotation(); + LLVector3 root_at = LLVector3::x_axis * gAgentAvatarp->mRoot->getWorldRotation(); if ((gViewerWindow->getMouseVelocityStat()->getCurrent() < 0.01f) && (root_at * last_at_axis > 0.95f)) @@ -1433,7 +1421,7 @@ void LLAgentCamera::updateCamera() LLVector3(0.08f, 0.f, 0.05f) * gAgentAvatarp->mHeadp->getWorldRotation() + LLVector3(0.1f, 0.f, 0.f) * gAgentAvatarp->mPelvisp->getWorldRotation(); LLVector3 diff = mCameraPositionAgent - head_pos; - diff = diff * ~gAgentAvatarp->mRoot.getWorldRotation(); + diff = diff * ~gAgentAvatarp->mRoot->getWorldRotation(); LLJoint* torso_joint = gAgentAvatarp->mTorsop; LLJoint* chest_joint = gAgentAvatarp->mChestp; @@ -1457,7 +1445,7 @@ void LLAgentCamera::updateCamera() gAgentAvatarp->mPelvisp->setPosition(gAgentAvatarp->mPelvisp->getPosition() + diff); - gAgentAvatarp->mRoot.updateWorldMatrixChildren(); + gAgentAvatarp->mRoot->updateWorldMatrixChildren(); for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); iter != gAgentAvatarp->mAttachmentPoints.end(); ) @@ -1658,7 +1646,6 @@ F32 LLAgentCamera::calcCameraFOVZoomFactor() else if (mFocusObject.notNull() && !mFocusObject->isAvatar() && !mFocusOnAvatar) { // don't FOV zoom on mostly transparent objects - LLVector3 focus_offset = mFocusObjectOffset; F32 obj_min_dist = 0.f; calcCameraMinDistance(obj_min_dist); F32 current_distance = llmax(0.001f, camera_offset_dir.magVec()); @@ -1685,7 +1672,7 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit) F32 camera_land_height; LLVector3d frame_center_global = !isAgentAvatarValid() ? gAgent.getPositionGlobal() : - gAgent.getPosGlobalFromAgent(gAgentAvatarp->mRoot.getWorldPosition()); + gAgent.getPosGlobalFromAgent(gAgentAvatarp->mRoot->getWorldPosition()); BOOL isConstrained = FALSE; LLVector3d head_offset; @@ -1820,7 +1807,6 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit) // set the global camera position LLVector3d camera_offset; - LLVector3 av_pos = !isAgentAvatarValid() ? LLVector3::zero : gAgentAvatarp->getRenderPosition(); camera_offset.setVec( local_camera_offset ); camera_position_global = frame_center_global + head_offset + camera_offset; @@ -2257,7 +2243,7 @@ void LLAgentCamera::changeCameraToThirdPerson(BOOL animate) //----------------------------------------------------------------------------- void LLAgentCamera::changeCameraToCustomizeAvatar() { - if (LLViewerJoystick::getInstance()->getOverrideCamera()) + if (LLViewerJoystick::getInstance()->getOverrideCamera() || !isAgentAvatarValid()) { return; } @@ -2281,10 +2267,6 @@ void LLAgentCamera::changeCameraToCustomizeAvatar() gFocusMgr.setKeyboardFocus( NULL ); gFocusMgr.setMouseCapture( NULL ); - LLVOAvatarSelf::onCustomizeStart(); - - if (isAgentAvatarValid()) - { // Remove any pitch or rotation from the avatar LLVector3 at = gAgent.getAtAxis(); at.mV[VZ] = 0.f; @@ -2301,10 +2283,6 @@ void LLAgentCamera::changeCameraToCustomizeAvatar() // delay camera animation long enough to play through turn animation setAnimationDuration(turn_motion->getDuration() + CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP); } - - gAgentAvatarp->invalidateAll(); - gAgentAvatarp->updateMeshTextures(); - } } LLVector3 agent_at = gAgent.getAtAxis(); diff --git a/indra/newview/llagentpilot.cpp b/indra/newview/llagentpilot.cpp index 734c502fcf..c7872fc5f6 100644 --- a/indra/newview/llagentpilot.cpp +++ b/indra/newview/llagentpilot.cpp @@ -139,7 +139,7 @@ void LLAgentPilot::loadXML(const std::string& filename) mActions.reset(); LLSD record; - while (!file.eof() && LLSDSerialize::fromXML(record, file)) + while (!file.eof() && LLSDParser::PARSE_FAILURE != LLSDSerialize::fromXML(record, file)) { Action action; action.mTime = record["time"].asReal(); diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index e441f21f90..dc22aae8d4 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -47,7 +47,7 @@ #include "lltooldraganddrop.h" #include "llviewerregion.h" #include "llvoavatarself.h" -#include "llwearable.h" +#include "llviewerwearable.h" #include "llwearablelist.h" #include <boost/scoped_ptr.hpp> @@ -56,14 +56,12 @@ LLAgentWearables gAgentWearables; BOOL LLAgentWearables::mInitialWearablesUpdateReceived = FALSE; -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines; /////////////////////////////////////////////////////////////////////////////// // Callback to wear and start editing an item that has just been created. -class LLWearAndEditCallback : public LLInventoryCallback -{ - void fire(const LLUUID& inv_item) +void wear_and_edit_cb(const LLUUID& inv_item) { if (inv_item.isNull()) return; @@ -73,7 +71,6 @@ class LLWearAndEditCallback : public LLInventoryCallback // Wear it. LLAppearanceMgr::instance().wearItemOnAvatar(inv_item); } -}; /////////////////////////////////////////////////////////////////////////////// @@ -82,7 +79,7 @@ class LLWearAndEditCallback : public LLInventoryCallback // wearable type stored in asset is some other value. // Calling this function whenever a wearable is added to increase visibility if this problem // turns up in other inventories. -void checkWearableAgainstInventory(LLWearable *wearable) +void checkWearableAgainstInventory(LLViewerWearable *wearable) { if (wearable->getItemID().isNull()) return; @@ -119,7 +116,7 @@ void LLAgentWearables::dump() llinfos << "Type: " << i << " count " << count << llendl; for (U32 j=0; j<count; j++) { - LLWearable* wearable = getWearable((LLWearableType::EType)i,j); + LLViewerWearable* wearable = getViewerWearable((LLWearableType::EType)i,j); if (wearable == NULL) { llinfos << " " << j << " NULL wearable" << llendl; @@ -159,6 +156,7 @@ struct LLAgentDumper }; LLAgentWearables::LLAgentWearables() : + LLWearableData(), mWearablesLoaded(FALSE) , mCOFChangeInProgress(false) { @@ -183,11 +181,10 @@ void LLAgentWearables::initClass() void LLAgentWearables::setAvatarObject(LLVOAvatarSelf *avatar) { - if (avatar) - { + llassert(avatar); avatar->outputRezTiming("Sending wearables request"); sendAgentWearablesRequest(); - } + setAvatarAppearance(avatar); } // wearables @@ -213,12 +210,13 @@ LLAgentWearables::sendAgentWearablesUpdateCallback::~sendAgentWearablesUpdateCal * @param todo Bitmask of actions to take on completion. */ LLAgentWearables::addWearableToAgentInventoryCallback::addWearableToAgentInventoryCallback( - LLPointer<LLRefCount> cb, LLWearableType::EType type, U32 index, LLWearable* wearable, U32 todo) : + LLPointer<LLRefCount> cb, LLWearableType::EType type, U32 index, LLViewerWearable* wearable, U32 todo, const std::string description) : mType(type), mIndex(index), mWearable(wearable), mTodo(todo), - mCB(cb) + mCB(cb), + mDescription(description) { llinfos << "constructor" << llendl; } @@ -258,14 +256,14 @@ void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& i } if (mTodo & CALL_WEARITEM) { - LLAppearanceMgr::instance().addCOFItemLink(inv_item, true); + LLAppearanceMgr::instance().addCOFItemLink(inv_item, true, NULL, mDescription); } } void LLAgentWearables::addWearabletoAgentInventoryDone(const LLWearableType::EType type, const U32 index, const LLUUID& item_id, - LLWearable* wearable) + LLViewerWearable* wearable) { llinfos << "type " << type << " index " << index << " item " << item_id.asString() << llendl; @@ -312,7 +310,7 @@ void LLAgentWearables::sendAgentWearablesUpdate() { for (U32 index=0; index < getWearableCount((LLWearableType::EType)type); ++index) { - LLWearable* wearable = getWearable((LLWearableType::EType)type,index); + LLViewerWearable* wearable = getViewerWearable((LLWearableType::EType)type,index); if (wearable) { if (wearable->getItemID().isNull()) @@ -354,7 +352,7 @@ void LLAgentWearables::sendAgentWearablesUpdate() U8 type_u8 = (U8)type; gMessageSystem->addU8Fast(_PREHASH_WearableType, type_u8); - LLWearable* wearable = getWearable((LLWearableType::EType)type, 0); + LLViewerWearable* wearable = getViewerWearable((LLWearableType::EType)type, 0); if (wearable) { //llinfos << "Sending wearable " << wearable->getName() << llendl; @@ -382,14 +380,14 @@ void LLAgentWearables::sendAgentWearablesUpdate() void LLAgentWearables::saveWearable(const LLWearableType::EType type, const U32 index, BOOL send_update, const std::string new_name) { - LLWearable* old_wearable = getWearable(type, index); + LLViewerWearable* old_wearable = getViewerWearable(type, index); if(!old_wearable) return; bool name_changed = !new_name.empty() && (new_name != old_wearable->getName()); if (name_changed || old_wearable->isDirty() || old_wearable->isOldVersion()) { LLUUID old_item_id = old_wearable->getItemID(); - LLWearable* new_wearable = LLWearableList::instance().createCopy(old_wearable); - new_wearable->setItemID(old_item_id); // should this be in LLWearable::copyDataFrom()? + LLViewerWearable* new_wearable = LLWearableList::instance().createCopy(old_wearable); + new_wearable->setItemID(old_item_id); // should this be in LLViewerWearable::copyDataFrom()? setWearable(type,index,new_wearable); // old_wearable may still be referred to by other inventory items. Revert @@ -458,6 +456,7 @@ void LLAgentWearables::saveWearable(const LLWearableType::EType type, const U32 void LLAgentWearables::saveWearableAs(const LLWearableType::EType type, const U32 index, const std::string& new_name, + const std::string& description, BOOL save_in_lost_and_found) { if (!isWearableCopyable(type, index)) @@ -465,7 +464,7 @@ void LLAgentWearables::saveWearableAs(const LLWearableType::EType type, llwarns << "LLAgent::saveWearableAs() not copyable." << llendl; return; } - LLWearable* old_wearable = getWearable(type, index); + LLViewerWearable* old_wearable = getViewerWearable(type, index); if (!old_wearable) { llwarns << "LLAgent::saveWearableAs() no old wearable." << llendl; @@ -480,7 +479,7 @@ void LLAgentWearables::saveWearableAs(const LLWearableType::EType type, } std::string trunc_name(new_name); LLStringUtil::truncate(trunc_name, DB_INV_ITEM_NAME_STR_LEN); - LLWearable* new_wearable = LLWearableList::instance().createCopy( + LLViewerWearable* new_wearable = LLWearableList::instance().createCopy( old_wearable, trunc_name); LLPointer<LLInventoryCallback> cb = @@ -489,7 +488,9 @@ void LLAgentWearables::saveWearableAs(const LLWearableType::EType type, type, index, new_wearable, - addWearableToAgentInventoryCallback::CALL_WEARITEM); + addWearableToAgentInventoryCallback::CALL_WEARITEM, + description + ); LLUUID category_id; if (save_in_lost_and_found) { @@ -518,7 +519,7 @@ void LLAgentWearables::saveWearableAs(const LLWearableType::EType type, void LLAgentWearables::revertWearable(const LLWearableType::EType type, const U32 index) { - LLWearable* wearable = getWearable(type, index); + LLViewerWearable* wearable = getViewerWearable(type, index); llassert(wearable); if (wearable) { @@ -553,13 +554,13 @@ void LLAgentWearables::setWearableName(const LLUUID& item_id, const std::string& LLUUID curr_item_id = getWearableItemID((LLWearableType::EType)i,j); if (curr_item_id == item_id) { - LLWearable* old_wearable = getWearable((LLWearableType::EType)i,j); + LLViewerWearable* old_wearable = getViewerWearable((LLWearableType::EType)i,j); llassert(old_wearable); if (!old_wearable) continue; std::string old_name = old_wearable->getName(); old_wearable->setName(new_name); - LLWearable* new_wearable = LLWearableList::instance().createCopy(old_wearable); + LLViewerWearable* new_wearable = LLWearableList::instance().createCopy(old_wearable); new_wearable->setItemID(item_id); LLInventoryItem* item = gInventory.getItem(item_id); if (item) @@ -640,14 +641,14 @@ LLInventoryItem* LLAgentWearables::getWearableInventoryItem(LLWearableType::ETyp return item; } -const LLWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id) const +const LLViewerWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id) const { const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id); for (S32 i=0; i < LLWearableType::WT_COUNT; i++) { for (U32 j=0; j < getWearableCount((LLWearableType::EType)i); j++) { - const LLWearable * curr_wearable = getWearable((LLWearableType::EType)i, j); + const LLViewerWearable * curr_wearable = getViewerWearable((LLWearableType::EType)i, j); if (curr_wearable && (curr_wearable->getItemID() == base_item_id)) { return curr_wearable; @@ -657,14 +658,14 @@ const LLWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id) return NULL; } -LLWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id) +LLViewerWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id) { const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id); for (S32 i=0; i < LLWearableType::WT_COUNT; i++) { for (U32 j=0; j < getWearableCount((LLWearableType::EType)i); j++) { - LLWearable * curr_wearable = getWearable((LLWearableType::EType)i, j); + LLViewerWearable * curr_wearable = getViewerWearable((LLWearableType::EType)i, j); if (curr_wearable && (curr_wearable->getItemID() == base_item_id)) { return curr_wearable; @@ -674,13 +675,13 @@ LLWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id) return NULL; } -LLWearable* LLAgentWearables::getWearableFromAssetID(const LLUUID& asset_id) +LLViewerWearable* LLAgentWearables::getWearableFromAssetID(const LLUUID& asset_id) { for (S32 i=0; i < LLWearableType::WT_COUNT; i++) { for (U32 j=0; j < getWearableCount((LLWearableType::EType)i); j++) { - LLWearable * curr_wearable = getWearable((LLWearableType::EType)i, j); + LLViewerWearable * curr_wearable = getViewerWearable((LLWearableType::EType)i, j); if (curr_wearable && (curr_wearable->getAssetID() == asset_id)) { return curr_wearable; @@ -699,85 +700,37 @@ void LLAgentWearables::sendAgentWearablesRequest() gAgent.sendReliableMessage(); } -// static -BOOL LLAgentWearables::selfHasWearable(LLWearableType::EType type) +LLViewerWearable* LLAgentWearables::getViewerWearable(const LLWearableType::EType type, U32 index /*= 0*/) { - return (gAgentWearables.getWearableCount(type) > 0); + return dynamic_cast<LLViewerWearable*> (getWearable(type, index)); } -LLWearable* LLAgentWearables::getWearable(const LLWearableType::EType type, U32 index) -{ - wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(type); - if (wearable_iter == mWearableDatas.end()) - { - return NULL; - } - wearableentry_vec_t& wearable_vec = wearable_iter->second; - if (index>=wearable_vec.size()) +const LLViewerWearable* LLAgentWearables::getViewerWearable(const LLWearableType::EType type, U32 index /*= 0*/) const { - return NULL; - } - else - { - return wearable_vec[index]; - } + return dynamic_cast<const LLViewerWearable*> (getWearable(type, index)); } -void LLAgentWearables::setWearable(const LLWearableType::EType type, U32 index, LLWearable *wearable) -{ - - LLWearable *old_wearable = getWearable(type,index); - if (!old_wearable) +// static +BOOL LLAgentWearables::selfHasWearable(LLWearableType::EType type) { - pushWearable(type,wearable); - return; + return (gAgentWearables.getWearableCount(type) > 0); } - wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(type); - if (wearable_iter == mWearableDatas.end()) +// virtual +void LLAgentWearables::wearableUpdated(LLWearable *wearable, BOOL removed) { - llwarns << "invalid type, type " << type << " index " << index << llendl; - return; - } - wearableentry_vec_t& wearable_vec = wearable_iter->second; - if (index>=wearable_vec.size()) - { - llwarns << "invalid index, type " << type << " index " << index << llendl; - } - else + if (isAgentAvatarValid()) { - wearable_vec[index] = wearable; - old_wearable->setLabelUpdated(); - wearableUpdated(wearable); - checkWearableAgainstInventory(wearable); - } + const BOOL upload_result = removed; + gAgentAvatarp->wearableUpdated(wearable->getType(), upload_result); } -U32 LLAgentWearables::pushWearable(const LLWearableType::EType type, LLWearable *wearable) -{ - if (wearable == NULL) - { - // no null wearables please! - llwarns << "Null wearable sent for type " << type << llendl; - return MAX_CLOTHING_PER_TYPE; - } - if (type < LLWearableType::WT_COUNT || mWearableDatas[type].size() < MAX_CLOTHING_PER_TYPE) - { - mWearableDatas[type].push_back(wearable); - wearableUpdated(wearable); - checkWearableAgainstInventory(wearable); - return mWearableDatas[type].size()-1; - } - return MAX_CLOTHING_PER_TYPE; -} + LLWearableData::wearableUpdated(wearable, removed); -void LLAgentWearables::wearableUpdated(LLWearable *wearable) + if (!removed) { - gAgentAvatarp->wearableUpdated(wearable->getType(), FALSE); - wearable->refreshName(); - wearable->setLabelUpdated(); - - wearable->pullCrossWearableValues(); + LLViewerWearable* viewer_wearable = dynamic_cast<LLViewerWearable*>(wearable); + viewer_wearable->refreshName(); // Hack pt 2. If the wearable we just loaded has definition version 24, // then force a re-save of this wearable after slamming the version number to 22. @@ -788,126 +741,14 @@ void LLAgentWearables::wearableUpdated(LLWearable *wearable) { wearable->setDefinitionVersion(22); U32 index = getWearableIndex(wearable); - llinfos << "forcing werable type " << wearable->getType() << " to version 22 from 24" << llendl; + llinfos << "forcing wearable type " << wearable->getType() << " to version 22 from 24" << llendl; saveWearable(wearable->getType(),index,TRUE); } + checkWearableAgainstInventory(viewer_wearable); } - -void LLAgentWearables::popWearable(LLWearable *wearable) -{ - if (wearable == NULL) - { - // nothing to do here. move along. - return; - } - - U32 index = getWearableIndex(wearable); - LLWearableType::EType type = wearable->getType(); - - if (index < MAX_CLOTHING_PER_TYPE && index < getWearableCount(type)) - { - popWearable(type, index); - } -} - -void LLAgentWearables::popWearable(const LLWearableType::EType type, U32 index) -{ - LLWearable *wearable = getWearable(type, index); - if (wearable) - { - mWearableDatas[type].erase(mWearableDatas[type].begin() + index); - if (isAgentAvatarValid()) - { - gAgentAvatarp->wearableUpdated(wearable->getType(), TRUE); - } - wearable->setLabelUpdated(); - } -} - -U32 LLAgentWearables::getWearableIndex(const LLWearable *wearable) const -{ - if (wearable == NULL) - { - return MAX_CLOTHING_PER_TYPE; - } - - const LLWearableType::EType type = wearable->getType(); - wearableentry_map_t::const_iterator wearable_iter = mWearableDatas.find(type); - if (wearable_iter == mWearableDatas.end()) - { - llwarns << "tried to get wearable index with an invalid type!" << llendl; - return MAX_CLOTHING_PER_TYPE; - } - const wearableentry_vec_t& wearable_vec = wearable_iter->second; - for(U32 index = 0; index < wearable_vec.size(); index++) - { - if (wearable_vec[index] == wearable) - { - return index; - } - } - - return MAX_CLOTHING_PER_TYPE; } -const LLWearable* LLAgentWearables::getWearable(const LLWearableType::EType type, U32 index) const -{ - wearableentry_map_t::const_iterator wearable_iter = mWearableDatas.find(type); - if (wearable_iter == mWearableDatas.end()) - { - return NULL; - } - const wearableentry_vec_t& wearable_vec = wearable_iter->second; - if (index>=wearable_vec.size()) - { - return NULL; - } - else - { - return wearable_vec[index]; - } -} - -LLWearable* LLAgentWearables::getTopWearable(const LLWearableType::EType type) -{ - U32 count = getWearableCount(type); - if ( count == 0) - { - return NULL; - } - - return getWearable(type, count-1); -} - -LLWearable* LLAgentWearables::getBottomWearable(const LLWearableType::EType type) -{ - if (getWearableCount(type) == 0) - { - return NULL; - } - - return getWearable(type, 0); -} - -U32 LLAgentWearables::getWearableCount(const LLWearableType::EType type) const -{ - wearableentry_map_t::const_iterator wearable_iter = mWearableDatas.find(type); - if (wearable_iter == mWearableDatas.end()) - { - return 0; - } - const wearableentry_vec_t& wearable_vec = wearable_iter->second; - return wearable_vec.size(); -} - -U32 LLAgentWearables::getWearableCount(const U32 tex_index) const -{ - const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType((LLVOAvatarDefines::ETextureIndex)tex_index); - return getWearableCount(wearable_type); -} - - BOOL LLAgentWearables::itemUpdatePending(const LLUUID& item_id) const { return mItemsAwaitingWearableUpdate.find(item_id) != mItemsAwaitingWearableUpdate.end(); @@ -920,7 +761,7 @@ U32 LLAgentWearables::itemUpdatePendingCount() const const LLUUID LLAgentWearables::getWearableItemID(LLWearableType::EType type, U32 index) const { - const LLWearable *wearable = getWearable(type,index); + const LLViewerWearable *wearable = getViewerWearable(type,index); if (wearable) return wearable->getItemID(); else @@ -929,7 +770,7 @@ const LLUUID LLAgentWearables::getWearableItemID(LLWearableType::EType type, U32 const LLUUID LLAgentWearables::getWearableAssetID(LLWearableType::EType type, U32 index) const { - const LLWearable *wearable = getWearable(type,index); + const LLViewerWearable *wearable = getViewerWearable(type,index); if (wearable) return wearable->getAssetID(); else @@ -955,8 +796,7 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs if (isAgentAvatarValid()) { - //gAgentAvatarp->clearPhases(); // reset phase timers for outfit loading. - gAgentAvatarp->getPhases().startPhase("process_initial_wearables_update"); + gAgentAvatarp->startPhase("process_initial_wearables_update"); gAgentAvatarp->outputRezTiming("Received initial wearables update"); } @@ -1012,7 +852,7 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs gMessageSystem->getUUIDFast(_PREHASH_WearableData, _PREHASH_AssetID, asset_id, i); if (asset_id.isNull()) { - LLWearable::removeFromAvatar(type, FALSE); + LLViewerWearable::removeFromAvatar(type, FALSE); } else { @@ -1058,7 +898,7 @@ void LLAgentWearables::recoverMissingWearable(const LLWearableType::EType type, // Try to recover by replacing missing wearable with a new one. LLNotificationsUtil::add("ReplacedMissingWearable"); lldebugs << "Wearable " << LLWearableType::getTypeLabel(type) << " could not be downloaded. Replaced inventory item with default wearable." << llendl; - LLWearable* new_wearable = LLWearableList::instance().createNewWearable(type); + LLViewerWearable* new_wearable = LLWearableList::instance().createNewWearable(type, gAgentAvatarp); setWearable(type,index,new_wearable); //new_wearable->writeToAvatar(TRUE); @@ -1093,9 +933,9 @@ void LLAgentWearables::recoverMissingWearableDone() } } -void LLAgentWearables::addLocalTextureObject(const LLWearableType::EType wearable_type, const LLVOAvatarDefines::ETextureIndex texture_type, U32 wearable_index) +void LLAgentWearables::addLocalTextureObject(const LLWearableType::EType wearable_type, const LLAvatarAppearanceDefines::ETextureIndex texture_type, U32 wearable_index) { - LLWearable* wearable = getWearable((LLWearableType::EType)wearable_type, wearable_index); + LLViewerWearable* wearable = getViewerWearable((LLWearableType::EType)wearable_type, wearable_index); if (!wearable) { llerrs << "Tried to add local texture object to invalid wearable with type " << wearable_type << " and index " << wearable_index << llendl; @@ -1128,7 +968,7 @@ public: mItemsToLink, link_waiter); } - void addPendingWearable(LLWearable *wearable) + void addPendingWearable(LLViewerWearable *wearable) { if (!wearable) { @@ -1163,7 +1003,7 @@ public: LLWearableType::EType type = item->getWearableType(); if (type < LLWearableType::WT_COUNT) { - LLWearable *wearable = mWearablesAwaitingItems[type]; + LLViewerWearable *wearable = mWearablesAwaitingItems[type]; if (wearable) wearable->setItemID(inv_item); } @@ -1176,7 +1016,7 @@ public: private: LLInventoryModel::item_array_t mItemsToLink; - std::vector<LLWearable*> mWearablesAwaitingItems; + std::vector<LLViewerWearable*> mWearablesAwaitingItems; }; void LLAgentWearables::createStandardWearables() @@ -1208,7 +1048,7 @@ void LLAgentWearables::createStandardWearables() if (create[i]) { llassert(getWearableCount((LLWearableType::EType)i) == 0); - LLWearable* wearable = LLWearableList::instance().createNewWearable((LLWearableType::EType)i); + LLViewerWearable* wearable = LLWearableList::instance().createNewWearable((LLWearableType::EType)i, gAgentAvatarp); ((OnWearableItemCreatedCB*)(&(*cb)))->addPendingWearable(wearable); // no need to update here... LLUUID category_id = LLUUID::null; @@ -1267,7 +1107,7 @@ void LLAgentWearables::makeNewOutfitDone(S32 type, U32 index) void LLAgentWearables::addWearableToAgentInventory(LLPointer<LLInventoryCallback> cb, - LLWearable* wearable, + LLViewerWearable* wearable, const LLUUID& category_id, BOOL notify) { @@ -1305,7 +1145,7 @@ void LLAgentWearables::removeWearable(const LLWearableType::EType type, bool do_ } else { - LLWearable* old_wearable = getWearable(type,index); + LLViewerWearable* old_wearable = getViewerWearable(type,index); if (old_wearable) { @@ -1360,10 +1200,10 @@ void LLAgentWearables::removeWearableFinal(const LLWearableType::EType type, boo //LLAgentDumper dumper("removeWearable"); if (do_remove_all) { - S32 max_entry = mWearableDatas[type].size()-1; + S32 max_entry = getWearableCount(type)-1; for (S32 i=max_entry; i>=0; i--) { - LLWearable* old_wearable = getWearable(type,i); + LLViewerWearable* old_wearable = getViewerWearable(type,i); //queryWearableCache(); // moved below if (old_wearable) { @@ -1371,11 +1211,11 @@ void LLAgentWearables::removeWearableFinal(const LLWearableType::EType type, boo old_wearable->removeFromAvatar(TRUE); } } - mWearableDatas[type].clear(); + clearWearableType(type); } else { - LLWearable* old_wearable = getWearable(type, index); + LLViewerWearable* old_wearable = getViewerWearable(type, index); //queryWearableCache(); // moved below if (old_wearable) @@ -1394,7 +1234,7 @@ void LLAgentWearables::removeWearableFinal(const LLWearableType::EType type, boo // Assumes existing wearables are not dirty. void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& items, - const LLDynamicArray< LLWearable* >& wearables, + const LLDynamicArray< LLViewerWearable* >& wearables, BOOL remove) { llinfos << "setWearableOutfit() start" << llendl; @@ -1419,7 +1259,7 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it S32 i; for (i = 0; i < count; i++) { - LLWearable* new_wearable = wearables[i]; + LLViewerWearable* new_wearable = wearables[i]; LLPointer<LLInventoryItem> new_item = items[i]; llassert(new_wearable); @@ -1439,8 +1279,8 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it { pushWearable(type,new_wearable); } - wearableUpdated(new_wearable); - checkWearableAgainstInventory(new_wearable); + const BOOL removed = FALSE; + wearableUpdated(new_wearable, removed); } } @@ -1476,7 +1316,7 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it // User has picked "wear on avatar" from a menu. -void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLWearable* new_wearable, bool do_append) +void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLViewerWearable* new_wearable, bool do_append) { //LLAgentDumper dumper("setWearableItem"); if (isWearingItem(new_item->getUUID())) @@ -1491,7 +1331,7 @@ void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLWearable* ne { // Remove old wearable, if any // MULTI_WEARABLE: hardwired to 0 - LLWearable* old_wearable = getWearable(type,0); + LLViewerWearable* old_wearable = getViewerWearable(type,0); if (old_wearable) { const LLUUID& old_item_id = old_wearable->getItemID(); @@ -1517,7 +1357,7 @@ void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLWearable* ne } // static -bool LLAgentWearables::onSetWearableDialog(const LLSD& notification, const LLSD& response, LLWearable* wearable) +bool LLAgentWearables::onSetWearableDialog(const LLSD& notification, const LLSD& response, LLViewerWearable* wearable) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); LLInventoryItem* new_item = gInventory.getItem(notification["payload"]["item_id"].asUUID()); @@ -1553,16 +1393,17 @@ bool LLAgentWearables::onSetWearableDialog(const LLSD& notification, const LLSD& // Called from setWearableItem() and onSetWearableDialog() to actually set the wearable. // MULTI_WEARABLE: unify code after null objects are gone. -void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLWearable* new_wearable, bool do_append) +void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLViewerWearable* new_wearable, bool do_append) { const LLWearableType::EType type = new_wearable->getType(); if (do_append && getWearableItemID(type,0).notNull()) { new_wearable->setItemID(new_item->getUUID()); - mWearableDatas[type].push_back(new_wearable); + const bool trigger_updated = false; + pushWearable(type, new_wearable, trigger_updated); llinfos << "Added additional wearable for type " << type - << " size is now " << mWearableDatas[type].size() << llendl; + << " size is now " << getWearableCount(type) << llendl; checkWearableAgainstInventory(new_wearable); } else @@ -1570,7 +1411,7 @@ void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLWearable* n // Replace the old wearable with a new one. llassert(new_item->getAssetUUID() == new_wearable->getAssetID()); - LLWearable *old_wearable = getWearable(type,0); + LLViewerWearable *old_wearable = getViewerWearable(type,0); LLUUID old_item_id; if (old_wearable) { @@ -1585,7 +1426,7 @@ void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLWearable* n gInventory.notifyObservers(); } llinfos << "Replaced current element 0 for type " << type - << " size is now " << mWearableDatas[type].size() << llendl; + << " size is now " << getWearableCount(type) << llendl; } //llinfos << "LLVOAvatar::setWearableItem()" << llendl; @@ -1597,7 +1438,7 @@ void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLWearable* n void LLAgentWearables::queryWearableCache() { - if (!areWearablesLoaded()) + if (!areWearablesLoaded() || (gAgent.getRegion() && gAgent.getRegion()->getCentralBakeVersion())) { return; } @@ -1626,7 +1467,7 @@ void LLAgentWearables::queryWearableCache() num_queries++; // *NOTE: make sure at least one request gets packed - ETextureIndex te_index = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)baked_index); + ETextureIndex te_index = LLAvatarAppearanceDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)baked_index); //llinfos << "Requesting texture for hash " << hash << " in baked texture slot " << baked_index << llendl; gMessageSystem->nextBlockFast(_PREHASH_WearableData); @@ -1645,54 +1486,22 @@ void LLAgentWearables::queryWearableCache() gAgentAvatarp->outputRezTiming("Fetching textures from cache"); } - LL_INFOS("Avatar") << gAgentAvatarp->avString() << "Requesting texture cache entry for " << num_queries << " baked textures" << LL_ENDL; + LL_DEBUGS("Avatar") << gAgentAvatarp->avString() << "Requesting texture cache entry for " << num_queries << " baked textures" << LL_ENDL; gMessageSystem->sendReliable(gAgent.getRegion()->getHost()); gAgentQueryManager.mNumPendingQueries++; gAgentQueryManager.mWearablesCacheQueryID++; } } -LLUUID LLAgentWearables::computeBakedTextureHash(LLVOAvatarDefines::EBakedTextureIndex baked_index, - BOOL generate_valid_hash) // Set to false if you want to upload the baked texture w/o putting it in the cache -{ - LLUUID hash_id; - bool hash_computed = false; - LLMD5 hash; - const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index); - - for (U8 i=0; i < baked_dict->mWearables.size(); i++) - { - const LLWearableType::EType baked_type = baked_dict->mWearables[i]; - const U32 num_wearables = getWearableCount(baked_type); - for (U32 index = 0; index < num_wearables; ++index) - { - const LLWearable* wearable = getWearable(baked_type,index); - if (wearable) - { - LLUUID asset_id = wearable->getAssetID(); - hash.update((const unsigned char*)asset_id.mData, UUID_BYTES); - hash_computed = true; - } - } - } - if (hash_computed) +// virtual +void LLAgentWearables::invalidateBakedTextureHash(LLMD5& hash) const { - hash.update((const unsigned char*)baked_dict->mWearablesHashID.mData, UUID_BYTES); - // Add some garbage into the hash so that it becomes invalid. - if (!generate_valid_hash) - { if (isAgentAvatarValid()) { hash.update((const unsigned char*)gAgentAvatarp->getID().mData, UUID_BYTES); } } - hash.finalize(); - hash.raw_digest(hash_id.mData); - } - - return hash_id; -} // User has picked "remove from avatar" from a menu. // static @@ -1715,7 +1524,7 @@ void LLAgentWearables::userRemoveWearablesOfType(const LLWearableType::EType &ty } } -// Combines userRemoveAllAttachments() and userAttachMultipleAttachments() logic to +// Combines userRemoveMulipleAttachments() and userAttachMultipleAttachments() logic to // get attachments into desired state with minimal number of adds/removes. void LLAgentWearables::userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array) { @@ -1811,31 +1620,6 @@ void LLAgentWearables::userRemoveMultipleAttachments(llvo_vec_t& objects_to_remo gMessageSystem->sendReliable(gAgent.getRegionHost()); } -void LLAgentWearables::userRemoveAllAttachments() -{ - if (!isAgentAvatarValid()) return; - - llvo_vec_t objects_to_remove; - - for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); - iter != gAgentAvatarp->mAttachmentPoints.end();) - { - LLVOAvatar::attachment_map_t::iterator curiter = iter++; - LLViewerJointAttachment* attachment = curiter->second; - for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); - attachment_iter != attachment->mAttachedObjects.end(); - ++attachment_iter) - { - LLViewerObject *attached_object = (*attachment_iter); - if (attached_object) - { - objects_to_remove.push_back(attached_object); - } - } - } - userRemoveMultipleAttachments(objects_to_remove); -} - void LLAgentWearables::userAttachMultipleAttachments(LLInventoryModel::item_array_t& obj_item_array) { // Build a compound message to send all the objects that need to be rezzed. @@ -1900,7 +1684,7 @@ void LLAgentWearables::checkWearablesLoaded() const // Returns false if the given wearable is already topmost/bottommost // (depending on closer_to_body parameter). -bool LLAgentWearables::canMoveWearable(const LLUUID& item_id, bool closer_to_body) +bool LLAgentWearables::canMoveWearable(const LLUUID& item_id, bool closer_to_body) const { const LLWearable* wearable = getWearableFromItemID(item_id); if (!wearable) return false; @@ -1928,7 +1712,7 @@ void LLAgentWearables::updateWearablesLoaded() } } -bool LLAgentWearables::canWearableBeRemoved(const LLWearable* wearable) const +bool LLAgentWearables::canWearableBeRemoved(const LLViewerWearable* wearable) const { if (!wearable) return false; @@ -1943,7 +1727,7 @@ void LLAgentWearables::animateAllWearableParams(F32 delta, BOOL upload_bake) { for (S32 count = 0; count < (S32)getWearableCount((LLWearableType::EType)type); ++count) { - LLWearable *wearable = getWearable((LLWearableType::EType)type,count); + LLViewerWearable *wearable = getViewerWearable((LLWearableType::EType)type,count); llassert(wearable); if (wearable) { @@ -1958,28 +1742,39 @@ bool LLAgentWearables::moveWearable(const LLViewerInventoryItem* item, bool clos if (!item) return false; if (!item->isWearableType()) return false; - wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(item->getWearableType()); - if (wearable_iter == mWearableDatas.end()) return false; - - wearableentry_vec_t& wearable_vec = wearable_iter->second; - if (wearable_vec.empty()) return false; + LLWearableType::EType type = item->getWearableType(); + U32 wearable_count = getWearableCount(type); + if (0 == wearable_count) return false; const LLUUID& asset_id = item->getAssetUUID(); //nowhere to move if the wearable is already on any boundary (closest to the body/furthest from the body) - if (closer_to_body && asset_id == wearable_vec.front()->getAssetID()) return false; - if (!closer_to_body && asset_id == wearable_vec.back()->getAssetID()) return false; + if (closer_to_body) + { + LLViewerWearable* bottom_wearable = dynamic_cast<LLViewerWearable*>( getBottomWearable(type) ); + if (bottom_wearable->getAssetID() == asset_id) + { + return false; + } + } + else // !closer_to_body + { + LLViewerWearable* top_wearable = dynamic_cast<LLViewerWearable*>( getTopWearable(type) ); + if (top_wearable->getAssetID() == asset_id) + { + return false; + } + } - for (U32 i = 0; i < wearable_vec.size(); ++i) + for (U32 i = 0; i < wearable_count; ++i) { - LLWearable* wearable = wearable_vec[i]; + LLViewerWearable* wearable = getViewerWearable(type, i); if (!wearable) continue; if (wearable->getAssetID() != asset_id) continue; //swapping wearables U32 swap_i = closer_to_body ? i-1 : i+1; - wearable_vec[i] = wearable_vec[swap_i]; - wearable_vec[swap_i] = wearable; + swapWearables(type, i, swap_i); return true; } @@ -1991,10 +1786,10 @@ void LLAgentWearables::createWearable(LLWearableType::EType type, bool wear, con { if (type == LLWearableType::WT_INVALID || type == LLWearableType::WT_NONE) return; - LLWearable* wearable = LLWearableList::instance().createNewWearable(type); + LLViewerWearable* wearable = LLWearableList::instance().createNewWearable(type, gAgentAvatarp); LLAssetType::EType asset_type = wearable->getAssetType(); LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE; - LLPointer<LLInventoryCallback> cb = wear ? new LLWearAndEditCallback : NULL; + LLPointer<LLInventoryCallback> cb = wear ? new LLBoostFuncInventoryCallback(wear_and_edit_cb) : NULL; LLUUID folder_id; if (parent_id.notNull()) @@ -2024,7 +1819,7 @@ void LLAgentWearables::editWearable(const LLUUID& item_id) return; } - LLWearable* wearable = gAgentWearables.getWearableFromItemID(item_id); + LLViewerWearable* wearable = gAgentWearables.getWearableFromItemID(item_id); if (!wearable) { llwarns << "Cannot get wearable" << llendl; diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index 5932be21c6..5be4648636 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -36,16 +36,16 @@ // newview #include "llinventorymodel.h" #include "llviewerinventory.h" -#include "llvoavatardefines.h" +#include "llavatarappearancedefines.h" +#include "llwearabledata.h" class LLInventoryItem; class LLVOAvatarSelf; -class LLWearable; +class LLViewerWearable; class LLInitialWearablesFetch; class LLViewerObject; -class LLTexLayerTemplate; -class LLAgentWearables : public LLInitClass<LLAgentWearables> +class LLAgentWearables : public LLInitClass<LLAgentWearables>, public LLWearableData { //-------------------------------------------------------------------- // Constructors / destructors / Initializers @@ -79,10 +79,10 @@ public: bool isCOFChangeInProgress() const { return mCOFChangeInProgress; } void updateWearablesLoaded(); void checkWearablesLoaded() const; - bool canMoveWearable(const LLUUID& item_id, bool closer_to_body); + bool canMoveWearable(const LLUUID& item_id, bool closer_to_body) const; // Note: False for shape, skin, eyes, and hair, unless you have MORE than 1. - bool canWearableBeRemoved(const LLWearable* wearable) const; + bool canWearableBeRemoved(const LLViewerWearable* wearable) const; void animateAllWearableParams(F32 delta, BOOL upload_bake); @@ -92,52 +92,38 @@ public: public: const LLUUID getWearableItemID(LLWearableType::EType type, U32 index /*= 0*/) const; const LLUUID getWearableAssetID(LLWearableType::EType type, U32 index /*= 0*/) const; - const LLWearable* getWearableFromItemID(const LLUUID& item_id) const; - LLWearable* getWearableFromItemID(const LLUUID& item_id); - LLWearable* getWearableFromAssetID(const LLUUID& asset_id); + const LLViewerWearable* getWearableFromItemID(const LLUUID& item_id) const; + LLViewerWearable* getWearableFromItemID(const LLUUID& item_id); + LLViewerWearable* getWearableFromAssetID(const LLUUID& asset_id); + LLViewerWearable* getViewerWearable(const LLWearableType::EType type, U32 index /*= 0*/); + const LLViewerWearable* getViewerWearable(const LLWearableType::EType type, U32 index /*= 0*/) const; LLInventoryItem* getWearableInventoryItem(LLWearableType::EType type, U32 index /*= 0*/); static BOOL selfHasWearable(LLWearableType::EType type); - LLWearable* getWearable(const LLWearableType::EType type, U32 index /*= 0*/); - const LLWearable* getWearable(const LLWearableType::EType type, U32 index /*= 0*/) const; - LLWearable* getTopWearable(const LLWearableType::EType type); - LLWearable* getBottomWearable(const LLWearableType::EType type); - U32 getWearableCount(const LLWearableType::EType type) const; - U32 getWearableCount(const U32 tex_index) const; - - static const U32 MAX_CLOTHING_PER_TYPE = 5; - //-------------------------------------------------------------------- // Setters //-------------------------------------------------------------------- - private: - // Low-level data structure setter - public access is via setWearableItem, etc. - void setWearable(const LLWearableType::EType type, U32 index, LLWearable *wearable); - U32 pushWearable(const LLWearableType::EType type, LLWearable *wearable); - void wearableUpdated(LLWearable *wearable); - void popWearable(LLWearable *wearable); - void popWearable(const LLWearableType::EType type, U32 index); - + /*virtual*/void wearableUpdated(LLWearable *wearable, BOOL removed); public: - void setWearableItem(LLInventoryItem* new_item, LLWearable* wearable, bool do_append = false); - void setWearableOutfit(const LLInventoryItem::item_array_t& items, const LLDynamicArray< LLWearable* >& wearables, BOOL remove); + void setWearableItem(LLInventoryItem* new_item, LLViewerWearable* wearable, bool do_append = false); + void setWearableOutfit(const LLInventoryItem::item_array_t& items, const LLDynamicArray< LLViewerWearable* >& wearables, BOOL remove); void setWearableName(const LLUUID& item_id, const std::string& new_name); - void addLocalTextureObject(const LLWearableType::EType wearable_type, const LLVOAvatarDefines::ETextureIndex texture_type, U32 wearable_index); - U32 getWearableIndex(const LLWearable *wearable) const; + // *TODO: Move this into llappearance/LLWearableData ? + void addLocalTextureObject(const LLWearableType::EType wearable_type, const LLAvatarAppearanceDefines::ETextureIndex texture_type, U32 wearable_index); protected: - void setWearableFinal(LLInventoryItem* new_item, LLWearable* new_wearable, bool do_append = false); - static bool onSetWearableDialog(const LLSD& notification, const LLSD& response, LLWearable* wearable); + void setWearableFinal(LLInventoryItem* new_item, LLViewerWearable* new_wearable, bool do_append = false); + static bool onSetWearableDialog(const LLSD& notification, const LLSD& response, LLViewerWearable* wearable); void addWearableToAgentInventory(LLPointer<LLInventoryCallback> cb, - LLWearable* wearable, + LLViewerWearable* wearable, const LLUUID& category_id = LLUUID::null, BOOL notify = TRUE); void addWearabletoAgentInventoryDone(const LLWearableType::EType type, const U32 index, const LLUUID& item_id, - LLWearable* wearable); + LLViewerWearable* wearable); void recoverMissingWearable(const LLWearableType::EType type, U32 index /*= 0*/); void recoverMissingWearableDone(); @@ -172,15 +158,14 @@ protected: public: // Processes the initial wearables update message (if necessary, since the outfit folder makes it redundant) static void processAgentInitialWearablesUpdate(LLMessageSystem* mesgsys, void** user_data); - LLUUID computeBakedTextureHash(LLVOAvatarDefines::EBakedTextureIndex baked_index, - BOOL generate_valid_hash = TRUE); protected: + /*virtual*/ void invalidateBakedTextureHash(LLMD5& hash) const; void sendAgentWearablesUpdate(); void sendAgentWearablesRequest(); void queryWearableCache(); void updateServer(); - static void onInitialWearableAssetArrived(LLWearable* wearable, void* userdata); + static void onInitialWearableAssetArrived(LLViewerWearable* wearable, void* userdata); //-------------------------------------------------------------------- // Outfits @@ -198,7 +183,7 @@ private: // Save Wearables //-------------------------------------------------------------------- public: - void saveWearableAs(const LLWearableType::EType type, const U32 index, const std::string& new_name, BOOL save_in_lost_and_found); + void saveWearableAs(const LLWearableType::EType type, const U32 index, const std::string& new_name, const std::string& description, BOOL save_in_lost_and_found); void saveWearable(const LLWearableType::EType type, const U32 index, BOOL send_update = TRUE, const std::string new_name = ""); void saveAllWearables(); @@ -215,7 +200,6 @@ public: static void userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array); static void userRemoveMultipleAttachments(llvo_vec_t& llvo_array); - static void userRemoveAllAttachments(); static void userAttachMultipleAttachments(LLInventoryModel::item_array_t& obj_item_array); BOOL itemUpdatePending(const LLUUID& item_id) const; @@ -245,10 +229,6 @@ private: // Member variables //-------------------------------------------------------------------- private: - typedef std::vector<LLWearable*> wearableentry_vec_t; // all wearables of a certain type (EG all shirts) - typedef std::map<LLWearableType::EType, wearableentry_vec_t> wearableentry_map_t; // wearable "categories" arranged by wearable type - wearableentry_map_t mWearableDatas; - static BOOL mInitialWearablesUpdateReceived; BOOL mWearablesLoaded; std::set<LLUUID> mItemsAwaitingWearableUpdate; @@ -289,15 +269,17 @@ private: addWearableToAgentInventoryCallback(LLPointer<LLRefCount> cb, LLWearableType::EType type, U32 index, - LLWearable* wearable, - U32 todo = CALL_NONE); + LLViewerWearable* wearable, + U32 todo = CALL_NONE, + const std::string description = ""); virtual void fire(const LLUUID& inv_item); private: LLWearableType::EType mType; U32 mIndex; - LLWearable* mWearable; + LLViewerWearable* mWearable; U32 mTodo; LLPointer<LLRefCount> mCB; + std::string mDescription; }; }; // LLAgentWearables diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp index e31e39dca2..8b6b6db525 100644 --- a/indra/newview/llagentwearablesfetch.cpp +++ b/indra/newview/llagentwearablesfetch.cpp @@ -35,12 +35,7 @@ #include "llvoavatarself.h" -class LLOrderMyOutfitsOnDestroy: public LLInventoryCallback -{ -public: - LLOrderMyOutfitsOnDestroy() {}; - - virtual ~LLOrderMyOutfitsOnDestroy() +void order_my_outfits_cb() { if (!LLApp::isRunning()) { @@ -80,16 +75,12 @@ public: llinfos << "Finished updating My Outfits with wearables ordering information" << llendl; } - /* virtual */ void fire(const LLUUID& inv_item) {}; -}; - - LLInitialWearablesFetch::LLInitialWearablesFetch(const LLUUID& cof_id) : LLInventoryFetchDescendentsObserver(cof_id) { if (isAgentAvatarValid()) { - gAgentAvatarp->getPhases().startPhase("initial_wearables_fetch"); + gAgentAvatarp->startPhase("initial_wearables_fetch"); gAgentAvatarp->outputRezTiming("Initial wearables fetch started"); } } @@ -108,7 +99,7 @@ void LLInitialWearablesFetch::done() doOnIdleOneTime(boost::bind(&LLInitialWearablesFetch::processContents,this)); if (isAgentAvatarValid()) { - gAgentAvatarp->getPhases().stopPhase("initial_wearables_fetch"); + gAgentAvatarp->stopPhase("initial_wearables_fetch"); gAgentAvatarp->outputRezTiming("Initial wearables fetch done"); } } @@ -563,7 +554,7 @@ void LLLibraryOutfitsFetch::contentsDone() LLInventoryModel::cat_array_t cat_array; LLInventoryModel::item_array_t wearable_array; - LLPointer<LLOrderMyOutfitsOnDestroy> order_myoutfits_on_destroy = new LLOrderMyOutfitsOnDestroy; + LLPointer<LLInventoryCallback> order_myoutfits_on_destroy = new LLBoostFuncInventoryCallback(no_op_inventory_func, order_my_outfits_cb); for (uuid_vec_t::const_iterator folder_iter = mImportedClothingFolders.begin(); folder_iter != mImportedClothingFolders.end(); diff --git a/indra/newview/llappearance.h b/indra/newview/llappearance.h index a28b77b1fc..05dfac4e42 100644 --- a/indra/newview/llappearance.h +++ b/indra/newview/llappearance.h @@ -38,14 +38,14 @@ public: void addParam( S32 id, F32 value ) { mParamMap[id] = value; } F32 getParam( S32 id, F32 defval ) { return get_if_there(mParamMap, id, defval ); } - void addTexture( S32 te, const LLUUID& uuid ) { if( te < LLVOAvatarDefines::TEX_NUM_INDICES ) mTextures[te] = uuid; } - const LLUUID& getTexture( S32 te ) { return ( te < LLVOAvatarDefines::TEX_NUM_INDICES ) ? mTextures[te] : LLUUID::null; } + void addTexture( S32 te, const LLUUID& uuid ) { if( te < LLAvatarAppearanceDefines::TEX_NUM_INDICES ) mTextures[te] = uuid; } + const LLUUID& getTexture( S32 te ) { return ( te < LLAvatarAppearanceDefines::TEX_NUM_INDICES ) ? mTextures[te] : LLUUID::null; } - void clear() { mParamMap.clear(); for( S32 i=0; i<LLVOAvatarDefines::TEX_NUM_INDICES; i++ ) mTextures[i].setNull(); } + void clear() { mParamMap.clear(); for( S32 i=0; i<LLAvatarAppearanceDefines::TEX_NUM_INDICES; i++ ) mTextures[i].setNull(); } typedef std::map<S32, F32> param_map_t; param_map_t mParamMap; - LLUUID mTextures[LLVOAvatarDefines::TEX_NUM_INDICES]; + LLUUID mTextures[LLAvatarAppearanceDefines::TEX_NUM_INDICES]; }; #endif // LL_LLAPPEARANCE_H diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 769b4eafe1..49cda96ee2 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -26,6 +26,7 @@ #include "llviewerprecompiledheaders.h" +#include <boost/lexical_cast.hpp> #include "llaccordionctrltab.h" #include "llagent.h" #include "llagentcamera.h" @@ -49,6 +50,13 @@ #include "llvoavatarself.h" #include "llviewerregion.h" #include "llwearablelist.h" +#include "llsdutil.h" +#include "llsdserialize.h" + +#if LL_MSVC +// disable boost::lexical_cast warning +#pragma warning (disable:4702) +#endif std::string self_av_string() { @@ -155,72 +163,343 @@ LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id, const std::string } } -class LLWearInventoryCategoryCallback : public LLInventoryCallback +// We want this to be much lower (e.g. 15.0 is usually fine), bumping +// up for now until we can diagnose some cases of very slow response +// to requests. +const F32 DEFAULT_RETRY_AFTER_INTERVAL = 300.0; + +// Given the current back-end problems, retrying is causing too many +// duplicate items. Bump this back to 2 once they are resolved (or can +// leave at 0 if the operations become actually reliable). +const S32 DEFAULT_MAX_RETRIES = 0; + +class LLCallAfterInventoryBatchMgr: public LLEventTimer { public: - LLWearInventoryCategoryCallback(const LLUUID& cat_id, bool append) + LLCallAfterInventoryBatchMgr(const LLUUID& dst_cat_id, + const std::string& phase_name, + nullary_func_t on_completion_func, + nullary_func_t on_failure_func = no_op, + F32 retry_after = DEFAULT_RETRY_AFTER_INTERVAL, + S32 max_retries = DEFAULT_MAX_RETRIES + ): + mDstCatID(dst_cat_id), + mTrackingPhase(phase_name), + mOnCompletionFunc(on_completion_func), + mOnFailureFunc(on_failure_func), + mRetryAfter(retry_after), + mMaxRetries(max_retries), + mPendingRequests(0), + mFailCount(0), + mCompletionOrFailureCalled(false), + mRetryCount(0), + LLEventTimer(5.0) + { + if (!mTrackingPhase.empty()) + { + selfStartPhase(mTrackingPhase); + } + } + + void addItems(LLInventoryModel::item_array_t& src_items) + { + for (LLInventoryModel::item_array_t::const_iterator it = src_items.begin(); + it != src_items.end(); + ++it) + { + LLViewerInventoryItem* item = *it; + llassert(item); + addItem(item->getUUID()); + } + } + + // Request or re-request operation for specified item. + void addItem(const LLUUID& item_id) { - mCatID = cat_id; - mAppend = append; - - LL_INFOS("Avatar") << self_av_string() << "starting" << LL_ENDL; + LL_DEBUGS("Avatar") << "item_id " << item_id << llendl; - selfStartPhase("wear_inventory_category_callback"); + if (!requestOperation(item_id)) + { + LL_DEBUGS("Avatar") << "item_id " << item_id << " requestOperation false, skipping" << llendl; + return; } - void fire(const LLUUID& item_id) + + mPendingRequests++; + // On a re-request, this will reset the timer. + mWaitTimes[item_id] = LLTimer(); + if (mRetryCounts.find(item_id) == mRetryCounts.end()) { - /* - * Do nothing. We only care about the destructor - * - * The reason for this is that this callback is used in a hack where the - * same callback is given to dozens of items, and the destructor is called - * after the last item has fired the event and dereferenced it -- if all - * the events actually fire! - */ - LL_DEBUGS("Avatar") << self_av_string() << " fired on copied item, id " << item_id << LL_ENDL; + mRetryCounts[item_id] = 0; + } + else + { + mRetryCounts[item_id]++; + } } -protected: - ~LLWearInventoryCategoryCallback() + virtual bool requestOperation(const LLUUID& item_id) = 0; + + void onOp(const LLUUID& src_id, const LLUUID& dst_id, LLTimer timestamp) { - LL_INFOS("Avatar") << self_av_string() << "done all inventory callbacks" << LL_ENDL; + if (ll_frand() < gSavedSettings.getF32("InventoryDebugSimulateLateOpRate")) + { + llwarns << "Simulating late operation by punting handling to later" << llendl; + doAfterInterval(boost::bind(&LLCallAfterInventoryBatchMgr::onOp,this,src_id,dst_id,timestamp), + mRetryAfter); + return; + } + mPendingRequests--; + F32 elapsed = timestamp.getElapsedTimeF32(); + LL_DEBUGS("Avatar") << "op done, src_id " << src_id << " dst_id " << dst_id << " after " << elapsed << " seconds" << llendl; + if (mWaitTimes.find(src_id) == mWaitTimes.end()) + { + // No longer waiting for this item - either serviced + // already or gave up after too many retries. + llwarns << "duplicate or late operation, src_id " << src_id << "dst_id " << dst_id + << " elapsed " << elapsed << " after end " << (S32) mCompletionOrFailureCalled << llendl; + } + mTimeStats.push(elapsed); + mWaitTimes.erase(src_id); + if (mWaitTimes.empty() && !mCompletionOrFailureCalled) + { + onCompletionOrFailure(); + } + } - selfStopPhase("wear_inventory_category_callback"); + void onCompletionOrFailure() + { + assert (!mCompletionOrFailureCalled); + mCompletionOrFailureCalled = true; - // Is the destructor called by ordinary dereference, or because the app's shutting down? - // If the inventory callback manager goes away, we're shutting down, no longer want the callback. - if( LLInventoryCallbackManager::is_instantiated() ) + // Will never call onCompletion() if any item has been flagged as + // a failure - otherwise could wind up with corrupted + // outfit, involuntary nudity, etc. + reportStats(); + if (!mTrackingPhase.empty()) { - LLAppearanceMgr::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend); + selfStopPhase(mTrackingPhase); + } + if (!mFailCount) + { + onCompletion(); } else { - llwarns << self_av_string() << "Dropping unhandled LLWearInventoryCategoryCallback" << llendl; + onFailure(); } } -private: - LLUUID mCatID; - bool mAppend; + void onFailure() + { + llinfos << "failed" << llendl; + mOnFailureFunc(); + } + + void onCompletion() + { + llinfos << "done" << llendl; + mOnCompletionFunc(); + } + + // virtual + // Will be deleted after returning true - only safe to do this if all callbacks have fired. + BOOL tick() + { + // mPendingRequests will be zero if all requests have been + // responded to. mWaitTimes.empty() will be true if we have + // received at least one reply for each UUID. If requests + // have been dropped and retried, these will not necessarily + // be the same. Only safe to return true if all requests have + // been serviced, since it will result in this object being + // deleted. + bool all_done = (mPendingRequests==0); + + if (!mWaitTimes.empty()) + { + llwarns << "still waiting on " << mWaitTimes.size() << " items" << llendl; + for (std::map<LLUUID,LLTimer>::iterator it = mWaitTimes.begin(); + it != mWaitTimes.end();) + { + // Use a copy of iterator because it may be erased/invalidated. + std::map<LLUUID,LLTimer>::iterator curr_it = it; + ++it; + + F32 time_waited = curr_it->second.getElapsedTimeF32(); + S32 retries = mRetryCounts[curr_it->first]; + if (time_waited > mRetryAfter) + { + if (retries < mMaxRetries) + { + LL_DEBUGS("Avatar") << "Waited " << time_waited << + " for " << curr_it->first << ", retrying" << llendl; + mRetryCount++; + addItem(curr_it->first); + } + else + { + llwarns << "Giving up on " << curr_it->first << " after too many retries" << llendl; + mWaitTimes.erase(curr_it); + mFailCount++; + } + } + if (mWaitTimes.empty()) + { + onCompletionOrFailure(); + } + + } + } + return all_done; + } + + void reportStats() + { + LL_DEBUGS("Avatar") << "Phase: " << mTrackingPhase << llendl; + LL_DEBUGS("Avatar") << "mFailCount: " << mFailCount << llendl; + LL_DEBUGS("Avatar") << "mRetryCount: " << mRetryCount << llendl; + LL_DEBUGS("Avatar") << "Times: n " << mTimeStats.getCount() << " min " << mTimeStats.getMinValue() << " max " << mTimeStats.getMaxValue() << llendl; + LL_DEBUGS("Avatar") << "Mean " << mTimeStats.getMean() << " stddev " << mTimeStats.getStdDev() << llendl; + } + + virtual ~LLCallAfterInventoryBatchMgr() + { + LL_DEBUGS("Avatar") << "deleting" << llendl; + } + +protected: + std::string mTrackingPhase; + std::map<LLUUID,LLTimer> mWaitTimes; + std::map<LLUUID,S32> mRetryCounts; + LLUUID mDstCatID; + nullary_func_t mOnCompletionFunc; + nullary_func_t mOnFailureFunc; + F32 mRetryAfter; + S32 mMaxRetries; + S32 mPendingRequests; + S32 mFailCount; + S32 mRetryCount; + bool mCompletionOrFailureCalled; + LLViewerStats::StatsAccumulator mTimeStats; }; +class LLCallAfterInventoryCopyMgr: public LLCallAfterInventoryBatchMgr +{ +public: + LLCallAfterInventoryCopyMgr(LLInventoryModel::item_array_t& src_items, + const LLUUID& dst_cat_id, + const std::string& phase_name, + nullary_func_t on_completion_func, + nullary_func_t on_failure_func = no_op, + F32 retry_after = DEFAULT_RETRY_AFTER_INTERVAL, + S32 max_retries = DEFAULT_MAX_RETRIES + ): + LLCallAfterInventoryBatchMgr(dst_cat_id, phase_name, on_completion_func, on_failure_func, retry_after, max_retries) + { + addItems(src_items); + } + + virtual bool requestOperation(const LLUUID& item_id) + { + LLViewerInventoryItem *item = gInventory.getItem(item_id); + llassert(item); + LL_DEBUGS("Avatar") << "copying item " << item_id << llendl; + if (ll_frand() < gSavedSettings.getF32("InventoryDebugSimulateOpFailureRate")) + { + LL_DEBUGS("Avatar") << "simulating failure by not sending request for item " << item_id << llendl; + return true; + } + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + mDstCatID, + std::string(), + new LLBoostFuncInventoryCallback(boost::bind(&LLCallAfterInventoryBatchMgr::onOp,this,item_id,_1,LLTimer())) + ); + return true; + } +}; -//Inventory callback updating "dirty" state when destroyed -class LLUpdateDirtyState: public LLInventoryCallback +class LLCallAfterInventoryLinkMgr: public LLCallAfterInventoryBatchMgr { public: - LLUpdateDirtyState() {} - virtual ~LLUpdateDirtyState() + LLCallAfterInventoryLinkMgr(LLInventoryModel::item_array_t& src_items, + const LLUUID& dst_cat_id, + const std::string& phase_name, + nullary_func_t on_completion_func, + nullary_func_t on_failure_func = no_op, + F32 retry_after = DEFAULT_RETRY_AFTER_INTERVAL, + S32 max_retries = DEFAULT_MAX_RETRIES + ): + LLCallAfterInventoryBatchMgr(dst_cat_id, phase_name, on_completion_func, on_failure_func, retry_after, max_retries) + { + addItems(src_items); + } + + virtual bool requestOperation(const LLUUID& item_id) { - if (LLAppearanceMgr::instanceExists()) + bool request_sent = false; + LLViewerInventoryItem *item = gInventory.getItem(item_id); + if (item) + { + if (item->getParentUUID() == mDstCatID) + { + LL_DEBUGS("Avatar") << "item " << item_id << " name " << item->getName() << " is already a child of " << mDstCatID << llendl; + return false; + } + LL_DEBUGS("Avatar") << "linking item " << item_id << " name " << item->getName() << " to " << mDstCatID << llendl; + // create an inventory item link. + if (ll_frand() < gSavedSettings.getF32("InventoryDebugSimulateOpFailureRate")) + { + LL_DEBUGS("Avatar") << "simulating failure by not sending request for item " << item_id << llendl; + return true; + } + link_inventory_item(gAgent.getID(), + item->getLinkedUUID(), + mDstCatID, + item->getName(), + item->getActualDescription(), + LLAssetType::AT_LINK, + new LLBoostFuncInventoryCallback( + boost::bind(&LLCallAfterInventoryBatchMgr::onOp,this,item_id,_1,LLTimer()))); + return true; + } + else { - LLAppearanceMgr::getInstance()->updateIsDirty(); + // create a base outfit link if appropriate. + LLViewerInventoryCategory *catp = gInventory.getCategory(item_id); + if (!catp) + { + llwarns << "link request failed, id not found as inventory item or category " << item_id << llendl; + return false; + } + const LLUUID cof = LLAppearanceMgr::instance().getCOF(); + std::string new_outfit_name = ""; + + LLAppearanceMgr::instance().purgeBaseOutfitLink(cof); + + if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT) + { + if (ll_frand() < gSavedSettings.getF32("InventoryDebugSimulateOpFailureRate")) + { + LL_DEBUGS("Avatar") << "simulating failure by not sending request for item " << item_id << llendl; + return true; + } + LL_DEBUGS("Avatar") << "linking folder " << item_id << " name " << catp->getName() << " to cof " << cof << llendl; + link_inventory_item(gAgent.getID(), item_id, cof, catp->getName(), "", + LLAssetType::AT_LINK_FOLDER, + new LLBoostFuncInventoryCallback( + boost::bind(&LLCallAfterInventoryBatchMgr::onOp,this,item_id,_1,LLTimer()))); + new_outfit_name = catp->getName(); + request_sent = true; + } + + LLAppearanceMgr::instance().updatePanelOutfitName(new_outfit_name); } + return request_sent; } - virtual void fire(const LLUUID&) {} }; - LLUpdateAppearanceOnDestroy::LLUpdateAppearanceOnDestroy(bool update_base_outfit_ordering): mFireCount(0), mUpdateBaseOrder(update_base_outfit_ordering) @@ -278,7 +557,7 @@ struct LLFoundData std::string mName; LLAssetType::EType mAssetType; LLWearableType::EType mWearableType; - LLWearable* mWearable; + LLViewerWearable* mWearable; bool mIsReplacement; }; @@ -302,7 +581,7 @@ public: void recoverMissingWearable(LLWearableType::EType type); void clearCOFLinksForMissingWearables(); - void onWearableAssetFetch(LLWearable *wearable); + void onWearableAssetFetch(LLViewerWearable *wearable); void onAllComplete(); typedef std::list<LLFoundData> found_list_t; @@ -328,7 +607,7 @@ private: typedef std::set<LLWearableHoldingPattern*> type_set_hp; static type_set_hp sActiveHoldingPatterns; bool mIsMostRecent; - std::set<LLWearable*> mLateArrivals; + std::set<LLViewerWearable*> mLateArrivals; bool mIsAllComplete; }; @@ -559,25 +838,16 @@ bool LLWearableHoldingPattern::pollFetchCompletion() return done; } -class RecoveredItemLinkCB: public LLInventoryCallback -{ -public: - RecoveredItemLinkCB(LLWearableType::EType type, LLWearable *wearable, LLWearableHoldingPattern* holder): - mHolder(holder), - mWearable(wearable), - mType(type) +void recovered_item_link_cb(const LLUUID& item_id, LLWearableType::EType type, LLViewerWearable *wearable, LLWearableHoldingPattern* holder) { - } - void fire(const LLUUID& item_id) - { - if (!mHolder->isMostRecent()) + if (!holder->isMostRecent()) { llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; // runway skip here? } - llinfos << "Recovered item link for type " << mType << llendl; - mHolder->eraseTypeToLink(mType); + llinfos << "Recovered item link for type " << type << llendl; + holder->eraseTypeToLink(type); // Add wearable to FoundData for actual wearing LLViewerInventoryItem *item = gInventory.getItem(item_id); LLViewerInventoryItem *linked_item = item ? item->getLinkedItem() : NULL; @@ -595,8 +865,8 @@ public: linked_item->isWearableType() ? linked_item->getWearableType() : LLWearableType::WT_INVALID, true // is replacement ); - found.mWearable = mWearable; - mHolder->getFoundList().push_front(found); + found.mWearable = wearable; + holder->getFoundList().push_front(found); } else { @@ -608,34 +878,20 @@ public: llwarns << self_av_string() << "inventory link not found for recovered wearable" << llendl; } } -private: - LLWearableHoldingPattern* mHolder; - LLWearable *mWearable; - LLWearableType::EType mType; -}; -class RecoveredItemCB: public LLInventoryCallback -{ -public: - RecoveredItemCB(LLWearableType::EType type, LLWearable *wearable, LLWearableHoldingPattern* holder): - mHolder(holder), - mWearable(wearable), - mType(type) +void recovered_item_cb(const LLUUID& item_id, LLWearableType::EType type, LLViewerWearable *wearable, LLWearableHoldingPattern* holder) { - } - void fire(const LLUUID& item_id) - { - if (!mHolder->isMostRecent()) + if (!holder->isMostRecent()) { // runway skip here? llwarns << self_av_string() << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; } - LL_DEBUGS("Avatar") << self_av_string() << "Recovered item for type " << mType << LL_ENDL; + LL_DEBUGS("Avatar") << self_av_string() << "Recovered item for type " << type << LL_ENDL; LLViewerInventoryItem *itemp = gInventory.getItem(item_id); - mWearable->setItemID(item_id); - LLPointer<LLInventoryCallback> cb = new RecoveredItemLinkCB(mType,mWearable,mHolder); - mHolder->eraseTypeToRecover(mType); + wearable->setItemID(item_id); + LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(recovered_item_link_cb,_1,type,wearable,holder)); + holder->eraseTypeToRecover(type); llassert(itemp); if (itemp) { @@ -648,11 +904,6 @@ public: cb); } } -private: - LLWearableHoldingPattern* mHolder; - LLWearable *mWearable; - LLWearableType::EType mType; -}; void LLWearableHoldingPattern::recoverMissingWearable(LLWearableType::EType type) { @@ -666,11 +917,11 @@ void LLWearableHoldingPattern::recoverMissingWearable(LLWearableType::EType type LLNotificationsUtil::add("ReplacedMissingWearable"); lldebugs << "Wearable " << LLWearableType::getTypeLabel(type) << " could not be downloaded. Replaced inventory item with default wearable." << llendl; - LLWearable* wearable = LLWearableList::instance().createNewWearable(type); + LLViewerWearable* wearable = LLWearableList::instance().createNewWearable(type, gAgentAvatarp); // Add a new one in the lost and found folder. const LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); - LLPointer<LLInventoryCallback> cb = new RecoveredItemCB(type,wearable,this); + LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(recovered_item_cb,_1,type,wearable,this)); create_inventory_item(gAgent.getID(), gAgent.getSessionID(), @@ -699,7 +950,7 @@ void LLWearableHoldingPattern::clearCOFLinksForMissingWearables() { // Wearable link that was never resolved; remove links to it from COF LL_INFOS("Avatar") << self_av_string() << "removing link for unresolved item " << data.mItemID.asString() << LL_ENDL; - LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID,false); + LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID); } } } @@ -773,11 +1024,11 @@ void LLWearableHoldingPattern::handleLateArrivals() iter != getFoundList().end(); ++iter) { LLFoundData& data = *iter; - for (std::set<LLWearable*>::iterator wear_it = mLateArrivals.begin(); + for (std::set<LLViewerWearable*>::iterator wear_it = mLateArrivals.begin(); wear_it != mLateArrivals.end(); ++wear_it) { - LLWearable *wearable = *wear_it; + LLViewerWearable *wearable = *wear_it; if(wearable->getAssetID() == data.mAssetID) { @@ -813,7 +1064,7 @@ void LLWearableHoldingPattern::handleLateArrivals() if (data.mWearable && data.mIsReplacement && replaced_types.find(data.mWearableType) != replaced_types.end()) { - LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID,false); + LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID); std::list<LLFoundData>::iterator clobber_ator = iter; ++iter; getFoundList().erase(clobber_ator); @@ -837,7 +1088,7 @@ void LLWearableHoldingPattern::resetTime(F32 timeout) mWaitTime.setTimerExpirySec(timeout); } -void LLWearableHoldingPattern::onWearableAssetFetch(LLWearable *wearable) +void LLWearableHoldingPattern::onWearableAssetFetch(LLViewerWearable *wearable) { if (!isMostRecent()) { @@ -888,7 +1139,7 @@ void LLWearableHoldingPattern::onWearableAssetFetch(LLWearable *wearable) } } -static void onWearableAssetFetch(LLWearable* wearable, void* data) +static void onWearableAssetFetch(LLViewerWearable* wearable, void* data) { LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data; holder->onWearableAssetFetch(wearable); @@ -927,6 +1178,18 @@ const LLUUID LLAppearanceMgr::getCOF() const return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); } +S32 LLAppearanceMgr::getCOFVersion() const +{ + LLViewerInventoryCategory *cof = gInventory.getCategory(getCOF()); + if (cof) + { + return cof->getVersion(); + } + else + { + return LLViewerInventoryCategory::VERSION_UNKNOWN; + } +} const LLViewerInventoryItem* LLAppearanceMgr::getBaseOutfitLink() { @@ -995,6 +1258,18 @@ const LLUUID LLAppearanceMgr::getBaseOutfitUUID() return outfit_cat->getUUID(); } +void wear_on_avatar_cb(const LLUUID& inv_item, bool do_replace = false) +{ + if (inv_item.isNull()) + return; + + LLViewerInventoryItem *item = gInventory.getItem(inv_item); + if (item) + { + LLAppearanceMgr::instance().wearItemOnAvatar(inv_item, true, do_replace); + } +} + bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_update, bool replace, LLPointer<LLInventoryCallback> cb) { if (item_id_to_wear.isNull()) return false; @@ -1014,7 +1289,7 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getLibraryRootFolderID())) { - LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(replace); + LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(wear_on_avatar_cb,_1,replace)); copy_inventory_item(gAgent.getID(), item_to_wear->getPermissions().getOwner(), item_to_wear->getUUID(), LLUUID::null, std::string(),cb); return false; } @@ -1041,7 +1316,7 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up if ((replace && wearable_count != 0) || (wearable_count >= LLAgentWearables::MAX_CLOTHING_PER_TYPE) ) { - removeCOFItemLinks(gAgentWearables.getWearableItemID(item_to_wear->getWearableType(), wearable_count-1), false); + removeCOFItemLinks(gAgentWearables.getWearableItemID(item_to_wear->getWearableType(), wearable_count-1)); } addCOFItemLink(item_to_wear, do_update, cb); } @@ -1051,7 +1326,7 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up // Remove the existing wearables of the same type. // Remove existing body parts anyway because we must not be able to wear e.g. two skins. - removeCOFLinksOfType(item_to_wear->getWearableType(), false); + removeCOFLinksOfType(item_to_wear->getWearableType()); addCOFItemLink(item_to_wear, do_update, cb); break; @@ -1149,11 +1424,13 @@ void LLAppearanceMgr::takeOffOutfit(const LLUUID& cat_id) LLInventoryModel::item_array_t::const_iterator it = items.begin(); const LLInventoryModel::item_array_t::const_iterator it_end = items.end(); + uuid_vec_t uuids_to_remove; for( ; it_end != it; ++it) { LLViewerInventoryItem* item = *it; - removeItemFromAvatar(item->getUUID()); + uuids_to_remove.push_back(item->getUUID()); } + removeItemsFromAvatar(uuids_to_remove); } // Create a copy of src_id + contents as a subfolder of dst_id. @@ -1197,13 +1474,13 @@ void LLAppearanceMgr::shallowCopyCategoryContents(const LLUUID& src_id, const LL { case LLAssetType::AT_LINK: { - //LLInventoryItem::getDescription() is used for a new description + //getActualDescription() is used for a new description //to propagate ordering information saved in descriptions of links link_inventory_item(gAgent.getID(), item->getLinkedUUID(), dst_id, item->getName(), - item->LLInventoryItem::getDescription(), + item->getActualDescription(), LLAssetType::AT_LINK, cb); break; } @@ -1383,7 +1660,7 @@ void LLAppearanceMgr::purgeBaseOutfitLink(const LLUUID& category) } } -void LLAppearanceMgr::purgeCategory(const LLUUID& category, bool keep_outfit_links) +void LLAppearanceMgr::purgeCategory(const LLUUID& category, bool keep_outfit_links, LLInventoryModel::item_array_t* keep_items) { LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; @@ -1396,8 +1673,19 @@ void LLAppearanceMgr::purgeCategory(const LLUUID& category, bool keep_outfit_lin continue; if (item->getIsLinkType()) { +#if 0 + if (keep_items && keep_items->find(item) != LLInventoryModel::item_array_t::FAIL) + { + llinfos << "preserved item" << llendl; + } + else + { gInventory.purgeObject(item->getUUID()); } +#else + gInventory.purgeObject(item->getUUID()); + } +#endif } } @@ -1437,7 +1725,7 @@ void LLAppearanceMgr::linkAll(const LLUUID& cat_uuid, item->getLinkedUUID(), cat_uuid, item->getName(), - item->LLInventoryItem::getDescription(), + item->getActualDescription(), LLAssetType::AT_LINK, cb); @@ -1508,40 +1796,31 @@ void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append) getDescendentsOfAssetType(category, gest_items, LLAssetType::AT_GESTURE, false); removeDuplicateItems(gest_items); - // Remove current COF contents. - bool keep_outfit_links = append; - purgeCategory(cof, keep_outfit_links); - gInventory.notifyObservers(); - // Create links to new COF contents. - LL_DEBUGS("Avatar") << self_av_string() << "creating LLUpdateAppearanceOnDestroy" << LL_ENDL; - LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy(!append); - -#ifndef LL_RELEASE_FOR_DOWNLOAD - LL_DEBUGS("Avatar") << self_av_string() << "Linking body items" << LL_ENDL; -#endif - linkAll(cof, body_items, link_waiter); - -#ifndef LL_RELEASE_FOR_DOWNLOAD - LL_DEBUGS("Avatar") << self_av_string() << "Linking wear items" << LL_ENDL; -#endif - linkAll(cof, wear_items, link_waiter); + LLInventoryModel::item_array_t all_items; + all_items += body_items; + all_items += wear_items; + all_items += obj_items; + all_items += gest_items; -#ifndef LL_RELEASE_FOR_DOWNLOAD - LL_DEBUGS("Avatar") << self_av_string() << "Linking obj items" << LL_ENDL; -#endif - linkAll(cof, obj_items, link_waiter); - -#ifndef LL_RELEASE_FOR_DOWNLOAD - LL_DEBUGS("Avatar") << self_av_string() << "Linking gesture items" << LL_ENDL; -#endif - linkAll(cof, gest_items, link_waiter); + // Will link all the above items. + LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy; + linkAll(cof,all_items,link_waiter); // Add link to outfit if category is an outfit. if (!append) { createBaseOutfitLink(category, link_waiter); } + + // Remove current COF contents. Have to do this after creating + // the link_waiter so links can be followed for any items that get + // carried over (e.g. keeping old shape if the new outfit does not + // contain one) + bool keep_outfit_links = append; + purgeCategory(cof, keep_outfit_links, &all_items); + gInventory.notifyObservers(); + LL_DEBUGS("Avatar") << self_av_string() << "waiting for LLUpdateAppearanceOnDestroy" << LL_ENDL; } @@ -1577,7 +1856,7 @@ void LLAppearanceMgr::updateAgentWearables(LLWearableHoldingPattern* holder, boo { lldebugs << "updateAgentWearables()" << llendl; LLInventoryItem::item_array_t items; - LLDynamicArray< LLWearable* > wearables; + LLDynamicArray< LLViewerWearable* > wearables; // For each wearable type, find the wearables of that type. for( S32 i = 0; i < LLWearableType::WT_COUNT; i++ ) @@ -1586,7 +1865,7 @@ void LLAppearanceMgr::updateAgentWearables(LLWearableHoldingPattern* holder, boo iter != holder->getFoundList().end(); ++iter) { LLFoundData& data = *iter; - LLWearable* wearable = data.mWearable; + LLViewerWearable* wearable = data.mWearable; if( wearable && ((S32)wearable->getType() == i) ) { LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(data.mItemID); @@ -1622,7 +1901,7 @@ static void remove_non_link_items(LLInventoryModel::item_array_t &items) } //a predicate for sorting inventory items by actual descriptions -bool sort_by_description(const LLInventoryItem* item1, const LLInventoryItem* item2) +bool sort_by_actual_description(const LLInventoryItem* item1, const LLInventoryItem* item2) { if (!item1 || !item2) { @@ -1630,7 +1909,7 @@ bool sort_by_description(const LLInventoryItem* item1, const LLInventoryItem* it return true; } - return item1->LLInventoryItem::getDescription() < item2->LLInventoryItem::getDescription(); + return item1->getActualDescription() < item2->getActualDescription(); } void item_array_diff(LLInventoryModel::item_array_t& full_list, @@ -1712,11 +1991,10 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool update_base_outfit_ordering) return; } - LLVOAvatar::ScopedPhaseSetter(gAgentAvatarp,"update_appearance_from_cof"); - BoolSetter setIsInUpdateAppearanceFromCOF(mIsInUpdateAppearanceFromCOF); + selfStartPhase("update_appearance_from_cof"); - LL_INFOS("Avatar") << self_av_string() << "starting" << LL_ENDL; + LL_DEBUGS("Avatar") << self_av_string() << "starting" << LL_ENDL; //checking integrity of the COF in terms of ordering of wearables, //checking and updating links' descriptions of wearables in the COF (before analyzed for "dirty" state) @@ -1730,9 +2008,18 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool update_base_outfit_ordering) // the saved outfit stored as a folder link updateIsDirty(); + // Send server request for appearance update + if (gAgent.getRegion() && gAgent.getRegion()->getCentralBakeVersion()) + { + requestServerAppearanceUpdate(); + } + // DRANO really should wait for the appearance message to set this. + // verify that deleting this line doesn't break anything. + //gAgentAvatarp->setIsUsingServerBakes(gAgent.getRegion() && gAgent.getRegion()->getCentralBakeVersion()); + //dumpCat(getCOF(),"COF, start"); - bool follow_folder_links = true; + bool follow_folder_links = false; LLUUID current_outfit_id = getCOF(); // Find all the wearables that are in the COF's subtree. @@ -1820,6 +2107,7 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool update_base_outfit_ordering) // Fetch the wearables about to be worn. LLWearableList::instance().getAsset(found.mAssetID, found.mName, + gAgentAvatarp, found.mAssetType, onWearableAssetFetch, (void*)holder); @@ -1954,22 +2242,15 @@ void LLAppearanceMgr::wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool ap pid, LLFolderType::FT_NONE, name); - LLPointer<LLInventoryCallback> cb = new LLWearInventoryCategoryCallback(new_cat_id, append); - it = items->begin(); - for(; it < end; ++it) - { - item = *it; - if(item) - { - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - new_cat_id, - std::string(), - cb); - } - } + + // Create a CopyMgr that will copy items, manage its own destruction + new LLCallAfterInventoryCopyMgr( + *items, new_cat_id, std::string("wear_inventory_category_callback"), + boost::bind(&LLAppearanceMgr::wearInventoryCategoryOnAvatar, + LLAppearanceMgr::getInstance(), + gInventory.getCategory(new_cat_id), + append)); + // BAP fixes a lag in display of created dir. gInventory.notifyObservers(); } @@ -1988,6 +2269,12 @@ void LLAppearanceMgr::wearInventoryCategoryOnAvatar( LLInventoryCategory* catego // wearables being dirty. if(!category) return; + if ( !LLInventoryCallbackManager::is_instantiated() ) + { + // shutting down, ignore. + return; + } + LL_INFOS("Avatar") << self_av_string() << "wearInventoryCategoryOnAvatar '" << category->getName() << "'" << LL_ENDL; @@ -2053,10 +2340,11 @@ bool areMatchingWearables(const LLViewerInventoryItem *a, const LLViewerInventor class LLDeferredCOFLinkObserver: public LLInventoryObserver { public: - LLDeferredCOFLinkObserver(const LLUUID& item_id, bool do_update, LLPointer<LLInventoryCallback> cb = NULL): + LLDeferredCOFLinkObserver(const LLUUID& item_id, bool do_update, LLPointer<LLInventoryCallback> cb = NULL, std::string description = ""): mItemID(item_id), mDoUpdate(do_update), - mCallback(cb) + mCallback(cb), + mDescription(description) { } @@ -2078,28 +2366,49 @@ public: private: const LLUUID mItemID; bool mDoUpdate; + std::string mDescription; LLPointer<LLInventoryCallback> mCallback; }; // BAP - note that this runs asynchronously if the item is not already loaded from inventory. // Dangerous if caller assumes link will exist after calling the function. -void LLAppearanceMgr::addCOFItemLink(const LLUUID &item_id, bool do_update, LLPointer<LLInventoryCallback> cb) +void LLAppearanceMgr::addCOFItemLink(const LLUUID &item_id, bool do_update, LLPointer<LLInventoryCallback> cb, const std::string description) { const LLInventoryItem *item = gInventory.getItem(item_id); if (!item) { - LLDeferredCOFLinkObserver *observer = new LLDeferredCOFLinkObserver(item_id, do_update, cb); + LLDeferredCOFLinkObserver *observer = new LLDeferredCOFLinkObserver(item_id, do_update, cb, description); gInventory.addObserver(observer); } else { - addCOFItemLink(item, do_update, cb); + addCOFItemLink(item, do_update, cb, description); + } +} + +void modified_cof_cb(const LLUUID& inv_item) +{ + LLAppearanceMgr::instance().updateAppearanceFromCOF(); + + // Start editing the item if previously requested. + gAgentWearables.editWearableIfRequested(inv_item); + + // TODO: camera mode may not be changed if a debug setting is tweaked + if( gAgentCamera.cameraCustomizeAvatar() ) + { + // If we're in appearance editing mode, the current tab may need to be refreshed + LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance")); + if (panel) + { + panel->showDefaultSubpart(); + } } } -void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update, LLPointer<LLInventoryCallback> cb) +void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update, LLPointer<LLInventoryCallback> cb, const std::string description) { + std::string link_description = description; const LLViewerInventoryItem *vitem = dynamic_cast<const LLViewerInventoryItem*>(item); if (!vitem) { @@ -2161,37 +2470,106 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update { if(do_update && cb.isNull()) { - cb = new ModifiedCOFCallback; + cb = new LLBoostFuncInventoryCallback(modified_cof_cb); + } + if (vitem->getIsLinkType()) + { + link_description = vitem->getActualDescription(); } - const std::string description = vitem->getIsLinkType() ? vitem->getDescription() : ""; link_inventory_item( gAgent.getID(), vitem->getLinkedUUID(), getCOF(), vitem->getName(), - description, + link_description, LLAssetType::AT_LINK, cb); } return; } -// BAP remove ensemble code for 2.1? -void LLAppearanceMgr::addEnsembleLink( LLInventoryCategory* cat, bool do_update ) +LLInventoryModel::item_array_t LLAppearanceMgr::findCOFItemLinks(const LLUUID& item_id) { -#if SUPPORT_ENSEMBLES - // BAP add check for already in COF. - LLPointer<LLInventoryCallback> cb = do_update ? new ModifiedCOFCallback : 0; - link_inventory_item( gAgent.getID(), - cat->getLinkedUUID(), - getCOF(), - cat->getName(), - cat->getDescription(), - LLAssetType::AT_LINK_FOLDER, - cb); -#endif + + LLInventoryModel::item_array_t result; + const LLViewerInventoryItem *vitem = + dynamic_cast<const LLViewerInventoryItem*>(gInventory.getItem(item_id)); + + if (vitem) + { + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + gInventory.collectDescendents(LLAppearanceMgr::getCOF(), + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH); + for (S32 i=0; i<item_array.count(); i++) + { + const LLViewerInventoryItem* inv_item = item_array.get(i).get(); + if (inv_item->getLinkedUUID() == vitem->getLinkedUUID()) + { + result.put(item_array.get(i)); + } + } + } + return result; +} + +void LLAppearanceMgr::removeAllClothesFromAvatar() +{ + // Fetch worn clothes (i.e. the ones in COF). + LLInventoryModel::item_array_t clothing_items; + LLInventoryModel::cat_array_t dummy; + LLIsType is_clothing(LLAssetType::AT_CLOTHING); + gInventory.collectDescendentsIf(getCOF(), + dummy, + clothing_items, + LLInventoryModel::EXCLUDE_TRASH, + is_clothing, + false); + uuid_vec_t item_ids; + for (LLInventoryModel::item_array_t::iterator it = clothing_items.begin(); + it != clothing_items.end(); ++it) + { + item_ids.push_back((*it).get()->getLinkedUUID()); + } + + // Take them off by removing from COF. + removeItemsFromAvatar(item_ids); } -void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id, bool do_update) +void LLAppearanceMgr::removeAllAttachmentsFromAvatar() +{ + if (!isAgentAvatarValid()) return; + + LLAgentWearables::llvo_vec_t objects_to_remove; + + for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); + iter != gAgentAvatarp->mAttachmentPoints.end();) + { + LLVOAvatar::attachment_map_t::iterator curiter = iter++; + LLViewerJointAttachment* attachment = curiter->second; + for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); + attachment_iter != attachment->mAttachedObjects.end(); + ++attachment_iter) + { + LLViewerObject *attached_object = (*attachment_iter); + if (attached_object) + { + objects_to_remove.push_back(attached_object); + } + } + } + uuid_vec_t ids_to_remove; + for (LLAgentWearables::llvo_vec_t::iterator it = objects_to_remove.begin(); + it != objects_to_remove.end(); + ++it) + { + ids_to_remove.push_back((*it)->getAttachmentItemID()); + } + removeItemsFromAvatar(ids_to_remove); +} + +void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id) { gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); @@ -2209,13 +2587,9 @@ void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id, bool do_update) gInventory.purgeObject(item->getUUID()); } } - if (do_update) - { - LLAppearanceMgr::updateAppearanceFromCOF(); - } } -void LLAppearanceMgr::removeCOFLinksOfType(LLWearableType::EType type, bool do_update) +void LLAppearanceMgr::removeCOFLinksOfType(LLWearableType::EType type) { LLFindWearablesOfType filter_wearables_of_type(type); LLInventoryModel::cat_array_t cats; @@ -2231,11 +2605,6 @@ void LLAppearanceMgr::removeCOFLinksOfType(LLWearableType::EType type, bool do_u gInventory.purgeObject(item->getUUID()); } } - - if (do_update) - { - updateAppearanceFromCOF(); - } } bool sort_by_linked_uuid(const LLViewerInventoryItem* item1, const LLViewerInventoryItem* item2) @@ -2303,7 +2672,7 @@ void LLAppearanceMgr::updateIsDirty() if (item1->getLinkedUUID() != item2->getLinkedUUID() || item1->getName() != item2->getName() || - item1->LLInventoryItem::getDescription() != item2->LLInventoryItem::getDescription()) + item1->getActualDescription() != item2->getActualDescription()) { mOutfitIsDirty = true; return; @@ -2372,7 +2741,7 @@ void LLAppearanceMgr::copyLibraryGestures() folder_name == COMMON_GESTURES_FOLDER || folder_name == OTHER_GESTURES_FOLDER) { - cb = new ActivateGestureCallback; + cb = new LLBoostFuncInventoryCallback(activate_gesture_cb); } LLUUID cat_id = findDescendentCategoryIDByName(lib_gesture_cat_id,folder_name); @@ -2426,6 +2795,16 @@ void LLAppearanceMgr::onFirstFullyVisible() } } +// update "dirty" state - defined outside class to allow for calling +// after appearance mgr instance has been destroyed. +void appearance_mgr_update_dirty_state() +{ + if (LLAppearanceMgr::instanceExists()) + { + LLAppearanceMgr::getInstance()->updateIsDirty(); + } +} + bool LLAppearanceMgr::updateBaseOutfit() { if (isOutfitLocked()) @@ -2446,8 +2825,8 @@ bool LLAppearanceMgr::updateBaseOutfit() // in a Base Outfit we do not remove items, only links purgeCategory(base_outfit_id, false); - - LLPointer<LLInventoryCallback> dirty_state_updater = new LLUpdateDirtyState(); + LLPointer<LLInventoryCallback> dirty_state_updater = + new LLBoostFuncInventoryCallback(no_op_inventory_func, appearance_mgr_update_dirty_state); //COF contains only links so we copy to the Base Outfit only links shallowCopyCategoryContents(getCOF(), base_outfit_id, dirty_state_updater); @@ -2504,8 +2883,8 @@ struct WearablesOrderComparator return true; } - const std::string& desc1 = item1->LLInventoryItem::getDescription(); - const std::string& desc2 = item2->LLInventoryItem::getDescription(); + const std::string& desc1 = item1->getActualDescription(); + const std::string& desc2 = item2->getActualDescription(); bool item1_valid = (desc1.size() == mControlSize) && (ORDER_NUMBER_SEPARATOR == desc1[0]); bool item2_valid = (desc2.size() == mControlSize) && (ORDER_NUMBER_SEPARATOR == desc2[0]); @@ -2563,7 +2942,7 @@ void LLAppearanceMgr::updateClothingOrderingInfo(LLUUID cat_id, bool update_base if (!item) continue; std::string new_order_str = build_order_string((LLWearableType::EType)type, i); - if (new_order_str == item->LLInventoryItem::getDescription()) continue; + if (new_order_str == item->getActualDescription()) continue; item->setDescription(new_order_str); item->setComplete(TRUE); @@ -2578,16 +2957,396 @@ void LLAppearanceMgr::updateClothingOrderingInfo(LLUUID cat_id, bool update_base if (inventory_changed) gInventory.notifyObservers(); } +// This is intended for use with HTTP Clients/Responders, but is not +// specifically coupled with those classes. +class LLHTTPRetryPolicy: public LLThreadSafeRefCount +{ +public: + LLHTTPRetryPolicy() {} + virtual ~LLHTTPRetryPolicy() {} + virtual bool shouldRetry(U32 status, F32& seconds_to_wait) = 0; +}; + +// Example of simplest possible policy, not necessarily recommended. +class LLAlwaysRetryImmediatelyPolicy: public LLHTTPRetryPolicy +{ +public: + LLAlwaysRetryImmediatelyPolicy() {} + bool shouldRetry(U32 status, F32& seconds_to_wait) + { + seconds_to_wait = 0.0; + return true; + } +}; + +// Very general policy with geometric back-off after failures, +// up to a maximum delay, and maximum number of retries. +class LLAdaptiveRetryPolicy: public LLHTTPRetryPolicy +{ +public: + LLAdaptiveRetryPolicy(F32 min_delay, F32 max_delay, F32 backoff_factor, U32 max_retries): + mMinDelay(min_delay), + mMaxDelay(max_delay), + mBackoffFactor(backoff_factor), + mMaxRetries(max_retries), + mDelay(min_delay), + mRetryCount(0) + { + } + bool shouldRetry(U32 status, F32& seconds_to_wait) + { + seconds_to_wait = mDelay; + mDelay = llclamp(mDelay*mBackoffFactor,mMinDelay,mMaxDelay); + mRetryCount++; + return (mRetryCount<=mMaxRetries); + } +private: + F32 mMinDelay; // delay never less than this value + F32 mMaxDelay; // delay never exceeds this value + F32 mBackoffFactor; // delay increases by this factor after each retry, up to mMaxDelay. + U32 mMaxRetries; // maximum number of times shouldRetry will return true. + F32 mDelay; // current delay. + U32 mRetryCount; // number of times shouldRetry has been called. +}; -class LLShowCreatedOutfit: public LLInventoryCallback +class RequestAgentUpdateAppearanceResponder: public LLHTTPClient::Responder { public: - LLShowCreatedOutfit(LLUUID& folder_id, bool show_panel = true): mFolderID(folder_id), mShowPanel(show_panel) - {} + RequestAgentUpdateAppearanceResponder() + { + mRetryPolicy = new LLAdaptiveRetryPolicy(1.0, 32.0, 2.0, 10); + } + + virtual ~RequestAgentUpdateAppearanceResponder() + { + } - virtual ~LLShowCreatedOutfit() + // Successful completion. + /* virtual */ void result(const LLSD& content) + { + LL_DEBUGS("Avatar") << "content: " << ll_pretty_print_sd(content) << LL_ENDL; + if (content["success"].asBoolean()) + { + LL_DEBUGS("Avatar") << "OK" << LL_ENDL; + if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage")) + { + dumpContents(gAgentAvatarp->getFullname() + "_appearance_request_ok", content); + } + } + else + { + onFailure(200); + } + } + + // Error + /*virtual*/ void errorWithContent(U32 status, const std::string& reason, const LLSD& content) + { + llwarns << "appearance update request failed, status: " << status << " reason: " << reason << " code: " << content["code"].asInteger() << " error: \"" << content["error"].asString() << "\"" << llendl; + if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage")) + { + dumpContents(gAgentAvatarp->getFullname() + "_appearance_request_error", content); + debugCOF(content); + + } + onFailure(status); + } + + void onFailure(U32 status) + { + F32 seconds_to_wait; + if (mRetryPolicy->shouldRetry(status,seconds_to_wait)) + { + llinfos << "retrying" << llendl; + doAfterInterval(boost::bind(&LLAppearanceMgr::requestServerAppearanceUpdate, + LLAppearanceMgr::getInstance(), + LLCurl::ResponderPtr(this)), + seconds_to_wait); + } + else + { + llwarns << "giving up after too many retries" << llendl; + } + } + + void dumpContents(const std::string outprefix, const LLSD& content) + { + std::string outfilename = get_sequential_numbered_file_name(outprefix,".xml"); + std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,outfilename); + std::ofstream ofs(fullpath.c_str(), std::ios_base::out); + ofs << LLSDOStreamer<LLSDXMLFormatter>(content, LLSDFormatter::OPTIONS_PRETTY); + LL_DEBUGS("Avatar") << "results saved to: " << fullpath << LL_ENDL; + } + + void debugCOF(const LLSD& content) + { + LL_DEBUGS("Avatar") << "AIS COF, version found: " << content["expected"].asInteger() << llendl; + std::set<LLUUID> ais_items, local_items; + const LLSD& cof_raw = content["cof_raw"]; + for (LLSD::array_const_iterator it = cof_raw.beginArray(); + it != cof_raw.endArray(); ++it) + { + const LLSD& item = *it; + if (item["parent_id"].asUUID() == LLAppearanceMgr::instance().getCOF()) + { + ais_items.insert(item["item_id"].asUUID()); + if (item["type"].asInteger() == 24) // link + { + LL_DEBUGS("Avatar") << "Link: item_id: " << item["item_id"].asUUID() + << " linked_item_id: " << item["asset_id"].asUUID() + << " name: " << item["name"].asString() + << llendl; + } + else if (item["type"].asInteger() == 25) // folder link + { + LL_DEBUGS("Avatar") << "Folder link: item_id: " << item["item_id"].asUUID() + << " linked_item_id: " << item["asset_id"].asUUID() + << " name: " << item["name"].asString() + << llendl; + + } + else + { + LL_DEBUGS("Avatar") << "Other: item_id: " << item["item_id"].asUUID() + << " linked_item_id: " << item["asset_id"].asUUID() + << " name: " << item["name"].asString() + << llendl; + } + } + } + LL_DEBUGS("Avatar") << llendl; + LL_DEBUGS("Avatar") << "Local COF, version requested: " << content["observed"].asInteger() << llendl; + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + gInventory.collectDescendents(LLAppearanceMgr::instance().getCOF(), + cat_array,item_array,LLInventoryModel::EXCLUDE_TRASH); + for (S32 i=0; i<item_array.count(); i++) + { + const LLViewerInventoryItem* inv_item = item_array.get(i).get(); + local_items.insert(inv_item->getUUID()); + LL_DEBUGS("Avatar") << "item_id: " << inv_item->getUUID() + << " linked_item_id: " << inv_item->getLinkedUUID() + << " name: " << inv_item->getName() + << llendl; + } + LL_DEBUGS("Avatar") << llendl; + for (std::set<LLUUID>::iterator it = local_items.begin(); it != local_items.end(); ++it) + { + if (ais_items.find(*it) == ais_items.end()) + { + LL_DEBUGS("Avatar") << "LOCAL ONLY: " << *it << llendl; + } + } + for (std::set<LLUUID>::iterator it = ais_items.begin(); it != ais_items.end(); ++it) + { + if (local_items.find(*it) == local_items.end()) + { + LL_DEBUGS("Avatar") << "AIS ONLY: " << *it << llendl; + } + } + } + + LLPointer<LLHTTPRetryPolicy> mRetryPolicy; +}; + +LLSD LLAppearanceMgr::dumpCOF() const +{ + LLSD links = LLSD::emptyArray(); + LLMD5 md5; + + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + gInventory.collectDescendents(getCOF(),cat_array,item_array,LLInventoryModel::EXCLUDE_TRASH); + for (S32 i=0; i<item_array.count(); i++) + { + const LLViewerInventoryItem* inv_item = item_array.get(i).get(); + LLSD item; + LLUUID item_id(inv_item->getUUID()); + md5.update((unsigned char*)item_id.mData, 16); + item["description"] = inv_item->getActualDescription(); + md5.update(inv_item->getActualDescription()); + item["asset_type"] = inv_item->getActualType(); + LLUUID linked_id(inv_item->getLinkedUUID()); + item["linked_id"] = linked_id; + md5.update((unsigned char*)linked_id.mData, 16); + + if (LLAssetType::AT_LINK == inv_item->getActualType()) + { + const LLViewerInventoryItem* linked_item = inv_item->getLinkedItem(); + if (NULL == linked_item) + { + llwarns << "Broken link for item '" << inv_item->getName() + << "' (" << inv_item->getUUID() + << ") during requestServerAppearanceUpdate" << llendl; + continue; + } + // Some assets may be 'hidden' and show up as null in the viewer. + //if (linked_item->getAssetUUID().isNull()) + //{ + // llwarns << "Broken link (null asset) for item '" << inv_item->getName() + // << "' (" << inv_item->getUUID() + // << ") during requestServerAppearanceUpdate" << llendl; + // continue; + //} + LLUUID linked_asset_id(linked_item->getAssetUUID()); + md5.update((unsigned char*)linked_asset_id.mData, 16); + U32 flags = linked_item->getFlags(); + md5.update(boost::lexical_cast<std::string>(flags)); + } + else if (LLAssetType::AT_LINK_FOLDER != inv_item->getActualType()) + { + llwarns << "Non-link item '" << inv_item->getName() + << "' (" << inv_item->getUUID() + << ") type " << (S32) inv_item->getActualType() + << " during requestServerAppearanceUpdate" << llendl; + continue; + } + links.append(item); + } + LLSD result = LLSD::emptyMap(); + result["cof_contents"] = links; + char cof_md5sum[MD5HEX_STR_SIZE]; + md5.finalize(); + md5.hex_digest(cof_md5sum); + result["cof_md5sum"] = std::string(cof_md5sum); + return result; +} + +void LLAppearanceMgr::requestServerAppearanceUpdate(LLCurl::ResponderPtr responder_ptr) +{ + if (gAgentAvatarp->isEditingAppearance()) + { + // don't send out appearance updates if in appearance editing mode + return; + } + + if (!gAgent.getRegion()) + { + llwarns << "Region not set, cannot request server appearance update" << llendl; + return; + } + if (gAgent.getRegion()->getCentralBakeVersion()==0) + { + llwarns << "Region does not support baking" << llendl; + } + std::string url = gAgent.getRegion()->getCapability("UpdateAvatarAppearance"); + if (url.empty()) + { + llwarns << "No cap for UpdateAvatarAppearance." << llendl; + return; + } + + LLSD body; + S32 cof_version = getCOFVersion(); + if (gSavedSettings.getBOOL("DebugAvatarExperimentalServerAppearanceUpdate")) + { + body = dumpCOF(); + } + else + { + body["cof_version"] = cof_version; + if (gSavedSettings.getBOOL("DebugForceAppearanceRequestFailure")) + { + body["cof_version"] = cof_version+999; + } + } + LL_DEBUGS("Avatar") << "request url " << url << " my_cof_version " << cof_version << llendl; + + //LLCurl::ResponderPtr responder_ptr; + if (!responder_ptr.get()) + { + responder_ptr = new RequestAgentUpdateAppearanceResponder; + } + LLHTTPClient::post(url, body, responder_ptr); + llassert(cof_version >= gAgentAvatarp->mLastUpdateRequestCOFVersion); + gAgentAvatarp->mLastUpdateRequestCOFVersion = cof_version; +} + +class LLIncrementCofVersionResponder : public LLHTTPClient::Responder +{ +public: + LLIncrementCofVersionResponder() : LLHTTPClient::Responder() + { + mRetryPolicy = new LLAdaptiveRetryPolicy(1.0, 16.0, 2.0, 5); + } + + virtual ~LLIncrementCofVersionResponder() + { + } + + virtual void result(const LLSD &pContent) + { + llinfos << "Successfully incremented agent's COF." << llendl; + S32 new_version = pContent["category"]["version"].asInteger(); + + // cof_version should have increased + llassert(new_version > gAgentAvatarp->mLastUpdateRequestCOFVersion); + + gAgentAvatarp->mLastUpdateRequestCOFVersion = new_version; + } + virtual void errorWithContent(U32 pStatus, const std::string& pReason, const LLSD& content) + { + llwarns << "While attempting to increment the agent's cof we got an error with [status:" + << pStatus << "]: " << content << llendl; + F32 seconds_to_wait; + if (mRetryPolicy->shouldRetry(pStatus,seconds_to_wait)) + { + llinfos << "retrying" << llendl; + doAfterInterval(boost::bind(&LLAppearanceMgr::incrementCofVersion, + LLAppearanceMgr::getInstance(), + LLHTTPClient::ResponderPtr(this)), + seconds_to_wait); + } + else + { + llwarns << "giving up after too many retries" << llendl; + } + } + + LLPointer<LLHTTPRetryPolicy> mRetryPolicy; +}; + +void LLAppearanceMgr::incrementCofVersion(LLHTTPClient::ResponderPtr responder_ptr) +{ + // If we don't have a region, report it as an error + if (gAgent.getRegion() == NULL) + { + llwarns << "Region not set, cannot request cof_version increment" << llendl; + return; + } + + std::string url = gAgent.getRegion()->getCapability("IncrementCofVersion"); + if (url.empty()) + { + llwarns << "No cap for IncrementCofVersion." << llendl; + return; + } + + llinfos << "Requesting cof_version be incremented via capability to: " + << url << llendl; + LLSD headers; + LLSD body = LLSD::emptyMap(); + + if (!responder_ptr.get()) + { + responder_ptr = LLHTTPClient::ResponderPtr(new LLIncrementCofVersionResponder()); + } + + LLHTTPClient::get(url, body, responder_ptr, headers, 30.0f); +} + +std::string LLAppearanceMgr::getAppearanceServiceURL() const +{ + if (gSavedSettings.getString("DebugAvatarAppearanceServiceURLOverride").empty()) + { + return mAppearanceServiceURL; + } + return gSavedSettings.getString("DebugAvatarAppearanceServiceURLOverride"); +} + +void show_created_outfit(LLUUID& folder_id, bool show_panel = true) { if (!LLApp::isRunning()) { @@ -2597,9 +3356,9 @@ public: LLSD key; - //EXT-7727. For new accounts LLShowCreatedOutfit is created during login process - // add may be processed after login process is finished - if (mShowPanel) + //EXT-7727. For new accounts inventory callback is created during login process + // and may be processed after login process is finished + if (show_panel) { LLFloaterSidePanelContainer::showPanel("appearance", "panel_outfits_inventory", key); @@ -2608,7 +3367,7 @@ public: dynamic_cast<LLOutfitsList*>(LLFloaterSidePanelContainer::getPanel("appearance", "outfitslist_tab")); if (outfits_list) { - outfits_list->setSelectedOutfitByUUID(mFolderID); + outfits_list->setSelectedOutfitByUUID(folder_id); } LLAppearanceMgr::getInstance()->updateIsDirty(); @@ -2616,14 +3375,6 @@ public: LLAppearanceMgr::getInstance()->updatePanelOutfitName(""); } - virtual void fire(const LLUUID&) - {} - -private: - LLUUID mFolderID; - bool mShowPanel; -}; - LLUUID LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name, bool show_panel) { if (!isAgentAvatarValid()) return LLUUID::null; @@ -2639,7 +3390,8 @@ LLUUID LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name, b updateClothingOrderingInfo(); - LLPointer<LLInventoryCallback> cb = new LLShowCreatedOutfit(folder_id,show_panel); + LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(no_op_inventory_func, + boost::bind(show_created_outfit,folder_id,show_panel)); shallowCopyCategoryContents(getCOF(),folder_id, cb); createBaseOutfitLink(folder_id, cb); @@ -2656,33 +3408,26 @@ void LLAppearanceMgr::wearBaseOutfit() updateCOF(base_outfit_id); } -void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove) +void LLAppearanceMgr::removeItemsFromAvatar(const uuid_vec_t& ids_to_remove) { - LLViewerInventoryItem * item_to_remove = gInventory.getItem(id_to_remove); - if (!item_to_remove) return; - - switch (item_to_remove->getType()) + if (ids_to_remove.empty()) { - case LLAssetType::AT_CLOTHING: - if (get_is_item_worn(id_to_remove)) + llwarns << "called with empty list, nothing to do" << llendl; + } + for (uuid_vec_t::const_iterator it = ids_to_remove.begin(); it != ids_to_remove.end(); ++it) { - //*TODO move here the exact removing code from LLWearableBridge::removeItemFromAvatar in the future - LLWearableBridge::removeItemFromAvatar(item_to_remove); + const LLUUID& id_to_remove = *it; + const LLUUID& linked_item_id = gInventory.getLinkedItemID(id_to_remove); + removeCOFItemLinks(linked_item_id); } - break; - case LLAssetType::AT_OBJECT: - LLVOAvatarSelf::detachAttachmentIntoInventory(item_to_remove->getLinkedUUID()); - default: - break; + updateAppearanceFromCOF(); } - // *HACK: Force to remove garbage from COF. - // Unworn links or objects can't be processed by existed removing functionality - // since it is not designed for such cases. As example attachment object can't be removed - // since sever don't sends message _PREHASH_KillObject in that case. - // Also we can't check is link was successfully removed from COF since in case - // deleting attachment link removing performs asynchronously in process_kill_object callback. - removeCOFItemLinks(id_to_remove,false); +void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove) +{ + LLUUID linked_item_id = gInventory.getLinkedItemID(id_to_remove); + removeCOFItemLinks(linked_item_id); + updateAppearanceFromCOF(); } bool LLAppearanceMgr::moveWearable(LLViewerInventoryItem* item, bool closer_to_body) @@ -2711,8 +3456,8 @@ bool LLAppearanceMgr::moveWearable(LLViewerInventoryItem* item, bool closer_to_b closer_to_body ? --it : ++it; LLViewerInventoryItem* swap_item = *it; if (!swap_item) return false; - std::string tmp = swap_item->LLInventoryItem::getDescription(); - swap_item->setDescription(item->LLInventoryItem::getDescription()); + std::string tmp = swap_item->getActualDescription(); + swap_item->setDescription(item->getActualDescription()); item->setDescription(tmp); @@ -2745,7 +3490,7 @@ void LLAppearanceMgr::sortItemsByActualDescription(LLInventoryModel::item_array_ { if (items.size() < 2) return; - std::sort(items.begin(), items.end(), sort_by_description); + std::sort(items.begin(), items.end(), sort_by_actual_description); } //#define DUMP_CAT_VERBOSE @@ -2811,7 +3556,7 @@ LLAppearanceMgr::~LLAppearanceMgr() void LLAppearanceMgr::setAttachmentInvLinkEnable(bool val) { - llinfos << "setAttachmentInvLinkEnable => " << (int) val << llendl; + LL_DEBUGS("Avatar") << "setAttachmentInvLinkEnable => " << (int) val << llendl; mAttachmentInvLinkEnabled = val; } @@ -2855,7 +3600,7 @@ void LLAppearanceMgr::unregisterAttachment(const LLUUID& item_id) if (mAttachmentInvLinkEnabled) { - LLAppearanceMgr::removeCOFItemLinks(item_id, false); + LLAppearanceMgr::removeCOFItemLinks(item_id); } else { @@ -2949,9 +3694,9 @@ public: } virtual void done() { - // What we do here is get the complete information on the items in - // the library, and set up an observer that will wait for that to - // happen. + // What we do here is get the complete information on the + // items in the requested category, and set up an observer + // that will wait for that to happen. LLInventoryModel::cat_array_t cat_array; LLInventoryModel::item_array_t item_array; gInventory.collectDescendents(mComplete.front(), @@ -2964,9 +3709,8 @@ public: llwarns << "Nothing fetched in category " << mComplete.front() << llendl; gInventory.removeObserver(this); + doOnIdleOneTime(mCallable); - // lets notify observers that loading is finished. - gAgentWearables.notifyLoadingFinished(); delete this; return; } diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index c1d561781d..46252afbde 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -35,7 +35,6 @@ #include "llinventoryobserver.h" #include "llviewerinventory.h" -class LLWearable; class LLWearableHoldingPattern; class LLInventoryCallback; class LLOutfitUnLockTimer; @@ -93,6 +92,10 @@ public: // Find the Current Outfit folder. const LLUUID getCOF() const; + S32 getCOFVersion() const; + + // Debugging - get truncated LLSD summary of COF contents. + LLSD dumpCOF() const; // Finds the folder link to the currently worn outfit const LLViewerInventoryItem *getBaseOutfitLink(); @@ -107,6 +110,7 @@ public: // Update the displayed outfit name in UI. void updatePanelOutfitName(const std::string& name); + void purgeBaseOutfitLink(const LLUUID& category); void createBaseOutfitLink(const LLUUID& category, LLPointer<LLInventoryCallback> link_waiter); void updateAgentWearables(LLWearableHoldingPattern* holder, bool append); @@ -126,15 +130,17 @@ public: LLPointer<LLInventoryCallback> cb); // Add COF link to individual item. - void addCOFItemLink(const LLUUID& item_id, bool do_update = true, LLPointer<LLInventoryCallback> cb = NULL); - void addCOFItemLink(const LLInventoryItem *item, bool do_update = true, LLPointer<LLInventoryCallback> cb = NULL); + void addCOFItemLink(const LLUUID& item_id, bool do_update = true, LLPointer<LLInventoryCallback> cb = NULL, const std::string description = ""); + void addCOFItemLink(const LLInventoryItem *item, bool do_update = true, LLPointer<LLInventoryCallback> cb = NULL, const std::string description = ""); - // Remove COF entries - void removeCOFItemLinks(const LLUUID& item_id, bool do_update = true); - void removeCOFLinksOfType(LLWearableType::EType type, bool do_update = true); + // Find COF entries referencing the given item. + LLInventoryModel::item_array_t findCOFItemLinks(const LLUUID& item_id); - // Add COF link to ensemble folder. - void addEnsembleLink(LLInventoryCategory* item, bool do_update = true); + // Remove COF entries + void removeCOFItemLinks(const LLUUID& item_id); + void removeCOFLinksOfType(LLWearableType::EType type); + void removeAllClothesFromAvatar(); + void removeAllAttachmentsFromAvatar(); //has the current outfit changed since it was loaded? bool isOutfitDirty() { return mOutfitIsDirty; } @@ -162,6 +168,7 @@ public: bool updateBaseOutfit(); //Remove clothing or detach an object from the agent (a bodypart cannot be removed) + void removeItemsFromAvatar(const uuid_vec_t& item_ids); void removeItemFromAvatar(const LLUUID& item_id); @@ -182,6 +189,20 @@ public: bool isInUpdateAppearanceFromCOF() { return mIsInUpdateAppearanceFromCOF; } + void requestServerAppearanceUpdate(LLCurl::ResponderPtr responder_ptr = NULL); + + void incrementCofVersion(LLHTTPClient::ResponderPtr responder_ptr = NULL); + + // *HACK Remove this after server side texture baking is deployed on all sims. + void incrementCofVersionLegacy(); + + void setAppearanceServiceURL(const std::string& url) { mAppearanceServiceURL = url; } + std::string getAppearanceServiceURL() const; + +private: + std::string mAppearanceServiceURL; + + protected: LLAppearanceMgr(); ~LLAppearanceMgr(); @@ -201,9 +222,7 @@ private: LLInventoryModel::item_array_t& gest_items, bool follow_folder_links); - void purgeCategory(const LLUUID& category, bool keep_outfit_links); - void purgeBaseOutfitLink(const LLUUID& category); - + void purgeCategory(const LLUUID& category, bool keep_outfit_links, LLInventoryModel::item_array_t* keep_items = NULL); static void onOutfitRename(const LLSD& notification, const LLSD& response); void setOutfitLocked(bool locked); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 53c694eaca..3598e71feb 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -292,6 +292,10 @@ LLTimer gLogoutTimer; static const F32 LOGOUT_REQUEST_TIME = 6.f; // this will be cut short by the LogoutReply msg. F32 gLogoutMaxTime = LOGOUT_REQUEST_TIME; + +S32 gPendingMetricsUploads = 0; + + BOOL gDisconnected = FALSE; // used to restore texture state after a mode switch @@ -682,6 +686,15 @@ LLAppViewer::~LLAppViewer() removeMarkerFile(); } +class LLUITranslationBridge : public LLTranslationBridge +{ +public: + virtual std::string getString(const std::string &xml_desc) + { + return LLTrans::getString(xml_desc); + } +}; + bool LLAppViewer::init() { // @@ -693,6 +706,10 @@ bool LLAppViewer::init() // LLFastTimer::reset(); + // initialize LLWearableType translation bridge. + // Memory will be cleaned up in ::cleanupClass() + LLWearableType::initClass(new LLUITranslationBridge()); + // initialize SSE options LLVector4a::initClass(); @@ -786,7 +803,7 @@ bool LLAppViewer::init() LLUIImageList::getInstance(), ui_audio_callback, deferred_ui_audio_callback, - &LLUI::sGLScaleFactor); + &LLUI::getScaleFactor()); LL_INFOS("InitInfo") << "UI initialized." << LL_ENDL ; // NOW LLUI::getLanguage() should work. gDirUtilp must know the language @@ -1690,19 +1707,7 @@ bool LLAppViewer::cleanup() gAudiop->setStreamingAudioImpl(NULL); // shut down the audio subsystem - - bool want_longname = false; - if (gAudiop->getDriverName(want_longname) == "FMOD") - { - // This hack exists because fmod likes to occasionally - // crash or hang forever when shutting down, for no - // apparent reason. - llwarns << "Hack, skipping FMOD audio engine cleanup" << llendflush; - } - else - { gAudiop->shutdown(); - } delete gAudiop; gAudiop = NULL; @@ -1776,6 +1781,8 @@ bool LLAppViewer::cleanup() LLViewerObject::cleanupVOClasses(); + LLAvatarAppearance::cleanupClass(); + LLPostProcess::cleanupClass(); LLTracker::cleanupInstance(); @@ -2014,6 +2021,8 @@ bool LLAppViewer::cleanup() llinfos << "Cleaning up LLProxy." << llendl; LLProxy::cleanupClass(); + LLWearableType::cleanupClass(); + LLMainLoopRepeater::instance().stop(); //release all private memory pools. @@ -3574,6 +3583,12 @@ void LLAppViewer::requestQuit() // Try to send metrics back to the grid metricsSend(!gDisconnected); + // Try to send last batch of avatar rez metrics. + if (!gDisconnected && isAgentAvatarValid()) + { + gAgentAvatarp->updateAvatarRezMetrics(true); // force a last packet to be sent. + } + LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE); effectp->setPositionGlobal(gAgent.getPositionGlobal()); effectp->setColor(LLColor4U(gAgent.getEffectColor())); @@ -4365,7 +4380,6 @@ void LLAppViewer::idle() // The 5-second interval is nice for this purpose. If the object debug // bit moves or is disabled, please give this a suitable home. LLViewerAssetStatsFF::record_fps_main(gFPSClamped); - LLViewerAssetStatsFF::record_avatar_stats(); } } @@ -4681,6 +4695,13 @@ void LLAppViewer::idleShutdown() return; } + if (gPendingMetricsUploads > 0 + && gLogoutTimer.getElapsedTimeF32() < SHUTDOWN_UPLOAD_SAVE_TIME + && !logoutRequestSent()) + { + return; + } + // All floaters are closed. Tell server we want to quit. if( !logoutRequestSent() ) { diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 7563d672e3..08039100b3 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -342,6 +342,8 @@ extern LLFrameTimer gLoggedInTime; extern F32 gLogoutMaxTime; extern LLTimer gLogoutTimer; +extern S32 gPendingMetricsUploads; + extern F32 gSimLastTime; extern F32 gSimFrames; diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 8326be433e..82b93b52a2 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -92,7 +92,7 @@ void nvapi_error(NvAPI_Status status) llwarns << szDesc << llendl; //should always trigger when asserts are enabled - llassert(status == NVAPI_OK); + //llassert(status == NVAPI_OK); } // Create app mutex creates a unique global windows object. diff --git a/indra/newview/llassetuploadqueue.cpp b/indra/newview/llassetuploadqueue.cpp index f943759bb8..4bdb690225 100644 --- a/indra/newview/llassetuploadqueue.cpp +++ b/indra/newview/llassetuploadqueue.cpp @@ -69,10 +69,11 @@ public: delete mData; } - virtual void error(U32 statusNum, const std::string& reason) + virtual void errorWithContent(U32 statusNum, const std::string& reason, const LLSD& content) { - llwarns << "Error: " << reason << llendl; - LLUpdateTaskInventoryResponder::error(statusNum, reason); + llwarns << "LLAssetUploadChainResponder Error [status:" + << statusNum << "]: " << content << llendl; + LLUpdateTaskInventoryResponder::errorWithContent(statusNum, reason, content); LLAssetUploadQueue *queue = mSupplier->get(); if (queue) { diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 7b2c536f5a..2564802387 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -48,8 +48,8 @@ #include "llviewercontrol.h" #include "llviewerobjectlist.h" #include "llviewermenufile.h" +#include "llviewertexlayer.h" #include "llviewerwindow.h" -#include "lltexlayer.h" #include "lltrans.h" // library includes @@ -225,10 +225,10 @@ LLAssetUploadResponder::~LLAssetUploadResponder() } // virtual -void LLAssetUploadResponder::error(U32 statusNum, const std::string& reason) +void LLAssetUploadResponder::errorWithContent(U32 statusNum, const std::string& reason, const LLSD& content) { - llinfos << "LLAssetUploadResponder::error " << statusNum - << " reason: " << reason << llendl; + llinfos << "LLAssetUploadResponder::error [status:" + << statusNum << "]: " << content << llendl; LLSD args; switch(statusNum) { @@ -340,9 +340,9 @@ LLNewAgentInventoryResponder::LLNewAgentInventoryResponder( } // virtual -void LLNewAgentInventoryResponder::error(U32 statusNum, const std::string& reason) +void LLNewAgentInventoryResponder::errorWithContent(U32 statusNum, const std::string& reason, const LLSD& content) { - LLAssetUploadResponder::error(statusNum, reason); + LLAssetUploadResponder::errorWithContent(statusNum, reason, content); //LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, LLUUID(), FALSE); } @@ -456,7 +456,7 @@ LLSendTexLayerResponder::LLSendTexLayerResponder(const LLSD& post_data, LLSendTexLayerResponder::~LLSendTexLayerResponder() { - // mBakedUploadData is normally deleted by calls to LLTexLayerSetBuffer::onTextureUploadComplete() below + // mBakedUploadData is normally deleted by calls to LLViewerTexLayerSetBuffer::onTextureUploadComplete() below if (mBakedUploadData) { // ...but delete it in the case where uploadComplete() is never called delete mBakedUploadData; @@ -477,22 +477,23 @@ void LLSendTexLayerResponder::uploadComplete(const LLSD& content) if (result == "complete" && mBakedUploadData != NULL) { // Invoke - LLTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, 0, LL_EXSTAT_NONE); + LLViewerTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, 0, LL_EXSTAT_NONE); mBakedUploadData = NULL; // deleted in onTextureUploadComplete() } else { // Invoke the original callback with an error result - LLTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, -1, LL_EXSTAT_NONE); + LLViewerTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, -1, LL_EXSTAT_NONE); mBakedUploadData = NULL; // deleted in onTextureUploadComplete() } } -void LLSendTexLayerResponder::error(U32 statusNum, const std::string& reason) +void LLSendTexLayerResponder::errorWithContent(U32 statusNum, const std::string& reason, const LLSD& content) { - llinfos << "status: " << statusNum << " reason: " << reason << llendl; + llinfos << "LLSendTexLayerResponder error [status:" + << statusNum << "]: " << content << llendl; // Invoke the original callback with an error result - LLTexLayerSetBuffer::onTextureUploadComplete(LLUUID(), (void*) mBakedUploadData, -1, LL_EXSTAT_NONE); + LLViewerTexLayerSetBuffer::onTextureUploadComplete(LLUUID(), (void*) mBakedUploadData, -1, LL_EXSTAT_NONE); mBakedUploadData = NULL; // deleted in onTextureUploadComplete() } diff --git a/indra/newview/llassetuploadresponders.h b/indra/newview/llassetuploadresponders.h index 381b919c4a..a6d1016136 100644 --- a/indra/newview/llassetuploadresponders.h +++ b/indra/newview/llassetuploadresponders.h @@ -42,7 +42,7 @@ public: LLAssetType::EType asset_type); ~LLAssetUploadResponder(); - virtual void error(U32 statusNum, const std::string& reason); + virtual void errorWithContent(U32 statusNum, const std::string& reason, const LLSD& content); virtual void result(const LLSD& content); virtual void uploadUpload(const LLSD& content); virtual void uploadComplete(const LLSD& content); @@ -67,7 +67,7 @@ public: const LLSD& post_data, const std::string& file_name, LLAssetType::EType asset_type); - virtual void error(U32 statusNum, const std::string& reason); + virtual void errorWithContent(U32 statusNum, const std::string& reason, const LLSD& content); virtual void uploadComplete(const LLSD& content); virtual void uploadFailure(const LLSD& content); }; @@ -122,7 +122,7 @@ public: ~LLSendTexLayerResponder(); virtual void uploadComplete(const LLSD& content); - virtual void error(U32 statusNum, const std::string& reason); + virtual void errorWithContent(U32 statusNum, const std::string& reason, const LLSD& content); LLBakedUploadData * mBakedUploadData; }; diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp index 714bde6f37..f34ad23769 100755 --- a/indra/newview/llavatariconctrl.cpp +++ b/indra/newview/llavatariconctrl.cpp @@ -39,6 +39,8 @@ #include "lluictrlfactory.h" #include "llagentdata.h" #include "llfloaterimsession.h" +#include "llviewertexture.h" +#include "llavatarappearancedefines.h" // library includes #include "llavatarnamecache.h" diff --git a/indra/newview/llbuycurrencyhtml.cpp b/indra/newview/llbuycurrencyhtml.cpp index e5a9be0203..459123a5d8 100644 --- a/indra/newview/llbuycurrencyhtml.cpp +++ b/indra/newview/llbuycurrencyhtml.cpp @@ -61,6 +61,10 @@ public: if ( params.size() >= 3 ) { result_code = params[ 2 ].asInteger(); + if ( result_code != 0 ) + { + LL_WARNS("LLBuyCurrency") << "Received nonzero result code: " << result_code << LL_ENDL ; + } }; // open the legacy XUI based currency floater diff --git a/indra/newview/llcallbacklist.cpp b/indra/newview/llcallbacklist.cpp index 357a6582d1..79ec43dfe9 100644 --- a/indra/newview/llcallbacklist.cpp +++ b/indra/newview/llcallbacklist.cpp @@ -27,6 +27,7 @@ #include "llviewerprecompiledheaders.h" #include "llcallbacklist.h" +#include "lleventtimer.h" // Library includes #include "llerror.h" @@ -180,6 +181,54 @@ void doOnIdleRepeating(bool_func_t callable) gIdleCallbacks.addFunction(&OnIdleCallbackRepeating::onIdle,cb_functor); } +class NullaryFuncEventTimer: public LLEventTimer +{ +public: + NullaryFuncEventTimer(nullary_func_t callable, F32 seconds): + LLEventTimer(seconds), + mCallable(callable) + { + } + +private: + BOOL tick() + { + mCallable(); + return TRUE; + } + + nullary_func_t mCallable; +}; + +// Call a given callable once after specified interval. +void doAfterInterval(nullary_func_t callable, F32 seconds) +{ + new NullaryFuncEventTimer(callable, seconds); +} + +class BoolFuncEventTimer: public LLEventTimer +{ +public: + BoolFuncEventTimer(bool_func_t callable, F32 seconds): + LLEventTimer(seconds), + mCallable(callable) + { + } +private: + BOOL tick() + { + return mCallable(); + } + + bool_func_t mCallable; +}; + +// Call a given callable every specified number of seconds, until it returns true. +void doPeriodically(bool_func_t callable, F32 seconds) +{ + new BoolFuncEventTimer(callable, seconds); +} + #ifdef _DEBUG void test1(void *data) diff --git a/indra/newview/llcallbacklist.h b/indra/newview/llcallbacklist.h index 97f3bfd9ee..0516c9cdb4 100644 --- a/indra/newview/llcallbacklist.h +++ b/indra/newview/llcallbacklist.h @@ -61,6 +61,12 @@ void doOnIdleOneTime(nullary_func_t callable); // Repeatedly call a callable in idle loop until it returns true. void doOnIdleRepeating(bool_func_t callable); +// Call a given callable once after specified interval. +void doAfterInterval(nullary_func_t callable, F32 seconds); + +// Call a given callable every specified number of seconds, until it returns true. +void doPeriodically(bool_func_t callable, F32 seconds); + extern LLCallbackList gIdleCallbacks; #endif diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index 30306b230f..14583e402d 100644 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -184,7 +184,8 @@ LLVector3d LLAvatarTracker::getGlobalPos() global_pos = object->getPositionGlobal(); // HACK - for making the tracker point above the avatar's head // rather than its groin - global_pos.mdV[VZ] += 0.7f * ((LLVOAvatar *)object)->mBodySize.mV[VZ]; + LLVOAvatar* av = (LLVOAvatar*)object; + global_pos.mdV[VZ] += 0.7f * (av->mBodySize.mV[VZ] + av->mAvatarOffset.mV[VZ]); mTrackingData->mGlobalPositionEstimate = global_pos; } diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 53926c1fef..0f138873ac 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -408,16 +408,7 @@ public: S32 user_name_width = user_name_rect.getWidth(); S32 time_box_width = time_box->getRect().getWidth(); - if (time_box->getVisible() && user_name_width <= mMinUserNameWidth) - { - time_box->setVisible(FALSE); - - user_name_rect.mRight += time_box_width; - user_name->reshape(user_name_rect.getWidth(), user_name_rect.getHeight()); - user_name->setRect(user_name_rect); - } - - if (!time_box->getVisible() && user_name_width > mMinUserNameWidth + time_box_width) + if (!time_box->getVisible() && user_name_width > mMinUserNameWidth) { user_name_rect.mRight -= time_box_width; user_name->reshape(user_name_rect.getWidth(), user_name_rect.getHeight()); diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 43c6b558bc..88884042d4 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -430,14 +430,12 @@ void LLChicletPanel::onMessageCountChanged(const LLSD& data) { // *TODO : we either suppress this method or return a value. Right now, it servers no purpose. /* - LLUUID session_id = data["session_id"].asUUID(); - S32 unread = data["participant_unread"].asInteger(); - LLFloaterIMSession* im_floater = LLFloaterIMSession::findInstance(session_id); - if (im_floater && im_floater->getVisible() && im_floater->hasFocus()) - { - unread = 0; - } + //LLFloaterIMSession* im_floater = LLFloaterIMSession::findInstance(session_id); + //if (im_floater && im_floater->getVisible() && im_floater->hasFocus()) + //{ + // unread = 0; + //} */ } diff --git a/indra/newview/llclassifiedstatsresponder.cpp b/indra/newview/llclassifiedstatsresponder.cpp index b4da31895f..e3cd83e174 100644 --- a/indra/newview/llclassifiedstatsresponder.cpp +++ b/indra/newview/llclassifiedstatsresponder.cpp @@ -62,8 +62,7 @@ void LLClassifiedStatsResponder::result(const LLSD& content) } /*virtual*/ -void LLClassifiedStatsResponder::error(U32 status, const std::string& reason) +void LLClassifiedStatsResponder::errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - llinfos << "LLClassifiedStatsResponder::error(" - << status << ": " << reason << ")" << llendl; + llinfos << "LLClassifiedStatsResponder::error [status:" << status << "]: " << content << llendl; } diff --git a/indra/newview/llclassifiedstatsresponder.h b/indra/newview/llclassifiedstatsresponder.h index 3db1868cb2..06dcb62fd0 100644 --- a/indra/newview/llclassifiedstatsresponder.h +++ b/indra/newview/llclassifiedstatsresponder.h @@ -39,7 +39,7 @@ public: virtual void result(const LLSD& content); //If we get back an error (not found, etc...), handle it here - virtual void error(U32 status, const std::string& reason); + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content); protected: LLUUID mClassifiedID; diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index e9c7a3fa03..e86d6930e8 100644 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -139,8 +139,7 @@ protected: { LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; - functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1); - registrar.add("Attachment.Detach", boost::bind(handleMultiple, take_off, mUUIDs)); + registrar.add("Attachment.Detach", boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs)); return createFromFile("menu_cof_attachment.xml"); } @@ -173,9 +172,8 @@ protected: LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; LLUUID selected_id = mUUIDs.back(); - functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1); - registrar.add("Clothing.TakeOff", boost::bind(handleMultiple, take_off, mUUIDs)); + registrar.add("Clothing.TakeOff", boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs)); registrar.add("Clothing.Replace", boost::bind(replaceWearable, selected_id)); registrar.add("Clothing.Edit", boost::bind(LLAgentWearables::editWearable, selected_id)); registrar.add("Clothing.Create", boost::bind(&CofClothingContextMenu::createNew, this, selected_id)); diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp index 5b942f283a..f1f7da5fd1 100644 --- a/indra/newview/llcolorswatch.cpp +++ b/indra/newview/llcolorswatch.cpp @@ -241,8 +241,8 @@ void LLColorSwatchCtrl::draw() { if (!mFallbackImageName.empty()) { - LLPointer<LLViewerFetchedTexture> fallback_image = LLViewerTextureManager::getFetchedTextureFromFile(mFallbackImageName, TRUE, - LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + LLPointer<LLViewerFetchedTexture> fallback_image = LLViewerTextureManager::getFetchedTextureFromFile(mFallbackImageName, FTT_LOCAL_FILE, TRUE, + LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); if( fallback_image->getComponents() == 4 ) { gl_rect_2d_checkerboard( interior ); diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp index 4f5f9e22b6..4588424474 100644 --- a/indra/newview/llcompilequeue.cpp +++ b/indra/newview/llcompilequeue.cpp @@ -161,18 +161,6 @@ BOOL LLFloaterScriptQueue::start() { std::string buffer; - LLSelectMgr *mgr = LLSelectMgr::getInstance(); - LLObjectSelectionHandle selectHandle = mgr->getSelection(); - U32 n_objects = 0; - if (gSavedSettings.getBOOL("EditLinkedParts")) - { - n_objects = selectHandle->getObjectCount(); - } - else - { - n_objects = selectHandle->getRootObjectCount(); - } - LLStringUtil::format_map_t args; args["[START]"] = mStartString; args["[COUNT]"] = llformat ("%d", mObjectIDs.count()); diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp index 1e03582a29..d7d9f82910 100644 --- a/indra/newview/lldirpicker.cpp +++ b/indra/newview/lldirpicker.cpp @@ -327,6 +327,8 @@ BOOL LLDirPicker::getDir(std::string* filename) return FALSE; } +#if !LL_MESA_HEADLESS + if (mFilePicker) { GtkWindow* picker = mFilePicker->buildFilePicker(false, true, @@ -340,6 +342,8 @@ BOOL LLDirPicker::getDir(std::string* filename) return (!mFilePicker->getFirstFile().empty()); } } +#endif // !LL_MESA_HEADLESS + return FALSE; } diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index fe058cf094..8c9fd4152a 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -554,7 +554,6 @@ F32 LLDrawable::updateXform(BOOL undamped) //scaling LLVector3 target_scale = mVObjp->getScale(); LLVector3 old_scale = mCurrentScale; - LLVector3 dest_scale = target_scale; // Damping F32 dist_squared = 0.f; @@ -1280,7 +1279,6 @@ LLCamera LLSpatialBridge::transformCamera(LLCamera& camera) LLCamera ret = camera; LLXformMatrix* mat = mDrawable->getXform(); LLVector3 center = LLVector3(0,0,0) * mat->getWorldMatrix(); - LLQuaternion rotation = LLQuaternion(mat->getWorldMatrix()); LLVector3 delta = ret.getOrigin() - center; LLQuaternion rot = ~mat->getRotation(); diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 8d1db7b9ad..cb40cf2039 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -153,7 +153,7 @@ void LLStandardBumpmap::addstandard() gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mLabel = label; gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage = LLViewerTextureManager::getFetchedTexture(LLUUID(bump_image_id)); - gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setBoostLevel(LLViewerTexture::BOOST_BUMP) ; + gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setBoostLevel(LLGLTexture::BOOST_BUMP) ; gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setLoadedCallback(LLBumpImageList::onSourceStandardLoaded, 0, TRUE, FALSE, NULL, NULL ); gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->forceToSaveRawImage(0) ; LLStandardBumpmap::sStandardBumpmapCount++; @@ -1074,7 +1074,7 @@ LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedText src_image->getHeight() != bump->getHeight())// || //(LLPipeline::sRenderDeferred && bump->getComponents() != 4)) { - src_image->setBoostLevel(LLViewerTexture::BOOST_BUMP) ; + src_image->setBoostLevel(LLGLTexture::BOOST_BUMP) ; src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()), NULL ); src_image->forceToSaveRawImage(0) ; } diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp index 9bc32fddbd..0adb42428d 100644 --- a/indra/newview/lldrawpoolterrain.cpp +++ b/indra/newview/lldrawpoolterrain.cpp @@ -69,7 +69,8 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) : sDetailScale = 1.f/gSavedSettings.getF32("RenderTerrainScale"); sDetailMode = gSavedSettings.getS32("RenderTerrainDetail"); mAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient.tga", - TRUE, LLViewerTexture::BOOST_UI, + FTT_LOCAL_FILE, + TRUE, LLGLTexture::BOOST_UI, LLViewerTexture::FETCHED_TEXTURE, format, int_format, LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb")); @@ -78,7 +79,8 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) : mAlphaRampImagep->setAddressMode(LLTexUnit::TAM_CLAMP); m2DAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient_2d.j2c", - TRUE, LLViewerTexture::BOOST_UI, + FTT_LOCAL_FILE, + TRUE, LLGLTexture::BOOST_UI, LLViewerTexture::FETCHED_TEXTURE, format, int_format, LLUUID("38b86f85-2575-52a9-a531-23108d8da837")); @@ -86,7 +88,7 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) : //gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get()); m2DAlphaRampImagep->setAddressMode(LLTexUnit::TAM_CLAMP); - mTexturep->setBoostLevel(LLViewerTexture::BOOST_TERRAIN); + mTexturep->setBoostLevel(LLGLTexture::BOOST_TERRAIN); //gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } @@ -170,7 +172,7 @@ void LLDrawPoolTerrain::render(S32 pass) LLVLComposition *compp = regionp->getComposition(); for (S32 i = 0; i < 4; i++) { - compp->mDetailTextures[i]->setBoostLevel(LLViewerTexture::BOOST_TERRAIN); + compp->mDetailTextures[i]->setBoostLevel(LLGLTexture::BOOST_TERRAIN); compp->mDetailTextures[i]->addTextureStats(1024.f*1024.f); // assume large pixel area } diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index 9dfd69583e..5ddc15df42 100644 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -66,11 +66,11 @@ LLVector3 LLDrawPoolWater::sLightDir; LLDrawPoolWater::LLDrawPoolWater() : LLFacePool(POOL_WATER) { - mHBTex[0] = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI); + mHBTex[0] = LLViewerTextureManager::getFetchedTexture(gSunTextureID, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI); gGL.getTexUnit(0)->bind(mHBTex[0]) ; mHBTex[0]->setAddressMode(LLTexUnit::TAM_CLAMP); - mHBTex[1] = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI); + mHBTex[1] = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI); gGL.getTexUnit(0)->bind(mHBTex[1]); mHBTex[1]->setAddressMode(LLTexUnit::TAM_CLAMP); @@ -80,7 +80,7 @@ LLDrawPoolWater::LLDrawPoolWater() : mWaterImagep->setNoDelete(); mOpaqueWaterImagep = LLViewerTextureManager::getFetchedTexture(OPAQUE_WATER_TEXTURE); llassert(mOpaqueWaterImagep); - mWaterNormp = LLViewerTextureManager::getFetchedTexture(DEFAULT_WATER_NORMAL, TRUE, LLViewerTexture::BOOST_BUMP); + mWaterNormp = LLViewerTextureManager::getFetchedTexture(DEFAULT_WATER_NORMAL); mWaterNormp->setNoDelete(); restoreGL(); @@ -563,7 +563,7 @@ void LLDrawPoolWater::shade() // change mWaterNormp if needed if (mWaterNormp->getID() != param_mgr->getNormalMapID()) { - mWaterNormp = LLViewerTextureManager::getFetchedTexture(param_mgr->getNormalMapID(), TRUE, LLViewerTexture::BOOST_BUMP); + mWaterNormp = LLViewerTextureManager::getFetchedTexture(param_mgr->getNormalMapID()); } mWaterNormp->addTextureStats(1024.f*1024.f); diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp deleted file mode 100644 index 885cae1737..0000000000 --- a/indra/newview/lldriverparam.cpp +++ /dev/null @@ -1,638 +0,0 @@ -/** - * @file lldriverparam.cpp - * @brief A visual parameter that drives (controls) other visual parameters. - * - * $LicenseInfo:firstyear=2002&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$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "lldriverparam.h" - -#include "llfasttimer.h" -#include "llvoavatar.h" -#include "llvoavatarself.h" -#include "llagent.h" -#include "llwearable.h" -#include "llagentwearables.h" - -//----------------------------------------------------------------------------- -// LLDriverParamInfo -//----------------------------------------------------------------------------- - -LLDriverParamInfo::LLDriverParamInfo() -{ -} - -BOOL LLDriverParamInfo::parseXml(LLXmlTreeNode* node) -{ - llassert( node->hasName( "param" ) && node->getChildByName( "param_driver" ) ); - - if( !LLViewerVisualParamInfo::parseXml( node )) - return FALSE; - - LLXmlTreeNode* param_driver_node = node->getChildByName( "param_driver" ); - if( !param_driver_node ) - return FALSE; - - for (LLXmlTreeNode* child = param_driver_node->getChildByName( "driven" ); - child; - child = param_driver_node->getNextNamedChild()) - { - S32 driven_id; - static LLStdStringHandle id_string = LLXmlTree::addAttributeString("id"); - if( child->getFastAttributeS32( id_string, driven_id ) ) - { - F32 min1 = mMinWeight; - F32 max1 = mMaxWeight; - F32 max2 = max1; - F32 min2 = max1; - - // driven ________ // - // ^ /| |\ // - // | / | | \ // - // | / | | \ // - // | / | | \ // - // | / | | \ // - //-------|----|-------|----|-------> driver // - // | min1 max1 max2 min2 - - static LLStdStringHandle min1_string = LLXmlTree::addAttributeString("min1"); - child->getFastAttributeF32( min1_string, min1 ); // optional - static LLStdStringHandle max1_string = LLXmlTree::addAttributeString("max1"); - child->getFastAttributeF32( max1_string, max1 ); // optional - static LLStdStringHandle max2_string = LLXmlTree::addAttributeString("max2"); - child->getFastAttributeF32( max2_string, max2 ); // optional - static LLStdStringHandle min2_string = LLXmlTree::addAttributeString("min2"); - child->getFastAttributeF32( min2_string, min2 ); // optional - - // Push these on the front of the deque, so that we can construct - // them in order later (faster) - mDrivenInfoList.push_front( LLDrivenEntryInfo( driven_id, min1, max1, max2, min2 ) ); - } - else - { - llerrs << "<driven> Unable to resolve driven parameter: " << driven_id << llendl; - return FALSE; - } - } - return TRUE; -} - -//virtual -void LLDriverParamInfo::toStream(std::ostream &out) -{ - LLViewerVisualParamInfo::toStream(out); - out << "driver" << "\t"; - out << mDrivenInfoList.size() << "\t"; - for (entry_info_list_t::iterator iter = mDrivenInfoList.begin(); iter != mDrivenInfoList.end(); iter++) - { - LLDrivenEntryInfo driven = *iter; - out << driven.mDrivenID << "\t"; - } - - out << std::endl; - - if(isAgentAvatarValid()) - { - for (entry_info_list_t::iterator iter = mDrivenInfoList.begin(); iter != mDrivenInfoList.end(); iter++) - { - LLDrivenEntryInfo driven = *iter; - LLViewerVisualParam *param = (LLViewerVisualParam*)gAgentAvatarp->getVisualParam(driven.mDrivenID); - if (param) - { - param->getInfo()->toStream(out); - if (param->getWearableType() != mWearableType) - { - if(param->getCrossWearable()) - { - out << "cross-wearable" << "\t"; - } - else - { - out << "ERROR!" << "\t"; - } - } - else - { - out << "valid" << "\t"; - } - } - else - { - llwarns << "could not get parameter " << driven.mDrivenID << " from avatar " << gAgentAvatarp.get() << " for driver parameter " << getID() << llendl; - } - out << std::endl; - } - } -} - -//----------------------------------------------------------------------------- -// LLDriverParam -//----------------------------------------------------------------------------- - -LLDriverParam::LLDriverParam(LLVOAvatar *avatarp) : - mCurrentDistortionParam( NULL ), - mAvatarp(avatarp), - mWearablep(NULL) -{ - mDefaultVec.clear(); -} - -LLDriverParam::LLDriverParam(LLWearable *wearablep) : - mCurrentDistortionParam( NULL ), - mAvatarp(NULL), - mWearablep(wearablep) -{ - mDefaultVec.clear(); -} - -LLDriverParam::~LLDriverParam() -{ -} - -BOOL LLDriverParam::setInfo(LLDriverParamInfo *info) -{ - llassert(mInfo == NULL); - if (info->mID < 0) - return FALSE; - mInfo = info; - mID = info->mID; - - setWeight(getDefaultWeight(), FALSE ); - - return TRUE; -} - -void LLDriverParam::setWearable(LLWearable *wearablep) -{ - if (wearablep) - { - mWearablep = wearablep; - mAvatarp = NULL; - } -} - -void LLDriverParam::setAvatar(LLVOAvatar *avatarp) -{ - if (avatarp) - { - mWearablep = NULL; - mAvatarp = avatarp; - } -} - -/*virtual*/ LLViewerVisualParam* LLDriverParam::cloneParam(LLWearable* wearable) const -{ - LLDriverParam *new_param; - if (wearable) - { - new_param = new LLDriverParam(wearable); - } - else - { - if (mWearablep) - { - new_param = new LLDriverParam(mWearablep); - } - else - { - new_param = new LLDriverParam(mAvatarp); - } - } - *new_param = *this; - return new_param; -} - -#if 0 // obsolete -BOOL LLDriverParam::parseData(LLXmlTreeNode* node) -{ - LLDriverParamInfo* info = new LLDriverParamInfo; - - info->parseXml(node); - if (!setInfo(info)) - { - delete info; - return FALSE; - } - return TRUE; -} -#endif - -void LLDriverParam::setWeight(F32 weight, BOOL upload_bake) -{ - F32 min_weight = getMinWeight(); - F32 max_weight = getMaxWeight(); - if (mIsAnimating) - { - // allow overshoot when animating - mCurWeight = weight; - } - else - { - mCurWeight = llclamp(weight, min_weight, max_weight); - } - - // driven ________ - // ^ /| |\ ^ - // | / | | \ | - // | / | | \ | - // | / | | \ | - // | / | | \ | - //-------|----|-------|----|-------> driver - // | min1 max1 max2 min2 - - for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) - { - LLDrivenEntry* driven = &(*iter); - LLDrivenEntryInfo* info = driven->mInfo; - - F32 driven_weight = 0.f; - F32 driven_min = driven->mParam->getMinWeight(); - F32 driven_max = driven->mParam->getMaxWeight(); - - if (mIsAnimating) - { - // driven param doesn't interpolate (textures, for example) - if (!driven->mParam->getAnimating()) - { - continue; - } - if( mCurWeight < info->mMin1 ) - { - if (info->mMin1 == min_weight) - { - if (info->mMin1 == info->mMax1) - { - driven_weight = driven_max; - } - else - { - //up slope extrapolation - F32 t = (mCurWeight - info->mMin1) / (info->mMax1 - info->mMin1 ); - driven_weight = driven_min + t * (driven_max - driven_min); - } - } - else - { - driven_weight = driven_min; - } - - setDrivenWeight(driven,driven_weight,upload_bake); - continue; - } - else - if ( mCurWeight > info->mMin2 ) - { - if (info->mMin2 == max_weight) - { - if (info->mMin2 == info->mMax2) - { - driven_weight = driven_max; - } - else - { - //down slope extrapolation - F32 t = (mCurWeight - info->mMax2) / (info->mMin2 - info->mMax2 ); - driven_weight = driven_max + t * (driven_min - driven_max); - } - } - else - { - driven_weight = driven_min; - } - - setDrivenWeight(driven,driven_weight,upload_bake); - continue; - } - } - - driven_weight = getDrivenWeight(driven, mCurWeight); - setDrivenWeight(driven,driven_weight,upload_bake); - } -} - -F32 LLDriverParam::getTotalDistortion() -{ - F32 sum = 0.f; - for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) - { - LLDrivenEntry* driven = &(*iter); - sum += driven->mParam->getTotalDistortion(); - } - - return sum; -} - -const LLVector4a &LLDriverParam::getAvgDistortion() -{ - // It's not actually correct to take the average of averages, but it good enough here. - LLVector4a sum; - sum.clear(); - S32 count = 0; - for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) - { - LLDrivenEntry* driven = &(*iter); - sum.add(driven->mParam->getAvgDistortion()); - count++; - } - sum.mul( 1.f/(F32)count); - - mDefaultVec = sum; - return mDefaultVec; -} - -F32 LLDriverParam::getMaxDistortion() -{ - F32 max = 0.f; - for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) - { - LLDrivenEntry* driven = &(*iter); - F32 param_max = driven->mParam->getMaxDistortion(); - if( param_max > max ) - { - max = param_max; - } - } - - return max; -} - - -LLVector4a LLDriverParam::getVertexDistortion(S32 index, LLPolyMesh *poly_mesh) -{ - LLVector4a sum; - sum.clear(); - for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) - { - LLDrivenEntry* driven = &(*iter); - sum.add(driven->mParam->getVertexDistortion( index, poly_mesh )); - } - return sum; -} - -const LLVector4a* LLDriverParam::getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh) -{ - mCurrentDistortionParam = NULL; - const LLVector4a* v = NULL; - for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) - { - LLDrivenEntry* driven = &(*iter); - v = driven->mParam->getFirstDistortion( index, poly_mesh ); - if( v ) - { - mCurrentDistortionParam = driven->mParam; - break; - } - } - - return v; -}; - -const LLVector4a* LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_mesh) -{ - llassert( mCurrentDistortionParam ); - if( !mCurrentDistortionParam ) - { - return NULL; - } - - LLDrivenEntry* driven = NULL; - entry_list_t::iterator iter; - - // Set mDriven iteration to the right point - for( iter = mDriven.begin(); iter != mDriven.end(); iter++ ) - { - driven = &(*iter); - if( driven->mParam == mCurrentDistortionParam ) - { - break; - } - } - - llassert(driven); - if (!driven) - { - return NULL; // shouldn't happen, but... - } - - // We're already in the middle of a param's distortions, so get the next one. - const LLVector4a* v = driven->mParam->getNextDistortion( index, poly_mesh ); - if( (!v) && (iter != mDriven.end()) ) - { - // This param is finished, so start the next param. It might not have any - // distortions, though, so we have to loop to find the next param that does. - for( iter++; iter != mDriven.end(); iter++ ) - { - driven = &(*iter); - v = driven->mParam->getFirstDistortion( index, poly_mesh ); - if( v ) - { - mCurrentDistortionParam = driven->mParam; - break; - } - } - } - - return v; -}; - -//----------------------------------------------------------------------------- -// setAnimationTarget() -//----------------------------------------------------------------------------- -void LLDriverParam::setAnimationTarget( F32 target_value, BOOL upload_bake ) -{ - LLVisualParam::setAnimationTarget(target_value, upload_bake); - - for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) - { - LLDrivenEntry* driven = &(*iter); - F32 driven_weight = getDrivenWeight(driven, mTargetWeight); - - // this isn't normally necessary, as driver params handle interpolation of their driven params - // but texture params need to know to assume their final value at beginning of interpolation - driven->mParam->setAnimationTarget(driven_weight, upload_bake); - } -} - -//----------------------------------------------------------------------------- -// stopAnimating() -//----------------------------------------------------------------------------- -void LLDriverParam::stopAnimating(BOOL upload_bake) -{ - LLVisualParam::stopAnimating(upload_bake); - - for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) - { - LLDrivenEntry* driven = &(*iter); - driven->mParam->setAnimating(FALSE); - } -} - -/*virtual*/ -BOOL LLDriverParam::linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params) -{ - BOOL success = TRUE; - LLDriverParamInfo::entry_info_list_t::iterator iter; - for (iter = getInfo()->mDrivenInfoList.begin(); iter != getInfo()->mDrivenInfoList.end(); ++iter) - { - LLDrivenEntryInfo *driven_info = &(*iter); - S32 driven_id = driven_info->mDrivenID; - - // check for already existing links. Do not overwrite. - BOOL found = FALSE; - for (entry_list_t::iterator driven_iter = mDriven.begin(); driven_iter != mDriven.end() && !found; ++driven_iter) - { - if (driven_iter->mInfo->mDrivenID == driven_id) - { - found = TRUE; - } - } - - if (!found) - { - LLViewerVisualParam* param = (LLViewerVisualParam*)mapper(driven_id); - bool push = param && (!only_cross_params || param->getCrossWearable()); - if (push) - { - mDriven.push_back(LLDrivenEntry( param, driven_info )); - } - else - { - success = FALSE; - } - } - } - - return success; -} - -void LLDriverParam::resetDrivenParams() -{ - mDriven.clear(); - mDriven.reserve(getInfo()->mDrivenInfoList.size()); -} - -void LLDriverParam::updateCrossDrivenParams(LLWearableType::EType driven_type) -{ - bool needs_update = (getWearableType()==driven_type); - - // if the driver has a driven entry for the passed-in wearable type, we need to refresh the value - for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) - { - LLDrivenEntry* driven = &(*iter); - if (driven && driven->mParam && driven->mParam->getCrossWearable() && driven->mParam->getWearableType() == driven_type) - { - needs_update = true; - } - } - - - if (needs_update) - { - LLWearableType::EType driver_type = (LLWearableType::EType)getWearableType(); - - // If we've gotten here, we've added a new wearable of type "type" - // Thus this wearable needs to get updates from the driver wearable. - // The call to setVisualParamWeight seems redundant, but is necessary - // as the number of driven wearables has changed since the last update. -Nyx - LLWearable *wearable = gAgentWearables.getTopWearable(driver_type); - if (wearable) - { - wearable->setVisualParamWeight(mID, wearable->getVisualParamWeight(mID), false); - } - } -} - - -//----------------------------------------------------------------------------- -// getDrivenWeight() -//----------------------------------------------------------------------------- -F32 LLDriverParam::getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight) -{ - F32 min_weight = getMinWeight(); - F32 max_weight = getMaxWeight(); - const LLDrivenEntryInfo* info = driven->mInfo; - - F32 driven_weight = 0.f; - F32 driven_min = driven->mParam->getMinWeight(); - F32 driven_max = driven->mParam->getMaxWeight(); - - if( input_weight <= info->mMin1 ) - { - if( info->mMin1 == info->mMax1 && - info->mMin1 <= min_weight) - { - driven_weight = driven_max; - } - else - { - driven_weight = driven_min; - } - } - else - if( input_weight <= info->mMax1 ) - { - F32 t = (input_weight - info->mMin1) / (info->mMax1 - info->mMin1 ); - driven_weight = driven_min + t * (driven_max - driven_min); - } - else - if( input_weight <= info->mMax2 ) - { - driven_weight = driven_max; - } - else - if( input_weight <= info->mMin2 ) - { - F32 t = (input_weight - info->mMax2) / (info->mMin2 - info->mMax2 ); - driven_weight = driven_max + t * (driven_min - driven_max); - } - else - { - if (info->mMax2 >= max_weight) - { - driven_weight = driven_max; - } - else - { - driven_weight = driven_min; - } - } - - return driven_weight; -} - -void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake) -{ - if(isAgentAvatarValid() && - mWearablep && - driven->mParam->getCrossWearable() && - mWearablep->isOnTop()) - { - // call setWeight through LLVOAvatarSelf so other wearables can be updated with the correct values - gAgentAvatarp->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, upload_bake ); - } - else - { - driven->mParam->setWeight( driven_weight, upload_bake ); - } -} diff --git a/indra/newview/lldriverparam.h b/indra/newview/lldriverparam.h deleted file mode 100644 index 216cf003e1..0000000000 --- a/indra/newview/lldriverparam.h +++ /dev/null @@ -1,139 +0,0 @@ -/** - * @file lldriverparam.h - * @brief A visual parameter that drives (controls) other visual parameters. - * - * $LicenseInfo:firstyear=2002&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$ - */ - -#ifndef LL_LLDRIVERPARAM_H -#define LL_LLDRIVERPARAM_H - -#include "llviewervisualparam.h" -#include "llwearabletype.h" - -class LLPhysicsMotion; -class LLVOAvatar; -class LLWearable; - -//----------------------------------------------------------------------------- - -struct LLDrivenEntryInfo -{ - LLDrivenEntryInfo( S32 id, F32 min1, F32 max1, F32 max2, F32 min2 ) - : mDrivenID( id ), mMin1( min1 ), mMax1( max1 ), mMax2( max2 ), mMin2( min2 ) {} - S32 mDrivenID; - F32 mMin1; - F32 mMax1; - F32 mMax2; - F32 mMin2; -}; - -struct LLDrivenEntry -{ - LLDrivenEntry( LLViewerVisualParam* param, LLDrivenEntryInfo *info ) - : mParam( param ), mInfo( info ) {} - LLViewerVisualParam* mParam; - LLDrivenEntryInfo* mInfo; -}; - -//----------------------------------------------------------------------------- - -class LLDriverParamInfo : public LLViewerVisualParamInfo -{ - friend class LLDriverParam; -public: - LLDriverParamInfo(); - /*virtual*/ ~LLDriverParamInfo() {}; - - /*virtual*/ BOOL parseXml(LLXmlTreeNode* node); - - /*virtual*/ void toStream(std::ostream &out); - -protected: - typedef std::deque<LLDrivenEntryInfo> entry_info_list_t; - entry_info_list_t mDrivenInfoList; -}; - -//----------------------------------------------------------------------------- - -LL_ALIGN_PREFIX(16) -class LLDriverParam : public LLViewerVisualParam -{ - friend class LLPhysicsMotion; // physics motion needs to access driven params directly. -public: - LLDriverParam(LLVOAvatar *avatarp); - LLDriverParam(LLWearable *wearablep); - ~LLDriverParam(); - - void* operator new(size_t size) - { - return ll_aligned_malloc_16(size); - } - - void operator delete(void* ptr) - { - ll_aligned_free_16(ptr); - } - - // Special: These functions are overridden by child classes - LLDriverParamInfo* getInfo() const { return (LLDriverParamInfo*)mInfo; } - // This sets mInfo and calls initialization functions - BOOL setInfo(LLDriverParamInfo *info); - - void setWearable(LLWearable *wearablep); - void setAvatar(LLVOAvatar *avatarp); - void updateCrossDrivenParams(LLWearableType::EType driven_type); - - /*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const; - - // LLVisualParam Virtual functions - ///*virtual*/ BOOL parseData(LLXmlTreeNode* node); - /*virtual*/ void apply( ESex sex ) {} // apply is called separately for each driven param. - /*virtual*/ void setWeight(F32 weight, BOOL upload_bake); - /*virtual*/ void setAnimationTarget( F32 target_value, BOOL upload_bake ); - /*virtual*/ void stopAnimating(BOOL upload_bake); - /*virtual*/ BOOL linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params); - /*virtual*/ void resetDrivenParams(); - - // LLViewerVisualParam Virtual functions - /*virtual*/ F32 getTotalDistortion(); - /*virtual*/ const LLVector4a& getAvgDistortion(); - /*virtual*/ F32 getMaxDistortion(); - /*virtual*/ LLVector4a getVertexDistortion(S32 index, LLPolyMesh *poly_mesh); - /*virtual*/ const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh); - /*virtual*/ const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh); - -protected: - F32 getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight); - void setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake); - - - LL_ALIGN_16(LLVector4a mDefaultVec); // temp holder - typedef std::vector<LLDrivenEntry> entry_list_t; - entry_list_t mDriven; - LLViewerVisualParam* mCurrentDistortionParam; - // Backlink only; don't make this an LLPointer. - LLVOAvatar* mAvatarp; - LLWearable* mWearablep; -} LL_ALIGN_POSTFIX(16); - -#endif // LL_LLDRIVERPARAM_H diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index fa42b157a7..29ad4f34d2 100644 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp @@ -107,7 +107,7 @@ void LLViewerDynamicTexture::generateGLTexture(LLGLint internal_format, LLGLenum { setExplicitFormat(internal_format, primary_format, type_format, swap_bytes); } - createGLTexture(0, raw_image, 0, TRUE, LLViewerTexture::DYNAMIC_TEX); + createGLTexture(0, raw_image, 0, TRUE, LLGLTexture::DYNAMIC_TEX); setAddressMode((mClamp) ? LLTexUnit::TAM_CLAMP : LLTexUnit::TAM_WRAP); mGLTexturep->setGLTextureCreated(false); } diff --git a/indra/newview/lldynamictexture.h b/indra/newview/lldynamictexture.h index c51e7d1e1a..d287ae6eeb 100644 --- a/indra/newview/lldynamictexture.h +++ b/indra/newview/lldynamictexture.h @@ -72,8 +72,8 @@ public: /*virtual*/ S8 getType() const ; - S32 getOriginX() { return mOrigin.mX; } - S32 getOriginY() { return mOrigin.mY; } + S32 getOriginX() const { return mOrigin.mX; } + S32 getOriginY() const { return mOrigin.mY; } S32 getSize() { return mFullWidth * mFullHeight * mComponents; } diff --git a/indra/newview/llestateinfomodel.cpp b/indra/newview/llestateinfomodel.cpp index 7ed22d68f6..2669b0340f 100644 --- a/indra/newview/llestateinfomodel.cpp +++ b/indra/newview/llestateinfomodel.cpp @@ -65,12 +65,12 @@ void LLEstateInfoModel::sendEstateInfo() } } -bool LLEstateInfoModel::getUseFixedSun() const { return mFlags & REGION_FLAGS_SUN_FIXED; } -bool LLEstateInfoModel::getIsExternallyVisible() const { return mFlags & REGION_FLAGS_EXTERNALLY_VISIBLE; } -bool LLEstateInfoModel::getAllowDirectTeleport() const { return mFlags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT; } -bool LLEstateInfoModel::getDenyAnonymous() const { return mFlags & REGION_FLAGS_DENY_ANONYMOUS; } -bool LLEstateInfoModel::getDenyAgeUnverified() const { return mFlags & REGION_FLAGS_DENY_AGEUNVERIFIED; } -bool LLEstateInfoModel::getAllowVoiceChat() const { return mFlags & REGION_FLAGS_ALLOW_VOICE; } +bool LLEstateInfoModel::getUseFixedSun() const { return getFlag(REGION_FLAGS_SUN_FIXED); } +bool LLEstateInfoModel::getIsExternallyVisible() const { return getFlag(REGION_FLAGS_EXTERNALLY_VISIBLE); } +bool LLEstateInfoModel::getAllowDirectTeleport() const { return getFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT); } +bool LLEstateInfoModel::getDenyAnonymous() const { return getFlag(REGION_FLAGS_DENY_ANONYMOUS); } +bool LLEstateInfoModel::getDenyAgeUnverified() const { return getFlag(REGION_FLAGS_DENY_AGEUNVERIFIED); } +bool LLEstateInfoModel::getAllowVoiceChat() const { return getFlag(REGION_FLAGS_ALLOW_VOICE); } void LLEstateInfoModel::setUseFixedSun(bool val) { setFlag(REGION_FLAGS_SUN_FIXED, val); } void LLEstateInfoModel::setIsExternallyVisible(bool val) { setFlag(REGION_FLAGS_EXTERNALLY_VISIBLE, val); } @@ -122,9 +122,9 @@ public: } // if we get an error response - virtual void error(U32 status, const std::string& reason) + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - llwarns << "Failed to commit estate info (" << status << "): " << reason << llendl; + llwarns << "Failed to commit estate info [status:" << status << "]: " << content << llendl; } }; @@ -199,18 +199,6 @@ void LLEstateInfoModel::commitEstateInfoDataserver() gAgent.sendMessage(); } -void LLEstateInfoModel::setFlag(U32 flag, bool val) -{ - if (val) - { - mFlags |= flag; - } - else - { - mFlags &= ~flag; - } -} - std::string LLEstateInfoModel::getInfoDump() { LLSD dump; diff --git a/indra/newview/llestateinfomodel.h b/indra/newview/llestateinfomodel.h index 56391eda91..538f2f7c75 100644 --- a/indra/newview/llestateinfomodel.h +++ b/indra/newview/llestateinfomodel.h @@ -85,19 +85,38 @@ protected: private: bool commitEstateInfoCaps(); void commitEstateInfoDataserver(); - U32 getFlags() const { return mFlags; } - void setFlag(U32 flag, bool val); + inline bool getFlag(U64 flag) const; + inline void setFlag(U64 flag, bool val); + U64 getFlags() const { return mFlags; } std::string getInfoDump(); // estate info std::string mName; /// estate name LLUUID mOwnerID; /// estate owner id U32 mID; /// estate id - U32 mFlags; /// estate flags + U64 mFlags; /// estate flags F32 mSunHour; /// estate sun hour update_signal_t mUpdateSignal; /// emitted when we receive update from sim update_signal_t mCommitSignal; /// emitted when our update gets applied to sim }; +inline bool LLEstateInfoModel::getFlag(U64 flag) const +{ + return ((mFlags & flag) != 0); +} + +inline void LLEstateInfoModel::setFlag(U64 flag, bool val) +{ + if (val) + { + mFlags |= flag; + } + else + { + mFlags &= ~flag; + } +} + + #endif // LL_LLESTATEINFOMODEL_H diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp index 2c786b7f8b..c1630318e8 100644 --- a/indra/newview/lleventpoll.cpp +++ b/indra/newview/lleventpoll.cpp @@ -62,7 +62,7 @@ namespace void handleMessage(const LLSD& content); - virtual void error(U32 status, const std::string& reason); + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content); virtual void result(const LLSD& content); virtual void completedRaw(U32 status, @@ -187,7 +187,7 @@ namespace } //virtual - void LLEventPollResponder::error(U32 status, const std::string& reason) + void LLEventPollResponder::errorWithContent(U32 status, const std::string& reason, const LLSD& content) { if (mDone) return; @@ -207,12 +207,12 @@ namespace + mErrorCount * EVENT_POLL_ERROR_RETRY_SECONDS_INC , this); - llwarns << "Unexpected HTTP error. status: " << status << ", reason: " << reason << llendl; + llwarns << "LLEventPollResponder error [status:" << status << "]: " << content << llendl; } else { - llwarns << "LLEventPollResponder::error: <" << mCount << "> got " - << status << ": " << reason + llwarns << "LLEventPollResponder error <" << mCount + << "> [status:" << status << "]: " << content << (mDone ? " -- done" : "") << llendl; stop(); diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 4dfb93f1bc..fbf72b1a85 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -368,7 +368,7 @@ void LLFastTimerView::draw() S32 left, top, right, bottom; S32 x, y, barw, barh, dx, dy; - S32 texth, textw; + S32 texth; LLPointer<LLUIImage> box_imagep = LLUI::getUIImage("Rounded_Square"); // Draw the window background @@ -399,7 +399,6 @@ void LLFastTimerView::draw() tdesc = llformat("Full bar = %s [Click to pause/reset] [SHIFT-Click to toggle]",modedesc[mDisplayMode]); LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP); - textw = LLFontGL::getFontMonospace()->getWidth(tdesc); x = xleft, y -= (texth + 2); tdesc = llformat("Justification = %s [CTRL-Click to toggle]",centerdesc[mDisplayCenter]); @@ -526,8 +525,6 @@ void LLFastTimerView::draw() y -= (texth + 2); - textw = dx + LLFontGL::getFontMonospace()->getWidth(idp->getName()) + 40; - if (idp->getCollapsed()) { it.skipDescendants(); @@ -1073,7 +1070,7 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t { //read base log into memory S32 i = 0; std::ifstream is(base.c_str()); - while (!is.eof() && LLSDSerialize::fromXML(cur, is)) + while (!is.eof() && LLSDParser::PARSE_FAILURE != LLSDSerialize::fromXML(cur, is)) { base_data[i++] = cur; } @@ -1086,7 +1083,7 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t { //read current log into memory S32 i = 0; std::ifstream is(target.c_str()); - while (!is.eof() && LLSDSerialize::fromXML(cur, is)) + while (!is.eof() && LLSDParser::PARSE_FAILURE != LLSDSerialize::fromXML(cur, is)) { cur_data[i++] = cur; @@ -1377,7 +1374,7 @@ LLSD LLFastTimerView::analyzePerformanceLogDefault(std::istream& is) stats_map_t time_stats; stats_map_t sample_stats; - while (!is.eof() && LLSDSerialize::fromXML(cur, is)) + while (!is.eof() && LLSDParser::PARSE_FAILURE != LLSDSerialize::fromXML(cur, is)) { for (LLSD::map_iterator iter = cur.beginMap(); iter != cur.endMap(); ++iter) { diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index e30dd51acb..6d90667194 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -1649,7 +1649,6 @@ void LLFavoritesOrderStorage::saveItemsOrder( const LLInventoryModel::item_array gInventory.notifyObservers(); } - // See also LLInventorySort where landmarks in the Favorites folder are sorted. class LLViewerInventoryItemSort { diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index e000adc4aa..f06e9b9b64 100644 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -161,7 +161,7 @@ private: boost::signals2::connection mEndDragConnection; }; - +/* class AddFavoriteLandmarkCallback : public LLInventoryCallback { public: @@ -173,7 +173,7 @@ private: LLUUID mTargetLandmarkId; }; - +*/ /** * Class to store sorting order of favorites landmarks in a local file. EXT-3985. * It replaced previously implemented solution to store sort index in landmark's name as a "<N>@" prefix. @@ -272,5 +272,4 @@ private: }; }; - #endif // LL_LLFAVORITESBARCTRL_H diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index a4cadcd5dc..ddb9d3bc43 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -705,6 +705,20 @@ void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures) switch (level) { case 0: +#if LL_DARWIN + // This Mac-specific change is to insure that we force 'Basic Shaders' for all Mac + // systems which support them instead of falling back to fixed-function unnecessarily + // MAINT-2157 + // + if (gGLManager.mGLVersion < 2.1f) + { + maskFeatures("LowFixedFunction"); + } + else + { //same as low, but with "Basic Shaders" enabled + maskFeatures("Low"); + } +#else if (gGLManager.mGLVersion < 3.f || gGLManager.mIsIntel) { //only use fixed function by default if GL version < 3.0 or this is an intel graphics chip maskFeatures("LowFixedFunction"); @@ -713,6 +727,7 @@ void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures) { //same as low, but with "Basic Shaders" enabled maskFeatures("Low"); } +#endif break; case 1: maskFeatures("LowMid"); diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 4bf5b26b3b..d13f85baa2 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -1103,6 +1103,7 @@ void LLFilePicker::chooser_responder(GtkWidget *widget, gint response, gpointer GtkWindow* LLFilePicker::buildFilePicker(bool is_save, bool is_folder, std::string context) { +#ifndef LL_MESA_HEADLESS if (LLWindowSDL::ll_try_gtk_init()) { GtkWidget *win = NULL; @@ -1174,6 +1175,9 @@ GtkWindow* LLFilePicker::buildFilePicker(bool is_save, bool is_folder, std::stri { return NULL; } +#else + return NULL; +#endif //LL_MESA_HEADLESS } static void add_common_filters_to_gtkchooser(GtkFileFilter *gfilter, @@ -1473,7 +1477,7 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename return FALSE; } -BOOL LLFilePicker::getOpenFile( ELoadFilter filter ) +BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking ) { // if local file browsing is turned off, return without opening dialog // (Even though this is a stub, I think we still should not return anything at all) @@ -1494,7 +1498,7 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter ) default: break; } mFiles.push_back(filename); - llinfos << "getOpenFile: Will try to open file: " << hackyfilename << llendl; + llinfos << "getOpenFile: Will try to open file: " << filename << llendl; return TRUE; } diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp index a5ee4607a1..caad0afec0 100644 --- a/indra/newview/llflexibleobject.cpp +++ b/indra/newview/llflexibleobject.cpp @@ -270,9 +270,6 @@ void LLVolumeImplFlexible::setAttributesOfAllSections(LLVector3* inScale) mSection[0].mVelocity.setVec(0,0,0); mSection[0].mAxisRotation.setQuat(begin_rot,0,0,1); - LLVector3 parentSectionPosition = mSection[0].mPosition; - LLVector3 last_direction = mSection[0].mDirection; - remapSections(mSection, mInitializedRes, mSection, mSimulateRes); mInitializedRes = mSimulateRes; diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp index 2939d31087..3c40e2d4bc 100644 --- a/indra/newview/llfloaterauction.cpp +++ b/indra/newview/llfloaterauction.cpp @@ -38,6 +38,7 @@ #include "message.h" #include "llagent.h" +#include "llassetstorage.h" #include "llcombobox.h" #include "llestateinfomodel.h" #include "llmimetypes.h" diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index f7dd4a4a6b..113aa9a8f2 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -483,8 +483,7 @@ public: } else { - llinfos << "avatar picker failed " << status - << " reason " << reason << llendl; + llwarns << "avatar picker failed [status:" << status << "]: " << content << llendl; } } @@ -819,7 +818,14 @@ bool LLFloaterAvatarPicker::isSelectBtnEnabled() uuid_vec_t avatar_ids; std::vector<LLAvatarName> avatar_names; getSelectedAvatarData(list, avatar_ids, avatar_names); - return mOkButtonValidateSignal(avatar_ids); + if (avatar_ids.size() >= 1) + { + ret_val = mOkButtonValidateSignal(avatar_ids); + } + else + { + ret_val = false; + } } } diff --git a/indra/newview/llfloateravatartextures.cpp b/indra/newview/llfloateravatartextures.cpp index 4e10b4fc2c..048837acfe 100644 --- a/indra/newview/llfloateravatartextures.cpp +++ b/indra/newview/llfloateravatartextures.cpp @@ -32,12 +32,13 @@ #include "llagent.h" #include "llagentwearables.h" +#include "llviewerwearable.h" #include "lltexturectrl.h" #include "lluictrlfactory.h" #include "llviewerobjectlist.h" #include "llvoavatarself.h" -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines; LLFloaterAvatarTextures::LLFloaterAvatarTextures(const LLSD& id) : LLFloater(id), @@ -53,7 +54,7 @@ BOOL LLFloaterAvatarTextures::postBuild() { for (U32 i=0; i < TEX_NUM_INDICES; i++) { - const std::string tex_name = LLVOAvatarDictionary::getInstance()->getTexture(ETextureIndex(i))->mName; + const std::string tex_name = LLAvatarAppearanceDictionary::getInstance()->getTexture(ETextureIndex(i))->mName; mTextures[i] = getChild<LLTextureCtrl>(tex_name); } mTitle = getTitle(); @@ -75,13 +76,13 @@ static void update_texture_ctrl(LLVOAvatar* avatarp, ETextureIndex te) { LLUUID id = IMG_DEFAULT_AVATAR; - const LLVOAvatarDictionary::TextureEntry* tex_entry = LLVOAvatarDictionary::getInstance()->getTexture(te); + const LLAvatarAppearanceDictionary::TextureEntry* tex_entry = LLAvatarAppearanceDictionary::getInstance()->getTexture(te); if (tex_entry->mIsLocalTexture) { if (avatarp->isSelf()) { const LLWearableType::EType wearable_type = tex_entry->mWearableType; - LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0); + LLViewerWearable *wearable = gAgentWearables.getViewerWearable(wearable_type, 0); if (wearable) { LLLocalTextureObject *lto = wearable->getLocalTextureObject(te); @@ -163,17 +164,17 @@ void LLFloaterAvatarTextures::onClickDump(void* data) const LLTextureEntry* te = avatarp->getTE(i); if (!te) continue; - const LLVOAvatarDictionary::TextureEntry* tex_entry = LLVOAvatarDictionary::getInstance()->getTexture((ETextureIndex)(i)); + const LLAvatarAppearanceDictionary::TextureEntry* tex_entry = LLAvatarAppearanceDictionary::getInstance()->getTexture((ETextureIndex)(i)); if (!tex_entry) continue; if (LLVOAvatar::isIndexLocalTexture((ETextureIndex)i)) { LLUUID id = IMG_DEFAULT_AVATAR; - LLWearableType::EType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType((ETextureIndex)i); + LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getInstance()->getTEWearableType((ETextureIndex)i); if (avatarp->isSelf()) { - LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0); + LLViewerWearable *wearable = gAgentWearables.getViewerWearable(wearable_type, 0); if (wearable) { LLLocalTextureObject *lto = wearable->getLocalTextureObject(i); diff --git a/indra/newview/llfloateravatartextures.h b/indra/newview/llfloateravatartextures.h index 85ff545855..02474a10e1 100644 --- a/indra/newview/llfloateravatartextures.h +++ b/indra/newview/llfloateravatartextures.h @@ -30,7 +30,7 @@ #include "llfloater.h" #include "lluuid.h" #include "llstring.h" -#include "llvoavatardefines.h" +#include "llavatarappearancedefines.h" class LLTextureCtrl; @@ -51,7 +51,7 @@ private: private: LLUUID mID; std::string mTitle; - LLTextureCtrl* mTextures[LLVOAvatarDefines::TEX_NUM_INDICES]; + LLTextureCtrl* mTextures[LLAvatarAppearanceDefines::TEX_NUM_INDICES]; }; #endif diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index fffd724b22..aa6ace2a61 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -40,6 +40,7 @@ #include "llcheckboxctrl.h" #include "llinventorydefines.h" #include "llinventoryfunctions.h" +#include "llinventoryicon.h" #include "llinventorymodel.h" // for gInventory #include "llfirstuse.h" #include "llfloaterreg.h" diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index 8223e89b64..42857b2aa2 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -538,7 +538,7 @@ void LLFloaterBuyLandUI::updateCovenantInfo() LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause"); if (resellable_clause) { - if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) + if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL)) { resellable_clause->setText(getString("can_not_resell")); } @@ -551,7 +551,7 @@ void LLFloaterBuyLandUI::updateCovenantInfo() LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause"); if (changeable_clause) { - if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) + if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES)) { changeable_clause->setText(getString("can_change")); } diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp index 62848586cd..f2deb6a805 100644 --- a/indra/newview/llfloaterbvhpreview.cpp +++ b/indra/newview/llfloaterbvhpreview.cpp @@ -1102,12 +1102,12 @@ BOOL LLPreviewAnimation::render() gGL.flush(); - LLVector3 target_pos = avatarp->mRoot.getWorldPosition(); + LLVector3 target_pos = avatarp->mRoot->getWorldPosition(); LLQuaternion camera_rot = LLQuaternion(mCameraPitch, LLVector3::y_axis) * LLQuaternion(mCameraYaw, LLVector3::z_axis); - LLQuaternion av_rot = avatarp->mRoot.getWorldRotation() * camera_rot; + LLQuaternion av_rot = avatarp->mRoot->getWorldRotation() * camera_rot; LLViewerCamera::getInstance()->setOriginAndLookAt( target_pos + ((LLVector3(mCameraDistance, 0.f, 0.f) + mCameraOffset) * av_rot), // camera LLVector3::z_axis, // up diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp index 38abdcc830..fe6223fbf5 100644 --- a/indra/newview/llfloatergodtools.cpp +++ b/indra/newview/llfloatergodtools.cpp @@ -164,9 +164,9 @@ LLFloaterGodTools::~LLFloaterGodTools() } -U32 LLFloaterGodTools::computeRegionFlags() const +U64 LLFloaterGodTools::computeRegionFlags() const { - U32 flags = gAgent.getRegion()->getRegionFlags(); + U64 flags = gAgent.getRegion()->getRegionFlags(); if (mPanelRegionTools) flags = mPanelRegionTools->computeRegionFlags(flags); if (mPanelObjectTools) flags = mPanelObjectTools->computeRegionFlags(flags); return flags; @@ -210,7 +210,7 @@ void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg) if (!msg) return; //const S32 SIM_NAME_BUF = 256; - U32 region_flags; + U64 region_flags; U8 sim_access; U8 agent_limit; std::string sim_name; @@ -231,13 +231,23 @@ void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg) msg->getStringFast(_PREHASH_RegionInfo, _PREHASH_SimName, sim_name); msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_EstateID, estate_id); msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_ParentEstateID, parent_estate_id); - msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, region_flags); msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_SimAccess, sim_access); msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_MaxAgents, agent_limit); msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_ObjectBonusFactor, object_bonus_factor); msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_BillableFactor, billable_factor); msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_WaterHeight, water_height); + if (msg->has(_PREHASH_RegionInfo3)) + { + msg->getU64Fast(_PREHASH_RegionInfo3, _PREHASH_RegionFlagsExtended, region_flags); + } + else + { + U32 flags = 0; + msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, flags); + region_flags = flags; + } + if (host != gAgent.getRegionHost()) { // Update is for a different region than the one we're in. @@ -341,6 +351,7 @@ void LLFloaterGodTools::sendGodUpdateRegionInfo() LLMessageSystem *msg = gMessageSystem; LLPanelRegionTools *rtool = god_tools->mPanelRegionTools; + U64 region_flags = computeRegionFlags(); msg->newMessage("GodUpdateRegionInfo"); msg->nextBlockFast(_PREHASH_AgentData); msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); @@ -349,11 +360,14 @@ void LLFloaterGodTools::sendGodUpdateRegionInfo() msg->addStringFast(_PREHASH_SimName, rtool->getSimName()); msg->addU32Fast(_PREHASH_EstateID, rtool->getEstateID()); msg->addU32Fast(_PREHASH_ParentEstateID, rtool->getParentEstateID()); - msg->addU32Fast(_PREHASH_RegionFlags, computeRegionFlags()); + // Legacy flags + msg->addU32Fast(_PREHASH_RegionFlags, U32(region_flags)); msg->addF32Fast(_PREHASH_BillableFactor, rtool->getBillableFactor()); msg->addS32Fast(_PREHASH_PricePerMeter, rtool->getPricePerMeter()); msg->addS32Fast(_PREHASH_RedirectGridX, rtool->getRedirectGridX()); msg->addS32Fast(_PREHASH_RedirectGridY, rtool->getRedirectGridY()); + msg->nextBlockFast(_PREHASH_RegionInfo2); + msg->addU64Fast(_PREHASH_RegionFlagsExtended, region_flags); gAgent.sendReliableMessage(); } @@ -434,7 +448,7 @@ LLPanelRegionTools::~LLPanelRegionTools() // base class will take care of everything } -U32 LLPanelRegionTools::computeRegionFlags(U32 flags) const +U64 LLPanelRegionTools::computeRegionFlags(U64 flags) const { flags &= getRegionFlagsMask(); flags |= getRegionFlags(); @@ -562,9 +576,9 @@ S32 LLPanelRegionTools::getGridPosY() const return getChild<LLUICtrl>("gridposy")->getValue().asInteger(); } -U32 LLPanelRegionTools::getRegionFlags() const +U64 LLPanelRegionTools::getRegionFlags() const { - U32 flags = 0x0; + U64 flags = 0x0; flags = getChild<LLUICtrl>("check prelude")->getValue().asBoolean() ? set_prelude_flags(flags) : unset_prelude_flags(flags); @@ -601,9 +615,9 @@ U32 LLPanelRegionTools::getRegionFlags() const return flags; } -U32 LLPanelRegionTools::getRegionFlagsMask() const +U64 LLPanelRegionTools::getRegionFlagsMask() const { - U32 flags = 0xffffffff; + U64 flags = 0xFFFFFFFFFFFFFFFFULL; flags = getChild<LLUICtrl>("check prelude")->getValue().asBoolean() ? set_prelude_flags(flags) : unset_prelude_flags(flags); @@ -684,7 +698,7 @@ void LLPanelRegionTools::setParentEstateID(U32 id) getChild<LLUICtrl>("parentestate")->setValue((S32)id); } -void LLPanelRegionTools::setCheckFlags(U32 flags) +void LLPanelRegionTools::setCheckFlags(U64 flags) { getChild<LLUICtrl>("check prelude")->setValue(is_prelude(flags) ? TRUE : FALSE); getChild<LLUICtrl>("check fixed sun")->setValue(flags & REGION_FLAGS_SUN_FIXED ? TRUE : FALSE); @@ -943,7 +957,7 @@ void LLPanelObjectTools::refresh() } -U32 LLPanelObjectTools::computeRegionFlags(U32 flags) const +U64 LLPanelObjectTools::computeRegionFlags(U64 flags) const { if (getChild<LLUICtrl>("disable scripts")->getValue().asBoolean()) { @@ -973,7 +987,7 @@ U32 LLPanelObjectTools::computeRegionFlags(U32 flags) const } -void LLPanelObjectTools::setCheckFlags(U32 flags) +void LLPanelObjectTools::setCheckFlags(U64 flags) { getChild<LLUICtrl>("disable scripts")->setValue(flags & REGION_FLAGS_SKIP_SCRIPTS ? TRUE : FALSE); getChild<LLUICtrl>("disable collisions")->setValue(flags & REGION_FLAGS_SKIP_COLLISIONS ? TRUE : FALSE); diff --git a/indra/newview/llfloatergodtools.h b/indra/newview/llfloatergodtools.h index 1aa8b838fb..cbaeee7051 100644 --- a/indra/newview/llfloatergodtools.h +++ b/indra/newview/llfloatergodtools.h @@ -98,7 +98,7 @@ private: ~LLFloaterGodTools(); protected: - U32 computeRegionFlags() const; + U64 computeRegionFlags() const; protected: @@ -147,8 +147,8 @@ public: const std::string getSimName() const; U32 getEstateID() const; U32 getParentEstateID() const; - U32 getRegionFlags() const; - U32 getRegionFlagsMask() const; + U64 getRegionFlags() const; + U64 getRegionFlagsMask() const; F32 getBillableFactor() const; S32 getPricePerMeter() const; S32 getGridPosX() const; @@ -160,7 +160,7 @@ public: void setSimName(const std::string& name); void setEstateID(U32 id); void setParentEstateID(U32 id); - void setCheckFlags(U32 flags); + void setCheckFlags(U64 flags); void setBillableFactor(F32 billable_factor); void setPricePerMeter(S32 price); void setGridPosX(S32 pos); @@ -168,7 +168,7 @@ public: void setRedirectGridX(S32 pos); void setRedirectGridY(S32 pos); - U32 computeRegionFlags(U32 initial_flags) const; + U64 computeRegionFlags(U64 initial_flags) const; void clearAllWidgets(); void enableAllWidgets(); @@ -218,10 +218,10 @@ public: /*virtual*/ void refresh(); void setTargetAvatar(const LLUUID& target_id); - U32 computeRegionFlags(U32 initial_flags) const; + U64 computeRegionFlags(U64 initial_flags) const; void clearAllWidgets(); void enableAllWidgets(); - void setCheckFlags(U32 flags); + void setCheckFlags(U64 flags); void onChangeAnything(); void onApplyChanges(); diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index 2575f6f817..52e678ce24 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -593,7 +593,7 @@ S8 LLImagePreviewAvatar::getType() const void LLImagePreviewAvatar::setPreviewTarget(const std::string& joint_name, const std::string& mesh_name, LLImageRaw* imagep, F32 distance, BOOL male) { - mTargetJoint = mDummyAvatar->mRoot.findJoint(joint_name); + mTargetJoint = mDummyAvatar->mRoot->findJoint(joint_name); // clear out existing test mesh if (mTargetMesh) { @@ -612,9 +612,9 @@ void LLImagePreviewAvatar::setPreviewTarget(const std::string& joint_name, const mDummyAvatar->updateVisualParams(); mDummyAvatar->updateGeometry(mDummyAvatar->mDrawable); } - mDummyAvatar->mRoot.setVisible(FALSE, TRUE); + mDummyAvatar->mRoot->setVisible(FALSE, TRUE); - mTargetMesh = (LLViewerJointMesh*)mDummyAvatar->mRoot.findJoint(mesh_name); + mTargetMesh = dynamic_cast<LLViewerJointMesh*>(mDummyAvatar->mRoot->findJoint(mesh_name)); mTargetMesh->setTestTexture(mTextureName); mTargetMesh->setVisible(TRUE, FALSE); mCameraDistance = distance; @@ -631,7 +631,7 @@ void LLImagePreviewAvatar::clearPreviewTexture(const std::string& mesh_name) { if (mDummyAvatar) { - LLViewerJointMesh *mesh = (LLViewerJointMesh*)mDummyAvatar->mRoot.findJoint(mesh_name); + LLViewerJointMesh *mesh = dynamic_cast<LLViewerJointMesh*>(mDummyAvatar->mRoot->findJoint(mesh_name)); // clear out existing test mesh if (mesh) { diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 7296ec3ced..b40789db9c 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -585,6 +585,28 @@ void LLFloaterIMContainer::returnFloaterToHost() floater->onTearOffClicked(); } +void LLFloaterIMContainer::setMinimized(BOOL b) +{ + bool was_minimized = isMinimized(); + LLMultiFloater::setMinimized(b); + + //Switching from minimized to un-minimized + if(was_minimized && !b) + { + LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(mSelectedSession); + + if(session_floater && !session_floater->isTornOff()) + { + //When in DND mode, remove stored IM notifications + //Nearby chat (Null) IMs are not stored while in DND mode, so can ignore removal + if(gAgent.isDoNotDisturb() && mSelectedSession.notNull()) + { + LLDoNotDisturbNotificationStorage::getInstance()->removeNotification(LLDoNotDisturbNotificationStorage::toastName, mSelectedSession); + } + } + } +} + void LLFloaterIMContainer::setVisible(BOOL visible) { LLFloaterIMNearbyChat* nearby_chat; if (visible) @@ -597,10 +619,21 @@ void LLFloaterIMContainer::setVisible(BOOL visible) // *TODO: find a way to move this to XML as a default panel or something like that LLSD name("nearby_chat"); LLFloaterReg::toggleInstanceOrBringToFront(name); - setSelectedSession(LLUUID(NULL)); + selectConversationPair(LLUUID(NULL), false, false); } openNearbyChat(); - selectConversationPair(getSelectedSession(), false, false); + flashConversationItemWidget(mSelectedSession,false); + + LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(mSelectedSession); + if(session_floater && !session_floater->isMinimized()) + { + //When in DND mode, remove stored IM notifications + //Nearby chat (Null) IMs are not stored while in DND mode, so can ignore removal + if(gAgent.isDoNotDisturb() && mSelectedSession.notNull()) + { + LLDoNotDisturbNotificationStorage::getInstance()->removeNotification(LLDoNotDisturbNotificationStorage::toastName, mSelectedSession); + } + } } nearby_chat = LLFloaterReg::findTypedInstance<LLFloaterIMNearbyChat>("nearby_chat"); @@ -1389,13 +1422,6 @@ BOOL LLFloaterIMContainer::selectConversationPair(const LLUUID& session_id, bool widget->getParentFolder()->setSelection(widget, FALSE, FALSE); mConversationsRoot->scrollToShowSelection(); } - - //When in DND mode, remove stored IM notifications - //Nearby chat (Null) IMs are not stored while in DND mode, so can ignore removal - if(gAgent.isDoNotDisturb() && session_id.notNull()) - { - LLDoNotDisturbNotificationStorage::getInstance()->removeNotification(LLDoNotDisturbNotificationStorage::toastName, session_id); - } } /* floater processing */ @@ -1420,14 +1446,19 @@ BOOL LLFloaterIMContainer::selectConversationPair(const LLUUID& session_id, bool { showStub(true); } + + //When in DND mode, remove stored IM notifications + //Nearby chat (Null) IMs are not stored while in DND mode, so can ignore removal + if(gAgent.isDoNotDisturb() && session_id.notNull()) + { + LLDoNotDisturbNotificationStorage::getInstance()->removeNotification(LLDoNotDisturbNotificationStorage::toastName, session_id); + } } // Set the focus on the selected floater - if (!session_floater->hasFocus()) + if (!session_floater->hasFocus() && !session_floater->isMinimized()) { - BOOL is_minimized = session_floater->isMinimized(); session_floater->setFocus(focus_floater); - session_floater->setMinimized(is_minimized); } } flashConversationItemWidget(session_id,false); @@ -1986,7 +2017,10 @@ void LLFloaterIMContainer::closeFloater(bool app_quitting/* = false*/) { // Always unminimize before trying to close. // Most of the time the user will never see this state. - setMinimized(FALSE); + if(isMinimized()) + { + LLMultiFloater::setMinimized(FALSE); + } LLFloater::closeFloater(app_quitting); } diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h index 52b672241f..e39d20ec35 100644 --- a/indra/newview/llfloaterimcontainer.h +++ b/indra/newview/llfloaterimcontainer.h @@ -59,6 +59,7 @@ public: /*virtual*/ BOOL postBuild(); /*virtual*/ void onOpen(const LLSD& key); /*virtual*/ void draw(); + /*virtual*/ void setMinimized(BOOL b); /*virtual*/ void setVisible(BOOL visible); /*virtual*/ void setVisibleAndFrontmost(BOOL take_focus=TRUE, const LLSD& key = LLSD()); /*virtual*/ void updateResizeLimits(); diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp index d86e1b3fd7..56b0c15cb9 100644 --- a/indra/newview/llfloaterimnearbychat.cpp +++ b/indra/newview/llfloaterimnearbychat.cpp @@ -264,7 +264,7 @@ void LLFloaterIMNearbyChat::setVisibleAndFrontmost(BOOL take_focus, const LLSD& if(!isTornOff() && matchesKey(key)) { - LLFloaterIMContainer::getInstance()->selectConversationPair(mSessionID, true, false); + LLFloaterIMContainer::getInstance()->selectConversationPair(mSessionID, true, take_focus); } } diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp index 6d5145f205..8ec85e1160 100644 --- a/indra/newview/llfloaterimsession.cpp +++ b/indra/newview/llfloaterimsession.cpp @@ -39,6 +39,7 @@ #include "llchannelmanager.h" #include "llchiclet.h" #include "llchicletbar.h" +#include "lldonotdisturbnotificationstorage.h" #include "llfloaterreg.h" #include "llfloateravatarpicker.h" #include "llfloaterimcontainer.h" // to replace separate IM Floaters with multifloater container @@ -645,6 +646,23 @@ void LLFloaterIMSession::setDocked(bool docked, bool pop_on_undock) } } +void LLFloaterIMSession::setMinimized(BOOL b) +{ + bool wasMinimized = isMinimized(); + LLFloaterIMSessionTab::setMinimized(b); + + //Switching from minimized state to un-minimized state + if(wasMinimized && !b) + { + //When in DND mode, remove stored IM notifications + //Nearby chat (Null) IMs are not stored while in DND mode, so can ignore removal + if(gAgent.isDoNotDisturb()) + { + LLDoNotDisturbNotificationStorage::getInstance()->removeNotification(LLDoNotDisturbNotificationStorage::toastName, mSessionID); + } + } +} + void LLFloaterIMSession::setVisible(BOOL visible) { LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*> @@ -713,6 +731,18 @@ BOOL LLFloaterIMSession::getVisible() return visible; } +void LLFloaterIMSession::setFocus(BOOL focus) +{ + LLFloaterIMSessionTab::setFocus(focus); + + //When in DND mode, remove stored IM notifications + //Nearby chat (Null) IMs are not stored while in DND mode, so can ignore removal + if(focus && gAgent.isDoNotDisturb()) + { + LLDoNotDisturbNotificationStorage::getInstance()->removeNotification(LLDoNotDisturbNotificationStorage::toastName, mSessionID); + } +} + //static bool LLFloaterIMSession::toggle(const LLUUID& session_id) { @@ -1125,9 +1155,10 @@ public: mSessionID = session_id; } - void error(U32 statusNum, const std::string& reason) + void errorWithContent(U32 statusNum, const std::string& reason, const LLSD& content) { - llinfos << "Error inviting all agents to session" << llendl; + llwarns << "Error inviting all agents to session [status:" + << statusNum << "]: " << content << llendl; //throw something back to the viewer here? } diff --git a/indra/newview/llfloaterimsession.h b/indra/newview/llfloaterimsession.h index cb330bca0f..a0e0171b34 100644 --- a/indra/newview/llfloaterimsession.h +++ b/indra/newview/llfloaterimsession.h @@ -65,8 +65,10 @@ public: // LLView overrides /*virtual*/ BOOL postBuild(); + /*virtual*/ void setMinimized(BOOL b); /*virtual*/ void setVisible(BOOL visible); /*virtual*/ BOOL getVisible(); + /*virtual*/ void setFocus(BOOL focus); // Check typing timeout timer. /*virtual*/ void draw(); diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 0a30fef768..8290494c22 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -557,7 +557,7 @@ void LLPanelLandGeneral::refresh() BOOL is_leased = (LLParcel::OS_LEASED == parcel->getOwnershipStatus()); BOOL region_xfer = FALSE; if(regionp - && !(regionp->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL)) + && !(regionp->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL))) { region_xfer = TRUE; } @@ -2120,7 +2120,7 @@ void LLPanelLandOptions::refreshSearch() LLViewerParcelMgr::isParcelModifiableByAgent( parcel, GP_LAND_CHANGE_IDENTITY) && region - && !(region->getRegionFlags() & REGION_FLAGS_BLOCK_PARCEL_SEARCH); + && !(region->getRegionFlag(REGION_FLAGS_BLOCK_PARCEL_SEARCH)); // There is a bug with this panel whereby the Show Directory bit can be // slammed off by the Region based on an override. Since this data is cached @@ -2873,7 +2873,7 @@ void LLPanelLandCovenant::refresh() LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause"); if (resellable_clause) { - if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) + if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL)) { resellable_clause->setText(getString("can_not_resell")); } @@ -2886,7 +2886,7 @@ void LLPanelLandCovenant::refresh() LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause"); if (changeable_clause) { - if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) + if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES)) { changeable_clause->setText(getString("can_change")); } diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index ea839e6f5a..100f1d580b 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -760,7 +760,6 @@ void LLFloaterModelPreview::onLODParamCommit(S32 lod, bool enforce_tri_limit) void LLFloaterModelPreview::draw() { LLFloater::draw(); - LLRect r = getRect(); mModelPreview->update(); @@ -1684,7 +1683,6 @@ bool LLModelLoader::doLoadModel() //If no skeleton, do a breadth-first search to get at specific joints bool rootNode = false; - bool skeletonWithNoRootNode = false; //Need to test for a skeleton that does not have a root node //This occurs when your instance controller does not have an associated scene @@ -1695,10 +1693,6 @@ bool LLModelLoader::doLoadModel() { rootNode = true; } - else - { - skeletonWithNoRootNode = true; - } } if ( !pSkeleton || !rootNode ) @@ -2502,7 +2496,7 @@ void LLModelLoader::loadTextures() if(!material.mDiffuseMapFilename.empty()) { material.mDiffuseMap = - LLViewerTextureManager::getFetchedTextureFromUrl("file://" + material.mDiffuseMapFilename, TRUE, LLViewerTexture::BOOST_PREVIEW); + LLViewerTextureManager::getFetchedTextureFromUrl("file://" + material.mDiffuseMapFilename, FTT_LOCAL_FILE, TRUE, LLGLTexture::BOOST_PREVIEW); material.mDiffuseMap->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, TRUE, FALSE, mPreview, NULL, FALSE); material.mDiffuseMap->forceToSaveRawImage(0, F32_MAX); mNumOfFetchingTextures++ ; @@ -5020,16 +5014,9 @@ BOOL LLModelPreview::render() bool upload_skin = mFMP->childGetValue("upload_skin").asBoolean(); bool upload_joints = mFMP->childGetValue("upload_joints").asBoolean(); - bool resetJoints = false; if ( upload_joints != mLastJointUpdate ) { - if ( mLastJointUpdate ) - { - resetJoints = true; - } - mLastJointUpdate = upload_joints; - } for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter) diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp index c7fab2573f..3a7ca17b73 100644 --- a/indra/newview/llfloaterregiondebugconsole.cpp +++ b/indra/newview/llfloaterregiondebugconsole.cpp @@ -75,7 +75,7 @@ namespace { public: /* virtual */ - void error(U32 status, const std::string& reason) + void errorWithContent(U32 status, const std::string& reason, const LLSD& content) { sConsoleReplySignal(UNABLE_TO_SEND_COMMAND); } diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index e6b76159a1..50c013a49d 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -318,7 +318,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg) // extract message std::string sim_name; std::string sim_type = LLTrans::getString("land_type_unknown"); - U32 region_flags; + U64 region_flags; U8 agent_limit; F32 object_bonus_factor; U8 sim_access; @@ -328,7 +328,6 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg) BOOL use_estate_sun; F32 sun_hour; msg->getString("RegionInfo", "SimName", sim_name); - msg->getU32("RegionInfo", "RegionFlags", region_flags); msg->getU8("RegionInfo", "MaxAgents", agent_limit); msg->getF32("RegionInfo", "ObjectBonusFactor", object_bonus_factor); msg->getU8("RegionInfo", "SimAccess", sim_access); @@ -347,6 +346,17 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg) LLTrans::findString(sim_type, sim_type); // try localizing sim product name } + if (msg->has(_PREHASH_RegionInfo3)) + { + msg->getU64("RegionInfo3", "RegionFlagsExtended", region_flags); + } + else + { + U32 flags = 0; + msg->getU32("RegionInfo", "RegionFlags", flags); + region_flags = flags; + } + // GENERAL PANEL panel = tab->getChild<LLPanel>("General"); panel->getChild<LLUICtrl>("region_text")->setValue(LLSD(sim_name)); @@ -378,9 +388,9 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg) panel = tab->getChild<LLPanel>("Debug"); panel->getChild<LLUICtrl>("region_text")->setValue(LLSD(sim_name) ); - panel->getChild<LLUICtrl>("disable_scripts_check")->setValue(LLSD((BOOL)(region_flags & REGION_FLAGS_SKIP_SCRIPTS)) ); - panel->getChild<LLUICtrl>("disable_collisions_check")->setValue(LLSD((BOOL)(region_flags & REGION_FLAGS_SKIP_COLLISIONS)) ); - panel->getChild<LLUICtrl>("disable_physics_check")->setValue(LLSD((BOOL)(region_flags & REGION_FLAGS_SKIP_PHYSICS)) ); + panel->getChild<LLUICtrl>("disable_scripts_check")->setValue(LLSD((BOOL)((region_flags & REGION_FLAGS_SKIP_SCRIPTS) ? TRUE : FALSE )) ); + panel->getChild<LLUICtrl>("disable_collisions_check")->setValue(LLSD((BOOL)((region_flags & REGION_FLAGS_SKIP_COLLISIONS) ? TRUE : FALSE )) ); + panel->getChild<LLUICtrl>("disable_physics_check")->setValue(LLSD((BOOL)((region_flags & REGION_FLAGS_SKIP_PHYSICS) ? TRUE : FALSE )) ); panel->setCtrlsEnabled(allow_modify); // TERRAIN PANEL @@ -748,9 +758,10 @@ class ConsoleRequestResponder : public LLHTTPClient::Responder { public: /*virtual*/ - void error(U32 status, const std::string& reason) + void errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - llwarns << "requesting mesh_rez_enabled failed" << llendl; + llwarns << "ConsoleRequestResponder error requesting mesh_rez_enabled [status:" + << status << "]: " << content << llendl; } }; @@ -760,9 +771,10 @@ class ConsoleUpdateResponder : public LLHTTPClient::Responder { public: /* virtual */ - void error(U32 status, const std::string& reason) + void errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - llwarns << "Updating mesh enabled region setting failed" << llendl; + llwarns << "ConsoleRequestResponder error updating mesh enabled region setting [status:" + << status << "]: " << content << llendl; } }; @@ -2239,10 +2251,10 @@ public: } // if we get an error response - virtual void error(U32 status, const std::string& reason) + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - llinfos << "LLEstateChangeInfoResponder::error " - << status << ": " << reason << llendl; + llinfos << "LLEstateChangeInfoResponder::error [status:" + << status << "]: " << content << llendl; } private: LLHandle<LLPanel> mpPanel; @@ -2318,7 +2330,7 @@ bool LLPanelEstateCovenant::refreshFromRegion(LLViewerRegion* region) LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause"); if (resellable_clause) { - if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) + if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL)) { resellable_clause->setText(getString("can_not_resell")); } @@ -2331,7 +2343,7 @@ bool LLPanelEstateCovenant::refreshFromRegion(LLViewerRegion* region) LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause"); if (changeable_clause) { - if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) + if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES)) { changeable_clause->setText(getString("can_change")); } diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 0e4c7406c5..35b63c5480 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -111,9 +111,6 @@ LLFloaterReporter::LLFloaterReporter(const LLSD& key) // static void LLFloaterReporter::processRegionInfo(LLMessageSystem* msg) { - U32 region_flags; - msg->getU32("RegionInfo", "RegionFlags", region_flags); - if ( LLFloaterReg::instanceVisible("reporter") ) { LLNotificationsUtil::add("HelpReportAbuseEmailLL"); @@ -713,7 +710,7 @@ class LLUserReportResponder : public LLHTTPClient::Responder public: LLUserReportResponder(): LLHTTPClient::Responder() {} - void error(U32 status, const std::string& reason) + void errorWithContent(U32 status, const std::string& reason, const LLSD& content) { // *TODO do some user messaging here LLUploadDialog::modalUploadFinished(); @@ -783,8 +780,8 @@ void LLFloaterReporter::takeScreenshot() // store in the image list so it doesn't try to fetch from the server LLPointer<LLViewerFetchedTexture> image_in_list = - LLViewerTextureManager::getFetchedTexture(mResourceDatap->mAssetInfo.mUuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::FETCHED_TEXTURE); - image_in_list->createGLTexture(0, raw, 0, TRUE, LLViewerTexture::OTHER); + LLViewerTextureManager::getFetchedTexture(mResourceDatap->mAssetInfo.mUuid); + image_in_list->createGLTexture(0, raw, 0, TRUE, LLGLTexture::OTHER); // the texture picker then uses that texture LLTexturePicker* texture = getChild<LLTextureCtrl>("screenshot"); @@ -831,12 +828,7 @@ void LLFloaterReporter::uploadDoneCallback(const LLUUID &uuid, void *user_data, return; } - EReportType report_type = UNKNOWN_REPORT; - if (data->mPreferredLocation == LLResourceData::INVALID_LOCATION) - { - report_type = COMPLAINT_REPORT; - } - else + if (data->mPreferredLocation != LLResourceData::INVALID_LOCATION) { llwarns << "Unknown report type : " << data->mPreferredLocation << llendl; } diff --git a/indra/newview/llfloaterscriptdebug.cpp b/indra/newview/llfloaterscriptdebug.cpp index b691db1049..6c17f62c1e 100644 --- a/indra/newview/llfloaterscriptdebug.cpp +++ b/indra/newview/llfloaterscriptdebug.cpp @@ -105,7 +105,7 @@ void LLFloaterScriptDebug::addScriptLine(const std::string &utf8mesg, const std: if (objectp) { - objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", TRUE, LLViewerTexture::BOOST_UI)); + objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", FTT_LOCAL_FILE, TRUE, LLGLTexture::BOOST_UI)); floater_label = llformat("%s(%.0f, %.0f, %.0f)", user_name.c_str(), objectp->getPositionRegion().mV[VX], diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp index 8d8bba7b17..13cb3c2eb0 100644 --- a/indra/newview/llfloaterscriptlimits.cpp +++ b/indra/newview/llfloaterscriptlimits.cpp @@ -221,9 +221,9 @@ void fetchScriptLimitsRegionInfoResponder::result(const LLSD& content) } } -void fetchScriptLimitsRegionInfoResponder::error(U32 status, const std::string& reason) +void fetchScriptLimitsRegionInfoResponder::errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - llwarns << "Error from responder " << reason << llendl; + llwarns << "fetchScriptLimitsRegionInfoResponder error [status:" << status << "]: " << content << llendl; } void fetchScriptLimitsRegionSummaryResponder::result(const LLSD& content_ref) @@ -308,9 +308,9 @@ void fetchScriptLimitsRegionSummaryResponder::result(const LLSD& content_ref) } } -void fetchScriptLimitsRegionSummaryResponder::error(U32 status, const std::string& reason) +void fetchScriptLimitsRegionSummaryResponder::errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - llwarns << "Error from responder " << reason << llendl; + llwarns << "fetchScriptLimitsRegionSummaryResponder error [status:" << status << "]: " << content << llendl; } void fetchScriptLimitsRegionDetailsResponder::result(const LLSD& content_ref) @@ -417,9 +417,9 @@ result (map) } } -void fetchScriptLimitsRegionDetailsResponder::error(U32 status, const std::string& reason) +void fetchScriptLimitsRegionDetailsResponder::errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - llwarns << "Error from responder " << reason << llendl; + llwarns << "fetchScriptLimitsRegionDetailsResponder error [status:" << status << "]: " << content << llendl; } void fetchScriptLimitsAttachmentInfoResponder::result(const LLSD& content_ref) @@ -513,9 +513,9 @@ void fetchScriptLimitsAttachmentInfoResponder::result(const LLSD& content_ref) } } -void fetchScriptLimitsAttachmentInfoResponder::error(U32 status, const std::string& reason) +void fetchScriptLimitsAttachmentInfoResponder::errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - llwarns << "Error from responder " << reason << llendl; + llwarns << "fetchScriptLimitsAttachmentInfoResponder error [status:" << status << "]: " << content << llendl; } ///---------------------------------------------------------------------------- diff --git a/indra/newview/llfloaterscriptlimits.h b/indra/newview/llfloaterscriptlimits.h index 9bcfa5fe14..f8732ef94b 100644 --- a/indra/newview/llfloaterscriptlimits.h +++ b/indra/newview/llfloaterscriptlimits.h @@ -89,7 +89,7 @@ class fetchScriptLimitsRegionInfoResponder: public LLHTTPClient::Responder fetchScriptLimitsRegionInfoResponder(const LLSD& info) : mInfo(info) {}; void result(const LLSD& content); - void error(U32 status, const std::string& reason); + void errorWithContent(U32 status, const std::string& reason, const LLSD& content); public: protected: LLSD mInfo; @@ -101,7 +101,7 @@ class fetchScriptLimitsRegionSummaryResponder: public LLHTTPClient::Responder fetchScriptLimitsRegionSummaryResponder(const LLSD& info) : mInfo(info) {}; void result(const LLSD& content); - void error(U32 status, const std::string& reason); + void errorWithContent(U32 status, const std::string& reason, const LLSD& content); public: protected: LLSD mInfo; @@ -113,7 +113,7 @@ class fetchScriptLimitsRegionDetailsResponder: public LLHTTPClient::Responder fetchScriptLimitsRegionDetailsResponder(const LLSD& info) : mInfo(info) {}; void result(const LLSD& content); - void error(U32 status, const std::string& reason); + void errorWithContent(U32 status, const std::string& reason, const LLSD& content); public: protected: LLSD mInfo; @@ -125,7 +125,7 @@ class fetchScriptLimitsAttachmentInfoResponder: public LLHTTPClient::Responder fetchScriptLimitsAttachmentInfoResponder() {}; void result(const LLSD& content); - void error(U32 status, const std::string& reason); + void errorWithContent(U32 status, const std::string& reason, const LLSD& content); public: protected: }; diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index 96b5c6b09b..5f9556a870 100644 --- a/indra/newview/llfloatersidepanelcontainer.cpp +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -28,10 +28,13 @@ #include "llfloaterreg.h" #include "llfloatersidepanelcontainer.h" +#include "llpaneleditwearable.h" // newview includes #include "llsidetraypanelcontainer.h" #include "lltransientfloatermgr.h" +#include "llpaneloutfitedit.h" +#include "llsidepanelappearance.h" //static const std::string LLFloaterSidePanelContainer::sMainPanelName("main_panel"); @@ -54,6 +57,27 @@ void LLFloaterSidePanelContainer::onOpen(const LLSD& key) getChild<LLPanel>(sMainPanelName)->onOpen(key); } +void LLFloaterSidePanelContainer::onClickCloseBtn() +{ + LLPanelOutfitEdit* panel_outfit_edit = + dynamic_cast<LLPanelOutfitEdit*>(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfit_edit")); + if (panel_outfit_edit) + { + LLFloater *parent = gFloaterView->getParentFloater(panel_outfit_edit); + if (parent == this ) + { + LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance*>(getPanel("appearance")); + if ( panel_appearance ) + { + panel_appearance->getWearable()->onClose(); + panel_appearance->showOutfitsInventoryPanel(); + } + } + } + + LLFloater::onClickCloseBtn(); +} + LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_name, const LLSD& params) { LLView* view = findChildView(panel_name, true); diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h index 10d85867ce..491723471f 100644 --- a/indra/newview/llfloatersidepanelcontainer.h +++ b/indra/newview/llfloatersidepanelcontainer.h @@ -51,6 +51,8 @@ public: /*virtual*/ void onOpen(const LLSD& key); + /*virtual*/ void onClickCloseBtn(); + LLPanel* openChildPanel(const std::string& panel_name, const LLSD& params); static void showPanel(const std::string& floater_name, const LLSD& key); diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 15e0b89f6c..0106a1615d 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -855,7 +855,6 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID) LLPanel* panel = LLUICtrlFactory::create<LLPanel>(panel_params); // create a new panel panel->buildFromFile(path); // build it - LLRect new_size = panel->getRect(); // get its rectangle panel->setOrigin(2,2); // reset its origin point so it's not offset by -left or other XUI attributes (*floaterp)->setTitle(path); // use the file name as its title, since panels have no guaranteed meaningful name attribute panel->setUseBoundingRect(TRUE); // enable the use of its outer bounding rect (normally disabled because it's O(n) on the number of sub-elements) diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index a4dfd94496..16ed3f990c 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -557,7 +557,7 @@ void LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID) lldebugs << "Sent create_inventory_item for " << avatarID << ", " << name << llendl; // TODO: mantipov: Is CreateFriendCardCallback really needed? Probably not - LLPointer<LLInventoryCallback> cb = new CreateFriendCardCallback(); + LLPointer<LLInventoryCallback> cb = new CreateFriendCardCallback; create_inventory_callingcard(avatarID, findFriendAllSubfolderUUIDImpl(), cb); } diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index f307505ff8..9aa86297fc 100644 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -338,7 +338,7 @@ void LLGestureMgr::deactivateGesture(const LLUUID& item_id) gAgent.sendReliableMessage(); - LLAppearanceMgr::instance().removeCOFItemLinks(base_item_id, false); + LLAppearanceMgr::instance().removeCOFItemLinks(base_item_id); notifyObservers(); } diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 1208c9378e..60fa53f491 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -79,10 +79,10 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask) S32 top = llmax(y, mDragStartY); S32 bottom =llmin(y, mDragStartY); - left = llround((F32) left * LLUI::sGLScaleFactor.mV[VX]); - right = llround((F32) right * LLUI::sGLScaleFactor.mV[VX]); - top = llround((F32) top * LLUI::sGLScaleFactor.mV[VY]); - bottom = llround((F32) bottom * LLUI::sGLScaleFactor.mV[VY]); + left = llround((F32) left * LLUI::getScaleFactor().mV[VX]); + right = llround((F32) right * LLUI::getScaleFactor().mV[VX]); + top = llround((F32) top * LLUI::getScaleFactor().mV[VY]); + bottom = llround((F32) bottom * LLUI::getScaleFactor().mV[VY]); F32 old_far_plane = LLViewerCamera::getInstance()->getFar(); F32 old_near_plane = LLViewerCamera::getInstance()->getNear(); diff --git a/indra/newview/llgroupiconctrl.cpp b/indra/newview/llgroupiconctrl.cpp index 188c4bcf25..2d0fc26c2a 100644 --- a/indra/newview/llgroupiconctrl.cpp +++ b/indra/newview/llgroupiconctrl.cpp @@ -29,6 +29,7 @@ #include "llgroupiconctrl.h" #include "llagent.h" +#include "llviewertexture.h" /* #include "llavatarconstants.h" #include "llcallingcard.h" // for LLAvatarTracker diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 81eb1d397e..cbd844cdac 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -1847,14 +1847,15 @@ public: GroupMemberDataResponder() {} virtual ~GroupMemberDataResponder() {} virtual void result(const LLSD& pContent); - virtual void error(U32 pStatus, const std::string& pReason); + virtual void errorWithContent(U32 pStatus, const std::string& pReason, const LLSD& pContent); private: LLSD mMemberData; }; -void GroupMemberDataResponder::error(U32 pStatus, const std::string& pReason) +void GroupMemberDataResponder::errorWithContent(U32 pStatus, const std::string& pReason, const LLSD& pContent) { - LL_WARNS("GrpMgr") << "Error receiving group member data." << LL_ENDL; + LL_WARNS("GrpMgr") << "Error receiving group member data [status:" + << pStatus << "]: " << pContent << LL_ENDL; } void GroupMemberDataResponder::result(const LLSD& content) diff --git a/indra/newview/llhomelocationresponder.cpp b/indra/newview/llhomelocationresponder.cpp index 4850d18d99..37428c4a44 100644 --- a/indra/newview/llhomelocationresponder.cpp +++ b/indra/newview/llhomelocationresponder.cpp @@ -97,7 +97,7 @@ void LLHomeLocationResponder::result( const LLSD& content ) } } -void LLHomeLocationResponder::error( U32 status, const std::string& reason ) +void LLHomeLocationResponder::errorWithContent( U32 status, const std::string& reason, const LLSD& content ) { - llinfos << "received error(" << reason << ")" << llendl; + llwarns << "LLHomeLocationResponder error [status:" << status << "]: " << content << llendl; } diff --git a/indra/newview/llhomelocationresponder.h b/indra/newview/llhomelocationresponder.h index d640b9c894..9bf4b12c4e 100644 --- a/indra/newview/llhomelocationresponder.h +++ b/indra/newview/llhomelocationresponder.h @@ -36,7 +36,7 @@ class LLHomeLocationResponder : public LLHTTPClient::Responder { virtual void result( const LLSD& content ); - virtual void error( U32 status, const std::string& reason ); + virtual void errorWithContent( U32 status, const std::string& reason, const LLSD& content ); }; #endif diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index bc3b220dc0..9dde65ceb6 100644 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -636,7 +636,7 @@ bool LLHUDEffectLookAt::calcTargetPosition() } else { - target_rot = target_av->mRoot.getWorldRotation(); + target_rot = target_av->mRoot->getWorldRotation(); } } else // target obj is not an avatar diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index 579b6008ae..3c6bcd9829 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -186,11 +186,8 @@ void LLHUDText::renderText() LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec); } - LLVector2 border_scale_vec((F32)border_width / (F32)imagep->getTextureWidth(), (F32)border_height / (F32)imagep->getTextureHeight()); LLVector3 width_vec = mWidth * x_pixel_vec; LLVector3 height_vec = mHeight * y_pixel_vec; - LLVector3 scaled_border_width = (F32)llfloor(border_scale * (F32)border_width) * x_pixel_vec; - LLVector3 scaled_border_height = (F32)llfloor(border_scale * (F32)border_height) * y_pixel_vec; mRadius = (width_vec + height_vec).magVec() * 0.5f; @@ -440,7 +437,7 @@ LLVector2 LLHUDText::updateScreenPos(LLVector2 &offset) LLVector3 x_pixel_vec; LLVector3 y_pixel_vec; LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec); - LLVector3 world_pos = mPositionAgent + (offset.mV[VX] * x_pixel_vec) + (offset.mV[VY] * y_pixel_vec); +// LLVector3 world_pos = mPositionAgent + (offset.mV[VX] * x_pixel_vec) + (offset.mV[VY] * y_pixel_vec); // if (!LLViewerCamera::getInstance()->projectPosAgentToScreen(world_pos, screen_pos, FALSE) && mVisibleOffScreen) // { // // bubble off-screen, so find a spot for it along screen edge diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index c64ecdc47a..59272d721f 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -394,9 +394,10 @@ public: mSessionID = session_id; } - void error(U32 statusNum, const std::string& reason) + void errorWithContent(U32 statusNum, const std::string& reason, const LLSD& content) { - llinfos << "Error inviting all agents to session" << llendl; + llwarns << "Error inviting all agents to session [status:" + << statusNum << "]: " << content << llendl; //throw something back to the viewer here? } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index e237cb7f9e..3b72ad3cd9 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -175,6 +175,7 @@ void on_new_message(const LLSD& msg) enum {CLOSED, NOT_ON_TOP, ON_TOP, ON_TOP_AND_ITEM_IS_SELECTED} conversations_floater_status; + LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container"); LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(session_id); @@ -182,18 +183,19 @@ void on_new_message(const LLSD& msg) { conversations_floater_status = CLOSED; } - else if (!session_floater || !LLFloater::isVisible(session_floater) - || session_floater->isMinimized() || !session_floater->hasFocus()) + else if (!im_box->hasFocus() && + !(session_floater && LLFloater::isVisible(session_floater) + && !session_floater->isMinimized() && session_floater->hasFocus())) { conversations_floater_status = NOT_ON_TOP; } - else if ((session_floater->hasFocus()) && (im_box->getSelectedSession() == session_id)) + else if (im_box->getSelectedSession() != session_id) { - conversations_floater_status = ON_TOP_AND_ITEM_IS_SELECTED; + conversations_floater_status = ON_TOP; } else { - conversations_floater_status = ON_TOP; + conversations_floater_status = ON_TOP_AND_ITEM_IS_SELECTED; } // determine user prefs for this session @@ -1398,7 +1400,7 @@ public: mAgents = agents_to_invite; } - virtual void error(U32 statusNum, const std::string& reason) + virtual void errorWithContent(U32 statusNum, const std::string& reason, const LLSD& content) { //try an "old school" way. if ( statusNum == 400 ) @@ -1410,6 +1412,9 @@ public: mAgents); } + llwarns << "LLStartConferenceChatResponder error [status:" + << statusNum << "]: " << content << llendl; + //else throw an error back to the client? //in theory we should have just have these error strings //etc. set up in this file as opposed to the IMMgr, @@ -1555,8 +1560,10 @@ public: } } - void error(U32 statusNum, const std::string& reason) + void errorWithContent(U32 statusNum, const std::string& reason, const LLSD& content) { + llwarns << "LLViewerChatterBoxInvitationAcceptResponder error [status:" + << statusNum << "]: " << content << llendl; //throw something back to the viewer here? if ( gIMMgr ) { @@ -2844,6 +2851,8 @@ LLUUID LLIMMgr::addSession( //we don't need to show notes about online/offline, mute/unmute users' statuses for existing sessions if (!new_session) return session_id; + llinfos << "LLIMMgr::addSession, new session added, name = " << name << ", session id = " << session_id << llendl; + //Per Plan's suggestion commented "explicit offline status warning" out to make Dessie happier (see EXT-3609) //*TODO After February 2010 remove this commented out line if no one will be missing that warning //noteOfflineUsers(session_id, floater, ids); @@ -2879,6 +2888,8 @@ void LLIMMgr::removeSession(const LLUUID& session_id) LLIMModel::getInstance()->clearSession(session_id); + llinfos << "LLIMMgr::removeSession, session removed, session id = " << session_id << llendl; + notifyObserverSessionRemoved(session_id); } @@ -2896,7 +2907,6 @@ void LLIMMgr::inviteToSession( // voice invite question is different from default only for group call (EXT-7118) std::string question_type = "VoiceInviteQuestionDefault"; - BOOL ad_hoc_invite = FALSE; BOOL voice_invite = FALSE; bool is_linden = LLMuteList::getInstance()->isLinden(caller_name); @@ -2919,13 +2929,11 @@ void LLIMMgr::inviteToSession( //else it's an ad-hoc //and a voice ad-hoc notify_box_type = "VoiceInviteAdHoc"; - ad_hoc_invite = TRUE; voice_invite = TRUE; } else if ( inv_type == INVITATION_TYPE_IMMEDIATE ) { notify_box_type = "InviteAdHoc"; - ad_hoc_invite = TRUE; } LLSD payload; @@ -3510,10 +3518,9 @@ public: } std::string buffer = saved + message; - BOOL is_this_agent = FALSE; if(from_id == gAgentID) { - is_this_agent = TRUE; + return; } gIMMgr->addMessage( session_id, diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp index 1e15dc832c..9c6db3676f 100644 --- a/indra/newview/llinspectavatar.cpp +++ b/indra/newview/llinspectavatar.cpp @@ -292,6 +292,11 @@ void LLInspectAvatar::processAvatarData(LLAvatarData* data) delete mPropertiesRequest; mPropertiesRequest = NULL; } +/* +prep# + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) + llwarns << "MuteVoiceResponder error [status:" << status << "]: " << content << llendl; + */ void LLInspectAvatar::updateVolumeSlider() { diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 0ee78d57bd..a5043a30ac 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -51,6 +51,7 @@ #include "llclipboard.h" #include "llinventorydefines.h" #include "llinventoryfunctions.h" +#include "llinventoryicon.h" #include "llinventorymodel.h" #include "llinventorymodelbackgroundfetch.h" #include "llinventorypanel.h" @@ -96,8 +97,6 @@ struct LLMoveInv using namespace LLOldEvents; // Function declarations -void remove_inventory_category_from_avatar(LLInventoryCategory* category); -void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id); bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*); bool confirm_attachment_rez(const LLSD& notification, const LLSD& response); void teleport_via_landmark(const LLUUID& asset_id); @@ -1545,7 +1544,7 @@ LLUIImagePtr LLItemBridge::getIcon() const mIsLink); } - return LLInventoryIcon::getIcon(LLInventoryIcon::ICONNAME_OBJECT); + return LLInventoryIcon::getIcon(LLInventoryType::ICONNAME_OBJECT); } LLUIImagePtr LLItemBridge::getIconOverlay() const @@ -2649,7 +2648,6 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id, if(drop && accept) { it = inventory_objects.begin(); - LLInventoryObject::object_list_t::iterator first_it = inventory_objects.begin(); LLMoveInv* move_inv = new LLMoveInv; move_inv->mObjectID = object_id; move_inv->mCategoryID = category_id; @@ -2926,7 +2924,7 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action) LLViewerInventoryCategory* cat = getCategory(); if(!cat) return; - remove_inventory_category_from_avatar ( cat ); + LLAppearanceMgr::instance().takeOffOutfit( cat->getLinkedUUID() ); return; } else if ("purge" == action) @@ -5236,7 +5234,7 @@ void LLObjectBridge::performAction(LLInventoryModel* model, std::string action) else if(item && item->isFinished()) { // must be in library. copy it to our inventory and put it on. - LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0); + LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, (LLViewerJointAttachment*)0)); copy_inventory_item( gAgent.getID(), item->getPermissions().getOwner(), @@ -5253,11 +5251,7 @@ void LLObjectBridge::performAction(LLInventoryModel* model, std::string action) } else if (isRemoveAction(action)) { - LLInventoryItem* item = gInventory.getItem(mUUID); - if(item) - { - LLVOAvatarSelf::detachAttachmentIntoInventory(item->getLinkedUUID()); - } + LLAppearanceMgr::instance().removeItemFromAvatar(mUUID); } else LLItemBridge::performAction(model, action); } @@ -5549,120 +5543,6 @@ LLWearableBridge::LLWearableBridge(LLInventoryPanel* inventory, mInvType = inv_type; } -void remove_inventory_category_from_avatar( LLInventoryCategory* category ) -{ - if(!category) return; - lldebugs << "remove_inventory_category_from_avatar( " << category->getName() - << " )" << llendl; - - - if (gAgentCamera.cameraCustomizeAvatar()) - { - // switching to outfit editor should automagically save any currently edited wearable - LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit")); - } - - remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() ); -} - -struct OnRemoveStruct -{ - LLUUID mUUID; - OnRemoveStruct(const LLUUID& uuid): - mUUID(uuid) - { - } -}; - -void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id) -{ - - // Find all the wearables that are in the category's subtree. - lldebugs << "remove_inventory_category_from_avatar_step2()" << llendl; - if(proceed) - { - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - LLFindWearables is_wearable; - gInventory.collectDescendentsIf(category_id, - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_wearable); - S32 i; - S32 wearable_count = item_array.count(); - - LLInventoryModel::cat_array_t obj_cat_array; - LLInventoryModel::item_array_t obj_item_array; - LLIsType is_object( LLAssetType::AT_OBJECT ); - gInventory.collectDescendentsIf(category_id, - obj_cat_array, - obj_item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_object); - S32 obj_count = obj_item_array.count(); - - // Find all gestures in this folder - LLInventoryModel::cat_array_t gest_cat_array; - LLInventoryModel::item_array_t gest_item_array; - LLIsType is_gesture( LLAssetType::AT_GESTURE ); - gInventory.collectDescendentsIf(category_id, - gest_cat_array, - gest_item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_gesture); - S32 gest_count = gest_item_array.count(); - - if (wearable_count > 0) //Loop through wearables. If worn, remove. - { - for(i = 0; i < wearable_count; ++i) - { - LLViewerInventoryItem *item = item_array.get(i); - if (item->getType() == LLAssetType::AT_BODYPART) - continue; - if (gAgent.isTeen() && item->isWearableType() && - (item->getWearableType() == LLWearableType::WT_UNDERPANTS || item->getWearableType() == LLWearableType::WT_UNDERSHIRT)) - continue; - if (get_is_item_worn(item->getUUID())) - { - LLWearableList::instance().getAsset(item->getAssetUUID(), - item->getName(), - item->getType(), - LLWearableBridge::onRemoveFromAvatarArrived, - new OnRemoveStruct(item->getLinkedUUID())); - } - } - } - - if (obj_count > 0) - { - for(i = 0; i < obj_count; ++i) - { - LLViewerInventoryItem *obj_item = obj_item_array.get(i); - if (get_is_item_worn(obj_item->getUUID())) - { - LLVOAvatarSelf::detachAttachmentIntoInventory(obj_item->getLinkedUUID()); - } - } - } - - if (gest_count > 0) - { - for(i = 0; i < gest_count; ++i) - { - LLViewerInventoryItem *gest_item = gest_item_array.get(i); - if (get_is_item_worn(gest_item->getUUID())) - { - LLGestureMgr::instance().deactivateGesture( gest_item->getLinkedUUID() ); - gInventory.updateItem( gest_item ); - gInventory.notifyObservers(); - } - - } - } - } -} - BOOL LLWearableBridge::renameItem(const std::string& new_name) { if (get_is_item_worn(mUUID)) @@ -5873,7 +5753,7 @@ void LLWearableBridge::wearAddOnAvatar() } // static -void LLWearableBridge::onWearOnAvatarArrived( LLWearable* wearable, void* userdata ) +void LLWearableBridge::onWearOnAvatarArrived( LLViewerWearable* wearable, void* userdata ) { LLUUID* item_id = (LLUUID*) userdata; if(wearable) @@ -5899,7 +5779,7 @@ void LLWearableBridge::onWearOnAvatarArrived( LLWearable* wearable, void* userda // static // BAP remove the "add" code path once everything is fully COF-ified. -void LLWearableBridge::onWearAddOnAvatarArrived( LLWearable* wearable, void* userdata ) +void LLWearableBridge::onWearAddOnAvatarArrived( LLViewerWearable* wearable, void* userdata ) { LLUUID* item_id = (LLUUID*) userdata; if(wearable) @@ -5959,95 +5839,12 @@ BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data) return FALSE; } -// static -void LLWearableBridge::onRemoveFromAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if(!self) return; - if(get_is_item_worn(self->mUUID)) - { - LLViewerInventoryItem* item = self->getItem(); - if (item) - { - LLUUID parent_id = item->getParentUUID(); - LLWearableList::instance().getAsset(item->getAssetUUID(), - item->getName(), - item->getType(), - onRemoveFromAvatarArrived, - new OnRemoveStruct(LLUUID(self->mUUID))); - } - } -} - -// static -void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable, - void* userdata) -{ - OnRemoveStruct *on_remove_struct = (OnRemoveStruct*) userdata; - const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID); - if(wearable) - { - if( get_is_item_worn( item_id ) ) - { - LLWearableType::EType type = wearable->getType(); - - if( !(type==LLWearableType::WT_SHAPE || type==LLWearableType::WT_SKIN || type==LLWearableType::WT_HAIR || type==LLWearableType::WT_EYES ) ) //&& - //!((!gAgent.isTeen()) && ( type==LLWearableType::WT_UNDERPANTS || type==LLWearableType::WT_UNDERSHIRT )) ) - { - bool do_remove_all = false; - U32 index = gAgentWearables.getWearableIndex(wearable); - gAgentWearables.removeWearable( type, do_remove_all, index ); - } - } - } - - // Find and remove this item from the COF. - LLAppearanceMgr::instance().removeCOFItemLinks(item_id,false); - gInventory.notifyObservers(); - - delete on_remove_struct; -} - -// static -void LLWearableBridge::removeAllClothesFromAvatar() -{ - // Fetch worn clothes (i.e. the ones in COF). - LLInventoryModel::item_array_t clothing_items; - LLInventoryModel::cat_array_t dummy; - LLIsType is_clothing(LLAssetType::AT_CLOTHING); - gInventory.collectDescendentsIf(LLAppearanceMgr::instance().getCOF(), - dummy, - clothing_items, - LLInventoryModel::EXCLUDE_TRASH, - is_clothing, - false); - - // Take them off by removing from COF. - for (LLInventoryModel::item_array_t::const_iterator it = clothing_items.begin(); it != clothing_items.end(); ++it) - { - LLAppearanceMgr::instance().removeItemFromAvatar((*it)->getUUID()); - } -} - -// static -void LLWearableBridge::removeItemFromAvatar(LLViewerInventoryItem *item) -{ - if (item) - { - LLWearableList::instance().getAsset(item->getAssetUUID(), - item->getName(), - item->getType(), - LLWearableBridge::onRemoveFromAvatarArrived, - new OnRemoveStruct(item->getUUID())); - } -} - void LLWearableBridge::removeFromAvatar() { + llwarns << "safe to remove?" << llendl; if (get_is_item_worn(mUUID)) { - LLViewerInventoryItem* item = getItem(); - removeItemFromAvatar(item); + LLAppearanceMgr::instance().removeItemFromAvatar(mUUID); } } diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 5c6cf0f0f0..517153e171 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -34,7 +34,7 @@ #include "llinventoryobserver.h" #include "llinventorypanel.h" #include "llviewercontrol.h" -#include "llwearable.h" +#include "llviewerwearable.h" #include "lltooldraganddrop.h" class LLInventoryFilter; @@ -509,10 +509,10 @@ public: static void onWearOnAvatar( void* userdata ); // Access to wearOnAvatar() from menu static BOOL canWearOnAvatar( void* userdata ); - static void onWearOnAvatarArrived( LLWearable* wearable, void* userdata ); + static void onWearOnAvatarArrived( LLViewerWearable* wearable, void* userdata ); void wearOnAvatar(); - static void onWearAddOnAvatarArrived( LLWearable* wearable, void* userdata ); + static void onWearAddOnAvatarArrived( LLViewerWearable* wearable, void* userdata ); void wearAddOnAvatar(); static BOOL canEditOnAvatar( void* userdata ); // Access to editOnAvatar() from menu @@ -520,9 +520,6 @@ public: void editOnAvatar(); static BOOL canRemoveFromAvatar( void* userdata ); - static void onRemoveFromAvatar( void* userdata ); - static void onRemoveFromAvatarArrived( LLWearable* wearable, void* userdata ); - static void removeItemFromAvatar(LLViewerInventoryItem *item); static void removeAllClothesFromAvatar(); void removeFromAvatar(); protected: diff --git a/indra/newview/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp index 34734d57c5..02a2475cfd 100644 --- a/indra/newview/llinventoryicon.cpp +++ b/indra/newview/llinventoryicon.cpp @@ -25,6 +25,8 @@ */ #include "llviewerprecompiledheaders.h" + +#include "linden_common.h" #include "llinventoryicon.h" #include "lldictionary.h" @@ -41,7 +43,7 @@ struct IconEntry : public LLDictionaryEntry }; class LLIconDictionary : public LLSingleton<LLIconDictionary>, - public LLDictionary<LLInventoryIcon::EIconName, IconEntry> + public LLDictionary<LLInventoryType::EIconName, IconEntry> { public: LLIconDictionary(); @@ -49,48 +51,48 @@ public: LLIconDictionary::LLIconDictionary() { - addEntry(LLInventoryIcon::ICONNAME_TEXTURE, new IconEntry("Inv_Texture")); - addEntry(LLInventoryIcon::ICONNAME_SOUND, new IconEntry("Inv_Sound")); - addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_ONLINE, new IconEntry("Inv_CallingCard")); - addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_OFFLINE, new IconEntry("Inv_CallingCard")); - addEntry(LLInventoryIcon::ICONNAME_LANDMARK, new IconEntry("Inv_Landmark")); - addEntry(LLInventoryIcon::ICONNAME_LANDMARK_VISITED, new IconEntry("Inv_Landmark")); - addEntry(LLInventoryIcon::ICONNAME_SCRIPT, new IconEntry("Inv_Script")); - addEntry(LLInventoryIcon::ICONNAME_CLOTHING, new IconEntry("Inv_Clothing")); - addEntry(LLInventoryIcon::ICONNAME_OBJECT, new IconEntry("Inv_Object")); - addEntry(LLInventoryIcon::ICONNAME_OBJECT_MULTI, new IconEntry("Inv_Object_Multi")); - addEntry(LLInventoryIcon::ICONNAME_NOTECARD, new IconEntry("Inv_Notecard")); - addEntry(LLInventoryIcon::ICONNAME_BODYPART, new IconEntry("Inv_Skin")); - addEntry(LLInventoryIcon::ICONNAME_SNAPSHOT, new IconEntry("Inv_Snapshot")); - - addEntry(LLInventoryIcon::ICONNAME_BODYPART_SHAPE, new IconEntry("Inv_BodyShape")); - addEntry(LLInventoryIcon::ICONNAME_BODYPART_SKIN, new IconEntry("Inv_Skin")); - addEntry(LLInventoryIcon::ICONNAME_BODYPART_HAIR, new IconEntry("Inv_Hair")); - addEntry(LLInventoryIcon::ICONNAME_BODYPART_EYES, new IconEntry("Inv_Eye")); - - addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SHIRT, new IconEntry("Inv_Shirt")); - addEntry(LLInventoryIcon::ICONNAME_CLOTHING_PANTS, new IconEntry("Inv_Pants")); - addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SHOES, new IconEntry("Inv_Shoe")); - addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SOCKS, new IconEntry("Inv_Socks")); - addEntry(LLInventoryIcon::ICONNAME_CLOTHING_JACKET, new IconEntry("Inv_Jacket")); - addEntry(LLInventoryIcon::ICONNAME_CLOTHING_GLOVES, new IconEntry("Inv_Gloves")); - addEntry(LLInventoryIcon::ICONNAME_CLOTHING_UNDERSHIRT, new IconEntry("Inv_Undershirt")); - addEntry(LLInventoryIcon::ICONNAME_CLOTHING_UNDERPANTS, new IconEntry("Inv_Underpants")); - addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SKIRT, new IconEntry("Inv_Skirt")); - addEntry(LLInventoryIcon::ICONNAME_CLOTHING_ALPHA, new IconEntry("Inv_Alpha")); - addEntry(LLInventoryIcon::ICONNAME_CLOTHING_TATTOO, new IconEntry("Inv_Tattoo")); - addEntry(LLInventoryIcon::ICONNAME_ANIMATION, new IconEntry("Inv_Animation")); - addEntry(LLInventoryIcon::ICONNAME_GESTURE, new IconEntry("Inv_Gesture")); - - addEntry(LLInventoryIcon::ICONNAME_CLOTHING_PHYSICS, new IconEntry("Inv_Physics")); - - addEntry(LLInventoryIcon::ICONNAME_LINKITEM, new IconEntry("Inv_LinkItem")); - addEntry(LLInventoryIcon::ICONNAME_LINKFOLDER, new IconEntry("Inv_LinkFolder")); - addEntry(LLInventoryIcon::ICONNAME_MESH, new IconEntry("Inv_Mesh")); - - addEntry(LLInventoryIcon::ICONNAME_INVALID, new IconEntry("Inv_Invalid")); - - addEntry(LLInventoryIcon::ICONNAME_NONE, new IconEntry("NONE")); + addEntry(LLInventoryType::ICONNAME_TEXTURE, new IconEntry("Inv_Texture")); + addEntry(LLInventoryType::ICONNAME_SOUND, new IconEntry("Inv_Sound")); + addEntry(LLInventoryType::ICONNAME_CALLINGCARD_ONLINE, new IconEntry("Inv_CallingCard")); + addEntry(LLInventoryType::ICONNAME_CALLINGCARD_OFFLINE, new IconEntry("Inv_CallingCard")); + addEntry(LLInventoryType::ICONNAME_LANDMARK, new IconEntry("Inv_Landmark")); + addEntry(LLInventoryType::ICONNAME_LANDMARK_VISITED, new IconEntry("Inv_Landmark")); + addEntry(LLInventoryType::ICONNAME_SCRIPT, new IconEntry("Inv_Script")); + addEntry(LLInventoryType::ICONNAME_CLOTHING, new IconEntry("Inv_Clothing")); + addEntry(LLInventoryType::ICONNAME_OBJECT, new IconEntry("Inv_Object")); + addEntry(LLInventoryType::ICONNAME_OBJECT_MULTI, new IconEntry("Inv_Object_Multi")); + addEntry(LLInventoryType::ICONNAME_NOTECARD, new IconEntry("Inv_Notecard")); + addEntry(LLInventoryType::ICONNAME_BODYPART, new IconEntry("Inv_Skin")); + addEntry(LLInventoryType::ICONNAME_SNAPSHOT, new IconEntry("Inv_Snapshot")); + + addEntry(LLInventoryType::ICONNAME_BODYPART_SHAPE, new IconEntry("Inv_BodyShape")); + addEntry(LLInventoryType::ICONNAME_BODYPART_SKIN, new IconEntry("Inv_Skin")); + addEntry(LLInventoryType::ICONNAME_BODYPART_HAIR, new IconEntry("Inv_Hair")); + addEntry(LLInventoryType::ICONNAME_BODYPART_EYES, new IconEntry("Inv_Eye")); + + addEntry(LLInventoryType::ICONNAME_CLOTHING_SHIRT, new IconEntry("Inv_Shirt")); + addEntry(LLInventoryType::ICONNAME_CLOTHING_PANTS, new IconEntry("Inv_Pants")); + addEntry(LLInventoryType::ICONNAME_CLOTHING_SHOES, new IconEntry("Inv_Shoe")); + addEntry(LLInventoryType::ICONNAME_CLOTHING_SOCKS, new IconEntry("Inv_Socks")); + addEntry(LLInventoryType::ICONNAME_CLOTHING_JACKET, new IconEntry("Inv_Jacket")); + addEntry(LLInventoryType::ICONNAME_CLOTHING_GLOVES, new IconEntry("Inv_Gloves")); + addEntry(LLInventoryType::ICONNAME_CLOTHING_UNDERSHIRT, new IconEntry("Inv_Undershirt")); + addEntry(LLInventoryType::ICONNAME_CLOTHING_UNDERPANTS, new IconEntry("Inv_Underpants")); + addEntry(LLInventoryType::ICONNAME_CLOTHING_SKIRT, new IconEntry("Inv_Skirt")); + addEntry(LLInventoryType::ICONNAME_CLOTHING_ALPHA, new IconEntry("Inv_Alpha")); + addEntry(LLInventoryType::ICONNAME_CLOTHING_TATTOO, new IconEntry("Inv_Tattoo")); + addEntry(LLInventoryType::ICONNAME_ANIMATION, new IconEntry("Inv_Animation")); + addEntry(LLInventoryType::ICONNAME_GESTURE, new IconEntry("Inv_Gesture")); + + addEntry(LLInventoryType::ICONNAME_CLOTHING_PHYSICS, new IconEntry("Inv_Physics")); + + addEntry(LLInventoryType::ICONNAME_LINKITEM, new IconEntry("Inv_LinkItem")); + addEntry(LLInventoryType::ICONNAME_LINKFOLDER, new IconEntry("Inv_LinkFolder")); + addEntry(LLInventoryType::ICONNAME_MESH, new IconEntry("Inv_Mesh")); + + addEntry(LLInventoryType::ICONNAME_INVALID, new IconEntry("Inv_Invalid")); + + addEntry(LLInventoryType::ICONNAME_NONE, new IconEntry("NONE")); } LLUIImagePtr LLInventoryIcon::getIcon(LLAssetType::EType asset_type, @@ -102,7 +104,7 @@ LLUIImagePtr LLInventoryIcon::getIcon(LLAssetType::EType asset_type, return LLUI::getUIImage(icon_name); } -LLUIImagePtr LLInventoryIcon::getIcon(EIconName idx) +LLUIImagePtr LLInventoryIcon::getIcon(LLInventoryType::EIconName idx) { return LLUI::getUIImage(getIconName(idx)); } @@ -112,56 +114,56 @@ const std::string& LLInventoryIcon::getIconName(LLAssetType::EType asset_type, U32 misc_flag, BOOL item_is_multi) { - EIconName idx = ICONNAME_OBJECT; + LLInventoryType::EIconName idx = LLInventoryType::ICONNAME_OBJECT; if (item_is_multi) { - idx = ICONNAME_OBJECT_MULTI; + idx = LLInventoryType::ICONNAME_OBJECT_MULTI; return getIconName(idx); } switch(asset_type) { case LLAssetType::AT_TEXTURE: - idx = (inventory_type == LLInventoryType::IT_SNAPSHOT) ? ICONNAME_SNAPSHOT : ICONNAME_TEXTURE; + idx = (inventory_type == LLInventoryType::IT_SNAPSHOT) ? LLInventoryType::ICONNAME_SNAPSHOT : LLInventoryType::ICONNAME_TEXTURE; break; case LLAssetType::AT_SOUND: - idx = ICONNAME_SOUND; + idx = LLInventoryType::ICONNAME_SOUND; break; case LLAssetType::AT_CALLINGCARD: - idx = (misc_flag != 0) ? ICONNAME_CALLINGCARD_ONLINE : ICONNAME_CALLINGCARD_OFFLINE; + idx = (misc_flag != 0) ? LLInventoryType::ICONNAME_CALLINGCARD_ONLINE : LLInventoryType::ICONNAME_CALLINGCARD_OFFLINE; break; case LLAssetType::AT_LANDMARK: - idx = (misc_flag != 0) ? ICONNAME_LANDMARK_VISITED : ICONNAME_LANDMARK; + idx = (misc_flag != 0) ? LLInventoryType::ICONNAME_LANDMARK_VISITED : LLInventoryType::ICONNAME_LANDMARK; break; case LLAssetType::AT_SCRIPT: case LLAssetType::AT_LSL_TEXT: case LLAssetType::AT_LSL_BYTECODE: - idx = ICONNAME_SCRIPT; + idx = LLInventoryType::ICONNAME_SCRIPT; break; case LLAssetType::AT_CLOTHING: case LLAssetType::AT_BODYPART: idx = assignWearableIcon(misc_flag); break; case LLAssetType::AT_NOTECARD: - idx = ICONNAME_NOTECARD; + idx = LLInventoryType::ICONNAME_NOTECARD; break; case LLAssetType::AT_ANIMATION: - idx = ICONNAME_ANIMATION; + idx = LLInventoryType::ICONNAME_ANIMATION; break; case LLAssetType::AT_GESTURE: - idx = ICONNAME_GESTURE; + idx = LLInventoryType::ICONNAME_GESTURE; break; case LLAssetType::AT_LINK: - idx = ICONNAME_LINKITEM; + idx = LLInventoryType::ICONNAME_LINKITEM; break; case LLAssetType::AT_LINK_FOLDER: - idx = ICONNAME_LINKFOLDER; + idx = LLInventoryType::ICONNAME_LINKFOLDER; break; case LLAssetType::AT_OBJECT: - idx = ICONNAME_OBJECT; + idx = LLInventoryType::ICONNAME_OBJECT; break; case LLAssetType::AT_MESH: - idx = ICONNAME_MESH; + idx = LLInventoryType::ICONNAME_MESH; default: break; } @@ -170,13 +172,13 @@ const std::string& LLInventoryIcon::getIconName(LLAssetType::EType asset_type, } -const std::string& LLInventoryIcon::getIconName(EIconName idx) +const std::string& LLInventoryIcon::getIconName(LLInventoryType::EIconName idx) { const IconEntry *entry = LLIconDictionary::instance().lookup(idx); return entry->mName; } -LLInventoryIcon::EIconName LLInventoryIcon::assignWearableIcon(U32 misc_flag) +LLInventoryType::EIconName LLInventoryIcon::assignWearableIcon(U32 misc_flag) { const LLWearableType::EType wearable_type = LLWearableType::EType(LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK & misc_flag); return LLWearableType::getIconName(wearable_type); diff --git a/indra/newview/llinventoryicon.h b/indra/newview/llinventoryicon.h index 5c8acf9e85..2197c53bb8 100644 --- a/indra/newview/llinventoryicon.h +++ b/indra/newview/llinventoryicon.h @@ -35,66 +35,20 @@ class LLInventoryIcon { public: - enum EIconName - { - ICONNAME_TEXTURE, - ICONNAME_SOUND, - ICONNAME_CALLINGCARD_ONLINE, - ICONNAME_CALLINGCARD_OFFLINE, - ICONNAME_LANDMARK, - ICONNAME_LANDMARK_VISITED, - ICONNAME_SCRIPT, - ICONNAME_CLOTHING, - ICONNAME_OBJECT, - ICONNAME_OBJECT_MULTI, - ICONNAME_NOTECARD, - ICONNAME_BODYPART, - ICONNAME_SNAPSHOT, - - ICONNAME_BODYPART_SHAPE, - ICONNAME_BODYPART_SKIN, - ICONNAME_BODYPART_HAIR, - ICONNAME_BODYPART_EYES, - ICONNAME_CLOTHING_SHIRT, - ICONNAME_CLOTHING_PANTS, - ICONNAME_CLOTHING_SHOES, - ICONNAME_CLOTHING_SOCKS, - ICONNAME_CLOTHING_JACKET, - ICONNAME_CLOTHING_GLOVES, - ICONNAME_CLOTHING_UNDERSHIRT, - ICONNAME_CLOTHING_UNDERPANTS, - ICONNAME_CLOTHING_SKIRT, - ICONNAME_CLOTHING_ALPHA, - ICONNAME_CLOTHING_TATTOO, - - ICONNAME_ANIMATION, - ICONNAME_GESTURE, - - ICONNAME_CLOTHING_PHYSICS, - - ICONNAME_LINKITEM, - ICONNAME_LINKFOLDER, - ICONNAME_MESH, - - ICONNAME_INVALID, - ICONNAME_COUNT, - ICONNAME_NONE = -1 - }; - static const std::string& getIconName(LLAssetType::EType asset_type, LLInventoryType::EType inventory_type = LLInventoryType::IT_NONE, U32 misc_flag = 0, // different meanings depending on item type BOOL item_is_multi = FALSE); - static const std::string& getIconName(EIconName idx); + static const std::string& getIconName(LLInventoryType::EIconName idx); static LLUIImagePtr getIcon(LLAssetType::EType asset_type, LLInventoryType::EType inventory_type = LLInventoryType::IT_NONE, U32 misc_flag = 0, // different meanings depending on item type BOOL item_is_multi = FALSE); - static LLUIImagePtr getIcon(EIconName idx); + static LLUIImagePtr getIcon(LLInventoryType::EIconName idx); protected: - static EIconName assignWearableIcon(U32 misc_flag); + static LLInventoryType::EIconName assignWearableIcon(U32 misc_flag); }; #endif // LL_LLINVENTORYICON_H diff --git a/indra/newview/llinventorylistitem.cpp b/indra/newview/llinventorylistitem.cpp index 3e0849a795..0601796436 100644 --- a/indra/newview/llinventorylistitem.cpp +++ b/indra/newview/llinventorylistitem.cpp @@ -37,6 +37,7 @@ #include "lltextutil.h" // newview +#include "llinventoryicon.h" #include "llinventorymodel.h" #include "llviewerinventory.h" @@ -230,7 +231,7 @@ const std::string& LLPanelInventoryListItemBase::getDescription() const { return LLStringUtil::null; } - return inv_item->getDescription(); + return inv_item->getActualDescription(); } time_t LLPanelInventoryListItemBase::getCreationDate() const diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index e7d59d92d9..935fe2b4d0 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -460,9 +460,10 @@ public: { } - virtual void error(U32 status, const std::string& reason) + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - LL_WARNS("InvAPI") << "CreateInventoryCategory failed. status = " << status << ", reasion = \"" << reason << "\"" << LL_ENDL; + LL_WARNS("InvAPI") << "CreateInventoryCategory failed [status:" + << status << "]: " << content << LL_ENDL; } virtual void result(const LLSD& content) @@ -1410,7 +1411,6 @@ void LLInventoryModel::fetchInventoryResponder::result(const LLSD& content) item_array_t items; update_map_t update; S32 count = content["items"].size(); - bool all_one_folder = true; LLUUID folder_id; // Does this loop ever execute more than once? for(S32 i = 0; i < count; ++i) @@ -1443,10 +1443,6 @@ void LLInventoryModel::fetchInventoryResponder::result(const LLSD& content) { folder_id = titem->getParentUUID(); } - else - { - all_one_folder = false; - } } U32 changes = 0x0; @@ -1460,10 +1456,9 @@ void LLInventoryModel::fetchInventoryResponder::result(const LLSD& content) } //If we get back an error (not found, etc...), handle it here -void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::string& reason) +void LLInventoryModel::fetchInventoryResponder::errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - llinfos << "fetchInventory::error " - << status << ": " << reason << llendl; + llwarns << "fetchInventory error [status:" << status << "]: " << content << llendl; gInventory.notifyObservers(); } @@ -1996,8 +1991,9 @@ bool LLInventoryModel::loadSkeleton( { LLViewerInventoryCategory* cat = (*invalid_cat_it).get(); cat->setVersion(NO_VERSION); - llinfos << "Invalidating category name: " << cat->getName() << " UUID: " << cat->getUUID() << " due to invalid descendents cache" << llendl; + LL_DEBUGS("Inventory") << "Invalidating category name: " << cat->getName() << " UUID: " << cat->getUUID() << " due to invalid descendents cache" << llendl; } + LL_INFOS("Inventory") << "Invalidated " << invalid_categories.size() << " categories due to invalid descendents cache" << llendl; // At this point, we need to set the known descendents for each // category which successfully cached so that we do not @@ -2534,7 +2530,6 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account) item_array_t items; update_map_t update; S32 count = msg->getNumberOfBlocksFast(_PREHASH_InventoryData); - bool all_one_folder = true; LLUUID folder_id; // Does this loop ever execute more than once? for(S32 i = 0; i < count; ++i) @@ -2566,10 +2561,6 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account) { folder_id = titem->getParentUUID(); } - else - { - all_one_folder = false; - } } if(account) { @@ -3295,8 +3286,71 @@ void LLInventoryModel::updateItemsOrder(LLInventoryModel::item_array_t& items, c } } +//* @param[in] items vector of items in order to be saved. +/* +void LLInventoryModel::saveItemsOrder(const LLInventoryModel::item_array_t& items) +{ + int sortField = 0; + + // current order is saved by setting incremental values (1, 2, 3, ...) for the sort field + for (item_array_t::const_iterator i = items.begin(); i != items.end(); ++i) + { + LLViewerInventoryItem* item = *i; + + item->setSortField(++sortField); + item->setComplete(TRUE); + item->updateServer(FALSE); + + updateItem(item); + // Tell the parent folder to refresh its sort order. + addChangedMask(LLInventoryObserver::SORT, item->getParentUUID()); + } + notifyObservers(); +} +*/ +// See also LLInventorySort where landmarks in the Favorites folder are sorted. +class LLViewerInventoryItemSort +{ +public: + bool operator()(const LLPointer<LLViewerInventoryItem>& a, const LLPointer<LLViewerInventoryItem>& b) + { + return a->getSortField() < b->getSortField(); + } +}; + +/** + * Sorts passed items by LLViewerInventoryItem sort field. + * + * @param[in, out] items - array of items, not sorted. + */ +//static void rearrange_item_order_by_sort_field(LLInventoryModel::item_array_t& items) +//{ +// static LLViewerInventoryItemSort sort_functor; +// std::sort(items.begin(), items.end(), sort_functor); +//} + +// * @param source_item_id - LLUUID of the source item to be moved into new position +// * @param target_item_id - LLUUID of the target item before which source item should be placed. +/* +void LLInventoryModel::rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id) +{ + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLIsType is_type(LLAssetType::AT_LANDMARK); + LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); + gInventory.collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); + + // ensure items are sorted properly before changing order. EXT-3498 + rearrange_item_order_by_sort_field(items); + + // update order + updateItemsOrder(items, source_item_id, target_item_id); + + saveItemsOrder(items); +} +*/ //---------------------------------------------------------------------------- // *NOTE: DEBUG functionality diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index 503de627a0..8aac879a93 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -84,7 +84,7 @@ public: public: fetchInventoryResponder(const LLSD& request_sd) : mRequestSD(request_sd) {}; void result(const LLSD& content); - void error(U32 status, const std::string& reason); + void errorWithContent(U32 status, const std::string& reason, const LLSD& content); protected: LLSD mRequestSD; }; @@ -231,7 +231,8 @@ public: // Returns the uuid of the category that specifies 'type' as what it // defaults to containing. The category is not necessarily only for that type. // NOTE: If create_folder is true, this will create a new inventory category - // on the fly if one does not exist. + // on the fly if one does not exist. *NOTE: if find_in_library is true it + // will search in the user's library folder instead of "My Inventory" const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder = true); // will search in the user's library folder instead of "My Inventory" @@ -363,6 +364,12 @@ public: // Returns end() of the vector if not found. static LLInventoryModel::item_array_t::iterator findItemIterByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id); + + // Rearranges Landmarks inside Favorites folder. + // Moves source landmark before target one. + void rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id); + //void saveItemsOrder(const LLInventoryModel::item_array_t& items); + //-------------------------------------------------------------------- // Creation //-------------------------------------------------------------------- diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index f4d0110b0f..d88e0c3192 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -183,7 +183,7 @@ void LLInventoryModelBackgroundFetch::backgroundFetchCB(void *) void LLInventoryModelBackgroundFetch::backgroundFetch() { - if (mBackgroundFetchActive && gAgent.getRegion()) + if (mBackgroundFetchActive && gAgent.getRegion() && gAgent.getRegion()->capabilitiesReceived()) { // If we'll be using the capability, we'll be sending batches and the background thing isn't as important. if (gSavedSettings.getBOOL("UseHTTPInventory")) @@ -366,7 +366,7 @@ class LLInventoryModelFetchItemResponder : public LLInventoryModel::fetchInvento public: LLInventoryModelFetchItemResponder(const LLSD& request_sd) : LLInventoryModel::fetchInventoryResponder(request_sd) {}; void result(const LLSD& content); - void error(U32 status, const std::string& reason); + void errorWithContent(U32 status, const std::string& reason, const LLSD& content); }; void LLInventoryModelFetchItemResponder::result( const LLSD& content ) @@ -375,9 +375,9 @@ void LLInventoryModelFetchItemResponder::result( const LLSD& content ) LLInventoryModelBackgroundFetch::instance().incrFetchCount(-1); } -void LLInventoryModelFetchItemResponder::error( U32 status, const std::string& reason ) +void LLInventoryModelFetchItemResponder::errorWithContent( U32 status, const std::string& reason, const LLSD& content ) { - LLInventoryModel::fetchInventoryResponder::error(status, reason); + LLInventoryModel::fetchInventoryResponder::errorWithContent(status, reason, content); LLInventoryModelBackgroundFetch::instance().incrFetchCount(-1); } @@ -391,7 +391,7 @@ public: {}; //LLInventoryModelFetchDescendentsResponder() {}; void result(const LLSD& content); - void error(U32 status, const std::string& reason); + void errorWithContent(U32 status, const std::string& reason, const LLSD& content); protected: BOOL getIsRecursive(const LLUUID& cat_id) const; private: @@ -529,12 +529,12 @@ void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content) } // If we get back an error (not found, etc...), handle it here. -void LLInventoryModelFetchDescendentsResponder::error(U32 status, const std::string& reason) +void LLInventoryModelFetchDescendentsResponder::errorWithContent(U32 status, const std::string& reason, const LLSD& content) { LLInventoryModelBackgroundFetch *fetcher = LLInventoryModelBackgroundFetch::getInstance(); - llinfos << "LLInventoryModelFetchDescendentsResponder::error " - << status << ": " << reason << llendl; + llinfos << "LLInventoryModelFetchDescendentsResponder::error [status:" + << status << "]: " << content << llendl; fetcher->incrFetchCount(-1); @@ -564,7 +564,6 @@ BOOL LLInventoryModelFetchDescendentsResponder::getIsRecursive(const LLUUID& cat { return (std::find(mRecursiveCatUUIDs.begin(),mRecursiveCatUUIDs.end(), cat_id) != mRecursiveCatUUIDs.end()); } - // Bundle up a bunch of requests to send all at once. // static void LLInventoryModelBackgroundFetch::bulkFetch() @@ -688,6 +687,8 @@ void LLInventoryModelBackgroundFetch::bulkFetch() if (folder_count) { std::string url = region->getCapability("FetchInventoryDescendents2"); + if ( !url.empty() ) + { mFetchCount++; if (folder_request_body["folders"].size()) { @@ -702,6 +703,7 @@ void LLInventoryModelBackgroundFetch::bulkFetch() LLHTTPClient::post(url_lib, folder_request_body_lib, fetcher, 300.0); } } + } if (item_count) { std::string url; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index fabcd50c7d..cf1fd4c0d0 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -401,8 +401,6 @@ void LLInventoryPanel::modelChanged(U32 mask) static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh"); LLFastTimer t2(FTM_REFRESH); - bool handled = false; - if (!mViewsInitialized) return; const LLInventoryModel* model = getModel(); @@ -437,7 +435,6 @@ void LLInventoryPanel::modelChanged(U32 mask) // Empty out the display name for relabel. if (mask & LLInventoryObserver::LABEL) { - handled = true; if (view_item) { // Request refresh on this item (also flags for filtering) @@ -456,7 +453,6 @@ void LLInventoryPanel::modelChanged(U32 mask) // Destroy and regenerate the UI. if (mask & LLInventoryObserver::REBUILD) { - handled = true; if (model_item && view_item && viewmodel_item) { const LLUUID& idp = viewmodel_item->getUUID(); @@ -500,8 +496,6 @@ void LLInventoryPanel::modelChanged(U32 mask) LLInventoryObserver::ADD | LLInventoryObserver::REMOVE)) { - handled = true; - ////////////////////////////// // ADD Operation // Item exists in memory but a UI element hasn't been created for it. diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp index 6f213e018a..1f2b9904eb 100644 --- a/indra/newview/lllocalbitmaps.cpp +++ b/indra/newview/lllocalbitmaps.cpp @@ -53,7 +53,7 @@ #include "llviewerobject.h" #include "llface.h" #include "llvoavatarself.h" -#include "llwearable.h" +#include "llviewerwearable.h" #include "llagentwearables.h" #include "lltexlayerparams.h" #include "llvovolume.h" @@ -195,7 +195,7 @@ bool LLLocalBitmap::updateSelf(EUpdateType optional_firstupdate) mLastModified = new_last_modified; LLPointer<LLViewerFetchedTexture> texture = new LLViewerFetchedTexture - ("file://"+mFilename, mWorldID, LL_LOCAL_USE_MIPMAPS); + ("file://"+mFilename, FTT_LOCAL_FILE, mWorldID, LL_LOCAL_USE_MIPMAPS); texture->createGLTexture(LL_LOCAL_DISCARD_LEVEL, raw_image); texture->setCachedRawImage(LL_LOCAL_DISCARD_LEVEL, raw_image); @@ -439,8 +439,8 @@ void LLLocalBitmap::updateUserPrims(LLUUID old_id, LLUUID new_id) LLFace* face = object->mDrawable->getFace(face_iter); if (face && face->getTexture() && face->getTexture()->getID() == old_id) { - object->setTEImage(face_iter, LLViewerTextureManager::getFetchedTexture - (new_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); + object->setTEImage(face_iter, LLViewerTextureManager::getFetchedTexture( + new_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); update_obj = true; } @@ -483,7 +483,7 @@ void LLLocalBitmap::updateUserLayers(LLUUID old_id, LLUUID new_id, LLWearableTyp U32 count = gAgentWearables.getWearableCount(type); for(U32 wearable_iter = 0; wearable_iter < count; wearable_iter++) { - LLWearable* wearable = gAgentWearables.getWearable(type, wearable_iter); + LLViewerWearable* wearable = gAgentWearables.getViewerWearable(type, wearable_iter); if (wearable) { std::vector<LLLocalTextureObject*> texture_list = wearable->getLocalTextureListSeq(); @@ -495,11 +495,11 @@ void LLLocalBitmap::updateUserLayers(LLUUID old_id, LLUUID new_id, LLWearableTyp if (lto && lto->getID() == old_id) { U32 local_texlayer_index = 0; /* can't keep that as static const, gives errors, so i'm leaving this var here */ - LLVOAvatarDefines::EBakedTextureIndex baked_texind = + LLAvatarAppearanceDefines::EBakedTextureIndex baked_texind = lto->getTexLayer(local_texlayer_index)->getTexLayerSet()->getBakedTexIndex(); - LLVOAvatarDefines::ETextureIndex reg_texind = getTexIndex(type, baked_texind); - if (reg_texind != LLVOAvatarDefines::TEX_NUM_INDICES) + LLAvatarAppearanceDefines::ETextureIndex reg_texind = getTexIndex(type, baked_texind); + if (reg_texind != LLAvatarAppearanceDefines::TEX_NUM_INDICES) { U32 index = gAgentWearables.getWearableIndex(wearable); gAgentAvatarp->setLocalTexture(reg_texind, gTextureList.getImage(new_id), FALSE, index); @@ -515,10 +515,10 @@ void LLLocalBitmap::updateUserLayers(LLUUID old_id, LLUUID new_id, LLWearableTyp } } -LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex( - LLWearableType::EType type, LLVOAvatarDefines::EBakedTextureIndex baked_texind) +LLAvatarAppearanceDefines::ETextureIndex LLLocalBitmap::getTexIndex( + LLWearableType::EType type, LLAvatarAppearanceDefines::EBakedTextureIndex baked_texind) { - LLVOAvatarDefines::ETextureIndex result = LLVOAvatarDefines::TEX_NUM_INDICES; // using as a default/fail return. + LLAvatarAppearanceDefines::ETextureIndex result = LLAvatarAppearanceDefines::TEX_NUM_INDICES; // using as a default/fail return. switch(type) { @@ -526,32 +526,32 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex( { switch(baked_texind) { - case LLVOAvatarDefines::BAKED_EYES: + case LLAvatarAppearanceDefines::BAKED_EYES: { - result = LLVOAvatarDefines::TEX_EYES_ALPHA; + result = LLAvatarAppearanceDefines::TEX_EYES_ALPHA; break; } - case LLVOAvatarDefines::BAKED_HAIR: + case LLAvatarAppearanceDefines::BAKED_HAIR: { - result = LLVOAvatarDefines::TEX_HAIR_ALPHA; + result = LLAvatarAppearanceDefines::TEX_HAIR_ALPHA; break; } - case LLVOAvatarDefines::BAKED_HEAD: + case LLAvatarAppearanceDefines::BAKED_HEAD: { - result = LLVOAvatarDefines::TEX_HEAD_ALPHA; + result = LLAvatarAppearanceDefines::TEX_HEAD_ALPHA; break; } - case LLVOAvatarDefines::BAKED_LOWER: + case LLAvatarAppearanceDefines::BAKED_LOWER: { - result = LLVOAvatarDefines::TEX_LOWER_ALPHA; + result = LLAvatarAppearanceDefines::TEX_LOWER_ALPHA; break; } - case LLVOAvatarDefines::BAKED_UPPER: + case LLAvatarAppearanceDefines::BAKED_UPPER: { - result = LLVOAvatarDefines::TEX_UPPER_ALPHA; + result = LLAvatarAppearanceDefines::TEX_UPPER_ALPHA; break; } @@ -567,9 +567,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex( case LLWearableType::WT_EYES: { - if (baked_texind == LLVOAvatarDefines::BAKED_EYES) + if (baked_texind == LLAvatarAppearanceDefines::BAKED_EYES) { - result = LLVOAvatarDefines::TEX_EYES_IRIS; + result = LLAvatarAppearanceDefines::TEX_EYES_IRIS; } break; @@ -577,9 +577,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex( case LLWearableType::WT_GLOVES: { - if (baked_texind == LLVOAvatarDefines::BAKED_UPPER) + if (baked_texind == LLAvatarAppearanceDefines::BAKED_UPPER) { - result = LLVOAvatarDefines::TEX_UPPER_GLOVES; + result = LLAvatarAppearanceDefines::TEX_UPPER_GLOVES; } break; @@ -587,13 +587,13 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex( case LLWearableType::WT_JACKET: { - if (baked_texind == LLVOAvatarDefines::BAKED_LOWER) + if (baked_texind == LLAvatarAppearanceDefines::BAKED_LOWER) { - result = LLVOAvatarDefines::TEX_LOWER_JACKET; + result = LLAvatarAppearanceDefines::TEX_LOWER_JACKET; } - else if (baked_texind == LLVOAvatarDefines::BAKED_UPPER) + else if (baked_texind == LLAvatarAppearanceDefines::BAKED_UPPER) { - result = LLVOAvatarDefines::TEX_UPPER_JACKET; + result = LLAvatarAppearanceDefines::TEX_UPPER_JACKET; } break; @@ -601,9 +601,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex( case LLWearableType::WT_PANTS: { - if (baked_texind == LLVOAvatarDefines::BAKED_LOWER) + if (baked_texind == LLAvatarAppearanceDefines::BAKED_LOWER) { - result = LLVOAvatarDefines::TEX_LOWER_PANTS; + result = LLAvatarAppearanceDefines::TEX_LOWER_PANTS; } break; @@ -611,9 +611,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex( case LLWearableType::WT_SHIRT: { - if (baked_texind == LLVOAvatarDefines::BAKED_UPPER) + if (baked_texind == LLAvatarAppearanceDefines::BAKED_UPPER) { - result = LLVOAvatarDefines::TEX_UPPER_SHIRT; + result = LLAvatarAppearanceDefines::TEX_UPPER_SHIRT; } break; @@ -621,9 +621,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex( case LLWearableType::WT_SHOES: { - if (baked_texind == LLVOAvatarDefines::BAKED_LOWER) + if (baked_texind == LLAvatarAppearanceDefines::BAKED_LOWER) { - result = LLVOAvatarDefines::TEX_LOWER_SHOES; + result = LLAvatarAppearanceDefines::TEX_LOWER_SHOES; } break; @@ -633,20 +633,20 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex( { switch(baked_texind) { - case LLVOAvatarDefines::BAKED_HEAD: + case LLAvatarAppearanceDefines::BAKED_HEAD: { - result = LLVOAvatarDefines::TEX_HEAD_BODYPAINT; + result = LLAvatarAppearanceDefines::TEX_HEAD_BODYPAINT; break; } - case LLVOAvatarDefines::BAKED_LOWER: + case LLAvatarAppearanceDefines::BAKED_LOWER: { - result = LLVOAvatarDefines::TEX_LOWER_BODYPAINT; + result = LLAvatarAppearanceDefines::TEX_LOWER_BODYPAINT; break; } - case LLVOAvatarDefines::BAKED_UPPER: + case LLAvatarAppearanceDefines::BAKED_UPPER: { - result = LLVOAvatarDefines::TEX_UPPER_BODYPAINT; + result = LLAvatarAppearanceDefines::TEX_UPPER_BODYPAINT; break; } @@ -661,9 +661,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex( case LLWearableType::WT_SKIRT: { - if (baked_texind == LLVOAvatarDefines::BAKED_SKIRT) + if (baked_texind == LLAvatarAppearanceDefines::BAKED_SKIRT) { - result = LLVOAvatarDefines::TEX_SKIRT; + result = LLAvatarAppearanceDefines::TEX_SKIRT; } break; @@ -671,9 +671,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex( case LLWearableType::WT_SOCKS: { - if (baked_texind == LLVOAvatarDefines::BAKED_LOWER) + if (baked_texind == LLAvatarAppearanceDefines::BAKED_LOWER) { - result = LLVOAvatarDefines::TEX_LOWER_SOCKS; + result = LLAvatarAppearanceDefines::TEX_LOWER_SOCKS; } break; @@ -683,20 +683,20 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex( { switch(baked_texind) { - case LLVOAvatarDefines::BAKED_HEAD: + case LLAvatarAppearanceDefines::BAKED_HEAD: { - result = LLVOAvatarDefines::TEX_HEAD_TATTOO; + result = LLAvatarAppearanceDefines::TEX_HEAD_TATTOO; break; } - case LLVOAvatarDefines::BAKED_LOWER: + case LLAvatarAppearanceDefines::BAKED_LOWER: { - result = LLVOAvatarDefines::TEX_LOWER_TATTOO; + result = LLAvatarAppearanceDefines::TEX_LOWER_TATTOO; break; } - case LLVOAvatarDefines::BAKED_UPPER: + case LLAvatarAppearanceDefines::BAKED_UPPER: { - result = LLVOAvatarDefines::TEX_UPPER_TATTOO; + result = LLAvatarAppearanceDefines::TEX_UPPER_TATTOO; break; } @@ -711,9 +711,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex( case LLWearableType::WT_UNDERPANTS: { - if (baked_texind == LLVOAvatarDefines::BAKED_LOWER) + if (baked_texind == LLAvatarAppearanceDefines::BAKED_LOWER) { - result = LLVOAvatarDefines::TEX_LOWER_UNDERPANTS; + result = LLAvatarAppearanceDefines::TEX_LOWER_UNDERPANTS; } break; @@ -721,9 +721,9 @@ LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex( case LLWearableType::WT_UNDERSHIRT: { - if (baked_texind == LLVOAvatarDefines::BAKED_UPPER) + if (baked_texind == LLAvatarAppearanceDefines::BAKED_UPPER) { - result = LLVOAvatarDefines::TEX_UPPER_UNDERSHIRT; + result = LLAvatarAppearanceDefines::TEX_UPPER_UNDERSHIRT; } break; diff --git a/indra/newview/lllocalbitmaps.h b/indra/newview/lllocalbitmaps.h index 7a23c7ef6e..580b6dfa7e 100644 --- a/indra/newview/lllocalbitmaps.h +++ b/indra/newview/lllocalbitmaps.h @@ -28,11 +28,14 @@ #ifndef LL_LOCALBITMAPS_H #define LL_LOCALBITMAPS_H +#include "llavatarappearancedefines.h" #include "lleventtimer.h" +#include "llimage.h" +#include "llpointer.h" #include "llwearabletype.h" -#include "llvoavatardefines.h" class LLScrollListCtrl; +class LLViewerObject; class LLLocalBitmap { @@ -63,7 +66,7 @@ class LLLocalBitmap void updateUserPrims(LLUUID old_id, LLUUID new_id); void updateUserSculpts(LLUUID old_id, LLUUID new_id); void updateUserLayers(LLUUID old_id, LLUUID new_id, LLWearableType::EType type); - LLVOAvatarDefines::ETextureIndex getTexIndex(LLWearableType::EType type, LLVOAvatarDefines::EBakedTextureIndex baked_texind); + LLAvatarAppearanceDefines::ETextureIndex getTexIndex(LLWearableType::EType type, LLAvatarAppearanceDefines::EBakedTextureIndex baked_texind); private: /* private enums */ enum ELinkStatus diff --git a/indra/newview/lllocaltextureobject.cpp b/indra/newview/lllocaltextureobject.cpp deleted file mode 100644 index 07ec0fab95..0000000000 --- a/indra/newview/lllocaltextureobject.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/** - * @file lllocaltextureobject.cpp - * - * $LicenseInfo:firstyear=2009&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$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "lllocaltextureobject.h" - -#include "lltexlayer.h" -#include "llviewertexture.h" -#include "lltextureentry.h" -#include "lluuid.h" -#include "llwearable.h" - - -LLLocalTextureObject::LLLocalTextureObject() : - mIsBakedReady(FALSE), - mDiscard(MAX_DISCARD_LEVEL+1) -{ - mImage = NULL; -} - -LLLocalTextureObject::LLLocalTextureObject(LLViewerFetchedTexture* image, const LLUUID& id) : - mIsBakedReady(FALSE), - mDiscard(MAX_DISCARD_LEVEL+1) -{ - mImage = image; - gGL.getTexUnit(0)->bind(mImage); - mID = id; -} - -LLLocalTextureObject::LLLocalTextureObject(const LLLocalTextureObject& lto) : - mImage(lto.mImage), - mID(lto.mID), - mIsBakedReady(lto.mIsBakedReady), - mDiscard(lto.mDiscard) -{ - U32 num_layers = lto.getNumTexLayers(); - mTexLayers.reserve(num_layers); - for (U32 index = 0; index < num_layers; index++) - { - LLTexLayer* original_layer = lto.getTexLayer(index); - if (!original_layer) - { - llerrs << "could not clone Local Texture Object: unable to extract texlayer!" << llendl; - continue; - } - - LLTexLayer* new_layer = new LLTexLayer(*original_layer); - new_layer->setLTO(this); - mTexLayers.push_back(new_layer); - } -} - -LLLocalTextureObject::~LLLocalTextureObject() -{ -} - -LLViewerFetchedTexture* LLLocalTextureObject::getImage() const -{ - return mImage; -} - -LLTexLayer* LLLocalTextureObject::getTexLayer(U32 index) const -{ - if (index >= getNumTexLayers()) - { - return NULL; - } - - return mTexLayers[index]; -} - -LLTexLayer* LLLocalTextureObject::getTexLayer(const std::string &name) -{ - for( tex_layer_vec_t::iterator iter = mTexLayers.begin(); iter != mTexLayers.end(); iter++) - { - LLTexLayer *layer = *iter; - if (layer->getName().compare(name) == 0) - { - return layer; - } - } - - return NULL; -} - -U32 LLLocalTextureObject::getNumTexLayers() const -{ - return mTexLayers.size(); -} - -LLUUID LLLocalTextureObject::getID() const -{ - return mID; -} - -S32 LLLocalTextureObject::getDiscard() const -{ - return mDiscard; -} - -BOOL LLLocalTextureObject::getBakedReady() const -{ - return mIsBakedReady; -} - -void LLLocalTextureObject::setImage(LLViewerFetchedTexture* new_image) -{ - mImage = new_image; -} - -BOOL LLLocalTextureObject::setTexLayer(LLTexLayer *new_tex_layer, U32 index) -{ - if (index >= getNumTexLayers() ) - { - return FALSE; - } - - if (new_tex_layer == NULL) - { - return removeTexLayer(index); - } - - LLTexLayer *layer = new LLTexLayer(*new_tex_layer); - layer->setLTO(this); - - if (mTexLayers[index]) - { - delete mTexLayers[index]; - } - mTexLayers[index] = layer; - - return TRUE; -} - -BOOL LLLocalTextureObject::addTexLayer(LLTexLayer *new_tex_layer, LLWearable *wearable) -{ - if (new_tex_layer == NULL) - { - return FALSE; - } - - LLTexLayer *layer = new LLTexLayer(*new_tex_layer, wearable); - layer->setLTO(this); - mTexLayers.push_back(layer); - return TRUE; -} - -BOOL LLLocalTextureObject::addTexLayer(LLTexLayerTemplate *new_tex_layer, LLWearable *wearable) -{ - if (new_tex_layer == NULL) - { - return FALSE; - } - - LLTexLayer *layer = new LLTexLayer(*new_tex_layer, this, wearable); - layer->setLTO(this); - mTexLayers.push_back(layer); - return TRUE; -} - -BOOL LLLocalTextureObject::removeTexLayer(U32 index) -{ - if (index >= getNumTexLayers()) - { - return FALSE; - } - tex_layer_vec_t::iterator iter = mTexLayers.begin(); - iter += index; - - delete *iter; - mTexLayers.erase(iter); - return TRUE; -} - -void LLLocalTextureObject::setID(LLUUID new_id) -{ - mID = new_id; -} - -void LLLocalTextureObject::setDiscard(S32 new_discard) -{ - mDiscard = new_discard; -} - -void LLLocalTextureObject::setBakedReady(BOOL ready) -{ - mIsBakedReady = ready; -} - diff --git a/indra/newview/lllocaltextureobject.h b/indra/newview/lllocaltextureobject.h deleted file mode 100644 index b9bfc5472f..0000000000 --- a/indra/newview/lllocaltextureobject.h +++ /dev/null @@ -1,87 +0,0 @@ -/** - * @file lllocaltextureobject.h - * @brief LLLocalTextureObject class header file - * - * $LicenseInfo:firstyear=2009&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$ - */ - -#ifndef LL_LOCALTEXTUREOBJECT_H -#define LL_LOCALTEXTUREOBJECT_H - -#include <boost/shared_ptr.hpp> - -#include "llviewertexture.h" - -class LLUUID; -class LLTexLayer; -class LLTextureEntry; -class LLTexLayerTemplate; -class LLWearable; - -// Stores all relevant information for a single texture -// assumed to have ownership of all objects referred to - -// will delete objects when being replaced or if object is destroyed. -class LLLocalTextureObject -{ -public: - LLLocalTextureObject(); - LLLocalTextureObject(LLViewerFetchedTexture* image, const LLUUID& id); - LLLocalTextureObject(const LLLocalTextureObject& lto); - ~LLLocalTextureObject(); - - LLViewerFetchedTexture* getImage() const; - LLTexLayer* getTexLayer(U32 index) const; - LLTexLayer* getTexLayer(const std::string &name); - U32 getNumTexLayers() const; - LLUUID getID() const; - S32 getDiscard() const; - BOOL getBakedReady() const; - - void setImage(LLViewerFetchedTexture* new_image); - BOOL setTexLayer(LLTexLayer *new_tex_layer, U32 index); - BOOL addTexLayer(LLTexLayer *new_tex_layer, LLWearable *wearable); - BOOL addTexLayer(LLTexLayerTemplate *new_tex_layer, LLWearable *wearable); - BOOL removeTexLayer(U32 index); - - void setID(LLUUID new_id); - void setDiscard(S32 new_discard); - void setBakedReady(BOOL ready); - -protected: - -private: - - LLPointer<LLViewerFetchedTexture> mImage; - // NOTE: LLLocalTextureObject should be the exclusive owner of mTexEntry and mTexLayer - // using shared pointers here only for smart assignment & cleanup - // do NOT create new shared pointers to these objects, or keep pointers to them around - typedef std::vector<LLTexLayer*> tex_layer_vec_t; - tex_layer_vec_t mTexLayers; - - LLUUID mID; - - BOOL mIsBakedReady; - S32 mDiscard; -}; - - #endif // LL_LOCALTEXTUREOBJECT_H - diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 8d9d70b50e..5022dba934 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -1217,11 +1217,11 @@ void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon) case SCRIPTS_ICON: { LLViewerRegion* region = gAgent.getRegion(); - if(region && region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) + if(region && region->getRegionFlag(REGION_FLAGS_ESTATE_SKIP_SCRIPTS)) { LLNotificationsUtil::add("ScriptsStopped"); } - else if(region && region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) + else if(region && region->getRegionFlag(REGION_FLAGS_SKIP_SCRIPTS)) { LLNotificationsUtil::add("ScriptsNotRunning"); } diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp index 9ec5d7c20c..a7d6cb5eac 100644 --- a/indra/newview/llmanip.cpp +++ b/indra/newview/llmanip.cpp @@ -53,7 +53,7 @@ #include "llresmgr.h" #include "pipeline.h" #include "llglheaders.h" - +#include "lluiimage.h" // Local constants... const S32 VERTICAL_OFFSET = 50; diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index 826e8d560a..d79f1040bb 100644 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -1689,7 +1689,6 @@ void LLManipRotate::highlightManipulators( S32 x, S32 y ) return; } - LLQuaternion object_rot = first_object->getRenderRotation(); LLVector3 rotation_center = gAgent.getPosAgentFromGlobal(mRotationCenter); LLVector3 mouse_dir_x; LLVector3 mouse_dir_y; diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index 00a0bf8894..ae0884ac5d 100644 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -1191,9 +1191,6 @@ void LLManipScale::dragFace( S32 x, S32 y ) mInSnapRegime = FALSE; } - BOOL send_scale_update = FALSE; - BOOL send_position_update = FALSE; - LLVector3 dir_agent; if( part_dir_local.mV[VX] ) { @@ -1210,8 +1207,6 @@ void LLManipScale::dragFace( S32 x, S32 y ) stretchFace( projected_vec(drag_start_dir_f, dir_agent) + drag_start_center_agent, projected_vec(drag_delta, dir_agent)); - send_position_update = TRUE; - send_scale_update = TRUE; mDragPointGlobal = drag_point_global; } diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index 362308c176..b62db70ec8 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -485,7 +485,6 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) } // Throttle updates to 10 per second. - BOOL send_update = FALSE; LLVector3 axis_f; LLVector3d axis_d; @@ -702,11 +701,6 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) LLVector3 old_position_local = object->getPosition(); LLVector3 new_position_local = selectNode->mSavedPositionLocal + (clamped_relative_move_f * objWorldRotation); - // move and clamp root object first, before adjusting children - if (new_position_local != old_position_local) - { - send_update = TRUE; - } //RN: I forget, but we need to do this because of snapping which doesn't often result // in position changes even when the mouse moves object->setPosition(new_position_local); @@ -716,8 +710,6 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) if (selectNode->mIndividualSelection) { - send_update = FALSE; - // counter-translate child objects if we are moving the root as an individual object->resetChildrenPosition(old_position_local - new_position_local, TRUE) ; } @@ -753,7 +745,6 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) } // PR: Only update if changed - LLVector3d old_position_global = object->getPositionGlobal(); LLVector3 old_position_agent = object->getPositionAgent(); LLVector3 new_position_agent = gAgent.getPosAgentFromGlobal(new_position_global); if (object->isRootEdit()) @@ -775,11 +766,6 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) { // counter-translate child objects if we are moving the root as an individual object->resetChildrenPosition(old_position_agent - new_position_agent, TRUE) ; - send_update = FALSE; - } - else if (old_position_global != new_position_global) - { - send_update = TRUE; } } selectNode->mLastPositionLocal = object->getPosition(); @@ -1310,7 +1296,6 @@ void LLManipTranslate::renderSnapGuides() // add in off-axis offset tick_start += (mSnapOffsetAxis * mSnapOffsetMeters); - BOOL is_sub_tick = FALSE; F32 tick_scale = 1.f; for (F32 division_level = max_subdivisions; division_level >= sGridMinSubdivisionLevel; division_level /= 2.f) { @@ -1319,7 +1304,6 @@ void LLManipTranslate::renderSnapGuides() break; } tick_scale *= 0.7f; - is_sub_tick = TRUE; } // S32 num_ticks_to_fade = is_sub_tick ? num_ticks_per_side / 2 : num_ticks_per_side; @@ -1542,7 +1526,6 @@ void LLManipTranslate::renderSnapGuides() float a = line_alpha; - LLColor4 col = LLUIColorTable::instance().getColor("SilhouetteChildColor"); { //draw grid behind objects LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 99b4707158..2075aeed63 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -119,8 +119,8 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : if(!getDecoupleTextureSize()) { - S32 screen_width = llround((F32)getRect().getWidth() * LLUI::sGLScaleFactor.mV[VX]); - S32 screen_height = llround((F32)getRect().getHeight() * LLUI::sGLScaleFactor.mV[VY]); + S32 screen_width = llround((F32)getRect().getWidth() * LLUI::getScaleFactor().mV[VX]); + S32 screen_height = llround((F32)getRect().getHeight() * LLUI::getScaleFactor().mV[VY]); setTextureSize(screen_width, screen_height); } @@ -469,8 +469,8 @@ void LLMediaCtrl::reshape( S32 width, S32 height, BOOL called_from_parent ) { if(!getDecoupleTextureSize()) { - S32 screen_width = llround((F32)width * LLUI::sGLScaleFactor.mV[VX]); - S32 screen_height = llround((F32)height * LLUI::sGLScaleFactor.mV[VY]); + S32 screen_width = llround((F32)width * LLUI::getScaleFactor().mV[VX]); + S32 screen_height = llround((F32)height * LLUI::getScaleFactor().mV[VY]); // when floater is minimized, these sizes are negative if ( screen_height > 0 && screen_width > 0 ) @@ -667,7 +667,7 @@ bool LLMediaCtrl::ensureMediaSourceExists() mMediaSource->addObserver( this ); mMediaSource->setBackgroundColor( getBackgroundColor() ); mMediaSource->setTrustedBrowser(mTrusted); - mMediaSource->setPageZoomFactor( LLUI::sGLScaleFactor.mV[ VX ] ); + mMediaSource->setPageZoomFactor( LLUI::getScaleFactor().mV[ VX ] ); if(mClearCache) { @@ -750,7 +750,7 @@ void LLMediaCtrl::draw() { gGL.pushUIMatrix(); { - mMediaSource->setPageZoomFactor( LLUI::sGLScaleFactor.mV[ VX ] ); + mMediaSource->setPageZoomFactor( LLUI::getScaleFactor().mV[ VX ] ); // scale texture to fit the space using texture coords gGL.getTexUnit(0)->bind(media_texture); @@ -864,14 +864,14 @@ void LLMediaCtrl::convertInputCoords(S32& x, S32& y) coords_opengl = mMediaSource->getMediaPlugin()->getTextureCoordsOpenGL(); } - x = llround((F32)x * LLUI::sGLScaleFactor.mV[VX]); + x = llround((F32)x * LLUI::getScaleFactor().mV[VX]); if ( ! coords_opengl ) { - y = llround((F32)(y) * LLUI::sGLScaleFactor.mV[VY]); + y = llround((F32)(y) * LLUI::getScaleFactor().mV[VY]); } else { - y = llround((F32)(getRect().getHeight() - y) * LLUI::sGLScaleFactor.mV[VY]); + y = llround((F32)(getRect().getHeight() - y) * LLUI::getScaleFactor().mV[VY]); }; } diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp index 31038b4aac..e3b46d5d2f 100644 --- a/indra/newview/llmediadataclient.cpp +++ b/indra/newview/llmediadataclient.cpp @@ -564,7 +564,7 @@ LLMediaDataClient::Responder::Responder(const request_ptr_t &request) } /*virtual*/ -void LLMediaDataClient::Responder::error(U32 status, const std::string& reason) +void LLMediaDataClient::Responder::errorWithContent(U32 status, const std::string& reason, const LLSD& content) { mRequest->stopTracking(); @@ -596,8 +596,8 @@ void LLMediaDataClient::Responder::error(U32 status, const std::string& reason) } else { - std::string msg = boost::lexical_cast<std::string>(status) + ": " + reason; - LL_WARNS("LLMediaDataClient") << *mRequest << " http error(" << msg << ")" << LL_ENDL; + LL_WARNS("LLMediaDataClient") << *mRequest << " http error [status:" + << status << "]:" << content << ")" << LL_ENDL; } } @@ -1003,7 +1003,7 @@ LLMediaDataClient::Responder *LLObjectMediaNavigateClient::RequestNavigate::crea } /*virtual*/ -void LLObjectMediaNavigateClient::Responder::error(U32 status, const std::string& reason) +void LLObjectMediaNavigateClient::Responder::errorWithContent(U32 status, const std::string& reason, const LLSD& content) { getRequest()->stopTracking(); @@ -1017,7 +1017,7 @@ void LLObjectMediaNavigateClient::Responder::error(U32 status, const std::string // class if (status == HTTP_SERVICE_UNAVAILABLE) { - LLMediaDataClient::Responder::error(status, reason); + LLMediaDataClient::Responder::errorWithContent(status, reason, content); } else { diff --git a/indra/newview/llmediadataclient.h b/indra/newview/llmediadataclient.h index ab90915c55..89e20a28d0 100644 --- a/indra/newview/llmediadataclient.h +++ b/indra/newview/llmediadataclient.h @@ -195,7 +195,7 @@ protected: public: Responder(const request_ptr_t &request); //If we get back an error (not found, etc...), handle it here - virtual void error(U32 status, const std::string& reason); + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content); //If we get back a normal response, handle it here. Default just logs it. virtual void result(const LLSD& content); @@ -400,7 +400,7 @@ protected: public: Responder(const request_ptr_t &request) : LLMediaDataClient::Responder(request) {} - virtual void error(U32 status, const std::string& reason); + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content); virtual void result(const LLSD &content); private: void mediaNavigateBounceBack(); diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 1223615079..17311dd75e 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -3222,6 +3222,7 @@ void LLPhysicsDecomp::doDecomposition() param_map[params[i].mName] = params+i; } + U32 ret = LLCD_OK; //set parameter values for (decomp_params::iterator iter = mCurRequest->mParams.begin(); iter != mCurRequest->mParams.end(); ++iter) { @@ -3235,7 +3236,6 @@ void LLPhysicsDecomp::doDecomposition() continue; } - U32 ret = LLCD_OK; if (param->mType == LLCDParam::LLCD_FLOAT) { @@ -3254,8 +3254,6 @@ void LLPhysicsDecomp::doDecomposition() mCurRequest->setStatusMessage("Executing."); - LLCDResult ret = LLCD_OK; - if (LLConvexDecomposition::getInstance() != NULL) { ret = LLConvexDecomposition::getInstance()->executeStage(stage); diff --git a/indra/newview/llmorphview.cpp b/indra/newview/llmorphview.cpp index eaa044cb59..252d1b78ea 100644 --- a/indra/newview/llmorphview.cpp +++ b/indra/newview/llmorphview.cpp @@ -99,8 +99,6 @@ void LLMorphView::initialize() //----------------------------------------------------------------------------- void LLMorphView::shutdown() { - LLVOAvatarSelf::onCustomizeEnd(); - if (isAgentAvatarValid()) { gAgentAvatarp->startMotion( ANIM_AGENT_BODY_NOISE ); diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 1bda7640bd..dea90b9042 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -150,7 +150,7 @@ void LLNetMap::draw() static LLUIColor map_avatar_color = LLUIColorTable::instance().getColor("MapAvatarColor", LLColor4::white); static LLUIColor map_avatar_friend_color = LLUIColorTable::instance().getColor("MapAvatarFriendColor", LLColor4::white); static LLUIColor map_track_color = LLUIColorTable::instance().getColor("MapTrackColor", LLColor4::white); - static LLUIColor map_track_disabled_color = LLUIColorTable::instance().getColor("MapTrackDisabledColor", LLColor4::white); + //static LLUIColor map_track_disabled_color = LLUIColorTable::instance().getColor("MapTrackDisabledColor", LLColor4::white); static LLUIColor map_frustum_color = LLUIColorTable::instance().getColor("MapFrustumColor", LLColor4::white); static LLUIColor map_frustum_rotating_color = LLUIColorTable::instance().getColor("MapFrustumRotatingColor", LLColor4::white); diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h index a346909027..0682af1278 100644 --- a/indra/newview/lloutputmonitorctrl.h +++ b/indra/newview/lloutputmonitorctrl.h @@ -31,7 +31,7 @@ #include "../llui/llview.h" #include "llmutelist.h" #include "llspeakingindicatormanager.h" -#include "../llui/lluiimage.h" +//#include "../llui/lluiimage.h" class LLTextBox; class LLUICtrlFactory; diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index 6889b98ab1..862e4be203 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -55,6 +55,7 @@ #include "lltrans.h" #include "llscrollcontainer.h" #include "llstatusbar.h" +#include "llviewertexture.h" const S32 MINIMUM_PRICE_FOR_LISTING = 50; // L$ diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index 77e1487f38..1a427338e5 100644 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -78,8 +78,6 @@ const char* LLPanelContents::PERMS_ANYONE_CONTROL_KEY = "perms_anyone_control"; BOOL LLPanelContents::postBuild() { - LLRect rect = this->getRect(); - setMouseOpaque(FALSE); childSetAction("button new script",&LLPanelContents::onClickNewScript, this); diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index 6b9edcb07c..e71dba5cae 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -28,7 +28,7 @@ #include "llpaneleditwearable.h" #include "llpanel.h" -#include "llwearable.h" +#include "llviewerwearable.h" #include "lluictrl.h" #include "llscrollingpanellist.h" #include "llvisualparam.h" @@ -52,6 +52,7 @@ #include "lltexturectrl.h" #include "lltextureentry.h" #include "llviewercontrol.h" // gSavedSettings +#include "llviewerregion.h" #include "llviewertexturelist.h" #include "llagentcamera.h" #include "llmorphview.h" @@ -104,7 +105,7 @@ enum ESubpart { SUBPART_PHYSICS_ADVANCED, }; -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines; typedef std::vector<ESubpart> subpart_vec_t; @@ -718,8 +719,8 @@ BOOL LLPanelEditWearable::postBuild() mBtnBack = getChild<LLButton>("back_btn"); mBackBtnLabel = mBtnBack->getLabelUnselected(); mBtnBack->setLabel(LLStringUtil::null); - // handled at appearance panel level? - //mBtnBack->setClickedCallback(boost::bind(&LLPanelEditWearable::onBackButtonClicked, this)); + + mBtnBack->setClickedCallback(boost::bind(&LLPanelEditWearable::onBackButtonClicked, this)); mNameEditor = getChild<LLLineEditor>("description"); @@ -762,11 +763,11 @@ BOOL LLPanelEditWearable::postBuild() mWearablePtr = NULL; - configureAlphaCheckbox(LLVOAvatarDefines::TEX_LOWER_ALPHA, "lower alpha texture invisible"); - configureAlphaCheckbox(LLVOAvatarDefines::TEX_UPPER_ALPHA, "upper alpha texture invisible"); - configureAlphaCheckbox(LLVOAvatarDefines::TEX_HEAD_ALPHA, "head alpha texture invisible"); - configureAlphaCheckbox(LLVOAvatarDefines::TEX_EYES_ALPHA, "eye alpha texture invisible"); - configureAlphaCheckbox(LLVOAvatarDefines::TEX_HAIR_ALPHA, "hair alpha texture invisible"); + configureAlphaCheckbox(LLAvatarAppearanceDefines::TEX_LOWER_ALPHA, "lower alpha texture invisible"); + configureAlphaCheckbox(LLAvatarAppearanceDefines::TEX_UPPER_ALPHA, "upper alpha texture invisible"); + configureAlphaCheckbox(LLAvatarAppearanceDefines::TEX_HEAD_ALPHA, "head alpha texture invisible"); + configureAlphaCheckbox(LLAvatarAppearanceDefines::TEX_EYES_ALPHA, "eye alpha texture invisible"); + configureAlphaCheckbox(LLAvatarAppearanceDefines::TEX_HAIR_ALPHA, "hair alpha texture invisible"); // configure tab expanded callbacks for (U32 type_index = 0; type_index < (U32)LLWearableType::WT_COUNT; ++type_index) @@ -856,6 +857,14 @@ void LLPanelEditWearable::draw() LLPanel::draw(); } +void LLPanelEditWearable::onClose() +{ + if ( isDirty() ) + { + revertChanges(); + } +} + void LLPanelEditWearable::setVisible(BOOL visible) { if (!visible) @@ -865,13 +874,22 @@ void LLPanelEditWearable::setVisible(BOOL visible) LLPanel::setVisible(visible); } -void LLPanelEditWearable::setWearable(LLWearable *wearable, BOOL disable_camera_switch) +void LLPanelEditWearable::setWearable(LLViewerWearable *wearable, BOOL disable_camera_switch) { showWearable(mWearablePtr, FALSE, disable_camera_switch); mWearablePtr = wearable; showWearable(mWearablePtr, TRUE, disable_camera_switch); } +//static +void LLPanelEditWearable::onBackButtonClicked(void* userdata) +{ + LLPanelEditWearable *panel = (LLPanelEditWearable*) userdata; + if ( panel->isDirty() ) + { + LLAppearanceMgr::instance().setOutfitDirty( true ); + } +} //static void LLPanelEditWearable::onRevertButtonClicked(void* userdata) @@ -922,7 +940,7 @@ void LLPanelEditWearable::onCommitSexChange() } bool is_new_sex_male = (gSavedSettings.getU32("AvatarSex") ? SEX_MALE : SEX_FEMALE) == SEX_MALE; - LLWearable* wearable = gAgentWearables.getWearable(type, index); + LLViewerWearable* wearable = gAgentWearables.getViewerWearable(type, index); if (wearable) { wearable->setVisualParamWeight(param->getID(), is_new_sex_male, FALSE); @@ -1007,13 +1025,11 @@ void LLPanelEditWearable::updatePanelPickerControls(LLWearableType::EType type) return; bool is_modifiable = false; - bool is_copyable = false; if(mWearableItem) { const LLPermissions& perm = mWearableItem->getPermissions(); is_modifiable = perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID()); - is_copyable = perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()); } if (is_modifiable) @@ -1030,6 +1046,11 @@ void LLPanelEditWearable::updatePanelPickerControls(LLWearableType::EType type) } } +void LLPanelEditWearable::incrementCofVersionLegacy() +{ + +} + void LLPanelEditWearable::saveChanges(bool force_save_as) { if (!mWearablePtr || !isDirty()) @@ -1041,17 +1062,50 @@ void LLPanelEditWearable::saveChanges(bool force_save_as) U32 index = gAgentWearables.getWearableIndex(mWearablePtr); std::string new_name = mNameEditor->getText(); + + // Find an existing link to this wearable's inventory item, if any, and its description field. + LLInventoryItem *link_item = NULL; + std::string description; + LLInventoryModel::item_array_t links = + LLAppearanceMgr::instance().findCOFItemLinks(mWearablePtr->getItemID()); + if (links.size()>0) + { + link_item = links.get(0).get(); + if (link_item && link_item->getIsLinkType()) + { + description = link_item->getActualDescription(); + } + } + if (force_save_as) { // the name of the wearable has changed, re-save wearable with new name - LLAppearanceMgr::instance().removeCOFItemLinks(mWearablePtr->getItemID(),false); - gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, new_name, FALSE); + LLAppearanceMgr::instance().removeCOFItemLinks(mWearablePtr->getItemID()); + gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, new_name, description, FALSE); mNameEditor->setText(mWearableItem->getName()); } else { + // Make another copy of this link, with the same + // description. This is needed to bump the COF + // version so texture baking service knows appearance has changed. + if (link_item) + { + // Create new link + link_inventory_item( gAgent.getID(), + link_item->getLinkedUUID(), + LLAppearanceMgr::instance().getCOF(), + link_item->getName(), + description, + LLAssetType::AT_LINK, + NULL); + // Remove old link + gInventory.purgeObject(link_item->getUUID()); + } gAgentWearables.saveWearable(mWearablePtr->getType(), index, TRUE, new_name); } + + } void LLPanelEditWearable::revertChanges() @@ -1069,7 +1123,7 @@ void LLPanelEditWearable::revertChanges() gAgentAvatarp->wearableUpdated(mWearablePtr->getType(), FALSE); } -void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show, BOOL disable_camera_switch) +void LLPanelEditWearable::showWearable(LLViewerWearable* wearable, BOOL show, BOOL disable_camera_switch) { if (!wearable) { @@ -1440,12 +1494,11 @@ void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value { panel_list->clearPanels(); value_map_t::iterator end = sorted_params.end(); - S32 height = 0; for(value_map_t::iterator it = sorted_params.begin(); it != end; ++it) { LLPanel::Params p; p.name("LLScrollingPanelParam"); - LLWearable *wearable = this->getWearable(); + LLViewerWearable *wearable = this->getWearable(); LLScrollingPanelParamBase *panel_param = NULL; if (wearable && wearable->getType() == LLWearableType::WT_PHYSICS) // Hack to show a different panel for physics. Should generalize this later. { @@ -1455,7 +1508,7 @@ void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value { panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable(), jointp); } - height = panel_list->addPanel( panel_param ); + panel_list->addPanel( panel_param ); } } } @@ -1505,7 +1558,7 @@ void LLPanelEditWearable::updateVerbs() } } -void LLPanelEditWearable::configureAlphaCheckbox(LLVOAvatarDefines::ETextureIndex te, const std::string& name) +void LLPanelEditWearable::configureAlphaCheckbox(LLAvatarAppearanceDefines::ETextureIndex te, const std::string& name) { LLCheckBoxCtrl* checkbox = mPanelAlpha->getChild<LLCheckBoxCtrl>(name); checkbox->setCommitCallback(boost::bind(&LLPanelEditWearable::onInvisibilityCommit, this, checkbox, te)); @@ -1513,7 +1566,7 @@ void LLPanelEditWearable::configureAlphaCheckbox(LLVOAvatarDefines::ETextureInde mAlphaCheckbox2Index[name] = te; } -void LLPanelEditWearable::onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLVOAvatarDefines::ETextureIndex te) +void LLPanelEditWearable::onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLAvatarAppearanceDefines::ETextureIndex te) { if (!checkbox_ctrl) return; if (!getWearable()) return; @@ -1557,7 +1610,7 @@ void LLPanelEditWearable::updateAlphaCheckboxes() for(string_texture_index_map_t::iterator iter = mAlphaCheckbox2Index.begin(); iter != mAlphaCheckbox2Index.end(); ++iter ) { - LLVOAvatarDefines::ETextureIndex te = (LLVOAvatarDefines::ETextureIndex)iter->second; + LLAvatarAppearanceDefines::ETextureIndex te = (LLAvatarAppearanceDefines::ETextureIndex)iter->second; LLCheckBoxCtrl* ctrl = mPanelAlpha->getChild<LLCheckBoxCtrl>(iter->first); if (ctrl) { @@ -1575,7 +1628,7 @@ void LLPanelEditWearable::initPreviousAlphaTextures() initPreviousAlphaTextureEntry(TEX_LOWER_ALPHA); } -void LLPanelEditWearable::initPreviousAlphaTextureEntry(LLVOAvatarDefines::ETextureIndex te) +void LLPanelEditWearable::initPreviousAlphaTextureEntry(LLAvatarAppearanceDefines::ETextureIndex te) { LLLocalTextureObject *lto = getWearable()->getLocalTextureObject(te); if (lto) diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h index 692a7ce90f..81acc31863 100644 --- a/indra/newview/llpaneleditwearable.h +++ b/indra/newview/llpaneleditwearable.h @@ -30,12 +30,12 @@ #include "llpanel.h" #include "llscrollingpanellist.h" #include "llmodaldialog.h" -#include "llvoavatardefines.h" +#include "llavatarappearancedefines.h" #include "llwearabletype.h" class LLAccordionCtrl; class LLCheckBoxCtrl; -class LLWearable; +class LLViewerWearable; class LLTextBox; class LLViewerInventoryItem; class LLViewerVisualParam; @@ -54,12 +54,13 @@ public: /*virtual*/ BOOL postBuild(); /*virtual*/ BOOL isDirty() const; // LLUICtrl /*virtual*/ void draw(); + void onClose(); // changes camera angle to default for selected subpart void changeCamera(U8 subpart); - LLWearable* getWearable() { return mWearablePtr; } - void setWearable(LLWearable *wearable, BOOL disable_camera_switch = FALSE); + LLViewerWearable* getWearable() { return mWearablePtr; } + void setWearable(LLViewerWearable *wearable, BOOL disable_camera_switch = FALSE); void saveChanges(bool force_save_as = false); void revertChanges(); @@ -70,17 +71,17 @@ public: void updateScrollingPanelList(); static void onRevertButtonClicked(void* userdata); + static void onBackButtonClicked(void* userdata); void onCommitSexChange(); void onSaveAsButtonClicked(); void saveAsCallback(const LLSD& notification, const LLSD& response); virtual void setVisible(BOOL visible); - private: typedef std::map<F32, LLViewerVisualParam*> value_map_t; - void showWearable(LLWearable* wearable, BOOL show, BOOL disable_camera_switch = FALSE); + void showWearable(LLViewerWearable* wearable, BOOL show, BOOL disable_camera_switch = FALSE); void updateScrollingPanelUI(); LLPanel* getPanel(LLWearableType::EType type); void getSortedParams(value_map_t &sorted_params, const std::string &edit_group); @@ -95,16 +96,16 @@ private: void updateTypeSpecificControls(LLWearableType::EType type); //alpha mask checkboxes - void configureAlphaCheckbox(LLVOAvatarDefines::ETextureIndex te, const std::string& name); - void onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLVOAvatarDefines::ETextureIndex te); + void configureAlphaCheckbox(LLAvatarAppearanceDefines::ETextureIndex te, const std::string& name); + void onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLAvatarAppearanceDefines::ETextureIndex te); void updateAlphaCheckboxes(); void initPreviousAlphaTextures(); - void initPreviousAlphaTextureEntry(LLVOAvatarDefines::ETextureIndex te); + void initPreviousAlphaTextureEntry(LLAvatarAppearanceDefines::ETextureIndex te); // callback for HeightUnits parameter. bool changeHeightUnits(const LLSD& new_value); - // updates current metric and replacemet metric label text + // updates current metric and replacement metric label text void updateMetricLayout(BOOL new_value); // updates avatar height label @@ -114,8 +115,11 @@ private: void setWearablePanelVisibilityChangeCallback(LLPanel* bodypart_panel); + // *HACK Remove this when serverside texture baking is available on all regions. + void incrementCofVersionLegacy(); + // the pointer to the wearable we're editing. NULL means we're not editing a wearable. - LLWearable *mWearablePtr; + LLViewerWearable *mWearablePtr; LLViewerInventoryItem* mWearableItem; // these are constant no matter what wearable we're editing @@ -128,7 +132,7 @@ private: LLTextBox *mTxtAvatarHeight; - // localized and parametrized strings that used to build avatar_height_label + // localized and parameterized strings that used to build avatar_height_label std::string mMeters; std::string mFeet; std::string mHeigth; @@ -165,10 +169,10 @@ private: LLPanel *mPanelTattoo; LLPanel *mPanelPhysics; - typedef std::map<std::string, LLVOAvatarDefines::ETextureIndex> string_texture_index_map_t; + typedef std::map<std::string, LLAvatarAppearanceDefines::ETextureIndex> string_texture_index_map_t; string_texture_index_map_t mAlphaCheckbox2Index; - typedef std::map<LLVOAvatarDefines::ETextureIndex, LLUUID> s32_uuid_map_t; + typedef std::map<LLAvatarAppearanceDefines::ETextureIndex, LLUUID> s32_uuid_map_t; s32_uuid_map_t mPreviousAlphaTexture; }; diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 685614a8c4..67ef072508 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -120,7 +120,6 @@ BOOL LLPanelFace::postBuild() childSetCommitCallback("maskcutoff",&LLPanelFace::onCommitMaterial, this); childSetAction("button align",&LLPanelFace::onClickAutoFix,this); - LLRect rect = this->getRect(); LLTextureCtrl* mTextureCtrl; LLTextureCtrl* mShinyTextureCtrl; LLTextureCtrl* mBumpyTextureCtrl; diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp index 37755fb851..c927aeacb3 100644 --- a/indra/newview/llpanelgrouplandmoney.cpp +++ b/indra/newview/llpanelgrouplandmoney.cpp @@ -1383,13 +1383,11 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg, S32 cur_land_tax; S32 cur_group_tax; S32 cur_parcel_dir_fee; - S32 cur_total_tax; S32 proj_object_tax; S32 proj_light_tax; S32 proj_land_tax; S32 proj_group_tax; S32 proj_parcel_dir_fee; - S32 proj_total_tax; S32 non_exempt_members; msg->getS32Fast(_PREHASH_MoneyData, _PREHASH_IntervalDays, interval_days ); @@ -1413,8 +1411,6 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg, msg->getStringFast(_PREHASH_MoneyData, _PREHASH_LastTaxDate, last_stipend_date); msg->getStringFast(_PREHASH_MoneyData, _PREHASH_TaxDate, next_stipend_date); - cur_total_tax = cur_object_tax + cur_light_tax + cur_land_tax + cur_group_tax + cur_parcel_dir_fee; - proj_total_tax = proj_object_tax + proj_light_tax + proj_land_tax + proj_group_tax + proj_parcel_dir_fee; if (interval_days != mImplementationp->mIntervalLength || current_interval != mImplementationp->mCurrentInterval) diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index 93b108efcc..522ba5afae 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -35,6 +35,7 @@ #include "llviewerinventory.h" #include "llinventorydefines.h" #include "llinventoryfunctions.h" +#include "llinventoryicon.h" #include "llinventorymodel.h" #include "llfloaterinventory.h" #include "llagent.h" diff --git a/indra/newview/llpanelland.cpp b/indra/newview/llpanelland.cpp index 04c1a86f69..5321ebc777 100644 --- a/indra/newview/llpanelland.cpp +++ b/indra/newview/llpanelland.cpp @@ -166,7 +166,7 @@ void LLPanelLandInfo::refresh() getChildView("button abandon land")->setEnabled(owner_release || manager_releaseable || gAgent.isGodlike()); // only mainland sims are subdividable by owner - if (regionp->getRegionFlags() && REGION_FLAGS_ALLOW_PARCEL_CHANGES) + if (regionp->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES)) { getChildView("button subdivide land")->setEnabled(owner_divide || manager_divideable || gAgent.isGodlike()); } diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index c57746ec00..5c9b968ac9 100644 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -209,24 +209,6 @@ void LLPanelLandmarkInfo::processParcelInfo(const LLParcelData& parcel_data) mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_PG)); } - S32 region_x; - S32 region_y; - S32 region_z; - - // If the region position is zero, grab position from the global - if(mPosRegion.isExactlyZero()) - { - region_x = llround(parcel_data.global_x) % REGION_WIDTH_UNITS; - region_y = llround(parcel_data.global_y) % REGION_WIDTH_UNITS; - region_z = llround(parcel_data.global_z); - } - else - { - region_x = llround(mPosRegion.mV[VX]); - region_y = llround(mPosRegion.mV[VY]); - region_z = llround(mPosRegion.mV[VZ]); - } - LLSD info; info["update_verbs"] = true; info["global_x"] = parcel_data.global_x; diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index d87b565b32..25ef9a3d6a 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -439,10 +439,9 @@ void LLPanelObject::getState( ) mCtrlRotY->setEnabled( enable_rotate ); mCtrlRotZ->setEnabled( enable_rotate ); - BOOL owners_identical; LLUUID owner_id; std::string owner_name; - owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name); + LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name); // BUG? Check for all objects being editable? S32 roots_selected = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount(); diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 7555ac7b2c..d7130820ab 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -47,6 +47,7 @@ #include "llfolderview.h" #include "llinventorybridge.h" #include "llinventorydefines.h" +#include "llinventoryicon.h" #include "llinventoryfilter.h" #include "llinventoryfunctions.h" #include "llpreviewanim.h" diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index e641370d2e..131e8e9359 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -365,10 +365,8 @@ void LLPanelPermissions::refresh() // Update creator text field getChildView("Creator:")->setEnabled(TRUE); - BOOL creators_identical; std::string creator_name; - creators_identical = LLSelectMgr::getInstance()->selectGetCreator(mCreatorID, - creator_name); + LLSelectMgr::getInstance()->selectGetCreator(mCreatorID, creator_name); getChild<LLUICtrl>("Creator Name")->setValue(creator_name); getChildView("Creator Name")->setEnabled(TRUE); diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index 83b70d9f29..5d9971c16c 100644 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -568,7 +568,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, mTerraformLimitsText->setText(parcel->getAllowTerraform() ? on : off); - if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) + if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES)) { mSubdivideText->setText(getString("can_change")); } @@ -576,7 +576,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, { mSubdivideText->setText(getString("can_not_change")); } - if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) + if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL)) { mResaleText->setText(getString("can_not_resell")); } diff --git a/indra/newview/llpaneltopinfobar.cpp b/indra/newview/llpaneltopinfobar.cpp index 343c140bbb..9dd665198f 100644 --- a/indra/newview/llpaneltopinfobar.cpp +++ b/indra/newview/llpaneltopinfobar.cpp @@ -417,11 +417,11 @@ void LLPanelTopInfoBar::onParcelIconClick(EParcelIcon icon) case SCRIPTS_ICON: { LLViewerRegion* region = gAgent.getRegion(); - if(region && region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) + if(region && region->getRegionFlag(REGION_FLAGS_ESTATE_SKIP_SCRIPTS)) { LLNotificationsUtil::add("ScriptsStopped"); } - else if(region && region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) + else if(region && region->getRegionFlag(REGION_FLAGS_SKIP_SCRIPTS)) { LLNotificationsUtil::add("ScriptsNotRunning"); } diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index 13b746dbab..02d363d795 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -252,10 +252,9 @@ void LLPanelVolume::getState( ) return; } - BOOL owners_identical; LLUUID owner_id; std::string owner_name; - owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name); + LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name); // BUG? Check for all objects being editable? BOOL editable = root_objectp->permModify() && !root_objectp->isPermanentEnforced(); diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp index 3b9934d4be..aa3ed22bee 100644 --- a/indra/newview/llpanelwearing.cpp +++ b/indra/newview/llpanelwearing.cpp @@ -77,11 +77,7 @@ private: { uuid_vec_t selected_uuids; mPanelWearing->getSelectedItemsUUIDs(selected_uuids); - - for (uuid_vec_t::const_iterator it=selected_uuids.begin(); it != selected_uuids.end(); ++it) - { - LLAppearanceMgr::instance().removeItemFromAvatar(*it); - } + LLAppearanceMgr::instance().removeItemsFromAvatar(selected_uuids); } LLToggleableMenu* mMenu; @@ -97,12 +93,11 @@ protected: { LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; - functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1); - registrar.add("Wearing.Edit", boost::bind(&edit_outfit)); - registrar.add("Wearing.TakeOff", boost::bind(handleMultiple, take_off, mUUIDs)); - registrar.add("Wearing.Detach", boost::bind(handleMultiple, take_off, mUUIDs)); - + registrar.add("Wearing.TakeOff", + boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs)); + registrar.add("Wearing.Detach", + boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs)); LLContextMenu* menu = createFromFile("menu_wearing_tab.xml"); updateMenuItemsVisibility(menu); diff --git a/indra/newview/llpathfindingmanager.cpp b/indra/newview/llpathfindingmanager.cpp index 2dd01e931e..c277359133 100644 --- a/indra/newview/llpathfindingmanager.cpp +++ b/indra/newview/llpathfindingmanager.cpp @@ -108,7 +108,7 @@ public: virtual ~NavMeshStatusResponder(); virtual void result(const LLSD &pContent); - virtual void error(U32 pStatus, const std::string& pReason); + virtual void errorWithContent(U32 pStatus, const std::string& pReason, const LLSD& pContent); protected: @@ -130,7 +130,7 @@ public: virtual ~NavMeshResponder(); virtual void result(const LLSD &pContent); - virtual void error(U32 pStatus, const std::string& pReason); + virtual void errorWithContent(U32 pStatus, const std::string& pReason, const LLSD& pContent); protected: @@ -151,7 +151,7 @@ public: virtual ~AgentStateResponder(); virtual void result(const LLSD &pContent); - virtual void error(U32 pStatus, const std::string& pReason); + virtual void errorWithContent(U32 pStatus, const std::string& pReason, const LLSD& pContent); protected: @@ -170,7 +170,7 @@ public: virtual ~NavMeshRebakeResponder(); virtual void result(const LLSD &pContent); - virtual void error(U32 pStatus, const std::string& pReason); + virtual void errorWithContent(U32 pStatus, const std::string& pReason, const LLSD& pContent); protected: @@ -190,9 +190,11 @@ public: virtual ~LinksetsResponder(); void handleObjectLinksetsResult(const LLSD &pContent); - void handleObjectLinksetsError(U32 pStatus, const std::string &pReason, const std::string &pURL); + void handleObjectLinksetsError(U32 pStatus, const std::string &pReason, + const LLSD& pContent, const std::string &pURL); void handleTerrainLinksetsResult(const LLSD &pContent); - void handleTerrainLinksetsError(U32 pStatus, const std::string &pReason, const std::string &pURL); + void handleTerrainLinksetsError(U32 pStatus, const std::string &pReason, + const LLSD& pContent, const std::string &pURL); protected: @@ -230,7 +232,7 @@ public: virtual ~ObjectLinksetsResponder(); virtual void result(const LLSD &pContent); - virtual void error(U32 pStatus, const std::string &pReason); + virtual void errorWithContent(U32 pStatus, const std::string &pReason, const LLSD& pContent); protected: @@ -250,7 +252,7 @@ public: virtual ~TerrainLinksetsResponder(); virtual void result(const LLSD &pContent); - virtual void error(U32 pStatus, const std::string &pReason); + virtual void errorWithContent(U32 pStatus, const std::string &pReason, const LLSD& pContent); protected: @@ -270,7 +272,7 @@ public: virtual ~CharactersResponder(); virtual void result(const LLSD &pContent); - virtual void error(U32 pStatus, const std::string &pReason); + virtual void errorWithContent(U32 pStatus, const std::string &pReason, const LLSD& pContent); protected: @@ -800,9 +802,9 @@ void NavMeshStatusResponder::result(const LLSD &pContent) LLPathfindingManager::getInstance()->handleNavMeshStatusRequest(navMeshStatus, mRegion, mIsGetStatusOnly); } -void NavMeshStatusResponder::error(U32 pStatus, const std::string& pReason) +void NavMeshStatusResponder::errorWithContent(U32 pStatus, const std::string& pReason, const LLSD& pContent) { - llwarns << "error with request to URL '" << mCapabilityURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl; + llwarns << "NavMeshStatusResponder error [status:" << pStatus << "]: " << pContent << llendl; LLPathfindingNavMeshStatus navMeshStatus(mRegionUUID); LLPathfindingManager::getInstance()->handleNavMeshStatusRequest(navMeshStatus, mRegion, mIsGetStatusOnly); } @@ -828,9 +830,9 @@ void NavMeshResponder::result(const LLSD &pContent) mNavMeshPtr->handleNavMeshResult(pContent, mNavMeshVersion); } -void NavMeshResponder::error(U32 pStatus, const std::string& pReason) +void NavMeshResponder::errorWithContent(U32 pStatus, const std::string& pReason, const LLSD& pContent) { - mNavMeshPtr->handleNavMeshError(pStatus, pReason, mCapabilityURL, mNavMeshVersion); + mNavMeshPtr->handleNavMeshError(pStatus, pReason, pContent, mCapabilityURL, mNavMeshVersion); } //--------------------------------------------------------------------------- @@ -855,9 +857,9 @@ void AgentStateResponder::result(const LLSD &pContent) LLPathfindingManager::getInstance()->handleAgentState(canRebakeRegion); } -void AgentStateResponder::error(U32 pStatus, const std::string &pReason) +void AgentStateResponder::errorWithContent(U32 pStatus, const std::string &pReason, const LLSD& pContent) { - llwarns << "error with request to URL '" << mCapabilityURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl; + llwarns << "AgentStateResponder error [status:" << pStatus << "]: " << pContent << llendl; LLPathfindingManager::getInstance()->handleAgentState(FALSE); } @@ -881,9 +883,9 @@ void NavMeshRebakeResponder::result(const LLSD &pContent) mRebakeNavMeshCallback(true); } -void NavMeshRebakeResponder::error(U32 pStatus, const std::string &pReason) +void NavMeshRebakeResponder::errorWithContent(U32 pStatus, const std::string &pReason, const LLSD& pContent) { - llwarns << "error with request to URL '" << mCapabilityURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl; + llwarns << "NavMeshRebakeResponder error [status:" << pStatus << "]: " << pContent << llendl; mRebakeNavMeshCallback(false); } @@ -916,9 +918,11 @@ void LinksetsResponder::handleObjectLinksetsResult(const LLSD &pContent) } } -void LinksetsResponder::handleObjectLinksetsError(U32 pStatus, const std::string &pReason, const std::string &pURL) +void LinksetsResponder::handleObjectLinksetsError(U32 pStatus, const std::string &pReason, + const LLSD& pContent, const std::string &pURL) { - llwarns << "error with request to URL '" << pURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl; + llwarns << "LinksetsResponder object linksets error with request to URL '" << pURL << "' [status:" + << pStatus << "]: " << pContent << llendl; mObjectMessagingState = kReceivedError; if (mTerrainMessagingState != kWaiting) { @@ -937,8 +941,11 @@ void LinksetsResponder::handleTerrainLinksetsResult(const LLSD &pContent) } } -void LinksetsResponder::handleTerrainLinksetsError(U32 pStatus, const std::string &pReason, const std::string &pURL) +void LinksetsResponder::handleTerrainLinksetsError(U32 pStatus, const std::string &pReason, + const LLSD& pContent, const std::string &pURL) { + llwarns << "LinksetsResponder terrain linksets error with request to URL '" << pURL << "' [status:" + << pStatus << "]: " << pContent << llendl; mTerrainMessagingState = kReceivedError; if (mObjectMessagingState != kWaiting) { @@ -988,9 +995,9 @@ void ObjectLinksetsResponder::result(const LLSD &pContent) mLinksetsResponsderPtr->handleObjectLinksetsResult(pContent); } -void ObjectLinksetsResponder::error(U32 pStatus, const std::string &pReason) +void ObjectLinksetsResponder::errorWithContent(U32 pStatus, const std::string &pReason, const LLSD& pContent) { - mLinksetsResponsderPtr->handleObjectLinksetsError(pStatus, pReason, mCapabilityURL); + mLinksetsResponsderPtr->handleObjectLinksetsError(pStatus, pReason, pContent, mCapabilityURL); } //--------------------------------------------------------------------------- @@ -1013,9 +1020,9 @@ void TerrainLinksetsResponder::result(const LLSD &pContent) mLinksetsResponsderPtr->handleTerrainLinksetsResult(pContent); } -void TerrainLinksetsResponder::error(U32 pStatus, const std::string &pReason) +void TerrainLinksetsResponder::errorWithContent(U32 pStatus, const std::string &pReason, const LLSD& pContent) { - mLinksetsResponsderPtr->handleTerrainLinksetsError(pStatus, pReason, mCapabilityURL); + mLinksetsResponsderPtr->handleTerrainLinksetsError(pStatus, pReason, pContent, mCapabilityURL); } //--------------------------------------------------------------------------- @@ -1040,9 +1047,9 @@ void CharactersResponder::result(const LLSD &pContent) mCharactersCallback(mRequestId, LLPathfindingManager::kRequestCompleted, characterListPtr); } -void CharactersResponder::error(U32 pStatus, const std::string &pReason) +void CharactersResponder::errorWithContent(U32 pStatus, const std::string &pReason, const LLSD& pContent) { - llwarns << "error with request to URL '" << mCapabilityURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl; + llwarns << "CharactersResponder error [status:" << pStatus << "]: " << pContent << llendl; LLPathfindingObjectListPtr characterListPtr = LLPathfindingObjectListPtr(new LLPathfindingCharacterList()); mCharactersCallback(mRequestId, LLPathfindingManager::kRequestError, characterListPtr); diff --git a/indra/newview/llpathfindingnavmesh.cpp b/indra/newview/llpathfindingnavmesh.cpp index e01dd3a152..0c23e5ac92 100644 --- a/indra/newview/llpathfindingnavmesh.cpp +++ b/indra/newview/llpathfindingnavmesh.cpp @@ -184,9 +184,10 @@ void LLPathfindingNavMesh::handleNavMeshError() setRequestStatus(kNavMeshRequestError); } -void LLPathfindingNavMesh::handleNavMeshError(U32 pStatus, const std::string &pReason, const std::string &pURL, U32 pNavMeshVersion) +void LLPathfindingNavMesh::handleNavMeshError(U32 pStatus, const std::string &pReason, const LLSD& pContent, const std::string &pURL, U32 pNavMeshVersion) { - llwarns << "error with request to URL '" << pURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl; + llwarns << "LLPathfindingNavMesh error with request to URL '" << pURL << "' [status:" + << pStatus << "]: " << pContent << llendl; if (mNavMeshStatus.getVersion() == pNavMeshVersion) { handleNavMeshError(); diff --git a/indra/newview/llpathfindingnavmesh.h b/indra/newview/llpathfindingnavmesh.h index 7a844f54ce..b872ccad7c 100644 --- a/indra/newview/llpathfindingnavmesh.h +++ b/indra/newview/llpathfindingnavmesh.h @@ -74,7 +74,7 @@ public: void handleNavMeshResult(const LLSD &pContent, U32 pNavMeshVersion); void handleNavMeshNotEnabled(); void handleNavMeshError(); - void handleNavMeshError(U32 pStatus, const std::string &pReason, const std::string &pURL, U32 pNavMeshVersion); + void handleNavMeshError(U32 pStatus, const std::string &pReason, const LLSD& pContent, const std::string &pURL, U32 pNavMeshVersion); protected: diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index cb6989c9dd..18b85cc9c3 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -166,7 +166,7 @@ protected: } - void setParamValue(LLViewerVisualParam *param, + void setParamValue(const LLViewerVisualParam *param, const F32 new_value_local, F32 behavior_maxeffect); @@ -430,7 +430,6 @@ F32 LLPhysicsMotion::calculateVelocity_local() const F32 world_to_model_scale = 100.0f; LLJoint *joint = mJointState->getJoint(); const LLVector3 position_world = joint->getWorldPosition(); - const LLQuaternion rotation_world = joint->getWorldRotation(); const LLVector3 last_position_world = mPosition_world; const LLVector3 positionchange_world = (position_world-last_position_world) * world_to_model_scale; const LLVector3 velocity_world = positionchange_world; @@ -673,12 +672,10 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) 0, FALSE); } - for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin(); - iter != driver_param->mDriven.end(); - ++iter) + S32 num_driven = driver_param->getDrivenParamsCount(); + for (S32 i = 0; i < num_driven; ++i) { - LLDrivenEntry &entry = (*iter); - LLViewerVisualParam *driven_param = entry.mParam; + const LLViewerVisualParam *driven_param = driver_param->getDrivenParam(i); setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect); } } @@ -758,7 +755,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) } // Range of new_value_local is assumed to be [0 , 1] normalized. -void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param, +void LLPhysicsMotion::setParamValue(const LLViewerVisualParam *param, F32 new_value_normalized, F32 behavior_maxeffect) { diff --git a/indra/newview/llpipelinelistener.cpp b/indra/newview/llpipelinelistener.cpp new file mode 100644 index 0000000000..20759239bf --- /dev/null +++ b/indra/newview/llpipelinelistener.cpp @@ -0,0 +1,216 @@ +/** + * @file llpipelinelistener.h + * @author Don Kjer + * @date 2012-07-09 + * @brief Implementation for LLPipelineListener + * + * $LicenseInfo:firstyear=2012&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2012, 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$ + */ + +// Precompiled header +#include "llviewerprecompiledheaders.h" + +#include "llpipelinelistener.h" + +#include "pipeline.h" +#include "stringize.h" +#include <sstream> +#include "llviewermenu.h" + + +namespace { + // Render Types + void toggle_render_types_wrapper(LLSD const& request) + { + for (LLSD::array_const_iterator iter = request["types"].beginArray(); + iter != request["types"].endArray(); + ++iter) + { + U32 render_type = render_type_from_string( iter->asString() ); + if ( render_type != 0 ) + { + LLPipeline::toggleRenderTypeControl( (void*) render_type ); + } + } + } + + void has_render_type_wrapper(LLSD const& request) + { + LLEventAPI::Response response(LLSD(), request); + U32 render_type = render_type_from_string( request["type"].asString() ); + if ( render_type != 0 ) + { + response["value"] = LLPipeline::hasRenderTypeControl( (void*) render_type ); + } + else + { + response.error(STRINGIZE("unknown type '" << request["type"].asString() << "'")); + } + } + + void disable_all_render_types_wrapper(LLSD const& request) + { + gPipeline.clearAllRenderTypes(); + } + + void enable_all_render_types_wrapper(LLSD const& request) + { + gPipeline.setAllRenderTypes(); + } + + // Render Features + void toggle_render_features_wrapper(LLSD const& request) + { + for (LLSD::array_const_iterator iter = request["features"].beginArray(); + iter != request["features"].endArray(); + ++iter) + { + U32 render_feature = feature_from_string( iter->asString() ); + if ( render_feature != 0 ) + { + LLPipeline::toggleRenderDebugControl( (void*) render_feature ); + } + } + } + + void has_render_feature_wrapper(LLSD const& request) + { + LLEventAPI::Response response(LLSD(), request); + U32 render_feature = feature_from_string( request["feature"].asString() ); + if ( render_feature != 0 ) + { + response["value"] = gPipeline.hasRenderDebugFeatureMask(render_feature); + } + else + { + response.error(STRINGIZE("unknown feature '" << request["feature"].asString() << "'")); + } + } + + void disable_all_render_features_wrapper(LLSD const& request) + { + gPipeline.clearAllRenderDebugFeatures(); + } + + void enable_all_render_features_wrapper(LLSD const& request) + { + gPipeline.setAllRenderDebugFeatures(); + } + + // Render Info Displays + void toggle_info_displays_wrapper(LLSD const& request) + { + for (LLSD::array_const_iterator iter = request["displays"].beginArray(); + iter != request["displays"].endArray(); + ++iter) + { + U32 info_display = info_display_from_string( iter->asString() ); + if ( info_display != 0 ) + { + LLPipeline::toggleRenderDebug( (void*) info_display ); + } + } + } + + void has_info_display_wrapper(LLSD const& request) + { + LLEventAPI::Response response(LLSD(), request); + U32 info_display = info_display_from_string( request["display"].asString() ); + if ( info_display != 0 ) + { + response["value"] = gPipeline.hasRenderDebugMask(info_display); + } + else + { + response.error(STRINGIZE("unknown display '" << request["display"].asString() << "'")); + } + } + + void disable_all_info_displays_wrapper(LLSD const& request) + { + gPipeline.clearAllRenderDebugDisplays(); + } + + void enable_all_info_displays_wrapper(LLSD const& request) + { + gPipeline.setAllRenderDebugDisplays(); + } + +} + + +LLPipelineListener::LLPipelineListener(): + LLEventAPI("LLPipeline", + "API to te rendering pipeline.") +{ + // Render Types + add("toggleRenderTypes", + "Toggle rendering [\"types\"]:\n" + "See: llviewermenu.cpp:render_type_from_string for list of available types.", + &toggle_render_types_wrapper); + add("hasRenderType", + "Check if rendering [\"type\"] is enabled:\n" + "See: llviewermenu.cpp:render_type_from_string for list of available types.", + &has_render_type_wrapper, + LLSDMap("reply", LLSD())); + add("disableAllRenderTypes", + "Turn off all rendering types.", + &disable_all_render_types_wrapper); + add("enableAllRenderTypes", + "Turn on all rendering types.", + &enable_all_render_types_wrapper); + + // Render Features + add("toggleRenderFeatures", + "Toggle rendering [\"features\"]:\n" + "See: llviewermenu.cpp:feature_from_string for list of available features.", + &toggle_render_features_wrapper); + add("hasRenderFeature", + "Check if rendering [\"feature\"] is enabled:\n" + "See: llviewermenu.cpp:render_feature_from_string for list of available features.", + &has_render_feature_wrapper, + LLSDMap("reply", LLSD())); + add("disableAllRenderFeatures", + "Turn off all rendering features.", + &disable_all_render_features_wrapper); + add("enableAllRenderFeatures", + "Turn on all rendering features.", + &enable_all_render_features_wrapper); + + // Render Info Displays + add("toggleRenderInfoDisplays", + "Toggle info [\"displays\"]:\n" + "See: llviewermenu.cpp:info_display_from_string for list of available displays.", + &toggle_info_displays_wrapper); + add("hasRenderInfoDisplay", + "Check if info [\"display\"] is enabled:\n" + "See: llviewermenu.cpp:info_display_from_string for list of available displays.", + &has_info_display_wrapper, + LLSDMap("reply", LLSD())); + add("disableAllRenderInfoDisplays", + "Turn off all info displays.", + &disable_all_info_displays_wrapper); + add("enableAllRenderInfoDisplays", + "Turn on all info displays.", + &enable_all_info_displays_wrapper); +} + diff --git a/indra/newview/fmodwrapper.cpp b/indra/newview/llpipelinelistener.h index 16f1d19a78..da1898e57b 100644 --- a/indra/newview/fmodwrapper.cpp +++ b/indra/newview/llpipelinelistener.h @@ -1,8 +1,10 @@ -/** - * @file fmodwrapper.cpp - * @brief dummy source file for building a shared library to wrap libfmod.a - * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ +/** + * @file llpipelinelistener.h + * @author Don Kjer + * @date 2012-07-09 + * @brief Wrap subset of LLPipeline API in event API + * + * $LicenseInfo:firstyear=2012&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. * @@ -24,14 +26,16 @@ * $/LicenseInfo$ */ -extern "C" -{ - void FSOUND_Init(void); -} +#if ! defined(LL_LLPIPELINELISTENER_H) +#define LL_LLPIPELINELISTENER_H -void* fmodwrapper(void) +#include "lleventapi.h" + +/// Listen on an LLEventPump with specified name for LLPipeline request events. +class LLPipelineListener: public LLEventAPI { - // When building the fmodwrapper library, the linker doesn't seem to want to bring in libfmod.a unless I explicitly - // reference at least one symbol in the library. This seemed like the simplest way. - return (void*)&FSOUND_Init; -} +public: + LLPipelineListener(); +}; + +#endif /* ! defined(LL_LLPIPELINELISTENER_H) */ diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp deleted file mode 100644 index 5f5258bbce..0000000000 --- a/indra/newview/llpolymesh.cpp +++ /dev/null @@ -1,1295 +0,0 @@ -/** - * @file llpolymesh.cpp - * @brief Implementation of LLPolyMesh class - * - * $LicenseInfo:firstyear=2001&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$ - */ - -//----------------------------------------------------------------------------- -// Header Files -//----------------------------------------------------------------------------- -#include "llviewerprecompiledheaders.h" - -#include "llfasttimer.h" -#include "llmemory.h" - -#include "llviewercontrol.h" -#include "llxmltree.h" -#include "llvoavatar.h" -#include "llwearable.h" -#include "lldir.h" -#include "llvolume.h" -#include "llendianswizzle.h" - -#include "llpolymesh.h" - -#define HEADER_ASCII "Linden Mesh 1.0" -#define HEADER_BINARY "Linden Binary Mesh 1.0" - -extern LLControlGroup gSavedSettings; // read only - -LLPolyMorphData *clone_morph_param_duplicate(const LLPolyMorphData *src_data, - const std::string &name); -LLPolyMorphData *clone_morph_param_direction(const LLPolyMorphData *src_data, - const LLVector3 &direction, - const std::string &name); -LLPolyMorphData *clone_morph_param_cleavage(const LLPolyMorphData *src_data, - F32 scale, - const std::string &name); - -//----------------------------------------------------------------------------- -// Global table of loaded LLPolyMeshes -//----------------------------------------------------------------------------- -LLPolyMesh::LLPolyMeshSharedDataTable LLPolyMesh::sGlobalSharedMeshList; - -//----------------------------------------------------------------------------- -// LLPolyMeshSharedData() -//----------------------------------------------------------------------------- -LLPolyMeshSharedData::LLPolyMeshSharedData() -{ - mNumVertices = 0; - mBaseCoords = NULL; - mBaseNormals = NULL; - mBaseBinormals = NULL; - mTexCoords = NULL; - mDetailTexCoords = NULL; - mWeights = NULL; - mHasWeights = FALSE; - mHasDetailTexCoords = FALSE; - - mNumFaces = 0; - mFaces = NULL; - - mNumJointNames = 0; - mJointNames = NULL; - - mTriangleIndices = NULL; - mNumTriangleIndices = 0; - - mReferenceData = NULL; - - mLastIndexOffset = -1; -} - -//----------------------------------------------------------------------------- -// ~LLPolyMeshSharedData() -//----------------------------------------------------------------------------- -LLPolyMeshSharedData::~LLPolyMeshSharedData() -{ - freeMeshData(); - for_each(mMorphData.begin(), mMorphData.end(), DeletePointer()); - mMorphData.clear(); -} - -//----------------------------------------------------------------------------- -// setupLOD() -//----------------------------------------------------------------------------- -void LLPolyMeshSharedData::setupLOD(LLPolyMeshSharedData* reference_data) -{ - mReferenceData = reference_data; - - if (reference_data) - { - mBaseCoords = reference_data->mBaseCoords; - mBaseNormals = reference_data->mBaseNormals; - mBaseBinormals = reference_data->mBaseBinormals; - mTexCoords = reference_data->mTexCoords; - mDetailTexCoords = reference_data->mDetailTexCoords; - mWeights = reference_data->mWeights; - mHasWeights = reference_data->mHasWeights; - mHasDetailTexCoords = reference_data->mHasDetailTexCoords; - } -} - -//----------------------------------------------------------------------------- -// LLPolyMeshSharedData::freeMeshData() -//----------------------------------------------------------------------------- -void LLPolyMeshSharedData::freeMeshData() -{ - if (!mReferenceData) - { - mNumVertices = 0; - - ll_aligned_free_16(mBaseCoords); - mBaseCoords = NULL; - - ll_aligned_free_16(mBaseNormals); - mBaseNormals = NULL; - - ll_aligned_free_16(mBaseBinormals); - mBaseBinormals = NULL; - - ll_aligned_free_16(mTexCoords); - mTexCoords = NULL; - - ll_aligned_free_16(mDetailTexCoords); - mDetailTexCoords = NULL; - - ll_aligned_free_16(mWeights); - mWeights = NULL; - } - - mNumFaces = 0; - delete [] mFaces; - mFaces = NULL; - - mNumJointNames = 0; - delete [] mJointNames; - mJointNames = NULL; - - delete [] mTriangleIndices; - mTriangleIndices = NULL; - -// mVertFaceMap.deleteAllData(); -} - -// compate_int is used by the qsort function to sort the index array -int compare_int(const void *a, const void *b); - -//----------------------------------------------------------------------------- -// genIndices() -//----------------------------------------------------------------------------- -void LLPolyMeshSharedData::genIndices(S32 index_offset) -{ - if (index_offset == mLastIndexOffset) - { - return; - } - - delete []mTriangleIndices; - mTriangleIndices = new U32[mNumTriangleIndices]; - - S32 cur_index = 0; - for (S32 i = 0; i < mNumFaces; i++) - { - mTriangleIndices[cur_index] = mFaces[i][0] + index_offset; - cur_index++; - mTriangleIndices[cur_index] = mFaces[i][1] + index_offset; - cur_index++; - mTriangleIndices[cur_index] = mFaces[i][2] + index_offset; - cur_index++; - } - - mLastIndexOffset = index_offset; -} - -//-------------------------------------------------------------------- -// LLPolyMeshSharedData::getNumKB() -//-------------------------------------------------------------------- -U32 LLPolyMeshSharedData::getNumKB() -{ - U32 num_kb = sizeof(LLPolyMesh); - - if (!isLOD()) - { - num_kb += mNumVertices * - ( sizeof(LLVector3) + // coords - sizeof(LLVector3) + // normals - sizeof(LLVector2) ); // texCoords - } - - if (mHasDetailTexCoords && !isLOD()) - { - num_kb += mNumVertices * sizeof(LLVector2); // detailTexCoords - } - - if (mHasWeights && !isLOD()) - { - num_kb += mNumVertices * sizeof(float); // weights - } - - num_kb += mNumFaces * sizeof(LLPolyFace); // faces - - num_kb /= 1024; - return num_kb; -} - -//----------------------------------------------------------------------------- -// LLPolyMeshSharedData::allocateVertexData() -//----------------------------------------------------------------------------- -BOOL LLPolyMeshSharedData::allocateVertexData( U32 numVertices ) -{ - U32 i; - mBaseCoords = (LLVector4a*) ll_aligned_malloc_16(numVertices*sizeof(LLVector4a)); - mBaseNormals = (LLVector4a*) ll_aligned_malloc_16(numVertices*sizeof(LLVector4a)); - mBaseBinormals = (LLVector4a*) ll_aligned_malloc_16(numVertices*sizeof(LLVector4a)); - mTexCoords = (LLVector2*) ll_aligned_malloc_16(numVertices*sizeof(LLVector2)); - mDetailTexCoords = (LLVector2*) ll_aligned_malloc_16(numVertices*sizeof(LLVector2)); - mWeights = (F32*) ll_aligned_malloc_16(numVertices*sizeof(F32)); - for (i = 0; i < numVertices; i++) - { - mBaseCoords[i].clear(); - mBaseNormals[i].clear(); - mBaseBinormals[i].clear(); - mTexCoords[i].clear(); - mWeights[i] = 0.f; - } - mNumVertices = numVertices; - return TRUE; -} - -//----------------------------------------------------------------------------- -// LLPolyMeshSharedData::allocateFaceData() -//----------------------------------------------------------------------------- -BOOL LLPolyMeshSharedData::allocateFaceData( U32 numFaces ) -{ - mFaces = new LLPolyFace[ numFaces ]; - mNumFaces = numFaces; - mNumTriangleIndices = mNumFaces * 3; - return TRUE; -} - -//----------------------------------------------------------------------------- -// LLPolyMeshSharedData::allocateJointNames() -//----------------------------------------------------------------------------- -BOOL LLPolyMeshSharedData::allocateJointNames( U32 numJointNames ) -{ - mJointNames = new std::string[ numJointNames ]; - mNumJointNames = numJointNames; - return TRUE; -} - -//-------------------------------------------------------------------- -// LLPolyMeshSharedData::loadMesh() -//-------------------------------------------------------------------- -BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName ) -{ - //------------------------------------------------------------------------- - // Open the file - //------------------------------------------------------------------------- - if(fileName.empty()) - { - llerrs << "Filename is Empty!" << llendl; - return FALSE; - } - LLFILE* fp = LLFile::fopen(fileName, "rb"); /*Flawfinder: ignore*/ - if (!fp) - { - llerrs << "can't open: " << fileName << llendl; - return FALSE; - } - - //------------------------------------------------------------------------- - // Read a chunk - //------------------------------------------------------------------------- - char header[128]; /*Flawfinder: ignore*/ - if (fread(header, sizeof(char), 128, fp) != 128) - { - llwarns << "Short read" << llendl; - } - - //------------------------------------------------------------------------- - // Check for proper binary header - //------------------------------------------------------------------------- - BOOL status = FALSE; - if ( strncmp(header, HEADER_BINARY, strlen(HEADER_BINARY)) == 0 ) /*Flawfinder: ignore*/ - { - lldebugs << "Loading " << fileName << llendl; - - //---------------------------------------------------------------- - // File Header (seek past it) - //---------------------------------------------------------------- - fseek(fp, 24, SEEK_SET); - - //---------------------------------------------------------------- - // HasWeights - //---------------------------------------------------------------- - U8 hasWeights; - size_t numRead = fread(&hasWeights, sizeof(U8), 1, fp); - if (numRead != 1) - { - llerrs << "can't read HasWeights flag from " << fileName << llendl; - return FALSE; - } - if (!isLOD()) - { - mHasWeights = (hasWeights==0) ? FALSE : TRUE; - } - - //---------------------------------------------------------------- - // HasDetailTexCoords - //---------------------------------------------------------------- - U8 hasDetailTexCoords; - numRead = fread(&hasDetailTexCoords, sizeof(U8), 1, fp); - if (numRead != 1) - { - llerrs << "can't read HasDetailTexCoords flag from " << fileName << llendl; - return FALSE; - } - - //---------------------------------------------------------------- - // Position - //---------------------------------------------------------------- - LLVector3 position; - numRead = fread(position.mV, sizeof(float), 3, fp); - llendianswizzle(position.mV, sizeof(float), 3); - if (numRead != 3) - { - llerrs << "can't read Position from " << fileName << llendl; - return FALSE; - } - setPosition( position ); - - //---------------------------------------------------------------- - // Rotation - //---------------------------------------------------------------- - LLVector3 rotationAngles; - numRead = fread(rotationAngles.mV, sizeof(float), 3, fp); - llendianswizzle(rotationAngles.mV, sizeof(float), 3); - if (numRead != 3) - { - llerrs << "can't read RotationAngles from " << fileName << llendl; - return FALSE; - } - - U8 rotationOrder; - numRead = fread(&rotationOrder, sizeof(U8), 1, fp); - - if (numRead != 1) - { - llerrs << "can't read RotationOrder from " << fileName << llendl; - return FALSE; - } - - rotationOrder = 0; - - setRotation( mayaQ( rotationAngles.mV[0], - rotationAngles.mV[1], - rotationAngles.mV[2], - (LLQuaternion::Order)rotationOrder ) ); - - //---------------------------------------------------------------- - // Scale - //---------------------------------------------------------------- - LLVector3 scale; - numRead = fread(scale.mV, sizeof(float), 3, fp); - llendianswizzle(scale.mV, sizeof(float), 3); - if (numRead != 3) - { - llerrs << "can't read Scale from " << fileName << llendl; - return FALSE; - } - setScale( scale ); - - //------------------------------------------------------------------------- - // Release any existing mesh geometry - //------------------------------------------------------------------------- - freeMeshData(); - - U16 numVertices = 0; - - //---------------------------------------------------------------- - // NumVertices - //---------------------------------------------------------------- - if (!isLOD()) - { - numRead = fread(&numVertices, sizeof(U16), 1, fp); - llendianswizzle(&numVertices, sizeof(U16), 1); - if (numRead != 1) - { - llerrs << "can't read NumVertices from " << fileName << llendl; - return FALSE; - } - - allocateVertexData( numVertices ); - - for (U16 i = 0; i < numVertices; ++i) - { - //---------------------------------------------------------------- - // Coords - //---------------------------------------------------------------- - numRead = fread(&mBaseCoords[i], sizeof(float), 3, fp); - llendianswizzle(&mBaseCoords[i], sizeof(float), 3); - if (numRead != 3) - { - llerrs << "can't read Coordinates from " << fileName << llendl; - return FALSE; - } - } - - for (U16 i = 0; i < numVertices; ++i) - { - //---------------------------------------------------------------- - // Normals - //---------------------------------------------------------------- - numRead = fread(&mBaseNormals[i], sizeof(float), 3, fp); - llendianswizzle(&mBaseNormals[i], sizeof(float), 3); - if (numRead != 3) - { - llerrs << " can't read Normals from " << fileName << llendl; - return FALSE; - } - } - - for (U16 i = 0; i < numVertices; ++i) - { - //---------------------------------------------------------------- - // Binormals - //---------------------------------------------------------------- - numRead = fread(&mBaseBinormals[i], sizeof(float), 3, fp); - llendianswizzle(&mBaseBinormals[i], sizeof(float), 3); - if (numRead != 3) - { - llerrs << " can't read Binormals from " << fileName << llendl; - return FALSE; - } - } - - //---------------------------------------------------------------- - // TexCoords - //---------------------------------------------------------------- - numRead = fread(mTexCoords, 2*sizeof(float), numVertices, fp); - llendianswizzle(mTexCoords, sizeof(float), 2*numVertices); - if (numRead != numVertices) - { - llerrs << "can't read TexCoords from " << fileName << llendl; - return FALSE; - } - - //---------------------------------------------------------------- - // DetailTexCoords - //---------------------------------------------------------------- - if (mHasDetailTexCoords) - { - numRead = fread(mDetailTexCoords, 2*sizeof(float), numVertices, fp); - llendianswizzle(mDetailTexCoords, sizeof(float), 2*numVertices); - if (numRead != numVertices) - { - llerrs << "can't read DetailTexCoords from " << fileName << llendl; - return FALSE; - } - } - - //---------------------------------------------------------------- - // Weights - //---------------------------------------------------------------- - if (mHasWeights) - { - numRead = fread(mWeights, sizeof(float), numVertices, fp); - llendianswizzle(mWeights, sizeof(float), numVertices); - if (numRead != numVertices) - { - llerrs << "can't read Weights from " << fileName << llendl; - return FALSE; - } - } - } - - //---------------------------------------------------------------- - // NumFaces - //---------------------------------------------------------------- - U16 numFaces; - numRead = fread(&numFaces, sizeof(U16), 1, fp); - llendianswizzle(&numFaces, sizeof(U16), 1); - if (numRead != 1) - { - llerrs << "can't read NumFaces from " << fileName << llendl; - return FALSE; - } - allocateFaceData( numFaces ); - - - //---------------------------------------------------------------- - // Faces - //---------------------------------------------------------------- - U32 i; - U32 numTris = 0; - for (i = 0; i < numFaces; i++) - { - S16 face[3]; - numRead = fread(face, sizeof(U16), 3, fp); - llendianswizzle(face, sizeof(U16), 3); - if (numRead != 3) - { - llerrs << "can't read Face[" << i << "] from " << fileName << llendl; - return FALSE; - } - if (mReferenceData) - { - llassert(face[0] < mReferenceData->mNumVertices); - llassert(face[1] < mReferenceData->mNumVertices); - llassert(face[2] < mReferenceData->mNumVertices); - } - - if (isLOD()) - { - // store largest index in case of LODs - for (S32 j = 0; j < 3; j++) - { - if (face[j] > mNumVertices - 1) - { - mNumVertices = face[j] + 1; - } - } - } - mFaces[i][0] = face[0]; - mFaces[i][1] = face[1]; - mFaces[i][2] = face[2]; - -// S32 j; -// for(j = 0; j < 3; j++) -// { -// LLDynamicArray<S32> *face_list = mVertFaceMap.getIfThere(face[j]); -// if (!face_list) -// { -// face_list = new LLDynamicArray<S32>; -// mVertFaceMap.addData(face[j], face_list); -// } -// face_list->put(i); -// } - - numTris++; - } - - lldebugs << "verts: " << numVertices - << ", faces: " << numFaces - << ", tris: " << numTris - << llendl; - - //---------------------------------------------------------------- - // NumSkinJoints - //---------------------------------------------------------------- - if (!isLOD()) - { - U16 numSkinJoints = 0; - if ( mHasWeights ) - { - numRead = fread(&numSkinJoints, sizeof(U16), 1, fp); - llendianswizzle(&numSkinJoints, sizeof(U16), 1); - if (numRead != 1) - { - llerrs << "can't read NumSkinJoints from " << fileName << llendl; - return FALSE; - } - allocateJointNames( numSkinJoints ); - } - - //---------------------------------------------------------------- - // SkinJoints - //---------------------------------------------------------------- - for (i=0; i < numSkinJoints; i++) - { - char jointName[64+1]; - numRead = fread(jointName, sizeof(jointName)-1, 1, fp); - jointName[sizeof(jointName)-1] = '\0'; // ensure nul-termination - if (numRead != 1) - { - llerrs << "can't read Skin[" << i << "].Name from " << fileName << llendl; - return FALSE; - } - - std::string *jn = &mJointNames[i]; - *jn = jointName; - } - - //------------------------------------------------------------------------- - // look for morph section - //------------------------------------------------------------------------- - char morphName[64+1]; - morphName[sizeof(morphName)-1] = '\0'; // ensure nul-termination - while(fread(&morphName, sizeof(char), 64, fp) == 64) - { - if (!strcmp(morphName, "End Morphs")) - { - // we reached the end of the morphs - break; - } - LLPolyMorphData* morph_data = new LLPolyMorphData(std::string(morphName)); - - BOOL result = morph_data->loadBinary(fp, this); - - if (!result) - { - delete morph_data; - continue; - } - - mMorphData.insert(morph_data); - - if (!strcmp(morphName, "Breast_Female_Cleavage")) - { - mMorphData.insert(clone_morph_param_cleavage(morph_data, - .75f, - "Breast_Physics_LeftRight_Driven")); - } - - if (!strcmp(morphName, "Breast_Female_Cleavage")) - { - mMorphData.insert(clone_morph_param_duplicate(morph_data, - "Breast_Physics_InOut_Driven")); - } - if (!strcmp(morphName, "Breast_Gravity")) - { - mMorphData.insert(clone_morph_param_duplicate(morph_data, - "Breast_Physics_UpDown_Driven")); - } - - if (!strcmp(morphName, "Big_Belly_Torso")) - { - mMorphData.insert(clone_morph_param_direction(morph_data, - LLVector3(0,0,0.05f), - "Belly_Physics_Torso_UpDown_Driven")); - } - - if (!strcmp(morphName, "Big_Belly_Legs")) - { - mMorphData.insert(clone_morph_param_direction(morph_data, - LLVector3(0,0,0.05f), - "Belly_Physics_Legs_UpDown_Driven")); - } - - if (!strcmp(morphName, "skirt_belly")) - { - mMorphData.insert(clone_morph_param_direction(morph_data, - LLVector3(0,0,0.05f), - "Belly_Physics_Skirt_UpDown_Driven")); - } - - if (!strcmp(morphName, "Small_Butt")) - { - mMorphData.insert(clone_morph_param_direction(morph_data, - LLVector3(0,0,0.05f), - "Butt_Physics_UpDown_Driven")); - } - if (!strcmp(morphName, "Small_Butt")) - { - mMorphData.insert(clone_morph_param_direction(morph_data, - LLVector3(0,0.03f,0), - "Butt_Physics_LeftRight_Driven")); - } - } - - S32 numRemaps; - if (fread(&numRemaps, sizeof(S32), 1, fp) == 1) - { - llendianswizzle(&numRemaps, sizeof(S32), 1); - for (S32 i = 0; i < numRemaps; i++) - { - S32 remapSrc; - S32 remapDst; - if (fread(&remapSrc, sizeof(S32), 1, fp) != 1) - { - llerrs << "can't read source vertex in vertex remap data" << llendl; - break; - } - if (fread(&remapDst, sizeof(S32), 1, fp) != 1) - { - llerrs << "can't read destination vertex in vertex remap data" << llendl; - break; - } - llendianswizzle(&remapSrc, sizeof(S32), 1); - llendianswizzle(&remapDst, sizeof(S32), 1); - - mSharedVerts[remapSrc] = remapDst; - } - } - } - - status = TRUE; - } - else - { - llerrs << "invalid mesh file header: " << fileName << llendl; - status = FALSE; - } - - if (0 == mNumJointNames) - { - allocateJointNames(1); - } - - fclose( fp ); - - return status; -} - -//----------------------------------------------------------------------------- -// getSharedVert() -//----------------------------------------------------------------------------- -const S32 *LLPolyMeshSharedData::getSharedVert(S32 vert) -{ - if (mSharedVerts.count(vert) > 0) - { - return &mSharedVerts[vert]; - } - return NULL; -} - -//----------------------------------------------------------------------------- -// getUV() -//----------------------------------------------------------------------------- -const LLVector2 &LLPolyMeshSharedData::getUVs(U32 index) -{ - // TODO: convert all index variables to S32 - llassert((S32)index < mNumVertices); - - return mTexCoords[index]; -} - -//----------------------------------------------------------------------------- -// LLPolyMesh() -//----------------------------------------------------------------------------- -LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_mesh) -{ - llassert(shared_data); - - mSharedData = shared_data; - mReferenceMesh = reference_mesh; - mAvatarp = NULL; - mVertexData = NULL; - - mCurVertexCount = 0; - mFaceIndexCount = 0; - mFaceIndexOffset = 0; - mFaceVertexCount = 0; - mFaceVertexOffset = 0; - - if (shared_data->isLOD() && reference_mesh) - { - mCoords = reference_mesh->mCoords; - mNormals = reference_mesh->mNormals; - mScaledNormals = reference_mesh->mScaledNormals; - mBinormals = reference_mesh->mBinormals; - mScaledBinormals = reference_mesh->mScaledBinormals; - mTexCoords = reference_mesh->mTexCoords; - mClothingWeights = reference_mesh->mClothingWeights; - } - else - { - // Allocate memory without initializing every vector - // NOTE: This makes asusmptions about the size of LLVector[234] - S32 nverts = mSharedData->mNumVertices; - //make sure it's an even number of verts for alignment - nverts += nverts%2; - S32 nfloats = nverts * ( - 4 + //coords - 4 + //normals - 4 + //weights - 2 + //coords - 4 + //scaled normals - 4 + //binormals - 4); //scaled binormals - - //use 16 byte aligned vertex data to make LLPolyMesh SSE friendly - mVertexData = (F32*) ll_aligned_malloc_16(nfloats*4); - S32 offset = 0; - mCoords = (LLVector4a*)(mVertexData + offset); offset += 4*nverts; - mNormals = (LLVector4a*)(mVertexData + offset); offset += 4*nverts; - mClothingWeights = (LLVector4a*)(mVertexData + offset); offset += 4*nverts; - mTexCoords = (LLVector2*)(mVertexData + offset); offset += 2*nverts; - mScaledNormals = (LLVector4a*)(mVertexData + offset); offset += 4*nverts; - mBinormals = (LLVector4a*)(mVertexData + offset); offset += 4*nverts; - mScaledBinormals = (LLVector4a*)(mVertexData + offset); offset += 4*nverts; - initializeForMorph(); - } -} - - -//----------------------------------------------------------------------------- -// ~LLPolyMesh() -//----------------------------------------------------------------------------- -LLPolyMesh::~LLPolyMesh() -{ - S32 i; - for (i = 0; i < mJointRenderData.count(); i++) - { - delete mJointRenderData[i]; - mJointRenderData[i] = NULL; - } - - ll_aligned_free_16(mVertexData); - -} - - -//----------------------------------------------------------------------------- -// LLPolyMesh::getMesh() -//----------------------------------------------------------------------------- -LLPolyMesh *LLPolyMesh::getMesh(const std::string &name, LLPolyMesh* reference_mesh) -{ - //------------------------------------------------------------------------- - // search for an existing mesh by this name - //------------------------------------------------------------------------- - LLPolyMeshSharedData* meshSharedData = get_if_there(sGlobalSharedMeshList, name, (LLPolyMeshSharedData*)NULL); - if (meshSharedData) - { -// llinfos << "Polymesh " << name << " found in global mesh table." << llendl; - LLPolyMesh *poly_mesh = new LLPolyMesh(meshSharedData, reference_mesh); - return poly_mesh; - } - - //------------------------------------------------------------------------- - // if not found, create a new one, add it to the list - //------------------------------------------------------------------------- - std::string full_path; - full_path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,name); - - LLPolyMeshSharedData *mesh_data = new LLPolyMeshSharedData(); - if (reference_mesh) - { - mesh_data->setupLOD(reference_mesh->getSharedData()); - } - if ( ! mesh_data->loadMesh( full_path ) ) - { - delete mesh_data; - return NULL; - } - - LLPolyMesh *poly_mesh = new LLPolyMesh(mesh_data, reference_mesh); - -// llinfos << "Polymesh " << name << " added to global mesh table." << llendl; - sGlobalSharedMeshList[name] = poly_mesh->mSharedData; - - return poly_mesh; -} - -//----------------------------------------------------------------------------- -// LLPolyMesh::freeAllMeshes() -//----------------------------------------------------------------------------- -void LLPolyMesh::freeAllMeshes() -{ - // delete each item in the global lists - for_each(sGlobalSharedMeshList.begin(), sGlobalSharedMeshList.end(), DeletePairedPointer()); - sGlobalSharedMeshList.clear(); -} - -LLPolyMeshSharedData *LLPolyMesh::getSharedData() const -{ - return mSharedData; -} - - -//-------------------------------------------------------------------- -// LLPolyMesh::dumpDiagInfo() -//-------------------------------------------------------------------- -void LLPolyMesh::dumpDiagInfo() -{ - // keep track of totals - U32 total_verts = 0; - U32 total_faces = 0; - U32 total_kb = 0; - - std::string buf; - - llinfos << "-----------------------------------------------------" << llendl; - llinfos << " Global PolyMesh Table (DEBUG only)" << llendl; - llinfos << " Verts Faces Mem(KB) Name" << llendl; - llinfos << "-----------------------------------------------------" << llendl; - - // print each loaded mesh, and it's memory usage - for(LLPolyMeshSharedDataTable::iterator iter = sGlobalSharedMeshList.begin(); - iter != sGlobalSharedMeshList.end(); ++iter) - { - const std::string& mesh_name = iter->first; - LLPolyMeshSharedData* mesh = iter->second; - - S32 num_verts = mesh->mNumVertices; - S32 num_faces = mesh->mNumFaces; - U32 num_kb = mesh->getNumKB(); - - buf = llformat("%8d %8d %8d %s", num_verts, num_faces, num_kb, mesh_name.c_str()); - llinfos << buf << llendl; - - total_verts += num_verts; - total_faces += num_faces; - total_kb += num_kb; - } - - llinfos << "-----------------------------------------------------" << llendl; - buf = llformat("%8d %8d %8d TOTAL", total_verts, total_faces, total_kb ); - llinfos << buf << llendl; - llinfos << "-----------------------------------------------------" << llendl; -} - -//----------------------------------------------------------------------------- -// getWritableCoords() -//----------------------------------------------------------------------------- -LLVector4a *LLPolyMesh::getWritableCoords() -{ - return mCoords; -} - -//----------------------------------------------------------------------------- -// getWritableNormals() -//----------------------------------------------------------------------------- -LLVector4a *LLPolyMesh::getWritableNormals() -{ - return mNormals; -} - -//----------------------------------------------------------------------------- -// getWritableBinormals() -//----------------------------------------------------------------------------- -LLVector4a *LLPolyMesh::getWritableBinormals() -{ - return mBinormals; -} - - -//----------------------------------------------------------------------------- -// getWritableClothingWeights() -//----------------------------------------------------------------------------- -LLVector4a *LLPolyMesh::getWritableClothingWeights() -{ - return mClothingWeights; -} - -//----------------------------------------------------------------------------- -// getWritableTexCoords() -//----------------------------------------------------------------------------- -LLVector2 *LLPolyMesh::getWritableTexCoords() -{ - return mTexCoords; -} - -//----------------------------------------------------------------------------- -// getScaledNormals() -//----------------------------------------------------------------------------- -LLVector4a *LLPolyMesh::getScaledNormals() -{ - return mScaledNormals; -} - -//----------------------------------------------------------------------------- -// getScaledBinormals() -//----------------------------------------------------------------------------- -LLVector4a *LLPolyMesh::getScaledBinormals() -{ - return mScaledBinormals; -} - - -//----------------------------------------------------------------------------- -// initializeForMorph() -//----------------------------------------------------------------------------- -void LLPolyMesh::initializeForMorph() -{ - LLVector4a::memcpyNonAliased16((F32*) mCoords, (F32*) mSharedData->mBaseCoords, sizeof(LLVector4a) * mSharedData->mNumVertices); - LLVector4a::memcpyNonAliased16((F32*) mNormals, (F32*) mSharedData->mBaseNormals, sizeof(LLVector4a) * mSharedData->mNumVertices); - LLVector4a::memcpyNonAliased16((F32*) mScaledNormals, (F32*) mSharedData->mBaseNormals, sizeof(LLVector4a) * mSharedData->mNumVertices); - LLVector4a::memcpyNonAliased16((F32*) mBinormals, (F32*) mSharedData->mBaseNormals, sizeof(LLVector4a) * mSharedData->mNumVertices); - LLVector4a::memcpyNonAliased16((F32*) mScaledBinormals, (F32*) mSharedData->mBaseNormals, sizeof(LLVector4a) * mSharedData->mNumVertices); - LLVector4a::memcpyNonAliased16((F32*) mTexCoords, (F32*) mSharedData->mTexCoords, sizeof(LLVector2) * (mSharedData->mNumVertices + mSharedData->mNumVertices%2)); - - for (U32 i = 0; i < mSharedData->mNumVertices; ++i) - { - mClothingWeights[i].clear(); - } -} - -//----------------------------------------------------------------------------- -// getMorphData() -//----------------------------------------------------------------------------- -LLPolyMorphData* LLPolyMesh::getMorphData(const std::string& morph_name) -{ - if (!mSharedData) - return NULL; - for (LLPolyMeshSharedData::morphdata_list_t::iterator iter = mSharedData->mMorphData.begin(); - iter != mSharedData->mMorphData.end(); ++iter) - { - LLPolyMorphData *morph_data = *iter; - if (morph_data->getName() == morph_name) - { - return morph_data; - } - } - return NULL; -} - -//----------------------------------------------------------------------------- -// removeMorphData() -//----------------------------------------------------------------------------- -// // erasing but not deleting seems bad, but fortunately we don't actually use this... -// void LLPolyMesh::removeMorphData(LLPolyMorphData *morph_target) -// { -// if (!mSharedData) -// return; -// mSharedData->mMorphData.erase(morph_target); -// } - -//----------------------------------------------------------------------------- -// deleteAllMorphData() -//----------------------------------------------------------------------------- -// void LLPolyMesh::deleteAllMorphData() -// { -// if (!mSharedData) -// return; - -// for_each(mSharedData->mMorphData.begin(), mSharedData->mMorphData.end(), DeletePointer()); -// mSharedData->mMorphData.clear(); -// } - -//----------------------------------------------------------------------------- -// getWritableWeights() -//----------------------------------------------------------------------------- -F32* LLPolyMesh::getWritableWeights() const -{ - return mSharedData->mWeights; -} - -//----------------------------------------------------------------------------- -// LLPolySkeletalDistortionInfo() -//----------------------------------------------------------------------------- -LLPolySkeletalDistortionInfo::LLPolySkeletalDistortionInfo() -{ -} - -BOOL LLPolySkeletalDistortionInfo::parseXml(LLXmlTreeNode* node) -{ - llassert( node->hasName( "param" ) && node->getChildByName( "param_skeleton" ) ); - - if (!LLViewerVisualParamInfo::parseXml(node)) - return FALSE; - - LLXmlTreeNode* skeletalParam = node->getChildByName("param_skeleton"); - - if (NULL == skeletalParam) - { - llwarns << "Failed to getChildByName(\"param_skeleton\")" - << llendl; - return FALSE; - } - - for( LLXmlTreeNode* bone = skeletalParam->getFirstChild(); bone; bone = skeletalParam->getNextChild() ) - { - if (bone->hasName("bone")) - { - std::string name; - LLVector3 scale; - LLVector3 pos; - BOOL haspos = FALSE; - - static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); - if (!bone->getFastAttributeString(name_string, name)) - { - llwarns << "No bone name specified for skeletal param." << llendl; - continue; - } - - static LLStdStringHandle scale_string = LLXmlTree::addAttributeString("scale"); - if (!bone->getFastAttributeVector3(scale_string, scale)) - { - llwarns << "No scale specified for bone " << name << "." << llendl; - continue; - } - - // optional offset deformation (translation) - static LLStdStringHandle offset_string = LLXmlTree::addAttributeString("offset"); - if (bone->getFastAttributeVector3(offset_string, pos)) - { - haspos = TRUE; - } - mBoneInfoList.push_back(LLPolySkeletalBoneInfo(name, scale, pos, haspos)); - } - else - { - llwarns << "Unrecognized element " << bone->getName() << " in skeletal distortion" << llendl; - continue; - } - } - return TRUE; -} - -//----------------------------------------------------------------------------- -// LLPolySkeletalDistortion() -//----------------------------------------------------------------------------- -LLPolySkeletalDistortion::LLPolySkeletalDistortion(LLVOAvatar *avatarp) -{ - mAvatar = avatarp; - mDefaultVec.splat(0.001f); -} - -//----------------------------------------------------------------------------- -// ~LLPolySkeletalDistortion() -//----------------------------------------------------------------------------- -LLPolySkeletalDistortion::~LLPolySkeletalDistortion() -{ -} - -BOOL LLPolySkeletalDistortion::setInfo(LLPolySkeletalDistortionInfo *info) -{ - llassert(mInfo == NULL); - if (info->mID < 0) - return FALSE; - mInfo = info; - mID = info->mID; - setWeight(getDefaultWeight(), FALSE ); - - LLPolySkeletalDistortionInfo::bone_info_list_t::iterator iter; - for (iter = getInfo()->mBoneInfoList.begin(); iter != getInfo()->mBoneInfoList.end(); iter++) - { - LLPolySkeletalBoneInfo *bone_info = &(*iter); - LLJoint* joint = mAvatar->getJoint(bone_info->mBoneName); - if (!joint) - { - llwarns << "Joint " << bone_info->mBoneName << " not found." << llendl; - continue; - } - - if (mJointScales.find(joint) != mJointScales.end()) - { - llwarns << "Scale deformation already supplied for joint " << joint->getName() << "." << llendl; - } - - // store it - mJointScales[joint] = bone_info->mScaleDeformation; - - // apply to children that need to inherit it - for (LLJoint::child_list_t::iterator iter = joint->mChildren.begin(); - iter != joint->mChildren.end(); ++iter) - { - LLViewerJoint* child_joint = (LLViewerJoint*)(*iter); - if (child_joint->inheritScale()) - { - LLVector3 childDeformation = LLVector3(child_joint->getScale()); - childDeformation.scaleVec(bone_info->mScaleDeformation); - mJointScales[child_joint] = childDeformation; - } - } - - if (bone_info->mHasPositionDeformation) - { - if (mJointOffsets.find(joint) != mJointOffsets.end()) - { - llwarns << "Offset deformation already supplied for joint " << joint->getName() << "." << llendl; - } - mJointOffsets[joint] = bone_info->mPositionDeformation; - } - } - return TRUE; -} - -/*virtual*/ LLViewerVisualParam* LLPolySkeletalDistortion::cloneParam(LLWearable* wearable) const -{ - LLPolySkeletalDistortion *new_param = new LLPolySkeletalDistortion(mAvatar); - *new_param = *this; - return new_param; -} - -//----------------------------------------------------------------------------- -// apply() -//----------------------------------------------------------------------------- -static LLFastTimer::DeclareTimer FTM_POLYSKELETAL_DISTORTION_APPLY("Skeletal Distortion"); - -void LLPolySkeletalDistortion::apply( ESex avatar_sex ) -{ - LLFastTimer t(FTM_POLYSKELETAL_DISTORTION_APPLY); - - F32 effective_weight = ( getSex() & avatar_sex ) ? mCurWeight : getDefaultWeight(); - - LLJoint* joint; - joint_vec_map_t::iterator iter; - - for (iter = mJointScales.begin(); - iter != mJointScales.end(); - iter++) - { - joint = iter->first; - LLVector3 newScale = joint->getScale(); - LLVector3 scaleDelta = iter->second; - newScale = newScale + (effective_weight * scaleDelta) - (mLastWeight * scaleDelta); - joint->setScale(newScale); - } - - for (iter = mJointOffsets.begin(); - iter != mJointOffsets.end(); - iter++) - { - joint = iter->first; - LLVector3 newPosition = joint->getPosition(); - LLVector3 positionDelta = iter->second; - newPosition = newPosition + (effective_weight * positionDelta) - (mLastWeight * positionDelta); - joint->setPosition(newPosition); - } - - if (mLastWeight != mCurWeight && !mIsAnimating) - { - mAvatar->setSkeletonSerialNum(mAvatar->getSkeletonSerialNum() + 1); - } - mLastWeight = mCurWeight; -} - - -LLPolyMorphData *clone_morph_param_duplicate(const LLPolyMorphData *src_data, - const std::string &name) -{ - LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data); - cloned_morph_data->mName = name; - for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) - { - cloned_morph_data->mCoords[v] = src_data->mCoords[v]; - cloned_morph_data->mNormals[v] = src_data->mNormals[v]; - cloned_morph_data->mBinormals[v] = src_data->mBinormals[v]; - } - return cloned_morph_data; -} - -LLPolyMorphData *clone_morph_param_direction(const LLPolyMorphData *src_data, - const LLVector3 &direction, - const std::string &name) -{ - LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data); - cloned_morph_data->mName = name; - LLVector4a dir; - dir.load3(direction.mV); - - for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) - { - cloned_morph_data->mCoords[v] = dir; - cloned_morph_data->mNormals[v].clear(); - cloned_morph_data->mBinormals[v].clear(); - } - return cloned_morph_data; -} - -LLPolyMorphData *clone_morph_param_cleavage(const LLPolyMorphData *src_data, - F32 scale, - const std::string &name) -{ - LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data); - cloned_morph_data->mName = name; - - LLVector4a sc; - sc.splat(scale); - - LLVector4a nsc; - nsc.set(scale, -scale, scale, scale); - - for (U32 v=0; v < cloned_morph_data->mNumIndices; v++) - { - if (cloned_morph_data->mCoords[v][1] < 0) - { - cloned_morph_data->mCoords[v].setMul(src_data->mCoords[v],nsc); - cloned_morph_data->mNormals[v].setMul(src_data->mNormals[v],nsc); - cloned_morph_data->mBinormals[v].setMul(src_data->mBinormals[v],nsc); - } - else - { - cloned_morph_data->mCoords[v].setMul(src_data->mCoords[v],sc); - cloned_morph_data->mNormals[v].setMul(src_data->mNormals[v], sc); - cloned_morph_data->mBinormals[v].setMul(src_data->mBinormals[v],sc); - } - } - return cloned_morph_data; -} - -// End diff --git a/indra/newview/llpolymesh.h b/indra/newview/llpolymesh.h deleted file mode 100644 index 28da230541..0000000000 --- a/indra/newview/llpolymesh.h +++ /dev/null @@ -1,451 +0,0 @@ -/** - * @file llpolymesh.h - * @brief Implementation of LLPolyMesh class - * - * $LicenseInfo:firstyear=2001&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$ - */ - -#ifndef LL_LLPOLYMESH_H -#define LL_LLPOLYMESH_H - -#include <string> -#include <map> -#include "llstl.h" - -#include "v3math.h" -#include "v2math.h" -#include "llquaternion.h" -#include "llpolymorph.h" -#include "lljoint.h" -//#include "lldarray.h" - -class LLSkinJoint; -class LLVOAvatar; -class LLWearable; - -//#define USE_STRIPS // Use tri-strips for rendering. - -//----------------------------------------------------------------------------- -// LLPolyFace -// A set of 4 vertex indices. -// An LLPolyFace can represent either a triangle or quad. -// If the last index is -1, it's a triangle. -//----------------------------------------------------------------------------- -typedef S32 LLPolyFace[3]; - -//struct PrimitiveGroup; - -//----------------------------------------------------------------------------- -// LLPolyMesh -// A polyhedra consisting of any number of triangles and quads. -// All instances contain a set of faces, and optionally may include -// faces grouped into named face sets. -//----------------------------------------------------------------------------- -class LLPolyMorphTarget; - -class LLPolyMeshSharedData -{ - friend class LLPolyMesh; -private: - // transform data - LLVector3 mPosition; - LLQuaternion mRotation; - LLVector3 mScale; - - // vertex data - S32 mNumVertices; - LLVector4a *mBaseCoords; - LLVector4a *mBaseNormals; - LLVector4a *mBaseBinormals; - LLVector2 *mTexCoords; - LLVector2 *mDetailTexCoords; - F32 *mWeights; - - BOOL mHasWeights; - BOOL mHasDetailTexCoords; - - // face data - S32 mNumFaces; - LLPolyFace *mFaces; - - // face set data - U32 mNumJointNames; - std::string* mJointNames; - - // morph targets - typedef std::set<LLPolyMorphData*> morphdata_list_t; - morphdata_list_t mMorphData; - - std::map<S32, S32> mSharedVerts; - - LLPolyMeshSharedData* mReferenceData; - S32 mLastIndexOffset; - -public: - // Temporarily... - // Triangle indices - U32 mNumTriangleIndices; - U32 *mTriangleIndices; - -public: - LLPolyMeshSharedData(); - ~LLPolyMeshSharedData(); - -private: - void setupLOD(LLPolyMeshSharedData* reference_data); - - // Frees all mesh memory resources - void freeMeshData(); - - void setPosition( const LLVector3 &pos ) { mPosition = pos; } - void setRotation( const LLQuaternion &rot ) { mRotation = rot; } - void setScale( const LLVector3 &scale ) { mScale = scale; } - - BOOL allocateVertexData( U32 numVertices ); - - BOOL allocateFaceData( U32 numFaces ); - - BOOL allocateJointNames( U32 numJointNames ); - - // Retrieve the number of KB of memory used by this instance - U32 getNumKB(); - - // Load mesh data from file - BOOL loadMesh( const std::string& fileName ); - -public: - void genIndices(S32 offset); - - const LLVector2 &getUVs(U32 index); - - const S32 *getSharedVert(S32 vert); - - BOOL isLOD() { return (mReferenceData != NULL); } -}; - - -class LLJointRenderData -{ -public: - LLJointRenderData(const LLMatrix4* world_matrix, LLSkinJoint* skin_joint) : mWorldMatrix(world_matrix), mSkinJoint(skin_joint) {} - ~LLJointRenderData(){} - - const LLMatrix4* mWorldMatrix; - LLSkinJoint* mSkinJoint; -}; - - -class LLPolyMesh -{ -public: - - // Constructor - LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_mesh); - - // Destructor - ~LLPolyMesh(); - - // Requests a mesh by name. - // If the mesh already exists in the global mesh table, it is returned, - // otherwise it is loaded from file, added to the table, and returned. - static LLPolyMesh *getMesh( const std::string &name, LLPolyMesh* reference_mesh = NULL); - - // Frees all loaded meshes. - // This should only be called once you know there are no outstanding - // references to these objects. Generally, upon exit of the application. - static void freeAllMeshes(); - - //-------------------------------------------------------------------- - // Transform Data Access - //-------------------------------------------------------------------- - // Get position - const LLVector3 &getPosition() { - llassert (mSharedData); - return mSharedData->mPosition; - } - - // Get rotation - const LLQuaternion &getRotation() { - llassert (mSharedData); - return mSharedData->mRotation; - } - - // Get scale - const LLVector3 &getScale() { - llassert (mSharedData); - return mSharedData->mScale; - } - - //-------------------------------------------------------------------- - // Vertex Data Access - //-------------------------------------------------------------------- - // Get number of vertices - U32 getNumVertices() { - llassert (mSharedData); - return mSharedData->mNumVertices; - } - - // Returns whether or not the mesh has detail texture coords - BOOL hasDetailTexCoords() { - llassert (mSharedData); - return mSharedData->mHasDetailTexCoords; - } - - // Returns whether or not the mesh has vertex weights - BOOL hasWeights() const{ - llassert (mSharedData); - return mSharedData->mHasWeights; - } - - // Get coords - const LLVector4a *getCoords() const{ - return mCoords; - } - - // non const version - LLVector4a *getWritableCoords(); - - // Get normals - const LLVector4a *getNormals() const{ - return mNormals; - } - - // Get normals - const LLVector4a *getBinormals() const{ - return mBinormals; - } - - // Get base mesh normals - const LLVector4a *getBaseNormals() const{ - llassert(mSharedData); - return mSharedData->mBaseNormals; - } - - // Get base mesh normals - const LLVector4a *getBaseBinormals() const{ - llassert(mSharedData); - return mSharedData->mBaseBinormals; - } - - // intermediate morphed normals and output normals - LLVector4a *getWritableNormals(); - LLVector4a *getScaledNormals(); - - LLVector4a *getWritableBinormals(); - LLVector4a *getScaledBinormals(); - - // Get texCoords - const LLVector2 *getTexCoords() const { - return mTexCoords; - } - - // non const version - LLVector2 *getWritableTexCoords(); - - // Get detailTexCoords - const LLVector2 *getDetailTexCoords() const { - llassert (mSharedData); - return mSharedData->mDetailTexCoords; - } - - // Get weights - const F32 *getWeights() const { - llassert (mSharedData); - return mSharedData->mWeights; - } - - F32 *getWritableWeights() const; - - LLVector4a *getWritableClothingWeights(); - - const LLVector4a *getClothingWeights() - { - return mClothingWeights; - } - - //-------------------------------------------------------------------- - // Face Data Access - //-------------------------------------------------------------------- - // Get number of faces - S32 getNumFaces() { - llassert (mSharedData); - return mSharedData->mNumFaces; - } - - // Get faces - LLPolyFace *getFaces() { - llassert (mSharedData); - return mSharedData->mFaces; - } - - U32 getNumJointNames() { - llassert (mSharedData); - return mSharedData->mNumJointNames; - } - - std::string *getJointNames() { - llassert (mSharedData); - return mSharedData->mJointNames; - } - - LLPolyMorphData* getMorphData(const std::string& morph_name); -// void removeMorphData(LLPolyMorphData *morph_target); -// void deleteAllMorphData(); - - LLPolyMeshSharedData *getSharedData() const; - LLPolyMesh *getReferenceMesh() { return mReferenceMesh ? mReferenceMesh : this; } - - // Get indices - U32* getIndices() { return mSharedData ? mSharedData->mTriangleIndices : NULL; } - - BOOL isLOD() { return mSharedData && mSharedData->isLOD(); } - - void setAvatar(LLVOAvatar* avatarp) { mAvatarp = avatarp; } - LLVOAvatar* getAvatar() { return mAvatarp; } - - LLDynamicArray<LLJointRenderData*> mJointRenderData; - - U32 mFaceVertexOffset; - U32 mFaceVertexCount; - U32 mFaceIndexOffset; - U32 mFaceIndexCount; - U32 mCurVertexCount; -private: - void initializeForMorph(); - - // Dumps diagnostic information about the global mesh table - static void dumpDiagInfo(); - -protected: - // mesh data shared across all instances of a given mesh - LLPolyMeshSharedData *mSharedData; - // Single array of floats for allocation / deletion - F32 *mVertexData; - // deformed vertices (resulting from application of morph targets) - LLVector4a *mCoords; - // deformed normals (resulting from application of morph targets) - LLVector4a *mScaledNormals; - // output normals (after normalization) - LLVector4a *mNormals; - // deformed binormals (resulting from application of morph targets) - LLVector4a *mScaledBinormals; - // output binormals (after normalization) - LLVector4a *mBinormals; - // weight values that mark verts as clothing/skin - LLVector4a *mClothingWeights; - // output texture coordinates - LLVector2 *mTexCoords; - - LLPolyMesh *mReferenceMesh; - - // global mesh list - typedef std::map<std::string, LLPolyMeshSharedData*> LLPolyMeshSharedDataTable; - static LLPolyMeshSharedDataTable sGlobalSharedMeshList; - - // Backlink only; don't make this an LLPointer. - LLVOAvatar* mAvatarp; -}; - -//----------------------------------------------------------------------------- -// LLPolySkeletalDeformationInfo -// Shared information for LLPolySkeletalDeformations -//----------------------------------------------------------------------------- -struct LLPolySkeletalBoneInfo -{ - LLPolySkeletalBoneInfo(std::string &name, LLVector3 &scale, LLVector3 &pos, BOOL haspos) - : mBoneName(name), - mScaleDeformation(scale), - mPositionDeformation(pos), - mHasPositionDeformation(haspos) {} - std::string mBoneName; - LLVector3 mScaleDeformation; - LLVector3 mPositionDeformation; - BOOL mHasPositionDeformation; -}; - -class LLPolySkeletalDistortionInfo : public LLViewerVisualParamInfo -{ - friend class LLPolySkeletalDistortion; -public: - LLPolySkeletalDistortionInfo(); - /*virtual*/ ~LLPolySkeletalDistortionInfo() {}; - - /*virtual*/ BOOL parseXml(LLXmlTreeNode* node); - -protected: - typedef std::vector<LLPolySkeletalBoneInfo> bone_info_list_t; - bone_info_list_t mBoneInfoList; -}; - -//----------------------------------------------------------------------------- -// LLPolySkeletalDeformation -// A set of joint scale data for deforming the avatar mesh -//----------------------------------------------------------------------------- - -LL_ALIGN_PREFIX(16) -class LLPolySkeletalDistortion : public LLViewerVisualParam -{ -public: - LLPolySkeletalDistortion(LLVOAvatar *avatarp); - ~LLPolySkeletalDistortion(); - - void* operator new(size_t size) - { - return ll_aligned_malloc_16(size); - } - - void operator delete(void* ptr) - { - ll_aligned_free_16(ptr); - } - - // Special: These functions are overridden by child classes - LLPolySkeletalDistortionInfo* getInfo() const { return (LLPolySkeletalDistortionInfo*)mInfo; } - // This sets mInfo and calls initialization functions - BOOL setInfo(LLPolySkeletalDistortionInfo *info); - - /*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const; - - // LLVisualParam Virtual functions - ///*virtual*/ BOOL parseData(LLXmlTreeNode* node); - /*virtual*/ void apply( ESex sex ); - - // LLViewerVisualParam Virtual functions - /*virtual*/ F32 getTotalDistortion() { return 0.1f; } - /*virtual*/ const LLVector4a& getAvgDistortion() { return mDefaultVec; } - /*virtual*/ F32 getMaxDistortion() { return 0.1f; } - /*virtual*/ LLVector4a getVertexDistortion(S32 index, LLPolyMesh *poly_mesh){return LLVector4a(0.001f, 0.001f, 0.001f);} - /*virtual*/ const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh){index = 0; poly_mesh = NULL; return &mDefaultVec;}; - /*virtual*/ const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh){index = 0; poly_mesh = NULL; return NULL;}; - -protected: - LL_ALIGN_16(LLVector4a mDefaultVec); - - typedef std::map<LLJoint*, LLVector3> joint_vec_map_t; - joint_vec_map_t mJointScales; - joint_vec_map_t mJointOffsets; - // Backlink only; don't make this an LLPointer. - LLVOAvatar *mAvatar; -} LL_ALIGN_POSTFIX(16); - -#endif // LL_LLPOLYMESH_H - diff --git a/indra/newview/llpolymorph.cpp b/indra/newview/llpolymorph.cpp deleted file mode 100644 index 495fdc348c..0000000000 --- a/indra/newview/llpolymorph.cpp +++ /dev/null @@ -1,789 +0,0 @@ -/** - * @file llpolymorph.cpp - * @brief Implementation of LLPolyMesh class - * - * $LicenseInfo:firstyear=2001&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$ - */ - -//----------------------------------------------------------------------------- -// Header Files -//----------------------------------------------------------------------------- -#include "llviewerprecompiledheaders.h" - -#include "llpolymorph.h" -#include "llvoavatar.h" -#include "llwearable.h" -#include "llxmltree.h" -#include "llendianswizzle.h" - -//#include "../tools/imdebug/imdebug.h" - -const F32 NORMAL_SOFTEN_FACTOR = 0.65f; - -//----------------------------------------------------------------------------- -// LLPolyMorphData() -//----------------------------------------------------------------------------- -LLPolyMorphData::LLPolyMorphData(const std::string& morph_name) - : mName(morph_name) -{ - mNumIndices = 0; - mCurrentIndex = 0; - mTotalDistortion = 0.f; - mAvgDistortion.clear(); - mMaxDistortion = 0.f; - mVertexIndices = NULL; - mCoords = NULL; - mNormals = NULL; - mBinormals = NULL; - mTexCoords = NULL; - - mMesh = NULL; -} - -LLPolyMorphData::LLPolyMorphData(const LLPolyMorphData &rhs) : - mName(rhs.mName), - mNumIndices(rhs.mNumIndices), - mTotalDistortion(rhs.mTotalDistortion), - mAvgDistortion(rhs.mAvgDistortion), - mMaxDistortion(rhs.mMaxDistortion), - mVertexIndices(NULL), - mCoords(NULL), - mNormals(NULL), - mBinormals(NULL), - mTexCoords(NULL) -{ - const S32 numVertices = mNumIndices; - - U32 size = sizeof(LLVector4a)*numVertices; - - mCoords = static_cast<LLVector4a*>( ll_aligned_malloc_16(size) ); - mNormals = static_cast<LLVector4a*>( ll_aligned_malloc_16(size) ); - mBinormals = static_cast<LLVector4a*>( ll_aligned_malloc_16(size) ); - mTexCoords = new LLVector2[numVertices]; - mVertexIndices = new U32[numVertices]; - - for (S32 v=0; v < numVertices; v++) - { - mCoords[v] = rhs.mCoords[v]; - mNormals[v] = rhs.mNormals[v]; - mBinormals[v] = rhs.mBinormals[v]; - mTexCoords[v] = rhs.mTexCoords[v]; - mVertexIndices[v] = rhs.mVertexIndices[v]; - } -} - -//----------------------------------------------------------------------------- -// ~LLPolyMorphData() -//----------------------------------------------------------------------------- -LLPolyMorphData::~LLPolyMorphData() -{ - freeData(); -} - -//----------------------------------------------------------------------------- -// loadBinary() -//----------------------------------------------------------------------------- -BOOL LLPolyMorphData::loadBinary(LLFILE *fp, LLPolyMeshSharedData *mesh) -{ - S32 numVertices; - S32 numRead; - - numRead = fread(&numVertices, sizeof(S32), 1, fp); - llendianswizzle(&numVertices, sizeof(S32), 1); - if (numRead != 1) - { - llwarns << "Can't read number of morph target vertices" << llendl; - return FALSE; - } - - //------------------------------------------------------------------------- - // free any existing data - //------------------------------------------------------------------------- - freeData(); - - //------------------------------------------------------------------------- - // allocate vertices - //------------------------------------------------------------------------- - - U32 size = sizeof(LLVector4a)*numVertices; - - mCoords = static_cast<LLVector4a*>(ll_aligned_malloc_16(size)); - mNormals = static_cast<LLVector4a*>(ll_aligned_malloc_16(size)); - mBinormals = static_cast<LLVector4a*>(ll_aligned_malloc_16(size)); - - mTexCoords = new LLVector2[numVertices]; - // Actually, we are allocating more space than we need for the skiplist - mVertexIndices = new U32[numVertices]; - mNumIndices = 0; - mTotalDistortion = 0.f; - mMaxDistortion = 0.f; - mAvgDistortion.clear(); - mMesh = mesh; - - //------------------------------------------------------------------------- - // read vertices - //------------------------------------------------------------------------- - for(S32 v = 0; v < numVertices; v++) - { - numRead = fread(&mVertexIndices[v], sizeof(U32), 1, fp); - llendianswizzle(&mVertexIndices[v], sizeof(U32), 1); - if (numRead != 1) - { - llwarns << "Can't read morph target vertex number" << llendl; - return FALSE; - } - - if (mVertexIndices[v] > 10000) - { - llerrs << "Bad morph index: " << mVertexIndices[v] << llendl; - } - - - numRead = fread(&mCoords[v], sizeof(F32), 3, fp); - llendianswizzle(&mCoords[v], sizeof(F32), 3); - if (numRead != 3) - { - llwarns << "Can't read morph target vertex coordinates" << llendl; - return FALSE; - } - - F32 magnitude = mCoords[v].getLength3().getF32(); - - mTotalDistortion += magnitude; - LLVector4a t; - t.setAbs(mCoords[v]); - mAvgDistortion.add(t); - - if (magnitude > mMaxDistortion) - { - mMaxDistortion = magnitude; - } - - numRead = fread(&mNormals[v], sizeof(F32), 3, fp); - llendianswizzle(&mNormals[v], sizeof(F32), 3); - if (numRead != 3) - { - llwarns << "Can't read morph target normal" << llendl; - return FALSE; - } - - numRead = fread(&mBinormals[v], sizeof(F32), 3, fp); - llendianswizzle(&mBinormals[v], sizeof(F32), 3); - if (numRead != 3) - { - llwarns << "Can't read morph target binormal" << llendl; - return FALSE; - } - - - numRead = fread(&mTexCoords[v].mV, sizeof(F32), 2, fp); - llendianswizzle(&mTexCoords[v].mV, sizeof(F32), 2); - if (numRead != 2) - { - llwarns << "Can't read morph target uv" << llendl; - return FALSE; - } - - mNumIndices++; - } - - mAvgDistortion.mul(1.f/(F32)mNumIndices); - mAvgDistortion.normalize3fast(); - - return TRUE; -} - -//----------------------------------------------------------------------------- -// freeData() -//----------------------------------------------------------------------------- -void LLPolyMorphData::freeData() -{ - if (mCoords != NULL) - { - ll_aligned_free_16(mCoords); - mCoords = NULL; - } - - if (mNormals != NULL) - { - ll_aligned_free_16(mNormals); - mNormals = NULL; - } - - if (mBinormals != NULL) - { - ll_aligned_free_16(mBinormals); - mBinormals = NULL; - } - - if (mTexCoords != NULL) - { - delete [] mTexCoords; - mTexCoords = NULL; - } - - if (mVertexIndices != NULL) - { - delete [] mVertexIndices; - mVertexIndices = NULL; - } -} - -//----------------------------------------------------------------------------- -// LLPolyMorphTargetInfo() -//----------------------------------------------------------------------------- -LLPolyMorphTargetInfo::LLPolyMorphTargetInfo() - : mIsClothingMorph(FALSE) -{ -} - -BOOL LLPolyMorphTargetInfo::parseXml(LLXmlTreeNode* node) -{ - llassert( node->hasName( "param" ) && node->getChildByName( "param_morph" ) ); - - if (!LLViewerVisualParamInfo::parseXml(node)) - return FALSE; - - // Get mixed-case name - static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); - if( !node->getFastAttributeString( name_string, mMorphName ) ) - { - llwarns << "Avatar file: <param> is missing name attribute" << llendl; - return FALSE; // Continue, ignoring this tag - } - - static LLStdStringHandle clothing_morph_string = LLXmlTree::addAttributeString("clothing_morph"); - node->getFastAttributeBOOL(clothing_morph_string, mIsClothingMorph); - - LLXmlTreeNode *paramNode = node->getChildByName("param_morph"); - - if (NULL == paramNode) - { - llwarns << "Failed to getChildByName(\"param_morph\")" - << llendl; - return FALSE; - } - - for (LLXmlTreeNode* child_node = paramNode->getFirstChild(); - child_node; - child_node = paramNode->getNextChild()) - { - static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); - if (child_node->hasName("volume_morph")) - { - std::string volume_name; - if (child_node->getFastAttributeString(name_string, volume_name)) - { - LLVector3 scale; - static LLStdStringHandle scale_string = LLXmlTree::addAttributeString("scale"); - child_node->getFastAttributeVector3(scale_string, scale); - - LLVector3 pos; - static LLStdStringHandle pos_string = LLXmlTree::addAttributeString("pos"); - child_node->getFastAttributeVector3(pos_string, pos); - - mVolumeInfoList.push_back(LLPolyVolumeMorphInfo(volume_name,scale,pos)); - } - } - } - - return TRUE; -} - -//----------------------------------------------------------------------------- -// LLPolyMorphTarget() -//----------------------------------------------------------------------------- -LLPolyMorphTarget::LLPolyMorphTarget(LLPolyMesh *poly_mesh) - : mMorphData(NULL), mMesh(poly_mesh), - mVertMask(NULL), - mLastSex(SEX_FEMALE), - mNumMorphMasksPending(0) -{ -} - -//----------------------------------------------------------------------------- -// ~LLPolyMorphTarget() -//----------------------------------------------------------------------------- -LLPolyMorphTarget::~LLPolyMorphTarget() -{ - if (mVertMask) - { - delete mVertMask; - } -} - -//----------------------------------------------------------------------------- -// setInfo() -//----------------------------------------------------------------------------- -BOOL LLPolyMorphTarget::setInfo(LLPolyMorphTargetInfo* info) -{ - llassert(mInfo == NULL); - if (info->mID < 0) - return FALSE; - mInfo = info; - mID = info->mID; - setWeight(getDefaultWeight(), FALSE ); - - LLVOAvatar* avatarp = mMesh->getAvatar(); - LLPolyMorphTargetInfo::volume_info_list_t::iterator iter; - for (iter = getInfo()->mVolumeInfoList.begin(); iter != getInfo()->mVolumeInfoList.end(); iter++) - { - LLPolyVolumeMorphInfo *volume_info = &(*iter); - for (S32 i = 0; i < avatarp->mNumCollisionVolumes; i++) - { - if (avatarp->mCollisionVolumes[i].getName() == volume_info->mName) - { - mVolumeMorphs.push_back(LLPolyVolumeMorph(&avatarp->mCollisionVolumes[i], - volume_info->mScale, - volume_info->mPos)); - break; - } - } - } - - std::string morph_param_name = getInfo()->mMorphName; - - mMorphData = mMesh->getMorphData(morph_param_name); - if (!mMorphData) - { - const std::string driven_tag = "_Driven"; - U32 pos = morph_param_name.find(driven_tag); - if (pos > 0) - { - morph_param_name = morph_param_name.substr(0,pos); - mMorphData = mMesh->getMorphData(morph_param_name); - } - } - if (!mMorphData) - { - llwarns << "No morph target named " << morph_param_name << " found in mesh." << llendl; - return FALSE; // Continue, ignoring this tag - } - return TRUE; -} - -/*virtual*/ LLViewerVisualParam* LLPolyMorphTarget::cloneParam(LLWearable* wearable) const -{ - LLPolyMorphTarget *new_param = new LLPolyMorphTarget(mMesh); - *new_param = *this; - return new_param; -} - -#if 0 // obsolete -//----------------------------------------------------------------------------- -// parseData() -//----------------------------------------------------------------------------- -BOOL LLPolyMorphTarget::parseData(LLXmlTreeNode* node) -{ - LLPolyMorphTargetInfo* info = new LLPolyMorphTargetInfo; - - info->parseXml(node); - if (!setInfo(info)) - { - delete info; - return FALSE; - } - return TRUE; -} -#endif - -//----------------------------------------------------------------------------- -// getVertexDistortion() -//----------------------------------------------------------------------------- -LLVector4a LLPolyMorphTarget::getVertexDistortion(S32 requested_index, LLPolyMesh *mesh) -{ - if (!mMorphData || mMesh != mesh) return LLVector4a::getZero(); - - for(U32 index = 0; index < mMorphData->mNumIndices; index++) - { - if (mMorphData->mVertexIndices[index] == (U32)requested_index) - { - return mMorphData->mCoords[index]; - } - } - - return LLVector4a::getZero(); -} - -//----------------------------------------------------------------------------- -// getFirstDistortion() -//----------------------------------------------------------------------------- -const LLVector4a *LLPolyMorphTarget::getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh) -{ - if (!mMorphData) return &LLVector4a::getZero(); - - LLVector4a* resultVec; - mMorphData->mCurrentIndex = 0; - if (mMorphData->mNumIndices) - { - resultVec = &mMorphData->mCoords[mMorphData->mCurrentIndex]; - if (index != NULL) - { - *index = mMorphData->mVertexIndices[mMorphData->mCurrentIndex]; - } - if (poly_mesh != NULL) - { - *poly_mesh = mMesh; - } - - return resultVec; - } - return NULL; -} - -//----------------------------------------------------------------------------- -// getNextDistortion() -//----------------------------------------------------------------------------- -const LLVector4a *LLPolyMorphTarget::getNextDistortion(U32 *index, LLPolyMesh **poly_mesh) -{ - if (!mMorphData) return &LLVector4a::getZero(); - - LLVector4a* resultVec; - mMorphData->mCurrentIndex++; - if (mMorphData->mCurrentIndex < mMorphData->mNumIndices) - { - resultVec = &mMorphData->mCoords[mMorphData->mCurrentIndex]; - if (index != NULL) - { - *index = mMorphData->mVertexIndices[mMorphData->mCurrentIndex]; - } - if (poly_mesh != NULL) - { - *poly_mesh = mMesh; - } - return resultVec; - } - return NULL; -} - -//----------------------------------------------------------------------------- -// getTotalDistortion() -//----------------------------------------------------------------------------- -F32 LLPolyMorphTarget::getTotalDistortion() -{ - if (mMorphData) - { - return mMorphData->mTotalDistortion; - } - else - { - return 0.f; - } -} - -//----------------------------------------------------------------------------- -// getAvgDistortion() -//----------------------------------------------------------------------------- -const LLVector4a& LLPolyMorphTarget::getAvgDistortion() -{ - if (mMorphData) - { - return mMorphData->mAvgDistortion; - } - else - { - return LLVector4a::getZero(); - } -} - -//----------------------------------------------------------------------------- -// getMaxDistortion() -//----------------------------------------------------------------------------- -F32 LLPolyMorphTarget::getMaxDistortion() -{ - if (mMorphData) - { - return mMorphData->mMaxDistortion; - } - else - { - return 0.f; - } -} - -//----------------------------------------------------------------------------- -// apply() -//----------------------------------------------------------------------------- -static LLFastTimer::DeclareTimer FTM_APPLY_MORPH_TARGET("Apply Morph"); - -void LLPolyMorphTarget::apply( ESex avatar_sex ) -{ - if (!mMorphData || mNumMorphMasksPending > 0) - { - return; - } - - LLFastTimer t(FTM_APPLY_MORPH_TARGET); - - mLastSex = avatar_sex; - - // Check for NaN condition (NaN is detected if a variable doesn't equal itself. - if (mCurWeight != mCurWeight) - { - mCurWeight = 0.0; - } - if (mLastWeight != mLastWeight) - { - mLastWeight = mCurWeight+.001; - } - - // perform differential update of morph - F32 delta_weight = ( getSex() & avatar_sex ) ? (mCurWeight - mLastWeight) : (getDefaultWeight() - mLastWeight); - // store last weight - mLastWeight += delta_weight; - - if (delta_weight != 0.f) - { - llassert(!mMesh->isLOD()); - LLVector4a *coords = mMesh->getWritableCoords(); - - LLVector4a *scaled_normals = mMesh->getScaledNormals(); - LLVector4a *normals = mMesh->getWritableNormals(); - - LLVector4a *scaled_binormals = mMesh->getScaledBinormals(); - LLVector4a *binormals = mMesh->getWritableBinormals(); - - LLVector4a *clothing_weights = mMesh->getWritableClothingWeights(); - LLVector2 *tex_coords = mMesh->getWritableTexCoords(); - - F32 *maskWeightArray = (mVertMask) ? mVertMask->getMorphMaskWeights() : NULL; - - for(U32 vert_index_morph = 0; vert_index_morph < mMorphData->mNumIndices; vert_index_morph++) - { - S32 vert_index_mesh = mMorphData->mVertexIndices[vert_index_morph]; - - F32 maskWeight = 1.f; - if (maskWeightArray) - { - maskWeight = maskWeightArray[vert_index_morph]; - } - - - LLVector4a pos = mMorphData->mCoords[vert_index_morph]; - pos.mul(delta_weight*maskWeight); - coords[vert_index_mesh].add(pos); - - if (getInfo()->mIsClothingMorph && clothing_weights) - { - LLVector4a clothing_offset = mMorphData->mCoords[vert_index_morph]; - clothing_offset.mul(delta_weight * maskWeight); - LLVector4a* clothing_weight = &clothing_weights[vert_index_mesh]; - clothing_weight->add(clothing_offset); - clothing_weight->getF32ptr()[VW] = maskWeight; - } - - // calculate new normals based on half angles - LLVector4a norm = mMorphData->mNormals[vert_index_morph]; - norm.mul(delta_weight*maskWeight*NORMAL_SOFTEN_FACTOR); - scaled_normals[vert_index_mesh].add(norm); - norm = scaled_normals[vert_index_mesh]; - norm.normalize3fast(); - normals[vert_index_mesh] = norm; - - // calculate new binormals - LLVector4a binorm = mMorphData->mBinormals[vert_index_morph]; - binorm.mul(delta_weight*maskWeight*NORMAL_SOFTEN_FACTOR); - scaled_binormals[vert_index_mesh].add(binorm); - LLVector4a tangent; - tangent.setCross3(scaled_binormals[vert_index_mesh], norm); - LLVector4a& normalized_binormal = binormals[vert_index_mesh]; - normalized_binormal.setCross3(norm, tangent); - normalized_binormal.normalize3fast(); - - tex_coords[vert_index_mesh] += mMorphData->mTexCoords[vert_index_morph] * delta_weight * maskWeight; - } - - // now apply volume changes - for( volume_list_t::iterator iter = mVolumeMorphs.begin(); iter != mVolumeMorphs.end(); iter++ ) - { - LLPolyVolumeMorph* volume_morph = &(*iter); - LLVector3 scale_delta = volume_morph->mScale * delta_weight; - LLVector3 pos_delta = volume_morph->mPos * delta_weight; - - volume_morph->mVolume->setScale(volume_morph->mVolume->getScale() + scale_delta); - volume_morph->mVolume->setPosition(volume_morph->mVolume->getPosition() + pos_delta); - } - } - - if (mNext) - { - mNext->apply(avatar_sex); - } -} - -//----------------------------------------------------------------------------- -// applyMask() -//----------------------------------------------------------------------------- -void LLPolyMorphTarget::applyMask(U8 *maskTextureData, S32 width, S32 height, S32 num_components, BOOL invert) -{ - LLVector4a *clothing_weights = getInfo()->mIsClothingMorph ? mMesh->getWritableClothingWeights() : NULL; - - if (!mVertMask) - { - mVertMask = new LLPolyVertexMask(mMorphData); - mNumMorphMasksPending--; - } - else - { - // remove effect of previous mask - F32 *maskWeights = (mVertMask) ? mVertMask->getMorphMaskWeights() : NULL; - - if (maskWeights) - { - LLVector4a *coords = mMesh->getWritableCoords(); - LLVector4a *scaled_normals = mMesh->getScaledNormals(); - LLVector4a *scaled_binormals = mMesh->getScaledBinormals(); - LLVector2 *tex_coords = mMesh->getWritableTexCoords(); - - LLVector4Logical clothing_mask; - clothing_mask.clear(); - clothing_mask.setElement<0>(); - clothing_mask.setElement<1>(); - clothing_mask.setElement<2>(); - - - for(U32 vert = 0; vert < mMorphData->mNumIndices; vert++) - { - F32 lastMaskWeight = mLastWeight * maskWeights[vert]; - S32 out_vert = mMorphData->mVertexIndices[vert]; - - // remove effect of existing masked morph - LLVector4a t; - t = mMorphData->mCoords[vert]; - t.mul(lastMaskWeight); - coords[out_vert].sub(t); - - t = mMorphData->mNormals[vert]; - t.mul(lastMaskWeight*NORMAL_SOFTEN_FACTOR); - scaled_normals[out_vert].sub(t); - - t = mMorphData->mBinormals[vert]; - t.mul(lastMaskWeight*NORMAL_SOFTEN_FACTOR); - scaled_binormals[out_vert].sub(t); - - tex_coords[out_vert] -= mMorphData->mTexCoords[vert] * lastMaskWeight; - - if (clothing_weights) - { - LLVector4a clothing_offset = mMorphData->mCoords[vert]; - clothing_offset.mul(lastMaskWeight); - LLVector4a* clothing_weight = &clothing_weights[out_vert]; - LLVector4a t; - t.setSub(*clothing_weight, clothing_offset); - clothing_weight->setSelectWithMask(clothing_mask, t, *clothing_weight); - } - } - } - } - - // set last weight to 0, since we've removed the effect of this morph - mLastWeight = 0.f; - - mVertMask->generateMask(maskTextureData, width, height, num_components, invert, clothing_weights); - - apply(mLastSex); -} - - -//----------------------------------------------------------------------------- -// LLPolyVertexMask() -//----------------------------------------------------------------------------- -LLPolyVertexMask::LLPolyVertexMask(LLPolyMorphData* morph_data) -{ - mWeights = new F32[morph_data->mNumIndices]; - mMorphData = morph_data; - mWeightsGenerated = FALSE; -} - -//----------------------------------------------------------------------------- -// ~LLPolyVertexMask() -//----------------------------------------------------------------------------- -LLPolyVertexMask::~LLPolyVertexMask() -{ - delete[] mWeights; -} - -//----------------------------------------------------------------------------- -// generateMask() -//----------------------------------------------------------------------------- -void LLPolyVertexMask::generateMask(U8 *maskTextureData, S32 width, S32 height, S32 num_components, BOOL invert, LLVector4a *clothing_weights) -{ -// RN debug output that uses Image Debugger (http://www.cs.unc.edu/~baxter/projects/imdebug/) -// BOOL debugImg = FALSE; -// if (debugImg) -// { -// if (invert) -// { -// imdebug("lum rbga=rgba b=8 w=%d h=%d *-1 %p", width, height, maskTextureData); -// } -// else -// { -// imdebug("lum rbga=rgba b=8 w=%d h=%d %p", width, height, maskTextureData); -// } -// } - for (U32 index = 0; index < mMorphData->mNumIndices; index++) - { - S32 vertIndex = mMorphData->mVertexIndices[index]; - const S32 *sharedVertIndex = mMorphData->mMesh->getSharedVert(vertIndex); - LLVector2 uvCoords; - - if (sharedVertIndex) - { - uvCoords = mMorphData->mMesh->getUVs(*sharedVertIndex); - } - else - { - uvCoords = mMorphData->mMesh->getUVs(vertIndex); - } - U32 s = llclamp((U32)(uvCoords.mV[VX] * (F32)(width - 1)), (U32)0, (U32)width - 1); - U32 t = llclamp((U32)(uvCoords.mV[VY] * (F32)(height - 1)), (U32)0, (U32)height - 1); - - mWeights[index] = ((F32) maskTextureData[((t * width + s) * num_components) + (num_components - 1)]) / 255.f; - - if (invert) - { - mWeights[index] = 1.f - mWeights[index]; - } - - // now apply step function - // mWeights[index] = mWeights[index] > 0.95f ? 1.f : 0.f; - - if (clothing_weights) - { - clothing_weights[vertIndex].getF32ptr()[VW] = mWeights[index]; - } - } - mWeightsGenerated = TRUE; -} - -//----------------------------------------------------------------------------- -// getMaskForMorphIndex() -//----------------------------------------------------------------------------- -F32* LLPolyVertexMask::getMorphMaskWeights() -{ - if (!mWeightsGenerated) - { - return NULL; - } - - return mWeights; -} diff --git a/indra/newview/llpolymorph.h b/indra/newview/llpolymorph.h deleted file mode 100644 index 24940c52e0..0000000000 --- a/indra/newview/llpolymorph.h +++ /dev/null @@ -1,197 +0,0 @@ -/** - * @file llpolymorph.h - * @brief Implementation of LLPolyMesh class - * - * $LicenseInfo:firstyear=2001&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$ - */ - -#ifndef LL_LLPOLYMORPH_H -#define LL_LLPOLYMORPH_H - -#include <string> -#include <vector> - -#include "llviewervisualparam.h" - -class LLPolyMeshSharedData; -class LLVOAvatar; -class LLVector2; -class LLViewerJointCollisionVolume; -class LLWearable; - -//----------------------------------------------------------------------------- -// LLPolyMorphData() -//----------------------------------------------------------------------------- -LL_ALIGN_PREFIX(16) -class LLPolyMorphData -{ -public: - LLPolyMorphData(const std::string& morph_name); - ~LLPolyMorphData(); - LLPolyMorphData(const LLPolyMorphData &rhs); - - void* operator new(size_t size) - { - return ll_aligned_malloc_16(size); - } - - void operator delete(void* ptr) - { - ll_aligned_free_16(ptr); - } - - BOOL loadBinary(LLFILE* fp, LLPolyMeshSharedData *mesh); - const std::string& getName() { return mName; } - -public: - std::string mName; - - // morphology - U32 mNumIndices; - U32* mVertexIndices; - U32 mCurrentIndex; - LLVector4a* mCoords; - LLVector4a* mNormals; - LLVector4a* mBinormals; - LLVector2* mTexCoords; - - F32 mTotalDistortion; // vertex distortion summed over entire morph - F32 mMaxDistortion; // maximum single vertex distortion in a given morph - LL_ALIGN_16(LLVector4a mAvgDistortion); // average vertex distortion, to infer directionality of the morph - LLPolyMeshSharedData* mMesh; - -private: - void freeData(); -} LL_ALIGN_POSTFIX(16); - - -//----------------------------------------------------------------------------- -// LLPolyVertexMask() -//----------------------------------------------------------------------------- -class LLPolyVertexMask -{ -public: - LLPolyVertexMask(LLPolyMorphData* morph_data); - ~LLPolyVertexMask(); - - void generateMask(U8 *maskData, S32 width, S32 height, S32 num_components, BOOL invert, LLVector4a *clothing_weights); - F32* getMorphMaskWeights(); - - -protected: - F32* mWeights; - LLPolyMorphData *mMorphData; - BOOL mWeightsGenerated; - -}; - -//----------------------------------------------------------------------------- -// LLPolyMorphTarget Data structs -//----------------------------------------------------------------------------- -struct LLPolyVolumeMorphInfo -{ - LLPolyVolumeMorphInfo(std::string &name, LLVector3 &scale, LLVector3 &pos) - : mName(name), mScale(scale), mPos(pos) {}; - - std::string mName; - LLVector3 mScale; - LLVector3 mPos; -}; - -struct LLPolyVolumeMorph -{ - LLPolyVolumeMorph(LLViewerJointCollisionVolume* volume, LLVector3 scale, LLVector3 pos) - : mVolume(volume), mScale(scale), mPos(pos) {}; - - LLViewerJointCollisionVolume* mVolume; - LLVector3 mScale; - LLVector3 mPos; -}; - -//----------------------------------------------------------------------------- -// LLPolyMorphTargetInfo -// Shared information for LLPolyMorphTargets -//----------------------------------------------------------------------------- -class LLPolyMorphTargetInfo : public LLViewerVisualParamInfo -{ - friend class LLPolyMorphTarget; -public: - LLPolyMorphTargetInfo(); - /*virtual*/ ~LLPolyMorphTargetInfo() {}; - - /*virtual*/ BOOL parseXml(LLXmlTreeNode* node); - -protected: - std::string mMorphName; - BOOL mIsClothingMorph; - typedef std::vector<LLPolyVolumeMorphInfo> volume_info_list_t; - volume_info_list_t mVolumeInfoList; -}; - -//----------------------------------------------------------------------------- -// LLPolyMorphTarget -// A set of vertex data associated with morph target. -// These morph targets must be topologically consistent with a given Polymesh -// (share face sets) -//----------------------------------------------------------------------------- -class LLPolyMorphTarget : public LLViewerVisualParam -{ -public: - LLPolyMorphTarget(LLPolyMesh *poly_mesh); - ~LLPolyMorphTarget(); - - // Special: These functions are overridden by child classes - LLPolyMorphTargetInfo* getInfo() const { return (LLPolyMorphTargetInfo*)mInfo; } - // This sets mInfo and calls initialization functions - BOOL setInfo(LLPolyMorphTargetInfo *info); - - /*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const; - - // LLVisualParam Virtual functions - ///*virtual*/ BOOL parseData(LLXmlTreeNode* node); - /*virtual*/ void apply( ESex sex ); - - // LLViewerVisualParam Virtual functions - /*virtual*/ F32 getTotalDistortion(); - /*virtual*/ const LLVector4a& getAvgDistortion(); - /*virtual*/ F32 getMaxDistortion(); - /*virtual*/ LLVector4a getVertexDistortion(S32 index, LLPolyMesh *poly_mesh); - /*virtual*/ const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh); - /*virtual*/ const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh); - - void applyMask(U8 *maskData, S32 width, S32 height, S32 num_components, BOOL invert); - void addPendingMorphMask() { mNumMorphMasksPending++; } - -protected: - LLPolyMorphData* mMorphData; - LLPolyMesh* mMesh; - LLPolyVertexMask * mVertMask; - ESex mLastSex; - // number of morph masks that haven't been generated, must be 0 before this morph is applied - BOOL mNumMorphMasksPending; - - typedef std::vector<LLPolyVolumeMorph> volume_list_t; - volume_list_t mVolumeMorphs; - -}; - -#endif // LL_LLPOLYMORPH_H diff --git a/indra/newview/llpostcard.cpp b/indra/newview/llpostcard.cpp index 4f2d6da7e5..aebe636f59 100644 --- a/indra/newview/llpostcard.cpp +++ b/indra/newview/llpostcard.cpp @@ -35,6 +35,7 @@ #include "message.h" #include "llagent.h" +#include "llassetstorage.h" #include "llassetuploadresponders.h" /////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 3ff5a05d81..91a98792eb 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -70,7 +70,7 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key) mAspectRatio(0.f), mPreviewToSave(FALSE), mImage(NULL), - mImageOldBoostLevel(LLViewerTexture::BOOST_NONE) + mImageOldBoostLevel(LLGLTexture::BOOST_NONE) { updateImageID(); if (key.has("save_as")) @@ -468,9 +468,9 @@ void LLPreviewTexture::onAspectRatioCommit(LLUICtrl* ctrl, void* userdata) void LLPreviewTexture::loadAsset() { - mImage = LLViewerTextureManager::getFetchedTexture(mImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + mImage = LLViewerTextureManager::getFetchedTexture(mImageID, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); mImageOldBoostLevel = mImage->getBoostLevel(); - mImage->setBoostLevel(LLViewerTexture::BOOST_PREVIEW); + mImage->setBoostLevel(LLGLTexture::BOOST_PREVIEW); mImage->forceToSaveRawImage(0) ; mAssetStatus = PREVIEW_ASSET_LOADING; mUpdateDimensions = TRUE; diff --git a/indra/newview/llproductinforequest.cpp b/indra/newview/llproductinforequest.cpp index 93bf8b2328..1390000fc5 100644 --- a/indra/newview/llproductinforequest.cpp +++ b/indra/newview/llproductinforequest.cpp @@ -43,10 +43,10 @@ public: } //If we get back an error (not found, etc...), handle it here - virtual void error(U32 status, const std::string& reason) + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - llwarns << "LLProductInfoRequest::error(" - << status << ": " << reason << ")" << llendl; + llwarns << "LLProductInfoRequest error [status:" + << status << ":] " << content << llendl; } }; diff --git a/indra/newview/llregioninfomodel.cpp b/indra/newview/llregioninfomodel.cpp index 698c4f9bb9..590e246482 100644 --- a/indra/newview/llregioninfomodel.cpp +++ b/indra/newview/llregioninfomodel.cpp @@ -119,7 +119,7 @@ void LLRegionInfoModel::sendRegionTerrain(const LLUUID& invoice) const bool LLRegionInfoModel::getUseFixedSun() const { - return mRegionFlags & REGION_FLAGS_SUN_FIXED; + return ((mRegionFlags & REGION_FLAGS_SUN_FIXED) != 0); } void LLRegionInfoModel::setUseFixedSun(bool fixed) @@ -141,7 +141,6 @@ void LLRegionInfoModel::update(LLMessageSystem* msg) msg->getStringFast(_PREHASH_RegionInfo, _PREHASH_SimName, mSimName); msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_EstateID, mEstateID); msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_ParentEstateID, mParentEstateID); - msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, mRegionFlags); msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_SimAccess, mSimAccess); msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_MaxAgents, mAgentLimit); msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_ObjectBonusFactor, mObjectBonusFactor); @@ -159,6 +158,17 @@ void LLRegionInfoModel::update(LLMessageSystem* msg) msg->getF32(_PREHASH_RegionInfo, _PREHASH_SunHour, mSunHour); LL_DEBUGS("Windlight Sync") << "Got region sun hour: " << mSunHour << LL_ENDL; + if (msg->has(_PREHASH_RegionInfo3)) + { + msg->getU64Fast(_PREHASH_RegionInfo3, _PREHASH_RegionFlagsExtended, mRegionFlags); + } + else + { + U32 flags = 0; + msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, flags); + mRegionFlags = flags; + } + // the only reasonable way to decide if we actually have any data is to // check to see if any of these fields have nonzero sizes if (msg->getSize(_PREHASH_RegionInfo2, _PREHASH_ProductSKU) > 0 || diff --git a/indra/newview/llregioninfomodel.h b/indra/newview/llregioninfomodel.h index 89efd82767..d22a0de463 100644 --- a/indra/newview/llregioninfomodel.h +++ b/indra/newview/llregioninfomodel.h @@ -52,7 +52,7 @@ public: U8 mSimAccess; U8 mAgentLimit; - U32 mRegionFlags; + U64 mRegionFlags; U32 mEstateID; U32 mParentEstateID; diff --git a/indra/newview/llremoteparcelrequest.cpp b/indra/newview/llremoteparcelrequest.cpp index 3862dac340..500dec7ee5 100644 --- a/indra/newview/llremoteparcelrequest.cpp +++ b/indra/newview/llremoteparcelrequest.cpp @@ -62,10 +62,10 @@ void LLRemoteParcelRequestResponder::result(const LLSD& content) //If we get back an error (not found, etc...), handle it here //virtual -void LLRemoteParcelRequestResponder::error(U32 status, const std::string& reason) +void LLRemoteParcelRequestResponder::errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - llinfos << "LLRemoteParcelRequest::error(" - << status << ": " << reason << ")" << llendl; + llwarns << "LLRemoteParcelRequest error [status:" + << status << "]: " << content << llendl; // Panel inspecting the information may be closed and destroyed // before this response is received. diff --git a/indra/newview/llremoteparcelrequest.h b/indra/newview/llremoteparcelrequest.h index 74cf1616df..b87056573b 100644 --- a/indra/newview/llremoteparcelrequest.h +++ b/indra/newview/llremoteparcelrequest.h @@ -44,7 +44,7 @@ public: /*virtual*/ void result(const LLSD& content); //If we get back an error (not found, etc...), handle it here - /*virtual*/ void error(U32 status, const std::string& reason); + /*virtual*/ void errorWithContent(U32 status, const std::string& reason, const LLSD& content); protected: LLHandle<LLRemoteParcelInfoObserver> mObserverHandle; diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 154555b261..168a941ec3 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -730,7 +730,6 @@ void LLScreenChannel::showToastsTop() LLRect toast_rect; S32 top = channel_rect.mTop; - S32 toast_margin = 0; std::vector<ToastElem>::reverse_iterator it; updateRect(); @@ -753,7 +752,7 @@ void LLScreenChannel::showToastsTop() } top = toast->getRect().mBottom - toast->getTopPad(); - toast_margin = gSavedSettings.getS32("ToastGap"); + gSavedSettings.getS32("ToastGap"); } LLToast* toast = it->getToast(); diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp index 05b82ba967..a7e24b86b1 100644 --- a/indra/newview/llscrollingpanelparam.cpp +++ b/indra/newview/llscrollingpanelparam.cpp @@ -267,7 +267,7 @@ void LLScrollingPanelParam::onHintHeldDown( LLVisualParamHint* hint ) && new_percent < slider->getMaxValue()) { mWearable->setVisualParamWeight( hint->getVisualParam()->getID(), new_weight, FALSE); - mWearable->writeToAvatar(); + mWearable->writeToAvatar(gAgentAvatarp); gAgentAvatarp->updateVisualParams(); slider->setValue( weightToPercent( new_weight ) ); @@ -300,7 +300,7 @@ void LLScrollingPanelParam::onHintMinMouseUp( void* userdata ) && new_percent < slider->getMaxValue()) { self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, FALSE); - self->mWearable->writeToAvatar(); + self->mWearable->writeToAvatar(gAgentAvatarp); slider->setValue( self->weightToPercent( new_weight ) ); } } @@ -334,7 +334,7 @@ void LLScrollingPanelParam::onHintMaxMouseUp( void* userdata ) && new_percent < slider->getMaxValue()) { self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, FALSE); - self->mWearable->writeToAvatar(); + self->mWearable->writeToAvatar(gAgentAvatarp); slider->setValue( self->weightToPercent( new_weight ) ); } } diff --git a/indra/newview/llscrollingpanelparambase.cpp b/indra/newview/llscrollingpanelparambase.cpp index 62e3039d2f..8e083ddb6c 100644 --- a/indra/newview/llscrollingpanelparambase.cpp +++ b/indra/newview/llscrollingpanelparambase.cpp @@ -94,7 +94,7 @@ void LLScrollingPanelParamBase::onSliderMoved(LLUICtrl* ctrl, void* userdata) if (current_weight != new_weight ) { self->mWearable->setVisualParamWeight( param->getID(), new_weight, FALSE ); - self->mWearable->writeToAvatar(); + self->mWearable->writeToAvatar(gAgentAvatarp); gAgentAvatarp->updateVisualParams(); } } diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp index 30400a4c6a..928d26646b 100644 --- a/indra/newview/llsechandler_basic.cpp +++ b/indra/newview/llsechandler_basic.cpp @@ -1239,7 +1239,6 @@ void LLSecAPIBasicHandler::_readProtectedData() llifstream::binary); if (!protected_data_stream.fail()) { - int offset; U8 salt[STORE_SALT_SIZE]; U8 buffer[BUFFER_READ_SIZE]; U8 decrypted_buffer[BUFFER_READ_SIZE]; @@ -1250,7 +1249,6 @@ void LLSecAPIBasicHandler::_readProtectedData() // read in the salt and key protected_data_stream.read((char *)salt, STORE_SALT_SIZE); - offset = 0; if (protected_data_stream.gcount() < STORE_SALT_SIZE) { throw LLProtectedDataException("Config file too short."); diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 4f58d09db3..5a65623b91 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -29,6 +29,7 @@ // file include #define LLSELECTMGR_CPP #include "llselectmgr.h" +#include "llmaterialmgr.h" // library includes #include "llcachename.h" @@ -63,7 +64,6 @@ #include "llhudeffecttrail.h" #include "llhudmanager.h" #include "llinventorymodel.h" -#include "llmaterialmgr.h" #include "llmenugl.h" #include "llmeshrepository.h" #include "llmutelist.h" @@ -1197,8 +1197,7 @@ 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(); - LLVector3 first_grid_obj_pos = first_grid_object->getRenderPosition(); - (void)first_grid_obj_pos; + LLVector4a min_extents(F32_MAX); LLVector4a max_extents(-F32_MAX); BOOL grid_changed = FALSE; @@ -1604,7 +1603,7 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid) // Texture picker defaults aren't inventory items // * Don't need to worry about permissions for them // * Can just apply the texture and be done with it. - objectp->setTEImage(te, LLViewerTextureManager::getFetchedTexture(mImageID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); + objectp->setTEImage(te, LLViewerTextureManager::getFetchedTexture(mImageID, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); } return true; } @@ -1770,7 +1769,7 @@ BOOL LLSelectMgr::selectionRevertTextures() } else { - object->setTEImage(te, LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); + object->setTEImage(te, LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); } } } @@ -1923,7 +1922,7 @@ void LLSelectMgr::selectionSetMedia(U8 media_type, const LLSD &media_data) llassert(mMediaData.isMap()); const LLTextureEntry *texture_entry = object->getTE(te); if (!mMediaData.isMap() || - ((NULL != texture_entry) && !texture_entry->hasMedia() && !mMediaData.has(LLMediaEntry::HOME_URL_KEY))) + (NULL != texture_entry) && !texture_entry->hasMedia() && !mMediaData.has(LLMediaEntry::HOME_URL_KEY)) { // skip adding/updating media } @@ -5248,7 +5247,7 @@ void LLSelectMgr::updateSilhouettes() if (!mSilhouetteImagep) { - mSilhouetteImagep = LLViewerTextureManager::getFetchedTextureFromFile("silhouette.j2c", TRUE, LLViewerTexture::BOOST_UI); + mSilhouetteImagep = LLViewerTextureManager::getFetchedTextureFromFile("silhouette.j2c", FTT_LOCAL_FILE, TRUE, LLGLTexture::BOOST_UI); } mHighlightedObjects->cleanupNodes(); diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index adb97ac800..df413ab849 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -47,7 +47,7 @@ #include "llviewercontrol.h" #include "llviewerregion.h" #include "llvoavatarself.h" -#include "llwearable.h" +#include "llviewerwearable.h" static LLRegisterPanelClassWrapper<LLSidepanelAppearance> t_appearance("sidepanel_appearance"); @@ -198,7 +198,7 @@ void LLSidepanelAppearance::updateToVisibility(const LLSD &new_visibility) if (is_outfit_edit_visible || is_wearable_edit_visible) { - const LLWearable *wearable_ptr = mEditWearable->getWearable(); + const LLViewerWearable *wearable_ptr = mEditWearable->getWearable(); if (!wearable_ptr) { llwarns << "Visibility change to invalid wearable" << llendl; @@ -206,12 +206,9 @@ void LLSidepanelAppearance::updateToVisibility(const LLSD &new_visibility) } // Disable camera switch is currently just for WT_PHYSICS type since we don't want to freeze the avatar // when editing its physics. - const BOOL disable_camera_motion = LLWearableType::getDisableCameraSwitch(wearable_ptr->getType()); - if (!gAgentCamera.cameraCustomizeAvatar() && - !disable_camera_motion && - gSavedSettings.getBOOL("AppearanceCameraMovement")) + if (!gAgentCamera.cameraCustomizeAvatar()) { - gAgentCamera.changeCameraToCustomizeAvatar(); + LLVOAvatarSelf::onCustomizeStart(LLWearableType::getDisableCameraSwitch(wearable_ptr->getType())); } if (is_wearable_edit_visible) { @@ -283,7 +280,7 @@ void LLSidepanelAppearance::onEditAppearanceButtonClicked() { if (gAgentWearables.areWearablesLoaded()) { - gAgentCamera.changeCameraToCustomizeAvatar(); + LLVOAvatarSelf::onCustomizeStart(); } } @@ -329,7 +326,7 @@ void LLSidepanelAppearance::showOutfitEditPanel() toggleOutfitEditPanel(TRUE); } -void LLSidepanelAppearance::showWearableEditPanel(LLWearable *wearable /* = NULL*/, BOOL disable_camera_switch) +void LLSidepanelAppearance::showWearableEditPanel(LLViewerWearable *wearable /* = NULL*/, BOOL disable_camera_switch) { toggleMyOutfitsPanel(FALSE); toggleOutfitEditPanel(FALSE, TRUE); // don't switch out of edit appearance mode @@ -371,19 +368,19 @@ void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible, BOOL disable_cam if (visible) { mOutfitEdit->onOpen(LLSD()); - if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") ) - { - gAgentCamera.changeCameraToCustomizeAvatar(); - } + LLVOAvatarSelf::onCustomizeStart(disable_camera_switch); } - else if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") ) + else { - gAgentCamera.changeCameraToDefault(); - gAgentCamera.resetView(); + if (!disable_camera_switch) // if we're just switching between outfit and wearable editing, don't end customization. + { + LLVOAvatarSelf::onCustomizeEnd(disable_camera_switch); + LLAppearanceMgr::getInstance()->updateIsDirty(); + } } } -void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *wearable, BOOL disable_camera_switch) +void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLViewerWearable *wearable, BOOL disable_camera_switch) { if (!mEditWearable || mEditWearable->getVisible() == visible) { @@ -393,7 +390,7 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we if (!wearable) { - wearable = gAgentWearables.getWearable(LLWearableType::WT_SHAPE, 0); + wearable = gAgentWearables.getViewerWearable(LLWearableType::WT_SHAPE, 0); } if (!wearable) { @@ -405,10 +402,7 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we if (visible) { - if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") ) - { - gAgentCamera.changeCameraToCustomizeAvatar(); - } + LLVOAvatarSelf::onCustomizeStart(disable_camera_switch); mEditWearable->setWearable(wearable, disable_camera_switch); mEditWearable->onOpen(LLSD()); // currently no-op, just for consistency } @@ -416,10 +410,10 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we { // Save changes if closing. mEditWearable->saveChanges(); - if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") ) + LLAppearanceMgr::getInstance()->updateIsDirty(); + if (!disable_camera_switch) // if we're just switching between outfit and wearable editing, don't end customization. { - gAgentCamera.changeCameraToDefault(); - gAgentCamera.resetView(); + LLVOAvatarSelf::onCustomizeEnd(disable_camera_switch); } } } @@ -453,13 +447,12 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name) } //static -void LLSidepanelAppearance::editWearable(LLWearable *wearable, LLView *data, BOOL disable_camera_switch) +void LLSidepanelAppearance::editWearable(LLViewerWearable *wearable, LLView *data, BOOL disable_camera_switch) { LLFloaterSidePanelContainer::showPanel("appearance", LLSD()); LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(data); if (panel) { - panel->showOutfitsInventoryPanel(); panel->showWearableEditPanel(wearable, disable_camera_switch); } } diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h index 6dd3520266..b0a6b9cf91 100644 --- a/indra/newview/llsidepanelappearance.h +++ b/indra/newview/llsidepanelappearance.h @@ -36,7 +36,7 @@ class LLFilterEditor; class LLCurrentlyWornFetchObserver; class LLPanelEditWearable; -class LLWearable; +class LLViewerWearable; class LLPanelOutfitsInventory; class LLSidepanelAppearance : public LLPanel @@ -51,7 +51,7 @@ public: void refreshCurrentOutfitName(const std::string& name = ""); - static void editWearable(LLWearable *wearable, LLView *data, BOOL disable_camera_switch = FALSE); + static void editWearable(LLViewerWearable *wearable, LLView *data, BOOL disable_camera_switch = FALSE); void fetchInventory(); void inventoryFetched(); @@ -59,11 +59,12 @@ public: void showOutfitsInventoryPanel(); void showOutfitEditPanel(); - void showWearableEditPanel(LLWearable *wearable = NULL, BOOL disable_camera_switch = FALSE); + void showWearableEditPanel(LLViewerWearable *wearable = NULL, BOOL disable_camera_switch = FALSE); void setWearablesLoading(bool val); void showDefaultSubpart(); void updateScrollingPanelList(); void updateToVisibility( const LLSD& new_visibility ); + LLPanelEditWearable* getWearable(){ return mEditWearable; } private: void onFilterEdit(const std::string& search_string); @@ -74,7 +75,7 @@ private: void toggleMyOutfitsPanel(BOOL visible); void toggleOutfitEditPanel(BOOL visible, BOOL disable_camera_switch = FALSE); - void toggleWearableEditPanel(BOOL visible, LLWearable* wearable = NULL, BOOL disable_camera_switch = FALSE); + void toggleWearableEditPanel(BOOL visible, LLViewerWearable* wearable = NULL, BOOL disable_camera_switch = FALSE); LLFilterEditor* mFilterEditor; LLPanelOutfitsInventory* mPanelOutfitsInventory; diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index 5532bdc71a..ad7c939728 100644 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -370,10 +370,8 @@ void LLSidepanelTaskInfo::refresh() // Update creator text field getChildView("Creator:")->setEnabled(TRUE); - BOOL creators_identical; std::string creator_name; - creators_identical = LLSelectMgr::getInstance()->selectGetCreator(mCreatorID, - creator_name); + LLSelectMgr::getInstance()->selectGetCreator(mCreatorID, creator_name); getChild<LLUICtrl>("Creator Name")->setValue(creator_name); getChildView("Creator Name")->setEnabled(TRUE); diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index f6e282ad87..6bb9d5f201 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -89,7 +89,7 @@ class LLOcclusionQueryPool : public LLGLNamePool public: LLOcclusionQueryPool() { - mCurQuery = 2; //1 is reserved for LLGLSLShader + mCurQuery = 1; } protected: @@ -3544,9 +3544,9 @@ void renderTexturePriority(LLDrawable* drawable) drawBox(center, size); /*S32 boost = imagep->getBoostLevel(); - if (boost>LLViewerTexture::BOOST_NONE) + if (boost>LLGLTexture::BOOST_NONE) { - F32 t = (F32) boost / (F32) (LLViewerTexture::BOOST_MAX_LEVEL-1); + F32 t = (F32) boost / (F32) (LLGLTexture::BOOST_MAX_LEVEL-1); LLVector4 col = lerp(boost_cold, boost_hot, t); LLGLEnable blend_on(GL_BLEND); gGL.blendFunc(GL_SRC_ALPHA, GL_ONE); @@ -3998,7 +3998,7 @@ void renderAgentTarget(LLVOAvatar* avatar) { renderCrossHairs(avatar->getPositionAgent(), 0.2f, LLColor4(1, 0, 0, 0.8f)); renderCrossHairs(avatar->mDrawable->getPositionAgent(), 0.2f, LLColor4(0, 1, 0, 0.8f)); - renderCrossHairs(avatar->mRoot.getWorldPosition(), 0.2f, LLColor4(1, 1, 1, 0.8f)); + renderCrossHairs(avatar->mRoot->getWorldPosition(), 0.2f, LLColor4(1, 1, 1, 0.8f)); renderCrossHairs(avatar->mPelvisp->getWorldPosition(), 0.2f, LLColor4(0, 0, 1, 0.8f)); } } @@ -4062,9 +4062,6 @@ public: return; } - LLVector4a nodeCenter = group->mBounds[0]; - LLVector4a octCenter = group->mOctreeNode->getCenter(); - group->rebuildGeom(); group->rebuildMesh(); @@ -4539,9 +4536,6 @@ public: virtual bool check(LLDrawable* drawable) { - LLVector3 local_start = mStart; - LLVector3 local_end = mEnd; - if (!drawable || !gPipeline.hasRenderType(drawable->getRenderType()) || !drawable->isVisible()) { return false; diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 8783d99b11..a4582071e8 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -853,7 +853,10 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update) } } } - +/*prep# + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) + llwarns << "ModerationResponder error [status:" << status << "]: " << content << llendl; + */ void LLIMSpeakerMgr::toggleAllowTextChat(const LLUUID& speaker_id) { LLPointer<LLSpeaker> speakerp = findSpeaker(speaker_id); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 37e6ded986..f6da44d8a7 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -37,8 +37,8 @@ #include "llviewermedia_streamingaudio.h" #include "llaudioengine.h" -#ifdef LL_FMOD -# include "llaudioengine_fmod.h" +#ifdef LL_FMODEX +# include "llaudioengine_fmodex.h" #endif #ifdef LL_OPENAL @@ -316,7 +316,6 @@ bool idle_startup() { const F32 PRECACHING_DELAY = gSavedSettings.getF32("PrecachingDelay"); static LLTimer timeout; - static S32 timeout_count = 0; static LLTimer login_time; @@ -332,7 +331,6 @@ bool idle_startup() // last location by default static S32 agent_location_id = START_LOCATION_ID_LAST; - static S32 location_which = START_LOCATION_ID_LAST; static bool show_connect_box = true; @@ -625,32 +623,32 @@ bool idle_startup() { gAudiop = NULL; -#ifdef LL_OPENAL +#ifdef LL_FMODEX if (!gAudiop #if !LL_WINDOWS - && NULL == getenv("LL_BAD_OPENAL_DRIVER") + && NULL == getenv("LL_BAD_FMODEX_DRIVER") #endif // !LL_WINDOWS ) { - gAudiop = (LLAudioEngine *) new LLAudioEngine_OpenAL(); + gAudiop = (LLAudioEngine *) new LLAudioEngine_FMODEX(gSavedSettings.getBOOL("FMODExProfilerEnable")); } #endif -#ifdef LL_FMOD +#ifdef LL_OPENAL if (!gAudiop #if !LL_WINDOWS - && NULL == getenv("LL_BAD_FMOD_DRIVER") + && NULL == getenv("LL_BAD_OPENAL_DRIVER") #endif // !LL_WINDOWS ) { - gAudiop = (LLAudioEngine *) new LLAudioEngine_FMOD(); + gAudiop = (LLAudioEngine *) new LLAudioEngine_OpenAL(); } #endif if (gAudiop) { #if LL_WINDOWS - // FMOD on Windows needs the window handle to stop playing audio + // FMOD Ex on Windows needs the window handle to stop playing audio // when window is minimized. JC void* window_handle = (HWND)gViewerWindow->getPlatformWindow(); #else @@ -744,8 +742,6 @@ bool idle_startup() gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW); - timeout_count = 0; - // Login screen needs menus for preferences, but we can enter // this startup phase more than once. if (gLoginMenuBarView == NULL) @@ -772,10 +768,6 @@ bool idle_startup() gUserCredential = gLoginHandler.initializeLoginInfo(); display_startup(); } - if (gHeadlessClient) - { - LL_WARNS("AppInit") << "Waiting at connection box in headless client. Did you mean to add autologin params?" << LL_ENDL; - } // Make sure the process dialog doesn't hide things display_startup(); gViewerWindow->setShowProgress(FALSE); @@ -993,15 +985,12 @@ bool idle_startup() { case LLSLURL::LOCATION: agent_location_id = START_LOCATION_ID_URL; - location_which = START_LOCATION_ID_LAST; break; case LLSLURL::LAST_LOCATION: agent_location_id = START_LOCATION_ID_LAST; - location_which = START_LOCATION_ID_LAST; break; default: agent_location_id = START_LOCATION_ID_HOME; - location_which = START_LOCATION_ID_HOME; break; } @@ -1254,6 +1243,9 @@ bool idle_startup() LLPostProcess::initClass(); display_startup(); + LLAvatarAppearance::initClass(); + display_startup(); + LLViewerObject::initVOClasses(); display_startup(); @@ -2588,12 +2580,17 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name, } else { + // FIXME SH-3860 - this creates a race condition, where COF + // changes (base outfit link added) after appearance update + // request has been submitted. sWearablesLoadedCon = gAgentWearables.addLoadedCallback(LLStartUp::saveInitialOutfit); bool do_copy = true; bool do_append = false; LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id); - LLAppearanceMgr::instance().wearInventoryCategory(cat, do_copy, do_append); + // Need to fetch cof contents before we can wear. + callAfterCategoryFetch(LLAppearanceMgr::instance().getCOF(), + boost::bind(&LLAppearanceMgr::wearInventoryCategory, LLAppearanceMgr::getInstance(), cat, do_copy, do_append)); lldebugs << "initial outfit category id: " << cat_id << llendl; } @@ -3455,6 +3452,14 @@ bool process_login_success_response() } + // set the location of the Agent Appearance service, from which we can request + // avatar baked textures if they are supported by the current region + std::string agent_appearance_url = response["agent_appearance_service"]; + if (!agent_appearance_url.empty()) + { + LLAppearanceMgr::instance().setAppearanceServiceURL(agent_appearance_url); + } + // Set the location of the snapshot sharing config endpoint std::string snapshot_config_url = response["snapshot_config_url"]; if(!snapshot_config_url.empty()) @@ -3499,13 +3504,6 @@ bool process_login_success_response() void transition_back_to_login_panel(const std::string& emsg) { - if (gHeadlessClient && gSavedSettings.getBOOL("AutoLogin")) - { - LL_WARNS("AppInit") << "Failed to login!" << LL_ENDL; - LL_WARNS("AppInit") << emsg << LL_ENDL; - exit(0); - } - // Bounce back to the login screen. reset_login(); // calls LLStartUp::setStartupState( STATE_LOGIN_SHOW ); gSavedSettings.setBOOL("AutoLogin", FALSE); diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp index ec11a23eb8..93c7f54101 100644 --- a/indra/newview/llsurface.cpp +++ b/indra/newview/llsurface.cpp @@ -1246,8 +1246,6 @@ BOOL LLSurface::generateWaterTexture(const F32 x, const F32 y, y_end = tex_width; } - LLVector3d origin_global = from_region_handle(getRegion()->getHandle()); - // OK, for now, just have the composition value equal the height at the point. LLVector3 location; LLColor4U coloru; diff --git a/indra/newview/lltexglobalcolor.cpp b/indra/newview/lltexglobalcolor.cpp deleted file mode 100644 index ebe5ccd6c0..0000000000 --- a/indra/newview/lltexglobalcolor.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/** - * @file lltexlayerglobalcolor.cpp - * @brief Color for texture layers. - * - * $LicenseInfo:firstyear=2008&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$ - */ - -#include "llviewerprecompiledheaders.h" -#include "llagent.h" -#include "lltexlayer.h" -#include "llvoavatar.h" -#include "llwearable.h" -#include "lltexglobalcolor.h" - -//----------------------------------------------------------------------------- -// LLTexGlobalColor -//----------------------------------------------------------------------------- - -LLTexGlobalColor::LLTexGlobalColor(LLVOAvatar* avatar) - : - mAvatar(avatar), - mInfo(NULL) -{ -} - -LLTexGlobalColor::~LLTexGlobalColor() -{ - // mParamColorList are LLViewerVisualParam's and get deleted with ~LLCharacter() - //std::for_each(mParamColorList.begin(), mParamColorList.end(), DeletePointer()); -} - -BOOL LLTexGlobalColor::setInfo(LLTexGlobalColorInfo *info) -{ - llassert(mInfo == NULL); - mInfo = info; - //mID = info->mID; // No ID - - mParamGlobalColorList.reserve(mInfo->mParamColorInfoList.size()); - for (param_color_info_list_t::iterator iter = mInfo->mParamColorInfoList.begin(); - iter != mInfo->mParamColorInfoList.end(); - iter++) - { - LLTexParamGlobalColor* param_color = new LLTexParamGlobalColor(this); - if (!param_color->setInfo(*iter, TRUE)) - { - mInfo = NULL; - return FALSE; - } - mParamGlobalColorList.push_back(param_color); - } - - return TRUE; -} - -LLColor4 LLTexGlobalColor::getColor() const -{ - // Sum of color params - if (mParamGlobalColorList.empty()) - return LLColor4(1.f, 1.f, 1.f, 1.f); - - LLColor4 net_color(0.f, 0.f, 0.f, 0.f); - LLTexLayer::calculateTexLayerColor(mParamGlobalColorList, net_color); - return net_color; -} - -const std::string& LLTexGlobalColor::getName() const -{ - return mInfo->mName; -} - -//----------------------------------------------------------------------------- -// LLTexParamGlobalColor -//----------------------------------------------------------------------------- -LLTexParamGlobalColor::LLTexParamGlobalColor(LLTexGlobalColor* tex_global_color) : - LLTexLayerParamColor(tex_global_color->getAvatar()), - mTexGlobalColor(tex_global_color) -{ -} - -/*virtual*/ LLViewerVisualParam* LLTexParamGlobalColor::cloneParam(LLWearable* wearable) const -{ - LLTexParamGlobalColor *new_param = new LLTexParamGlobalColor(mTexGlobalColor); - *new_param = *this; - return new_param; -} - -void LLTexParamGlobalColor::onGlobalColorChanged(bool upload_bake) -{ - mAvatar->onGlobalColorChanged(mTexGlobalColor, upload_bake); -} - -//----------------------------------------------------------------------------- -// LLTexGlobalColorInfo -//----------------------------------------------------------------------------- - -LLTexGlobalColorInfo::LLTexGlobalColorInfo() -{ -} - - -LLTexGlobalColorInfo::~LLTexGlobalColorInfo() -{ - for_each(mParamColorInfoList.begin(), mParamColorInfoList.end(), DeletePointer()); -} - -BOOL LLTexGlobalColorInfo::parseXml(LLXmlTreeNode* node) -{ - // name attribute - static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); - if (!node->getFastAttributeString(name_string, mName)) - { - llwarns << "<global_color> element is missing name attribute." << llendl; - return FALSE; - } - // <param> sub-element - for (LLXmlTreeNode* child = node->getChildByName("param"); - child; - child = node->getNextNamedChild()) - { - if (child->getChildByName("param_color")) - { - // <param><param_color/></param> - LLTexLayerParamColorInfo* info = new LLTexLayerParamColorInfo(); - if (!info->parseXml(child)) - { - delete info; - return FALSE; - } - mParamColorInfoList.push_back(info); - } - } - return TRUE; -} diff --git a/indra/newview/lltexglobalcolor.h b/indra/newview/lltexglobalcolor.h deleted file mode 100644 index ae04798445..0000000000 --- a/indra/newview/lltexglobalcolor.h +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @file lltexglobalcolor.h - * @brief This is global texture color info used by llvoavatar. - * - * $LicenseInfo:firstyear=2008&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$ - */ - -#ifndef LL_LLTEXGLOBALCOLOR_H -#define LL_LLTEXGLOBALCOLOR_H - -#include "lltexlayer.h" -#include "lltexlayerparams.h" - -class LLVOAvatar; -class LLWearable; -class LLTexGlobalColorInfo; - -class LLTexGlobalColor -{ -public: - LLTexGlobalColor( LLVOAvatar* avatar ); - ~LLTexGlobalColor(); - - LLTexGlobalColorInfo* getInfo() const { return mInfo; } - // This sets mInfo and calls initialization functions - BOOL setInfo(LLTexGlobalColorInfo *info); - - LLVOAvatar* getAvatar() const { return mAvatar; } - LLColor4 getColor() const; - const std::string& getName() const; - -private: - param_color_list_t mParamGlobalColorList; - LLVOAvatar* mAvatar; // just backlink, don't LLPointer - LLTexGlobalColorInfo *mInfo; -}; - -// Used by llvoavatar to determine skin/eye/hair color. -class LLTexGlobalColorInfo -{ - friend class LLTexGlobalColor; -public: - LLTexGlobalColorInfo(); - ~LLTexGlobalColorInfo(); - - BOOL parseXml(LLXmlTreeNode* node); - -private: - param_color_info_list_t mParamColorInfoList; - std::string mName; -}; - -class LLTexParamGlobalColor : public LLTexLayerParamColor -{ -public: - LLTexParamGlobalColor(LLTexGlobalColor *tex_color); - /*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const; -protected: - /*virtual*/ void onGlobalColorChanged(bool upload_bake); -private: - LLTexGlobalColor* mTexGlobalColor; -}; - -#endif diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp deleted file mode 100644 index ad09af6594..0000000000 --- a/indra/newview/lltexlayer.cpp +++ /dev/null @@ -1,2514 +0,0 @@ -/** - * @file lltexlayer.cpp - * @brief A texture layer. Used for avatars. - * - * $LicenseInfo:firstyear=2002&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$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "lltexlayer.h" - -#include "llagent.h" -#include "llimagej2c.h" -#include "llimagetga.h" -#include "llnotificationsutil.h" -#include "llvfile.h" -#include "llvfs.h" -#include "llviewerstats.h" -#include "llviewerregion.h" -#include "llvoavatar.h" -#include "llvoavatarself.h" -#include "pipeline.h" -#include "llassetuploadresponders.h" -#include "lltexlayerparams.h" -#include "llui.h" -#include "llagentwearables.h" -#include "llwearable.h" -#include "llviewercontrol.h" -#include "llviewershadermgr.h" -#include "llviewervisualparam.h" - -//#include "../tools/imdebug/imdebug.h" - -using namespace LLVOAvatarDefines; - -static const S32 BAKE_UPLOAD_ATTEMPTS = 7; -static const F32 BAKE_UPLOAD_RETRY_DELAY = 2.f; // actual delay grows by power of 2 each attempt - -// runway consolidate -extern std::string self_av_string(); - -class LLTexLayerInfo -{ - friend class LLTexLayer; - friend class LLTexLayerTemplate; - friend class LLTexLayerInterface; -public: - LLTexLayerInfo(); - ~LLTexLayerInfo(); - - BOOL parseXml(LLXmlTreeNode* node); - BOOL createVisualParams(LLVOAvatar *avatar); - BOOL isUserSettable() { return mLocalTexture != -1; } - S32 getLocalTexture() const { return mLocalTexture; } - BOOL getOnlyAlpha() const { return mUseLocalTextureAlphaOnly; } - std::string getName() const { return mName; } - -private: - std::string mName; - - BOOL mWriteAllChannels; // Don't use masking. Just write RGBA into buffer, - LLTexLayerInterface::ERenderPass mRenderPass; - - std::string mGlobalColor; - LLColor4 mFixedColor; - - S32 mLocalTexture; - std::string mStaticImageFileName; - BOOL mStaticImageIsMask; - BOOL mUseLocalTextureAlphaOnly; // Ignore RGB channels from the input texture. Use alpha as a mask - BOOL mIsVisibilityMask; - - typedef std::vector< std::pair< std::string,BOOL > > morph_name_list_t; - morph_name_list_t mMorphNameList; - param_color_info_list_t mParamColorInfoList; - param_alpha_info_list_t mParamAlphaInfoList; -}; - -//----------------------------------------------------------------------------- -// LLBakedUploadData() -//----------------------------------------------------------------------------- -LLBakedUploadData::LLBakedUploadData(const LLVOAvatarSelf* avatar, - LLTexLayerSet* layerset, - const LLUUID& id, - bool highest_res) : - mAvatar(avatar), - mTexLayerSet(layerset), - mID(id), - mStartTime(LLFrameTimer::getTotalTime()), // Record starting time - mIsHighestRes(highest_res) -{ -} - -//----------------------------------------------------------------------------- -// LLTexLayerSetBuffer -// The composite image that a LLTexLayerSet writes to. Each LLTexLayerSet has one. -//----------------------------------------------------------------------------- - -// static -S32 LLTexLayerSetBuffer::sGLByteCount = 0; - -LLTexLayerSetBuffer::LLTexLayerSetBuffer(LLTexLayerSet* const owner, - S32 width, S32 height) : - // ORDER_LAST => must render these after the hints are created. - LLViewerDynamicTexture( width, height, 4, LLViewerDynamicTexture::ORDER_LAST, TRUE ), - mUploadPending(FALSE), // Not used for any logic here, just to sync sending of updates - mNeedsUpload(FALSE), - mNumLowresUploads(0), - mUploadFailCount(0), - mNeedsUpdate(TRUE), - mNumLowresUpdates(0), - mTexLayerSet(owner) -{ - LLTexLayerSetBuffer::sGLByteCount += getSize(); - mNeedsUploadTimer.start(); - mNeedsUpdateTimer.start(); -} - -LLTexLayerSetBuffer::~LLTexLayerSetBuffer() -{ - LLTexLayerSetBuffer::sGLByteCount -= getSize(); - destroyGLTexture(); - for( S32 order = 0; order < ORDER_COUNT; order++ ) - { - LLViewerDynamicTexture::sInstances[order].erase(this); // will fail in all but one case. - } -} - -//virtual -S8 LLTexLayerSetBuffer::getType() const -{ - return LLViewerDynamicTexture::LL_TEX_LAYER_SET_BUFFER ; -} - -//virtual -void LLTexLayerSetBuffer::restoreGLTexture() -{ - LLViewerDynamicTexture::restoreGLTexture() ; -} - -//virtual -void LLTexLayerSetBuffer::destroyGLTexture() -{ - LLViewerDynamicTexture::destroyGLTexture() ; -} - -// static -void LLTexLayerSetBuffer::dumpTotalByteCount() -{ - llinfos << "Composite System GL Buffers: " << (LLTexLayerSetBuffer::sGLByteCount/1024) << "KB" << llendl; -} - -void LLTexLayerSetBuffer::requestUpdate() -{ - restartUpdateTimer(); - mNeedsUpdate = TRUE; - mNumLowresUpdates = 0; - // If we're in the middle of uploading a baked texture, we don't care about it any more. - // When it's downloaded, ignore it. - mUploadID.setNull(); -} - -void LLTexLayerSetBuffer::requestUpload() -{ - conditionalRestartUploadTimer(); - mNeedsUpload = TRUE; - mNumLowresUploads = 0; - mUploadPending = TRUE; -} - -void LLTexLayerSetBuffer::conditionalRestartUploadTimer() -{ - // If we requested a new upload but haven't even uploaded - // a low res version of our last upload request, then - // keep the timer ticking instead of resetting it. - if (mNeedsUpload && (mNumLowresUploads == 0)) - { - mNeedsUploadTimer.unpause(); - } - else - { - mNeedsUploadTimer.reset(); - mNeedsUploadTimer.start(); - } -} - -void LLTexLayerSetBuffer::restartUpdateTimer() -{ - mNeedsUpdateTimer.reset(); - mNeedsUpdateTimer.start(); -} - -void LLTexLayerSetBuffer::cancelUpload() -{ - mNeedsUpload = FALSE; - mUploadPending = FALSE; - mNeedsUploadTimer.pause(); - mUploadRetryTimer.reset(); -} - -void LLTexLayerSetBuffer::pushProjection() const -{ - gGL.matrixMode(LLRender::MM_PROJECTION); - gGL.pushMatrix(); - gGL.loadIdentity(); - gGL.ortho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f); - - gGL.matrixMode(LLRender::MM_MODELVIEW); - gGL.pushMatrix(); - gGL.loadIdentity(); -} - -void LLTexLayerSetBuffer::popProjection() const -{ - gGL.matrixMode(LLRender::MM_PROJECTION); - gGL.popMatrix(); - - gGL.matrixMode(LLRender::MM_MODELVIEW); - gGL.popMatrix(); -} - -BOOL LLTexLayerSetBuffer::needsRender() -{ - llassert(mTexLayerSet->getAvatar() == gAgentAvatarp); - if (!isAgentAvatarValid()) return FALSE; - - const BOOL upload_now = mNeedsUpload && isReadyToUpload(); - const BOOL update_now = mNeedsUpdate && isReadyToUpdate(); - - // Don't render if we don't want to (or aren't ready to) upload or update. - if (!(update_now || upload_now)) - { - return FALSE; - } - - // Don't render if we're animating our appearance. - if (gAgentAvatarp->getIsAppearanceAnimating()) - { - return FALSE; - } - - // Don't render if we are trying to create a shirt texture but aren't wearing a skirt. - if (gAgentAvatarp->getBakedTE(mTexLayerSet) == LLVOAvatarDefines::TEX_SKIRT_BAKED && - !gAgentAvatarp->isWearingWearableType(LLWearableType::WT_SKIRT)) - { - cancelUpload(); - return FALSE; - } - - // Render if we have at least minimal level of detail for each local texture. - return mTexLayerSet->isLocalTextureDataAvailable(); -} - -void LLTexLayerSetBuffer::preRender(BOOL clear_depth) -{ - // Set up an ortho projection - pushProjection(); - - // keep depth buffer, we don't need to clear it - LLViewerDynamicTexture::preRender(FALSE); -} - -void LLTexLayerSetBuffer::postRender(BOOL success) -{ - popProjection(); - - LLViewerDynamicTexture::postRender(success); -} - -BOOL LLTexLayerSetBuffer::render() -{ - // Default color mask for tex layer render - gGL.setColorMask(true, true); - - // do we need to upload, and do we have sufficient data to create an uploadable composite? - // TODO: When do we upload the texture if gAgent.mNumPendingQueries is non-zero? - const BOOL upload_now = mNeedsUpload && isReadyToUpload(); - const BOOL update_now = mNeedsUpdate && isReadyToUpdate(); - - BOOL success = TRUE; - - bool use_shaders = LLGLSLShader::sNoFixedFunction; - - if (use_shaders) - { - gAlphaMaskProgram.bind(); - gAlphaMaskProgram.setMinimumAlpha(0.004f); - } - - LLVertexBuffer::unbind(); - - // Composite the color data - LLGLSUIDefault gls_ui; - success &= mTexLayerSet->render( mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight ); - gGL.flush(); - - if(upload_now) - { - if (!success) - { - llinfos << "Failed attempt to bake " << mTexLayerSet->getBodyRegionName() << llendl; - mUploadPending = FALSE; - } - else - { - if (mTexLayerSet->isVisible()) - { - mTexLayerSet->getAvatar()->debugBakedTextureUpload(mTexLayerSet->getBakedTexIndex(), FALSE); // FALSE for start of upload, TRUE for finish. - doUpload(); - } - else - { - mUploadPending = FALSE; - mNeedsUpload = FALSE; - mNeedsUploadTimer.pause(); - mTexLayerSet->getAvatar()->setNewBakedTexture(mTexLayerSet->getBakedTexIndex(),IMG_INVISIBLE); - } - } - } - - if (update_now) - { - doUpdate(); - } - - if (use_shaders) - { - gAlphaMaskProgram.unbind(); - } - - LLVertexBuffer::unbind(); - - // reset GL state - gGL.setColorMask(true, true); - gGL.setSceneBlendType(LLRender::BT_ALPHA); - - // we have valid texture data now - mGLTexturep->setGLTextureCreated(true); - - return success; -} - -BOOL LLTexLayerSetBuffer::isInitialized(void) const -{ - return mGLTexturep.notNull() && mGLTexturep->isGLTextureCreated(); -} - -BOOL LLTexLayerSetBuffer::uploadPending() const -{ - return mUploadPending; -} - -BOOL LLTexLayerSetBuffer::uploadNeeded() const -{ - return mNeedsUpload; -} - -BOOL LLTexLayerSetBuffer::uploadInProgress() const -{ - return !mUploadID.isNull(); -} - -BOOL LLTexLayerSetBuffer::isReadyToUpload() const -{ - if (!gAgentQueryManager.hasNoPendingQueries()) return FALSE; // Can't upload if there are pending queries. - if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures()) return FALSE; // Don't upload if avatar is using composites. - - BOOL ready = FALSE; - if (mTexLayerSet->isLocalTextureDataFinal()) - { - // If we requested an upload and have the final LOD ready, upload (or wait a while if this is a retry) - if (mUploadFailCount == 0) - { - ready = TRUE; - } - else - { - ready = mUploadRetryTimer.getElapsedTimeF32() >= BAKE_UPLOAD_RETRY_DELAY * (1 << (mUploadFailCount - 1)); - } - } - else - { - // Upload if we've hit a timeout. Upload is a pretty expensive process so we need to make sure - // we aren't doing uploads too frequently. - const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureUploadTimeout"); - if (texture_timeout != 0) - { - // The timeout period increases exponentially between every lowres upload in order to prevent - // spamming the server with frequent uploads. - const U32 texture_timeout_threshold = texture_timeout*(1 << mNumLowresUploads); - - // If we hit our timeout and have textures available at even lower resolution, then upload. - const BOOL is_upload_textures_timeout = mNeedsUploadTimer.getElapsedTimeF32() >= texture_timeout_threshold; - const BOOL has_lower_lod = mTexLayerSet->isLocalTextureDataAvailable(); - ready = has_lower_lod && is_upload_textures_timeout; - } - } - - return ready; -} - -BOOL LLTexLayerSetBuffer::isReadyToUpdate() const -{ - // If we requested an update and have the final LOD ready, then update. - if (mTexLayerSet->isLocalTextureDataFinal()) return TRUE; - - // If we haven't done an update yet, then just do one now regardless of state of textures. - if (mNumLowresUpdates == 0) return TRUE; - - // Update if we've hit a timeout. Unlike for uploads, we can make this timeout fairly small - // since render unnecessarily doesn't cost much. - const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedLocalTextureUpdateTimeout"); - if (texture_timeout != 0) - { - // If we hit our timeout and have textures available at even lower resolution, then update. - const BOOL is_update_textures_timeout = mNeedsUpdateTimer.getElapsedTimeF32() >= texture_timeout; - const BOOL has_lower_lod = mTexLayerSet->isLocalTextureDataAvailable(); - if (has_lower_lod && is_update_textures_timeout) return TRUE; - } - - return FALSE; -} - -BOOL LLTexLayerSetBuffer::requestUpdateImmediate() -{ - mNeedsUpdate = TRUE; - BOOL result = FALSE; - - if (needsRender()) - { - preRender(FALSE); - result = render(); - postRender(result); - } - - return result; -} - -// Create the baked texture, send it out to the server, then wait for it to come -// back so we can switch to using it. -void LLTexLayerSetBuffer::doUpload() -{ - llinfos << "Uploading baked " << mTexLayerSet->getBodyRegionName() << llendl; - LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_BAKES); - - // Don't need caches since we're baked now. (note: we won't *really* be baked - // until this image is sent to the server and the Avatar Appearance message is received.) - mTexLayerSet->deleteCaches(); - - // Get the COLOR information from our texture - U8* baked_color_data = new U8[ mFullWidth * mFullHeight * 4 ]; - glReadPixels(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, GL_RGBA, GL_UNSIGNED_BYTE, baked_color_data ); - stop_glerror(); - - // Get the MASK information from our texture - LLGLSUIDefault gls_ui; - LLPointer<LLImageRaw> baked_mask_image = new LLImageRaw(mFullWidth, mFullHeight, 1 ); - U8* baked_mask_data = baked_mask_image->getData(); - mTexLayerSet->gatherMorphMaskAlpha(baked_mask_data, mFullWidth, mFullHeight); - - - // Create the baked image from our color and mask information - const S32 baked_image_components = 5; // red green blue [bump] clothing - LLPointer<LLImageRaw> baked_image = new LLImageRaw( mFullWidth, mFullHeight, baked_image_components ); - U8* baked_image_data = baked_image->getData(); - S32 i = 0; - for (S32 u=0; u < mFullWidth; u++) - { - for (S32 v=0; v < mFullHeight; v++) - { - baked_image_data[5*i + 0] = baked_color_data[4*i + 0]; - baked_image_data[5*i + 1] = baked_color_data[4*i + 1]; - baked_image_data[5*i + 2] = baked_color_data[4*i + 2]; - baked_image_data[5*i + 3] = baked_color_data[4*i + 3]; // alpha should be correct for eyelashes. - baked_image_data[5*i + 4] = baked_mask_data[i]; - i++; - } - } - - LLPointer<LLImageJ2C> compressedImage = new LLImageJ2C; - const char* comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // writes into baked_color_data. 5 channels (rgb, heightfield/alpha, mask) - if (compressedImage->encode(baked_image, comment_text)) - { - LLTransactionID tid; - tid.generate(); - const LLAssetID asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); - if (LLVFile::writeFile(compressedImage->getData(), compressedImage->getDataSize(), - gVFS, asset_id, LLAssetType::AT_TEXTURE)) - { - // Read back the file and validate. - BOOL valid = FALSE; - LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C; - S32 file_size = 0; - - //data buffer MUST be allocated using LLImageBase - LLVFile file(gVFS, asset_id, LLAssetType::AT_TEXTURE); - file_size = file.getSize(); - U8* data = integrity_test->allocateData(file_size); - file.read(data, file_size); - - if (data) - { - valid = integrity_test->validate(data, file_size); // integrity_test will delete 'data' - } - else - { - integrity_test->setLastError("Unable to read entire file"); - } - - if (valid) - { - const bool highest_lod = mTexLayerSet->isLocalTextureDataFinal(); - // Baked_upload_data is owned by the responder and deleted after the request completes. - LLBakedUploadData* baked_upload_data = new LLBakedUploadData(gAgentAvatarp, - this->mTexLayerSet, - asset_id, - highest_lod); - // upload ID is used to avoid overlaps, e.g. when the user rapidly makes two changes outside of Face Edit. - mUploadID = asset_id; - - // Upload the image - const std::string url = gAgent.getRegion()->getCapability("UploadBakedTexture"); - if(!url.empty() - && !LLPipeline::sForceOldBakedUpload // toggle debug setting UploadBakedTexOld to change between the new caps method and old method - && (mUploadFailCount < (BAKE_UPLOAD_ATTEMPTS - 1))) // Try last ditch attempt via asset store if cap upload is failing. - { - LLSD body = LLSD::emptyMap(); - // The responder will call LLTexLayerSetBuffer::onTextureUploadComplete() - LLHTTPClient::post(url, body, new LLSendTexLayerResponder(body, mUploadID, LLAssetType::AT_TEXTURE, baked_upload_data)); - llinfos << "Baked texture upload via capability of " << mUploadID << " to " << url << llendl; - } - else - { - gAssetStorage->storeAssetData(tid, - LLAssetType::AT_TEXTURE, - LLTexLayerSetBuffer::onTextureUploadComplete, - baked_upload_data, - TRUE, // temp_file - TRUE, // is_priority - TRUE); // store_local - llinfos << "Baked texture upload via Asset Store." << llendl; - } - - if (highest_lod) - { - // Sending the final LOD for the baked texture. All done, pause - // the upload timer so we know how long it took. - mNeedsUpload = FALSE; - mNeedsUploadTimer.pause(); - } - else - { - // Sending a lower level LOD for the baked texture. Restart the upload timer. - mNumLowresUploads++; - mNeedsUploadTimer.unpause(); - mNeedsUploadTimer.reset(); - } - - // Print out notification that we uploaded this texture. - if (gSavedSettings.getBOOL("DebugAvatarRezTime")) - { - const std::string lod_str = highest_lod ? "HighRes" : "LowRes"; - LLSD args; - args["EXISTENCE"] = llformat("%d",(U32)mTexLayerSet->getAvatar()->debugGetExistenceTimeElapsedF32()); - args["TIME"] = llformat("%d",(U32)mNeedsUploadTimer.getElapsedTimeF32()); - args["BODYREGION"] = mTexLayerSet->getBodyRegionName(); - args["RESOLUTION"] = lod_str; - LLNotificationsUtil::add("AvatarRezSelfBakedTextureUploadNotification",args); - LL_DEBUGS("Avatar") << self_av_string() << "Uploading [ name: " << mTexLayerSet->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUploadTimer.getElapsedTimeF32() << " ]" << LL_ENDL; - } - } - else - { - // The read back and validate operation failed. Remove the uploaded file. - mUploadPending = FALSE; - LLVFile file(gVFS, asset_id, LLAssetType::AT_TEXTURE, LLVFile::WRITE); - file.remove(); - llinfos << "Unable to create baked upload file (reason: corrupted)." << llendl; - } - } - } - else - { - // The VFS write file operation failed. - mUploadPending = FALSE; - llinfos << "Unable to create baked upload file (reason: failed to write file)" << llendl; - } - - delete [] baked_color_data; -} - -// Mostly bookkeeping; don't need to actually "do" anything since -// render() will actually do the update. -void LLTexLayerSetBuffer::doUpdate() -{ - const BOOL highest_lod = mTexLayerSet->isLocalTextureDataFinal(); - if (highest_lod) - { - mNeedsUpdate = FALSE; - } - else - { - mNumLowresUpdates++; - } - - restartUpdateTimer(); - - // need to swtich to using this layerset if this is the first update - // after getting the lowest LOD - mTexLayerSet->getAvatar()->updateMeshTextures(); - - // Print out notification that we uploaded this texture. - if (gSavedSettings.getBOOL("DebugAvatarRezTime")) - { - const BOOL highest_lod = mTexLayerSet->isLocalTextureDataFinal(); - const std::string lod_str = highest_lod ? "HighRes" : "LowRes"; - LLSD args; - args["EXISTENCE"] = llformat("%d",(U32)mTexLayerSet->getAvatar()->debugGetExistenceTimeElapsedF32()); - args["TIME"] = llformat("%d",(U32)mNeedsUpdateTimer.getElapsedTimeF32()); - args["BODYREGION"] = mTexLayerSet->getBodyRegionName(); - args["RESOLUTION"] = lod_str; - LLNotificationsUtil::add("AvatarRezSelfBakedTextureUpdateNotification",args); - LL_DEBUGS("Avatar") << self_av_string() << "Locally updating [ name: " << mTexLayerSet->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUpdateTimer.getElapsedTimeF32() << " ]" << LL_ENDL; - } -} - -// static -void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, - void* userdata, - S32 result, - LLExtStat ext_status) // StoreAssetData callback (not fixed) -{ - LLBakedUploadData* baked_upload_data = (LLBakedUploadData*)userdata; - - if (isAgentAvatarValid() && - !gAgentAvatarp->isDead() && - (baked_upload_data->mAvatar == gAgentAvatarp) && // Sanity check: only the user's avatar should be uploading textures. - (baked_upload_data->mTexLayerSet->hasComposite())) - { - LLTexLayerSetBuffer* layerset_buffer = baked_upload_data->mTexLayerSet->getComposite(); - S32 failures = layerset_buffer->mUploadFailCount; - layerset_buffer->mUploadFailCount = 0; - - if (layerset_buffer->mUploadID.isNull()) - { - // The upload got canceled, we should be in the - // process of baking a new texture so request an - // upload with the new data - - // BAP: does this really belong in this callback, as - // opposed to where the cancellation takes place? - // suspect this does nothing. - layerset_buffer->requestUpload(); - } - else if (baked_upload_data->mID == layerset_buffer->mUploadID) - { - // This is the upload we're currently waiting for. - layerset_buffer->mUploadID.setNull(); - const std::string name(baked_upload_data->mTexLayerSet->getBodyRegionName()); - const std::string resolution = baked_upload_data->mIsHighestRes ? " full res " : " low res "; - if (result >= 0) - { - layerset_buffer->mUploadPending = FALSE; // Allows sending of AgentSetAppearance later - LLVOAvatarDefines::ETextureIndex baked_te = gAgentAvatarp->getBakedTE(layerset_buffer->mTexLayerSet); - // Update baked texture info with the new UUID - U64 now = LLFrameTimer::getTotalTime(); // Record starting time - llinfos << "Baked" << resolution << "texture upload for " << name << " took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl; - gAgentAvatarp->setNewBakedTexture(baked_te, uuid); - } - else - { - ++failures; - S32 max_attempts = baked_upload_data->mIsHighestRes ? BAKE_UPLOAD_ATTEMPTS : 1; // only retry final bakes - llwarns << "Baked" << resolution << "texture upload for " << name << " failed (attempt " << failures << "/" << max_attempts << ")" << llendl; - if (failures < max_attempts) - { - layerset_buffer->mUploadFailCount = failures; - layerset_buffer->mUploadRetryTimer.start(); - layerset_buffer->requestUpload(); - } - } - } - else - { - llinfos << "Received baked texture out of date, ignored." << llendl; - } - - gAgentAvatarp->dirtyMesh(); - } - else - { - // Baked texture failed to upload (in which case since we - // didn't set the new baked texture, it means that they'll try - // and rebake it at some point in the future (after login?)), - // or this response to upload is out of date, in which case a - // current response should be on the way or already processed. - llwarns << "Baked upload failed" << llendl; - } - - delete baked_upload_data; -} - -//----------------------------------------------------------------------------- -// LLTexLayerSet -// An ordered set of texture layers that get composited into a single texture. -//----------------------------------------------------------------------------- - -LLTexLayerSetInfo::LLTexLayerSetInfo() : - mBodyRegion( "" ), - mWidth( 512 ), - mHeight( 512 ), - mClearAlpha( TRUE ) -{ -} - -LLTexLayerSetInfo::~LLTexLayerSetInfo( ) -{ - std::for_each(mLayerInfoList.begin(), mLayerInfoList.end(), DeletePointer()); -} - -BOOL LLTexLayerSetInfo::parseXml(LLXmlTreeNode* node) -{ - llassert( node->hasName( "layer_set" ) ); - if( !node->hasName( "layer_set" ) ) - { - return FALSE; - } - - // body_region - static LLStdStringHandle body_region_string = LLXmlTree::addAttributeString("body_region"); - if( !node->getFastAttributeString( body_region_string, mBodyRegion ) ) - { - llwarns << "<layer_set> is missing body_region attribute" << llendl; - return FALSE; - } - - // width, height - static LLStdStringHandle width_string = LLXmlTree::addAttributeString("width"); - if( !node->getFastAttributeS32( width_string, mWidth ) ) - { - return FALSE; - } - - static LLStdStringHandle height_string = LLXmlTree::addAttributeString("height"); - if( !node->getFastAttributeS32( height_string, mHeight ) ) - { - return FALSE; - } - - // Optional alpha component to apply after all compositing is complete. - static LLStdStringHandle alpha_tga_file_string = LLXmlTree::addAttributeString("alpha_tga_file"); - node->getFastAttributeString( alpha_tga_file_string, mStaticAlphaFileName ); - - static LLStdStringHandle clear_alpha_string = LLXmlTree::addAttributeString("clear_alpha"); - node->getFastAttributeBOOL( clear_alpha_string, mClearAlpha ); - - // <layer> - for (LLXmlTreeNode* child = node->getChildByName( "layer" ); - child; - child = node->getNextNamedChild()) - { - LLTexLayerInfo* info = new LLTexLayerInfo(); - if( !info->parseXml( child )) - { - delete info; - return FALSE; - } - mLayerInfoList.push_back( info ); - } - return TRUE; -} - -// creates visual params without generating layersets or layers -void LLTexLayerSetInfo::createVisualParams(LLVOAvatar *avatar) -{ - //layer_info_list_t mLayerInfoList; - for (layer_info_list_t::iterator layer_iter = mLayerInfoList.begin(); - layer_iter != mLayerInfoList.end(); - layer_iter++) - { - LLTexLayerInfo *layer_info = *layer_iter; - layer_info->createVisualParams(avatar); - } -} - -//----------------------------------------------------------------------------- -// LLTexLayerSet -// An ordered set of texture layers that get composited into a single texture. -//----------------------------------------------------------------------------- - -BOOL LLTexLayerSet::sHasCaches = FALSE; - -LLTexLayerSet::LLTexLayerSet(LLVOAvatarSelf* const avatar) : - mComposite( NULL ), - mAvatar( avatar ), - mUpdatesEnabled( FALSE ), - mIsVisible( TRUE ), - mBakedTexIndex(LLVOAvatarDefines::BAKED_HEAD), - mInfo( NULL ) -{ -} - -LLTexLayerSet::~LLTexLayerSet() -{ - deleteCaches(); - std::for_each(mLayerList.begin(), mLayerList.end(), DeletePointer()); - std::for_each(mMaskLayerList.begin(), mMaskLayerList.end(), DeletePointer()); -} - -//----------------------------------------------------------------------------- -// setInfo -//----------------------------------------------------------------------------- - -BOOL LLTexLayerSet::setInfo(const LLTexLayerSetInfo *info) -{ - llassert(mInfo == NULL); - mInfo = info; - //mID = info->mID; // No ID - - mLayerList.reserve(info->mLayerInfoList.size()); - for (LLTexLayerSetInfo::layer_info_list_t::const_iterator iter = info->mLayerInfoList.begin(); - iter != info->mLayerInfoList.end(); - iter++) - { - LLTexLayerInterface *layer = NULL; - if ( (*iter)->isUserSettable() ) - { - layer = new LLTexLayerTemplate( this ); - } - else - { - layer = new LLTexLayer(this); - } - // this is the first time this layer (of either type) is being created - make sure you add the parameters to the avatar - if (!layer->setInfo(*iter, NULL)) - { - mInfo = NULL; - return FALSE; - } - if (!layer->isVisibilityMask()) - { - mLayerList.push_back( layer ); - } - else - { - mMaskLayerList.push_back(layer); - } - } - - requestUpdate(); - - stop_glerror(); - - return TRUE; -} - -#if 0 // obsolete -//----------------------------------------------------------------------------- -// parseData -//----------------------------------------------------------------------------- - -BOOL LLTexLayerSet::parseData(LLXmlTreeNode* node) -{ - LLTexLayerSetInfo *info = new LLTexLayerSetInfo; - - if (!info->parseXml(node)) - { - delete info; - return FALSE; - } - if (!setInfo(info)) - { - delete info; - return FALSE; - } - return TRUE; -} -#endif - -void LLTexLayerSet::deleteCaches() -{ - for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) - { - LLTexLayerInterface* layer = *iter; - layer->deleteCaches(); - } - for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++) - { - LLTexLayerInterface* layer = *iter; - layer->deleteCaches(); - } -} - -// Returns TRUE if at least one packet of data has been received for each of the textures that this layerset depends on. -BOOL LLTexLayerSet::isLocalTextureDataAvailable() const -{ - if (!mAvatar->isSelf()) return FALSE; - return ((LLVOAvatarSelf *)mAvatar)->isLocalTextureDataAvailable(this); -} - - -// Returns TRUE if all of the data for the textures that this layerset depends on have arrived. -BOOL LLTexLayerSet::isLocalTextureDataFinal() const -{ - if (!mAvatar->isSelf()) return FALSE; - return ((LLVOAvatarSelf *)mAvatar)->isLocalTextureDataFinal(this); -} - - -BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height ) -{ - BOOL success = TRUE; - mIsVisible = TRUE; - - if (mMaskLayerList.size() > 0) - { - for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++) - { - LLTexLayerInterface* layer = *iter; - if (layer->isInvisibleAlphaMask()) - { - mIsVisible = FALSE; - } - } - } - - bool use_shaders = LLGLSLShader::sNoFixedFunction; - - LLGLSUIDefault gls_ui; - LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE); - gGL.setColorMask(true, true); - - // clear buffer area to ensure we don't pick up UI elements - { - gGL.flush(); - LLGLDisable no_alpha(GL_ALPHA_TEST); - if (use_shaders) - { - gAlphaMaskProgram.setMinimumAlpha(0.0f); - } - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.color4f( 0.f, 0.f, 0.f, 1.f ); - - gl_rect_2d_simple( width, height ); - - gGL.flush(); - if (use_shaders) - { - gAlphaMaskProgram.setMinimumAlpha(0.004f); - } - } - - if (mIsVisible) - { - // composite color layers - for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) - { - LLTexLayerInterface* layer = *iter; - if (layer->getRenderPass() == LLTexLayer::RP_COLOR) - { - gGL.flush(); - success &= layer->render(x, y, width, height); - gGL.flush(); - } - } - - renderAlphaMaskTextures(x, y, width, height, false); - - stop_glerror(); - } - else - { - gGL.flush(); - - gGL.setSceneBlendType(LLRender::BT_REPLACE); - LLGLDisable no_alpha(GL_ALPHA_TEST); - if (use_shaders) - { - gAlphaMaskProgram.setMinimumAlpha(0.f); - } - - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.color4f( 0.f, 0.f, 0.f, 0.f ); - - gl_rect_2d_simple( width, height ); - gGL.setSceneBlendType(LLRender::BT_ALPHA); - - gGL.flush(); - if (use_shaders) - { - gAlphaMaskProgram.setMinimumAlpha(0.004f); - } - } - - return success; -} - - -BOOL LLTexLayerSet::isBodyRegion(const std::string& region) const -{ - return mInfo->mBodyRegion == region; -} - -const std::string LLTexLayerSet::getBodyRegionName() const -{ - return mInfo->mBodyRegion; -} - -void LLTexLayerSet::requestUpdate() -{ - if( mUpdatesEnabled ) - { - createComposite(); - mComposite->requestUpdate(); - } -} - -void LLTexLayerSet::requestUpload() -{ - createComposite(); - mComposite->requestUpload(); -} - -void LLTexLayerSet::cancelUpload() -{ - if(mComposite) - { - mComposite->cancelUpload(); - } -} - -void LLTexLayerSet::createComposite() -{ - if(!mComposite) - { - S32 width = mInfo->mWidth; - S32 height = mInfo->mHeight; - // Composite other avatars at reduced resolution - if( !mAvatar->isSelf() ) - { - llerrs << "composites should not be created for non-self avatars!" << llendl; - } - mComposite = new LLTexLayerSetBuffer( this, width, height ); - } -} - -void LLTexLayerSet::destroyComposite() -{ - if( mComposite ) - { - mComposite = NULL; - } -} - -void LLTexLayerSet::setUpdatesEnabled( BOOL b ) -{ - mUpdatesEnabled = b; -} - - -void LLTexLayerSet::updateComposite() -{ - createComposite(); - mComposite->requestUpdateImmediate(); -} - -LLTexLayerSetBuffer* LLTexLayerSet::getComposite() -{ - if (!mComposite) - { - createComposite(); - } - return mComposite; -} - -const LLTexLayerSetBuffer* LLTexLayerSet::getComposite() const -{ - return mComposite; -} - -void LLTexLayerSet::gatherMorphMaskAlpha(U8 *data, S32 width, S32 height) -{ - memset(data, 255, width * height); - - for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) - { - LLTexLayerInterface* layer = *iter; - layer->gatherAlphaMasks(data, mComposite->getOriginX(),mComposite->getOriginY(), width, height); - } - - // Set alpha back to that of our alpha masks. - renderAlphaMaskTextures(mComposite->getOriginX(), mComposite->getOriginY(), width, height, true); -} - -void LLTexLayerSet::renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear) -{ - const LLTexLayerSetInfo *info = getInfo(); - - bool use_shaders = LLGLSLShader::sNoFixedFunction; - - gGL.setColorMask(false, true); - gGL.setSceneBlendType(LLRender::BT_REPLACE); - - // (Optionally) replace alpha with a single component image from a tga file. - if (!info->mStaticAlphaFileName.empty()) - { - gGL.flush(); - { - LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(info->mStaticAlphaFileName, TRUE); - if( tex ) - { - LLGLSUIDefault gls_ui; - gGL.getTexUnit(0)->bind(tex); - gGL.getTexUnit(0)->setTextureBlendType( LLTexUnit::TB_REPLACE ); - gl_rect_2d_simple_tex( width, height ); - } - } - gGL.flush(); - } - else if (forceClear || info->mClearAlpha || (mMaskLayerList.size() > 0)) - { - // Set the alpha channel to one (clean up after previous blending) - gGL.flush(); - LLGLDisable no_alpha(GL_ALPHA_TEST); - if (use_shaders) - { - gAlphaMaskProgram.setMinimumAlpha(0.f); - } - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.color4f( 0.f, 0.f, 0.f, 1.f ); - - gl_rect_2d_simple( width, height ); - - gGL.flush(); - if (use_shaders) - { - gAlphaMaskProgram.setMinimumAlpha(0.004f); - } - } - - // (Optional) Mask out part of the baked texture with alpha masks - // will still have an effect even if mClearAlpha is set or the alpha component was replaced - if (mMaskLayerList.size() > 0) - { - gGL.setSceneBlendType(LLRender::BT_MULT_ALPHA); - gGL.getTexUnit(0)->setTextureBlendType( LLTexUnit::TB_REPLACE ); - for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++) - { - LLTexLayerInterface* layer = *iter; - gGL.flush(); - layer->blendAlphaTexture(x,y,width, height); - gGL.flush(); - } - - } - - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - - gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); - gGL.setColorMask(true, true); - gGL.setSceneBlendType(LLRender::BT_ALPHA); -} - -void LLTexLayerSet::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components) -{ - mAvatar->applyMorphMask(tex_data, width, height, num_components, mBakedTexIndex); -} - -BOOL LLTexLayerSet::isMorphValid() const -{ - for(layer_list_t::const_iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) - { - const LLTexLayerInterface* layer = *iter; - if (layer && !layer->isMorphValid()) - { - return FALSE; - } - } - return TRUE; -} - -void LLTexLayerSet::invalidateMorphMasks() -{ - for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) - { - LLTexLayerInterface* layer = *iter; - if (layer) - { - layer->invalidateMorphMasks(); - } - } -} - - -//----------------------------------------------------------------------------- -// LLTexLayerInfo -//----------------------------------------------------------------------------- -LLTexLayerInfo::LLTexLayerInfo() : - mWriteAllChannels( FALSE ), - mRenderPass(LLTexLayer::RP_COLOR), - mFixedColor( 0.f, 0.f, 0.f, 0.f ), - mLocalTexture( -1 ), - mStaticImageIsMask( FALSE ), - mUseLocalTextureAlphaOnly(FALSE), - mIsVisibilityMask(FALSE) -{ -} - -LLTexLayerInfo::~LLTexLayerInfo( ) -{ - std::for_each(mParamColorInfoList.begin(), mParamColorInfoList.end(), DeletePointer()); - std::for_each(mParamAlphaInfoList.begin(), mParamAlphaInfoList.end(), DeletePointer()); -} - -BOOL LLTexLayerInfo::parseXml(LLXmlTreeNode* node) -{ - llassert( node->hasName( "layer" ) ); - - // name attribute - static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); - if( !node->getFastAttributeString( name_string, mName ) ) - { - return FALSE; - } - - static LLStdStringHandle write_all_channels_string = LLXmlTree::addAttributeString("write_all_channels"); - node->getFastAttributeBOOL( write_all_channels_string, mWriteAllChannels ); - - std::string render_pass_name; - static LLStdStringHandle render_pass_string = LLXmlTree::addAttributeString("render_pass"); - if( node->getFastAttributeString( render_pass_string, render_pass_name ) ) - { - if( render_pass_name == "bump" ) - { - mRenderPass = LLTexLayer::RP_BUMP; - } - } - - // Note: layers can have either a "global_color" attrib, a "fixed_color" attrib, or a <param_color> child. - // global color attribute (optional) - static LLStdStringHandle global_color_string = LLXmlTree::addAttributeString("global_color"); - node->getFastAttributeString( global_color_string, mGlobalColor ); - - // Visibility mask (optional) - BOOL is_visibility; - static LLStdStringHandle visibility_mask_string = LLXmlTree::addAttributeString("visibility_mask"); - if (node->getFastAttributeBOOL(visibility_mask_string, is_visibility)) - { - mIsVisibilityMask = is_visibility; - } - - // color attribute (optional) - LLColor4U color4u; - static LLStdStringHandle fixed_color_string = LLXmlTree::addAttributeString("fixed_color"); - if( node->getFastAttributeColor4U( fixed_color_string, color4u ) ) - { - mFixedColor.setVec( color4u ); - } - - // <texture> optional sub-element - for (LLXmlTreeNode* texture_node = node->getChildByName( "texture" ); - texture_node; - texture_node = node->getNextNamedChild()) - { - std::string local_texture_name; - static LLStdStringHandle tga_file_string = LLXmlTree::addAttributeString("tga_file"); - static LLStdStringHandle local_texture_string = LLXmlTree::addAttributeString("local_texture"); - static LLStdStringHandle file_is_mask_string = LLXmlTree::addAttributeString("file_is_mask"); - static LLStdStringHandle local_texture_alpha_only_string = LLXmlTree::addAttributeString("local_texture_alpha_only"); - if( texture_node->getFastAttributeString( tga_file_string, mStaticImageFileName ) ) - { - texture_node->getFastAttributeBOOL( file_is_mask_string, mStaticImageIsMask ); - } - else if (texture_node->getFastAttributeString(local_texture_string, local_texture_name)) - { - texture_node->getFastAttributeBOOL( local_texture_alpha_only_string, mUseLocalTextureAlphaOnly ); - - /* if ("upper_shirt" == local_texture_name) - mLocalTexture = TEX_UPPER_SHIRT; */ - mLocalTexture = TEX_NUM_INDICES; - for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); - iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); - iter++) - { - const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; - if (local_texture_name == texture_dict->mName) - { - mLocalTexture = iter->first; - break; - } - } - if (mLocalTexture == TEX_NUM_INDICES) - { - llwarns << "<texture> element has invalid local_texture attribute: " << mName << " " << local_texture_name << llendl; - return FALSE; - } - } - else - { - llwarns << "<texture> element is missing a required attribute. " << mName << llendl; - return FALSE; - } - } - - for (LLXmlTreeNode* maskNode = node->getChildByName( "morph_mask" ); - maskNode; - maskNode = node->getNextNamedChild()) - { - std::string morph_name; - static LLStdStringHandle morph_name_string = LLXmlTree::addAttributeString("morph_name"); - if (maskNode->getFastAttributeString(morph_name_string, morph_name)) - { - BOOL invert = FALSE; - static LLStdStringHandle invert_string = LLXmlTree::addAttributeString("invert"); - maskNode->getFastAttributeBOOL(invert_string, invert); - mMorphNameList.push_back(std::pair<std::string,BOOL>(morph_name,invert)); - } - } - - // <param> optional sub-element (color or alpha params) - for (LLXmlTreeNode* child = node->getChildByName( "param" ); - child; - child = node->getNextNamedChild()) - { - if( child->getChildByName( "param_color" ) ) - { - // <param><param_color/></param> - LLTexLayerParamColorInfo* info = new LLTexLayerParamColorInfo(); - if (!info->parseXml(child)) - { - delete info; - return FALSE; - } - mParamColorInfoList.push_back(info); - } - else if( child->getChildByName( "param_alpha" ) ) - { - // <param><param_alpha/></param> - LLTexLayerParamAlphaInfo* info = new LLTexLayerParamAlphaInfo( ); - if (!info->parseXml(child)) - { - delete info; - return FALSE; - } - mParamAlphaInfoList.push_back(info); - } - } - - return TRUE; -} - -BOOL LLTexLayerInfo::createVisualParams(LLVOAvatar *avatar) -{ - BOOL success = TRUE; - for (param_color_info_list_t::iterator color_info_iter = mParamColorInfoList.begin(); - color_info_iter != mParamColorInfoList.end(); - color_info_iter++) - { - LLTexLayerParamColorInfo * color_info = *color_info_iter; - LLTexLayerParamColor* param_color = new LLTexLayerParamColor(avatar); - if (!param_color->setInfo(color_info, TRUE)) - { - llwarns << "NULL TexLayer Color Param could not be added to visual param list. Deleting." << llendl; - delete param_color; - success = FALSE; - } - } - - for (param_alpha_info_list_t::iterator alpha_info_iter = mParamAlphaInfoList.begin(); - alpha_info_iter != mParamAlphaInfoList.end(); - alpha_info_iter++) - { - LLTexLayerParamAlphaInfo * alpha_info = *alpha_info_iter; - LLTexLayerParamAlpha* param_alpha = new LLTexLayerParamAlpha(avatar); - if (!param_alpha->setInfo(alpha_info, TRUE)) - { - llwarns << "NULL TexLayer Alpha Param could not be added to visual param list. Deleting." << llendl; - delete param_alpha; - success = FALSE; - } - } - - return success; -} - -LLTexLayerInterface::LLTexLayerInterface(LLTexLayerSet* const layer_set): - mTexLayerSet( layer_set ), - mMorphMasksValid( FALSE ), - mInfo(NULL), - mHasMorph(FALSE) -{ -} - -LLTexLayerInterface::LLTexLayerInterface(const LLTexLayerInterface &layer, LLWearable *wearable): - mTexLayerSet( layer.mTexLayerSet ), - mInfo(NULL) -{ - // don't add visual params for cloned layers - setInfo(layer.getInfo(), wearable); - - mHasMorph = layer.mHasMorph; -} - -BOOL LLTexLayerInterface::setInfo(const LLTexLayerInfo *info, LLWearable* wearable ) // This sets mInfo and calls initialization functions -{ - // setInfo should only be called once. Code is not robust enough to handle redefinition of a texlayer. - // Not a critical warning, but could be useful for debugging later issues. -Nyx - if (mInfo != NULL) - { - llwarns << "mInfo != NULL" << llendl; - } - mInfo = info; - //mID = info->mID; // No ID - - mParamColorList.reserve(mInfo->mParamColorInfoList.size()); - for (param_color_info_list_t::const_iterator iter = mInfo->mParamColorInfoList.begin(); - iter != mInfo->mParamColorInfoList.end(); - iter++) - { - LLTexLayerParamColor* param_color; - if (!wearable) - { - param_color = new LLTexLayerParamColor(this); - if (!param_color->setInfo(*iter, TRUE)) - { - mInfo = NULL; - return FALSE; - } - } - else - { - param_color = (LLTexLayerParamColor*)wearable->getVisualParam((*iter)->getID()); - if (!param_color) - { - mInfo = NULL; - return FALSE; - } - } - mParamColorList.push_back( param_color ); - } - - mParamAlphaList.reserve(mInfo->mParamAlphaInfoList.size()); - for (param_alpha_info_list_t::const_iterator iter = mInfo->mParamAlphaInfoList.begin(); - iter != mInfo->mParamAlphaInfoList.end(); - iter++) - { - LLTexLayerParamAlpha* param_alpha; - if (!wearable) - { - param_alpha = new LLTexLayerParamAlpha( this ); - if (!param_alpha->setInfo(*iter, TRUE)) - { - mInfo = NULL; - return FALSE; - } - } - else - { - param_alpha = (LLTexLayerParamAlpha*) wearable->getVisualParam((*iter)->getID()); - if (!param_alpha) - { - mInfo = NULL; - return FALSE; - } - } - mParamAlphaList.push_back( param_alpha ); - } - - return TRUE; -} - -/*virtual*/ void LLTexLayerInterface::requestUpdate() -{ - mTexLayerSet->requestUpdate(); -} - -const std::string& LLTexLayerInterface::getName() const -{ - return mInfo->mName; -} - -LLTexLayerInterface::ERenderPass LLTexLayerInterface::getRenderPass() const -{ - return mInfo->mRenderPass; -} - -const std::string& LLTexLayerInterface::getGlobalColor() const -{ - return mInfo->mGlobalColor; -} - -BOOL LLTexLayerInterface::isVisibilityMask() const -{ - return mInfo->mIsVisibilityMask; -} - -void LLTexLayerInterface::invalidateMorphMasks() -{ - mMorphMasksValid = FALSE; -} - -LLViewerVisualParam* LLTexLayerInterface::getVisualParamPtr(S32 index) const -{ - LLViewerVisualParam *result = NULL; - for (param_color_list_t::const_iterator color_iter = mParamColorList.begin(); color_iter != mParamColorList.end() && !result; ++color_iter) - { - if ((*color_iter)->getID() == index) - { - result = *color_iter; - } - } - for (param_alpha_list_t::const_iterator alpha_iter = mParamAlphaList.begin(); alpha_iter != mParamAlphaList.end() && !result; ++alpha_iter) - { - if ((*alpha_iter)->getID() == index) - { - result = *alpha_iter; - } - } - - return result; -} - -//----------------------------------------------------------------------------- -// LLTexLayer -// A single texture layer, consisting of: -// * color, consisting of either -// * one or more color parameters (weighted colors) -// * a reference to a global color -// * a fixed color with non-zero alpha -// * opaque white (the default) -// * (optional) a texture defined by either -// * a GUID -// * a texture entry index (TE) -// * (optional) one or more alpha parameters (weighted alpha textures) -//----------------------------------------------------------------------------- -LLTexLayer::LLTexLayer(LLTexLayerSet* const layer_set) : - LLTexLayerInterface( layer_set ), - mLocalTextureObject(NULL) -{ -} - -LLTexLayer::LLTexLayer(const LLTexLayer &layer, LLWearable *wearable) : - LLTexLayerInterface( layer, wearable ), - mLocalTextureObject(NULL) -{ -} - -LLTexLayer::LLTexLayer(const LLTexLayerTemplate &layer_template, LLLocalTextureObject *lto, LLWearable *wearable) : - LLTexLayerInterface( layer_template, wearable ), - mLocalTextureObject(lto) -{ -} - -LLTexLayer::~LLTexLayer() -{ - // mParamAlphaList and mParamColorList are LLViewerVisualParam's and get - // deleted with ~LLCharacter() - //std::for_each(mParamAlphaList.begin(), mParamAlphaList.end(), DeletePointer()); - //std::for_each(mParamColorList.begin(), mParamColorList.end(), DeletePointer()); - - for( alpha_cache_t::iterator iter = mAlphaCache.begin(); - iter != mAlphaCache.end(); iter++ ) - { - U8* alpha_data = iter->second; - delete [] alpha_data; - } - -} - -//----------------------------------------------------------------------------- -// setInfo -//----------------------------------------------------------------------------- - -BOOL LLTexLayer::setInfo(const LLTexLayerInfo* info, LLWearable* wearable ) -{ - return LLTexLayerInterface::setInfo(info, wearable); -} - -//static -void LLTexLayer::calculateTexLayerColor(const param_color_list_t ¶m_list, LLColor4 &net_color) -{ - for (param_color_list_t::const_iterator iter = param_list.begin(); - iter != param_list.end(); iter++) - { - const LLTexLayerParamColor* param = *iter; - LLColor4 param_net = param->getNetColor(); - const LLTexLayerParamColorInfo *info = (LLTexLayerParamColorInfo *)param->getInfo(); - switch(info->getOperation()) - { - case LLTexLayerParamColor::OP_ADD: - net_color += param_net; - break; - case LLTexLayerParamColor::OP_MULTIPLY: - net_color = net_color * param_net; - break; - case LLTexLayerParamColor::OP_BLEND: - net_color = lerp(net_color, param_net, param->getWeight()); - break; - default: - llassert(0); - break; - } - } - net_color.clamp(); -} - -/*virtual*/ void LLTexLayer::deleteCaches() -{ - // Only need to delete caches for alpha params. Color params don't hold extra memory - for (param_alpha_list_t::iterator iter = mParamAlphaList.begin(); - iter != mParamAlphaList.end(); iter++ ) - { - LLTexLayerParamAlpha* param = *iter; - param->deleteCaches(); - } -} - -BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height) -{ - LLGLEnable color_mat(GL_COLOR_MATERIAL); - gPipeline.disableLights(); - - bool use_shaders = LLGLSLShader::sNoFixedFunction; - - LLColor4 net_color; - BOOL color_specified = findNetColor(&net_color); - - if (mTexLayerSet->getAvatar()->mIsDummy) - { - color_specified = true; - net_color = LLVOAvatar::getDummyColor(); - } - - BOOL success = TRUE; - - // If you can't see the layer, don't render it. - if( is_approx_zero( net_color.mV[VW] ) ) - { - return success; - } - - BOOL alpha_mask_specified = FALSE; - param_alpha_list_t::const_iterator iter = mParamAlphaList.begin(); - if( iter != mParamAlphaList.end() ) - { - // If we have alpha masks, but we're skipping all of them, skip the whole layer. - // However, we can't do this optimization if we have morph masks that need updating. -/* if (!mHasMorph) - { - BOOL skip_layer = TRUE; - - while( iter != mParamAlphaList.end() ) - { - const LLTexLayerParamAlpha* param = *iter; - - if( !param->getSkip() ) - { - skip_layer = FALSE; - break; - } - - iter++; - } - - if( skip_layer ) - { - return success; - } - }//*/ - - renderMorphMasks(x, y, width, height, net_color); - alpha_mask_specified = TRUE; - gGL.flush(); - gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ONE_MINUS_DEST_ALPHA); - } - - gGL.color4fv( net_color.mV); - - if( getInfo()->mWriteAllChannels ) - { - gGL.flush(); - gGL.setSceneBlendType(LLRender::BT_REPLACE); - } - - if( (getInfo()->mLocalTexture != -1) && !getInfo()->mUseLocalTextureAlphaOnly ) - { - { - LLViewerTexture* tex = NULL; - if (mLocalTextureObject && mLocalTextureObject->getImage()) - { - tex = mLocalTextureObject->getImage(); - if (mLocalTextureObject->getID() == IMG_DEFAULT_AVATAR) - { - tex = NULL; - } - } - else - { - llinfos << "lto not defined or image not defined: " << getInfo()->getLocalTexture() << " lto: " << mLocalTextureObject << llendl; - } -// if( mTexLayerSet->getAvatar()->getLocalTextureGL((ETextureIndex)getInfo()->mLocalTexture, &image_gl ) ) - { - if( tex ) - { - bool no_alpha_test = getInfo()->mWriteAllChannels; - LLGLDisable alpha_test(no_alpha_test ? GL_ALPHA_TEST : 0); - if (use_shaders && no_alpha_test) - { - gAlphaMaskProgram.setMinimumAlpha(0.f); - } - - LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode(); - - gGL.getTexUnit(0)->bind(tex, TRUE); - gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); - - gl_rect_2d_simple_tex( width, height ); - - gGL.getTexUnit(0)->setTextureAddressMode(old_mode); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - if (use_shaders && no_alpha_test) - { - gAlphaMaskProgram.setMinimumAlpha(0.004f); - } - - } - } -// else -// { -// success = FALSE; -// } - } - } - - if( !getInfo()->mStaticImageFileName.empty() ) - { - { - LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask); - if( tex ) - { - gGL.getTexUnit(0)->bind(tex, TRUE); - gl_rect_2d_simple_tex( width, height ); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - } - else - { - success = FALSE; - } - } - } - - if(((-1 == getInfo()->mLocalTexture) || - getInfo()->mUseLocalTextureAlphaOnly) && - getInfo()->mStaticImageFileName.empty() && - color_specified ) - { - LLGLDisable no_alpha(GL_ALPHA_TEST); - if (use_shaders) - { - gAlphaMaskProgram.setMinimumAlpha(0.f); - } - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.color4fv( net_color.mV ); - gl_rect_2d_simple( width, height ); - if (use_shaders) - { - gAlphaMaskProgram.setMinimumAlpha(0.004f); - } - } - - if( alpha_mask_specified || getInfo()->mWriteAllChannels ) - { - // Restore standard blend func value - gGL.flush(); - gGL.setSceneBlendType(LLRender::BT_ALPHA); - stop_glerror(); - } - - if( !success ) - { - llinfos << "LLTexLayer::render() partial: " << getInfo()->mName << llendl; - } - return success; -} - -const U8* LLTexLayer::getAlphaData() const -{ - LLCRC alpha_mask_crc; - const LLUUID& uuid = getUUID(); - alpha_mask_crc.update((U8*)(&uuid.mData), UUID_BYTES); - - for (param_alpha_list_t::const_iterator iter = mParamAlphaList.begin(); iter != mParamAlphaList.end(); iter++) - { - const LLTexLayerParamAlpha* param = *iter; - // MULTI-WEARABLE: verify visual parameters used here - F32 param_weight = param->getWeight(); - alpha_mask_crc.update((U8*)¶m_weight, sizeof(F32)); - } - - U32 cache_index = alpha_mask_crc.getCRC(); - - alpha_cache_t::const_iterator iter2 = mAlphaCache.find(cache_index); - return (iter2 == mAlphaCache.end()) ? 0 : iter2->second; -} - -BOOL LLTexLayer::findNetColor(LLColor4* net_color) const -{ - // Color is either: - // * one or more color parameters (weighted colors) (which may make use of a global color or fixed color) - // * a reference to a global color - // * a fixed color with non-zero alpha - // * opaque white (the default) - - if( !mParamColorList.empty() ) - { - if( !getGlobalColor().empty() ) - { - net_color->setVec( mTexLayerSet->getAvatar()->getGlobalColor( getInfo()->mGlobalColor ) ); - } - else if (getInfo()->mFixedColor.mV[VW]) - { - net_color->setVec( getInfo()->mFixedColor ); - } - else - { - net_color->setVec( 0.f, 0.f, 0.f, 0.f ); - } - - calculateTexLayerColor(mParamColorList, *net_color); - return TRUE; - } - - if( !getGlobalColor().empty() ) - { - net_color->setVec( mTexLayerSet->getAvatar()->getGlobalColor( getGlobalColor() ) ); - return TRUE; - } - - if( getInfo()->mFixedColor.mV[VW] ) - { - net_color->setVec( getInfo()->mFixedColor ); - return TRUE; - } - - net_color->setToWhite(); - - return FALSE; // No need to draw a separate colored polygon -} - -BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height) -{ - BOOL success = TRUE; - - gGL.flush(); - - bool use_shaders = LLGLSLShader::sNoFixedFunction; - - if( !getInfo()->mStaticImageFileName.empty() ) - { - LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask ); - if( tex ) - { - LLGLSNoAlphaTest gls_no_alpha_test; - if (use_shaders) - { - gAlphaMaskProgram.setMinimumAlpha(0.f); - } - gGL.getTexUnit(0)->bind(tex, TRUE); - gl_rect_2d_simple_tex( width, height ); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - if (use_shaders) - { - gAlphaMaskProgram.setMinimumAlpha(0.004f); - } - } - else - { - success = FALSE; - } - } - else - { - if (getInfo()->mLocalTexture >=0 && getInfo()->mLocalTexture < TEX_NUM_INDICES) - { - LLViewerTexture* tex = mLocalTextureObject->getImage(); - if (tex) - { - LLGLSNoAlphaTest gls_no_alpha_test; - if (use_shaders) - { - gAlphaMaskProgram.setMinimumAlpha(0.f); - } - gGL.getTexUnit(0)->bind(tex); - gl_rect_2d_simple_tex( width, height ); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - success = TRUE; - if (use_shaders) - { - gAlphaMaskProgram.setMinimumAlpha(0.004f); - } - } - } - } - - return success; -} - -/*virtual*/ void LLTexLayer::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height) -{ - addAlphaMask(data, originX, originY, width, height); -} - -BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color) -{ - BOOL success = TRUE; - - llassert( !mParamAlphaList.empty() ); - - bool use_shaders = LLGLSLShader::sNoFixedFunction; - - if (use_shaders) - { - gAlphaMaskProgram.setMinimumAlpha(0.f); - } - - gGL.setColorMask(false, true); - - LLTexLayerParamAlpha* first_param = *mParamAlphaList.begin(); - // Note: if the first param is a mulitply, multiply against the current buffer's alpha - if( !first_param || !first_param->getMultiplyBlend() ) - { - LLGLDisable no_alpha(GL_ALPHA_TEST); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - - // Clear the alpha - gGL.flush(); - gGL.setSceneBlendType(LLRender::BT_REPLACE); - - gGL.color4f( 0.f, 0.f, 0.f, 0.f ); - gl_rect_2d_simple( width, height ); - } - - // Accumulate alphas - LLGLSNoAlphaTest gls_no_alpha_test; - gGL.color4f( 1.f, 1.f, 1.f, 1.f ); - for (param_alpha_list_t::iterator iter = mParamAlphaList.begin(); iter != mParamAlphaList.end(); iter++) - { - LLTexLayerParamAlpha* param = *iter; - success &= param->render( x, y, width, height ); - } - - // Approximates a min() function - gGL.flush(); - gGL.setSceneBlendType(LLRender::BT_MULT_ALPHA); - - // Accumulate the alpha component of the texture - if( getInfo()->mLocalTexture != -1 ) - { - LLViewerTexture* tex = mLocalTextureObject->getImage(); - if( tex && (tex->getComponents() == 4) ) - { - LLGLSNoAlphaTest gls_no_alpha_test; - LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode(); - - gGL.getTexUnit(0)->bind(tex, TRUE); - gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); - - gl_rect_2d_simple_tex( width, height ); - - gGL.getTexUnit(0)->setTextureAddressMode(old_mode); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - } - } - - if( !getInfo()->mStaticImageFileName.empty() ) - { - LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask); - if( tex ) - { - if( (tex->getComponents() == 4) || - ( (tex->getComponents() == 1) && getInfo()->mStaticImageIsMask ) ) - { - LLGLSNoAlphaTest gls_no_alpha_test; - gGL.getTexUnit(0)->bind(tex, TRUE); - gl_rect_2d_simple_tex( width, height ); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - } - } - } - - // Draw a rectangle with the layer color to multiply the alpha by that color's alpha. - // Note: we're still using gGL.blendFunc( GL_DST_ALPHA, GL_ZERO ); - if (layer_color.mV[VW] != 1.f) - { - LLGLDisable no_alpha(GL_ALPHA_TEST); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.color4fv(layer_color.mV); - gl_rect_2d_simple( width, height ); - } - - if (use_shaders) - { - gAlphaMaskProgram.setMinimumAlpha(0.004f); - } - - LLGLSUIDefault gls_ui; - - gGL.setColorMask(true, true); - - if (hasMorph() && success) - { - LLCRC alpha_mask_crc; - const LLUUID& uuid = getUUID(); - alpha_mask_crc.update((U8*)(&uuid.mData), UUID_BYTES); - - for (param_alpha_list_t::const_iterator iter = mParamAlphaList.begin(); iter != mParamAlphaList.end(); iter++) - { - const LLTexLayerParamAlpha* param = *iter; - F32 param_weight = param->getWeight(); - alpha_mask_crc.update((U8*)¶m_weight, sizeof(F32)); - } - - U32 cache_index = alpha_mask_crc.getCRC(); - U8* alpha_data = get_if_there(mAlphaCache,cache_index,(U8*)NULL); - if (!alpha_data) - { - // clear out a slot if we have filled our cache - S32 max_cache_entries = getTexLayerSet()->getAvatar()->isSelf() ? 4 : 1; - while ((S32)mAlphaCache.size() >= max_cache_entries) - { - alpha_cache_t::iterator iter2 = mAlphaCache.begin(); // arbitrarily grab the first entry - alpha_data = iter2->second; - delete [] alpha_data; - mAlphaCache.erase(iter2); - } - alpha_data = new U8[width * height]; - mAlphaCache[cache_index] = alpha_data; - glReadPixels(x, y, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, alpha_data); - } - - getTexLayerSet()->getAvatar()->dirtyMesh(); - - mMorphMasksValid = TRUE; - getTexLayerSet()->applyMorphMask(alpha_data, width, height, 1); - } - - return success; -} - -void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height) -{ - S32 size = width * height; - const U8* alphaData = getAlphaData(); - if (!alphaData && hasAlphaParams()) - { - LLColor4 net_color; - findNetColor( &net_color ); - // TODO: eliminate need for layer morph mask valid flag - invalidateMorphMasks(); - renderMorphMasks(originX, originY, width, height, net_color); - alphaData = getAlphaData(); - } - if (alphaData) - { - for( S32 i = 0; i < size; i++ ) - { - U8 curAlpha = data[i]; - U16 resultAlpha = curAlpha; - resultAlpha *= (alphaData[i] + 1); - resultAlpha = resultAlpha >> 8; - data[i] = (U8)resultAlpha; - } - } -} - -/*virtual*/ BOOL LLTexLayer::isInvisibleAlphaMask() const -{ - if (mLocalTextureObject) - { - if (mLocalTextureObject->getID() == IMG_INVISIBLE) - { - return TRUE; - } - } - - return FALSE; -} - -LLUUID LLTexLayer::getUUID() const -{ - LLUUID uuid; - if( getInfo()->mLocalTexture != -1 ) - { - LLViewerTexture* tex = mLocalTextureObject->getImage(); - if (tex) - { - uuid = mLocalTextureObject->getID(); - } - } - if( !getInfo()->mStaticImageFileName.empty() ) - { - LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask); - if( tex ) - { - uuid = tex->getID(); - } - } - return uuid; -} - - -//----------------------------------------------------------------------------- -// LLTexLayerTemplate -// A single texture layer, consisting of: -// * color, consisting of either -// * one or more color parameters (weighted colors) -// * a reference to a global color -// * a fixed color with non-zero alpha -// * opaque white (the default) -// * (optional) a texture defined by either -// * a GUID -// * a texture entry index (TE) -// * (optional) one or more alpha parameters (weighted alpha textures) -//----------------------------------------------------------------------------- -LLTexLayerTemplate::LLTexLayerTemplate(LLTexLayerSet* layer_set) : - LLTexLayerInterface(layer_set) -{ -} - -LLTexLayerTemplate::LLTexLayerTemplate(const LLTexLayerTemplate &layer) : - LLTexLayerInterface(layer) -{ -} - -LLTexLayerTemplate::~LLTexLayerTemplate() -{ -} - -//----------------------------------------------------------------------------- -// setInfo -//----------------------------------------------------------------------------- - -/*virtual*/ BOOL LLTexLayerTemplate::setInfo(const LLTexLayerInfo* info, LLWearable* wearable ) -{ - return LLTexLayerInterface::setInfo(info, wearable); -} - -U32 LLTexLayerTemplate::updateWearableCache() const -{ - mWearableCache.clear(); - - S32 te = mInfo->mLocalTexture; - if (te == -1) - { - //this isn't a cloneable layer - return 0; - } - LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)te); - U32 num_wearables = gAgentWearables.getWearableCount(wearable_type); - U32 added = 0; - for (U32 i = 0; i < num_wearables; i++) - { - LLWearable* wearable = gAgentWearables.getWearable(wearable_type, i); - if (!wearable) - { - continue; - } - mWearableCache.push_back(wearable); - added++; - } - return added; -} -LLTexLayer* LLTexLayerTemplate::getLayer(U32 i) const -{ - if (mWearableCache.size() <= i) - { - return NULL; - } - LLWearable *wearable = mWearableCache[i]; - LLLocalTextureObject *lto = NULL; - LLTexLayer *layer = NULL; - if (wearable) - { - lto = wearable->getLocalTextureObject(mInfo->mLocalTexture); - } - if (lto) - { - layer = lto->getTexLayer(getName()); - } - return layer; -} - -/*virtual*/ BOOL LLTexLayerTemplate::render(S32 x, S32 y, S32 width, S32 height) -{ - if(!mInfo) - { - return FALSE ; - } - - BOOL success = TRUE; - updateWearableCache(); - for (wearable_cache_t::const_iterator iter = mWearableCache.begin(); iter!= mWearableCache.end(); iter++) - { - LLWearable* wearable = NULL; - LLLocalTextureObject *lto = NULL; - LLTexLayer *layer = NULL; - wearable = *iter; - if (wearable) - { - lto = wearable->getLocalTextureObject(mInfo->mLocalTexture); - } - if (lto) - { - layer = lto->getTexLayer(getName()); - } - if (layer) - { - wearable->writeToAvatar(); - layer->setLTO(lto); - success &= layer->render(x,y,width,height); - } - } - - return success; -} - -/*virtual*/ BOOL LLTexLayerTemplate::blendAlphaTexture( S32 x, S32 y, S32 width, S32 height) // Multiplies a single alpha texture against the frame buffer -{ - BOOL success = TRUE; - U32 num_wearables = updateWearableCache(); - for (U32 i = 0; i < num_wearables; i++) - { - LLTexLayer *layer = getLayer(i); - if (layer) - { - success &= layer->blendAlphaTexture(x,y,width,height); - } - } - return success; -} - -/*virtual*/ void LLTexLayerTemplate::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height) -{ - U32 num_wearables = updateWearableCache(); - for (U32 i = 0; i < num_wearables; i++) - { - LLTexLayer *layer = getLayer(i); - if (layer) - { - layer->addAlphaMask(data, originX, originY, width, height); - } - } -} - -/*virtual*/ void LLTexLayerTemplate::setHasMorph(BOOL newval) -{ - mHasMorph = newval; - U32 num_wearables = updateWearableCache(); - for (U32 i = 0; i < num_wearables; i++) - { - LLTexLayer *layer = getLayer(i); - if (layer) - { - layer->setHasMorph(newval); - } - } -} - -/*virtual*/ void LLTexLayerTemplate::deleteCaches() -{ - U32 num_wearables = updateWearableCache(); - for (U32 i = 0; i < num_wearables; i++) - { - LLTexLayer *layer = getLayer(i); - if (layer) - { - layer->deleteCaches(); - } - } -} - -/*virtual*/ BOOL LLTexLayerTemplate::isInvisibleAlphaMask() const -{ - U32 num_wearables = updateWearableCache(); - for (U32 i = 0; i < num_wearables; i++) - { - LLTexLayer *layer = getLayer(i); - if (layer) - { - if (layer->isInvisibleAlphaMask()) - { - return TRUE; - } - } - } - - return FALSE; -} - - -//----------------------------------------------------------------------------- -// finds a specific layer based on a passed in name -//----------------------------------------------------------------------------- -LLTexLayerInterface* LLTexLayerSet::findLayerByName(const std::string& name) -{ - for (layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) - { - LLTexLayerInterface* layer = *iter; - if (layer->getName() == name) - { - return layer; - } - } - for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++ ) - { - LLTexLayerInterface* layer = *iter; - if (layer->getName() == name) - { - return layer; - } - } - return NULL; -} - -void LLTexLayerSet::cloneTemplates(LLLocalTextureObject *lto, LLVOAvatarDefines::ETextureIndex tex_index, LLWearable *wearable) -{ - // initialize all texlayers with this texture type for this LTO - for( LLTexLayerSet::layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) - { - LLTexLayerTemplate* layer = (LLTexLayerTemplate*)*iter; - if (layer->getInfo()->getLocalTexture() == (S32) tex_index) - { - lto->addTexLayer(layer, wearable); - } - } - for( LLTexLayerSet::layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++ ) - { - LLTexLayerTemplate* layer = (LLTexLayerTemplate*)*iter; - if (layer->getInfo()->getLocalTexture() == (S32) tex_index) - { - lto->addTexLayer(layer, wearable); - } - } -} -//----------------------------------------------------------------------------- -// LLTexLayerStaticImageList -//----------------------------------------------------------------------------- - -LLTexLayerStaticImageList::LLTexLayerStaticImageList() : - mGLBytes(0), - mTGABytes(0), - mImageNames(16384) -{ -} - -LLTexLayerStaticImageList::~LLTexLayerStaticImageList() -{ - deleteCachedImages(); -} - -void LLTexLayerStaticImageList::dumpByteCount() const -{ - llinfos << "Avatar Static Textures " << - "KB GL:" << (mGLBytes / 1024) << - "KB TGA:" << (mTGABytes / 1024) << "KB" << llendl; -} - -void LLTexLayerStaticImageList::deleteCachedImages() -{ - if( mGLBytes || mTGABytes ) - { - llinfos << "Clearing Static Textures " << - "KB GL:" << (mGLBytes / 1024) << - "KB TGA:" << (mTGABytes / 1024) << "KB" << llendl; - - //mStaticImageLists uses LLPointers, clear() will cause deletion - - mStaticImageListTGA.clear(); - mStaticImageList.clear(); - - mGLBytes = 0; - mTGABytes = 0; - } -} - -// Note: in general, for a given image image we'll call either getImageTga() or getTexture(). -// We call getImageTga() if the image is used as an alpha gradient. -// Otherwise, we call getTexture() - -// Returns an LLImageTGA that contains the encoded data from a tga file named file_name. -// Caches the result to speed identical subsequent requests. -LLImageTGA* LLTexLayerStaticImageList::getImageTGA(const std::string& file_name) -{ - const char *namekey = mImageNames.addString(file_name); - image_tga_map_t::const_iterator iter = mStaticImageListTGA.find(namekey); - if( iter != mStaticImageListTGA.end() ) - { - return iter->second; - } - else - { - std::string path; - path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,file_name); - LLPointer<LLImageTGA> image_tga = new LLImageTGA( path ); - if( image_tga->getDataSize() > 0 ) - { - mStaticImageListTGA[ namekey ] = image_tga; - mTGABytes += image_tga->getDataSize(); - return image_tga; - } - else - { - return NULL; - } - } -} - -// Returns a GL Image (without a backing ImageRaw) that contains the decoded data from a tga file named file_name. -// Caches the result to speed identical subsequent requests. -LLViewerTexture* LLTexLayerStaticImageList::getTexture(const std::string& file_name, BOOL is_mask) -{ - LLPointer<LLViewerTexture> tex; - const char *namekey = mImageNames.addString(file_name); - - texture_map_t::const_iterator iter = mStaticImageList.find(namekey); - if( iter != mStaticImageList.end() ) - { - tex = iter->second; - } - else - { - tex = LLViewerTextureManager::getLocalTexture( FALSE ); - LLPointer<LLImageRaw> image_raw = new LLImageRaw; - if( loadImageRaw( file_name, image_raw ) ) - { - if( (image_raw->getComponents() == 1) && is_mask ) - { - // Note: these are static, unchanging images so it's ok to assume - // that once an image is a mask it's always a mask. - tex->setExplicitFormat( GL_ALPHA8, GL_ALPHA ); - } - tex->createGLTexture(0, image_raw, 0, TRUE, LLViewerTexture::LOCAL); - - gGL.getTexUnit(0)->bind(tex); - tex->setAddressMode(LLTexUnit::TAM_CLAMP); - - mStaticImageList [ namekey ] = tex; - mGLBytes += (S32)tex->getWidth() * tex->getHeight() * tex->getComponents(); - } - else - { - tex = NULL; - } - } - - return tex; -} - -// Reads a .tga file, decodes it, and puts the decoded data in image_raw. -// Returns TRUE if successful. -BOOL LLTexLayerStaticImageList::loadImageRaw(const std::string& file_name, LLImageRaw* image_raw) -{ - BOOL success = FALSE; - std::string path; - path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,file_name); - LLPointer<LLImageTGA> image_tga = new LLImageTGA( path ); - if( image_tga->getDataSize() > 0 ) - { - // Copy data from tga to raw. - success = image_tga->decode( image_raw ); - } - - return success; -} - -const std::string LLTexLayerSetBuffer::dumpTextureInfo() const -{ - if (!isAgentAvatarValid()) return ""; - - const BOOL is_high_res = !mNeedsUpload; - const U32 num_low_res = mNumLowresUploads; - const U32 upload_time = (U32)mNeedsUploadTimer.getElapsedTimeF32(); - const std::string local_texture_info = gAgentAvatarp->debugDumpLocalTextureDataInfo(mTexLayerSet); - - std::string status = "CREATING "; - if (!uploadNeeded()) status = "DONE "; - if (uploadInProgress()) status = "UPLOADING"; - - std::string text = llformat("[%s] [HiRes:%d LoRes:%d] [Elapsed:%d] %s", - status.c_str(), - is_high_res, num_low_res, - upload_time, - local_texture_info.c_str()); - return text; -} diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h deleted file mode 100644 index 4f43547dae..0000000000 --- a/indra/newview/lltexlayer.h +++ /dev/null @@ -1,380 +0,0 @@ -/** - * @file lltexlayer.h - * @brief Texture layer classes. Used for avatars. - * - * $LicenseInfo:firstyear=2002&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$ - */ - -#ifndef LL_LLTEXLAYER_H -#define LL_LLTEXLAYER_H - -#include <deque> -#include "lldynamictexture.h" -#include "llvoavatardefines.h" -#include "lltexlayerparams.h" - -class LLVOAvatar; -class LLVOAvatarSelf; -class LLImageTGA; -class LLImageRaw; -class LLXmlTreeNode; -class LLTexLayerSet; -class LLTexLayerSetInfo; -class LLTexLayerInfo; -class LLTexLayerSetBuffer; -class LLWearable; -class LLViewerVisualParam; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerInterface -// -// Interface class to generalize functionality shared by LLTexLayer -// and LLTexLayerTemplate. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayerInterface -{ -public: - enum ERenderPass - { - RP_COLOR, - RP_BUMP, - RP_SHINE - }; - - LLTexLayerInterface(LLTexLayerSet* const layer_set); - LLTexLayerInterface(const LLTexLayerInterface &layer, LLWearable *wearable); - virtual ~LLTexLayerInterface() {} - - virtual BOOL render(S32 x, S32 y, S32 width, S32 height) = 0; - virtual void deleteCaches() = 0; - virtual BOOL blendAlphaTexture(S32 x, S32 y, S32 width, S32 height) = 0; - virtual BOOL isInvisibleAlphaMask() const = 0; - - const LLTexLayerInfo* getInfo() const { return mInfo; } - virtual BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable); // sets mInfo, calls initialization functions - - const std::string& getName() const; - const LLTexLayerSet* const getTexLayerSet() const { return mTexLayerSet; } - LLTexLayerSet* const getTexLayerSet() { return mTexLayerSet; } - - void invalidateMorphMasks(); - virtual void setHasMorph(BOOL newval) { mHasMorph = newval; } - BOOL hasMorph() const { return mHasMorph; } - BOOL isMorphValid() const { return mMorphMasksValid; } - - void requestUpdate(); - virtual void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height) = 0; - BOOL hasAlphaParams() const { return !mParamAlphaList.empty(); } - - ERenderPass getRenderPass() const; - BOOL isVisibilityMask() const; - -protected: - const std::string& getGlobalColor() const; - LLViewerVisualParam* getVisualParamPtr(S32 index) const; - -protected: - LLTexLayerSet* const mTexLayerSet; - const LLTexLayerInfo* mInfo; - BOOL mMorphMasksValid; - BOOL mHasMorph; - - // Layers can have either mParamColorList, mGlobalColor, or mFixedColor. They are looked for in that order. - param_color_list_t mParamColorList; - param_alpha_list_t mParamAlphaList; - // mGlobalColor name stored in mInfo - // mFixedColor value stored in mInfo -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerTemplate -// -// Only exists for llvoavatarself. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayerTemplate : public LLTexLayerInterface -{ -public: - LLTexLayerTemplate(LLTexLayerSet* const layer_set); - LLTexLayerTemplate(const LLTexLayerTemplate &layer); - /*virtual*/ ~LLTexLayerTemplate(); - /*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height); - /*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable); // This sets mInfo and calls initialization functions - /*virtual*/ BOOL blendAlphaTexture(S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer - /*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height); - /*virtual*/ void setHasMorph(BOOL newval); - /*virtual*/ void deleteCaches(); - /*virtual*/ BOOL isInvisibleAlphaMask() const; -protected: - U32 updateWearableCache() const; - LLTexLayer* getLayer(U32 i) const; -private: - typedef std::vector<LLWearable*> wearable_cache_t; - mutable wearable_cache_t mWearableCache; // mutable b/c most get- require updating this cache -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayer -// -// A single texture layer. Only exists for llvoavatarself. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayer : public LLTexLayerInterface -{ -public: - LLTexLayer(LLTexLayerSet* const layer_set); - LLTexLayer(const LLTexLayer &layer, LLWearable *wearable); - LLTexLayer(const LLTexLayerTemplate &layer_template, LLLocalTextureObject *lto, LLWearable *wearable); - /*virtual*/ ~LLTexLayer(); - - /*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable); // This sets mInfo and calls initialization functions - /*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height); - - /*virtual*/ void deleteCaches(); - const U8* getAlphaData() const; - - BOOL findNetColor(LLColor4* color) const; - /*virtual*/ BOOL blendAlphaTexture(S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer - /*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height); - BOOL renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color); - void addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height); - /*virtual*/ BOOL isInvisibleAlphaMask() const; - - void setLTO(LLLocalTextureObject *lto) { mLocalTextureObject = lto; } - LLLocalTextureObject* getLTO() { return mLocalTextureObject; } - - static void calculateTexLayerColor(const param_color_list_t ¶m_list, LLColor4 &net_color); -protected: - LLUUID getUUID() const; -private: - typedef std::map<U32, U8*> alpha_cache_t; - alpha_cache_t mAlphaCache; - LLLocalTextureObject* mLocalTextureObject; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerSet -// -// An ordered set of texture layers that gets composited into a single texture. -// Only exists for llvoavatarself. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayerSet -{ - friend class LLTexLayerSetBuffer; -public: - LLTexLayerSet(LLVOAvatarSelf* const avatar); - ~LLTexLayerSet(); - - const LLTexLayerSetInfo* getInfo() const { return mInfo; } - BOOL setInfo(const LLTexLayerSetInfo *info); // This sets mInfo and calls initialization functions - - BOOL render(S32 x, S32 y, S32 width, S32 height); - void renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear = false); - - BOOL isBodyRegion(const std::string& region) const; - LLTexLayerSetBuffer* getComposite(); - const LLTexLayerSetBuffer* getComposite() const; // Do not create one if it doesn't exist. - void requestUpdate(); - void requestUpload(); - void cancelUpload(); - void updateComposite(); - BOOL isLocalTextureDataAvailable() const; - BOOL isLocalTextureDataFinal() const; - void createComposite(); - void destroyComposite(); - void setUpdatesEnabled(BOOL b); - BOOL getUpdatesEnabled() const { return mUpdatesEnabled; } - void deleteCaches(); - void gatherMorphMaskAlpha(U8 *data, S32 width, S32 height); - void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components); - BOOL isMorphValid() const; - void invalidateMorphMasks(); - LLTexLayerInterface* findLayerByName(const std::string& name); - void cloneTemplates(LLLocalTextureObject *lto, LLVOAvatarDefines::ETextureIndex tex_index, LLWearable* wearable); - - LLVOAvatarSelf* getAvatar() const { return mAvatar; } - const std::string getBodyRegionName() const; - BOOL hasComposite() const { return (mComposite.notNull()); } - LLVOAvatarDefines::EBakedTextureIndex getBakedTexIndex() { return mBakedTexIndex; } - void setBakedTexIndex(LLVOAvatarDefines::EBakedTextureIndex index) { mBakedTexIndex = index; } - BOOL isVisible() const { return mIsVisible; } - - static BOOL sHasCaches; - -private: - typedef std::vector<LLTexLayerInterface *> layer_list_t; - layer_list_t mLayerList; - layer_list_t mMaskLayerList; - LLPointer<LLTexLayerSetBuffer> mComposite; - LLVOAvatarSelf* const mAvatar; // note: backlink only; don't make this an LLPointer. - BOOL mUpdatesEnabled; - BOOL mIsVisible; - - LLVOAvatarDefines::EBakedTextureIndex mBakedTexIndex; - const LLTexLayerSetInfo* mInfo; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerSetInfo -// -// Contains shared layer set data. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayerSetInfo -{ - friend class LLTexLayerSet; -public: - LLTexLayerSetInfo(); - ~LLTexLayerSetInfo(); - BOOL parseXml(LLXmlTreeNode* node); - void createVisualParams(LLVOAvatar *avatar); -private: - std::string mBodyRegion; - S32 mWidth; - S32 mHeight; - std::string mStaticAlphaFileName; - BOOL mClearAlpha; // Set alpha to 1 for this layerset (if there is no mStaticAlphaFileName) - typedef std::vector<LLTexLayerInfo*> layer_info_list_t; - layer_info_list_t mLayerInfoList; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerSetBuffer -// -// The composite image that a LLTexLayerSet writes to. Each LLTexLayerSet has one. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayerSetBuffer : public LLViewerDynamicTexture -{ - LOG_CLASS(LLTexLayerSetBuffer); - -public: - LLTexLayerSetBuffer(LLTexLayerSet* const owner, S32 width, S32 height); - virtual ~LLTexLayerSetBuffer(); - -public: - /*virtual*/ S8 getType() const; - BOOL isInitialized(void) const; - static void dumpTotalByteCount(); - const std::string dumpTextureInfo() const; - virtual void restoreGLTexture(); - virtual void destroyGLTexture(); -protected: - void pushProjection() const; - void popProjection() const; -private: - LLTexLayerSet* const mTexLayerSet; - static S32 sGLByteCount; - - //-------------------------------------------------------------------- - // Render - //-------------------------------------------------------------------- -public: - /*virtual*/ BOOL needsRender(); -protected: - BOOL render(S32 x, S32 y, S32 width, S32 height); - virtual void preRender(BOOL clear_depth); - virtual void postRender(BOOL success); - virtual BOOL render(); - - //-------------------------------------------------------------------- - // Uploads - //-------------------------------------------------------------------- -public: - void requestUpload(); - void cancelUpload(); - BOOL uploadNeeded() const; // We need to upload a new texture - BOOL uploadInProgress() const; // We have started uploading a new texture and are awaiting the result - BOOL uploadPending() const; // We are expecting a new texture to be uploaded at some point - static void onTextureUploadComplete(const LLUUID& uuid, - void* userdata, - S32 result, LLExtStat ext_status); -protected: - BOOL isReadyToUpload() const; - void doUpload(); // Does a read back and upload. - void conditionalRestartUploadTimer(); -private: - BOOL mNeedsUpload; // Whether we need to send our baked textures to the server - U32 mNumLowresUploads; // Number of times we've sent a lowres version of our baked textures to the server - BOOL mUploadPending; // Whether we have received back the new baked textures - LLUUID mUploadID; // The current upload process (null if none). - LLFrameTimer mNeedsUploadTimer; // Tracks time since upload was requested and performed. - S32 mUploadFailCount; // Number of consecutive upload failures - LLFrameTimer mUploadRetryTimer; // Tracks time since last upload failure. - - //-------------------------------------------------------------------- - // Updates - //-------------------------------------------------------------------- -public: - void requestUpdate(); - BOOL requestUpdateImmediate(); -protected: - BOOL isReadyToUpdate() const; - void doUpdate(); - void restartUpdateTimer(); -private: - BOOL mNeedsUpdate; // Whether we need to locally update our baked textures - U32 mNumLowresUpdates; // Number of times we've locally updated with lowres version of our baked textures - LLFrameTimer mNeedsUpdateTimer; // Tracks time since update was requested and performed. -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerStaticImageList -// -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayerStaticImageList : public LLSingleton<LLTexLayerStaticImageList> -{ -public: - LLTexLayerStaticImageList(); - ~LLTexLayerStaticImageList(); - LLViewerTexture* getTexture(const std::string& file_name, BOOL is_mask); - LLImageTGA* getImageTGA(const std::string& file_name); - void deleteCachedImages(); - void dumpByteCount() const; -protected: - BOOL loadImageRaw(const std::string& file_name, LLImageRaw* image_raw); -private: - LLStringTable mImageNames; - typedef std::map<const char*, LLPointer<LLViewerTexture> > texture_map_t; - texture_map_t mStaticImageList; - typedef std::map<const char*, LLPointer<LLImageTGA> > image_tga_map_t; - image_tga_map_t mStaticImageListTGA; - S32 mGLBytes; - S32 mTGABytes; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLBakedUploadData -// -// Used by LLTexLayerSetBuffer for a callback. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -struct LLBakedUploadData -{ - LLBakedUploadData(const LLVOAvatarSelf* avatar, - LLTexLayerSet* layerset, - const LLUUID& id, - bool highest_res); - ~LLBakedUploadData() {} - const LLUUID mID; - const LLVOAvatarSelf* mAvatar; // note: backlink only; don't LLPointer - LLTexLayerSet* mTexLayerSet; - const U64 mStartTime; // for measuring baked texture upload time - const bool mIsHighestRes; // whether this is a "final" bake, or intermediate low res -}; - -#endif // LL_LLTEXLAYER_H diff --git a/indra/newview/lltexlayerparams.cpp b/indra/newview/lltexlayerparams.cpp deleted file mode 100644 index 8972827eff..0000000000 --- a/indra/newview/lltexlayerparams.cpp +++ /dev/null @@ -1,568 +0,0 @@ -/** - * @file lltexlayerparams.cpp - * @brief Texture layer parameters - * - * $LicenseInfo:firstyear=2002&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$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "lltexlayerparams.h" - -#include "llagentcamera.h" -#include "llimagetga.h" -#include "lltexlayer.h" -#include "llvoavatarself.h" -#include "llwearable.h" -#include "llui.h" - -//----------------------------------------------------------------------------- -// LLTexLayerParam -//----------------------------------------------------------------------------- -LLTexLayerParam::LLTexLayerParam(LLTexLayerInterface *layer) : - mTexLayer(layer), - mAvatar(NULL) -{ - if (mTexLayer != NULL) - { - mAvatar = mTexLayer->getTexLayerSet()->getAvatar(); - } - else - { - llerrs << "LLTexLayerParam constructor passed with NULL reference for layer!" << llendl; - } -} - -LLTexLayerParam::LLTexLayerParam(LLVOAvatar *avatar) : - mTexLayer(NULL) -{ - mAvatar = avatar; -} - - -BOOL LLTexLayerParam::setInfo(LLViewerVisualParamInfo *info, BOOL add_to_avatar ) -{ - LLViewerVisualParam::setInfo(info); - - if (add_to_avatar) - { - mAvatar->addVisualParam( this); - } - - return TRUE; -} - - -//----------------------------------------------------------------------------- -// LLTexLayerParamAlpha -//----------------------------------------------------------------------------- - -// static -LLTexLayerParamAlpha::param_alpha_ptr_list_t LLTexLayerParamAlpha::sInstances; - -// static -void LLTexLayerParamAlpha::dumpCacheByteCount() -{ - S32 gl_bytes = 0; - getCacheByteCount( &gl_bytes); - llinfos << "Processed Alpha Texture Cache GL:" << (gl_bytes/1024) << "KB" << llendl; -} - -// static -void LLTexLayerParamAlpha::getCacheByteCount(S32* gl_bytes) -{ - *gl_bytes = 0; - - for (param_alpha_ptr_list_t::iterator iter = sInstances.begin(); - iter != sInstances.end(); iter++) - { - LLTexLayerParamAlpha* instance = *iter; - LLViewerTexture* tex = instance->mCachedProcessedTexture; - if (tex) - { - S32 bytes = (S32)tex->getWidth() * tex->getHeight() * tex->getComponents(); - - if (tex->hasGLTexture()) - { - *gl_bytes += bytes; - } - } - } -} - -LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLTexLayerInterface* layer) : - LLTexLayerParam(layer), - mCachedProcessedTexture(NULL), - mNeedsCreateTexture(FALSE), - mStaticImageInvalid(FALSE), - mAvgDistortionVec(1.f, 1.f, 1.f), - mCachedEffectiveWeight(0.f) -{ - sInstances.push_front(this); -} - -LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLVOAvatar* avatar) : - LLTexLayerParam(avatar), - mCachedProcessedTexture(NULL), - mNeedsCreateTexture(FALSE), - mStaticImageInvalid(FALSE), - mAvgDistortionVec(1.f, 1.f, 1.f), - mCachedEffectiveWeight(0.f) -{ - sInstances.push_front(this); -} - - -LLTexLayerParamAlpha::~LLTexLayerParamAlpha() -{ - deleteCaches(); - sInstances.remove(this); -} - -/*virtual*/ LLViewerVisualParam* LLTexLayerParamAlpha::cloneParam(LLWearable* wearable) const -{ - LLTexLayerParamAlpha *new_param = new LLTexLayerParamAlpha(mTexLayer); - *new_param = *this; - return new_param; -} - -void LLTexLayerParamAlpha::deleteCaches() -{ - mStaticImageTGA = NULL; // deletes image - mCachedProcessedTexture = NULL; - mStaticImageRaw = NULL; - mNeedsCreateTexture = FALSE; -} - -BOOL LLTexLayerParamAlpha::getMultiplyBlend() const -{ - return ((LLTexLayerParamAlphaInfo *)getInfo())->mMultiplyBlend; -} - -void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL upload_bake) -{ - if (mIsAnimating || mTexLayer == NULL) - { - return; - } - F32 min_weight = getMinWeight(); - F32 max_weight = getMaxWeight(); - F32 new_weight = llclamp(weight, min_weight, max_weight); - U8 cur_u8 = F32_to_U8(mCurWeight, min_weight, max_weight); - U8 new_u8 = F32_to_U8(new_weight, min_weight, max_weight); - if (cur_u8 != new_u8) - { - mCurWeight = new_weight; - - if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param. - { - if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures()) - { - upload_bake = FALSE; - } - mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake); - mTexLayer->invalidateMorphMasks(); - } - } -} - -void LLTexLayerParamAlpha::setAnimationTarget(F32 target_value, BOOL upload_bake) -{ - // do not animate dummy parameters - if (mIsDummy) - { - setWeight(target_value, upload_bake); - return; - } - - mTargetWeight = target_value; - setWeight(target_value, upload_bake); - mIsAnimating = TRUE; - if (mNext) - { - mNext->setAnimationTarget(target_value, upload_bake); - } -} - -void LLTexLayerParamAlpha::animate(F32 delta, BOOL upload_bake) -{ - if (mNext) - { - mNext->animate(delta, upload_bake); - } -} - -BOOL LLTexLayerParamAlpha::getSkip() const -{ - if (!mTexLayer) - { - return TRUE; - } - - const LLVOAvatar *avatar = mTexLayer->getTexLayerSet()->getAvatar(); - - if (((LLTexLayerParamAlphaInfo *)getInfo())->mSkipIfZeroWeight) - { - F32 effective_weight = (avatar->getSex() & getSex()) ? mCurWeight : getDefaultWeight(); - if (is_approx_zero(effective_weight)) - { - return TRUE; - } - } - - LLWearableType::EType type = (LLWearableType::EType)getWearableType(); - if ((type != LLWearableType::WT_INVALID) && !avatar->isWearingWearableType(type)) - { - return TRUE; - } - - return FALSE; -} - - -BOOL LLTexLayerParamAlpha::render(S32 x, S32 y, S32 width, S32 height) -{ - BOOL success = TRUE; - - if (!mTexLayer) - { - return success; - } - - F32 effective_weight = (mTexLayer->getTexLayerSet()->getAvatar()->getSex() & getSex()) ? mCurWeight : getDefaultWeight(); - BOOL weight_changed = effective_weight != mCachedEffectiveWeight; - if (getSkip()) - { - return success; - } - - LLTexLayerParamAlphaInfo *info = (LLTexLayerParamAlphaInfo *)getInfo(); - gGL.flush(); - if (info->mMultiplyBlend) - { - gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO); // Multiplication: approximates a min() function - } - else - { - gGL.setSceneBlendType(LLRender::BT_ADD); // Addition: approximates a max() function - } - - if (!info->mStaticImageFileName.empty() && !mStaticImageInvalid) - { - if (mStaticImageTGA.isNull()) - { - // Don't load the image file until we actually need it the first time. Like now. - mStaticImageTGA = LLTexLayerStaticImageList::getInstance()->getImageTGA(info->mStaticImageFileName); - // We now have something in one of our caches - LLTexLayerSet::sHasCaches |= mStaticImageTGA.notNull() ? TRUE : FALSE; - - if (mStaticImageTGA.isNull()) - { - llwarns << "Unable to load static file: " << info->mStaticImageFileName << llendl; - mStaticImageInvalid = TRUE; // don't try again. - return FALSE; - } - } - - const S32 image_tga_width = mStaticImageTGA->getWidth(); - const S32 image_tga_height = mStaticImageTGA->getHeight(); - if (!mCachedProcessedTexture || - (mCachedProcessedTexture->getWidth() != image_tga_width) || - (mCachedProcessedTexture->getHeight() != image_tga_height) || - (weight_changed)) - { -// llinfos << "Building Cached Alpha: " << mName << ": (" << mStaticImageRaw->getWidth() << ", " << mStaticImageRaw->getHeight() << ") " << effective_weight << llendl; - mCachedEffectiveWeight = effective_weight; - - if (!mCachedProcessedTexture) - { - mCachedProcessedTexture = LLViewerTextureManager::getLocalTexture(image_tga_width, image_tga_height, 1, FALSE); - - // We now have something in one of our caches - LLTexLayerSet::sHasCaches |= mCachedProcessedTexture ? TRUE : FALSE; - - mCachedProcessedTexture->setExplicitFormat(GL_ALPHA8, GL_ALPHA); - } - - // Applies domain and effective weight to data as it is decoded. Also resizes the raw image if needed. - mStaticImageRaw = NULL; - mStaticImageRaw = new LLImageRaw; - mStaticImageTGA->decodeAndProcess(mStaticImageRaw, info->mDomain, effective_weight); - mNeedsCreateTexture = TRUE; - } - - if (mCachedProcessedTexture) - { - { - // Create the GL texture, and then hang onto it for future use. - if (mNeedsCreateTexture) - { - mCachedProcessedTexture->createGLTexture(0, mStaticImageRaw); - mNeedsCreateTexture = FALSE; - gGL.getTexUnit(0)->bind(mCachedProcessedTexture); - mCachedProcessedTexture->setAddressMode(LLTexUnit::TAM_CLAMP); - } - - LLGLSNoAlphaTest gls_no_alpha_test; - gGL.getTexUnit(0)->bind(mCachedProcessedTexture); - gl_rect_2d_simple_tex(width, height); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - stop_glerror(); - } - } - - // Don't keep the cache for other people's avatars - // (It's not really a "cache" in that case, but the logic is the same) - if (!mAvatar->isSelf()) - { - mCachedProcessedTexture = NULL; - } - } - else - { - LLGLDisable no_alpha(GL_ALPHA_TEST); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.color4f(0.f, 0.f, 0.f, effective_weight); - gl_rect_2d_simple(width, height); - } - - return success; -} - -//----------------------------------------------------------------------------- -// LLTexLayerParamAlphaInfo -//----------------------------------------------------------------------------- -LLTexLayerParamAlphaInfo::LLTexLayerParamAlphaInfo() : - mMultiplyBlend(FALSE), - mSkipIfZeroWeight(FALSE), - mDomain(0.f) -{ -} - -BOOL LLTexLayerParamAlphaInfo::parseXml(LLXmlTreeNode* node) -{ - llassert(node->hasName("param") && node->getChildByName("param_alpha")); - - if (!LLViewerVisualParamInfo::parseXml(node)) - return FALSE; - - LLXmlTreeNode* param_alpha_node = node->getChildByName("param_alpha"); - if (!param_alpha_node) - { - return FALSE; - } - - static LLStdStringHandle tga_file_string = LLXmlTree::addAttributeString("tga_file"); - if (param_alpha_node->getFastAttributeString(tga_file_string, mStaticImageFileName)) - { - // Don't load the image file until it's actually needed. - } -// else -// { -// llwarns << "<param_alpha> element is missing tga_file attribute." << llendl; -// } - - static LLStdStringHandle multiply_blend_string = LLXmlTree::addAttributeString("multiply_blend"); - param_alpha_node->getFastAttributeBOOL(multiply_blend_string, mMultiplyBlend); - - static LLStdStringHandle skip_if_zero_string = LLXmlTree::addAttributeString("skip_if_zero"); - param_alpha_node->getFastAttributeBOOL(skip_if_zero_string, mSkipIfZeroWeight); - - static LLStdStringHandle domain_string = LLXmlTree::addAttributeString("domain"); - param_alpha_node->getFastAttributeF32(domain_string, mDomain); - - return TRUE; -} - - - - -LLTexLayerParamColor::LLTexLayerParamColor(LLTexLayerInterface* layer) : - LLTexLayerParam(layer), - mAvgDistortionVec(1.f, 1.f, 1.f) -{ -} - -LLTexLayerParamColor::LLTexLayerParamColor(LLVOAvatar *avatar) : - LLTexLayerParam(avatar), - mAvgDistortionVec(1.f, 1.f, 1.f) -{ -} - -LLTexLayerParamColor::~LLTexLayerParamColor() -{ -} - -/*virtual*/ LLViewerVisualParam* LLTexLayerParamColor::cloneParam(LLWearable* wearable) const -{ - LLTexLayerParamColor *new_param = new LLTexLayerParamColor(mTexLayer); - *new_param = *this; - return new_param; -} - -LLColor4 LLTexLayerParamColor::getNetColor() const -{ - const LLTexLayerParamColorInfo *info = (LLTexLayerParamColorInfo *)getInfo(); - - llassert(info->mNumColors >= 1); - - F32 effective_weight = (mAvatar && (mAvatar->getSex() & getSex())) ? mCurWeight : getDefaultWeight(); - - S32 index_last = info->mNumColors - 1; - F32 scaled_weight = effective_weight * index_last; - S32 index_start = (S32) scaled_weight; - S32 index_end = index_start + 1; - if (index_start == index_last) - { - return info->mColors[index_last]; - } - else - { - F32 weight = scaled_weight - index_start; - const LLColor4 *start = &info->mColors[ index_start ]; - const LLColor4 *end = &info->mColors[ index_end ]; - return LLColor4((1.f - weight) * start->mV[VX] + weight * end->mV[VX], - (1.f - weight) * start->mV[VY] + weight * end->mV[VY], - (1.f - weight) * start->mV[VZ] + weight * end->mV[VZ], - (1.f - weight) * start->mV[VW] + weight * end->mV[VW]); - } -} - -void LLTexLayerParamColor::setWeight(F32 weight, BOOL upload_bake) -{ - if (mIsAnimating) - { - return; - } - - const LLTexLayerParamColorInfo *info = (LLTexLayerParamColorInfo *)getInfo(); - F32 min_weight = getMinWeight(); - F32 max_weight = getMaxWeight(); - F32 new_weight = llclamp(weight, min_weight, max_weight); - U8 cur_u8 = F32_to_U8(mCurWeight, min_weight, max_weight); - U8 new_u8 = F32_to_U8(new_weight, min_weight, max_weight); - if (cur_u8 != new_u8) - { - mCurWeight = new_weight; - - if (info->mNumColors <= 0) - { - // This will happen when we set the default weight the first time. - return; - } - - if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param. - { - onGlobalColorChanged(upload_bake); - if (mTexLayer) - { - mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake); - } - } - -// llinfos << "param " << mName << " = " << new_weight << llendl; - } -} - -void LLTexLayerParamColor::setAnimationTarget(F32 target_value, BOOL upload_bake) -{ - // set value first then set interpolating flag to ignore further updates - mTargetWeight = target_value; - setWeight(target_value, upload_bake); - mIsAnimating = TRUE; - if (mNext) - { - mNext->setAnimationTarget(target_value, upload_bake); - } -} - -void LLTexLayerParamColor::animate(F32 delta, BOOL upload_bake) -{ - if (mNext) - { - mNext->animate(delta, upload_bake); - } -} - -//----------------------------------------------------------------------------- -// LLTexLayerParamColorInfo -//----------------------------------------------------------------------------- -LLTexLayerParamColorInfo::LLTexLayerParamColorInfo() : - mOperation(LLTexLayerParamColor::OP_ADD), - mNumColors(0) -{ -} - -BOOL LLTexLayerParamColorInfo::parseXml(LLXmlTreeNode *node) -{ - llassert(node->hasName("param") && node->getChildByName("param_color")); - - if (!LLViewerVisualParamInfo::parseXml(node)) - return FALSE; - - LLXmlTreeNode* param_color_node = node->getChildByName("param_color"); - if (!param_color_node) - { - return FALSE; - } - - std::string op_string; - static LLStdStringHandle operation_string = LLXmlTree::addAttributeString("operation"); - if (param_color_node->getFastAttributeString(operation_string, op_string)) - { - LLStringUtil::toLower(op_string); - if (op_string == "add") mOperation = LLTexLayerParamColor::OP_ADD; - else if (op_string == "multiply") mOperation = LLTexLayerParamColor::OP_MULTIPLY; - else if (op_string == "blend") mOperation = LLTexLayerParamColor::OP_BLEND; - } - - mNumColors = 0; - - LLColor4U color4u; - for (LLXmlTreeNode* child = param_color_node->getChildByName("value"); - child; - child = param_color_node->getNextNamedChild()) - { - if ((mNumColors < MAX_COLOR_VALUES)) - { - static LLStdStringHandle color_string = LLXmlTree::addAttributeString("color"); - if (child->getFastAttributeColor4U(color_string, color4u)) - { - mColors[ mNumColors ].setVec(color4u); - mNumColors++; - } - } - } - if (!mNumColors) - { - llwarns << "<param_color> is missing <value> sub-elements" << llendl; - return FALSE; - } - - if ((mOperation == LLTexLayerParamColor::OP_BLEND) && (mNumColors != 1)) - { - llwarns << "<param_color> with operation\"blend\" must have exactly one <value>" << llendl; - return FALSE; - } - - return TRUE; -} diff --git a/indra/newview/lltexlayerparams.h b/indra/newview/lltexlayerparams.h deleted file mode 100644 index c812199796..0000000000 --- a/indra/newview/lltexlayerparams.h +++ /dev/null @@ -1,217 +0,0 @@ -/** - * @file lltexlayerparams.h - * @brief Texture layer parameters, used by lltexlayer. - * - * $LicenseInfo:firstyear=2002&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$ - */ - -#ifndef LL_LLTEXLAYERPARAMS_H -#define LL_LLTEXLAYERPARAMS_H - -#include "llviewervisualparam.h" - -class LLImageRaw; -class LLImageTGA; -class LLTexLayer; -class LLTexLayerInterface; -class LLViewerTexture; -class LLVOAvatar; -class LLWearable; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerParam -// -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLTexLayerParam : public LLViewerVisualParam -{ -public: - LLTexLayerParam(LLTexLayerInterface *layer); - LLTexLayerParam(LLVOAvatar *avatar); - /*virtual*/ BOOL setInfo(LLViewerVisualParamInfo *info, BOOL add_to_avatar ); - /*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const = 0; - -protected: - LLTexLayerInterface* mTexLayer; - LLVOAvatar* mAvatar; -}; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerParamAlpha -// -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -LL_ALIGN_PREFIX(16) -class LLTexLayerParamAlpha : public LLTexLayerParam -{ -public: - LLTexLayerParamAlpha( LLTexLayerInterface* layer ); - LLTexLayerParamAlpha( LLVOAvatar* avatar ); - /*virtual*/ ~LLTexLayerParamAlpha(); - - void* operator new(size_t size) - { - return ll_aligned_malloc_16(size); - } - - void operator delete(void* ptr) - { - ll_aligned_free_16(ptr); - } - - /*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable = NULL) const; - - // LLVisualParam Virtual functions - ///*virtual*/ BOOL parseData(LLXmlTreeNode* node); - /*virtual*/ void apply( ESex avatar_sex ) {} - /*virtual*/ void setWeight(F32 weight, BOOL upload_bake); - /*virtual*/ void setAnimationTarget(F32 target_value, BOOL upload_bake); - /*virtual*/ void animate(F32 delta, BOOL upload_bake); - - // LLViewerVisualParam Virtual functions - /*virtual*/ F32 getTotalDistortion() { return 1.f; } - /*virtual*/ const LLVector4a& getAvgDistortion() { return mAvgDistortionVec; } - /*virtual*/ F32 getMaxDistortion() { return 3.f; } - /*virtual*/ LLVector4a getVertexDistortion(S32 index, LLPolyMesh *poly_mesh) { return LLVector4a(1.f, 1.f, 1.f);} - /*virtual*/ const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return &mAvgDistortionVec;}; - /*virtual*/ const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return NULL;}; - - // New functions - BOOL render( S32 x, S32 y, S32 width, S32 height ); - BOOL getSkip() const; - void deleteCaches(); - BOOL getMultiplyBlend() const; - -private: - LLPointer<LLViewerTexture> mCachedProcessedTexture; - LLPointer<LLImageTGA> mStaticImageTGA; - LLPointer<LLImageRaw> mStaticImageRaw; - BOOL mNeedsCreateTexture; - BOOL mStaticImageInvalid; - LL_ALIGN_16(LLVector4a mAvgDistortionVec); - F32 mCachedEffectiveWeight; - -public: - // Global list of instances for gathering statistics - static void dumpCacheByteCount(); - static void getCacheByteCount( S32* gl_bytes ); - - typedef std::list< LLTexLayerParamAlpha* > param_alpha_ptr_list_t; - static param_alpha_ptr_list_t sInstances; -} LL_ALIGN_POSTFIX(16); -class LLTexLayerParamAlphaInfo : public LLViewerVisualParamInfo -{ - friend class LLTexLayerParamAlpha; -public: - LLTexLayerParamAlphaInfo(); - /*virtual*/ ~LLTexLayerParamAlphaInfo() {}; - - /*virtual*/ BOOL parseXml(LLXmlTreeNode* node); - -private: - std::string mStaticImageFileName; - BOOL mMultiplyBlend; - BOOL mSkipIfZeroWeight; - F32 mDomain; -}; -// -// LLTexLayerParamAlpha -//----------------------------------------------------------------------------- - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLTexLayerParamColor -// -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -LL_ALIGN_PREFIX(16) -class LLTexLayerParamColor : public LLTexLayerParam -{ -public: - enum EColorOperation - { - OP_ADD = 0, - OP_MULTIPLY = 1, - OP_BLEND = 2, - OP_COUNT = 3 // Number of operations - }; - - LLTexLayerParamColor( LLTexLayerInterface* layer ); - LLTexLayerParamColor( LLVOAvatar* avatar ); - - void* operator new(size_t size) - { - return ll_aligned_malloc_16(size); - } - - void operator delete(void* ptr) - { - ll_aligned_free_16(ptr); - } - - /* virtual */ ~LLTexLayerParamColor(); - - /*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable = NULL) const; - - // LLVisualParam Virtual functions - ///*virtual*/ BOOL parseData(LLXmlTreeNode* node); - /*virtual*/ void apply( ESex avatar_sex ) {} - /*virtual*/ void setWeight(F32 weight, BOOL upload_bake); - /*virtual*/ void setAnimationTarget(F32 target_value, BOOL upload_bake); - /*virtual*/ void animate(F32 delta, BOOL upload_bake); - - - // LLViewerVisualParam Virtual functions - /*virtual*/ F32 getTotalDistortion() { return 1.f; } - /*virtual*/ const LLVector4a& getAvgDistortion() { return mAvgDistortionVec; } - /*virtual*/ F32 getMaxDistortion() { return 3.f; } - /*virtual*/ LLVector4a getVertexDistortion(S32 index, LLPolyMesh *poly_mesh) { return LLVector4a(1.f, 1.f, 1.f); } - /*virtual*/ const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return &mAvgDistortionVec;}; - /*virtual*/ const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return NULL;}; - - // New functions - LLColor4 getNetColor() const; -protected: - virtual void onGlobalColorChanged(bool upload_bake) {} -private: - LL_ALIGN_16(LLVector4a mAvgDistortionVec); -} LL_ALIGN_POSTFIX(16); - -class LLTexLayerParamColorInfo : public LLViewerVisualParamInfo -{ - friend class LLTexLayerParamColor; - -public: - LLTexLayerParamColorInfo(); - virtual ~LLTexLayerParamColorInfo() {}; - BOOL parseXml( LLXmlTreeNode* node ); - LLTexLayerParamColor::EColorOperation getOperation() const { return mOperation; } -private: - enum { MAX_COLOR_VALUES = 20 }; - LLTexLayerParamColor::EColorOperation mOperation; - LLColor4 mColors[MAX_COLOR_VALUES]; - S32 mNumColors; -}; - -typedef std::vector<LLTexLayerParamColor *> param_color_list_t; -typedef std::vector<LLTexLayerParamAlpha *> param_alpha_list_t; -typedef std::vector<LLTexLayerParamColorInfo *> param_color_info_list_t; -typedef std::vector<LLTexLayerParamAlphaInfo *> param_alpha_info_list_t; - -#endif diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 007eb8e33f..e2d0fdf357 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -571,8 +571,8 @@ void LLFloaterTexturePicker::draw() mTexturep = NULL; if(mImageAssetID.notNull()) { - mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES); - mTexturep->setBoostLevel(LLViewerTexture::BOOST_PREVIEW); + mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID); + mTexturep->setBoostLevel(LLGLTexture::BOOST_PREVIEW); } if (mTentativeLabel) @@ -1442,9 +1442,9 @@ void LLTextureCtrl::draw() } else if (!mImageAssetID.isNull()) { - LLPointer<LLViewerFetchedTexture> texture = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES,LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + LLPointer<LLViewerFetchedTexture> texture = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES,LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); - texture->setBoostLevel(LLViewerTexture::BOOST_PREVIEW); + texture->setBoostLevel(LLGLTexture::BOOST_PREVIEW); texture->forceToSaveRawImage(0) ; mTexturep = texture; diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 7de66b139f..6173e76a35 100755 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -389,7 +389,8 @@ public: virtual void onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response); protected: - LLTextureFetchWorker(LLTextureFetch* fetcher, const std::string& url, const LLUUID& id, const LLHost& host, + LLTextureFetchWorker(LLTextureFetch* fetcher, FTType f_type, + const std::string& url, const LLUUID& id, const LLHost& host, F32 priority, S32 discard, S32 size); private: @@ -501,11 +502,13 @@ private: }; static const char* sStateDescs[]; e_state mState; + void setState(e_state new_state); e_write_to_cache_state mWriteToCacheState; LLTextureFetch* mFetcher; LLPointer<LLImageFormatted> mFormattedImage; LLPointer<LLImageRaw> mRawImage; LLPointer<LLImageRaw> mAuxImage; + FTType mFTType; LLUUID mID; LLHost mHost; std::string mUrl; @@ -827,6 +830,7 @@ volatile bool LLTextureFetch::svMetricsDataBreak(true); // Start with a data bre // called from MAIN THREAD LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher, + FTType f_type, // Fetched image type const std::string& url, // Optional URL const LLUUID& id, // Image UUID const LLHost& host, // Simulator host @@ -838,6 +842,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher, mState(INIT), mWriteToCacheState(NOT_WRITE), mFetcher(fetcher), + mFTType(f_type), mID(id), mHost(host), mUrl(url), @@ -1024,7 +1029,7 @@ void LLTextureFetchWorker::setDesiredDiscard(S32 discard, S32 size) mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE); if ((prioritize && mState == INIT) || mState == DONE) { - mState = INIT; + setState(INIT); U32 work_priority = mWorkPriority | LLWorkerThread::PRIORITY_HIGH; setPriority(work_priority); } @@ -1088,12 +1093,14 @@ bool LLTextureFetchWorker::doWork(S32 param) { if (mState == INIT || mState == LOAD_FROM_NETWORK || mState == LOAD_FROM_SIMULATOR) { + LL_DEBUGS("Texture") << mID << " abort: mImagePriority < F_ALMOST_ZERO" << llendl; return true; // abort } } if(mState > CACHE_POST && !mCanUseNET && !mCanUseHTTP) { //nowhere to get data, abort. + LL_WARNS("Texture") << mID << " abort, nowhere to get data" << llendl; return true ; } @@ -1136,7 +1143,7 @@ bool LLTextureFetchWorker::doWork(S32 param) clearPackets(); // TODO: Shouldn't be necessary mCacheReadHandle = LLTextureCache::nullHandle(); mCacheWriteHandle = LLTextureCache::nullHandle(); - mState = LOAD_FROM_TEXTURE_CACHE; + setState(LOAD_FROM_TEXTURE_CACHE); mInCache = FALSE; mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE); // min desired size is TEXTURE_CACHE_ENTRY_SIZE LL_DEBUGS("Texture") << mID << ": Priority: " << llformat("%8.0f",mImagePriority) @@ -1153,7 +1160,7 @@ bool LLTextureFetchWorker::doWork(S32 param) S32 size = mDesiredSize - offset; if (size <= 0) { - mState = CACHE_POST; + setState(CACHE_POST); return false; } mFileSize = 0; @@ -1171,6 +1178,8 @@ bool LLTextureFetchWorker::doWork(S32 param) offset, size, responder); mCacheReadTimer.reset(); } +/* SH-3980 - disabling caching of server bakes until we can fix the blurring problems */ +/* else if ((mUrl.empty()||mFTType==FTT_SERVER_BAKE) && mFetcher->canLoadFromCache()) */ else if (mUrl.empty() && mFetcher->canLoadFromCache()) { setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it @@ -1183,18 +1192,13 @@ bool LLTextureFetchWorker::doWork(S32 param) } else if(!mUrl.empty() && mCanUseHTTP) { - if (!(mUrl.compare(0, 7, "http://") == 0)) - { - // *TODO:?remove this warning - llwarns << "Unknown URL Type: " << mUrl << llendl; - } setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); - mState = WAIT_HTTP_RESOURCE; + setState(WAIT_HTTP_RESOURCE); } else { setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); - mState = LOAD_FROM_NETWORK; + setState(LOAD_FROM_NETWORK); } } @@ -1204,7 +1208,7 @@ bool LLTextureFetchWorker::doWork(S32 param) if (mFetcher->mTextureCache->readComplete(mCacheReadHandle, false)) { mCacheReadHandle = LLTextureCache::nullHandle(); - mState = CACHE_POST; + setState(CACHE_POST); // fall through } else @@ -1212,6 +1216,7 @@ bool LLTextureFetchWorker::doWork(S32 param) // //This should never happen // + LL_DEBUGS("Texture") << mID << " this should never happen" << llendl; return false; } } @@ -1230,7 +1235,12 @@ bool LLTextureFetchWorker::doWork(S32 param) // we have enough data, decode it llassert_always(mFormattedImage->getDataSize() > 0); mLoadedDiscard = mDesiredDiscard; - mState = DECODE_IMAGE; + if (mLoadedDiscard < 0) + { + LL_WARNS("Texture") << mID << " mLoadedDiscard is " << mLoadedDiscard + << ", should be >=0" << llendl; + } + setState(DECODE_IMAGE); mInCache = TRUE; mWriteToCacheState = NOT_WRITE ; LL_DEBUGS("Texture") << mID << ": Cached. Bytes: " << mFormattedImage->getDataSize() @@ -1243,13 +1253,14 @@ bool LLTextureFetchWorker::doWork(S32 param) if (mUrl.compare(0, 7, "file://") == 0) { // failed to load local file, we're done. + LL_WARNS("Texture") << mID << ": abort, failed to load local file " << mUrl << LL_ENDL; return true; } // need more data else { LL_DEBUGS("Texture") << mID << ": Not in Cache" << LL_ENDL; - mState = LOAD_FROM_NETWORK; + setState(LOAD_FROM_NETWORK); } // fall through @@ -1290,9 +1301,15 @@ bool LLTextureFetchWorker::doWork(S32 param) mCanUseHTTP = false; } } +#if 0 /* SH-3980 - disabling caching of server bakes until we can fix the blurring problems */ + if (mFTType == FTT_SERVER_BAKE) + { + mWriteToCacheState = CAN_WRITE; + } +#endif if (mCanUseHTTP && !mUrl.empty()) { - mState = WAIT_HTTP_RESOURCE; + setState(WAIT_HTTP_RESOURCE); setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); if(mWriteToCacheState != NOT_WRITE) { @@ -1322,6 +1339,8 @@ bool LLTextureFetchWorker::doWork(S32 param) //mFetcher->addToNetworkQueue(this); //recordTextureStart(false); //setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); + + LL_DEBUGS("Texture") << mID << " does this happen?" << llendl; return false; } } @@ -1340,10 +1359,16 @@ bool LLTextureFetchWorker::doWork(S32 param) { // processSimulatorPackets() failed // llwarns << "processSimulatorPackets() failed to load buffer" << llendl; + LL_WARNS("Texture") << mID << " processSimulatorPackets() failed to load buffer" << llendl; return true; // failed } setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); - mState = DECODE_IMAGE; + if (mLoadedDiscard < 0) + { + LL_WARNS("Texture") << mID << " mLoadedDiscard is " << mLoadedDiscard + << ", should be >=0" << llendl; + } + setState(DECODE_IMAGE); mWriteToCacheState = SHOULD_WRITE; recordTextureDone(false); } @@ -1367,14 +1392,14 @@ bool LLTextureFetchWorker::doWork(S32 param) // Otherwise, advance into the HTTP states. if (mFetcher->getHttpWaitersCount() || ! acquireHttpSemaphore()) { - mState = WAIT_HTTP_RESOURCE2; + setState(WAIT_HTTP_RESOURCE2); setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); mFetcher->addHttpWaiter(this->mID); ++mResourceWaitCount; return false; } - mState = SEND_HTTP_REQ; + setState(SEND_HTTP_REQ); // *NOTE: You must invoke releaseHttpSemaphore() if you transition // to a state other than SEND_HTTP_REQ or WAIT_HTTP_REQ or abort // the request. @@ -1391,6 +1416,7 @@ bool LLTextureFetchWorker::doWork(S32 param) if (! mCanUseHTTP) { releaseHttpSemaphore(); + LL_WARNS("Texture") << mID << " abort: SEND_HTTP_REQ but !mCanUseHTTP" << llendl; return true; // abort } @@ -1407,13 +1433,19 @@ bool LLTextureFetchWorker::doWork(S32 param) // We already have all the data, just decode it mLoadedDiscard = mFormattedImage->getDiscardLevel(); setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); - mState = DECODE_IMAGE; + if (mLoadedDiscard < 0) + { + LL_WARNS("Texture") << mID << " mLoadedDiscard is " << mLoadedDiscard + << ", should be >=0" << llendl; + } + setState(DECODE_IMAGE); releaseHttpSemaphore(); return false; } else { releaseHttpSemaphore(); + LL_WARNS("Texture") << mID << " SEND_HTTP_REQ abort: cur_size " << cur_size << " <=0" << llendl; return true; // abort. } } @@ -1471,7 +1503,7 @@ bool LLTextureFetchWorker::doWork(S32 param) mFetcher->addToHTTPQueue(mID); recordTextureStart(true); setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); - mState = WAIT_HTTP_REQ; + setState(WAIT_HTTP_REQ); // fall through } @@ -1489,8 +1521,9 @@ bool LLTextureFetchWorker::doWork(S32 param) { if(mWriteToCacheState == NOT_WRITE) //map tiles { - mState = DONE; + setState(DONE); releaseHttpSemaphore(); + LL_DEBUGS("Texture") << mID << " abort: WAIT_HTTP_REQ not found" << llendl; return true; // failed, means no map tile on the empty region. } @@ -1499,7 +1532,7 @@ bool LLTextureFetchWorker::doWork(S32 param) // roll back to try UDP if (mCanUseNET) { - mState = INIT; + setState(INIT); mCanUseHTTP = false; mUrl.clear(); setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); @@ -1530,15 +1563,21 @@ bool LLTextureFetchWorker::doWork(S32 param) // Use available data mLoadedDiscard = mFormattedImage->getDiscardLevel(); setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); - mState = DECODE_IMAGE; + if (mLoadedDiscard < 0) + { + LL_WARNS("Texture") << mID << " mLoadedDiscard is " << mLoadedDiscard + << ", should be >=0" << llendl; + } + setState(DECODE_IMAGE); releaseHttpSemaphore(); return false; } // Fail harder resetFormattedData(); - mState = DONE; + setState(DONE); releaseHttpSemaphore(); + LL_WARNS("Texture") << mID << " abort: fail harder" << llendl; return true; // failed } @@ -1547,6 +1586,7 @@ bool LLTextureFetchWorker::doWork(S32 param) // next time the texture is requested, even if the data have already been fetched. if(mWriteToCacheState != NOT_WRITE) { + // Why do we want to keep url if NOT_WRITE - is this a proxy for map tiles? mUrl.clear(); } @@ -1560,7 +1600,8 @@ bool LLTextureFetchWorker::doWork(S32 param) } // abort. - mState = DONE; + setState(DONE); + LL_WARNS("Texture") << mID << " abort: no data received" << llendl; releaseHttpSemaphore(); return true; } @@ -1578,7 +1619,7 @@ bool LLTextureFetchWorker::doWork(S32 param) { LL_WARNS("Texture") << "Partial HTTP response produces break in image data for texture " << mID << ". Aborting load." << LL_ENDL; - mState = DONE; + setState(DONE); releaseHttpSemaphore(); return true; } @@ -1626,7 +1667,12 @@ bool LLTextureFetchWorker::doWork(S32 param) mHttpReplyOffset = 0; mLoadedDiscard = mRequestedDiscard; - mState = DECODE_IMAGE; + if (mLoadedDiscard < 0) + { + LL_WARNS("Texture") << mID << " mLoadedDiscard is " << mLoadedDiscard + << ", should be >=0" << llendl; + } + setState(DECODE_IMAGE); if (mWriteToCacheState != NOT_WRITE) { mWriteToCacheState = SHOULD_WRITE ; @@ -1657,31 +1703,34 @@ bool LLTextureFetchWorker::doWork(S32 param) if (textures_decode_disabled) { // for debug use, don't decode - mState = DONE; + setState(DONE); return true; } if (mDesiredDiscard < 0) { // We aborted, don't decode - mState = DONE; + setState(DONE); + LL_DEBUGS("Texture") << mID << " DECODE_IMAGE abort: desired discard " << mDesiredDiscard << "<0" << llendl; return true; } if (mFormattedImage->getDataSize() <= 0) { - //llerrs << "Decode entered with invalid mFormattedImage. ID = " << mID << llendl; + llwarns << "Decode entered with invalid mFormattedImage. ID = " << mID << llendl; //abort, don't decode - mState = DONE; + setState(DONE); + LL_DEBUGS("Texture") << mID << " DECODE_IMAGE abort: (mFormattedImage->getDataSize() <= 0)" << llendl; return true; } if (mLoadedDiscard < 0) { - //llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl; + llwarns << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl; //abort, don't decode - mState = DONE; + setState(DONE); + LL_DEBUGS("Texture") << mID << " DECODE_IMAGE abort: mLoadedDiscard < 0" << llendl; return true; } @@ -1691,7 +1740,7 @@ bool LLTextureFetchWorker::doWork(S32 param) S32 discard = mHaveAllData ? 0 : mLoadedDiscard; U32 image_priority = LLWorkerThread::PRIORITY_NORMAL | mWorkPriority; mDecoded = FALSE; - mState = DECODE_IMAGE_UPDATE; + setState(DECODE_IMAGE_UPDATE); LL_DEBUGS("Texture") << mID << ": Decoding. Bytes: " << mFormattedImage->getDataSize() << " Discard: " << discard << " All Data: " << mHaveAllData << LL_ENDL; mDecodeHandle = mFetcher->mImageDecodeThread->decodeImage(mFormattedImage, image_priority, discard, mNeedsAux, @@ -1719,13 +1768,13 @@ bool LLTextureFetchWorker::doWork(S32 param) mFormattedImage = NULL; ++mRetryAttempt; setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); - mState = INIT; + setState(INIT); return false; } else { // llwarns << "UNABLE TO LOAD TEXTURE: " << mID << " RETRIES: " << mRetryAttempt << llendl; - mState = DONE; // failed + setState(DONE); // failed } } else @@ -1734,7 +1783,7 @@ bool LLTextureFetchWorker::doWork(S32 param) LL_DEBUGS("Texture") << mID << ": Decoded. Discard: " << mDecodedDiscard << " Raw Image: " << llformat("%dx%d",mRawImage->getWidth(),mRawImage->getHeight()) << LL_ENDL; setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); - mState = WRITE_TO_CACHE; + setState(WRITE_TO_CACHE); } // fall through } @@ -1750,7 +1799,7 @@ bool LLTextureFetchWorker::doWork(S32 param) { // If we're in a local cache or we didn't actually receive any new data, // or we failed to load anything, skip - mState = DONE; + setState(DONE); return false; } S32 datasize = mFormattedImage->getDataSize(); @@ -1769,7 +1818,7 @@ bool LLTextureFetchWorker::doWork(S32 param) setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it U32 cache_priority = mWorkPriority; mWritten = FALSE; - mState = WAIT_ON_WRITE; + setState(WAIT_ON_WRITE); ++mCacheWriteCount; CacheWriteResponder* responder = new CacheWriteResponder(mFetcher, mID); mCacheWriteHandle = mFetcher->mTextureCache->writeToCache(mID, cache_priority, @@ -1782,7 +1831,7 @@ bool LLTextureFetchWorker::doWork(S32 param) { if (writeToCacheComplete()) { - mState = DONE; + setState(DONE); // fall through } else @@ -1803,7 +1852,10 @@ bool LLTextureFetchWorker::doWork(S32 param) if (mDecodedDiscard >= 0 && mDesiredDiscard < mDecodedDiscard) { // More data was requested, return to INIT - mState = INIT; + setState(INIT); + LL_DEBUGS("Texture") << mID << " more data requested, returning to INIT: " + << " mDecodedDiscard " << mDecodedDiscard << ">= 0 && mDesiredDiscard " << mDesiredDiscard + << "<" << " mDecodedDiscard " << mDecodedDiscard << llendl; setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); return false; } @@ -1843,7 +1895,7 @@ void LLTextureFetchWorker::onCompleted(LLCore::HttpHandle handle, LLCore::HttpRe bool partial = false; LLCore::HttpStatus status(response->getStatus()); - lldebugs << "HTTP COMPLETE: " << mID + LL_DEBUGS("Texture") << "HTTP COMPLETE: " << mID << " status: " << status.toHex() << " '" << status.toString() << "'" << llendl; @@ -2401,7 +2453,7 @@ LLTextureFetch::~LLTextureFetch() // ~LLQueuedThread() called here } -bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, const LLHost& host, F32 priority, +bool LLTextureFetch::createRequest(FTType f_type, const std::string& url, const LLUUID& id, const LLHost& host, F32 priority, S32 w, S32 h, S32 c, S32 desired_discard, bool needs_aux, bool can_use_http) { if(mFetcherLocked) @@ -2430,6 +2482,7 @@ bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, con std::string exten = gDirUtilp->getExtension(url); if (!url.empty() && (!exten.empty() && LLImageBase::getCodecFromExtension(exten) != IMG_CODEC_J2C)) { + LL_DEBUGS("Texture") << "full request for " << id << " exten is not J2C: " << exten << llendl; // Only do partial requests for J2C at the moment desired_size = MAX_IMAGE_DATA_SIZE; desired_discard = 0; @@ -2472,7 +2525,7 @@ bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, con worker->setCanUseHTTP(can_use_http) ; if (!worker->haveWork()) { - worker->mState = LLTextureFetchWorker::INIT; + worker->setState(LLTextureFetchWorker::INIT); worker->unlockWorkMutex(); // -Mw worker->addWork(0, LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority); @@ -2484,7 +2537,7 @@ bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, con } else { - worker = new LLTextureFetchWorker(this, url, id, host, priority, desired_discard, desired_size); + worker = new LLTextureFetchWorker(this, f_type, url, id, host, priority, desired_discard, desired_size); lockQueue(); // +Mfq mRequestMap[id] = worker; unlockQueue(); // -Mfq @@ -2496,7 +2549,7 @@ bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, con worker->unlockWorkMutex(); // -Mw } -// llinfos << "REQUESTED: " << id << " Discard: " << desired_discard << llendl; + LL_DEBUGS("Texture") << "REQUESTED: " << id << " Discard: " << desired_discard << " size " << desired_size << llendl; return true; } @@ -3165,6 +3218,30 @@ bool LLTextureFetchWorker::insertPacket(S32 index, U8* data, S32 size) return true; } +void LLTextureFetchWorker::setState(e_state new_state) +{ + static const char* e_state_name[] = + { + "INVALID", + "INIT", + "LOAD_FROM_TEXTURE_CACHE", + "CACHE_POST", + "LOAD_FROM_NETWORK", + "LOAD_FROM_SIMULATOR", + "WAIT_HTTP_RESOURCE", + "WAIT_HTTP_RESOURCE2", + "SEND_HTTP_REQ", + "WAIT_HTTP_REQ", + "DECODE_IMAGE", + "DECODE_IMAGE_UPDATE", + "WRITE_TO_CACHE", + "WAIT_ON_WRITE", + "DONE" + }; + LL_DEBUGS("Texture") << "id: " << mID << " FTType: " << mFTType << " disc: " << mDesiredDiscard << " sz: " << mDesiredSize << " state: " << e_state_name[mState] << " => " << e_state_name[new_state] << llendl; + mState = new_state; +} + // Threads: T* bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8 codec, U16 packets, U32 totalbytes, U16 data_size, U8* data) @@ -3221,7 +3298,7 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8 llassert_always(data_size == FIRST_PACKET_SIZE || data_size == worker->mFileSize); res = worker->insertPacket(0, data, data_size); worker->setPriority(LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority); - worker->mState = LLTextureFetchWorker::LOAD_FROM_SIMULATOR; + worker->setState(LLTextureFetchWorker::LOAD_FROM_SIMULATOR); worker->unlockWorkMutex(); // -Mw return res; } @@ -3271,7 +3348,7 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1 (worker->mState == LLTextureFetchWorker::LOAD_FROM_NETWORK)) { worker->setPriority(LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority); - worker->mState = LLTextureFetchWorker::LOAD_FROM_SIMULATOR; + worker->setState(LLTextureFetchWorker::LOAD_FROM_SIMULATOR); } else { @@ -3534,7 +3611,7 @@ void LLTextureFetch::releaseHttpWaiters() break; } - worker->mState = LLTextureFetchWorker::SEND_HTTP_REQ; + worker->setState(LLTextureFetchWorker::SEND_HTTP_REQ); worker->setPriority(LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority); worker->unlockWorkMutex(); // -Mw diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h index 5ea3c14e1a..902a3d7a25 100644 --- a/indra/newview/lltexturefetch.h +++ b/indra/newview/lltexturefetch.h @@ -44,8 +44,8 @@ #include "httpoptions.h" #include "httpheaders.h" #include "httphandler.h" +#include "llviewertexture.h" -class LLViewerTexture; class LLTextureFetchWorker; class LLImageDecodeThread; class LLHost; @@ -77,7 +77,7 @@ public: void shutDownImageDecodeThread(); // Threads: T* (but Tmain mostly) - bool createRequest(const std::string& url, const LLUUID& id, const LLHost& host, F32 priority, + bool createRequest(FTType f_type, const std::string& url, const LLUUID& id, const LLHost& host, F32 priority, S32 w, S32 h, S32 c, S32 discard, bool needs_aux, bool can_use_http); // Requests that a fetch operation be deleted from the queue. diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 16c42dbd43..e80136b286 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -40,7 +40,7 @@ #include "lltooltip.h" #include "llappviewer.h" #include "llselectmgr.h" -#include "lltexlayer.h" +#include "llviewertexlayer.h" #include "lltexturecache.h" #include "lltexturefetch.h" #include "llviewercontrol.h" @@ -170,7 +170,7 @@ void LLTextureBar::draw() { color = LLColor4::green4; } - else if (mImagep->getBoostLevel() > LLViewerTexture::BOOST_NONE) + else if (mImagep->getBoostLevel() > LLGLTexture::BOOST_NONE) { color = LLColor4::magenta; } @@ -420,14 +420,14 @@ void LLAvatarTexBar::draw() LLColor4 color; U32 line_num = 1; - for (LLVOAvatarDefines::LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDefines::LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); - baked_iter != LLVOAvatarDefines::LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); + for (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); + baked_iter != LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); ++baked_iter) { - const LLVOAvatarDefines::EBakedTextureIndex baked_index = baked_iter->first; - const LLTexLayerSet *layerset = avatarp->debugGetLayerSet(baked_index); + const LLAvatarAppearanceDefines::EBakedTextureIndex baked_index = baked_iter->first; + const LLViewerTexLayerSet *layerset = avatarp->debugGetLayerSet(baked_index); if (!layerset) continue; - const LLTexLayerSetBuffer *layerset_buffer = layerset->getComposite(); + const LLViewerTexLayerSetBuffer *layerset_buffer = layerset->getViewerComposite(); if (!layerset_buffer) continue; LLColor4 text_color = LLColor4::white; diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index 4dc0d424ac..beb45e8179 100644 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -33,6 +33,7 @@ #include "llbutton.h" #include "lliconctrl.h" #include "llinventoryfunctions.h" +#include "llinventoryicon.h" #include "llnotifications.h" #include "llviewertexteditor.h" diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 4ef5ad845c..8bfde2bcf1 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -207,8 +207,6 @@ void LLToastNotifyPanel::adjustPanelForScriptNotice(S32 button_panel_width, S32 void LLToastNotifyPanel::adjustPanelForTipNotice() { - LLRect info_rect = mInfoPanel->getRect(); - LLRect this_rect = getRect(); //we don't need display ControlPanel for tips because they doesn't contain any buttons. mControlPanel->setVisible(FALSE); reshape(getRect().getWidth(), mInfoPanel->getRect().getHeight()); diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp index aba43a9715..08d82ea9cb 100644 --- a/indra/newview/lltoolbrush.cpp +++ b/indra/newview/lltoolbrush.cpp @@ -657,7 +657,7 @@ bool LLToolBrushLand::canTerraform(LLViewerRegion* regionp) const { if (!regionp) return false; if (regionp->canManageEstate()) return true; - return !(regionp->getRegionFlags() & REGION_FLAGS_BLOCK_TERRAFORM); + return !regionp->getRegionFlag(REGION_FLAGS_BLOCK_TERRAFORM); } // static diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp index 923fbecb1a..5270c3d33f 100644 --- a/indra/newview/lltoolcomp.cpp +++ b/indra/newview/lltoolcomp.cpp @@ -471,7 +471,7 @@ BOOL LLToolCompCreate::handleMouseDown(S32 x, S32 y, MASK mask) mObjectPlacedOnMouseDown = TRUE; - return TRUE; + return handled; } void LLToolCompCreate::pickCallback(const LLPickInfo& pick_info) diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 94c97158a8..e085834326 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1247,7 +1247,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target, if (!item || !item->isFinished()) return; //if (regionp - // && (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX)) + // && (regionp->getRegionFlag(REGION_FLAGS_SANDBOX))) //{ // LLFirstUse::useSandbox(); //} @@ -1741,7 +1741,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv( { if(mSource == SOURCE_LIBRARY) { - LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0); + LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, (LLViewerJointAttachment*)0)); copy_inventory_item( gAgent.getID(), item->getPermissions().getOwner(), @@ -2094,7 +2094,7 @@ EAcceptance LLToolDragAndDrop::dad3dActivateGesture( { // create item based on that one, and put it on if that // was a success. - LLPointer<LLInventoryCallback> cb = new ActivateGestureCallback(); + LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(activate_gesture_cb); copy_inventory_item( gAgent.getID(), item->getPermissions().getOwner(), diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp index a754d8ee7e..857b0f0714 100644 --- a/indra/newview/lltoolfocus.cpp +++ b/indra/newview/lltoolfocus.cpp @@ -314,8 +314,6 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask) S32 dx = gViewerWindow->getCurrentMouseDX(); S32 dy = gViewerWindow->getCurrentMouseDY(); - BOOL moved_outside_slop = FALSE; - if (hasMouseCapture() && mValidClickPoint) { mAccumX += llabs(dx); @@ -323,19 +321,11 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask) if (mAccumX >= SLOP_RANGE) { - if (!mOutsideSlopX) - { - moved_outside_slop = TRUE; - } mOutsideSlopX = TRUE; } if (mAccumY >= SLOP_RANGE) { - if (!mOutsideSlopY) - { - moved_outside_slop = TRUE; - } mOutsideSlopY = TRUE; } } diff --git a/indra/newview/lltoolgun.cpp b/indra/newview/lltoolgun.cpp index 857d105361..c1735adc9c 100644 --- a/indra/newview/lltoolgun.cpp +++ b/indra/newview/lltoolgun.cpp @@ -42,7 +42,7 @@ #include "llhudmanager.h" #include "lltoolmgr.h" #include "lltoolgrab.h" - +#include "lluiimage.h" // Linden library includes #include "llwindow.h" // setMouseClipping() diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp index 0d5daf129f..148e5a015b 100644 --- a/indra/newview/lltoolmorph.cpp +++ b/indra/newview/lltoolmorph.cpp @@ -34,6 +34,7 @@ #include "llaudioengine.h" #include "llviewercontrol.h" #include "llfontgl.h" +#include "llwearable.h" #include "sound_ids.h" #include "v3math.h" #include "v3color.h" diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index f24891baf6..fc9a316759 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -791,14 +791,10 @@ BOOL LLToolPie::handleTooltipLand(std::string line, std::string tooltip_msg) LLParcel* hover_parcel = LLViewerParcelMgr::getInstance()->getHoverParcel(); LLUUID owner; - S32 width = 0; - S32 height = 0; if ( hover_parcel ) { owner = hover_parcel->getOwnerID(); - width = S32(LLViewerParcelMgr::getInstance()->getHoverParcelWidth()); - height = S32(LLViewerParcelMgr::getInstance()->getHoverParcelHeight()); } // Line: "Land" @@ -1593,9 +1589,6 @@ BOOL LLToolPie::handleRightClickPick() // didn't click in any UI object, so must have clicked in the world LLViewerObject *object = mPick.getObject(); - LLViewerObject *parent = NULL; - if(object) - parent = object->getRootEdit(); // Can't ignore children here. LLToolSelect::handleObjectSelection(mPick, FALSE, TRUE); diff --git a/indra/newview/lltoolplacer.cpp b/indra/newview/lltoolplacer.cpp index 93ba3b2558..641fbc5042 100644 --- a/indra/newview/lltoolplacer.cpp +++ b/indra/newview/lltoolplacer.cpp @@ -182,7 +182,7 @@ BOOL LLToolPlacer::addObject( LLPCode pcode, S32 x, S32 y, U8 use_physics ) return FALSE; } - if (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX) + if (regionp->getRegionFlag(REGION_FLAGS_SANDBOX)) { //LLFirstUse::useSandbox(); } @@ -485,7 +485,7 @@ BOOL LLToolPlacer::addDuplicate(S32 x, S32 y) FALSE); // select copy if (regionp - && (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX)) + && (regionp->getRegionFlag(REGION_FLAGS_SANDBOX))) { //LLFirstUse::useSandbox(); } diff --git a/indra/newview/lluploadfloaterobservers.cpp b/indra/newview/lluploadfloaterobservers.cpp index 5a6a17fbca..1d777b3f7f 100644 --- a/indra/newview/lluploadfloaterobservers.cpp +++ b/indra/newview/lluploadfloaterobservers.cpp @@ -33,9 +33,10 @@ LLUploadModelPremissionsResponder::LLUploadModelPremissionsResponder(const LLHan { } -void LLUploadModelPremissionsResponder::error(U32 status, const std::string& reason) +void LLUploadModelPremissionsResponder::errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - llwarns << "LLUploadModelPremissionsResponder::error("<< status << ": " << reason << ")" << llendl; + llwarns << "LLUploadModelPremissionsResponder error [status:" + << status << "]: " << content << llendl; LLUploadPermissionsObserver* observer = mObserverHandle.get(); diff --git a/indra/newview/lluploadfloaterobservers.h b/indra/newview/lluploadfloaterobservers.h index 79aad282d7..b43ddb44d9 100644 --- a/indra/newview/lluploadfloaterobservers.h +++ b/indra/newview/lluploadfloaterobservers.h @@ -86,7 +86,7 @@ public: LLUploadModelPremissionsResponder(const LLHandle<LLUploadPermissionsObserver>& observer); - void error(U32 status, const std::string& reason); + void errorWithContent(U32 status, const std::string& reason, const LLSD& content); void result(const LLSD& content); diff --git a/indra/newview/llurlhistory.cpp b/indra/newview/llurlhistory.cpp index edec30f8c4..dd17068be5 100644 --- a/indra/newview/llurlhistory.cpp +++ b/indra/newview/llurlhistory.cpp @@ -112,8 +112,6 @@ void LLURLHistory::addURL(const std::string& collection, const std::string& url) // static void LLURLHistory::removeURL(const std::string& collection, const std::string& url) { - LLSD::array_iterator iter = sHistorySD[collection].beginArray(); - LLSD::array_iterator end = sHistorySD[collection].endArray(); for(int index = 0; index < sHistorySD[collection].size(); index++) { if(sHistorySD[collection].get(index).asString() == url) diff --git a/indra/newview/llviewerassetstats.cpp b/indra/newview/llviewerassetstats.cpp index 4c59fd0371..aaa81c57d4 100644 --- a/indra/newview/llviewerassetstats.cpp +++ b/indra/newview/llviewerassetstats.cpp @@ -160,9 +160,7 @@ LLViewerAssetStats::LLViewerAssetStats() LLViewerAssetStats::LLViewerAssetStats(const LLViewerAssetStats & src) : mRegionHandle(src.mRegionHandle), - mResetTimestamp(src.mResetTimestamp), - mPhaseStats(src.mPhaseStats), - mAvatarRezStates(src.mAvatarRezStates) + mResetTimestamp(src.mResetTimestamp) { const PerRegionContainer::const_iterator it_end(src.mRegionStats.end()); for (PerRegionContainer::const_iterator it(src.mRegionStats.begin()); it_end != it; ++it) @@ -258,17 +256,6 @@ LLViewerAssetStats::recordFPS(F32 fps) mCurRegionStats->mFPS.record(fps); } -void -LLViewerAssetStats::recordAvatarStats() -{ - std::vector<S32> rez_counts; - LLVOAvatar::getNearbyRezzedStats(rez_counts); - mAvatarRezStates = rez_counts; - mPhaseStats.clear(); - mPhaseStats["cloud"] = LLViewerStats::PhaseMap::getPhaseStats("cloud"); - mPhaseStats["cloud-or-gray"] = LLViewerStats::PhaseMap::getPhaseStats("cloud-or-gray"); -} - LLSD LLViewerAssetStats::asLLSD(bool compact_output) { @@ -299,11 +286,6 @@ LLViewerAssetStats::asLLSD(bool compact_output) static const LLSD::String max_tag("max"); static const LLSD::String mean_tag("mean"); - // Avatar sub-tags - static const LLSD::String avatar_tag("avatar"); - static const LLSD::String avatar_nearby_tag("nearby"); - static const LLSD::String avatar_phase_stats_tag("phase_stats"); - const duration_t now = LLViewerAssetStatsFF::get_timestamp(); mCurRegionStats->accumulateTime(now); @@ -362,16 +344,6 @@ LLViewerAssetStats::asLLSD(bool compact_output) LLSD ret = LLSD::emptyMap(); ret["regions"] = regions; ret["duration"] = LLSD::Real((now - mResetTimestamp) * 1.0e-6); - LLSD avatar_info; - avatar_info[avatar_nearby_tag] = LLSD::emptyArray(); - for (S32 rez_stat=0; rez_stat < mAvatarRezStates.size(); ++rez_stat) - { - std::string rez_status_name = LLVOAvatar::rezStatusToString(rez_stat); - avatar_info[avatar_nearby_tag][rez_status_name] = mAvatarRezStates[rez_stat]; - } - avatar_info[avatar_phase_stats_tag]["cloud"] = mPhaseStats["cloud"].getData(); - avatar_info[avatar_phase_stats_tag]["cloud-or-gray"] = mPhaseStats["cloud-or-gray"].getData(); - ret[avatar_tag] = avatar_info; return ret; } @@ -470,15 +442,6 @@ record_fps_main(F32 fps) gViewerAssetStatsMain->recordFPS(fps); } -void -record_avatar_stats() -{ - if (! gViewerAssetStatsMain) - return; - - gViewerAssetStatsMain->recordAvatarStats(); -} - // 'thread1' - should be for TextureFetch thread void diff --git a/indra/newview/llviewerassetstats.h b/indra/newview/llviewerassetstats.h index 8319752230..e4581d2120 100644 --- a/indra/newview/llviewerassetstats.h +++ b/indra/newview/llviewerassetstats.h @@ -256,10 +256,6 @@ protected: // Time of last reset duration_t mResetTimestamp; - - // Nearby avatar stats - std::vector<S32> mAvatarRezStates; - LLViewerStats::phase_stats_t mPhaseStats; }; @@ -318,8 +314,6 @@ void record_response_main(LLViewerAssetType::EType at, bool with_http, bool is_t void record_fps_main(F32 fps); -void record_avatar_stats(); - /** * Region context, event and duration loggers for Thread 1. */ diff --git a/indra/newview/llviewerattachmenu.cpp b/indra/newview/llviewerattachmenu.cpp index db7dc3fea6..3975292ed3 100644 --- a/indra/newview/llviewerattachmenu.cpp +++ b/indra/newview/llviewerattachmenu.cpp @@ -121,7 +121,7 @@ void LLViewerAttachMenu::attachObjects(const uuid_vec_t& items, const std::strin else if(item && item->isFinished()) { // must be in library. copy it to our inventory and put it on. - LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp); + LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(rez_attachment_cb, _1, attachmentp)); copy_inventory_item(gAgent.getID(), item->getPermissions().getOwner(), item->getUUID(), diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index 564bf7997a..3da934b148 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -44,6 +44,8 @@ #include "llparcel.h" #include "llviewermessage.h" +#include "llstreamingaudio.h" + ///////////////////////////////////////////////////////// LLViewerAudio::LLViewerAudio() : @@ -102,6 +104,11 @@ void LLViewerAudio::startInternetStreamWithAutoFade(std::string streamURI) else { mFadeState = FADE_IN; + + LLStreamingAudioInterface *stream = gAudiop->getStreamingAudioImpl(); + if(stream && stream->supportsAdjustableBufferSizes()) + stream->setBufferSizes(gSavedSettings.getU32("FMODExStreamBufferSize"),gSavedSettings.getU32("FMODExDecodeBufferSize")); + gAudiop->startInternetStream(mNextStreamURI); startFading(); registerIdleListener(); @@ -157,6 +164,11 @@ bool LLViewerAudio::onIdleUpdate() if (!mNextStreamURI.empty()) { mFadeState = FADE_IN; + + LLStreamingAudioInterface *stream = gAudiop->getStreamingAudioImpl(); + if(stream && stream->supportsAdjustableBufferSizes()) + stream->setBufferSizes(gSavedSettings.getU32("FMODExStreamBufferSize"),gSavedSettings.getU32("FMODExDecodeBufferSize")); + gAudiop->startInternetStream(mNextStreamURI); startFading(); } @@ -386,7 +398,12 @@ void audio_update_volume(bool force_update) gAudiop->setMasterGain ( master_volume ); gAudiop->setDopplerFactor(gSavedSettings.getF32("AudioLevelDoppler")); + + if(!LLViewerCamera::getInstance()->cameraUnderWater()) gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff")); + else + gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelUnderwaterRolloff")); + gAudiop->setMuted(mute_audio || progress_view_visible); //Play any deferred sounds when unmuted @@ -473,32 +490,10 @@ void audio_update_listener() void audio_update_wind(bool force_update) { #ifdef kAUDIO_ENABLE_WIND - // - // Extract height above water to modulate filter by whether above/below water - // + LLViewerRegion* region = gAgent.getRegion(); if (region) { - static F32 last_camera_water_height = -1000.f; - LLVector3 camera_pos = gAgentCamera.getCameraPositionAgent(); - F32 camera_water_height = camera_pos.mV[VZ] - region->getWaterHeight(); - - // - // Don't update rolloff factor unless water surface has been crossed - // - if (force_update || (last_camera_water_height * camera_water_height) < 0.f) - { - static LLUICachedControl<F32> rolloff("AudioLevelRolloff", 1.0f); - if (camera_water_height < 0.f) - { - gAudiop->setRolloffFactor(rolloff * LL_ROLLOFF_MULTIPLIER_UNDER_WATER); - } - else - { - gAudiop->setRolloffFactor(rolloff); - } - } - // Scale down the contribution of weather-simulation wind to the // ambient wind noise. Wind velocity averages 3.5 m/s, with gusts to 7 m/s // whereas steady-state avatar walk velocity is only 3.2 m/s. @@ -543,8 +538,7 @@ void audio_update_wind(bool force_update) gAudiop->mMaxWindGain = llmax(gAudiop->mMaxWindGain - volume_delta, 0.f); } - last_camera_water_height = camera_water_height; - gAudiop->updateWind(gRelativeWindVec, camera_water_height); + gAudiop->updateWind(gRelativeWindVec, gAgentCamera.getCameraPositionAgent()[VZ] - gAgent.getRegion()->getWaterHeight()); } #endif } diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp index a437a8b3b5..b5aa0ac92a 100644 --- a/indra/newview/llviewercamera.cpp +++ b/indra/newview/llviewercamera.cpp @@ -136,9 +136,6 @@ void LLViewerCamera::updateCameraLocation(const LLVector3 ¢er, mLastPointOfInterest = point_of_interest; - // constrain to max distance from avatar - LLVector3 camera_offset = center - gAgent.getPositionAgent(); - LLViewerRegion * regp = gAgent.getRegion(); F32 water_height = (NULL != regp) ? regp->getWaterHeight() : 0.f; @@ -318,7 +315,7 @@ void LLViewerCamera::setPerspective(BOOL for_selection, { F32 fov_y, aspect; fov_y = RAD_TO_DEG * getView(); - BOOL z_default_near, z_default_far = FALSE; + BOOL z_default_far = FALSE; if (z_far <= 0) { z_default_far = TRUE; @@ -326,7 +323,6 @@ void LLViewerCamera::setPerspective(BOOL for_selection, } if (z_near <= 0) { - z_default_near = TRUE; z_near = getNear(); } aspect = getAspect(); diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 051f5f4485..a62f73deef 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -655,6 +655,7 @@ void settings_setup_listeners() gSavedSettings.getControl("AudioLevelVoice")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2)); gSavedSettings.getControl("AudioLevelDoppler")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2)); gSavedSettings.getControl("AudioLevelRolloff")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2)); + gSavedSettings.getControl("AudioLevelUnderwaterRolloff")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2)); gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2)); gSavedSettings.getControl("MuteMusic")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2)); gSavedSettings.getControl("MuteMedia")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2)); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 1e5c5097ea..37c579bdf5 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -1440,7 +1440,7 @@ void render_ui_2d() gGL.pushMatrix(); S32 half_width = (gViewerWindow->getWorldViewWidthScaled() / 2); S32 half_height = (gViewerWindow->getWorldViewHeightScaled() / 2); - gGL.scalef(LLUI::sGLScaleFactor.mV[0], LLUI::sGLScaleFactor.mV[1], 1.f); + gGL.scalef(LLUI::getScaleFactor().mV[0], LLUI::getScaleFactor().mV[1], 1.f); gGL.translatef((F32)half_width, (F32)half_height, 0.f); F32 zoom = gAgentCamera.mHUDCurZoom; gGL.scalef(zoom,zoom,1.f); @@ -1478,10 +1478,10 @@ void render_ui_2d() LLUI::sDirtyRect = last_rect; last_rect = t_rect; - last_rect.mLeft = LLRect::tCoordType(last_rect.mLeft / LLUI::sGLScaleFactor.mV[0]); - last_rect.mRight = LLRect::tCoordType(last_rect.mRight / LLUI::sGLScaleFactor.mV[0]); - last_rect.mTop = LLRect::tCoordType(last_rect.mTop / LLUI::sGLScaleFactor.mV[1]); - last_rect.mBottom = LLRect::tCoordType(last_rect.mBottom / LLUI::sGLScaleFactor.mV[1]); + last_rect.mLeft = LLRect::tCoordType(last_rect.mLeft / LLUI::getScaleFactor().mV[0]); + last_rect.mRight = LLRect::tCoordType(last_rect.mRight / LLUI::getScaleFactor().mV[0]); + last_rect.mTop = LLRect::tCoordType(last_rect.mTop / LLUI::getScaleFactor().mV[1]); + last_rect.mBottom = LLRect::tCoordType(last_rect.mBottom / LLUI::getScaleFactor().mV[1]); LLRect clip_rect(last_rect); diff --git a/indra/newview/llviewerdisplayname.cpp b/indra/newview/llviewerdisplayname.cpp index 6bd5631df6..f81206ffec 100644 --- a/indra/newview/llviewerdisplayname.cpp +++ b/indra/newview/llviewerdisplayname.cpp @@ -60,8 +60,10 @@ class LLSetDisplayNameResponder : public LLHTTPClient::Responder { public: // only care about errors - /*virtual*/ void error(U32 status, const std::string& reason) + /*virtual*/ void errorWithContent(U32 status, const std::string& reason, const LLSD& content) { + llwarns << "LLSetDisplayNameResponder error [status:" + << status << "]: " << content << llendl; LLViewerDisplayName::sSetDisplayNameSignal(false, "", LLSD()); LLViewerDisplayName::sSetDisplayNameSignal.disconnect_all_slots(); } diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index b5415fe187..c6b28b9e5e 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -259,7 +259,6 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("pathfinding_characters", "floater_pathfinding_characters.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPathfindingCharacters>); LLFloaterReg::add("pathfinding_linksets", "floater_pathfinding_linksets.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPathfindingLinksets>); LLFloaterReg::add("pathfinding_console", "floater_pathfinding_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPathfindingConsole>); - LLFloaterReg::add("people", "floater_people.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>); LLFloaterReg::add("places", "floater_places.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>); LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index a187318eb7..fff9821e86 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -64,6 +64,11 @@ #include "llavatarnamecache.h" #include "llavataractions.h" #include "lllogininstance.h" +#include "llfavoritesbar.h" + +// Two do-nothing ops for use in callbacks. +void no_op_inventory_func(const LLUUID&) {} +void no_op() {} ///---------------------------------------------------------------------------- /// Helper class to store special inventory item names and their localized values. @@ -588,7 +593,7 @@ void LLViewerInventoryCategory::copyViewerCategory(const LLViewerInventoryCatego { copyCategory(other); mOwnerID = other->mOwnerID; - mVersion = other->mVersion; + setVersion(other->getVersion()); mDescendentCount = other->mDescendentCount; mDescendentsRequested = other->mDescendentsRequested; } @@ -656,9 +661,19 @@ void LLViewerInventoryCategory::removeFromServer( void ) gAgent.sendReliableMessage(); } +S32 LLViewerInventoryCategory::getVersion() const +{ + return mVersion; +} + +void LLViewerInventoryCategory::setVersion(S32 version) +{ + mVersion = version; +} + bool LLViewerInventoryCategory::fetch() { - if((VERSION_UNKNOWN == mVersion) + if((VERSION_UNKNOWN == getVersion()) && mDescendentsRequested.hasExpired()) //Expired check prevents multiple downloads. { LL_DEBUGS("InventoryFetch") << "Fetching category children: " << mName << ", UUID: " << mUUID << LL_ENDL; @@ -949,46 +964,7 @@ void LLInventoryCallbackManager::fire(U32 callback_id, const LLUUID& item_id) } } -void WearOnAvatarCallback::fire(const LLUUID& inv_item) -{ - if (inv_item.isNull()) - return; - - LLViewerInventoryItem *item = gInventory.getItem(inv_item); - if (item) - { - LLAppearanceMgr::instance().wearItemOnAvatar(inv_item, true, mReplace); - } -} - -void ModifiedCOFCallback::fire(const LLUUID& inv_item) -{ - LLAppearanceMgr::instance().updateAppearanceFromCOF(); - - // Start editing the item if previously requested. - gAgentWearables.editWearableIfRequested(inv_item); - - // TODO: camera mode may not be changed if a debug setting is tweaked - if( gAgentCamera.cameraCustomizeAvatar() ) - { - // If we're in appearance editing mode, the current tab may need to be refreshed - LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance")); - if (panel) - { - panel->showDefaultSubpart(); - } - } -} - -RezAttachmentCallback::RezAttachmentCallback(LLViewerJointAttachment *attachmentp) -{ - mAttach = attachmentp; -} -RezAttachmentCallback::~RezAttachmentCallback() -{ -} - -void RezAttachmentCallback::fire(const LLUUID& inv_item) +void rez_attachment_cb(const LLUUID& inv_item, LLViewerJointAttachment *attachmentp) { if (inv_item.isNull()) return; @@ -996,11 +972,11 @@ void RezAttachmentCallback::fire(const LLUUID& inv_item) LLViewerInventoryItem *item = gInventory.getItem(inv_item); if (item) { - rez_attachment(item, mAttach); + rez_attachment(item, attachmentp); } } -void ActivateGestureCallback::fire(const LLUUID& inv_item) +void activate_gesture_cb(const LLUUID& inv_item) { if (inv_item.isNull()) return; @@ -1013,7 +989,7 @@ void ActivateGestureCallback::fire(const LLUUID& inv_item) LLGestureMgr::instance().activateGesture(inv_item); } -void CreateGestureCallback::fire(const LLUUID& inv_item) +void create_gesture_cb(const LLUUID& inv_item) { if (inv_item.isNull()) return; @@ -1031,7 +1007,6 @@ void CreateGestureCallback::fire(const LLUUID& inv_item) } - LLInventoryCallbackManager gInventoryCallbacks; void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id, @@ -1157,6 +1132,11 @@ void link_inventory_item( } } +#if 1 // debugging stuff + LLViewerInventoryCategory* cat = gInventory.getCategory(parent_id); + lldebugs << "cat: " << cat << llendl; + +#endif LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_LinkInventoryItem); msg->nextBlock(_PREHASH_AgentData); @@ -1283,7 +1263,7 @@ void create_new_item(const std::string& name, if (inv_type == LLInventoryType::IT_GESTURE) { - LLPointer<LLInventoryCallback> cb = new CreateGestureCallback(); + LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(create_gesture_cb); create_inventory_item(gAgent.getID(), gAgent.getSessionID(), parent_id, LLTransactionID::tnull, name, desc, asset_type, inv_type, NOT_WEARABLE, next_owner_perm, cb); @@ -1444,6 +1424,28 @@ const std::string& LLViewerInventoryItem::getName() const return LLInventoryItem::getName(); } +S32 LLViewerInventoryItem::getSortField() const +{ + return LLFavoritesOrderStorage::instance().getSortIndex(mUUID); +} + +//void LLViewerInventoryItem::setSortField(S32 sortField) +//{ +// LLFavoritesOrderStorage::instance().setSortIndex(mUUID, sortField); +// getSLURL(); +//} + +void LLViewerInventoryItem::getSLURL() +{ + LLFavoritesOrderStorage::instance().getSLURL(mAssetUUID); +} + +const LLPermissions& LLViewerInventoryItem::getPermissions() const +{ + // Use the actual permissions of the symlink, not its parent. + return LLInventoryItem::getPermissions(); +} + const LLUUID& LLViewerInventoryItem::getCreatorUUID() const { if (const LLViewerInventoryItem *linked_item = getLinkedItem()) @@ -1514,6 +1516,17 @@ LLWearableType::EType LLViewerInventoryItem::getWearableType() const return LLWearableType::EType(getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK); } + +time_t LLViewerInventoryItem::getCreationDate() const +{ + return LLInventoryItem::getCreationDate(); +} + +U32 LLViewerInventoryItem::getCRC32() const +{ + return LLInventoryItem::getCRC32(); +} + // *TODO: mantipov: should be removed with LMSortPrefix patch in llinventorymodel.cpp, EXT-3985 static char getSeparator() { return '@'; } BOOL LLViewerInventoryItem::extractSortFieldAndDisplayName(const std::string& name, S32* sortField, std::string* displayName) diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 3cf03c3bc5..ab19a12014 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -35,6 +35,7 @@ #include <boost/signals2.hpp> // boost::signals2::trackable class LLInventoryPanel; +class LLFolderView; class LLFolderBridge; class LLViewerInventoryCategory; @@ -60,6 +61,10 @@ public: virtual const LLUUID& getAssetUUID() const; virtual const LLUUID& getProtectedAssetUUID() const; // returns LLUUID::null if current agent does not have permission to expose this asset's UUID to the user virtual const std::string& getName() const; + virtual S32 getSortField() const; + //virtual void setSortField(S32 sortField); + virtual void getSLURL(); //Caches SLURL for landmark. //*TODO: Find a better way to do it and remove this method from here. + virtual const LLPermissions& getPermissions() const; virtual const bool getIsFullPerm() const; // 'fullperm' in the popular sense: modify-ok & copy-ok & transfer-ok, no special god rules applied virtual const LLUUID& getCreatorUUID() const; virtual const std::string& getDescription() const; @@ -68,11 +73,8 @@ public: virtual bool isWearableType() const; virtual LLWearableType::EType getWearableType() const; virtual U32 getFlags() const; - - using LLInventoryItem::getPermissions; - using LLInventoryItem::getCreationDate; - using LLInventoryItem::setCreationDate; - using LLInventoryItem::getCRC32; + virtual time_t getCreationDate() const; + virtual U32 getCRC32() const; // really more of a checksum. static BOOL extractSortFieldAndDisplayName(const std::string& name, S32* sortField, std::string* displayName); @@ -204,13 +206,13 @@ public: // Version handling enum { VERSION_UNKNOWN = -1, VERSION_INITIAL = 1 }; - S32 getVersion() const { return mVersion; } - void setVersion(S32 version) { mVersion = version; } + S32 getVersion() const; + void setVersion(S32 version); // Returns true if a fetch was issued. bool fetch(); - // used to help make cacheing more robust - for example, if + // used to help make caching more robust - for example, if // someone is getting 4 packets but logs out after 3. the viewer // may never know the cache is wrong. enum { DESCENDENT_COUNT_UNKNOWN = -1 }; @@ -218,7 +220,7 @@ public: void setDescendentCount(S32 descendents) { mDescendentCount = descendents; } // file handling on the viewer. These are not meant for anything - // other than cacheing. + // other than caching. bool exportFileLocal(LLFILE* fp) const; bool importFileLocal(LLFILE* fp); void determineFolderType(); @@ -241,47 +243,60 @@ public: virtual void fire(const LLUUID& inv_item) = 0; }; -class WearOnAvatarCallback : public LLInventoryCallback +class LLViewerJointAttachment; + +void rez_attachment_cb(const LLUUID& inv_item, LLViewerJointAttachment *attachmentp); + +void activate_gesture_cb(const LLUUID& inv_item); + +void create_gesture_cb(const LLUUID& inv_item); + +class AddFavoriteLandmarkCallback : public LLInventoryCallback { public: - WearOnAvatarCallback(bool do_replace = false) : mReplace(do_replace) {} + AddFavoriteLandmarkCallback() : mTargetLandmarkId(LLUUID::null) {} + void setTargetLandmarkId(const LLUUID& target_uuid) { mTargetLandmarkId = target_uuid; } +private: void fire(const LLUUID& inv_item); -protected: - bool mReplace; + LLUUID mTargetLandmarkId; }; -class ModifiedCOFCallback : public LLInventoryCallback -{ - void fire(const LLUUID& inv_item); -}; +typedef boost::function<void(const LLUUID&)> inventory_func_type; +void no_op_inventory_func(const LLUUID&); // A do-nothing inventory_func -class LLViewerJointAttachment; +typedef boost::function<void()> nullary_func_type; +void no_op(); // A do-nothing nullary func. -class RezAttachmentCallback : public LLInventoryCallback +// Shim between inventory callback and boost function/callable +class LLBoostFuncInventoryCallback: public LLInventoryCallback { public: - RezAttachmentCallback(LLViewerJointAttachment *attachmentp); - void fire(const LLUUID& inv_item); -protected: - ~RezAttachmentCallback(); - -private: - LLViewerJointAttachment* mAttach; -}; + LLBoostFuncInventoryCallback(inventory_func_type fire_func, + nullary_func_type destroy_func = no_op): + mFireFunc(fire_func), + mDestroyFunc(destroy_func) + { + } -class ActivateGestureCallback : public LLInventoryCallback + // virtual + void fire(const LLUUID& item_id) { -public: - void fire(const LLUUID& inv_item); -}; + mFireFunc(item_id); + } -class CreateGestureCallback : public LLInventoryCallback + // virtual + ~LLBoostFuncInventoryCallback() { -public: - void fire(const LLUUID& inv_item); + mDestroyFunc(); + } + + +private: + inventory_func_type mFireFunc; + nullary_func_type mDestroyFunc; }; // misc functions diff --git a/indra/newview/llviewerjoint.cpp b/indra/newview/llviewerjoint.cpp index a907f102f8..e46299f9d2 100644 --- a/indra/newview/llviewerjoint.cpp +++ b/indra/newview/llviewerjoint.cpp @@ -35,50 +35,26 @@ #include "llrender.h" #include "llmath.h" #include "llglheaders.h" -#include "llrendersphere.h" #include "llvoavatar.h" #include "pipeline.h" -#define DEFAULT_LOD 0.0f - -const S32 MIN_PIXEL_AREA_3PASS_HAIR = 64*64; - -//----------------------------------------------------------------------------- -// Static Data -//----------------------------------------------------------------------------- -BOOL LLViewerJoint::sDisableLOD = FALSE; +static const S32 MIN_PIXEL_AREA_3PASS_HAIR = 64*64; //----------------------------------------------------------------------------- // LLViewerJoint() -// Class Constructor +// Class Constructors //----------------------------------------------------------------------------- -LLViewerJoint::LLViewerJoint() - : LLJoint() -{ - init(); -} +LLViewerJoint::LLViewerJoint() : + LLAvatarJoint() +{ } +LLViewerJoint::LLViewerJoint(const std::string &name, LLJoint *parent) : + LLAvatarJoint(name, parent) +{ } -//----------------------------------------------------------------------------- -// LLViewerJoint() -// Class Constructor -//----------------------------------------------------------------------------- -LLViewerJoint::LLViewerJoint(const std::string &name, LLJoint *parent) - : LLJoint(name, parent) -{ - init(); -} - - -void LLViewerJoint::init() -{ - mValid = FALSE; - mComponents = SC_JOINT | SC_BONE | SC_AXES; - mMinPixelArea = DEFAULT_LOD; - mPickName = PN_DEFAULT; - mVisible = TRUE; - mMeshID = 0; -} +LLViewerJoint::LLViewerJoint(S32 joint_num) : + LLAvatarJoint(joint_num) +{ } //----------------------------------------------------------------------------- @@ -89,154 +65,6 @@ LLViewerJoint::~LLViewerJoint() { } - -//-------------------------------------------------------------------- -// setValid() -//-------------------------------------------------------------------- -void LLViewerJoint::setValid( BOOL valid, BOOL recursive ) -{ - //---------------------------------------------------------------- - // set visibility for this joint - //---------------------------------------------------------------- - mValid = valid; - - //---------------------------------------------------------------- - // set visibility for children - //---------------------------------------------------------------- - if (recursive) - { - for (child_list_t::iterator iter = mChildren.begin(); - iter != mChildren.end(); ++iter) - { - LLViewerJoint* joint = (LLViewerJoint*)(*iter); - joint->setValid(valid, TRUE); - } - } - -} - -//-------------------------------------------------------------------- -// renderSkeleton() -// DEBUG (UNUSED) -//-------------------------------------------------------------------- -// void LLViewerJoint::renderSkeleton(BOOL recursive) -// { -// F32 nc = 0.57735f; - -// //---------------------------------------------------------------- -// // push matrix stack -// //---------------------------------------------------------------- -// gGL.pushMatrix(); - -// //---------------------------------------------------------------- -// // render the bone to my parent -// //---------------------------------------------------------------- -// if (mComponents & SC_BONE) -// { -// drawBone(); -// } - -// //---------------------------------------------------------------- -// // offset to joint position and -// // rotate to our orientation -// //---------------------------------------------------------------- -// gGL.loadIdentity(); -// gGL.multMatrix( &getWorldMatrix().mMatrix[0][0] ); - -// //---------------------------------------------------------------- -// // render joint axes -// //---------------------------------------------------------------- -// if (mComponents & SC_AXES) -// { -// gGL.begin(LLRender::LINES); -// gGL.color3f( 1.0f, 0.0f, 0.0f ); -// gGL.vertex3f( 0.0f, 0.0f, 0.0f ); -// gGL.vertex3f( 0.1f, 0.0f, 0.0f ); - -// gGL.color3f( 0.0f, 1.0f, 0.0f ); -// gGL.vertex3f( 0.0f, 0.0f, 0.0f ); -// gGL.vertex3f( 0.0f, 0.1f, 0.0f ); - -// gGL.color3f( 0.0f, 0.0f, 1.0f ); -// gGL.vertex3f( 0.0f, 0.0f, 0.0f ); -// gGL.vertex3f( 0.0f, 0.0f, 0.1f ); -// gGL.end(); -// } - -// //---------------------------------------------------------------- -// // render the joint graphic -// //---------------------------------------------------------------- -// if (mComponents & SC_JOINT) -// { -// gGL.color3f( 1.0f, 1.0f, 0.0f ); - -// gGL.begin(LLRender::TRIANGLES); - -// // joint top half -// glNormal3f(nc, nc, nc); -// gGL.vertex3f(0.0f, 0.0f, 0.05f); -// gGL.vertex3f(0.05f, 0.0f, 0.0f); -// gGL.vertex3f(0.0f, 0.05f, 0.0f); - -// glNormal3f(-nc, nc, nc); -// gGL.vertex3f(0.0f, 0.0f, 0.05f); -// gGL.vertex3f(0.0f, 0.05f, 0.0f); -// gGL.vertex3f(-0.05f, 0.0f, 0.0f); - -// glNormal3f(-nc, -nc, nc); -// gGL.vertex3f(0.0f, 0.0f, 0.05f); -// gGL.vertex3f(-0.05f, 0.0f, 0.0f); -// gGL.vertex3f(0.0f, -0.05f, 0.0f); - -// glNormal3f(nc, -nc, nc); -// gGL.vertex3f(0.0f, 0.0f, 0.05f); -// gGL.vertex3f(0.0f, -0.05f, 0.0f); -// gGL.vertex3f(0.05f, 0.0f, 0.0f); - -// // joint bottom half -// glNormal3f(nc, nc, -nc); -// gGL.vertex3f(0.0f, 0.0f, -0.05f); -// gGL.vertex3f(0.0f, 0.05f, 0.0f); -// gGL.vertex3f(0.05f, 0.0f, 0.0f); - -// glNormal3f(-nc, nc, -nc); -// gGL.vertex3f(0.0f, 0.0f, -0.05f); -// gGL.vertex3f(-0.05f, 0.0f, 0.0f); -// gGL.vertex3f(0.0f, 0.05f, 0.0f); - -// glNormal3f(-nc, -nc, -nc); -// gGL.vertex3f(0.0f, 0.0f, -0.05f); -// gGL.vertex3f(0.0f, -0.05f, 0.0f); -// gGL.vertex3f(-0.05f, 0.0f, 0.0f); - -// glNormal3f(nc, -nc, -nc); -// gGL.vertex3f(0.0f, 0.0f, -0.05f); -// gGL.vertex3f(0.05f, 0.0f, 0.0f); -// gGL.vertex3f(0.0f, -0.05f, 0.0f); - -// gGL.end(); -// } - -// //---------------------------------------------------------------- -// // render children -// //---------------------------------------------------------------- -// if (recursive) -// { -// for (child_list_t::iterator iter = mChildren.begin(); -// iter != mChildren.end(); ++iter) -// { -// LLViewerJoint* joint = (LLViewerJoint*)(*iter); -// joint->renderSkeleton(); -// } -// } - -// //---------------------------------------------------------------- -// // pop matrix stack -// //---------------------------------------------------------------- -// gGL.popMatrix(); -// } - - //-------------------------------------------------------------------- // render() //-------------------------------------------------------------------- @@ -317,13 +145,13 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass, BOOL is_dummy ) for (child_list_t::iterator iter = mChildren.begin(); iter != mChildren.end(); ++iter) { - LLViewerJoint* joint = (LLViewerJoint*)(*iter); + LLAvatarJoint* joint = dynamic_cast<LLAvatarJoint*>(*iter); F32 jointLOD = joint->getLOD(); if (pixelArea >= jointLOD || sDisableLOD) { triangle_count += joint->render( pixelArea, TRUE, is_dummy ); - if (jointLOD != DEFAULT_LOD) + if (jointLOD != DEFAULT_AVATAR_JOINT_LOD) { break; } @@ -333,72 +161,6 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass, BOOL is_dummy ) return triangle_count; } - -//-------------------------------------------------------------------- -// drawBone() -// DEBUG (UNUSED) -//-------------------------------------------------------------------- -// void LLViewerJoint::drawBone() -// { -// if ( mParent == NULL ) -// return; - -// F32 boneSize = 0.02f; - -// // rotate to point to child (bone direction) -// gGL.pushMatrix(); - -// LLVector3 boneX = getPosition(); -// F32 length = boneX.normVec(); - -// LLVector3 boneZ(1.0f, 0.0f, 1.0f); - -// LLVector3 boneY = boneZ % boneX; -// boneY.normVec(); - -// boneZ = boneX % boneY; - -// LLMatrix4 rotateMat; -// rotateMat.setFwdRow( boneX ); -// rotateMat.setLeftRow( boneY ); -// rotateMat.setUpRow( boneZ ); -// gGL.multMatrix( &rotateMat.mMatrix[0][0] ); - -// // render the bone -// gGL.color3f( 0.5f, 0.5f, 0.0f ); - -// gGL.begin(LLRender::TRIANGLES); - -// gGL.vertex3f( length, 0.0f, 0.0f); -// gGL.vertex3f( 0.0f, boneSize, 0.0f); -// gGL.vertex3f( 0.0f, 0.0f, boneSize); - -// gGL.vertex3f( length, 0.0f, 0.0f); -// gGL.vertex3f( 0.0f, 0.0f, -boneSize); -// gGL.vertex3f( 0.0f, boneSize, 0.0f); - -// gGL.vertex3f( length, 0.0f, 0.0f); -// gGL.vertex3f( 0.0f, -boneSize, 0.0f); -// gGL.vertex3f( 0.0f, 0.0f, -boneSize); - -// gGL.vertex3f( length, 0.0f, 0.0f); -// gGL.vertex3f( 0.0f, 0.0f, boneSize); -// gGL.vertex3f( 0.0f, -boneSize, 0.0f); - -// gGL.end(); - -// // restore matrix -// gGL.popMatrix(); -// } - -//-------------------------------------------------------------------- -// isTransparent() -//-------------------------------------------------------------------- -BOOL LLViewerJoint::isTransparent() -{ - return FALSE; -} - //-------------------------------------------------------------------- // drawShape() //-------------------------------------------------------------------- @@ -407,213 +169,4 @@ U32 LLViewerJoint::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy ) return 0; } -//-------------------------------------------------------------------- -// setSkeletonComponents() -//-------------------------------------------------------------------- -void LLViewerJoint::setSkeletonComponents( U32 comp, BOOL recursive ) -{ - mComponents = comp; - if (recursive) - { - for (child_list_t::iterator iter = mChildren.begin(); - iter != mChildren.end(); ++iter) - { - LLViewerJoint* joint = (LLViewerJoint*)(*iter); - joint->setSkeletonComponents(comp, recursive); - } - } -} - -void LLViewerJoint::updateFaceSizes(U32 &num_vertices, U32& num_indices, F32 pixel_area) -{ - for (child_list_t::iterator iter = mChildren.begin(); - iter != mChildren.end(); ++iter) - { - LLViewerJoint* joint = (LLViewerJoint*)(*iter); - joint->updateFaceSizes(num_vertices, num_indices, pixel_area); - } -} - -void LLViewerJoint::updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_wind, bool terse_update) -{ - for (child_list_t::iterator iter = mChildren.begin(); - iter != mChildren.end(); ++iter) - { - LLViewerJoint* joint = (LLViewerJoint*)(*iter); - joint->updateFaceData(face, pixel_area, damp_wind, terse_update); - } -} - -void LLViewerJoint::updateJointGeometry() -{ - for (child_list_t::iterator iter = mChildren.begin(); - iter != mChildren.end(); ++iter) - { - LLViewerJoint* joint = (LLViewerJoint*)(*iter); - joint->updateJointGeometry(); - } -} - - -BOOL LLViewerJoint::updateLOD(F32 pixel_area, BOOL activate) -{ - BOOL lod_changed = FALSE; - BOOL found_lod = FALSE; - - for (child_list_t::iterator iter = mChildren.begin(); - iter != mChildren.end(); ++iter) - { - LLViewerJoint* joint = (LLViewerJoint*)(*iter); - F32 jointLOD = joint->getLOD(); - - if (found_lod || jointLOD == DEFAULT_LOD) - { - // we've already found a joint to enable, so enable the rest as alternatives - lod_changed |= joint->updateLOD(pixel_area, TRUE); - } - else - { - if (pixel_area >= jointLOD || sDisableLOD) - { - lod_changed |= joint->updateLOD(pixel_area, TRUE); - found_lod = TRUE; - } - else - { - lod_changed |= joint->updateLOD(pixel_area, FALSE); - } - } - } - return lod_changed; -} - -void LLViewerJoint::dump() -{ - for (child_list_t::iterator iter = mChildren.begin(); - iter != mChildren.end(); ++iter) - { - LLViewerJoint* joint = (LLViewerJoint*)(*iter); - joint->dump(); - } -} - -void LLViewerJoint::setVisible(BOOL visible, BOOL recursive) -{ - mVisible = visible; - - if (recursive) - { - for (child_list_t::iterator iter = mChildren.begin(); - iter != mChildren.end(); ++iter) - { - LLViewerJoint* joint = (LLViewerJoint*)(*iter); - joint->setVisible(visible, recursive); - } - } -} - - -void LLViewerJoint::setMeshesToChildren() -{ - removeAllChildren(); - for (std::vector<LLViewerJointMesh*>::iterator iter = mMeshParts.begin(); - iter != mMeshParts.end(); iter++) - { - addChild((LLViewerJointMesh *) *iter); - } -} -//----------------------------------------------------------------------------- -// LLViewerJointCollisionVolume() -//----------------------------------------------------------------------------- - -LLViewerJointCollisionVolume::LLViewerJointCollisionVolume() -{ - mUpdateXform = FALSE; -} - -LLViewerJointCollisionVolume::LLViewerJointCollisionVolume(const std::string &name, LLJoint *parent) : LLViewerJoint(name, parent) -{ - -} - -void LLViewerJointCollisionVolume::renderCollision() -{ - updateWorldMatrix(); - - gGL.pushMatrix(); - gGL.multMatrix( &mXform.getWorldMatrix().mMatrix[0][0] ); - - gGL.diffuseColor3f( 0.f, 0.f, 1.f ); - - gGL.begin(LLRender::LINES); - - LLVector3 v[] = - { - LLVector3(1,0,0), - LLVector3(-1,0,0), - LLVector3(0,1,0), - LLVector3(0,-1,0), - - LLVector3(0,0,-1), - LLVector3(0,0,1), - }; - - //sides - gGL.vertex3fv(v[0].mV); - gGL.vertex3fv(v[2].mV); - - gGL.vertex3fv(v[0].mV); - gGL.vertex3fv(v[3].mV); - - gGL.vertex3fv(v[1].mV); - gGL.vertex3fv(v[2].mV); - - gGL.vertex3fv(v[1].mV); - gGL.vertex3fv(v[3].mV); - - - //top - gGL.vertex3fv(v[0].mV); - gGL.vertex3fv(v[4].mV); - - gGL.vertex3fv(v[1].mV); - gGL.vertex3fv(v[4].mV); - - gGL.vertex3fv(v[2].mV); - gGL.vertex3fv(v[4].mV); - - gGL.vertex3fv(v[3].mV); - gGL.vertex3fv(v[4].mV); - - - //bottom - gGL.vertex3fv(v[0].mV); - gGL.vertex3fv(v[5].mV); - - gGL.vertex3fv(v[1].mV); - gGL.vertex3fv(v[5].mV); - - gGL.vertex3fv(v[2].mV); - gGL.vertex3fv(v[5].mV); - - gGL.vertex3fv(v[3].mV); - gGL.vertex3fv(v[5].mV); - - gGL.end(); - - gGL.popMatrix(); -} - -LLVector3 LLViewerJointCollisionVolume::getVolumePos(LLVector3 &offset) -{ - mUpdateXform = TRUE; - - LLVector3 result = offset; - result.scaleVec(getScale()); - result.rotVec(getWorldRotation()); - result += getWorldPosition(); - - return result; -} - // End diff --git a/indra/newview/llviewerjoint.h b/indra/newview/llviewerjoint.h index 76e3833acb..fd262b6e80 100644 --- a/indra/newview/llviewerjoint.h +++ b/indra/newview/llviewerjoint.h @@ -30,7 +30,8 @@ //----------------------------------------------------------------------------- // Header Files //----------------------------------------------------------------------------- -#include "lljoint.h" +#include "llavatarjoint.h" +#include "lljointpickname.h" class LLFace; class LLViewerJointMesh; @@ -39,124 +40,25 @@ class LLViewerJointMesh; // class LLViewerJoint //----------------------------------------------------------------------------- class LLViewerJoint : - public LLJoint + public virtual LLAvatarJoint { public: LLViewerJoint(); + LLViewerJoint(S32 joint_num); + // *TODO: Only used for LLVOAvatarSelf::mScreenp. *DOES NOT INITIALIZE mResetAfterRestoreOldXform* LLViewerJoint(const std::string &name, LLJoint *parent = NULL); virtual ~LLViewerJoint(); - // Gets the validity of this joint - BOOL getValid() { return mValid; } - - // Sets the validity of this joint - virtual void setValid( BOOL valid, BOOL recursive=FALSE ); - - // Primarily for debugging and character setup - // Derived classes may add text/graphic output. - // Draw skeleton graphic for debugging and character setup - void renderSkeleton(BOOL recursive=TRUE); // debug only (unused) - - // Draws a bone graphic to the parent joint. - // Derived classes may add text/graphic output. - // Called by renderSkeleton(). - void drawBone(); // debug only (unused) - // Render character hierarchy. // Traverses the entire joint hierarchy, setting up // transforms and calling the drawShape(). // Derived classes may add text/graphic output. virtual U32 render( F32 pixelArea, BOOL first_pass = TRUE, BOOL is_dummy = FALSE ); // Returns triangle count - // Returns true if this object is transparent. - // This is used to determine in which order to draw objects. - virtual BOOL isTransparent(); - - // Returns true if this object should inherit scale modifiers from its immediate parent - virtual BOOL inheritScale() { return FALSE; } - // Draws the shape attached to a joint. // Called by render(). virtual U32 drawShape( F32 pixelArea, BOOL first_pass = TRUE, BOOL is_dummy = FALSE ); virtual void drawNormals() {} - - enum Components - { - SC_BONE = 1, - SC_JOINT = 2, - SC_AXES = 4 - }; - - // Selects which skeleton components to draw - void setSkeletonComponents( U32 comp, BOOL recursive = TRUE ); - - // Returns which skeleton components are enables for drawing - U32 getSkeletonComponents() { return mComponents; } - - // Sets the level of detail for this node as a minimum - // pixel area threshold. If the current pixel area for this - // object is less than the specified threshold, the node is - // not traversed. In addition, if a value is specified (not - // default of 0.0), and the pixel area is larger than the - // specified minimum, the node is rendered, but no other siblings - // of this node under the same parent will be. - F32 getLOD() { return mMinPixelArea; } - void setLOD( F32 pixelArea ) { mMinPixelArea = pixelArea; } - - // Sets the OpenGL selection stack name that is pushed and popped - // with this joint state. The default value indicates that no name - // should be pushed/popped. - enum PickName - { - PN_DEFAULT = -1, - PN_0 = 0, - PN_1 = 1, - PN_2 = 2, - PN_3 = 3, - PN_4 = 4, - PN_5 = 5 - }; - void setPickName(PickName name) { mPickName = name; } - PickName getPickName() { return mPickName; } - - virtual void updateFaceSizes(U32 &num_vertices, U32& num_indices, F32 pixel_area); - virtual void updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_wind = FALSE, bool terse_update = false); - virtual BOOL updateLOD(F32 pixel_area, BOOL activate); - virtual void updateJointGeometry(); - virtual void dump(); - - void setVisible( BOOL visible, BOOL recursive ); - - // Takes meshes in mMeshParts and sets each one as a child joint - void setMeshesToChildren(); - -public: - static BOOL sDisableLOD; - std::vector<LLViewerJointMesh*> mMeshParts; - void setMeshID( S32 id ) {mMeshID = id;} - -protected: - void init(); - - BOOL mValid; - U32 mComponents; - F32 mMinPixelArea; - PickName mPickName; - BOOL mVisible; - S32 mMeshID; -}; - -class LLViewerJointCollisionVolume : public LLViewerJoint -{ -public: - LLViewerJointCollisionVolume(); - LLViewerJointCollisionVolume(const std::string &name, LLJoint *parent = NULL); - virtual ~LLViewerJointCollisionVolume() {}; - - virtual BOOL inheritScale() { return TRUE; } - - void renderCollision(); - LLVector3 getVolumePos(LLVector3 &offset); }; #endif // LL_LLVIEWERJOINT_H diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp index 5d1aa870a3..64454a03d1 100644 --- a/indra/newview/llviewerjointmesh.cpp +++ b/indra/newview/llviewerjointmesh.cpp @@ -42,7 +42,7 @@ #include "llface.h" #include "llgldbg.h" #include "llglheaders.h" -#include "lltexlayer.h" +#include "llviewertexlayer.h" #include "llviewercamera.h" #include "llviewercontrol.h" #include "llviewertexturelist.h" @@ -67,101 +67,20 @@ static const U32 sRenderMask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0; - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -// LLViewerJointMesh::LLSkinJoint -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- - -//----------------------------------------------------------------------------- -// LLSkinJoint -//----------------------------------------------------------------------------- -LLSkinJoint::LLSkinJoint() -{ - mJoint = NULL; -} - -//----------------------------------------------------------------------------- -// ~LLSkinJoint -//----------------------------------------------------------------------------- -LLSkinJoint::~LLSkinJoint() -{ - mJoint = NULL; -} - - -//----------------------------------------------------------------------------- -// LLSkinJoint::setupSkinJoint() -//----------------------------------------------------------------------------- -BOOL LLSkinJoint::setupSkinJoint( LLViewerJoint *joint) -{ - // find the named joint - mJoint = joint; - if ( !mJoint ) - { - llinfos << "Can't find joint" << llendl; - } - - // compute the inverse root skin matrix - mRootToJointSkinOffset.clearVec(); - - LLVector3 rootSkinOffset; - while (joint) - { - rootSkinOffset += joint->getSkinOffset(); - joint = (LLViewerJoint*)joint->getParent(); - } - - mRootToJointSkinOffset = -rootSkinOffset; - mRootToParentJointSkinOffset = mRootToJointSkinOffset; - mRootToParentJointSkinOffset += mJoint->getSkinOffset(); - - return TRUE; -} - - //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // LLViewerJointMesh //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- -BOOL LLViewerJointMesh::sPipelineRender = FALSE; -EAvatarRenderPass LLViewerJointMesh::sRenderPass = AVATAR_RENDER_PASS_SINGLE; -U32 LLViewerJointMesh::sClothingMaskImageName = 0; -LLColor4 LLViewerJointMesh::sClothingInnerColor; //----------------------------------------------------------------------------- // LLViewerJointMesh() //----------------------------------------------------------------------------- LLViewerJointMesh::LLViewerJointMesh() : - mTexture( NULL ), - mLayerSet( NULL ), - mTestImageName( 0 ), - mFaceIndexCount(0), - mIsTransparent(FALSE) + LLAvatarJointMesh() { - - mColor[0] = 1.0f; - mColor[1] = 1.0f; - mColor[2] = 1.0f; - mColor[3] = 1.0f; - mShiny = 0.0f; - mCullBackFaces = TRUE; - - mMesh = NULL; - - mNumSkinJoints = 0; - mSkinJoints = NULL; - - mFace = NULL; - - mMeshID = 0; - mUpdateXform = FALSE; - - mValid = FALSE; } @@ -171,199 +90,6 @@ LLViewerJointMesh::LLViewerJointMesh() //----------------------------------------------------------------------------- LLViewerJointMesh::~LLViewerJointMesh() { - mMesh = NULL; - mTexture = NULL; - freeSkinData(); -} - - -//----------------------------------------------------------------------------- -// LLViewerJointMesh::allocateSkinData() -//----------------------------------------------------------------------------- -BOOL LLViewerJointMesh::allocateSkinData( U32 numSkinJoints ) -{ - mSkinJoints = new LLSkinJoint[ numSkinJoints ]; - mNumSkinJoints = numSkinJoints; - return TRUE; -} - -//----------------------------------------------------------------------------- -// LLViewerJointMesh::freeSkinData() -//----------------------------------------------------------------------------- -void LLViewerJointMesh::freeSkinData() -{ - mNumSkinJoints = 0; - delete [] mSkinJoints; - mSkinJoints = NULL; -} - -//-------------------------------------------------------------------- -// LLViewerJointMesh::getColor() -//-------------------------------------------------------------------- -void LLViewerJointMesh::getColor( F32 *red, F32 *green, F32 *blue, F32 *alpha ) -{ - *red = mColor[0]; - *green = mColor[1]; - *blue = mColor[2]; - *alpha = mColor[3]; -} - -//-------------------------------------------------------------------- -// LLViewerJointMesh::setColor() -//-------------------------------------------------------------------- -void LLViewerJointMesh::setColor( F32 red, F32 green, F32 blue, F32 alpha ) -{ - mColor[0] = red; - mColor[1] = green; - mColor[2] = blue; - mColor[3] = alpha; -} - - -//-------------------------------------------------------------------- -// LLViewerJointMesh::getTexture() -//-------------------------------------------------------------------- -//LLViewerTexture *LLViewerJointMesh::getTexture() -//{ -// return mTexture; -//} - -//-------------------------------------------------------------------- -// LLViewerJointMesh::setTexture() -//-------------------------------------------------------------------- -void LLViewerJointMesh::setTexture( LLViewerTexture *texture ) -{ - mTexture = texture; - - // texture and dynamic_texture are mutually exclusive - if( texture ) - { - mLayerSet = NULL; - //texture->bindTexture(0); - //texture->setClamp(TRUE, TRUE); - } -} - -//-------------------------------------------------------------------- -// LLViewerJointMesh::setLayerSet() -// Sets the shape texture (takes precedence over normal texture) -//-------------------------------------------------------------------- -void LLViewerJointMesh::setLayerSet( LLTexLayerSet* layer_set ) -{ - mLayerSet = layer_set; - - // texture and dynamic_texture are mutually exclusive - if( layer_set ) - { - mTexture = NULL; - } -} - - - -//-------------------------------------------------------------------- -// LLViewerJointMesh::getMesh() -//-------------------------------------------------------------------- -LLPolyMesh *LLViewerJointMesh::getMesh() -{ - return mMesh; -} - -//----------------------------------------------------------------------------- -// LLViewerJointMesh::setMesh() -//----------------------------------------------------------------------------- -void LLViewerJointMesh::setMesh( LLPolyMesh *mesh ) -{ - // set the mesh pointer - mMesh = mesh; - - // release any existing skin joints - freeSkinData(); - - if ( mMesh == NULL ) - { - return; - } - - // acquire the transform from the mesh object - setPosition( mMesh->getPosition() ); - setRotation( mMesh->getRotation() ); - setScale( mMesh->getScale() ); - - // create skin joints if necessary - if ( mMesh->hasWeights() && !mMesh->isLOD()) - { - U32 numJointNames = mMesh->getNumJointNames(); - - allocateSkinData( numJointNames ); - std::string *jointNames = mMesh->getJointNames(); - - U32 jn; - for (jn = 0; jn < numJointNames; jn++) - { - //llinfos << "Setting up joint " << jointNames[jn] << llendl; - LLViewerJoint* joint = (LLViewerJoint*)(getRoot()->findJoint(jointNames[jn]) ); - mSkinJoints[jn].setupSkinJoint( joint ); - } - } - - // setup joint array - if (!mMesh->isLOD()) - { - setupJoint((LLViewerJoint*)getRoot()); - } - -// llinfos << "joint render entries: " << mMesh->mJointRenderData.count() << llendl; -} - -//----------------------------------------------------------------------------- -// setupJoint() -//----------------------------------------------------------------------------- -void LLViewerJointMesh::setupJoint(LLViewerJoint* current_joint) -{ -// llinfos << "Mesh: " << getName() << llendl; - -// S32 joint_count = 0; - U32 sj; - for (sj=0; sj<mNumSkinJoints; sj++) - { - LLSkinJoint &js = mSkinJoints[sj]; - - if (js.mJoint != current_joint) - { - continue; - } - - // we've found a skinjoint for this joint.. - - // is the last joint in the array our parent? - if(mMesh->mJointRenderData.count() && mMesh->mJointRenderData[mMesh->mJointRenderData.count() - 1]->mWorldMatrix == ¤t_joint->getParent()->getWorldMatrix()) - { - // ...then just add ourselves - LLViewerJoint* jointp = js.mJoint; - mMesh->mJointRenderData.put(new LLJointRenderData(&jointp->getWorldMatrix(), &js)); -// llinfos << "joint " << joint_count << js.mJoint->getName() << llendl; -// joint_count++; - } - // otherwise add our parent and ourselves - else - { - mMesh->mJointRenderData.put(new LLJointRenderData(¤t_joint->getParent()->getWorldMatrix(), NULL)); -// llinfos << "joint " << joint_count << current_joint->getParent()->getName() << llendl; -// joint_count++; - mMesh->mJointRenderData.put(new LLJointRenderData(¤t_joint->getWorldMatrix(), &js)); -// llinfos << "joint " << joint_count << current_joint->getName() << llendl; -// joint_count++; - } - } - - // depth-first traversal - for (LLJoint::child_list_t::iterator iter = current_joint->mChildren.begin(); - iter != current_joint->mChildren.end(); ++iter) - { - LLViewerJoint* child_joint = (LLViewerJoint*)(*iter); - setupJoint(child_joint); - } } const S32 NUM_AXES = 3; @@ -475,21 +201,6 @@ void LLViewerJointMesh::uploadJointMatrices() } //-------------------------------------------------------------------- -// LLViewerJointMesh::drawBone() -//-------------------------------------------------------------------- -void LLViewerJointMesh::drawBone() -{ -} - -//-------------------------------------------------------------------- -// LLViewerJointMesh::isTransparent() -//-------------------------------------------------------------------- -BOOL LLViewerJointMesh::isTransparent() -{ - return mIsTransparent; -} - -//-------------------------------------------------------------------- // DrawElementsBLEND and utility code //-------------------------------------------------------------------- @@ -544,6 +255,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy) llassert( !(mTexture.notNull() && mLayerSet) ); // mutually exclusive LLTexUnit::eTextureAddressMode old_mode = LLTexUnit::TAM_WRAP; + LLViewerTexLayerSet *layerset = dynamic_cast<LLViewerTexLayerSet*>(mLayerSet); if (mTestImageName) { gGL.getTexUnit(diffuse_channel)->bindManual(LLTexUnit::TT_TEXTURE, mTestImageName); @@ -558,11 +270,11 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy) gGL.getTexUnit(diffuse_channel)->setTextureColorBlend(LLTexUnit::TBO_LERP_TEX_ALPHA, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR); } } - else if( !is_dummy && mLayerSet ) + else if( !is_dummy && layerset ) { - if( mLayerSet->hasComposite() ) + if( layerset->hasComposite() ) { - gGL.getTexUnit(diffuse_channel)->bind(mLayerSet->getComposite()); + gGL.getTexUnit(diffuse_channel)->bind(layerset->getViewerComposite()); } else { diff --git a/indra/newview/llviewerjointmesh.h b/indra/newview/llviewerjointmesh.h index dd5dae1dc1..0db2836e15 100644 --- a/indra/newview/llviewerjointmesh.h +++ b/indra/newview/llviewerjointmesh.h @@ -1,6 +1,6 @@ /** * @file llviewerjointmesh.h - * @brief Implementation of LLViewerJointMesh class + * @brief Declaration of LLViewerJointMesh class * * $LicenseInfo:firstyear=2001&license=viewerlgpl$ * Second Life Viewer Source Code @@ -29,64 +29,20 @@ #include "llviewerjoint.h" #include "llviewertexture.h" +#include "llavatarjointmesh.h" #include "llpolymesh.h" #include "v4color.h" class LLDrawable; class LLFace; class LLCharacter; -class LLTexLayerSet; - -typedef enum e_avatar_render_pass -{ - AVATAR_RENDER_PASS_SINGLE, - AVATAR_RENDER_PASS_CLOTHING_INNER, - AVATAR_RENDER_PASS_CLOTHING_OUTER -} EAvatarRenderPass; - -class LLSkinJoint -{ -public: - LLSkinJoint(); - ~LLSkinJoint(); - BOOL setupSkinJoint( LLViewerJoint *joint); - - LLViewerJoint *mJoint; - LLVector3 mRootToJointSkinOffset; - LLVector3 mRootToParentJointSkinOffset; -}; +class LLViewerTexLayerSet; //----------------------------------------------------------------------------- // class LLViewerJointMesh //----------------------------------------------------------------------------- -class LLViewerJointMesh : public LLViewerJoint +class LLViewerJointMesh : public LLAvatarJointMesh, public LLViewerJoint { - friend class LLVOAvatar; -protected: - LLColor4 mColor; // color value -// LLColor4 mSpecular; // specular color (always white for now) - F32 mShiny; // shiny value - LLPointer<LLViewerTexture> mTexture; // ptr to a global texture - LLTexLayerSet* mLayerSet; // ptr to a layer set owned by the avatar - U32 mTestImageName; // handle to a temporary texture for previewing uploads - LLPolyMesh* mMesh; // ptr to a global polymesh - BOOL mCullBackFaces; // true by default - LLFace* mFace; // ptr to a face w/ AGP copy of mesh - - U32 mFaceIndexCount; - BOOL mIsTransparent; - - U32 mNumSkinJoints; - LLSkinJoint* mSkinJoints; - S32 mMeshID; - -public: - static BOOL sPipelineRender; - //RN: this is here for testing purposes - static U32 sClothingMaskImageName; - static EAvatarRenderPass sRenderPass; - static LLColor4 sClothingInnerColor; - public: // Constructor LLViewerJointMesh(); @@ -94,67 +50,28 @@ public: // Destructor virtual ~LLViewerJointMesh(); - // Gets the shape color - void getColor( F32 *red, F32 *green, F32 *blue, F32 *alpha ); - - // Sets the shape color - void setColor( F32 red, F32 green, F32 blue, F32 alpha ); - - // Sets the shininess - void setSpecular( const LLColor4& color, F32 shiny ) { /*mSpecular = color;*/ mShiny = shiny; }; - - // Sets the shape texture - void setTexture( LLViewerTexture *texture ); - - void setTestTexture( U32 name ) { mTestImageName = name; } - - // Sets layer set responsible for a dynamic shape texture (takes precedence over normal texture) - void setLayerSet( LLTexLayerSet* layer_set ); - - // Gets the poly mesh - LLPolyMesh *getMesh(); - - // Sets the poly mesh - void setMesh( LLPolyMesh *mesh ); - - // Sets up joint matrix data for rendering - void setupJoint(LLViewerJoint* current_joint); - // Render time method to upload batches of joint matrices void uploadJointMatrices(); - // Sets ID for picking - void setMeshID( S32 id ) {mMeshID = id;} - - // Gets ID for picking - S32 getMeshID() { return mMeshID; } - // overloaded from base class - /*virtual*/ void drawBone(); - /*virtual*/ BOOL isTransparent(); /*virtual*/ U32 drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy ); + // necessary because MS's compiler warns on function inheritance via dominance in the diamond inheritance here. + // warns even though LLViewerJoint holds the only non virtual implementation. + /*virtual*/ U32 render( F32 pixelArea, BOOL first_pass = TRUE, BOOL is_dummy = FALSE ) { return LLViewerJoint::render(pixelArea,first_pass,is_dummy);} + /*virtual*/ void updateFaceSizes(U32 &num_vertices, U32& num_indices, F32 pixel_area); /*virtual*/ void updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_wind = FALSE, bool terse_update = false); /*virtual*/ BOOL updateLOD(F32 pixel_area, BOOL activate); /*virtual*/ void updateJointGeometry(); /*virtual*/ void dump(); - void setIsTransparent(BOOL is_transparent) { mIsTransparent = is_transparent; } - /*virtual*/ BOOL isAnimatable() const { return FALSE; } private: //copy mesh into given face's vertex buffer, applying current animation pose static void updateGeometry(LLFace* face, LLPolyMesh* mesh); - -private: - // Allocate skin data - BOOL allocateSkinData( U32 numSkinJoints ); - - // Free skin data - void freeSkinData(); }; #endif // LL_LLVIEWERJOINTMESH_H diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index 4543a1ba9a..297906803b 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -406,11 +406,9 @@ void LLViewerMediaFocus::update() LLViewerObject *viewer_object = getFocusedObject(); S32 face = mFocusedObjectFace; LLVector3 normal = mFocusedObjectNormal; - bool focus = true; if(!media_impl || !viewer_object) { - focus = false; media_impl = getHoverMediaImpl(); viewer_object = getHoverObject(); face = mHoverObjectFace; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 2735e908cd..5e2f05f468 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -125,7 +125,7 @@ #include "llpathfindingmanager.h" #include "boost/unordered_map.hpp" -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines; typedef LLPointer<LLViewerObject> LLViewerObjectPtr; @@ -1558,11 +1558,26 @@ class LLAdvancedEnableGrabBakedTexture : public view_listener_t /////////////////////// +class LLAdvancedEnableAppearanceToXML : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + return gSavedSettings.getBOOL("DebugAvatarAppearanceMessage"); + } +}; + class LLAdvancedAppearanceToXML : public view_listener_t { bool handleEvent(const LLSD& userdata) { - LLVOAvatar::dumpArchetypeXML(NULL); + std::string emptyname; + LLVOAvatar* avatar = + find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); + if (!avatar) + { + avatar = gAgentAvatarp; + } + avatar->dumpArchetypeXML(emptyname); return true; } }; @@ -2808,7 +2823,7 @@ class LLSelfRemoveAllAttachments : public view_listener_t { bool handleEvent(const LLSD& userdata) { - LLAgentWearables::userRemoveAllAttachments(); + LLAppearanceMgr::instance().removeAllAttachmentsFromAvatar(); return true; } }; @@ -6418,23 +6433,21 @@ class LLAttachmentDetachFromPoint : public view_listener_t { bool handleEvent(const LLSD& user_data) { + uuid_vec_t ids_to_remove; const LLViewerJointAttachment *attachment = get_if_there(gAgentAvatarp->mAttachmentPoints, user_data.asInteger(), (LLViewerJointAttachment*)NULL); if (attachment->getNumObjects() > 0) { - gMessageSystem->newMessage("ObjectDetach"); - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - for (LLViewerJointAttachment::attachedobjs_vec_t::const_iterator iter = attachment->mAttachedObjects.begin(); iter != attachment->mAttachedObjects.end(); iter++) { LLViewerObject *attached_object = (*iter); - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, attached_object->getLocalID()); + ids_to_remove.push_back(attached_object->getAttachmentItemID()); } - gMessageSystem->sendReliable( gAgent.getRegionHost() ); + } + if (!ids_to_remove.empty()) + { + LLAppearanceMgr::instance().removeItemsFromAvatar(ids_to_remove); } return true; } @@ -6507,17 +6520,8 @@ class LLAttachmentDetach : public view_listener_t return true; } - // The sendDetach() method works on the list of selected - // objects. Thus we need to clear the list, make sure it only - // contains the object the user clicked, send the message, - // then clear the list. - // We use deselectAll to update the simulator's notion of what's - // selected, and removeAll just to change things locally. - //RN: I thought it was more useful to detach everything that was selected - if (LLSelectMgr::getInstance()->getSelection()->isAttachment()) - { - LLSelectMgr::getInstance()->sendDetach(); - } + LLAppearanceMgr::instance().removeItemFromAvatar(object->getAttachmentItemID()); + return true; } }; @@ -7422,7 +7426,7 @@ void handle_grab_baked_texture(void* data) if(folder_id.notNull()) { std::string name; - name = "Baked " + LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_tex_index)->mNameCapitalized + " Texture"; + name = "Baked " + LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(baked_tex_index)->mNameCapitalized + " Texture"; LLUUID item_id; item_id.generate(); @@ -7681,6 +7685,10 @@ void handle_rebake_textures(void*) // Slam pending upload count to "unstick" things bool slam_for_debug = true; gAgentAvatarp->forceBakeAllTextures(slam_for_debug); + if (gAgent.getRegion() && gAgent.getRegion()->getCentralBakeVersion()) + { + LLAppearanceMgr::instance().requestServerAppearanceUpdate(); + } } void toggle_visibility(void* user_data) @@ -7963,7 +7971,7 @@ class LLEditTakeOff : public view_listener_t { std::string clothing = userdata.asString(); if (clothing == "all") - LLWearableBridge::removeAllClothesFromAvatar(); + LLAppearanceMgr::instance().removeAllClothesFromAvatar(); else { LLWearableType::EType type = LLWearableType::typeNameToType(clothing); @@ -7973,8 +7981,8 @@ class LLEditTakeOff : public view_listener_t { // MULTI-WEARABLES: assuming user wanted to remove top shirt. U32 wearable_index = gAgentWearables.getWearableCount(type) - 1; - LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(gAgentWearables.getWearableInventoryItem(type,wearable_index)); - LLWearableBridge::removeItemFromAvatar(item); + LLUUID item_id = gAgentWearables.getWearableItemID(type,wearable_index); + LLAppearanceMgr::instance().removeItemFromAvatar(item_id); } } @@ -8314,8 +8322,6 @@ void initialize_menus() view_listener_t::addEnable(new LLUploadCostCalculator(), "Upload.CalculateCosts"); - - commit.add("Inventory.NewWindow", boost::bind(&LLFloaterInventory::showAgentInventory)); enable.add("Conversation.IsConversationLoggingAllowed", boost::bind(&LLFloaterIMContainer::isConversationLoggingAllowed)); // Agent @@ -8533,6 +8539,7 @@ void initialize_menus() // Advanced > Character > Character Tests view_listener_t::addMenu(new LLAdvancedAppearanceToXML(), "Advanced.AppearanceToXML"); + view_listener_t::addMenu(new LLAdvancedEnableAppearanceToXML(), "Advanced.EnableAppearanceToXML"); view_listener_t::addMenu(new LLAdvancedToggleCharacterGeometry(), "Advanced.ToggleCharacterGeometry"); view_listener_t::addMenu(new LLAdvancedTestMale(), "Advanced.TestMale"); diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index 01534503f3..143420e227 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -138,6 +138,11 @@ bool handle_go_to(); // Export to XML or Collada void handle_export_selected( void * ); +// Convert strings to internal types +U32 render_type_from_string(std::string render_type); +U32 feature_from_string(std::string feature); +U32 info_display_from_string(std::string info_display); + class LLViewerMenuHolderGL : public LLMenuHolderGL { public: diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index a13c793899..3c0d6189ac 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -633,7 +633,6 @@ void send_sound_trigger(const LLUUID& sound_id, F32 gain) bool join_group_response(const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - BOOL delete_context_data = TRUE; bool accept_invite = false; LLUUID group_id = notification["payload"]["group_id"].asUUID(); @@ -662,7 +661,6 @@ bool join_group_response(const LLSD& notification, const LLSD& response) } else { - delete_context_data = FALSE; LLSD args; args["NAME"] = name; LLNotificationsUtil::add("JoinedTooManyGroupsMember", args, notification["payload"]); @@ -675,7 +673,6 @@ bool join_group_response(const LLSD& notification, const LLSD& response) // sure the user is sure they want to join. if (fee > 0) { - delete_context_data = FALSE; LLSD args; args["COST"] = llformat("%d", fee); // Set the fee for next time to 0, so that we don't keep @@ -3444,7 +3441,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) LLColor4 color(1.0f, 1.0f, 1.0f, 1.0f); LLUUID from_id; LLUUID owner_id; - BOOL is_owned_by_me = FALSE; LLViewerObject* chatter; msg->getString("ChatData", "FromName", from_name); @@ -3529,13 +3525,11 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) gAgent.heardChat(chat.mFromID); } } - - is_owned_by_me = chatter->permYouOwner(); } if (is_audible) { - BOOL visible_in_chat_bubble = FALSE; + //BOOL visible_in_chat_bubble = FALSE; color.setVec(1.f,1.f,1.f,1.f); msg->getStringFast(_PREHASH_ChatData, _PREHASH_Message, mesg); @@ -3618,7 +3612,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) if (!is_muted && !is_do_not_disturb) { - visible_in_chat_bubble = gSavedSettings.getBOOL("UseChatBubbles"); + //visible_in_chat_bubble = gSavedSettings.getBOOL("UseChatBubbles"); std::string formated_msg = ""; LLViewerChat::formatChatMsg(chat, formated_msg); LLChat chat_bubble = chat; @@ -4958,9 +4952,19 @@ void process_sim_stats(LLMessageSystem *msg, void **user_data) // Various hacks that aren't statistics, but are being handled here. // U32 max_tasks_per_region; - U32 region_flags; + U64 region_flags; msg->getU32("Region", "ObjectCapacity", max_tasks_per_region); - msg->getU32("Region", "RegionFlags", region_flags); + + if (msg->has(_PREHASH_RegionInfo)) + { + msg->getU64("RegionInfo", "RegionFlagsExtended", region_flags); + } + else + { + U32 flags = 0; + msg->getU32("Region", "RegionFlags", flags); + region_flags = flags; + } LLViewerRegion* regionp = gAgent.getRegion(); if (regionp) diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 286604e367..584c21cf45 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -41,7 +41,6 @@ #include "llframetimer.h" #include "llinventory.h" #include "llinventorydefines.h" -#include "llmaterialid.h" #include "llmaterialtable.h" #include "llmutelist.h" #include "llnamevalue.h" @@ -202,8 +201,6 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe mTotalCRC(0), mListIndex(-1), mTEImages(NULL), - mTENormalMaps(NULL), - mTESpecularMaps(NULL), mGLName(0), mbCanSelect(TRUE), mFlags(0), @@ -324,18 +321,6 @@ void LLViewerObject::deleteTEImages() { delete[] mTEImages; mTEImages = NULL; - - if (mTENormalMaps != NULL) - { - delete[] mTENormalMaps; - mTENormalMaps = NULL; - } - - if (mTESpecularMaps != NULL) - { - delete[] mTESpecularMaps; - mTESpecularMaps = NULL; - } } void LLViewerObject::markDead() @@ -2712,7 +2697,8 @@ void LLViewerObject::processTaskInvFile(void** user_data, S32 error_code, LLExtS if(ft && (0 == error_code) && (object = gObjectList.findObject(ft->mTaskID))) { - object->loadTaskInvFile(ft->mFilename); + if (object->loadTaskInvFile(ft->mFilename)) + { LLInventoryObject::object_list_t::iterator it = object->mInventory->begin(); LLInventoryObject::object_list_t::iterator end = object->mInventory->end(); @@ -2733,6 +2719,14 @@ void LLViewerObject::processTaskInvFile(void** user_data, S32 error_code, LLExtS } else { + // MAINT-2597 - crash when trying to edit a no-mod object + // Somehow get an contents inventory response, but with an invalid stream (possibly 0 size?) + // Stated repro was specific to no-mod objects so failing without user interaction should be safe. + llwarns << "Trying to load invalid task inventory file. Ignoring file contents." << llendl; + } + } + else + { // This Occurs When to requests were made, and the first one // has already handled it. lldebugs << "Problem loading task inventory. Return code: " @@ -2741,7 +2735,7 @@ void LLViewerObject::processTaskInvFile(void** user_data, S32 error_code, LLExtS delete ft; } -void LLViewerObject::loadTaskInvFile(const std::string& filename) +BOOL LLViewerObject::loadTaskInvFile(const std::string& filename) { std::string filename_and_local_path = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, filename); llifstream ifs(filename_and_local_path); @@ -2788,8 +2782,11 @@ void LLViewerObject::loadTaskInvFile(const std::string& filename) { llwarns << "unable to load task inventory: " << filename_and_local_path << llendl; + return FALSE; } doInventoryCallback(); + + return TRUE; } void LLViewerObject::doInventoryCallback() @@ -3281,14 +3278,14 @@ void LLViewerObject::boostTexturePriority(BOOL boost_children /* = TRUE */) S32 tex_count = getNumTEs(); for (i = 0; i < tex_count; i++) { - getTEImage(i)->setBoostLevel(LLViewerTexture::BOOST_SELECTED); + getTEImage(i)->setBoostLevel(LLGLTexture::BOOST_SELECTED); } if (isSculpted() && !isMesh()) { LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); LLUUID sculpt_id = sculpt_params->getSculptTexture(); - LLViewerTextureManager::getFetchedTexture(sculpt_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLViewerTexture::BOOST_SELECTED); + LLViewerTextureManager::getFetchedTexture(sculpt_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLGLTexture::BOOST_SELECTED); } if (boost_children) @@ -4043,15 +4040,15 @@ void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry) LLPrimitive::setTE(te, texture_entry); const LLUUID& image_id = getTE(te)->getID(); - mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); if (getTE(te)->getMaterialParams().notNull()) { const LLUUID& norm_id = getTE(te)->getMaterialParams()->getNormalID(); - mTENormalMaps[te] = LLViewerTextureManager::getFetchedTexture(norm_id, TRUE, LLViewerTexture::BOOST_BUMP, LLViewerTexture::LOD_TEXTURE); + mTENormalMaps[te] = LLViewerTextureManager::getFetchedTexture(norm_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); const LLUUID& spec_id = getTE(te)->getMaterialParams()->getSpecularID(); - mTESpecularMaps[te] = LLViewerTextureManager::getFetchedTexture(spec_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + mTESpecularMaps[te] = LLViewerTextureManager::getFetchedTexture(spec_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); } } @@ -4069,15 +4066,15 @@ void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep) } } - -S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host) +S32 LLViewerObject::setTETextureCore(const U8 te, LLViewerTexture *image) { + const LLUUID& uuid = image->getID(); S32 retval = 0; if (uuid != getTE(te)->getID() || uuid == LLUUID::null) { retval = LLPrimitive::setTETexture(te, uuid); - mTEImages[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); + mTEImages[te] = image; setChanged(TEXTURE); if (mDrawable.notNull()) { @@ -4087,49 +4084,52 @@ S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost hos return retval; } -S32 LLViewerObject::setTENormalMapCore(const U8 te, const LLUUID& uuid, LLHost host) +S32 LLViewerObject::setTENormalMapCore(const U8 te, LLViewerTexture *image) { - S32 retval = 0; - //if (uuid != getTE(te)->getMaterialParams()->getNormalID() || - // uuid == LLUUID::null) + llassert(image); + S32 retval = TEM_CHANGE_TEXTURE; + const LLUUID& uuid = image->getID(); + if (uuid != getTE(te)->getID() || + uuid == LLUUID::null) { - retval = TEM_CHANGE_TEXTURE; LLTextureEntry* tep = getTE(te); - LLMaterial* mat = tep->getMaterialParams(); + LLMaterial* mat = tep ? tep->getMaterialParams() : NULL; if (mat) { mat->setNormalID(uuid); } - mTENormalMaps[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_BUMP, LLViewerTexture::LOD_TEXTURE, 0, 0, host); + setChanged(TEXTURE); if (mDrawable.notNull()) { gPipeline.markTextured(mDrawable); } } + mTENormalMaps[te] = image; return retval; } -S32 LLViewerObject::setTESpecularMapCore(const U8 te, const LLUUID& uuid, LLHost host) +S32 LLViewerObject::setTESpecularMapCore(const U8 te, LLViewerTexture *image) { - S32 retval = 0; - //if (uuid != getTE(te)->getMaterialParams()->getSpecularID() || - // uuid == LLUUID::null) + llassert(image); + S32 retval = TEM_CHANGE_TEXTURE; + const LLUUID& uuid = image->getID(); + if (uuid != getTE(te)->getID() || + uuid == LLUUID::null) { - retval = TEM_CHANGE_TEXTURE; LLTextureEntry* tep = getTE(te); - LLMaterial* mat = tep->getMaterialParams(); + LLMaterial* mat = tep ? tep->getMaterialParams() : NULL; if (mat) { mat->setSpecularID(uuid); - } - mTESpecularMaps[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); + } setChanged(TEXTURE); if (mDrawable.notNull()) { gPipeline.markTextured(mDrawable); } } + mTESpecularMaps[te] = image; return retval; } @@ -4164,17 +4164,23 @@ void LLViewerObject::changeTESpecularMap(S32 index, LLViewerTexture* new_image) S32 LLViewerObject::setTETexture(const U8 te, const LLUUID& uuid) { // Invalid host == get from the agent's sim - return setTETextureCore(te, uuid, LLHost::invalid); + LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture( + uuid, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, LLHost::invalid); + return setTETextureCore(te,image); } S32 LLViewerObject::setTENormalMap(const U8 te, const LLUUID& uuid) { - return setTENormalMapCore(te, uuid, LLHost::invalid); + LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture( + uuid, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, LLHost::invalid); + return setTENormalMapCore(te, image); } S32 LLViewerObject::setTESpecularMap(const U8 te, const LLUUID& uuid) { - return setTESpecularMapCore(te, uuid, LLHost::invalid); + LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture( + uuid, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, LLHost::invalid); + return setTESpecularMapCore(te, image); } S32 LLViewerObject::setTEColor(const U8 te, const LLColor3& color) diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index a6569740bb..ba23ad97b0 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -55,7 +55,6 @@ class LLDrawable; class LLHost; class LLHUDText; class LLWorld; -class LLMaterialID; class LLNameValue; class LLNetMap; class LLMessageSystem; @@ -88,6 +87,18 @@ typedef void (*inventory_callback)(LLViewerObject*, S32 serial_num, void*); +// for exporting textured materials from SL +struct LLMaterialExportInfo +{ +public: + LLMaterialExportInfo(S32 mat_index, S32 texture_index, LLColor4 color) : + mMaterialIndex(mat_index), mTextureIndex(texture_index), mColor(color) {}; + + S32 mMaterialIndex; + S32 mTextureIndex; + LLColor4 mColor; +}; + struct PotentialReturnableObject { LLBBox box; @@ -292,9 +303,9 @@ public: /*virtual*/ S32 setTETexture(const U8 te, const LLUUID &uuid); /*virtual*/ S32 setTENormalMap(const U8 te, const LLUUID &uuid); /*virtual*/ S32 setTESpecularMap(const U8 te, const LLUUID &uuid); - S32 setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host); - S32 setTENormalMapCore(const U8 te, const LLUUID& uuid, LLHost host); - S32 setTESpecularMapCore(const U8 te, const LLUUID& uuid, LLHost host); + S32 setTETextureCore(const U8 te, LLViewerTexture *image); + S32 setTENormalMapCore(const U8 te, LLViewerTexture *image); + S32 setTESpecularMapCore(const U8 te, LLViewerTexture *image); /*virtual*/ S32 setTEColor(const U8 te, const LLColor3 &color); /*virtual*/ S32 setTEColor(const U8 te, const LLColor4 &color); /*virtual*/ S32 setTEScale(const U8 te, const F32 s, const F32 t); @@ -657,7 +668,7 @@ protected: // static void processTaskInvFile(void** user_data, S32 error_code, LLExtStat ext_status); - void loadTaskInvFile(const std::string& filename); + BOOL loadTaskInvFile(const std::string& filename); void doInventoryCallback(); BOOL isOnMap(); diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 4049e31472..11d34ad084 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -284,7 +284,6 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { LLFastTimer t(FTM_PROCESS_OBJECTS); - LLVector3d camera_global = gAgentCamera.getCameraPositionGlobal(); LLViewerObject *objectp; S32 num_objects; U32 local_id; @@ -303,6 +302,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { //llinfos << "TEST: !cached && !compressed && update_type != OUT_FULL" << llendl; gTerseObjectUpdates += num_objects; + /* S32 size; if (mesgsys->getReceiveCompressedSize()) { @@ -312,10 +312,12 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { size = mesgsys->getReceiveSize(); } - //llinfos << "Received terse " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl; + llinfos << "Received terse " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl; + */ } else { + /* S32 size; if (mesgsys->getReceiveCompressedSize()) { @@ -326,7 +328,8 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, size = mesgsys->getReceiveSize(); } - // llinfos << "Received " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl; + llinfos << "Received " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl; + */ gFullObjectUpdates += num_objects; } @@ -688,12 +691,12 @@ public: } } - void error(U32 statusNum, const std::string& reason) + void errorWithContent(U32 statusNum, const std::string& reason, const LLSD& content) { llwarns << "Transport error requesting object cost " - << "HTTP status: " << statusNum << ", reason: " - << reason << "." << llendl; + << "[status: " << statusNum << "]: " + << content << llendl; // TODO*: Error message to user // For now just clear the request from the pending list @@ -777,12 +780,12 @@ public: } } - void error(U32 statusNum, const std::string& reason) + void errorWithContent(U32 statusNum, const std::string& reason, const LLSD& content) { llwarns << "Transport error requesting object physics flags " - << "HTTP status: " << statusNum << ", reason: " - << reason << "." << llendl; + << "[status: " << statusNum << "]: " + << content << llendl; // TODO*: Error message to user // For now just clear the request from the pending list diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index 90fbc41daa..386b2fd400 100644 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -85,7 +85,6 @@ void LLViewerParcelMedia::update(LLParcel* parcel) } // we're in a parcel - bool new_parcel = false; S32 parcelid = parcel->getLocalID(); LLUUID regionid = gAgent.getRegion()->getRegionID(); @@ -94,7 +93,6 @@ void LLViewerParcelMedia::update(LLParcel* parcel) LL_DEBUGS("Media") << "New parcel, parcel id = " << parcelid << ", region id = " << regionid << LL_ENDL; sMediaParcelLocalID = parcelid; sMediaRegionID = regionid; - new_parcel = true; } std::string mediaUrl = std::string ( parcel->getMediaURL () ); diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 77e382b8c7..4cdb568d17 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -696,8 +696,8 @@ bool LLViewerParcelMgr::allowAgentScripts(const LLViewerRegion* region, const LL // This mirrors the traditional menu bar parcel icon code, but is not // technically correct. return region - && !(region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) - && !(region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) + && !region->getRegionFlag(REGION_FLAGS_SKIP_SCRIPTS) + && !region->getRegionFlag(REGION_FLAGS_ESTATE_SKIP_SCRIPTS) && parcel && parcel->getAllowOtherScripts(); } @@ -2057,7 +2057,7 @@ void LLViewerParcelMgr::startReleaseLand() return; } /* - if ((region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) + if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL) && !gAgent.isGodlike()) { LLSD args; @@ -2302,7 +2302,7 @@ void LLViewerParcelMgr::startDeedLandToGroup() /* if(!gAgent.isGodlike()) { - if((region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) + if(region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL) && (mCurrentParcel->getOwnerID() != region->getOwner())) { LLSD args; diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index d747ca7a67..8422708add 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -142,6 +142,7 @@ public: LLUUID mCacheID; CapabilityMap mCapabilities; + CapabilityMap mSecondCapabilitiesTracker; LLEventPoll* mEventPoll; @@ -209,9 +210,9 @@ public: virtual ~BaseCapabilitiesComplete() { } - void error(U32 statusNum, const std::string& reason) + void errorWithContent(U32 statusNum, const std::string& reason, const LLSD& content) { - LL_WARNS2("AppInit", "Capabilities") << statusNum << ": " << reason << LL_ENDL; + LL_WARNS2("AppInit", "Capabilities") << "[status:" << statusNum << ":] " << content << LL_ENDL; LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle); if (regionp) { @@ -237,6 +238,7 @@ public: for(iter = content.beginMap(); iter != content.endMap(); ++iter) { regionp->setCapability(iter->first, iter->second); + LL_DEBUGS2("AppInit", "Capabilities") << "got capability for " << iter->first << LL_ENDL; @@ -265,6 +267,62 @@ private: S32 mID; }; +class BaseCapabilitiesCompleteTracker : public LLHTTPClient::Responder +{ + LOG_CLASS(BaseCapabilitiesCompleteTracker); +public: + BaseCapabilitiesCompleteTracker( U64 region_handle) + : mRegionHandle(region_handle) + { } + + virtual ~BaseCapabilitiesCompleteTracker() + { } + + void errorWithContent(U32 statusNum, const std::string& reason, const LLSD& content) + { + llwarns << "BaseCapabilitiesCompleteTracker error [status:" + << statusNum << "]: " << content << llendl; + } + + void result(const LLSD& content) + { + LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle); + if( !regionp ) + { + return ; + } + LLSD::map_const_iterator iter; + for(iter = content.beginMap(); iter != content.endMap(); ++iter) + { + regionp->setCapabilityDebug(iter->first, iter->second); + //llinfos<<"BaseCapabilitiesCompleteTracker New Caps "<<iter->first<<" "<< iter->second<<llendl; + } + + if ( regionp->getRegionImpl()->mCapabilities.size() != regionp->getRegionImpl()->mSecondCapabilitiesTracker.size() ) + { + llinfos<<"BaseCapabilitiesCompleteTracker "<<"Sim sent duplicate seed caps that differs in size - most likely content."<<llendl; + //todo#add cap debug versus original check? + /*CapabilityMap::const_iterator iter = regionp->getRegionImpl()->mCapabilities.begin(); + while (iter!=regionp->getRegionImpl()->mCapabilities.end() ) + { + llinfos<<"BaseCapabilitiesCompleteTracker Original "<<iter->first<<" "<< iter->second<<llendl; + ++iter; + } + */ + regionp->getRegionImplNC()->mSecondCapabilitiesTracker.clear(); + } + + } + + static BaseCapabilitiesCompleteTracker* build( U64 region_handle ) + { + return new BaseCapabilitiesCompleteTracker( region_handle ); + } + +private: + U64 mRegionHandle; +}; + LLViewerRegion::LLViewerRegion(const U64 &handle, const LLHost &host, @@ -278,9 +336,11 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, mZoning(""), mIsEstateManager(FALSE), mRegionFlags( REGION_FLAGS_DEFAULT ), + mRegionProtocols( 0 ), mSimAccess( SIM_ACCESS_MIN ), mBillableFactor(1.0), mMaxTasks(DEFAULT_MAX_REGION_WIDE_PRIM_COUNT), + mCentralBakeVersion(0), mClassID(0), mCPURatio(0), mColoName("unknown"), @@ -453,18 +513,6 @@ void LLViewerRegion::sendReliableMessage() gMessageSystem->sendReliable(mImpl->mHost); } -void LLViewerRegion::setFlags(BOOL b, U32 flags) -{ - if (b) - { - mRegionFlags |= flags; - } - else - { - mRegionFlags &= ~flags; - } -} - void LLViewerRegion::setWaterHeight(F32 water_level) { mImpl->mLandp->setWaterHeight(water_level); @@ -477,10 +525,10 @@ F32 LLViewerRegion::getWaterHeight() const BOOL LLViewerRegion::isVoiceEnabled() const { - return (getRegionFlags() & REGION_FLAGS_ALLOW_VOICE); + return getRegionFlag(REGION_FLAGS_ALLOW_VOICE); } -void LLViewerRegion::setRegionFlags(U32 flags) +void LLViewerRegion::setRegionFlags(U64 flags) { mRegionFlags = flags; } @@ -573,7 +621,7 @@ std::string LLViewerRegion::getLocalizedSimProductName() const } // static -std::string LLViewerRegion::regionFlagsToString(U32 flags) +std::string LLViewerRegion::regionFlagsToString(U64 flags) { std::string result; @@ -1388,7 +1436,8 @@ void LLViewerRegion::unpackRegionHandshake() { LLMessageSystem *msg = gMessageSystem; - U32 region_flags; + U64 region_flags = 0; + U64 region_protocols = 0; U8 sim_access; std::string sim_name; LLUUID sim_owner; @@ -1397,7 +1446,6 @@ void LLViewerRegion::unpackRegionHandshake() F32 billable_factor; LLUUID cache_id; - msg->getU32 ("RegionInfo", "RegionFlags", region_flags); msg->getU8 ("RegionInfo", "SimAccess", sim_access); msg->getString ("RegionInfo", "SimName", sim_name); msg->getUUID ("RegionInfo", "SimOwner", sim_owner); @@ -1406,7 +1454,20 @@ void LLViewerRegion::unpackRegionHandshake() msg->getF32 ("RegionInfo", "BillableFactor", billable_factor); msg->getUUID ("RegionInfo", "CacheID", cache_id ); + if (msg->has(_PREHASH_RegionInfo4)) + { + msg->getU64Fast(_PREHASH_RegionInfo4, _PREHASH_RegionFlagsExtended, region_flags); + msg->getU64Fast(_PREHASH_RegionInfo4, _PREHASH_RegionProtocols, region_protocols); + } + else + { + U32 flags = 0; + msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, flags); + region_flags = flags; + } + setRegionFlags(region_flags); + setRegionProtocols(region_protocols); setSimAccess(sim_access); setRegionNameAndZone(sim_name); setOwner(sim_owner); @@ -1445,6 +1506,8 @@ void LLViewerRegion::unpackRegionHandshake() mProductName = productName; } + + mCentralBakeVersion = region_protocols & 1; // was (S32)gSavedSettings.getBOOL("UseServerTextureBaking"); LLVLComposition *compp = getComposition(); if (compp) { @@ -1529,6 +1592,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames) capabilityNames.append("FetchLibDescendents2"); capabilityNames.append("FetchInventory2"); capabilityNames.append("FetchInventoryDescendents2"); + capabilityNames.append("IncrementCOFVersion"); } capabilityNames.append("GetDisplayNames"); @@ -1572,6 +1636,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames) capabilityNames.append("UntrustedSimulatorMessage"); capabilityNames.append("UpdateAgentInformation"); capabilityNames.append("UpdateAgentLanguage"); + capabilityNames.append("UpdateAvatarAppearance"); capabilityNames.append("UpdateGestureAgentInventory"); capabilityNames.append("UpdateGestureTaskInventory"); capabilityNames.append("UpdateNotecardAgentInventory"); @@ -1592,6 +1657,12 @@ void LLViewerRegion::setSeedCapability(const std::string& url) if (getCapability("Seed") == url) { // llwarns << "Ignoring duplicate seed capability" << llendl; + //Instead of just returning we build up a second set of seed caps and compare them + //to the "original" seed cap received and determine why there is problem! + LLSD capabilityNames = LLSD::emptyArray(); + mImpl->buildCapabilityNames( capabilityNames ); + LLHTTPClient::post( url, capabilityNames, BaseCapabilitiesCompleteTracker::build(getHandle() ), + LLSD(), CAP_REQUEST_TIMEOUT ); return; } @@ -1664,9 +1735,9 @@ public: { } - void error(U32 statusNum, const std::string& reason) + void errorWithContent(U32 statusNum, const std::string& reason, const LLSD& content) { - LL_WARNS2("AppInit", "SimulatorFeatures") << statusNum << ": " << reason << LL_ENDL; + LL_WARNS2("AppInit", "SimulatorFeatures") << "[status:" << statusNum << "]: " << content << LL_ENDL; retry(); } @@ -1727,6 +1798,11 @@ void LLViewerRegion::setCapability(const std::string& name, const std::string& u } } +void LLViewerRegion::setCapabilityDebug(const std::string& name, const std::string& url) +{ + mImpl->mSecondCapabilitiesTracker[name] = url; +} + bool LLViewerRegion::isSpecialCapabilityName(const std::string &name) { return name == "EventQueueGet" || name == "UntrustedSimulatorMessage"; @@ -1734,6 +1810,11 @@ bool LLViewerRegion::isSpecialCapabilityName(const std::string &name) std::string LLViewerRegion::getCapability(const std::string& name) const { + if (!capabilitiesReceived() && (name!=std::string("Seed")) && (name!=std::string("ObjectMedia"))) + { + llwarns << "getCapability called before caps received" << llendl; + } + CapabilityMap::const_iterator iter = mImpl->mCapabilities.find(name); if(iter == mImpl->mCapabilities.end()) { @@ -1793,7 +1874,7 @@ LLSpatialPartition* LLViewerRegion::getSpatialPartition(U32 type) // the viewer can not yet distinquish between normal- and estate-owned objects // so we collapse these two bits and enable the UI if either are set -const U32 ALLOW_RETURN_ENCROACHING_OBJECT = REGION_FLAGS_ALLOW_RETURN_ENCROACHING_OBJECT +const U64 ALLOW_RETURN_ENCROACHING_OBJECT = REGION_FLAGS_ALLOW_RETURN_ENCROACHING_OBJECT | REGION_FLAGS_ALLOW_RETURN_ENCROACHING_ESTATE_OBJECT; bool LLViewerRegion::objectIsReturnable(const LLVector3& pos, const std::vector<LLBBox>& boxes) const @@ -1801,7 +1882,7 @@ bool LLViewerRegion::objectIsReturnable(const LLVector3& pos, const std::vector< return (mParcelOverlay != NULL) && (mParcelOverlay->isOwnedSelf(pos) || mParcelOverlay->isOwnedGroup(pos) - || ((mRegionFlags & ALLOW_RETURN_ENCROACHING_OBJECT) + || (getRegionFlag(ALLOW_RETURN_ENCROACHING_OBJECT) && mParcelOverlay->encroachesOwned(boxes)) ); } diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index c9fffaf30e..56cd0c9ea1 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -109,13 +109,13 @@ public: //void setAgentOffset(const LLVector3d &offset); void updateRenderMatrix(); - void setAllowDamage(BOOL b) { setFlags(b, REGION_FLAGS_ALLOW_DAMAGE); } - void setAllowLandmark(BOOL b) { setFlags(b, REGION_FLAGS_ALLOW_LANDMARK); } - void setAllowSetHome(BOOL b) { setFlags(b, REGION_FLAGS_ALLOW_SET_HOME); } - void setResetHomeOnTeleport(BOOL b) { setFlags(b, REGION_FLAGS_RESET_HOME_ON_TELEPORT); } - void setSunFixed(BOOL b) { setFlags(b, REGION_FLAGS_SUN_FIXED); } - void setBlockFly(BOOL b) { setFlags(b, REGION_FLAGS_BLOCK_FLY); } - void setAllowDirectTeleport(BOOL b) { setFlags(b, REGION_FLAGS_ALLOW_DIRECT_TELEPORT); } + void setAllowDamage(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_DAMAGE, b); } + void setAllowLandmark(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_LANDMARK, b); } + void setAllowSetHome(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_SET_HOME, b); } + void setResetHomeOnTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_RESET_HOME_ON_TELEPORT, b); } + void setSunFixed(BOOL b) { setRegionFlag(REGION_FLAGS_SUN_FIXED, b); } + void setBlockFly(BOOL b) { setRegionFlag(REGION_FLAGS_BLOCK_FLY, b); } + void setAllowDirectTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT, b); } inline BOOL getAllowDamage() const; @@ -156,8 +156,15 @@ public: LLViewerParcelOverlay *getParcelOverlay() const { return mParcelOverlay; } - void setRegionFlags(U32 flags); - U32 getRegionFlags() const { return mRegionFlags; } + inline void setRegionFlag(U64 flag, BOOL on); + inline BOOL getRegionFlag(U64 flag) const; + void setRegionFlags(U64 flags); + U64 getRegionFlags() const { return mRegionFlags; } + + inline void setRegionProtocol(U64 protocol, BOOL on); + BOOL getRegionProtocol(U64 protocol) const; + void setRegionProtocols(U64 protocols) { mRegionProtocols = protocols; } + U64 getRegionProtocols() const { return mRegionProtocols; } void setTimeDilation(F32 time_dilation); F32 getTimeDilation() const { return mTimeDilation; } @@ -195,7 +202,7 @@ public: std::string getLocalizedSimProductName() const; // Returns "Sandbox", "Expensive", etc. - static std::string regionFlagsToString(U32 flags); + static std::string regionFlagsToString(U64 flags); // Returns translated version of "Mature", "PG", "Adult", etc. static std::string accessToString(U8 sim_access); @@ -234,6 +241,7 @@ public: void failedSeedCapability(); S32 getNumSeedCapRetries(); void setCapability(const std::string& name, const std::string& url); + void setCapabilityDebug(const std::string& name, const std::string& url); // implements LLCapabilityProvider virtual std::string getCapability(const std::string& name) const; @@ -278,6 +286,8 @@ public: F32 getLandHeightRegion(const LLVector3& region_pos); + U8 getCentralBakeVersion() { return mCentralBakeVersion; } + void getInfo(LLSD& info); bool meshRezEnabled() const; @@ -330,6 +340,8 @@ public: void getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegions ); void getNeighboringRegionsStatus( std::vector<S32>& regions ); + const LLViewerRegionImpl * getRegionImpl() const { return mImpl; } + LLViewerRegionImpl * getRegionImplNC() { return mImpl; } public: struct CompareDistance @@ -345,7 +357,6 @@ public: protected: void disconnectAllNeighbors(); void initStats(); - void setFlags(BOOL b, U32 flags); public: LLWind mWind; @@ -390,11 +401,13 @@ private: U32 mPingDelay; F32 mDeltaTime; // Time since last measurement of lastPackets, Bits, etc - U32 mRegionFlags; // includes damage flags + U64 mRegionFlags; // includes damage flags + U64 mRegionProtocols; // protocols supported by this region U8 mSimAccess; F32 mBillableFactor; U32 mMaxTasks; // max prim count F32 mCameraDistanceSquared; // updated once per frame + U8 mCentralBakeVersion; // Information for Homestead / CR-53 S32 mClassID; @@ -423,6 +436,40 @@ private: LLSD mSimulatorFeatures; }; +inline BOOL LLViewerRegion::getRegionProtocol(U64 protocol) const +{ + return ((mRegionProtocols & protocol) != 0); +} + +inline void LLViewerRegion::setRegionProtocol(U64 protocol, BOOL on) +{ + if (on) + { + mRegionProtocols |= protocol; + } + else + { + mRegionProtocols &= ~protocol; + } +} + +inline BOOL LLViewerRegion::getRegionFlag(U64 flag) const +{ + return ((mRegionFlags & flag) != 0); +} + +inline void LLViewerRegion::setRegionFlag(U64 flag, BOOL on) +{ + if (on) + { + mRegionFlags |= flag; + } + else + { + mRegionFlags &= ~flag; + } +} + inline BOOL LLViewerRegion::getAllowDamage() const { return ((mRegionFlags & REGION_FLAGS_ALLOW_DAMAGE) !=0); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 850bf9677c..8c21145860 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -849,7 +849,7 @@ BOOL LLViewerShaderMgr::loadBasicShaders() for (U32 i = 0; i < shaders.size(); i++) { // Note usage of GL_VERTEX_SHADER_ARB - if (loadShaderFile(shaders[i].first, shaders[i].second, GL_VERTEX_SHADER_ARB, attribs) == 0) + if (loadShaderFile(shaders[i].first, shaders[i].second, GL_VERTEX_SHADER_ARB, &attribs) == 0) { return FALSE; } @@ -901,7 +901,7 @@ BOOL LLViewerShaderMgr::loadBasicShaders() for (U32 i = 0; i < shaders.size(); i++) { // Note usage of GL_FRAGMENT_SHADER_ARB - if (loadShaderFile(shaders[i].first, shaders[i].second, GL_FRAGMENT_SHADER_ARB, attribs, index_channels[i]) == 0) + if (loadShaderFile(shaders[i].first, shaders[i].second, GL_FRAGMENT_SHADER_ARB, &attribs, index_channels[i]) == 0) { return FALSE; } diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 35839ae459..35bba4184e 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -752,25 +752,6 @@ void LLViewerStats::PhaseMap::startPhase(const std::string& phase_name) timer.unpause(); } -void LLViewerStats::PhaseMap::stopPhase(const std::string& phase_name) -{ - phase_map_t::iterator iter = mPhaseMap.find(phase_name); - if (iter != mPhaseMap.end()) - { - if (iter->second.getStarted()) - { - // Going from started to paused state - record stats. - recordPhaseStat(phase_name,iter->second.getElapsedTimeF32()); - } - lldebugs << "stopPhase " << phase_name << llendl; - iter->second.pause(); - } - else - { - lldebugs << "stopPhase " << phase_name << " is not started, no-op" << llendl; - } -} - void LLViewerStats::PhaseMap::stopAllPhases() { for (phase_map_t::iterator iter = mPhaseMap.begin(); @@ -814,6 +795,19 @@ LLViewerStats::PhaseMap::PhaseMap() { } + +void LLViewerStats::PhaseMap::stopPhase(const std::string& phase_name) +{ + phase_map_t::iterator iter = mPhaseMap.find(phase_name); + if (iter != mPhaseMap.end()) + { + if (iter->second.getStarted()) + { + // Going from started to stopped state - record stats. + iter->second.stop(); + } + } +} // static LLViewerStats::StatsAccumulator& LLViewerStats::PhaseMap::getPhaseStats(const std::string& phase_name) { @@ -833,3 +827,18 @@ void LLViewerStats::PhaseMap::recordPhaseStat(const std::string& phase_name, F32 stats.push(value); } + +bool LLViewerStats::PhaseMap::getPhaseValues(const std::string& phase_name, F32& elapsed, bool& completed) +{ + phase_map_t::iterator iter = mPhaseMap.find(phase_name); + if (iter != mPhaseMap.end()) + { + elapsed = iter->second.getElapsedTimeF32(); + completed = !iter->second.getStarted(); + return true; + } + else + { + return false; + } +} diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index e02a4ccdc7..6b2461be41 100644 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -289,6 +289,7 @@ public: public: PhaseMap(); LLFrameTimer& getPhaseTimer(const std::string& phase_name); + bool getPhaseValues(const std::string& phase_name, F32& elapsed, bool& completed); void startPhase(const std::string& phase_name); void stopPhase(const std::string& phase_name); void stopAllPhases(); @@ -296,8 +297,11 @@ public: LLSD dumpPhases(); static StatsAccumulator& getPhaseStats(const std::string& phase_name); static void recordPhaseStat(const std::string& phase_name, F32 value); + phase_map_t::iterator begin() { return mPhaseMap.begin(); } + phase_map_t::iterator end() { return mPhaseMap.end(); } }; + private: F64 mStats[ST_COUNT]; diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp index 728f04af78..3ff2dfa4fe 100644 --- a/indra/newview/llviewerstatsrecorder.cpp +++ b/indra/newview/llviewerstatsrecorder.cpp @@ -256,7 +256,7 @@ void LLViewerStatsRecorder::writeToLog( F32 interval ) size_t data_size = data_msg.str().size(); if ( data_size != fwrite(data_msg.str().c_str(), 1, data_size, mObjectCacheFile )) { - llwarns << "Unable to write complete stats record to " << STATS_FILE_NAME << llendl; + llwarns << "Unable to write complete column data to " << STATS_FILE_NAME << llendl; } clearStats(); } diff --git a/indra/newview/llviewertexlayer.cpp b/indra/newview/llviewertexlayer.cpp new file mode 100644 index 0000000000..777e1f9c76 --- /dev/null +++ b/indra/newview/llviewertexlayer.cpp @@ -0,0 +1,748 @@ +/** + * @file llviewertexlayer.cpp + * @brief Viewer texture layer. Used for avatars. + * + * $LicenseInfo:firstyear=2012&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$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llviewertexlayer.h" + +#include "llagent.h" +#include "llimagej2c.h" +#include "llnotificationsutil.h" +#include "llvfile.h" +#include "llvfs.h" +#include "llviewerregion.h" +#include "llglslshader.h" +#include "llvoavatarself.h" +#include "pipeline.h" +#include "llassetuploadresponders.h" +#include "llviewercontrol.h" + +static const S32 BAKE_UPLOAD_ATTEMPTS = 7; +static const F32 BAKE_UPLOAD_RETRY_DELAY = 2.f; // actual delay grows by power of 2 each attempt + +// runway consolidate +extern std::string self_av_string(); + + +//----------------------------------------------------------------------------- +// LLBakedUploadData() +//----------------------------------------------------------------------------- +LLBakedUploadData::LLBakedUploadData(const LLVOAvatarSelf* avatar, + LLViewerTexLayerSet* layerset, + const LLUUID& id, + bool highest_res) : + mAvatar(avatar), + mTexLayerSet(layerset), + mID(id), + mStartTime(LLFrameTimer::getTotalTime()), // Record starting time + mIsHighestRes(highest_res) +{ +} + +//----------------------------------------------------------------------------- +// LLViewerTexLayerSetBuffer +// The composite image that a LLViewerTexLayerSet writes to. Each LLViewerTexLayerSet has one. +//----------------------------------------------------------------------------- + +// static +S32 LLViewerTexLayerSetBuffer::sGLByteCount = 0; + +LLViewerTexLayerSetBuffer::LLViewerTexLayerSetBuffer(LLTexLayerSet* const owner, + S32 width, S32 height) : + // ORDER_LAST => must render these after the hints are created. + LLTexLayerSetBuffer(owner), + LLViewerDynamicTexture( width, height, 4, LLViewerDynamicTexture::ORDER_LAST, TRUE ), + mUploadPending(FALSE), // Not used for any logic here, just to sync sending of updates + mNeedsUpload(FALSE), + mNumLowresUploads(0), + mUploadFailCount(0), + mNeedsUpdate(TRUE), + mNumLowresUpdates(0) +{ + LLViewerTexLayerSetBuffer::sGLByteCount += getSize(); + mNeedsUploadTimer.start(); + mNeedsUpdateTimer.start(); +} + +LLViewerTexLayerSetBuffer::~LLViewerTexLayerSetBuffer() +{ + LLViewerTexLayerSetBuffer::sGLByteCount -= getSize(); + destroyGLTexture(); + for( S32 order = 0; order < ORDER_COUNT; order++ ) + { + LLViewerDynamicTexture::sInstances[order].erase(this); // will fail in all but one case. + } +} + +//virtual +S8 LLViewerTexLayerSetBuffer::getType() const +{ + return LLViewerDynamicTexture::LL_TEX_LAYER_SET_BUFFER ; +} + +//virtual +void LLViewerTexLayerSetBuffer::restoreGLTexture() +{ + LLViewerDynamicTexture::restoreGLTexture() ; +} + +//virtual +void LLViewerTexLayerSetBuffer::destroyGLTexture() +{ + LLViewerDynamicTexture::destroyGLTexture() ; +} + +// static +void LLViewerTexLayerSetBuffer::dumpTotalByteCount() +{ + llinfos << "Composite System GL Buffers: " << (LLViewerTexLayerSetBuffer::sGLByteCount/1024) << "KB" << llendl; +} + +void LLViewerTexLayerSetBuffer::requestUpdate() +{ + restartUpdateTimer(); + mNeedsUpdate = TRUE; + mNumLowresUpdates = 0; + // If we're in the middle of uploading a baked texture, we don't care about it any more. + // When it's downloaded, ignore it. + mUploadID.setNull(); +} + +void LLViewerTexLayerSetBuffer::requestUpload() +{ + conditionalRestartUploadTimer(); + mNeedsUpload = TRUE; + mNumLowresUploads = 0; + mUploadPending = TRUE; +} + +void LLViewerTexLayerSetBuffer::conditionalRestartUploadTimer() +{ + // If we requested a new upload but haven't even uploaded + // a low res version of our last upload request, then + // keep the timer ticking instead of resetting it. + if (mNeedsUpload && (mNumLowresUploads == 0)) + { + mNeedsUploadTimer.unpause(); + } + else + { + mNeedsUploadTimer.reset(); + mNeedsUploadTimer.start(); + } +} + +void LLViewerTexLayerSetBuffer::restartUpdateTimer() +{ + mNeedsUpdateTimer.reset(); + mNeedsUpdateTimer.start(); +} + +void LLViewerTexLayerSetBuffer::cancelUpload() +{ + mNeedsUpload = FALSE; + mUploadPending = FALSE; + mNeedsUploadTimer.pause(); + mUploadRetryTimer.reset(); +} + +// virtual +BOOL LLViewerTexLayerSetBuffer::needsRender() +{ + llassert(mTexLayerSet->getAvatarAppearance() == gAgentAvatarp); + if (!isAgentAvatarValid()) return FALSE; + + const BOOL upload_now = mNeedsUpload && isReadyToUpload(); + const BOOL update_now = mNeedsUpdate && isReadyToUpdate(); + + // Don't render if we don't want to (or aren't ready to) upload or update. + if (!(update_now || upload_now)) + { + return FALSE; + } + + // Don't render if we're animating our appearance. + if (gAgentAvatarp->getIsAppearanceAnimating()) + { + return FALSE; + } + + // Don't render if we are trying to create a shirt texture but aren't wearing a skirt. + if (gAgentAvatarp->getBakedTE(getViewerTexLayerSet()) == LLAvatarAppearanceDefines::TEX_SKIRT_BAKED && + !gAgentAvatarp->isWearingWearableType(LLWearableType::WT_SKIRT)) + { + cancelUpload(); + return FALSE; + } + + // Render if we have at least minimal level of detail for each local texture. + return getViewerTexLayerSet()->isLocalTextureDataAvailable(); +} + +// virtual +void LLViewerTexLayerSetBuffer::preRenderTexLayerSet() +{ + LLTexLayerSetBuffer::preRenderTexLayerSet(); + + // keep depth buffer, we don't need to clear it + LLViewerDynamicTexture::preRender(FALSE); +} + +// virtual +void LLViewerTexLayerSetBuffer::postRenderTexLayerSet(BOOL success) +{ + + LLTexLayerSetBuffer::postRenderTexLayerSet(success); + LLViewerDynamicTexture::postRender(success); +} + +// virtual +void LLViewerTexLayerSetBuffer::midRenderTexLayerSet(BOOL success) +{ + // do we need to upload, and do we have sufficient data to create an uploadable composite? + // TODO: When do we upload the texture if gAgent.mNumPendingQueries is non-zero? + const BOOL upload_now = mNeedsUpload && isReadyToUpload(); + const BOOL update_now = mNeedsUpdate && isReadyToUpdate(); + + if(upload_now) + { + if (!success) + { + llinfos << "Failed attempt to bake " << mTexLayerSet->getBodyRegionName() << llendl; + mUploadPending = FALSE; + } + else + { + LLViewerTexLayerSet* layer_set = getViewerTexLayerSet(); + if (layer_set->isVisible()) + { + layer_set->getAvatar()->debugBakedTextureUpload(layer_set->getBakedTexIndex(), FALSE); // FALSE for start of upload, TRUE for finish. + doUpload(); + } + else + { + mUploadPending = FALSE; + mNeedsUpload = FALSE; + mNeedsUploadTimer.pause(); + layer_set->getAvatar()->setNewBakedTexture(layer_set->getBakedTexIndex(),IMG_INVISIBLE); + } + } + } + + if (update_now) + { + doUpdate(); + } + + // *TODO: Old logic does not check success before setGLTextureCreated + // we have valid texture data now + mGLTexturep->setGLTextureCreated(true); +} + +BOOL LLViewerTexLayerSetBuffer::isInitialized(void) const +{ + return mGLTexturep.notNull() && mGLTexturep->isGLTextureCreated(); +} + +BOOL LLViewerTexLayerSetBuffer::uploadPending() const +{ + return mUploadPending; +} + +BOOL LLViewerTexLayerSetBuffer::uploadNeeded() const +{ + return mNeedsUpload; +} + +BOOL LLViewerTexLayerSetBuffer::uploadInProgress() const +{ + return !mUploadID.isNull(); +} + +BOOL LLViewerTexLayerSetBuffer::isReadyToUpload() const +{ + if (!gAgentQueryManager.hasNoPendingQueries()) return FALSE; // Can't upload if there are pending queries. + if (isAgentAvatarValid() && gAgentAvatarp->isEditingAppearance()) return FALSE; // Don't upload if avatar is being edited. + + BOOL ready = FALSE; + if (getViewerTexLayerSet()->isLocalTextureDataFinal()) + { + // If we requested an upload and have the final LOD ready, upload (or wait a while if this is a retry) + if (mUploadFailCount == 0) + { + ready = TRUE; + } + else + { + ready = mUploadRetryTimer.getElapsedTimeF32() >= BAKE_UPLOAD_RETRY_DELAY * (1 << (mUploadFailCount - 1)); + } + } + else + { + // Upload if we've hit a timeout. Upload is a pretty expensive process so we need to make sure + // we aren't doing uploads too frequently. + const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureUploadTimeout"); + if (texture_timeout != 0) + { + // The timeout period increases exponentially between every lowres upload in order to prevent + // spamming the server with frequent uploads. + const U32 texture_timeout_threshold = texture_timeout*(1 << mNumLowresUploads); + + // If we hit our timeout and have textures available at even lower resolution, then upload. + const BOOL is_upload_textures_timeout = mNeedsUploadTimer.getElapsedTimeF32() >= texture_timeout_threshold; + const BOOL has_lower_lod = getViewerTexLayerSet()->isLocalTextureDataAvailable(); + ready = has_lower_lod && is_upload_textures_timeout; + } + } + + return ready; +} + +BOOL LLViewerTexLayerSetBuffer::isReadyToUpdate() const +{ + // If we requested an update and have the final LOD ready, then update. + if (getViewerTexLayerSet()->isLocalTextureDataFinal()) return TRUE; + + // If we haven't done an update yet, then just do one now regardless of state of textures. + if (mNumLowresUpdates == 0) return TRUE; + + // Update if we've hit a timeout. Unlike for uploads, we can make this timeout fairly small + // since render unnecessarily doesn't cost much. + const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedLocalTextureUpdateTimeout"); + if (texture_timeout != 0) + { + // If we hit our timeout and have textures available at even lower resolution, then update. + const BOOL is_update_textures_timeout = mNeedsUpdateTimer.getElapsedTimeF32() >= texture_timeout; + const BOOL has_lower_lod = getViewerTexLayerSet()->isLocalTextureDataAvailable(); + if (has_lower_lod && is_update_textures_timeout) return TRUE; + } + + return FALSE; +} + +BOOL LLViewerTexLayerSetBuffer::requestUpdateImmediate() +{ + mNeedsUpdate = TRUE; + BOOL result = FALSE; + + if (needsRender()) + { + preRender(FALSE); + result = render(); + postRender(result); + } + + return result; +} + +// Create the baked texture, send it out to the server, then wait for it to come +// back so we can switch to using it. +void LLViewerTexLayerSetBuffer::doUpload() +{ + LLViewerTexLayerSet* layer_set = getViewerTexLayerSet(); + LL_DEBUGS("Avatar") << "Uploading baked " << layer_set->getBodyRegionName() << llendl; + LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_BAKES); + + // Don't need caches since we're baked now. (note: we won't *really* be baked + // until this image is sent to the server and the Avatar Appearance message is received.) + layer_set->deleteCaches(); + + // Get the COLOR information from our texture + U8* baked_color_data = new U8[ mFullWidth * mFullHeight * 4 ]; + glReadPixels(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, GL_RGBA, GL_UNSIGNED_BYTE, baked_color_data ); + stop_glerror(); + + // Get the MASK information from our texture + LLGLSUIDefault gls_ui; + LLPointer<LLImageRaw> baked_mask_image = new LLImageRaw(mFullWidth, mFullHeight, 1 ); + U8* baked_mask_data = baked_mask_image->getData(); + layer_set->gatherMorphMaskAlpha(baked_mask_data, + mOrigin.mX, mOrigin.mY, + mFullWidth, mFullHeight); + + + // Create the baked image from our color and mask information + const S32 baked_image_components = 5; // red green blue [bump] clothing + LLPointer<LLImageRaw> baked_image = new LLImageRaw( mFullWidth, mFullHeight, baked_image_components ); + U8* baked_image_data = baked_image->getData(); + S32 i = 0; + for (S32 u=0; u < mFullWidth; u++) + { + for (S32 v=0; v < mFullHeight; v++) + { + baked_image_data[5*i + 0] = baked_color_data[4*i + 0]; + baked_image_data[5*i + 1] = baked_color_data[4*i + 1]; + baked_image_data[5*i + 2] = baked_color_data[4*i + 2]; + baked_image_data[5*i + 3] = baked_color_data[4*i + 3]; // alpha should be correct for eyelashes. + baked_image_data[5*i + 4] = baked_mask_data[i]; + i++; + } + } + + LLPointer<LLImageJ2C> compressedImage = new LLImageJ2C; + const char* comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // writes into baked_color_data. 5 channels (rgb, heightfield/alpha, mask) + if (compressedImage->encode(baked_image, comment_text)) + { + LLTransactionID tid; + tid.generate(); + const LLAssetID asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); + if (LLVFile::writeFile(compressedImage->getData(), compressedImage->getDataSize(), + gVFS, asset_id, LLAssetType::AT_TEXTURE)) + { + // Read back the file and validate. + BOOL valid = FALSE; + LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C; + S32 file_size = 0; + LLVFile file(gVFS, asset_id, LLAssetType::AT_TEXTURE); + file_size = file.getSize(); + U8* data = integrity_test->allocateData(file_size); + file.read(data, file_size); + if (data) + { + valid = integrity_test->validate(data, file_size); // integrity_test will delete 'data' + } + else + { + integrity_test->setLastError("Unable to read entire file"); + } + + if (valid) + { + const bool highest_lod = layer_set->isLocalTextureDataFinal(); + // Baked_upload_data is owned by the responder and deleted after the request completes. + LLBakedUploadData* baked_upload_data = new LLBakedUploadData(gAgentAvatarp, + layer_set, + asset_id, + highest_lod); + // upload ID is used to avoid overlaps, e.g. when the user rapidly makes two changes outside of Face Edit. + mUploadID = asset_id; + + // Upload the image + const std::string url = gAgent.getRegion()->getCapability("UploadBakedTexture"); + if(!url.empty() + && !LLPipeline::sForceOldBakedUpload // toggle debug setting UploadBakedTexOld to change between the new caps method and old method + && (mUploadFailCount < (BAKE_UPLOAD_ATTEMPTS - 1))) // Try last ditch attempt via asset store if cap upload is failing. + { + LLSD body = LLSD::emptyMap(); + // The responder will call LLViewerTexLayerSetBuffer::onTextureUploadComplete() + LLHTTPClient::post(url, body, new LLSendTexLayerResponder(body, mUploadID, LLAssetType::AT_TEXTURE, baked_upload_data)); + llinfos << "Baked texture upload via capability of " << mUploadID << " to " << url << llendl; + } + else + { + gAssetStorage->storeAssetData(tid, + LLAssetType::AT_TEXTURE, + LLViewerTexLayerSetBuffer::onTextureUploadComplete, + baked_upload_data, + TRUE, // temp_file + TRUE, // is_priority + TRUE); // store_local + llinfos << "Baked texture upload via Asset Store." << llendl; + } + + if (highest_lod) + { + // Sending the final LOD for the baked texture. All done, pause + // the upload timer so we know how long it took. + mNeedsUpload = FALSE; + mNeedsUploadTimer.pause(); + } + else + { + // Sending a lower level LOD for the baked texture. Restart the upload timer. + mNumLowresUploads++; + mNeedsUploadTimer.unpause(); + mNeedsUploadTimer.reset(); + } + + // Print out notification that we uploaded this texture. + if (gSavedSettings.getBOOL("DebugAvatarRezTime")) + { + const std::string lod_str = highest_lod ? "HighRes" : "LowRes"; + LLSD args; + args["EXISTENCE"] = llformat("%d",(U32)layer_set->getAvatar()->debugGetExistenceTimeElapsedF32()); + args["TIME"] = llformat("%d",(U32)mNeedsUploadTimer.getElapsedTimeF32()); + args["BODYREGION"] = layer_set->getBodyRegionName(); + args["RESOLUTION"] = lod_str; + LLNotificationsUtil::add("AvatarRezSelfBakedTextureUploadNotification",args); + LL_DEBUGS("Avatar") << self_av_string() << "Uploading [ name: " << layer_set->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUploadTimer.getElapsedTimeF32() << " ]" << LL_ENDL; + } + } + else + { + // The read back and validate operation failed. Remove the uploaded file. + mUploadPending = FALSE; + LLVFile file(gVFS, asset_id, LLAssetType::AT_TEXTURE, LLVFile::WRITE); + file.remove(); + llinfos << "Unable to create baked upload file (reason: corrupted)." << llendl; + } + } + } + else + { + // The VFS write file operation failed. + mUploadPending = FALSE; + llinfos << "Unable to create baked upload file (reason: failed to write file)" << llendl; + } + + delete [] baked_color_data; +} + +// Mostly bookkeeping; don't need to actually "do" anything since +// render() will actually do the update. +void LLViewerTexLayerSetBuffer::doUpdate() +{ + LLViewerTexLayerSet* layer_set = getViewerTexLayerSet(); + const BOOL highest_lod = layer_set->isLocalTextureDataFinal(); + if (highest_lod) + { + mNeedsUpdate = FALSE; + } + else + { + mNumLowresUpdates++; + } + + restartUpdateTimer(); + + // need to switch to using this layerset if this is the first update + // after getting the lowest LOD + layer_set->getAvatar()->updateMeshTextures(); + + // Print out notification that we updated this texture. + if (gSavedSettings.getBOOL("DebugAvatarRezTime")) + { + const BOOL highest_lod = layer_set->isLocalTextureDataFinal(); + const std::string lod_str = highest_lod ? "HighRes" : "LowRes"; + LLSD args; + args["EXISTENCE"] = llformat("%d",(U32)layer_set->getAvatar()->debugGetExistenceTimeElapsedF32()); + args["TIME"] = llformat("%d",(U32)mNeedsUpdateTimer.getElapsedTimeF32()); + args["BODYREGION"] = layer_set->getBodyRegionName(); + args["RESOLUTION"] = lod_str; + LLNotificationsUtil::add("AvatarRezSelfBakedTextureUpdateNotification",args); + LL_DEBUGS("Avatar") << self_av_string() << "Locally updating [ name: " << layer_set->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUpdateTimer.getElapsedTimeF32() << " ]" << LL_ENDL; + } +} + +// static +void LLViewerTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, + void* userdata, + S32 result, + LLExtStat ext_status) // StoreAssetData callback (not fixed) +{ + LLBakedUploadData* baked_upload_data = (LLBakedUploadData*)userdata; + + if (isAgentAvatarValid() && + !gAgentAvatarp->isDead() && + (baked_upload_data->mAvatar == gAgentAvatarp) && // Sanity check: only the user's avatar should be uploading textures. + (baked_upload_data->mTexLayerSet->hasComposite())) + { + LLViewerTexLayerSetBuffer* layerset_buffer = baked_upload_data->mTexLayerSet->getViewerComposite(); + S32 failures = layerset_buffer->mUploadFailCount; + layerset_buffer->mUploadFailCount = 0; + + if (layerset_buffer->mUploadID.isNull()) + { + // The upload got canceled, we should be in the + // process of baking a new texture so request an + // upload with the new data + + // BAP: does this really belong in this callback, as + // opposed to where the cancellation takes place? + // suspect this does nothing. + layerset_buffer->requestUpload(); + } + else if (baked_upload_data->mID == layerset_buffer->mUploadID) + { + // This is the upload we're currently waiting for. + layerset_buffer->mUploadID.setNull(); + const std::string name(baked_upload_data->mTexLayerSet->getBodyRegionName()); + const std::string resolution = baked_upload_data->mIsHighestRes ? " full res " : " low res "; + if (result >= 0) + { + layerset_buffer->mUploadPending = FALSE; // Allows sending of AgentSetAppearance later + LLAvatarAppearanceDefines::ETextureIndex baked_te = gAgentAvatarp->getBakedTE(layerset_buffer->getViewerTexLayerSet()); + // Update baked texture info with the new UUID + U64 now = LLFrameTimer::getTotalTime(); // Record starting time + llinfos << "Baked" << resolution << "texture upload for " << name << " took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl; + gAgentAvatarp->setNewBakedTexture(baked_te, uuid); + } + else + { + ++failures; + S32 max_attempts = baked_upload_data->mIsHighestRes ? BAKE_UPLOAD_ATTEMPTS : 1; // only retry final bakes + llwarns << "Baked" << resolution << "texture upload for " << name << " failed (attempt " << failures << "/" << max_attempts << ")" << llendl; + if (failures < max_attempts) + { + layerset_buffer->mUploadFailCount = failures; + layerset_buffer->mUploadRetryTimer.start(); + layerset_buffer->requestUpload(); + } + } + } + else + { + llinfos << "Received baked texture out of date, ignored." << llendl; + } + + gAgentAvatarp->dirtyMesh(); + } + else + { + // Baked texture failed to upload (in which case since we + // didn't set the new baked texture, it means that they'll try + // and rebake it at some point in the future (after login?)), + // or this response to upload is out of date, in which case a + // current response should be on the way or already processed. + llwarns << "Baked upload failed" << llendl; + } + + delete baked_upload_data; +} + +//----------------------------------------------------------------------------- +// LLViewerTexLayerSet +// An ordered set of texture layers that get composited into a single texture. +//----------------------------------------------------------------------------- + +LLViewerTexLayerSet::LLViewerTexLayerSet(LLAvatarAppearance* const appearance) : + LLTexLayerSet(appearance), + mUpdatesEnabled( FALSE ) +{ +} + +// virtual +LLViewerTexLayerSet::~LLViewerTexLayerSet() +{ +} + +// Returns TRUE if at least one packet of data has been received for each of the textures that this layerset depends on. +BOOL LLViewerTexLayerSet::isLocalTextureDataAvailable() const +{ + if (!mAvatarAppearance->isSelf()) return FALSE; + return getAvatar()->isLocalTextureDataAvailable(this); +} + + +// Returns TRUE if all of the data for the textures that this layerset depends on have arrived. +BOOL LLViewerTexLayerSet::isLocalTextureDataFinal() const +{ + if (!mAvatarAppearance->isSelf()) return FALSE; + return getAvatar()->isLocalTextureDataFinal(this); +} + +// virtual +void LLViewerTexLayerSet::requestUpdate() +{ + if( mUpdatesEnabled ) + { + createComposite(); + getViewerComposite()->requestUpdate(); + } +} + +void LLViewerTexLayerSet::requestUpload() +{ + createComposite(); + getViewerComposite()->requestUpload(); +} + +void LLViewerTexLayerSet::cancelUpload() +{ + if(mComposite) + { + getViewerComposite()->cancelUpload(); + } +} + +void LLViewerTexLayerSet::updateComposite() +{ + createComposite(); + getViewerComposite()->requestUpdateImmediate(); +} + +// virtual +void LLViewerTexLayerSet::createComposite() +{ + if(!mComposite) + { + S32 width = mInfo->getWidth(); + S32 height = mInfo->getHeight(); + // Composite other avatars at reduced resolution + if( !mAvatarAppearance->isSelf() ) + { + llerrs << "composites should not be created for non-self avatars!" << llendl; + } + mComposite = new LLViewerTexLayerSetBuffer( this, width, height ); + } +} + +void LLViewerTexLayerSet::setUpdatesEnabled( BOOL b ) +{ + mUpdatesEnabled = b; +} + +LLVOAvatarSelf* LLViewerTexLayerSet::getAvatar() +{ + return dynamic_cast<LLVOAvatarSelf*> (mAvatarAppearance); +} + +const LLVOAvatarSelf* LLViewerTexLayerSet::getAvatar() const +{ + return dynamic_cast<const LLVOAvatarSelf*> (mAvatarAppearance); +} + +LLViewerTexLayerSetBuffer* LLViewerTexLayerSet::getViewerComposite() +{ + return dynamic_cast<LLViewerTexLayerSetBuffer*> (getComposite()); +} + +const LLViewerTexLayerSetBuffer* LLViewerTexLayerSet::getViewerComposite() const +{ + return dynamic_cast<const LLViewerTexLayerSetBuffer*> (getComposite()); +} + + +const std::string LLViewerTexLayerSetBuffer::dumpTextureInfo() const +{ + if (!isAgentAvatarValid()) return ""; + + const BOOL is_high_res = !mNeedsUpload; + const U32 num_low_res = mNumLowresUploads; + const U32 upload_time = (U32)mNeedsUploadTimer.getElapsedTimeF32(); + const std::string local_texture_info = gAgentAvatarp->debugDumpLocalTextureDataInfo(getViewerTexLayerSet()); + + std::string status = "CREATING "; + if (!uploadNeeded()) status = "DONE "; + if (uploadInProgress()) status = "UPLOADING"; + + std::string text = llformat("[%s] [HiRes:%d LoRes:%d] [Elapsed:%d] %s", + status.c_str(), + is_high_res, num_low_res, + upload_time, + local_texture_info.c_str()); + return text; +} diff --git a/indra/newview/llviewertexlayer.h b/indra/newview/llviewertexlayer.h new file mode 100644 index 0000000000..959c883da8 --- /dev/null +++ b/indra/newview/llviewertexlayer.h @@ -0,0 +1,180 @@ +/** + * @file llviewertexlayer.h + * @brief Viewer Texture layer classes. Used for avatars. + * + * $LicenseInfo:firstyear=2012&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$ + */ + +#ifndef LL_VIEWER_TEXLAYER_H +#define LL_VIEWER_TEXLAYER_H + +#include "lldynamictexture.h" +#include "llextendedstatus.h" +#include "lltexlayer.h" + +class LLVOAvatarSelf; +class LLViewerTexLayerSetBuffer; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// LLViewerTexLayerSet +// +// An ordered set of texture layers that gets composited into a single texture. +// Only exists for llavatarappearanceself. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLViewerTexLayerSet : public LLTexLayerSet +{ +public: + LLViewerTexLayerSet(LLAvatarAppearance* const appearance); + virtual ~LLViewerTexLayerSet(); + + /*virtual*/void requestUpdate(); + void requestUpload(); + void cancelUpload(); + BOOL isLocalTextureDataAvailable() const; + BOOL isLocalTextureDataFinal() const; + void updateComposite(); + /*virtual*/void createComposite(); + void setUpdatesEnabled(BOOL b); + BOOL getUpdatesEnabled() const { return mUpdatesEnabled; } + + LLVOAvatarSelf* getAvatar(); + const LLVOAvatarSelf* getAvatar() const; + LLViewerTexLayerSetBuffer* getViewerComposite(); + const LLViewerTexLayerSetBuffer* getViewerComposite() const; + +private: + BOOL mUpdatesEnabled; + +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// LLViewerTexLayerSetBuffer +// +// The composite image that a LLViewerTexLayerSet writes to. Each LLViewerTexLayerSet has one. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLViewerTexLayerSetBuffer : public LLTexLayerSetBuffer, public LLViewerDynamicTexture +{ + LOG_CLASS(LLViewerTexLayerSetBuffer); + +public: + LLViewerTexLayerSetBuffer(LLTexLayerSet* const owner, S32 width, S32 height); + virtual ~LLViewerTexLayerSetBuffer(); + +public: + /*virtual*/ S8 getType() const; + BOOL isInitialized(void) const; + static void dumpTotalByteCount(); + const std::string dumpTextureInfo() const; + virtual void restoreGLTexture(); + virtual void destroyGLTexture(); +private: + LLViewerTexLayerSet* getViewerTexLayerSet() + { return dynamic_cast<LLViewerTexLayerSet*> (mTexLayerSet); } + const LLViewerTexLayerSet* getViewerTexLayerSet() const + { return dynamic_cast<const LLViewerTexLayerSet*> (mTexLayerSet); } + static S32 sGLByteCount; + + //-------------------------------------------------------------------- + // Tex Layer Render + //-------------------------------------------------------------------- + virtual void preRenderTexLayerSet(); + virtual void midRenderTexLayerSet(BOOL success); + virtual void postRenderTexLayerSet(BOOL success); + virtual S32 getCompositeOriginX() const { return getOriginX(); } + virtual S32 getCompositeOriginY() const { return getOriginY(); } + virtual S32 getCompositeWidth() const { return getFullWidth(); } + virtual S32 getCompositeHeight() const { return getFullHeight(); } + + //-------------------------------------------------------------------- + // Dynamic Texture Interface + //-------------------------------------------------------------------- +public: + /*virtual*/ BOOL needsRender(); +protected: + // Pass these along for tex layer rendering. + virtual void preRender(BOOL clear_depth) { preRenderTexLayerSet(); } + virtual void postRender(BOOL success) { postRenderTexLayerSet(success); } + virtual BOOL render() { return renderTexLayerSet(); } + + //-------------------------------------------------------------------- + // Uploads + //-------------------------------------------------------------------- +public: + void requestUpload(); + void cancelUpload(); + BOOL uploadNeeded() const; // We need to upload a new texture + BOOL uploadInProgress() const; // We have started uploading a new texture and are awaiting the result + BOOL uploadPending() const; // We are expecting a new texture to be uploaded at some point + static void onTextureUploadComplete(const LLUUID& uuid, + void* userdata, + S32 result, LLExtStat ext_status); +protected: + BOOL isReadyToUpload() const; + void doUpload(); // Does a read back and upload. + void conditionalRestartUploadTimer(); +private: + BOOL mNeedsUpload; // Whether we need to send our baked textures to the server + U32 mNumLowresUploads; // Number of times we've sent a lowres version of our baked textures to the server + BOOL mUploadPending; // Whether we have received back the new baked textures + LLUUID mUploadID; // The current upload process (null if none). + LLFrameTimer mNeedsUploadTimer; // Tracks time since upload was requested and performed. + S32 mUploadFailCount; // Number of consecutive upload failures + LLFrameTimer mUploadRetryTimer; // Tracks time since last upload failure. + + //-------------------------------------------------------------------- + // Updates + //-------------------------------------------------------------------- +public: + void requestUpdate(); + BOOL requestUpdateImmediate(); +protected: + BOOL isReadyToUpdate() const; + void doUpdate(); + void restartUpdateTimer(); +private: + BOOL mNeedsUpdate; // Whether we need to locally update our baked textures + U32 mNumLowresUpdates; // Number of times we've locally updated with lowres version of our baked textures + LLFrameTimer mNeedsUpdateTimer; // Tracks time since update was requested and performed. +}; + + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// LLBakedUploadData +// +// Used by LLTexLayerSetBuffer for a callback. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +struct LLBakedUploadData +{ + LLBakedUploadData(const LLVOAvatarSelf* avatar, + LLViewerTexLayerSet* layerset, + const LLUUID& id, + bool highest_res); + ~LLBakedUploadData() {} + const LLUUID mID; + const LLVOAvatarSelf* mAvatar; // note: backlink only; don't LLPointer + LLViewerTexLayerSet* mTexLayerSet; + const U64 mStartTime; // for measuring baked texture upload time + const bool mIsHighestRes; // whether this is a "final" bake, or intermediate low res +}; + +#endif // LL_VIEWER_TEXLAYER_H + diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 122d8f4a96..8036a4e258 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -1052,8 +1052,6 @@ void LLViewerTextEditor::findEmbeddedItemSegments(S32 start, S32 end) { LLWString text = getWText(); - LLColor4 text_color = ( mReadOnly ? mReadOnlyFgColor.get() : mFgColor.get() ); - // Start with i just after the first embedded item for(S32 idx = start; idx < end; idx++ ) { diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index a13cccd86b..037e53484d 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -56,6 +56,7 @@ #include "llface.h" #include "llviewercamera.h" #include "lltextureentry.h" +#include "lltexturemanagerbridge.h" #include "llmediaentry.h" #include "llvovolume.h" #include "llviewermedia.h" @@ -229,7 +230,7 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(BOOL usemipma if(generate_gl_tex) { tex->generateGLTexture() ; - tex->setCategory(LLViewerTexture::LOCAL) ; + tex->setCategory(LLGLTexture::LOCAL) ; } return tex ; } @@ -239,14 +240,14 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const LLUUID& if(generate_gl_tex) { tex->generateGLTexture() ; - tex->setCategory(LLViewerTexture::LOCAL) ; + tex->setCategory(LLGLTexture::LOCAL) ; } return tex ; } LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const LLImageRaw* raw, BOOL usemipmaps) { LLPointer<LLViewerTexture> tex = new LLViewerTexture(raw, usemipmaps) ; - tex->setCategory(LLViewerTexture::LOCAL) ; + tex->setCategory(LLGLTexture::LOCAL) ; return tex ; } LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps, BOOL generate_gl_tex) @@ -255,13 +256,14 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const U32 wid if(generate_gl_tex) { tex->generateGLTexture() ; - tex->setCategory(LLViewerTexture::LOCAL) ; + tex->setCategory(LLGLTexture::LOCAL) ; } return tex ; } LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture( const LLUUID &image_id, + FTType f_type, BOOL usemipmaps, LLViewerTexture::EBoostLevel boost_priority, S8 texture_type, @@ -269,11 +271,12 @@ LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture( LLGLenum primary_format, LLHost request_from_host) { - return gTextureList.getImage(image_id, usemipmaps, boost_priority, texture_type, internal_format, primary_format, request_from_host) ; + return gTextureList.getImage(image_id, f_type, usemipmaps, boost_priority, texture_type, internal_format, primary_format, request_from_host) ; } LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromFile( const std::string& filename, + FTType f_type, BOOL usemipmaps, LLViewerTexture::EBoostLevel boost_priority, S8 texture_type, @@ -281,11 +284,12 @@ LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromFile( LLGLenum primary_format, const LLUUID& force_id) { - return gTextureList.getImageFromFile(filename, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id) ; + return gTextureList.getImageFromFile(filename, f_type, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id) ; } //static LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromUrl(const std::string& url, + FTType f_type, BOOL usemipmaps, LLViewerTexture::EBoostLevel boost_priority, S8 texture_type, @@ -294,14 +298,34 @@ LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromUrl(const s const LLUUID& force_id ) { - return gTextureList.getImageFromUrl(url, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id) ; + return gTextureList.getImageFromUrl(url, f_type, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id) ; } -LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromHost(const LLUUID& image_id, LLHost host) +LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromHost(const LLUUID& image_id, FTType f_type, LLHost host) { - return gTextureList.getImageFromHost(image_id, host) ; + return gTextureList.getImageFromHost(image_id, f_type, host) ; } +// Create a bridge to the viewer texture manager. +class LLViewerTextureManagerBridge : public LLTextureManagerBridge +{ + /*virtual*/ LLPointer<LLGLTexture> getLocalTexture(BOOL usemipmaps = TRUE, BOOL generate_gl_tex = TRUE) + { + return LLViewerTextureManager::getLocalTexture(usemipmaps, generate_gl_tex); + } + + /*virtual*/ LLPointer<LLGLTexture> getLocalTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps, BOOL generate_gl_tex = TRUE) + { + return LLViewerTextureManager::getLocalTexture(width, height, components, usemipmaps, generate_gl_tex); + } + + /*virtual*/ LLGLTexture* getFetchedTexture(const LLUUID &image_id) + { + return LLViewerTextureManager::getFetchedTexture(image_id); + } +}; + + void LLViewerTextureManager::init() { { @@ -347,12 +371,12 @@ void LLViewerTextureManager::init() imagep->setCachedRawImage(0, image_raw) ; image_raw = NULL; #else - LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI); + LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLGLTexture::BOOST_UI); #endif LLViewerFetchedTexture::sDefaultImagep->dontDiscard(); - LLViewerFetchedTexture::sDefaultImagep->setCategory(LLViewerTexture::OTHER) ; + LLViewerFetchedTexture::sDefaultImagep->setCategory(LLGLTexture::OTHER) ; - LLViewerFetchedTexture::sSmokeImagep = LLViewerTextureManager::getFetchedTexture(IMG_SMOKE, TRUE, LLViewerTexture::BOOST_UI); + LLViewerFetchedTexture::sSmokeImagep = LLViewerTextureManager::getFetchedTexture(IMG_SMOKE, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI); LLViewerFetchedTexture::sSmokeImagep->setNoDelete() ; image_raw = new LLImageRaw(32,32,3); @@ -372,6 +396,9 @@ void LLViewerTextureManager::init() LLViewerTexture::initClass() ; + // Create a texture manager bridge. + gTextureManagerBridgep = new LLViewerTextureManagerBridge; + if (LLMetricPerformanceTesterBasic::isMetricLogRequested(sTesterName) && !LLMetricPerformanceTesterBasic::getTester(sTesterName)) { sTesterp = new LLTexturePipelineTester() ; @@ -387,6 +414,7 @@ void LLViewerTextureManager::cleanup() { stop_glerror(); + delete gTextureManagerBridgep; LLImageGL::sDefaultGLTexture = NULL ; LLViewerTexture::sNullImagep = NULL; LLViewerTexture::sBlackImagep = NULL; @@ -415,25 +443,6 @@ void LLViewerTexture::initClass() } } -// static -S32 LLViewerTexture::getTotalNumOfCategories() -{ - return MAX_GL_IMAGE_CATEGORY - (BOOST_HIGH - BOOST_SCULPTED) + 2 ; -} - -// static -//index starts from zero. -S32 LLViewerTexture::getIndexFromCategory(S32 category) -{ - return (category < BOOST_HIGH) ? category : category - (BOOST_HIGH - BOOST_SCULPTED) + 1 ; -} - -//static -S32 LLViewerTexture::getCategoryFromIndex(S32 index) -{ - return (index < BOOST_HIGH) ? index : index + (BOOST_HIGH - BOOST_SCULPTED) - 1 ; -} - // tuning params const F32 discard_bias_delta = .25f; const F32 discard_delta_time = 0.5f; @@ -569,80 +578,66 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity //------------------------------------------------------------------------------------------- const U32 LLViewerTexture::sCurrentFileVersion = 1; -LLViewerTexture::LLViewerTexture(BOOL usemipmaps) +LLViewerTexture::LLViewerTexture(BOOL usemipmaps) : + LLGLTexture(usemipmaps) { init(true); - mUseMipMaps = usemipmaps ; mID.generate(); sImageCount++; } -LLViewerTexture::LLViewerTexture(const LLUUID& id, BOOL usemipmaps) - : mID(id) +LLViewerTexture::LLViewerTexture(const LLUUID& id, BOOL usemipmaps) : + LLGLTexture(usemipmaps), + mID(id) { init(true); - mUseMipMaps = usemipmaps ; sImageCount++; } -LLViewerTexture::LLViewerTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps) +LLViewerTexture::LLViewerTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps) : + LLGLTexture(width, height, components, usemipmaps) { init(true); - mFullWidth = width ; - mFullHeight = height ; - mUseMipMaps = usemipmaps ; - mComponents = components ; - setTexelsPerImage(); - mID.generate(); sImageCount++; } -LLViewerTexture::LLViewerTexture(const LLImageRaw* raw, BOOL usemipmaps) +LLViewerTexture::LLViewerTexture(const LLImageRaw* raw, BOOL usemipmaps) : + LLGLTexture(raw, usemipmaps) { init(true); - mUseMipMaps = usemipmaps ; - mGLTexturep = new LLImageGL(raw, usemipmaps) ; - // Create an empty image of the specified size and width mID.generate(); sImageCount++; } LLViewerTexture::~LLViewerTexture() { + // LL_DEBUGS("Avatar") << mID << llendl; cleanup(); sImageCount--; } +// virtual void LLViewerTexture::init(bool firstinit) { - mBoostLevel = LLViewerTexture::BOOST_NONE; mSelectedTime = 0.f; - - mFullWidth = 0; - mFullHeight = 0; - mTexelsPerImage = 0 ; - mUseMipMaps = FALSE ; - mComponents = 0 ; - - mTextureState = NO_DELETE ; - mDontDiscard = FALSE; mMaxVirtualSize = 0.f; - mNeedsGLTexture = FALSE ; mMaxVirtualSizeResetInterval = 1; mMaxVirtualSizeResetCounter = mMaxVirtualSizeResetInterval ; mAdditionalDecodePriority = 0.f ; mParcelMedia = NULL ; - for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i) - { - mNumFaces[i] = 0; - mFaceList[i].clear(); - } + mNumVolumes = 0; + mFaceList[LLRender::DIFFUSE_MAP].clear() ; + mFaceList[LLRender::NORMAL_MAP].clear() ; + mFaceList[LLRender::SPECULAR_MAP].clear() ; + mNumFaces[LLRender::DIFFUSE_MAP] = + mNumFaces[LLRender::NORMAL_MAP] = + mNumFaces[LLRender::SPECULAR_MAP] = 0 ; mVolumeList.clear(); } @@ -654,24 +649,16 @@ S8 LLViewerTexture::getType() const void LLViewerTexture::cleanup() { - for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i) - { - mFaceList[i].clear() ; - } + mFaceList[LLRender::DIFFUSE_MAP].clear() ; + mFaceList[LLRender::NORMAL_MAP].clear() ; + mFaceList[LLRender::SPECULAR_MAP].clear() ; mVolumeList.clear(); - if(mGLTexturep) - { - mGLTexturep->cleanup(); - } } // virtual void LLViewerTexture::dump() { - if(mGLTexturep) - { - mGLTexturep->dump(); - } + LLGLTexture::dump(); llinfos << "LLViewerTexture" << " mID " << mID @@ -694,10 +681,8 @@ void LLViewerTexture::setBoostLevel(S32 level) { mSelectedTime = gFrameTimeSeconds; } - } - bool LLViewerTexture::bindDefaultImage(S32 stage) { if (stage < 0) return false; @@ -915,280 +900,18 @@ void LLViewerTexture::reorganizeVolumeList() mVolumeList.erase(mVolumeList.begin() + mNumVolumes, mVolumeList.end()); } - - //virtual void LLViewerTexture::switchToCachedImage() { //nothing here. } -void LLViewerTexture::forceActive() -{ - mTextureState = ACTIVE ; -} - -void LLViewerTexture::setActive() -{ - if(mTextureState != NO_DELETE) - { - mTextureState = ACTIVE ; - } -} - -//set the texture to stay in memory -void LLViewerTexture::setNoDelete() -{ - mTextureState = NO_DELETE ; -} - -void LLViewerTexture::generateGLTexture() -{ - if(mGLTexturep.isNull()) - { - mGLTexturep = new LLImageGL(mFullWidth, mFullHeight, mComponents, mUseMipMaps) ; - } -} - -LLImageGL* LLViewerTexture::getGLTexture() const -{ - llassert(mGLTexturep.notNull()) ; - - return mGLTexturep ; -} - -BOOL LLViewerTexture::createGLTexture() -{ - if(mGLTexturep.isNull()) - { - generateGLTexture() ; - } - - return mGLTexturep->createGLTexture() ; -} - -BOOL LLViewerTexture::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename, BOOL to_create, S32 category) -{ - llassert(mGLTexturep.notNull()) ; - - BOOL ret = mGLTexturep->createGLTexture(discard_level, imageraw, usename, to_create, category) ; - - if(ret) - { - mFullWidth = mGLTexturep->getCurrentWidth() ; - mFullHeight = mGLTexturep->getCurrentHeight() ; - mComponents = mGLTexturep->getComponents() ; - setTexelsPerImage(); - } - - return ret ; -} - //virtual void LLViewerTexture::setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) { //nothing here. } -void LLViewerTexture::setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, BOOL swap_bytes) -{ - llassert(mGLTexturep.notNull()) ; - - mGLTexturep->setExplicitFormat(internal_format, primary_format, type_format, swap_bytes) ; -} -void LLViewerTexture::setAddressMode(LLTexUnit::eTextureAddressMode mode) -{ - llassert(mGLTexturep.notNull()) ; - mGLTexturep->setAddressMode(mode) ; -} -void LLViewerTexture::setFilteringOption(LLTexUnit::eTextureFilterOptions option) -{ - llassert(mGLTexturep.notNull()) ; - mGLTexturep->setFilteringOption(option) ; -} - -//virtual -S32 LLViewerTexture::getWidth(S32 discard_level) const -{ - llassert(mGLTexturep.notNull()) ; - return mGLTexturep->getWidth(discard_level) ; -} - -//virtual -S32 LLViewerTexture::getHeight(S32 discard_level) const -{ - llassert(mGLTexturep.notNull()) ; - return mGLTexturep->getHeight(discard_level) ; -} - -S32 LLViewerTexture::getMaxDiscardLevel() const -{ - llassert(mGLTexturep.notNull()) ; - return mGLTexturep->getMaxDiscardLevel() ; -} -S32 LLViewerTexture::getDiscardLevel() const -{ - llassert(mGLTexturep.notNull()) ; - return mGLTexturep->getDiscardLevel() ; -} -S8 LLViewerTexture::getComponents() const -{ - llassert(mGLTexturep.notNull()) ; - - return mGLTexturep->getComponents() ; -} - -LLGLuint LLViewerTexture::getTexName() const -{ - llassert(mGLTexturep.notNull()) ; - - return mGLTexturep->getTexName() ; -} - -BOOL LLViewerTexture::hasGLTexture() const -{ - if(mGLTexturep.notNull()) - { - return mGLTexturep->getHasGLTexture() ; - } - return FALSE ; -} - -BOOL LLViewerTexture::getBoundRecently() const -{ - if(mGLTexturep.notNull()) - { - return mGLTexturep->getBoundRecently() ; - } - return FALSE ; -} - -LLTexUnit::eTextureType LLViewerTexture::getTarget(void) const -{ - llassert(mGLTexturep.notNull()) ; - return mGLTexturep->getTarget() ; -} - -BOOL LLViewerTexture::setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S32 width, S32 height) -{ - llassert(mGLTexturep.notNull()) ; - - return mGLTexturep->setSubImage(imageraw, x_pos, y_pos, width, height) ; -} - -BOOL LLViewerTexture::setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height) -{ - llassert(mGLTexturep.notNull()) ; - - return mGLTexturep->setSubImage(datap, data_width, data_height, x_pos, y_pos, width, height) ; -} - -void LLViewerTexture::setGLTextureCreated (bool initialized) -{ - llassert(mGLTexturep.notNull()) ; - - mGLTexturep->setGLTextureCreated (initialized) ; -} - -void LLViewerTexture::setCategory(S32 category) -{ - llassert(mGLTexturep.notNull()) ; - - mGLTexturep->setCategory(category) ; -} - -LLTexUnit::eTextureAddressMode LLViewerTexture::getAddressMode(void) const -{ - llassert(mGLTexturep.notNull()) ; - - return mGLTexturep->getAddressMode() ; -} - -S32 LLViewerTexture::getTextureMemory() const -{ - llassert(mGLTexturep.notNull()) ; - - return mGLTexturep->mTextureMemory ; -} - -LLGLenum LLViewerTexture::getPrimaryFormat() const -{ - llassert(mGLTexturep.notNull()) ; - - return mGLTexturep->getPrimaryFormat() ; -} - -BOOL LLViewerTexture::getIsAlphaMask() const -{ - llassert(mGLTexturep.notNull()) ; - - return mGLTexturep->getIsAlphaMask() ; -} - -BOOL LLViewerTexture::getMask(const LLVector2 &tc) -{ - llassert(mGLTexturep.notNull()) ; - - return mGLTexturep->getMask(tc) ; -} - -F32 LLViewerTexture::getTimePassedSinceLastBound() -{ - llassert(mGLTexturep.notNull()) ; - - return mGLTexturep->getTimePassedSinceLastBound() ; -} -BOOL LLViewerTexture::getMissed() const -{ - llassert(mGLTexturep.notNull()) ; - - return mGLTexturep->getMissed() ; -} - -BOOL LLViewerTexture::isJustBound() const -{ - llassert(mGLTexturep.notNull()) ; - - return mGLTexturep->isJustBound() ; -} - -void LLViewerTexture::forceUpdateBindStats(void) const -{ - llassert(mGLTexturep.notNull()) ; - - return mGLTexturep->forceUpdateBindStats() ; -} - -U32 LLViewerTexture::getTexelsInGLTexture() const -{ - llassert(mGLTexturep.notNull()) ; - - return mGLTexturep->getTexelsInGLTexture() ; -} - -BOOL LLViewerTexture::isGLTextureCreated() const -{ - llassert(mGLTexturep.notNull()) ; - - return mGLTexturep->isGLTextureCreated() ; -} - -void LLViewerTexture::destroyGLTexture() -{ - if(mGLTexturep.notNull() && mGLTexturep->getHasGLTexture()) - { - mGLTexturep->destroyGLTexture() ; - mTextureState = DELETED ; - } -} - -void LLViewerTexture::setTexelsPerImage() -{ - S32 fullwidth = llmin(mFullWidth,(S32)MAX_IMAGE_SIZE_DEFAULT); - S32 fullheight = llmin(mFullHeight,(S32)MAX_IMAGE_SIZE_DEFAULT); - mTexelsPerImage = (F32)fullwidth * fullheight; -} - BOOL LLViewerTexture::isLargeImage() { return (S32)mTexelsPerImage > LLViewerTexture::sMinLargeImageSize ; @@ -1212,25 +935,32 @@ void LLViewerTexture::updateBindStatsForTester() //start of LLViewerFetchedTexture //---------------------------------------------------------------------------------------------- -LLViewerFetchedTexture::LLViewerFetchedTexture(const LLUUID& id, const LLHost& host, BOOL usemipmaps) +LLViewerFetchedTexture::LLViewerFetchedTexture(const LLUUID& id, FTType f_type, const LLHost& host, BOOL usemipmaps) : LLViewerTexture(id, usemipmaps), mTargetHost(host) { init(TRUE) ; + mFTType = f_type; + if (mFTType == FTT_HOST_BAKE) + { + mCanUseHTTP = false; + } generateGLTexture() ; } -LLViewerFetchedTexture::LLViewerFetchedTexture(const LLImageRaw* raw, BOOL usemipmaps) +LLViewerFetchedTexture::LLViewerFetchedTexture(const LLImageRaw* raw, FTType f_type, BOOL usemipmaps) : LLViewerTexture(raw, usemipmaps) { init(TRUE) ; + mFTType = f_type; } -LLViewerFetchedTexture::LLViewerFetchedTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps) +LLViewerFetchedTexture::LLViewerFetchedTexture(const std::string& url, FTType f_type, const LLUUID& id, BOOL usemipmaps) : LLViewerTexture(id, usemipmaps), mUrl(url) { init(TRUE) ; + mFTType = f_type; generateGLTexture() ; } @@ -1296,6 +1026,8 @@ void LLViewerFetchedTexture::init(bool firstinit) mLastCallBackActiveTime = 0.f; mInDebug = FALSE; + + mFTType = FTT_UNKNOWN; } LLViewerFetchedTexture::~LLViewerFetchedTexture() @@ -1316,6 +1048,11 @@ S8 LLViewerFetchedTexture::getType() const return LLViewerTexture::FETCHED_TEXTURE ; } +FTType LLViewerFetchedTexture::getFTType() const +{ + return mFTType; +} + void LLViewerFetchedTexture::cleanup() { for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); @@ -1470,6 +1207,7 @@ void LLViewerFetchedTexture::destroyTexture() return ; } + //LL_DEBUGS("Avatar") << mID << llendl; destroyGLTexture() ; mFullyLoaded = FALSE ; } @@ -1774,7 +1512,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority() // Don't decode anything we don't need priority = -4.0f; } - else if ((mBoostLevel == LLViewerTexture::BOOST_UI || mBoostLevel == LLViewerTexture::BOOST_ICON) && !have_all_data) + else if ((mBoostLevel == LLGLTexture::BOOST_UI || mBoostLevel == LLGLTexture::BOOST_ICON) && !have_all_data) { priority = 1.f; } @@ -2089,6 +1827,7 @@ bool LLViewerFetchedTexture::updateFetch() { //discard all oversized textures. destroyRawImage(); + llwarns << "oversize, setting as missing" << llendl; setIsMissingAsset(); mRawDiscardLevel = INVALID_DISCARD_LEVEL ; mIsFetching = FALSE ; @@ -2118,6 +1857,10 @@ bool LLViewerFetchedTexture::updateFetch() // We finished but received no data if (current_discard < 0) { + llwarns << "!mIsFetching, setting as missing, decode_priority " << decode_priority + << " mRawDiscardLevel " << mRawDiscardLevel + << " current_discard " << current_discard + << llendl; setIsMissingAsset(); desired_discard = -1; } @@ -2185,7 +1928,7 @@ bool LLViewerFetchedTexture::updateFetch() // Load the texture progressively: we try not to rush to the desired discard too fast. // If the camera is not moving, we do not tweak the discard level notch by notch but go to the desired discard with larger boosted steps // This mitigates the "textures stay blurry" problem when loading while not killing the texture memory while moving around - S32 delta_level = (mBoostLevel > LLViewerTexture::BOOST_NONE) ? 2 : 1 ; + S32 delta_level = (mBoostLevel > LLGLTexture::BOOST_NONE) ? 2 : 1 ; if (current_discard < 0) { desired_discard = llmax(desired_discard, getMaxDiscardLevel() - delta_level); @@ -2233,7 +1976,7 @@ bool LLViewerFetchedTexture::updateFetch() // bypass texturefetch directly by pulling from LLTextureCache bool fetch_request_created = false; - fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mUrl, getID(),getTargetHost(), decode_priority, + fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mFTType, mUrl, getID(), getTargetHost(), decode_priority, w, h, c, desired_discard, needsAux(), mCanUseHTTP); if (fetch_request_created) @@ -2250,11 +1993,13 @@ bool LLViewerFetchedTexture::updateFetch() } else if (mHasFetcher && !mIsFetching) { - // Only delete requests that haven't receeived any network data for a while + // Only delete requests that haven't received any network data + // for a while. Note - this is the normal mechanism for + // deleting requests, not just a place to handle timeouts. const F32 FETCH_IDLE_TIME = 5.f; if (mLastPacketTimer.getElapsedTimeF32() > FETCH_IDLE_TIME) { -// llinfos << "Deleting request: " << getID() << " Discard: " << current_discard << " <= min:" << mMinDiscardLevel << " or priority == 0: " << decode_priority << llendl; + LL_DEBUGS("Texture") << "exceeded idle time " << FETCH_IDLE_TIME << ", deleting request: " << getID() << llendl; LLAppViewer::getTextureFetch()->deleteRequest(getID(), true); mHasFetcher = FALSE; } @@ -2302,8 +2047,10 @@ void LLViewerFetchedTexture::setIsMissingAsset() } else { - //it is normal no map tile on an empty region. - //llwarns << mUrl << ": Marking image as missing" << llendl; + // This may or may not be an error - it is normal to have no + // map tile on an empty region, but bad if we're failing on a + // server bake texture. + llwarns << mUrl << ": Marking image as missing" << llendl; } if (mHasFetcher) { @@ -2436,7 +2183,7 @@ void LLViewerFetchedTexture::deleteCallbackEntry(const LLLoadedCallbackEntry::so destroySavedRawImage() ; } } - else if(needsToSaveRawImage() && mBoostLevel != LLViewerTexture::BOOST_PREVIEW) + else if(needsToSaveRawImage() && mBoostLevel != LLGLTexture::BOOST_PREVIEW) { if(desired_raw_discard != INVALID_DISCARD_LEVEL) { @@ -2894,7 +2641,7 @@ void LLViewerFetchedTexture::setCachedRawImage() S32 h = mRawImage->getHeight() ; S32 max_size = MAX_CACHED_RAW_IMAGE_AREA ; - if(LLViewerTexture::BOOST_TERRAIN == mBoostLevel) + if(LLGLTexture::BOOST_TERRAIN == mBoostLevel) { max_size = MAX_CACHED_RAW_TERRAIN_IMAGE_AREA ; } @@ -3034,14 +2781,14 @@ F32 LLViewerFetchedTexture::getElapsedLastReferencedSavedRawImageTime() const //---------------------------------------------------------------------------------------------- //start of LLViewerLODTexture //---------------------------------------------------------------------------------------------- -LLViewerLODTexture::LLViewerLODTexture(const LLUUID& id, const LLHost& host, BOOL usemipmaps) - : LLViewerFetchedTexture(id, host, usemipmaps) +LLViewerLODTexture::LLViewerLODTexture(const LLUUID& id, FTType f_type, const LLHost& host, BOOL usemipmaps) + : LLViewerFetchedTexture(id, f_type, host, usemipmaps) { init(TRUE) ; } -LLViewerLODTexture::LLViewerLODTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps) - : LLViewerFetchedTexture(url, id, usemipmaps) +LLViewerLODTexture::LLViewerLODTexture(const std::string& url, FTType f_type, const LLUUID& id, BOOL usemipmaps) + : LLViewerFetchedTexture(url, f_type, id, usemipmaps) { init(TRUE) ; } @@ -3083,7 +2830,7 @@ void LLViewerLODTexture::processTextureStats() if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048 } - else if (mBoostLevel < LLViewerTexture::BOOST_HIGH && mMaxVirtualSize <= 10.f) + else if (mBoostLevel < LLGLTexture::BOOST_HIGH && mMaxVirtualSize <= 10.f) { // If the image has not been significantly visible in a while, we don't want it mDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel, (S8)(MAX_DISCARD_LEVEL + 1)); @@ -3133,7 +2880,7 @@ void LLViewerLODTexture::processTextureStats() mCalculatedDiscardLevel = discard_level; } } - if (mBoostLevel < LLViewerTexture::BOOST_SCULPTED) + if (mBoostLevel < LLGLTexture::BOOST_SCULPTED) { discard_level += sDesiredDiscardBias; discard_level *= sDesiredDiscardScale; // scale @@ -3159,7 +2906,7 @@ void LLViewerLODTexture::processTextureStats() // S32 current_discard = getDiscardLevel(); - if (sDesiredDiscardBias > 0.0f && mBoostLevel < LLViewerTexture::BOOST_SCULPTED && current_discard >= 0) + if (sDesiredDiscardBias > 0.0f && mBoostLevel < LLGLTexture::BOOST_SCULPTED && current_discard >= 0) { if(desired_discard_bias_max <= sDesiredDiscardBias && !mForceToSaveRawImage) { @@ -3302,7 +3049,7 @@ LLViewerMediaTexture::LLViewerMediaTexture(const LLUUID& id, BOOL usemipmaps, LL setMediaImpl() ; - setCategory(LLViewerTexture::MEDIA) ; + setCategory(LLGLTexture::MEDIA) ; LLViewerTexture* tex = gTextureList.findImage(mID) ; if(tex) //this media is a parcel media for tex. diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index ebace4b583..c96f89017f 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -27,7 +27,7 @@ #ifndef LL_LLVIEWERTEXTURE_H #define LL_LLVIEWERTEXTURE_H -#include "lltexture.h" +#include "llgltexture.h" #include "lltimer.h" #include "llframetimer.h" #include "llhost.h" @@ -88,16 +88,11 @@ public: class LLTextureBar; -class LLViewerTexture : public LLTexture +class LLViewerTexture : public LLGLTexture { public: enum { - MAX_IMAGE_SIZE_DEFAULT = 1024, - INVALID_DISCARD_LEVEL = 0x7fff - }; - enum - { LOCAL_TEXTURE, MEDIA_TEXTURE, DYNAMIC_TEXTURE, @@ -106,42 +101,6 @@ public: INVALID_TEXTURE_TYPE }; - enum EBoostLevel - { - BOOST_NONE = 0, - BOOST_AVATAR_BAKED , - BOOST_AVATAR , - BOOST_CLOUDS , - BOOST_SCULPTED , - - BOOST_HIGH = 10, - BOOST_BUMP , - BOOST_TERRAIN , // has to be high priority for minimap / low detail - BOOST_SELECTED , - BOOST_AVATAR_BAKED_SELF , - BOOST_AVATAR_SELF , // needed for baking avatar - BOOST_SUPER_HIGH , //textures higher than this need to be downloaded at the required resolution without delay. - BOOST_HUD , - BOOST_ICON , - BOOST_UI , - BOOST_PREVIEW , - BOOST_MAP , - BOOST_MAP_VISIBLE , - BOOST_MAX_LEVEL, - - //other texture Categories - LOCAL = BOOST_MAX_LEVEL, - AVATAR_SCRATCH_TEX, - DYNAMIC_TEX, - MEDIA, - OTHER, - MAX_GL_IMAGE_CATEGORY - }; - - static S32 getTotalNumOfCategories() ; - static S32 getIndexFromCategory(S32 category) ; - static S32 getCategoryFromIndex(S32 index) ; - typedef std::vector<LLFace*> ll_face_list_t; typedef std::vector<LLVOVolume*> ll_volume_list_t; @@ -166,8 +125,7 @@ public: /*virtual*/ bool bindDefaultImage(const S32 stage = 0) ; /*virtual*/ void forceImmediateUpdate() ; - const LLUUID& getID() const { return mID; } - + /*virtual*/ const LLUUID& getID() const { return mID; } void setBoostLevel(S32 level); S32 getBoostLevel() { return mBoostLevel; } @@ -175,6 +133,7 @@ public: void resetTextureStats(); void setMaxVirtualSizeResetInterval(S32 interval)const {mMaxVirtualSizeResetInterval = interval;} void resetMaxVirtualSizeResetCounter()const {mMaxVirtualSizeResetCounter = mMaxVirtualSizeResetInterval;} + S32 getMaxVirtualSizeResetCounter() const { return mMaxVirtualSizeResetCounter; } virtual F32 getMaxVirtualSize() ; @@ -195,59 +154,8 @@ public: S32 getNumVolumes() const; const ll_volume_list_t* getVolumeList() const { return &mVolumeList; } - void generateGLTexture() ; - void destroyGLTexture() ; - - //--------------------------------------------------------------------------------------------- - //functions to access LLImageGL - //--------------------------------------------------------------------------------------------- - /*virtual*/S32 getWidth(S32 discard_level = -1) const; - /*virtual*/S32 getHeight(S32 discard_level = -1) const; - BOOL hasGLTexture() const ; - LLGLuint getTexName() const ; - BOOL createGLTexture() ; - BOOL createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename = 0, BOOL to_create = TRUE, S32 category = LLViewerTexture::OTHER); virtual void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ; - - void setFilteringOption(LLTexUnit::eTextureFilterOptions option); - void setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format = 0, BOOL swap_bytes = FALSE); - void setAddressMode(LLTexUnit::eTextureAddressMode mode); - BOOL setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S32 width, S32 height); - BOOL setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height); - void setGLTextureCreated (bool initialized); - void setCategory(S32 category) ; - - LLTexUnit::eTextureAddressMode getAddressMode(void) const ; - S32 getMaxDiscardLevel() const; - S32 getDiscardLevel() const; - S8 getComponents() const ; - BOOL getBoundRecently() const; - S32 getTextureMemory() const ; - LLGLenum getPrimaryFormat() const; - BOOL getIsAlphaMask() const ; - LLTexUnit::eTextureType getTarget(void) const ; - BOOL getMask(const LLVector2 &tc); - F32 getTimePassedSinceLastBound(); - BOOL getMissed() const ; - BOOL isJustBound()const ; - void forceUpdateBindStats(void) const; - - U32 getTexelsInGLTexture() const ; - BOOL isGLTextureCreated() const ; - - //--------------------------------------------------------------------------------------------- - //end of functions to access LLImageGL - //--------------------------------------------------------------------------------------------- - - //----------------- - /*virtual*/ void setActive() ; - void forceActive() ; - void setNoDelete() ; - void dontDiscard() { mDontDiscard = 1; mTextureState = NO_DELETE; } - BOOL getDontDiscard() const { return mDontDiscard; } - //----------------- - BOOL isLargeImage() ; void setParcelMedia(LLViewerMediaTexture* media) {mParcelMedia = media;} @@ -260,36 +168,22 @@ protected: void init(bool firstinit) ; void reorganizeFaceList() ; void reorganizeVolumeList() ; - void setTexelsPerImage(); private: friend class LLBumpImageList; friend class LLUIImageList; - //note: do not make this function public. - /*virtual*/ LLImageGL* getGLTexture() const ; virtual void switchToCachedImage(); static bool isMemoryForTextureLow() ; protected: LLUUID mID; - S32 mBoostLevel; // enum describing priority level F32 mSelectedTime; // time texture was last selected - S32 mFullWidth; - S32 mFullHeight; - BOOL mUseMipMaps ; - S8 mComponents; - F32 mTexelsPerImage; // Texels per image. - mutable S8 mNeedsGLTexture; mutable F32 mMaxVirtualSize; // The largest virtual size of the image, in pixels - how much data to we need? mutable S32 mMaxVirtualSizeResetCounter ; mutable S32 mMaxVirtualSizeResetInterval; mutable F32 mAdditionalDecodePriority; // priority add to mDecodePriority. LLFrameTimer mLastReferencedTimer; - //GL texture - LLPointer<LLImageGL> mGLTexturep ; - S8 mDontDiscard; // Keep full res version of this image (for UI, etc) - ll_face_list_t mFaceList[LLRender::NUM_TEXTURE_CHANNELS]; //reverse pointer pointing to the faces using this image as texture U32 mNumFaces[LLRender::NUM_TEXTURE_CHANNELS]; LLFrameTimer mLastFaceListUpdateTimer ; @@ -301,17 +195,6 @@ protected: //do not use LLPointer here. LLViewerMediaTexture* mParcelMedia ; -protected: - typedef enum - { - DELETED = 0, //removed from memory - DELETION_CANDIDATE, //ready to be removed from memory - INACTIVE, //not be used for the last certain period (i.e., 30 seconds). - ACTIVE, //just being used, can become inactive if not being used for a certain time (10 seconds). - NO_DELETE = 99 //stay in memory, can not be removed. - } LLGLTextureState; - LLGLTextureState mTextureState ; - static F32 sTexelPixelRatio; public: static const U32 sCurrentFileVersion; @@ -350,6 +233,16 @@ public: }; +enum FTType +{ + FTT_UNKNOWN = -1, + FTT_DEFAULT = 0, // standard texture fetched by id. + FTT_SERVER_BAKE, // texture produced by appearance service and fetched from there. + FTT_HOST_BAKE, // old-style baked texture uploaded by viewer and fetched from avatar's host. + FTT_MAP_TILE, // tiles are fetched from map server directly. + FTT_LOCAL_FILE // fetch directly from a local file. +}; + // //textures are managed in gTextureList. //raw image data is fetched from remote or local cache @@ -363,9 +256,9 @@ class LLViewerFetchedTexture : public LLViewerTexture protected: /*virtual*/ ~LLViewerFetchedTexture(); public: - LLViewerFetchedTexture(const LLUUID& id, const LLHost& host = LLHost::invalid, BOOL usemipmaps = TRUE); - LLViewerFetchedTexture(const LLImageRaw* raw, BOOL usemipmaps); - LLViewerFetchedTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps = TRUE); + LLViewerFetchedTexture(const LLUUID& id, FTType f_type, const LLHost& host = LLHost::invalid, BOOL usemipmaps = TRUE); + LLViewerFetchedTexture(const LLImageRaw* raw, FTType f_type, BOOL usemipmaps); + LLViewerFetchedTexture(const std::string& url, FTType f_type, const LLUUID& id, BOOL usemipmaps = TRUE); public: static F32 maxDecodePriority(); @@ -390,6 +283,7 @@ public: public: /*virtual*/ S8 getType() const ; + FTType getFTType() const; /*virtual*/ void forceImmediateUpdate() ; /*virtual*/ void dump() ; @@ -425,6 +319,7 @@ public: // the priority list, and cause horrible things to happen. void setDecodePriority(F32 priority = -1.0f); F32 getDecodePriority() const { return mDecodePriority; }; + F32 getAdditionalDecodePriority() const { return mAdditionalDecodePriority; }; void setAdditionalDecodePriority(F32 priority) ; @@ -549,6 +444,7 @@ protected: S8 mIsFetching; // Fetch request is active bool mCanUseHTTP ; //This texture can be fetched through http if true. + FTType mFTType; // What category of image is this - map tile, server bake, etc? mutable S8 mIsMissingAsset; // True if we know that there is no image asset with this image id in the database. typedef std::list<LLLoadedCallbackEntry*> callback_list_t; @@ -609,8 +505,8 @@ protected: /*virtual*/ ~LLViewerLODTexture(){} public: - LLViewerLODTexture(const LLUUID& id, const LLHost& host = LLHost::invalid, BOOL usemipmaps = TRUE); - LLViewerLODTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps = TRUE); + LLViewerLODTexture(const LLUUID& id, FTType f_type, const LLHost& host = LLHost::invalid, BOOL usemipmaps = TRUE); + LLViewerLODTexture(const std::string& url, FTType f_type, const LLUUID& id, BOOL usemipmaps = TRUE); /*virtual*/ S8 getType() const; // Process image stats to determine priority/quality requirements. @@ -724,8 +620,9 @@ public: static LLPointer<LLViewerTexture> getLocalTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps, BOOL generate_gl_tex = TRUE) ; static LLViewerFetchedTexture* getFetchedTexture(const LLUUID &image_id, + FTType f_type = FTT_DEFAULT, BOOL usemipmap = TRUE, - LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. + LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_NONE, // Get the requested level immediately upon creation. S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, @@ -733,8 +630,9 @@ public: ); static LLViewerFetchedTexture* getFetchedTextureFromFile(const std::string& filename, + FTType f_type = FTT_LOCAL_FILE, BOOL usemipmap = TRUE, - LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, + LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_NONE, S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, @@ -742,15 +640,16 @@ public: ); static LLViewerFetchedTexture* getFetchedTextureFromUrl(const std::string& url, + FTType f_type, BOOL usemipmap = TRUE, - LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, + LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_NONE, S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, const LLUUID& force_id = LLUUID::null ); - static LLViewerFetchedTexture* getFetchedTextureFromHost(const LLUUID& image_id, LLHost host) ; + static LLViewerFetchedTexture* getFetchedTextureFromHost(const LLUUID& image_id, FTType f_type, LLHost host) ; static void init() ; static void cleanup() ; diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 8d71761f92..d9f3548a29 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -112,15 +112,15 @@ void LLViewerTextureList::doPreloadImages() llassert_always(mUUIDMap.empty()) ; // Set the "missing asset" image - LLViewerFetchedTexture::sMissingAssetImagep = LLViewerTextureManager::getFetchedTextureFromFile("missing_asset.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI); + LLViewerFetchedTexture::sMissingAssetImagep = LLViewerTextureManager::getFetchedTextureFromFile("missing_asset.tga", FTT_LOCAL_FILE, MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI); // Set the "white" image - LLViewerFetchedTexture::sWhiteImagep = LLViewerTextureManager::getFetchedTextureFromFile("white.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI); + LLViewerFetchedTexture::sWhiteImagep = LLViewerTextureManager::getFetchedTextureFromFile("white.tga", FTT_LOCAL_FILE, MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI); LLTexUnit::sWhiteTexture = LLViewerFetchedTexture::sWhiteImagep->getTexName(); LLUIImageList* image_list = LLUIImageList::getInstance(); // Set the default flat normal map - LLViewerFetchedTexture::sFlatNormalImagep = LLViewerTextureManager::getFetchedTextureFromFile("flatnormal.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_BUMP); + LLViewerFetchedTexture::sFlatNormalImagep = LLViewerTextureManager::getFetchedTextureFromFile("flatnormal.tga", FTT_LOCAL_FILE, MIPMAP_NO, LLViewerFetchedTexture::BOOST_BUMP); image_list->initFromFile(); @@ -133,33 +133,33 @@ void LLViewerTextureList::doPreloadImages() //uv_test->setMipFilterNearest(TRUE, TRUE); // prefetch specific UUIDs - LLViewerTextureManager::getFetchedTexture(IMG_SHOT, TRUE); - LLViewerTextureManager::getFetchedTexture(IMG_SMOKE_POOF, TRUE); - LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTextureFromFile("silhouette.j2c", MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI); + LLViewerTextureManager::getFetchedTexture(IMG_SHOT); + LLViewerTextureManager::getFetchedTexture(IMG_SMOKE_POOF); + LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTextureFromFile("silhouette.j2c", FTT_LOCAL_FILE, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI); if (image) { image->setAddressMode(LLTexUnit::TAM_WRAP); mImagePreloads.insert(image); } - image = LLViewerTextureManager::getFetchedTextureFromFile("world/NoEntryLines.png", MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI); + image = LLViewerTextureManager::getFetchedTextureFromFile("world/NoEntryLines.png", FTT_LOCAL_FILE, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI); if (image) { image->setAddressMode(LLTexUnit::TAM_WRAP); mImagePreloads.insert(image); } - image = LLViewerTextureManager::getFetchedTextureFromFile("world/NoEntryPassLines.png", MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI); + image = LLViewerTextureManager::getFetchedTextureFromFile("world/NoEntryPassLines.png", FTT_LOCAL_FILE, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI); if (image) { image->setAddressMode(LLTexUnit::TAM_WRAP); mImagePreloads.insert(image); } - image = LLViewerTextureManager::getFetchedTexture(DEFAULT_WATER_NORMAL, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI); + image = LLViewerTextureManager::getFetchedTexture(DEFAULT_WATER_NORMAL, FTT_DEFAULT, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI); if (image) { image->setAddressMode(LLTexUnit::TAM_WRAP); mImagePreloads.insert(image); } - image = LLViewerTextureManager::getFetchedTextureFromFile("transparent.j2c", MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI, LLViewerTexture::FETCHED_TEXTURE, + image = LLViewerTextureManager::getFetchedTextureFromFile("transparent.j2c", FTT_LOCAL_FILE, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI, LLViewerTexture::FETCHED_TEXTURE, 0,0,LLUUID("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903")); if (image) { @@ -201,7 +201,7 @@ void LLViewerTextureList::doPrefetchImages() if(LLViewerTexture::FETCHED_TEXTURE == texture_type || LLViewerTexture::LOD_TEXTURE == texture_type) { - LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(uuid, MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, texture_type); + LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(uuid, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_NONE, texture_type); if (image) { image->addTextureStats((F32)pixel_area); @@ -231,7 +231,9 @@ void LLViewerTextureList::shutdown() if (!image->hasGLTexture() || !image->getUseDiscard() || image->needsAux() || - image->getTargetHost() != LLHost::invalid) + image->getTargetHost() != LLHost::invalid || + !image->getUrl().empty() + ) { continue; // avoid UI, baked, and other special images } @@ -326,6 +328,7 @@ void LLViewerTextureList::restoreGL() /////////////////////////////////////////////////////////////////////////////// LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& filename, + FTType f_type, BOOL usemipmaps, LLViewerTexture::EBoostLevel boost_priority, S8 texture_type, @@ -342,15 +345,16 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& if (full_path.empty()) { llwarns << "Failed to find local image file: " << filename << llendl; - return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI); + return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI); } std::string url = "file://" + full_path; - return getImageFromUrl(url, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id); + return getImageFromUrl(url, f_type, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id); } LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string& url, + FTType f_type, BOOL usemipmaps, LLViewerTexture::EBoostLevel boost_priority, S8 texture_type, @@ -376,15 +380,32 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string& LLPointer<LLViewerFetchedTexture> imagep = findImage(new_id); + if (!imagep.isNull()) + { + LLViewerFetchedTexture *texture = imagep.get(); + if (texture->getUrl().empty()) + { + llwarns << "Requested texture " << new_id << " already exists but does not have a URL" << llendl; + } + else if (texture->getUrl() != url) + { + // This is not an error as long as the images really match - + // e.g. could be two avatars wearing the same outfit. + LL_DEBUGS("Avatar") << "Requested texture " << new_id + << " already exists with a different url, requested: " << url + << " current: " << texture->getUrl() << llendl; + } + + } if (imagep.isNull()) { switch(texture_type) { case LLViewerTexture::FETCHED_TEXTURE: - imagep = new LLViewerFetchedTexture(url, new_id, usemipmaps); + imagep = new LLViewerFetchedTexture(url, f_type, new_id, usemipmaps); break ; case LLViewerTexture::LOD_TEXTURE: - imagep = new LLViewerLODTexture(url, new_id, usemipmaps); + imagep = new LLViewerLODTexture(url, f_type, new_id, usemipmaps); break ; default: llerrs << "Invalid texture type " << texture_type << llendl ; @@ -415,6 +436,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string& LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id, + FTType f_type, BOOL usemipmaps, LLViewerTexture::EBoostLevel boost_priority, S8 texture_type, @@ -433,14 +455,34 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id, if ((&image_id == NULL) || image_id.isNull()) { - return (LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI)); + return (LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI)); } LLPointer<LLViewerFetchedTexture> imagep = findImage(image_id); + if (!imagep.isNull()) + { + LLViewerFetchedTexture *texture = imagep.get(); + if (request_from_host.isOk() && + !texture->getTargetHost().isOk()) + { + llwarns << "Requested texture " << image_id << " already exists but does not have a host" << llendl; + } + else if (request_from_host.isOk() && + texture->getTargetHost().isOk() && + request_from_host != texture->getTargetHost()) + { + llwarns << "Requested texture " << image_id << " already exists with a different target host, requested: " + << request_from_host << " current: " << texture->getTargetHost() << llendl; + } + if (f_type != FTT_DEFAULT && imagep->getFTType() != f_type) + { + llwarns << "FTType mismatch: requested " << f_type << " image has " << imagep->getFTType() << llendl; + } + } if (imagep.isNull()) { - imagep = createImage(image_id, usemipmaps, boost_priority, texture_type, internal_format, primary_format, request_from_host) ; + imagep = createImage(image_id, f_type, usemipmaps, boost_priority, texture_type, internal_format, primary_format, request_from_host) ; } imagep->setGLTextureCreated(true); @@ -450,6 +492,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id, //when this function is called, there is no such texture in the gTextureList with image_id. LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id, + FTType f_type, BOOL usemipmaps, LLViewerTexture::EBoostLevel boost_priority, S8 texture_type, @@ -463,10 +506,10 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id, switch(texture_type) { case LLViewerTexture::FETCHED_TEXTURE: - imagep = new LLViewerFetchedTexture(image_id, request_from_host, usemipmaps); + imagep = new LLViewerFetchedTexture(image_id, f_type, request_from_host, usemipmaps); break ; case LLViewerTexture::LOD_TEXTURE: - imagep = new LLViewerLODTexture(image_id, request_from_host, usemipmaps); + imagep = new LLViewerLODTexture(image_id, f_type, request_from_host, usemipmaps); break ; default: llerrs << "Invalid texture type " << texture_type << llendl ; @@ -1356,7 +1399,7 @@ void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_d U8 *data = new U8[data_size]; msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size); - LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); if (!image) { delete [] data; @@ -1428,7 +1471,7 @@ void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_d U8 *data = new U8[data_size]; msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size); - LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); if (!image) { delete [] data; @@ -1459,6 +1502,7 @@ void LLViewerTextureList::processImageNotInDatabase(LLMessageSystem *msg,void ** LLViewerFetchedTexture* image = gTextureList.findImage( image_id ); if( image ) { + llwarns << "not in db" << llendl; image->setIsMissingAsset(); } } @@ -1528,22 +1572,22 @@ LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priori LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLViewerTexture::EBoostLevel boost_priority ) { - if (boost_priority == LLViewerTexture::BOOST_NONE) + if (boost_priority == LLGLTexture::BOOST_NONE) { - boost_priority = LLViewerTexture::BOOST_UI; + boost_priority = LLGLTexture::BOOST_UI; } - LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTextureFromFile(filename, MIPMAP_NO, boost_priority); + LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTextureFromFile(filename, FTT_LOCAL_FILE, MIPMAP_NO, boost_priority); return loadUIImage(imagep, name, use_mips, scale_rect, clip_rect); } LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLViewerTexture::EBoostLevel boost_priority) { - if (boost_priority == LLViewerTexture::BOOST_NONE) + if (boost_priority == LLGLTexture::BOOST_NONE) { - boost_priority = LLViewerTexture::BOOST_UI; + boost_priority = LLGLTexture::BOOST_UI; } - LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(id, MIPMAP_NO, boost_priority); + LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, MIPMAP_NO, boost_priority); return loadUIImage(imagep, id.asString(), use_mips, scale_rect, clip_rect); } @@ -1566,7 +1610,7 @@ LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const st //Note: //Some other textures such as ICON also through this flow to be fetched. //But only UI textures need to set this callback. - if(imagep->getBoostLevel() == LLViewerTexture::BOOST_UI) + if(imagep->getBoostLevel() == LLGLTexture::BOOST_UI) { LLUIImageLoadData* datap = new LLUIImageLoadData; datap->mImageName = name; diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index 3dda973d3f..136042620d 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -130,8 +130,9 @@ private: void removeImageFromList(LLViewerFetchedTexture *image); LLViewerFetchedTexture * getImage(const LLUUID &image_id, + FTType f_type = FTT_DEFAULT, BOOL usemipmap = TRUE, - LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. + LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_NONE, // Get the requested level immediately upon creation. S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, @@ -139,8 +140,9 @@ private: ); LLViewerFetchedTexture * getImageFromFile(const std::string& filename, + FTType f_type = FTT_LOCAL_FILE, BOOL usemipmap = TRUE, - LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. + LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_NONE, // Get the requested level immediately upon creation. S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, @@ -148,8 +150,9 @@ private: ); LLViewerFetchedTexture* getImageFromUrl(const std::string& url, + FTType f_type, BOOL usemipmap = TRUE, - LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. + LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_NONE, // Get the requested level immediately upon creation. S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, @@ -157,8 +160,9 @@ private: ); LLViewerFetchedTexture* createImage(const LLUUID &image_id, + FTType f_type, BOOL usemipmap = TRUE, - LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. + LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_NONE, // Get the requested level immediately upon creation. S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, @@ -167,8 +171,8 @@ private: // Request image from a specific host, used for baked avatar textures. // Implemented in header in case someone changes default params above. JC - LLViewerFetchedTexture* getImageFromHost(const LLUUID& image_id, LLHost host) - { return getImage(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); } + LLViewerFetchedTexture* getImageFromHost(const LLUUID& image_id, FTType f_type, LLHost host) + { return getImage(image_id, f_type, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); } public: typedef std::set<LLPointer<LLViewerFetchedTexture> > image_list_t; @@ -233,11 +237,11 @@ private: LLPointer<LLUIImage> loadUIImageByName(const std::string& name, const std::string& filename, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, const LLRect& clip_rect = LLRect::null, - LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI); + LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_UI); LLPointer<LLUIImage> loadUIImageByID(const LLUUID& id, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, const LLRect& clip_rect = LLRect::null, - LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI); + LLViewerTexture::EBoostLevel boost_priority = LLGLTexture::BOOST_UI); LLPointer<LLUIImage> loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, const LLRect& clip_rect = LLRect::null); diff --git a/indra/newview/llviewervisualparam.cpp b/indra/newview/llviewervisualparam.cpp deleted file mode 100644 index f0cf9b7692..0000000000 --- a/indra/newview/llviewervisualparam.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/** - * @file llviewervisualparam.cpp - * @brief Implementation of LLViewerVisualParam class - * - * $LicenseInfo:firstyear=2001&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$ - */ - -//----------------------------------------------------------------------------- -// Header Files -//----------------------------------------------------------------------------- -#include "llviewerprecompiledheaders.h" - -#include "llviewervisualparam.h" -#include "llxmltree.h" -#include "llui.h" -#include "llwearable.h" - -//----------------------------------------------------------------------------- -// LLViewerVisualParamInfo() -//----------------------------------------------------------------------------- -LLViewerVisualParamInfo::LLViewerVisualParamInfo() - : - mWearableType( LLWearableType::WT_INVALID ), - mCrossWearable(FALSE), - mCamDist( 0.5f ), - mCamAngle( 0.f ), - mCamElevation( 0.f ), - mEditGroupDisplayOrder( 0 ), - mShowSimple(FALSE), - mSimpleMin(0.f), - mSimpleMax(100.f) -{ -} - -LLViewerVisualParamInfo::~LLViewerVisualParamInfo() -{ -} - -//----------------------------------------------------------------------------- -// parseXml() -//----------------------------------------------------------------------------- -BOOL LLViewerVisualParamInfo::parseXml(LLXmlTreeNode *node) -{ - llassert( node->hasName( "param" ) ); - - if (!LLVisualParamInfo::parseXml(node)) - return FALSE; - - // VIEWER SPECIFIC PARAMS - - std::string wearable; - static LLStdStringHandle wearable_string = LLXmlTree::addAttributeString("wearable"); - if( node->getFastAttributeString( wearable_string, wearable) ) - { - mWearableType = LLWearableType::typeNameToType( wearable ); - } - - static LLStdStringHandle edit_group_string = LLXmlTree::addAttributeString("edit_group"); - if (!node->getFastAttributeString( edit_group_string, mEditGroup)) - { - mEditGroup = ""; - } - - static LLStdStringHandle cross_wearable_string = LLXmlTree::addAttributeString("cross_wearable"); - if (!node->getFastAttributeBOOL(cross_wearable_string, mCrossWearable)) - { - mCrossWearable = FALSE; - } - - // Optional camera offsets from the current joint center. Used for generating "hints" (thumbnails). - static LLStdStringHandle camera_distance_string = LLXmlTree::addAttributeString("camera_distance"); - node->getFastAttributeF32( camera_distance_string, mCamDist ); - static LLStdStringHandle camera_angle_string = LLXmlTree::addAttributeString("camera_angle"); - node->getFastAttributeF32( camera_angle_string, mCamAngle ); // in degrees - static LLStdStringHandle camera_elevation_string = LLXmlTree::addAttributeString("camera_elevation"); - node->getFastAttributeF32( camera_elevation_string, mCamElevation ); - - mCamAngle += 180; - - static S32 params_loaded = 0; - - // By default, parameters are displayed in the order in which they appear in the xml file. - // "edit_group_order" overriddes. - static LLStdStringHandle edit_group_order_string = LLXmlTree::addAttributeString("edit_group_order"); - if( !node->getFastAttributeF32( edit_group_order_string, mEditGroupDisplayOrder ) ) - { - mEditGroupDisplayOrder = (F32)params_loaded; - } - - params_loaded++; - - return TRUE; -} - -/*virtual*/ void LLViewerVisualParamInfo::toStream(std::ostream &out) -{ - LLVisualParamInfo::toStream(out); - - out << mWearableType << "\t"; - out << mEditGroup << "\t"; - out << mEditGroupDisplayOrder << "\t"; -} - -//----------------------------------------------------------------------------- -// LLViewerVisualParam() -//----------------------------------------------------------------------------- -LLViewerVisualParam::LLViewerVisualParam() -{ -} - -//----------------------------------------------------------------------------- -// setInfo() -//----------------------------------------------------------------------------- - -BOOL LLViewerVisualParam::setInfo(LLViewerVisualParamInfo *info) -{ - llassert(mInfo == NULL); - if (info->mID < 0) - return FALSE; - mInfo = info; - mID = info->mID; - setWeight(getDefaultWeight(), FALSE ); - return TRUE; -} - -/* -//============================================================================= -// These virtual functions should always be overridden, -// but are included here for use as templates -//============================================================================= - -//----------------------------------------------------------------------------- -// parseData() -//----------------------------------------------------------------------------- -BOOL LLViewerVisualParam::parseData(LLXmlTreeNode *node) -{ - LLViewerVisualParamInfo* info = new LLViewerVisualParamInfo; - - info->parseXml(node); - if (!setInfo(info)) - return FALSE; - - return TRUE; -} -*/ diff --git a/indra/newview/llviewervisualparam.h b/indra/newview/llviewervisualparam.h deleted file mode 100644 index 2826e6c316..0000000000 --- a/indra/newview/llviewervisualparam.h +++ /dev/null @@ -1,110 +0,0 @@ -/** - * @file llviewervisualparam.h - * @brief viewer side visual params (with data file parsing) - * - * $LicenseInfo:firstyear=2001&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$ - */ - -#ifndef LL_LLViewerVisualParam_H -#define LL_LLViewerVisualParam_H - -#include "v3math.h" -#include "llstring.h" -#include "llvisualparam.h" - -class LLWearable; - -//----------------------------------------------------------------------------- -// LLViewerVisualParamInfo -//----------------------------------------------------------------------------- -class LLViewerVisualParamInfo : public LLVisualParamInfo -{ - friend class LLViewerVisualParam; -public: - LLViewerVisualParamInfo(); - /*virtual*/ ~LLViewerVisualParamInfo(); - - /*virtual*/ BOOL parseXml(LLXmlTreeNode* node); - - /*virtual*/ void toStream(std::ostream &out); - -protected: - S32 mWearableType; - BOOL mCrossWearable; - std::string mEditGroup; - F32 mCamDist; - F32 mCamAngle; // degrees - F32 mCamElevation; - F32 mEditGroupDisplayOrder; - BOOL mShowSimple; // show edit controls when in "simple ui" mode? - F32 mSimpleMin; // when in simple UI, apply this minimum, range 0.f to 100.f - F32 mSimpleMax; // when in simple UI, apply this maximum, range 0.f to 100.f -}; - -//----------------------------------------------------------------------------- -// LLViewerVisualParam -// VIRTUAL CLASS -// a viewer side interface class for a generalized parametric modification of the avatar mesh -//----------------------------------------------------------------------------- -LL_ALIGN_PREFIX(16) -class LLViewerVisualParam : public LLVisualParam -{ -public: - LLViewerVisualParam(); - /*virtual*/ ~LLViewerVisualParam(){}; - - // Special: These functions are overridden by child classes - LLViewerVisualParamInfo *getInfo() const { return (LLViewerVisualParamInfo*)mInfo; }; - // This sets mInfo and calls initialization functions - BOOL setInfo(LLViewerVisualParamInfo *info); - - virtual LLViewerVisualParam* cloneParam(LLWearable* wearable) const = 0; - - // LLVisualParam Virtual functions - ///*virtual*/ BOOL parseData(LLXmlTreeNode* node); - - // New Virtual functions - virtual F32 getTotalDistortion() = 0; - virtual const LLVector4a& getAvgDistortion() = 0; - virtual F32 getMaxDistortion() = 0; - virtual LLVector4a getVertexDistortion(S32 index, LLPolyMesh *mesh) = 0; - virtual const LLVector4a* getFirstDistortion(U32 *index, LLPolyMesh **mesh) = 0; - virtual const LLVector4a* getNextDistortion(U32 *index, LLPolyMesh **mesh) = 0; - - // interface methods - F32 getDisplayOrder() const { return getInfo()->mEditGroupDisplayOrder; } - S32 getWearableType() const { return getInfo()->mWearableType; } - const std::string& getEditGroup() const { return getInfo()->mEditGroup; } - - F32 getCameraDistance() const { return getInfo()->mCamDist; } - F32 getCameraAngle() const { return getInfo()->mCamAngle; } // degrees - F32 getCameraElevation() const { return getInfo()->mCamElevation; } - - BOOL getShowSimple() const { return getInfo()->mShowSimple; } - F32 getSimpleMin() const { return getInfo()->mSimpleMin; } - F32 getSimpleMax() const { return getInfo()->mSimpleMax; } - - BOOL getCrossWearable() const { return getInfo()->mCrossWearable; } - -} LL_ALIGN_POSTFIX(16); - -#endif // LL_LLViewerVisualParam_H diff --git a/indra/newview/llviewerwearable.cpp b/indra/newview/llviewerwearable.cpp new file mode 100644 index 0000000000..e8425dc76a --- /dev/null +++ b/indra/newview/llviewerwearable.cpp @@ -0,0 +1,656 @@ +/** + * @file llviewerwearable.cpp + * @brief LLViewerWearable class implementation + * + * $LicenseInfo:firstyear=2012&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$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llagent.h" +#include "llagentcamera.h" +#include "llagentwearables.h" +#include "llfloatersidepanelcontainer.h" +#include "llnotificationsutil.h" +#include "llsidepanelappearance.h" +#include "lltextureentry.h" +#include "llviewertexlayer.h" +#include "llvoavatarself.h" +#include "llavatarappearancedefines.h" +#include "llviewerwearable.h" +#include "llviewercontrol.h" +#include "llviewerregion.h" + +using namespace LLAvatarAppearanceDefines; + +// support class - remove for 2.1 (hackity hack hack) +class LLOverrideBakedTextureUpdate +{ +public: + LLOverrideBakedTextureUpdate(bool temp_state) + { + U32 num_bakes = (U32) LLAvatarAppearanceDefines::BAKED_NUM_INDICES; + for( U32 index = 0; index < num_bakes; ++index ) + { + composite_enabled[index] = gAgentAvatarp->isCompositeUpdateEnabled(index); + } + gAgentAvatarp->setCompositeUpdatesEnabled(temp_state); + } + + ~LLOverrideBakedTextureUpdate() + { + U32 num_bakes = (U32)LLAvatarAppearanceDefines::BAKED_NUM_INDICES; + for( U32 index = 0; index < num_bakes; ++index ) + { + gAgentAvatarp->setCompositeUpdatesEnabled(index, composite_enabled[index]); + } + } +private: + bool composite_enabled[LLAvatarAppearanceDefines::BAKED_NUM_INDICES]; +}; + +// Private local functions +static std::string asset_id_to_filename(const LLUUID &asset_id); + +LLViewerWearable::LLViewerWearable(const LLTransactionID& transaction_id) : + LLWearable() +{ + mTransactionID = transaction_id; + mAssetID = mTransactionID.makeAssetID(gAgent.getSecureSessionID()); +} + +LLViewerWearable::LLViewerWearable(const LLAssetID& asset_id) : + LLWearable() +{ + mAssetID = asset_id; + mTransactionID.setNull(); +} + +// virtual +LLViewerWearable::~LLViewerWearable() +{ +} + +// virtual +LLWearable::EImportResult LLViewerWearable::importStream( std::istream& input_stream, LLAvatarAppearance* avatarp ) +{ + // suppress texlayerset updates while wearables are being imported. Layersets will be updated + // when the wearables are "worn", not loaded. Note state will be restored when this object is destroyed. + LLOverrideBakedTextureUpdate stop_bakes(false); + + LLWearable::EImportResult result = LLWearable::importStream(input_stream, avatarp); + if (LLWearable::FAILURE == result) return result; + if (LLWearable::BAD_HEADER == result) + { + // Shouldn't really log the asset id for security reasons, but + // we need it in this case. + llwarns << "Bad Wearable asset header: " << mAssetID << llendl; + //gVFS->dumpMap(); + return result; + } + + LLStringUtil::truncate(mName, DB_INV_ITEM_NAME_STR_LEN ); + LLStringUtil::truncate(mDescription, DB_INV_ITEM_DESC_STR_LEN ); + + te_map_t::const_iterator iter = mTEMap.begin(); + te_map_t::const_iterator end = mTEMap.end(); + for (; iter != end; ++iter) + { + S32 te = iter->first; + LLLocalTextureObject* lto = iter->second; + LLUUID textureid = LLUUID::null; + if (lto) + { + textureid = lto->getID(); + } + + LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture( textureid ); + if(gSavedSettings.getBOOL("DebugAvatarLocalTexLoadedTime")) + { + image->setLoadedCallback(LLVOAvatarSelf::debugOnTimingLocalTexLoaded,0,TRUE,FALSE, new LLVOAvatarSelf::LLAvatarTexData(textureid, (LLAvatarAppearanceDefines::ETextureIndex)te), NULL); + } + } + + return result; +} + + +// Avatar parameter and texture definitions can change over time. +// This function returns true if parameters or textures have been added or removed +// since this wearable was created. +BOOL LLViewerWearable::isOldVersion() const +{ + if (!isAgentAvatarValid()) return FALSE; + + if( LLWearable::sCurrentDefinitionVersion < mDefinitionVersion ) + { + llwarns << "Wearable asset has newer version (" << mDefinitionVersion << ") than XML (" << LLWearable::sCurrentDefinitionVersion << ")" << llendl; + llassert(0); + } + + if( LLWearable::sCurrentDefinitionVersion != mDefinitionVersion ) + { + return TRUE; + } + + S32 param_count = 0; + for( LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam(); + param; + param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() ) + { + if( (param->getWearableType() == mType) && (param->isTweakable() ) ) + { + param_count++; + if( !is_in_map(mVisualParamIndexMap, param->getID() ) ) + { + return TRUE; + } + } + } + if( param_count != mVisualParamIndexMap.size() ) + { + return TRUE; + } + + + S32 te_count = 0; + for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) + { + if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType) + { + te_count++; + if( !is_in_map(mTEMap, te ) ) + { + return TRUE; + } + } + } + if( te_count != mTEMap.size() ) + { + return TRUE; + } + + return FALSE; +} + +// Avatar parameter and texture definitions can change over time. +// * If parameters or textures have been REMOVED since the wearable was created, +// they're just ignored, so we consider the wearable clean even though isOldVersion() +// will return true. +// * If parameters or textures have been ADDED since the wearable was created, +// they are taken to have default values, so we consider the wearable clean +// only if those values are the same as the defaults. +BOOL LLViewerWearable::isDirty() const +{ + if (!isAgentAvatarValid()) return FALSE; + + for( LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam(); + param; + param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() ) + { + if( (param->getWearableType() == mType) + && (param->isTweakable() ) + && !param->getCrossWearable()) + { + F32 current_weight = getVisualParamWeight(param->getID()); + current_weight = llclamp( current_weight, param->getMinWeight(), param->getMaxWeight() ); + F32 saved_weight = get_if_there(mSavedVisualParamMap, param->getID(), param->getDefaultWeight()); + saved_weight = llclamp( saved_weight, param->getMinWeight(), param->getMaxWeight() ); + + U8 a = F32_to_U8( saved_weight, param->getMinWeight(), param->getMaxWeight() ); + U8 b = F32_to_U8( current_weight, param->getMinWeight(), param->getMaxWeight() ); + if( a != b ) + { + return TRUE; + } + } + } + + for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) + { + if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType) + { + te_map_t::const_iterator current_iter = mTEMap.find(te); + if(current_iter != mTEMap.end()) + { + const LLUUID& current_image_id = current_iter->second->getID(); + te_map_t::const_iterator saved_iter = mSavedTEMap.find(te); + if(saved_iter != mSavedTEMap.end()) + { + const LLUUID& saved_image_id = saved_iter->second->getID(); + if (saved_image_id != current_image_id) + { + // saved vs current images are different, wearable is dirty + return TRUE; + } + } + else + { + // image found in current image list but not saved image list + return TRUE; + } + } + } + } + + return FALSE; +} + + +void LLViewerWearable::setParamsToDefaults() +{ + if (!isAgentAvatarValid()) return; + + for( LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam() ) + { + if( (((LLViewerVisualParam*)param)->getWearableType() == mType ) && (param->isTweakable() ) ) + { + setVisualParamWeight(param->getID(),param->getDefaultWeight(), FALSE); + } + } +} + +void LLViewerWearable::setTexturesToDefaults() +{ + for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) + { + if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType) + { + LLUUID id = getDefaultTextureImageID((ETextureIndex) te); + LLViewerFetchedTexture * image = LLViewerTextureManager::getFetchedTexture( id ); + if( mTEMap.find(te) == mTEMap.end() ) + { + mTEMap[te] = new LLLocalTextureObject(image, id); + createLayers(te, gAgentAvatarp); + } + else + { + // Local Texture Object already created, just set image and UUID + LLLocalTextureObject *lto = mTEMap[te]; + lto->setID(id); + lto->setImage(image); + } + } + } +} + + +// virtual +LLUUID LLViewerWearable::getDefaultTextureImageID(ETextureIndex index) const +{ + const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture(index); + const std::string &default_image_name = texture_dict->mDefaultImageName; + if (default_image_name == "") + { + return IMG_DEFAULT_AVATAR; + } + else + { + return LLUUID(gSavedSettings.getString(default_image_name)); + } +} + + +// Updates the user's avatar's appearance +//virtual +void LLViewerWearable::writeToAvatar(LLAvatarAppearance *avatarp) +{ + LLVOAvatarSelf* viewer_avatar = dynamic_cast<LLVOAvatarSelf*>(avatarp); + + if (!avatarp || !viewer_avatar) return; + + if (!viewer_avatar->isValid()) return; + +#if 0 + // FIXME DRANO - kludgy way to avoid overwriting avatar state from wearables. + // Ideally would avoid calling this func in the first place. + if (viewer_avatar->isUsingServerBakes() && + !viewer_avatar->isUsingLocalAppearance()) + { + return; + } +#endif + + ESex old_sex = avatarp->getSex(); + + LLWearable::writeToAvatar(avatarp); + + + // Pull texture entries + for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) + { + if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType) + { + te_map_t::const_iterator iter = mTEMap.find(te); + LLUUID image_id; + if(iter != mTEMap.end()) + { + image_id = iter->second->getID(); + } + else + { + image_id = getDefaultTextureImageID((ETextureIndex) te); + } + LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE ); + // MULTI-WEARABLE: assume index 0 will be used when writing to avatar. TODO: eliminate the need for this. + viewer_avatar->setLocalTextureTE(te, image, 0); + } + } + + ESex new_sex = avatarp->getSex(); + if( old_sex != new_sex ) + { + viewer_avatar->updateSexDependentLayerSets( FALSE ); + } + +// if( upload_bake ) +// { +// gAgent.sendAgentSetAppearance(); +// } +} + + +// Updates the user's avatar's appearance, replacing this wearables' parameters and textures with default values. +// static +void LLViewerWearable::removeFromAvatar( LLWearableType::EType type, BOOL upload_bake ) +{ + if (!isAgentAvatarValid()) return; + + // You can't just remove body parts. + if( (type == LLWearableType::WT_SHAPE) || + (type == LLWearableType::WT_SKIN) || + (type == LLWearableType::WT_HAIR) || + (type == LLWearableType::WT_EYES) ) + { + return; + } + + // Pull params + for( LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam() ) + { + if( (((LLViewerVisualParam*)param)->getWearableType() == type) && (param->isTweakable() ) ) + { + S32 param_id = param->getID(); + gAgentAvatarp->setVisualParamWeight( param_id, param->getDefaultWeight(), upload_bake ); + } + } + + if(gAgentCamera.cameraCustomizeAvatar()) + { + LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit")); + } + + gAgentAvatarp->updateVisualParams(); + gAgentAvatarp->wearableUpdated(type, FALSE); + +// if( upload_bake ) +// { +// gAgent.sendAgentSetAppearance(); +// } +} + +// Does not copy mAssetID. +// Definition version is current: removes obsolete enties and creates default values for new ones. +void LLViewerWearable::copyDataFrom(const LLViewerWearable* src) +{ + if (!isAgentAvatarValid()) return; + + mDefinitionVersion = LLWearable::sCurrentDefinitionVersion; + + mName = src->mName; + mDescription = src->mDescription; + mPermissions = src->mPermissions; + mSaleInfo = src->mSaleInfo; + + setType(src->mType, gAgentAvatarp); + + mSavedVisualParamMap.clear(); + // Deep copy of mVisualParamMap (copies only those params that are current, filling in defaults where needed) + for (LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam(); + param; + param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() ) + { + if( (param->getWearableType() == mType) ) + { + S32 id = param->getID(); + F32 weight = src->getVisualParamWeight(id); + mSavedVisualParamMap[id] = weight; + } + } + + destroyTextures(); + // Deep copy of mTEMap (copies only those tes that are current, filling in defaults where needed) + for (S32 te = 0; te < TEX_NUM_INDICES; te++) + { + if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex) te) == mType) + { + te_map_t::const_iterator iter = src->mTEMap.find(te); + LLUUID image_id; + LLViewerFetchedTexture *image = NULL; + if(iter != src->mTEMap.end()) + { + image = dynamic_cast<LLViewerFetchedTexture*> (src->getLocalTextureObject(te)->getImage()); + image_id = src->getLocalTextureObject(te)->getID(); + mTEMap[te] = new LLLocalTextureObject(image, image_id); + mSavedTEMap[te] = new LLLocalTextureObject(image, image_id); + mTEMap[te]->setBakedReady(src->getLocalTextureObject(te)->getBakedReady()); + mTEMap[te]->setDiscard(src->getLocalTextureObject(te)->getDiscard()); + } + else + { + image_id = getDefaultTextureImageID((ETextureIndex) te); + image = LLViewerTextureManager::getFetchedTexture( image_id ); + mTEMap[te] = new LLLocalTextureObject(image, image_id); + mSavedTEMap[te] = new LLLocalTextureObject(image, image_id); + } + createLayers(te, gAgentAvatarp); + } + } + + // Probably reduntant, but ensure that the newly created wearable is not dirty by setting current value of params in new wearable + // to be the same as the saved values (which were loaded from src at param->cloneParam(this)) + revertValues(); +} + +void LLViewerWearable::setItemID(const LLUUID& item_id) +{ + mItemID = item_id; +} + +void LLViewerWearable::revertValues() +{ +#if 0 + // DRANO avoid overwrite when not in local appearance + if (isAgentAvatarValid() && gAgentAvatarp->isUsingServerBakes() && !gAgentAvatarp->isUsingLocalAppearance()) + { + return; + } +#endif + LLWearable::revertValues(); + + + LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance")); + if( panel ) + { + panel->updateScrollingPanelList(); + } +} + +void LLViewerWearable::saveValues() +{ + LLWearable::saveValues(); + + LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance")); + if( panel ) + { + panel->updateScrollingPanelList(); + } +} + +// virtual +void LLViewerWearable::setUpdated() const +{ + gInventory.addChangedMask(LLInventoryObserver::LABEL, getItemID()); +} + +void LLViewerWearable::refreshName() +{ + LLUUID item_id = getItemID(); + LLInventoryItem* item = gInventory.getItem(item_id); + if( item ) + { + mName = item->getName(); + } +} + +// virtual +void LLViewerWearable::addToBakedTextureHash(LLMD5& hash) const +{ + LLUUID asset_id = getAssetID(); + hash.update((const unsigned char*)asset_id.mData, UUID_BYTES); +} + +struct LLWearableSaveData +{ + LLWearableType::EType mType; +}; + +void LLViewerWearable::saveNewAsset() const +{ +// llinfos << "LLViewerWearable::saveNewAsset() type: " << getTypeName() << llendl; + //llinfos << *this << llendl; + + const std::string filename = asset_id_to_filename(mAssetID); + LLFILE* fp = LLFile::fopen(filename, "wb"); /* Flawfinder: ignore */ + BOOL successful_save = FALSE; + if(fp && exportFile(fp)) + { + successful_save = TRUE; + } + if(fp) + { + fclose(fp); + fp = NULL; + } + if(!successful_save) + { + std::string buffer = llformat("Unable to save '%s' to wearable file.", mName.c_str()); + llwarns << buffer << llendl; + + LLSD args; + args["NAME"] = mName; + LLNotificationsUtil::add("CannotSaveWearableOutOfSpace", args); + return; + } + + // save it out to database + if( gAssetStorage ) + { + /* + std::string url = gAgent.getRegion()->getCapability("NewAgentInventory"); + if (!url.empty()) + { + llinfos << "Update Agent Inventory via capability" << llendl; + LLSD body; + body["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetToFolderType(getAssetType())); + body["asset_type"] = LLAssetType::lookup(getAssetType()); + body["inventory_type"] = LLInventoryType::lookup(LLInventoryType::IT_WEARABLE); + body["name"] = getName(); + body["description"] = getDescription(); + LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, filename)); + } + else + { + } + */ + LLWearableSaveData* data = new LLWearableSaveData; + data->mType = mType; + gAssetStorage->storeAssetData(filename, mTransactionID, getAssetType(), + &LLViewerWearable::onSaveNewAssetComplete, + (void*)data); + } +} + +// static +void LLViewerWearable::onSaveNewAssetComplete(const LLUUID& new_asset_id, void* userdata, S32 status, LLExtStat ext_status) // StoreAssetData callback (fixed) +{ + LLWearableSaveData* data = (LLWearableSaveData*)userdata; + const std::string& type_name = LLWearableType::getTypeName(data->mType); + if(0 == status) + { + // Success + llinfos << "Saved wearable " << type_name << llendl; + } + else + { + std::string buffer = llformat("Unable to save %s to central asset store.", type_name.c_str()); + llwarns << buffer << " Status: " << status << llendl; + LLSD args; + args["NAME"] = type_name; + LLNotificationsUtil::add("CannotSaveToAssetStore", args); + } + + // Delete temp file + const std::string src_filename = asset_id_to_filename(new_asset_id); + LLFile::remove(src_filename); + + // delete the context data + delete data; + +} + +std::ostream& operator<<(std::ostream &s, const LLViewerWearable &w) +{ + s << "wearable " << LLWearableType::getTypeName(w.mType) << "\n"; + s << " Name: " << w.mName << "\n"; + s << " Desc: " << w.mDescription << "\n"; + //w.mPermissions + //w.mSaleInfo + + s << " Params:" << "\n"; + for (LLWearable::visual_param_index_map_t::const_iterator iter = w.mVisualParamIndexMap.begin(); + iter != w.mVisualParamIndexMap.end(); ++iter) + { + S32 param_id = iter->first; + LLVisualParam *wearable_param = iter->second; + F32 param_weight = wearable_param->getWeight(); + s << " " << param_id << " " << param_weight << "\n"; + } + + s << " Textures:" << "\n"; + for (LLViewerWearable::te_map_t::const_iterator iter = w.mTEMap.begin(); + iter != w.mTEMap.end(); ++iter) + { + S32 te = iter->first; + const LLUUID& image_id = iter->second->getID(); + s << " " << te << " " << image_id << "\n"; + } + return s; +} + +std::string asset_id_to_filename(const LLUUID &asset_id) +{ + std::string asset_id_string; + asset_id.toString(asset_id_string); + std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,asset_id_string) + ".wbl"; + return filename; +} diff --git a/indra/newview/llviewerwearable.h b/indra/newview/llviewerwearable.h new file mode 100644 index 0000000000..65566f23a5 --- /dev/null +++ b/indra/newview/llviewerwearable.h @@ -0,0 +1,104 @@ +/** + * @file llviewerwearable.h + * @brief LLViewerWearable class header file + * + * $LicenseInfo:firstyear=2012&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$ + */ + +#ifndef LL_VIEWER_WEARABLE_H +#define LL_VIEWER_WEARABLE_H + +#include "llwearable.h" +#include "llavatarappearancedefines.h" + +class LLVOAvatar; + +class LLViewerWearable : public LLWearable +{ + friend class LLWearableList; + + //-------------------------------------------------------------------- + // Constructors and destructors + //-------------------------------------------------------------------- +private: + // Private constructors used by LLViewerWearableList + LLViewerWearable(const LLTransactionID& transactionID); + LLViewerWearable(const LLAssetID& assetID); +public: + virtual ~LLViewerWearable(); + + //-------------------------------------------------------------------- + // Accessors + //-------------------------------------------------------------------- +public: + const LLUUID& getItemID() const { return mItemID; } + const LLAssetID& getAssetID() const { return mAssetID; } + const LLTransactionID& getTransactionID() const { return mTransactionID; } + void setItemID(const LLUUID& item_id); + +public: + + BOOL isDirty() const; + BOOL isOldVersion() const; + + /*virtual*/ void writeToAvatar(LLAvatarAppearance *avatarp); + void removeFromAvatar( BOOL upload_bake ) { LLViewerWearable::removeFromAvatar( mType, upload_bake ); } + static void removeFromAvatar( LLWearableType::EType type, BOOL upload_bake ); + + /*virtual*/ EImportResult importStream( std::istream& input_stream, LLAvatarAppearance* avatarp ); + + void setParamsToDefaults(); + void setTexturesToDefaults(); + + /*virtual*/ LLUUID getDefaultTextureImageID(LLAvatarAppearanceDefines::ETextureIndex index) const; + + + void saveNewAsset() const; + static void onSaveNewAssetComplete( const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status ); + + void copyDataFrom(const LLViewerWearable* src); + + friend std::ostream& operator<<(std::ostream &s, const LLViewerWearable &w); + + /*virtual*/ void revertValues(); + /*virtual*/ void saveValues(); + + // Something happened that requires the wearable's label to be updated (e.g. worn/unworn). + /*virtual*/void setUpdated() const; + + // the wearable was worn. make sure the name of the wearable object matches the LLViewerInventoryItem, + // not the wearable asset itself. + void refreshName(); + + // Update the baked texture hash. + /*virtual*/void addToBakedTextureHash(LLMD5& hash) const; + +protected: + LLAssetID mAssetID; + LLTransactionID mTransactionID; + + LLUUID mItemID; // ID of the inventory item in the agent's inventory +}; + + +#endif // LL_VIEWER_WEARABLE_H + diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 4afd90b44c..0910b7536d 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -383,7 +383,7 @@ public: if (isAgentAvatarValid()) { - tvector = gAgent.getPosGlobalFromAgent(gAgentAvatarp->mRoot.getWorldPosition()); + tvector = gAgent.getPosGlobalFromAgent(gAgentAvatarp->mRoot->getWorldPosition()); agent_root_center_text = llformat("AgentRootCenter %f %f %f", (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); } @@ -1573,6 +1573,16 @@ LLViewerWindow::LLViewerWindow(const Params& p) LLViewerWindow::sMovieBaseName = "SLmovie"; resetSnapshotLoc(); + + /* + LLWindowCallbacks* callbacks, + const std::string& title, const std::string& name, S32 x, S32 y, S32 width, S32 height, U32 flags, + BOOL fullscreen, + BOOL clearBg, + BOOL disable_vsync, + BOOL ignore_pixel_depth, + U32 fsaa_samples) + */ // create window mWindow = LLWindowManager::createWindow(this, p.title, p.name, p.x, p.y, p.width, p.height, 0, @@ -2147,7 +2157,7 @@ void LLViewerWindow::reshape(S32 width, S32 height) calcDisplayScale(); - BOOL display_scale_changed = mDisplayScale != LLUI::sGLScaleFactor; + BOOL display_scale_changed = mDisplayScale != LLUI::getScaleFactor(); LLUI::setScaleFactor(mDisplayScale); // update our window rectangle @@ -2353,7 +2363,7 @@ void LLViewerWindow::draw() // scale view by UI global scale factor and aspect ratio correction factor gGL.scaleUI(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f); - LLVector2 old_scale_factor = LLUI::sGLScaleFactor; + LLVector2 old_scale_factor = LLUI::getScaleFactor(); // apply camera zoom transform (for high res screenshots) F32 zoom_factor = LLViewerCamera::getInstance()->getZoomFactor(); S16 sub_region = LLViewerCamera::getInstance()->getZoomSubRegion(); @@ -2367,7 +2377,7 @@ void LLViewerWindow::draw() (F32)getWindowHeightScaled() * -(F32)pos_y, 0.f); gGL.scalef(zoom_factor, zoom_factor, 1.f); - LLUI::sGLScaleFactor *= zoom_factor; + LLUI::getScaleFactor() *= zoom_factor; } // Draw tool specific overlay on world @@ -2415,7 +2425,7 @@ void LLViewerWindow::draw() LLFontGL::HCENTER, LLFontGL::TOP); } - LLUI::sGLScaleFactor = old_scale_factor; + LLUI::setScaleFactor(old_scale_factor); } LLUI::popMatrix(); gGL.popMatrix(); @@ -3218,8 +3228,8 @@ void LLViewerWindow::updateLayout() void LLViewerWindow::updateMouseDelta() { - S32 dx = lltrunc((F32) (mCurrentMousePoint.mX - mLastMousePoint.mX) * LLUI::sGLScaleFactor.mV[VX]); - S32 dy = lltrunc((F32) (mCurrentMousePoint.mY - mLastMousePoint.mY) * LLUI::sGLScaleFactor.mV[VY]); + S32 dx = lltrunc((F32) (mCurrentMousePoint.mX - mLastMousePoint.mX) * LLUI::getScaleFactor().mV[VX]); + S32 dy = lltrunc((F32) (mCurrentMousePoint.mY - mLastMousePoint.mY) * LLUI::getScaleFactor().mV[VY]); //RN: fix for asynchronous notification of mouse leaving window not working LLCoordWindow mouse_pos; @@ -4784,7 +4794,7 @@ void LLViewerWindow::restoreGL(const std::string& progress_message) gResizeScreenTexture = TRUE; gWindowResized = TRUE; - if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures()) + if (isAgentAvatarValid() && gAgentAvatarp->isEditingAppearance()) { LLVisualParamHint::requestHintUpdates(); } diff --git a/indra/newview/llvlcomposition.cpp b/indra/newview/llvlcomposition.cpp index abb5153480..94760e3c83 100644 --- a/indra/newview/llvlcomposition.cpp +++ b/indra/newview/llvlcomposition.cpp @@ -223,7 +223,7 @@ BOOL LLVLComposition::generateComposition() { if (mDetailTextures[i]->getDiscardLevel() < 0) { - mDetailTextures[i]->setBoostLevel(LLViewerTexture::BOOST_TERRAIN); // in case we are at low detail + mDetailTextures[i]->setBoostLevel(LLGLTexture::BOOST_TERRAIN); // in case we are at low detail mDetailTextures[i]->addTextureStats(BASE_SIZE*BASE_SIZE); return FALSE; } @@ -240,7 +240,7 @@ BOOL LLVLComposition::generateComposition() ddiscard++; min_dim /= 2; } - mDetailTextures[i]->setBoostLevel(LLViewerTexture::BOOST_TERRAIN); // in case we are at low detail + mDetailTextures[i]->setBoostLevel(LLGLTexture::BOOST_TERRAIN); // in case we are at low detail mDetailTextures[i]->setMinDiscardLevel(ddiscard); return FALSE; } @@ -376,9 +376,6 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y, LLPointer<LLImageRaw> raw = new LLImageRaw(tex_width, tex_height, tex_comps); U8 *rawp = raw->getData(); - F32 tex_width_inv = 1.f/tex_width; - F32 tex_height_inv = 1.f/tex_height; - F32 st_x_stride, st_y_stride; st_x_stride = ((F32)st_width / (F32)mTexScaleX)*((F32)mWidth / (F32)tex_width); st_y_stride = ((F32)st_height / (F32)mTexScaleY)*((F32)mWidth / (F32)tex_height); @@ -413,11 +410,6 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y, tex1 = tex0 + 1; tex1 = llclamp(tex1, 0, 3); - F32 xy_int_i, xy_int_j; - - xy_int_i = i * tex_width_inv; - xy_int_j = j * tex_height_inv; - st_offset = (lltrunc(sti) + lltrunc(stj)*st_width) * st_comps; for (U32 k = 0; k < tex_comps; k++) { @@ -461,7 +453,7 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y, for (S32 i = 0; i < 4; i++) { // Un-boost detatil textures (will get re-boosted if rendering in high detail) - mDetailTextures[i]->setBoostLevel(LLViewerTexture::BOOST_NONE); + mDetailTextures[i]->setBoostLevel(LLGLTexture::BOOST_NONE); mDetailTextures[i]->setMinDiscardLevel(MAX_DISCARD_LEVEL + 1); } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index f5b8244509..55dd574f25 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -36,6 +36,7 @@ #include <stdio.h> #include <ctype.h> +#include <sstream> #include "llaudioengine.h" #include "noise.h" @@ -53,6 +54,7 @@ #include "llcallingcard.h" // IDEVO for LLAvatarTracker #include "lldrawpoolavatar.h" #include "lldriverparam.h" +#include "llpolyskeletaldistortion.h" #include "lleditingmotion.h" #include "llemote.h" //#include "llfirstuse.h" @@ -78,15 +80,16 @@ #include "llselectmgr.h" #include "llsprite.h" #include "lltargetingmotion.h" -#include "lltexlayer.h" #include "lltoolmorph.h" #include "llviewercamera.h" +#include "llviewertexlayer.h" #include "llviewertexturelist.h" #include "llviewermenu.h" #include "llviewerobjectlist.h" #include "llviewerparcelmgr.h" #include "llviewershadermgr.h" #include "llviewerstats.h" +#include "llviewerwearable.h" #include "llvoavatarself.h" #include "llvovolume.h" #include "llworld.h" @@ -103,6 +106,7 @@ #include "lldebugmessagebox.h" #include "llsdutil.h" +#include "llsdserialize.h" extern F32 SPEED_ADJUST_MAX; extern F32 SPEED_ADJUST_MAX_SEC; @@ -118,7 +122,7 @@ extern F32 ANIM_SPEED_MIN; // #define OUTPUT_BREAST_DATA -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines; //----------------------------------------------------------------------------- // Global constants @@ -139,7 +143,6 @@ const LLUUID ANIM_AGENT_PHYSICS_MOTION = LLUUID("7360e029-3cb8-ebc4-863e-212df44 //----------------------------------------------------------------------------- // Constants //----------------------------------------------------------------------------- -const std::string AVATAR_DEFAULT_CHAR = "avatar"; const S32 MIN_PIXEL_AREA_FOR_COMPOSITE = 1024; const F32 SHADOW_OFFSET_AMT = 0.03f; @@ -244,6 +247,24 @@ struct LLVOAvatarCollisionVolumeInfo : public LLInitParam::Block<LLVOAvatarColli scale; }; +struct LLAppearanceMessageContents +{ + LLAppearanceMessageContents(): + mAppearanceVersion(-1), + mParamAppearanceVersion(-1), + mCOFVersion(LLViewerInventoryCategory::VERSION_UNKNOWN) + { + } + LLTEContents mTEContents; + S32 mAppearanceVersion; + S32 mParamAppearanceVersion; + S32 mCOFVersion; + // For future use: + //U32 appearance_flags = 0; + std::vector<F32> mParamWeights; + std::vector<LLVisualParam*> mParams; +}; + struct LLVOAvatarChildJoint : public LLInitParam::ChoiceBlock<LLVOAvatarChildJoint> { Alternative<Lazy<struct LLVOAvatarBoneInfo, IS_A_BLOCK> > bone; @@ -605,11 +626,7 @@ private: //----------------------------------------------------------------------------- // Static Data //----------------------------------------------------------------------------- -LLXmlTree LLVOAvatar::sXMLTree; -LLXMLNodePtr LLVOAvatar::sSkeletonXMLTree; -LLVOAvatarSkeletonInfo* LLVOAvatar::sAvatarSkeletonInfo = NULL; -LLVOAvatar::LLVOAvatarXmlInfo* LLVOAvatar::sAvatarXmlInfo = NULL; -LLVOAvatarDictionary *LLVOAvatar::sAvatarDictionary = NULL; +LLAvatarAppearanceDictionary *LLVOAvatar::sAvatarDictionary = NULL; S32 LLVOAvatar::sFreezeCounter = 0; U32 LLVOAvatar::sMaxVisible = 12; F32 LLVOAvatar::sRenderDistance = 256.f; @@ -656,15 +673,13 @@ static F32 calc_bouncy_animation(F32 x); LLVOAvatar::LLVOAvatar(const LLUUID& id, const LLPCode pcode, LLViewerRegion* regionp) : + LLAvatarAppearance(&gAgentWearables), LLViewerObject(id, pcode, regionp), - mIsDummy(FALSE), mSpecialRenderMode(0), mAttachmentGeometryBytes(0), mAttachmentSurfaceArea(0.f), mTurning(FALSE), - mPelvisToFoot(0.f), mLastSkeletonSerialNum( 0 ), - mHeadOffset(), mIsSitting(FALSE), mTimeVisible(), mTyping(FALSE), @@ -689,9 +704,6 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mFirstAppearanceMessageReceived( FALSE ), mCulled( FALSE ), mVisibilityRank(0), - mTexSkinColor( NULL ), - mTexHairColor( NULL ), - mTexEyeColor( NULL ), mNeedsSkin(FALSE), mLastSkinTime(0.f), mUpdatePeriod(1), @@ -699,12 +711,15 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mFullyLoaded(FALSE), mPreviousFullyLoaded(FALSE), mFullyLoadedInitialized(FALSE), - mSupportsAlphaLayers(FALSE), mLoadedCallbacksPaused(FALSE), mHasPelvisOffset( FALSE ), mRenderUnloadedAvatar(LLCachedControl<bool>(gSavedSettings, "RenderUnloadedAvatar")), - mLastRezzedStatus(-1) - + mLastRezzedStatus(-1), + mIsEditingAppearance(FALSE), + mUseLocalAppearance(FALSE), + mUseServerBakes(FALSE), // FIXME DRANO consider using boost::optional, defaulting to unknown. + mLastUpdateRequestCOFVersion(-1), + mLastUpdateReceivedCOFVersion(-1) { //VTResume(); // VTune @@ -716,28 +731,10 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mPelvisp = NULL; - mBakedTextureDatas.resize(BAKED_NUM_INDICES); - for (U32 i = 0; i < mBakedTextureDatas.size(); i++ ) - { - mBakedTextureDatas[i].mLastTextureIndex = IMG_DEFAULT_AVATAR; - mBakedTextureDatas[i].mTexLayerSet = NULL; - mBakedTextureDatas[i].mIsLoaded = false; - mBakedTextureDatas[i].mIsUsed = false; - mBakedTextureDatas[i].mMaskTexName = 0; - mBakedTextureDatas[i].mTextureIndex = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)i); - } - mDirtyMesh = 2; // Dirty geometry, need to regenerate. mMeshTexturesDirty = FALSE; mHeadp = NULL; - mIsBuilt = FALSE; - - mNumJoints = 0; - mSkeleton = NULL; - - mNumCollisionVolumes = 0; - mCollisionVolumes = NULL; // set up animation variables mSpeed = 0.f; @@ -824,50 +821,13 @@ LLVOAvatar::~LLVOAvatar() debugAvatarRezTime("AvatarRezLeftNotification","left sometime after declouding"); } - lldebugs << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << llendl; - - mRoot.removeAllChildren(); - mJointMap.clear(); - - deleteAndClearArray(mSkeleton); - deleteAndClearArray(mCollisionVolumes); - - mNumJoints = 0; + logPendingPhases(); - for (U32 i = 0; i < mBakedTextureDatas.size(); i++) - { - deleteAndClear(mBakedTextureDatas[i].mTexLayerSet); - mBakedTextureDatas[i].mMeshes.clear(); - - for (morph_list_t::iterator iter2 = mBakedTextureDatas[i].mMaskedMorphs.begin(); - iter2 != mBakedTextureDatas[i].mMaskedMorphs.end(); iter2++) - { - LLMaskedMorph* masked_morph = (*iter2); - delete masked_morph; - } - } + lldebugs << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << llendl; std::for_each(mAttachmentPoints.begin(), mAttachmentPoints.end(), DeletePairedPointer()); mAttachmentPoints.clear(); - deleteAndClear(mTexSkinColor); - deleteAndClear(mTexHairColor); - deleteAndClear(mTexEyeColor); - - std::for_each(mMeshes.begin(), mMeshes.end(), DeletePairedPointer()); - mMeshes.clear(); - - for (std::vector<LLViewerJoint*>::iterator jointIter = mMeshLOD.begin(); - jointIter != mMeshLOD.end(); - ++jointIter) - { - LLViewerJoint* joint = (LLViewerJoint *) *jointIter; - std::for_each(joint->mMeshParts.begin(), joint->mMeshParts.end(), DeletePointer()); - joint->mMeshParts.clear(); - } - std::for_each(mMeshLOD.begin(), mMeshLOD.end(), DeletePointer()); - mMeshLOD.clear(); - mDead = TRUE; mAnimationSources.clear(); @@ -912,7 +872,7 @@ BOOL LLVOAvatar::isFullyTextured() const { for (S32 i = 0; i < mMeshLOD.size(); i++) { - LLViewerJoint* joint = (LLViewerJoint*) mMeshLOD[i]; + LLAvatarJoint* joint = mMeshLOD[i]; if (i==MESH_ID_SKIRT && !isWearingWearableType(LLWearableType::WT_SKIRT)) { continue; // don't care about skirt textures if we're not wearing one. @@ -921,19 +881,19 @@ BOOL LLVOAvatar::isFullyTextured() const { continue; // nonexistent LOD OK. } - std::vector<LLViewerJointMesh*>::iterator meshIter = joint->mMeshParts.begin(); + avatar_joint_mesh_list_t::iterator meshIter = joint->mMeshParts.begin(); if (meshIter != joint->mMeshParts.end()) { - LLViewerJointMesh *mesh = (LLViewerJointMesh *) *meshIter; + LLAvatarJointMesh *mesh = (*meshIter); if (!mesh) { continue; // nonexistent mesh OK } - if (mesh->mTexture.notNull() && mesh->mTexture->hasGLTexture()) + if (mesh->hasGLTexture()) { continue; // Mesh exists and has a baked texture. } - if (mesh->mLayerSet && mesh->mLayerSet->hasComposite()) + if (mesh->hasComposite()) { continue; // Mesh exists and has a composite texture. } @@ -952,6 +912,7 @@ BOOL LLVOAvatar::hasGray() const S32 LLVOAvatar::getRezzedStatus() const { if (getIsCloud()) return 0; + if (isFullyTextured() && allBakedTexturesCompletelyDownloaded()) return 3; if (isFullyTextured()) return 2; llassert(hasGray()); return 1; // gray @@ -1007,7 +968,7 @@ BOOL LLVOAvatar::areAllNearbyInstancesBaked(S32& grey_avatars) void LLVOAvatar::getNearbyRezzedStats(std::vector<S32>& counts) { counts.clear(); - counts.resize(3); + counts.resize(4); for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); iter != LLCharacter::sInstances.end(); ++iter) { @@ -1025,6 +986,7 @@ std::string LLVOAvatar::rezStatusToString(S32 rez_status) if (rez_status==0) return "cloud"; if (rez_status==1) return "gray"; if (rez_status==2) return "textured"; + if (rez_status==3) return "textured_and_downloaded"; return "unknown"; } @@ -1086,15 +1048,15 @@ void LLVOAvatar::dumpBakedStatus() { llcont << " Unbaked ("; - for (LLVOAvatarDictionary::BakedTextures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); - iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); + for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); + iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); ++iter) { - const LLVOAvatarDictionary::BakedEntry *baked_dict = iter->second; + const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = iter->second; const ETextureIndex index = baked_dict->mTextureIndex; if (!inst->isTextureDefined(index)) { - llcont << " " << LLVOAvatarDictionary::getInstance()->getTexture(index)->mName; + llcont << " " << LLAvatarAppearanceDictionary::getInstance()->getTexture(index)->mName; } } llcont << " ) " << inst->getUnbakedPixelAreaRank(); @@ -1115,7 +1077,7 @@ void LLVOAvatar::restoreGL() gAgentAvatarp->setCompositeUpdatesEnabled(TRUE); for (U32 i = 0; i < gAgentAvatarp->mBakedTextureDatas.size(); i++) { - gAgentAvatarp->invalidateComposite(gAgentAvatarp->mBakedTextureDatas[i].mTexLayerSet, FALSE); + gAgentAvatarp->invalidateComposite(gAgentAvatarp->getTexLayerSet(i), FALSE); } gAgentAvatarp->updateMeshTextures(); } @@ -1142,7 +1104,7 @@ void LLVOAvatar::resetImpostors() // static void LLVOAvatar::deleteCachedImages(bool clearAll) { - if (LLTexLayerSet::sHasCaches) + if (LLViewerTexLayerSet::sHasCaches) { lldebugs << "Deleting layer set caches" << llendl; for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); @@ -1151,7 +1113,7 @@ void LLVOAvatar::deleteCachedImages(bool clearAll) LLVOAvatar* inst = (LLVOAvatar*) *iter; inst->deleteLayerSetCaches(clearAll); } - LLTexLayerSet::sHasCaches = FALSE; + LLViewerTexLayerSet::sHasCaches = FALSE; } LLVOAvatarSelf::deleteScratchTextures(); LLTexLayerStaticImageList::getInstance()->deleteCachedImages(); @@ -1164,97 +1126,6 @@ void LLVOAvatar::deleteCachedImages(bool clearAll) //------------------------------------------------------------------------ void LLVOAvatar::initClass() { - std::string xmlFile; - - xmlFile = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,AVATAR_DEFAULT_CHAR) + "_lad.xml"; - BOOL success = sXMLTree.parseFile( xmlFile, FALSE ); - if (!success) - { - llerrs << "Problem reading avatar configuration file:" << xmlFile << llendl; - } - - // now sanity check xml file - LLXmlTreeNode* root = sXMLTree.getRoot(); - if (!root) - { - llerrs << "No root node found in avatar configuration file: " << xmlFile << llendl; - return; - } - - //------------------------------------------------------------------------- - // <linden_avatar version="1.0"> (root) - //------------------------------------------------------------------------- - if( !root->hasName( "linden_avatar" ) ) - { - llerrs << "Invalid avatar file header: " << xmlFile << llendl; - } - - std::string version; - static LLStdStringHandle version_string = LLXmlTree::addAttributeString("version"); - if( !root->getFastAttributeString( version_string, version ) || (version != "1.0") ) - { - llerrs << "Invalid avatar file version: " << version << " in file: " << xmlFile << llendl; - } - - S32 wearable_def_version = 1; - static LLStdStringHandle wearable_definition_version_string = LLXmlTree::addAttributeString("wearable_definition_version"); - root->getFastAttributeS32( wearable_definition_version_string, wearable_def_version ); - LLWearable::setCurrentDefinitionVersion( wearable_def_version ); - - std::string mesh_file_name; - - LLXmlTreeNode* skeleton_node = root->getChildByName( "skeleton" ); - if (!skeleton_node) - { - llerrs << "No skeleton in avatar configuration file: " << xmlFile << llendl; - return; - } - - std::string skeleton_file_name; - static LLStdStringHandle file_name_string = LLXmlTree::addAttributeString("file_name"); - if (!skeleton_node->getFastAttributeString(file_name_string, skeleton_file_name)) - { - llerrs << "No file name in skeleton node in avatar config file: " << xmlFile << llendl; - } - - std::string skeleton_path; - skeleton_path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,skeleton_file_name); - if (!parseSkeletonFile(skeleton_path)) - { - llerrs << "Error parsing skeleton file: " << skeleton_path << llendl; - } - - // parse avatar_lad.xml - if (sAvatarXmlInfo) - { //this can happen if a login attempt failed - deleteAndClear(sAvatarXmlInfo); - } - sAvatarXmlInfo = new LLVOAvatarXmlInfo; - if (!sAvatarXmlInfo->parseXmlSkeletonNode(root)) - { - llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl; - } - if (!sAvatarXmlInfo->parseXmlMeshNodes(root)) - { - llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl; - } - if (!sAvatarXmlInfo->parseXmlColorNodes(root)) - { - llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl; - } - if (!sAvatarXmlInfo->parseXmlLayerNodes(root)) - { - llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl; - } - if (!sAvatarXmlInfo->parseXmlDriverNodes(root)) - { - llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl; - } - if (!sAvatarXmlInfo->parseXmlMorphNodes(root)) - { - llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl; - } - gAnimLibrary.animStateSetString(ANIM_AGENT_BODY_NOISE,"body_noise"); gAnimLibrary.animStateSetString(ANIM_AGENT_BREATHE_ROT,"breathe_rot"); gAnimLibrary.animStateSetString(ANIM_AGENT_PHYSICS_MOTION,"physics_motion"); @@ -1271,85 +1142,12 @@ void LLVOAvatar::initClass() void LLVOAvatar::cleanupClass() { - deleteAndClear(sAvatarXmlInfo); - sSkeletonXMLTree = NULL; - sXMLTree.cleanup(); } +// virtual void LLVOAvatar::initInstance(void) { //------------------------------------------------------------------------- - // initialize joint, mesh and shape members - //------------------------------------------------------------------------- - mRoot.setName( "mRoot" ); - - for (LLVOAvatarDictionary::Meshes::const_iterator iter = LLVOAvatarDictionary::getInstance()->getMeshes().begin(); - iter != LLVOAvatarDictionary::getInstance()->getMeshes().end(); - ++iter) - { - const EMeshIndex mesh_index = iter->first; - const LLVOAvatarDictionary::MeshEntry *mesh_dict = iter->second; - LLViewerJoint* joint = new LLViewerJoint(); - joint->setName(mesh_dict->mName); - joint->setMeshID(mesh_index); - mMeshLOD.push_back(joint); - - /* mHairLOD.setName("mHairLOD"); - mHairMesh0.setName("mHairMesh0"); - mHairMesh0.setMeshID(MESH_ID_HAIR); - mHairMesh1.setName("mHairMesh1"); */ - for (U32 lod = 0; lod < mesh_dict->mLOD; lod++) - { - LLViewerJointMesh* mesh = new LLViewerJointMesh(); - std::string mesh_name = "m" + mesh_dict->mName + boost::lexical_cast<std::string>(lod); - // We pre-pended an m - need to capitalize first character for camelCase - mesh_name[1] = toupper(mesh_name[1]); - mesh->setName(mesh_name); - mesh->setMeshID(mesh_index); - mesh->setPickName(mesh_dict->mPickName); - mesh->setIsTransparent(FALSE); - switch((int)mesh_index) - { - case MESH_ID_HAIR: - mesh->setIsTransparent(TRUE); - break; - case MESH_ID_SKIRT: - mesh->setIsTransparent(TRUE); - break; - case MESH_ID_EYEBALL_LEFT: - case MESH_ID_EYEBALL_RIGHT: - mesh->setSpecular( LLColor4( 1.0f, 1.0f, 1.0f, 1.0f ), 1.f ); - break; - } - - joint->mMeshParts.push_back(mesh); - } - } - - //------------------------------------------------------------------------- - // associate baked textures with meshes - //------------------------------------------------------------------------- - for (LLVOAvatarDictionary::Meshes::const_iterator iter = LLVOAvatarDictionary::getInstance()->getMeshes().begin(); - iter != LLVOAvatarDictionary::getInstance()->getMeshes().end(); - ++iter) - { - const EMeshIndex mesh_index = iter->first; - const LLVOAvatarDictionary::MeshEntry *mesh_dict = iter->second; - const EBakedTextureIndex baked_texture_index = mesh_dict->mBakedID; - // Skip it if there's no associated baked texture. - if (baked_texture_index == BAKED_NUM_INDICES) continue; - - for (std::vector<LLViewerJointMesh* >::iterator iter = mMeshLOD[mesh_index]->mMeshParts.begin(); - iter != mMeshLOD[mesh_index]->mMeshParts.end(); - ++iter) - { - LLViewerJointMesh* mesh = (LLViewerJointMesh*) *iter; - mBakedTextureDatas[(int)baked_texture_index].mMeshes.push_back(mesh); - } - } - - - //------------------------------------------------------------------------- // register motions //------------------------------------------------------------------------- if (LLCharacter::sInstances.size() == 1) @@ -1407,10 +1205,9 @@ void LLVOAvatar::initInstance(void) registerMotion( ANIM_AGENT_SIT_FEMALE, LLKeyframeMotion::create ); registerMotion( ANIM_AGENT_TARGET, LLTargetingMotion::create ); registerMotion( ANIM_AGENT_WALK_ADJUST, LLWalkAdjustMotion::create ); - } - buildCharacter(); + LLAvatarAppearance::initInstance(); // preload specific motions here createMotion( ANIM_AGENT_CUSTOMIZE); @@ -1419,7 +1216,30 @@ void LLVOAvatar::initInstance(void) //VTPause(); // VTune mVoiceVisualizer->setVoiceEnabled( LLVoiceClient::getInstance()->getVoiceEnabled( mID ) ); +} + +// virtual +LLAvatarJoint* LLVOAvatar::createAvatarJoint() +{ + return new LLViewerJoint(); +} + +// virtual +LLAvatarJoint* LLVOAvatar::createAvatarJoint(S32 joint_num) +{ + return new LLViewerJoint(joint_num); +} +// virtual +LLAvatarJointMesh* LLVOAvatar::createAvatarJointMesh() +{ + return new LLViewerJointMesh(); +} + +// virtual +LLTexLayerSet* LLVOAvatar::createTexLayerSet() +{ + return new LLViewerTexLayerSet(this); } const LLVector3 LLVOAvatar::getRenderPosition() const @@ -1494,7 +1314,7 @@ void LLVOAvatar::getSpatialExtents(LLVector4a& newMin, LLVector4a& newMax) float max_attachment_span = get_default_max_prim_scale() * 5.0f; //stretch bounding box by joint positions - for (polymesh_map_t::iterator i = mMeshes.begin(); i != mMeshes.end(); ++i) + for (polymesh_map_t::iterator i = mPolyMeshes.begin(); i != mPolyMeshes.end(); ++i) { LLPolyMesh* mesh = i->second; for (S32 joint_num = 0; joint_num < mesh->mJointRenderData.count(); joint_num++) @@ -1732,148 +1552,6 @@ LLViewerObject* LLVOAvatar::lineSegmentIntersectRiggedAttachments(const LLVector return hit; } -//----------------------------------------------------------------------------- -// parseSkeletonFile() -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename) -{ - //------------------------------------------------------------------------- - // parse the file - //------------------------------------------------------------------------- - - LLXMLNodePtr skeleton_xml; - BOOL parsesuccess = LLXMLNode::parseFile(filename, skeleton_xml, NULL); - - if (!parsesuccess || skeleton_xml.isNull()) - { - llerrs << "Can't parse skeleton file: " << filename << llendl; - return FALSE; - } - - // Process XML data - if (sAvatarSkeletonInfo) - { //this can happen if a login attempt failed - delete sAvatarSkeletonInfo; - } - sAvatarSkeletonInfo = new LLVOAvatarSkeletonInfo; - - LLXUIParser parser; - parser.readXUI(skeleton_xml, *sAvatarSkeletonInfo, filename); - if (!sAvatarSkeletonInfo->validateBlock()) - { - llerrs << "Error parsing skeleton XML file: " << filename << llendl; - } - - if( !skeleton_xml->hasName( "linden_skeleton" ) ) - { - llerrs << "Invalid avatar skeleton file header: " << filename << llendl; - return FALSE; - } - - if (sAvatarSkeletonInfo->version() != "1.0") - { - llerrs << "Invalid avatar skeleton file version: " << sAvatarSkeletonInfo->version() << " in file: " << filename << llendl; - return FALSE; - } - - return TRUE; -} - -//----------------------------------------------------------------------------- -// setupBone() -//----------------------------------------------------------- -BOOL LLVOAvatar::setupBone(const LLVOAvatarChildJoint& info, LLViewerJoint* parent, S32 &volume_num, S32 &joint_num) -{ - LLViewerJoint* joint = NULL; - if (info.bone.isChosen()) - { - joint = (LLViewerJoint*)getCharacterJoint(joint_num); - if (!joint) - { - llwarns << "Too many bones" << llendl; - return FALSE; - } - joint->setName( info.bone().name ); - joint->setPosition(info.bone().pos); - joint->setRotation(mayaQ(info.bone().rot().mV[VX], info.bone().rot().mV[VY], info.bone().rot().mV[VZ], LLQuaternion::XYZ)); - joint->setScale(info.bone().scale); - joint->setSkinOffset( info.bone().pivot ); - joint_num++; - - for (LLInitParam::ParamIterator<LLVOAvatarChildJoint>::const_iterator child_it = info.bone().children.begin(), - end_it = info.bone().children.end(); - child_it != end_it; - ++child_it) - { - if (!setupBone(*child_it, joint, volume_num, joint_num)) - { - return FALSE; - } - } - } - else // collision volume - { - if (volume_num >= (S32)mNumCollisionVolumes) - { - llwarns << "Too many bones" << llendl; - return FALSE; - } - joint = (LLViewerJoint*)(&mCollisionVolumes[volume_num]); - joint->setName( info.collision_volume.name); - joint->setPosition(info.collision_volume.pos); - joint->setRotation(mayaQ(info.collision_volume.rot().mV[VX], info.collision_volume.rot().mV[VY], info.collision_volume.rot().mV[VZ], LLQuaternion::XYZ)); - joint->setScale(info.collision_volume.scale); - volume_num++; - } - - // add to parent - if (parent) - { - parent->addChild( joint ); - } - - joint->setDefaultFromCurrentXform(); - - return TRUE; -} - -//----------------------------------------------------------------------------- -// buildSkeleton() -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::buildSkeleton(const LLVOAvatarSkeletonInfo *info) -{ - //------------------------------------------------------------------------- - // allocate joints - //------------------------------------------------------------------------- - if (!allocateCharacterJoints(info->num_bones)) - { - llerrs << "Can't allocate " << info->num_bones() << " joints" << llendl; - return FALSE; - } - - //------------------------------------------------------------------------- - // allocate volumes - //------------------------------------------------------------------------- - if (info->num_collision_volumes) - { - if (!allocateCollisionVolumes(info->num_collision_volumes)) - { - llerrs << "Can't allocate " << info->num_collision_volumes() << " collision volumes" << llendl; - return FALSE; - } - } - - S32 current_joint_num = 0; - S32 current_volume_num = 0; - - if (!setupBone(info->skeleton_root, NULL, current_volume_num, current_joint_num)) - { - llerrs << "Error parsing bone in skeleton file" << llendl; - return FALSE; - } - - return TRUE; -} LLVOAvatar* LLVOAvatar::asAvatar() { @@ -1906,114 +1584,15 @@ void LLVOAvatar::startDefaultMotions() // LLVOAvatar::buildCharacter() // Deferred initialization and rebuild of the avatar. //----------------------------------------------------------------------------- +// virtual void LLVOAvatar::buildCharacter() { - //------------------------------------------------------------------------- - // remove all references to our existing skeleton - // so we can rebuild it - //------------------------------------------------------------------------- - flushAllMotions(); + LLAvatarAppearance::buildCharacter(); - //------------------------------------------------------------------------- - // remove all of mRoot's children - //------------------------------------------------------------------------- - mRoot.removeAllChildren(); - mJointMap.clear(); + // Not done building yet; more to do. mIsBuilt = FALSE; //------------------------------------------------------------------------- - // clear mesh data - //------------------------------------------------------------------------- - for (std::vector<LLViewerJoint*>::iterator jointIter = mMeshLOD.begin(); - jointIter != mMeshLOD.end(); ++jointIter) - { - LLViewerJoint* joint = (LLViewerJoint*) *jointIter; - for (std::vector<LLViewerJointMesh*>::iterator meshIter = joint->mMeshParts.begin(); - meshIter != joint->mMeshParts.end(); ++meshIter) - { - LLViewerJointMesh * mesh = (LLViewerJointMesh *) *meshIter; - mesh->setMesh(NULL); - } - } - - //------------------------------------------------------------------------- - // (re)load our skeleton and meshes - //------------------------------------------------------------------------- - LLTimer timer; - - BOOL status = loadAvatar(); - stop_glerror(); - -// gPrintMessagesThisFrame = TRUE; - lldebugs << "Avatar load took " << timer.getElapsedTimeF32() << " seconds." << llendl; - - if (!status) - { - if (isSelf()) - { - llerrs << "Unable to load user's avatar" << llendl; - } - else - { - llwarns << "Unable to load other's avatar" << llendl; - } - return; - } - - //------------------------------------------------------------------------- - // initialize "well known" joint pointers - //------------------------------------------------------------------------- - mPelvisp = (LLViewerJoint*)mRoot.findJoint("mPelvis"); - mTorsop = (LLViewerJoint*)mRoot.findJoint("mTorso"); - mChestp = (LLViewerJoint*)mRoot.findJoint("mChest"); - mNeckp = (LLViewerJoint*)mRoot.findJoint("mNeck"); - mHeadp = (LLViewerJoint*)mRoot.findJoint("mHead"); - mSkullp = (LLViewerJoint*)mRoot.findJoint("mSkull"); - mHipLeftp = (LLViewerJoint*)mRoot.findJoint("mHipLeft"); - mHipRightp = (LLViewerJoint*)mRoot.findJoint("mHipRight"); - mKneeLeftp = (LLViewerJoint*)mRoot.findJoint("mKneeLeft"); - mKneeRightp = (LLViewerJoint*)mRoot.findJoint("mKneeRight"); - mAnkleLeftp = (LLViewerJoint*)mRoot.findJoint("mAnkleLeft"); - mAnkleRightp = (LLViewerJoint*)mRoot.findJoint("mAnkleRight"); - mFootLeftp = (LLViewerJoint*)mRoot.findJoint("mFootLeft"); - mFootRightp = (LLViewerJoint*)mRoot.findJoint("mFootRight"); - mWristLeftp = (LLViewerJoint*)mRoot.findJoint("mWristLeft"); - mWristRightp = (LLViewerJoint*)mRoot.findJoint("mWristRight"); - mEyeLeftp = (LLViewerJoint*)mRoot.findJoint("mEyeLeft"); - mEyeRightp = (LLViewerJoint*)mRoot.findJoint("mEyeRight"); - - //------------------------------------------------------------------------- - // Make sure "well known" pointers exist - //------------------------------------------------------------------------- - if (!(mPelvisp && - mTorsop && - mChestp && - mNeckp && - mHeadp && - mSkullp && - mHipLeftp && - mHipRightp && - mKneeLeftp && - mKneeRightp && - mAnkleLeftp && - mAnkleRightp && - mFootLeftp && - mFootRightp && - mWristLeftp && - mWristRightp && - mEyeLeftp && - mEyeRightp)) - { - llerrs << "Failed to create avatar." << llendl; - return; - } - - //------------------------------------------------------------------------- - // initialize the pelvis - //------------------------------------------------------------------------- - mPelvisp->setPosition( LLVector3(0.0f, 0.0f, 0.0f) ); - - //------------------------------------------------------------------------- // set head offset from pelvis //------------------------------------------------------------------------- updateHeadOffset(); @@ -2065,11 +1644,11 @@ void LLVOAvatar::releaseMeshData() //llinfos << "Releasing" << llendl; // cleanup mesh data - for (std::vector<LLViewerJoint*>::iterator iter = mMeshLOD.begin(); + for (avatar_joint_list_t::iterator iter = mMeshLOD.begin(); iter != mMeshLOD.end(); ++iter) { - LLViewerJoint* joint = (LLViewerJoint*) *iter; + LLAvatarJoint* joint = (*iter); joint->setValid(FALSE, TRUE); } @@ -2158,7 +1737,11 @@ void LLVOAvatar::updateMeshData() last_v_num = num_vertices ; last_i_num = num_indices ; - mMeshLOD[part_index++]->updateFaceSizes(num_vertices, num_indices, mAdjustedPixelArea); + LLViewerJoint* part_mesh = getViewerJoint(part_index++); + if (part_mesh) + { + part_mesh->updateFaceSizes(num_vertices, num_indices, mAdjustedPixelArea); + } } if(num_vertices < 1)//skip empty meshes { @@ -2232,7 +1815,11 @@ void LLVOAvatar::updateMeshData() rigid = true; } - mMeshLOD[k]->updateFaceData(facep, mAdjustedPixelArea, k == MESH_ID_HAIR, terse_update && !rigid); + LLViewerJoint* mesh = getViewerJoint(k); + if (mesh) + { + mesh->updateFaceData(facep, mAdjustedPixelArea, k == MESH_ID_HAIR, terse_update && !rigid); + } } stop_glerror(); @@ -2253,72 +1840,6 @@ void LLVOAvatar::updateMeshData() //------------------------------------------------------------------------ //------------------------------------------------------------------------ -// The viewer can only suggest a good size for the agent, -// the simulator will keep it inside a reasonable range. -void LLVOAvatar::computeBodySize() -{ - LLVector3 pelvis_scale = mPelvisp->getScale(); - - // some of the joints have not been cached - LLVector3 skull = mSkullp->getPosition(); - LLVector3 skull_scale = mSkullp->getScale(); - - LLVector3 neck = mNeckp->getPosition(); - LLVector3 neck_scale = mNeckp->getScale(); - - LLVector3 chest = mChestp->getPosition(); - LLVector3 chest_scale = mChestp->getScale(); - - // the rest of the joints have been cached - LLVector3 head = mHeadp->getPosition(); - LLVector3 head_scale = mHeadp->getScale(); - - LLVector3 torso = mTorsop->getPosition(); - LLVector3 torso_scale = mTorsop->getScale(); - - LLVector3 hip = mHipLeftp->getPosition(); - LLVector3 hip_scale = mHipLeftp->getScale(); - - LLVector3 knee = mKneeLeftp->getPosition(); - LLVector3 knee_scale = mKneeLeftp->getScale(); - - LLVector3 ankle = mAnkleLeftp->getPosition(); - LLVector3 ankle_scale = mAnkleLeftp->getScale(); - - LLVector3 foot = mFootLeftp->getPosition(); - - mPelvisToFoot = hip.mV[VZ] * pelvis_scale.mV[VZ] - - knee.mV[VZ] * hip_scale.mV[VZ] - - ankle.mV[VZ] * knee_scale.mV[VZ] - - foot.mV[VZ] * ankle_scale.mV[VZ]; - - LLVector3 new_body_size; - new_body_size.mV[VZ] = mPelvisToFoot + - // the sqrt(2) correction below is an approximate - // correction to get to the top of the head - F_SQRT2 * (skull.mV[VZ] * head_scale.mV[VZ]) + - head.mV[VZ] * neck_scale.mV[VZ] + - neck.mV[VZ] * chest_scale.mV[VZ] + - chest.mV[VZ] * torso_scale.mV[VZ] + - torso.mV[VZ] * pelvis_scale.mV[VZ]; - - // TODO -- measure the real depth and width - new_body_size.mV[VX] = DEFAULT_AGENT_DEPTH; - new_body_size.mV[VY] = DEFAULT_AGENT_WIDTH; - - if (new_body_size != mBodySize) - { - mBodySize = new_body_size; - - if (isSelf() && !LLAppearanceMgr::instance().isInUpdateAppearanceFromCOF()) - { // notify simulator of change in size - // but not if we are in the middle of updating appearance - gAgent.sendAgentSetAppearance(); - } - } -} - -//------------------------------------------------------------------------ // LLVOAvatar::processUpdateMessage() //------------------------------------------------------------------------ U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys, @@ -2326,7 +1847,6 @@ U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys, U32 block_num, const EObjectUpdateType update_type, LLDataPacker *dp) { - LLVector3 old_vel = getVelocity(); const BOOL has_name = !getNVPair("FirstName"); // Do base class updates... @@ -2354,21 +1874,51 @@ U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys, return retval; } -// virtual -S32 LLVOAvatar::setTETexture(const U8 te, const LLUUID& uuid) +LLViewerFetchedTexture *LLVOAvatar::getBakedTextureImage(const U8 te, const LLUUID& uuid) { - // The core setTETexture() method requests images, so we need - // to redirect certain avatar texture requests to different sims. - if (isIndexBakedTexture((ETextureIndex)te)) + LLViewerFetchedTexture *result = NULL; + + if (uuid == IMG_DEFAULT_AVATAR || + uuid == IMG_DEFAULT || + uuid == IMG_INVISIBLE) { - LLHost target_host = getObjectHost(); - return setTETextureCore(te, uuid, target_host); + // Should already exist, don't need to find it on sim or baked-texture host. + result = gTextureList.findImage(uuid); + } + + if (!result) +{ + const std::string url = getImageURL(te,uuid); + if (!url.empty()) + { + LL_DEBUGS("Avatar") << avString() << "from URL " << url << llendl; + result = LLViewerTextureManager::getFetchedTextureFromUrl( + url, FTT_SERVER_BAKE, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, uuid); } else { - return setTETextureCore(te, uuid, LLHost::invalid); + LL_DEBUGS("Avatar") << avString() << "from host " << uuid << llendl; + LLHost host = getObjectHost(); + result = LLViewerTextureManager::getFetchedTexture( + uuid, FTT_HOST_BAKE, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); } } + return result; +} + +// virtual +S32 LLVOAvatar::setTETexture(const U8 te, const LLUUID& uuid) +{ + if (!isIndexBakedTexture((ETextureIndex)te)) + { + // Sim still sends some uuids for non-baked slots sometimes - ignore. + return LLViewerObject::setTETexture(te, LLUUID::null); + } + + LLViewerFetchedTexture *image = getBakedTextureImage(te,uuid); + llassert(image); + return setTETextureCore(te, image); +} static LLFastTimer::DeclareTimer FTM_AVATAR_UPDATE("Avatar Update"); static LLFastTimer::DeclareTimer FTM_JOINT_UPDATE("Update Joints"); @@ -2413,7 +1963,8 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) return; } - if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_AVATAR))) + if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_AVATAR)) + && !(gSavedSettings.getBOOL("DisableAllRenderTypes"))) { return; } @@ -2478,7 +2029,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) // animate the character // store off last frame's root position to be consistent with camera position - LLVector3 root_pos_last = mRoot.getWorldPosition(); + LLVector3 root_pos_last = mRoot->getWorldPosition(); BOOL detailed_update = updateCharacter(agent); static LLUICachedControl<bool> visualizers_in_calls("ShowVoiceVisualizersInCalls", false); @@ -2597,11 +2148,11 @@ void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled) if ( mIsSitting ) { LLVector3 headOffset = LLVector3( 0.0f, 0.0f, mHeadOffset.mV[2] ); - mVoiceVisualizer->setVoiceSourceWorldPosition( mRoot.getWorldPosition() + headOffset ); + mVoiceVisualizer->setVoiceSourceWorldPosition( mRoot->getWorldPosition() + headOffset ); } else { - LLVector3 tagPos = mRoot.getWorldPosition(); + LLVector3 tagPos = mRoot->getWorldPosition(); tagPos[VZ] -= mPelvisToFoot; tagPos[VZ] += ( mBodySize[VZ] + 0.125f ); mVoiceVisualizer->setVoiceSourceWorldPosition( tagPos ); @@ -3206,8 +2757,6 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) mNameText->setTextAlignment(LLHUDNameTag::ALIGN_TEXT_LEFT); mNameText->setFadeDistance(CHAT_NORMAL_RADIUS * 2.f, 5.f); - char line[MAX_STRING]; /* Flawfinder: ignore */ - line[0] = '\0'; std::deque<LLChat>::iterator chat_iter = mChats.begin(); mNameText->clearString(); @@ -3334,7 +2883,7 @@ void LLVOAvatar::invalidateNameTags() // Compute name tag position during idle update void LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last) { - LLQuaternion root_rot = mRoot.getWorldRotation(); + LLQuaternion root_rot = mRoot->getWorldRotation(); LLQuaternion inv_root_rot = ~root_rot; LLVector3 pixel_right_vec; LLVector3 pixel_up_vec; @@ -3353,7 +2902,7 @@ void LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last) local_camera_up.scaleVec(avatar_ellipsoid); local_camera_at.scaleVec(avatar_ellipsoid); - LLVector3 head_offset = (mHeadp->getLastWorldPosition() - mRoot.getLastWorldPosition()) * inv_root_rot; + LLVector3 head_offset = (mHeadp->getLastWorldPosition() - mRoot->getLastWorldPosition()) * inv_root_rot; if (dist_vec(head_offset, mTargetRootToHeadOffset) > NAMETAG_UPDATE_THRESHOLD) { @@ -3362,7 +2911,7 @@ void LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last) mCurRootToHeadOffset = lerp(mCurRootToHeadOffset, mTargetRootToHeadOffset, LLCriticalDamp::getInterpolant(0.2f)); - LLVector3 name_position = mRoot.getLastWorldPosition() + (mCurRootToHeadOffset * root_rot); + LLVector3 name_position = mRoot->getLastWorldPosition() + (mCurRootToHeadOffset * root_rot); name_position += (local_camera_up * root_rot) - (projected_vec(local_camera_at * root_rot, camera_to_av)); name_position += pixel_up_vec * NAMETAG_VERTICAL_SCREEN_OFFSET; @@ -3423,13 +2972,13 @@ void LLVOAvatar::idleUpdateBelowWater() void LLVOAvatar::slamPosition() { gAgent.setPositionAgent(getPositionAgent()); - mRoot.setWorldPosition(getPositionAgent()); // teleport + mRoot->setWorldPosition(getPositionAgent()); // teleport setChanged(TRANSLATED); if (mDrawable.notNull()) { gPipeline.updateMoveNormalAsync(mDrawable); } - mRoot.updateWorldMatrixChildren(); + mRoot->updateWorldMatrixChildren(); } bool LLVOAvatar::isVisuallyMuted() const @@ -3450,6 +2999,47 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) { // clear debug text mDebugText.clear(); + + if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage")) + { + S32 central_bake_version = -1; + if (getRegion()) + { + central_bake_version = getRegion()->getCentralBakeVersion(); + } + bool all_baked_downloaded = allBakedTexturesCompletelyDownloaded(); + bool all_local_downloaded = allLocalTexturesCompletelyDownloaded(); + std::string debug_line = llformat("%s%s - mLocal: %d, mEdit: %d, mUSB: %d, CBV: %d", + isSelf() ? (all_local_downloaded ? "L" : "l") : "-", + all_baked_downloaded ? "B" : "b", + mUseLocalAppearance, mIsEditingAppearance, + mUseServerBakes, central_bake_version); + std::string origin_string = bakedTextureOriginInfo(); + debug_line += " [" + origin_string + "]"; + S32 curr_cof_version = LLAppearanceMgr::instance().getCOFVersion(); + S32 last_request_cof_version = mLastUpdateRequestCOFVersion; + S32 last_received_cof_version = mLastUpdateReceivedCOFVersion; + if (isSelf()) + { + debug_line += llformat(" - cof: %d req: %d rcv:%d", + curr_cof_version, last_request_cof_version, last_received_cof_version); + if (gSavedSettings.getBOOL("DebugForceAppearanceRequestFailure")) + { + debug_line += " FORCING ERRS"; + } + } + else + { + debug_line += llformat(" - cof rcv:%d", last_received_cof_version); + } + addDebugText(debug_line); + } + if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) + { + if (!mBakedTextureDebugText.empty()) + addDebugText(mBakedTextureDebugText); + } + if (LLVOAvatar::sShowAnimationDebug) { for (LLMotionController::motion_list_t::iterator iter = mMotionController.getActiveMotions().begin(); @@ -3586,8 +3176,6 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) xyVel.mV[VZ] = 0.0f; speed = xyVel.length(); - BOOL throttle = TRUE; - if (!(mIsSitting && getParent())) { //-------------------------------------------------------------------- @@ -3598,11 +3186,10 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) if (mTimeLast == 0.0f) { mTimeLast = animation_time; - throttle = FALSE; // put the pelvis at slaved position/mRotation - mRoot.setWorldPosition( getPositionAgent() ); // first frame - mRoot.setWorldRotation( getRotation() ); + mRoot->setWorldPosition( getPositionAgent() ); // first frame + mRoot->setWorldRotation( getRotation() ); } //-------------------------------------------------------------------- @@ -3627,6 +3214,8 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) } root_pos = gAgent.getPosGlobalFromAgent(getRenderPosition()); + root_pos.mdV[VZ] += getVisualParamWeight(AVATAR_HOVER); + resolveHeightGlobal(root_pos, ground_under_pelvis, normal); F32 foot_to_ground = (F32) (root_pos.mdV[VZ] - mPelvisToFoot - ground_under_pelvis.mdV[VZ]); @@ -3645,10 +3234,10 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) LLVector3 newPosition = gAgent.getPosAgentFromGlobal(root_pos); - if (newPosition != mRoot.getXform()->getWorldPosition()) + if (newPosition != mRoot->getXform()->getWorldPosition()) { - mRoot.touch(); - mRoot.setWorldPosition( newPosition ); // regular update + mRoot->touch(); + mRoot->setWorldPosition( newPosition ); // regular update } @@ -3709,7 +3298,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) } - LLQuaternion root_rotation = mRoot.getWorldMatrix().quaternion(); + LLQuaternion root_rotation = mRoot->getWorldMatrix().quaternion(); F32 root_roll, root_pitch, root_yaw; root_rotation.getEulerAngles(&root_roll, &root_pitch, &root_yaw); @@ -3718,7 +3307,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) // and head turn. Once in motion, it must conform however. BOOL self_in_mouselook = isSelf() && gAgentCamera.cameraMouselook(); - LLVector3 pelvisDir( mRoot.getWorldMatrix().getFwdRow4().mV ); + LLVector3 pelvisDir( mRoot->getWorldMatrix().getFwdRow4().mV ); static LLCachedControl<F32> s_pelvis_rot_threshold_slow(gSavedSettings, "AvatarRotateThresholdSlow"); static LLCachedControl<F32> s_pelvis_rot_threshold_fast(gSavedSettings, "AvatarRotateThresholdFast"); @@ -3804,14 +3393,14 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) F32 u = llclamp((deltaTime / pelvis_lag_time), 0.0f, 1.0f); - mRoot.setWorldRotation( slerp(u, mRoot.getWorldRotation(), wQv) ); + mRoot->setWorldRotation( slerp(u, mRoot->getWorldRotation(), wQv) ); } } else if (mDrawable.notNull()) { - mRoot.setPosition(mDrawable->getPosition()); - mRoot.setRotation(mDrawable->getRotation()); + mRoot->setPosition(mDrawable->getPosition()); + mRoot->setRotation(mDrawable->getRotation()); } //------------------------------------------------------------------------- @@ -3907,7 +3496,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) } } - mRoot.updateWorldMatrixChildren(); + mRoot->updateWorldMatrixChildren(); if (!mDebugText.size() && mText.notNull()) { @@ -3931,7 +3520,7 @@ void LLVOAvatar::updateHeadOffset() { // since we only care about Z, just grab one of the eyes LLVector3 midEyePt = mEyeLeftp->getWorldPosition(); - midEyePt -= mDrawable.notNull() ? mDrawable->getWorldPosition() : mRoot.getWorldPosition(); + midEyePt -= mDrawable.notNull() ? mDrawable->getWorldPosition() : mRoot->getWorldPosition(); midEyePt.mV[VZ] = llmax(-mPelvisToFoot + LLViewerCamera::getInstance()->getNear(), midEyePt.mV[VZ]); if (mDrawable.notNull()) @@ -3969,8 +3558,8 @@ void LLVOAvatar::setPelvisOffset( bool hasOffset, const LLVector3& offsetAmount, void LLVOAvatar::postPelvisSetRecalc( void ) { computeBodySize(); - mRoot.touch(); - mRoot.updateWorldMatrixChildren(); + mRoot->touch(); + mRoot->updateWorldMatrixChildren(); dirtyMesh(); updateHeadOffset(); } @@ -4118,7 +3707,7 @@ void LLVOAvatar::updateVisibility() // private bool LLVOAvatar::shouldAlphaMask() { - const bool should_alpha_mask = mSupportsAlphaLayers && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked + const bool should_alpha_mask = !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked && !LLDrawPoolAvatar::sSkipTransparent; return should_alpha_mask; @@ -4157,19 +3746,44 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass) if (mNeedsSkin) { //generate animated mesh - mMeshLOD[MESH_ID_LOWER_BODY]->updateJointGeometry(); - mMeshLOD[MESH_ID_UPPER_BODY]->updateJointGeometry(); + LLViewerJoint* lower_mesh = getViewerJoint(MESH_ID_LOWER_BODY); + LLViewerJoint* upper_mesh = getViewerJoint(MESH_ID_UPPER_BODY); + LLViewerJoint* skirt_mesh = getViewerJoint(MESH_ID_SKIRT); + LLViewerJoint* eyelash_mesh = getViewerJoint(MESH_ID_EYELASH); + LLViewerJoint* head_mesh = getViewerJoint(MESH_ID_HEAD); + LLViewerJoint* hair_mesh = getViewerJoint(MESH_ID_HAIR); + + if(upper_mesh) + { + upper_mesh->updateJointGeometry(); + } + if (lower_mesh) + { + lower_mesh->updateJointGeometry(); + } if( isWearingWearableType( LLWearableType::WT_SKIRT ) ) { - mMeshLOD[MESH_ID_SKIRT]->updateJointGeometry(); + if(skirt_mesh) + { + skirt_mesh->updateJointGeometry(); + } } if (!isSelf() || gAgent.needsRenderHead() || LLPipeline::sShadowRender) { - mMeshLOD[MESH_ID_EYELASH]->updateJointGeometry(); - mMeshLOD[MESH_ID_HEAD]->updateJointGeometry(); - mMeshLOD[MESH_ID_HAIR]->updateJointGeometry(); + if(eyelash_mesh) + { + eyelash_mesh->updateJointGeometry(); + } + if(head_mesh) + { + head_mesh->updateJointGeometry(); + } + if(hair_mesh) + { + hair_mesh->updateJointGeometry(); + } } mNeedsSkin = FALSE; mLastSkinTime = gFrameTimeSeconds; @@ -4286,19 +3900,31 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass) { if (isTextureVisible(TEX_HEAD_BAKED) || mIsDummy) { - num_indices += mMeshLOD[MESH_ID_HEAD]->render(mAdjustedPixelArea, TRUE, mIsDummy); + LLViewerJoint* head_mesh = getViewerJoint(MESH_ID_HEAD); + if (head_mesh) + { + num_indices += head_mesh->render(mAdjustedPixelArea, TRUE, mIsDummy); + } first_pass = FALSE; } } if (isTextureVisible(TEX_UPPER_BAKED) || mIsDummy) { - num_indices += mMeshLOD[MESH_ID_UPPER_BODY]->render(mAdjustedPixelArea, first_pass, mIsDummy); + LLViewerJoint* upper_mesh = getViewerJoint(MESH_ID_UPPER_BODY); + if (upper_mesh) + { + num_indices += upper_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy); + } first_pass = FALSE; } if (isTextureVisible(TEX_LOWER_BAKED) || mIsDummy) { - num_indices += mMeshLOD[MESH_ID_LOWER_BODY]->render(mAdjustedPixelArea, first_pass, mIsDummy); + LLViewerJoint* lower_mesh = getViewerJoint(MESH_ID_LOWER_BODY); + if (lower_mesh) + { + num_indices += lower_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy); + } first_pass = FALSE; } } @@ -4331,20 +3957,15 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass) if( isWearingWearableType( LLWearableType::WT_SKIRT ) && (mIsDummy || isTextureVisible(TEX_SKIRT_BAKED)) ) { gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.25f); - num_indices += mMeshLOD[MESH_ID_SKIRT]->render(mAdjustedPixelArea, FALSE); + LLViewerJoint* skirt_mesh = getViewerJoint(MESH_ID_SKIRT); + if (skirt_mesh) + { + num_indices += skirt_mesh->render(mAdjustedPixelArea, FALSE); + } first_pass = FALSE; gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); } -#if LL_DARWIN - // blatant hack to avoid driver crash on rendering mMeshLODs for eyelashes and baked hair below - // NORSPEC-59 - if (gGLManager.mIsMobileGF) - { - return num_indices; - } -#endif - if (!isSelf() || gAgent.needsRenderHead() || LLPipeline::sShadowRender) { if (LLPipeline::sImpostorRender) @@ -4354,16 +3975,23 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass) if (isTextureVisible(TEX_HEAD_BAKED)) { - num_indices += mMeshLOD[MESH_ID_EYELASH]->render(mAdjustedPixelArea, first_pass, mIsDummy); + LLViewerJoint* eyelash_mesh = getViewerJoint(MESH_ID_EYELASH); + if (eyelash_mesh) + { + num_indices += eyelash_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy); + } first_pass = FALSE; } // Can't test for baked hair being defined, since that won't always be the case (not all viewers send baked hair) // TODO: 1.25 will be able to switch this logic back to calling isTextureVisible(); - - if ( getImage(TEX_HAIR_BAKED, 0) - && getImage(TEX_HAIR_BAKED, 0)->getID() != IMG_INVISIBLE || LLDrawPoolAlpha::sShowDebugAlpha) + if ( getImage(TEX_HAIR_BAKED, 0) && + getImage(TEX_HAIR_BAKED, 0)->getID() != IMG_INVISIBLE || LLDrawPoolAlpha::sShowDebugAlpha) { - num_indices += mMeshLOD[MESH_ID_HAIR]->render(mAdjustedPixelArea, first_pass, mIsDummy); + LLViewerJoint* hair_mesh = getViewerJoint(MESH_ID_HAIR); + if (hair_mesh) + { + num_indices += hair_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy); + } first_pass = FALSE; } if (LLPipeline::sImpostorRender) @@ -4407,8 +4035,16 @@ U32 LLVOAvatar::renderRigid() if (isTextureVisible(TEX_EYES_BAKED) || mIsDummy) { - num_indices += mMeshLOD[MESH_ID_EYEBALL_LEFT]->render(mAdjustedPixelArea, TRUE, mIsDummy); - num_indices += mMeshLOD[MESH_ID_EYEBALL_RIGHT]->render(mAdjustedPixelArea, TRUE, mIsDummy); + LLViewerJoint* eyeball_left = getViewerJoint(MESH_ID_EYEBALL_LEFT); + LLViewerJoint* eyeball_right = getViewerJoint(MESH_ID_EYEBALL_RIGHT); + if (eyeball_left) + { + num_indices += eyeball_left->render(mAdjustedPixelArea, TRUE, mIsDummy); + } + if(eyeball_right) + { + num_indices += eyeball_right->render(mAdjustedPixelArea, TRUE, mIsDummy); + } } if (should_alpha_mask && !LLGLSLShader::sNoFixedFunction) @@ -4455,11 +4091,224 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color, S32 diffuse_channel) return 6; } -//------------------------------------------------------------------------ -// LLVOAvatar::updateTextures() -//------------------------------------------------------------------------ +bool LLVOAvatar::allTexturesCompletelyDownloaded(std::set<LLUUID>& ids) const +{ + for (std::set<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it) + { + LLViewerFetchedTexture *imagep = gTextureList.findImage(*it); + if (imagep && imagep->getDiscardLevel()!=0) + { + return false; + } + } + return true; +} + +bool LLVOAvatar::allLocalTexturesCompletelyDownloaded() const +{ + std::set<LLUUID> local_ids; + collectLocalTextureUUIDs(local_ids); + return allTexturesCompletelyDownloaded(local_ids); +} + +bool LLVOAvatar::allBakedTexturesCompletelyDownloaded() const +{ + std::set<LLUUID> baked_ids; + collectBakedTextureUUIDs(baked_ids); + return allTexturesCompletelyDownloaded(baked_ids); +} + +void LLVOAvatar::bakedTextureOriginCounts(S32 &sb_count, // server-bake, has origin URL. + S32 &host_count, // host-based bake, has host. + S32 &both_count, // error - both host and URL set. + S32 &neither_count) // error - neither set. +{ + sb_count = host_count = both_count = neither_count = 0; + + std::set<LLUUID> baked_ids; + collectBakedTextureUUIDs(baked_ids); + for (std::set<LLUUID>::const_iterator it = baked_ids.begin(); it != baked_ids.end(); ++it) + { + LLViewerFetchedTexture *imagep = gTextureList.findImage(*it); + bool has_url = false, has_host = false; + if (!imagep->getUrl().empty()) + { + has_url = true; + } + if (imagep->getTargetHost().isOk()) + { + has_host = true; + } + if (has_url && !has_host) sb_count++; + else if (has_host && !has_url) host_count++; + else if (has_host && has_url) both_count++; + else if (!has_host && !has_url) neither_count++; + } +} + +std::string LLVOAvatar::bakedTextureOriginInfo() +{ + std::string result; + + std::set<LLUUID> baked_ids; + collectBakedTextureUUIDs(baked_ids); + for (U32 i = 0; i < mBakedTextureDatas.size(); i++) + { + ETextureIndex texture_index = mBakedTextureDatas[i].mTextureIndex; + LLViewerFetchedTexture *imagep = + LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture_index,0), TRUE); + if (!imagep || + imagep->getID() == IMG_DEFAULT || + imagep->getID() == IMG_DEFAULT_AVATAR) + + { + result += "-"; + } + else + { + bool has_url = false, has_host = false; + if (!imagep->getUrl().empty()) + { + has_url = true; + } + if (imagep->getTargetHost().isOk()) + { + has_host = true; + } + S32 discard = imagep->getDiscardLevel(); + if (has_url && !has_host) result += discard ? "u" : "U"; // server-bake texture with url + else if (has_host && !has_url) result += discard ? "h" : "H"; // old-style texture on sim + else if (has_host && has_url) result += discard ? "x" : "X"; // both origins? + else if (!has_host && !has_url) result += discard ? "n" : "N"; // no origin? + if (discard != 0) + { + result += llformat("(%d/%d)",discard,imagep->getDesiredDiscardLevel()); + } + } + + } + return result; +} + +S32 LLVOAvatar::totalTextureMemForUUIDS(std::set<LLUUID>& ids) +{ + S32 result = 0; + for (std::set<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it) + { + LLViewerFetchedTexture *imagep = gTextureList.findImage(*it); + if (imagep) + { + result += imagep->getTextureMemory(); + } + } + return result; +} + +void LLVOAvatar::collectLocalTextureUUIDs(std::set<LLUUID>& ids) const +{ + for (U32 texture_index = 0; texture_index < getNumTEs(); texture_index++) + { + LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex)texture_index); + U32 num_wearables = gAgentWearables.getWearableCount(wearable_type); + + LLViewerFetchedTexture *imagep = NULL; + for (U32 wearable_index = 0; wearable_index < num_wearables; wearable_index++) + { + imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture_index, wearable_index), TRUE); + if (imagep) + { + const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture((ETextureIndex)texture_index); + if (texture_dict->mIsLocalTexture) + { + ids.insert(imagep->getID()); + } + } + } + } + ids.erase(IMG_DEFAULT); + ids.erase(IMG_DEFAULT_AVATAR); + ids.erase(IMG_INVISIBLE); +} + +void LLVOAvatar::collectBakedTextureUUIDs(std::set<LLUUID>& ids) const +{ + for (U32 texture_index = 0; texture_index < getNumTEs(); texture_index++) + { + LLViewerFetchedTexture *imagep = NULL; + if (isIndexBakedTexture((ETextureIndex) texture_index)) + { + imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture_index,0), TRUE); + if (imagep) + { + ids.insert(imagep->getID()); + } + } + } + ids.erase(IMG_DEFAULT); + ids.erase(IMG_DEFAULT_AVATAR); + ids.erase(IMG_INVISIBLE); +} + +void LLVOAvatar::collectTextureUUIDs(std::set<LLUUID>& ids) +{ + collectLocalTextureUUIDs(ids); + collectBakedTextureUUIDs(ids); +} + +void LLVOAvatar::releaseOldTextures() +{ + S32 current_texture_mem = 0; + + // Any textures that we used to be using but are no longer using should no longer be flagged as "NO_DELETE" + std::set<LLUUID> baked_texture_ids; + collectBakedTextureUUIDs(baked_texture_ids); + S32 new_baked_mem = totalTextureMemForUUIDS(baked_texture_ids); + + std::set<LLUUID> local_texture_ids; + collectLocalTextureUUIDs(local_texture_ids); + //S32 new_local_mem = totalTextureMemForUUIDS(local_texture_ids); + + std::set<LLUUID> new_texture_ids; + new_texture_ids.insert(baked_texture_ids.begin(),baked_texture_ids.end()); + new_texture_ids.insert(local_texture_ids.begin(),local_texture_ids.end()); + S32 new_total_mem = totalTextureMemForUUIDS(new_texture_ids); + + //S32 old_total_mem = totalTextureMemForUUIDS(mTextureIDs); + //LL_DEBUGS("Avatar") << getFullname() << " old_total_mem: " << old_total_mem << " new_total_mem (L/B): " << new_total_mem << " (" << new_local_mem <<", " << new_baked_mem << ")" << llendl; + if (!isSelf() && new_total_mem > new_baked_mem) + { + llwarns << "extra local textures stored for non-self av" << llendl; + } + for (std::set<LLUUID>::iterator it = mTextureIDs.begin(); it != mTextureIDs.end(); ++it) + { + if (new_texture_ids.find(*it) == new_texture_ids.end()) + { + LLViewerFetchedTexture *imagep = gTextureList.findImage(*it); + if (imagep) + { + current_texture_mem += imagep->getTextureMemory(); + if (imagep->getTextureState() == LLGLTexture::NO_DELETE) + { + // This will allow the texture to be deleted if not in use. + imagep->forceActive(); + + // This resets the clock to texture being flagged + // as unused, preventing the texture from being + // deleted immediately. If other avatars or + // objects are using it, it can still be flagged + // no-delete by them. + imagep->forceUpdateBindStats(); + } + } + } + } + mTextureIDs = new_texture_ids; +} + void LLVOAvatar::updateTextures() { + releaseOldTextures(); + BOOL render_avatar = TRUE; if (mIsDummy) @@ -4502,7 +4351,7 @@ void LLVOAvatar::updateTextures() mHasGrey = FALSE; // debug for (U32 texture_index = 0; texture_index < getNumTEs(); texture_index++) { - LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)texture_index); + LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex)texture_index); U32 num_wearables = gAgentWearables.getWearableCount(wearable_type); const LLTextureEntry *te = getTE(texture_index); @@ -4525,11 +4374,11 @@ void LLVOAvatar::updateTextures() imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture_index, wearable_index), TRUE); if (imagep) { - const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture((ETextureIndex)texture_index); + const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture((ETextureIndex)texture_index); const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; if (texture_dict->mIsLocalTexture) { - addLocalTextureStats((ETextureIndex)texture_index, imagep, texel_area_ratio, render_avatar, layer_baked[baked_index]); + addLocalTextureStats((ETextureIndex)texture_index, imagep, texel_area_ratio, render_avatar, mBakedTextureDatas[baked_index].mIsUsed); } } } @@ -4541,6 +4390,7 @@ void LLVOAvatar::updateTextures() if (isIndexBakedTexture((ETextureIndex)texture_index) && imagep->getID() != IMG_DEFAULT_AVATAR && imagep->getID() != IMG_INVISIBLE + && !isUsingServerBakes() && !imagep->getTargetHost().isOk()) { LL_WARNS_ONCE("Texture") << "LLVOAvatar::updateTextures No host for texture " @@ -4561,7 +4411,7 @@ void LLVOAvatar::updateTextures() void LLVOAvatar::addLocalTextureStats( ETextureIndex idx, LLViewerFetchedTexture* imagep, - F32 texel_area_ratio, BOOL render_avatar, BOOL covered_by_baked, U32 index ) + F32 texel_area_ratio, BOOL render_avatar, BOOL covered_by_baked) { // No local texture stats for non-self avatars return; @@ -4635,7 +4485,6 @@ void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel //the texture pipeline will stop fetching this texture. imagep->resetTextureStats(); - imagep->setCanUseHTTP(false) ; //turn off http fetching for baked textures. imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); imagep->resetMaxVirtualSizeResetCounter() ; @@ -4644,7 +4493,7 @@ void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel imagep->addTextureStats(pixel_area / texel_area_ratio); imagep->setBoostLevel(boost_level); - if(boost_level != LLViewerTexture::BOOST_AVATAR_BAKED_SELF) + if(boost_level != LLGLTexture::BOOST_AVATAR_BAKED_SELF) { imagep->setAdditionalDecodePriority(ADDITIONAL_PRI) ; } @@ -4677,6 +4526,30 @@ void LLVOAvatar::setTexEntry(const U8 index, const LLTextureEntry &te) setTE(index, te); } +const std::string LLVOAvatar::getImageURL(const U8 te, const LLUUID &uuid) +{ + llassert(isIndexBakedTexture(ETextureIndex(te))); + std::string url = ""; + if (isUsingServerBakes()) + { + const std::string& appearance_service_url = LLAppearanceMgr::instance().getAppearanceServiceURL(); + if (appearance_service_url.empty()) + { + // Probably a server-side issue if we get here: + llwarns << "AgentAppearanceServiceURL not set - Baked texture requests will fail" << llendl; + return url; + } + + const LLAvatarAppearanceDictionary::TextureEntry* texture_entry = LLAvatarAppearanceDictionary::getInstance()->getTexture((ETextureIndex)te); + if (texture_entry != NULL) + { + url = appearance_service_url + "texture/" + getID().asString() + "/" + texture_entry->mDefaultImageName + "/" + uuid.asString(); + //llinfos << "baked texture url: " << url << llendl; + } + } + return url; +} + //----------------------------------------------------------------------------- // resolveHeight() //----------------------------------------------------------------------------- @@ -5018,48 +4891,6 @@ void LLVOAvatar::stopMotionFromSource(const LLUUID& source_id) } //----------------------------------------------------------------------------- -// getVolumePos() -//----------------------------------------------------------------------------- -LLVector3 LLVOAvatar::getVolumePos(S32 joint_index, LLVector3& volume_offset) -{ - if (joint_index > mNumCollisionVolumes) - { - return LLVector3::zero; - } - - return mCollisionVolumes[joint_index].getVolumePos(volume_offset); -} - -//----------------------------------------------------------------------------- -// findCollisionVolume() -//----------------------------------------------------------------------------- -LLJoint* LLVOAvatar::findCollisionVolume(U32 volume_id) -{ - if ((S32)volume_id > mNumCollisionVolumes) - { - return NULL; - } - - return &mCollisionVolumes[volume_id]; -} - -//----------------------------------------------------------------------------- -// findCollisionVolume() -//----------------------------------------------------------------------------- -S32 LLVOAvatar::getCollisionVolumeID(std::string &name) -{ - for (S32 i = 0; i < mNumCollisionVolumes; i++) - { - if (mCollisionVolumes[i].getName() == name) - { - return i; - } - } - - return -1; -} - -//----------------------------------------------------------------------------- // addDebugText() //----------------------------------------------------------------------------- void LLVOAvatar::addDebugText(const std::string& text) @@ -5088,7 +4919,7 @@ LLJoint *LLVOAvatar::getJoint( const std::string &name ) if (iter == mJointMap.end() || iter->second == NULL) { //search for joint and cache found joint in lookup table - jointp = mRoot.findJoint(name); + jointp = mRoot->findJoint(name); mJointMap[name] = jointp; } else @@ -5104,10 +4935,12 @@ LLJoint *LLVOAvatar::getJoint( const std::string &name ) //----------------------------------------------------------------------------- void LLVOAvatar::resetJointPositions( void ) { - for(S32 i = 0; i < (S32)mNumJoints; ++i) + avatar_joint_list_t::iterator iter = mSkeleton.begin(); + avatar_joint_list_t::iterator end = mSkeleton.end(); + for (; iter != end; ++iter) { - mSkeleton[i].restoreOldXform(); - mSkeleton[i].setId( LLUUID::null ); + (*iter)->restoreOldXform(); + (*iter)->setId( LLUUID::null ); } mHasPelvisOffset = false; mPelvisFixup = mLastPelvisFixup; @@ -5117,7 +4950,7 @@ void LLVOAvatar::resetJointPositions( void ) //----------------------------------------------------------------------------- void LLVOAvatar::resetSpecificJointPosition( const std::string& name ) { - LLJoint* pJoint = mRoot.findJoint( name ); + LLJoint* pJoint = mRoot->findJoint( name ); if ( pJoint && pJoint->doesJointNeedToBeReset() ) { @@ -5139,16 +4972,17 @@ void LLVOAvatar::resetSpecificJointPosition( const std::string& name ) //----------------------------------------------------------------------------- void LLVOAvatar::resetJointPositionsToDefault( void ) { - //Subsequent joints are relative to pelvis - for( S32 i = 0; i < (S32)mNumJoints; ++i ) + avatar_joint_list_t::iterator iter = mSkeleton.begin(); + avatar_joint_list_t::iterator end = mSkeleton.end(); + for (; iter != end; ++iter) { - LLJoint* pJoint = (LLJoint*)&mSkeleton[i]; + LLJoint* pJoint = (*iter); if ( pJoint->doesJointNeedToBeReset() ) { - pJoint->setId( LLUUID::null ); //restore joints to default positions, however skip over the pelvis + // *TODO: How does this pointer check skip over pelvis? if ( pJoint ) { pJoint->restoreOldXform(); @@ -5247,23 +5081,6 @@ F32 LLVOAvatar::getPixelArea() const } -//----------------------------------------------------------------------------- -// LLVOAvatar::getHeadMesh() -//----------------------------------------------------------------------------- -LLPolyMesh* LLVOAvatar::getHeadMesh() -{ - return mMeshLOD[MESH_ID_HEAD]->mMeshParts[0]->getMesh(); -} - - -//----------------------------------------------------------------------------- -// LLVOAvatar::getUpperBodyMesh() -//----------------------------------------------------------------------------- -LLPolyMesh* LLVOAvatar::getUpperBodyMesh() -{ - return mMeshLOD[MESH_ID_UPPER_BODY]->mMeshParts[0]->getMesh(); -} - //----------------------------------------------------------------------------- // LLVOAvatar::getPosGlobalFromAgent() @@ -5281,61 +5098,6 @@ LLVector3 LLVOAvatar::getPosAgentFromGlobal(const LLVector3d &position) return gAgent.getPosAgentFromGlobal(position); } -//----------------------------------------------------------------------------- -// allocateCharacterJoints() -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::allocateCharacterJoints( U32 num ) -{ - deleteAndClearArray(mSkeleton); - mNumJoints = 0; - - mSkeleton = new LLViewerJoint[num]; - - for(S32 joint_num = 0; joint_num < (S32)num; joint_num++) - { - mSkeleton[joint_num].setJointNum(joint_num); - } - - if (!mSkeleton) - { - return FALSE; - } - - mNumJoints = num; - return TRUE; -} - -//----------------------------------------------------------------------------- -// allocateCollisionVolumes() -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::allocateCollisionVolumes( U32 num ) -{ - deleteAndClearArray(mCollisionVolumes); - mNumCollisionVolumes = 0; - - mCollisionVolumes = new LLViewerJointCollisionVolume[num]; - if (!mCollisionVolumes) - { - return FALSE; - } - - mNumCollisionVolumes = num; - return TRUE; -} - - -//----------------------------------------------------------------------------- -// getCharacterJoint() -//----------------------------------------------------------------------------- -LLJoint *LLVOAvatar::getCharacterJoint( U32 num ) -{ - if ((S32)num >= mNumJoints - || (S32)num < 0) - { - return NULL; - } - return (LLJoint*)&mSkeleton[num]; -} //----------------------------------------------------------------------------- // requestStopMotion() @@ -5347,215 +5109,24 @@ void LLVOAvatar::requestStopMotion( LLMotion* motion ) } //----------------------------------------------------------------------------- -// loadAvatar() -//----------------------------------------------------------------------------- -static LLFastTimer::DeclareTimer FTM_LOAD_AVATAR("Load Avatar"); - -BOOL LLVOAvatar::loadAvatar() -{ -// LLFastTimer t(FTM_LOAD_AVATAR); - - // avatar_skeleton.xml - if( !buildSkeleton(sAvatarSkeletonInfo) ) - { - llwarns << "avatar file: buildSkeleton() failed" << llendl; - return FALSE; - } - - // avatar_lad.xml : <skeleton> - if( !loadSkeletonNode() ) - { - llwarns << "avatar file: loadNodeSkeleton() failed" << llendl; - return FALSE; - } - - // avatar_lad.xml : <mesh> - if( !loadMeshNodes() ) - { - llwarns << "avatar file: loadNodeMesh() failed" << llendl; - return FALSE; - } - - // avatar_lad.xml : <global_color> - if( sAvatarXmlInfo->mTexSkinColorInfo ) - { - mTexSkinColor = new LLTexGlobalColor( this ); - if( !mTexSkinColor->setInfo( sAvatarXmlInfo->mTexSkinColorInfo ) ) - { - llwarns << "avatar file: mTexSkinColor->setInfo() failed" << llendl; - return FALSE; - } - } - else - { - llwarns << "<global_color> name=\"skin_color\" not found" << llendl; - return FALSE; - } - if( sAvatarXmlInfo->mTexHairColorInfo ) - { - mTexHairColor = new LLTexGlobalColor( this ); - if( !mTexHairColor->setInfo( sAvatarXmlInfo->mTexHairColorInfo ) ) - { - llwarns << "avatar file: mTexHairColor->setInfo() failed" << llendl; - return FALSE; - } - } - else - { - llwarns << "<global_color> name=\"hair_color\" not found" << llendl; - return FALSE; - } - if( sAvatarXmlInfo->mTexEyeColorInfo ) - { - mTexEyeColor = new LLTexGlobalColor( this ); - if( !mTexEyeColor->setInfo( sAvatarXmlInfo->mTexEyeColorInfo ) ) - { - llwarns << "avatar file: mTexEyeColor->setInfo() failed" << llendl; - return FALSE; - } - } - else - { - llwarns << "<global_color> name=\"eye_color\" not found" << llendl; - return FALSE; - } - - // avatar_lad.xml : <layer_set> - if (sAvatarXmlInfo->mLayerInfoList.empty()) - { - llwarns << "avatar file: missing <layer_set> node" << llendl; - return FALSE; - } - - if (sAvatarXmlInfo->mMorphMaskInfoList.empty()) - { - llwarns << "avatar file: missing <morph_masks> node" << llendl; - return FALSE; - } - - // avatar_lad.xml : <morph_masks> - for (LLVOAvatarXmlInfo::morph_info_list_t::iterator iter = sAvatarXmlInfo->mMorphMaskInfoList.begin(); - iter != sAvatarXmlInfo->mMorphMaskInfoList.end(); - ++iter) - { - LLVOAvatarXmlInfo::LLVOAvatarMorphInfo *info = *iter; - - EBakedTextureIndex baked = LLVOAvatarDictionary::findBakedByRegionName(info->mRegion); - if (baked != BAKED_NUM_INDICES) - { - LLPolyMorphTarget *morph_param; - const std::string *name = &info->mName; - morph_param = (LLPolyMorphTarget *)(getVisualParam(name->c_str())); - if (morph_param) - { - BOOL invert = info->mInvert; - addMaskedMorph(baked, morph_param, invert, info->mLayer); - } - } - - } - - loadLayersets(); - - // avatar_lad.xml : <driver_parameters> - for (LLVOAvatarXmlInfo::driver_info_list_t::iterator iter = sAvatarXmlInfo->mDriverInfoList.begin(); - iter != sAvatarXmlInfo->mDriverInfoList.end(); - ++iter) - { - LLDriverParamInfo *info = *iter; - LLDriverParam* driver_param = new LLDriverParam( this ); - if (driver_param->setInfo(info)) - { - addVisualParam( driver_param ); - LLVisualParam*(LLVOAvatar::*avatar_function)(S32)const = &LLVOAvatar::getVisualParam; - if( !driver_param->linkDrivenParams(boost::bind(avatar_function,(LLVOAvatar*)this,_1 ), false)) - { - llwarns << "could not link driven params for avatar " << this->getFullname() << " id: " << driver_param->getID() << llendl; - continue; - } - } - else - { - delete driver_param; - llwarns << "avatar file: driver_param->parseData() failed" << llendl; - return FALSE; - } - } - - - return TRUE; -} - -//----------------------------------------------------------------------------- // loadSkeletonNode(): loads <skeleton> node from XML tree //----------------------------------------------------------------------------- +//virtual BOOL LLVOAvatar::loadSkeletonNode () { - mRoot.addChild( &mSkeleton[0] ); - - for (std::vector<LLViewerJoint *>::iterator iter = mMeshLOD.begin(); - iter != mMeshLOD.end(); - ++iter) + if (!LLAvatarAppearance::loadSkeletonNode()) { - LLViewerJoint *joint = (LLViewerJoint *) *iter; - joint->mUpdateXform = FALSE; - joint->setMeshesToChildren(); - } - - mRoot.addChild(mMeshLOD[MESH_ID_HEAD]); - mRoot.addChild(mMeshLOD[MESH_ID_EYELASH]); - mRoot.addChild(mMeshLOD[MESH_ID_UPPER_BODY]); - mRoot.addChild(mMeshLOD[MESH_ID_LOWER_BODY]); - mRoot.addChild(mMeshLOD[MESH_ID_SKIRT]); - mRoot.addChild(mMeshLOD[MESH_ID_HEAD]); - - LLViewerJoint *skull = (LLViewerJoint*)mRoot.findJoint("mSkull"); - if (skull) - { - skull->addChild(mMeshLOD[MESH_ID_HAIR] ); - } - - LLViewerJoint *eyeL = (LLViewerJoint*)mRoot.findJoint("mEyeLeft"); - if (eyeL) - { - eyeL->addChild( mMeshLOD[MESH_ID_EYEBALL_LEFT] ); - } - - LLViewerJoint *eyeR = (LLViewerJoint*)mRoot.findJoint("mEyeRight"); - if (eyeR) - { - eyeR->addChild( mMeshLOD[MESH_ID_EYEBALL_RIGHT] ); - } - - // SKELETAL DISTORTIONS - { - LLVOAvatarXmlInfo::skeletal_distortion_info_list_t::iterator iter; - for (iter = sAvatarXmlInfo->mSkeletalDistortionInfoList.begin(); - iter != sAvatarXmlInfo->mSkeletalDistortionInfoList.end(); - ++iter) - { - LLPolySkeletalDistortionInfo *info = *iter; - LLPolySkeletalDistortion *param = new LLPolySkeletalDistortion(this); - if (!param->setInfo(info)) - { - delete param; return FALSE; } - else - { - addVisualParam(param); - } - } - } // ATTACHMENTS { - LLVOAvatarXmlInfo::attachment_info_list_t::iterator iter; + LLAvatarXmlInfo::attachment_info_list_t::iterator iter; for (iter = sAvatarXmlInfo->mAttachmentInfoList.begin(); iter != sAvatarXmlInfo->mAttachmentInfoList.end(); ++iter) { - LLVOAvatarXmlInfo::LLVOAvatarAttachmentInfo *info = *iter; + LLAvatarXmlInfo::LLAvatarAttachmentInfo *info = *iter; if (!isSelf() && info->mJointName == "mScreen") { //don't process screen joint for other avatars continue; @@ -5628,144 +5199,6 @@ BOOL LLVOAvatar::loadSkeletonNode () } //----------------------------------------------------------------------------- -// loadMeshNodes(): loads <mesh> nodes from XML tree -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::loadMeshNodes() -{ - for (LLVOAvatarXmlInfo::mesh_info_list_t::const_iterator meshinfo_iter = sAvatarXmlInfo->mMeshInfoList.begin(); - meshinfo_iter != sAvatarXmlInfo->mMeshInfoList.end(); - ++meshinfo_iter) - { - const LLVOAvatarXmlInfo::LLVOAvatarMeshInfo *info = *meshinfo_iter; - const std::string &type = info->mType; - S32 lod = info->mLOD; - - LLViewerJointMesh* mesh = NULL; - U8 mesh_id = 0; - BOOL found_mesh_id = FALSE; - - /* if (type == "hairMesh") - switch(lod) - case 0: - mesh = &mHairMesh0; */ - for (LLVOAvatarDictionary::Meshes::const_iterator mesh_iter = LLVOAvatarDictionary::getInstance()->getMeshes().begin(); - mesh_iter != LLVOAvatarDictionary::getInstance()->getMeshes().end(); - ++mesh_iter) - { - const EMeshIndex mesh_index = mesh_iter->first; - const LLVOAvatarDictionary::MeshEntry *mesh_dict = mesh_iter->second; - if (type.compare(mesh_dict->mName) == 0) - { - mesh_id = mesh_index; - found_mesh_id = TRUE; - break; - } - } - - if (found_mesh_id) - { - if (lod < (S32)mMeshLOD[mesh_id]->mMeshParts.size()) - { - mesh = mMeshLOD[mesh_id]->mMeshParts[lod]; - } - else - { - llwarns << "Avatar file: <mesh> has invalid lod setting " << lod << llendl; - return FALSE; - } - } - else - { - llwarns << "Ignoring unrecognized mesh type: " << type << llendl; - return FALSE; - } - - // llinfos << "Parsing mesh data for " << type << "..." << llendl; - - // If this isn't set to white (1.0), avatars will *ALWAYS* be darker than their surroundings. - // Do not touch!!! - mesh->setColor( 1.0f, 1.0f, 1.0f, 1.0f ); - - LLPolyMesh *poly_mesh = NULL; - - if (!info->mReferenceMeshName.empty()) - { - polymesh_map_t::const_iterator polymesh_iter = mMeshes.find(info->mReferenceMeshName); - if (polymesh_iter != mMeshes.end()) - { - poly_mesh = LLPolyMesh::getMesh(info->mMeshFileName, polymesh_iter->second); - poly_mesh->setAvatar(this); - } - else - { - // This should never happen - LL_WARNS("Avatar") << "Could not find avatar mesh: " << info->mReferenceMeshName << LL_ENDL; - } - } - else - { - poly_mesh = LLPolyMesh::getMesh(info->mMeshFileName); - poly_mesh->setAvatar(this); - } - - if( !poly_mesh ) - { - llwarns << "Failed to load mesh of type " << type << llendl; - return FALSE; - } - - // Multimap insert - mMeshes.insert(std::make_pair(info->mMeshFileName, poly_mesh)); - - mesh->setMesh( poly_mesh ); - mesh->setLOD( info->mMinPixelArea ); - - for (LLVOAvatarXmlInfo::LLVOAvatarMeshInfo::morph_info_list_t::const_iterator xmlinfo_iter = info->mPolyMorphTargetInfoList.begin(); - xmlinfo_iter != info->mPolyMorphTargetInfoList.end(); - ++xmlinfo_iter) - { - const LLVOAvatarXmlInfo::LLVOAvatarMeshInfo::morph_info_pair_t *info_pair = &(*xmlinfo_iter); - LLPolyMorphTarget *param = new LLPolyMorphTarget(mesh->getMesh()); - if (!param->setInfo(info_pair->first)) - { - delete param; - return FALSE; - } - else - { - if (info_pair->second) - { - addSharedVisualParam(param); - } - else - { - addVisualParam(param); - } - } - } - } - - return TRUE; -} - -//----------------------------------------------------------------------------- -// loadLayerSets() -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::loadLayersets() -{ - BOOL success = TRUE; - for (LLVOAvatarXmlInfo::layer_info_list_t::const_iterator layerset_iter = sAvatarXmlInfo->mLayerInfoList.begin(); - layerset_iter != sAvatarXmlInfo->mLayerInfoList.end(); - ++layerset_iter) - { - // Construct a layerset for each one specified in avatar_lad.xml and initialize it as such. - LLTexLayerSetInfo *layerset_info = *layerset_iter; - layerset_info->createVisualParams(this); - } - return success; -} - -//----------------------------------------------------------------------------- // updateVisualParams() //----------------------------------------------------------------------------- void LLVOAvatar::updateVisualParams() @@ -5778,7 +5211,7 @@ void LLVOAvatar::updateVisualParams() { computeBodySize(); mLastSkeletonSerialNum = mSkeletonSerialNum; - mRoot.updateWorldMatrixChildren(); + mRoot->updateWorldMatrixChildren(); } dirtyMesh(); @@ -5865,7 +5298,12 @@ BOOL LLVOAvatar::updateJointLODs() } // now select meshes to render based on adjusted pixel area - BOOL res = mRoot.updateLOD(mAdjustedPixelArea, TRUE); + LLViewerJoint* root = dynamic_cast<LLViewerJoint*>(mRoot); + BOOL res = FALSE; + if (root) + { + res = root->updateLOD(mAdjustedPixelArea, TRUE); + } if (res) { sNumLODChangesThisFrame++; @@ -5954,6 +5392,15 @@ void LLVOAvatar::dirtyMesh(S32 priority) { mDirtyMesh = llmax(mDirtyMesh, priority); } + +//----------------------------------------------------------------------------- +// getViewerJoint() +//----------------------------------------------------------------------------- +LLViewerJoint* LLVOAvatar::getViewerJoint(S32 idx) +{ + return dynamic_cast<LLViewerJoint*>(mMeshLOD[idx]); +} + //----------------------------------------------------------------------------- // hideSkirt() //----------------------------------------------------------------------------- @@ -6260,9 +5707,9 @@ void LLVOAvatar::sitOnObject(LLViewerObject *sit_object) // Notice that removing sitDown() from here causes avatars sitting on // objects to be not rendered for new arrivals. See EXT-6835 and EXT-1655. sitDown(TRUE); - mRoot.getXform()->setParent(&sit_object->mDrawable->mXform); // LLVOAvatar::sitOnObject - mRoot.setPosition(getPosition()); - mRoot.updateWorldMatrixChildren(); + mRoot->getXform()->setParent(&sit_object->mDrawable->mXform); // LLVOAvatar::sitOnObject + mRoot->setPosition(getPosition()); + mRoot->updateWorldMatrixChildren(); stopMotion(ANIM_AGENT_BODY_NOISE); @@ -6308,10 +5755,10 @@ void LLVOAvatar::getOffObject() sitDown(FALSE); - mRoot.getXform()->setParent(NULL); // LLVOAvatar::getOffObject - mRoot.setPosition(cur_position_world); - mRoot.setRotation(cur_rotation_world); - mRoot.getXform()->update(); + mRoot->getXform()->setParent(NULL); // LLVOAvatar::getOffObject + mRoot->setPosition(cur_position_world); + mRoot->setRotation(cur_rotation_world); + mRoot->getXform()->update(); startMotion(ANIM_AGENT_BODY_NOISE); @@ -6359,26 +5806,53 @@ S32 LLVOAvatar::getAttachmentCount() return count; } -LLColor4 LLVOAvatar::getGlobalColor( const std::string& color_name ) const +BOOL LLVOAvatar::isWearingWearableType(LLWearableType::EType type) const { - if (color_name=="skin_color" && mTexSkinColor) + if (mIsDummy) return TRUE; + + if (isSelf()) { - return mTexSkinColor->getColor(); + return LLAvatarAppearance::isWearingWearableType(type); } - else if(color_name=="hair_color" && mTexHairColor) + + switch(type) { - return mTexHairColor->getColor(); + case LLWearableType::WT_SHAPE: + case LLWearableType::WT_SKIN: + case LLWearableType::WT_HAIR: + case LLWearableType::WT_EYES: + return TRUE; // everyone has all bodyparts + default: + break; // Do nothing } - if(color_name=="eye_color" && mTexEyeColor) + + /* switch(type) + case LLWearableType::WT_SHIRT: + indicator_te = TEX_UPPER_SHIRT; */ + for (LLAvatarAppearanceDictionary::Textures::const_iterator tex_iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); + tex_iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); + ++tex_iter) { - return mTexEyeColor->getColor(); - } - else + const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = tex_iter->second; + if (texture_dict->mWearableType == type) { - return LLColor4( 0.f, 1.f, 1.f, 1.f ); // good debugging color + // Thus, you must check to see if the corresponding baked texture is defined. + // NOTE: this is a poor substitute if you actually want to know about individual pieces of clothing + // this works for detecting a skirt (most important), but is ineffective at any piece of clothing that + // gets baked into a texture that always exists (upper or lower). + if (texture_dict->mIsUsedByBakedTexture) + { + const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; + return isTextureDefined(LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(baked_index)->mTextureIndex); } + return FALSE; + } + } + return FALSE; } + + // virtual void LLVOAvatar::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_result ) { @@ -6388,6 +5862,7 @@ void LLVOAvatar::invalidateAll() { } +// virtual void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake ) { if (global_color == mTexSkinColor) @@ -6406,9 +5881,15 @@ void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL if (!isTextureDefined(mBakedTextureDatas[BAKED_HAIR].mTextureIndex)) { LLColor4 color = mTexHairColor->getColor(); - for (U32 i = 0; i < mBakedTextureDatas[BAKED_HAIR].mMeshes.size(); i++) + avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[BAKED_HAIR].mJointMeshes.begin(); + avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[BAKED_HAIR].mJointMeshes.end(); + for (; iter != end; ++iter) + { + LLAvatarJointMesh* mesh = (*iter); + if (mesh) { - mBakedTextureDatas[BAKED_HAIR].mMeshes[i]->setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] ); + mesh->setColor( color ); + } } } } @@ -6451,45 +5932,173 @@ BOOL LLVOAvatar::getIsCloud() const void LLVOAvatar::updateRezzedStatusTimers() { - // State machine for rezzed status. Statuses are 0 = cloud, 1 = gray, 2 = textured. - // Purpose is to collect time data for each period of cloud or cloud+gray. + // State machine for rezzed status. Statuses are -1 on startup, 0 + // = cloud, 1 = gray, 2 = textured, 3 = textured_and_downloaded. + // Purpose is to collect time data for each it takes avatar to reach + // various loading landmarks: gray, textured (partial), textured fully. + S32 rez_status = getRezzedStatus(); if (rez_status != mLastRezzedStatus) { LL_DEBUGS("Avatar") << avString() << "rez state change: " << mLastRezzedStatus << " -> " << rez_status << LL_ENDL; - bool is_cloud_or_gray = (rez_status==0 || rez_status==1); - bool was_cloud_or_gray = (mLastRezzedStatus==0 || mLastRezzedStatus==1); - bool is_cloud = (rez_status==0); - bool was_cloud = (mLastRezzedStatus==0); - // Non-cloud to cloud - if (is_cloud && !was_cloud) + if (mLastRezzedStatus == -1 && rez_status != -1) { - // start cloud timer. - getPhases().startPhase("cloud"); + // First time initialization, start all timers. + for (S32 i = 1; i < 4; i++) + { + startPhase("load_" + LLVOAvatar::rezStatusToString(i)); + startPhase("first_load_" + LLVOAvatar::rezStatusToString(i)); + } } - else if (was_cloud && !is_cloud) + if (rez_status < mLastRezzedStatus) + { + // load level has decreased. start phase timers for higher load levels. + for (S32 i = rez_status+1; i <= mLastRezzedStatus; i++) { - // stop cloud timer, which will capture stats. - getPhases().stopPhase("cloud"); + startPhase("load_" + LLVOAvatar::rezStatusToString(i)); } - - // Non-cloud-or-gray to cloud-or-gray - if (is_cloud_or_gray && !was_cloud_or_gray) + } + else if (rez_status > mLastRezzedStatus) { - // start cloud-or-gray timer. - getPhases().startPhase("cloud-or-gray"); + // load level has increased. stop phase timers for lower and equal load levels. + for (S32 i = llmax(mLastRezzedStatus+1,1); i <= rez_status; i++) + { + stopPhase("load_" + LLVOAvatar::rezStatusToString(i)); + stopPhase("first_load_" + LLVOAvatar::rezStatusToString(i), false); } - else if (was_cloud_or_gray && !is_cloud_or_gray) + if (rez_status == 3) { - // stop cloud-or-gray timer, which will capture stats. - getPhases().stopPhase("cloud-or-gray"); + // "fully loaded", mark any pending appearance change complete. + selfStopPhase("update_appearance_from_cof"); + selfStopPhase("wear_inventory_category", false); + selfStopPhase("process_initial_wearables_update", false); + } } mLastRezzedStatus = rez_status; } } +void LLVOAvatar::clearPhases() +{ + getPhases().clearPhases(); +} + +void LLVOAvatar::startPhase(const std::string& phase_name) +{ + F32 elapsed; + bool completed; + if (getPhases().getPhaseValues(phase_name, elapsed, completed)) + { + if (!completed) + { + LL_DEBUGS("Avatar") << avString() << "no-op, start when started already for " << phase_name << llendl; + return; + } + } + LL_DEBUGS("Avatar") << "started phase " << phase_name << llendl; + getPhases().startPhase(phase_name); +} + +void LLVOAvatar::stopPhase(const std::string& phase_name, bool err_check) + { + F32 elapsed; + bool completed; + if (getPhases().getPhaseValues(phase_name, elapsed, completed)) + { + if (!completed) + { + getPhases().stopPhase(phase_name); + completed = true; + logMetricsTimerRecord(phase_name, elapsed, completed); + LL_DEBUGS("Avatar") << avString() << "stopped phase " << phase_name << " elapsed " << elapsed << llendl; + } + else + { + if (err_check) + { + LL_DEBUGS("Avatar") << "no-op, stop when stopped already for " << phase_name << llendl; + } + } + } + else + { + if (err_check) + { + LL_DEBUGS("Avatar") << "no-op, stop when not started for " << phase_name << llendl; + } + } +} + +void LLVOAvatar::logPendingPhases() +{ + if (!isAgentAvatarValid()) + { + return; + } + + for (LLViewerStats::phase_map_t::iterator it = getPhases().begin(); + it != getPhases().end(); + ++it) + { + const std::string& phase_name = it->first; + F32 elapsed; + bool completed; + if (getPhases().getPhaseValues(phase_name, elapsed, completed)) + { + if (!completed) + { + logMetricsTimerRecord(phase_name, elapsed, completed); + } + } + } + } + +//static +void LLVOAvatar::logPendingPhasesAllAvatars() + { + for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); + iter != LLCharacter::sInstances.end(); ++iter) + { + LLVOAvatar* inst = (LLVOAvatar*) *iter; + if( inst->isDead() ) + { + continue; + } + inst->logPendingPhases(); + } + } + +void LLVOAvatar::logMetricsTimerRecord(const std::string& phase_name, F32 elapsed, bool completed) +{ + if (!isAgentAvatarValid()) + { + return; + } + + LLSD record; + record["timer_name"] = phase_name; + record["avatar_id"] = getID(); + record["elapsed"] = elapsed; + record["completed"] = completed; + U32 grid_x(0), grid_y(0); + if (getRegion()) + { + record["central_bake_version"] = LLSD::Integer(getRegion()->getCentralBakeVersion()); + grid_from_region_handle(getRegion()->getHandle(), &grid_x, &grid_y); + } + record["grid_x"] = LLSD::Integer(grid_x); + record["grid_y"] = LLSD::Integer(grid_y); + record["is_using_server_bakes"] = ((bool) isUsingServerBakes()); + record["is_self"] = isSelf(); + + if (isAgentAvatarValid()) + { + gAgentAvatarp->addMetricsTimerRecord(record); + } +} + // call periodically to keep isFullyLoaded up to date. // returns true if the value has changed. BOOL LLVOAvatar::updateIsFullyLoaded() @@ -6583,24 +6192,49 @@ LLMotion* LLVOAvatar::findMotion(const LLUUID& id) const return mMotionController.findMotion(id); } +// This is a semi-deprecated debugging tool - meshes will not show as +// colorized if using deferred rendering. +void LLVOAvatar::debugColorizeSubMeshes(U32 i, const LLColor4& color) +{ + if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) + { + avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); + avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[i].mJointMeshes.end(); + for (; iter != end; ++iter) + { + LLAvatarJointMesh* mesh = (*iter); + if (mesh) + { + { + mesh->setColor(color); + } + } + } + } +} + //----------------------------------------------------------------------------- // updateMeshTextures() // Uses the current TE values to set the meshes' and layersets' textures. //----------------------------------------------------------------------------- +// virtual void LLVOAvatar::updateMeshTextures() { - // llinfos << "updateMeshTextures" << llendl; + static S32 update_counter = 0; + mBakedTextureDebugText.clear(); + // if user has never specified a texture, assign the default for (U32 i=0; i < getNumTEs(); i++) { const LLViewerTexture* te_image = getImage(i, 0); if(!te_image || te_image->getID().isNull() || (te_image->getID() == IMG_DEFAULT)) { - setImage(i, LLViewerTextureManager::getFetchedTexture(i == TEX_HAIR ? IMG_DEFAULT : IMG_DEFAULT_AVATAR), 0); // IMG_DEFAULT_AVATAR = a special texture that's never rendered. + // IMG_DEFAULT_AVATAR = a special texture that's never rendered. + const LLUUID& image_id = (i == TEX_HAIR ? IMG_DEFAULT : IMG_DEFAULT_AVATAR); + setImage(i, LLViewerTextureManager::getFetchedTexture(image_id), 0); } } - const BOOL self_customizing = isSelf() && gAgentCamera.cameraCustomizeAvatar(); // During face edit mode, we don't use baked textures const BOOL other_culled = !isSelf() && mCulled; LLLoadedCallbackEntry::source_callback_list_t* src_callback_list = NULL ; BOOL paused = FALSE; @@ -6616,71 +6250,97 @@ void LLVOAvatar::updateMeshTextures() std::vector<BOOL> use_lkg_baked_layer; // lkg = "last known good" use_lkg_baked_layer.resize(mBakedTextureDatas.size(), false); + mBakedTextureDebugText += llformat("%06d\n",update_counter++); + mBakedTextureDebugText += "indx layerset linvld ltda ilb ulkg ltid\n"; for (U32 i=0; i < mBakedTextureDatas.size(); i++) { is_layer_baked[i] = isTextureDefined(mBakedTextureDatas[i].mTextureIndex); - + LLViewerTexLayerSet* layerset = NULL; + bool layerset_invalid = false; if (!other_culled) { // When an avatar is changing clothes and not in Appearance mode, - // use the last-known good baked texture until it finish the first + // use the last-known good baked texture until it finishes the first // render of the new layerset. - const BOOL layerset_invalid = mBakedTextureDatas[i].mTexLayerSet - && ( !mBakedTextureDatas[i].mTexLayerSet->getComposite()->isInitialized() - || !mBakedTextureDatas[i].mTexLayerSet->isLocalTextureDataAvailable() ); + layerset = getTexLayerSet(i); + layerset_invalid = layerset && ( !layerset->getViewerComposite()->isInitialized() + || !layerset->isLocalTextureDataAvailable() ); use_lkg_baked_layer[i] = (!is_layer_baked[i] - && (mBakedTextureDatas[i].mLastTextureIndex != IMG_DEFAULT_AVATAR) + && (mBakedTextureDatas[i].mLastTextureID != IMG_DEFAULT_AVATAR) && layerset_invalid); if (use_lkg_baked_layer[i]) { - mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(TRUE); + layerset->setUpdatesEnabled(TRUE); } } else { use_lkg_baked_layer[i] = (!is_layer_baked[i] - && mBakedTextureDatas[i].mLastTextureIndex != IMG_DEFAULT_AVATAR); - if (mBakedTextureDatas[i].mTexLayerSet) - { - mBakedTextureDatas[i].mTexLayerSet->destroyComposite(); - } - } - + && mBakedTextureDatas[i].mLastTextureID != IMG_DEFAULT_AVATAR); } - // Turn on alpha masking correctly for yourself and other avatars on 1.23+ - mSupportsAlphaLayers = isSelf() || is_layer_baked[BAKED_HAIR]; - - // Baked textures should be requested from the sim this avatar is on. JC - const LLHost target_host = getObjectHost(); - if (!target_host.isOk()) - { - llwarns << "updateMeshTextures: invalid host for object: " << getID() << llendl; + std::string last_id_string; + if (mBakedTextureDatas[i].mLastTextureID == IMG_DEFAULT_AVATAR) + last_id_string = "A"; + else if (mBakedTextureDatas[i].mLastTextureID == IMG_DEFAULT) + last_id_string = "D"; + else if (mBakedTextureDatas[i].mLastTextureID == IMG_INVISIBLE) + last_id_string = "I"; + else + last_id_string = "*"; + bool is_ltda = layerset + && layerset->getViewerComposite()->isInitialized() + && layerset->isLocalTextureDataAvailable(); + mBakedTextureDebugText += llformat("%4d %4s %4d %4d %4d %4d %4s\n", + i, + (layerset?"*":"0"), + layerset_invalid, + is_ltda, + is_layer_baked[i], + use_lkg_baked_layer[i], + last_id_string.c_str()); } for (U32 i=0; i < mBakedTextureDatas.size(); i++) { - if (use_lkg_baked_layer[i] && !self_customizing ) + debugColorizeSubMeshes(i, LLColor4::white); + + LLViewerTexLayerSet* layerset = getTexLayerSet(i); + if (use_lkg_baked_layer[i] && !isUsingLocalAppearance() ) { - LLViewerFetchedTexture* baked_img = LLViewerTextureManager::getFetchedTextureFromHost( mBakedTextureDatas[i].mLastTextureIndex, target_host ); + LLViewerFetchedTexture* baked_img = LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[i].mLastTextureID); mBakedTextureDatas[i].mIsUsed = TRUE; - for (U32 k=0; k < mBakedTextureDatas[i].mMeshes.size(); k++) + + debugColorizeSubMeshes(i,LLColor4::red); + + avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); + avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[i].mJointMeshes.end(); + for (; iter != end; ++iter) { - mBakedTextureDatas[i].mMeshes[k]->setTexture( baked_img ); + LLAvatarJointMesh* mesh = (*iter); + if (mesh) + { + mesh->setTexture( baked_img ); } } - else if (!self_customizing && is_layer_baked[i]) + } + else if (!isUsingLocalAppearance() && is_layer_baked[i]) { - LLViewerFetchedTexture* baked_img = LLViewerTextureManager::staticCastToFetchedTexture(getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ; - if( baked_img->getID() == mBakedTextureDatas[i].mLastTextureIndex ) + LLViewerFetchedTexture* baked_img = + LLViewerTextureManager::staticCastToFetchedTexture( + getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ; + if( baked_img->getID() == mBakedTextureDatas[i].mLastTextureID ) { - // Even though the file may not be finished loading, we'll consider it loaded and use it (rather than doing compositing). + // Even though the file may not be finished loading, + // we'll consider it loaded and use it (rather than + // doing compositing). useBakedTexture( baked_img->getID() ); } else { mBakedTextureDatas[i].mIsLoaded = FALSE; - if ( (baked_img->getID() != IMG_INVISIBLE) && ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) ) + if ( (baked_img->getID() != IMG_INVISIBLE) && + ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) ) { baked_img->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ), src_callback_list, paused); @@ -6689,40 +6349,59 @@ void LLVOAvatar::updateMeshTextures() src_callback_list, paused ); } } - else if (mBakedTextureDatas[i].mTexLayerSet - && !other_culled) + else if (layerset && isUsingLocalAppearance()) { - mBakedTextureDatas[i].mTexLayerSet->createComposite(); - mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled( TRUE ); + debugColorizeSubMeshes(i,LLColor4::yellow ); + + layerset->createComposite(); + layerset->setUpdatesEnabled( TRUE ); mBakedTextureDatas[i].mIsUsed = FALSE; - for (U32 k=0; k < mBakedTextureDatas[i].mMeshes.size(); k++) + + avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); + avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[i].mJointMeshes.end(); + for (; iter != end; ++iter) { - mBakedTextureDatas[i].mMeshes[k]->setLayerSet( mBakedTextureDatas[i].mTexLayerSet ); + LLAvatarJointMesh* mesh = (*iter); + if (mesh) + { + mesh->setLayerSet( layerset ); + } } } + else + { + debugColorizeSubMeshes(i,LLColor4::blue); + } } // set texture and color of hair manually if we are not using a baked image. // This can happen while loading hair for yourself, or for clients that did not // bake a hair texture. Still needed for yourself after 1.22 is depricated. - if (!is_layer_baked[BAKED_HAIR] || self_customizing) + if (!is_layer_baked[BAKED_HAIR] || isEditingAppearance()) { const LLColor4 color = mTexHairColor ? mTexHairColor->getColor() : LLColor4(1,1,1,1); LLViewerTexture* hair_img = getImage( TEX_HAIR, 0 ); - for (U32 i = 0; i < mBakedTextureDatas[BAKED_HAIR].mMeshes.size(); i++) + avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[BAKED_HAIR].mJointMeshes.begin(); + avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[BAKED_HAIR].mJointMeshes.end(); + for (; iter != end; ++iter) + { + LLAvatarJointMesh* mesh = (*iter); + if (mesh) { - mBakedTextureDatas[BAKED_HAIR].mMeshes[i]->setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] ); - mBakedTextureDatas[BAKED_HAIR].mMeshes[i]->setTexture( hair_img ); + mesh->setColor( color ); + mesh->setTexture( hair_img ); + } } } - for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); - baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); + for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = + LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); + baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); ++baked_iter) { const EBakedTextureIndex baked_index = baked_iter->first; - const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second; + const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = baked_iter->second; for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin(); local_tex_iter != baked_dict->mLocalTextures.end(); @@ -6750,7 +6429,7 @@ void LLVOAvatar::setLocalTexture( ETextureIndex type, LLViewerTexture* in_tex, B } //virtual -void LLVOAvatar::setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index) +void LLVOAvatar::setBakedReady(LLAvatarAppearanceDefines::ETextureIndex type, BOOL baked_version_exists, U32 index) { // invalid for anyone but self llassert(0); @@ -6785,18 +6464,30 @@ void LLVOAvatar::clearChat() mChats.clear(); } -// adds a morph mask to the appropriate baked texture structure -void LLVOAvatar::addMaskedMorph(EBakedTextureIndex index, LLPolyMorphTarget* morph_target, BOOL invert, std::string layer) + +void LLVOAvatar::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components, LLAvatarAppearanceDefines::EBakedTextureIndex index) { - if (index < BAKED_NUM_INDICES) + if (index >= BAKED_NUM_INDICES) { - LLMaskedMorph *morph = new LLMaskedMorph(morph_target, invert, layer); - mBakedTextureDatas[index].mMaskedMorphs.push_front(morph); + llwarns << "invalid baked texture index passed to applyMorphMask" << llendl; + return; } + + for (morph_list_t::const_iterator iter = mBakedTextureDatas[index].mMaskedMorphs.begin(); + iter != mBakedTextureDatas[index].mMaskedMorphs.end(); ++iter) +{ + const LLMaskedMorph* maskedMorph = (*iter); + LLPolyMorphTarget* morph_target = dynamic_cast<LLPolyMorphTarget*>(maskedMorph->mMorphTarget); + if (morph_target) + { + morph_target->applyMask(tex_data, width, height, num_components, maskedMorph->mInvert); } +} +} + // returns TRUE if morph masks are present and not valid for a given baked texture, FALSE otherwise -BOOL LLVOAvatar::morphMaskNeedsUpdate(LLVOAvatarDefines::EBakedTextureIndex index) +BOOL LLVOAvatar::morphMaskNeedsUpdate(LLAvatarAppearanceDefines::EBakedTextureIndex index) { if (index >= BAKED_NUM_INDICES) { @@ -6807,7 +6498,7 @@ BOOL LLVOAvatar::morphMaskNeedsUpdate(LLVOAvatarDefines::EBakedTextureIndex inde { if (isSelf()) { - LLTexLayerSet *layer_set = mBakedTextureDatas[index].mTexLayerSet; + LLViewerTexLayerSet *layer_set = getTexLayerSet(index); if (layer_set) { return !layer_set->isMorphValid(); @@ -6822,23 +6513,6 @@ BOOL LLVOAvatar::morphMaskNeedsUpdate(LLVOAvatarDefines::EBakedTextureIndex inde return FALSE; } -void LLVOAvatar::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components, LLVOAvatarDefines::EBakedTextureIndex index) -{ - if (index >= BAKED_NUM_INDICES) - { - llwarns << "invalid baked texture index passed to applyMorphMask" << llendl; - return; - } - - for (morph_list_t::const_iterator iter = mBakedTextureDatas[index].mMaskedMorphs.begin(); - iter != mBakedTextureDatas[index].mMaskedMorphs.end(); ++iter) - { - const LLMaskedMorph* maskedMorph = (*iter); - maskedMorph->mMorphTarget->applyMask(tex_data, width, height, num_components, maskedMorph->mInvert); - } -} - - //----------------------------------------------------------------------------- // releaseComponentTextures() // release any component texture UUIDs for which we have a baked texture @@ -6861,7 +6535,7 @@ void LLVOAvatar::releaseComponentTextures() for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++) { - const LLVOAvatarDictionary::BakedEntry * bakedDicEntry = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index); + const LLAvatarAppearanceDictionary::BakedEntry * bakedDicEntry = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index); // skip if this is a skirt and av is not wearing one, or if we don't have a baked texture UUID if (!isTextureDefined(bakedDicEntry->mTextureIndex) && ( (baked_index != BAKED_SKIRT) || isWearingWearableType(LLWearableType::WT_SKIRT) )) @@ -6877,120 +6551,14 @@ void LLVOAvatar::releaseComponentTextures() } } -//static -BOOL LLVOAvatar::teToColorParams( ETextureIndex te, U32 *param_name ) -{ - switch( te ) - { - case TEX_UPPER_SHIRT: - param_name[0] = 803; //"shirt_red"; - param_name[1] = 804; //"shirt_green"; - param_name[2] = 805; //"shirt_blue"; - break; - - case TEX_LOWER_PANTS: - param_name[0] = 806; //"pants_red"; - param_name[1] = 807; //"pants_green"; - param_name[2] = 808; //"pants_blue"; - break; - - case TEX_LOWER_SHOES: - param_name[0] = 812; //"shoes_red"; - param_name[1] = 813; //"shoes_green"; - param_name[2] = 817; //"shoes_blue"; - break; - - case TEX_LOWER_SOCKS: - param_name[0] = 818; //"socks_red"; - param_name[1] = 819; //"socks_green"; - param_name[2] = 820; //"socks_blue"; - break; - - case TEX_UPPER_JACKET: - case TEX_LOWER_JACKET: - param_name[0] = 834; //"jacket_red"; - param_name[1] = 835; //"jacket_green"; - param_name[2] = 836; //"jacket_blue"; - break; - - case TEX_UPPER_GLOVES: - param_name[0] = 827; //"gloves_red"; - param_name[1] = 829; //"gloves_green"; - param_name[2] = 830; //"gloves_blue"; - break; - - case TEX_UPPER_UNDERSHIRT: - param_name[0] = 821; //"undershirt_red"; - param_name[1] = 822; //"undershirt_green"; - param_name[2] = 823; //"undershirt_blue"; - break; - - case TEX_LOWER_UNDERPANTS: - param_name[0] = 824; //"underpants_red"; - param_name[1] = 825; //"underpants_green"; - param_name[2] = 826; //"underpants_blue"; - break; - - case TEX_SKIRT: - param_name[0] = 921; //"skirt_red"; - param_name[1] = 922; //"skirt_green"; - param_name[2] = 923; //"skirt_blue"; - break; - - case TEX_HEAD_TATTOO: - case TEX_LOWER_TATTOO: - case TEX_UPPER_TATTOO: - param_name[0] = 1071; //"tattoo_red"; - param_name[1] = 1072; //"tattoo_green"; - param_name[2] = 1073; //"tattoo_blue"; - break; - - default: - llassert(0); - return FALSE; - } - - return TRUE; -} - -void LLVOAvatar::setClothesColor( ETextureIndex te, const LLColor4& new_color, BOOL upload_bake ) -{ - U32 param_name[3]; - if( teToColorParams( te, param_name ) ) - { - setVisualParamWeight( param_name[0], new_color.mV[VX], upload_bake ); - setVisualParamWeight( param_name[1], new_color.mV[VY], upload_bake ); - setVisualParamWeight( param_name[2], new_color.mV[VZ], upload_bake ); - } -} - -LLColor4 LLVOAvatar::getClothesColor( ETextureIndex te ) -{ - LLColor4 color; - U32 param_name[3]; - if( teToColorParams( te, param_name ) ) - { - color.mV[VX] = getVisualParamWeight( param_name[0] ); - color.mV[VY] = getVisualParamWeight( param_name[1] ); - color.mV[VZ] = getVisualParamWeight( param_name[2] ); - } - return color; -} - -// static -LLColor4 LLVOAvatar::getDummyColor() -{ - return DUMMY_COLOR; -} - void LLVOAvatar::dumpAvatarTEs( const std::string& context ) const { LL_DEBUGS("Avatar") << avString() << (isSelf() ? "Self: " : "Other: ") << context << LL_ENDL; - for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); - iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); + for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); + iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); ++iter) { - const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; + const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second; // TODO: MULTI-WEARABLE: handle multiple textures for self const LLViewerTexture* te_image = getImage(iter->first,0); if( !te_image ) @@ -7016,48 +6584,6 @@ void LLVOAvatar::dumpAvatarTEs( const std::string& context ) const } } -// Unlike most wearable functions, this works for both self and other. -BOOL LLVOAvatar::isWearingWearableType(LLWearableType::EType type) const -{ - if (mIsDummy) return TRUE; - - switch(type) - { - case LLWearableType::WT_SHAPE: - case LLWearableType::WT_SKIN: - case LLWearableType::WT_HAIR: - case LLWearableType::WT_EYES: - return TRUE; // everyone has all bodyparts - default: - break; // Do nothing - } - - /* switch(type) - case LLWearableType::WT_SHIRT: - indicator_te = TEX_UPPER_SHIRT; */ - for (LLVOAvatarDictionary::Textures::const_iterator tex_iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); - tex_iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); - ++tex_iter) - { - const LLVOAvatarDictionary::TextureEntry *texture_dict = tex_iter->second; - if (texture_dict->mWearableType == type) - { - // If you're checking another avatar's clothing, you don't have component textures. - // Thus, you must check to see if the corresponding baked texture is defined. - // NOTE: this is a poor substitute if you actually want to know about individual pieces of clothing - // this works for detecting a skirt (most important), but is ineffective at any piece of clothing that - // gets baked into a texture that always exists (upper or lower). - if (texture_dict->mIsUsedByBakedTexture) - { - const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; - return isTextureDefined(LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index)->mTextureIndex); - } - return FALSE; - } - } - return FALSE; -} - //----------------------------------------------------------------------------- // clampAttachmentPositions() //----------------------------------------------------------------------------- @@ -7138,7 +6664,7 @@ LLBBox LLVOAvatar::getHUDBBox() const //----------------------------------------------------------------------------- void LLVOAvatar::onFirstTEMessageReceived() { - LL_INFOS("Avatar") << avString() << LL_ENDL; + LL_DEBUGS("Avatar") << avString() << LL_ENDL; if( !mFirstTEMessageReceived ) { mFirstTEMessageReceived = TRUE; @@ -7160,7 +6686,7 @@ void LLVOAvatar::onFirstTEMessageReceived() if (layer_baked) { LLViewerFetchedTexture* image = LLViewerTextureManager::staticCastToFetchedTexture(getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ; - mBakedTextureDatas[i].mLastTextureIndex = image->getID(); + mBakedTextureDatas[i].mLastTextureID = image->getID(); // If we have more than one texture for the other baked layers, we'll want to call this for them too. if ( (image->getID() != IMG_INVISIBLE) && ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) ) { @@ -7212,85 +6738,106 @@ bool LLVOAvatar::visualParamWeightsAreDefault() return rtn; } - -//----------------------------------------------------------------------------- -// processAvatarAppearance() -//----------------------------------------------------------------------------- -void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) +void dump_visual_param(apr_file_t* file, LLVisualParam* viewer_param, F32 value) { - if (gSavedSettings.getBOOL("BlockAvatarAppearanceMessages")) + std::string type_string = "unknown"; + if (dynamic_cast<LLTexLayerParamAlpha*>(viewer_param)) + type_string = "param_alpha"; + if (dynamic_cast<LLTexLayerParamColor*>(viewer_param)) + type_string = "param_color"; + if (dynamic_cast<LLDriverParam*>(viewer_param)) + type_string = "param_driver"; + if (dynamic_cast<LLPolyMorphTarget*>(viewer_param)) + type_string = "param_morph"; + if (dynamic_cast<LLPolySkeletalDistortion*>(viewer_param)) + type_string = "param_skeleton"; + S32 wtype = -1; + LLViewerVisualParam *vparam = dynamic_cast<LLViewerVisualParam*>(viewer_param); + if (vparam) { - llwarns << "Blocking AvatarAppearance message" << llendl; - return; + wtype = vparam->getWearableType(); + } + S32 u8_value = F32_to_U8(value,viewer_param->getMinWeight(),viewer_param->getMaxWeight()); + apr_file_printf(file, "\t\t<param id=\"%d\" name=\"%s\" value=\"%.3f\" u8=\"%d\" type=\"%s\" wearable=\"%s\"/>\n", + viewer_param->getID(), viewer_param->getName().c_str(), value, u8_value, type_string.c_str(), + LLWearableType::getTypeName(LLWearableType::EType(wtype)).c_str() +// param_location_name(vparam->getParamLocation()).c_str() + ); } - - BOOL is_first_appearance_message = !mFirstAppearanceMessageReceived; - mFirstAppearanceMessageReceived = TRUE; - - LL_INFOS("Avatar") << avString() << "processAvatarAppearance start " << mID - << " first? " << is_first_appearance_message << " self? " << isSelf() << LL_ENDL; - if( isSelf() ) +void LLVOAvatar::dumpAppearanceMsgParams( const std::string& dump_prefix, + const LLAppearanceMessageContents& contents) { - llwarns << avString() << "Received AvatarAppearance for self" << llendl; - if( mFirstTEMessageReceived ) + std::string outfilename = get_sequential_numbered_file_name(dump_prefix,".xml"); + const std::vector<F32>& params_for_dump = contents.mParamWeights; + const LLTEContents& tec = contents.mTEContents; + + LLAPRFile outfile; + std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,outfilename); + outfile.open(fullpath, LL_APR_WB ); + apr_file_t* file = outfile.getFileHandle(); + if (!file) { -// llinfos << "processAvatarAppearance end " << mID << llendl; return; } + else + { + LL_DEBUGS("Avatar") << "dumping appearance message to " << fullpath << llendl; } - ESex old_sex = getSex(); - -// llinfos << "LLVOAvatar::processAvatarAppearance()" << llendl; -// dumpAvatarTEs( "PRE processAvatarAppearance()" ); - unpackTEMessage(mesgsys, _PREHASH_ObjectData); -// dumpAvatarTEs( "POST processAvatarAppearance()" ); + apr_file_printf(file, "<header>\n"); + apr_file_printf(file, "\t\t<cof_version %i />\n", contents.mCOFVersion); + apr_file_printf(file, "\t\t<appearance_version %i />\n", contents.mAppearanceVersion); + apr_file_printf(file, "</header>\n"); - // prevent the overwriting of valid baked textures with invalid baked textures - for (U8 baked_index = 0; baked_index < mBakedTextureDatas.size(); baked_index++) + apr_file_printf(file, "\n<params>\n"); + LLVisualParam* param = getFirstVisualParam(); + for (S32 i = 0; i < params_for_dump.size(); i++) { - if (!isTextureDefined(mBakedTextureDatas[baked_index].mTextureIndex) - && mBakedTextureDatas[baked_index].mLastTextureIndex != IMG_DEFAULT - && baked_index != BAKED_SKIRT) + while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) ) // should not be any of group VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT { - setTEImage(mBakedTextureDatas[baked_index].mTextureIndex, - LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureIndex, - TRUE, - LLViewerTexture::BOOST_NONE, - LLViewerTexture::LOD_TEXTURE)); + param = getNextVisualParam(); } + LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param; + F32 value = params_for_dump[i]; + dump_visual_param(file, viewer_param, value); + param = getNextVisualParam(); } + apr_file_printf(file, "</params>\n"); - - // runway - was - // if (!is_first_appearance_message ) - // which means it would be called on second appearance message - probably wrong. - if (is_first_appearance_message ) + apr_file_printf(file, "\n<textures>\n"); + for (U32 i = 0; i < tec.face_count; i++) { - onFirstTEMessageReceived(); + std::string uuid_str; + ((LLUUID*)tec.image_data)[i].toString(uuid_str); + apr_file_printf( file, "\t\t<texture te=\"%i\" uuid=\"%s\"/>\n", i, uuid_str.c_str()); + } + apr_file_printf(file, "</textures>\n"); } - setCompositeUpdatesEnabled( FALSE ); - mMeshTexturesDirty = TRUE; - gPipeline.markGLRebuild(this); +void LLVOAvatar::parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMessageContents& contents) +{ + parseTEMessage(mesgsys, _PREHASH_ObjectData, -1, contents.mTEContents); - // ! BACKWARDS COMPATIBILITY ! - // Non-self avatars will no longer have component textures - if (!isSelf()) + // Parse the AppearanceData field, if any. + if (mesgsys->has(_PREHASH_AppearanceData)) { - releaseComponentTextures(); + U8 av_u8; + mesgsys->getU8Fast(_PREHASH_AppearanceData, _PREHASH_AppearanceVersion, av_u8, 0); + contents.mAppearanceVersion = av_u8; + LL_DEBUGS("Avatar") << "appversion set by AppearanceData field: " << contents.mAppearanceVersion << llendl; + mesgsys->getS32Fast(_PREHASH_AppearanceData, _PREHASH_CofVersion, contents.mCOFVersion, 0); + // For future use: + //mesgsys->getU32Fast(_PREHASH_AppearanceData, _PREHASH_Flags, appearance_flags, 0); } - // parse visual params + // Parse visual params, if any. S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_VisualParam); bool drop_visual_params_debug = gSavedSettings.getBOOL("BlockSomeAvatarAppearanceVisualParams") && (ll_rand(2) == 0); // pretend that ~12% of AvatarAppearance messages arrived without a VisualParam block, for testing if( num_blocks > 1 && !drop_visual_params_debug) { LL_DEBUGS("Avatar") << avString() << " handle visual params, num_blocks " << num_blocks << LL_ENDL; - BOOL params_changed = FALSE; - BOOL interp_params = FALSE; LLVisualParam* param = getFirstVisualParam(); llassert(param); // if this ever fires, we should do the same as when num_blocks<=1 @@ -7316,10 +6863,204 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) U8 value; mesgsys->getU8Fast(_PREHASH_VisualParam, _PREHASH_ParamValue, value, i); F32 newWeight = U8_to_F32(value, param->getMinWeight(), param->getMaxWeight()); + contents.mParamWeights.push_back(newWeight); + contents.mParams.push_back(param); + + param = getNextVisualParam(); + } + } + + const S32 expected_tweakable_count = getVisualParamCountInGroup(VISUAL_PARAM_GROUP_TWEAKABLE); // don't worry about VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT + if (num_blocks != expected_tweakable_count) + { + LL_DEBUGS("Avatar") << "Number of params in AvatarAppearance msg (" << num_blocks << ") does not match number of tweakable params in avatar xml file (" << expected_tweakable_count << "). Processing what we can. object: " << getID() << llendl; + } + } + else + { + if (drop_visual_params_debug) + { + llinfos << "Debug-faked lack of parameters on AvatarAppearance for object: " << getID() << llendl; + } + else + { + LL_DEBUGS("Avatar") << "AvatarAppearance msg received without any parameters, object: " << getID() << llendl; + } + } + + LLVisualParam* appearance_version_param = getVisualParam(11000); + if (appearance_version_param) + { + std::vector<LLVisualParam*>::iterator it = std::find(contents.mParams.begin(), contents.mParams.end(),appearance_version_param); + if (it != contents.mParams.end()) + { + S32 index = it - contents.mParams.begin(); + contents.mParamAppearanceVersion = llround(contents.mParamWeights[index]); + LL_DEBUGS("Avatar") << "appversion req by appearance_version param: " << contents.mParamAppearanceVersion << llendl; + } + } +} + +bool resolve_appearance_version(const LLAppearanceMessageContents& contents, S32& appearance_version) +{ + appearance_version = -1; + + if ((contents.mAppearanceVersion) >= 0 && + (contents.mParamAppearanceVersion >= 0) && + (contents.mAppearanceVersion != contents.mParamAppearanceVersion)) + { + llwarns << "inconsistent appearance_version settings - field: " << + contents.mAppearanceVersion << ", param: " << contents.mParamAppearanceVersion << llendl; + return false; + } + if (contents.mParamAppearanceVersion >= 0) // use visual param if available. + { + appearance_version = contents.mParamAppearanceVersion; + } + if (contents.mAppearanceVersion >= 0) + { + appearance_version = contents.mAppearanceVersion; + } + if (appearance_version < 0) // still not set, go with 0. + { + appearance_version = 0; + } + LL_DEBUGS("Avatar") << "appearance version info - field " << contents.mAppearanceVersion + << " param: " << contents.mParamAppearanceVersion + << " final: " << appearance_version << llendl; + return true; +} + +//----------------------------------------------------------------------------- +// processAvatarAppearance() +//----------------------------------------------------------------------------- +void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) +{ + LL_DEBUGS("Avatar") << "starts" << llendl; + + bool enable_verbose_dumps = gSavedSettings.getBOOL("DebugAvatarAppearanceMessage"); + std::string dump_prefix = getFullname() + "_" + (isSelf()?"s":"o") + "_"; + if (gSavedSettings.getBOOL("BlockAvatarAppearanceMessages")) + { + llwarns << "Blocking AvatarAppearance message" << llendl; + return; + } + + ESex old_sex = getSex(); + + LLAppearanceMessageContents contents; + parseAppearanceMessage(mesgsys, contents); + if (enable_verbose_dumps) + { + dumpAppearanceMsgParams(dump_prefix + "appearance_msg", contents); + } + + S32 appearance_version; + if (!resolve_appearance_version(contents, appearance_version)) + { + llwarns << "bad appearance version info, discarding" << llendl; + return; + } + S32 this_update_cof_version = contents.mCOFVersion; + S32 last_update_request_cof_version = mLastUpdateRequestCOFVersion; + + // Only now that we have result of appearance_version can we decide whether to bail out. + if( isSelf() ) + { + LL_DEBUGS("Avatar") << "this_update_cof_version " << this_update_cof_version + << " last_update_request_cof_version " << last_update_request_cof_version + << " my_cof_version " << LLAppearanceMgr::instance().getCOFVersion() << llendl; + + if (getRegion() && (getRegion()->getCentralBakeVersion()==0)) + { + llwarns << avString() << "Received AvatarAppearance message for self in non-server-bake region" << llendl; + } + if( mFirstTEMessageReceived && (appearance_version == 0)) + { + return; + } + } + else + { + LL_DEBUGS("Avatar") << "appearance message received" << llendl; + } + + // Check for stale update. + if (isSelf() + && (appearance_version>0) + && (this_update_cof_version < last_update_request_cof_version)) + { + llwarns << "Stale appearance update, wanted version " << last_update_request_cof_version + << ", got " << this_update_cof_version << llendl; + return; + } + + if (isSelf() && isEditingAppearance()) + { + LL_DEBUGS("Avatar") << "ignoring appearance message while in appearance edit" << llendl; + return; + } + + S32 num_params = contents.mParamWeights.size(); + if (num_params <= 1) + { + // In this case, we have no reliable basis for knowing + // appearance version, which may cause us to look for baked + // textures in the wrong place and flag them as missing + // assets. + LL_DEBUGS("Avatar") << "ignoring appearance message due to lack of params" << llendl; + return; + } + + mLastUpdateReceivedCOFVersion = this_update_cof_version; + + setIsUsingServerBakes(appearance_version > 0); + + applyParsedTEMessage(contents.mTEContents); + + // prevent the overwriting of valid baked textures with invalid baked textures + for (U8 baked_index = 0; baked_index < mBakedTextureDatas.size(); baked_index++) + { + if (!isTextureDefined(mBakedTextureDatas[baked_index].mTextureIndex) + && mBakedTextureDatas[baked_index].mLastTextureID != IMG_DEFAULT + && baked_index != BAKED_SKIRT) + { + setTEImage(mBakedTextureDatas[baked_index].mTextureIndex, + LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureID, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); + } + } + + // runway - was + // if (!is_first_appearance_message ) + // which means it would be called on second appearance message - probably wrong. + BOOL is_first_appearance_message = !mFirstAppearanceMessageReceived; + mFirstAppearanceMessageReceived = TRUE; + + LL_DEBUGS("Avatar") << avString() << "processAvatarAppearance start " << mID + << " first? " << is_first_appearance_message << " self? " << isSelf() << LL_ENDL; + + if (is_first_appearance_message ) + { + onFirstTEMessageReceived(); + } + + setCompositeUpdatesEnabled( FALSE ); + gPipeline.markGLRebuild(this); + + // Apply visual params + if( num_params > 1) + { + LL_DEBUGS("Avatar") << avString() << " handle visual params, num_params " << num_params << LL_ENDL; + BOOL params_changed = FALSE; + BOOL interp_params = FALSE; + + for( S32 i = 0; i < num_params; i++ ) + { + LLVisualParam* param = contents.mParams[i]; + F32 newWeight = contents.mParamWeights[i]; if (is_first_appearance_message || (param->getWeight() != newWeight)) { - //llinfos << "Received update for param " << param->getDisplayName() << " at value " << newWeight << llendl; params_changed = TRUE; if(is_first_appearance_message) { @@ -7331,14 +7072,11 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) param->setAnimationTarget(newWeight, FALSE); } } - param = getNextVisualParam(); - } } - const S32 expected_tweakable_count = getVisualParamCountInGroup(VISUAL_PARAM_GROUP_TWEAKABLE); // don't worry about VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT - if (num_blocks != expected_tweakable_count) + if (num_params != expected_tweakable_count) { - llinfos << "Number of params in AvatarAppearance msg (" << num_blocks << ") does not match number of tweakable params in avatar xml file (" << expected_tweakable_count << "). Processing what we can. object: " << getID() << llendl; + LL_DEBUGS("Avatar") << "Number of params in AvatarAppearance msg (" << num_params << ") does not match number of tweakable params in avatar xml file (" << expected_tweakable_count << "). Processing what we can. object: " << getID() << llendl; } if (params_changed) @@ -7362,14 +7100,6 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) { // AvatarAppearance message arrived without visual params LL_DEBUGS("Avatar") << avString() << "no visual params" << LL_ENDL; - if (drop_visual_params_debug) - { - llinfos << "Debug-faked lack of parameters on AvatarAppearance for object: " << getID() << llendl; - } - else - { - llinfos << "AvatarAppearance msg received without any parameters, object: " << getID() << llendl; - } const F32 LOADING_TIMEOUT_SECONDS = 60.f; // this isn't really a problem if we already have a non-default shape @@ -7392,7 +7122,14 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) // If all of the avatars are completely baked, release the global image caches to conserve memory. LLVOAvatar::cullAvatarsByPixelArea(); -// llinfos << "processAvatarAppearance end " << mID << llendl; + if (isSelf()) + { + mUseLocalAppearance = false; + } + + updateMeshTextures(); + + //if (enable_verbose_dumps) dumpArchetypeXML(dump_prefix + "process_end"); } // static @@ -7422,6 +7159,7 @@ void LLVOAvatar::getAnimNames( LLDynamicArray<std::string>* names ) names->put( "enter_away_from_keyboard_state" ); } +// static void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) { if (!userdata) return; @@ -7440,7 +7178,7 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture { if (!aux_src->getData()) { - llerrs << "No auxiliary source data for onBakedTextureMasksLoaded" << llendl; + llerrs << "No auxiliary source (morph mask) data for image id " << id << llendl; return; } @@ -7465,12 +7203,12 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture self->mBakedTextureDatas[BAKED_HEAD].mTexLayerSet->applyMorphMask(aux_src->getData(), aux_src->getWidth(), aux_src->getHeight(), 1); maskData->mLastDiscardLevel = discard_level; */ BOOL found_texture_id = false; - for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); - iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); + for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); + iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); ++iter) { - const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; + const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second; if (texture_dict->mIsUsedByBakedTexture) { const ETextureIndex texture_index = iter->first; @@ -7492,7 +7230,7 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture } if (!found_texture_id) { - llinfos << "onBakedTextureMasksLoaded(): unexpected image id: " << id << llendl; + llinfos << "unexpected image id: " << id << llendl; } self->dirtyMesh(); } @@ -7500,7 +7238,7 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture { // this can happen when someone uses an old baked texture possibly provided by // viewer-side baked texture caching - llwarns << "Masks loaded callback but NO aux source!" << llendl; + llwarns << "Masks loaded callback but NO aux source, id " << id << llendl; } } @@ -7538,7 +7276,7 @@ void LLVOAvatar::onBakedTextureLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata) { - //llinfos << "onBakedTextureLoaded: " << src_vi->getID() << llendl; + LL_DEBUGS("Avatar") << "onBakedTextureLoaded: " << src_vi->getID() << LL_ENDL; LLUUID id = src_vi->getID(); LLUUID *avatar_idp = (LLUUID *)userdata; @@ -7575,17 +7313,31 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) { LL_DEBUGS("Avatar") << avString() << " i " << i << " id " << id << LL_ENDL; mBakedTextureDatas[i].mIsLoaded = true; - mBakedTextureDatas[i].mLastTextureIndex = id; + mBakedTextureDatas[i].mLastTextureID = id; mBakedTextureDatas[i].mIsUsed = true; - for (U32 k = 0; k < mBakedTextureDatas[i].mMeshes.size(); k++) + + if (isUsingLocalAppearance()) { - mBakedTextureDatas[i].mMeshes[k]->setTexture( image_baked ); + llinfos << "not changing to baked texture while isUsingLocalAppearance" << llendl; } - if (mBakedTextureDatas[i].mTexLayerSet) + else + { + debugColorizeSubMeshes(i,LLColor4::green); + + avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); + avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[i].mJointMeshes.end(); + for (; iter != end; ++iter) { - //mBakedTextureDatas[i].mTexLayerSet->destroyComposite(); + LLAvatarJointMesh* mesh = (*iter); + if (mesh) + { + mesh->setTexture( image_baked ); + } + } } - const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); + + const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = + LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin(); local_tex_iter != baked_dict->mLocalTextures.end(); ++local_tex_iter) @@ -7598,9 +7350,15 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) // This is paired with similar code in updateMeshTextures that sets hair mesh color. if (i == BAKED_HAIR) { - for (U32 i = 0; i < mBakedTextureDatas[BAKED_HAIR].mMeshes.size(); i++) + avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); + avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[i].mJointMeshes.end(); + for (; iter != end; ++iter) + { + LLAvatarJointMesh* mesh = (*iter); + if (mesh) { - mBakedTextureDatas[BAKED_HAIR].mMeshes[i]->setColor( 1.f, 1.f, 1.f, 1.f ); + mesh->setColor( LLColor4::white ); + } } } } @@ -7609,11 +7367,39 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) dirtyMesh(); } -// static -void LLVOAvatar::dumpArchetypeXML( void* ) +std::string get_sequential_numbered_file_name(const std::string& prefix, + const std::string& suffix) +{ + typedef std::map<std::string,S32> file_num_type; + static file_num_type file_nums; + file_num_type::iterator it = file_nums.find(prefix); + S32 num = 0; + if (it != file_nums.end()) { + num = it->second; + } + file_nums[prefix] = num+1; + std::string outfilename = prefix + " " + llformat("%04d",num) + ".xml"; + std::replace(outfilename.begin(),outfilename.end(),' ','_'); + return outfilename; +} + +void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_wearables ) +{ + std::string outprefix(prefix); + if (outprefix.empty()) + { + outprefix = getFullname() + (isSelf()?"_s":"_o"); + } + if (outprefix.empty()) +{ + outprefix = std::string("new_archetype"); + } + std::string outfilename = get_sequential_numbered_file_name(outprefix,".xml"); + LLAPRFile outfile; - outfile.open(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"new archetype.xml"), LL_APR_WB ); + std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,outfilename); + outfile.open(fullpath, LL_APR_WB ); apr_file_t* file = outfile.getFileHandle(); if (!file) { @@ -7621,36 +7407,36 @@ void LLVOAvatar::dumpArchetypeXML( void* ) } else { - llinfos << "xmlfile write handle obtained : " << gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"new archetype.xml") << llendl; + llinfos << "xmlfile write handle obtained : " << fullpath << llendl; } apr_file_printf( file, "<?xml version=\"1.0\" encoding=\"US-ASCII\" standalone=\"yes\"?>\n" ); apr_file_printf( file, "<linden_genepool version=\"1.0\">\n" ); apr_file_printf( file, "\n\t<archetype name=\"???\">\n" ); - // only body parts, not clothing. - for (S32 type = LLWearableType::WT_SHAPE; type <= LLWearableType::WT_EYES; type++) + if (group_by_wearables) + { + for (S32 type = LLWearableType::WT_SHAPE; type < LLWearableType::WT_COUNT; type++) { const std::string& wearable_name = LLWearableType::getTypeName((LLWearableType::EType)type); apr_file_printf( file, "\n\t\t<!-- wearable: %s -->\n", wearable_name.c_str() ); - for (LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam()) + for (LLVisualParam* param = getFirstVisualParam(); param; param = getNextVisualParam()) { LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param; if( (viewer_param->getWearableType() == type) && (viewer_param->isTweakable() ) ) { - apr_file_printf(file, "\t\t<param id=\"%d\" name=\"%s\" value=\"%.3f\"/>\n", - viewer_param->getID(), viewer_param->getName().c_str(), viewer_param->getWeight()); + dump_visual_param(file, viewer_param, viewer_param->getWeight()); } } for (U8 te = 0; te < TEX_NUM_INDICES; te++) { - if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex)te) == type) + if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex)te) == type) { // MULTIPLE_WEARABLES: extend to multiple wearables? - LLViewerTexture* te_image = ((LLVOAvatar *)(gAgentAvatarp))->getImage((ETextureIndex)te, 0); + LLViewerTexture* te_image = getImage((ETextureIndex)te, 0); if( te_image ) { std::string uuid_str; @@ -7659,14 +7445,42 @@ void LLVOAvatar::dumpArchetypeXML( void* ) } } } + } + } + else + { + // Just dump all params sequentially. + for (LLVisualParam* param = getFirstVisualParam(); param; param = getNextVisualParam()) + { + LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param; + dump_visual_param(file, viewer_param, viewer_param->getWeight()); + } + + for (U8 te = 0; te < TEX_NUM_INDICES; te++) + { + { + // MULTIPLE_WEARABLES: extend to multiple wearables? + LLViewerTexture* te_image = getImage((ETextureIndex)te, 0); + if( te_image ) + { + std::string uuid_str; + te_image->getID().toString( uuid_str ); + apr_file_printf( file, "\t\t<texture te=\"%i\" uuid=\"%s\"/>\n", te, uuid_str.c_str()); + } + } + } + } apr_file_printf( file, "\t</archetype>\n" ); apr_file_printf( file, "\n</linden_genepool>\n" ); - //explictly close the file if it is still open which it should be - if (file) + + bool ultra_verbose = false; + if (isSelf() && ultra_verbose) { - outfile.close(); + // show the cloned params inside the wearables as well. + gAgentAvatarp->dumpWearableInfo(outfile); } + // File will close when handle goes out of scope } @@ -7748,15 +7562,9 @@ void LLVOAvatar::cullAvatarsByPixelArea() } } - // runway - this doesn't detect gray/grey state. - // think we just need to be checking self av since it's the only - // one with lltexlayer stuff. + // runway - this doesn't really detect gray/grey state. S32 grey_avatars = 0; - if (LLVOAvatar::areAllNearbyInstancesBaked(grey_avatars)) - { - LLVOAvatar::deleteCachedImages(false); - } - else + if (!LLVOAvatar::areAllNearbyInstancesBaked(grey_avatars)) { if (gFrameTimeSeconds != sUnbakedUpdateTime) // only update once per frame { @@ -7785,500 +7593,43 @@ void LLVOAvatar::startAppearanceAnimation() } // virtual -void LLVOAvatar::removeMissingBakedTextures() -{ -} - -//----------------------------------------------------------------------------- -// LLVOAvatarXmlInfo -//----------------------------------------------------------------------------- - -LLVOAvatar::LLVOAvatarXmlInfo::LLVOAvatarXmlInfo() - : mTexSkinColorInfo(0), mTexHairColorInfo(0), mTexEyeColorInfo(0) -{ -} - -LLVOAvatar::LLVOAvatarXmlInfo::~LLVOAvatarXmlInfo() -{ - std::for_each(mMeshInfoList.begin(), mMeshInfoList.end(), DeletePointer()); - std::for_each(mSkeletalDistortionInfoList.begin(), mSkeletalDistortionInfoList.end(), DeletePointer()); - std::for_each(mAttachmentInfoList.begin(), mAttachmentInfoList.end(), DeletePointer()); - deleteAndClear(mTexSkinColorInfo); - deleteAndClear(mTexHairColorInfo); - deleteAndClear(mTexEyeColorInfo); - std::for_each(mLayerInfoList.begin(), mLayerInfoList.end(), DeletePointer()); - std::for_each(mDriverInfoList.begin(), mDriverInfoList.end(), DeletePointer()); - std::for_each(mMorphMaskInfoList.begin(), mMorphMaskInfoList.end(), DeletePointer()); -} - -////----------------------------------------------------------------------------- -//// LLVOAvatarBoneInfo::parseXml() -////----------------------------------------------------------------------------- -//BOOL LLVOAvatarBoneInfo::parseXml(LLXmlTreeNode* node) -//{ -// if (node->hasName("bone")) -// { -// mIsJoint = TRUE; -// static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); -// if (!node->getFastAttributeString(name_string, mName)) -// { -// llwarns << "Bone without name" << llendl; -// return FALSE; -// } -// } -// else if (node->hasName("collision_volume")) -// { -// mIsJoint = FALSE; -// static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); -// if (!node->getFastAttributeString(name_string, mName)) -// { -// mName = "Collision Volume"; -// } -// } -// else -// { -// llwarns << "Invalid node " << node->getName() << llendl; -// return FALSE; -// } -// -// static LLStdStringHandle pos_string = LLXmlTree::addAttributeString("pos"); -// if (!node->getFastAttributeVector3(pos_string, mPos)) -// { -// llwarns << "Bone without position" << llendl; -// return FALSE; -// } -// -// static LLStdStringHandle rot_string = LLXmlTree::addAttributeString("rot"); -// if (!node->getFastAttributeVector3(rot_string, mRot)) -// { -// llwarns << "Bone without rotation" << llendl; -// return FALSE; -// } -// -// static LLStdStringHandle scale_string = LLXmlTree::addAttributeString("scale"); -// if (!node->getFastAttributeVector3(scale_string, mScale)) -// { -// llwarns << "Bone without scale" << llendl; -// return FALSE; -// } -// -// if (mIsJoint) -// { -// static LLStdStringHandle pivot_string = LLXmlTree::addAttributeString("pivot"); -// if (!node->getFastAttributeVector3(pivot_string, mPivot)) -// { -// llwarns << "Bone without pivot" << llendl; -// return FALSE; -// } -// } -// -// // parse children -// LLXmlTreeNode* child; -// for( child = node->getFirstChild(); child; child = node->getNextChild() ) -// { -// LLVOAvatarBoneInfo *child_info = new LLVOAvatarBoneInfo; -// if (!child_info->parseXml(child)) -// { -// delete child_info; -// return FALSE; -// } -// mChildList.push_back(child_info); -// } -// return TRUE; -//} -// -////----------------------------------------------------------------------------- -//// LLVOAvatarSkeletonInfo::parseXml() -////----------------------------------------------------------------------------- -//BOOL LLVOAvatarSkeletonInfo::parseXml(LLXmlTreeNode* node) -//{ -// static LLStdStringHandle num_bones_string = LLXmlTree::addAttributeString("num_bones"); -// if (!node->getFastAttributeS32(num_bones_string, mNumBones)) -// { -// llwarns << "Couldn't find number of bones." << llendl; -// return FALSE; -// } -// -// static LLStdStringHandle num_collision_volumes_string = LLXmlTree::addAttributeString("num_collision_volumes"); -// node->getFastAttributeS32(num_collision_volumes_string, mNumCollisionVolumes); -// -// LLXmlTreeNode* child; -// for( child = node->getFirstChild(); child; child = node->getNextChild() ) -// { -// LLVOAvatarBoneInfo *info = new LLVOAvatarBoneInfo; -// if (!info->parseXml(child)) -// { -// delete info; -// llwarns << "Error parsing bone in skeleton file" << llendl; -// return FALSE; -// } -// mBoneInfoList.push_back(info); -// } -// return TRUE; -//} - -//----------------------------------------------------------------------------- -// parseXmlSkeletonNode(): parses <skeleton> nodes from XML tree -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlSkeletonNode(LLXmlTreeNode* root) -{ - LLXmlTreeNode* node = root->getChildByName( "skeleton" ); - if( !node ) - { - llwarns << "avatar file: missing <skeleton>" << llendl; - return FALSE; - } - - LLXmlTreeNode* child; - - // SKELETON DISTORTIONS - for (child = node->getChildByName( "param" ); - child; - child = node->getNextNamedChild()) - { - if (!child->getChildByName("param_skeleton")) +void LLVOAvatar::bodySizeChanged() { - if (child->getChildByName("param_morph")) - { - llwarns << "Can't specify morph param in skeleton definition." << llendl; - } - else - { - llwarns << "Unknown param type." << llendl; - } - continue; - } - - LLPolySkeletalDistortionInfo *info = new LLPolySkeletalDistortionInfo; - if (!info->parseXml(child)) - { - delete info; - return FALSE; - } - - mSkeletalDistortionInfoList.push_back(info); + if (isSelf() && !LLAppearanceMgr::instance().isInUpdateAppearanceFromCOF()) + { // notify simulator of change in size + // but not if we are in the middle of updating appearance + gAgent.sendAgentSetAppearance(); } - - // ATTACHMENT POINTS - for (child = node->getChildByName( "attachment_point" ); - child; - child = node->getNextNamedChild()) - { - LLVOAvatarAttachmentInfo* info = new LLVOAvatarAttachmentInfo(); - - static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); - if (!child->getFastAttributeString(name_string, info->mName)) - { - llwarns << "No name supplied for attachment point." << llendl; - delete info; - continue; - } - - static LLStdStringHandle joint_string = LLXmlTree::addAttributeString("joint"); - if (!child->getFastAttributeString(joint_string, info->mJointName)) - { - llwarns << "No bone declared in attachment point " << info->mName << llendl; - delete info; - continue; - } - - static LLStdStringHandle position_string = LLXmlTree::addAttributeString("position"); - if (child->getFastAttributeVector3(position_string, info->mPosition)) - { - info->mHasPosition = TRUE; - } - - static LLStdStringHandle rotation_string = LLXmlTree::addAttributeString("rotation"); - if (child->getFastAttributeVector3(rotation_string, info->mRotationEuler)) - { - info->mHasRotation = TRUE; - } - static LLStdStringHandle group_string = LLXmlTree::addAttributeString("group"); - if (child->getFastAttributeS32(group_string, info->mGroup)) - { - if (info->mGroup == -1) - info->mGroup = -1111; // -1 = none parsed, < -1 = bad value - } - - static LLStdStringHandle id_string = LLXmlTree::addAttributeString("id"); - if (!child->getFastAttributeS32(id_string, info->mAttachmentID)) - { - llwarns << "No id supplied for attachment point " << info->mName << llendl; - delete info; - continue; - } - - static LLStdStringHandle slot_string = LLXmlTree::addAttributeString("pie_slice"); - child->getFastAttributeS32(slot_string, info->mPieMenuSlice); - - static LLStdStringHandle visible_in_first_person_string = LLXmlTree::addAttributeString("visible_in_first_person"); - child->getFastAttributeBOOL(visible_in_first_person_string, info->mVisibleFirstPerson); - - static LLStdStringHandle hud_attachment_string = LLXmlTree::addAttributeString("hud"); - child->getFastAttributeBOOL(hud_attachment_string, info->mIsHUDAttachment); - - mAttachmentInfoList.push_back(info); - } - - return TRUE; } -//----------------------------------------------------------------------------- -// parseXmlMeshNodes(): parses <mesh> nodes from XML tree -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlMeshNodes(LLXmlTreeNode* root) +BOOL LLVOAvatar::isUsingServerBakes() const { - for (LLXmlTreeNode* node = root->getChildByName( "mesh" ); - node; - node = root->getNextNamedChild()) +#if 1 + // Sanity check - visual param for appearance version should match mUseServerBakes + LLVisualParam* appearance_version_param = getVisualParam(11000); + llassert(appearance_version_param); + F32 wt = appearance_version_param->getWeight(); + F32 expect_wt = mUseServerBakes ? 1.0 : 0.0; + if (!is_approx_equal(wt,expect_wt)) { - LLVOAvatarMeshInfo *info = new LLVOAvatarMeshInfo; - - // attribute: type - static LLStdStringHandle type_string = LLXmlTree::addAttributeString("type"); - if( !node->getFastAttributeString( type_string, info->mType ) ) - { - llwarns << "Avatar file: <mesh> is missing type attribute. Ignoring element. " << llendl; - delete info; - return FALSE; // Ignore this element - } - - static LLStdStringHandle lod_string = LLXmlTree::addAttributeString("lod"); - if (!node->getFastAttributeS32( lod_string, info->mLOD )) - { - llwarns << "Avatar file: <mesh> is missing lod attribute. Ignoring element. " << llendl; - delete info; - return FALSE; // Ignore this element - } - - static LLStdStringHandle file_name_string = LLXmlTree::addAttributeString("file_name"); - if( !node->getFastAttributeString( file_name_string, info->mMeshFileName ) ) - { - llwarns << "Avatar file: <mesh> is missing file_name attribute. Ignoring: " << info->mType << llendl; - delete info; - return FALSE; // Ignore this element - } - - static LLStdStringHandle reference_string = LLXmlTree::addAttributeString("reference"); - node->getFastAttributeString( reference_string, info->mReferenceMeshName ); - - // attribute: min_pixel_area - static LLStdStringHandle min_pixel_area_string = LLXmlTree::addAttributeString("min_pixel_area"); - static LLStdStringHandle min_pixel_width_string = LLXmlTree::addAttributeString("min_pixel_width"); - if (!node->getFastAttributeF32( min_pixel_area_string, info->mMinPixelArea )) - { - F32 min_pixel_area = 0.1f; - if (node->getFastAttributeF32( min_pixel_width_string, min_pixel_area )) - { - // this is square root of pixel area (sensible to use linear space in defining lods) - min_pixel_area = min_pixel_area * min_pixel_area; - } - info->mMinPixelArea = min_pixel_area; - } - - // Parse visual params for this node only if we haven't already - for (LLXmlTreeNode* child = node->getChildByName( "param" ); - child; - child = node->getNextNamedChild()) - { - if (!child->getChildByName("param_morph")) - { - if (child->getChildByName("param_skeleton")) - { - llwarns << "Can't specify skeleton param in a mesh definition." << llendl; - } - else - { - llwarns << "Unknown param type." << llendl; - } - continue; - } - - LLPolyMorphTargetInfo *morphinfo = new LLPolyMorphTargetInfo(); - if (!morphinfo->parseXml(child)) - { - delete morphinfo; - delete info; - return -1; - } - BOOL shared = FALSE; - static LLStdStringHandle shared_string = LLXmlTree::addAttributeString("shared"); - child->getFastAttributeBOOL(shared_string, shared); - - info->mPolyMorphTargetInfoList.push_back(LLVOAvatarMeshInfo::morph_info_pair_t(morphinfo, shared)); - } - - mMeshInfoList.push_back(info); + llwarns << "wt " << wt << " differs from expected " << expect_wt << llendl; } - return TRUE; -} - -//----------------------------------------------------------------------------- -// parseXmlColorNodes(): parses <global_color> nodes from XML tree -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlColorNodes(LLXmlTreeNode* root) -{ - for (LLXmlTreeNode* color_node = root->getChildByName( "global_color" ); - color_node; - color_node = root->getNextNamedChild()) - { - std::string global_color_name; - static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name"); - if (color_node->getFastAttributeString( name_string, global_color_name ) ) - { - if( global_color_name == "skin_color" ) - { - if (mTexSkinColorInfo) - { - llwarns << "avatar file: multiple instances of skin_color" << llendl; - return FALSE; - } - mTexSkinColorInfo = new LLTexGlobalColorInfo; - if( !mTexSkinColorInfo->parseXml( color_node ) ) - { - deleteAndClear(mTexSkinColorInfo); - llwarns << "avatar file: mTexSkinColor->parseXml() failed" << llendl; - return FALSE; - } - } - else if( global_color_name == "hair_color" ) - { - if (mTexHairColorInfo) - { - llwarns << "avatar file: multiple instances of hair_color" << llendl; - return FALSE; - } - mTexHairColorInfo = new LLTexGlobalColorInfo; - if( !mTexHairColorInfo->parseXml( color_node ) ) - { - deleteAndClear(mTexHairColorInfo); - llwarns << "avatar file: mTexHairColor->parseXml() failed" << llendl; - return FALSE; - } - } - else if( global_color_name == "eye_color" ) - { - if (mTexEyeColorInfo) - { - llwarns << "avatar file: multiple instances of eye_color" << llendl; - return FALSE; - } - mTexEyeColorInfo = new LLTexGlobalColorInfo; - if( !mTexEyeColorInfo->parseXml( color_node ) ) - { - llwarns << "avatar file: mTexEyeColor->parseXml() failed" << llendl; - return FALSE; - } - } - } - } - return TRUE; -} - -//----------------------------------------------------------------------------- -// parseXmlLayerNodes(): parses <layer_set> nodes from XML tree -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlLayerNodes(LLXmlTreeNode* root) -{ - for (LLXmlTreeNode* layer_node = root->getChildByName( "layer_set" ); - layer_node; - layer_node = root->getNextNamedChild()) - { - LLTexLayerSetInfo* layer_info = new LLTexLayerSetInfo(); - if( layer_info->parseXml( layer_node ) ) - { - mLayerInfoList.push_back(layer_info); - } - else - { - delete layer_info; - llwarns << "avatar file: layer_set->parseXml() failed" << llendl; - return FALSE; - } - } - return TRUE; -} - -//----------------------------------------------------------------------------- -// parseXmlDriverNodes(): parses <driver_parameters> nodes from XML tree -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlDriverNodes(LLXmlTreeNode* root) -{ - LLXmlTreeNode* driver = root->getChildByName( "driver_parameters" ); - if( driver ) - { - for (LLXmlTreeNode* grand_child = driver->getChildByName( "param" ); - grand_child; - grand_child = driver->getNextNamedChild()) - { - if( grand_child->getChildByName( "param_driver" ) ) - { - LLDriverParamInfo* driver_info = new LLDriverParamInfo(); - if( driver_info->parseXml( grand_child ) ) - { - mDriverInfoList.push_back(driver_info); - } - else - { - delete driver_info; - llwarns << "avatar file: driver_param->parseXml() failed" << llendl; - return FALSE; - } - } - } - } - return TRUE; -} - -//----------------------------------------------------------------------------- -// parseXmlDriverNodes(): parses <driver_parameters> nodes from XML tree -//----------------------------------------------------------------------------- -BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlMorphNodes(LLXmlTreeNode* root) -{ - LLXmlTreeNode* masks = root->getChildByName( "morph_masks" ); - if( !masks ) - { - return FALSE; - } - - for (LLXmlTreeNode* grand_child = masks->getChildByName( "mask" ); - grand_child; - grand_child = masks->getNextNamedChild()) - { - LLVOAvatarMorphInfo* info = new LLVOAvatarMorphInfo(); +#endif - static LLStdStringHandle name_string = LLXmlTree::addAttributeString("morph_name"); - if (!grand_child->getFastAttributeString(name_string, info->mName)) - { - llwarns << "No name supplied for morph mask." << llendl; - delete info; - continue; + return mUseServerBakes; } - static LLStdStringHandle region_string = LLXmlTree::addAttributeString("body_region"); - if (!grand_child->getFastAttributeString(region_string, info->mRegion)) +void LLVOAvatar::setIsUsingServerBakes(BOOL newval) { - llwarns << "No region supplied for morph mask." << llendl; - delete info; - continue; + mUseServerBakes = newval; + LLVisualParam* appearance_version_param = getVisualParam(11000); + llassert(appearance_version_param); + appearance_version_param->setWeight(newval ? 1.0 : 0.0, false); } - static LLStdStringHandle layer_string = LLXmlTree::addAttributeString("layer"); - if (!grand_child->getFastAttributeString(layer_string, info->mLayer)) +// virtual +void LLVOAvatar::removeMissingBakedTextures() { - llwarns << "No layer supplied for morph mask." << llendl; - delete info; - continue; - } - - // optional parameter. don't throw a warning if not present. - static LLStdStringHandle invert_string = LLXmlTree::addAttributeString("invert"); - grand_child->getFastAttributeBOOL(invert_string, info->mInvert); - - mMorphMaskInfoList.push_back(info); - } - - return TRUE; } //virtual @@ -8454,7 +7805,7 @@ void LLVOAvatar::idleUpdateRenderCost() for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++) { - const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index); + const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index); ETextureIndex tex_index = baked_dict->mTextureIndex; if ((tex_index != TEX_SKIRT_BAKED) || (isWearingWearableType(LLWearableType::WT_SKIRT))) { @@ -8534,11 +7885,11 @@ void LLVOAvatar::idleUpdateRenderCost() } // print any avatar textures we didn't already know about - for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); - iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); + for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); + iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); ++iter) { - const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; + const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second; // TODO: MULTI-WEARABLE: handle multiple textures for self const LLViewerTexture* te_image = getImage(iter->first,0); if (!te_image) @@ -8567,26 +7918,26 @@ void LLVOAvatar::idleUpdateRenderCost() BOOL LLVOAvatar::isIndexLocalTexture(ETextureIndex index) { if (index < 0 || index >= TEX_NUM_INDICES) return false; - return LLVOAvatarDictionary::getInstance()->getTexture(index)->mIsLocalTexture; + return LLAvatarAppearanceDictionary::getInstance()->getTexture(index)->mIsLocalTexture; } // static BOOL LLVOAvatar::isIndexBakedTexture(ETextureIndex index) { if (index < 0 || index >= TEX_NUM_INDICES) return false; - return LLVOAvatarDictionary::getInstance()->getTexture(index)->mIsBakedTexture; + return LLAvatarAppearanceDictionary::getInstance()->getTexture(index)->mIsBakedTexture; } const std::string LLVOAvatar::getBakedStatusForPrintout() const { std::string line; - for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); - iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); + for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); + iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); ++iter) { const ETextureIndex index = iter->first; - const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; + const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second; if (texture_dict->mIsBakedTexture) { line += texture_dict->mName; @@ -8618,7 +7969,7 @@ F32 calc_bouncy_animation(F32 x) } //virtual -BOOL LLVOAvatar::isTextureDefined(LLVOAvatarDefines::ETextureIndex te, U32 index ) const +BOOL LLVOAvatar::isTextureDefined(LLAvatarAppearanceDefines::ETextureIndex te, U32 index ) const { if (isIndexLocalTexture(te)) { @@ -8636,7 +7987,7 @@ BOOL LLVOAvatar::isTextureDefined(LLVOAvatarDefines::ETextureIndex te, U32 index } //virtual -BOOL LLVOAvatar::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index) const +BOOL LLVOAvatar::isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const { if (isIndexLocalTexture(type)) { @@ -8652,9 +8003,11 @@ BOOL LLVOAvatar::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 ind } //virtual -BOOL LLVOAvatar::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const +BOOL LLVOAvatar::isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerWearable *wearable) const { // non-self avatars don't have wearables return FALSE; } + + diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 9f1f209920..e7f249be69 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -25,8 +25,8 @@ * $/LicenseInfo$ */ -#ifndef LL_LLVOAVATAR_H -#define LL_LLVOAVATAR_H +#ifndef LL_VOAVATAR_H +#define LL_VOAVATAR_H #include <map> #include <deque> @@ -36,6 +36,7 @@ #include <boost/signals2.hpp> #include "imageids.h" // IMG_INVISIBLE +#include "llavatarappearance.h" #include "llchat.h" #include "lldrawpoolalpha.h" #include "llviewerobject.h" @@ -44,9 +45,10 @@ #include "llviewerjointmesh.h" #include "llviewerjointattachment.h" #include "llrendertarget.h" -#include "llvoavatardefines.h" +#include "llavatarappearancedefines.h" #include "lltexglobalcolor.h" #include "lldriverparam.h" +#include "llviewertexlayer.h" #include "material_codes.h" // LL_MCODE_END #include "llviewerstats.h" @@ -62,13 +64,15 @@ extern const LLUUID ANIM_AGENT_PELVIS_FIX; extern const LLUUID ANIM_AGENT_TARGET; extern const LLUUID ANIM_AGENT_WALK_ADJUST; -class LLTexLayerSet; +class LLViewerWearable; class LLVoiceVisualizer; class LLHUDNameTag; class LLHUDEffectSpiral; class LLTexGlobalColor; struct LLVOAvatarBoneInfo; struct LLVOAvatarChildJoint; +//class LLViewerJoint; +struct LLAppearanceMessageContents; struct LLVOAvatarSkeletonInfo; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -76,17 +80,14 @@ struct LLVOAvatarSkeletonInfo; // //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLVOAvatar : + public LLAvatarAppearance, public LLViewerObject, - public LLCharacter, public boost::signals2::trackable { LOG_CLASS(LLVOAvatar); public: friend class LLVOAvatarSelf; -protected: - struct LLVOAvatarXmlInfo; - struct LLMaskedMorph; /******************************************************************************** ** ** @@ -111,9 +112,6 @@ public: virtual void initInstance(); // Called after construction to initialize the class. protected: virtual ~LLVOAvatar(); - BOOL loadSkeletonNode(); - BOOL loadMeshNodes(); - virtual BOOL loadLayersets(); /** Initialization ** ** @@ -128,31 +126,43 @@ protected: // LLViewerObject interface and related //-------------------------------------------------------------------- public: - virtual void updateGL(); - virtual LLVOAvatar* asAvatar(); + /*virtual*/ void updateGL(); + /*virtual*/ LLVOAvatar* asAvatar(); virtual U32 processUpdateMessage(LLMessageSystem *mesgsys, void **user_data, U32 block_num, const EObjectUpdateType update_type, LLDataPacker *dp); virtual void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); - virtual BOOL updateLOD(); + /*virtual*/ BOOL updateLOD(); BOOL updateJointLODs(); void updateLODRiggedAttachments( void ); - virtual BOOL isActive() const; // Whether this object needs to do an idleUpdate. - virtual void updateTextures(); - virtual S32 setTETexture(const U8 te, const LLUUID& uuid); // If setting a baked texture, need to request it from a non-local sim. - virtual void onShift(const LLVector4a& shift_vector); - virtual U32 getPartitionType() const; - virtual const LLVector3 getRenderPosition() const; - virtual void updateDrawable(BOOL force_damped); - virtual LLDrawable* createDrawable(LLPipeline *pipeline); - virtual BOOL updateGeometry(LLDrawable *drawable); - virtual void setPixelAreaAndAngle(LLAgent &agent); - virtual void updateRegion(LLViewerRegion *regionp); - virtual void updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax); - virtual void getSpatialExtents(LLVector4a& newMin, LLVector4a& newMax); - virtual BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, + /*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate. + S32 totalTextureMemForUUIDS(std::set<LLUUID>& ids); + bool allTexturesCompletelyDownloaded(std::set<LLUUID>& ids) const; + bool allLocalTexturesCompletelyDownloaded() const; + bool allBakedTexturesCompletelyDownloaded() const; + void bakedTextureOriginCounts(S32 &sb_count, S32 &host_count, + S32 &both_count, S32 &neither_count); + std::string bakedTextureOriginInfo(); + void collectLocalTextureUUIDs(std::set<LLUUID>& ids) const; + void collectBakedTextureUUIDs(std::set<LLUUID>& ids) const; + void collectTextureUUIDs(std::set<LLUUID>& ids); + void releaseOldTextures(); + /*virtual*/ void updateTextures(); + LLViewerFetchedTexture* getBakedTextureImage(const U8 te, const LLUUID& uuid); + /*virtual*/ S32 setTETexture(const U8 te, const LLUUID& uuid); // If setting a baked texture, need to request it from a non-local sim. + /*virtual*/ void onShift(const LLVector4a& shift_vector); + /*virtual*/ U32 getPartitionType() const; + /*virtual*/ const LLVector3 getRenderPosition() const; + /*virtual*/ void updateDrawable(BOOL force_damped); + /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline); + /*virtual*/ BOOL updateGeometry(LLDrawable *drawable); + /*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); + /*virtual*/ void updateRegion(LLViewerRegion *regionp); + /*virtual*/ void updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax); + /*virtual*/ void getSpatialExtents(LLVector4a& newMin, LLVector4a& newMax); + /*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, S32 face = -1, // which face to check, -1 = ALL_SIDES BOOL pick_transparent = FALSE, S32* face_hit = NULL, // which face was hit @@ -173,16 +183,14 @@ public: // LLCharacter interface and related //-------------------------------------------------------------------- public: - virtual LLVector3 getCharacterPosition(); - virtual LLQuaternion getCharacterRotation(); - virtual LLVector3 getCharacterVelocity(); - virtual LLVector3 getCharacterAngularVelocity(); - virtual LLJoint* getCharacterJoint(U32 num); - virtual BOOL allocateCharacterJoints(U32 num); - - virtual LLUUID remapMotionID(const LLUUID& id); - virtual BOOL startMotion(const LLUUID& id, F32 time_offset = 0.f); - virtual BOOL stopMotion(const LLUUID& id, BOOL stop_immediate = FALSE); + /*virtual*/ LLVector3 getCharacterPosition(); + /*virtual*/ LLQuaternion getCharacterRotation(); + /*virtual*/ LLVector3 getCharacterVelocity(); + /*virtual*/ LLVector3 getCharacterAngularVelocity(); + + /*virtual*/ LLUUID remapMotionID(const LLUUID& id); + /*virtual*/ BOOL startMotion(const LLUUID& id, F32 time_offset = 0.f); + /*virtual*/ BOOL stopMotion(const LLUUID& id, BOOL stop_immediate = FALSE); virtual void stopMotionFromSource(const LLUUID& source_id); virtual void requestStopMotion(LLMotion* motion); LLMotion* findMotion(const LLUUID& id) const; @@ -190,25 +198,18 @@ public: void dumpAnimationState(); virtual LLJoint* getJoint(const std::string &name); - virtual LLJoint* getRootJoint() { return &mRoot; } void resetJointPositions( void ); void resetJointPositionsToDefault( void ); void resetSpecificJointPosition( const std::string& name ); - virtual const char* getAnimationPrefix() { return "avatar"; } - virtual const LLUUID& getID() const; - virtual LLVector3 getVolumePos(S32 joint_index, LLVector3& volume_offset); - virtual LLJoint* findCollisionVolume(U32 volume_id); - virtual S32 getCollisionVolumeID(std::string &name); - virtual void addDebugText(const std::string& text); - virtual F32 getTimeDilation(); - virtual void getGround(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm); - virtual F32 getPixelArea() const; - virtual LLPolyMesh* getHeadMesh(); - virtual LLPolyMesh* getUpperBodyMesh(); - virtual LLVector3d getPosGlobalFromAgent(const LLVector3 &position); - virtual LLVector3 getPosAgentFromGlobal(const LLVector3d &position); + /*virtual*/ const LLUUID& getID() const; + /*virtual*/ void addDebugText(const std::string& text); + /*virtual*/ F32 getTimeDilation(); + /*virtual*/ void getGround(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm); + /*virtual*/ F32 getPixelArea() const; + /*virtual*/ LLVector3d getPosGlobalFromAgent(const LLVector3 &position); + /*virtual*/ LLVector3 getPosAgentFromGlobal(const LLVector3d &position); virtual void updateVisualParams(); @@ -223,14 +224,10 @@ public: public: virtual bool isSelf() const { return false; } // True if this avatar is for this viewer's agent - bool isBuilt() const { return mIsBuilt; } private: //aligned members LL_ALIGN_16(LLVector4a mImpostorExtents[2]); -private: - BOOL mSupportsAlphaLayers; // For backwards compatibility, TRUE for 1.23+ clients - //-------------------------------------------------------------------- // Updates //-------------------------------------------------------------------- @@ -293,17 +290,21 @@ public: virtual BOOL getIsCloud() const; BOOL isFullyTextured() const; BOOL hasGray() const; - S32 getRezzedStatus() const; // 0 = cloud, 1 = gray, 2 = fully textured. + S32 getRezzedStatus() const; // 0 = cloud, 1 = gray, 2 = textured, 3 = textured and fully downloaded. void updateRezzedStatusTimers(); S32 mLastRezzedStatus; - LLViewerStats::PhaseMap& getPhases() - { - return mPhases; - } + + void startPhase(const std::string& phase_name); + void stopPhase(const std::string& phase_name, bool err_check = true); + void clearPhases(); + void logPendingPhases(); + static void logPendingPhasesAllAvatars(); + void logMetricsTimerRecord(const std::string& phase_name, F32 elapsed, bool completed); protected: + LLViewerStats::PhaseMap& getPhases() { return mPhases; } BOOL updateIsFullyLoaded(); BOOL processFullyLoadedChange(bool loading); void updateRuthTimer(bool loading); @@ -318,24 +319,6 @@ private: LLFrameTimer mFullyLoadedTimer; LLFrameTimer mRuthTimer; -public: - class ScopedPhaseSetter - { - public: - ScopedPhaseSetter(LLVOAvatar *avatarp, std::string phase_name): - mAvatar(avatarp), mPhaseName(phase_name) - { - if (mAvatar) { mAvatar->getPhases().startPhase(mPhaseName); } - } - ~ScopedPhaseSetter() - { - if (mAvatar) { mAvatar->getPhases().stopPhase(mPhaseName); } - } - private: - std::string mPhaseName; - LLVOAvatar* mAvatar; - }; - private: LLViewerStats::PhaseMap mPhases; @@ -345,20 +328,25 @@ protected: /** State ** ** *******************************************************************************/ - /******************************************************************************** ** ** ** SKELETON **/ +protected: + /*virtual*/ LLAvatarJoint* createAvatarJoint(); // Returns LLViewerJoint + /*virtual*/ LLAvatarJoint* createAvatarJoint(S32 joint_num); // Returns LLViewerJoint + /*virtual*/ LLAvatarJointMesh* createAvatarJointMesh(); // Returns LLViewerJointMesh public: void updateHeadOffset(); - F32 getPelvisToFoot() const { return mPelvisToFoot; } void setPelvisOffset( bool hasOffset, const LLVector3& translation, F32 offset ) ; bool hasPelvisOffset( void ) { return mHasPelvisOffset; } void postPelvisSetRecalc( void ); void setPelvisOffset( F32 pelvixFixupAmount ); + /*virtual*/ BOOL loadSkeletonNode(); + /*virtual*/ void buildCharacter(); + bool mHasPelvisOffset; LLVector3 mPelvisOffset; F32 mLastPelvisToFoot; @@ -367,62 +355,8 @@ public: LLVector3 mCurRootToHeadOffset; LLVector3 mTargetRootToHeadOffset; - LLVector3 mHeadOffset; // current head position - LLViewerJoint mRoot; - - typedef std::map<std::string, LLJoint*> joint_map_t; - joint_map_t mJointMap; - -protected: - static BOOL parseSkeletonFile(const std::string& filename); - void buildCharacter(); - virtual BOOL loadAvatar(); - - BOOL setupBone(const LLVOAvatarChildJoint& info, LLViewerJoint* parent, S32 ¤t_volume_num, S32 ¤t_joint_num); - BOOL buildSkeleton(const LLVOAvatarSkeletonInfo *info); -private: - BOOL mIsBuilt; // state of deferred character building - S32 mNumJoints; - LLViewerJoint* mSkeleton; - - //-------------------------------------------------------------------- - // Pelvis height adjustment members. - //-------------------------------------------------------------------- -public: - LLVector3 mBodySize; S32 mLastSkeletonSerialNum; -private: - F32 mPelvisToFoot; - //-------------------------------------------------------------------- - // Cached pointers to well known joints - //-------------------------------------------------------------------- -public: - LLViewerJoint* mPelvisp; - LLViewerJoint* mTorsop; - LLViewerJoint* mChestp; - LLViewerJoint* mNeckp; - LLViewerJoint* mHeadp; - LLViewerJoint* mSkullp; - LLViewerJoint* mEyeLeftp; - LLViewerJoint* mEyeRightp; - LLViewerJoint* mHipLeftp; - LLViewerJoint* mHipRightp; - LLViewerJoint* mKneeLeftp; - LLViewerJoint* mKneeRightp; - LLViewerJoint* mAnkleLeftp; - LLViewerJoint* mAnkleRightp; - LLViewerJoint* mFootLeftp; - LLViewerJoint* mFootRightp; - LLViewerJoint* mWristLeftp; - LLViewerJoint* mWristRightp; - - //-------------------------------------------------------------------- - // XML parse tree - //-------------------------------------------------------------------- -private: - static LLXmlTree sXMLTree; // avatar config file - static LLXMLNodePtr sSkeletonXMLTree; // avatar skeleton file /** Skeleton ** ** @@ -445,7 +379,6 @@ public: static void deleteCachedImages(bool clearAll=true); static void destroyGL(); static void restoreGL(); - BOOL mIsDummy; // for special views S32 mSpecialRenderMode; // special lighting U32 mAttachmentGeometryBytes; //number of bytes in attached geometry F32 mAttachmentSurfaceArea; //estimated surface area of attachments @@ -463,9 +396,15 @@ private: // Morph masks //-------------------------------------------------------------------- public: - BOOL morphMaskNeedsUpdate(LLVOAvatarDefines::EBakedTextureIndex index = LLVOAvatarDefines::BAKED_NUM_INDICES); - void addMaskedMorph(LLVOAvatarDefines::EBakedTextureIndex index, LLPolyMorphTarget* morph_target, BOOL invert, std::string layer); - void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components, LLVOAvatarDefines::EBakedTextureIndex index = LLVOAvatarDefines::BAKED_NUM_INDICES); + /*virtual*/ void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components, LLAvatarAppearanceDefines::EBakedTextureIndex index = LLAvatarAppearanceDefines::BAKED_NUM_INDICES); + BOOL morphMaskNeedsUpdate(LLAvatarAppearanceDefines::EBakedTextureIndex index = LLAvatarAppearanceDefines::BAKED_NUM_INDICES); + + + //-------------------------------------------------------------------- + // Global colors + //-------------------------------------------------------------------- +public: + /*virtual*/void onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake); //-------------------------------------------------------------------- // Visibility @@ -548,10 +487,10 @@ private: // Constants //-------------------------------------------------------------------- public: - virtual LLViewerTexture::EBoostLevel getAvatarBoostLevel() const { return LLViewerTexture::BOOST_AVATAR; } - virtual LLViewerTexture::EBoostLevel getAvatarBakedBoostLevel() const { return LLViewerTexture::BOOST_AVATAR_BAKED; } + virtual LLViewerTexture::EBoostLevel getAvatarBoostLevel() const { return LLGLTexture::BOOST_AVATAR; } + virtual LLViewerTexture::EBoostLevel getAvatarBakedBoostLevel() const { return LLGLTexture::BOOST_AVATAR_BAKED; } virtual S32 getTexImageSize() const; - virtual S32 getTexImageArea() const { return getTexImageSize()*getTexImageSize(); } + /*virtual*/ S32 getTexImageArea() const { return getTexImageSize()*getTexImageSize(); } /** Rendering ** ** @@ -566,9 +505,9 @@ public: // Loading status //-------------------------------------------------------------------- public: - virtual BOOL isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const; - virtual BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const; - virtual BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const; + virtual BOOL isTextureDefined(LLAvatarAppearanceDefines::ETextureIndex type, U32 index = 0) const; + virtual BOOL isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, U32 index = 0) const; + virtual BOOL isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerWearable *wearable) const; BOOL isFullyBaked(); static BOOL areAllNearbyInstancesBaked(S32& grey_avatars); @@ -579,6 +518,7 @@ public: // Baked textures //-------------------------------------------------------------------- public: + /*virtual*/ LLTexLayerSet* createTexLayerSet(); // Return LLViewerTexLayerSet void releaseComponentTextures(); // ! BACKWARDS COMPATIBILITY ! protected: static void onBakedTextureMasksLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); @@ -586,32 +526,20 @@ protected: static void onBakedTextureLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); virtual void removeMissingBakedTextures(); void useBakedTexture(const LLUUID& id); + LLViewerTexLayerSet* getTexLayerSet(const U32 index) const { return dynamic_cast<LLViewerTexLayerSet*>(mBakedTextureDatas[index].mTexLayerSet); } + - typedef std::deque<LLMaskedMorph *> morph_list_t; - struct BakedTextureData - { - LLUUID mLastTextureIndex; - LLTexLayerSet* mTexLayerSet; // Only exists for self - bool mIsLoaded; - bool mIsUsed; - LLVOAvatarDefines::ETextureIndex mTextureIndex; - U32 mMaskTexName; - // Stores pointers to the joint meshes that this baked texture deals with - std::vector< LLViewerJointMesh * > mMeshes; // std::vector<LLViewerJointMesh> mJoints[i]->mMeshParts - morph_list_t mMaskedMorphs; - }; - typedef std::vector<BakedTextureData> bakedtexturedata_vec_t; - bakedtexturedata_vec_t mBakedTextureDatas; LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ; BOOL mLoadedCallbacksPaused; + std::set<LLUUID> mTextureIDs; //-------------------------------------------------------------------- // Local Textures //-------------------------------------------------------------------- protected: - virtual void setLocalTexture(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index = 0); - virtual void addLocalTextureStats(LLVOAvatarDefines::ETextureIndex type, LLViewerFetchedTexture* imagep, F32 texel_area_ratio, BOOL rendered, BOOL covered_by_baked, U32 index = 0); + virtual void setLocalTexture(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index = 0); + virtual void addLocalTextureStats(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerFetchedTexture* imagep, F32 texel_area_ratio, BOOL rendered, BOOL covered_by_baked); // MULTI-WEARABLE: make self-only? - virtual void setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index = 0); + virtual void setBakedReady(LLAvatarAppearanceDefines::ETextureIndex type, BOOL baked_version_exists, U32 index = 0); //-------------------------------------------------------------------- // Texture accessors @@ -619,6 +547,7 @@ protected: private: virtual void setImage(const U8 te, LLViewerTexture *imagep, const U32 index); virtual LLViewerTexture* getImage(const U8 te, const U32 index) const; + const std::string getImageURL(const U8 te, const LLUUID &uuid); virtual const LLTextureEntry* getTexEntry(const U8 te_num) const; virtual void setTexEntry(const U8 index, const LLTextureEntry &te); @@ -645,13 +574,11 @@ public: // Static texture/mesh/baked dictionary //-------------------------------------------------------------------- public: - static BOOL isIndexLocalTexture(LLVOAvatarDefines::ETextureIndex i); - static BOOL isIndexBakedTexture(LLVOAvatarDefines::ETextureIndex i); + static BOOL isIndexLocalTexture(LLAvatarAppearanceDefines::ETextureIndex i); + static BOOL isIndexBakedTexture(LLAvatarAppearanceDefines::ETextureIndex i); private: - static const LLVOAvatarDefines::LLVOAvatarDictionary *getDictionary() { return sAvatarDictionary; } - static LLVOAvatarDefines::LLVOAvatarDictionary* sAvatarDictionary; - static LLVOAvatarSkeletonInfo* sAvatarSkeletonInfo; - static LLVOAvatarXmlInfo* sAvatarXmlInfo; + static const LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary *getDictionary() { return sAvatarDictionary; } + static LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary* sAvatarDictionary; //-------------------------------------------------------------------- // Messaging @@ -672,22 +599,20 @@ private: **/ public: - void updateMeshTextures(); + void debugColorizeSubMeshes(U32 i, const LLColor4& color); + virtual void updateMeshTextures(); void updateSexDependentLayerSets(BOOL upload_bake); - void dirtyMesh(); // Dirty the avatar mesh + virtual void dirtyMesh(); // Dirty the avatar mesh void updateMeshData(); protected: void releaseMeshData(); virtual void restoreMeshData(); private: - void dirtyMesh(S32 priority); // Dirty the avatar mesh, with priority + virtual void dirtyMesh(S32 priority); // Dirty the avatar mesh, with priority + LLViewerJoint* getViewerJoint(S32 idx); S32 mDirtyMesh; // 0 -- not dirty, 1 -- morphed, 2 -- LOD BOOL mMeshTexturesDirty; - typedef std::multimap<std::string, LLPolyMesh*> polymesh_map_t; - polymesh_map_t mMeshes; - std::vector<LLViewerJoint *> mMeshLOD; - //-------------------------------------------------------------------- // Destroy invisible mesh //-------------------------------------------------------------------- @@ -705,38 +630,42 @@ protected: **/ public: + void parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMessageContents& msg); void processAvatarAppearance(LLMessageSystem* mesgsys); void hideSkirt(); void startAppearanceAnimation(); + /*virtual*/ void bodySizeChanged(); //-------------------------------------------------------------------- // Appearance morphing //-------------------------------------------------------------------- public: BOOL getIsAppearanceAnimating() const { return mAppearanceAnimating; } + + // True if we are computing our appearance via local compositing + // instead of baked textures, as for example during wearable + // editing or when waiting for a subsequent server rebake. + /*virtual*/ BOOL isUsingLocalAppearance() const { return mUseLocalAppearance; } + + // True if this avatar should fetch its baked textures via the new + // appearance mechanism. + BOOL isUsingServerBakes() const; + void setIsUsingServerBakes(BOOL newval); + + + // True if we are currently in appearance editing mode. Often but + // not always the same as isUsingLocalAppearance(). + /*virtual*/ BOOL isEditingAppearance() const { return mIsEditingAppearance; } + + // FIXME review isUsingLocalAppearance uses, some should be isEditing instead. + private: BOOL mAppearanceAnimating; LLFrameTimer mAppearanceMorphTimer; F32 mLastAppearanceBlendTime; - - //-------------------------------------------------------------------- - // Clothing colors (convenience functions to access visual parameters) - //-------------------------------------------------------------------- -public: - void setClothesColor(LLVOAvatarDefines::ETextureIndex te, const LLColor4& new_color, BOOL upload_bake); - LLColor4 getClothesColor(LLVOAvatarDefines::ETextureIndex te); - static BOOL teToColorParams(LLVOAvatarDefines::ETextureIndex te, U32 *param_name); - - //-------------------------------------------------------------------- - // Global colors - //-------------------------------------------------------------------- -public: - LLColor4 getGlobalColor(const std::string& color_name ) const; - void onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake); -private: - LLTexGlobalColor* mTexSkinColor; - LLTexGlobalColor* mTexHairColor; - LLTexGlobalColor* mTexEyeColor; + BOOL mIsEditingAppearance; // flag for if we're actively in appearance editing mode + BOOL mUseLocalAppearance; // flag for if we're using a local composite + BOOL mUseServerBakes; // flag for if baked textures should be fetched from baking service (false if they're temporary uploads) //-------------------------------------------------------------------- // Visibility @@ -746,7 +675,6 @@ public: void setVisibilityRank(U32 rank); U32 getVisibilityRank() const { return mVisibilityRank; } // unused static S32 sNumVisibleAvatars; // Number of instances of this class - static LLColor4 getDummyColor(); /** Appearance ** ** *******************************************************************************/ @@ -756,9 +684,6 @@ public: ** WEARABLES **/ -public: - virtual BOOL isWearingWearableType(LLWearableType::EType type ) const; - //-------------------------------------------------------------------- // Attachments //-------------------------------------------------------------------- @@ -768,6 +693,7 @@ public: virtual BOOL detachObject(LLViewerObject *viewer_object); void cleanupAttachedMesh( LLViewerObject* pVO ); static LLVOAvatar* findAvatarFromAttachment(LLViewerObject* obj); + /*virtual*/ BOOL isWearingWearableType(LLWearableType::EType type ) const; protected: LLViewerJointAttachment* getTargetAttachmentPoint(LLViewerObject* viewer_object); void lazyAttach(); @@ -869,15 +795,6 @@ private: F32 mSpeed; // misc. animation repeated state //-------------------------------------------------------------------- - // Collision volumes - //-------------------------------------------------------------------- -public: - S32 mNumCollisionVolumes; - LLViewerJointCollisionVolume* mCollisionVolumes; -protected: - BOOL allocateCollisionVolumes(U32 num); - - //-------------------------------------------------------------------- // Dimensions //-------------------------------------------------------------------- public: @@ -887,7 +804,6 @@ public: void resolveRayCollisionAgent(const LLVector3d start_pt, const LLVector3d end_pt, LLVector3d &out_pos, LLVector3 &out_norm); void slamPosition(); // Slam position to transmitted position (for teleport); protected: - void computeBodySize(); //-------------------------------------------------------------------- // Material being stepped on @@ -907,9 +823,9 @@ private: **/ public: - virtual BOOL setParent(LLViewerObject* parent); - virtual void addChild(LLViewerObject *childp); - virtual void removeChild(LLViewerObject *childp); + /*virtual*/ BOOL setParent(LLViewerObject* parent); + /*virtual*/ void addChild(LLViewerObject *childp); + /*virtual*/ void removeChild(LLViewerObject *childp); //-------------------------------------------------------------------- // Sitting @@ -1013,7 +929,9 @@ private: // General //-------------------------------------------------------------------- public: - static void dumpArchetypeXML(void*); + void dumpArchetypeXML(const std::string& prefix, bool group_by_wearables = false); + void dumpAppearanceMsgParams( const std::string& dump_prefix, + const LLAppearanceMessageContents& contents); static void dumpBakedStatus(); const std::string getBakedStatusForPrintout() const; void dumpAvatarTEs(const std::string& context) const; @@ -1030,6 +948,7 @@ private: F32 mMaxPixelArea; F32 mAdjustedPixelArea; std::string mDebugText; + std::string mBakedTextureDebugText; //-------------------------------------------------------------------- @@ -1043,6 +962,17 @@ protected: LLFrameTimer mRuthDebugTimer; // For tracking how long it takes for av to rez LLFrameTimer mDebugExistenceTimer; // Debugging for how long the avatar has been in memory. + //-------------------------------------------------------------------- + // COF monitoring + //-------------------------------------------------------------------- + +public: + // COF version of last viewer-initiated appearance update request. For non-self avs, this will remain at default. + S32 mLastUpdateRequestCOFVersion; + + // COF version of last appearance message received for this av. + S32 mLastUpdateReceivedCOFVersion; + /** Diagnostics ** ** *******************************************************************************/ @@ -1054,105 +984,6 @@ protected: protected: // Shared with LLVOAvatarSelf - struct LLVOAvatarXmlInfo - { - LLVOAvatarXmlInfo(); - ~LLVOAvatarXmlInfo(); - - BOOL parseXmlSkeletonNode(LLXmlTreeNode* root); - BOOL parseXmlMeshNodes(LLXmlTreeNode* root); - BOOL parseXmlColorNodes(LLXmlTreeNode* root); - BOOL parseXmlLayerNodes(LLXmlTreeNode* root); - BOOL parseXmlDriverNodes(LLXmlTreeNode* root); - BOOL parseXmlMorphNodes(LLXmlTreeNode* root); - - struct LLVOAvatarMeshInfo - { - typedef std::pair<LLPolyMorphTargetInfo*,BOOL> morph_info_pair_t; - typedef std::vector<morph_info_pair_t> morph_info_list_t; - - LLVOAvatarMeshInfo() : mLOD(0), mMinPixelArea(.1f) {} - ~LLVOAvatarMeshInfo() - { - morph_info_list_t::iterator iter; - for (iter = mPolyMorphTargetInfoList.begin(); iter != mPolyMorphTargetInfoList.end(); iter++) - { - delete iter->first; - } - mPolyMorphTargetInfoList.clear(); - } - - std::string mType; - S32 mLOD; - std::string mMeshFileName; - std::string mReferenceMeshName; - F32 mMinPixelArea; - morph_info_list_t mPolyMorphTargetInfoList; - }; - typedef std::vector<LLVOAvatarMeshInfo*> mesh_info_list_t; - mesh_info_list_t mMeshInfoList; - - typedef std::vector<LLPolySkeletalDistortionInfo*> skeletal_distortion_info_list_t; - skeletal_distortion_info_list_t mSkeletalDistortionInfoList; - - struct LLVOAvatarAttachmentInfo - { - LLVOAvatarAttachmentInfo() - : mGroup(-1), mAttachmentID(-1), mPieMenuSlice(-1), mVisibleFirstPerson(FALSE), - mIsHUDAttachment(FALSE), mHasPosition(FALSE), mHasRotation(FALSE) {} - std::string mName; - std::string mJointName; - LLVector3 mPosition; - LLVector3 mRotationEuler; - S32 mGroup; - S32 mAttachmentID; - S32 mPieMenuSlice; - BOOL mVisibleFirstPerson; - BOOL mIsHUDAttachment; - BOOL mHasPosition; - BOOL mHasRotation; - }; - typedef std::vector<LLVOAvatarAttachmentInfo*> attachment_info_list_t; - attachment_info_list_t mAttachmentInfoList; - - LLTexGlobalColorInfo *mTexSkinColorInfo; - LLTexGlobalColorInfo *mTexHairColorInfo; - LLTexGlobalColorInfo *mTexEyeColorInfo; - - typedef std::vector<LLTexLayerSetInfo*> layer_info_list_t; - layer_info_list_t mLayerInfoList; - - typedef std::vector<LLDriverParamInfo*> driver_info_list_t; - driver_info_list_t mDriverInfoList; - - struct LLVOAvatarMorphInfo - { - LLVOAvatarMorphInfo() - : mInvert(FALSE) {} - std::string mName; - std::string mRegion; - std::string mLayer; - BOOL mInvert; - }; - - typedef std::vector<LLVOAvatarMorphInfo*> morph_info_list_t; - morph_info_list_t mMorphMaskInfoList; - }; - - struct LLMaskedMorph - { - LLMaskedMorph(LLPolyMorphTarget *morph_target, BOOL invert, std::string layer) : - mMorphTarget(morph_target), - mInvert(invert), - mLayer(layer) - { - morph_target->addPendingMorphMask(); - } - - LLPolyMorphTarget *mMorphTarget; - BOOL mInvert; - std::string mLayer; - }; /** Support classes ** ** @@ -1162,4 +993,9 @@ protected: // Shared with LLVOAvatarSelf extern const F32 SELF_ADDITIONAL_PRI; extern const S32 MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL; -#endif // LL_VO_AVATAR_H +std::string get_sequential_numbered_file_name(const std::string& prefix, + const std::string& suffix); +void dump_visual_param(apr_file_t* file, LLVisualParam* viewer_param, F32 value); + +#endif // LL_VOAVATAR_H + diff --git a/indra/newview/llvoavatardefines.cpp b/indra/newview/llvoavatardefines.cpp deleted file mode 100644 index 1ed4e3b61c..0000000000 --- a/indra/newview/llvoavatardefines.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/** - * @file llvoavatar.cpp - * @brief Implementation of LLVOAvatar class which is a derivation fo LLViewerObject - * - * $LicenseInfo:firstyear=2001&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$ - */ - -#include "llviewerprecompiledheaders.h" -#include "llvoavatardefines.h" -#include "llviewercontrol.h" // gSavedSettings - -const S32 LLVOAvatarDefines::SCRATCH_TEX_WIDTH = 512; -const S32 LLVOAvatarDefines::SCRATCH_TEX_HEIGHT = 512; -const S32 LLVOAvatarDefines::IMPOSTOR_PERIOD = 2; - -using namespace LLVOAvatarDefines; - -/********************************************************************************* - * Edit this function to add/remove/change textures and mesh definitions for avatars. - */ - -LLVOAvatarDictionary::Textures::Textures() -{ - addEntry(TEX_HEAD_BODYPAINT, new TextureEntry("head_bodypaint", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_SKIN)); - addEntry(TEX_UPPER_SHIRT, new TextureEntry("upper_shirt", TRUE, BAKED_NUM_INDICES, "UIImgDefaultShirtUUID", LLWearableType::WT_SHIRT)); - addEntry(TEX_LOWER_PANTS, new TextureEntry("lower_pants", TRUE, BAKED_NUM_INDICES, "UIImgDefaultPantsUUID", LLWearableType::WT_PANTS)); - addEntry(TEX_EYES_IRIS, new TextureEntry("eyes_iris", TRUE, BAKED_NUM_INDICES, "UIImgDefaultEyesUUID", LLWearableType::WT_EYES)); - addEntry(TEX_HAIR, new TextureEntry("hair_grain", TRUE, BAKED_NUM_INDICES, "UIImgDefaultHairUUID", LLWearableType::WT_HAIR)); - addEntry(TEX_UPPER_BODYPAINT, new TextureEntry("upper_bodypaint", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_SKIN)); - addEntry(TEX_LOWER_BODYPAINT, new TextureEntry("lower_bodypaint", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_SKIN)); - addEntry(TEX_LOWER_SHOES, new TextureEntry("lower_shoes", TRUE, BAKED_NUM_INDICES, "UIImgDefaultShoesUUID", LLWearableType::WT_SHOES)); - addEntry(TEX_LOWER_SOCKS, new TextureEntry("lower_socks", TRUE, BAKED_NUM_INDICES, "UIImgDefaultSocksUUID", LLWearableType::WT_SOCKS)); - addEntry(TEX_UPPER_JACKET, new TextureEntry("upper_jacket", TRUE, BAKED_NUM_INDICES, "UIImgDefaultJacketUUID", LLWearableType::WT_JACKET)); - addEntry(TEX_LOWER_JACKET, new TextureEntry("lower_jacket", TRUE, BAKED_NUM_INDICES, "UIImgDefaultJacketUUID", LLWearableType::WT_JACKET)); - addEntry(TEX_UPPER_GLOVES, new TextureEntry("upper_gloves", TRUE, BAKED_NUM_INDICES, "UIImgDefaultGlovesUUID", LLWearableType::WT_GLOVES)); - addEntry(TEX_UPPER_UNDERSHIRT, new TextureEntry("upper_undershirt", TRUE, BAKED_NUM_INDICES, "UIImgDefaultUnderwearUUID", LLWearableType::WT_UNDERSHIRT)); - addEntry(TEX_LOWER_UNDERPANTS, new TextureEntry("lower_underpants", TRUE, BAKED_NUM_INDICES, "UIImgDefaultUnderwearUUID", LLWearableType::WT_UNDERPANTS)); - addEntry(TEX_SKIRT, new TextureEntry("skirt", TRUE, BAKED_NUM_INDICES, "UIImgDefaultSkirtUUID", LLWearableType::WT_SKIRT)); - - addEntry(TEX_LOWER_ALPHA, new TextureEntry("lower_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", LLWearableType::WT_ALPHA)); - addEntry(TEX_UPPER_ALPHA, new TextureEntry("upper_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", LLWearableType::WT_ALPHA)); - addEntry(TEX_HEAD_ALPHA, new TextureEntry("head_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", LLWearableType::WT_ALPHA)); - addEntry(TEX_EYES_ALPHA, new TextureEntry("eyes_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", LLWearableType::WT_ALPHA)); - addEntry(TEX_HAIR_ALPHA, new TextureEntry("hair_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", LLWearableType::WT_ALPHA)); - - addEntry(TEX_HEAD_TATTOO, new TextureEntry("head_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_TATTOO)); - addEntry(TEX_UPPER_TATTOO, new TextureEntry("upper_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_TATTOO)); - addEntry(TEX_LOWER_TATTOO, new TextureEntry("lower_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_TATTOO)); - - addEntry(TEX_HEAD_BAKED, new TextureEntry("head-baked", FALSE, BAKED_HEAD)); - addEntry(TEX_UPPER_BAKED, new TextureEntry("upper-baked", FALSE, BAKED_UPPER)); - addEntry(TEX_LOWER_BAKED, new TextureEntry("lower-baked", FALSE, BAKED_LOWER)); - addEntry(TEX_EYES_BAKED, new TextureEntry("eyes-baked", FALSE, BAKED_EYES)); - addEntry(TEX_HAIR_BAKED, new TextureEntry("hair-baked", FALSE, BAKED_HAIR)); - addEntry(TEX_SKIRT_BAKED, new TextureEntry("skirt-baked", FALSE, BAKED_SKIRT)); -} - -LLVOAvatarDictionary::BakedTextures::BakedTextures() -{ - // Baked textures - addEntry(BAKED_HEAD, new BakedEntry(TEX_HEAD_BAKED, - "head", "a4b9dc38-e13b-4df9-b284-751efb0566ff", - 3, TEX_HEAD_BODYPAINT, TEX_HEAD_TATTOO, TEX_HEAD_ALPHA, - 5, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_HAIR, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA)); - - addEntry(BAKED_UPPER, new BakedEntry(TEX_UPPER_BAKED, - "upper_body", "5943ff64-d26c-4a90-a8c0-d61f56bd98d4", - 7, TEX_UPPER_SHIRT,TEX_UPPER_BODYPAINT, TEX_UPPER_JACKET, - TEX_UPPER_GLOVES, TEX_UPPER_UNDERSHIRT, TEX_UPPER_TATTOO, TEX_UPPER_ALPHA, - 8, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_SHIRT, LLWearableType::WT_JACKET, LLWearableType::WT_GLOVES, LLWearableType::WT_UNDERSHIRT, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA)); - - addEntry(BAKED_LOWER, new BakedEntry(TEX_LOWER_BAKED, - "lower_body", "2944ee70-90a7-425d-a5fb-d749c782ed7d", - 8, TEX_LOWER_PANTS,TEX_LOWER_BODYPAINT,TEX_LOWER_SHOES, TEX_LOWER_SOCKS, - TEX_LOWER_JACKET, TEX_LOWER_UNDERPANTS, TEX_LOWER_TATTOO, TEX_LOWER_ALPHA, - 9, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_PANTS, LLWearableType::WT_SHOES, LLWearableType::WT_SOCKS, LLWearableType::WT_JACKET, LLWearableType::WT_UNDERPANTS, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA)); - - addEntry(BAKED_EYES, new BakedEntry(TEX_EYES_BAKED, - "eyes", "27b1bc0f-979f-4b13-95fe-b981c2ba9788", - 2, TEX_EYES_IRIS, TEX_EYES_ALPHA, - 2, LLWearableType::WT_EYES, LLWearableType::WT_ALPHA)); - - addEntry(BAKED_SKIRT, new BakedEntry(TEX_SKIRT_BAKED, - "skirt", "03e7e8cb-1368-483b-b6f3-74850838ba63", - 1, TEX_SKIRT, - 1, LLWearableType::WT_SKIRT)); - - addEntry(BAKED_HAIR, new BakedEntry(TEX_HAIR_BAKED, - "hair", "a60e85a9-74e8-48d8-8a2d-8129f28d9b61", - 2, TEX_HAIR, TEX_HAIR_ALPHA, - 2, LLWearableType::WT_HAIR, LLWearableType::WT_ALPHA)); -} - -LLVOAvatarDictionary::Meshes::Meshes() -{ - // Meshes - addEntry(MESH_ID_HAIR, new MeshEntry(BAKED_HAIR, "hairMesh", 6, LLViewerJoint::PN_4)); - addEntry(MESH_ID_HEAD, new MeshEntry(BAKED_HEAD, "headMesh", 5, LLViewerJoint::PN_5)); - addEntry(MESH_ID_EYELASH, new MeshEntry(BAKED_HEAD, "eyelashMesh", 1, LLViewerJoint::PN_0)); // no baked mesh associated currently - addEntry(MESH_ID_UPPER_BODY, new MeshEntry(BAKED_UPPER, "upperBodyMesh", 5, LLViewerJoint::PN_1)); - addEntry(MESH_ID_LOWER_BODY, new MeshEntry(BAKED_LOWER, "lowerBodyMesh", 5, LLViewerJoint::PN_2)); - addEntry(MESH_ID_EYEBALL_LEFT, new MeshEntry(BAKED_EYES, "eyeBallLeftMesh", 2, LLViewerJoint::PN_3)); - addEntry(MESH_ID_EYEBALL_RIGHT, new MeshEntry(BAKED_EYES, "eyeBallRightMesh", 2, LLViewerJoint::PN_3)); - addEntry(MESH_ID_SKIRT, new MeshEntry(BAKED_SKIRT, "skirtMesh", 5, LLViewerJoint::PN_5)); -} - -/* - * - *********************************************************************************/ - -LLVOAvatarDictionary::LLVOAvatarDictionary() -{ - createAssociations(); -} - -//virtual -LLVOAvatarDictionary::~LLVOAvatarDictionary() -{ -} - -// Baked textures are composites of textures; for each such composited texture, -// map it to the baked texture. -void LLVOAvatarDictionary::createAssociations() -{ - for (BakedTextures::const_iterator iter = mBakedTextures.begin(); iter != mBakedTextures.end(); iter++) - { - const EBakedTextureIndex baked_index = (iter->first); - const BakedEntry *dict = (iter->second); - - // For each texture that this baked texture index affects, associate those textures - // with this baked texture index. - for (texture_vec_t::const_iterator local_texture_iter = dict->mLocalTextures.begin(); - local_texture_iter != dict->mLocalTextures.end(); - local_texture_iter++) - { - const ETextureIndex local_texture_index = (ETextureIndex) *local_texture_iter; - mTextures[local_texture_index]->mIsUsedByBakedTexture = true; - mTextures[local_texture_index]->mBakedTextureIndex = baked_index; - } - } - -} - -LLVOAvatarDictionary::TextureEntry::TextureEntry(const std::string &name, - bool is_local_texture, - EBakedTextureIndex baked_texture_index, - const std::string &default_image_name, - LLWearableType::EType wearable_type) : - LLDictionaryEntry(name), - mIsLocalTexture(is_local_texture), - mIsBakedTexture(!is_local_texture), - mIsUsedByBakedTexture(baked_texture_index != BAKED_NUM_INDICES), - mBakedTextureIndex(baked_texture_index), - mDefaultImageName(default_image_name), - mWearableType(wearable_type) -{ -} - -LLVOAvatarDictionary::MeshEntry::MeshEntry(EBakedTextureIndex baked_index, - const std::string &name, - U8 level, - LLViewerJoint::PickName pick) : - LLDictionaryEntry(name), - mBakedID(baked_index), - mLOD(level), - mPickName(pick) -{ -} -LLVOAvatarDictionary::BakedEntry::BakedEntry(ETextureIndex tex_index, - const std::string &name, - const std::string &hash_name, - U32 num_local_textures, - ... ) : - LLDictionaryEntry(name), - mWearablesHashID(LLUUID(hash_name)), - mTextureIndex(tex_index) -{ - va_list argp; - - va_start(argp, num_local_textures); - - // Read in local textures - for (U8 i=0; i < num_local_textures; i++) - { - ETextureIndex t = (ETextureIndex)va_arg(argp,int); - mLocalTextures.push_back(t); - } - - // Read in number of wearables - const U32 num_wearables = (U32)va_arg(argp,int); - // Read in wearables - for (U8 i=0; i < num_wearables; i++) - { - LLWearableType::EType t = (LLWearableType::EType)va_arg(argp,int); - mWearables.push_back(t); - } -} - -// static -ETextureIndex LLVOAvatarDictionary::bakedToLocalTextureIndex(EBakedTextureIndex index) -{ - return LLVOAvatarDictionary::getInstance()->getBakedTexture(index)->mTextureIndex; -} - -//static -EBakedTextureIndex LLVOAvatarDictionary::findBakedByRegionName(std::string name) -{ - U8 index = 0; - while (index < BAKED_NUM_INDICES) - { - const BakedEntry *be = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex) index); - if (be && be->mName.compare(name) == 0) - { - // baked texture found - return (EBakedTextureIndex) index; - } - index++; - } - // baked texture could not be found - return BAKED_NUM_INDICES; -} - -//static -const LLUUID LLVOAvatarDictionary::getDefaultTextureImageID(ETextureIndex index) -{ - const TextureEntry *texture_dict = getInstance()->getTexture(index); - const std::string &default_image_name = texture_dict->mDefaultImageName; - if (default_image_name == "") - { - return IMG_DEFAULT_AVATAR; - } - else - { - return LLUUID(gSavedSettings.getString(default_image_name)); - } -} - -// static -LLWearableType::EType LLVOAvatarDictionary::getTEWearableType(ETextureIndex index ) -{ - return getInstance()->getTexture(index)->mWearableType; -} - diff --git a/indra/newview/llvoavatardefines.h b/indra/newview/llvoavatardefines.h deleted file mode 100644 index 35bb37463a..0000000000 --- a/indra/newview/llvoavatardefines.h +++ /dev/null @@ -1,228 +0,0 @@ -/** - * @file llvoavatar.h - * @brief Declaration of LLVOAvatar class which is a derivation fo - * LLViewerObject - * - * $LicenseInfo:firstyear=2001&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$ - */ - -#ifndef LLVOAVATAR_DEFINES_H -#define LLVOAVATAR_DEFINES_H - -#include <vector> -#include "llwearable.h" -#include "llviewerjoint.h" -#include "lldictionary.h" - -namespace LLVOAvatarDefines -{ - -extern const S32 SCRATCH_TEX_WIDTH; -extern const S32 SCRATCH_TEX_HEIGHT; -extern const S32 IMPOSTOR_PERIOD; - -//-------------------------------------------------------------------- -// Enums -//-------------------------------------------------------------------- -enum ETextureIndex -{ - TEX_HEAD_BODYPAINT = 0, - TEX_UPPER_SHIRT, - TEX_LOWER_PANTS, - TEX_EYES_IRIS, - TEX_HAIR, - TEX_UPPER_BODYPAINT, - TEX_LOWER_BODYPAINT, - TEX_LOWER_SHOES, - TEX_HEAD_BAKED, // Pre-composited - TEX_UPPER_BAKED, // Pre-composited - TEX_LOWER_BAKED, // Pre-composited - TEX_EYES_BAKED, // Pre-composited - TEX_LOWER_SOCKS, - TEX_UPPER_JACKET, - TEX_LOWER_JACKET, - TEX_UPPER_GLOVES, - TEX_UPPER_UNDERSHIRT, - TEX_LOWER_UNDERPANTS, - TEX_SKIRT, - TEX_SKIRT_BAKED, // Pre-composited - TEX_HAIR_BAKED, // Pre-composited - TEX_LOWER_ALPHA, - TEX_UPPER_ALPHA, - TEX_HEAD_ALPHA, - TEX_EYES_ALPHA, - TEX_HAIR_ALPHA, - TEX_HEAD_TATTOO, - TEX_UPPER_TATTOO, - TEX_LOWER_TATTOO, - TEX_NUM_INDICES -}; - -enum EBakedTextureIndex -{ - BAKED_HEAD = 0, - BAKED_UPPER, - BAKED_LOWER, - BAKED_EYES, - BAKED_SKIRT, - BAKED_HAIR, - BAKED_NUM_INDICES -}; - -// Reference IDs for each mesh. Used as indices for vector of joints -enum EMeshIndex -{ - MESH_ID_HAIR = 0, - MESH_ID_HEAD, - MESH_ID_EYELASH, - MESH_ID_UPPER_BODY, - MESH_ID_LOWER_BODY, - MESH_ID_EYEBALL_LEFT, - MESH_ID_EYEBALL_RIGHT, - MESH_ID_SKIRT, - MESH_ID_NUM_INDICES -}; - -//-------------------------------------------------------------------- -// Vector Types -//-------------------------------------------------------------------- -typedef std::vector<ETextureIndex> texture_vec_t; -typedef std::vector<EBakedTextureIndex> bakedtexture_vec_t; -typedef std::vector<EMeshIndex> mesh_vec_t; -typedef std::vector<LLWearableType::EType> wearables_vec_t; - -//------------------------------------------------------------------------ -// LLVOAvatarDictionary -// -// Holds dictionary static entries for textures, baked textures, meshes, etc.; i.e. -// information that is common to all avatars. -// -// This holds const data - it is initialized once and the contents never change after that. -//------------------------------------------------------------------------ -class LLVOAvatarDictionary : public LLSingleton<LLVOAvatarDictionary> -{ - //-------------------------------------------------------------------- - // Constructors and Destructors - //-------------------------------------------------------------------- -public: - LLVOAvatarDictionary(); - virtual ~LLVOAvatarDictionary(); -private: - void createAssociations(); - - //-------------------------------------------------------------------- - // Local and baked textures - //-------------------------------------------------------------------- -public: - struct TextureEntry : public LLDictionaryEntry - { - TextureEntry(const std::string &name, // this must match the xml name used by LLTexLayerInfo::parseXml - bool is_local_texture, - EBakedTextureIndex baked_texture_index = BAKED_NUM_INDICES, - const std::string& default_image_name = "", - LLWearableType::EType wearable_type = LLWearableType::WT_INVALID); - const std::string mDefaultImageName; - const LLWearableType::EType mWearableType; - // It's either a local texture xor baked - BOOL mIsLocalTexture; - BOOL mIsBakedTexture; - // If it's a local texture, it may be used by a baked texture - BOOL mIsUsedByBakedTexture; - EBakedTextureIndex mBakedTextureIndex; - }; - - struct Textures : public LLDictionary<ETextureIndex, TextureEntry> - { - Textures(); - } mTextures; - const TextureEntry* getTexture(ETextureIndex index) const { return mTextures.lookup(index); } - const Textures& getTextures() const { return mTextures; } - - //-------------------------------------------------------------------- - // Meshes - //-------------------------------------------------------------------- -public: - struct MeshEntry : public LLDictionaryEntry - { - MeshEntry(EBakedTextureIndex baked_index, - const std::string &name, // names of mesh types as they are used in avatar_lad.xml - U8 level, - LLViewerJoint::PickName pick); - // Levels of Detail for each mesh. Must match levels of detail present in avatar_lad.xml - // Otherwise meshes will be unable to be found, or levels of detail will be ignored - const U8 mLOD; - const EBakedTextureIndex mBakedID; - const LLViewerJoint::PickName mPickName; - }; - - struct Meshes : public LLDictionary<EMeshIndex, MeshEntry> - { - Meshes(); - } mMeshes; - const MeshEntry* getMesh(EMeshIndex index) const { return mMeshes.lookup(index); } - const Meshes& getMeshes() const { return mMeshes; } - - //-------------------------------------------------------------------- - // Baked Textures - //-------------------------------------------------------------------- -public: - struct BakedEntry : public LLDictionaryEntry - { - BakedEntry(ETextureIndex tex_index, - const std::string &name, // unused, but necessary for templating. - const std::string &hash_name, - U32 num_local_textures, ... ); // # local textures, local texture list, # wearables, wearable list - // Local Textures - const ETextureIndex mTextureIndex; - texture_vec_t mLocalTextures; - // Wearables - const LLUUID mWearablesHashID; - wearables_vec_t mWearables; - }; - - struct BakedTextures: public LLDictionary<EBakedTextureIndex, BakedEntry> - { - BakedTextures(); - } mBakedTextures; - const BakedEntry* getBakedTexture(EBakedTextureIndex index) const { return mBakedTextures.lookup(index); } - const BakedTextures& getBakedTextures() const { return mBakedTextures; } - - //-------------------------------------------------------------------- - // Convenience Functions - //-------------------------------------------------------------------- -public: - // Convert from baked texture to associated texture; e.g. BAKED_HEAD -> TEX_HEAD_BAKED - static ETextureIndex bakedToLocalTextureIndex(EBakedTextureIndex t); - - // find a baked texture index based on its name - static EBakedTextureIndex findBakedByRegionName(std::string name); - - static const LLUUID getDefaultTextureImageID(ETextureIndex index); - - // Given a texture entry, determine which wearable type owns it. - static LLWearableType::EType getTEWearableType(ETextureIndex index); - -}; // End LLVOAvatarDictionary - -} // End namespace LLVOAvatarDefines - -#endif //LL_VO_AVATARDEFINES_H diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index e32fd3c3c8..48cfbfc309 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -55,11 +55,14 @@ #include "llviewerobjectlist.h" #include "llviewerstats.h" #include "llviewerregion.h" +#include "llviewertexlayer.h" +#include "llviewerwearable.h" #include "llappearancemgr.h" #include "llmeshrepository.h" #include "llvovolume.h" #include "llsdutil.h" #include "llstartup.h" +#include "llsdserialize.h" #if LL_MSVC // disable boost::lexical_cast warning @@ -72,24 +75,22 @@ LLPointer<LLVOAvatarSelf> gAgentAvatarp = NULL; BOOL isAgentAvatarValid() { - return (gAgentAvatarp.notNull() && - (gAgentAvatarp->getRegion() != NULL) && - (!gAgentAvatarp->isDead())); + return (gAgentAvatarp.notNull() && gAgentAvatarp->isValid()); } void selfStartPhase(const std::string& phase_name) { if (isAgentAvatarValid()) { - gAgentAvatarp->getPhases().startPhase(phase_name); + gAgentAvatarp->startPhase(phase_name); } } -void selfStopPhase(const std::string& phase_name) +void selfStopPhase(const std::string& phase_name, bool err_check) { if (isAgentAvatarValid()) { - gAgentAvatarp->getPhases().stopPhase(phase_name); + gAgentAvatarp->stopPhase(phase_name, err_check); } } @@ -97,20 +98,11 @@ void selfClearPhases() { if (isAgentAvatarValid()) { - gAgentAvatarp->getPhases().clearPhases(); - gAgentAvatarp->mLastRezzedStatus = -1; + gAgentAvatarp->clearPhases(); } } -void selfStopAllPhases() -{ - if (isAgentAvatarValid()) - { - gAgentAvatarp->getPhases().stopAllPhases(); - } -} - -using namespace LLVOAvatarDefines; +using namespace LLAvatarAppearanceDefines; /********************************************************************************* ** ** @@ -176,6 +168,35 @@ LLVOAvatarSelf::LLVOAvatarSelf(const LLUUID& id, lldebugs << "Marking avatar as self " << id << llendl; } +// Called periodically for diagnostics, return true when done. +bool output_self_av_texture_diagnostics() +{ + if (!isAgentAvatarValid()) + return true; // done checking + + gAgentAvatarp->outputRezDiagnostics(); + + return false; +} + +bool update_avatar_rez_metrics() +{ + if (!isAgentAvatarValid()) + return true; + + gAgentAvatarp->updateAvatarRezMetrics(false); + return false; +} + +bool check_for_unsupported_baked_appearance() +{ + if (!isAgentAvatarValid()) + return true; + + gAgentAvatarp->checkForUnsupportedServerBakeAppearance(); + return false; +} + void LLVOAvatarSelf::initInstance() { BOOL status = TRUE; @@ -188,7 +209,7 @@ void LLVOAvatarSelf::initInstance() llinfos << "Self avatar object created. Starting timer." << llendl; mDebugSelfLoadTimer.reset(); // clear all times to -1 for debugging - for (U32 i =0; i < LLVOAvatarDefines::TEX_NUM_INDICES; ++i) + for (U32 i =0; i < LLAvatarAppearanceDefines::TEX_NUM_INDICES; ++i) { for (U32 j = 0; j <= MAX_DISCARD_LEVEL; ++j) { @@ -196,7 +217,7 @@ void LLVOAvatarSelf::initInstance() } } - for (U32 i =0; i < LLVOAvatarDefines::BAKED_NUM_INDICES; ++i) + for (U32 i =0; i < LLAvatarAppearanceDefines::BAKED_NUM_INDICES; ++i) { mDebugBakedTextureTimes[i][0] = -1.0f; mDebugBakedTextureTimes[i][1] = -1.0f; @@ -209,6 +230,10 @@ void LLVOAvatarSelf::initInstance() llerrs << "Unable to load user's avatar" << llendl; return; } + + //doPeriodically(output_self_av_texture_diagnostics, 30.0); + doPeriodically(update_avatar_rez_metrics, 5.0); + doPeriodically(check_for_unsupported_baked_appearance, 120.0); } // virtual @@ -249,13 +274,11 @@ BOOL LLVOAvatarSelf::loadAvatarSelf() llwarns << "avatar file: buildSkeleton() failed" << llendl; return FALSE; } - // TODO: make loadLayersets() called only by self. - //success &= loadLayersets(); return success; } -BOOL LLVOAvatarSelf::buildSkeletonSelf(const LLVOAvatarSkeletonInfo *info) +BOOL LLVOAvatarSelf::buildSkeletonSelf(const LLAvatarSkeletonInfo *info) { // add special-purpose "screen" joint mScreenp = new LLViewerJoint("mScreen", NULL); @@ -341,7 +364,6 @@ BOOL LLVOAvatarSelf::buildMenus() } else { - BOOL attachment_found = FALSE; for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); iter != mAttachmentPoints.end(); ++iter) @@ -369,7 +391,6 @@ BOOL LLVOAvatarSelf::buildMenus() gAttachPieMenu->addChild(item); - attachment_found = TRUE; break; } @@ -382,7 +403,6 @@ BOOL LLVOAvatarSelf::buildMenus() } else { - BOOL attachment_found = FALSE; for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); iter != mAttachmentPoints.end(); ++iter) @@ -409,7 +429,6 @@ BOOL LLVOAvatarSelf::buildMenus() gDetachPieMenu->addChild(item); - attachment_found = TRUE; break; } } @@ -584,70 +603,6 @@ LLVOAvatarSelf::~LLVOAvatarSelf() *********************************************************************************/ //virtual -BOOL LLVOAvatarSelf::loadLayersets() -{ - BOOL success = TRUE; - for (LLVOAvatarXmlInfo::layer_info_list_t::const_iterator iter = sAvatarXmlInfo->mLayerInfoList.begin(); - iter != sAvatarXmlInfo->mLayerInfoList.end(); - ++iter) - { - // Construct a layerset for each one specified in avatar_lad.xml and initialize it as such. - const LLTexLayerSetInfo *info = *iter; - LLTexLayerSet* layer_set = new LLTexLayerSet( this ); - - if (!layer_set->setInfo(info)) - { - stop_glerror(); - delete layer_set; - llwarns << "avatar file: layer_set->parseData() failed" << llendl; - return FALSE; - } - - // scan baked textures and associate the layerset with the appropriate one - EBakedTextureIndex baked_index = BAKED_NUM_INDICES; - for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); - baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); - ++baked_iter) - { - const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second; - if (layer_set->isBodyRegion(baked_dict->mName)) - { - baked_index = baked_iter->first; - // ensure both structures are aware of each other - mBakedTextureDatas[baked_index].mTexLayerSet = layer_set; - layer_set->setBakedTexIndex(baked_index); - break; - } - } - // if no baked texture was found, warn and cleanup - if (baked_index == BAKED_NUM_INDICES) - { - llwarns << "<layer_set> has invalid body_region attribute" << llendl; - delete layer_set; - return FALSE; - } - - // scan morph masks and let any affected layers know they have an associated morph - for (LLVOAvatar::morph_list_t::const_iterator morph_iter = mBakedTextureDatas[baked_index].mMaskedMorphs.begin(); - morph_iter != mBakedTextureDatas[baked_index].mMaskedMorphs.end(); - ++morph_iter) - { - LLMaskedMorph *morph = *morph_iter; - LLTexLayerInterface* layer = layer_set->findLayerByName(morph->mLayer); - if (layer) - { - layer->setHasMorph(TRUE); - } - else - { - llwarns << "Could not find layer named " << morph->mLayer << " to set morph flag" << llendl; - success = FALSE; - } - } - } - return success; -} -// virtual BOOL LLVOAvatarSelf::updateCharacter(LLAgent &agent) { // update screen joint size @@ -664,9 +619,15 @@ BOOL LLVOAvatarSelf::updateCharacter(LLAgent &agent) } // virtual +BOOL LLVOAvatarSelf::isValid() const +{ + return ((getRegion() != NULL) && !isDead()); +} + +// virtual void LLVOAvatarSelf::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) { - if (isAgentAvatarValid()) + if (isValid()) { LLVOAvatar::idleUpdate(agent, world, time); idleUpdateTractorBeam(); @@ -689,7 +650,7 @@ void LLVOAvatarSelf::resetJointPositions( void ) return LLVOAvatar::resetJointPositions(); } // virtual -BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake ) +BOOL LLVOAvatarSelf::setVisualParamWeight(const LLVisualParam *which_param, F32 weight, BOOL upload_bake ) { if (!which_param) { @@ -717,20 +678,28 @@ BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight, BOOL upload_bak return setParamWeight(param,weight,upload_bake); } -BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL upload_bake ) +BOOL LLVOAvatarSelf::setParamWeight(const LLViewerVisualParam *param, F32 weight, BOOL upload_bake ) { if (!param) { return FALSE; } +#if 0 + // FIXME DRANO - kludgy way to avoid overwriting avatar state from wearables. + if (isUsingServerBakes() && !isUsingLocalAppearance()) + { + return FALSE; + } +#endif + if (param->getCrossWearable()) { LLWearableType::EType type = (LLWearableType::EType)param->getWearableType(); U32 size = gAgentWearables.getWearableCount(type); for (U32 count = 0; count < size; ++count) { - LLWearable *wearable = gAgentWearables.getWearable(type,count); + LLViewerWearable *wearable = gAgentWearables.getViewerWearable(type,count); if (wearable) { wearable->setVisualParamWeight(param->getID(), weight, upload_bake); @@ -759,7 +728,7 @@ void LLVOAvatarSelf::idleUpdateAppearanceAnimation() LLWearable *wearable = gAgentWearables.getTopWearable((LLWearableType::EType)type); if (wearable) { - wearable->writeToAvatar(); + wearable->writeToAvatar(this); } } @@ -802,18 +771,30 @@ U32 LLVOAvatarSelf::processUpdateMessage(LLMessageSystem *mesgsys, { U32 retval = LLVOAvatar::processUpdateMessage(mesgsys,user_data,block_num,update_type,dp); - if (mInitialBakesLoaded == false && retval == 0x0) +#if 0 + // DRANO - it's not clear this does anything useful. If we wait + // until an appearance message has been received, we already have + // the texture ids. If we don't wait, we don't yet know where to + // look for baked textures, because we haven't received the + // appearance version data from the appearance message. This looks + // like an old optimization that's incompatible with server-side + // texture baking. + + // FIXME DRANO - skipping in the case of !mFirstAppearanceMessageReceived prevents us from trying to + // load textures before we know where they come from (ie, from baking service or not); + // unknown impact on performance. + if (mInitialBakesLoaded == false && retval == 0x0 && mFirstAppearanceMessageReceived) { // call update textures to force the images to be created updateMeshTextures(); // unpack the texture UUIDs to the texture slots - retval = unpackTEMessage(mesgsys, _PREHASH_ObjectData, block_num); + retval = unpackTEMessage(mesgsys, _PREHASH_ObjectData, (S32) block_num); // need to trigger a few operations to get the avatar to use the new bakes for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { - const LLVOAvatarDefines::ETextureIndex te = mBakedTextureDatas[i].mTextureIndex; + const LLAvatarAppearanceDefines::ETextureIndex te = mBakedTextureDatas[i].mTextureIndex; LLUUID texture_id = getTEImage(te)->getID(); setNewBakedTexture(te, texture_id); mInitialBakeIDs[i] = texture_id; @@ -823,6 +804,7 @@ U32 LLVOAvatarSelf::processUpdateMessage(LLMessageSystem *mesgsys, mInitialBakesLoaded = true; } +#endif return retval; } @@ -877,13 +859,17 @@ void LLVOAvatarSelf::removeMissingBakedTextures() { for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { - mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(TRUE); - invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, FALSE); + LLViewerTexLayerSet *layerset = getTexLayerSet(i); + layerset->setUpdatesEnabled(TRUE); + invalidateComposite(layerset, FALSE); } updateMeshTextures(); + if (getRegion() && !getRegion()->getCentralBakeVersion()) + { requestLayerSetUploads(); } } +} //virtual void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp) @@ -938,7 +924,7 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp) void LLVOAvatarSelf::idleUpdateTractorBeam() { // This is only done for yourself (maybe it should be in the agent?) - if (!needsRenderBeam() || !mIsBuilt) + if (!needsRenderBeam() || !isBuilt()) { mBeam = NULL; } @@ -1051,11 +1037,6 @@ void LLVOAvatarSelf::updateAttachmentVisibility(U32 camera_mode) } } -/*virtual*/ BOOL LLVOAvatarSelf::isWearingWearableType(LLWearableType::EType type ) const -{ - return gAgentWearables.getWearableCount(type) > 0; -} - //----------------------------------------------------------------------------- // updatedWearable( LLWearableType::EType type ) // forces an update to any baked textures relevant to type. @@ -1063,26 +1044,27 @@ void LLVOAvatarSelf::updateAttachmentVisibility(U32 camera_mode) //----------------------------------------------------------------------------- void LLVOAvatarSelf::wearableUpdated( LLWearableType::EType type, BOOL upload_result ) { - for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); - baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); + for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); + baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); ++baked_iter) { - const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second; - const LLVOAvatarDefines::EBakedTextureIndex index = baked_iter->first; + const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = baked_iter->second; + const LLAvatarAppearanceDefines::EBakedTextureIndex index = baked_iter->first; if (baked_dict) { - for (LLVOAvatarDefines::wearables_vec_t::const_iterator type_iter = baked_dict->mWearables.begin(); + for (LLAvatarAppearanceDefines::wearables_vec_t::const_iterator type_iter = baked_dict->mWearables.begin(); type_iter != baked_dict->mWearables.end(); ++type_iter) { const LLWearableType::EType comp_type = *type_iter; if (comp_type == type) { - if (mBakedTextureDatas[index].mTexLayerSet) + LLViewerTexLayerSet *layerset = getLayerSet(index); + if (layerset) { - mBakedTextureDatas[index].mTexLayerSet->setUpdatesEnabled(true); - invalidateComposite(mBakedTextureDatas[index].mTexLayerSet, upload_result); + layerset->setUpdatesEnabled(true); + invalidateComposite(layerset, upload_result); } break; } @@ -1246,7 +1228,7 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object) // Make sure the inventory is in sync with the avatar. // Update COF contents, don't trigger appearance update. - if (!isAgentAvatarValid()) + if (!isValid()) { llinfos << "removeItemLinks skipped, avatar is under destruction" << llendl; } @@ -1287,7 +1269,7 @@ BOOL LLVOAvatarSelf::detachAttachmentIntoInventory(const LLUUID &item_id) const LLViewerObject *attached_obj = gAgentAvatarp->getWornAttachment(item_id); if (!attached_obj) { - LLAppearanceMgr::instance().removeCOFItemLinks(item_id, false); + LLAppearanceMgr::instance().removeCOFItemLinks(item_id); } } return TRUE; @@ -1295,9 +1277,9 @@ BOOL LLVOAvatarSelf::detachAttachmentIntoInventory(const LLUUID &item_id) return FALSE; } -U32 LLVOAvatarSelf::getNumWearables(LLVOAvatarDefines::ETextureIndex i) const +U32 LLVOAvatarSelf::getNumWearables(LLAvatarAppearanceDefines::ETextureIndex i) const { - LLWearableType::EType type = LLVOAvatarDictionary::getInstance()->getTEWearableType(i); + LLWearableType::EType type = LLAvatarAppearanceDictionary::getInstance()->getTEWearableType(i); return gAgentWearables.getWearableCount(type); } @@ -1328,11 +1310,8 @@ void LLVOAvatarSelf::localTextureLoaded(BOOL success, LLViewerFetchedTexture *sr discard_level < local_tex_obj->getDiscard()) { local_tex_obj->setDiscard(discard_level); - if (isUsingBakedTextures()) - { requestLayerSetUpdate(index); - } - else + if (isEditingAppearance()) { LLVisualParamHint::requestHintUpdates(); } @@ -1366,11 +1345,11 @@ BOOL LLVOAvatarSelf::getLocalTextureGL(ETextureIndex type, LLViewerTexture** tex { return FALSE; } - *tex_pp = local_tex_obj->getImage(); + *tex_pp = dynamic_cast<LLViewerTexture*> (local_tex_obj->getImage()); return TRUE; } -LLViewerFetchedTexture* LLVOAvatarSelf::getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, U32 index) const +LLViewerFetchedTexture* LLVOAvatarSelf::getLocalTextureGL(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const { if (!isIndexLocalTexture(type)) { @@ -1386,7 +1365,7 @@ LLViewerFetchedTexture* LLVOAvatarSelf::getLocalTextureGL(LLVOAvatarDefines::ETe { return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR); } - return local_tex_obj->getImage(); + return dynamic_cast<LLViewerFetchedTexture*> (local_tex_obj->getImage()); } const LLUUID& LLVOAvatarSelf::getLocalTextureID(ETextureIndex type, U32 index) const @@ -1407,29 +1386,30 @@ const LLUUID& LLVOAvatarSelf::getLocalTextureID(ETextureIndex type, U32 index) c // Returns true if at least the lowest quality discard level exists for every texture // in the layerset. //----------------------------------------------------------------------------- -BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset) const +BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLViewerTexLayerSet* layerset) const { /* if (layerset == mBakedTextureDatas[BAKED_HEAD].mTexLayerSet) return getLocalDiscardLevel(TEX_HEAD_BODYPAINT) >= 0; */ - for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); - baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); + for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); + baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); ++baked_iter) { const EBakedTextureIndex baked_index = baked_iter->first; if (layerset == mBakedTextureDatas[baked_index].mTexLayerSet) { BOOL ret = true; - const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second; + const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = baked_iter->second; for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin(); local_tex_iter != baked_dict->mLocalTextures.end(); ++local_tex_iter) { const ETextureIndex tex_index = *local_tex_iter; - const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index); + const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index); const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type); for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++) { - ret &= (getLocalDiscardLevel(tex_index, wearable_index) >= 0); + BOOL tex_avail = (getLocalDiscardLevel(tex_index, wearable_index) >= 0); + ret &= tex_avail; } } return ret; @@ -1445,7 +1425,7 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset) // Returns true if the highest quality discard level exists for every texture // in the layerset. //----------------------------------------------------------------------------- -BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) const +BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLViewerTexLayerSet* layerset) const { const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); // const U32 desired_tex_discard_level = 0; // hack to not bake textures on lower discard levels. @@ -1454,17 +1434,19 @@ BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) cons { if (layerset == mBakedTextureDatas[i].mTexLayerSet) { - const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); + const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin(); local_tex_iter != baked_dict->mLocalTextures.end(); ++local_tex_iter) { const ETextureIndex tex_index = *local_tex_iter; - const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index); + const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index); const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type); for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++) { - if (getLocalDiscardLevel(*local_tex_iter, wearable_index) > (S32)(desired_tex_discard_level)) + S32 local_discard_level = getLocalDiscardLevel(*local_tex_iter, wearable_index); + if ((local_discard_level > (S32)(desired_tex_discard_level)) || + (local_discard_level < 0 )) { return FALSE; } @@ -1477,6 +1459,7 @@ BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) cons return FALSE; } + BOOL LLVOAvatarSelf::isAllLocalTextureDataFinal() const { const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); @@ -1484,17 +1467,19 @@ BOOL LLVOAvatarSelf::isAllLocalTextureDataFinal() const for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { - const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); + const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin(); local_tex_iter != baked_dict->mLocalTextures.end(); ++local_tex_iter) { const ETextureIndex tex_index = *local_tex_iter; - const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index); + const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index); const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type); for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++) { - if (getLocalDiscardLevel(*local_tex_iter, wearable_index) > (S32)(desired_tex_discard_level)) + S32 local_discard_level = getLocalDiscardLevel(*local_tex_iter, wearable_index); + if ((local_discard_level > (S32)(desired_tex_discard_level)) || + (local_discard_level < 0 )) { return FALSE; } @@ -1504,22 +1489,22 @@ BOOL LLVOAvatarSelf::isAllLocalTextureDataFinal() const return TRUE; } -BOOL LLVOAvatarSelf::isBakedTextureFinal(const LLVOAvatarDefines::EBakedTextureIndex index) const +BOOL LLVOAvatarSelf::isBakedTextureFinal(const LLAvatarAppearanceDefines::EBakedTextureIndex index) const { - const LLTexLayerSet *layerset = mBakedTextureDatas[index].mTexLayerSet; + const LLViewerTexLayerSet *layerset = getLayerSet(index); if (!layerset) return FALSE; - const LLTexLayerSetBuffer *layerset_buffer = layerset->getComposite(); + const LLViewerTexLayerSetBuffer *layerset_buffer = layerset->getViewerComposite(); if (!layerset_buffer) return FALSE; return !layerset_buffer->uploadNeeded(); } -BOOL LLVOAvatarSelf::isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index) const +BOOL LLVOAvatarSelf::isTextureDefined(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const { LLUUID id; BOOL isDefined = TRUE; if (isIndexLocalTexture(type)) { - const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(type); + const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(type); const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type); if (index >= wearable_count) { @@ -1546,7 +1531,7 @@ BOOL LLVOAvatarSelf::isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 } //virtual -BOOL LLVOAvatarSelf::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index) const +BOOL LLVOAvatarSelf::isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const { if (isIndexBakedTexture(type)) { @@ -1559,7 +1544,7 @@ BOOL LLVOAvatarSelf::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 } //virtual -BOOL LLVOAvatarSelf::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const +BOOL LLVOAvatarSelf::isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerWearable *wearable) const { if (isIndexBakedTexture(type)) { @@ -1582,13 +1567,14 @@ void LLVOAvatarSelf::requestLayerSetUploads() } } -void LLVOAvatarSelf::requestLayerSetUpload(LLVOAvatarDefines::EBakedTextureIndex i) +void LLVOAvatarSelf::requestLayerSetUpload(LLAvatarAppearanceDefines::EBakedTextureIndex i) { ETextureIndex tex_index = mBakedTextureDatas[i].mTextureIndex; const BOOL layer_baked = isTextureDefined(tex_index, gAgentWearables.getWearableCount(tex_index)); - if (!layer_baked && mBakedTextureDatas[i].mTexLayerSet) + LLViewerTexLayerSet *layerset = getLayerSet(i); + if (!layer_baked && layerset) { - mBakedTextureDatas[i].mTexLayerSet->requestUpload(); + layerset->requestUpload(); } } @@ -1602,8 +1588,8 @@ bool LLVOAvatarSelf::hasPendingBakedUploads() const { for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { - LLTexLayerSet* layerset = mBakedTextureDatas[i].mTexLayerSet; - if (layerset && layerset->getComposite() && layerset->getComposite()->uploadPending()) + LLViewerTexLayerSet* layerset = getTexLayerSet(i); + if (layerset && layerset->getViewerComposite() && layerset->getViewerComposite()->uploadPending()) { return true; } @@ -1613,22 +1599,23 @@ bool LLVOAvatarSelf::hasPendingBakedUploads() const void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_result ) { - if( !layerset || !layerset->getUpdatesEnabled() ) + LLViewerTexLayerSet *layer_set = dynamic_cast<LLViewerTexLayerSet*>(layerset); + if( !layer_set || !layer_set->getUpdatesEnabled() ) { return; } // llinfos << "LLVOAvatar::invalidComposite() " << layerset->getBodyRegionName() << llendl; - layerset->requestUpdate(); - layerset->invalidateMorphMasks(); + layer_set->requestUpdate(); + layer_set->invalidateMorphMasks(); - if( upload_result ) + if( upload_result && (getRegion() && !getRegion()->getCentralBakeVersion())) { llassert(isSelf()); - ETextureIndex baked_te = getBakedTE( layerset ); + ETextureIndex baked_te = getBakedTE( layer_set ); setTEImage( baked_te, LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR) ); - layerset->requestUpload(); + layer_set->requestUpload(); updateMeshTextures(); } } @@ -1637,7 +1624,8 @@ void LLVOAvatarSelf::invalidateAll() { for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { - invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, TRUE); + LLViewerTexLayerSet *layerset = getTexLayerSet(i); + invalidateComposite(layerset, TRUE); } //mDebugSelfLoadTimer.reset(); } @@ -1655,17 +1643,19 @@ void LLVOAvatarSelf::setCompositeUpdatesEnabled( bool b ) void LLVOAvatarSelf::setCompositeUpdatesEnabled(U32 index, bool b) { - if (mBakedTextureDatas[index].mTexLayerSet ) + LLViewerTexLayerSet *layerset = getTexLayerSet(index); + if (layerset ) { - mBakedTextureDatas[index].mTexLayerSet->setUpdatesEnabled( b ); + layerset->setUpdatesEnabled( b ); } } bool LLVOAvatarSelf::isCompositeUpdateEnabled(U32 index) { - if (mBakedTextureDatas[index].mTexLayerSet) + LLViewerTexLayerSet *layerset = getTexLayerSet(index); + if (layerset) { - return mBakedTextureDatas[index].mTexLayerSet->getUpdatesEnabled(); + return layerset->getUpdatesEnabled(); } return false; } @@ -1676,9 +1666,10 @@ void LLVOAvatarSelf::setupComposites() { ETextureIndex tex_index = mBakedTextureDatas[i].mTextureIndex; BOOL layer_baked = isTextureDefined(tex_index, gAgentWearables.getWearableCount(tex_index)); - if (mBakedTextureDatas[i].mTexLayerSet) + LLViewerTexLayerSet *layerset = getTexLayerSet(i); + if (layerset) { - mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(!layer_baked); + layerset->setUpdatesEnabled(!layer_baked); } } } @@ -1687,10 +1678,11 @@ void LLVOAvatarSelf::updateComposites() { for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { - if (mBakedTextureDatas[i].mTexLayerSet + LLViewerTexLayerSet *layerset = getTexLayerSet(i); + if (layerset && ((i != BAKED_SKIRT) || isWearingWearableType(LLWearableType::WT_SKIRT))) { - mBakedTextureDatas[i].mTexLayerSet->updateComposite(); + layerset->updateComposite(); } } } @@ -1703,11 +1695,12 @@ S32 LLVOAvatarSelf::getLocalDiscardLevel(ETextureIndex type, U32 wearable_index) const LLLocalTextureObject *local_tex_obj = getLocalTextureObject(type, wearable_index); if (local_tex_obj) { + const LLViewerFetchedTexture* image = dynamic_cast<LLViewerFetchedTexture*>( local_tex_obj->getImage() ); if (type >= 0 && local_tex_obj->getID() != IMG_DEFAULT_AVATAR - && !local_tex_obj->getImage()->isMissingAsset()) + && !image->isMissingAsset()) { - return local_tex_obj->getImage()->getDiscardLevel(); + return image->getDiscardLevel(); } else { @@ -1732,7 +1725,7 @@ void LLVOAvatarSelf::getLocalTextureByteCount(S32* gl_bytes) const const LLLocalTextureObject *local_tex_obj = getLocalTextureObject((ETextureIndex) type, num); if (local_tex_obj) { - const LLViewerFetchedTexture* image_gl = local_tex_obj->getImage(); + const LLViewerFetchedTexture* image_gl = dynamic_cast<LLViewerFetchedTexture*>( local_tex_obj->getImage() ); if (image_gl) { S32 bytes = (S32)image_gl->getWidth() * image_gl->getHeight() * image_gl->getComponents(); @@ -1767,8 +1760,8 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te llerrs << "Tried to set local texture with invalid type: (" << (U32) type << ", " << index << ")" << llendl; return; } - LLWearableType::EType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType(type); - if (!gAgentWearables.getWearable(wearable_type,index)) + LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getInstance()->getTEWearableType(type); + if (!gAgentWearables.getViewerWearable(wearable_type,index)) { // no wearable is loaded, cannot set the texture. return; @@ -1781,10 +1774,10 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te return; } - LLTexLayerSet *layer_set = getLayerSet(type); + LLViewerTexLayerSet *layer_set = getLayerSet(type); if (layer_set) { - layer_set->cloneTemplates(local_tex_obj, type, gAgentWearables.getWearable(wearable_type,index)); + layer_set->cloneTemplates(local_tex_obj, type, gAgentWearables.getViewerWearable(wearable_type,index)); } } @@ -1804,11 +1797,8 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te local_tex_obj->setDiscard(tex_discard); if (isSelf()) { - if (gAgentAvatarp->isUsingBakedTextures()) - { requestLayerSetUpdate(type); - } - else + if (isEditingAppearance()) { LLVisualParamHint::requestHintUpdates(); } @@ -1826,8 +1816,9 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te local_tex_obj->setID(tex->getID()); setBakedReady(type,baked_version_ready,index); } + //virtual -void LLVOAvatarSelf::setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index) +void LLVOAvatarSelf::setBakedReady(LLAvatarAppearanceDefines::ETextureIndex type, BOOL baked_version_exists, U32 index) { if (!isIndexLocalTexture(type)) return; LLLocalTextureObject *local_tex_obj = getLocalTextureObject(type,index); @@ -1846,16 +1837,16 @@ void LLVOAvatarSelf::dumpLocalTextures() const /* ETextureIndex baked_equiv[] = { TEX_UPPER_BAKED, if (isTextureDefined(baked_equiv[i])) */ - for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); - iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); + for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); + iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); ++iter) { - const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; + const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second; if (!texture_dict->mIsLocalTexture || !texture_dict->mIsUsedByBakedTexture) continue; const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; - const ETextureIndex baked_equiv = LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index)->mTextureIndex; + const ETextureIndex baked_equiv = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(baked_index)->mTextureIndex; const std::string &name = texture_dict->mName; const LLLocalTextureObject *local_tex_obj = getLocalTextureObject(iter->first, 0); @@ -1878,7 +1869,7 @@ void LLVOAvatarSelf::dumpLocalTextures() const } else { - const LLViewerFetchedTexture* image = local_tex_obj->getImage(); + const LLViewerFetchedTexture* image = dynamic_cast<LLViewerFetchedTexture*>( local_tex_obj->getImage() ); llinfos << "LocTex " << name << ": " << "Discard " << image->getDiscardLevel() << ", " @@ -1955,35 +1946,63 @@ void LLVOAvatarSelf::dumpTotalLocalTextureByteCount() BOOL LLVOAvatarSelf::getIsCloud() const { + // Let people know why they're clouded without spamming them into oblivion. + bool do_warn = false; + static LLTimer time_since_notice; + F32 update_freq = 30.0; + if (time_since_notice.getElapsedTimeF32() > update_freq) + { + time_since_notice.reset(); + do_warn = true; + } + // do we have our body parts? - if (gAgentWearables.getWearableCount(LLWearableType::WT_SHAPE) == 0 || - gAgentWearables.getWearableCount(LLWearableType::WT_HAIR) == 0 || - gAgentWearables.getWearableCount(LLWearableType::WT_EYES) == 0 || - gAgentWearables.getWearableCount(LLWearableType::WT_SKIN) == 0) + S32 shape_count = gAgentWearables.getWearableCount(LLWearableType::WT_SHAPE); + S32 hair_count = gAgentWearables.getWearableCount(LLWearableType::WT_HAIR); + S32 eye_count = gAgentWearables.getWearableCount(LLWearableType::WT_EYES); + S32 skin_count = gAgentWearables.getWearableCount(LLWearableType::WT_SKIN); + if (!shape_count || !hair_count || !eye_count || !skin_count) { - lldebugs << "No body parts" << llendl; + if (do_warn) + { + llinfos << "Self is clouded due to missing one or more required body parts: " + << (shape_count ? "" : "SHAPE ") + << (hair_count ? "" : "HAIR ") + << (eye_count ? "" : "EYES ") + << (skin_count ? "" : "SKIN ") + << llendl; + } return TRUE; } if (!isTextureDefined(TEX_HAIR, 0)) { - lldebugs << "No hair texture" << llendl; + if (do_warn) + { + llinfos << "Self is clouded because of no hair texture" << llendl; + } return TRUE; } if (!mPreviousFullyLoaded) { - if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_LOWER].mTexLayerSet) && + if (!isLocalTextureDataAvailable(getLayerSet(BAKED_LOWER)) && (!isTextureDefined(TEX_LOWER_BAKED, 0))) { - lldebugs << "Lower textures not baked" << llendl; + if (do_warn) + { + llinfos << "Self is clouded because lower textures not baked" << llendl; + } return TRUE; } - if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_UPPER].mTexLayerSet) && + if (!isLocalTextureDataAvailable(getLayerSet(BAKED_UPPER)) && (!isTextureDefined(TEX_UPPER_BAKED, 0))) { - lldebugs << "Upper textures not baked" << llendl; + if (do_warn) + { + llinfos << "Self is clouded because upper textures not baked" << llendl; + } return TRUE; } @@ -2000,7 +2019,11 @@ BOOL LLVOAvatarSelf::getIsCloud() const const LLViewerTexture* baked_img = getImage( texture_data.mTextureIndex, 0 ); if (!baked_img || !baked_img->hasGLTexture()) { - lldebugs << "Texture at index " << i << " (texture index is " << texture_data.mTextureIndex << ") is not loaded" << llendl; + if (do_warn) + { + llinfos << "Self is clouded because texture at index " << i + << " (texture index is " << texture_data.mTextureIndex << ") is not loaded" << llendl; + } return TRUE; } } @@ -2051,7 +2074,85 @@ void LLVOAvatarSelf::debugBakedTextureUpload(EBakedTextureIndex index, BOOL fini mDebugBakedTextureTimes[index][done] = mDebugSelfLoadTimer.getElapsedTimeF32(); } -const std::string LLVOAvatarSelf::debugDumpLocalTextureDataInfo(const LLTexLayerSet* layerset) const +const std::string LLVOAvatarSelf::verboseDebugDumpLocalTextureDataInfo(const LLViewerTexLayerSet* layerset) const +{ + std::ostringstream outbuf; + for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = + LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); + baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); + ++baked_iter) + { + const EBakedTextureIndex baked_index = baked_iter->first; + if (layerset == mBakedTextureDatas[baked_index].mTexLayerSet) + { + outbuf << "baked_index: " << baked_index << "\n"; + const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = baked_iter->second; + for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin(); + local_tex_iter != baked_dict->mLocalTextures.end(); + ++local_tex_iter) + { + const ETextureIndex tex_index = *local_tex_iter; + const std::string tex_name = LLAvatarAppearanceDictionary::getInstance()->getTexture(tex_index)->mName; + outbuf << " tex_index " << (S32) tex_index << " name " << tex_name << "\n"; + const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index); + const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type); + if (wearable_count > 0) + { + for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++) + { + outbuf << " " << LLWearableType::getTypeName(wearable_type) << " " << wearable_index << ":"; + const LLLocalTextureObject *local_tex_obj = getLocalTextureObject(tex_index, wearable_index); + if (local_tex_obj) + { + LLViewerFetchedTexture* image = dynamic_cast<LLViewerFetchedTexture*>( local_tex_obj->getImage() ); + if (tex_index >= 0 + && local_tex_obj->getID() != IMG_DEFAULT_AVATAR + && !image->isMissingAsset()) + { + outbuf << " id: " << image->getID() + << " refs: " << image->getNumRefs() + << " glocdisc: " << getLocalDiscardLevel(tex_index, wearable_index) + << " discard: " << image->getDiscardLevel() + << " desired: " << image->getDesiredDiscardLevel() + << " decode: " << image->getDecodePriority() + << " addl: " << image->getAdditionalDecodePriority() + << " ts: " << image->getTextureState() + << " bl: " << image->getBoostLevel() + << " fl: " << image->isFullyLoaded() // this is not an accessor for mFullyLoaded - see comment there. + << " cl: " << (image->isFullyLoaded() && image->getDiscardLevel()==0) // "completely loaded" + << " mvs: " << image->getMaxVirtualSize() + << " mvsc: " << image->getMaxVirtualSizeResetCounter() + << " mem: " << image->getTextureMemory(); + } + } + outbuf << "\n"; + } + } + } + break; + } + } + return outbuf.str(); +} + +void LLVOAvatarSelf::dumpAllTextures() const +{ + std::string vd_text = "Local textures per baked index and wearable:\n"; + for (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); + baked_iter != LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); + ++baked_iter) + { + const LLAvatarAppearanceDefines::EBakedTextureIndex baked_index = baked_iter->first; + const LLViewerTexLayerSet *layerset = debugGetLayerSet(baked_index); + if (!layerset) continue; + const LLViewerTexLayerSetBuffer *layerset_buffer = layerset->getViewerComposite(); + if (!layerset_buffer) continue; + vd_text += verboseDebugDumpLocalTextureDataInfo(layerset); + } + LL_DEBUGS("Avatar") << vd_text << llendl; +} + +const std::string LLVOAvatarSelf::debugDumpLocalTextureDataInfo(const LLViewerTexLayerSet* layerset) const { std::string text=""; @@ -2059,21 +2160,21 @@ const std::string LLVOAvatarSelf::debugDumpLocalTextureDataInfo(const LLTexLayer /* if (layerset == mBakedTextureDatas[BAKED_HEAD].mTexLayerSet) return getLocalDiscardLevel(TEX_HEAD_BODYPAINT) >= 0; */ - for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); - baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); + for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); + baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); ++baked_iter) { const EBakedTextureIndex baked_index = baked_iter->first; if (layerset == mBakedTextureDatas[baked_index].mTexLayerSet) { - const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second; + const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = baked_iter->second; text += llformat("%d-%s ( ",baked_index, baked_dict->mName.c_str()); for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin(); local_tex_iter != baked_dict->mLocalTextures.end(); ++local_tex_iter) { const ETextureIndex tex_index = *local_tex_iter; - const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index); + const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index); const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type); if (wearable_count > 0) { @@ -2100,14 +2201,14 @@ const std::string LLVOAvatarSelf::debugDumpAllLocalTextureDataInfo() const for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { - const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); + const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i); BOOL is_texture_final = TRUE; for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin(); local_tex_iter != baked_dict->mLocalTextures.end(); ++local_tex_iter) { const ETextureIndex tex_index = *local_tex_iter; - const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index); + const LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(tex_index); const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type); for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++) { @@ -2119,20 +2220,14 @@ const std::string LLVOAvatarSelf::debugDumpAllLocalTextureDataInfo() const return text; } + +#if 0 // Dump avatar metrics data. LLSD LLVOAvatarSelf::metricsData() { // runway - add region info LLSD result; result["rez_status"] = LLVOAvatar::rezStatusToString(getRezzedStatus()); - std::vector<S32> rez_counts; - LLVOAvatar::getNearbyRezzedStats(rez_counts); - result["nearby"] = LLSD::emptyMap(); - for (S32 i=0; i<rez_counts.size(); ++i) - { - std::string rez_status_name = LLVOAvatar::rezStatusToString(i); - result["nearby"][rez_status_name] = rez_counts[i]; - } result["timers"]["debug_existence"] = mDebugExistenceTimer.getElapsedTimeF32(); result["timers"]["ruth_debug"] = mRuthDebugTimer.getElapsedTimeF32(); result["timers"]["ruth"] = mRuthTimer.getElapsedTimeF32(); @@ -2142,6 +2237,7 @@ LLSD LLVOAvatarSelf::metricsData() return result; } +#endif class ViewerAppearanceChangeMetricsResponder: public LLCurl::Responder { @@ -2159,6 +2255,7 @@ public: const std::string& reason, const LLSD& content) { + gPendingMetricsUploads--; // if we add retry, this should be moved to the isGoodStatus case. if (isGoodStatus(status)) { LL_DEBUGS("Avatar") << "OK" << LL_ENDL; @@ -2167,16 +2264,11 @@ public: else { LL_WARNS("Avatar") << "Failed " << status << " reason " << reason << LL_ENDL; - error(status,reason); + errorWithContent(status,reason,content); } } // virtual - void error(U32 status_num, const std::string & reason) - { - } - - // virtual void result(const LLSD & content) { if (mLiveSequence == mExpectedSequence) @@ -2191,19 +2283,121 @@ private: volatile bool & mReportingStarted; }; -void LLVOAvatarSelf::sendAppearanceChangeMetrics() +bool LLVOAvatarSelf::updateAvatarRezMetrics(bool force_send) +{ + const F32 AV_METRICS_INTERVAL_QA = 30.0; + F32 send_period = 300.0; + if (gSavedSettings.getBOOL("QAModeMetrics")) + { + send_period = AV_METRICS_INTERVAL_QA; + } + + if (force_send || mTimeSinceLastRezMessage.getElapsedTimeF32() > send_period) + { + // Stats for completed phases have been getting logged as they + // complete. This will give us stats for any timers that + // haven't finished as of the metric's being sent. + + if (force_send) + { + LLVOAvatar::logPendingPhasesAllAvatars(); + } + sendViewerAppearanceChangeMetrics(); + } + + return false; +} + +void LLVOAvatarSelf::addMetricsTimerRecord(const LLSD& record) +{ + mPendingTimerRecords.push_back(record); +} + +bool operator<(const LLSD& a, const LLSD& b) +{ + std::ostringstream aout, bout; + aout << LLSDNotationStreamer(a); + bout << LLSDNotationStreamer(b); + std::string astring = aout.str(); + std::string bstring = bout.str(); + + return astring < bstring; + +} + +// Given a vector of LLSD records, return an LLSD array of bucketed stats for val_field. +LLSD summarize_by_buckets(std::vector<LLSD> in_records, + std::vector<std::string> by_fields, + std::string val_field) +{ + LLSD result = LLSD::emptyArray(); + std::map<LLSD,LLViewerStats::StatsAccumulator> accum; + for (std::vector<LLSD>::iterator in_record_iter = in_records.begin(); + in_record_iter != in_records.end(); ++in_record_iter) + { + LLSD& record = *in_record_iter; + LLSD key; + for (std::vector<std::string>::iterator field_iter = by_fields.begin(); + field_iter != by_fields.end(); ++field_iter) + { + const std::string& field = *field_iter; + key[field] = record[field]; + } + LLViewerStats::StatsAccumulator& stats = accum[key]; + F32 value = record[val_field].asReal(); + stats.push(value); + } + for (std::map<LLSD,LLViewerStats::StatsAccumulator>::iterator accum_it = accum.begin(); + accum_it != accum.end(); ++accum_it) + { + LLSD out_record = accum_it->first; + out_record["stats"] = accum_it->second.getData(); + result.append(out_record); + } + return result; +} + +void LLVOAvatarSelf::sendViewerAppearanceChangeMetrics() { // gAgentAvatarp->stopAllPhases(); static volatile bool reporting_started(false); static volatile S32 report_sequence(0); - LLSD msg = metricsData(); + LLSD msg; // = metricsData(); msg["message"] = "ViewerAppearanceChangeMetrics"; msg["session_id"] = gAgentSessionID; msg["agent_id"] = gAgentID; msg["sequence"] = report_sequence; msg["initial"] = !reporting_started; msg["break"] = false; + msg["duration"] = mTimeSinceLastRezMessage.getElapsedTimeF32(); + + // Status of our own rezzing. + msg["rez_status"] = LLVOAvatar::rezStatusToString(getRezzedStatus()); + + // Status of all nearby avs including ourself. + msg["nearby"] = LLSD::emptyArray(); + std::vector<S32> rez_counts; + LLVOAvatar::getNearbyRezzedStats(rez_counts); + for (S32 rez_stat=0; rez_stat < rez_counts.size(); ++rez_stat) + { + std::string rez_status_name = LLVOAvatar::rezStatusToString(rez_stat); + msg["nearby"][rez_status_name] = rez_counts[rez_stat]; + } + + // std::vector<std::string> bucket_fields("timer_name","is_self","grid_x","grid_y","is_using_server_bake"); + std::vector<std::string> by_fields; + by_fields.push_back("timer_name"); + by_fields.push_back("completed"); + by_fields.push_back("grid_x"); + by_fields.push_back("grid_y"); + by_fields.push_back("is_using_server_bakes"); + by_fields.push_back("is_self"); + by_fields.push_back("central_bake_version"); + LLSD summary = summarize_by_buckets(mPendingTimerRecords, by_fields, std::string("elapsed")); + msg["timers"] = summary; + + mPendingTimerRecords.clear(); // Update sequence number if (S32_MAX == ++report_sequence) @@ -2218,20 +2412,79 @@ void LLVOAvatarSelf::sendAppearanceChangeMetrics() } if (!caps_url.empty()) { + gPendingMetricsUploads++; LLCurlRequest::headers_t headers; LLHTTPClient::post(caps_url, msg, new ViewerAppearanceChangeMetricsResponder(report_sequence, report_sequence, reporting_started)); + mTimeSinceLastRezMessage.reset(); } } +class CheckAgentAppearanceServiceResponder: public LLHTTPClient::Responder +{ +public: + CheckAgentAppearanceServiceResponder() + { + } + + virtual ~CheckAgentAppearanceServiceResponder() + { + } + + /* virtual */ void result(const LLSD& content) + { + LL_DEBUGS("Avatar") << "status OK" << llendl; + } + + // Error + /*virtual*/ void errorWithContent(U32 status, const std::string& reason, const LLSD& content) + { + if (isAgentAvatarValid()) + { + LL_DEBUGS("Avatar") << "failed, will rebake [status:" + << status << "]: " << content << llendl; + forceAppearanceUpdate(); + } + } + + static void forceAppearanceUpdate() + { + // Trying to rebake immediately after crossing region boundary + // seems to be failure prone; adding a delay factor. Yes, this + // fix is ad-hoc and not guaranteed to work in all cases. + doAfterInterval(boost::bind(&LLVOAvatarSelf::forceBakeAllTextures, + gAgentAvatarp.get(), true), 5.0); + } +}; + +void LLVOAvatarSelf::checkForUnsupportedServerBakeAppearance() +{ + // Need to check only if we have a server baked appearance and are + // in a non-baking region. + if (!gAgentAvatarp->isUsingServerBakes()) + return; + if (!gAgent.getRegion() || gAgent.getRegion()->getCentralBakeVersion()!=0) + return; + + // if baked image service is unknown, need to refresh. + if (LLAppearanceMgr::instance().getAppearanceServiceURL().empty()) + { + CheckAgentAppearanceServiceResponder::forceAppearanceUpdate(); + } + // query baked image service to check status. + std::string image_url = gAgentAvatarp->getImageURL(TEX_HEAD_BAKED, + getTE(TEX_HEAD_BAKED)->getID()); + LLHTTPClient::head(image_url, new CheckAgentAppearanceServiceResponder); +} + const LLUUID& LLVOAvatarSelf::grabBakedTexture(EBakedTextureIndex baked_index) const { if (canGrabBakedTexture(baked_index)) { - ETextureIndex tex_index = LLVOAvatarDictionary::bakedToLocalTextureIndex(baked_index); + ETextureIndex tex_index = LLAvatarAppearanceDictionary::bakedToLocalTextureIndex(baked_index); if (tex_index == TEX_NUM_INDICES) { return LLUUID::null; @@ -2243,7 +2496,7 @@ const LLUUID& LLVOAvatarSelf::grabBakedTexture(EBakedTextureIndex baked_index) c BOOL LLVOAvatarSelf::canGrabBakedTexture(EBakedTextureIndex baked_index) const { - ETextureIndex tex_index = LLVOAvatarDictionary::bakedToLocalTextureIndex(baked_index); + ETextureIndex tex_index = LLAvatarAppearanceDictionary::bakedToLocalTextureIndex(baked_index); if (tex_index == TEX_NUM_INDICES) { return FALSE; @@ -2262,19 +2515,19 @@ BOOL LLVOAvatarSelf::canGrabBakedTexture(EBakedTextureIndex baked_index) const // baked texture. We don't want people copying people's // work via baked textures. - const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index); + const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(baked_index); for (texture_vec_t::const_iterator iter = baked_dict->mLocalTextures.begin(); iter != baked_dict->mLocalTextures.end(); ++iter) { const ETextureIndex t_index = (*iter); - LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(t_index); + LLWearableType::EType wearable_type = LLAvatarAppearanceDictionary::getTEWearableType(t_index); U32 count = gAgentWearables.getWearableCount(wearable_type); lldebugs << "Checking index " << (U32) t_index << " count: " << count << llendl; for (U32 wearable_index = 0; wearable_index < count; ++wearable_index) { - LLWearable *wearable = gAgentWearables.getWearable(wearable_type, wearable_index); + LLViewerWearable *wearable = gAgentWearables.getViewerWearable(wearable_type, wearable_index); if (wearable) { const LLLocalTextureObject *texture = wearable->getLocalTextureObject((S32)t_index); @@ -2316,28 +2569,36 @@ BOOL LLVOAvatarSelf::canGrabBakedTexture(EBakedTextureIndex baked_index) const } void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTexture* imagep, - F32 texel_area_ratio, BOOL render_avatar, BOOL covered_by_baked, U32 index ) + F32 texel_area_ratio, BOOL render_avatar, BOOL covered_by_baked) { if (!isIndexLocalTexture(type)) return; - if (!covered_by_baked) + // Sunshine - ignoring covered_by_baked will force local textures + // to always load. Fix for SH-4001 and many related issues. Do + // not restore this without some more targetted fix for the local + // textures failing to load issue. + //if (!covered_by_baked) { - if (getLocalTextureID(type, index) != IMG_DEFAULT_AVATAR && imagep->getDiscardLevel() != 0) + if (imagep->getID() != IMG_DEFAULT_AVATAR) + { + imagep->setNoDelete(); + if (imagep->getDiscardLevel() != 0) { F32 desired_pixels; desired_pixels = llmin(mPixelArea, (F32)getTexImageArea()); - imagep->setBoostLevel(getAvatarBoostLevel()); + imagep->setBoostLevel(getAvatarBoostLevel()); + imagep->setAdditionalDecodePriority(SELF_ADDITIONAL_PRI) ; imagep->resetTextureStats(); imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); imagep->addTextureStats( desired_pixels / texel_area_ratio ); - imagep->setAdditionalDecodePriority(SELF_ADDITIONAL_PRI) ; imagep->forceUpdateBindStats() ; if (imagep->getDiscardLevel() < 0) { mHasGrey = TRUE; // for statistics gathering } } + } else { // texture asset is missing @@ -2346,10 +2607,10 @@ void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTe } } -LLLocalTextureObject* LLVOAvatarSelf::getLocalTextureObject(LLVOAvatarDefines::ETextureIndex i, U32 wearable_index) const +LLLocalTextureObject* LLVOAvatarSelf::getLocalTextureObject(LLAvatarAppearanceDefines::ETextureIndex i, U32 wearable_index) const { - LLWearableType::EType type = LLVOAvatarDictionary::getInstance()->getTEWearableType(i); - LLWearable* wearable = gAgentWearables.getWearable(type, wearable_index); + LLWearableType::EType type = LLAvatarAppearanceDictionary::getInstance()->getTEWearableType(i); + LLViewerWearable* wearable = gAgentWearables.getViewerWearable(type, wearable_index); if (wearable) { return wearable->getLocalTextureObject(i); @@ -2362,7 +2623,7 @@ LLLocalTextureObject* LLVOAvatarSelf::getLocalTextureObject(LLVOAvatarDefines::E // getBakedTE() // Used by the LayerSet. (Layer sets don't in general know what textures depend on them.) //----------------------------------------------------------------------------- -ETextureIndex LLVOAvatarSelf::getBakedTE( const LLTexLayerSet* layerset ) const +ETextureIndex LLVOAvatarSelf::getBakedTE( const LLViewerTexLayerSet* layerset ) const { for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { @@ -2376,9 +2637,9 @@ ETextureIndex LLVOAvatarSelf::getBakedTE( const LLTexLayerSet* layerset ) const } -void LLVOAvatarSelf::setNewBakedTexture(LLVOAvatarDefines::EBakedTextureIndex i, const LLUUID &uuid) +void LLVOAvatarSelf::setNewBakedTexture(LLAvatarAppearanceDefines::EBakedTextureIndex i, const LLUUID &uuid) { - ETextureIndex index = LLVOAvatarDictionary::bakedToLocalTextureIndex(i); + ETextureIndex index = LLAvatarAppearanceDictionary::bakedToLocalTextureIndex(i); setNewBakedTexture(index, uuid); } @@ -2391,7 +2652,7 @@ void LLVOAvatarSelf::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid ) { // Baked textures live on other sims. LLHost target_host = getObjectHost(); - setTEImage( te, LLViewerTextureManager::getFetchedTextureFromHost( uuid, target_host ) ); + setTEImage( te, LLViewerTextureManager::getFetchedTextureFromHost( uuid, FTT_HOST_BAKE, target_host ) ); updateMeshTextures(); dirtyMesh(); @@ -2400,7 +2661,7 @@ void LLVOAvatarSelf::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid ) /* switch(te) case TEX_HEAD_BAKED: llinfos << "New baked texture: HEAD" << llendl; */ - const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(te); + const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture(te); if (texture_dict->mIsBakedTexture) { debugBakedTextureUpload(texture_dict->mBakedTextureIndex, TRUE); // FALSE for start of upload, TRUE for finish. @@ -2465,7 +2726,7 @@ void LLVOAvatarSelf::outputRezDiagnostics() const LL_DEBUGS("Avatar") << "\t Time from avatar creation to de-cloud: " << (S32)mDebugTimeAvatarVisible << llendl; LL_DEBUGS("Avatar") << "\t Time from avatar creation to de-cloud for others: " << (S32)final_time << llendl; LL_DEBUGS("Avatar") << "\t Load time for each texture: " << llendl; - for (U32 i = 0; i < LLVOAvatarDefines::TEX_NUM_INDICES; ++i) + for (U32 i = 0; i < LLAvatarAppearanceDefines::TEX_NUM_INDICES; ++i) { std::stringstream out; out << "\t\t (" << i << ") "; @@ -2493,27 +2754,29 @@ void LLVOAvatarSelf::outputRezDiagnostics() const } } LL_DEBUGS("Avatar") << "\t Time points for each upload (start / finish)" << llendl; - for (U32 i = 0; i < LLVOAvatarDefines::BAKED_NUM_INDICES; ++i) + for (U32 i = 0; i < LLAvatarAppearanceDefines::BAKED_NUM_INDICES; ++i) { LL_DEBUGS("Avatar") << "\t\t (" << i << ") \t" << (S32)mDebugBakedTextureTimes[i][0] << " / " << (S32)mDebugBakedTextureTimes[i][1] << llendl; } - for (LLVOAvatarDefines::LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDefines::LLVOAvatarDictionary::getInstance()->getBakedTextures().begin(); - baked_iter != LLVOAvatarDefines::LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); + for (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin(); + baked_iter != LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end(); ++baked_iter) { - const LLVOAvatarDefines::EBakedTextureIndex baked_index = baked_iter->first; - const LLTexLayerSet *layerset = debugGetLayerSet(baked_index); + const LLAvatarAppearanceDefines::EBakedTextureIndex baked_index = baked_iter->first; + const LLViewerTexLayerSet *layerset = debugGetLayerSet(baked_index); if (!layerset) continue; - const LLTexLayerSetBuffer *layerset_buffer = layerset->getComposite(); + const LLViewerTexLayerSetBuffer *layerset_buffer = layerset->getViewerComposite(); if (!layerset_buffer) continue; LL_DEBUGS("Avatar") << layerset_buffer->dumpTextureInfo() << llendl; } + + dumpAllTextures(); } void LLVOAvatarSelf::outputRezTiming(const std::string& msg) const { - LL_INFOS("Avatar") + LL_DEBUGS("Avatar") << avString() << llformat("%s. Time from avatar creation: %.2f", msg.c_str(), mDebugSelfLoadTimer.getElapsedTimeF32()) << LL_ENDL; @@ -2538,7 +2801,8 @@ void LLVOAvatarSelf::setCachedBakedTexture( ETextureIndex te, const LLUUID& uuid mHeadLayerSet->cancelUpload(); */ for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { - if ( mBakedTextureDatas[i].mTextureIndex == te && mBakedTextureDatas[i].mTexLayerSet) + LLViewerTexLayerSet *layerset = getTexLayerSet(i); + if ( mBakedTextureDatas[i].mTextureIndex == te && layerset) { if (mInitialBakeIDs[i] != LLUUID::null) { @@ -2552,7 +2816,7 @@ void LLVOAvatarSelf::setCachedBakedTexture( ETextureIndex te, const LLUUID& uuid } mInitialBakeIDs[i] = LLUUID::null; } - mBakedTextureDatas[i].mTexLayerSet->cancelUpload(); + layerset->cancelUpload(); } } } @@ -2571,17 +2835,17 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**) /* ETextureIndex baked_texture_indices[BAKED_NUM_INDICES] = TEX_HEAD_BAKED, TEX_UPPER_BAKED, */ - for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); - iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); + for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); + iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); ++iter) { const ETextureIndex index = iter->first; - const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; + const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second; if (texture_dict->mIsBakedTexture) { if (texture_id == gAgentAvatarp->getTEImage(index)->getID()) { - LLTexLayerSet* layer_set = gAgentAvatarp->getLayerSet(index); + LLViewerTexLayerSet* layer_set = gAgentAvatarp->getLayerSet(index); if (layer_set) { llinfos << "TAT: rebake - matched entry " << (S32)index << llendl; @@ -2605,15 +2869,6 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**) } } -BOOL LLVOAvatarSelf::isUsingBakedTextures() const -{ - // Composite textures are used during appearance mode. - if (gAgentCamera.cameraCustomizeAvatar()) - return FALSE; - - return TRUE; -} - void LLVOAvatarSelf::forceBakeAllTextures(bool slam_for_debug) { @@ -2622,7 +2877,7 @@ void LLVOAvatarSelf::forceBakeAllTextures(bool slam_for_debug) for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { ETextureIndex baked_index = mBakedTextureDatas[i].mTextureIndex; - LLTexLayerSet* layer_set = getLayerSet(baked_index); + LLViewerTexLayerSet* layer_set = getLayerSet(baked_index); if (layer_set) { if (slam_for_debug) @@ -2654,7 +2909,7 @@ void LLVOAvatarSelf::requestLayerSetUpdate(ETextureIndex index ) case LOCTEX_UPPER_SHIRT: if( mUpperBodyLayerSet ) mUpperBodyLayerSet->requestUpdate(); */ - const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(index); + const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture(index); if (!texture_dict->mIsLocalTexture || !texture_dict->mIsUsedByBakedTexture) return; const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; @@ -2664,22 +2919,22 @@ void LLVOAvatarSelf::requestLayerSetUpdate(ETextureIndex index ) } } -LLTexLayerSet* LLVOAvatarSelf::getLayerSet(ETextureIndex index) const +LLViewerTexLayerSet* LLVOAvatarSelf::getLayerSet(ETextureIndex index) const { /* switch(index) case TEX_HEAD_BAKED: case TEX_HEAD_BODYPAINT: return mHeadLayerSet; */ - const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(index); + const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture(index); if (texture_dict->mIsUsedByBakedTexture) { const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; - return mBakedTextureDatas[baked_index].mTexLayerSet; + return getLayerSet(baked_index); } return NULL; } -LLTexLayerSet* LLVOAvatarSelf::getLayerSet(EBakedTextureIndex baked_index) const +LLViewerTexLayerSet* LLVOAvatarSelf::getLayerSet(EBakedTextureIndex baked_index) const { /* switch(index) case TEX_HEAD_BAKED: @@ -2687,26 +2942,60 @@ LLTexLayerSet* LLVOAvatarSelf::getLayerSet(EBakedTextureIndex baked_index) const return mHeadLayerSet; */ if (baked_index >= 0 && baked_index < BAKED_NUM_INDICES) { - return mBakedTextureDatas[baked_index].mTexLayerSet; + return getTexLayerSet(baked_index); } return NULL; } + + // static -void LLVOAvatarSelf::onCustomizeStart() +void LLVOAvatarSelf::onCustomizeStart(bool disable_camera_switch) { - // We're no longer doing any baking or invalidating on entering - // appearance editing mode. Leaving function in place in case - // further changes require us to do something at this point - Nyx + if (isAgentAvatarValid()) + { + gAgentAvatarp->mIsEditingAppearance = true; + gAgentAvatarp->mUseLocalAppearance = true; + + if (gSavedSettings.getBOOL("AppearanceCameraMovement") && !disable_camera_switch) +{ + gAgentCamera.changeCameraToCustomizeAvatar(); + } + +#if 0 + gAgentAvatarp->clearVisualParamWeights(); + gAgentAvatarp->idleUpdateAppearanceAnimation(); +#endif + + gAgentAvatarp->invalidateAll(); // mark all bakes as dirty, request updates + gAgentAvatarp->updateMeshTextures(); // make sure correct textures are applied to the avatar mesh. + gAgentAvatarp->updateTextures(); // call updateTextureStats + } } // static -void LLVOAvatarSelf::onCustomizeEnd() +void LLVOAvatarSelf::onCustomizeEnd(bool disable_camera_switch) { + if (isAgentAvatarValid()) { + gAgentAvatarp->mIsEditingAppearance = false; + if (gAgentAvatarp->getRegion() && !gAgentAvatarp->getRegion()->getCentralBakeVersion()) + { + // FIXME DRANO - move to sendAgentSetAppearance, make conditional on upload complete. + gAgentAvatarp->mUseLocalAppearance = false; + } + gAgentAvatarp->invalidateAll(); + + if (gSavedSettings.getBOOL("AppearanceCameraMovement") && !disable_camera_switch) + { + gAgentCamera.changeCameraToDefault(); + gAgentCamera.resetView(); + } + + LLAppearanceMgr::instance().updateAppearanceFromCOF(); } } @@ -2719,12 +3008,12 @@ bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const { LLUUID texture_id[TEX_NUM_INDICES]; // pack away current TEs to make sure we don't send them out - for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); - iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); + for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); + iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); ++iter) { const ETextureIndex index = iter->first; - const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; + const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second; if (!texture_dict->mIsBakedTexture) { LLTextureEntry* entry = getTE((U8) index); @@ -2736,12 +3025,12 @@ bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const bool success = packTEMessage(mesgsys); // unpack TEs to make sure we don't re-trigger a bake - for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin(); - iter != LLVOAvatarDictionary::getInstance()->getTextures().end(); + for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); + iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); ++iter) { const ETextureIndex index = iter->first; - const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second; + const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second; if (!texture_dict->mIsBakedTexture) { LLTextureEntry* entry = getTE((U8) index); @@ -2797,3 +3086,36 @@ void LLVOAvatarSelf::dumpScratchTextureByteCount() { llinfos << "Scratch Texture GL: " << (sScratchTexBytes/1024) << "KB" << llendl; } + +void LLVOAvatarSelf::dumpWearableInfo(LLAPRFile& outfile) +{ + apr_file_t* file = outfile.getFileHandle(); + if (!file) + { + return; + } + + + apr_file_printf( file, "\n<wearable_info>\n" ); + + LLWearableData *wd = getWearableData(); + for (S32 type = 0; type < LLWearableType::WT_COUNT; type++) + { + const std::string& type_name = LLWearableType::getTypeName((LLWearableType::EType)type); + for (U32 j=0; j< wd->getWearableCount((LLWearableType::EType)type); j++) + { + LLViewerWearable *wearable = gAgentWearables.getViewerWearable((LLWearableType::EType)type,j); + apr_file_printf( file, "\n\t <wearable type=\"%s\" name=\"%s\"/>\n", + type_name.c_str(), wearable->getName().c_str() ); + LLWearable::visual_param_vec_t v_params; + wearable->getVisualParams(v_params); + for (LLWearable::visual_param_vec_t::iterator it = v_params.begin(); + it != v_params.end(); ++it) + { + LLVisualParam *param = *it; + dump_visual_param(file, param, param->getWeight()); + } + } + } + apr_file_printf( file, "\n</wearable_info>\n" ); +} diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 7bd0c0bf93..3b7b6bac64 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -67,9 +67,8 @@ public: protected: /*virtual*/ BOOL loadAvatar(); BOOL loadAvatarSelf(); - BOOL buildSkeletonSelf(const LLVOAvatarSkeletonInfo *info); + BOOL buildSkeletonSelf(const LLAvatarSkeletonInfo *info); BOOL buildMenus(); - /*virtual*/ BOOL loadLayersets(); /** Initialization ** ** @@ -97,7 +96,7 @@ public: void resetJointPositions( void ); - /*virtual*/ BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE ); + /*virtual*/ BOOL setVisualParamWeight(const LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE ); /*virtual*/ BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake = FALSE ); /*virtual*/ BOOL setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake = FALSE ); /*virtual*/ void updateVisualParams(); @@ -111,7 +110,7 @@ public: private: // helper function. Passed in param is assumed to be in avatar's parameter list. - BOOL setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL upload_bake = FALSE ); + BOOL setParamWeight(const LLViewerVisualParam *param, F32 weight, BOOL upload_bake = FALSE ); @@ -131,6 +130,7 @@ private: public: /*virtual*/ bool isSelf() const { return true; } + /*virtual*/ BOOL isValid() const; //-------------------------------------------------------------------- // Updates @@ -177,8 +177,8 @@ private: // LLVOAvatar Constants //-------------------------------------------------------------------- public: - /*virtual*/ LLViewerTexture::EBoostLevel getAvatarBoostLevel() const { return LLViewerTexture::BOOST_AVATAR_SELF; } - /*virtual*/ LLViewerTexture::EBoostLevel getAvatarBakedBoostLevel() const { return LLViewerTexture::BOOST_AVATAR_BAKED_SELF; } + /*virtual*/ LLViewerTexture::EBoostLevel getAvatarBoostLevel() const { return LLGLTexture::BOOST_AVATAR_SELF; } + /*virtual*/ LLViewerTexture::EBoostLevel getAvatarBakedBoostLevel() const { return LLGLTexture::BOOST_AVATAR_BAKED_SELF; } /*virtual*/ S32 getTexImageSize() const { return LLVOAvatar::getTexImageSize()*4; } /** Rendering @@ -195,32 +195,32 @@ public: //-------------------------------------------------------------------- public: /*virtual*/ bool hasPendingBakedUploads() const; - S32 getLocalDiscardLevel(LLVOAvatarDefines::ETextureIndex type, U32 index) const; + S32 getLocalDiscardLevel(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const; bool areTexturesCurrent() const; - BOOL isLocalTextureDataAvailable(const LLTexLayerSet* layerset) const; - BOOL isLocalTextureDataFinal(const LLTexLayerSet* layerset) const; - BOOL isBakedTextureFinal(const LLVOAvatarDefines::EBakedTextureIndex index) const; + BOOL isLocalTextureDataAvailable(const LLViewerTexLayerSet* layerset) const; + BOOL isLocalTextureDataFinal(const LLViewerTexLayerSet* layerset) const; + BOOL isBakedTextureFinal(const LLAvatarAppearanceDefines::EBakedTextureIndex index) const; // If you want to check all textures of a given type, pass gAgentWearables.getWearableCount() for index - /*virtual*/ BOOL isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index) const; - /*virtual*/ BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const; - /*virtual*/ BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const; + /*virtual*/ BOOL isTextureDefined(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const; + /*virtual*/ BOOL isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, U32 index = 0) const; + /*virtual*/ BOOL isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerWearable *wearable) const; //-------------------------------------------------------------------- // Local Textures //-------------------------------------------------------------------- public: - BOOL getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture** image_gl_pp, U32 index) const; - LLViewerFetchedTexture* getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, U32 index) const; - const LLUUID& getLocalTextureID(LLVOAvatarDefines::ETextureIndex type, U32 index) const; + BOOL getLocalTextureGL(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerTexture** image_gl_pp, U32 index) const; + LLViewerFetchedTexture* getLocalTextureGL(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const; + const LLUUID& getLocalTextureID(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const; void setLocalTextureTE(U8 te, LLViewerTexture* image, U32 index); - /*virtual*/ void setLocalTexture(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index); + /*virtual*/ void setLocalTexture(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index); protected: - /*virtual*/ void setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index); + /*virtual*/ void setBakedReady(LLAvatarAppearanceDefines::ETextureIndex type, BOOL baked_version_exists, U32 index); void localTextureLoaded(BOOL succcess, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); void getLocalTextureByteCount(S32* gl_byte_count) const; - /*virtual*/ void addLocalTextureStats(LLVOAvatarDefines::ETextureIndex i, LLViewerFetchedTexture* imagep, F32 texel_area_ratio, BOOL rendered, BOOL covered_by_baked, U32 index); - LLLocalTextureObject* getLocalTextureObject(LLVOAvatarDefines::ETextureIndex i, U32 index) const; + /*virtual*/ void addLocalTextureStats(LLAvatarAppearanceDefines::ETextureIndex i, LLViewerFetchedTexture* imagep, F32 texel_area_ratio, BOOL rendered, BOOL covered_by_baked); + LLLocalTextureObject* getLocalTextureObject(LLAvatarAppearanceDefines::ETextureIndex i, U32 index) const; private: static void onLocalTextureLoaded(BOOL succcess, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); @@ -233,13 +233,12 @@ private: // Baked textures //-------------------------------------------------------------------- public: - LLVOAvatarDefines::ETextureIndex getBakedTE(const LLTexLayerSet* layerset ) const; - void setNewBakedTexture(LLVOAvatarDefines::EBakedTextureIndex i, const LLUUID &uuid); - void setNewBakedTexture(LLVOAvatarDefines::ETextureIndex i, const LLUUID& uuid); - void setCachedBakedTexture(LLVOAvatarDefines::ETextureIndex i, const LLUUID& uuid); + LLAvatarAppearanceDefines::ETextureIndex getBakedTE(const LLViewerTexLayerSet* layerset ) const; + void setNewBakedTexture(LLAvatarAppearanceDefines::EBakedTextureIndex i, const LLUUID &uuid); + void setNewBakedTexture(LLAvatarAppearanceDefines::ETextureIndex i, const LLUUID& uuid); + void setCachedBakedTexture(LLAvatarAppearanceDefines::ETextureIndex i, const LLUUID& uuid); void forceBakeAllTextures(bool slam_for_debug = false); static void processRebakeAvatarTextures(LLMessageSystem* msg, void**); - BOOL isUsingBakedTextures() const; // e.g. false if in appearance edit mode protected: /*virtual*/ void removeMissingBakedTextures(); @@ -248,10 +247,11 @@ protected: //-------------------------------------------------------------------- public: void requestLayerSetUploads(); - void requestLayerSetUpload(LLVOAvatarDefines::EBakedTextureIndex i); - void requestLayerSetUpdate(LLVOAvatarDefines::ETextureIndex i); - LLTexLayerSet* getLayerSet(LLVOAvatarDefines::ETextureIndex index) const; - LLTexLayerSet* getLayerSet(LLVOAvatarDefines::EBakedTextureIndex baked_index) const; + void requestLayerSetUpload(LLAvatarAppearanceDefines::EBakedTextureIndex i); + void requestLayerSetUpdate(LLAvatarAppearanceDefines::ETextureIndex i); + LLViewerTexLayerSet* getLayerSet(LLAvatarAppearanceDefines::EBakedTextureIndex baked_index) const; + LLViewerTexLayerSet* getLayerSet(LLAvatarAppearanceDefines::ETextureIndex index) const; + //-------------------------------------------------------------------- // Composites @@ -265,8 +265,8 @@ public: void setupComposites(); void updateComposites(); - const LLUUID& grabBakedTexture(LLVOAvatarDefines::EBakedTextureIndex baked_index) const; - BOOL canGrabBakedTexture(LLVOAvatarDefines::EBakedTextureIndex baked_index) const; + const LLUUID& grabBakedTexture(LLAvatarAppearanceDefines::EBakedTextureIndex baked_index) const; + BOOL canGrabBakedTexture(LLAvatarAppearanceDefines::EBakedTextureIndex baked_index) const; //-------------------------------------------------------------------- @@ -300,10 +300,9 @@ protected: **/ public: - /*virtual*/ BOOL isWearingWearableType(LLWearableType::EType type) const; void wearableUpdated(LLWearableType::EType type, BOOL upload_result); protected: - U32 getNumWearables(LLVOAvatarDefines::ETextureIndex i) const; + U32 getNumWearables(LLAvatarAppearanceDefines::ETextureIndex i) const; //-------------------------------------------------------------------- // Attachments @@ -340,8 +339,8 @@ private: **/ public: - static void onCustomizeStart(); - static void onCustomizeEnd(); + static void onCustomizeStart(bool disable_camera_switch = false); + static void onCustomizeEnd(bool disable_camera_switch = false); //-------------------------------------------------------------------- // Visibility @@ -365,6 +364,7 @@ public: static void dumpTotalLocalTextureByteCount(); void dumpLocalTextures() const; static void dumpScratchTextureByteCount(); + void dumpWearableInfo(LLAPRFile& outfile); //-------------------------------------------------------------------- // Avatar Rez Metrics @@ -372,34 +372,43 @@ public: public: struct LLAvatarTexData { - LLAvatarTexData(const LLUUID& id, LLVOAvatarDefines::ETextureIndex index) : + LLAvatarTexData(const LLUUID& id, LLAvatarAppearanceDefines::ETextureIndex index) : mAvatarID(id), mIndex(index) {} LLUUID mAvatarID; - LLVOAvatarDefines::ETextureIndex mIndex; + LLAvatarAppearanceDefines::ETextureIndex mIndex; }; + + LLTimer mTimeSinceLastRezMessage; + bool updateAvatarRezMetrics(bool force_send); + + std::vector<LLSD> mPendingTimerRecords; + void addMetricsTimerRecord(const LLSD& record); + void debugWearablesLoaded() { mDebugTimeWearablesLoaded = mDebugSelfLoadTimer.getElapsedTimeF32(); } void debugAvatarVisible() { mDebugTimeAvatarVisible = mDebugSelfLoadTimer.getElapsedTimeF32(); } void outputRezDiagnostics() const; void outputRezTiming(const std::string& msg) const; void reportAvatarRezTime() const; - void debugBakedTextureUpload(LLVOAvatarDefines::EBakedTextureIndex index, BOOL finished); + void debugBakedTextureUpload(LLAvatarAppearanceDefines::EBakedTextureIndex index, BOOL finished); static void debugOnTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); BOOL isAllLocalTextureDataFinal() const; - const LLTexLayerSet* debugGetLayerSet(LLVOAvatarDefines::EBakedTextureIndex index) const { return mBakedTextureDatas[index].mTexLayerSet; } - const std::string debugDumpLocalTextureDataInfo(const LLTexLayerSet* layerset) const; // Lists out state of this particular baked texture layer + const LLViewerTexLayerSet* debugGetLayerSet(LLAvatarAppearanceDefines::EBakedTextureIndex index) const { return (LLViewerTexLayerSet*)(mBakedTextureDatas[index].mTexLayerSet); } + const std::string verboseDebugDumpLocalTextureDataInfo(const LLViewerTexLayerSet* layerset) const; // Lists out state of this particular baked texture layer + void dumpAllTextures() const; + const std::string debugDumpLocalTextureDataInfo(const LLViewerTexLayerSet* layerset) const; // Lists out state of this particular baked texture layer const std::string debugDumpAllLocalTextureDataInfo() const; // Lists out which baked textures are at highest LOD - LLSD metricsData(); - void sendAppearanceChangeMetrics(); // send data associated with completing a change. + void sendViewerAppearanceChangeMetrics(); // send data associated with completing a change. + void checkForUnsupportedServerBakeAppearance(); private: LLFrameTimer mDebugSelfLoadTimer; F32 mDebugTimeWearablesLoaded; F32 mDebugTimeAvatarVisible; - F32 mDebugTextureLoadTimes[LLVOAvatarDefines::TEX_NUM_INDICES][MAX_DISCARD_LEVEL+1]; // load time for each texture at each discard level - F32 mDebugBakedTextureTimes[LLVOAvatarDefines::BAKED_NUM_INDICES][2]; // time to start upload and finish upload of each baked texture + F32 mDebugTextureLoadTimes[LLAvatarAppearanceDefines::TEX_NUM_INDICES][MAX_DISCARD_LEVEL+1]; // load time for each texture at each discard level + F32 mDebugBakedTextureTimes[LLAvatarAppearanceDefines::BAKED_NUM_INDICES][2]; // time to start upload and finish upload of each baked texture void debugTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); /** Diagnostics @@ -413,8 +422,7 @@ extern LLPointer<LLVOAvatarSelf> gAgentAvatarp; BOOL isAgentAvatarValid(); void selfStartPhase(const std::string& phase_name); -void selfStopPhase(const std::string& phase_name); -void selfStopAllPhases(); +void selfStopPhase(const std::string& phase_name, bool err_check = true); void selfClearPhases(); #endif // LL_VO_AVATARSELF_H diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp index 4dca87652d..6a25b765cf 100644 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -102,7 +102,7 @@ void LLVOGrass::updateSpecies() SpeciesMap::const_iterator it = sSpeciesTable.begin(); mSpecies = (*it).first; } - setTEImage(0, LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); + setTEImage(0, LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); } diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index ceff75a0cc..ac2a34ba1e 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -56,7 +56,8 @@ class LLVoiceCallCapResponder : public LLHTTPClient::Responder public: LLVoiceCallCapResponder(const LLUUID& session_id) : mSessionID(session_id) {}; - virtual void error(U32 status, const std::string& reason); // called with bad status codes + // called with bad status codes + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content); virtual void result(const LLSD& content); private: @@ -64,11 +65,10 @@ private: }; -void LLVoiceCallCapResponder::error(U32 status, const std::string& reason) +void LLVoiceCallCapResponder::errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - LL_WARNS("Voice") << "LLVoiceCallCapResponder::error(" - << status << ": " << reason << ")" - << LL_ENDL; + LL_WARNS("Voice") << "LLVoiceCallCapResponder error [status:" + << status << "]: " << content << LL_ENDL; LLVoiceChannel* channelp = LLVoiceChannel::getChannelByID(mSessionID); if ( channelp ) { diff --git a/indra/newview/llvoicevisualizer.cpp b/indra/newview/llvoicevisualizer.cpp index b497f80560..9281334d81 100644 --- a/indra/newview/llvoicevisualizer.cpp +++ b/indra/newview/llvoicevisualizer.cpp @@ -125,7 +125,7 @@ LLVoiceVisualizer::LLVoiceVisualizer( const U8 type ) for (int i=0; i<NUM_VOICE_SYMBOL_WAVES; i++) { mSoundSymbol.mWaveFadeOutStartTime [i] = mCurrentTime; - mSoundSymbol.mTexture [i] = LLViewerTextureManager::getFetchedTextureFromFile(sound_level_img[i], FALSE, LLViewerTexture::BOOST_UI); + mSoundSymbol.mTexture [i] = LLViewerTextureManager::getFetchedTextureFromFile(sound_level_img[i], FTT_LOCAL_FILE, FALSE, LLGLTexture::BOOST_UI); mSoundSymbol.mWaveActive [i] = false; mSoundSymbol.mWaveOpacity [i] = 1.0f; mSoundSymbol.mWaveExpansion [i] = 1.0f; diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index c3cc90f040..9b5d981aa5 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -130,17 +130,18 @@ public: mRetries = retries; } - virtual void error(U32 status, const std::string& reason) + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) { + LL_WARNS("Voice") << "ProvisionVoiceAccountRequest returned an error, " + << ( (mRetries > 0) ? "retrying" : "too many retries (giving up)" ) + << status << "]: " << content << LL_ENDL; + if ( mRetries > 0 ) { - LL_WARNS("Voice") << "ProvisionVoiceAccountRequest returned an error, retrying. status = " << status << ", reason = \"" << reason << "\"" << LL_ENDL; - LLVivoxVoiceClient::getInstance()->requestVoiceAccountProvision( - mRetries - 1); + LLVivoxVoiceClient::getInstance()->requestVoiceAccountProvision(mRetries - 1); } else { - LL_WARNS("Voice") << "ProvisionVoiceAccountRequest returned an error, too many retries (giving up). status = " << status << ", reason = \"" << reason << "\"" << LL_ENDL; LLVivoxVoiceClient::getInstance()->giveUp(); } } @@ -199,18 +200,18 @@ class LLVivoxVoiceClientCapResponder : public LLHTTPClient::Responder public: LLVivoxVoiceClientCapResponder(LLVivoxVoiceClient::state requesting_state) : mRequestingState(requesting_state) {}; - virtual void error(U32 status, const std::string& reason); // called with bad status codes + // called with bad status codes + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content); virtual void result(const LLSD& content); private: LLVivoxVoiceClient::state mRequestingState; // state }; -void LLVivoxVoiceClientCapResponder::error(U32 status, const std::string& reason) +void LLVivoxVoiceClientCapResponder::errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - LL_WARNS("Voice") << "LLVivoxVoiceClientCapResponder::error(" - << status << ": " << reason << ")" - << LL_ENDL; + LL_WARNS("Voice") << "LLVivoxVoiceClientCapResponder error [status:" + << status << "]: " << content << LL_ENDL; LLVivoxVoiceClient::getInstance()->sessionTerminate(); } @@ -2249,7 +2250,8 @@ void LLVivoxVoiceClient::giveUp() static void oldSDKTransform (LLVector3 &left, LLVector3 &up, LLVector3 &at, LLVector3d &pos, LLVector3 &vel) { - F32 nat[3], nup[3], nl[3], nvel[3]; // the new at, up, left vectors and the new position and velocity + F32 nat[3], nup[3], nl[3]; // the new at, up, left vectors and the new position and velocity +// F32 nvel[3]; F64 npos[3]; // The original XML command was sent like this: @@ -2299,9 +2301,9 @@ static void oldSDKTransform (LLVector3 &left, LLVector3 &up, LLVector3 &at, LLVe npos[1] = pos.mdV[VZ]; npos[2] = pos.mdV[VY]; - nvel[0] = vel.mV[VX]; - nvel[1] = vel.mV[VZ]; - nvel[2] = vel.mV[VY]; +// nvel[0] = vel.mV[VX]; +// nvel[1] = vel.mV[VZ]; +// nvel[2] = vel.mV[VY]; for(int i=0;i<3;++i) { at.mV[i] = nat[i]; @@ -3938,7 +3940,6 @@ void LLVivoxVoiceClient::messageEvent( bool is_do_not_disturb = gAgent.isDoNotDisturb(); bool is_muted = LLMuteList::getInstance()->isMuted(session->mCallerID, session->mName, LLMute::flagTextChat); bool is_linden = LLMuteList::getInstance()->isLinden(session->mName); - bool quiet_chat = false; LLChat chat; chat.mMuted = is_muted && !is_linden; @@ -3951,7 +3952,6 @@ void LLVivoxVoiceClient::messageEvent( if(is_do_not_disturb && !is_linden) { - quiet_chat = true; // TODO: Question: Return do not disturb mode response here? Or maybe when session is started instead? } diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index 31358df85f..36793017ed 100644 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -298,7 +298,7 @@ void LLSkyTex::create(const F32 brightness) void LLSkyTex::createGLImage(S32 which) { - mTexture[which]->createGLTexture(0, mImageRaw[which], 0, TRUE, LLViewerTexture::LOCAL); + mTexture[which]->createGLTexture(0, mImageRaw[which], 0, TRUE, LLGLTexture::LOCAL); mTexture[which]->setAddressMode(LLTexUnit::TAM_CLAMP); } @@ -384,9 +384,9 @@ LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) mSun.setIntensity(SUN_INTENSITY); mMoon.setIntensity(0.1f * SUN_INTENSITY); - mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI); + mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI); mSunTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); - mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI); + mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI); mMoonTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); mBloomTexturep = LLViewerTextureManager::getFetchedTexture(IMG_BLOOM1); mBloomTexturep->setNoDelete() ; @@ -478,9 +478,9 @@ void LLVOSky::restoreGL() { mSkyTex[i].restoreGL(); } - mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI); + mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI); mSunTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); - mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI); + mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI); mMoonTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); mBloomTexturep = LLViewerTextureManager::getFetchedTexture(IMG_BLOOM1); mBloomTexturep->setNoDelete() ; diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp index cb905d02da..de15f0ef43 100644 --- a/indra/newview/llvosurfacepatch.cpp +++ b/indra/newview/llvosurfacepatch.cpp @@ -467,7 +467,7 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, S32 vertex_count = 0; S32 i, x, y; - S32 num_vertices, num_indices; + S32 num_vertices; U32 render_stride = mLastStride; S32 patch_size = mPatchp->getSurface()->getGridsPerPatchEdge(); @@ -485,7 +485,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, if (north_stride == render_stride) { num_vertices = 2 * length + 1; - num_indices = length * 6 - 3; facep->mCenterAgent = (mPatchp->getPointAgent(8, 15) + mPatchp->getPointAgent(8, 16))*0.5f; @@ -536,7 +535,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, { // North stride is longer (has less vertices) num_vertices = length + length/2 + 1; - num_indices = half_length*9 - 3; facep->mCenterAgent = (mPatchp->getPointAgent(7, 15) + mPatchp->getPointAgent(8, 16))*0.5f; @@ -595,7 +593,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, length = patch_size / north_stride; half_length = length / 2; num_vertices = length + half_length + 1; - num_indices = 9*half_length - 3; facep->mCenterAgent = (mPatchp->getPointAgent(15, 7) + mPatchp->getPointAgent(16, 8))*0.5f; @@ -666,7 +663,7 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, { S32 i, x, y; - S32 num_vertices, num_indices; + S32 num_vertices; U32 render_stride = mLastStride; S32 patch_size = mPatchp->getSurface()->getGridsPerPatchEdge(); @@ -679,7 +676,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, if (east_stride == render_stride) { num_vertices = 2 * length + 1; - num_indices = length * 6 - 3; facep->mCenterAgent = (mPatchp->getPointAgent(8, 15) + mPatchp->getPointAgent(8, 16))*0.5f; @@ -728,7 +724,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, { // East stride is longer (has less vertices) num_vertices = length + half_length + 1; - num_indices = half_length*9 - 3; facep->mCenterAgent = (mPatchp->getPointAgent(7, 15) + mPatchp->getPointAgent(8, 16))*0.5f; @@ -783,7 +778,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep, length = patch_size / east_stride; half_length = length / 2; num_vertices = length + length/2 + 1; - num_indices = 9*(length/2) - 3; facep->mCenterAgent = (mPatchp->getPointAgent(15, 7) + mPatchp->getPointAgent(16, 8))*0.5f; diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 3d9c4c59b3..a1b36e3c8d 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -316,7 +316,7 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys, // Load Species-Specific data // static const S32 MAX_TREE_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL = 32 ; //frames. - mTreeImagep = LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + mTreeImagep = LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); mTreeImagep->setMaxVirtualSizeResetInterval(MAX_TREE_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); //allow to wait for at most 16 frames to reset virtual size. mBranchLength = sSpeciesTable[mSpecies]->mBranchLength; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index edd47b68c3..a08a8a9676 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -372,7 +372,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, // Unpack texture entry data // - S32 result = unpackTEMessage(mesgsys, _PREHASH_ObjectData, block_num); + S32 result = unpackTEMessage(mesgsys, _PREHASH_ObjectData, (S32) block_num); if (result & teDirtyBits) { updateTEData(); @@ -721,7 +721,7 @@ void LLVOVolume::updateTextureVirtualSize(bool forced) { F32 area = (F32) camera->getScreenPixelArea(); vsize = area; - imagep->setBoostLevel(LLViewerTexture::BOOST_HUD); + imagep->setBoostLevel(LLGLTexture::BOOST_HUD); face->setPixelArea(area); // treat as full screen face->setVirtualSize(vsize); } @@ -777,7 +777,7 @@ void LLVOVolume::updateTextureVirtualSize(bool forced) if (mSculptTexture.notNull()) { mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(), - (S32)LLViewerTexture::BOOST_SCULPTED)); + (S32)LLGLTexture::BOOST_SCULPTED)); mSculptTexture->setForSculpt() ; if(!mSculptTexture->isCachedRawImageReady()) @@ -986,7 +986,7 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams ¶ms_in, const S32 detail, bo if (is404) { - setIcon(LLViewerTextureManager::getFetchedTextureFromFile("icons/Inv_Mesh.png", TRUE, LLViewerTexture::BOOST_UI)); + setIcon(LLViewerTextureManager::getFetchedTextureFromFile("icons/Inv_Mesh.png", FTT_LOCAL_FILE, TRUE, LLGLTexture::BOOST_UI)); //render prim proxy when mesh loading attempts give up volume_params.setSculptID(LLUUID::null, LL_SCULPT_TYPE_NONE); @@ -1070,7 +1070,7 @@ void LLVOVolume::updateSculptTexture() LLUUID id = sculpt_params->getSculptTexture(); if (id.notNull()) { - mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); } } else @@ -1993,6 +1993,7 @@ S32 LLVOVolume::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID) << LL_ENDL; if (res) { + LL_DEBUGS("MaterialTEs") << " " << pMaterialID.asString() << LL_ENDL; LLMaterialMgr::instance().get(getRegion()->getRegionID(), pMaterialID, boost::bind(&LLVOVolume::setTEMaterialParamsCallback, this, _1, _2)); gPipeline.markTextured(mDrawable); mFaceMappingChanged = TRUE; @@ -2770,7 +2771,7 @@ void LLVOVolume::updateSpotLightPriority() if (mLightTexture.notNull()) { mLightTexture->addTextureStats(mSpotLightPriority); - mLightTexture->setBoostLevel(LLViewerTexture::BOOST_CLOUDS); + mLightTexture->setBoostLevel(LLGLTexture::BOOST_CLOUDS); } } diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp index 7f17fd3e56..4e26587184 100644 --- a/indra/newview/llvowlsky.cpp +++ b/indra/newview/llvowlsky.cpp @@ -724,8 +724,8 @@ void LLVOWLSky::updateStarColors() const F32 var = 0.15f; const F32 min = 0.5f; //0.75f; - const F32 sunclose_max = 0.6f; - const F32 sunclose_range = 1 - sunclose_max; + //const F32 sunclose_max = 0.6f; + //const F32 sunclose_range = 1 - sunclose_max; //F32 below_horizon = - llmin(0.0f, gSky.mVOSkyp->getToSunLast().mV[2]); //F32 brightness_factor = llmin(1.0f, below_horizon * 20); @@ -739,14 +739,14 @@ void LLVOWLSky::updateStarColors() U32 x; for (x = 0; x < getStarsNumVerts(); ++x) { - F32 sundir_factor = 1; + //F32 sundir_factor = 1; LLVector3 tostar = *v_p; tostar.normVec(); - const F32 how_close_to_sun = tostar * gSky.mVOSkyp->getToSunLast(); - if (how_close_to_sun > sunclose_max) - { - sundir_factor = (1 - how_close_to_sun) / sunclose_range; - } + //const F32 how_close_to_sun = tostar * gSky.mVOSkyp->getToSunLast(); + //if (how_close_to_sun > sunclose_max) + //{ + // sundir_factor = (1 - how_close_to_sun) / sunclose_range; + //} intensity = *(v_i); F32 alpha = v_c->mV[VALPHA] + (ll_frand() - 0.5f) * var * intensity; if (alpha < min * intensity) diff --git a/indra/newview/llwaterparamset.cpp b/indra/newview/llwaterparamset.cpp index 39d366b023..9cc91d2246 100644 --- a/indra/newview/llwaterparamset.cpp +++ b/indra/newview/llwaterparamset.cpp @@ -185,8 +185,6 @@ LLVector3 LLWaterParamSet::getVector3(const std::string& paramName, bool& error) LLVector2 LLWaterParamSet::getVector2(const std::string& paramName, bool& error) { // test to see if right type - int ttest; - ttest = mParamValues.size(); LLSD cur_val = mParamValues.get(paramName); if (!cur_val.isArray() || cur_val.size() != 2) { diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp deleted file mode 100644 index 402504933c..0000000000 --- a/indra/newview/llwearable.cpp +++ /dev/null @@ -1,1285 +0,0 @@ -/** - * @file llwearable.cpp - * @brief LLWearable class implementation - * - * $LicenseInfo:firstyear=2002&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$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llagent.h" -#include "llagentcamera.h" -#include "llagentwearables.h" -#include "lldictionary.h" -#include "llfloatersidepanelcontainer.h" -#include "lllocaltextureobject.h" -#include "llnotificationsutil.h" -#include "llviewertexturelist.h" -#include "llinventorymodel.h" -#include "llinventoryobserver.h" -#include "llsidepanelappearance.h" -#include "lltexlayer.h" -#include "lltexglobalcolor.h" -#include "lltrans.h" -#include "llviewerregion.h" -#include "llvisualparam.h" -#include "llvoavatar.h" -#include "llvoavatarself.h" -#include "llvoavatardefines.h" -#include "llwearable.h" -#include "llviewercontrol.h" - -using namespace LLVOAvatarDefines; - -// static -S32 LLWearable::sCurrentDefinitionVersion = 1; - -// support class - remove for 2.1 (hackity hack hack) -class LLOverrideBakedTextureUpdate -{ -public: - LLOverrideBakedTextureUpdate(bool temp_state) - { - U32 num_bakes = (U32) LLVOAvatarDefines::BAKED_NUM_INDICES; - for( U32 index = 0; index < num_bakes; ++index ) - { - composite_enabled[index] = gAgentAvatarp->isCompositeUpdateEnabled(index); - } - gAgentAvatarp->setCompositeUpdatesEnabled(temp_state); - } - - ~LLOverrideBakedTextureUpdate() - { - U32 num_bakes = (U32)LLVOAvatarDefines::BAKED_NUM_INDICES; - for( U32 index = 0; index < num_bakes; ++index ) - { - gAgentAvatarp->setCompositeUpdatesEnabled(index, composite_enabled[index]); - } - } -private: - bool composite_enabled[LLVOAvatarDefines::BAKED_NUM_INDICES]; -}; - -// Private local functions -static std::string terse_F32_to_string(F32 f); -static std::string asset_id_to_filename(const LLUUID &asset_id); - -LLWearable::LLWearable(const LLTransactionID& transaction_id) : - mDefinitionVersion(LLWearable::sCurrentDefinitionVersion), - mType(LLWearableType::WT_INVALID) -{ - mTransactionID = transaction_id; - mAssetID = mTransactionID.makeAssetID(gAgent.getSecureSessionID()); -} - -LLWearable::LLWearable(const LLAssetID& asset_id) : - mDefinitionVersion( LLWearable::sCurrentDefinitionVersion ), - mType(LLWearableType::WT_INVALID) -{ - mAssetID = asset_id; - mTransactionID.setNull(); -} - -LLWearable::~LLWearable() -{ -} - -const std::string& LLWearable::getTypeLabel() const -{ - return LLWearableType::getTypeLabel(mType); -} - -const std::string& LLWearable::getTypeName() const -{ - return LLWearableType::getTypeName(mType); -} - -LLAssetType::EType LLWearable::getAssetType() const -{ - return LLWearableType::getAssetType(mType); -} - -BOOL LLWearable::exportFile(LLFILE* file) const -{ - // header and version - if( fprintf( file, "LLWearable version %d\n", mDefinitionVersion ) < 0 ) - { - return FALSE; - } - - // name - if( fprintf( file, "%s\n", mName.c_str() ) < 0 ) - { - return FALSE; - } - - // description - if( fprintf( file, "%s\n", mDescription.c_str() ) < 0 ) - { - return FALSE; - } - - // permissions - if( !mPermissions.exportFile( file ) ) - { - return FALSE; - } - - // sale info - if( !mSaleInfo.exportFile( file ) ) - { - return FALSE; - } - - // wearable type - S32 type = (S32)mType; - if( fprintf( file, "type %d\n", type ) < 0 ) - { - return FALSE; - } - - // parameters - S32 num_parameters = mVisualParamIndexMap.size(); - if( fprintf( file, "parameters %d\n", num_parameters ) < 0 ) - { - return FALSE; - } - - for (visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.begin(); - iter != mVisualParamIndexMap.end(); - ++iter) - { - S32 param_id = iter->first; - const LLVisualParam* param = iter->second; - F32 param_weight = param->getWeight(); - if( fprintf( file, "%d %s\n", param_id, terse_F32_to_string( param_weight ).c_str() ) < 0 ) - { - return FALSE; - } - } - - // texture entries - S32 num_textures = mTEMap.size(); - if( fprintf( file, "textures %d\n", num_textures ) < 0 ) - { - return FALSE; - } - - for (te_map_t::const_iterator iter = mTEMap.begin(); iter != mTEMap.end(); ++iter) - { - S32 te = iter->first; - const LLUUID& image_id = iter->second->getID(); - if( fprintf( file, "%d %s\n", te, image_id.asString().c_str()) < 0 ) - { - return FALSE; - } - } - return TRUE; -} - - -void LLWearable::createVisualParams() -{ - for (LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam(); - param; - param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam()) - { - if (param->getWearableType() == mType) - { - addVisualParam(param->cloneParam(this)); - } - } - - // resync driver parameters to point to the newly cloned driven parameters - for (visual_param_index_map_t::iterator param_iter = mVisualParamIndexMap.begin(); - param_iter != mVisualParamIndexMap.end(); - ++param_iter) - { - LLVisualParam* param = param_iter->second; - LLVisualParam*(LLWearable::*wearable_function)(S32)const = &LLWearable::getVisualParam; - // need this line to disambiguate between versions of LLCharacter::getVisualParam() - LLVisualParam*(LLVOAvatarSelf::*avatar_function)(S32)const = &LLVOAvatarSelf::getVisualParam; - param->resetDrivenParams(); - if(!param->linkDrivenParams(boost::bind(wearable_function,(LLWearable*)this, _1), false)) - { - if( !param->linkDrivenParams(boost::bind(avatar_function,gAgentAvatarp.get(),_1 ), true)) - { - llwarns << "could not link driven params for wearable " << getName() << " id: " << param->getID() << llendl; - continue; - } - } - } -} - -BOOL LLWearable::importFile( LLFILE* file ) -{ - // *NOTE: changing the type or size of this buffer will require - // changes in the fscanf() code below. You would be better off - // rewriting this to use streams and not require an open FILE. - char text_buffer[2048]; /* Flawfinder: ignore */ - S32 fields_read = 0; - - // suppress texlayerset updates while wearables are being imported. Layersets will be updated - // when the wearables are "worn", not loaded. Note state will be restored when this object is destroyed. - LLOverrideBakedTextureUpdate stop_bakes(false); - - // read header and version - fields_read = fscanf( file, "LLWearable version %d\n", &mDefinitionVersion ); - if( fields_read != 1 ) - { - // Shouldn't really log the asset id for security reasons, but - // we need it in this case. - llwarns << "Bad Wearable asset header: " << mAssetID << llendl; - //gVFS->dumpMap(); - return FALSE; - } - - - // Temoprary hack to allow wearables with definition version 24 to still load. - // This should only affect lindens and NDA'd testers who have saved wearables in 2.0 - // the extra check for version == 24 can be removed before release, once internal testers - // have loaded these wearables again. See hack pt 2 at bottom of function to ensure that - // these wearables get re-saved with version definition 22. - if( mDefinitionVersion > LLWearable::sCurrentDefinitionVersion && mDefinitionVersion != 24 ) - { - llwarns << "Wearable asset has newer version (" << mDefinitionVersion << ") than XML (" << LLWearable::sCurrentDefinitionVersion << ")" << llendl; - return FALSE; - } - - // name - int next_char = fgetc( file ); /* Flawfinder: ignore */ - if( '\n' == next_char ) - { - // no name - mName = ""; - } - else - { - ungetc( next_char, file ); - fields_read = fscanf( /* Flawfinder: ignore */ - file, - "%2047[^\n]", - text_buffer); - if( (1 != fields_read) || (fgetc( file ) != '\n') ) /* Flawfinder: ignore */ - { - llwarns << "Bad Wearable asset: early end of file" << llendl; - return FALSE; - } - mName = text_buffer; - LLStringUtil::truncate(mName, DB_INV_ITEM_NAME_STR_LEN ); - } - - // description - next_char = fgetc( file ); /* Flawfinder: ignore */ - if( '\n' == next_char ) - { - // no description - mDescription = ""; - } - else - { - ungetc( next_char, file ); - fields_read = fscanf( /* Flawfinder: ignore */ - file, - "%2047[^\n]", - text_buffer ); - if( (1 != fields_read) || (fgetc( file ) != '\n') ) /* Flawfinder: ignore */ - { - llwarns << "Bad Wearable asset: early end of file" << llendl; - return FALSE; - } - mDescription = text_buffer; - LLStringUtil::truncate(mDescription, DB_INV_ITEM_DESC_STR_LEN ); - } - - // permissions - S32 perm_version; - fields_read = fscanf( file, " permissions %d\n", &perm_version ); - if( (fields_read != 1) || (perm_version != 0) ) - { - llwarns << "Bad Wearable asset: missing permissions" << llendl; - return FALSE; - } - if( !mPermissions.importFile( file ) ) - { - return FALSE; - } - - // sale info - S32 sale_info_version; - fields_read = fscanf( file, " sale_info %d\n", &sale_info_version ); - if( (fields_read != 1) || (sale_info_version != 0) ) - { - llwarns << "Bad Wearable asset: missing sale_info" << llendl; - return FALSE; - } - // Sale info used to contain next owner perm. It is now in the - // permissions. Thus, we read that out, and fix legacy - // objects. It's possible this op would fail, but it should pick - // up the vast majority of the tasks. - BOOL has_perm_mask = FALSE; - U32 perm_mask = 0; - if( !mSaleInfo.importFile(file, has_perm_mask, perm_mask) ) - { - return FALSE; - } - if(has_perm_mask) - { - // fair use fix. - if(!(perm_mask & PERM_COPY)) - { - perm_mask |= PERM_TRANSFER; - } - mPermissions.setMaskNext(perm_mask); - } - - // wearable type - S32 type = -1; - fields_read = fscanf( file, "type %d\n", &type ); - if( fields_read != 1 ) - { - llwarns << "Bad Wearable asset: bad type" << llendl; - return FALSE; - } - if( 0 <= type && type < LLWearableType::WT_COUNT ) - { - setType((LLWearableType::EType)type); - } - else - { - mType = LLWearableType::WT_COUNT; - llwarns << "Bad Wearable asset: bad type #" << type << llendl; - return FALSE; - } - - // parameters header - S32 num_parameters = 0; - fields_read = fscanf( file, "parameters %d\n", &num_parameters ); - if( fields_read != 1 ) - { - llwarns << "Bad Wearable asset: missing parameters block" << llendl; - return FALSE; - } - - if( num_parameters != mVisualParamIndexMap.size() ) - { - llwarns << "Wearable parameter mismatch. Reading in " << num_parameters << " from file, but created " << mVisualParamIndexMap.size() << " from avatar parameters. type: " << mType << llendl; - } - - // parameters - S32 i; - for( i = 0; i < num_parameters; i++ ) - { - S32 param_id = 0; - F32 param_weight = 0.f; - fields_read = fscanf( file, "%d %f\n", ¶m_id, ¶m_weight ); - if( fields_read != 2 ) - { - llwarns << "Bad Wearable asset: bad parameter, #" << i << llendl; - return FALSE; - } - mSavedVisualParamMap[param_id] = param_weight; - } - - // textures header - S32 num_textures = 0; - fields_read = fscanf( file, "textures %d\n", &num_textures); - if( fields_read != 1 ) - { - llwarns << "Bad Wearable asset: missing textures block" << llendl; - return FALSE; - } - - // textures - for( i = 0; i < num_textures; i++ ) - { - S32 te = 0; - fields_read = fscanf( /* Flawfinder: ignore */ - file, - "%d %2047s\n", - &te, text_buffer); - if( fields_read != 2 ) - { - llwarns << "Bad Wearable asset: bad texture, #" << i << llendl; - return FALSE; - } - - if( !LLUUID::validate( text_buffer ) ) - { - llwarns << "Bad Wearable asset: bad texture uuid: " << text_buffer << llendl; - return FALSE; - } - LLUUID id = LLUUID(text_buffer); - LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture( id ); - if( mTEMap.find(te) != mTEMap.end() ) - { - delete mTEMap[te]; - } - if( mSavedTEMap.find(te) != mSavedTEMap.end() ) - { - delete mSavedTEMap[te]; - } - - if(gSavedSettings.getBOOL("DebugAvatarLocalTexLoadedTime")) - { - image->setLoadedCallback(LLVOAvatarSelf::debugOnTimingLocalTexLoaded,0,TRUE,FALSE, new LLVOAvatarSelf::LLAvatarTexData(id, (LLVOAvatarDefines::ETextureIndex)te), NULL); - } - LLUUID textureid(text_buffer); - mTEMap[te] = new LLLocalTextureObject(image, textureid); - mSavedTEMap[te] = new LLLocalTextureObject(image, textureid); - createLayers(te); - } - - // copy all saved param values to working params - revertValues(); - - return TRUE; -} - - -// Avatar parameter and texture definitions can change over time. -// This function returns true if parameters or textures have been added or removed -// since this wearable was created. -BOOL LLWearable::isOldVersion() const -{ - if (!isAgentAvatarValid()) return FALSE; - - if( LLWearable::sCurrentDefinitionVersion < mDefinitionVersion ) - { - llwarns << "Wearable asset has newer version (" << mDefinitionVersion << ") than XML (" << LLWearable::sCurrentDefinitionVersion << ")" << llendl; - llassert(0); - } - - if( LLWearable::sCurrentDefinitionVersion != mDefinitionVersion ) - { - return TRUE; - } - - S32 param_count = 0; - for( LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam(); - param; - param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() ) - { - if( (param->getWearableType() == mType) && (param->isTweakable() ) ) - { - param_count++; - if( !is_in_map(mVisualParamIndexMap, param->getID() ) ) - { - return TRUE; - } - } - } - if( param_count != mVisualParamIndexMap.size() ) - { - return TRUE; - } - - - S32 te_count = 0; - for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) - { - if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType) - { - te_count++; - if( !is_in_map(mTEMap, te ) ) - { - return TRUE; - } - } - } - if( te_count != mTEMap.size() ) - { - return TRUE; - } - - return FALSE; -} - -// Avatar parameter and texture definitions can change over time. -// * If parameters or textures have been REMOVED since the wearable was created, -// they're just ignored, so we consider the wearable clean even though isOldVersion() -// will return true. -// * If parameters or textures have been ADDED since the wearable was created, -// they are taken to have default values, so we consider the wearable clean -// only if those values are the same as the defaults. -BOOL LLWearable::isDirty() const -{ - if (!isAgentAvatarValid()) return FALSE; - - for( LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam(); - param; - param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() ) - { - if( (param->getWearableType() == mType) - && (param->isTweakable() ) - && !param->getCrossWearable()) - { - F32 current_weight = getVisualParamWeight(param->getID()); - current_weight = llclamp( current_weight, param->getMinWeight(), param->getMaxWeight() ); - F32 saved_weight = get_if_there(mSavedVisualParamMap, param->getID(), param->getDefaultWeight()); - saved_weight = llclamp( saved_weight, param->getMinWeight(), param->getMaxWeight() ); - - U8 a = F32_to_U8( saved_weight, param->getMinWeight(), param->getMaxWeight() ); - U8 b = F32_to_U8( current_weight, param->getMinWeight(), param->getMaxWeight() ); - if( a != b ) - { - return TRUE; - } - } - } - - for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) - { - if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType) - { - te_map_t::const_iterator current_iter = mTEMap.find(te); - if(current_iter != mTEMap.end()) - { - const LLUUID& current_image_id = current_iter->second->getID(); - te_map_t::const_iterator saved_iter = mSavedTEMap.find(te); - if(saved_iter != mSavedTEMap.end()) - { - const LLUUID& saved_image_id = saved_iter->second->getID(); - if (saved_image_id != current_image_id) - { - // saved vs current images are different, wearable is dirty - return TRUE; - } - } - else - { - // image found in current image list but not saved image list - return TRUE; - } - } - } - } - - return FALSE; -} - - -void LLWearable::setParamsToDefaults() -{ - if (!isAgentAvatarValid()) return; - - for( LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam() ) - { - if( (((LLViewerVisualParam*)param)->getWearableType() == mType ) && (param->isTweakable() ) ) - { - setVisualParamWeight(param->getID(),param->getDefaultWeight(), FALSE); - } - } -} - -void LLWearable::setTexturesToDefaults() -{ - for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) - { - if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType) - { - LLUUID id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te); - LLViewerFetchedTexture * image = LLViewerTextureManager::getFetchedTexture( id ); - if( mTEMap.find(te) == mTEMap.end() ) - { - mTEMap[te] = new LLLocalTextureObject(image, id); - createLayers(te); - } - else - { - // Local Texture Object already created, just set image and UUID - LLLocalTextureObject *lto = mTEMap[te]; - lto->setID(id); - lto->setImage(image); - } - } - } -} - -// Updates the user's avatar's appearance -void LLWearable::writeToAvatar() -{ - if (!isAgentAvatarValid()) return; - - ESex old_sex = gAgentAvatarp->getSex(); - - // Pull params - for( LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam() ) - { - // cross-wearable parameters are not authoritative, as they are driven by a different wearable. So don't copy the values to the - // avatar object if cross wearable. Cross wearable params get their values from the avatar, they shouldn't write the other way. - if( (((LLViewerVisualParam*)param)->getWearableType() == mType) && (!((LLViewerVisualParam*)param)->getCrossWearable()) ) - { - S32 param_id = param->getID(); - F32 weight = getVisualParamWeight(param_id); - - gAgentAvatarp->setVisualParamWeight( param_id, weight, FALSE ); - } - } - - // Pull texture entries - for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) - { - if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType) - { - te_map_t::const_iterator iter = mTEMap.find(te); - LLUUID image_id; - if(iter != mTEMap.end()) - { - image_id = iter->second->getID(); - } - else - { - image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te); - } - LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE ); - // MULTI-WEARABLE: assume index 0 will be used when writing to avatar. TODO: eliminate the need for this. - gAgentAvatarp->setLocalTextureTE(te, image, 0); - } - } - - ESex new_sex = gAgentAvatarp->getSex(); - if( old_sex != new_sex ) - { - gAgentAvatarp->updateSexDependentLayerSets( FALSE ); - } - -// if( upload_bake ) -// { -// gAgent.sendAgentSetAppearance(); -// } -} - - -// Updates the user's avatar's appearance, replacing this wearables' parameters and textures with default values. -// static -void LLWearable::removeFromAvatar( LLWearableType::EType type, BOOL upload_bake ) -{ - if (!isAgentAvatarValid()) return; - - // You can't just remove body parts. - if( (type == LLWearableType::WT_SHAPE) || - (type == LLWearableType::WT_SKIN) || - (type == LLWearableType::WT_HAIR) || - (type == LLWearableType::WT_EYES) ) - { - return; - } - - // Pull params - for( LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam() ) - { - if( (((LLViewerVisualParam*)param)->getWearableType() == type) && (param->isTweakable() ) ) - { - S32 param_id = param->getID(); - gAgentAvatarp->setVisualParamWeight( param_id, param->getDefaultWeight(), upload_bake ); - } - } - - if(gAgentCamera.cameraCustomizeAvatar()) - { - LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit")); - } - - gAgentAvatarp->updateVisualParams(); - gAgentAvatarp->wearableUpdated(type, FALSE); - -// if( upload_bake ) -// { -// gAgent.sendAgentSetAppearance(); -// } -} - -// Does not copy mAssetID. -// Definition version is current: removes obsolete enties and creates default values for new ones. -void LLWearable::copyDataFrom(const LLWearable* src) -{ - if (!isAgentAvatarValid()) return; - - mDefinitionVersion = LLWearable::sCurrentDefinitionVersion; - - mName = src->mName; - mDescription = src->mDescription; - mPermissions = src->mPermissions; - mSaleInfo = src->mSaleInfo; - - setType(src->mType); - - mSavedVisualParamMap.clear(); - // Deep copy of mVisualParamMap (copies only those params that are current, filling in defaults where needed) - for (LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam(); - param; - param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() ) - { - if( (param->getWearableType() == mType) ) - { - S32 id = param->getID(); - F32 weight = src->getVisualParamWeight(id); - mSavedVisualParamMap[id] = weight; - } - } - - destroyTextures(); - // Deep copy of mTEMap (copies only those tes that are current, filling in defaults where needed) - for (S32 te = 0; te < TEX_NUM_INDICES; te++) - { - if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType) - { - te_map_t::const_iterator iter = src->mTEMap.find(te); - LLUUID image_id; - LLViewerFetchedTexture *image = NULL; - if(iter != src->mTEMap.end()) - { - image = src->getLocalTextureObject(te)->getImage(); - image_id = src->getLocalTextureObject(te)->getID(); - mTEMap[te] = new LLLocalTextureObject(image, image_id); - mSavedTEMap[te] = new LLLocalTextureObject(image, image_id); - mTEMap[te]->setBakedReady(src->getLocalTextureObject(te)->getBakedReady()); - mTEMap[te]->setDiscard(src->getLocalTextureObject(te)->getDiscard()); - } - else - { - image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te); - image = LLViewerTextureManager::getFetchedTexture( image_id ); - mTEMap[te] = new LLLocalTextureObject(image, image_id); - mSavedTEMap[te] = new LLLocalTextureObject(image, image_id); - } - createLayers(te); - } - } - - // Probably reduntant, but ensure that the newly created wearable is not dirty by setting current value of params in new wearable - // to be the same as the saved values (which were loaded from src at param->cloneParam(this)) - revertValues(); -} - -void LLWearable::setItemID(const LLUUID& item_id) -{ - mItemID = item_id; -} - -const LLUUID& LLWearable::getItemID() const -{ - return mItemID; -} - -void LLWearable::setType(LLWearableType::EType type) -{ - mType = type; - createVisualParams(); -} - -LLLocalTextureObject* LLWearable::getLocalTextureObject(S32 index) -{ - te_map_t::iterator iter = mTEMap.find(index); - if( iter != mTEMap.end() ) - { - LLLocalTextureObject* lto = iter->second; - return lto; - } - return NULL; -} - -const LLLocalTextureObject* LLWearable::getLocalTextureObject(S32 index) const -{ - te_map_t::const_iterator iter = mTEMap.find(index); - if( iter != mTEMap.end() ) - { - const LLLocalTextureObject* lto = iter->second; - return lto; - } - return NULL; -} - -std::vector<LLLocalTextureObject*> LLWearable::getLocalTextureListSeq() -{ - std::vector<LLLocalTextureObject*> result; - - for(te_map_t::const_iterator iter = mTEMap.begin(); - iter != mTEMap.end(); iter++) - { - LLLocalTextureObject* lto = iter->second; - result.push_back(lto); - } - - return result; -} - -void LLWearable::setLocalTextureObject(S32 index, LLLocalTextureObject <o) -{ - if( mTEMap.find(index) != mTEMap.end() ) - { - mTEMap.erase(index); - } - mTEMap[index] = new LLLocalTextureObject(lto); -} - - -void LLWearable::addVisualParam(LLVisualParam *param) -{ - if( mVisualParamIndexMap[param->getID()] ) - { - delete mVisualParamIndexMap[param->getID()]; - } - param->setIsDummy(FALSE); - mVisualParamIndexMap[param->getID()] = param; - mSavedVisualParamMap[param->getID()] = param->getDefaultWeight(); -} - -void LLWearable::setVisualParams() -{ - for (visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); iter++) - { - S32 id = iter->first; - LLVisualParam *wearable_param = iter->second; - F32 value = wearable_param->getWeight(); - gAgentAvatarp->setVisualParamWeight(id, value, FALSE); - } -} - - -void LLWearable::setVisualParamWeight(S32 param_index, F32 value, BOOL upload_bake) -{ - if( is_in_map(mVisualParamIndexMap, param_index ) ) - { - LLVisualParam *wearable_param = mVisualParamIndexMap[param_index]; - wearable_param->setWeight(value, upload_bake); - } - else - { - llerrs << "LLWearable::setVisualParam passed invalid parameter index: " << param_index << " for wearable type: " << this->getName() << llendl; - } -} - -F32 LLWearable::getVisualParamWeight(S32 param_index) const -{ - if( is_in_map(mVisualParamIndexMap, param_index ) ) - { - const LLVisualParam *wearable_param = mVisualParamIndexMap.find(param_index)->second; - return wearable_param->getWeight(); - } - else - { - llwarns << "LLWerable::getVisualParam passed invalid parameter index: " << param_index << " for wearable type: " << this->getName() << llendl; - } - return (F32)-1.0; -} - -LLVisualParam* LLWearable::getVisualParam(S32 index) const -{ - visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.find(index); - return (iter == mVisualParamIndexMap.end()) ? NULL : iter->second; -} - - -void LLWearable::getVisualParams(visual_param_vec_t &list) -{ - visual_param_index_map_t::iterator iter = mVisualParamIndexMap.begin(); - visual_param_index_map_t::iterator end = mVisualParamIndexMap.end(); - - // add all visual params to the passed-in vector - for( ; iter != end; ++iter ) - { - list.push_back(iter->second); - } -} - -void LLWearable::animateParams(F32 delta, BOOL upload_bake) -{ - for(visual_param_index_map_t::iterator iter = mVisualParamIndexMap.begin(); - iter != mVisualParamIndexMap.end(); - ++iter) - { - LLVisualParam *param = (LLVisualParam*) iter->second; - param->animate(delta, upload_bake); - } -} - -LLColor4 LLWearable::getClothesColor(S32 te) const -{ - LLColor4 color; - U32 param_name[3]; - if( LLVOAvatar::teToColorParams( (LLVOAvatarDefines::ETextureIndex)te, param_name ) ) - { - for( U8 index = 0; index < 3; index++ ) - { - color.mV[index] = getVisualParamWeight(param_name[index]); - } - } - return color; -} - -void LLWearable::setClothesColor( S32 te, const LLColor4& new_color, BOOL upload_bake ) -{ - U32 param_name[3]; - if( LLVOAvatar::teToColorParams( (LLVOAvatarDefines::ETextureIndex)te, param_name ) ) - { - for( U8 index = 0; index < 3; index++ ) - { - setVisualParamWeight(param_name[index], new_color.mV[index], upload_bake); - } - } -} - -void LLWearable::revertValues() -{ - //update saved settings so wearable is no longer dirty - // non-driver params first - for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++) - { - S32 id = iter->first; - F32 value = iter->second; - LLVisualParam *param = getVisualParam(id); - if(param && !dynamic_cast<LLDriverParam*>(param) ) - { - setVisualParamWeight(id, value, TRUE); - } - } - - //then driver params - for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++) - { - S32 id = iter->first; - F32 value = iter->second; - LLVisualParam *param = getVisualParam(id); - if(param && dynamic_cast<LLDriverParam*>(param) ) - { - setVisualParamWeight(id, value, TRUE); - } - } - - // make sure that saved values are sane - for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++) - { - S32 id = iter->first; - LLVisualParam *param = getVisualParam(id); - if( param ) - { - mSavedVisualParamMap[id] = param->getWeight(); - } - } - - syncImages(mSavedTEMap, mTEMap); - - - LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance")); - if( panel ) - { - panel->updateScrollingPanelList(); - } -} - -BOOL LLWearable::isOnTop() const -{ - return (this == gAgentWearables.getTopWearable(mType)); -} - -void LLWearable::createLayers(S32 te) -{ - LLTexLayerSet *layer_set = gAgentAvatarp->getLayerSet((ETextureIndex)te); - if (layer_set) - { - layer_set->cloneTemplates(mTEMap[te], (ETextureIndex)te, this); - } - else - { - llerrs << "could not find layerset for LTO in wearable!" << llendl; - } -} - -void LLWearable::saveValues() -{ - //update saved settings so wearable is no longer dirty - mSavedVisualParamMap.clear(); - for (visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); ++iter) - { - S32 id = iter->first; - LLVisualParam *wearable_param = iter->second; - F32 value = wearable_param->getWeight(); - mSavedVisualParamMap[id] = value; - } - - // Deep copy of mTEMap (copies only those tes that are current, filling in defaults where needed) - syncImages(mTEMap, mSavedTEMap); - - - LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance")); - if( panel ) - { - panel->updateScrollingPanelList(); - } -} - -void LLWearable::syncImages(te_map_t &src, te_map_t &dst) -{ - // Deep copy of src (copies only those tes that are current, filling in defaults where needed) - for( S32 te = 0; te < TEX_NUM_INDICES; te++ ) - { - if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType) - { - te_map_t::const_iterator iter = src.find(te); - LLUUID image_id; - LLViewerFetchedTexture *image = NULL; - LLLocalTextureObject *lto = NULL; - if(iter != src.end()) - { - // there's a Local Texture Object in the source image map. Use this to populate the values to store in the destination image map. - lto = iter->second; - image = lto->getImage(); - image_id = lto->getID(); - } - else - { - // there is no Local Texture Object in the source image map. Get defaults values for populating the destination image map. - image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te); - image = LLViewerTextureManager::getFetchedTexture( image_id ); - } - - if( dst.find(te) != dst.end() ) - { - // there's already an entry in the destination map for the texture. Just update its values. - dst[te]->setImage(image); - dst[te]->setID(image_id); - } - else - { - // no entry found in the destination map, we need to create a new Local Texture Object - dst[te] = new LLLocalTextureObject(image, image_id); - } - - if( lto ) - { - // If we pulled values from a Local Texture Object in the source map, make sure the proper flags are set in the new (or updated) entry in the destination map. - dst[te]->setBakedReady(lto->getBakedReady()); - dst[te]->setDiscard(lto->getDiscard()); - } - } - } -} - -void LLWearable::destroyTextures() -{ - for( te_map_t::iterator iter = mTEMap.begin(); iter != mTEMap.end(); ++iter ) - { - LLLocalTextureObject *lto = iter->second; - delete lto; - } - mTEMap.clear(); - for( te_map_t::iterator iter = mSavedTEMap.begin(); iter != mSavedTEMap.end(); ++iter ) - { - LLLocalTextureObject *lto = iter->second; - delete lto; - } - mSavedTEMap.clear(); -} - -void LLWearable::pullCrossWearableValues() -{ - // scan through all of the avatar's visual parameters - for (LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam(); - param; - param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam()) - { - if( param ) - { - LLDriverParam *driver_param = dynamic_cast<LLDriverParam*>(param); - if(driver_param) - { - // parameter is a driver parameter, have it update its - driver_param->updateCrossDrivenParams(getType()); - } - } - } -} - - -void LLWearable::setLabelUpdated() const -{ - gInventory.addChangedMask(LLInventoryObserver::LABEL, getItemID()); -} - -void LLWearable::refreshName() -{ - LLUUID item_id = getItemID(); - LLInventoryItem* item = gInventory.getItem(item_id); - if( item ) - { - mName = item->getName(); - } -} - -struct LLWearableSaveData -{ - LLWearableType::EType mType; -}; - -void LLWearable::saveNewAsset() const -{ -// llinfos << "LLWearable::saveNewAsset() type: " << getTypeName() << llendl; - //llinfos << *this << llendl; - - const std::string filename = asset_id_to_filename(mAssetID); - LLFILE* fp = LLFile::fopen(filename, "wb"); /* Flawfinder: ignore */ - BOOL successful_save = FALSE; - if(fp && exportFile(fp)) - { - successful_save = TRUE; - } - if(fp) - { - fclose(fp); - fp = NULL; - } - if(!successful_save) - { - std::string buffer = llformat("Unable to save '%s' to wearable file.", mName.c_str()); - llwarns << buffer << llendl; - - LLSD args; - args["NAME"] = mName; - LLNotificationsUtil::add("CannotSaveWearableOutOfSpace", args); - return; - } - - // save it out to database - if( gAssetStorage ) - { - /* - std::string url = gAgent.getRegion()->getCapability("NewAgentInventory"); - if (!url.empty()) - { - llinfos << "Update Agent Inventory via capability" << llendl; - LLSD body; - body["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetToFolderType(getAssetType())); - body["asset_type"] = LLAssetType::lookup(getAssetType()); - body["inventory_type"] = LLInventoryType::lookup(LLInventoryType::IT_WEARABLE); - body["name"] = getName(); - body["description"] = getDescription(); - LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, filename)); - } - else - { - } - */ - LLWearableSaveData* data = new LLWearableSaveData; - data->mType = mType; - gAssetStorage->storeAssetData(filename, mTransactionID, getAssetType(), - &LLWearable::onSaveNewAssetComplete, - (void*)data); - } -} - -// static -void LLWearable::onSaveNewAssetComplete(const LLUUID& new_asset_id, void* userdata, S32 status, LLExtStat ext_status) // StoreAssetData callback (fixed) -{ - LLWearableSaveData* data = (LLWearableSaveData*)userdata; - const std::string& type_name = LLWearableType::getTypeName(data->mType); - if(0 == status) - { - // Success - llinfos << "Saved wearable " << type_name << llendl; - } - else - { - std::string buffer = llformat("Unable to save %s to central asset store.", type_name.c_str()); - llwarns << buffer << " Status: " << status << llendl; - LLSD args; - args["NAME"] = type_name; - LLNotificationsUtil::add("CannotSaveToAssetStore", args); - } - - // Delete temp file - const std::string src_filename = asset_id_to_filename(new_asset_id); - LLFile::remove(src_filename); - - // delete the context data - delete data; - -} - -std::ostream& operator<<(std::ostream &s, const LLWearable &w) -{ - s << "wearable " << LLWearableType::getTypeName(w.mType) << "\n"; - s << " Name: " << w.mName << "\n"; - s << " Desc: " << w.mDescription << "\n"; - //w.mPermissions - //w.mSaleInfo - - s << " Params:" << "\n"; - for (LLWearable::visual_param_index_map_t::const_iterator iter = w.mVisualParamIndexMap.begin(); - iter != w.mVisualParamIndexMap.end(); ++iter) - { - S32 param_id = iter->first; - LLVisualParam *wearable_param = iter->second; - F32 param_weight = wearable_param->getWeight(); - s << " " << param_id << " " << param_weight << "\n"; - } - - s << " Textures:" << "\n"; - for (LLWearable::te_map_t::const_iterator iter = w.mTEMap.begin(); - iter != w.mTEMap.end(); ++iter) - { - S32 te = iter->first; - const LLUUID& image_id = iter->second->getID(); - s << " " << te << " " << image_id << "\n"; - } - return s; -} - - -std::string terse_F32_to_string(F32 f) -{ - std::string r = llformat("%.2f", f); - S32 len = r.length(); - - // "1.20" -> "1.2" - // "24.00" -> "24." - while (len > 0 && ('0' == r[len - 1])) - { - r.erase(len-1, 1); - len--; - } - if ('.' == r[len - 1]) - { - // "24." -> "24" - r.erase(len-1, 1); - } - else if (('-' == r[0]) && ('0' == r[1])) - { - // "-0.59" -> "-.59" - r.erase(1, 1); - } - else if ('0' == r[0]) - { - // "0.59" -> ".59" - r.erase(0, 1); - } - return r; -} - -std::string asset_id_to_filename(const LLUUID &asset_id) -{ - std::string asset_id_string; - asset_id.toString(asset_id_string); - std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,asset_id_string) + ".wbl"; - return filename; -} diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h deleted file mode 100644 index 3d8c53a755..0000000000 --- a/indra/newview/llwearable.h +++ /dev/null @@ -1,165 +0,0 @@ -/** - * @file llwearable.h - * @brief LLWearable class header file - * - * $LicenseInfo:firstyear=2002&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$ - */ - -#ifndef LL_LLWEARABLE_H -#define LL_LLWEARABLE_H - -#include "lluuid.h" -#include "llstring.h" -#include "llpermissions.h" -#include "llsaleinfo.h" -#include "llassetstorage.h" -#include "llwearabletype.h" -#include "llfile.h" -#include "lllocaltextureobject.h" - -class LLViewerInventoryItem; -class LLVisualParam; -class LLTexGlobalColorInfo; -class LLTexGlobalColor; - -class LLWearable -{ - friend class LLWearableList; - - //-------------------------------------------------------------------- - // Constructors and destructors - //-------------------------------------------------------------------- -private: - // Private constructors used by LLWearableList - LLWearable(const LLTransactionID& transactionID); - LLWearable(const LLAssetID& assetID); -public: - virtual ~LLWearable(); - - //-------------------------------------------------------------------- - // Accessors - //-------------------------------------------------------------------- -public: - const LLUUID& getItemID() const; - const LLAssetID& getAssetID() const { return mAssetID; } - const LLTransactionID& getTransactionID() const { return mTransactionID; } - LLWearableType::EType getType() const { return mType; } - void setType(LLWearableType::EType type); - const std::string& getName() const { return mName; } - void setName(const std::string& name) { mName = name; } - const std::string& getDescription() const { return mDescription; } - void setDescription(const std::string& desc) { mDescription = desc; } - const LLPermissions& getPermissions() const { return mPermissions; } - void setPermissions(const LLPermissions& p) { mPermissions = p; } - const LLSaleInfo& getSaleInfo() const { return mSaleInfo; } - void setSaleInfo(const LLSaleInfo& info) { mSaleInfo = info; } - const std::string& getTypeLabel() const; - const std::string& getTypeName() const; - LLAssetType::EType getAssetType() const; - S32 getDefinitionVersion() const { return mDefinitionVersion; } - void setDefinitionVersion( S32 new_version ) { mDefinitionVersion = new_version; } - -public: - typedef std::vector<LLVisualParam*> visual_param_vec_t; - - BOOL isDirty() const; - BOOL isOldVersion() const; - - void writeToAvatar(); - void removeFromAvatar( BOOL upload_bake ) { LLWearable::removeFromAvatar( mType, upload_bake ); } - static void removeFromAvatar( LLWearableType::EType type, BOOL upload_bake ); - - BOOL exportFile(LLFILE* file) const; - BOOL importFile(LLFILE* file); - - void setParamsToDefaults(); - void setTexturesToDefaults(); - - void saveNewAsset() const; - static void onSaveNewAssetComplete( const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status ); - - void copyDataFrom(const LLWearable* src); - - static void setCurrentDefinitionVersion( S32 version ) { LLWearable::sCurrentDefinitionVersion = version; } - - friend std::ostream& operator<<(std::ostream &s, const LLWearable &w); - void setItemID(const LLUUID& item_id); - - LLLocalTextureObject* getLocalTextureObject(S32 index); - const LLLocalTextureObject* getLocalTextureObject(S32 index) const; - std::vector<LLLocalTextureObject*> getLocalTextureListSeq(); - - void setLocalTextureObject(S32 index, LLLocalTextureObject <o); - void addVisualParam(LLVisualParam *param); - void setVisualParams(); - void setVisualParamWeight(S32 index, F32 value, BOOL upload_bake); - F32 getVisualParamWeight(S32 index) const; - LLVisualParam* getVisualParam(S32 index) const; - void getVisualParams(visual_param_vec_t &list); - void animateParams(F32 delta, BOOL upload_bake); - - LLColor4 getClothesColor(S32 te) const; - void setClothesColor( S32 te, const LLColor4& new_color, BOOL upload_bake ); - - void revertValues(); - void saveValues(); - void pullCrossWearableValues(); - - BOOL isOnTop() const; - - // Something happened that requires the wearable's label to be updated (e.g. worn/unworn). - void setLabelUpdated() const; - - // the wearable was worn. make sure the name of the wearable object matches the LLViewerInventoryItem, - // not the wearable asset itself. - void refreshName(); - -private: - typedef std::map<S32, LLLocalTextureObject*> te_map_t; - typedef std::map<S32, LLVisualParam *> visual_param_index_map_t; - - void createLayers(S32 te); - void createVisualParams(); - void syncImages(te_map_t &src, te_map_t &dst); - void destroyTextures(); - - static S32 sCurrentDefinitionVersion; // Depends on the current state of the avatar_lad.xml. - S32 mDefinitionVersion; // Depends on the state of the avatar_lad.xml when this asset was created. - std::string mName; - std::string mDescription; - LLPermissions mPermissions; - LLSaleInfo mSaleInfo; - LLAssetID mAssetID; - LLTransactionID mTransactionID; - LLWearableType::EType mType; - - typedef std::map<S32, F32> param_map_t; - param_map_t mSavedVisualParamMap; // last saved version of visual params - - visual_param_index_map_t mVisualParamIndexMap; - - te_map_t mTEMap; // maps TE to LocalTextureObject - te_map_t mSavedTEMap; // last saved version of TEMap - LLUUID mItemID; // ID of the inventory item in the agent's inventory -}; - -#endif // LL_LLWEARABLE_H diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index 92697fb2eb..c196d70617 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -34,6 +34,7 @@ #include "llagentwearables.h" #include "llappearancemgr.h" #include "llinventoryfunctions.h" +#include "llinventoryicon.h" #include "lltransutil.h" #include "llviewerattachmenu.h" #include "llvoavatarself.h" @@ -788,23 +789,24 @@ LLContextMenu* LLWearableItemsList::ContextMenu::createMenu() const uuid_vec_t& ids = mUUIDs; // selected items IDs LLUUID selected_id = ids.front(); // ID of the first selected item - functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1); - // Register handlers common for all wearable types. registrar.add("Wearable.Wear", boost::bind(wear_multiple, ids, true)); registrar.add("Wearable.Add", boost::bind(wear_multiple, ids, false)); registrar.add("Wearable.Edit", boost::bind(handleMultiple, LLAgentWearables::editWearable, ids)); registrar.add("Wearable.CreateNew", boost::bind(createNewWearable, selected_id)); registrar.add("Wearable.ShowOriginal", boost::bind(show_item_original, selected_id)); - registrar.add("Wearable.TakeOffDetach", boost::bind(handleMultiple, take_off, ids)); + registrar.add("Wearable.TakeOffDetach", + boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids)); // Register handlers for clothing. - registrar.add("Clothing.TakeOff", boost::bind(handleMultiple, take_off, ids)); + registrar.add("Clothing.TakeOff", + boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids)); // Register handlers for body parts. // Register handlers for attachments. - registrar.add("Attachment.Detach", boost::bind(handleMultiple, take_off, ids)); + registrar.add("Attachment.Detach", + boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids)); registrar.add("Attachment.Profile", boost::bind(show_item_profile, selected_id)); registrar.add("Object.Attach", boost::bind(LLViewerAttachMenu::attachObjects, ids, _2)); diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp index 6f6411ce3c..ef1a953f59 100644 --- a/indra/newview/llwearablelist.cpp +++ b/indra/newview/llwearablelist.cpp @@ -42,20 +42,23 @@ struct LLWearableArrivedData { LLWearableArrivedData(LLAssetType::EType asset_type, const std::string& wearable_name, - void(*asset_arrived_callback)(LLWearable*, void* userdata), + LLAvatarAppearance* avatarp, + void(*asset_arrived_callback)(LLViewerWearable*, void* userdata), void* userdata) : mAssetType( asset_type ), mCallback( asset_arrived_callback ), mUserdata( userdata ), mName( wearable_name ), - mRetries(0) + mRetries(0), + mAvatarp(avatarp) {} LLAssetType::EType mAssetType; - void (*mCallback)(LLWearable*, void* userdata); + void (*mCallback)(LLViewerWearable*, void* userdata); void* mUserdata; std::string mName; S32 mRetries; + LLAvatarAppearance *mAvatarp; }; //////////////////////////////////////////////////////////////////////////// @@ -72,10 +75,10 @@ void LLWearableList::cleanup() mList.clear(); } -void LLWearableList::getAsset(const LLAssetID& assetID, const std::string& wearable_name, LLAssetType::EType asset_type, void(*asset_arrived_callback)(LLWearable*, void* userdata), void* userdata) +void LLWearableList::getAsset(const LLAssetID& assetID, const std::string& wearable_name, LLAvatarAppearance* avatarp, LLAssetType::EType asset_type, void(*asset_arrived_callback)(LLViewerWearable*, void* userdata), void* userdata) { llassert( (asset_type == LLAssetType::AT_CLOTHING) || (asset_type == LLAssetType::AT_BODYPART) ); - LLWearable* instance = get_if_there(mList, assetID, (LLWearable*)NULL ); + LLViewerWearable* instance = get_if_there(mList, assetID, (LLViewerWearable*)NULL ); if( instance ) { asset_arrived_callback( instance, userdata ); @@ -85,7 +88,7 @@ void LLWearableList::getAsset(const LLAssetID& assetID, const std::string& weara gAssetStorage->getAssetData(assetID, asset_type, LLWearableList::processGetAssetReply, - (void*)new LLWearableArrivedData( asset_type, wearable_name, asset_arrived_callback, userdata ), + (void*)new LLWearableArrivedData( asset_type, wearable_name, avatarp, asset_arrived_callback, userdata ), TRUE); } } @@ -95,25 +98,31 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID { BOOL isNewWearable = FALSE; LLWearableArrivedData* data = (LLWearableArrivedData*) userdata; - LLWearable* wearable = NULL; // NULL indicates failure + LLViewerWearable* wearable = NULL; // NULL indicates failure + LLAvatarAppearance *avatarp = data->mAvatarp; if( !filename ) { LL_WARNS("Wearable") << "Bad Wearable Asset: missing file." << LL_ENDL; } + else if(!avatarp) + { + LL_WARNS("Wearable") << "Bad asset request: missing avatar pointer." << LL_ENDL; + } else if (status >= 0) { // read the file - LLFILE* fp = LLFile::fopen(std::string(filename), "rb"); /*Flawfinder: ignore*/ - if( !fp ) + llifstream ifs(filename, llifstream::binary); + if( !ifs.is_open() ) { LL_WARNS("Wearable") << "Bad Wearable Asset: unable to open file: '" << filename << "'" << LL_ENDL; } else { - wearable = new LLWearable(uuid); - bool res = wearable->importFile( fp ); - if (!res) + wearable = new LLViewerWearable(uuid); + LLWearable::EImportResult result = wearable->importStream( + ifs, avatarp ); + if (LLWearable::SUCCESS != result) { if (wearable->getType() == LLWearableType::WT_COUNT) { @@ -123,9 +132,12 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID wearable = NULL; } - fclose( fp ); if(filename) { + if (ifs.is_open()) + { + ifs.close(); + } LLFile::remove(std::string(filename)); } } @@ -203,11 +215,11 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID } -LLWearable* LLWearableList::createCopy(const LLWearable* old_wearable, const std::string& new_name) +LLViewerWearable* LLWearableList::createCopy(const LLViewerWearable* old_wearable, const std::string& new_name) { lldebugs << "LLWearableList::createCopy()" << llendl; - LLWearable *wearable = generateNewWearable(); + LLViewerWearable *wearable = generateNewWearable(); wearable->copyDataFrom(old_wearable); LLPermissions perm(old_wearable->getPermissions()); @@ -222,12 +234,12 @@ LLWearable* LLWearableList::createCopy(const LLWearable* old_wearable, const std return wearable; } -LLWearable* LLWearableList::createNewWearable( LLWearableType::EType type ) +LLViewerWearable* LLWearableList::createNewWearable( LLWearableType::EType type, LLAvatarAppearance *avatarp ) { lldebugs << "LLWearableList::createNewWearable()" << llendl; - LLWearable *wearable = generateNewWearable(); - wearable->setType( type ); + LLViewerWearable *wearable = generateNewWearable(); + wearable->setType( type, avatarp ); std::string name = LLTrans::getString( LLWearableType::getTypeDefaultNewName(wearable->getType()) ); wearable->setName( name ); @@ -237,6 +249,8 @@ LLWearable* LLWearableList::createNewWearable( LLWearableType::EType type ) perm.initMasks(PERM_ALL, PERM_ALL, PERM_NONE, PERM_NONE, PERM_MOVE | PERM_TRANSFER); wearable->setPermissions(perm); + wearable->setDefinitionVersion(LLWearable::getCurrentDefinitionVersion()); + // Description and sale info have default values. wearable->setParamsToDefaults(); wearable->setTexturesToDefaults(); @@ -251,13 +265,13 @@ LLWearable* LLWearableList::createNewWearable( LLWearableType::EType type ) return wearable; } -LLWearable *LLWearableList::generateNewWearable() +LLViewerWearable *LLWearableList::generateNewWearable() { LLTransactionID tid; tid.generate(); LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); - LLWearable* wearable = new LLWearable(tid); + LLViewerWearable* wearable = new LLViewerWearable(tid); mList[new_asset_id] = wearable; return wearable; } diff --git a/indra/newview/llwearablelist.h b/indra/newview/llwearablelist.h index 12d0037aee..d6f0fd09a6 100644 --- a/indra/newview/llwearablelist.h +++ b/indra/newview/llwearablelist.h @@ -28,7 +28,7 @@ #define LL_LLWEARABLELIST_H #include "llmemory.h" -#include "llwearable.h" +#include "llviewerwearable.h" #include "lluuid.h" #include "llassetstorage.h" @@ -50,20 +50,21 @@ public: void getAsset(const LLAssetID& assetID, const std::string& wearable_name, + LLAvatarAppearance *avatarp, LLAssetType::EType asset_type, - void(*asset_arrived_callback)(LLWearable*, void* userdata), + void(*asset_arrived_callback)(LLViewerWearable*, void* userdata), void* userdata); - LLWearable* createCopy(const LLWearable* old_wearable, const std::string& new_name = std::string()); - LLWearable* createNewWearable(LLWearableType::EType type); + LLViewerWearable* createCopy(const LLViewerWearable* old_wearable, const std::string& new_name = std::string()); + LLViewerWearable* createNewWearable(LLWearableType::EType type, LLAvatarAppearance *avatarp); // Callback static void processGetAssetReply(const char* filename, const LLAssetID& assetID, void* user_data, S32 status, LLExtStat ext_status); protected: - LLWearable* generateNewWearable(); // used for the create... functions + LLViewerWearable* generateNewWearable(); // used for the create... functions private: - std::map<LLUUID, LLWearable*> mList; + std::map<LLUUID, LLViewerWearable*> mList; }; #endif // LL_LLWEARABLELIST_H diff --git a/indra/newview/llwearabletype.cpp b/indra/newview/llwearabletype.cpp deleted file mode 100644 index c090ab5c3d..0000000000 --- a/indra/newview/llwearabletype.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/** - * @file llwearabletype.cpp - * @brief LLWearableType class implementation - * - * $LicenseInfo:firstyear=2002&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$ - */ - -#include "llviewerprecompiledheaders.h" -#include "llwearabletype.h" -#include "llinventoryfunctions.h" -#include "lltrans.h" - -struct WearableEntry : public LLDictionaryEntry -{ - WearableEntry(const std::string &name, - const std::string& default_new_name, - LLAssetType::EType assetType, - LLInventoryIcon::EIconName iconName, - BOOL disable_camera_switch = FALSE, - BOOL allow_multiwear = TRUE) : - LLDictionaryEntry(name), - mAssetType(assetType), - mDefaultNewName(default_new_name), - mLabel(LLTrans::getString(name)), - mIconName(iconName), - mDisableCameraSwitch(disable_camera_switch), - mAllowMultiwear(allow_multiwear) - { - - } - const LLAssetType::EType mAssetType; - const std::string mLabel; - const std::string mDefaultNewName; //keep mLabel for backward compatibility - LLInventoryIcon::EIconName mIconName; - BOOL mDisableCameraSwitch; - BOOL mAllowMultiwear; -}; - -class LLWearableDictionary : public LLSingleton<LLWearableDictionary>, - public LLDictionary<LLWearableType::EType, WearableEntry> -{ -public: - LLWearableDictionary(); -}; - -LLWearableDictionary::LLWearableDictionary() -{ - addEntry(LLWearableType::WT_SHAPE, new WearableEntry("shape", "New Shape", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_SHAPE, FALSE, FALSE)); - addEntry(LLWearableType::WT_SKIN, new WearableEntry("skin", "New Skin", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_SKIN, FALSE, FALSE)); - addEntry(LLWearableType::WT_HAIR, new WearableEntry("hair", "New Hair", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_HAIR, FALSE, FALSE)); - addEntry(LLWearableType::WT_EYES, new WearableEntry("eyes", "New Eyes", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_EYES, FALSE, FALSE)); - addEntry(LLWearableType::WT_SHIRT, new WearableEntry("shirt", "New Shirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SHIRT, FALSE, TRUE)); - addEntry(LLWearableType::WT_PANTS, new WearableEntry("pants", "New Pants", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_PANTS, FALSE, TRUE)); - addEntry(LLWearableType::WT_SHOES, new WearableEntry("shoes", "New Shoes", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SHOES, FALSE, TRUE)); - addEntry(LLWearableType::WT_SOCKS, new WearableEntry("socks", "New Socks", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SOCKS, FALSE, TRUE)); - addEntry(LLWearableType::WT_JACKET, new WearableEntry("jacket", "New Jacket", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_JACKET, FALSE, TRUE)); - addEntry(LLWearableType::WT_GLOVES, new WearableEntry("gloves", "New Gloves", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_GLOVES, FALSE, TRUE)); - addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry("undershirt", "New Undershirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERSHIRT, FALSE, TRUE)); - addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry("underpants", "New Underpants", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERPANTS, FALSE, TRUE)); - addEntry(LLWearableType::WT_SKIRT, new WearableEntry("skirt", "New Skirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SKIRT, FALSE, TRUE)); - addEntry(LLWearableType::WT_ALPHA, new WearableEntry("alpha", "New Alpha", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_ALPHA, FALSE, TRUE)); - addEntry(LLWearableType::WT_TATTOO, new WearableEntry("tattoo", "New Tattoo", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_TATTOO, FALSE, TRUE)); - - addEntry(LLWearableType::WT_PHYSICS, new WearableEntry("physics", "New Physics", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_PHYSICS, TRUE, TRUE)); - - addEntry(LLWearableType::WT_INVALID, new WearableEntry("invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE, FALSE, FALSE)); - addEntry(LLWearableType::WT_NONE, new WearableEntry("none", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE, FALSE, FALSE)); -} - -// static -LLWearableType::EType LLWearableType::typeNameToType(const std::string& type_name) -{ - const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); - const LLWearableType::EType wearable = dict->lookup(type_name); - return wearable; -} - -// static -const std::string& LLWearableType::getTypeName(LLWearableType::EType type) -{ - const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); - const WearableEntry *entry = dict->lookup(type); - if (!entry) return getTypeName(WT_INVALID); - return entry->mName; -} - -//static -const std::string& LLWearableType::getTypeDefaultNewName(LLWearableType::EType type) -{ - const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); - const WearableEntry *entry = dict->lookup(type); - if (!entry) return getTypeDefaultNewName(WT_INVALID); - return entry->mDefaultNewName; -} - -// static -const std::string& LLWearableType::getTypeLabel(LLWearableType::EType type) -{ - const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); - const WearableEntry *entry = dict->lookup(type); - if (!entry) return getTypeLabel(WT_INVALID); - return entry->mLabel; -} - -// static -LLAssetType::EType LLWearableType::getAssetType(LLWearableType::EType type) -{ - const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); - const WearableEntry *entry = dict->lookup(type); - if (!entry) return getAssetType(WT_INVALID); - return entry->mAssetType; -} - -// static -LLInventoryIcon::EIconName LLWearableType::getIconName(LLWearableType::EType type) -{ - const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); - const WearableEntry *entry = dict->lookup(type); - if (!entry) return getIconName(WT_INVALID); - return entry->mIconName; -} - -// static -BOOL LLWearableType::getDisableCameraSwitch(LLWearableType::EType type) -{ - const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); - const WearableEntry *entry = dict->lookup(type); - if (!entry) return FALSE; - return entry->mDisableCameraSwitch; -} - -// static -BOOL LLWearableType::getAllowMultiwear(LLWearableType::EType type) -{ - const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); - const WearableEntry *entry = dict->lookup(type); - if (!entry) return FALSE; - return entry->mAllowMultiwear; -} - diff --git a/indra/newview/llwearabletype.h b/indra/newview/llwearabletype.h deleted file mode 100644 index d633b4807e..0000000000 --- a/indra/newview/llwearabletype.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - * @file llwearabletype.h - * @brief LLWearableType class header file - * - * $LicenseInfo:firstyear=2002&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$ - */ - -#ifndef LL_LLWEARABLETYPE_H -#define LL_LLWEARABLETYPE_H - -#include "llassettype.h" -#include "lldictionary.h" -#include "llinventoryicon.h" -#include "llsingleton.h" - -class LLWearableType -{ -public: - enum EType - { - WT_SHAPE = 0, - WT_SKIN = 1, - WT_HAIR = 2, - WT_EYES = 3, - WT_SHIRT = 4, - WT_PANTS = 5, - WT_SHOES = 6, - WT_SOCKS = 7, - WT_JACKET = 8, - WT_GLOVES = 9, - WT_UNDERSHIRT = 10, - WT_UNDERPANTS = 11, - WT_SKIRT = 12, - WT_ALPHA = 13, - WT_TATTOO = 14, - WT_PHYSICS = 15, - WT_COUNT = 16, - - WT_INVALID = 255, - WT_NONE = -1, - }; - - static const std::string& getTypeName(EType type); - static const std::string& getTypeDefaultNewName(EType type); - static const std::string& getTypeLabel(EType type); - static LLAssetType::EType getAssetType(EType type); - static EType typeNameToType(const std::string& type_name); - static LLInventoryIcon::EIconName getIconName(EType type); - static BOOL getDisableCameraSwitch(EType type); - static BOOL getAllowMultiwear(EType type); - -protected: - LLWearableType() {} - ~LLWearableType() {} -}; - -#endif // LL_LLWEARABLETYPE_H diff --git a/indra/newview/llwebsharing.cpp b/indra/newview/llwebsharing.cpp index 43b1a320c3..3a80051b9b 100644 --- a/indra/newview/llwebsharing.cpp +++ b/indra/newview/llwebsharing.cpp @@ -68,9 +68,9 @@ public: } } - virtual void error(U32 status, const std::string& reason) + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - LL_WARNS("WebSharing") << "Error [" << status << "]: " << reason << LL_ENDL; + LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL; } virtual void result(const LLSD& content) @@ -99,7 +99,7 @@ public: /// Left empty to override the default LLSD parsing behaviour. } - virtual void error(U32 status, const std::string& reason) + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) { if (HTTP_UNAUTHORIZED == status) { @@ -108,7 +108,7 @@ public: } else { - LL_WARNS("WebSharing") << "Error [" << status << "]: " << reason << LL_ENDL; + LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL; LLWebSharing::instance().retryOpenIDAuth(); } @@ -152,9 +152,9 @@ public: } } - virtual void error(U32 status, const std::string& reason) + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - LL_WARNS("WebSharing") << "Error [" << status << "]: " << reason << LL_ENDL; + LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL; LLWebSharing::instance().retryOpenIDAuth(); } @@ -221,9 +221,9 @@ public: } } - virtual void error(U32 status, const std::string& reason) + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - LL_WARNS("WebSharing") << "Error [" << status << "]: " << reason << LL_ENDL; + LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL; } virtual void result(const LLSD& content) diff --git a/indra/newview/llwlhandlers.cpp b/indra/newview/llwlhandlers.cpp index be3e3ff30e..93eba5b604 100644 --- a/indra/newview/llwlhandlers.cpp +++ b/indra/newview/llwlhandlers.cpp @@ -121,9 +121,11 @@ LLEnvironmentRequestResponder::LLEnvironmentRequestResponder() LLEnvManagerNew::getInstance()->onRegionSettingsResponse(unvalidated_content); } -/*virtual*/ void LLEnvironmentRequestResponder::error(U32 status, const std::string& reason) +/*virtual*/ +void LLEnvironmentRequestResponder::errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - LL_INFOS("WindlightCaps") << "Got an error, not using region windlight..." << LL_ENDL; + LL_INFOS("WindlightCaps") << "Got an error, not using region windlight... [status:" + << status << "]: " << content << LL_ENDL; LLEnvManagerNew::getInstance()->onRegionSettingsResponse(LLSD()); } @@ -190,14 +192,15 @@ bool LLEnvironmentApply::initiateRequest(const LLSD& content) LLEnvManagerNew::instance().onRegionSettingsApplyResponse(false); } } -/*virtual*/ void LLEnvironmentApplyResponder::error(U32 status, const std::string& reason) +/*virtual*/ +void LLEnvironmentApplyResponder::errorWithContent(U32 status, const std::string& reason, const LLSD& content) { - std::stringstream msg; - msg << reason << " (Code " << status << ")"; - - LL_WARNS("WindlightCaps") << "Couldn't apply windlight settings to region! Reason: " << msg << LL_ENDL; + LL_WARNS("WindlightCaps") << "Couldn't apply windlight settings to region! [status:" + << status << "]: " << content << LL_ENDL; LLSD args(LLSD::emptyMap()); + std::stringstream msg; + msg << reason << " (Code " << status << ")"; args["FAIL_REASON"] = msg.str(); LLNotificationsUtil::add("WLRegionApplyFail", args); } diff --git a/indra/newview/llwlhandlers.h b/indra/newview/llwlhandlers.h index 23558876da..598ce6d52a 100644 --- a/indra/newview/llwlhandlers.h +++ b/indra/newview/llwlhandlers.h @@ -47,7 +47,7 @@ class LLEnvironmentRequestResponder: public LLHTTPClient::Responder LOG_CLASS(LLEnvironmentRequestResponder); public: virtual void result(const LLSD& content); - virtual void error(U32 status, const std::string& reason); + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content); private: friend class LLEnvironmentRequest; @@ -89,7 +89,8 @@ public: */ virtual void result(const LLSD& content); - virtual void error(U32 status, const std::string& reason); // non-200 errors only + // non-200 errors only + virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content); private: friend class LLEnvironmentApply; diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index 350ba39b45..5fa380e0e3 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -34,6 +34,7 @@ #include "lluistring.h" #include "llviewertexturelist.h" #include "lltrans.h" +#include "llgltexture.h" // Timers to temporise database requests const F32 AGENTS_UPDATE_TIMER = 60.0; // Seconds between 2 agent requests for a region @@ -78,7 +79,7 @@ void LLSimInfo::setLandForSaleImage (LLUUID image_id) // Fetch the image if (mMapImageID.notNull()) { - mOverlayImage = LLViewerTextureManager::getFetchedTexture(mMapImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_MAP, LLViewerTexture::LOD_TEXTURE); + mOverlayImage = LLViewerTextureManager::getFetchedTexture(mMapImageID, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_MAP, LLViewerTexture::LOD_TEXTURE); mOverlayImage->setAddressMode(LLTexUnit::TAM_CLAMP); } else @@ -92,13 +93,13 @@ LLPointer<LLViewerFetchedTexture> LLSimInfo::getLandForSaleImage () if (mOverlayImage.isNull() && mMapImageID.notNull()) { // Fetch the image if it hasn't been done yet (unlikely but...) - mOverlayImage = LLViewerTextureManager::getFetchedTexture(mMapImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_MAP, LLViewerTexture::LOD_TEXTURE); + mOverlayImage = LLViewerTextureManager::getFetchedTexture(mMapImageID, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_MAP, LLViewerTexture::LOD_TEXTURE); mOverlayImage->setAddressMode(LLTexUnit::TAM_CLAMP); } if (!mOverlayImage.isNull()) { // Boost the fetch level when we try to access that image - mOverlayImage->setBoostLevel(LLViewerTexture::BOOST_MAP); + mOverlayImage->setBoostLevel(LLGLTexture::BOOST_MAP); } return mOverlayImage; } diff --git a/indra/newview/llworldmap.h b/indra/newview/llworldmap.h index 73530b9694..d514b2f14c 100644 --- a/indra/newview/llworldmap.h +++ b/indra/newview/llworldmap.h @@ -36,6 +36,7 @@ #include "llsingleton.h" #include "llviewerregion.h" #include "llviewertexture.h" +#include "llgltexture.h" // Description of objects like hubs, events, land for sale, people and more (TBD). // Note: we don't store a "type" in there so we need to store instances of this class in diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 11b2770ec0..1940cf541e 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -421,7 +421,7 @@ void LLWorldMapView::draw() { // Inform the fetch mechanism of the size we need S32 draw_size = llround(sMapScale); - overlayimage->setKnownDrawSize(llround(draw_size * LLUI::sGLScaleFactor.mV[VX]), llround(draw_size * LLUI::sGLScaleFactor.mV[VY])); + overlayimage->setKnownDrawSize(llround(draw_size * LLUI::getScaleFactor().mV[VX]), llround(draw_size * LLUI::getScaleFactor().mV[VY])); // Draw something whenever we have enough info if (overlayimage->hasGLTexture()) { @@ -1317,7 +1317,7 @@ void LLWorldMapView::drawTrackingCircle( const LLRect& rect, S32 x, S32 y, const gGL.matrixMode(LLRender::MM_MODELVIEW); gGL.pushMatrix(); - gGL.translatef((F32)x * LLUI::sGLScaleFactor.mV[VX], (F32)y * LLUI::sGLScaleFactor.mV[VY], 0.f); + gGL.translatef((F32)x * LLUI::getScaleFactor().mV[VX], (F32)y * LLUI::getScaleFactor().mV[VY], 0.f); gl_washer_segment_2d(inner_radius, outer_radius, start_theta, end_theta, 40, color, color); gGL.popMatrix(); diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp index 74ed844376..895ccaef5a 100644 --- a/indra/newview/llworldmipmap.cpp +++ b/indra/newview/llworldmipmap.cpp @@ -74,21 +74,21 @@ void LLWorldMipmap::equalizeBoostLevels() { LLPointer<LLViewerFetchedTexture> img = iter->second; S32 current_boost_level = img->getBoostLevel(); - if (current_boost_level == LLViewerTexture::BOOST_MAP_VISIBLE) + if (current_boost_level == LLGLTexture::BOOST_MAP_VISIBLE) { // If level was BOOST_MAP_VISIBLE, the tile has been used in the last draw so keep it high - img->setBoostLevel(LLViewerTexture::BOOST_MAP); + img->setBoostLevel(LLGLTexture::BOOST_MAP); } else { // If level was BOOST_MAP only (or anything else...), the tile wasn't used in the last draw // so we drop its boost level to BOOST_NONE. - img->setBoostLevel(LLViewerTexture::BOOST_NONE); + img->setBoostLevel(LLGLTexture::BOOST_NONE); } #if DEBUG_TILES_STAT // Increment some stats if compile option on nb_tiles++; - if (current_boost_level == LLViewerTexture::BOOST_MAP_VISIBLE) + if (current_boost_level == LLGLTexture::BOOST_MAP_VISIBLE) { nb_visible++; } @@ -115,7 +115,7 @@ void LLWorldMipmap::dropBoostLevels() for (sublevel_tiles_t::iterator iter = level_mipmap.begin(); iter != level_mipmap.end(); iter++) { LLPointer<LLViewerFetchedTexture> img = iter->second; - img->setBoostLevel(LLViewerTexture::BOOST_NONE); + img->setBoostLevel(LLGLTexture::BOOST_NONE); } } } @@ -172,7 +172,7 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::getObjectsTile(U32 grid_x, U32 // Boost the tile level so to mark it's in use *if* load on if (load) { - img->setBoostLevel(LLViewerTexture::BOOST_MAP_VISIBLE); + img->setBoostLevel(LLGLTexture::BOOST_MAP_VISIBLE); } return img; } @@ -189,8 +189,8 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32 // END DEBUG //LL_INFOS("World Map") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL; - LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); - img->setBoostLevel(LLViewerTexture::BOOST_MAP); + LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, FTT_MAP_TILE, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + img->setBoostLevel(LLGLTexture::BOOST_MAP); // Return the smart pointer return img; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 1957345b6d..f053d26172 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -6021,7 +6021,6 @@ void LLPipeline::setupHWLights(LLDrawPool* pool) if (light->isLightSpotlight() // directional (spot-)light && (LLPipeline::sRenderDeferred || RenderSpotLightsInNondeferred)) // these are only rendered as GL spotlights if we're in deferred rendering mode *or* the setting forces them on { - LLVector3 spotparams = light->getSpotLightParams(); LLQuaternion quat = light->getRenderRotation(); LLVector3 at_axis(0,0,-1); // this matches deferred rendering's object light direction at_axis *= quat; @@ -6552,6 +6551,22 @@ void LLPipeline::setRenderDebugFeatureControl(U32 bit, bool value) } } +void LLPipeline::pushRenderDebugFeatureMask() +{ + mRenderDebugFeatureStack.push(mRenderDebugFeatureMask); +} + +void LLPipeline::popRenderDebugFeatureMask() +{ + if (mRenderDebugFeatureStack.empty()) + { + llerrs << "Depleted render feature stack." << llendl; + } + + mRenderDebugFeatureMask = mRenderDebugFeatureStack.top(); + mRenderDebugFeatureStack.pop(); +} + // static void LLPipeline::setRenderScriptedBeacons(BOOL val) { @@ -9301,9 +9316,6 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector 3,7 }; - LLVector3 center = (max+min)*0.5f; - LLVector3 size = (max-min)*0.5f; - for (U32 i = 0; i < 12; i++) { for (U32 j = 0; j < 6; ++j) @@ -9545,7 +9557,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera) mSunOrthoClipPlanes = LLVector4(clip, clip.mV[2]*clip.mV[2]/clip.mV[1]); //currently used for amount to extrude frusta corners for constructing shadow frusta - LLVector3 n = RenderShadowNearDist; + //LLVector3 n = RenderShadowNearDist; //F32 nearDist[] = { n.mV[0], n.mV[1], n.mV[2], n.mV[2] }; //put together a universal "near clip" plane for shadow frusta @@ -10649,6 +10661,22 @@ void LLPipeline::clearRenderTypeMask(U32 type, ...) } } +void LLPipeline::setAllRenderTypes() +{ + for (U32 i = 0; i < NUM_RENDER_TYPES; ++i) + { + mRenderTypeEnabled[i] = TRUE; + } +} + +void LLPipeline::clearAllRenderTypes() +{ + for (U32 i = 0; i < NUM_RENDER_TYPES; ++i) + { + mRenderTypeEnabled[i] = FALSE; + } +} + void LLPipeline::addDebugBlip(const LLVector3& position, const LLColor4& color) { DebugBlip blip(position, color); diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 1fb746ae56..fbfb2d012f 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -35,7 +35,8 @@ #include "llspatialpartition.h" #include "m4math.h" #include "llpointer.h" -#include "lldrawpool.h" +#include "lldrawpoolalpha.h" +#include "lldrawpoolmaterials.h" #include "llgl.h" #include "lldrawable.h" #include "llrendertarget.h" @@ -328,20 +329,28 @@ public: BOOL hasRenderDebugFeatureMask(const U32 mask) const { return (mRenderDebugFeatureMask & mask) ? TRUE : FALSE; } BOOL hasRenderDebugMask(const U32 mask) const { return (mRenderDebugMask & mask) ? TRUE : FALSE; } - - + void setAllRenderDebugFeatures() { mRenderDebugFeatureMask = 0xffffffff; } + void clearAllRenderDebugFeatures() { mRenderDebugFeatureMask = 0x0; } + void setAllRenderDebugDisplays() { mRenderDebugMask = 0xffffffff; } + void clearAllRenderDebugDisplays() { mRenderDebugMask = 0x0; } BOOL hasRenderType(const U32 type) const; BOOL hasAnyRenderType(const U32 type, ...) const; void setRenderTypeMask(U32 type, ...); - void orRenderTypeMask(U32 type, ...); + // This is equivalent to 'setRenderTypeMask' + //void orRenderTypeMask(U32 type, ...); void andRenderTypeMask(U32 type, ...); void clearRenderTypeMask(U32 type, ...); + void setAllRenderTypes(); + void clearAllRenderTypes(); void pushRenderTypeMask(); void popRenderTypeMask(); + void pushRenderDebugFeatureMask(); + void popRenderDebugFeatureMask(); + static void toggleRenderType(U32 type); // For UI control of render features @@ -656,6 +665,7 @@ protected: U32 mRenderDebugFeatureMask; U32 mRenderDebugMask; + std::stack<U32> mRenderDebugFeatureStack; U32 mOldRenderDebugMask; diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index df75f3f697..471a896019 100644 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc @@ -135,8 +135,8 @@ TOOLNO CURSOR "llno.cur" // VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,1,1,0 - PRODUCTVERSION 2,1,1,0 + FILEVERSION 3,4,1,264760 + PRODUCTVERSION 3,4,1,264760 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -153,12 +153,12 @@ BEGIN BEGIN VALUE "CompanyName", "Linden Lab" VALUE "FileDescription", "Second Life" - VALUE "FileVersion", "2.1.1.0" + VALUE "FileVersion", "3.4.1.264760" VALUE "InternalName", "Second Life" VALUE "LegalCopyright", "Copyright � 2001-2010, Linden Research, Inc." VALUE "OriginalFilename", "SecondLife.exe" VALUE "ProductName", "Second Life" - VALUE "ProductVersion", "2.1.1.0" + VALUE "ProductVersion", "3.4.1.264760" END END BLOCK "VarFileInfo" diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 93c9cb02cb..fcab966dee 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -724,9 +724,6 @@ with the same filename but different name <texture name="icon_for_sale.tga" file_name="icons/Icon_For_Sale.png" /> <texture name="icon_top_pick.tga" /> - <texture name="inv_folder_mesh.tga"/> - <texture name="inv_item_mesh.tga"/> - <texture name="lag_status_critical.tga" /> <texture name="lag_status_good.tga" /> <texture name="lag_status_warning.tga" /> diff --git a/indra/newview/skins/default/xui/de/floater_conversation_log.xml b/indra/newview/skins/default/xui/de/floater_conversation_log.xml new file mode 100644 index 0000000000..19620a0fc9 --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="UNTERHALTUNGSPROTOKOLL"> + <panel name="buttons_panel"> + <filter_editor label="Nach Personen filtern" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="Anzeige-/Sortieroptionen"/> + <menu_button name="conversations_gear_btn" tool_tip="Aktionen für ausgewählte Person/Gruppe"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_conversation_preview.xml b/indra/newview/skins/default/xui/de/floater_conversation_preview.xml new file mode 100644 index 0000000000..010ad19076 --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="UNTERHALTUNG:"> + <floater.string name="Title"> + UNTERHALTUNG: [NAME] + </floater.string> + <text name="page_label" value="Seite"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_im_container.xml b/indra/newview/skins/default/xui/de/floater_im_container.xml index 95eda97938..5bf916c8e9 100644 --- a/indra/newview/skins/default/xui/de/floater_im_container.xml +++ b/indra/newview/skins/default/xui/de/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="GESPRÄCHE"/> +<multi_floater name="floater_im_box" title="GESPRÄCHE"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="Anzeige-/Sortieroptionen"/> + <button name="add_btn" tool_tip="Neue Unterhaltung starten"/> + <button name="speak_btn" tool_tip="Ãœber Ihr Mikrofon mit anderen sprechen"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="Diese Liste schließen/erweitern"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="Dieses Fenster schließen"/> + <text name="stub_textbox"> + Diese Unterhaltung erscheint in einem separaten Fenster. [secondlife:/// Zurückholen.] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/de/floater_im_session.xml b/indra/newview/skins/default/xui/de/floater_im_session.xml index abaf275651..f96eb72cb1 100644 --- a/indra/newview/skins/default/xui/de/floater_im_session.xml +++ b/indra/newview/skins/default/xui/de/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="An" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] wurde zur Unterhaltung eingeladen."/> + <floater.string name="multiple_participants_added" value="[NAME] wurden zur Unterhaltung eingeladen."/> + <floater.string name="tooltip_to_separate_window" value="Diese Unterhaltung in separates Fenster verschieben"/> + <floater.string name="tooltip_to_main_window" value="Diese Unterhaltung zurück ins Hauptfenster verschieben"/> + <floater.string name="start_call_button_tooltip" value="Voice-Verbindung öffnen"/> + <floater.string name="end_call_button_tooltip" value="Voice-Verbindung schließen"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="Dieses Fenster schließen"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="Teilnehmerliste schließen"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="Teilnehmerliste erweitern"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="Anzeige-/Sortieroptionen"/> + <menu_button name="gear_btn" tool_tip="Aktionen für ausgewählte Person"/> + <button name="add_btn" tool_tip="Jemanden zu dieser Unterhaltung hinzufügen"/> + <button name="voice_call_btn" tool_tip="Voice-Verbindung öffnen"/> + <button name="close_btn" tool_tip="Diese Unterhaltung beenden"/> + <button name="expand_collapse_btn" tool_tip="Dieses Fenster schließen/erweitern"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Chat übersetzen" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="An" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="Nachrichtenfenster anzeigen/ausblenden"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_incoming_call.xml b/indra/newview/skins/default/xui/de/floater_incoming_call.xml index 213d9f54f5..f13842f479 100644 --- a/indra/newview/skins/default/xui/de/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/de/floater_incoming_call.xml @@ -10,7 +10,7 @@ Anonym </floater.string> <floater.string name="VoiceInviteP2P"> - ruft an. + ruft Sie an. </floater.string> <floater.string name="VoiceInviteAdHoc"> ist einem Voice-Konferenz-Chat beigetreten. @@ -25,9 +25,9 @@ Möchten Sie [CURRENT_CHAT] verlassen und diesem Voice-Chat beitreten? </floater.string> <text name="question"> - Möchten Sie [CURRENT_CHAT] verlassen und diesem Voice-Chat beitreten? + Wenn Sie antworten, wird Ihre aktuelle Voice-Unterhaltung beendet. </text> - <button label="Akzeptieren" label_selected="Akzeptieren" name="Accept"/> - <button label="Ablehnen" label_selected="Ablehnen" name="Reject"/> - <button label="IM starten" name="Start IM"/> + <button label="Annehmen" label_selected="Annehmen" name="Accept"/> + <button label="Ignorieren" label_selected="Ignorieren" name="Reject"/> + <button label="Stattdessen IM öffnen" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml index ebf8f01632..88e9f53a4c 100644 --- a/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Anzeigen: </text> - <check_box label="Welt" name="show_world"/> + <check_box label="Test" name="show_world"/> <check_box label="Nur bewegliche Objekte" name="show_world_movables_only"/> <check_box label="Navmesh" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml index 9585622516..b794d879f0 100644 --- a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml @@ -20,7 +20,7 @@ <button label="Leer" label_selected="Leer" name="Blank"/> <button label="Keine" label_selected="Keine" name="None"/> <button label="" label_selected="" name="Pipette"/> - <check_box initial_value="true" label="Live-Vorschau" name="apply_immediate_check"/> + <check_box initial_value="true" label="Jetzt übernehmen" name="apply_immediate_check"/> <text name="preview_disabled" value="Vorschau deaktiviert"/> <filter_editor label="Texturen filtern" name="inventory search editor"/> <check_box initial_value="false" label="Ordner anzeigen" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/de/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/de/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..15259639e8 --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="VOICE-CHAT-LAUTSTÄRKE"> + <slider label="Voice-Chat" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_voice_effect.xml b/indra/newview/skins/default/xui/de/floater_voice_effect.xml index 413a46525c..8d37950480 100644 --- a/indra/newview/skins/default/xui/de/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/de/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Orte" name="voice_effects" title="VOICE MORPHING"> +<floater label="Orte" name="voice_effects" title="VOICE-MORPHING-VORSCHAU"> <string name="no_voice_effect"> (Kein Voice-Morphing) </string> diff --git a/indra/newview/skins/default/xui/de/floater_voice_volume.xml b/indra/newview/skins/default/xui/de/floater_voice_volume.xml new file mode 100644 index 0000000000..258627c94f --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="LAUTSTÄRKE"> + <slider name="volume_slider" tool_tip="Lautstärke" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/menu_cof_gear.xml b/indra/newview/skins/default/xui/de/menu_cof_gear.xml index 54b218d22f..2dd871b2ea 100644 --- a/indra/newview/skins/default/xui/de/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/de/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear COF"> +<toggleable_menu name="Gear COF"> <menu label="Neue Kleider" name="COF.Gear.New_Clothes"/> - <menu label="Neue Körperteile" name="COF.Geear.New_Body_Parts"/> -</menu> + <menu label="Neue Körperteile" name="COF.Gear.New_Body_Parts"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_conversation.xml b/indra/newview/skins/default/xui/de/menu_conversation.xml new file mode 100644 index 0000000000..30d3ab79e1 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="Unterhaltung schließen" name="close_conversation"/> + <menu_item_call label="Unterhaltung öffnen" name="open_voice_conversation"/> + <menu_item_call label="Voice-Verbindung trennen" name="disconnect_from_voice"/> + <menu_item_call label="Profil anzeigen" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Teleport anbieten" name="offer_teleport"/> + <menu_item_call label="Voice-Anruf" name="voice_call"/> + <menu_item_call label="Chatverlauf..." name="chat_history"/> + <menu_item_call label="Freund hinzufügen" name="add_friend"/> + <menu_item_call label="Freund entfernen" name="remove_friend"/> + <menu_item_call label="Freunde entfernen" name="remove_friends"/> + <menu_item_call label="In Gruppe einladen..." name="invite_to_group"/> + <menu_item_call label="Hineinzoomen" name="zoom_in"/> + <menu_item_call label="Karte" name="map"/> + <menu_item_call label="Freigeben" name="share"/> + <menu_item_call label="Bezahlen" name="pay"/> + <menu_item_check label="Voice ignorieren" name="block_unblock"/> + <menu_item_check label="Text ignorieren" name="MuteText"/> + <menu_item_call label="Gruppenprofil" name="group_profile"/> + <menu_item_call label="Gruppe aktivieren" name="activate_group"/> + <menu_item_call label="Gruppe verlassen" name="leave_group"/> + <context_menu label="Moderatoroptionen" name="Moderator Options"> + <menu_item_check label="Text-Chat zulassen" name="AllowTextChat"/> + <menu_item_call label="Diesen Teilnehmer stummschalten" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Stummschaltung für diesen Teilnehmer aufheben" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Alle stummschalten" name="ModerateVoiceMute"/> + <menu_item_call label="Stummschaltung für alle aufheben" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/de/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..2ef8762128 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="IM..." name="IM"/> + <menu_item_call label="Voice-Anruf..." name="Call"/> + <menu_item_call label="Chatverlauf öffnen..." name="Chat history"/> + <menu_item_call label="Profil anzeigen" name="View Profile"/> + <menu_item_call label="Teleport anbieten" name="teleport"/> + <menu_item_call label="Freund hinzufügen" name="add_friend"/> + <menu_item_call label="Freund entfernen" name="remove_friend"/> + <menu_item_call label="In Gruppe einladen..." name="Invite"/> + <menu_item_call label="Karte" name="Map"/> + <menu_item_call label="Freigeben" name="Share"/> + <menu_item_call label="Bezahlen" name="Pay"/> + <menu_item_check label="Ignorieren/Nicht mehr ignorieren" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/de/menu_conversation_log_view.xml new file mode 100644 index 0000000000..ae3cc5bc97 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="Nach Namen sortieren" name="sort_by_name"/> + <menu_item_check label="Nach Datum sortieren" name="sort_by_date"/> + <menu_item_check label="Freunde oben anzeigen" name="sort_by_friends"/> + <menu_item_call label="Verlaufsliste für „Chat in der Nähe“ anzeigen..." name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_im_conversation.xml b/indra/newview/skins/default/xui/de/menu_im_conversation.xml new file mode 100644 index 0000000000..875524b19d --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="Profil anzeigen" name="View Profile"/> + <menu_item_call label="Freund hinzufügen" name="Add Friend"/> + <menu_item_call label="Freund entfernen" name="remove_friend"/> + <menu_item_call label="Teleport anbieten" name="offer_teleport"/> + <menu_item_call label="In Gruppe einladen..." name="invite_to_group"/> + <menu_item_call label="Chatverlauf..." name="chat_history"/> + <menu_item_call label="Hineinzoomen" name="zoom_in"/> + <menu_item_call label="Karte" name="map"/> + <menu_item_call label="Freigeben" name="Share"/> + <menu_item_call label="Bezahlen" name="Pay"/> + <menu_item_check label="Voice ignorieren" name="Block/Unblock"/> + <menu_item_check label="Text ignorieren" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/de/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..48f62d29a1 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="Kompaktansicht" name="compact_view"/> + <menu_item_check label="Erweiterte Ansicht" name="expanded_view"/> + <menu_item_check label="Zeit anzeigen" name="IMShowTime"/> + <menu_item_check label="Namen in privaten Unterhaltungen anzeigen" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_object_icon.xml b/indra/newview/skins/default/xui/de/menu_object_icon.xml index 8b6c558416..f92fa0f82b 100644 --- a/indra/newview/skins/default/xui/de/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/de/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="Objektprofil..." name="Object Profile"/> <menu_item_call label="Ignorieren..." name="Block"/> + <menu_item_call label="Auf Karte anzeigen" name="show_on_map"/> + <menu_item_call label="Zu Objektposition teleportieren" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/de/menu_outfit_gear.xml b/indra/newview/skins/default/xui/de/menu_outfit_gear.xml index d56c93533c..0cf3c09882 100644 --- a/indra/newview/skins/default/xui/de/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/de/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="Neues Haar" name="New Hair"/> <menu_item_call label="Neue Augen" name="New Eyes"/> </menu> + <menu_item_call label="Alle Ordner erweitern" name="expand"/> + <menu_item_call label="Alle Ordner schließen" name="collapse"/> <menu_item_call label="Outfit neu benennen" name="rename"/> <menu_item_call label="Outfit löschen" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_participant_view.xml b/indra/newview/skins/default/xui/de/menu_participant_view.xml new file mode 100644 index 0000000000..6ceb9ac4c5 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="Unterhaltungen nach Typ sortieren" name="sort_sessions_by_type"/> + <menu_item_check label="Unterhaltungen nach Namen sortieren" name="sort_sessions_by_name"/> + <menu_item_check label="Unterhaltungen nach jüngster Aktivität sortieren" name="sort_sessions_by_recent"/> + <menu_item_check label="Teilnehmer nach Namen sortieren" name="sort_participants_by_name"/> + <menu_item_check label="Teilnehmer nach jüngster Aktivität sortieren" name="sort_participants_by_recent"/> + <menu_item_call label="Chat-Einstellungen..." name="chat_preferences"/> + <menu_item_call label="Privatsphäre-Einstellungen..." name="privacy_preferences"/> + <menu_item_check label="Unterhaltungsprotokoll..." name="Conversation"/> + <menu_item_check label="Chat in der Nähe übersetzen" name="Translate_chat"/> + <menu_item_check label="Ãœbersetzungseinstellungen..." name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/de/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..f69a453e58 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="Nicht mehr ignorieren" name="unblock"/> + <menu_item_call label="Profil..." name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/de/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..041fde139d --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="Einwohner nach Namen ignorieren..." name="block_resident_by_name"/> + <menu_item_call label="Objekt nach Namen ignorieren" name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/de/menu_people_blocked_view.xml new file mode 100644 index 0000000000..1dae593ebe --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="Nach Namen sortieren" name="sort_by_name"/> + <menu_item_check label="Nach Typ sortieren" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_friends_view.xml b/indra/newview/skins/default/xui/de/menu_people_friends_view.xml new file mode 100644 index 0000000000..da4890fe96 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Nach Namen sortieren" name="sort_name"/> + <menu_item_check label="Nach Status sortieren" name="sort_status"/> + <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/> + <menu_item_check label="Erteilte Genehmigungen anzeigen" name="view_permissions"/> + <menu_item_check label="Unterhaltungsprotokoll anzeigen..." name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_groups.xml b/indra/newview/skins/default/xui/de/menu_people_groups.xml index 76225ba241..a69c82d3d8 100644 --- a/indra/newview/skins/default/xui/de/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/de/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="Info anzeigen" name="View Info"/> <menu_item_call label="Chat" name="Chat"/> - <menu_item_call label="Anrufen" name="Call"/> + <menu_item_call label="Voice-Anruf" name="Call"/> <menu_item_call label="Aktivieren" name="Activate"/> <menu_item_call label="Verlassen" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_groups_view.xml b/indra/newview/skins/default/xui/de/menu_people_groups_view.xml new file mode 100644 index 0000000000..20386bba56 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Gruppensymbole anzeigen" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby.xml b/indra/newview/skins/default/xui/de/menu_people_nearby.xml index 1db964357f..cdbb3ae917 100644 --- a/indra/newview/skins/default/xui/de/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/de/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="Profil anzeigen" name="View Profile"/> - <menu_item_call label="Freund hinzufügen" name="Add Friend"/> - <menu_item_call label="Freund entfernen" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="Anrufen" name="Call"/> - <menu_item_call label="Karte" name="Map"/> - <menu_item_call label="Teilen" name="Share"/> - <menu_item_call label="Bezahlen" name="Pay"/> - <menu_item_check label="Ignorieren/Freischalten" name="Block/Unblock"/> - <menu_item_call label="Teleport anbieten" name="teleport"/> + <menu_item_call label="Profil anzeigen" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Teleport anbieten" name="offer_teleport"/> + <menu_item_call label="Voice-Anruf" name="voice_call"/> + <menu_item_call label="Chatverlauf anzeigen..." name="chat_history"/> + <menu_item_call label="Freund hinzufügen" name="add_friend"/> + <menu_item_call label="Freund entfernen" name="remove_friend"/> + <menu_item_call label="In Gruppe einladen..." name="invite_to_group"/> + <menu_item_call label="Hineinzoomen" name="zoom_in"/> + <menu_item_call label="Karte" name="map"/> + <menu_item_call label="Freigeben" name="share"/> + <menu_item_call label="Bezahlen" name="pay"/> + <menu_item_check label="Ignorieren/Nicht mehr ignorieren" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml index b6e99edfe1..ba6578e2d1 100644 --- a/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="Freunde hinzufügen" name="Add Friends"/> - <menu_item_call label="Freunde entfernen" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="Anrufen" name="Call"/> - <menu_item_call label="Teilen" name="Share"/> - <menu_item_call label="Bezahlen" name="Pay"/> - <menu_item_call label="Teleport anbieten" name="teleport"/> + <menu_item_call label="Freunde hinzufügen" name="add_friends"/> + <menu_item_call label="Freunde entfernen" name="remove_friends"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Anrufen" name="call"/> + <menu_item_call label="Freigeben" name="share"/> + <menu_item_call label="Bezahlen" name="pay"/> + <menu_item_call label="Teleport anbieten" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/de/menu_people_nearby_view.xml new file mode 100644 index 0000000000..d38ec65037 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Nach letzten Sprechern sortieren" name="sort_by_recent_speakers"/> + <menu_item_check label="Nach Namen sortieren" name="sort_name"/> + <menu_item_check label="Nach Nähe sortieren" name="sort_distance"/> + <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/> + <menu_item_check label="Karte anzeigen" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_people_recent_view.xml b/indra/newview/skins/default/xui/de/menu_people_recent_view.xml new file mode 100644 index 0000000000..a116ad0bc1 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Nach jüngsten sortieren" name="sort_most"/> + <menu_item_check label="Nach Namen sortieren" name="sort_name"/> + <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_agent.xml b/indra/newview/skins/default/xui/de/menu_url_agent.xml index 9a808088fb..c61ebb0eae 100644 --- a/indra/newview/skins/default/xui/de/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/de/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Einwohnerprofil anzeigen" name="show_agent"/> + <menu_item_call label="Profil anzeigen" name="show_agent"/> + <menu_item_call label="IM senden..." name="send_im"/> + <menu_item_call label="Freund hinzufügen..." name="add_friend"/> <menu_item_call label="Name in Zwischenablage kopieren" name="url_copy_label"/> <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_objectim.xml b/indra/newview/skins/default/xui/de/menu_url_objectim.xml index 90d3763d9c..77b7004e44 100644 --- a/indra/newview/skins/default/xui/de/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/de/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Objektinformationen anzeigen" name="show_object"/> + <menu_item_call label="Objektprofil..." name="show_object"/> <menu_item_call label="Auf Karte zeigen" name="show_on_map"/> <menu_item_call label="Zu Objekt-Position teleportieren" name="teleport_to_object"/> <menu_item_call label="Objektname in Zwischenablage kopieren" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index 8277174cda..211933a186 100644 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="Animation meines Avatars stoppen" name="Stop Animating My Avatar"/> <menu_item_call label="Gehen/Rennen/Fliegen..." name="Walk / run / fly"/> </menu> - <menu label="Status" name="Status"> - <menu_item_call label="Abwesend" name="Set Away"/> - <menu_item_call label="Beschäftigt" name="Set Busy"/> - </menu> + <menu label="Status" name="Status"/> <menu_item_call label="L$ kaufen..." name="Buy and Sell L$"/> <menu_item_call label="Händler-Outbox..." name="MerchantOutbox"/> <menu_item_call label="Kontoübersicht..." name="Manage My Account"> @@ -32,14 +29,18 @@ <menu_item_call label="[APP_NAME] schließen" name="Quit"/> </menu> <menu label="Unterhalten" name="Communicate"> - <menu_item_check label="Chat..." name="Nearby Chat"/> + <menu_item_check label="Unterhaltungen..." name="Conversations"/> + <menu_item_check label="Chat in der Nähe..." name="Nearby Chat"/> <menu_item_check label="Sprechen" name="Speak"/> - <menu_item_check label="Voice-Einstellungen..." name="Nearby Voice"/> - <menu_item_check label="Voice-Morphing..." name="ShowVoice"/> + <menu label="Voice-Morphing" name="VoiceMorphing"> + <menu_item_check label="Kein Voice-Morphing" name="NoVoiceMorphing"/> + <menu_item_check label="Vorschau..." name="Preview"/> + <menu_item_call label="Abonnieren..." name="Subscribe"/> + </menu> <menu_item_check label="Gesten..." name="Gestures"/> - <menu_item_call label="Freunde" name="My Friends"/> - <menu_item_call label="Gruppen" name="My Groups"/> - <menu_item_call label="Leute in der Nähe" name="Active Speakers"/> + <menu_item_check label="Freunde" name="My Friends"/> + <menu_item_check label="Gruppen" name="My Groups"/> + <menu_item_check label="Leute in der Nähe" name="Active Speakers"/> <menu_item_call label="Blockierliste" name="Block List"/> </menu> <menu label="Welt" name="World"> @@ -130,6 +131,7 @@ <menu_item_call label="Linksets..." name="pathfinding_linksets_menu_item"/> <menu_item_call label="Figuren..." name="pathfinding_characters_menu_item"/> <menu_item_call label="Anzeigen/Testen..." name="pathfinding_console_menu_item"/> + <menu_item_call label="Region neu formen" name="pathfinding_rebake_navmesh_item"/> </menu> <menu label="Optionen" name="Options"> <menu_item_check label="Erweiterte Berechtigungen anzeigen" name="DebugPermissions"/> @@ -159,6 +161,13 @@ <menu label="Hilfe" name="Help"> <menu_item_call label="Anweisungen..." name="How To"/> <menu_item_call label="[SECOND_LIFE]-Hilfe" name="Second Life Help"/> + <menu_item_call label="Benutzerhandbuch" name="User’s guide"/> + <menu_item_call label="Knowledge Base" name="Knowledge Base"/> + <menu_item_call label="Wiki" name="Wiki"/> + <menu_item_call label="Community-Foren" name="Community Forums"/> + <menu_item_call label="Support-Portal" name="Support portal"/> + <menu_item_call label="[SECOND_LIFE]-Neuigkeiten" name="Second Life News"/> + <menu_item_call label="[SECOND_LIFE]-Blogs" name="Second Life Blogs"/> <menu_item_call label="Missbrauch melden" name="Report Abuse"/> <menu_item_call label="Fehler melden" name="Report Bug"/> <menu_item_call label="INFO ÃœBER [APP_NAME]" name="About Second Life"/> @@ -307,7 +316,7 @@ <menu_item_call label="Texturinfo für ausgewähltes Objekt" name="Selected Texture Info Basis"/> <menu_item_check label="Wireframe" name="Wireframe"/> <menu_item_check label="Objekt-Objekt Okklusion" name="Object-Object Occlusion"/> - <menu_item_check label="Licht und Schatten" name="Advanced Lighting Model"/> + <menu_item_check label="Uber Licht Modell" name="Advanced Lighting Model"/> <menu_item_check label="Schatten von Sonne-/Mond-Projektoren" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO und Schattenglättung" name="SSAO and Shadow Smoothing"/> <menu_item_check label="Fehler in GL beseitigen" name="Debug GL"/> diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index 4b7a60b4eb..dc0d7dc6b4 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -523,6 +523,24 @@ Weitere Informationen finden Sie auf [_URL]. </url> <usetemplate ignoretext="Mein Grafiktreiber ist veraltet" name="okcancelignore" notext="Nein" yestext="Ja"/> </notification> + <notification name="AMDOldDriver"> + Wahrscheinlich gibt es einen neueren Treiber für Ihren Grafikchip. Durch Aktualisieren der Grafiktreiber lässt sich die Leistung u. U. beträchtlich verbessern. + + Unter [_URL] nach aktualisierten Treibern suchen? + <url name="url"> + http://support.amd.com/de/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="Mein Grafiktreiber ist veraltet" name="okcancelignore" notext="Nein" yestext="Ja"/> + </notification> + <notification name="NVIDIAOldDriver"> + Wahrscheinlich gibt es einen neueren Treiber für Ihren Grafikchip. Durch Aktualisieren der Grafiktreiber lässt sich die Leistung u. U. beträchtlich verbessern. + + Unter [_URL] nach aktualisierten Treibern suchen? + <url name="url"> + http://www.nvidia.com/Download/index.aspx?lang=de-de + </url> + <usetemplate ignoretext="Mein Grafiktreiber ist veraltet" name="okcancelignore" notext="Nein" yestext="Ja"/> + </notification> <notification name="UnknownGPU"> Ihr System verwendet eine Grafikkarte, die [APP_NAME] nicht erkennt. Dies passiert dann, wenn die neue Hardware noch nicht mit [APP_NAME] getestet wurde. Wahrscheinlich wird das Programm richtig ausgeführt, aber Sie müssen eventuell ein paar Grafikeinstellungen vornehmen. @@ -1558,10 +1576,13 @@ Diese Gruppe verlassen? Sie können gerade keine Freundschaft anbieten. Warten Sie kurz und versuchen Sie es dann noch einmal. <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="BusyModeSet"> - Beschäftigt-Modus ist aktiviert. -Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachrichten) erhalten Ihre Beschäftigt-Antwort. Alle Teleport-Angebote werden abgelehnt. Alle Inventar-Angebote werden in Ihren Papierkorb geschoben. - <usetemplate ignoretext="Ich ändere meinen Status zu Beschäftigt" name="okignore" yestext="OK"/> + <notification name="DoNotDisturbModeSet"> + Nicht-stören-Modus ist aktiviert: Sie erhalten keine Benachrichtigung über eingehende Kommunikation. + +- Andere Einwohner erhalten Ihre Nicht-stören-Antwort (festgelegt in Einstellungen > Allgemein). +- Teleport-Angebote werden abgelehnt. +- Voice-Anrufe werden abgelehnt. + <usetemplate ignoretext="Ich ändere meinen Status zu „Nicht stören“" name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> Sie haben die maximale Anzahl an Gruppen erreicht. Bitte verlassen Sie eine andere Gruppe, um dieser beitreten zu können oder lehnen Sie das Angebot ab. @@ -2049,6 +2070,10 @@ Inventarobjekt(e) verschieben? Möchten Sie Ihre [http://secondlife.com/account/ Startseite] aufrufen, um Ihre Konto-Statistik anzuzeigen? <usetemplate ignoretext="Meinen Browser starten, um meine Konto-Statistik anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + Wenn Sie eine Person zu einer vorhandenen Unterhaltung hinzufügen, wird eine neue Unterhaltung erstellt. Alle Teilnehmer erhalten neue Unterhaltungsbenachrichtigungen. + <usetemplate ignoretext="Hinzufügen von Chat-Teilnehmern bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> <notification name="ConfirmQuit"> Wirklich beenden? <usetemplate ignoretext="Bestätigen, bevor Sitzung beendet wird" name="okcancelignore" notext="Nicht beenden" yestext="Beenden"/> @@ -2122,14 +2147,14 @@ Möchten Sie es mit dem ausgewählten Objekt ersetzen? <button ignore="Nie ersetzen" name="No" text="Abbrechen"/> </form> </notification> - <notification label="Beschäftigt-Modus-Warnung" name="BusyModePay"> - Sie sind im Beschäftigt-Modus, sodass Sie im Austausch für diese Zahlung keine Objekte erhalten können. + <notification label="Warnung für Nicht-stören-Modus" name="DoNotDisturbModePay"> + Sie haben den Nicht-stören-Modus aktiviert. Sie erhalten keine Artikel, die im Gegenzug für diese Zahlung angeboten werden. -Möchten Sie den Bechäftigt-Modus verlassen, bevor Sie diese Transaktion abschließen? +Möchten Sie den Nicht-stören-Modus deaktivieren, bevor Sie diese Transaktion abschließen? <form name="form"> - <ignore name="ignore" save_option="true" text="Ich bin im Begriff eine Person oder ein Objekt zu bezahlen, während ich im Modus Beschäftigt bin."/> - <button ignore="Beschäftigt-Modus immer deaktivieren" name="Yes" text="OK"/> - <button ignore="Beschäftigt-Modus aktiviert lassen" name="No" text="Abbrechen"/> + <ignore name="ignore" text="Ich bin im Begriff eine Person oder ein Objekt zu bezahlen, während ich im Nicht-stören-Modus bin."/> + <button ignore="„Nicht stören“-Modus immer verlassen" name="Yes" text="OK"/> + <button ignore="„Nicht stören“-Modus nie verlassen" name="No" text="Abbrechen"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2264,11 +2289,8 @@ Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dies <notification name="GroupNotice"> Betreff: [SUBJECT], Nachricht: [MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> ist online - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> ist offline + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> ist [STATUS] </notification> <notification name="AddSelfFriend"> Obwohl Sie ein sehr netter Mensch sind, können Sie sich nicht selbst als Freund hinzufügen. @@ -2496,13 +2518,6 @@ Fliegen ist hier nicht möglich. <notification name="DynamicPathfindingDisabled"> Dynamisches Pathfinding ist in dieser Region nicht aktiviert. Geskriptete Objekte, die Pathfinding-LSL-Aufrufe verwenden, funktionieren in dieser Region u. U. nicht wie erwartet. </notification> - <notification name="PathfindingRebakeNavmesh"> - Wenn Sie bestimmte Objekte in dieser Region ändern, verhalten sich andere bewegliche Objekte u. U. inkorrekt. Um dieses Problem zu beheben, klicken Sie auf die Schaltfläche „Region neu formen“. Um weitere Informationen zu erhalten, klicken Sie auf „Hilfe“. - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="Hilfe" ignoretext="Wenn Sie bestimmte Objekte in dieser Region ändern, verhalten sich andere bewegliche Objekte u. U. inkorrekt." name="okhelpignore" yestext="OK"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> Fehler aufgetreten. Möglicherweise ist ein Netzwerk- oder Serverproblem aufgetreten oder Sie haben nicht die erforderlichen Baurechte. Dieses Problem lässt sich manchmal durch Ab- und Anmelden lösen. <usetemplate name="okbutton" yestext="OK"/> @@ -2765,7 +2780,7 @@ Ist das OK? <notification name="ScriptQuestionCaution"> Achtung: Das Objekt „<nolink>[OBJECTNAME]</nolink>“ fordert uneingeschränkten Zugriff auf Ihr Linden-Dollar-Konto an. Wenn Sie Zugriff gewähren, kann dieses Objekt jederzeit und ohne weitere Warnung Ihr Konto belasten bzw. ganz leeren. -Eine solche Anforderung ist nur in seltenen Fällen legitim. Gewähren Sie dem Objekt nur dann Zugriff, wenn Sie genau verstehen, wieso ein solcher Zugriff auf Ihr Konto erforderlich ist. +Gewähren Sie dem Objekt nur dann Zugriff, wenn Sie genau verstehen, wieso ein solcher Zugriff auf Ihr Konto erforderlich ist. <form name="form"> <button name="Grant" text="Uneingeschränkten Zugriff gewähren"/> <button name="Deny" text="Verweigern"/> @@ -3346,4 +3361,633 @@ Versuch abgebrochen. Sie sind dabei, [NUM_ITEMS] Objekte zu löschen. Möchten Sie diesen Vorgang wirklich fortsetzen? <usetemplate ignoretext="Möchten Sie wirklich mehrere Objekte löschen?" name="okcancelignore" notext="Nein" yestext="Ja"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] hat Sie eingefroren. Sie können sich nicht bewegen oder mit der Welt interagieren. + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] hat Sie [AV_FREEZE_TIME] Sekunden lang eingefroren. Sie können sich nicht bewegen oder mit der Welt interagieren. + </notification> + <notification name="YouFrozeAvatar"> + Avatar eingefroren. + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] hat Sie aufgetaut. + </notification> + <notification name="AvatarUnFrozen"> + Avatar aufgetaut. + </notification> + <notification name="AvatarFreezeFailure"> + Einfrieren fehlgeschlagen, da Sie keine Berechtigung für diese Parzelle haben. + </notification> + <notification name="AvatarFreezeThaw"> + Sie sind nicht mehr eingefroren und können sich frei bewegen. + </notification> + <notification name="AvatarCantFreeze"> + Dieser Benutzer kann nicht eingefroren werden. + </notification> + <notification name="NowOwnObject"> + Sie sind jetzt Eigentümer des Objekts [OBJECT_NAME] + </notification> + <notification name="CantRezOnLand"> + Objekt kann nicht an [OBJECT_POS] gerezzt werden, da der Landeigentümer dies nicht zulässt. Machen Sie den Landeigentümer mit dem Landwerkzeug ausfindig. + </notification> + <notification name="RezFailTooManyRequests"> + Objekt kann nicht gerezzt werden, da zu viele Anforderungen vorliegen. + </notification> + <notification name="SitFailCantMove"> + Sie können sich nicht hinsetzen, da Sie zur Zeit unbeweglich sind. + </notification> + <notification name="SitFailNotAllowedOnLand"> + Sie können sich nicht hinsetzen, da Sie auf diesem Land keine Berechtigung dazu haben. + </notification> + <notification name="SitFailNotSameRegion"> + Kommen Sie näher heran. Sitzen auf Objekt nicht möglich, da +es sich nicht in der gleichen Region befindet wie Sie. + </notification> + <notification name="NoNewObjectRegionFull"> + Neues Objekt kann nicht erstellt werden. Die Region ist voll. + </notification> + <notification name="FailedToPlaceObject"> + Objekt konnte nicht an festgelegtem Ort platziert werden. Versuchen Sie es erneut. + </notification> + <notification name="NoOwnNoGardening"> + Auf Land, das Sie nicht besitzen, können Sie keine Bäume und Gräser erstellen. + </notification> + <notification name="NoCopyPermsNoObject"> + Kopieren fehlgeschlagen, da Sie keine Berechtigung zum Kopieren des Objekts „OBJ_NAME]“ besitzen. + </notification> + <notification name="NoTransPermsNoObject"> + Kopieren fehlgeschlagen, weil Objekt „[OBJ_NAME]“ nicht an Sie übertragen werden kann. + </notification> + <notification name="AddToNavMeshNoCopy"> + Kopieren fehlgeschlagen, weil Objekt „[OBJ_NAME]“ zum Navmesh beiträgt. + </notification> + <notification name="DupeWithNoRootsSelected"> + Ohne ausgewählte Hauptobjekte duplizieren. + </notification> + <notification name="CantDupeCuzRegionIsFull"> + Objekte können nicht dupliziert werden, da die Region voll ist. + </notification> + <notification name="CantDupeCuzParcelNotFound"> + Objekte können nicht dupliziert werden, da die Parzelle, in der sie sich befinden, nicht auffindbar ist. + </notification> + <notification name="CantCreateCuzParcelFull"> + Objekt kann nicht erstellt werden, da +die Parzelle voll ist. + </notification> + <notification name="RezAttemptFailed"> + Versuch zum Rezzen eines Objekts fehlgeschlagen. + </notification> + <notification name="ToxicInvRezAttemptFailed"> + Objekt, das in dieser Region zu Problemen geführt hat, kann nicht erstellt werden. + </notification> + <notification name="InvItemIsBlacklisted"> + Dieses Inventarobjekt ist auf der schwarzen Liste. + </notification> + <notification name="NoCanRezObjects"> + Sie können gegenwärtig keine Objekte erstellen. + </notification> + <notification name="LandSearchBlocked"> + Landsuche blockiert. +Sie haben zu viele Landsuchen in zu kurzer Zeit durchgeführt. +Warten Sie kurz und versuchen Sie es noch einmal. + </notification> + <notification name="NotEnoughResourcesToAttach"> + Nicht genügend Skriptressourcen verfügbar, um Objekt anzuhängen. + </notification> + <notification name="YouDiedAndGotTPHome"> + Sie sind gestorben und wurden nach Hause teleportiert + </notification> + <notification name="EjectComingSoon"> + Sie nicht hier nicht mehr zugelassen und haben [EJECT_TIME] Sekunden Zeit, um zu gehen. + </notification> + <notification name="NoEnterServerFull"> + Sie können diese Region nicht betreten, da +der Server voll ist. + </notification> + <notification name="SaveBackToInvDisabled"> + Erneutes Speichern im Inventar ist deaktiviert. + </notification> + <notification name="NoExistNoSaveToContents"> + „[OBJ_NAME]“ kann nicht im Objektinhalt gespeichert werden, da das Objekt, aus dem es gerezzt wurde, nicht mehr existiert. + </notification> + <notification name="NoModNoSaveToContents"> + „[OBJ_NAME]“ kann nicht in Objektinhalt gespeichert werden, da Sie nicht die Berechtigung zum Modifizieren des Objekts „[DEST_NAME]“ besitzen. + </notification> + <notification name="NoSaveBackToInvDisabled"> + „[OBJ_NAME]“ kann nicht erneut im Inventar gespeichert werden – dieser Vorgang wurde deaktiviert. + </notification> + <notification name="NoCopyNoSelCopy"> + Sie können Ihre Auswahl nicht kopieren, da Sie nicht die Berechtigung zum Kopieren des Objekts „[OBJ_NAME]“ haben. + </notification> + <notification name="NoTransNoSelCopy"> + Sie können Ihre Auswahl nicht kopieren, da das Objekt „[OBJ_NAME]“ nicht übertragbar ist. + </notification> + <notification name="NoTransNoCopy"> + Sie können Ihre Auswahl nicht kopieren, da das Objekt „[OBJ_NAME]“ nicht übertragbar ist. + </notification> + <notification name="NoPermsNoRemoval"> + Entfernen des Objekts „[OBJ_NAME]“ aus dem Simulator wird vom Berechtigungssystem nicht gestattet. + </notification> + <notification name="NoModNoSaveSelection"> + Sie können Ihre Auswahl nicht speichern, da Sie keine Berechtigung zum Modifizieren des Objekts „[OBJ_NAME]“ besitzen. + </notification> + <notification name="NoCopyNoSaveSelection"> + Ihre Auswahl kann nicht gespeichert werden, da das Objekt „[OBJ_NAME]“ nicht kopiert werden kann. + </notification> + <notification name="NoModNoTaking"> + Sie können Ihre Auswahl nicht in Empfang nehmen, da Sie nicht die Berechtigung zum Modifizieren des Objekts „[OBJ_NAME]“ haben. + </notification> + <notification name="RezDestInternalError"> + Interner Fehler: Unbekannter Zielttyp. + </notification> + <notification name="DeleteFailObjNotFound"> + Löschen fehlgeschlagen, da Objekt nicht gefunden wurde + </notification> + <notification name="SorryCantEjectUser"> + Dieser Benutzer kann nicht hinausgeworfen werden. + </notification> + <notification name="RegionSezNotAHome"> + Diese Region gestattet nicht, dass Sie hier Ihr Zuhause festlegen. + </notification> + <notification name="HomeLocationLimits"> + Ihr Zuhause kann sich nur auf Ihrem eigenen Land oder in einem Infohub auf dem Mainland befinden. + </notification> + <notification name="HomePositionSet"> + Position für Zuhause festgelegt. + </notification> + <notification name="AvatarEjected"> + Avatar hinausgeworfen. + </notification> + <notification name="AvatarEjectFailed"> + Hinauswerfen fehlgeschlagen, da Sie keine Admin-Berechtigung für diese Parzelle haben. + </notification> + <notification name="CantMoveObjectParcelFull"> + Objekt „[OBJECT_NAME]“ kann nicht nach +[OBJ_POSITION] in Region [REGION_NAME] verschoben werden, da die Parzelle voll ist. + </notification> + <notification name="CantMoveObjectParcelPerms"> + Objekt „[OBJECT_NAME]“ kann nicht nach +[OBJ_POSITION] in Region [REGION_NAME] verschoben werden, da Ihre Objekte auf dieser Parzelle nicht gestattet sind. + </notification> + <notification name="CantMoveObjectParcelResources"> + Objekt „[OBJECT_NAME]“ kann nicht nach +[OBJ_POSITION] in Region [REGION_NAME] verschoben werden, da nicht genügend Ressourcen für dieses Objekt auf dieser Parzelle vorhanden sind. + </notification> + <notification name="CantMoveObjectRegionVersion"> + Objekt „[OBJECT_NAME]“ kann nicht nach +[OBJ_POSITION] in Region [REGION_NAME] verschoben werden, da die andere Region eine ältere Version verwendet, die das Empfangen dieses Objekts per Regionswechsel nicht unterstützt. + </notification> + <notification name="CantMoveObjectNavMesh"> + Objekt „[OBJECT_NAME]“ kann nicht nach +[OBJ_POSITION] in Region [REGION_NAME] verschoben werden, da Sie das Navmesh nicht regionsübergreifend modifizieren können. + </notification> + <notification name="CantMoveObjectWTF"> + Objekt „[OBJECT_NAME]“ kann nicht nach +[OBJ_POSITION] in Region [REGION_NAME] verschoben werden, da ein unbekannter Fehler vorliegt. ([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + Ihnen fehlt die Berechtigung zum Modifizieren dieses Objekts. + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + Physik kann nicht für ein Objekt aktiviert werden, das zum Navmesh beiträgt. + </notification> + <notification name="CantEnablePhysKeyframedObj"> + Physik für Keyframe-Objekte kann nicht aktiviert werden. + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + Physik für Objekte kann nicht aktiviert werden – nicht genügend Landressourcen. + </notification> + <notification name="CantEnablePhysCostTooGreat"> + Physik für Objekt mit Physikressourcenkosten höher als [MAX_OBJECTS] kann nicht aktiviert werden. + </notification> + <notification name="PhantomWithConcavePiece"> + Dieses Objekt kann kein konkaves Teil enthalten, da es ein Phantom ist und zum Navmesh beiträgt. + </notification> + <notification name="UnableAddItem"> + Objekt konnte nicht hinzugefügt werden. + </notification> + <notification name="UnableEditItem"> + Kein Bearbeiten möglich. + </notification> + <notification name="NoPermToEdit"> + Bearbeiten nicht gestattet. + </notification> + <notification name="NoPermToCopyInventory"> + Kopieren dieses Inventars nicht gestattet. + </notification> + <notification name="CantSaveItemDoesntExist"> + Kein Speichern in Objektinhalt möglich: Objekt nicht mehr vorhanden. + </notification> + <notification name="CantSaveItemAlreadyExists"> + Kein Speichern in Objektinhalt möglich: Artikel mit diesem Namen ist bereits im Inventar vorhanden. + </notification> + <notification name="CantSaveModifyAttachment"> + Kein Speichern in Objektinhalt möglich: Dadurch würden die Anhängeberechtigungen geändert. + </notification> + <notification name="TooManyScripts"> + Zu viele Skripts. + </notification> + <notification name="UnableAddScript"> + Skript konnte nicht hinzugefügt werden. + </notification> + <notification name="AssetServerTimeoutObjReturn"> + Asset-Server hat nicht rechtzeitig reagiert. Objekt wurde zum Sim zurückübertragen. + </notification> + <notification name="RegionDisablePhysicsShapes"> + In dieser Region sind keine Physikformen aktiviert. + </notification> + <notification name="NoModNavmeshAcrossRegions"> + Sie können das Navmesh nicht regionsübergreifend modifizieren. + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + Für diesen Objekttyp können keine Physikeigenschaften gesetzt werden. + </notification> + <notification name="NoSetRootPrimWithNoShape"> + Hauptprim kann nicht auf formlos eingestellt werden. + </notification> + <notification name="NoRegionSupportPhysMats"> + In dieser Region sind keine Physikmaterialien aktiviert. + </notification> + <notification name="OnlyRootPrimPhysMats"> + Nur bei Hauptprims können die Physikmaterialien angepasst werden. + </notification> + <notification name="NoSupportCharacterPhysMats"> + Die Anwendung von Physikmaterialien auf Personen wird noch nicht unterstützt. + </notification> + <notification name="InvalidPhysMatProperty"> + Eine oder mehrere der angegebenen Eigenschaften für Physikmaterialien waren ungültig. + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + Sie können den Nahttyp eines Mesh-Objekts nicht ändern. + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + Sie können die Form eines Mesh-Objekts nicht ändern. + </notification> + <notification name="FullRegionCantEnter"> + Sie können diese Region nicht betreten, \nda die Region voll ist. + </notification> + <notification name="LinkFailedOwnersDiffer"> + Verknüpfungsfehler – Eigentümer sind unterschiedlich + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + Verknüpfungsfehler – Navmesh kann nicht regionsübergreifend modifiziert werden. + </notification> + <notification name="LinkFailedNoPermToEdit"> + Verknüpfungsfehler, da Sie keine Berechtigung zum Bearbeiten haben. + </notification> + <notification name="LinkFailedTooManyPrims"> + Verknüpfungsfehler – zu viele Primitive + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + Verknüpfungsfehler – nichtkopierfähige Objekte können nicht mit nichtübertragungsfähigen Objekten verknüpft werden + </notification> + <notification name="LinkFailedNothingLinkable"> + Verknüpfungsfehler – nichts zum Verknüpfen vorhanden. + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + Verknüpfungsfehler – zu viele Pathfinding-Figuren + </notification> + <notification name="LinkFailedInsufficientLand"> + Verknüpfungsfehler – nicht genügend Landressourcen + </notification> + <notification name="LinkFailedTooMuchPhysics"> + Objekt verwendet zu viele Physikressourcen – seine Dynamik wurde deaktiviert. + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + Sie wurden vom Objekt „[OBJECT_NAME]“ auf der Parzelle „[PARCEL_NAME]“ nach Hause teleportiert + </notification> + <notification name="TeleportedHomeByObject"> + Sie wurden von Objekt „[OBJECT_NAME]“ nach Hause teleportiert. + </notification> + <notification name="TeleportedByAttachment"> + Sie wurden von einem Anhang an [ITEM_ID] teleportiert + </notification> + <notification name="TeleportedByObjectOnParcel"> + Sie wurden von Objekt „[OBJECT_NAME]“ auf der Parzelle „[PARCEL_NAME]“ teleportiert + </notification> + <notification name="TeleportedByObjectOwnedBy"> + Sie wurden von Objekt „[OBJECT_NAME]“, das [OWNER_ID] gehört, teleportiert + </notification> + <notification name="TeleportedByObjectUnknownUser"> + Sie wurden von Objekt „[OBJECT_NAME]“, das einem unbekannten Benutzer gehört, teleportiert. + </notification> + <notification name="CantCreateObjectRegionFull"> + Angefordertes Objekt kann nicht erstellt werden. Die Region ist voll. + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + Sie können nicht mehrere Objekte an ein und derselben Stelle anhängen. + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + Sie können hier nicht mehrere Objekte erstellen. + </notification> + <notification name="UnableToCreateObjTimeOut"> + Angefordertes Objekt kann nicht erstellt werden. Objekt fehlt in Datenbank. + </notification> + <notification name="UnableToCreateObjUnknown"> + Angefordertes Objekt kann nicht erstellt werden. Zeitüberschreitung bei Anforderung. Versuchen Sie es erneut. + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + Angefordertes Objekt kann nicht erstellt werden. Versuchen Sie es erneut. + </notification> + <notification name="RezFailureTookTooLong"> + Fehler beim Rezzen; Laden des angeforderten Objekts hat zu lang gedauert. + </notification> + <notification name="FailedToPlaceObjAtLoc"> + Objekt konnte nicht an angegebenem Ort platziert werden. Versuchen Sie es erneut. + </notification> + <notification name="CantCreatePlantsOnLand"> + Auf diesem Land können keine Pflanzen erstellt werden. + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + Objekt kann nicht wiederhergestellt werden. Keine Weltposition gefunden. + </notification> + <notification name="CantRezObjectInvalidMeshData"> + Objekt kann nicht gerezzt werden, da seine Meshdaten ungültig sind. + </notification> + <notification name="CantRezObjectTooManyScripts"> + Objekt kann nicht gerezzt werden, da die Region bereits zu viele Skripts aufweist. + </notification> + <notification name="CantCreateObjectNoAccess"> + Ihr Zugangsberechtigungen gestatten nicht das Erstellen von Objekten an dieser Stelle. + </notification> + <notification name="CantCreateObject"> + Sie können gegenwärtig keine Objekte erstellen. + </notification> + <notification name="InvalidObjectParams"> + Ungültige Objektparameter + </notification> + <notification name="CantDuplicateObjectNoAcess"> + Ihre Zugangsberechtigungen gestatten nicht das Duplizieren von Objekten an dieser Stelle. + </notification> + <notification name="CantChangeShape"> + Sie können diese Form nicht ändern. + </notification> + <notification name="NoAccessToClaimObjects"> + Ihr Zugangsberechtigungen gestatten nicht das Beanspruchen von Objekten an dieser Stelle. + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + Ãœbertragung fehlgeschlagen, da Sie keine Berechtigung zum Ãœbertragen von Objekten für Ihre Gruppe haben. + </notification> + <notification name="NoPrivsToBuyObject"> + Ihr Zugangsberechtigungen gestatten nicht das Kaufen von Objekten an dieser Stelle. + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + Objekt kann nicht angehängt werden, da ein Avatar darauf sitzt. + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + Bäume und Gräser können nicht als Anhänge getragen werden. + </notification> + <notification name="CantAttachGroupOwnedObjs"> + Objekte im Gruppenbesitz können nicht angehängt werden. + </notification> + <notification name="CantAttachObjectsNotOwned"> + Objekte, die Ihnen nicht gehören, können nicht angehängt werden. + </notification> + <notification name="CantAttachNavmeshObjects"> + Objekte, die zum Navmesh beitragen, können nicht angehängt werden. + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + Objekt kann nicht angehängt werden, weil Sie es nicht verschieben dürfen. + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + Nicht genügend Skriptressourcen verfügbar, um Objekt anzuhängen. + </notification> + <notification name="CantDropItemTrialUser"> + Ablegen von Objekten hier nicht möglich; versuchen Sie es mit dem kostenlosen Testbereich. + </notification> + <notification name="CantDropMeshAttachment"> + Sie können keine Mesh-Anhänge ablegen. In Inventar zurückführen und inworld rezzen. + </notification> + <notification name="CantDropAttachmentNoPermission"> + Anhang konnte nicht abgelegt werden: Ihnen fehlt die Berechtigung zum Ablegen an dieser Stelle. + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + Anhang konnte nicht abgelegt werden: nicht genügend Landressourcen verfügbar. + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + Anhänge konnten nicht abgelegt werden: nicht genügend Ressourcen. + </notification> + <notification name="CantDropObjectFullParcel"> + Objekt kann nicht hier abgelegt werden. Die Parzelle ist voll. + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + Dieses Objekt kann nicht berührt/angefasst werden, da Sie von der Landparzelle verbannt sind. + </notification> + <notification name="PlzNarrowDeleteParams"> + Grenzen Sie Ihre Löschparameter ein. + </notification> + <notification name="UnableToUploadAsset"> + Asset kann nicht hochgeladen werden. + </notification> + <notification name="CantTeleportCouldNotFindUser"> + Keinen Benutzer zum Teleportieren nach Hause gefunden + </notification> + <notification name="GodlikeRequestFailed"> + Anforderdung nach übernatürlichen Kräften fehlgeschlagen + </notification> + <notification name="GenericRequestFailed"> + generische Anforderdung fehlgeschlagen + </notification> + <notification name="CantUploadPostcard"> + Postkarte kann nicht hochgeladen werden. Versuchen Sie es später erneut. + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + Inventardetails für Gruppenmitteilung kann nicht abgerufen werden. + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + Gruppenmitteilung kann nicht gesendet werden – Vorgang nicht gestattet. + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + Gruppenmitteilung kann nicht gesendet werden – Bauen von Inventar nicht möglich. + </notification> + <notification name="CantParceInventoryInNotice"> + Inventar in Mitteilung kann nicht geparst werden. + </notification> + <notification name="TerrainUploadFailed"> + Fehler beim Hochladen von Terrain. + </notification> + <notification name="TerrainFileWritten"> + Terraindatei geschrieben. + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + Terraindatei geschrieben, Download beginnt... + </notification> + <notification name="TerrainBaked"> + Terrain geformt. + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + Nur die ersten 10 ausgewählten Objekte wurden deaktiviert. Aktualisieren Sie die Anzeige und wählen Sie ggf. weitere Objekte aus. + </notification> + <notification name="UpdateViewerBuyParcel"> + Um diese Parzelle zu kaufen, müssen Sie Ihren Viewer aktualisieren. + </notification> + <notification name="CantBuyParcelNotForSale"> + Kein Kauf möglich; die ausgewählte Parzelle steht nicht zum Verkauf. + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + Kein Kauf möglich, da sich der Verkaufspreis oder die Fläche geändert haben. + </notification> + <notification name="CantBuyParcelNotAuthorized"> + Sie sind nicht der autorisierte Käufer dieser Parzelle. + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + Sie können diese Parzelle nicht kaufen, da sie bereits auf Kaufauthorisierung wartet. + </notification> + <notification name="CantBuildOverflowParcel"> + Sie können hier keine Objekte bauen, denn dies würde den Rahmen der Parzelle sprengen. + </notification> + <notification name="SelectedMultipleOwnedLand"> + Sie haben Land mit unterschiedlichen Besitzern ausgewählt. Wählen Sie ein kleineres Gebiet aus und versuchen Sie es erneut. + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + Auswahl enthält nicht genügend gemietete Parzellen zum Zusammenlegen. + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + Land kann nicht geteilt werden.\nMehr als eine Parzelle ist ausgewählt.\nWählen Sie ein kleineres Stück Land aus. + </notification> + <notification name="CantDivideLandCantFindParcel"> + Land kann nicht geteilt werden.\nParzelle nicht auffindbar.\nMelden Sie das Problem über „Hilfe“ -> „Fehler melden“... + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + Land kann nicht geteilt werden. Die gesamte Parzelle ist ausgewählt.\nWählen Sie ein kleineres Stück Land aus. + </notification> + <notification name="LandHasBeenDivided"> + Land wurde geteilt. + </notification> + <notification name="PassPurchased"> + Sie haben einen Pass gekauft. + </notification> + <notification name="RegionDisallowsClassifieds"> + Region lässt keine Werbung zu. + </notification> + <notification name="LandPassExpireSoon"> + Ihr Pass für dieses Land läuft demnächst ab. + </notification> + <notification name="CantSitNoSuitableSurface"> + Keine geeignete Oberfläche zum Sitzen; probieren Sie es an einer anderen Stelle. + </notification> + <notification name="CantSitNoRoom"> + Kein Platz zum Hinsetzen; probieren Sie es an einer anderen Stelle. + </notification> + <notification name="ClaimObjectFailedNoPermission"> + Objektbeanspruchung fehlgeschlagen, da Sie keine Berechtigung haben. + </notification> + <notification name="ClaimObjectFailedNoMoney"> + Objektbeanspruchung fehlgeschlagen, da Sie nicht genügend L$ haben. + </notification> + <notification name="CantDeedGroupLand"> + Land in Gruppenbesitz kann nicht übertragen werden. + </notification> + <notification name="BuyObjectFailedNoMoney"> + Objektkauf fehlgeschlagen, da Sie nicht genügend L$ haben. + </notification> + <notification name="BuyInventoryFailedNoMoney"> + Inventarkauf fehlgeschlagen, da Sie nicht genügend L$ haben. + </notification> + <notification name="BuyPassFailedNoMoney"> + Sie haben nicht genügend L$, um einen Pass für dieses Land zu kaufen. + </notification> + <notification name="CantBuyPassTryAgain"> + Passkauf momentan nicht möglich. Versuchen Sie es später erneut. + </notification> + <notification name="CantCreateObjectParcelFull"> + Objekt kann nicht erstellt werden, \nda die Parzelle voll ist. + </notification> + <notification name="FailedPlacingObject"> + Objekt konnte nicht an festgelegtem Ort platziert werden. Versuchen Sie es erneut. + </notification> + <notification name="CantCreateLandmarkForEvent"> + Landmarke für dieses Ereignis kann nicht erstellt werden. + </notification> + <notification name="GodBeatsFreeze"> + Ihre übernatürlichen Kräfte heben das Einfrieren auf! + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + Anforderung nach Superpower fehlgeschlagen. Diese Anforderung wurde protokolliert. + </notification> + <notification name="ExpireExplanation"> + Das System kann Ihre Anfrage momentan nicht verarbeiten. Zeitüberschreitung bei Anforderung. + </notification> + <notification name="DieExplanation"> + Das System kann Ihre Anfrage nicht verarbeiten. + </notification> + <notification name="AddPrimitiveFailure"> + Sie haben nicht genügend Geld, um Primitive zu erstellen. + </notification> + <notification name="RezObjectFailure"> + Sie haben nicht genügend Geld, um Objekt zu erstellen. + </notification> + <notification name="ResetHomePositionNotLegal"> + Zuhause-Position neu festlegen, da Zuhause nicht zulässig war. + </notification> + <notification name="CantInviteRegionFull"> + Sie können gegenwärtig niemanden an Ihren Standort einladen, da die Region voll ist. Versuchen Sie es später erneut. + </notification> + <notification name="CantSetHomeAtRegion"> + Diese Region gestattet nicht, dass Sie hier Ihr Zuhause festlegen. + </notification> + <notification name="ListValidHomeLocations"> + Ihr Zuhause kann sich nur auf Ihrem eigenen Land oder in einem Infohub auf dem Mainland befinden. + </notification> + <notification name="SetHomePosition"> + Position für Zuhause festgelegt. + </notification> + <notification name="CantDerezInventoryError"> + Aufgrund eines Inventarfehlers kann das Rezzen dieses Objekts nicht aufgehoben werden. + </notification> + <notification name="CantCreateRequestedInv"> + Angefordertes Inventar kann nicht erstellt werden. + </notification> + <notification name="CantCreateRequestedInvFolder"> + Angeforderter Inventarordner kann nicht erstellt werden. + </notification> + <notification name="CantCreateInventory"> + Dieses Inventar kann nicht erstellt werden. + </notification> + <notification name="CantCreateLandmark"> + Landmarke kann nicht erstellt werden. + </notification> + <notification name="CantCreateOutfit"> + Im Moment kann kein Outfit erstellt werden. Versuchen Sie es gleich noch einmal. + </notification> + <notification name="InventoryNotForSale"> + Inventar steht nicht zum Verkauf. + </notification> + <notification name="CantFindInvItem"> + Inventarobjekt kann nicht gefunden werden. + </notification> + <notification name="CantFindObject"> + Objekt kann nicht gefunden werden. + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + Geldüberweisungen an Objekte sind in dieser Region gegenwärtig deaktiviert. + </notification> + <notification name="CantPayNoAgent"> + Nicht ersichtlich, wer bezahlt werden muss. + </notification> + <notification name="CantDonateToPublicObjects"> + Sie können öffentlichen Objekten keine L$ geben. + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + Inventarerstellung für Inworld-Objekt fehlgeschlagen. + </notification> + <notification name="UserBalanceOrLandUsageError"> + Aufgrund eines internen Fehlers konnte Ihr Viewer nicht ordnungsgemäß aktualisiert werden. Der in Ihrem Viewer angezeigte L$-Kontostand oder Parzellenbesitz stimmt möglicherweise nicht mit dem aktuellen Stand auf den Servern überein. + </notification> + <notification name="LargePrimAgentIntersect"> + Große Prims, die sich mit anderen Spielern überschneiden, können nicht erstellt werden. Bitte erneut versuchen, wenn sich die anderen Spieler bewegt haben. + </notification> + <notification name="PreferenceChatClearLog"> + Dadurch werden die Protokolle vorheriger Unterhaltungen und alle Backups dieser Datei gelöscht. + <usetemplate ignoretext="Löschen des Protokolls vorheriger Unterhaltungen bestätigen." name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + Dadurch werden die Transkripte aller vorherigen Unterhaltungen gelöscht. Die Liste vergangener Unterhaltungen ist davon nicht betroffen. Alle Dateien mit den Suffixen .txt und txt.backup im Order [FOLDER] werden gelöscht. + <usetemplate ignoretext="Um Bestätigung bitten, bevor ich Transkripte lösche." name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="PreferenceChatPathChanged"> + Dateien können nicht verschoben werden. Vorheriger Pfad wurde wiederhergestellt. + <usetemplate ignoretext="Dateien können nicht verschoben werden. Vorheriger Pfad wurde wiederhergestellt." name="okignore" yestext="OK"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/de/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/de/panel_avatar_list_item.xml index dcfcffa6e2..79a2ebe9df 100644 --- a/indra/newview/skins/default/xui/de/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/de/panel_avatar_list_item.xml @@ -27,5 +27,6 @@ <icon name="permission_edit_mine_icon" tool_tip="Dieser Freund kann Ihre Objekte bearbeiten, löschen und an sich nehmen"/> <icon name="permission_map_icon" tool_tip="Dieser Freund kann Sie auf der Karte finden"/> <icon name="permission_online_icon" tool_tip="Dieser Freund kann sehen, wenn Sie online sind"/> + <button name="info_btn" tool_tip="Mehr Infos"/> <button name="profile_btn" tool_tip="Profil anzeigen"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml index 2d140515d4..c105a5b8a3 100644 --- a/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel" width="300"> - <text left_pad="5" name="title_text" width="260"> - Liste der ignorierten Einwohner - </text> - <scroll_list name="blocked" tool_tip="Liste der zur Zeit ignorierten Einwohner" width="290"/> - <button label="Einwohner ignorieren" label_selected="Einwohner ignorieren..." name="Block resident..." tool_tip="Wählen Sie einen Einwohner, um ihn zu ignorieren"/> - <button label="Objekt nach Name ignorieren" label_selected="Objekt nach Name ignorieren..." name="Block object by name..." tool_tip="Ein Objekt auswählen, um nach Namen zu ignorieren."/> - <button label="Freischalten" label_selected="Freischalten" name="Unblock" tool_tip="Einwohner oder Objekt von der Liste der ignorierten Einwohner oder Objekte entfernen"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="Filtern" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="Aktionen für ausgewählte(s) Person/Objekt"/> + <menu_button name="view_btn" tool_tip="Sortieroptionen"/> + <menu_button name="plus_btn" tool_tip="Einwohner oder Objekt zum ignorieren auswählen"/> + <button name="unblock_btn" tool_tip="Einwohner oder Objekt aus der Liste der ignorierten Einwohner oder Objekte entfernen"/> + </panel> + <block_list name="blocked" tool_tip="Liste der zur Zeit ignorierten Einwohner" width="290"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/de/panel_conversation_list_item.xml new file mode 100644 index 0000000000..a9bfe4754e --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(laden)"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/de/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..afeaa14e81 --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="Enthielt eine Voice-Unterhaltung"/> + <icon name="unread_ims_icon" tool_tip="Nachrichten trafen ein, während Sie abgemeldet waren"/> + <button name="delete_btn" tool_tip="Diesen Eintrag entfernen"/> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_group_list_item.xml b/indra/newview/skins/default/xui/de/panel_group_list_item.xml index d097a2b18c..fc911a64df 100644 --- a/indra/newview/skins/default/xui/de/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/de/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="Unbekannt"/> + <button name="info_btn" tool_tip="Mehr Infos"/> <button name="profile_btn" tool_tip="Profil anzeigen"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_people.xml b/indra/newview/skins/default/xui/de/panel_people.xml index 4e76147746..8c05ca2c24 100644 --- a/indra/newview/skins/default/xui/de/panel_people.xml +++ b/indra/newview/skins/default/xui/de/panel_people.xml @@ -14,81 +14,53 @@ Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte]. <string name="no_filtered_friends_msg"> Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/people/[SEARCH_TERM] Suche]. </string> - <string name="people_filter_label" value="Nach Leuten filtern"/> - <string name="groups_filter_label" value="Nach Gruppen filtern"/> <string name="no_filtered_groups_msg" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/groups/[SEARCH_TERM] Suche]."/> <string name="no_groups_msg" value="Suchen Sie nach Gruppen? Versuchen Sie es mit der [secondlife:///app/search/groups Suche]."/> <string name="MiniMapToolTipMsg" value="[REGION](Doppelklicken, um Karte zu öffnen; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/> <string name="AltMiniMapToolTipMsg" value="[REGION](Doppelklicken, um zu teleportieren; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/> - <filter_editor label="Filter" name="filter_input"/> <tab_container name="tabs"> <panel label="IN DER NÄHE" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="Optionen"/> - <button name="add_friend_btn" tool_tip="Ausgewählten Einwohner zur Freundeliste hinzufügen"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="Nach Personen filtern" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="Aktionen für ausgewählte Person"/> + <menu_button name="nearby_view_btn" tool_tip="Anzeige-/Sortieroptionen"/> + <button name="add_friend_btn" tool_tip="Einem Einwohner die Freundschaft anbieten"/> + <dnd_button name="nearby_del_btn" tool_tip="Ausgewählte Person als Freund entfernen"/> </panel> </panel> - <panel label="MEINE FREUNDE" name="friends_panel"> + <panel label="FREUNDE" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="Nach Personen filtern" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="Aktionen für ausgewählte Person"/> + <menu_button name="friends_view_btn" tool_tip="Anzeige-/Sortieroptionen"/> + <button name="friends_add_btn" tool_tip="Einem Einwohner die Freundschaft anbieten"/> + <dnd_button name="friends_del_btn" tool_tip="Ausgewählte Person als Freund entfernen"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="Online"/> <accordion_tab name="tab_all" title="Alle"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="Zusätzliche Optionen anzeigen"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="Bieten Sie einem Einwohner die Freundschaft an"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="Ausgewählte Person aus Ihrer Freundesliste entfernen"/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="MEINE GRUPPEN" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="Optionen"/> - <button name="plus_btn" tool_tip="Gruppe beitreten/Neue Gruppe erstellen"/> - <button name="activate_btn" tool_tip="Ausgewählte Gruppe aktivieren"/> + <panel label="GRUPPEN" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="Nach Gruppen filtern" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="Aktionen für ausgewählte Gruppe"/> + <menu_button name="groups_view_btn" tool_tip="Anzeige-/Sortieroptionen"/> + <menu_button name="plus_btn" tool_tip="Gruppe beitreten/Neue Gruppe erstellen"/> + <dnd_button name="minus_btn" tool_tip="Ausgewählte Gruppe verlassen"/> </panel> </panel> <panel label="AKTUELL" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="Optionen"/> - <button name="add_friend_btn" tool_tip="Ausgewählten Einwohner zur Freundeliste hinzufügen"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="Nach Personen filtern" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="Aktionen für ausgewählte Person"/> + <menu_button name="recent_view_btn" tool_tip="Anzeige-/Sortieroptionen"/> + <button name="add_friend_btn" tool_tip="Einem Einwohner die Freundschaft anbieten"/> + <dnd_button name="recent_del_btn" tool_tip="Ausgewählte Person als Freund entfernen"/> </panel> </panel> + <panel label="IGNORIERT" name="blocked_panel"> + <panel label="Ignorierte Einwohner und Objekte" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="Profil" name="view_profile_btn" tool_tip="Bilder, Gruppen und andere Einwohner-Informationen anzeigen"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="IM" name="im_btn" tool_tip="IM-Sitzung öffnen"/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="Anrufen" name="call_btn" tool_tip="Diesen Einwohner anrufen"/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="Freigeben" name="share_btn" tool_tip="Inventarobjekt freigeben"/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="Teleportieren" name="teleport_btn" tool_tip="Teleport anbieten"/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="Gruppenprofil" name="group_info_btn" tool_tip="Gruppeninformationen anzeigen"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="Gruppen-Chat" name="chat_btn" tool_tip="Chat öffnen"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="Gruppe anrufen" name="group_call_btn" tool_tip="Diese Gruppe anrufen"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml index c9ae350147..8193fd42c1 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Text-Chat" name="chat"> - <text name="font_size"> - Schriftgröße: - </text> - <radio_group name="chat_font_size"> - <radio_item label="Klein" name="radio" value="0"/> - <radio_item label="Mittel" name="radio2" value="1"/> - <radio_item label="Groß" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="true" label="Beim Chatten Tippanimation abspielen" name="play_typing_animation"/> - <check_box label="IMs per Email zuschicken, wenn ich offline bin" name="send_im_to_email"/> - <check_box label="Kompakten IM- und Text-Chatverlauf aktivieren" name="plain_text_chat_history"/> - <check_box label="Blasen-Chat" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - IMs anzeigen in: - </text> - <text name="requires_restart_label"> - (Neustart erforderlich) - </text> - <radio_group name="chat_window" tool_tip="Zeigen Sie Ihre Sofortnachrichten (Instant Messages) in einem anderen Fenster oder in einem einzigen Fenster mit vielen Registerkarten an (Neustart erforderlich)."> - <radio_item label="Getrennte Fenster" name="radio" value="0"/> - <radio_item label="Registerkarten" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - Popups für eingehende Chats aktivieren: - </text> - <check_box label="Gruppen-Chats" name="EnableGroupChatPopups" tool_tip="Markieren, um Popups zu sehen, wenn Gruppen-Chat-Message eintrifft"/> - <check_box label="IM-Chats" name="EnableIMChatPopups" tool_tip="Markieren, um Popups zu sehen, wenn Instant Message eintrifft"/> - <spinner label="Lebenszeit von Toasts für Chat in der Nähe:" name="nearby_toasts_lifetime"/> - <spinner label="Ein-/Ausblenddauer von Toasts für Chat in der Nähe:" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="true" label="Beim Chatten Tippanimation abspielen" name="play_typing_animation"/> + <check_box label="IMs per Email zuschicken, wenn ich offline bin" name="send_im_to_email"/> + <check_box label="Nur IMs und Anrufe von Freunden oder Gruppen durchstellen" name="voice_call_friends_only_check"/> + <text name="font_size"> + Schriftgröße: + </text> + <combo_box name="chat_font_size"> + <item label="Klein" name="Small" value="0"/> + <item label="Mittel" name="Medium" value="1"/> + <item label="Groß" name="Large" value="2"/> + </combo_box> + <check_box label="Blasen-Chat" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + Benachrichtigungen + </text> + <text name="friend_ims"> + IMs von Freunden: + </text> + <combo_box name="FriendIMOptions"> + <item label="Unterhaltungsfenster öffnen" name="OpenConversationsWindow" value="openconversations"/> + <item label="Nachricht in Popup anzeigen" name="PopUpMessage" value="toast"/> + <item label="Flash-Symbolleistenschaltfläche" name="FlashToolbarButton" value="flash"/> + <item label="None" name="None" value="none"/> + </combo_box> + <text name="non_friend_ims"> + IMs von anderen: + </text> + <combo_box name="NonFriendIMOptions"> + <item label="Unterhaltungsfenster öffnen" name="OpenConversationsWindow" value="openconversations"/> + <item label="Nachricht in Popup anzeigen" name="PopUpMessage" value="toast"/> + <item label="Flash-Symbolleistenschaltfläche" name="FlashToolbarButton" value="flash"/> + <item label="None" name="None" value="none"/> + </combo_box> + <text name="conference_ims"> + Konferenz-IMs: + </text> + <combo_box name="ConferenceIMOptions"> + <item label="Unterhaltungsfenster öffnen" name="OpenConversationsWindow" value="openconversations"/> + <item label="Nachricht in Popup anzeigen" name="PopUpMessage" value="toast"/> + <item label="Flash-Symbolleistenschaltfläche" name="FlashToolbarButton" value="flash"/> + <item label="None" name="None" value="none"/> + </combo_box> + <text name="group_chat"> + Gruppen-Chat: + </text> + <combo_box name="GroupChatOptions"> + <item label="Unterhaltungsfenster öffnen" name="OpenConversationsWindow" value="openconversations"/> + <item label="Nachricht in Popup anzeigen" name="PopUpMessage" value="toast"/> + <item label="Flash-Symbolleistenschaltfläche" name="FlashToolbarButton" value="flash"/> + <item label="None" name="None" value="none"/> + </combo_box> + <text name="nearby_chat"> + Chat in der Nähe: + </text> + <combo_box name="NearbyChatOptions"> + <item label="Unterhaltungsfenster öffnen" name="OpenConversationsWindow" value="openconversations"/> + <item label="Nachricht in Popup anzeigen" name="PopUpMessage" value="toast"/> + <item label="Flash-Symbolleistenschaltfläche" name="FlashToolBarButton" value="flash"/> + <item label="None" name="None" value="none"/> + </combo_box> + <text name="notifications_alert"> + Um vorübergehend alle Benachrichtigungen zu stoppen, wählen Sie „Unterhalten“ > „Nicht stören“. + </text> + </panel> + <panel> + <text name="play_sound"> + Sound abspielen: + </text> + <check_box label="Neue Unterhaltung" name="new_conversation"/> + <check_box label="Eingehender Anruf..." name="incoming_voice_call"/> + <check_box label="Teleport-Angebot" name="teleport_offer"/> + <check_box label="Inventarangebot" name="inventory_offer"/> + </panel> + <panel> + <button label="Protokoll löschen..." name="clear_log"/> + <button label="Protokolle löschen..." name="delete_transcripts"/> + <button label="Durchsuchen..." label_selected="Durchsuchen" name="log_path_button"/> + </panel> <button label="Ãœbersetzen..." name="ok_btn"/> <button label="Automatisch ersetzen..." name="autoreplace_showgui"/> <button label="Rechtschreibprüfung..." name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_general.xml b/indra/newview/skins/default/xui/de/panel_preferences_general.xml index 979ccba48d..4e453b6969 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_general.xml @@ -69,9 +69,9 @@ <combo_box.item label="nie" name="item4"/> </combo_box> <text name="text_box3"> - Antwort, wenn im „Beschäftigt“-Modus: + Nicht-stören-Antwort: </text> - <text_editor name="busy_response"> + <text_editor name="do_not_disturb_response"> log_in_to_change </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml index 4c8d77d336..29239033fe 100644 --- a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="Objekt kaufen" name="Buyobject"/> <combo_box.item label="Objekt bezahlen" name="Payobject"/> <combo_box.item label="Öffnen" name="Open"/> + <combo_box.item label="Zoomen" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index 79cb73ecf9..e142cb8029 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -137,7 +137,7 @@ Beenden </string> <string name="create_account_url"> - http://join.secondlife.com/index.php?lang=de-DE&sourceid=[sourceid] + http://join.secondlife.com/?sourceid=[sourceid] </string> <string name="LoginFailedViewerNotPermitted"> Mit dem von Ihnen verwendeten Viewer ist der Zugriff auf Second Life nicht mehr möglich. Laden Sie von den folgenden Seite einen neuen Viewer herunter: @@ -622,8 +622,8 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. <string name="AvatarAway"> Abwesend </string> - <string name="AvatarBusy"> - Beschäftigt + <string name="AvatarDoNotDisturb"> + Nicht stören </string> <string name="AvatarMuted"> Ignoriert @@ -859,6 +859,12 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. <string name="ST_NO_JOINT"> HAUPTVERZEICHNIS oder VERBINDUNG nicht gefunden. </string> + <string name="NearbyChatTitle"> + Chat in der Nähe + </string> + <string name="NearbyChatLabel"> + (Chat in der Nähe) + </string> <string name="whisper"> flüstert: </string> @@ -922,12 +928,15 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. <string name="ControlYourCamera"> Kamerasteuerung </string> - <string name="TeleportYourAgent"> - Sie teleportieren - </string> <string name="NotConnected"> Nicht verbunden </string> + <string name="AgentNameSubst"> + (Sie) + </string> + <string name="TeleportYourAgent"> + Sie teleportieren + </string> <string name="SIM_ACCESS_PG"> Generell </string> @@ -1009,18 +1018,6 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. <string name="dictionary_files"> Wörterbücher </string> - <string name="AvatarSetNotAway"> - Nicht abwesend - </string> - <string name="AvatarSetAway"> - Abwesend - </string> - <string name="AvatarSetNotBusy"> - Nicht beschäftigt - </string> - <string name="AvatarSetBusy"> - Beschäftigt - </string> <string name="shape"> Form </string> @@ -1989,8 +1986,8 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. <string name="PanelContentsNewScript"> Neues Skript </string> - <string name="BusyModeResponseDefault"> - Der Einwohner/Die Einwohnerin ist „beschäftigtâ€, d.h. er/sie möchte im Moment nicht gestört werden. Ihre Nachricht wird dem Einwohner/der Einwohnerin als IM angezeigt, und kann später beantwortet werden. + <string name="DoNotDisturbModeResponseDefault"> + Dieser Einwohner hat den Nicht-stören-Modus aktiviert und wird Ihre Nachricht später sehen. </string> <string name="MuteByName"> (Nach Namen) @@ -2103,9 +2100,6 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. <string name="GroupMoneyDate"> [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] </string> - <string name="ViewerObjectContents"> - Inhalte - </string> <string name="AcquiredItems"> Erworbene Artikel </string> @@ -3877,7 +3871,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ Generelle Region </string> <string name="LocationCtrlSeeAVsTooltip"> - Avatare sichtbar; Chat außerhalb dieser Parzelle gestattet + Avatare in dieser Parzelle können von Avataren außerhalb dieser Parzelle weder gesehen noch gehört werden </string> <string name="LocationCtrlPathfindingDirtyTooltip"> Bewegliche Objekte verhalten sich in dieser Region u. U. erst dann korrekt, wenn die Region neu geformt wird. @@ -3954,6 +3948,12 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ <string name="IM_unblock_only_groups_friends"> Wenn Sie diese Meldung sehen, müssen Sie unter „Einstellungen“ > „Privatsphäre“ die Option „Nur IMs und Anrufe von Freunden oder Gruppen durchstellen“ deaktivieren. </string> + <string name="OnlineStatus"> + Online + </string> + <string name="OfflineStatus"> + Offline + </string> <string name="answered_call"> Ihr Anruf wurde entgegengenommen </string> @@ -3963,6 +3963,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ <string name="you_joined_call"> Sie sind dem Gespräch beigetreten </string> + <string name="you_auto_rejected_call-im"> + Sie haben den Voice-Anruf automatisch abgelehnt, während der Nicht-stören-Modus aktiviert war. + </string> <string name="name_started_call"> [NAME] hat einen Voice-Anruf begonnen </string> @@ -3979,7 +3982,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ Wird verbunden... </string> <string name="conference-title"> - Ad-hoc-Konferenz + Chat mit mehreren Personen </string> <string name="conference-title-incoming"> Konferenz mit [AGENT_NAME] @@ -4859,6 +4862,9 @@ Setzen Sie den Editorpfad in Anführungszeichen <string name="Command_Chat_Label"> Chat </string> + <string name="Command_Conversations_Label"> + Unterhaltungen + </string> <string name="Command_Compass_Label"> Kompass </string> @@ -4934,6 +4940,9 @@ Setzen Sie den Editorpfad in Anführungszeichen <string name="Command_Chat_Tooltip"> Mit Leuten in der Nähe chatten </string> + <string name="Command_Conversations_Tooltip"> + Mit allen unterhalten + </string> <string name="Command_Compass_Tooltip"> Kompass </string> @@ -5063,4 +5072,13 @@ Setzen Sie den Editorpfad in Anführungszeichen <string name="UserDictionary"> [Benutzer] </string> + <string name="logging_calls_disabled_log_empty"> + Unterhaltungen werden nicht protokolliert. Um ein Protokoll zu starten, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ > „Chat“. + </string> + <string name="logging_calls_disabled_log_not_empty"> + Es werden keine Unterhaltungen mehr protokolliert. Um weiterhin ein Protokoll zu führen, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ > „Chat“. + </string> + <string name="logging_calls_enabled_log_empty"> + Keine protokollierten Unterhaltungen verfügbar. Hier erscheint ein Protokolleintrag, wenn Sie eine Person kontaktieren oder von einer Person kontaktiert werden. + </string> </strings> diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index 3b56e974d2..2152a9f6e9 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -70,23 +70,26 @@ top="0" left="0" right="-1" - bottom="-1"> + bottom="-3"> <layout_stack animate="false" default_tab_group="2" follows="all" right="-5" bottom="-1" + top="0" + left="5" + border_size="0" layout="topleft" orientation="vertical" name="main_stack" - tab_group="1" - top="0" - left="5"> + tab_group="1"> <layout_panel auto_resize="false" name="toolbar_panel" - height="35"> + height="35" + right="-1" + left="1"> <menu_button menu_filename="menu_im_session_showmodes.xml" follows="top|left" @@ -164,7 +167,7 @@ image_unselected="Toolbar_Middle_Off" layout="topleft" top="5" - right="-70" + right="-67" name="close_btn" tool_tip="End this conversation" width="31" /> @@ -196,7 +199,8 @@ </layout_panel> <layout_panel name="body_panel" - height="235"> + top="1" + bottom="-1"> <layout_stack default_tab_group="2" follows="all" @@ -213,12 +217,14 @@ min_dim="0" width="150" user_resize="true" - auto_resize="false" /> + auto_resize="false" + bottom="-1" /> <layout_panel default_tab_group="3" tab_group="2" name="right_part_holder" - min_width="221"> + min_width="221" + bottom="-1"> <layout_stack animate="true" default_tab_group="2" @@ -262,21 +268,28 @@ </layout_stack> </layout_panel> <layout_panel - height="35" + top_delta="0" + top="0" + height="26" + bottom="-1" auto_resize="false" name="chat_layout_panel"> <layout_stack animate="false" default_tab_group="2" follows="all" - right="-1" orientation="horizontal" name="input_panels" top="0" - bottom="-1" - left="0"> + bottom="-2" + left="0" + right="-1"> <layout_panel - name="input_editor_layout_panel"> + name="input_editor_layout_panel" + auto_resize="true" + user_resize="false" + top="0" + bottom="-1"> <chat_editor layout="topleft" expand_lines_count="5" @@ -289,27 +302,32 @@ max_length="1023" spellcheck="true" tab_group="3" - bottom="-8" - left="5" - right="-5" + top="1" + bottom="-2" + left="4" + right="-4" wrap="true" /> </layout_panel> <layout_panel auto_resize="false" + user_resize="false" name="input_button_layout_panel" - width="32"> + width="30" + top="0" + bottom="-1"> <button + layout="topleft" left="1" - top="4" + right="-1" + top="1" + height="22" follows="left|right|top" - height="25" image_hover_unselected="Toolbar_Middle_Over" image_overlay="Conv_expand_one_line" image_selected="Toolbar_Middle_Selected" image_unselected="Toolbar_Middle_Off" name="minz_btn" - tool_tip="Shows/hides message panel" - width="28" /> + tool_tip="Shows/hides message panel" /> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 3b501e1ece..8b9733df17 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -2,7 +2,7 @@ <floater positioning="cascading" legacy_header_height="18" - height="615" + height="590" layout="topleft" bg_opaque_image="Window_NoTitle_Foreground" bg_alpha_image="Window_NoTitle_Background" @@ -830,7 +830,7 @@ width="282"/> <tab_container follows="left|top" - height="435" + height="410" halign="center" left="0" name="Object Info Tabs" @@ -1353,7 +1353,7 @@ even though the user gets a free copy. <panel border="false" follows="all" - height="592" + height="567" label="Object" layout="topleft" left_delta="0" @@ -2110,7 +2110,7 @@ even though the user gets a free copy. <panel border="false" follows="all" - height="392" + height="367" label="Features" layout="topleft" left_delta="0" @@ -2530,7 +2530,7 @@ even though the user gets a free copy. border_visible="true" bevel_style="in" follows="left|top|right" - height="350" + height="325" layout="topleft" left="10" name="contents_inventory" @@ -2540,7 +2540,7 @@ even though the user gets a free copy. </tab_container> <panel follows="left|top" - height="409" + height="384" layout="topleft" left_delta="0" name="land info panel" diff --git a/indra/newview/skins/default/xui/en/menu_attachment_other.xml b/indra/newview/skins/default/xui/en/menu_attachment_other.xml index b46b62ec4d..46ba4bd29d 100644 --- a/indra/newview/skins/default/xui/en/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_other.xml @@ -79,6 +79,14 @@ <menu_item_call.on_visible function="IsGodCustomerService"/> </menu_item_call> + <menu_item_call + label="Dump XML" + name="Dump XML"> + <menu_item_call.on_click + function="Advanced.AppearanceToXML" /> + <menu_item_call.on_visible + function="Advanced.EnableAppearanceToXML"/> + </menu_item_call> <menu_item_call label="Zoom In" name="Zoom In"> diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml index b8128da358..28e032ce5f 100644 --- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml @@ -123,6 +123,14 @@ name="Edit Outfit"> <menu_item_call.on_visible function="IsGodCustomerService"/> </menu_item_call> + <menu_item_call + label="Dump XML" + name="Dump XML"> + <menu_item_call.on_click + function="Advanced.AppearanceToXML" /> + <menu_item_call.on_visible + function="Advanced.EnableAppearanceToXML"/> + </menu_item_call> <menu_item_separator layout="topleft" /> <menu_item_call diff --git a/indra/newview/skins/default/xui/en/menu_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml index 276b5f106f..e7c2b80da2 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml @@ -79,6 +79,14 @@ <menu_item_call.on_visible function="IsGodCustomerService"/> </menu_item_call> + <menu_item_call + label="Dump XML" + name="Dump XML"> + <menu_item_call.on_click + function="Advanced.AppearanceToXML" /> + <menu_item_call.on_visible + function="Advanced.EnableAppearanceToXML"/> + </menu_item_call> <menu_item_call label="Zoom In" name="Zoom In"> diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml index d9bdfece38..c1ff026a74 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml @@ -261,4 +261,12 @@ <menu_item_call.on_visible function="IsGodCustomerService"/> </menu_item_call> + <menu_item_call + label="Dump XML" + name="Dump XML"> + <menu_item_call.on_click + function="Advanced.AppearanceToXML" /> + <menu_item_call.on_visible + function="Advanced.EnableAppearanceToXML"/> + </menu_item_call> </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index 101e104eab..52c4fb1613 100644 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -180,7 +180,8 @@ name="Set Logging Level" tear_off="true"> <menu_item_check - label="Debug"> + name="Debug" + label="Debug"> <menu_item_check.on_check function="Develop.CheckLoggingLevel" parameter="0" /> @@ -189,7 +190,8 @@ parameter="0" /> </menu_item_check> <menu_item_check - label="Info"> + name="Info" + label="Info"> <menu_item_check.on_check function="Develop.CheckLoggingLevel" parameter="1" /> @@ -198,7 +200,8 @@ parameter="1" /> </menu_item_check> <menu_item_check - label="Warning"> + name="Warning" + label="Warning"> <menu_item_check.on_check function="Develop.CheckLoggingLevel" parameter="2" /> @@ -207,7 +210,8 @@ parameter="2" /> </menu_item_check> <menu_item_check - label="Error"> + name="Error" + label="Error"> <menu_item_check.on_check function="Develop.CheckLoggingLevel" parameter="3" /> @@ -216,7 +220,8 @@ parameter="3" /> </menu_item_check> <menu_item_check - label="None"> + name="None" + label="None"> <menu_item_check.on_check function="Develop.CheckLoggingLevel" parameter="4" /> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 364c1df999..2dc00e1df3 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -131,6 +131,7 @@ name="Status" tear_off="true"> <menu_item_check + name="Away" label="Away"> <menu_item_check.on_check function="View.Status.CheckAway" /> @@ -138,6 +139,7 @@ function="World.SetAway" /> </menu_item_check> <menu_item_check + name="Do Not Disturb" label="Do Not Disturb"> <menu_item_check.on_check function="View.Status.CheckDoNotDisturb" /> @@ -2727,8 +2729,7 @@ <menu_item_check.on_enable function="Advanced.EnableRenderDeferredOptions" /> </menu_item_check> - - <menu_item_separator/> + <menu_item_separator /> <menu_item_check label="Debug GL" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index c2e2673fcf..b6fd14e033 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -371,7 +371,8 @@ Please try logging in again in a minute.</string> <!-- build floater --> <string name="multiple_textures">Multiple</string> - <string name="use_texture">Use texture</string> + +<string name="use_texture">Use texture</string> <!-- world map --> <string name="texture_loading">Loading...</string> @@ -2988,6 +2989,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Higher">Higher</string> <string name="Hip Length">Hip Length</string> <string name="Hip Width">Hip Width</string> +<string name="Hover">Hover</string> <string name="In">In</string> <string name="In Shdw Color">Inner Shadow Color</string> <string name="In Shdw Opacity">Inner Shadow Opacity</string> diff --git a/indra/newview/skins/default/xui/es/floater_conversation_log.xml b/indra/newview/skins/default/xui/es/floater_conversation_log.xml new file mode 100644 index 0000000000..9202fab92d --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="REGISTRO DE CONVERSACIONES"> + <panel name="buttons_panel"> + <filter_editor label="Filtrar la gente" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="Opciones de vista/orden"/> + <menu_button name="conversations_gear_btn" tool_tip="Acciones en la persona o el grupo seleccionado"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_conversation_preview.xml b/indra/newview/skins/default/xui/es/floater_conversation_preview.xml new file mode 100644 index 0000000000..f579e720fb --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="CONVERSACIÓN:"> + <floater.string name="Title"> + CONVERSACIÓN: [NAME] + </floater.string> + <text name="page_label" value="Página"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_im_container.xml b/indra/newview/skins/default/xui/es/floater_im_container.xml index 1cd752e6ec..f772441141 100644 --- a/indra/newview/skins/default/xui/es/floater_im_container.xml +++ b/indra/newview/skins/default/xui/es/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="CONVERSACIONES"/> +<multi_floater name="floater_im_box" title="CONVERSACIONES"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="Opciones de vista/orden"/> + <button name="add_btn" tool_tip="Iniciar una conversación nueva"/> + <button name="speak_btn" tool_tip="Utiliza el micrófono para hablar con las personas"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="Cerrar/expandir esta lista"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="Cerrar este panel"/> + <text name="stub_textbox"> + Esta conversación está en una ventana aparte. [secondlife:/// Traerla de vuelta.] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/es/floater_im_session.xml b/indra/newview/skins/default/xui/es/floater_im_session.xml index 3d9d17fc81..5f38fbd615 100644 --- a/indra/newview/skins/default/xui/es/floater_im_session.xml +++ b/indra/newview/skins/default/xui/es/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="A" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] ha sido invitado a la conversación."/> + <floater.string name="multiple_participants_added" value="[NAME] han sido invitados a la conversación."/> + <floater.string name="tooltip_to_separate_window" value="Mover esta conversación a otra ventana"/> + <floater.string name="tooltip_to_main_window" value="Volver a poner esta conversación en la ventana principal"/> + <floater.string name="start_call_button_tooltip" value="Abrir conexión de voz"/> + <floater.string name="end_call_button_tooltip" value="Cerrar la conexión de voz"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="Cerrar este panel"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="Cerrar la lista de participantes"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="Expandir la lista de participantes"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="Opciones de vista/orden"/> + <menu_button name="gear_btn" tool_tip="Acciones en la persona seleccionada"/> + <button name="add_btn" tool_tip="Añadir alguien a esta conversación"/> + <button name="voice_call_btn" tool_tip="Abrir conexión de voz"/> + <button name="close_btn" tool_tip="Finalizar esta conversación"/> + <button name="expand_collapse_btn" tool_tip="Cerrar/expandir este panel"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Traducir el chat" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="A" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="Muestra/oculta el panel de mensajes"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_incoming_call.xml b/indra/newview/skins/default/xui/es/floater_incoming_call.xml index b5b756abb6..acbb25b713 100644 --- a/indra/newview/skins/default/xui/es/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/es/floater_incoming_call.xml @@ -10,7 +10,7 @@ anónimo </floater.string> <floater.string name="VoiceInviteP2P"> - está llamando. + te está llamando. </floater.string> <floater.string name="VoiceInviteAdHoc"> ha entrado en un chat de voz en multiconferencia. @@ -25,9 +25,9 @@ ¿Quieres dejar [CURRENT_CHAT] y entrar en este chat de voz? </floater.string> <text name="question"> - ¿Quieres dejar [CURRENT_CHAT] y entrar a este chat de voz? + Si respondes, te desconectarás de la conversación de voz actual. </text> - <button label="Aceptar" label_selected="Aceptar" name="Accept"/> - <button label="Rechazar" label_selected="Rechazar" name="Reject"/> - <button label="Comenzar un MI" name="Start IM"/> + <button label="Responder" label_selected="Responder" name="Accept"/> + <button label="Ignorar" label_selected="Ignorar" name="Reject"/> + <button label="Abrir MI en su lugar" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/es/floater_pathfinding_console.xml index e93ecc9e10..3602270e5a 100644 --- a/indra/newview/skins/default/xui/es/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/es/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Mostrar: </text> - <check_box label="Mundo virtual" name="show_world"/> + <check_box label="Prueba" name="show_world"/> <check_box label="Solamente los objetos movibles" name="show_world_movables_only"/> <check_box label="Navmesh" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml index 93bc9f293c..01b024bc3e 100644 --- a/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml @@ -20,7 +20,7 @@ <button label="Blanca" label_selected="Blanca" name="Blank"/> <button label="Ninguna" label_selected="Ninguna" left="90" name="None"/> <button label="" label_selected="" name="Pipette"/> - <check_box initial_value="true" label="Vista previa inmediata" name="apply_immediate_check"/> + <check_box initial_value="true" label="Aplicarlo ahora" name="apply_immediate_check"/> <text name="preview_disabled" value="Vista previa inhabilitada"/> <filter_editor label="Filtrar las texturas" name="inventory search editor"/> <check_box initial_value="false" label="Ver las carpetas" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/es/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/es/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..1115d67239 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="VOLUMEN DE CHAT DE VOZ"> + <slider label="Chat de voz" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_voice_effect.xml b/indra/newview/skins/default/xui/es/floater_voice_effect.xml index 1a265845af..02ebe80ff7 100644 --- a/indra/newview/skins/default/xui/es/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/es/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Lugares" name="voice_effects" title="TRANSFORMACIÓN DE VOZ"> +<floater label="Lugares" name="voice_effects" title="PROBAR TRANSFORMACIÓN DE VOZ"> <string name="no_voice_effect"> (Sin transformación de voz) </string> diff --git a/indra/newview/skins/default/xui/es/floater_voice_volume.xml b/indra/newview/skins/default/xui/es/floater_voice_volume.xml new file mode 100644 index 0000000000..0ebc511887 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="VOLUMEN DE VOZ"> + <slider name="volume_slider" tool_tip="Volumen de la voz" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/menu_cof_gear.xml b/indra/newview/skins/default/xui/es/menu_cof_gear.xml index ff8ad0977a..a889992b8a 100644 --- a/indra/newview/skins/default/xui/es/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/es/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear COF"> +<toggleable_menu name="Gear COF"> <menu label="Ropas nuevas" name="COF.Gear.New_Clothes"/> - <menu label="Nuevas partes del cuerpo" name="COF.Geear.New_Body_Parts"/> -</menu> + <menu label="Nuevas partes del cuerpo" name="COF.Gear.New_Body_Parts"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_conversation.xml b/indra/newview/skins/default/xui/es/menu_conversation.xml new file mode 100644 index 0000000000..e4e9a0bf63 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="Cerrar conversación" name="close_conversation"/> + <menu_item_call label="Abrir conversación de voz" name="open_voice_conversation"/> + <menu_item_call label="Desconectar de voz" name="disconnect_from_voice"/> + <menu_item_call label="Ver el perfil" name="view_profile"/> + <menu_item_call label="MI" name="im"/> + <menu_item_call label="Ofrecer teleporte" name="offer_teleport"/> + <menu_item_call label="Llamada de voz" name="voice_call"/> + <menu_item_call label="Historial del chat..." name="chat_history"/> + <menu_item_call label="Añadir como amigo" name="add_friend"/> + <menu_item_call label="Quitarle como amigo" name="remove_friend"/> + <menu_item_call label="Quitar amigos" name="remove_friends"/> + <menu_item_call label="Invitar al grupo..." name="invite_to_group"/> + <menu_item_call label="Acercar el zoom" name="zoom_in"/> + <menu_item_call label="Mapa" name="map"/> + <menu_item_call label="Compartir" name="share"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_check label="Ignorar la voz" name="block_unblock"/> + <menu_item_check label="Ignorar el texto" name="MuteText"/> + <menu_item_call label="Perfil del grupo" name="group_profile"/> + <menu_item_call label="Activar el grupo" name="activate_group"/> + <menu_item_call label="Abandonar el grupo" name="leave_group"/> + <context_menu label="Opciones del moderador" name="Moderator Options"> + <menu_item_check label="Permitir el chat de texto" name="AllowTextChat"/> + <menu_item_call label="Ignorar a este participante" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Quitar el silencio a este participante" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Silenciar a todos" name="ModerateVoiceMute"/> + <menu_item_call label="Quitar el silencio a todos" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/es/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..090e6fb0bf --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="MI..." name="IM"/> + <menu_item_call label="Llamada de voz..." name="Call"/> + <menu_item_call label="Abrir el historial de chat..." name="Chat history"/> + <menu_item_call label="Ver el perfil" name="View Profile"/> + <menu_item_call label="Ofrecer teleporte" name="teleport"/> + <menu_item_call label="Añadir como amigo" name="add_friend"/> + <menu_item_call label="Quitarle como amigo" name="remove_friend"/> + <menu_item_call label="Invitar al grupo..." name="Invite"/> + <menu_item_call label="Mapa" name="Map"/> + <menu_item_call label="Compartir" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_check label="Ignorar / No ignorar" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/es/menu_conversation_log_view.xml new file mode 100644 index 0000000000..b8b4616b2d --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="Ordenar alfabéticamente" name="sort_by_name"/> + <menu_item_check label="Ordenar por fecha" name="sort_by_date"/> + <menu_item_check label="Ordenar con los amigos al principio" name="sort_by_friends"/> + <menu_item_call label="Ver el historial de chat..." name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_im_conversation.xml b/indra/newview/skins/default/xui/es/menu_im_conversation.xml new file mode 100644 index 0000000000..5ba0fb898e --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="Ver el perfil" name="View Profile"/> + <menu_item_call label="Añadir como amigo" name="Add Friend"/> + <menu_item_call label="Quitarle como amigo" name="remove_friend"/> + <menu_item_call label="Ofrecer teleporte" name="offer_teleport"/> + <menu_item_call label="Invitar al grupo..." name="invite_to_group"/> + <menu_item_call label="Historial del chat..." name="chat_history"/> + <menu_item_call label="Acercar el zoom" name="zoom_in"/> + <menu_item_call label="Mapa" name="map"/> + <menu_item_call label="Compartir" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_check label="Ignorar la voz" name="Block/Unblock"/> + <menu_item_check label="Ignorar el texto" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/es/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..6ea970b826 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="Vista compacta" name="compact_view"/> + <menu_item_check label="Vista ampliada" name="expanded_view"/> + <menu_item_check label="Mostrar tiempo" name="IMShowTime"/> + <menu_item_check label="Mostrar los nombres en las conversaciones individuales" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_object_icon.xml b/indra/newview/skins/default/xui/es/menu_object_icon.xml index 7e4578b950..a99c889bb0 100644 --- a/indra/newview/skins/default/xui/es/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/es/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="Perfil del objeto..." name="Object Profile"/> <menu_item_call label="Ignorar..." name="Block"/> + <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> + <menu_item_call label="Teleportarse a la posición del objeto" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/es/menu_outfit_gear.xml b/indra/newview/skins/default/xui/es/menu_outfit_gear.xml index 558ff6afd3..56e64c729f 100644 --- a/indra/newview/skins/default/xui/es/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/es/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="Pelo nuevo" name="New Hair"/> <menu_item_call label="Ojos nuevos" name="New Eyes"/> </menu> + <menu_item_call label="Abrir todas las carpetas" name="expand"/> + <menu_item_call label="Cerrar todas las carpetas" name="collapse"/> <menu_item_call label="Renombrar el vestuario" name="rename"/> <menu_item_call label="Borrar el vestuario" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_participant_view.xml b/indra/newview/skins/default/xui/es/menu_participant_view.xml new file mode 100644 index 0000000000..fcfeeb922b --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="Ordenar las conversaciones por tipo" name="sort_sessions_by_type"/> + <menu_item_check label="Ordenar las conversaciones por nombre" name="sort_sessions_by_name"/> + <menu_item_check label="Ordenar las conversaciones por actividad reciente" name="sort_sessions_by_recent"/> + <menu_item_check label="Ordenar los participantes por nombre" name="sort_participants_by_name"/> + <menu_item_check label="Ordenar los participantes por actividad reciente" name="sort_participants_by_recent"/> + <menu_item_call label="Preferencias de chat..." name="chat_preferences"/> + <menu_item_call label="Preferencias de privacidad..." name="privacy_preferences"/> + <menu_item_check label="Registro de conversaciones..." name="Conversation"/> + <menu_item_check label="Traducir el chat" name="Translate_chat"/> + <menu_item_check label="Configuración de traducción..." name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/es/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..986389a4fe --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="No ignorar" name="unblock"/> + <menu_item_call label="Perfil..." name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/es/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..10f6a3fc14 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="Ignorar residentes según el nombre..." name="block_resident_by_name"/> + <menu_item_call label="Ignorar objetos según el nombre" name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/es/menu_people_blocked_view.xml new file mode 100644 index 0000000000..bc557c7ec1 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="Ordenar alfabéticamente" name="sort_by_name"/> + <menu_item_check label="Ordenar por tipo" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_friends_view.xml b/indra/newview/skins/default/xui/es/menu_people_friends_view.xml new file mode 100644 index 0000000000..ad896c1b74 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/> + <menu_item_check label="Ordenar por estatus" name="sort_status"/> + <menu_item_check label="Ver los iconos de la gente" name="view_icons"/> + <menu_item_check label="Ver permisos concedidos" name="view_permissions"/> + <menu_item_check label="Ver el registro de conversaciones..." name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_groups.xml b/indra/newview/skins/default/xui/es/menu_people_groups.xml index 51bd2c7208..125e25cd1a 100644 --- a/indra/newview/skins/default/xui/es/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/es/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="Ver la información" name="View Info"/> <menu_item_call label="Chat" name="Chat"/> - <menu_item_call label="Llamar" name="Call"/> + <menu_item_call label="Llamada de voz" name="Call"/> <menu_item_call label="Activar" name="Activate"/> <menu_item_call label="Dejar" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_groups_view.xml b/indra/newview/skins/default/xui/es/menu_people_groups_view.xml new file mode 100644 index 0000000000..c3973625b0 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Mostrar los iconos de grupo" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby.xml b/indra/newview/skins/default/xui/es/menu_people_nearby.xml index dc1486d879..09bb119d5a 100644 --- a/indra/newview/skins/default/xui/es/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/es/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="Ver el perfil" name="View Profile"/> - <menu_item_call label="Añadir como amigo" name="Add Friend"/> - <menu_item_call label="Quitarle como amigo" name="Remove Friend"/> - <menu_item_call label="MI" name="IM"/> - <menu_item_call label="Llamar" name="Call"/> - <menu_item_call label="Mapa" name="Map"/> - <menu_item_call label="Compartir" name="Share"/> - <menu_item_call label="Pagar" name="Pay"/> - <menu_item_check label="Ignorar / No ignorar" name="Block/Unblock"/> - <menu_item_call label="Ofrecer teleporte" name="teleport"/> + <menu_item_call label="Ver el perfil" name="view_profile"/> + <menu_item_call label="MI" name="im"/> + <menu_item_call label="Ofrecer teleporte" name="offer_teleport"/> + <menu_item_call label="Llamada de voz" name="voice_call"/> + <menu_item_call label="Ver el historial de chat..." name="chat_history"/> + <menu_item_call label="Añadir como amigo" name="add_friend"/> + <menu_item_call label="Quitarle como amigo" name="remove_friend"/> + <menu_item_call label="Invitar al grupo..." name="invite_to_group"/> + <menu_item_call label="Acercar el zoom" name="zoom_in"/> + <menu_item_call label="Mapa" name="map"/> + <menu_item_call label="Compartir" name="share"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_check label="Ignorar / No ignorar" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml index 227c5ebe58..9df160f5ad 100644 --- a/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="Añadir como amigos" name="Add Friends"/> - <menu_item_call label="Quitar amigos" name="Remove Friend"/> - <menu_item_call label="MI" name="IM"/> - <menu_item_call label="Llamar" name="Call"/> - <menu_item_call label="Compartir" name="Share"/> - <menu_item_call label="Pagar" name="Pay"/> - <menu_item_call label="Ofrecer teleporte" name="teleport"/> + <menu_item_call label="Añadir como amigos" name="add_friends"/> + <menu_item_call label="Quitar amigos" name="remove_friends"/> + <menu_item_call label="MI" name="im"/> + <menu_item_call label="Visita" name="call"/> + <menu_item_call label="Compartir" name="share"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_call label="Ofrecer teleporte" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/es/menu_people_nearby_view.xml new file mode 100644 index 0000000000..c2fb360dd1 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ordenar según las intervenciones recientes" name="sort_by_recent_speakers"/> + <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/> + <menu_item_check label="Ordenar según distancia" name="sort_distance"/> + <menu_item_check label="Ver los iconos de la gente" name="view_icons"/> + <menu_item_check label="Ver mapa" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_people_recent_view.xml b/indra/newview/skins/default/xui/es/menu_people_recent_view.xml new file mode 100644 index 0000000000..f0ffd14024 --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ordenar por más reciente" name="sort_most"/> + <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/> + <menu_item_check label="Ver los iconos de la gente" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_url_agent.xml b/indra/newview/skins/default/xui/es/menu_url_agent.xml index a089c8f68e..69a03671ab 100644 --- a/indra/newview/skins/default/xui/es/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/es/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostrar el perfil del Residente" name="show_agent"/> + <menu_item_call label="Ver el perfil" name="show_agent"/> + <menu_item_call label="Enviar un MI..." name="send_im"/> + <menu_item_call label="Añadir como amigo..." name="add_friend"/> <menu_item_call label="Copiar el nombre al portapapeles" name="url_copy_label"/> <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_url_objectim.xml b/indra/newview/skins/default/xui/es/menu_url_objectim.xml index 8791a290af..e78fdec558 100644 --- a/indra/newview/skins/default/xui/es/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/es/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostrar la información del objeto" name="show_object"/> + <menu_item_call label="Perfil del objeto..." name="show_object"/> <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> <menu_item_call label="Teleportarse a la posición del objeto" name="teleport_to_object"/> <menu_item_call label="Copiar el nombre del objeto al portapapeles" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index 9e0ac5115f..de42b17074 100644 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="Parar mis animaciones" name="Stop Animating My Avatar"/> <menu_item_call label="Caminar / Correr / Volar..." name="Walk / run / fly"/> </menu> - <menu label="Estado" name="Status"> - <menu_item_call label="Ausente" name="Set Away"/> - <menu_item_call label="Ocupado" name="Set Busy"/> - </menu> + <menu label="Estado" name="Status"/> <menu_item_call label="Comprar L$..." name="Buy and Sell L$"/> <menu_item_call label="Panel de control de la cuenta..." name="Manage My Account"> <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es"/> @@ -31,14 +28,18 @@ <menu_item_call label="Salir de [APP_NAME]" name="Quit"/> </menu> <menu label="Comunicarme" name="Communicate"> + <menu_item_check label="Conversaciones..." name="Conversations"/> <menu_item_check label="Chat..." name="Nearby Chat"/> <menu_item_check label="Hablar" name="Speak"/> - <menu_item_check label="Configuración de voz..." name="Nearby Voice"/> - <menu_item_check label="Transformación de voz..." name="ShowVoice"/> + <menu label="Transformación de voz" name="VoiceMorphing"> + <menu_item_check label="Sin transformación de voz" name="NoVoiceMorphing"/> + <menu_item_check label="Probar..." name="Preview"/> + <menu_item_call label="Suscribir..." name="Subscribe"/> + </menu> <menu_item_check label="Gestos..." name="Gestures"/> - <menu_item_call label="Amigos" name="My Friends"/> - <menu_item_call label="Grupos" name="My Groups"/> - <menu_item_call label="Gente cerca" name="Active Speakers"/> + <menu_item_check label="Amigos" name="My Friends"/> + <menu_item_check label="Grupos" name="My Groups"/> + <menu_item_check label="Gente cerca" name="Active Speakers"/> <menu_item_call label="Lista de ignorados" name="Block List"/> </menu> <menu label="Mundo" name="World"> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 7dfb27717d..05455f54c3 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -511,6 +511,24 @@ El objeto debe de haber sido borrado o estar fuera de rango ('out of range& </url> <usetemplate ignoretext="Mi controlador de gráficos no está actualizado" name="okcancelignore" notext="No" yestext="SÃ"/> </notification> + <notification name="AMDOldDriver"> + Probablemente ya existe un controlador más reciente para tu procesador de gráficos. La actualización del controlador de gráficos puede mejorar sustancialmente el rendimiento. + + ¿Deseas visitar [_URL] para comprobar si hay controladores actualizados? + <url name="url"> + http://support.amd.com/us/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="Mi controlador de gráficos no está actualizado" name="okcancelignore" notext="No" yestext="SÃ"/> + </notification> + <notification name="NVIDIAOldDriver"> + Probablemente ya existe un controlador más reciente para tu procesador de gráficos. La actualización del controlador de gráficos puede mejorar sustancialmente el rendimiento. + + ¿Deseas visitar [_URL] para comprobar si hay controladores actualizados? + <url name="url"> + http://www.nvidia.com/Download/index.aspx?lang=es + </url> + <usetemplate ignoretext="Mi controlador de gráficos no está actualizado" name="okcancelignore" notext="No" yestext="SÃ"/> + </notification> <notification name="UnknownGPU"> Tu sistema usa una tarjeta gráfica que [APP_NAME] no reconoce. Suele suceder con hardware nuevo que todavÃa no ha sido probado con [APP_NAME]. Probablemente todo irá bien, pero deberás ajustar tus configuraciones gráficas. @@ -1553,10 +1571,13 @@ Debemos reiniciar [APP_NAME] para instalar la actualización. En este momento, no se puede ofrecer el ser amigo. Por favor, vuelve a intentarlo en un momento. <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="BusyModeSet"> - Pasar al modo ocupado. -Se ocultará el chat y los mensajes instantáneos (éstos recibirán tu Respuesta en el modo ocupado). Se rehusarán todos los ofrecimientos de teleporte. Todas las ofertas de inventario irán a tu Papelera. - <usetemplate ignoretext="Cambio mi estado al modo ocupado" name="okignore" yestext="OK"/> + <notification name="DoNotDisturbModeSet"> + Está activado No molestar. No obtendrás un aviso cuando recibas comunicaciones. + +- Los otros residentes recibirán tu respuesta de No molestar (se configura en Preferencias > General). +- Se rehusarán los ofrecimientos de teleporte. +- Se rechazarán las llamadas de voz. + <usetemplate ignoretext="Cambio mi estado al modo No molestar" name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> Has superado tu número máximo de grupos. Por favor, sal de al menos uno antes de entrar en éste, o rehúsa la oferta. @@ -2043,6 +2064,10 @@ Dado que estos objetos tienen scripts, moverlos a tu inventario puede provocar u ¿Ir a tu [http://secondlife.com/account/ Panel de Control] para ver el historial de tu cuenta? <usetemplate ignoretext="Abrir mi navegador para ver el historial de mi cuenta" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + Si agregas una persona a una conversación en curso, se creará una conversación nueva. Todos los participantes recibirán notificaciones de la nueva conversación. + <usetemplate ignoretext="Confirmar agregar participantes al chat" name="okcancelignore" notext="Cancelar" yestext="Aceptar"/> + </notification> <notification name="ConfirmQuit"> ¿Estás seguro de que quieres salir? <usetemplate ignoretext="Confirmar antes de salir" name="okcancelignore" notext="No salir" yestext="Salir"/> @@ -2116,14 +2141,14 @@ Linden Lab <button ignore="Nunca reemplazar" name="No" text="Cancelar"/> </form> </notification> - <notification label="¡Aviso! Modo Ocupado" name="BusyModePay"> - Estás en el modo Ocupado. Por tanto, no recibirás ningún Ãtem a cambio de este pago. + <notification label="Advertencia del modo No molestar" name="DoNotDisturbModePay"> + Tienes activado No molestar. No podrás recibir ningún objeto ofrecido a cambio de este pago. -¿Quieres salir del modo Ocupado antes de completar esta transacción? +¿Deseas desactivar No molestar antes de finalizar esta transacción? <form name="form"> - <ignore name="ignore" save_option="true" text="Voy a pagar a una persona u objeto mientras estoy en el modo ocupado"/> - <button ignore="Siempre salir del modo Ocupado" name="Yes" text="OK"/> - <button ignore="Nunca salir del modo Ocupado" name="No" text="Cancelar"/> + <ignore name="ignore" text="Voy a pagar a una persona u objeto mientras estoy en el modo No molestar"/> + <button ignore="Salir siempre del modo No molestar" name="Yes" text="OK"/> + <button ignore="No salir nunca del modo No molestar" name="No" text="Cancelar"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2258,11 +2283,8 @@ PublÃcala en una página web para que otros puedan acceder fácilmente a esta p <notification name="GroupNotice"> Asunto: [SUBJECT], Mensaje: [MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> está conectado - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> está desconectado + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> está [STATUS] </notification> <notification name="AddSelfFriend"> Aunque eres muy agradable, no puedes añadirte como amigo a ti mismo. @@ -2490,13 +2512,6 @@ Aquà no puedes volar. <notification name="DynamicPathfindingDisabled"> Esta región no tiene activado el pathfinding dinámico. Los objetos programados que utilicen llamadas LSL de pathfinding pueden tener un comportamiento inesperado en ella. </notification> - <notification name="PathfindingRebakeNavmesh"> - Si cambias ciertos objetos en esta región, otros objetos móviles podrÃan tener un comportamiento incorrecto. Para que los objetos móviles se comporten correctamente, pulsa el botón “Recargar la regiónâ€. Si quieres más información, elige “Ayudaâ€. - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="Ayuda" ignoretext="Si cambias ciertos objetos en esta región, otros objetos móviles podrÃan tener un comportamiento incorrecto." name="okhelpignore" yestext="OK"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> Se ha producido un error. Puede haber ocurrido un problema en la red o el servidor, o quizás no tengas derechos de construcción. Este problema podrÃa resolverse cerrando la sesión e iniciando una sesión nueva. <usetemplate name="okbutton" yestext="OK"/> @@ -2757,9 +2772,9 @@ Del objeto: <nolink>[OBJECTNAME]</nolink>, propietario: [NAME]? </form> </notification> <notification name="ScriptQuestionCaution"> - Atención: El objeto '<nolink>[OBJECTNAME]</nolink>' solicita un acceso total a tu cuenta de dólares Linden. Si le autorizas el acceso, podrá retirar fondos de tu cuenta en cualquier momento o vaciarla por completo, de manera permanente y sin más advertencias. + Atención: El objeto '<nolink>[OBJECTNAME]</nolink>' solicita un acceso pleno a tu cuenta de dólares Linden. Si le autorizas el acceso, podrá retirar fondos de tu cuenta en cualquier momento o vaciarla por completo, cuando lo desee y sin más advertencias. -Estas solicitudes pocas veces son legÃtimas. No autorices el acceso si no conoces la razón exacta por la que desea el acceso a tu cuenta. +No autorices el acceso a tu cuenta si no conoces cuál es la razón exacta. <form name="form"> <button name="Grant" text="Permitir acceso total"/> <button name="Deny" text="Denegar"/> @@ -3331,4 +3346,633 @@ Intento cancelado. Vas a eliminar [NUM_ITEMS] objetos. ¿Estás seguro de que deseas continuar? <usetemplate ignoretext="¿Estás seguro de que quieres eliminar varios elementos?" name="okcancelignore" notext="No" yestext="SÃ"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] te ha congelado. No puedes moverte ni interactuar con el mundo. + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] te ha congelado durante [AV_FREEZE_TIME] segundos. No puedes moverte ni interactuar con el mundo. + </notification> + <notification name="YouFrozeAvatar"> + Avatar congelado. + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] te ha descongelado. + </notification> + <notification name="AvatarUnFrozen"> + Avatar descongelado. + </notification> + <notification name="AvatarFreezeFailure"> + Error al congelar: no tienes permisos de administrador en esa parcela. + </notification> + <notification name="AvatarFreezeThaw"> + La congelación ha terminado, puedes seguir con tus asuntos. + </notification> + <notification name="AvatarCantFreeze"> + Lo sentimos, ese usuario no se puede congelar. + </notification> + <notification name="NowOwnObject"> + Ahora eres el propietario del objeto [OBJECT_NAME] + </notification> + <notification name="CantRezOnLand"> + No se puede colocar el objeto en [OBJECT_POS] porque el propietario de ese terreno no lo permite. Usa la herramienta de terreno para ver quién es el propietario. + </notification> + <notification name="RezFailTooManyRequests"> + El objeto no se puede colocar porque hay demasiadas solicitudes. + </notification> + <notification name="SitFailCantMove"> + No te puedes sentar porque en este momento no puedes desplazarte. + </notification> + <notification name="SitFailNotAllowedOnLand"> + No te puedes sentar porque no tienes permiso para estar en ese terreno. + </notification> + <notification name="SitFailNotSameRegion"> + Acércate. No te puedes sentar en el objeto porque +no está en la misma región que tú. + </notification> + <notification name="NoNewObjectRegionFull"> + No se puede crear el nuevo objeto. La región está llena. + </notification> + <notification name="FailedToPlaceObject"> + Error al colocar el objeto en el lugar especificado. Vuelve a intentarlo. + </notification> + <notification name="NoOwnNoGardening"> + No puedes crear árboles y hierba en un terreno que no es tuyo. + </notification> + <notification name="NoCopyPermsNoObject"> + Error al copiar: careces de permiso para copiar el objeto '[OBJ_NAME]'. + </notification> + <notification name="NoTransPermsNoObject"> + Error al copiar: no se te puede transferir el objeto '[OBJ_NAME]'. + </notification> + <notification name="AddToNavMeshNoCopy"> + Error al copiar porque el objeto '[OBJ_NAME]' contribuye al navmesh. + </notification> + <notification name="DupeWithNoRootsSelected"> + Duplicación sin objetos raÃz seleccionados. + </notification> + <notification name="CantDupeCuzRegionIsFull"> + No se pueden duplicar objetos porque la región está llena. + </notification> + <notification name="CantDupeCuzParcelNotFound"> + No se pueden duplicar los objetos: no se encuentra la parcela en la que se hallan. + </notification> + <notification name="CantCreateCuzParcelFull"> + No se puede crear el objeto porque +la parcela está llena. + </notification> + <notification name="RezAttemptFailed"> + Error al intentar colocar un objeto. + </notification> + <notification name="ToxicInvRezAttemptFailed"> + No se puede crear un objeto que ha causado problemas en esta región. + </notification> + <notification name="InvItemIsBlacklisted"> + Ese objeto de inventario está en la lista negra. + </notification> + <notification name="NoCanRezObjects"> + Actualmente no tienes autorización para crear objetos. + </notification> + <notification name="LandSearchBlocked"> + Búsqueda de terrenos bloqueada. +Has realizado demasiadas búsquedas de terreno con excesiva rapidez. +Prueba otra vez dentro de un minuto. + </notification> + <notification name="NotEnoughResourcesToAttach"> + No hay suficientes recursos de script disponibles para anexar el objeto + </notification> + <notification name="YouDiedAndGotTPHome"> + Has muerto y te has teleportado a tu lugar de origen + </notification> + <notification name="EjectComingSoon"> + Te han expulsado de aquà y tienes [EJECT_TIME] segundos para salir. + </notification> + <notification name="NoEnterServerFull"> + No puedes entrar en esta región porque +el servidor está lleno. + </notification> + <notification name="SaveBackToInvDisabled"> + Se ha deshabilitado Devolver el objeto a mi inventario. + </notification> + <notification name="NoExistNoSaveToContents"> + No se puede guardar '[OBJ_NAME]' en el contenido del objeto porque el objeto desde el cual ha sido colocado ya no existe. + </notification> + <notification name="NoModNoSaveToContents"> + No se puede guardar '[OBJ_NAME]' en el contenido del objeto porque no tienes permiso para modificar el objeto '[DEST_NAME]'. + </notification> + <notification name="NoSaveBackToInvDisabled"> + No se puede guardar '[OBJ_NAME]' de nuevo en el inventario; esta operación está desactivada. + </notification> + <notification name="NoCopyNoSelCopy"> + No se puede copiar tu selección porque no tienes permiso para copiar el objeto '[OBJ_NAME]'. + </notification> + <notification name="NoTransNoSelCopy"> + No se puede copiar tu selección porque el objeto '[OBJ_NAME]' es intransferible. + </notification> + <notification name="NoTransNoCopy"> + No se puede copiar tu selección porque el objeto '[OBJ_NAME]' es intransferible. + </notification> + <notification name="NoPermsNoRemoval"> + El sistema de permisos no admite la eliminación del objeto '[OBJ_NAME]' del simulador. + </notification> + <notification name="NoModNoSaveSelection"> + No se puede guardar tu selección porque no tienes permiso para modificar el objeto '[OBJ_NAME]'. + </notification> + <notification name="NoCopyNoSaveSelection"> + No se puede guardar tu selección porque el objeto '[OBJ_NAME]' no se puede copiar. + </notification> + <notification name="NoModNoTaking"> + No se puede aceptar tu selección porque no tienes permiso para modificar el objeto '[OBJ_NAME]'. + </notification> + <notification name="RezDestInternalError"> + Error interno: tipo de destino desconocido. + </notification> + <notification name="DeleteFailObjNotFound"> + Error al borrar: el objeto no se encuentra + </notification> + <notification name="SorryCantEjectUser"> + Lo sentimos, ese usuario no se puede expulsar. + </notification> + <notification name="RegionSezNotAHome"> + Esta región no te permite configurar aquà tu lugar de origen. + </notification> + <notification name="HomeLocationLimits"> + Tu 'Lugar de origen' solo se puede configurar en tu terreno o en un punto de información del continente. + </notification> + <notification name="HomePositionSet"> + Posición de origen ajustada. + </notification> + <notification name="AvatarEjected"> + Avatar expulsado. + </notification> + <notification name="AvatarEjectFailed"> + Error al expulsar: no tienes permiso de administrador en esa parcela. + </notification> + <notification name="CantMoveObjectParcelFull"> + No se puede mover el objeto '[OBJECT_NAME]' a +[OBJ_POSITION] en la región [REGION_NAME] porque la parcela está llena. + </notification> + <notification name="CantMoveObjectParcelPerms"> + No se puede mover el objeto '[OBJECT_NAME]' a +[OBJ_POSITION] de la región [REGION_NAME] porque tus objetos no están permitidos en esta parcela. + </notification> + <notification name="CantMoveObjectParcelResources"> + No se puede mover el objeto '[OBJECT_NAME]' a +[OBJ_POSITION] de la región [REGION_NAME] porque no hay suficientes recursos para este objeto en esta parcela. + </notification> + <notification name="CantMoveObjectRegionVersion"> + No se puede mover el objeto '[OBJECT_NAME]' a +[OBJ_POSITION] de la región [REGION_NAME] porque la otra región ejecuta una versión más antigua que no admite la recepción de este objeto atravesando regiones. + </notification> + <notification name="CantMoveObjectNavMesh"> + No se puede mover el objeto '[OBJECT_NAME]' a +[OBJ_POSITION] en la región [REGION_NAME] porque no puedes modificar el navmesh a través de lÃmites de región. + </notification> + <notification name="CantMoveObjectWTF"> + No se puede mover el objeto '[OBJECT_NAME]' a +[OBJ_POSITION] en la región [REGION_NAME] por un motivo desconocido. ([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + No tienes permiso para modificar ese objeto + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + No se puede habilitar la fÃsica para un objeto que contribuye al navmesh. + </notification> + <notification name="CantEnablePhysKeyframedObj"> + No se puede activar la fÃsica para los objetos con fotogramas clave. + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + No se puede habilitar la fÃsica para el objeto: recursos de terreno insuficientes. + </notification> + <notification name="CantEnablePhysCostTooGreat"> + No se puede activar la fÃsica para un objeto con un coste de recursos de fÃsica mayor que [MAX_OBJECTS] + </notification> + <notification name="PhantomWithConcavePiece"> + Este objeto no puede tener una pieza cóncava porque es inmaterial y contribuye al navmesh. + </notification> + <notification name="UnableAddItem"> + ¡No se puede añadir un objeto! + </notification> + <notification name="UnableEditItem"> + ¡No se puede editar esto! + </notification> + <notification name="NoPermToEdit"> + No puedes editar esto. + </notification> + <notification name="NoPermToCopyInventory"> + No está permitido copiar ese inventario. + </notification> + <notification name="CantSaveItemDoesntExist"> + No se puede guardar en el contenido del objeto: el objeto ya no existe. + </notification> + <notification name="CantSaveItemAlreadyExists"> + No se puede guardar en el contenido del objeto: el inventario ya contiene un objeto con ese nombre + </notification> + <notification name="CantSaveModifyAttachment"> + No se puede guardar en el contenido del objeto: se modificarÃan los permisos de anexo. + </notification> + <notification name="TooManyScripts"> + Demasiados scripts. + </notification> + <notification name="UnableAddScript"> + ¡No se puede añadir un script! + </notification> + <notification name="AssetServerTimeoutObjReturn"> + El servidor de objetos no respondió puntualmente. El objeto se ha devuelto al sim. + </notification> + <notification name="RegionDisablePhysicsShapes"> + Esta región no tiene habilitadas las formas de fÃsica. + </notification> + <notification name="NoModNavmeshAcrossRegions"> + No se puede modificar el navmesh a través de lÃmites de región. + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + No se pueden establecer propiedades de fÃsica en ese tipo de objeto. + </notification> + <notification name="NoSetRootPrimWithNoShape"> + No se puede establecer que un prim raÃz no tenga forma. + </notification> + <notification name="NoRegionSupportPhysMats"> + Esta región no tiene habilitados los materiales de fÃsica. + </notification> + <notification name="OnlyRootPrimPhysMats"> + Solo se pueden ajustar los materiales de fÃsica de las prims raÃces. + </notification> + <notification name="NoSupportCharacterPhysMats"> + Aun no es posible configurar materiales de fÃsica para los personajes. + </notification> + <notification name="InvalidPhysMatProperty"> + Una o varias de las propiedades de los materiales de fÃsica especificados no son válidas. + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + No se puede cambiar el tipo de unión de un objeto de la malla. + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + No se puede cambiar la forma de un objeto de la malla + </notification> + <notification name="FullRegionCantEnter"> + No puedes entrar en esta región porque \nla región está llena. + </notification> + <notification name="LinkFailedOwnersDiffer"> + Error de vÃnculo: los propietarios son diferentes + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + Error de vÃnculo: no se puede modificar el navmesh a través de lÃmites de región. + </notification> + <notification name="LinkFailedNoPermToEdit"> + Error de vÃnculo: no tienes permiso de edición. + </notification> + <notification name="LinkFailedTooManyPrims"> + Error de vÃnculo: demasiadas primitivas + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + Error de vÃnculo: no se pueden vincular 'no copiable' y 'no transferible' + </notification> + <notification name="LinkFailedNothingLinkable"> + Error de vÃnculo: no hay objetos que se puedan vincular. + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + Error de vÃnculo: demasiados personajes de pathfinding + </notification> + <notification name="LinkFailedInsufficientLand"> + Error de vÃnculo: recursos de terreno insuficientes + </notification> + <notification name="LinkFailedTooMuchPhysics"> + El objeto utiliza una cantidad excesiva de recursos de fÃsica; se ha desactivado su dinámica. + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + Has sido teleportado al origen por el objeto '[OBJECT_NAME]' de la parcela '[PARCEL_NAME]' + </notification> + <notification name="TeleportedHomeByObject"> + Has sido teleportado a tu origen por el objeto '[OBJECT_NAME]' + </notification> + <notification name="TeleportedByAttachment"> + Has sido teleportado por un anexo de [ITEM_ID] + </notification> + <notification name="TeleportedByObjectOnParcel"> + Has sido teleportado por el objeto '[OBJECT_NAME]' de la parcela '[PARCEL_NAME]' + </notification> + <notification name="TeleportedByObjectOwnedBy"> + Has sido teleportado por el objeto '[OBJECT_NAME]' que es propiedad de [OWNER_ID] + </notification> + <notification name="TeleportedByObjectUnknownUser"> + Has sido teleportado por el objeto '[OBJECT_NAME]' cuyo propietario es un usuario desconocido. + </notification> + <notification name="CantCreateObjectRegionFull"> + No se puede crear el objeto solicitado. La región está llena. + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + No puedes anexar varios objetos a un solo lugar. + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + Aquà no se pueden crear varios objetos. + </notification> + <notification name="UnableToCreateObjTimeOut"> + No se puede crear el objeto solicitado. El objeto no se encuentra en la base de datos. + </notification> + <notification name="UnableToCreateObjUnknown"> + No se puede crear el objeto solicitado. Ha expirado el tiempo de la solicitud. Vuelve a intentarlo. + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + No se puede crear el objeto solicitado. Vuelve a intentarlo. + </notification> + <notification name="RezFailureTookTooLong"> + Error al colocar: la carga del objeto solicitado ha tardado demasiado. + </notification> + <notification name="FailedToPlaceObjAtLoc"> + Error al colocar el objeto en el lugar especificado. Vuelve a intentarlo. + </notification> + <notification name="CantCreatePlantsOnLand"> + No se pueden crear plantas en este terreno. + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + No se puede restaurar el objeto. No se ha encontrado una posición del mundo. + </notification> + <notification name="CantRezObjectInvalidMeshData"> + No se puede colocar el objeto porque sus datos de malla no son válidos. + </notification> + <notification name="CantRezObjectTooManyScripts"> + No se puede colocar el objeto porque la región ya contiene demasiados scripts. + </notification> + <notification name="CantCreateObjectNoAccess"> + Tus privilegios de acceso no te permiten crear objetos allÃ. + </notification> + <notification name="CantCreateObject"> + Actualmente no tienes autorización para crear objetos. + </notification> + <notification name="InvalidObjectParams"> + Los parámetros de objeto no son válidos + </notification> + <notification name="CantDuplicateObjectNoAcess"> + Tus privilegios de acceso no te permiten duplicar objetos aquÃ. + </notification> + <notification name="CantChangeShape"> + No tienes permiso para cambiar esta forma. + </notification> + <notification name="NoAccessToClaimObjects"> + Tus privilegios de acceso no te permiten reclamar objetos aquÃ. + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + Error de transferencia: no tienes permiso para transferir objetos para tu grupo. + </notification> + <notification name="NoPrivsToBuyObject"> + Tus privilegios de acceso no te autorizan a comprar objetos aquÃ. + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + No se puede anexar el objeto porque un avatar está sentado en él. + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + No te puedes poner árboles y hierba como anexos. + </notification> + <notification name="CantAttachGroupOwnedObjs"> + No se pueden anexar objetos que son propiedad de grupos. + </notification> + <notification name="CantAttachObjectsNotOwned"> + No puedes anexar objetos de los que no eres propietario. + </notification> + <notification name="CantAttachNavmeshObjects"> + No se pueden anexar objetos que contribuyen al navmesh. + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + No se puede anexar el objeto porque no tienes permiso para moverlo. + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + No hay suficientes recursos de script disponibles para anexar el objeto + </notification> + <notification name="CantDropItemTrialUser"> + No se pueden soltar objetos aquÃ; inténtalo en la zona de prueba gratuita. + </notification> + <notification name="CantDropMeshAttachment"> + No se pueden soltar anexos de la malla. QuÃtalos en el inventario y después colócalos en el mundo. + </notification> + <notification name="CantDropAttachmentNoPermission"> + Error al soltar el anexo: no tienes permiso para soltarlo allÃ. + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + Error al soltar el anexo: recurso de terreno disponible insuficiente. + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + Error al soltar los anexos: los recursos disponibles son insuficientes. + </notification> + <notification name="CantDropObjectFullParcel"> + No se puede soltar el objeto aquÃ. La parcela está llena. + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + No puedes tocar/agarrar este objeto porque tienes prohibida la entrada en la parcela de terreno. + </notification> + <notification name="PlzNarrowDeleteParams"> + Acota los parámetros de eliminación. + </notification> + <notification name="UnableToUploadAsset"> + No se puede subir el activo. + </notification> + <notification name="CantTeleportCouldNotFindUser"> + No se ha podido encontrar el usuario para teleportarlo al origen + </notification> + <notification name="GodlikeRequestFailed"> + error en la solicitud de superpoderes + </notification> + <notification name="GenericRequestFailed"> + error de solicitud genérico + </notification> + <notification name="CantUploadPostcard"> + No se puede subir la postal. Vuelve a intentarlo más tarde. + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + No se pueden obtener los datos de inventario del aviso de grupo. + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + No se puede enviar el aviso de grupo: no está permitido. + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + No se puede enviar el aviso del grupo: el inventario no se puede construir. + </notification> + <notification name="CantParceInventoryInNotice"> + No se puede analizar el inventario del aviso. + </notification> + <notification name="TerrainUploadFailed"> + Error al subir terreno. + </notification> + <notification name="TerrainFileWritten"> + Se ha registrado el archivo de terreno. + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + Archivo de terreno registrado, iniciando la descarga... + </notification> + <notification name="TerrainBaked"> + Terreno predeterminado. + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + Solamente se han desactivado los 10 primeros objetos seleccionados. Si es preciso, actualiza y selecciona otros objetos. + </notification> + <notification name="UpdateViewerBuyParcel"> + Para comprar esta parcela debes actualizar el visor. + </notification> + <notification name="CantBuyParcelNotForSale"> + Error al comprar: esta parcela no está en venta. + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + No se puede comprar: el precio de venta o la superficie del terreno han cambiado. + </notification> + <notification name="CantBuyParcelNotAuthorized"> + No eres el comprador autorizado de esta parcela. + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + No puedes comprar esta parcela porque ya está en espera de una autorización de compra + </notification> + <notification name="CantBuildOverflowParcel"> + No se pueden construir objetos aquà porque se desbordarÃa la parcela. + </notification> + <notification name="SelectedMultipleOwnedLand"> + Has seleccionado un terreno con propietarios diferentes. Selecciona un área más pequeña y repite la operación. + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + La selección no contiene suficientes parcelas alquiladas para unirlas. + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + No se puede dividir el terreno.\nHay varias parcelas seleccionadas.\nPrueba a seleccionar un terreno más pequeño. + </notification> + <notification name="CantDivideLandCantFindParcel"> + No se puede dividir el terreno.\nNo se encuentra la parcela.\nAvÃsanos con Ayuda -> Notificar fallo... + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + No se puede dividir el terreno. Está seleccionada la parcela completa.\nPrueba a seleccionar un terreno más pequeño. + </notification> + <notification name="LandHasBeenDivided"> + El terreno se ha dividido. + </notification> + <notification name="PassPurchased"> + Has comprado un pase. + </notification> + <notification name="RegionDisallowsClassifieds"> + La región no permite anuncios. + </notification> + <notification name="LandPassExpireSoon"> + Tu pase para este terreno está a punto de caducar. + </notification> + <notification name="CantSitNoSuitableSurface"> + Esta superficie no es adecuada para sentarse, prueba en otro sitio. + </notification> + <notification name="CantSitNoRoom"> + No hay sitio para sentarse aquÃ, prueba en otro lugar. + </notification> + <notification name="ClaimObjectFailedNoPermission"> + Error al reclamar el objeto: no tienes permiso + </notification> + <notification name="ClaimObjectFailedNoMoney"> + Error al reclamar el objeto: no tienes suficientes L$. + </notification> + <notification name="CantDeedGroupLand"> + No se puede transferir un terreno propiedad de un grupo. + </notification> + <notification name="BuyObjectFailedNoMoney"> + Error al comprar el objeto, no tienes suficientes L$. + </notification> + <notification name="BuyInventoryFailedNoMoney"> + Error al comprar el inventario: no tienes suficientes L$. + </notification> + <notification name="BuyPassFailedNoMoney"> + No tienes suficientes L$ para comprar un pase a este terreno. + </notification> + <notification name="CantBuyPassTryAgain"> + No se puede comprar el pase ahora mismo. Vuelve a intentarlo más tarde. + </notification> + <notification name="CantCreateObjectParcelFull"> + No se puede crear el objeto porque \nla parcela está llena. + </notification> + <notification name="FailedPlacingObject"> + Error al colocar el objeto en el lugar especificado. Vuelve a intentarlo. + </notification> + <notification name="CantCreateLandmarkForEvent"> + No se puede crear un hito para el evento. + </notification> + <notification name="GodBeatsFreeze"> + ¡Tus superpoderes anulan la congelación! + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + Error en la solicitud de poderes especiales. Esta solicitud se ha registrado. + </notification> + <notification name="ExpireExplanation"> + El sistema actualmente no puede procesar tu solicitud. Ha expirado el tiempo de la solicitud. + </notification> + <notification name="DieExplanation"> + El sistema no puede procesar tu solicitud. + </notification> + <notification name="AddPrimitiveFailure"> + Dinero insuficiente para crear la primitiva. + </notification> + <notification name="RezObjectFailure"> + Dinero insuficiente para crear el objeto. + </notification> + <notification name="ResetHomePositionNotLegal"> + Se ha restaurado la posición de origen, puesto que dicha posición no era válida. + </notification> + <notification name="CantInviteRegionFull"> + Actualmente no puedes invitar a nadie a tu ubicación, puesto que la región está llena. Vuelve a intentarlo más tarde. + </notification> + <notification name="CantSetHomeAtRegion"> + Esta región no te permite configurar aquà tu lugar de origen. + </notification> + <notification name="ListValidHomeLocations"> + Tu 'Lugar de origen' solo se puede configurar en tu terreno o en un punto de información del continente. + </notification> + <notification name="SetHomePosition"> + Posición de origen ajustada. + </notification> + <notification name="CantDerezInventoryError"> + No se puede quitar el objeto por un error del inventario. + </notification> + <notification name="CantCreateRequestedInv"> + No se puede crear el inventario solicitado. + </notification> + <notification name="CantCreateRequestedInvFolder"> + No se puede crear la carpeta de inventario solicitada. + </notification> + <notification name="CantCreateInventory"> + No se puede crear el inventario. + </notification> + <notification name="CantCreateLandmark"> + No se puede crear un hito. + </notification> + <notification name="CantCreateOutfit"> + No se puede crear el vestuario en este momento. Prueba otra vez dentro de un minuto. + </notification> + <notification name="InventoryNotForSale"> + El inventario no está en venta. + </notification> + <notification name="CantFindInvItem"> + No se encuentra el objeto del inventario. + </notification> + <notification name="CantFindObject"> + No se puede encontrar el objeto. + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + En esta región actualmente no están activadas las transferencias de dinero a los objetos. + </notification> + <notification name="CantPayNoAgent"> + No se ha averiguado a quién se debe pagar. + </notification> + <notification name="CantDonateToPublicObjects"> + No se pueden dar L$ a los objetos públicos. + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + Error al crear un inventario de objeto del mundo virtual. + </notification> + <notification name="UserBalanceOrLandUsageError"> + Un error interno nos ha impedido actualizar tu visor correctamente. El saldo en L$ o las parcelas en propiedad presentadas en el visor podrÃan no coincidir con tu saldo real en los servidores. + </notification> + <notification name="LargePrimAgentIntersect"> + No se pueden crear prims grandes que intersectan a otros jugadores. Reinténtalo cuando se hayan movido otros jugadores. + </notification> + <notification name="PreferenceChatClearLog"> + Esto eliminará los registros de conversaciones anteriores y las copias de seguridad de ese archivo. + <usetemplate ignoretext="Confirmar antes de eliminar el registro de conversaciones anteriores." name="okcancelignore" notext="Cancelar" yestext="OK"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + Esta acción eliminará las transcripciones de todas las conversaciones anteriores. La lista de conversaciones pasadas no resultará afectada. Se eliminarán de la carpeta [FOLDER] todos los archivos que tengan el sufijo .txt y txt.backup. + <usetemplate ignoretext="Confirmar antes de eliminar transcripciones." name="okcancelignore" notext="Cancelar" yestext="OK"/> + </notification> + <notification name="PreferenceChatPathChanged"> + No se pueden mover los archivos. Ruta anterior restaurada. + <usetemplate ignoretext="No se pueden mover los archivos. Ruta anterior restaurada." name="okignore" yestext="OK"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml index 5220df5d21..c73e34b299 100644 --- a/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml @@ -26,5 +26,6 @@ <icon name="permission_edit_mine_icon" tool_tip="Este amigo puede editar, eliminar o manipular tus objetos"/> <icon name="permission_map_icon" tool_tip="Este amigo puede encontrarte en el mapa"/> <icon name="permission_online_icon" tool_tip="Este amigo puede ver cuándo estás conectado"/> + <button name="info_btn" tool_tip="Más información"/> <button name="profile_btn" tool_tip="Ver el perfil"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml index cddbad1195..a3de14ae67 100644 --- a/indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> - <text name="title_text"> - Lista de ignorados - </text> - <scroll_list name="blocked" tool_tip="Lista de los residentes ignorados actualmente"/> - <button label="Ignorar al residente..." label_selected="Ignorar al residente..." name="Block resident..." tool_tip="Elige a un Residente para ignorarle"/> - <button label="Ignorar objetos según el nombre..." label_selected="Ignorar objetos según el nombre..." name="Block object by name..."/> - <button label="No ignorar" label_selected="No ignorar" name="Unblock" tool_tip="Quita al Residente o al objeto de la lista de ignorados"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="Filtro" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="Acciones en la persona o el objeto seleccionado"/> + <menu_button name="view_btn" tool_tip="Opciones de clasificación"/> + <menu_button name="plus_btn" tool_tip="Elige un residente o un objeto para ignorarlo"/> + <button name="unblock_btn" tool_tip="Quita al Residente o al objeto de la lista de ignorados"/> + </panel> + <block_list name="blocked" tool_tip="Lista de los residentes ignorados actualmente"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/es/panel_conversation_list_item.xml new file mode 100644 index 0000000000..cc4a7e951d --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(cargando)"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/es/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..2fc8cd3aff --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="La conversación incluÃa voz"/> + <icon name="unread_ims_icon" tool_tip="Han llegado mensajes mientras no tenÃas conexión"/> + <button name="delete_btn" tool_tip="Quitar esta entrada"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_group_list_item.xml b/indra/newview/skins/default/xui/es/panel_group_list_item.xml index 5c9f1c3688..4d682068d7 100644 --- a/indra/newview/skins/default/xui/es/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/es/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="Desconocido"/> + <button name="info_btn" tool_tip="Más información"/> <button name="profile_btn" tool_tip="Ver el perfil"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml index a9d38dca25..7a7dfca0b8 100644 --- a/indra/newview/skins/default/xui/es/panel_people.xml +++ b/indra/newview/skins/default/xui/es/panel_people.xml @@ -14,81 +14,53 @@ <string name="no_filtered_friends_msg"> ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/people/[SEARCH_TERM] Buscar]. </string> - <string name="people_filter_label" value="Filtrar a la gente"/> - <string name="groups_filter_label" value="Filtrar a los grupos"/> <string name="no_filtered_groups_msg" value="¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/groups/[SEARCH_TERM] Buscar]."/> <string name="no_groups_msg" value="¿Buscas grupos en que participar? Prueba la [secondlife:///app/search/groups Búsqueda]."/> <string name="MiniMapToolTipMsg" value="[REGION](Pulsa dos veces para abrir el mapa, pulsa mayús y arrastra para obtener una panorámica)"/> <string name="AltMiniMapToolTipMsg" value="[REGION](Pulsa dos veces para teleportarte, pulsa mayús y arrastra para obtener una panorámica)"/> - <filter_editor label="Filtrar" name="filter_input"/> <tab_container name="tabs"> <panel label="CERCANA" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="Opciones"/> - <button name="add_friend_btn" tool_tip="Añadir al Residente seleccionado a la lista de tus amigos"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="Filtrar la gente" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="Acciones en la persona seleccionada"/> + <menu_button name="nearby_view_btn" tool_tip="Opciones de vista/orden"/> + <button name="add_friend_btn" tool_tip="Ofrecer amistad a un residente"/> + <dnd_button name="nearby_del_btn" tool_tip="Quitar la persona seleccionada de la lista de amigos"/> </panel> </panel> - <panel label="MIS AMIGOS" name="friends_panel"> + <panel label="AMIGOS" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="Filtrar la gente" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="Acciones en la persona seleccionada"/> + <menu_button name="friends_view_btn" tool_tip="Opciones de vista/orden"/> + <button name="friends_add_btn" tool_tip="Ofrecer amistad a un residente"/> + <dnd_button name="friends_del_btn" tool_tip="Quitar la persona seleccionada de la lista de amigos"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="Conectado"/> <accordion_tab name="tab_all" title="Todos"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="Ver más opciones"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="Ofrecer amistad a un Residente"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="Quitar a la persona seleccionada de tu lista de amigos"/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="MIS GRUPOS" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="Opciones"/> - <button name="plus_btn" tool_tip="Entrar en un grupo o crear uno"/> - <button name="activate_btn" tool_tip="Activar el grupo seleccionado"/> + <panel label="GRUPOS" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="Filtrar los grupos" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="Acciones en el grupo seleccionado"/> + <menu_button name="groups_view_btn" tool_tip="Opciones de vista/orden"/> + <menu_button name="plus_btn" tool_tip="Entrar en un grupo o crear uno"/> + <dnd_button name="minus_btn" tool_tip="Dejar el grupo seleccionado"/> </panel> </panel> <panel label="RECIENTE" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="Opciones"/> - <button name="add_friend_btn" tool_tip="Añadir al Residente seleccionado a la lista de tus amigos"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="Filtrar la gente" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="Acciones en la persona seleccionada"/> + <menu_button name="recent_view_btn" tool_tip="Opciones de vista/orden"/> + <button name="add_friend_btn" tool_tip="Ofrecer amistad a un residente"/> + <dnd_button name="recent_del_btn" tool_tip="Quitar la persona seleccionada de la lista de amigos"/> </panel> </panel> + <panel label="BLOQUEADO" name="blocked_panel"> + <panel label="Residentes y objetos ignorados" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="Perfil" name="view_profile_btn" tool_tip="Mostrar imágenes, grupos y otra información del Residente"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="MI" name="im_btn" tool_tip="Abrir una sesión de mensajes instantáneos"/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="Llamar" name="call_btn" tool_tip="Llamar a este Residente"/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="Compartir" name="share_btn" tool_tip="Compartir un objeto del inventario"/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="Teleporte" name="teleport_btn" tool_tip="Ofrecer teleporte"/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="Perfil del grupo" name="group_info_btn" tool_tip="Ver la información del grupo"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="Chat de grupo" name="chat_btn" tool_tip="Abrir el chat"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="Llamar al grupo" name="group_call_btn" tool_tip="Llama a este grupo"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml index b0b6114e88..28bc98f988 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Chat de texto" name="chat"> - <text name="font_size"> - Tamaño de la fuente: - </text> - <radio_group name="chat_font_size"> - <radio_item label="Disminuir" name="radio" value="0"/> - <radio_item label="Medio" name="radio2" value="1"/> - <radio_item label="Aumentar" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="true" label="Ejecutar la animación de escribir al hacerlo en el chat" name="play_typing_animation"/> - <check_box label="Cuando estoy desconectado, enviarme los MI al correo-e" name="send_im_to_email"/> - <check_box label="Permitir el historial de MI y chat en texto sin formato" name="plain_text_chat_history"/> - <check_box label="Bocadillos del chat" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - Mostrar los MI en: - </text> - <text name="requires_restart_label"> - (requiere reiniciar) - </text> - <radio_group name="chat_window" tool_tip="Muestra tus mensajes instantáneos en varias ventanas flotantes o en una sola con varias pestañas (requiere que reinicies)"> - <radio_item label="Ventanas distintas" name="radio" value="0"/> - <radio_item label="Pestañas" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - Permitir ventanas de chat emergentes: - </text> - <check_box label="Chats de grupo" name="EnableGroupChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje de un grupo de chat"/> - <check_box label="Chats de MI" name="EnableIMChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje instantáneo"/> - <spinner label="Duración de los interlocutores favoritos:" name="nearby_toasts_lifetime"/> - <spinner label="Tiempo de los otros interlocutores:" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="true" label="Ejecutar la animación de escribir al hacerlo en el chat" name="play_typing_animation"/> + <check_box label="Cuando estoy desconectado, enviarme los MI al correo-e" name="send_im_to_email"/> + <check_box label="Sólo pueden llamarme o mandarme un MI mis amigos y grupos" name="voice_call_friends_only_check"/> + <text name="font_size"> + Tamaño de la fuente: + </text> + <combo_box name="chat_font_size"> + <item label="Pequeña" name="Small" value="0"/> + <item label="Mediana" name="Medium" value="1"/> + <item label="Grande" name="Large" value="2"/> + </combo_box> + <check_box label="Bocadillos del chat" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + Notificaciones + </text> + <text name="friend_ims"> + MI de amigos: + </text> + <combo_box name="FriendIMOptions"> + <item label="Ventana Conversaciones abiertas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mensaje en ventana emergente" name="PopUpMessage" value="toast"/> + <item label="Botón de la barra de herramientas de Flash" name="FlashToolbarButton" value="flash"/> + <item label="Ninguno" name="None" value="ninguno"/> + </combo_box> + <text name="non_friend_ims"> + MI de no amigos: + </text> + <combo_box name="NonFriendIMOptions"> + <item label="Ventana Conversaciones abiertas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mensaje en ventana emergente" name="PopUpMessage" value="toast"/> + <item label="Botón de la barra de herramientas de Flash" name="FlashToolbarButton" value="flash"/> + <item label="Ninguno" name="None" value="ninguno"/> + </combo_box> + <text name="conference_ims"> + MI de conferencia: + </text> + <combo_box name="ConferenceIMOptions"> + <item label="Ventana Conversaciones abiertas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mensaje en ventana emergente" name="PopUpMessage" value="toast"/> + <item label="Botón de la barra de herramientas de Flash" name="FlashToolbarButton" value="flash"/> + <item label="Ninguno" name="None" value="ninguno"/> + </combo_box> + <text name="group_chat"> + Chat de grupo: + </text> + <combo_box name="GroupChatOptions"> + <item label="Ventana Conversaciones abiertas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mensaje en ventana emergente" name="PopUpMessage" value="toast"/> + <item label="Botón de la barra de herramientas de Flash" name="FlashToolbarButton" value="flash"/> + <item label="Ninguno" name="None" value="ninguno"/> + </combo_box> + <text name="nearby_chat"> + Chat: + </text> + <combo_box name="NearbyChatOptions"> + <item label="Ventana Conversaciones abiertas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mensaje en ventana emergente" name="PopUpMessage" value="toast"/> + <item label="Botón de la barra de herramientas de Flash" name="FlashToolBarButton" value="flash"/> + <item label="Ninguno" name="None" value="ninguno"/> + </combo_box> + <text name="notifications_alert"> + Para suspender provisionalmente todas las notificaciones, usa Comunicarme > No molestar. + </text> + </panel> + <panel> + <text name="play_sound"> + Reproducir sonido: + </text> + <check_box label="Nueva conversación" name="new_conversation"/> + <check_box label="Llamada de voz entrante" name="incoming_voice_call"/> + <check_box label="Oferta de teleporte" name="teleport_offer"/> + <check_box label="Oferta de inventario" name="inventory_offer"/> + </panel> + <panel> + <button label="Limpiar el registro..." name="clear_log"/> + <button label="Eliminar transcripciones..." name="delete_transcripts"/> + <button label="Examinar..." label_selected="Examinar" name="log_path_button"/> + </panel> <button label="Traducción…" name="ok_btn"/> <button label="Reemplazo automático..." name="autoreplace_showgui"/> <button label="Revisión ortográfica..." name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml index 4fc163f5b6..98b0081da9 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml @@ -69,6 +69,9 @@ <combo_box.item label="nunca" name="item4"/> </combo_box> <text name="text_box3"> - Respuesta cuando estoy en modo ocupado: + Respuesta de No molestar: </text> + <text_editor name="do_not_disturb_response"> + log_in_to_change + </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml index 9da2958953..cb061796e7 100644 --- a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="Comprar el objeto" name="Buyobject"/> <combo_box.item label="Pagar el objeto" name="Payobject"/> <combo_box.item label="Abrir" name="Open"/> + <combo_box.item label="Zoom" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 52bcab54e5..937433e210 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -128,7 +128,7 @@ Salir </string> <string name="create_account_url"> - http://join.secondlife.com/index.php?lang=es-ES&sourceid=[sourceid] + http://join.secondlife.com/?sourceid=[sourceid] </string> <string name="LoginFailedViewerNotPermitted"> Ya no puedes acceder a Second Life con el visor que estás utilizando. Visita la siguiente página para descargar un nuevo visor: @@ -610,8 +610,8 @@ Intenta iniciar sesión de nuevo en unos instantes. <string name="AvatarAway"> Ausente </string> - <string name="AvatarBusy"> - Ocupado + <string name="AvatarDoNotDisturb"> + No molestar </string> <string name="AvatarMuted"> Ignorado @@ -844,6 +844,12 @@ Intenta iniciar sesión de nuevo en unos instantes. <string name="ST_NO_JOINT"> No se puede encontrar ROOT o JOINT. </string> + <string name="NearbyChatTitle"> + Chat + </string> + <string name="NearbyChatLabel"> + (Chat) + </string> <string name="whisper"> susurra: </string> @@ -907,6 +913,9 @@ Intenta iniciar sesión de nuevo en unos instantes. <string name="ControlYourCamera"> Controlar su cámara </string> + <string name="AgentNameSubst"> + (Tú) + </string> <string name="TeleportYourAgent"> Teleportarte </string> @@ -991,18 +1000,6 @@ Intenta iniciar sesión de nuevo en unos instantes. <string name="dictionary_files"> Diccionarios </string> - <string name="AvatarSetNotAway"> - Salir del estado ausente - </string> - <string name="AvatarSetAway"> - Pasar al estado ausente - </string> - <string name="AvatarSetNotBusy"> - Salir del estado ocupado - </string> - <string name="AvatarSetBusy"> - Pasar al estado ocupado - </string> <string name="shape"> Forma </string> @@ -1959,8 +1956,8 @@ Intenta iniciar sesión de nuevo en unos instantes. <string name="PanelContentsNewScript"> Script nuevo </string> - <string name="BusyModeResponseDefault"> - El Residente al que has enviado un mensaje ha solicitado que no se le moleste porque está en modo ocupado. Podrá ver tu mensaje más adelante, ya que éste aparecerá en su panel de MI. + <string name="DoNotDisturbModeResponseDefault"> + Este residente tiene activado 'No molestar' y verá tu mensaje más tarde. </string> <string name="MuteByName"> (Por el nombre) @@ -2073,9 +2070,6 @@ Intenta iniciar sesión de nuevo en unos instantes. <string name="GroupMoneyDate"> [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] </string> - <string name="ViewerObjectContents"> - Contenidos - </string> <string name="AcquiredItems"> ArtÃculos adquiridos </string> @@ -3793,7 +3787,7 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. Región General </string> <string name="LocationCtrlSeeAVsTooltip"> - Los avatares están visibles y está permitido el chat fuera de esta parcela + Los avatares que están en esta parcela no pueden ser vistos ni escuchados por los que están fuera de ella </string> <string name="LocationCtrlPathfindingDirtyTooltip"> Los objetos que se mueven pueden presentar un comportamiento incorrecto en la región hasta que ésta se recargue. @@ -3867,6 +3861,12 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="Saved_message"> (Guardado [LONG_TIMESTAMP]) </string> + <string name="OnlineStatus"> + Conectado/a + </string> + <string name="OfflineStatus"> + Desconectado/a + </string> <string name="answered_call"> Han respondido a tu llamada </string> @@ -3876,6 +3876,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="you_joined_call"> Has entrado en la llamada de voz </string> + <string name="you_auto_rejected_call-im"> + Rechazaste la llamada de voz automáticamente porque estaba activado 'No molestar'. + </string> <string name="name_started_call"> [NAME] inició una llamada de voz </string> @@ -3888,6 +3891,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="hang_up-im"> Se colgó la llamada de voz </string> + <string name="conference-title"> + Chat multi-persona + </string> <string name="conference-title-incoming"> Conferencia con [AGENT_NAME] </string> @@ -4766,6 +4772,9 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas <string name="Command_Chat_Label"> Chat </string> + <string name="Command_Conversations_Label"> + Conversaciones + </string> <string name="Command_Compass_Label"> Brújula </string> @@ -4841,6 +4850,9 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas <string name="Command_Chat_Tooltip"> Habla por chat de texto con las personas próximas </string> + <string name="Command_Conversations_Tooltip"> + Conversar con todos + </string> <string name="Command_Compass_Tooltip"> Brújula </string> @@ -4970,4 +4982,13 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas <string name="UserDictionary"> [Usuario] </string> + <string name="logging_calls_disabled_log_empty"> + No se están registrando las conversaciones. Para empezar a grabar un registro, elige "Guardar: Solo registro" o "Guardar: Registro y transcripciones" en Preferencias > Chat. + </string> + <string name="logging_calls_disabled_log_not_empty"> + No se registrarán más conversaciones. Para reanudar la grabación de un registro, elige "Guardar: Solo registro" o "Guardar: Registro y transcripciones" en Preferencias > Chat. + </string> + <string name="logging_calls_enabled_log_empty"> + No hay conversaciones grabadas. Después de contactar con una persona, o de que alguien contacte contigo, aquà se mostrará una entrada de registro. + </string> </strings> diff --git a/indra/newview/skins/default/xui/fr/floater_conversation_log.xml b/indra/newview/skins/default/xui/fr/floater_conversation_log.xml new file mode 100644 index 0000000000..e9017c79b1 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="JOURNAL DES CONVERSATIONS"> + <panel name="buttons_panel"> + <filter_editor label="Filtrer les personnes" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="Options d'affichage/de tri"/> + <menu_button name="conversations_gear_btn" tool_tip="Actions sur la personne ou le groupe sélectionné"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_conversation_preview.xml b/indra/newview/skins/default/xui/fr/floater_conversation_preview.xml new file mode 100644 index 0000000000..9a486a84c6 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="CONVERSATION:"> + <floater.string name="Title"> + CONVERSATION: [NAME] + </floater.string> + <text name="page_label" value="Page"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_im_container.xml b/indra/newview/skins/default/xui/fr/floater_im_container.xml index 5ea073365e..f0b17e8437 100644 --- a/indra/newview/skins/default/xui/fr/floater_im_container.xml +++ b/indra/newview/skins/default/xui/fr/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="CONVERSATIONS"/> +<multi_floater name="floater_im_box" title="CONVERSATIONS"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="Options d'affichage/de tri"/> + <button name="add_btn" tool_tip="Commencer une nouvelle conversation"/> + <button name="speak_btn" tool_tip="Parler aux personnes en utilisant votre micro"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="Réduire/Développer cette liste"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="Réduire ce panneau"/> + <text name="stub_textbox"> + Cette conversation s'affiche dans une fenêtre distincte. [secondlife:/// la rattacher.] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/fr/floater_im_session.xml b/indra/newview/skins/default/xui/fr/floater_im_session.xml index 516eb41362..8ab98b8e4e 100644 --- a/indra/newview/skins/default/xui/fr/floater_im_session.xml +++ b/indra/newview/skins/default/xui/fr/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="À" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] a été invité à la conversation."/> + <floater.string name="multiple_participants_added" value="[NAME] ont été invités à la conversation."/> + <floater.string name="tooltip_to_separate_window" value="Déplacer cette conversation dans une fenêtre distincte"/> + <floater.string name="tooltip_to_main_window" value="Replacer cette conversation dans la fenêtre principale"/> + <floater.string name="start_call_button_tooltip" value="Ouvrir une connexion vocale"/> + <floater.string name="end_call_button_tooltip" value="Fermer la connexion vocale"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="Réduire ce panneau"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="Réduire la liste des participants"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="Développer la liste des participants"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="Options d'affichage/de tri"/> + <menu_button name="gear_btn" tool_tip="Actions sur la personne sélectionnée"/> + <button name="add_btn" tool_tip="Ajouter un participant à cette conversation"/> + <button name="voice_call_btn" tool_tip="Ouvrir une connexion vocale"/> + <button name="close_btn" tool_tip="Mettre fin à cette conversation"/> + <button name="expand_collapse_btn" tool_tip="Réduire/Développer ce panneau"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Traduire le chat" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="À" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="Affiche/Masque le panneau des messages"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_incoming_call.xml b/indra/newview/skins/default/xui/fr/floater_incoming_call.xml index 7594eec5f2..9e6946ba9e 100644 --- a/indra/newview/skins/default/xui/fr/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/fr/floater_incoming_call.xml @@ -10,7 +10,7 @@ anonyme </floater.string> <floater.string name="VoiceInviteP2P"> - appelle. + vous appelle. </floater.string> <floater.string name="VoiceInviteAdHoc"> a rejoint un chat vocal avec conférence. @@ -25,9 +25,9 @@ Voulez-vous quitter [CURRENT_CHAT] et rejoindre ce chat vocal ? </floater.string> <text name="question"> - Voulez-vous quitter [CURRENT_CHAT] et rejoindre ce chat vocal ? + Si vous répondez, vous serez déconnecté de votre conversation vocale actuelle. </text> - <button label="Accepter" label_selected="Accepter" name="Accept"/> - <button label="Refuser" label_selected="Refuser" name="Reject"/> - <button label="Lancer IM" name="Start IM"/> + <button label="Répondre" label_selected="Répondre" name="Accept"/> + <button label="Ignorer" label_selected="Ignorer" name="Reject"/> + <button label="Ouvrir IM à la place" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/fr/floater_pathfinding_console.xml index 02d969dc08..0bcf55aba5 100644 --- a/indra/newview/skins/default/xui/fr/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/fr/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Afficher : </text> - <check_box label="Monde" name="show_world"/> + <check_box label="Test" name="show_world"/> <check_box label="Mobiles uniquement" name="show_world_movables_only"/> <check_box label="Maillage de navigation" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml index f86c1a4217..eace67026c 100644 --- a/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml @@ -20,7 +20,7 @@ <button label="Vierge" label_selected="Vierge" name="Blank" width="60"/> <button label="Aucune" label_selected="Aucune" left="68" name="None" width="60"/> <button bottom="-240" label="" label_selected="" name="Pipette"/> - <check_box initial_value="true" label="Aperçu direct" name="apply_immediate_check"/> + <check_box initial_value="true" label="Appliquer maintenant" name="apply_immediate_check"/> <text name="preview_disabled" value="Aperçu désactivé"/> <filter_editor label="Filtrer les textures" name="inventory search editor"/> <check_box initial_value="false" label="Afficher les dossiers" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/fr/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/fr/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..f4f452eea7 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="VOLUME DU CHAT VOCAL"> + <slider label="Chat vocal" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_voice_effect.xml b/indra/newview/skins/default/xui/fr/floater_voice_effect.xml index 671fb5c14d..f9a76d127e 100644 --- a/indra/newview/skins/default/xui/fr/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/fr/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Endroits" name="voice_effects" title="EFFET DE VOIX"> +<floater label="Endroits" name="voice_effects" title="APERÇU DES EFFETS DE VOIX"> <string name="no_voice_effect"> (Aucun effet de voix) </string> diff --git a/indra/newview/skins/default/xui/fr/floater_voice_volume.xml b/indra/newview/skins/default/xui/fr/floater_voice_volume.xml new file mode 100644 index 0000000000..bf91a5bb79 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="VOLUME DE LA VOIX"> + <slider name="volume_slider" tool_tip="Volume de la voix" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/menu_cof_gear.xml b/indra/newview/skins/default/xui/fr/menu_cof_gear.xml index 8276d57025..fea0486d8a 100644 --- a/indra/newview/skins/default/xui/fr/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/fr/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear COF"> +<toggleable_menu name="Gear COF"> <menu label="Nouveaux habits" name="COF.Gear.New_Clothes"/> - <menu label="Nouvelles parties du corps" name="COF.Geear.New_Body_Parts"/> -</menu> + <menu label="Nouvelles parties du corps" name="COF.Gear.New_Body_Parts"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_conversation.xml b/indra/newview/skins/default/xui/fr/menu_conversation.xml new file mode 100644 index 0000000000..857ead603b --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="Fermer la conversation" name="close_conversation"/> + <menu_item_call label="Ouvrir une conversation vocale" name="open_voice_conversation"/> + <menu_item_call label="Se déconnecter de la conversation et du canal vocal" name="disconnect_from_voice"/> + <menu_item_call label="Voir le profil" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Proposer une téléportation." name="offer_teleport"/> + <menu_item_call label="Appel" name="voice_call"/> + <menu_item_call label="Historique du chat..." name="chat_history"/> + <menu_item_call label="Devenir amis" name="add_friend"/> + <menu_item_call label="Supprimer cet ami" name="remove_friend"/> + <menu_item_call label="Supprimer ces amis" name="remove_friends"/> + <menu_item_call label="Inviter dans le groupe..." name="invite_to_group"/> + <menu_item_call label="Zoomer en avant" name="zoom_in"/> + <menu_item_call label="Carte" name="map"/> + <menu_item_call label="Partager" name="share"/> + <menu_item_call label="Payer" name="pay"/> + <menu_item_check label="Bloquer le chat vocal" name="block_unblock"/> + <menu_item_check label="Ignorer le texte" name="MuteText"/> + <menu_item_call label="Profil du groupe" name="group_profile"/> + <menu_item_call label="Activer le groupe" name="activate_group"/> + <menu_item_call label="Quitter le groupe" name="leave_group"/> + <context_menu label="Options du modérateur" name="Moderator Options"> + <menu_item_check label="Autoriser les chats écrits" name="AllowTextChat"/> + <menu_item_call label="Ignorer ce participant" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Ne plus ignorer ce participant" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Ignorer les autres" name="ModerateVoiceMute"/> + <menu_item_call label="Ne plus ignorer les autres" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/fr/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..4e7e84199d --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="IM..." name="IM"/> + <menu_item_call label="Appel..." name="Call"/> + <menu_item_call label="Ouvrir l'historique du chat..." name="Chat history"/> + <menu_item_call label="Voir le profil" name="View Profile"/> + <menu_item_call label="Téléporter" name="teleport"/> + <menu_item_call label="Devenir amis" name="add_friend"/> + <menu_item_call label="Supprimer cet ami" name="remove_friend"/> + <menu_item_call label="Inviter dans le groupe..." name="Invite"/> + <menu_item_call label="Carte" name="Map"/> + <menu_item_call label="Partager" name="Share"/> + <menu_item_call label="Payer" name="Pay"/> + <menu_item_check label="Ignorer/Ne plus ignorer" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/fr/menu_conversation_log_view.xml new file mode 100644 index 0000000000..c515a8e8e5 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="Trier par nom" name="sort_by_name"/> + <menu_item_check label="Trier par date" name="sort_by_date"/> + <menu_item_check label="Trier avec les amis en haut" name="sort_by_friends"/> + <menu_item_call label="Afficher l'historique du Chat près de moi" name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_im_conversation.xml b/indra/newview/skins/default/xui/fr/menu_im_conversation.xml new file mode 100644 index 0000000000..1ec5910c8f --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="Voir le profil" name="View Profile"/> + <menu_item_call label="Devenir amis" name="Add Friend"/> + <menu_item_call label="Supprimer cet ami" name="remove_friend"/> + <menu_item_call label="Proposer une téléportation." name="offer_teleport"/> + <menu_item_call label="Inviter dans le groupe..." name="invite_to_group"/> + <menu_item_call label="Historique du chat..." name="chat_history"/> + <menu_item_call label="Zoomer en avant" name="zoom_in"/> + <menu_item_call label="Carte" name="map"/> + <menu_item_call label="Partager" name="Share"/> + <menu_item_call label="Payer" name="Pay"/> + <menu_item_check label="Bloquer le chat vocal" name="Block/Unblock"/> + <menu_item_check label="Ignorer le texte" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/fr/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..03a091d1cc --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="Vue compacte" name="compact_view"/> + <menu_item_check label="Vue développée" name="expanded_view"/> + <menu_item_check label="Afficher l’heure" name="IMShowTime"/> + <menu_item_check label="Afficher les noms dans les conversations privées" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_object_icon.xml b/indra/newview/skins/default/xui/fr/menu_object_icon.xml index 69f8e88a0d..7c94930160 100644 --- a/indra/newview/skins/default/xui/fr/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/fr/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="Profil de l'objet..." name="Object Profile"/> <menu_item_call label="Ignorer..." name="Block"/> + <menu_item_call label="Voir sur la carte" name="show_on_map"/> + <menu_item_call label="Me téléporter à l’emplacement de l'objet" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml b/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml index b5181f4f82..21b19eded6 100644 --- a/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="Nouveaux cheveux" name="New Hair"/> <menu_item_call label="Nouveaux yeux" name="New Eyes"/> </menu> + <menu_item_call label="Développer tous les dossiers" name="expand"/> + <menu_item_call label="Réduire tous les dossiers" name="collapse"/> <menu_item_call label="Renommer la tenue" name="rename"/> <menu_item_call label="Supprimer la tenue" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_participant_view.xml b/indra/newview/skins/default/xui/fr/menu_participant_view.xml new file mode 100644 index 0000000000..1811082c84 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="Trier les conversations par type" name="sort_sessions_by_type"/> + <menu_item_check label="Trier les conversations par nom" name="sort_sessions_by_name"/> + <menu_item_check label="Trier les conversations par activité récente" name="sort_sessions_by_recent"/> + <menu_item_check label="Trier les participants par nom" name="sort_participants_by_name"/> + <menu_item_check label="Trier les participants par activité récente" name="sort_participants_by_recent"/> + <menu_item_call label="Préférences pour le chat..." name="chat_preferences"/> + <menu_item_call label="Préférences pour la confidentialité" name="privacy_preferences"/> + <menu_item_check label="Journal des conversations..." name="Conversation"/> + <menu_item_check label="Traduire le Chat près de moi" name="Translate_chat"/> + <menu_item_check label="Paramètres de traduction" name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/fr/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..47589572c2 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="Ne plus ignorer" name="unblock"/> + <menu_item_call label="Profil..." name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/fr/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..79880dd16d --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="Ignorer un résident par son nom…" name="block_resident_by_name"/> + <menu_item_call label="Ignorer un objet par son nom" name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/fr/menu_people_blocked_view.xml new file mode 100644 index 0000000000..13f1575090 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="Trier par nom" name="sort_by_name"/> + <menu_item_check label="Trier par type" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_friends_view.xml b/indra/newview/skins/default/xui/fr/menu_people_friends_view.xml new file mode 100644 index 0000000000..cc81172462 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Trier par nom" name="sort_name"/> + <menu_item_check label="Trier par statut" name="sort_status"/> + <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/> + <menu_item_check label="Afficher les droits octroyés" name="view_permissions"/> + <menu_item_check label="Afficher le journal des conversations..." name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_groups.xml b/indra/newview/skins/default/xui/fr/menu_people_groups.xml index eb51b4cf7e..8e32f065fa 100644 --- a/indra/newview/skins/default/xui/fr/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/fr/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="Afficher les infos" name="View Info"/> <menu_item_call label="Chat" name="Chat"/> - <menu_item_call label="Appeler" name="Call"/> + <menu_item_call label="Appel" name="Call"/> <menu_item_call label="Activer" name="Activate"/> <menu_item_call label="Quitter" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_groups_view.xml b/indra/newview/skins/default/xui/fr/menu_people_groups_view.xml new file mode 100644 index 0000000000..79ede5e22d --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Afficher les icônes des groupes" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby.xml index 26bd3978a9..6f7d02ef74 100644 --- a/indra/newview/skins/default/xui/fr/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/fr/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="Voir le profil" name="View Profile"/> - <menu_item_call label="Devenir amis" name="Add Friend"/> - <menu_item_call label="Supprimer cet ami" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="Appeler" name="Call"/> - <menu_item_call label="Carte" name="Map"/> - <menu_item_call label="Partager" name="Share"/> - <menu_item_call label="Payer" name="Pay"/> - <menu_item_check label="Ignorer/Ne plus ignorer" name="Block/Unblock"/> - <menu_item_call label="Proposer une téléportation" name="teleport"/> + <menu_item_call label="Voir le profil" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Téléporter" name="offer_teleport"/> + <menu_item_call label="Appel" name="voice_call"/> + <menu_item_call label="Afficher l'historique du chat..." name="chat_history"/> + <menu_item_call label="Devenir amis" name="add_friend"/> + <menu_item_call label="Supprimer cet ami" name="remove_friend"/> + <menu_item_call label="Inviter dans le groupe..." name="invite_to_group"/> + <menu_item_call label="Zoomer en avant" name="zoom_in"/> + <menu_item_call label="Carte" name="map"/> + <menu_item_call label="Partager" name="share"/> + <menu_item_call label="Payer" name="pay"/> + <menu_item_check label="Ignorer/Ne plus ignorer" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml index 8400ec0a14..37abf831c2 100644 --- a/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="Devenir amis" name="Add Friends"/> - <menu_item_call label="Supprimer des amis" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="Appeler" name="Call"/> - <menu_item_call label="Partager" name="Share"/> - <menu_item_call label="Payer" name="Pay"/> - <menu_item_call label="Proposer une téléportation" name="teleport"/> + <menu_item_call label="Devenir amis" name="add_friends"/> + <menu_item_call label="Supprimer des amis" name="remove_friends"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Appeler" name="call"/> + <menu_item_call label="Partager" name="share"/> + <menu_item_call label="Payer" name="pay"/> + <menu_item_call label="Téléporter" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby_view.xml new file mode 100644 index 0000000000..086002dce5 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Trier par intervenants récents" name="sort_by_recent_speakers"/> + <menu_item_check label="Trier par nom" name="sort_name"/> + <menu_item_check label="Trier par distance" name="sort_distance"/> + <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/> + <menu_item_check label="Afficher la carte" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_people_recent_view.xml b/indra/newview/skins/default/xui/fr/menu_people_recent_view.xml new file mode 100644 index 0000000000..a7d698ab7c --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Trier en commençant par le plus récent" name="sort_most"/> + <menu_item_check label="Trier par nom" name="sort_name"/> + <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_agent.xml b/indra/newview/skins/default/xui/fr/menu_url_agent.xml index 5ed627fbc3..d701b3a414 100644 --- a/indra/newview/skins/default/xui/fr/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/fr/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Voir le profil du résident" name="show_agent"/> + <menu_item_call label="Voir le profil" name="show_agent"/> + <menu_item_call label="Envoyer IM..." name="send_im"/> + <menu_item_call label="Devenir amis..." name="add_friend"/> <menu_item_call label="Copier le nom dans le presse-papiers" name="url_copy_label"/> <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_objectim.xml b/indra/newview/skins/default/xui/fr/menu_url_objectim.xml index f581c3ef9d..0a934d3e69 100644 --- a/indra/newview/skins/default/xui/fr/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/fr/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Afficher les informations sur l'objet" name="show_object"/> + <menu_item_call label="Profil de l'objet…" name="show_object"/> <menu_item_call label="Voir sur la carte" name="show_on_map"/> <menu_item_call label="Me téléporter à l'emplacement de l'objet" name="teleport_to_object"/> <menu_item_call label="Copier le nom de l'objet dans le presse-papiers" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index 24bd6a2a95..49122a0f6d 100644 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="Arrêter mon animation" name="Stop Animating My Avatar"/> <menu_item_call label="Marcher / Courir / Voler..." name="Walk / run / fly"/> </menu> - <menu label="Statut" name="Status"> - <menu_item_call label="Absent" name="Set Away"/> - <menu_item_call label="Occupé" name="Set Busy"/> - </menu> + <menu label="Statut" name="Status"/> <menu_item_call label="Acheter des L$..." name="Buy and Sell L$"/> <menu_item_call label="Boîte d'envoi vendeur..." name="MerchantOutbox"/> <menu_item_call label="Page d'accueil du compte..." name="Manage My Account"> @@ -32,14 +29,18 @@ <menu_item_call label="Quitter [APP_NAME]" name="Quit"/> </menu> <menu label="Communiquer" name="Communicate"> - <menu_item_check label="Chat..." name="Nearby Chat"/> + <menu_item_check label="Conversations..." name="Conversations"/> + <menu_item_check label="Chat près de moi..." name="Nearby Chat"/> <menu_item_check label="Parler" name="Speak"/> - <menu_item_check label="Paramètres vocaux..." name="Nearby Voice"/> - <menu_item_check label="Effet de voix..." name="ShowVoice"/> + <menu label="Effet de voix" name="VoiceMorphing"> + <menu_item_check label="Aucun effet de voix" name="NoVoiceMorphing"/> + <menu_item_check label="Aperçu..." name="Preview"/> + <menu_item_call label="S'abonner..." name="Subscribe"/> + </menu> <menu_item_check label="Gestes..." name="Gestures"/> - <menu_item_call label="Amis" name="My Friends"/> - <menu_item_call label="Groupes" name="My Groups"/> - <menu_item_call label="Personnes près de vous" name="Active Speakers"/> + <menu_item_check label="Amis" name="My Friends"/> + <menu_item_check label="Groupes" name="My Groups"/> + <menu_item_check label="Personnes près de vous" name="Active Speakers"/> <menu_item_call label="Liste des ignorés" name="Block List"/> </menu> <menu label="Monde" name="World"> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index 30154d1873..e73cc6e6e0 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -515,6 +515,24 @@ Consulter [_URL] pour en savoir plus ? </url> <usetemplate ignoretext="Mon pilote graphique est obsolète." name="okcancelignore" notext="Non" yestext="Oui"/> </notification> + <notification name="AMDOldDriver"> + Il existe probablement un pilote plus récent pour votre puce graphique. La mise à jour des pilotes graphiques est susceptible d'améliorer considérablement les performances. + + Visiter la page [_URL] pour rechercher d'éventuelles mises à jour de pilotes ? + <url name="url"> + http://support.amd.com/us/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="Mon pilote graphique est obsolète." name="okcancelignore" notext="Non" yestext="Oui"/> + </notification> + <notification name="NVIDIAOldDriver"> + Il existe probablement un pilote plus récent pour votre puce graphique. La mise à jour des pilotes graphiques est susceptible d'améliorer considérablement les performances. + + Visiter la page [_URL] pour rechercher d'éventuelles mises à jour de pilotes ? + <url name="url"> + http://www.nvidia.com/Download/index.aspx?lang=fr + </url> + <usetemplate ignoretext="Mon pilote graphique est obsolète." name="okcancelignore" notext="Non" yestext="Oui"/> + </notification> <notification name="UnknownGPU"> Votre système contient une carte graphique que [APP_NAME] ne reconnaît pas. Cela est souvent le cas avec le nouveau matériel qui n'a pas encore été testé avec [APP_NAME]. Cela ne posera probablement pas de problème, mais vous devrez peut-être ajuster vos paramètres graphiques. @@ -1543,10 +1561,13 @@ Quitter le groupe ? Impossible de proposer votre amitié actuellement. Veuillez réessayer dans un moment. <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="BusyModeSet"> - Le mode Occupé est sélectionné. -Les chats et les messages instantanés ne s'afficheront pas. Les messages instantanés génèreront la réponse en mode occupé que vous avez créée. Toutes les offres de téléportation seront refusées. Toutes les offres d'inventaire iront dans la corbeille. - <usetemplate ignoretext="Je change mon statut en mode Occupé" name="okignore" yestext="OK"/> + <notification name="DoNotDisturbModeSet"> + Ne pas déranger est activé. Vous ne recevrez pas les notifications de communications entrantes. + +- Les autres résidents recevront votre réponse Ne pas déranger (définie dans Préférences > Général). +- Toutes les offres de téléportation seront refusées. +- Les appels vocaux seront refusés. + <usetemplate ignoretext="J'ai changé mon statut et suis désormais en mode Ne pas déranger." name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> Vous avez atteint le nombre de groupes maximum. Avant de pouvoir rejoindre ce groupe, vous devez en quitter un ou refuser cette offre. @@ -2033,6 +2054,10 @@ Déplacer les objets de l'inventaire ? Accéder à votre [http://secondlife.com/account/ Page d'accueil] pour consulter l'historique de votre compte ? <usetemplate ignoretext="Lancer mon navigateur pour consulter l'historique de mon compte" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + Quand vous ajoutez une personne à une conversation existante, une nouvelle conversation est créée. Tous les participants recevront les notifications de nouvelle conversation. + <usetemplate ignoretext="Confirmer l'ajout de participants au chat" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> <notification name="ConfirmQuit"> Êtes-vous certain de vouloir quitter ? <usetemplate ignoretext="Confirmer avant de quitter" name="okcancelignore" notext="Ne pas quitter" yestext="Quitter"/> @@ -2107,14 +2132,14 @@ Voulez-vous le remplacer par l'objet sélectionné ? <button ignore="Ne jamais remplacer" name="No" text="Annuler"/> </form> </notification> - <notification label="Réponse si occupé(e)" name="BusyModePay"> - Vous êtes en mode occupé et vous ne recevrez donc aucun objet en échange de ce paiement. + <notification label="Avertissement de mode Ne pas déranger" name="DoNotDisturbModePay"> + Vous avez activé Ne pas déranger. Vous ne recevrez aucun article proposé en échange de ce paiement. -Souhaitez-vous quitter le mode occupé avant de terminer cette transaction ? +Voulez-vous désactiver Ne pas déranger avant de terminer cette transaction ? <form name="form"> - <ignore name="ignore" save_option="true" text="Je suis sur le point de payer une personne ou un objet mais suis en mode Occupé"/> - <button ignore="Toujours quitter le mode occupé" name="Yes" text="OK"/> - <button ignore="Ne jamais quitter le mode occupé" name="No" text="Annuler"/> + <ignore name="ignore" text="Je suis sur le point de payer une personne ou un objet mais suis en mode Ne pas déranger"/> + <button ignore="Toujours quitter le mode Ne pas déranger" name="Yes" text="OK"/> + <button ignore="Ne jamais quitter le mode Ne pas déranger" name="No" text="Annuler"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2249,11 +2274,8 @@ Liez-la à partir d'une page web pour permettre aux autres résidents d&apo <notification name="GroupNotice"> Sujet : [SUBJECT], Message : [MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> est en ligne - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> est hors ligne + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> est [STATUS] </notification> <notification name="AddSelfFriend"> Même si vous êtes extrêmement sympathique, vous ne pouvez pas devenir ami avec vous-même. @@ -2482,13 +2504,6 @@ Vous ne pouvez pas voler ici. <notification name="DynamicPathfindingDisabled"> La recherche de chemin dynamique n'est pas activée dans cette région. Il se peut que les objets scriptés utilisant des appels LSL de recherche de chemin ne fonctionnent pas comme prévu pour cette région. </notification> - <notification name="PathfindingRebakeNavmesh"> - La modification de certains objets de cette région risque d'entraîner un comportement incorrect des autres objets mobiles. Pour que les objets mobiles se comportent correctement, cliquez sur Refiger la région. Pour plus d'informations, choisissez Aide. - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="Aide" ignoretext="La modification de certains objets de cette région risque d'entraîner un comportement incorrect des autres objets mobiles." name="okhelpignore" yestext="OK"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> Une erreur est survenue. Un problème réseau ou serveur s'est peut-être produit ou vous ne disposez pas de droits de construction. Se déconnecter puis se reconnecter permet parfois de résoudre le problème. <usetemplate name="okbutton" yestext="OK"/> @@ -2751,7 +2766,7 @@ Acceptez-vous ? <notification name="ScriptQuestionCaution"> Avertissement : l'objet <nolink>[OBJECTNAME]</nolink> souhaite un accès total à votre compte en Linden dollars. Si vous autorisez cet accès, il pourra supprimer des fonds de votre compte à tout moment ou le vider entièrement de façon continue sans avis préalable. -Il est rare qu'une telle demande soit légitime. N'autorisez pas cet accès si vous ne comprenez pas entièrement pourquoi l'objet souhaite accéder à votre compte. +N'autorisez pas cet accès si vous ne comprenez pas entièrement pourquoi l'objet souhaite accéder à votre compte. <form name="form"> <button name="Grant" text="Permettre un accès total"/> <button name="Deny" text="Refuser"/> @@ -3332,4 +3347,633 @@ Désactivation des mises à jour futures de ce fichier... Vous allez supprimer [NUM_ITEMS] articles. Voulez-vous vraiment continuer ? <usetemplate ignoretext="Voulez-vous vraiment supprimer plusieurs articles ?" name="okcancelignore" notext="Non" yestext="Oui"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] vous a figé. Vous ne pouvez pas bouger ni interagir avec le monde. + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] vous a figé pour une durée de [AV_FREEZE_TIME] secondes. Vous ne pouvez pas bouger ni interagir avec le monde. + </notification> + <notification name="YouFrozeAvatar"> + Avatar figé. + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] vous a libéré. + </notification> + <notification name="AvatarUnFrozen"> + Avatar libéré. + </notification> + <notification name="AvatarFreezeFailure"> + Vous n'avez pas pu figer ce que vous vouliez car vous ne disposez pas des droits d'admin pour cette parcelle. + </notification> + <notification name="AvatarFreezeThaw"> + Vous n'êtes plus figé, vous pouvez reprendre votre vie. + </notification> + <notification name="AvatarCantFreeze"> + Impossible de figer cet utilisateur. + </notification> + <notification name="NowOwnObject"> + Vous êtes désormais le propriétaire de l'objet [OBJECT_NAME]. + </notification> + <notification name="CantRezOnLand"> + Impossible de rezzer l'objet à [OBJECT_POS] car le propriétaire de ce terrain de l'autorise pas. Utilisez l'outil Terrain pour voir à qui appartiennent les terrains. + </notification> + <notification name="RezFailTooManyRequests"> + Impossible de rezzer l'objet car il y a trop de demandes. + </notification> + <notification name="SitFailCantMove"> + Vous ne pouvez pas vous asseoir car vous ne pouvez actuellement pas bouger. + </notification> + <notification name="SitFailNotAllowedOnLand"> + Vous ne pouvez pas vous asseoir car votre présence sur ce terrain n'est pas autorisée. + </notification> + <notification name="SitFailNotSameRegion"> + Essayez de vous rapprocher. Impossible de vous asseoir sur l'objet car +il ne se trouve pas dans la même région que vous. + </notification> + <notification name="NoNewObjectRegionFull"> + Création d'un nouvel objet impossible. La région est pleine. + </notification> + <notification name="FailedToPlaceObject"> + Échec du placement de l'objet à l'emplacement spécifié. Veuillez réessayer. + </notification> + <notification name="NoOwnNoGardening"> + Vous ne pouvez pas créer d'arbres ni d'herbe sur un terrain qui ne vous appartient pas. + </notification> + <notification name="NoCopyPermsNoObject"> + Échec de la copie car vous ne disposez pas des droits requis pour copier l'objet [OBJ_NAME]. + </notification> + <notification name="NoTransPermsNoObject"> + Échec de la copie car l'objet [OBJ_NAME] ne peut pas vous être transféré. + </notification> + <notification name="AddToNavMeshNoCopy"> + Échec de la copie car l'objet [OBJ_NAME] contribue au maillage de navigation. + </notification> + <notification name="DupeWithNoRootsSelected"> + Dupliquer sans objet racine sélectionné + </notification> + <notification name="CantDupeCuzRegionIsFull"> + Impossible de dupliquer les objets car la région est pleine. + </notification> + <notification name="CantDupeCuzParcelNotFound"> + Impossible de dupliquer les objets - la parcelle sur laquelle ils sont est introuvable. + </notification> + <notification name="CantCreateCuzParcelFull"> + Création de l'objet impossible car +la parcelle est pleine. + </notification> + <notification name="RezAttemptFailed"> + Échec d'une tentative pour rezzer un objet. + </notification> + <notification name="ToxicInvRezAttemptFailed"> + Impossible de créer l'article qui a provoqué des problèmes pour cette région. + </notification> + <notification name="InvItemIsBlacklisted"> + Cet article d'inventaire a été placé sur liste noire. + </notification> + <notification name="NoCanRezObjects"> + Vous n'êtes actuellement pas autorisé à créer des objets. + </notification> + <notification name="LandSearchBlocked"> + Recherche de terrain bloquée. +Vous avez effectué trop de recherches de terrain trop rapidement. +Veuillez réessayer dans une minute. + </notification> + <notification name="NotEnoughResourcesToAttach"> + Ressources de script insuffisantes pour attacher cet objet. + </notification> + <notification name="YouDiedAndGotTPHome"> + Vous êtes mort et avez été téléporté à votre domicile. + </notification> + <notification name="EjectComingSoon"> + Votre présence ici n'est plus autorisée et vous disposez de [EJECT_TIME] secondes pour partir. + </notification> + <notification name="NoEnterServerFull"> + Vous ne pouvez pas pénétrer dans cette région car +le serveur est plein. + </notification> + <notification name="SaveBackToInvDisabled"> + Le réenregistrement dans l'inventaire a été désactivé. + </notification> + <notification name="NoExistNoSaveToContents"> + Impossible d'enregistrer [OBJ_NAME] dans le contenu des objets car l'objet à partir duquel il a été rezzé n'existe plus. + </notification> + <notification name="NoModNoSaveToContents"> + Impossible d'enregistrer [OBJ_NAME] dans le contenu des objets car vous ne disposez pas des droits requis pour modifier l'objet [DEST_NAME]. + </notification> + <notification name="NoSaveBackToInvDisabled"> + Impossible de réenregistrer [OBJ_NAME] dans l'inventaire -- cette opération a été désactivée. + </notification> + <notification name="NoCopyNoSelCopy"> + Vous ne pouvez pas copier votre sélection car vous n'avez pas le droit de copier l'objet [OBJ_NAME]. + </notification> + <notification name="NoTransNoSelCopy"> + Vous ne pouvez pas copier votre sélection car l'objet [OBJ_NAME] n'est pas transférable. + </notification> + <notification name="NoTransNoCopy"> + Vous ne pouvez pas copier votre sélection car l'objet [OBJ_NAME] n'est pas transférable. + </notification> + <notification name="NoPermsNoRemoval"> + La suppression de l'objet [OBJ_NAME] du simulateur n'est pas autorisée par le système de droits. + </notification> + <notification name="NoModNoSaveSelection"> + Vous ne pouvez pas enregistrer votre sélection car vous n'avez pas le droit de modifier l'objet [OBJ_NAME]. + </notification> + <notification name="NoCopyNoSaveSelection"> + Vous ne pouvez pas enregistrer votre sélection car l'objet [OBJ_NAME] ne peut pas être copié. + </notification> + <notification name="NoModNoTaking"> + Vous ne pouvez pas prendre votre sélection car vous n'avez pas le droit de modifier l'objet [OBJ_NAME]. + </notification> + <notification name="RezDestInternalError"> + Erreur interne : type de destination inconnue. + </notification> + <notification name="DeleteFailObjNotFound"> + Échec de la suppression car l'objet est introuvable + </notification> + <notification name="SorryCantEjectUser"> + Exclusion de cet utilisateur impossible. + </notification> + <notification name="RegionSezNotAHome"> + Cette région ne vous permet pas d'y définir votre domicile. + </notification> + <notification name="HomeLocationLimits"> + Vous ne pouvez définir votre domicile que sur votre terrain ou un infohub du continent. + </notification> + <notification name="HomePositionSet"> + Emplacement du domicile défini. + </notification> + <notification name="AvatarEjected"> + Avatar expulsé. + </notification> + <notification name="AvatarEjectFailed"> + Vous n'avez pas pu réaliser l'exclusion car vous ne disposez pas des droits d'admin pour cette parcelle. + </notification> + <notification name="CantMoveObjectParcelFull"> + Impossible de déplacer [OBJECT_NAME] jusqu'à +[OBJ_POSITION] dans la région [REGION_NAME] car la parcelle est pleine. + </notification> + <notification name="CantMoveObjectParcelPerms"> + Impossible de déplacer [OBJECT_NAME] jusqu'à +[OBJ_POSITION] dans la région [REGION_NAME] car vos objets ne sont pas autorisés sur cette parcelle. + </notification> + <notification name="CantMoveObjectParcelResources"> + Impossible de déplacer [OBJECT_NAME] jusqu'à +[OBJ_POSITION] dans la région [REGION_NAME] car il n'y a pas suffisamment de ressources pour cet objet sur cette parcelle. + </notification> + <notification name="CantMoveObjectRegionVersion"> + Impossible de déplacer [OBJECT_NAME] jusqu'à +[OBJ_POSITION] dans la région [REGION_NAME] car l'autre région exécute une version plus ancienne qui ne prend pas en charge la réception de cet objet via le passage à une autre région. + </notification> + <notification name="CantMoveObjectNavMesh"> + Impossible de déplacer [OBJECT_NAME] jusqu'à +[OBJ_POSITION] dans la région [REGION_NAME] car vous ne pouvez pas modifier le maillage de navigation d'une région à une autre. + </notification> + <notification name="CantMoveObjectWTF"> + Impossible de déplacer [OBJECT_NAME] jusqu'à +[OBJ_POSITION] dans la région [REGION_NAME] pour une raison inconnue. ([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + Vous n'êtes pas autorisé à modifier cet objet. + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + Impossible d'activer les propriétés physiques pour un objet qui contribue au maillage de navigation. + </notification> + <notification name="CantEnablePhysKeyframedObj"> + Impossible d'activer les propriétés physiques pour les objets avec images-clés. + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + Impossible d'activer les propriétés physiques pour l'objet -- ressources de terrain insuffisantes. + </notification> + <notification name="CantEnablePhysCostTooGreat"> + Impossible d'activer les propriétés physiques pour les objets avec un coût de ressources physiques supérieur à [MAX_OBJECTS] + </notification> + <notification name="PhantomWithConcavePiece"> + Cet objet ne peut pas contenir de morceau concave car c'est un fantôme qui contribue au maillage de navigation. + </notification> + <notification name="UnableAddItem"> + Ajout de l'article impossible. + </notification> + <notification name="UnableEditItem"> + Modification impossible + </notification> + <notification name="NoPermToEdit"> + Modification interdite. + </notification> + <notification name="NoPermToCopyInventory"> + Pas autorisé à copier cet inventaire. + </notification> + <notification name="CantSaveItemDoesntExist"> + Impossible d'enregistrer dans le contenu des objets : L'article n'existe plus. + </notification> + <notification name="CantSaveItemAlreadyExists"> + Impossible d'enregistrer dans le contenu des objets : Un article avec ce nom existe déjà dans l'inventaire. + </notification> + <notification name="CantSaveModifyAttachment"> + Impossible d'enregistrer dans le contenu des objets : cela modifierait les droits d'attache. + </notification> + <notification name="TooManyScripts"> + Trop de scripts. + </notification> + <notification name="UnableAddScript"> + Ajout du script impossible. + </notification> + <notification name="AssetServerTimeoutObjReturn"> + Le serveur d'actifs n'a pas répondu assez vite. Objet renvoyé dans le sim. + </notification> + <notification name="RegionDisablePhysicsShapes"> + Les formes physiques ne sont pas activées pour cette région. + </notification> + <notification name="NoModNavmeshAcrossRegions"> + Vous ne pouvez pas modifier le maillage de navigation d'une région à une autre. + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + Impossible de définir les propriétés physiques pour ce type d'objet. + </notification> + <notification name="NoSetRootPrimWithNoShape"> + Vous devenez définir une forme pour la prim racine. + </notification> + <notification name="NoRegionSupportPhysMats"> + Les matériaux physiques ne sont pas activés pour cette région. + </notification> + <notification name="OnlyRootPrimPhysMats"> + Les matériaux physiques ne peuvent être ajustés que pour les prims racines. + </notification> + <notification name="NoSupportCharacterPhysMats"> + La configuration de matériaux physiques sur les personnages n'est pas prise en charge actuellement. + </notification> + <notification name="InvalidPhysMatProperty"> + Une ou plusieurs propriétés des ressources physiques spécifiées n'étaient pas valides. + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + Vous ne pouvez pas changer le type de raccord d'un objet avec maillage. + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + Vous ne pouvez pas changer la forme d'un objet avec maillage. + </notification> + <notification name="FullRegionCantEnter"> + Vous ne pouvez pas pénétrer dans cette région car \ncar la région est pleine. + </notification> + <notification name="LinkFailedOwnersDiffer"> + Échec du lien -- les propriétaires sont différents + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + Échec du lien -- vous ne pouvez pas modifier le maillage de navigation d'une région à une autre. + </notification> + <notification name="LinkFailedNoPermToEdit"> + Échec du lien car vous ne disposez pas des droits de modification. + </notification> + <notification name="LinkFailedTooManyPrims"> + Échec du lien -- trop de primitives + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + Échec du lien -- impossible de lier pas de copie et pas de transfert + </notification> + <notification name="LinkFailedNothingLinkable"> + Échec du lien - il n'y a rien qui puisse être lié. + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + Échec du lien -- trop de personnages de recherche de chemin + </notification> + <notification name="LinkFailedInsufficientLand"> + Échec du lien -- ressources de terrain insuffisantes + </notification> + <notification name="LinkFailedTooMuchPhysics"> + Cet objet utilise trop de ressources physiques - sa dynamique a été désactivée. + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + Vous avez été téléporté chez vous par l'objet [OBJECT_NAME] sur la parcelle [PARCEL_NAME]. + </notification> + <notification name="TeleportedHomeByObject"> + Vous avez été téléporté chez vous par l'objet [OBJECT_NAME]. + </notification> + <notification name="TeleportedByAttachment"> + Vous avez été téléporté par un élément sur [ITEM_ID] + </notification> + <notification name="TeleportedByObjectOnParcel"> + Vous avez été téléporté par l'objet [OBJECT_NAME] sur la parcelle [PARCEL_NAME]. + </notification> + <notification name="TeleportedByObjectOwnedBy"> + Vous avez été téléporté par l'objet [OBJECT_NAME] appartenant à [OWNER_ID]. + </notification> + <notification name="TeleportedByObjectUnknownUser"> + Vous avez été téléporté par l'objet [OBJECT_NAME] appartenant à un utilisateur inconnu. + </notification> + <notification name="CantCreateObjectRegionFull"> + Création de l'objet demandé impossible. La région est pleine. + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + Vous ne pouvez pas attacher plusieurs objets au même endroit. + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + Vous ne pouvez pas créer plusieurs objets ici. + </notification> + <notification name="UnableToCreateObjTimeOut"> + Création de l'objet demandé impossible. Objet absent de la base de données. + </notification> + <notification name="UnableToCreateObjUnknown"> + Création de l'objet demandé impossible. Délai d'attente dépassé. Veuillez réessayer. + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + Création de l'objet demandé impossible. Veuillez réessayer. + </notification> + <notification name="RezFailureTookTooLong"> + Échec de l'action « rezzer », le chargement de l'objet demandé a pris trop longtemps. + </notification> + <notification name="FailedToPlaceObjAtLoc"> + Échec du placement de l'objet à l'emplacement spécifié. Veuillez réessayer. + </notification> + <notification name="CantCreatePlantsOnLand"> + Vous ne pouvez pas créer de plantes sur ce terrain. + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + Impossible de restaurer l'objet. Position dans le monde introuvable. + </notification> + <notification name="CantRezObjectInvalidMeshData"> + Impossible de rezzer l'objet car ses données de maillage ne sont pas valides. + </notification> + <notification name="CantRezObjectTooManyScripts"> + Impossible de rezzer l'objet car il y a déjà trop de scripts dans cette région. + </notification> + <notification name="CantCreateObjectNoAccess"> + Vos privilèges d'accès ne vous autorisent pas à créer des objets à cet endroit. + </notification> + <notification name="CantCreateObject"> + Vous n'êtes actuellement pas autorisé à créer des objets. + </notification> + <notification name="InvalidObjectParams"> + Paramètres d'objet non valides + </notification> + <notification name="CantDuplicateObjectNoAcess"> + Vos privilèges d'accès ne vous autorisent pas à dupliquer des objets ici. + </notification> + <notification name="CantChangeShape"> + Vous n’êtes pas autorisé à modifier cette forme. + </notification> + <notification name="NoAccessToClaimObjects"> + Vos privilèges d'accès ne vous autorisent pas à revendiquer des objets ici. + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + Échec de la cession car vous de disposez pas des droits de cession des objets pour votre groupe. + </notification> + <notification name="NoPrivsToBuyObject"> + Vos privilèges d'accès ne vous autorisent pas à acheter des objets ici. + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + Impossible d'attacher l'objet car un avatar est assis dessus. + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + Les arbres et les plantes ne peuvent pas être portés sous forme d'éléments attachés. + </notification> + <notification name="CantAttachGroupOwnedObjs"> + Impossible d'attacher les objets appartenant au groupe. + </notification> + <notification name="CantAttachObjectsNotOwned"> + Vous ne pouvez pas attacher des objets qui ne vous appartiennent pas. + </notification> + <notification name="CantAttachNavmeshObjects"> + Impossible d'attacher les objets contribuant au maillage de navigation. + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + Impossible d'attacher l'objet car vous n'avez pas le droit de le déplacer. + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + Ressources de script insuffisantes pour attacher cet objet. + </notification> + <notification name="CantDropItemTrialUser"> + Vous ne pouvez pas déposer d'objets ici. Essayez la zone de période d'essai gratuite. + </notification> + <notification name="CantDropMeshAttachment"> + Vous ne pouvez pas déposer les éléments attachés avec maillage. Détachez-les dans l'inventaire puis rezzez-les dans le monde. + </notification> + <notification name="CantDropAttachmentNoPermission"> + L'élément n'a pas pu être déposé : vous n'avez pas le droit de déposer des éléments à cet endroit. + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + L'élément n'a pas pu être déposé : ressources de terrain disponibles insuffisantes. + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + Les éléments n'ont pas pu être déposés : ressources disponibles insuffisantes. + </notification> + <notification name="CantDropObjectFullParcel"> + Impossible de déposer l'objet ici. La parcelle est pleine. + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + Vous ne pouvez pas toucher/attraper cet objet car vous êtes banni de cette parcelle de terrain. + </notification> + <notification name="PlzNarrowDeleteParams"> + Veuillez affiner vos paramètres de suppression. + </notification> + <notification name="UnableToUploadAsset"> + Chargement de l'actif impossible. + </notification> + <notification name="CantTeleportCouldNotFindUser"> + Impossible de trouver l'utilisateur à téléporter chez lui + </notification> + <notification name="GodlikeRequestFailed"> + échec de la demande de type divine + </notification> + <notification name="GenericRequestFailed"> + échec de la demande générique + </notification> + <notification name="CantUploadPostcard"> + Chargement de la carte postale impossible. Réessayez ultérieurement. + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + Impossible récupérer les détails de l'inventaire pour la notice au groupe. + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + Impossible d'envoyer une notice au groupe -- ce n'est pas autorisé. + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + Impossible d'envoyer une notice au groupe - échec de la construction de l'inventaire. + </notification> + <notification name="CantParceInventoryInNotice"> + Impossible d'analyser l'inventaire dans la notice. + </notification> + <notification name="TerrainUploadFailed"> + Échec du chargement du terrain. + </notification> + <notification name="TerrainFileWritten"> + Fichier de terrain écrit + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + Fichier de terrain écrit, lancement du téléchargement... + </notification> + <notification name="TerrainBaked"> + Terrain figé. + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + Seuls les 10 premiers objets sélectionnés ont été désactivés. Actualisez et effectuez des sélections supplémentaires si nécessaire. + </notification> + <notification name="UpdateViewerBuyParcel"> + Vous devez mettre votre client à jour pour acheter cette parcelle. + </notification> + <notification name="CantBuyParcelNotForSale"> + Achat impossible, cette parcelle n'est pas à vendre. + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + Achat impossible, le prix de vente ou la zone de terrain a changé. + </notification> + <notification name="CantBuyParcelNotAuthorized"> + Vous n'êtes pas un acheteur autorisé pour cette parcelle. + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + Vous ne pouvez pas acheter cette parcelle car elle est déjà en attente d'une autorisation d'achat. + </notification> + <notification name="CantBuildOverflowParcel"> + Vous ne pouvez pas construire d'objets ici car cela saturerait la parcelle. + </notification> + <notification name="SelectedMultipleOwnedLand"> + Vous avez sélectionné des terrains avec des propriétaires différents. Sélectionnez une zone plus petite et réessayez. + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + Pas suffisamment de parcelles louées dans la sélection pour effectuer la fusion. + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + Division du terrain impossible.\nPlusieurs parcelles sont sélectionnées.\nVeuillez sélectionner un terrain plus petit. + </notification> + <notification name="CantDivideLandCantFindParcel"> + Division du terrain impossible.\nParcelle introuvable.\nSignalez-le en allant à Aide -> Signaler un bug... + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + Division du terrain impossible. Toute la parcelle est sélectionnée.\nVeuillez sélectionner un terrain plus petit. + </notification> + <notification name="LandHasBeenDivided"> + Le terrain a été divisé. + </notification> + <notification name="PassPurchased"> + Vous avez acheté un pass. + </notification> + <notification name="RegionDisallowsClassifieds"> + Cette région n'autorise pas les petites annonces. + </notification> + <notification name="LandPassExpireSoon"> + Votre pass pour ce terrain arrive à expiration. + </notification> + <notification name="CantSitNoSuitableSurface"> + Il n'y a pas de surface appropriée sur laquelle s'asseoir, essayez un autre endroit. + </notification> + <notification name="CantSitNoRoom"> + Pas de place pour s'asseoir ici, essayez un autre endroit. + </notification> + <notification name="ClaimObjectFailedNoPermission"> + Échec de la revendication de l'objet car vous ne disposez pas des droits requis. + </notification> + <notification name="ClaimObjectFailedNoMoney"> + Échec de la revendication de l'objet car vous ne disposez pas de suffisamment de L$. + </notification> + <notification name="CantDeedGroupLand"> + Impossible de céder un terrain appartenant au groupe. + </notification> + <notification name="BuyObjectFailedNoMoney"> + Échec de l'achat de l'objet car vous ne disposez pas de suffisamment de L$. + </notification> + <notification name="BuyInventoryFailedNoMoney"> + Échec de l'achat d'inventaire car vous ne disposez pas de suffisamment de L$. + </notification> + <notification name="BuyPassFailedNoMoney"> + Vous ne disposez pas de suffisamment de L$ pour acheter un pass pour ce terrain. + </notification> + <notification name="CantBuyPassTryAgain"> + Impossible d'acheter le pass actuellement. Réessayez ultérieurement. + </notification> + <notification name="CantCreateObjectParcelFull"> + Création de l'objet impossible car \nla parcelle est pleine. + </notification> + <notification name="FailedPlacingObject"> + Échec du placement de l'objet à l'emplacement spécifié. Veuillez réessayer. + </notification> + <notification name="CantCreateLandmarkForEvent"> + Impossible de créer le repère pour l'événement. + </notification> + <notification name="GodBeatsFreeze"> + Grâce à vos pouvoirs de type divin, vous n'êtes plus figé. + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + Échec de la demande de pouvoirs spéciaux. Cette demande a été archivée. + </notification> + <notification name="ExpireExplanation"> + Le système ne peut pas traiter votre demande actuellement. Délai d'attente dépassé. + </notification> + <notification name="DieExplanation"> + Le système ne peut pas traiter votre demande. + </notification> + <notification name="AddPrimitiveFailure"> + Fonds insuffisants pour créer la primitive. + </notification> + <notification name="RezObjectFailure"> + Fonds insuffisants pour créer l'objet. + </notification> + <notification name="ResetHomePositionNotLegal"> + Réinitialiser l'emplacement du domicile car il n'était pas légal. + </notification> + <notification name="CantInviteRegionFull"> + Vous ne pouvez pas inviter quiconque là où vous vous trouvez actuellement car la région est pleine. Réessayez ultérieurement. + </notification> + <notification name="CantSetHomeAtRegion"> + Cette région ne vous permet pas d'y définir votre domicile. + </notification> + <notification name="ListValidHomeLocations"> + Vous ne pouvez définir votre domicile que sur votre terrain ou un infohub du continent. + </notification> + <notification name="SetHomePosition"> + Emplacement du domicile défini. + </notification> + <notification name="CantDerezInventoryError"> + Impossible de dérezzer l'objet à cause d'un défaut d'inventaire. + </notification> + <notification name="CantCreateRequestedInv"> + Création de l'inventaire demandé impossible. + </notification> + <notification name="CantCreateRequestedInvFolder"> + Création du dossier d'inventaire demandé impossible. + </notification> + <notification name="CantCreateInventory"> + Création de cet inventaire impossible. + </notification> + <notification name="CantCreateLandmark"> + Création du repère impossible. + </notification> + <notification name="CantCreateOutfit"> + Création de la tenue impossible. Veuillez réessayer dans une minute. + </notification> + <notification name="InventoryNotForSale"> + L'inventaire n'est pas à vendre. + </notification> + <notification name="CantFindInvItem"> + Objet de l'inventaire introuvable. + </notification> + <notification name="CantFindObject"> + Objet introuvable. + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + Les transferts d'argent aux objets sont actuellement désactivés dans cette région. + </notification> + <notification name="CantPayNoAgent"> + Impossible de savoir qui payer. + </notification> + <notification name="CantDonateToPublicObjects"> + Vous ne pouvez pas donner de L$ à des objets publics. + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + Échec de la création d'inventaire sur l'objet Second Life. + </notification> + <notification name="UserBalanceOrLandUsageError"> + Une erreur interne nous a empêchés de mettre votre client à jour correctement. Le solde de L$ et le patrimoine affichés dans votre client peuvent ne pas correspondre à votre solde réel sur les serveurs. + </notification> + <notification name="LargePrimAgentIntersect"> + Impossible de créer de grandes prims qui coupent d'autres joueurs. Réessayez une fois que les autres joueurs se seront déplacés. + </notification> + <notification name="PreferenceChatClearLog"> + Cela supprimera les journaux des conversations précédentes, ainsi que toute copie de sauvegarde de ce fichier. + <usetemplate ignoretext="Confirmer avant de supprimer le journal des conversations précédentes" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + Cela supprimera les transcriptions de toutes les conversations précédentes. La liste des conversations passées ne sera pas affectée. Tous les fichiers avec les suffixes .txt et txt.backup dans le dossier [FOLDER] seront supprimés. + <usetemplate ignoretext="Confirmer avant la suppression des transcriptions" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="PreferenceChatPathChanged"> + Impossible de déplacer les fichiers. Chemin précédent rétabli. + <usetemplate ignoretext="Impossible de déplacer les fichiers. Chemin précédent rétabli." name="okignore" yestext="OK"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/fr/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/fr/panel_avatar_list_item.xml index 54b8f53e59..c8fa9f340f 100644 --- a/indra/newview/skins/default/xui/fr/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/fr/panel_avatar_list_item.xml @@ -27,5 +27,6 @@ <icon name="permission_edit_mine_icon" tool_tip="Cet(te) ami(e) peut modifier, supprimer ou prendre vos objets."/> <icon name="permission_map_icon" tool_tip="Cet(te) ami(e) peut vous localiser sur la carte."/> <icon name="permission_online_icon" tool_tip="Cet(te) ami(e) peut voir lorsque vous êtes en ligne."/> + <button name="info_btn" tool_tip="En savoir plus"/> <button name="profile_btn" tool_tip="Voir le profil"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/fr/panel_block_list_sidetray.xml index 96add2a74b..0e2b5a9c93 100644 --- a/indra/newview/skins/default/xui/fr/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/fr/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> - <text name="title_text"> - Liste des ignorés - </text> - <scroll_list name="blocked" tool_tip="Liste des résidents actuellement ignorés"/> - <button label="Ignorer une personne" label_selected="Ignorer le résident..." name="Block resident..." tool_tip="Choisir un résident à ignorer"/> - <button label="Ignorer un objet par son nom" label_selected="Ignorer un objet par son nom..." name="Block object by name..." tool_tip="Choisir un objet à ignorer par nom"/> - <button label="Ne plus ignorer" label_selected="Ne plus ignorer" name="Unblock" tool_tip="Enlever le résident ou l'objet de la liste des ignorés"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="Filtrer" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="Actions sur la personne ou l'objet sélectionné"/> + <menu_button name="view_btn" tool_tip="Options de tri"/> + <menu_button name="plus_btn" tool_tip="Choisir un résident ou un objet à ignorer"/> + <button name="unblock_btn" tool_tip="Enlever le résident ou l’objet de la liste des ignorés"/> + </panel> + <block_list name="blocked" tool_tip="Liste des résidents actuellement ignorés"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/fr/panel_conversation_list_item.xml new file mode 100644 index 0000000000..ebf18f6483 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(chargement)"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/fr/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..9c277842b5 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="Incluait une conversation vocale"/> + <icon name="unread_ims_icon" tool_tip="Des messages sont arrivés pendant que vous étiez déconnecté."/> + <button name="delete_btn" tool_tip="Supprimer cette entrée"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_group_list_item.xml b/indra/newview/skins/default/xui/fr/panel_group_list_item.xml index 5fb69d1989..b1b32af7c6 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="Inconnu"/> + <button name="info_btn" tool_tip="En savoir plus"/> <button name="profile_btn" tool_tip="Voir le profil"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_people.xml b/indra/newview/skins/default/xui/fr/panel_people.xml index f035853efc..227ce26df7 100644 --- a/indra/newview/skins/default/xui/fr/panel_people.xml +++ b/indra/newview/skins/default/xui/fr/panel_people.xml @@ -14,81 +14,53 @@ Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife:// <string name="no_filtered_friends_msg"> Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/[SEARCH_TERM] Rechercher]. </string> - <string name="people_filter_label" value="Filtrer les personnes"/> - <string name="groups_filter_label" value="Filtrer les groupes"/> <string name="no_filtered_groups_msg" value="Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/groups/[SEARCH_TERM] Rechercher]."/> <string name="no_groups_msg" value="Vous souhaitez trouver des groupes à rejoindre ? Utilisez [secondlife:///app/search/groups Rechercher]."/> <string name="MiniMapToolTipMsg" value="[REGION](Carte : double-clic ; Panoramique : Maj + faire glisser)"/> <string name="AltMiniMapToolTipMsg" value="[REGION](Téléportation : double-clic ; Panoramique : Maj + faire glisser)"/> - <filter_editor label="Filtre" name="filter_input"/> <tab_container name="tabs"> <panel label="PRÈS DE VOUS" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="Options"/> - <button name="add_friend_btn" tool_tip="Ajouter le résident sélectionné à votre liste d'amis"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="Filtrer les personnes" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="Actions sur la personne sélectionnée"/> + <menu_button name="nearby_view_btn" tool_tip="Options d'affichage/de tri"/> + <button name="add_friend_btn" tool_tip="Proposer à ce résident de devenir votre ami"/> + <dnd_button name="nearby_del_btn" tool_tip="Supprimer la personne sélectionnée des amis"/> </panel> </panel> - <panel label="MES AMIS" name="friends_panel"> + <panel label="AMIS" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="Filtrer les personnes" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="Actions sur la personne sélectionnée"/> + <menu_button name="friends_view_btn" tool_tip="Options d'affichage/de tri"/> + <button name="friends_add_btn" tool_tip="Proposer à ce résident de devenir votre ami"/> + <dnd_button name="friends_del_btn" tool_tip="Supprimer la personne sélectionnée des amis"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="En ligne"/> <accordion_tab name="tab_all" title="Tout"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="Afficher d'autres options"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="Proposer à un résident de devenir votre ami"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="Supprimer le résident sélectionné de votre liste d'amis."/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="MES GROUPES" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="Options"/> - <button name="plus_btn" tool_tip="Rejoindre/créer un nouveau groupe"/> - <button name="activate_btn" tool_tip="Activer le groupe sélectionné"/> + <panel label="GROUPES" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="Filtrer les groupes" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="Actions sur le groupe sélectionné"/> + <menu_button name="groups_view_btn" tool_tip="Options d'affichage/de tri"/> + <menu_button name="plus_btn" tool_tip="Rejoindre/créer un nouveau groupe"/> + <dnd_button name="minus_btn" tool_tip="Quitter le groupe sélectionné"/> </panel> </panel> <panel label="RÉCENT" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="Options"/> - <button name="add_friend_btn" tool_tip="Ajouter le résident sélectionné à votre liste d'amis"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="Filtrer les personnes" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="Actions sur la personne sélectionnée"/> + <menu_button name="recent_view_btn" tool_tip="Options d'affichage/de tri"/> + <button name="add_friend_btn" tool_tip="Proposer à ce résident de devenir votre ami"/> + <dnd_button name="recent_del_btn" tool_tip="Supprimer la personne sélectionnée des amis"/> </panel> </panel> + <panel label="BLOQUÉ" name="blocked_panel"> + <panel label="Résidents et objets ignorés" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="Profil" name="view_profile_btn" tool_tip="Afficher la photo, les groupes et autres infos des résidents"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="IM" name="im_btn" tool_tip="Ouvrir une session IM."/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="Appel" name="call_btn" tool_tip="Appeler ce résident."/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="Partager" name="share_btn" tool_tip="Partager un article de l'inventaire."/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="Téléporter" name="teleport_btn" tool_tip="Proposer une téléportation."/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="Profil du groupe" name="group_info_btn" tool_tip="Afficher les informations sur le groupe"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="Chat de groupe" name="chat_btn" tool_tip="Ouvrir une session de chat"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="Appel de groupe" name="group_call_btn" tool_tip="Appeler ce groupe"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml index 550beb653e..972190dc15 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Chat écrit" name="chat"> - <text name="font_size"> - Taille de la police : - </text> - <radio_group name="chat_font_size"> - <radio_item label="Petite" name="radio" value="0"/> - <radio_item label="Moyenne" name="radio2" value="1"/> - <radio_item label="Grande" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="true" label="Exécuter l'animation clavier quand vous écrivez" name="play_typing_animation"/> - <check_box label="M'envoyer les IM par e-mail une fois déconnecté" name="send_im_to_email"/> - <check_box label="Activer l'historique des chats et des IM en texte brut" name="plain_text_chat_history"/> - <check_box label="Bulles de chat" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - Afficher les IM dans : - </text> - <text name="requires_restart_label"> - (redémarrage requis) - </text> - <radio_group name="chat_window" tool_tip="Afficher vos messages instantanés dans plusieurs fenêtres ou dans une seule fenêtre avec plusieurs onglets (redémarrage requis)"> - <radio_item label="Plusieurs fenêtres" name="radio" value="0"/> - <radio_item label="Onglets" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - Activer les popups de chat entrant : - </text> - <check_box label="Chats de groupe" name="EnableGroupChatPopups" tool_tip="Cocher cette case pour qu'un popup s'affiche à réception d'un message de chat de groupe."/> - <check_box label="Chats IM" name="EnableIMChatPopups" tool_tip="Cocher cette case pour qu'un popup s'affiche à réception d'un message instantané."/> - <spinner label="Durée de vie du popup Chat près de moi :" name="nearby_toasts_lifetime"/> - <spinner label="Disparition progressive du popup Chat près de moi :" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="true" label="Exécuter l'animation clavier quand vous écrivez" name="play_typing_animation"/> + <check_box label="M'envoyer les IM par e-mail une fois déconnecté" name="send_im_to_email"/> + <check_box label="Seuls mes amis et groupes peuvent m'appeler ou m'envoyer un IM" name="voice_call_friends_only_check"/> + <text name="font_size"> + Taille de la police : + </text> + <combo_box name="chat_font_size"> + <item label="Petite" name="Small" value="0"/> + <item label="Moyenne" name="Medium" value="1"/> + <item label="Grande" name="Large" value="2"/> + </combo_box> + <check_box label="Bulles de chat" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + Notifications + </text> + <text name="friend_ims"> + IM amis : + </text> + <combo_box name="FriendIMOptions"> + <item label="Ouvrir la fenêtre Conversation" name="OpenConversationsWindow" value="openconversations"/> + <item label="Afficher le message dans une fenêtre popup" name="PopUpMessage" value="toast"/> + <item label="Bouton de la barre d'outils Flash" name="FlashToolbarButton" value="clignote"/> + <item label="Aucun(e)" name="None" value="aucun(e)"/> + </combo_box> + <text name="non_friend_ims"> + IM non amis : + </text> + <combo_box name="NonFriendIMOptions"> + <item label="Ouvrir la fenêtre Conversation" name="OpenConversationsWindow" value="openconversations"/> + <item label="Afficher le message dans une fenêtre popup" name="PopUpMessage" value="toast"/> + <item label="Bouton de la barre d'outils Flash" name="FlashToolbarButton" value="clignote"/> + <item label="Aucun(e)" name="None" value="aucun(e)"/> + </combo_box> + <text name="conference_ims"> + IM conférence : + </text> + <combo_box name="ConferenceIMOptions"> + <item label="Ouvrir la fenêtre Conversation" name="OpenConversationsWindow" value="openconversations"/> + <item label="Afficher le message dans une fenêtre popup" name="PopUpMessage" value="toast"/> + <item label="Bouton de la barre d'outils Flash" name="FlashToolbarButton" value="clignote"/> + <item label="Aucun(e)" name="None" value="aucun(e)"/> + </combo_box> + <text name="group_chat"> + Chat de groupe : + </text> + <combo_box name="GroupChatOptions"> + <item label="Ouvrir la fenêtre Conversation" name="OpenConversationsWindow" value="openconversations"/> + <item label="Afficher le message dans une fenêtre popup" name="PopUpMessage" value="toast"/> + <item label="Bouton de la barre d'outils Flash" name="FlashToolbarButton" value="clignote"/> + <item label="Aucun(e)" name="None" value="aucun(e)"/> + </combo_box> + <text name="nearby_chat"> + Chat près de moi : + </text> + <combo_box name="NearbyChatOptions"> + <item label="Ouvrir la fenêtre Conversation" name="OpenConversationsWindow" value="openconversations"/> + <item label="Afficher le message dans une fenêtre popup" name="PopUpMessage" value="toast"/> + <item label="Bouton de la barre d'outils Flash" name="FlashToolBarButton" value="clignote"/> + <item label="Aucun(e)" name="None" value="aucun(e)"/> + </combo_box> + <text name="notifications_alert"> + Pour suspendre temporairement toutes les notifications, utilisez Communication > Ne pas déranger. + </text> + </panel> + <panel> + <text name="play_sound"> + Écouter le son : + </text> + <check_box label="Nouvelle conversation" name="new_conversation"/> + <check_box label="Appel entrant" name="incoming_voice_call"/> + <check_box label="Offre de téléportation" name="teleport_offer"/> + <check_box label="Offre d'inventaire" name="inventory_offer"/> + </panel> + <panel> + <button label="Effacer le journal..." name="clear_log"/> + <button label="Supprimer les transcriptions..." name="delete_transcripts"/> + <button label="Parcourir..." label_selected="Parcourir" name="log_path_button"/> + </panel> <button label="Traduction..." name="ok_btn"/> <button label="Rechercher/Remplacer..." name="autoreplace_showgui"/> <button label="Orthographe..." name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml index 66b84af3aa..533c392d6b 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml @@ -69,9 +69,9 @@ <combo_box.item label="Jamais" name="item4"/> </combo_box> <text name="text_box3"> - Réponse si occupé(e) : + Réponse Ne pas déranger </text> - <text_editor name="busy_response"> + <text_editor name="do_not_disturb_response"> log_in_to_change </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml index 60027d41cb..896dd932e3 100644 --- a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="Acheter l'objet" name="Buyobject"/> <combo_box.item label="Payer l'objet" name="Payobject"/> <combo_box.item label="Ouvrir" name="Open"/> + <combo_box.item label="Zoom" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 6a2a3f559a..69ed20f376 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -137,7 +137,7 @@ Quitter </string> <string name="create_account_url"> - http://join.secondlife.com/index.php?lang=fr-FR&sourceid=[sourceid] + http://join.secondlife.com/?sourceid=[sourceid] </string> <string name="LoginFailedViewerNotPermitted"> Le client que vous utilisez ne permet plus d'accéder à Second Life. Téléchargez un nouveau client à la page suivante : @@ -622,8 +622,8 @@ Veuillez réessayer de vous connecter dans une minute. <string name="AvatarAway"> Absent </string> - <string name="AvatarBusy"> - Occupé + <string name="AvatarDoNotDisturb"> + Ne pas déranger </string> <string name="AvatarMuted"> Bloqué(e) @@ -859,6 +859,12 @@ Veuillez réessayer de vous connecter dans une minute. <string name="ST_NO_JOINT"> Impossible de trouver ROOT ou JOINT. </string> + <string name="NearbyChatTitle"> + Chat près de moi + </string> + <string name="NearbyChatLabel"> + (Chat près de moi) + </string> <string name="whisper"> chuchote : </string> @@ -922,12 +928,15 @@ Veuillez réessayer de vous connecter dans une minute. <string name="ControlYourCamera"> Contrôler votre caméra </string> - <string name="TeleportYourAgent"> - Vous téléporter - </string> <string name="NotConnected"> Pas connecté(e) </string> + <string name="AgentNameSubst"> + (Vous) + </string> + <string name="TeleportYourAgent"> + Vous téléporter + </string> <string name="SIM_ACCESS_PG"> Général </string> @@ -1009,18 +1018,6 @@ Veuillez réessayer de vous connecter dans une minute. <string name="dictionary_files"> Dictionnaires </string> - <string name="AvatarSetNotAway"> - Présent - </string> - <string name="AvatarSetAway"> - Absent - </string> - <string name="AvatarSetNotBusy"> - Pas occupé - </string> - <string name="AvatarSetBusy"> - Occupé - </string> <string name="shape"> Silhouette </string> @@ -1989,8 +1986,8 @@ Veuillez réessayer de vous connecter dans une minute. <string name="PanelContentsNewScript"> Nouveau script </string> - <string name="BusyModeResponseDefault"> - Le résident auquel vous avez envoyé un message est en mode Occupé, ce qui signifie qu'il a demandé à ne pas être dérangé. Votre message restera affiché dans son panneau IM afin qu'il puisse le lire ultérieurement. + <string name="DoNotDisturbModeResponseDefault"> + Ce résident a activé Ne pas déranger et verra votre message plus tard. </string> <string name="MuteByName"> (par nom) @@ -2103,9 +2100,6 @@ Veuillez réessayer de vous connecter dans une minute. <string name="GroupMoneyDate"> [weekday,datetime,utc] [day,datetime,utc] [mth,datetime,utc] [year,datetime,utc] </string> - <string name="ViewerObjectContents"> - Contenus - </string> <string name="AcquiredItems"> Objets acquis </string> @@ -3877,7 +3871,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Région de type Général </string> <string name="LocationCtrlSeeAVsTooltip"> - Avatars visibles et chat autorisé en dehors de cette parcelle + Les avatars à l'extérieur de cette parcelle ne peuvent pas voir ni entendre les avatars qui se trouvent à l'intérieur. </string> <string name="LocationCtrlPathfindingDirtyTooltip"> Les objets mobiles risquent de ne pas se comporter correctement dans cette région tant qu'elle n'est pas refigée. @@ -3954,6 +3948,12 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. <string name="IM_unblock_only_groups_friends"> Pour afficher ce message, vous devez désactiver la case Seuls mes amis et groupes peuvent m'appeler ou m'envoyer un IM, sous Préférences/Confidentialité. </string> + <string name="OnlineStatus"> + En ligne + </string> + <string name="OfflineStatus"> + Hors ligne + </string> <string name="answered_call"> Votre appel a fait l'objet d'une réponse </string> @@ -3963,6 +3963,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. <string name="you_joined_call"> Vous avez rejoint l'appel </string> + <string name="you_auto_rejected_call-im"> + Vous avez automatiquement refusé l'appel vocal quand le mode Ne pas déranger était activé. + </string> <string name="name_started_call"> [NAME] appelle. </string> @@ -3979,7 +3982,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Connexion en cours... </string> <string name="conference-title"> - Conférence ad-hoc + Chat à plusieurs </string> <string name="conference-title-incoming"> Conférence avec [AGENT_NAME] @@ -4859,6 +4862,9 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles <string name="Command_Chat_Label"> Chat </string> + <string name="Command_Conversations_Label"> + Conversations + </string> <string name="Command_Compass_Label"> Boussole </string> @@ -4934,6 +4940,9 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles <string name="Command_Chat_Tooltip"> Parler aux personnes près de vous par chat écrit </string> + <string name="Command_Conversations_Tooltip"> + Parler à quelqu'un + </string> <string name="Command_Compass_Tooltip"> Boussole </string> @@ -5063,4 +5072,13 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles <string name="UserDictionary"> [User] </string> + <string name="logging_calls_disabled_log_empty"> + Les conversations ne sont pas archivées. Pour commencer à tenir un journal, choisissez Enregistrer : Journal seul ou Enregistrer : Journal et transcriptions sous Préférences > Chat. + </string> + <string name="logging_calls_disabled_log_not_empty"> + Aucune conversation ne sera plus enregistrée. Pour recommencer à tenir un journal, choisissez Enregistrer : Journal seul ou Enregistrer : Journal et transcriptions sous Préférences > Chat. + </string> + <string name="logging_calls_enabled_log_empty"> + Il n'y a aucune conversation enregistrée. Quand quelqu'un vous contacte ou quand vous contactez quelqu'un, une entrée de journal s'affiche ici. + </string> </strings> diff --git a/indra/newview/skins/default/xui/it/floater_conversation_log.xml b/indra/newview/skins/default/xui/it/floater_conversation_log.xml new file mode 100644 index 0000000000..8354824ed1 --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="REGISTRO CONVERSAZIONI"> + <panel name="buttons_panel"> + <filter_editor label="Filtro persone" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="Opzioni Mostra/Ordina"/> + <menu_button name="conversations_gear_btn" tool_tip="Azioni sulla persona o gruppo selezionato"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/it/floater_conversation_preview.xml b/indra/newview/skins/default/xui/it/floater_conversation_preview.xml new file mode 100644 index 0000000000..d0e9c8ee0e --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="CONVERSAZIONE:"> + <floater.string name="Title"> + CONVERSAZIONE: [NAME] + </floater.string> + <text name="page_label" value="Pagina"/> +</floater> diff --git a/indra/newview/skins/default/xui/it/floater_im_container.xml b/indra/newview/skins/default/xui/it/floater_im_container.xml index fb8e77b32f..10cf1b7f7e 100644 --- a/indra/newview/skins/default/xui/it/floater_im_container.xml +++ b/indra/newview/skins/default/xui/it/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="CONVERSAZIONI"/> +<multi_floater name="floater_im_box" title="CONVERSAZIONI"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="Opzioni Mostra/Ordina"/> + <button name="add_btn" tool_tip="Avvia una nuova conversazione"/> + <button name="speak_btn" tool_tip="Parla con le persone usando il microfono"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="Minimizza/espandi questo elenco"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="Minimizza questo pannello"/> + <text name="stub_textbox"> + Questa conversazione in una finestra separata. [secondlife:/// Ripristina conversazione.] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/it/floater_im_session.xml b/indra/newview/skins/default/xui/it/floater_im_session.xml index 3d9d17fc81..d38ec7a5fe 100644 --- a/indra/newview/skins/default/xui/it/floater_im_session.xml +++ b/indra/newview/skins/default/xui/it/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="A" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] è stato invitato alla conversazione."/> + <floater.string name="multiple_participants_added" value="[NAME] sono stati invitati alla conversazione."/> + <floater.string name="tooltip_to_separate_window" value="Sposta questa conversazione in una finestra separata."/> + <floater.string name="tooltip_to_main_window" value="Sposta questa conversazione di nuovo nella finestra principale"/> + <floater.string name="start_call_button_tooltip" value="Apri collegamento voce"/> + <floater.string name="end_call_button_tooltip" value="Chiudi collegamento voce"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="Minimizza questo pannello"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="Minimizza elenco partecipanti"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="Espandi l'elenco dei partecipanti"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="Opzioni Mostra/Ordina"/> + <menu_button name="gear_btn" tool_tip="Azioni per la persona selezionata:"/> + <button name="add_btn" tool_tip="Aggiungi qualcuno a questa conversazione"/> + <button name="voice_call_btn" tool_tip="Apri collegamento voce"/> + <button name="close_btn" tool_tip="Termina questa conversazione"/> + <button name="expand_collapse_btn" tool_tip="Minimizza/espandi questo pannello"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Traduci chat" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="A" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="Mostra/nascondi pannello messaggi"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_incoming_call.xml b/indra/newview/skins/default/xui/it/floater_incoming_call.xml index a95ed44662..566920209d 100644 --- a/indra/newview/skins/default/xui/it/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/it/floater_incoming_call.xml @@ -10,7 +10,7 @@ anonimo </floater.string> <floater.string name="VoiceInviteP2P"> - sta chiamando. + ti sta chiamando. </floater.string> <floater.string name="VoiceInviteAdHoc"> ha aderito ad una chiamata in chat vocale in conferenza. @@ -25,9 +25,9 @@ Vuoi abbandonare [CURRENT_CHAT] e aderire a questa voice chat? </floater.string> <text name="question"> - Vuoi abbandonare [CURRENT_CHAT] e aderire a questa voice chat? + Se rispondi, verrà interrotto il collegamento dalla conversazione a voce corrente. </text> - <button label="Accetta" label_selected="Accetta" name="Accept"/> - <button label="Rifiuta" label_selected="Rifiuta" name="Reject"/> - <button label="Inizia IM" name="Start IM"/> + <button label="Risposta" label_selected="Risposta" name="Accept"/> + <button label="Ignora" label_selected="Ignora" name="Reject"/> + <button label="Apri invece IM" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/it/floater_pathfinding_console.xml index 77be220a2a..7777444161 100644 --- a/indra/newview/skins/default/xui/it/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/it/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Mostra: </text> - <check_box label="Mondo" name="show_world"/> + <check_box label="Test" name="show_world"/> <check_box label="Solo elementi spostabili" name="show_world_movables_only"/> <check_box label="Navmesh" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml index c97a91bb3f..27a17868a7 100644 --- a/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml @@ -19,7 +19,7 @@ <button label="Default" label_selected="Default" name="Default"/> <button label="Vuoto" label_selected="Vuoto" name="Blank"/> <button label="Niente" label_selected="Niente" name="None"/> - <check_box initial_value="true" label="Anteprima dal vivo" name="apply_immediate_check"/> + <check_box initial_value="true" label="Applica adesso" name="apply_immediate_check"/> <text name="preview_disabled" value="Anteprima disattivata"/> <filter_editor label="Filtro texture" name="inventory search editor"/> <check_box initial_value="false" label="Mostra cartelle" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/it/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/it/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..b168d067c2 --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="VOLUME CHAT VOCALE"> + <slider label="Chat vocale" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/it/floater_voice_effect.xml b/indra/newview/skins/default/xui/it/floater_voice_effect.xml index c83b11f698..f102622f5d 100644 --- a/indra/newview/skins/default/xui/it/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/it/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Luoghi" name="voice_effects" title="MANIPOLAZIONE VOCE"> +<floater label="Luoghi" name="voice_effects" title="ANTEPRIMA MANIPOLAZIONE VOCE"> <string name="no_voice_effect"> (Nessuna manipolazione voce) </string> diff --git a/indra/newview/skins/default/xui/it/floater_voice_volume.xml b/indra/newview/skins/default/xui/it/floater_voice_volume.xml new file mode 100644 index 0000000000..eaeda7597f --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="VOLUME VOCE"> + <slider name="volume_slider" tool_tip="Volume voce" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/it/menu_cof_gear.xml b/indra/newview/skins/default/xui/it/menu_cof_gear.xml index 10524ba92d..984e4a1611 100644 --- a/indra/newview/skins/default/xui/it/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/it/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear COF"> +<toggleable_menu name="Gear COF"> <menu label="Nuovi abiti" name="COF.Gear.New_Clothes"/> - <menu label="Nuove parti del corpo" name="COF.Geear.New_Body_Parts"/> -</menu> + <menu label="Nuove parti del corpo" name="COF.Gear.New_Body_Parts"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_conversation.xml b/indra/newview/skins/default/xui/it/menu_conversation.xml new file mode 100644 index 0000000000..46ced93f1d --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="Chiudi la conversazione" name="close_conversation"/> + <menu_item_call label="Apri conversazione a voce" name="open_voice_conversation"/> + <menu_item_call label="Interrompi collegamento a voce" name="disconnect_from_voice"/> + <menu_item_call label="Vedi profilo" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Offri teleport" name="offer_teleport"/> + <menu_item_call label="Chiamata a voce" name="voice_call"/> + <menu_item_call label="Cronologia chat..." name="chat_history"/> + <menu_item_call label="Aggiungi amico" name="add_friend"/> + <menu_item_call label="Rimuovi amico" name="remove_friend"/> + <menu_item_call label="Rimuovi amici" name="remove_friends"/> + <menu_item_call label="Invita al gruppo..." name="invite_to_group"/> + <menu_item_call label="Zoom avanti" name="zoom_in"/> + <menu_item_call label="Mappa" name="map"/> + <menu_item_call label="Condividi" name="share"/> + <menu_item_call label="Paga" name="pay"/> + <menu_item_check label="Blocca voce" name="block_unblock"/> + <menu_item_check label="Blocca testo" name="MuteText"/> + <menu_item_call label="Profilo del gruppo" name="group_profile"/> + <menu_item_call label="Attiva gruppo" name="activate_group"/> + <menu_item_call label="Lascia il gruppo" name="leave_group"/> + <context_menu label="Opzioni moderatore" name="Moderator Options"> + <menu_item_check label="Consenti chat di testo" name="AllowTextChat"/> + <menu_item_call label="Disattiva audio di questo partecipante" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Riattiva audio di questo partecipante" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Disattiva audio di tutti" name="ModerateVoiceMute"/> + <menu_item_call label="Riattiva audio di tutti" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/it/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..5686a902eb --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="IM..." name="IM"/> + <menu_item_call label="Chiamata a voce..." name="Call"/> + <menu_item_call label="Apro la cronologia delle chat..." name="Chat history"/> + <menu_item_call label="Vedi profilo" name="View Profile"/> + <menu_item_call label="Offri Teleport" name="teleport"/> + <menu_item_call label="Aggiungi come amico" name="add_friend"/> + <menu_item_call label="Rimuovi amico" name="remove_friend"/> + <menu_item_call label="Invita al gruppo..." name="Invite"/> + <menu_item_call label="Mappa" name="Map"/> + <menu_item_call label="Condividi" name="Share"/> + <menu_item_call label="Paga" name="Pay"/> + <menu_item_check label="Blocca/Sblocca" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/it/menu_conversation_log_view.xml new file mode 100644 index 0000000000..73b05831ef --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="Ordina in base al nome" name="sort_by_name"/> + <menu_item_check label="Ordina in base alla data" name="sort_by_date"/> + <menu_item_check label="Ordina con gli amici in alto" name="sort_by_friends"/> + <menu_item_call label="Mostra la cronologia delle chat vicine..." name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_im_conversation.xml b/indra/newview/skins/default/xui/it/menu_im_conversation.xml new file mode 100644 index 0000000000..1621d57e12 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="Vedi profilo" name="View Profile"/> + <menu_item_call label="Aggiungi come amico" name="Add Friend"/> + <menu_item_call label="Rimuovi amico" name="remove_friend"/> + <menu_item_call label="Offri teleport" name="offer_teleport"/> + <menu_item_call label="Invita al gruppo..." name="invite_to_group"/> + <menu_item_call label="Cronologia chat..." name="chat_history"/> + <menu_item_call label="Zoom avanti" name="zoom_in"/> + <menu_item_call label="Mappa" name="map"/> + <menu_item_call label="Condividi" name="Share"/> + <menu_item_call label="Paga" name="Pay"/> + <menu_item_check label="Blocca voce" name="Block/Unblock"/> + <menu_item_check label="Blocca testo" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/it/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..350fbc5c6f --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="Vista compatta" name="compact_view"/> + <menu_item_check label="Vista espansa" name="expanded_view"/> + <menu_item_check label="Mostra orario" name="IMShowTime"/> + <menu_item_check label="Mostra i nomi nelle conversazioni individuali" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_object_icon.xml b/indra/newview/skins/default/xui/it/menu_object_icon.xml index 0f347b1a90..9623775af4 100644 --- a/indra/newview/skins/default/xui/it/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/it/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="Profilo oggetto..." name="Object Profile"/> <menu_item_call label="Blocca..." name="Block"/> + <menu_item_call label="Mostra sulla mappa" name="show_on_map"/> + <menu_item_call label="Teleport sul luogo dell'oggetto" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_outfit_gear.xml b/indra/newview/skins/default/xui/it/menu_outfit_gear.xml index 09fc867d7c..3ac0c5ce69 100644 --- a/indra/newview/skins/default/xui/it/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/it/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="Nuovi capelli" name="New Hair"/> <menu_item_call label="Nuovi occhi" name="New Eyes"/> </menu> + <menu_item_call label="Apri tutte le cartelle" name="expand"/> + <menu_item_call label="Chiudi tutte le cartelle" name="collapse"/> <menu_item_call label="Cambia nome del vestiario" name="rename"/> <menu_item_call label="Elimina vestito" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_participant_view.xml b/indra/newview/skins/default/xui/it/menu_participant_view.xml new file mode 100644 index 0000000000..c87cda57bf --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="Ordina le conversazioni in base al tipo" name="sort_sessions_by_type"/> + <menu_item_check label="Ordina le conversazioni in base al nome" name="sort_sessions_by_name"/> + <menu_item_check label="Ordina le conversazioni in base alle attività più recenti" name="sort_sessions_by_recent"/> + <menu_item_check label="Ordina i partecipanti in base al nome" name="sort_participants_by_name"/> + <menu_item_check label="Ordina i partecipanti in base alle attività più recenti" name="sort_participants_by_recent"/> + <menu_item_call label="Preferenze chat..." name="chat_preferences"/> + <menu_item_call label="Preferenze privacy..." name="privacy_preferences"/> + <menu_item_check label="Registro conversazioni..." name="Conversation"/> + <menu_item_check label="Traduci chat vicina" name="Translate_chat"/> + <menu_item_check label="Impostazioni traduzione..." name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/it/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..e9955923b2 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="Sblocca" name="unblock"/> + <menu_item_call label="Profilo..." name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/it/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..cbcf084b86 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="Blocca residente per nome..." name="block_resident_by_name"/> + <menu_item_call label="Blocca oggetto per nome" name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/it/menu_people_blocked_view.xml new file mode 100644 index 0000000000..fc80c73ae3 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="Ordina in base al nome" name="sort_by_name"/> + <menu_item_check label="Ordina in base al tipo" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_friends_view.xml b/indra/newview/skins/default/xui/it/menu_people_friends_view.xml new file mode 100644 index 0000000000..972e359cfe --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ordina in base al nome" name="sort_name"/> + <menu_item_check label="Ordina in base allo stato" name="sort_status"/> + <menu_item_check label="Mostra le icone delle persone" name="view_icons"/> + <menu_item_check label="Mostra le autorizzazioni concesse" name="view_permissions"/> + <menu_item_check label="Mostra il registro conversazioni..." name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_groups.xml b/indra/newview/skins/default/xui/it/menu_people_groups.xml index 30a97a1c72..8ca7537ee0 100644 --- a/indra/newview/skins/default/xui/it/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/it/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="Mostra informazioni" name="View Info"/> <menu_item_call label="Chat" name="Chat"/> - <menu_item_call label="Chiama" name="Call"/> + <menu_item_call label="Chiamata a voce" name="Call"/> <menu_item_call label="Attiva" name="Activate"/> <menu_item_call label="Chiudi" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_groups_view.xml b/indra/newview/skins/default/xui/it/menu_people_groups_view.xml new file mode 100644 index 0000000000..56b9abbd3a --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Mostra le icone di gruppo" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby.xml b/indra/newview/skins/default/xui/it/menu_people_nearby.xml index a974bd181d..1c09b1cfe2 100644 --- a/indra/newview/skins/default/xui/it/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/it/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="Vedi profilo" name="View Profile"/> - <menu_item_call label="Aggiungi amico" name="Add Friend"/> - <menu_item_call label="Rimuovi amico" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="Chiama" name="Call"/> - <menu_item_call label="Mappa" name="Map"/> - <menu_item_call label="Condividi" name="Share"/> - <menu_item_call label="Paga" name="Pay"/> - <menu_item_check label="Blocca/Sblocca" name="Block/Unblock"/> - <menu_item_call label="Offri Teleport" name="teleport"/> + <menu_item_call label="Vedi profilo" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Offri Teleport" name="offer_teleport"/> + <menu_item_call label="Chiamata a voce" name="voice_call"/> + <menu_item_call label="Mostra la cronologia delle chat..." name="chat_history"/> + <menu_item_call label="Aggiungi come amico" name="add_friend"/> + <menu_item_call label="Rimuovi amico" name="remove_friend"/> + <menu_item_call label="Invita al gruppo..." name="invite_to_group"/> + <menu_item_call label="Zoom avanti" name="zoom_in"/> + <menu_item_call label="Mappa" name="map"/> + <menu_item_call label="Condividi" name="share"/> + <menu_item_call label="Paga" name="pay"/> + <menu_item_check label="Blocca/Sblocca" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml index e0b9ceb63d..b9ce70167f 100644 --- a/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="Aggiungi amici" name="Add Friends"/> - <menu_item_call label="Rimuovi amici" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="Chiama" name="Call"/> - <menu_item_call label="Condividi" name="Share"/> - <menu_item_call label="Paga" name="Pay"/> - <menu_item_call label="Offri Teleport" name="teleport"/> + <menu_item_call label="Aggiungi amici" name="add_friends"/> + <menu_item_call label="Rimuovi amici" name="remove_friends"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Chiama" name="call"/> + <menu_item_call label="Condividi" name="share"/> + <menu_item_call label="Paga" name="pay"/> + <menu_item_call label="Offri Teleport" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/it/menu_people_nearby_view.xml new file mode 100644 index 0000000000..223d88fee1 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ordina in base a intervenuti recenti" name="sort_by_recent_speakers"/> + <menu_item_check label="Ordina in base al nome" name="sort_name"/> + <menu_item_check label="Ordina in base alla distanza" name="sort_distance"/> + <menu_item_check label="Mostra le icone delle persone" name="view_icons"/> + <menu_item_check label="Mostra mappa" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_people_recent_view.xml b/indra/newview/skins/default/xui/it/menu_people_recent_view.xml new file mode 100644 index 0000000000..fc6213bd08 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Mostra prima i più recenti" name="sort_most"/> + <menu_item_check label="Ordina in base al nome" name="sort_name"/> + <menu_item_check label="Mostra le icone delle persone" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/it/menu_url_agent.xml b/indra/newview/skins/default/xui/it/menu_url_agent.xml index 37755d5749..abfbab35a3 100644 --- a/indra/newview/skins/default/xui/it/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/it/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostra profilo residente" name="show_agent"/> + <menu_item_call label="Vedi profilo" name="show_agent"/> + <menu_item_call label="Manda IM..." name="send_im"/> + <menu_item_call label="Aggiungi come amico..." name="add_friend"/> <menu_item_call label="Copia nome negli Appunti" name="url_copy_label"/> <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_url_objectim.xml b/indra/newview/skins/default/xui/it/menu_url_objectim.xml index 763e65f17c..8456d14b63 100644 --- a/indra/newview/skins/default/xui/it/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/it/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostra informazioni oggetto" name="show_object"/> + <menu_item_call label="Profilo oggetto..." name="show_object"/> <menu_item_call label="Mostra sulla mappa" name="show_on_map"/> <menu_item_call label="Teleport sul luogo dell'oggetto" name="teleport_to_object"/> <menu_item_call label="Copia nome oggetto negli Appunti" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml index cdfa97bb3c..16f5a7a89b 100644 --- a/indra/newview/skins/default/xui/it/menu_viewer.xml +++ b/indra/newview/skins/default/xui/it/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="Ferma animazione" name="Stop Animating My Avatar"/> <menu_item_call label="Cammina / corri / vola..." name="Walk / run / fly"/> </menu> - <menu label="Stato" name="Status"> - <menu_item_call label="Assente" name="Set Away"/> - <menu_item_call label="Non disponibile" name="Set Busy"/> - </menu> + <menu label="Stato" name="Status"/> <menu_item_call label="Acquista L$..." name="Buy and Sell L$"/> <menu_item_call label="Casella venditore in uscita..." name="MerchantOutbox"/> <menu_item_call label="Dashboard dell'account..." name="Manage My Account"> @@ -32,14 +29,18 @@ <menu_item_call label="Esci da [APP_NAME]" name="Quit"/> </menu> <menu label="Comunica" name="Communicate"> - <menu_item_check label="Chat..." name="Nearby Chat"/> + <menu_item_check label="Conversazioni..." name="Conversations"/> + <menu_item_check label="Chat nei dintorni..." name="Nearby Chat"/> <menu_item_check label="Parla" name="Speak"/> - <menu_item_check label="Impostazioni voce..." name="Nearby Voice"/> - <menu_item_check label="Manipolazione voce..." name="ShowVoice"/> + <menu label="Manipolazione voce" name="VoiceMorphing"> + <menu_item_check label="Nessuna manipolazione voce" name="NoVoiceMorphing"/> + <menu_item_check label="Anteprima..." name="Preview"/> + <menu_item_call label="Abbonati..." name="Subscribe"/> + </menu> <menu_item_check label="Gesture..." name="Gestures"/> - <menu_item_call label="Amici" name="My Friends"/> - <menu_item_call label="Gruppi" name="My Groups"/> - <menu_item_call label="Persone vicine" name="Active Speakers"/> + <menu_item_check label="Amici" name="My Friends"/> + <menu_item_check label="Gruppi" name="My Groups"/> + <menu_item_check label="Persone vicine" name="Active Speakers"/> <menu_item_call label="Blocca lista" name="Block List"/> </menu> <menu label="Mondo" name="World"> diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml index d5fdde4e7d..8adbebb62a 100644 --- a/indra/newview/skins/default/xui/it/notifications.xml +++ b/indra/newview/skins/default/xui/it/notifications.xml @@ -513,6 +513,24 @@ Visitare [_URL] per ulteriori informazioni? </url> <usetemplate ignoretext="Driver grafica obsoleto" name="okcancelignore" notext="No" yestext="Sì"/> </notification> + <notification name="AMDOldDriver"> + È probabile che ci sia un driver aggiornato per il processore grafico. L'aggiornamento dei driver della grafica può migliorare le prestazioni in maniera significativa. + + Visitare [_URL] per cercare un aggiornamento del driver? + <url name="url"> + http://support.amd.com/it/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="Driver grafica obsoleto" name="okcancelignore" notext="No" yestext="Sì"/> + </notification> + <notification name="NVIDIAOldDriver"> + È probabile che ci sia un driver aggiornato per il processore grafico. L'aggiornamento dei driver della grafica può migliorare le prestazioni in maniera significativa. + + Visitare [_URL] per cercare un aggiornamento del driver? + <url name="url"> + http://www.nvidia.it/Download/index.aspx?lang=it + </url> + <usetemplate ignoretext="Driver grafica obsoleto" name="okcancelignore" notext="No" yestext="Sì"/> + </notification> <notification name="UnknownGPU"> Il tuo sistema utilizza una scheda grafica che [APP_NAME] non riconosce. Questo succede spesso con un nuovo hardware che non è stato ancora testato con [APP_NAME]. Probabilmente tutto andrà bene, ma devi riconfigurare le tue impostazioni grafiche. @@ -1548,10 +1566,13 @@ Vuoi cancellare quell'elemento? Impossibile offrire l'amicizia in questo momento. Riprova fra poco. <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="BusyModeSet"> - È stata impostata la modalità Non disponibile. -La chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non disponibile. Tutte le offerte di teleport verranno rifiutate. Tutte le offerte di Inventario andranno nel Cestino. - <usetemplate ignoretext="Cambio il mio stato sulla modalità Non disponibile" name="okignore" yestext="OK"/> + <notification name="DoNotDisturbModeSet"> + Non disturbare è attivo. Non riceverai la notifica delle comunicazioni in arrivo. + +- Gli altri residenti riceveranno la tua risposta Non disturbare (impostata in Preferenze > Generali). +- Le offerte di teleport verranno rifiutate. +- Le chiamate voce verranno rifiutate. + <usetemplate ignoretext="Io cambio il mio stato alla modalità Non disturbare." name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> Hai raggiunto il numero massimo di gruppi. Per favore abbandona almeno un gruppo prima di aderire a questo, oppure declina l'offerta. @@ -2039,6 +2060,10 @@ Trasferisci gli elementi nell'inventario? Vai al [http://secondlife.com/account/ Dashboard] per vedere la cronologia del tuo account? <usetemplate ignoretext="Lancia il browser per vedere la cronologia del mio account" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + Quando aggiungi una persona a una conversazione esistente, viene creata una nuova conversazione. Tutti i partecipanti riceveranno notifiche per la nuova conversazione. + <usetemplate ignoretext="Conferma l'aggiunta dei partecipanti alla chat" name="okcancelignore" notext="Annulla" yestext="Ok"/> + </notification> <notification name="ConfirmQuit"> Confermi di voler uscire? <usetemplate ignoretext="Conferma prima di uscire" name="okcancelignore" notext="Non uscire" yestext="Esci"/> @@ -2113,14 +2138,14 @@ Vuoi sostituirlo con l'oggetto selezionato? <button ignore="Never Replace" name="No" text="Annulla"/> </form> </notification> - <notification label="Avviso di 'Occupato'" name="BusyModePay"> - Sei in modalità 'Occupato', ciò significa che non riceverai ciò che attendi per questo pagamento. + <notification label="Avviso modalità Non disturbare" name="DoNotDisturbModePay"> + Hai attivato la modalità Non disturbare. Non riceverai alcun oggetto offerto in cambio di questo pagamento. -Desideri abbandonare la modalità 'Occupato' prima di completare questa transazione? +Vuoi disattivare la modalità Non disturbare prima di completare questa transazione? <form name="form"> - <ignore name="ignore" save_option="true" text="Sto per pagare una persona o un oggetto mentro sono in modalià Non disponibile"/> - <button ignore="Always leave Busy Mode" name="Yes" text="OK"/> - <button ignore="Never leave Busy Mode" name="No" text="Abbandona"/> + <ignore name="ignore" text="Sto per pagare una persona o un oggetto mentre sono in modalità Non disturbare"/> + <button ignore="Lascia sempre la modalità Non disturbare" name="Yes" text="OK"/> + <button ignore="Non lasciare mai la modalità Non disturbare" name="No" text="Annulla"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2255,11 +2280,8 @@ Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubica <notification name="GroupNotice"> Oggetto: [SUBJECT], Messaggio: [MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> è online - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> è offline + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> è [STATUS] </notification> <notification name="AddSelfFriend"> Anche se sei molto simpatico, non puoi aggiungere te stesso all'elenco degli amici. @@ -2487,13 +2509,6 @@ Qui non puoi volare. <notification name="DynamicPathfindingDisabled"> Il pathfinding dinamico non è attivato in questa regione. Gli oggetti scriptati che usano chiamate LSL di pathfinding potrebbero non funzionare come previsto in questa regione. </notification> - <notification name="PathfindingRebakeNavmesh"> - Se modifichi alcuni oggetti in questa regione, ciò potrebbe causare il comportamento errato di altri oggetti in movimento. Per fare in modo che gli oggetti in movimento si comportino correttamente, fai clic sul pulsante "Rebake regione". Per maggiori informazioni, seleziona la guida - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="Guida" ignoretext="Se modifichi alcuni oggetti in questa regione, ciò potrebbe causare il comportamento errato di altri oggetti in movimento." name="okhelpignore" yestext="OK"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> Si è verificato un errore. Potrebbe trattarsi di un problema di rete o del server, oppure potresti non avere le autorizzazioni necessarie per la costruzione. A volte il problema viene risolto uscendo ed eseguendo nuovamente l'accesso. <usetemplate name="okbutton" yestext="OK"/> @@ -2754,9 +2769,9 @@ OK? </form> </notification> <notification name="ScriptQuestionCaution"> - Attenzione: L'oggetto '<nolink>[OBJECTNAME]</nolink>' ha richiesto accesso completo al tuo account in Dollari Linden. Se consenti l'accesso, potrà rimuovere fondi dal tuo account in qalunque momento e anche svuotare completamente l'account, per un periodo illimitato e senza ulteriori avvisi. + Avviso: L'oggetto '<nolink>[OBJECTNAME]</nolink>' ha richiesto accesso completo al tuo account in Dollari Linden. Se consenti l'accesso, potrà rimuovere fondi dal tuo account in qualunque momento e anche svuotare completamente l'account, per un periodo illimitato e senza ulteriori avvisi. -Raramente questo tipo di richiesta è legittima. Non consentire l'accesso se non comprendi perfettamente il motivo per cui desidera accedere al tuo account. +Non consentire l'accesso se non comprendi perfettamente il motivo per cui desidera accedere al tuo account. <form name="form"> <button name="Grant" text="Consenti accesso totale"/> <button name="Deny" text="Nega"/> @@ -3338,4 +3353,633 @@ Tentativo annullato. Stai per cancellare [NUM_ITEMS] elementi. Vuoi continuare? <usetemplate ignoretext="Sei sicuro di volere eliminare più oggetti?" name="okcancelignore" notext="No" yestext="Sì"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] ti ha congelato. Non ti puoi muovere o interagire con il mondo. + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] ti ha congelato per [AV_FREEZE_TIME] secondi. Non ti puoi muovere o interagire con il mondo. + </notification> + <notification name="YouFrozeAvatar"> + Avatar congelato. + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] ti ha scongelato. + </notification> + <notification name="AvatarUnFrozen"> + Avatar scongelato. + </notification> + <notification name="AvatarFreezeFailure"> + La congelazione non ha avuto successo perché non hai le autorizzazioni dell'amministratore per quel lotto. + </notification> + <notification name="AvatarFreezeThaw"> + Non sei più congelato, puoi continuare. + </notification> + <notification name="AvatarCantFreeze"> + Non puoi congelare quell'utente. + </notification> + <notification name="NowOwnObject"> + Sei ora il proprietario dell'oggetto [OBJECT_NAME] + </notification> + <notification name="CantRezOnLand"> + Non puoi rezzare l'oggetto a [OBJECT_POS] perché non è consentito dal proprietario del terreno. Usa lo strumento terreno per visualizzare a chi appartiene il terreno. + </notification> + <notification name="RezFailTooManyRequests"> + Oggetto non razzato perché ci sono troppe richieste. + </notification> + <notification name="SitFailCantMove"> + Non puoi sederti perché al momento non puoi muoverti. + </notification> + <notification name="SitFailNotAllowedOnLand"> + Non puoi sederti perché non ti è consentito entrare in quel terreno. + </notification> + <notification name="SitFailNotSameRegion"> + Proba ad avvicinarti. Non puoi sederti su un oggetto perché +non è nella stessa regione in cui ti trovi. + </notification> + <notification name="NoNewObjectRegionFull"> + Impossibile creare il nuovo oggetto. La regione è piena. + </notification> + <notification name="FailedToPlaceObject"> + Il posizionamento dell'oggetto nella posizione specificata non è riuscito. Riprova. + </notification> + <notification name="NoOwnNoGardening"> + Non puoi creare alberi ed erba su terreni che non sono di tua proprietà . + </notification> + <notification name="NoCopyPermsNoObject"> + Copia non riuscita perché non hai l'autorizzazione necessaria per copiare l'oggetto '[OBJ_NAME]'. + </notification> + <notification name="NoTransPermsNoObject"> + La copia non è riuscita perché '[OBJ_NAME]' non può essere trasferito a te. + </notification> + <notification name="AddToNavMeshNoCopy"> + La copia non è riuscita perché '[OBJ_NAME]' contribuisce al navmesh. + </notification> + <notification name="DupeWithNoRootsSelected"> + Duplicato senza oggetto principale selezionato. + </notification> + <notification name="CantDupeCuzRegionIsFull"> + Impossibile duplicare gli oggetti perché la regione è piena. + </notification> + <notification name="CantDupeCuzParcelNotFound"> + Impossibile duplicare gli oggetti - Impossibile trovare i lotti in cui si trovano. + </notification> + <notification name="CantCreateCuzParcelFull"> + Impossibile creare l'oggetto perché +il lotto è pieno. + </notification> + <notification name="RezAttemptFailed"> + Tentativo di rezzare un oggetto non riuscito. + </notification> + <notification name="ToxicInvRezAttemptFailed"> + Impossibile creare un oggetto che ha causato problemi in questa regione. + </notification> + <notification name="InvItemIsBlacklisted"> + L'oggetto dell'inventario è stato aggiunto alla blacklist. + </notification> + <notification name="NoCanRezObjects"> + Al momento non ti è consentito creare oggetti. + </notification> + <notification name="LandSearchBlocked"> + Ricerca terreno bloccata. +Hai eseguito troppe ricerche terreno in un breve tempo. +Riprova tra un minuto. + </notification> + <notification name="NotEnoughResourcesToAttach"> + Risorse di script non sufficienti per collegare l'oggetto. + </notification> + <notification name="YouDiedAndGotTPHome"> + Sei deceduto e sei stato teleportato alla tua posizione iniziale + </notification> + <notification name="EjectComingSoon"> + Non sei più benvenuto qui e hai [EJECT_TIME] secondi per andartene. + </notification> + <notification name="NoEnterServerFull"> + Non puoi entrare in questa regione perché +il server è pieno. + </notification> + <notification name="SaveBackToInvDisabled"> + Opzione Salva nell'inventario disattivata + </notification> + <notification name="NoExistNoSaveToContents"> + Impossibile salvare '[OBJ_NAME]' nei contenuti dell'oggetto perché l'oggetto da cui è stato razzato non esiste più. + </notification> + <notification name="NoModNoSaveToContents"> + Impossibile salvare '[OBJ_NAME]' nei contenuti dell'oggetto perché non hai l'autorizzazione necessaria per modificare l'oggetto '[DEST_NAME]'. + </notification> + <notification name="NoSaveBackToInvDisabled"> + Impossibile riportare '[OBJ_NAME]' nell'inventario -- questa operazione è stata disattivata. + </notification> + <notification name="NoCopyNoSelCopy"> + Non puoi copiare l'elemento selezionato perché non hai l'autorizzazione necessaria per copiare l'oggetto '[OBJ_NAME]'. + </notification> + <notification name="NoTransNoSelCopy"> + Non puoi copiare la selezione perché l'oggetto '[OBJ_NAME]' non può essere trasferito. + </notification> + <notification name="NoTransNoCopy"> + Non puoi copiare la selezione perché l'oggetto '[OBJ_NAME]' non può essere trasferito. + </notification> + <notification name="NoPermsNoRemoval"> + La rimozione dell'oggetto '[OBJ_NAME]' dal simulatore non è consentita dal sistema delle autorizzazioni. + </notification> + <notification name="NoModNoSaveSelection"> + Non puoi salvare l'elemento selezionato perché non hai l'autorizzazione necessaria per modificare l'oggetto '[OBJ_NAME]'. + </notification> + <notification name="NoCopyNoSaveSelection"> + Non puoi salvare la selezione perché l'oggetto '[OBJ_NAME]' non può essere copiato. + </notification> + <notification name="NoModNoTaking"> + Non puoi prendere l'elemento selezionato perché non hai l'autorizzazione necessaria per modificare l'oggetto '[OBJ_NAME]'. + </notification> + <notification name="RezDestInternalError"> + Errore interno: Tipo di destinazione sconosciuto. + </notification> + <notification name="DeleteFailObjNotFound"> + Cancellazione non riuscita perché l'oggetto non è stato trovato. + </notification> + <notification name="SorryCantEjectUser"> + Non puoi espellere quell'utente. + </notification> + <notification name="RegionSezNotAHome"> + Questa regione non ti consente di impostare qui la tua posizione iniziale. + </notification> + <notification name="HomeLocationLimits"> + Puoi impostare la tua posizione iniziale nel tuo terreno o in un Infohub sulla terraferma. + </notification> + <notification name="HomePositionSet"> + Posizione di base impostata. + </notification> + <notification name="AvatarEjected"> + Avatar espulso. + </notification> + <notification name="AvatarEjectFailed"> + L'espulsione non ha avuto successo perché non hai l'autorizzazione dell'amministratore del lotto. + </notification> + <notification name="CantMoveObjectParcelFull"> + Impossibile muovere l'oggetto '[OBJECT_NAME]' a +[OBJ_POSITION] nella regione [REGION_NAME] perché il lotto è pieno. + </notification> + <notification name="CantMoveObjectParcelPerms"> + Impossibile muovere l'oggetto '[OBJECT_NAME]' a +[OBJ_POSITION] nella regione [REGION_NAME] perché i tuoi oggetti non sono ammessi su questo lotto. + </notification> + <notification name="CantMoveObjectParcelResources"> + Impossibile muovere l'oggetto '[OBJECT_NAME]' a +[OBJ_POSITION] nella regione [REGION_NAME] perché non ci sono risorse sufficienti per l'oggetto su questo lotto. + </notification> + <notification name="CantMoveObjectRegionVersion"> + Impossibile muovere l'oggetto '[OBJECT_NAME]' a +[OBJ_POSITION] nella regione [REGION_NAME] perché nell'altra regione è in esecuzione una versione precedente che non consente la ricezione di questo oggetto attraverso i confini tra regioni. + </notification> + <notification name="CantMoveObjectNavMesh"> + Impossibile muovere l'oggetto '[OBJECT_NAME]' a +[OBJ_POSITION] nella regione [REGION_NAME] perché non puoi modificare il navmesh attraverso il confine tra regioni. + </notification> + <notification name="CantMoveObjectWTF"> + Impossibile muovere l'oggetto '[OBJECT_NAME]' a +[OBJ_POSITION] nella regione [REGION_NAME] per un motivo sconosciuto. ([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + Non hai l'autorizzazione necessaria per modificare questa immagine + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + Non è possibile attivare la fisica per un oggetto che contribuisce al navmesh. + </notification> + <notification name="CantEnablePhysKeyframedObj"> + Impossibile attivare la fisica per oggetti keyframe. + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + Impossibile attivare la fisica per l'oggetto -- risorse di terreno insufficienti. + </notification> + <notification name="CantEnablePhysCostTooGreat"> + Impossibile attivare la fisica per un oggetto con un costo delle risorse della fisica maggiore di [MAX_OBJECTS] + </notification> + <notification name="PhantomWithConcavePiece"> + Questo oggetto non può avere un pezzo concavo perché è un oggetto fantasma e contribuisce al navmesh. + </notification> + <notification name="UnableAddItem"> + Aggiunta elemento non riuscita + </notification> + <notification name="UnableEditItem"> + Impossibile modificare questo elemento. + </notification> + <notification name="NoPermToEdit"> + Non sei autorizzato a modificare questo elemento. + </notification> + <notification name="NoPermToCopyInventory"> + Non ti è permesso copiare quell'inventario. + </notification> + <notification name="CantSaveItemDoesntExist"> + Impossibile salvare i contenuti dell'oggetto: L'elemento non esiste più. + </notification> + <notification name="CantSaveItemAlreadyExists"> + Impossibile salvare i contenuti dell'oggetto: Nell'inventario esiste già un elemento con quel nome. + </notification> + <notification name="CantSaveModifyAttachment"> + Impossibile salvare i contenuti dell'oggetto: Verrebbero modificate le autorizzazioni per il collegamento. + </notification> + <notification name="TooManyScripts"> + Troppi script. + </notification> + <notification name="UnableAddScript"> + Aggiunta script non riuscita. + </notification> + <notification name="AssetServerTimeoutObjReturn"> + Il server degli asset non ha inviato una risposta entro il tempo massimo. Oggetto restituito al sim. + </notification> + <notification name="RegionDisablePhysicsShapes"> + In questa regione non sono attivate le forme per la fisica. + </notification> + <notification name="NoModNavmeshAcrossRegions"> + Non puoi modificare il navmesh attraverso il confine tra le regioni. + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + Impossibile impostare le proprietà della fisica per quel tipo di oggetto. + </notification> + <notification name="NoSetRootPrimWithNoShape"> + impossibile impostare un prim principale senza forma. + </notification> + <notification name="NoRegionSupportPhysMats"> + In questa regione non sono attivati i materiali per la fisica. + </notification> + <notification name="OnlyRootPrimPhysMats"> + I materiali per la fisica possono essere modificati solo i prim principali. + </notification> + <notification name="NoSupportCharacterPhysMats"> + L'impostazione dei materiali per la fisica nei caratteri non è ancora supportata. + </notification> + <notification name="InvalidPhysMatProperty"> + Almeno una delle proprietà dei materiali per la fisica non è valida. + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + Non puoi alterare il tipo di punto di un oggetto con reticolo + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + Non puoi alterare la forma di un oggetto con reticolo + </notification> + <notification name="FullRegionCantEnter"> + Non puoi entrare in questa regione perché è piena. + </notification> + <notification name="LinkFailedOwnersDiffer"> + Collegamento non riuscito -- i proprietari non corrispondono + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + Collegamento non riuscito -- non puoi modificare il navmesh attraverso il confine tra le regioni. + </notification> + <notification name="LinkFailedNoPermToEdit"> + Collegamento non riuscito perché non hai le autorizzazioni necessarie per la modifica. + </notification> + <notification name="LinkFailedTooManyPrims"> + Collegamento non riuscito -- troppe primitive. + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + Collegamento non riuscito -- impossibile collegare elementi senza copia ed elementi senza trasferimento + </notification> + <notification name="LinkFailedNothingLinkable"> + Collegamento non riuscito -- niente di collegabile. + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + Collegamento non riuscito -- troppi personaggi con pathfinding + </notification> + <notification name="LinkFailedInsufficientLand"> + Collegamento non riuscito -- risorse terreno non sufficienti + </notification> + <notification name="LinkFailedTooMuchPhysics"> + L'oggetto usa troppe risorse per la fisica -- le sue dinamiche sono state disattivate. + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + Sei stato teleportato nella posizione iniziale dall'oggetto '[OBJECT_NAME]' del lotto '[PARCEL_NAME]' + </notification> + <notification name="TeleportedHomeByObject"> + Sei stato teleportato nella tua posizione iniziale dall'oggetto '[OBJECT_NAME]' + </notification> + <notification name="TeleportedByAttachment"> + Sei stato teletrasportato da un elemento collegato a [ITEM_ID] + </notification> + <notification name="TeleportedByObjectOnParcel"> + Sei stato teleportato dall'oggetto '[OBJECT_NAME]' sul lotto '[PARCEL_NAME]' + </notification> + <notification name="TeleportedByObjectOwnedBy"> + Sei stato teleportato dall'oggetto '[OBJECT_NAME]' di proprietà di [OWNER_ID] + </notification> + <notification name="TeleportedByObjectUnknownUser"> + Sei stato teleportato dall'oggetto '[OBJECT_NAME]' di proprietà di un utente sconosciuto. + </notification> + <notification name="CantCreateObjectRegionFull"> + Impossibile creare l'oggetto richiesto. La regione è piena. + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + Non puoi collegare più oggetti a un singolo luogo. + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + Non puoi creare oggetti multipli in questa posizione. + </notification> + <notification name="UnableToCreateObjTimeOut"> + Impossibile creare l'oggetto richiesto. L'oggetto non è presente nel database. + </notification> + <notification name="UnableToCreateObjUnknown"> + Impossibile creare l'oggetto richiesto. Tempo scaduto per la richiesta. Riprova. + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + Impossibile creare l'oggetto richiesto. Riprova. + </notification> + <notification name="RezFailureTookTooLong"> + Rezzing non riuscito. Il caricamento dell'oggetto richiesto è durato troppo a lungo. + </notification> + <notification name="FailedToPlaceObjAtLoc"> + Il posizionamento dell'oggetto nella posizione specificata non è riuscito. Riprova. + </notification> + <notification name="CantCreatePlantsOnLand"> + Non puoi creare piante su questo terreno. + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + Impossibile ripristinare l'oggetto. Nessuna posizione trovata nel mondo virtuale. + </notification> + <notification name="CantRezObjectInvalidMeshData"> + Impossibile rezzare l'oggetto perché i dati del reticolo non sono validi. + </notification> + <notification name="CantRezObjectTooManyScripts"> + Impossibile rezzare l'oggetto perché ci sono già troppi script in questa regione. + </notification> + <notification name="CantCreateObjectNoAccess"> + Le tue autorizzazioni di accesso non ti permettono di creare oggetti in quella posizione. + </notification> + <notification name="CantCreateObject"> + Al momento non ti è consentito creare oggetti. + </notification> + <notification name="InvalidObjectParams"> + Parametri oggetto non validi + </notification> + <notification name="CantDuplicateObjectNoAcess"> + Le tue autorizzazioni di accesso non ti permettono di duplicare oggetti in questa posizione. + </notification> + <notification name="CantChangeShape"> + Non ti è consentito modificare questa forma. + </notification> + <notification name="NoAccessToClaimObjects"> + Le tue autorizzazioni di accesso non ti permettono di richiedere oggetti in questa posizione. + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + Assegnazione non riuscita perché non hai l'autorizzazione necessaria per assegnare oggetti per il tuo gruppo. + </notification> + <notification name="NoPrivsToBuyObject"> + Le tue autorizzazioni di accesso non ti permettono di acquistare oggetti in questa posizione. + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + Impossibile collegare l'oggetto perché un avatar è seduto sopra. + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + Alberi ed erba non possono essere indossati come collegati. + </notification> + <notification name="CantAttachGroupOwnedObjs"> + Impossibile collegare oggetti di proprietà di un gruppo. + </notification> + <notification name="CantAttachObjectsNotOwned"> + Non puoi collegare oggetti che non sono di tua proprietà . + </notification> + <notification name="CantAttachNavmeshObjects"> + Impossibile collegare oggetti che contribuiscono a navmesh. + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + L'oggetto non può essere collegato perché non sei autorizzato a muoverlo. + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + Risorse di script non sufficienti per collegare l'oggetto. + </notification> + <notification name="CantDropItemTrialUser"> + Non puoi lasciare oggetti qui, prova la zona Prova gratuita. + </notification> + <notification name="CantDropMeshAttachment"> + Non puoi lasciare elementi collegati con reticolo. Separa nell'inventario e quindi rezza nel mondo virtuale. + </notification> + <notification name="CantDropAttachmentNoPermission"> + Impossibile rimuovere l'elemento collegato: non hai l'autorizzazione necessaria per rimuoverlo qui. + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + Impossibile rimuovere l'elemento collegato: risorse terreno disponibili non sufficienti. + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + Impossibile rimuovere gli elementi collegati: risorse disponibili non sufficienti. + </notification> + <notification name="CantDropObjectFullParcel"> + Non puoi lasciare l'oggetto qui. Il lotto è pieno. + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + Non puoi toccare/afferrare questo oggetto perché sei stato bandito dal lotto di terreno. + </notification> + <notification name="PlzNarrowDeleteParams"> + Limita i parametri per la cancellazione. + </notification> + <notification name="UnableToUploadAsset"> + Impossibile caricare l'asset. + </notification> + <notification name="CantTeleportCouldNotFindUser"> + Utente da teleportare alla posizione iniziale non trovato + </notification> + <notification name="GodlikeRequestFailed"> + richiesta superpoteri non riuscita + </notification> + <notification name="GenericRequestFailed"> + richiesta generica non riuscita + </notification> + <notification name="CantUploadPostcard"> + Impossibile caricare la cartolina. Riprova più tardi. + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + I dettagli dell'inventario per la notifica di gruppo non sono stati trovati. + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + Impossibile inviare la notifica di gruppo -- non consentita. + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + Impossibile inviare la notifica di gruppo -- impossibile costruire l'inventario. + </notification> + <notification name="CantParceInventoryInNotice"> + Impossibile analizzare l'inventario nella notifica. + </notification> + <notification name="TerrainUploadFailed"> + Caricamento terreno non riuscito. + </notification> + <notification name="TerrainFileWritten"> + File terreno scritto. + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + File terreno generato, avvio del download... + </notification> + <notification name="TerrainBaked"> + Baking terreno completata. + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + Sono stati disattivati solo i primi 10 oggetti. Se necessario, aggiorna e seleziona nuovamente. + </notification> + <notification name="UpdateViewerBuyParcel"> + Devi aggiornare il Viewer per poter acquistare questo lotto. + </notification> + <notification name="CantBuyParcelNotForSale"> + Impossibile acquistare, questo lotto non è in vendita. + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + Impossibile acquistare. Il prezzo o l'area del terreno sono stati cambiati. + </notification> + <notification name="CantBuyParcelNotAuthorized"> + Non sei l'acquirente autorizzato di questo lotto. + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + Non puoi acquistare questo lotto perché è in attesa di autorizzazione all'acquisto + </notification> + <notification name="CantBuildOverflowParcel"> + Non puoi costruire oggetti qui perché si supererebbe il limite per il lotto. + </notification> + <notification name="SelectedMultipleOwnedLand"> + hai selezionato terreni con proprietari diversi. Seleziona un'area più piccola e riprova. + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + Non sono stati selezionati abbastanza lotti affittati da collegare. + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + Terreno non divisibile.\nHai selezionato più di un lotto.\nProva a selezionare una quantità di terreno più piccola. + </notification> + <notification name="CantDivideLandCantFindParcel"> + impossibile suddividere il terreno.\nimpossibile trovare il lotto.\nInvia una segnalazione con Aiuto -> Segnala bug... + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + Impossibile suddividere il terreno. È stato selezionato l'intero lotto.\nProva a selezionare un pezzo di terreno più piccolo. + </notification> + <notification name="LandHasBeenDivided"> + Il terreno è stato diviso. + </notification> + <notification name="PassPurchased"> + Hai acquistato un pass. + </notification> + <notification name="RegionDisallowsClassifieds"> + Nella regione non sono permessi gli annunci pubblicitari. + </notification> + <notification name="LandPassExpireSoon"> + Il tuo pass per questo terreno è quasi scaduto. + </notification> + <notification name="CantSitNoSuitableSurface"> + Nessuna superficie adatta a sedersi, prova un altro luogo. + </notification> + <notification name="CantSitNoRoom"> + Non c'è posto per sedersi, prova un altro luogo. + </notification> + <notification name="ClaimObjectFailedNoPermission"> + La richiesta dell'oggetto non ha avuto successo perché non hai l'autorizzazione necessaria. + </notification> + <notification name="ClaimObjectFailedNoMoney"> + La richiesta dell'oggetto non ha avuto successo perché non hai L$ sufficienti. + </notification> + <notification name="CantDeedGroupLand"> + Non puoi assegnare terreno di proprietà di un gruppo. + </notification> + <notification name="BuyObjectFailedNoMoney"> + L'acquisto dell'oggetto non ha avuto successo perché non hai L$ sufficienti. + </notification> + <notification name="BuyInventoryFailedNoMoney"> + L'acquisto dell'inventario non ha avuto successo perché non hai L$ sufficienti. + </notification> + <notification name="BuyPassFailedNoMoney"> + Non hai abbastanza L$ per acquistare un pass per questo terreno. + </notification> + <notification name="CantBuyPassTryAgain"> + Al momento non puoi acquistare un pass. Riprova più tardi. + </notification> + <notification name="CantCreateObjectParcelFull"> + Impossibile creare l'oggetto perché il lotto è pieno. + </notification> + <notification name="FailedPlacingObject"> + Il posizionamento dell'oggetto nella posizione specificata non è riuscito. Riprova. + </notification> + <notification name="CantCreateLandmarkForEvent"> + Impossibile creare il punto di riferimento per l'evento. + </notification> + <notification name="GodBeatsFreeze"> + I tuoi superpoteri hanno interrotto la congelazione. + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + Richiesta di poteri speciali non riuscita. La richiesta è stata registrata. + </notification> + <notification name="ExpireExplanation"> + Al momento il sistema non è in grado di elaborare la tua richiesta. Tempo scaduto per la richiesta. + </notification> + <notification name="DieExplanation"> + Il sistema non è in grado di elaborare la tua richiesta. + </notification> + <notification name="AddPrimitiveFailure"> + Denaro insufficiente per creare una primitiva. + </notification> + <notification name="RezObjectFailure"> + Denaro insufficiente per creare un oggetto. + </notification> + <notification name="ResetHomePositionNotLegal"> + Posizione iniziale ripristinata perché non era valida. + </notification> + <notification name="CantInviteRegionFull"> + Al momento non puoi invitare nessuno alla tua posizione perché la regione è piena. Riprova più tardi. + </notification> + <notification name="CantSetHomeAtRegion"> + Questa regione non ti consente di impostare qui la tua posizione iniziale. + </notification> + <notification name="ListValidHomeLocations"> + Puoi impostare la tua posizione iniziale nel tuo terreno o in un Infohub sulla terraferma. + </notification> + <notification name="SetHomePosition"> + Posizione di base impostata. + </notification> + <notification name="CantDerezInventoryError"> + Impossibile derazzare l'oggetto a causa di un errore nell'inventario. + </notification> + <notification name="CantCreateRequestedInv"> + Impossibile creare l'inventario richiesto. + </notification> + <notification name="CantCreateRequestedInvFolder"> + Impossibile creare la cartella dell'inventario richiesta. + </notification> + <notification name="CantCreateInventory"> + Impossibile creare quell'inventario. + </notification> + <notification name="CantCreateLandmark"> + Impossibile creare il punto di riferimento. + </notification> + <notification name="CantCreateOutfit"> + Il vestiario non può essere creato in questo momento. Riprova tra un minuto. + </notification> + <notification name="InventoryNotForSale"> + L'inventario non è in vendita. + </notification> + <notification name="CantFindInvItem"> + Impossibile trovare l'elemento nell'inventario. + </notification> + <notification name="CantFindObject"> + Impossibile trovare l'oggetto. + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + Il trasferimento di denaro agli oggetti è attualmente disattivato in questa regione. + </notification> + <notification name="CantPayNoAgent"> + Non si capisce chi deve essere pagato. + </notification> + <notification name="CantDonateToPublicObjects"> + Non puoi dare L$ a oggetti pubblici. + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + Creazione inventario non riuscito per un oggetto nel mondo virtuale. + </notification> + <notification name="UserBalanceOrLandUsageError"> + Un errore interno ha impedito l'aggiornamento del Viewer. Il saldo in L$ o i lotti posseduti mostrati nel Viewer potrebbero non corrispondere ai valori correnti sui server. + </notification> + <notification name="LargePrimAgentIntersect"> + Non puoi creare prim grandi che intersecano altri giocatori. Riprova quando gli altri giocatori si sono spostati. + </notification> + <notification name="PreferenceChatClearLog"> + Verranno cancellati i registri delle conversazioni precedenti e tutti gli eventuali backup di quel file. + <usetemplate ignoretext="Conferma prima di cancellare il registro delle conversazioni precedenti." name="okcancelignore" notext="Annulla" yestext="OK"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + Verranno cancellate le trascrizioni di tutte le conversazioni precedenti. L'elenco delle conversazioni passate non cambierà . Tutti i file con i suffissi .txt e txt.backup nella cartella [FOLDER] verranno cancellati. + <usetemplate ignoretext="Conferma prima di cancellare le trascrizioni." name="okcancelignore" notext="Annulla" yestext="OK"/> + </notification> + <notification name="PreferenceChatPathChanged"> + Impossibile spostare i file. Il percorso precedente è stato ripristinato. + <usetemplate ignoretext="Impossibile spostare i file. Il percorso precedente è stato ripristinato." name="okignore" yestext="OK"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml index ede19b9e5a..cfceb5b982 100644 --- a/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml @@ -26,5 +26,6 @@ <icon name="permission_edit_mine_icon" tool_tip="Questo amico può modificare, cancellare o prendere i tuoi oggetti"/> <icon name="permission_map_icon" tool_tip="Questo amico può identificarti sulla mappa"/> <icon name="permission_online_icon" tool_tip="Questo amico può vedere se sei online"/> + <button name="info_btn" tool_tip="Maggiori informazioni"/> <button name="profile_btn" tool_tip="Vedi profilo"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml index 610f561a65..7ca2d3b57b 100644 --- a/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> - <text name="title_text"> - Blocca lista - </text> - <scroll_list name="blocked" tool_tip="Lista degli attuali residenti bloccati"/> - <button label="Blocca il residente..." label_selected="Blocca il residente..." name="Block resident..." tool_tip="Scegli un residente da bloccare"/> - <button label="Blocca l'oggetto per nome..." label_selected="Blocca l'oggetto per nome..." name="Block object by name..."/> - <button label="Sblocca" label_selected="Sblocca" name="Unblock" tool_tip="Rimuovi un residente o un oggetto dalla lista bloccati"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="Filtro" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="Azioni sulla persona o oggetto selezionato"/> + <menu_button name="view_btn" tool_tip="Opzioni Ordina"/> + <menu_button name="plus_btn" tool_tip="Seleziona un residente o un oggetto da bloccare"/> + <button name="unblock_btn" tool_tip="Rimuovi un residente o un oggetto dalla lista bloccati"/> + </panel> + <block_list name="blocked" tool_tip="Lista degli attuali residenti bloccati"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/it/panel_conversation_list_item.xml new file mode 100644 index 0000000000..ca6b65300a --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(caricamento in corso)"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/it/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..624eaa639c --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="La conversazione includeva la voce"/> + <icon name="unread_ims_icon" tool_tip="Sono arrivati dei messaggi mentre eri via"/> + <button name="delete_btn" tool_tip="Elimina questo elemento"/> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_group_list_item.xml b/indra/newview/skins/default/xui/it/panel_group_list_item.xml index 7cdc4c7ff6..72e644008c 100644 --- a/indra/newview/skins/default/xui/it/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/it/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="Sconosciuto"/> + <button name="info_btn" tool_tip="Maggiori informazioni"/> <button name="profile_btn" tool_tip="Vedi profilo"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_people.xml b/indra/newview/skins/default/xui/it/panel_people.xml index f903ae6e2c..e1468db76e 100644 --- a/indra/newview/skins/default/xui/it/panel_people.xml +++ b/indra/newview/skins/default/xui/it/panel_people.xml @@ -14,81 +14,53 @@ Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa <string name="no_filtered_friends_msg"> Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/people/[SEARCH_TERM] Cerca]. </string> - <string name="people_filter_label" value="Filtro persone"/> - <string name="groups_filter_label" value="Filtro gruppi"/> <string name="no_filtered_groups_msg" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/groups/[SEARCH_TERM] Cerca]."/> <string name="no_groups_msg" value="Stai cercando gruppi di cui far parte? Prova [secondlife:///app/search/groups Cerca]."/> <string name="MiniMapToolTipMsg" value="[REGION](Fai doppio clic per aprire la Mappa, premi il tasto Maiusc e trascina per la panoramica)"/> <string name="AltMiniMapToolTipMsg" value="[REGION](Fai doppio clic per teleportarti, premi il tasto Maiusc e trascina per la panoramica)"/> - <filter_editor label="Filtro" name="filter_input"/> <tab_container name="tabs"> <panel label="NELLE VICINANZE" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="Opzioni"/> - <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista degli amici"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="Filtro persone" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="Azioni per la persona selezionata:"/> + <menu_button name="nearby_view_btn" tool_tip="Opzioni Mostra/Ordina"/> + <button name="add_friend_btn" tool_tip="Offri amicizia a un residente"/> + <dnd_button name="nearby_del_btn" tool_tip="Rimuovi la persona selezionata dagli amici"/> </panel> </panel> - <panel label="I MIEI AMICI" name="friends_panel"> + <panel label="AMICI" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="Filtro persone" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="Azioni per la persona selezionata:"/> + <menu_button name="friends_view_btn" tool_tip="Opzioni Mostra/Ordina"/> + <button name="friends_add_btn" tool_tip="Offri amicizia a un residente"/> + <dnd_button name="friends_del_btn" tool_tip="Rimuovi la persona selezionata dagli amici"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="Online"/> <accordion_tab name="tab_all" title="Tutto"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="Mostra ulteriori opzioni"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="Offri amicizia a un residente"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="Rimuovi la persona selezionata dalla lista degli amici"/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="I MIEI GRUPPI" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="Opzioni"/> - <button name="plus_btn" tool_tip="Aderisci al gruppo/Crea nuovo gruppo"/> - <button name="activate_btn" tool_tip="Attiva il gruppo selezionato"/> + <panel label="GRUPPI" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="Filtro gruppi" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="Azioni per il gruppo selezionato:"/> + <menu_button name="groups_view_btn" tool_tip="Opzioni Mostra/Ordina"/> + <menu_button name="plus_btn" tool_tip="Aderisci al gruppo/Crea nuovo gruppo"/> + <dnd_button name="minus_btn" tool_tip="Lascia il gruppo selezionato"/> </panel> </panel> <panel label="RECENTE" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="Opzioni"/> - <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista degli amici"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="Filtro persone" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="Azioni per la persona selezionata:"/> + <menu_button name="recent_view_btn" tool_tip="Opzioni Mostra/Ordina"/> + <button name="add_friend_btn" tool_tip="Offri amicizia a un residente"/> + <dnd_button name="recent_del_btn" tool_tip="Rimuovi la persona selezionata dagli amici"/> </panel> </panel> + <panel label="BLOCCATO" name="blocked_panel"> + <panel label="Residenti e oggetti bloccati" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="Profilo" name="view_profile_btn" tool_tip="Mostra immagine, gruppi e altre informazioni del residente"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="IM" name="im_btn" tool_tip="Apri una sessione messaggio istantaneo"/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="Chiama" name="call_btn" tool_tip="Chiama questo residente"/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="Condividi" name="share_btn" tool_tip="Condividi un oggetto dell'inventario"/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="Teleport" name="teleport_btn" tool_tip="Offri teleport"/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="Profilo del gruppo" name="group_info_btn" tool_tip="Mostra informazioni gruppo"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="Chat di gruppo" name="chat_btn" tool_tip="Apri sessione chat"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="Chiamata al gruppo" name="group_call_btn" tool_tip="Chiama questo gruppo"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml index 0c9c4027e5..c2ac6e97a9 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Text Chat" name="chat"> - <text name="font_size"> - Dimensioni caratteri: - </text> - <radio_group name="chat_font_size"> - <radio_item label="Piccola" name="radio" value="0"/> - <radio_item label="Media" name="radio2" value="1"/> - <radio_item label="Grande" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="true" label="Simula la battitura tasti quando scrivi" name="play_typing_animation"/> - <check_box label="Quando sono OFF-LINE, spediscimi gli IM in una e-mail" name="send_im_to_email"/> - <check_box label="Attiva IM in testo semplice e cronologia chat" name="plain_text_chat_history"/> - <check_box label="Chat a vignetta" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - Mostra gli IM in: - </text> - <text name="requires_restart_label"> - (richiede il riavvio) - </text> - <radio_group name="chat_window" tool_tip="Mostra i tuoi messaggi istantanei in diverse finestre, o in una finestra con più schede (richiede il riavvio)"> - <radio_item label="Finestre separate" name="radio" value="0"/> - <radio_item label="Schede" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - Attiva popup per chat in arrivo: - </text> - <check_box label="Chat di gruppo" name="EnableGroupChatPopups" tool_tip="Seleziona per vedere una finestra popup quando arriva una chat di gruppo"/> - <check_box label="Chat IM" name="EnableIMChatPopups" tool_tip="Seleziona per vedere una finestra popup quando arriva un messaggio IM"/> - <spinner label="Durata chat vicine:" name="nearby_toasts_lifetime"/> - <spinner label="Durata dissolvenza chat vicine:" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="true" label="Simula la battitura tasti quando scrivi" name="play_typing_animation"/> + <check_box label="Quando sono OFF-LINE, spediscimi gli IM in una e-mail" name="send_im_to_email"/> + <check_box label="Solo amici e gruppi possono chiamarmi o mandarmi IM" name="voice_call_friends_only_check"/> + <text name="font_size"> + Dimensioni caratteri: + </text> + <combo_box name="chat_font_size"> + <item label="Piccolo" name="Small" value="0"/> + <item label="Medio" name="Medium" value="1"/> + <item label="Grande" name="Large" value="2"/> + </combo_box> + <check_box label="Chat a vignetta" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + Notifiche + </text> + <text name="friend_ims"> + IM degli amici: + </text> + <combo_box name="FriendIMOptions"> + <item label="Apri finestra Conversazioni" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mostra il messaggio in una finestra pop-up" name="PopUpMessage" value="toast"/> + <item label="Pulsante barra strumenti Flash" name="FlashToolbarButton" value="flash"/> + <item label="Nessuno" name="None" value="none"/> + </combo_box> + <text name="non_friend_ims"> + IM non di amici: + </text> + <combo_box name="NonFriendIMOptions"> + <item label="Apri finestra Conversazioni" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mostra il messaggio in una finestra pop-up" name="PopUpMessage" value="toast"/> + <item label="Pulsante barra strumenti Flash" name="FlashToolbarButton" value="flash"/> + <item label="Nessuno" name="None" value="none"/> + </combo_box> + <text name="conference_ims"> + IM conferenza: + </text> + <combo_box name="ConferenceIMOptions"> + <item label="Apri finestra Conversazioni" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mostra il messaggio in una finestra pop-up" name="PopUpMessage" value="toast"/> + <item label="Pulsante barra strumenti Flash" name="FlashToolbarButton" value="flash"/> + <item label="Nessuno" name="None" value="none"/> + </combo_box> + <text name="group_chat"> + Chat di gruppo: + </text> + <combo_box name="GroupChatOptions"> + <item label="Apri finestra Conversazioni" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mostra il messaggio in una finestra pop-up" name="PopUpMessage" value="toast"/> + <item label="Pulsante barra strumenti Flash" name="FlashToolbarButton" value="flash"/> + <item label="Nessuno" name="None" value="none"/> + </combo_box> + <text name="nearby_chat"> + Chat nei dintorni: + </text> + <combo_box name="NearbyChatOptions"> + <item label="Apri finestra Conversazioni" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mostra il messaggio in una finestra pop-up" name="PopUpMessage" value="toast"/> + <item label="Pulsante barra strumenti Flash" name="FlashToolBarButton" value="flash"/> + <item label="Nessuno" name="None" value="none"/> + </combo_box> + <text name="notifications_alert"> + Per interrompere temporaneamente le notifiche, usa Comunica > Non disturbare. + </text> + </panel> + <panel> + <text name="play_sound"> + Riproduci suono: + </text> + <check_box label="Nuova conversazione" name="new_conversation"/> + <check_box label="Chiamata voce in arrivo" name="incoming_voice_call"/> + <check_box label="Offerta di Teleport" name="teleport_offer"/> + <check_box label="Offerta inventario" name="inventory_offer"/> + </panel> + <panel> + <button label="Cancella registro..." name="clear_log"/> + <button label="Cancella trascrizioni..." name="delete_transcripts"/> + <button label="Sfoglia..." label_selected="Sfoglia" name="log_path_button"/> + </panel> <button label="Traduzione..." name="ok_btn"/> <button label="Sostituzione automatica..." name="autoreplace_showgui"/> <button label="Correzione ortografica..." name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_general.xml b/indra/newview/skins/default/xui/it/panel_preferences_general.xml index 90a833471c..45cc06c2ea 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_general.xml @@ -69,6 +69,9 @@ <combo_box.item label="mai" name="item4"/> </combo_box> <text name="text_box3"> - Risposta in modalità occupato: + Risposta Non disturbare: </text> + <text_editor name="do_not_disturb_response"> + log_in_to_change + </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml index 8a0f93e650..5f912dd126 100644 --- a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="Acquista oggetto" name="Buyobject"/> <combo_box.item label="Paga oggetto" name="Payobject"/> <combo_box.item label="Apri" name="Open"/> + <combo_box.item label="Ingrandisci" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index fb1e387468..f95318542b 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -134,7 +134,7 @@ Esci </string> <string name="create_account_url"> - http://join.secondlife.com/index.php?lang=it-IT&sourceid=[sourceid] + http://join.secondlife.com/?sourceid=[sourceid] </string> <string name="LoginFailedViewerNotPermitted"> Il viewer utilizzato non è più in grado di accedere a Second Life. Visita la parina seguente per scaricare un nuovo viewer: @@ -616,8 +616,8 @@ Prova ad accedere nuovamente tra un minuto. <string name="AvatarAway"> Assente </string> - <string name="AvatarBusy"> - Occupato + <string name="AvatarDoNotDisturb"> + Non disturbare </string> <string name="AvatarMuted"> Mutato @@ -853,6 +853,12 @@ Prova ad accedere nuovamente tra un minuto. <string name="ST_NO_JOINT"> Impossibile trovare ROOT o JOINT. </string> + <string name="NearbyChatTitle"> + Chat nei dintorni + </string> + <string name="NearbyChatLabel"> + (Chat nei dintorni) + </string> <string name="whisper"> sussurra: </string> @@ -916,6 +922,9 @@ Prova ad accedere nuovamente tra un minuto. <string name="ControlYourCamera"> Controllare la tua fotocamera </string> + <string name="AgentNameSubst"> + (Tu) + </string> <string name="TeleportYourAgent"> Teleportarti </string> @@ -1000,18 +1009,6 @@ Prova ad accedere nuovamente tra un minuto. <string name="dictionary_files"> Dizionari </string> - <string name="AvatarSetNotAway"> - Imposta come non assente - </string> - <string name="AvatarSetAway"> - Imposta come assente - </string> - <string name="AvatarSetNotBusy"> - Imposta come non occupato - </string> - <string name="AvatarSetBusy"> - Imposta come occupato - </string> <string name="shape"> Figura corporea </string> @@ -1968,8 +1965,8 @@ Prova ad accedere nuovamente tra un minuto. <string name="PanelContentsNewScript"> Nuovo script </string> - <string name="BusyModeResponseDefault"> - Il residente al quale hai inviato un messaggio è in modalità 'occupato', ovvero ha chiesto di non essere disturbato. Il tuo messaggio comparirà nel suo pannello IM, dove potrà essere letto in un secondo momento. + <string name="DoNotDisturbModeResponseDefault"> + Questo residente ha attivato la modalità 'Non disturbare' e vedrà il tuo messaggio più tardi. </string> <string name="MuteByName"> (In base al nome) @@ -2082,9 +2079,6 @@ Prova ad accedere nuovamente tra un minuto. <string name="GroupMoneyDate"> [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] </string> - <string name="ViewerObjectContents"> - Contenuto - </string> <string name="AcquiredItems"> Oggetti acquisiti </string> @@ -3799,7 +3793,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Regione generale </string> <string name="LocationCtrlSeeAVsTooltip"> - Avatar visibili e chat consentita fuori di questo lotto + Gli avatar in questo lotto non possono essere visti o sentiti da avatar all'esterno del lotto </string> <string name="LocationCtrlPathfindingDirtyTooltip"> Gli oggetti che si muovono potrebbero non comportarsi correttamente in questa regione fino a quando non viene eseguito il rebake della regione. @@ -3876,6 +3870,12 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="IM_unblock_only_groups_friends"> Per vedere questo messaggio, devi deselezionare 'Solo amici e gruppi possono chiamarmi o mandarmi IM' in Preferenze/Privacy. </string> + <string name="OnlineStatus"> + Online + </string> + <string name="OfflineStatus"> + Offline + </string> <string name="answered_call"> Risposto alla chiamata </string> @@ -3885,6 +3885,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="you_joined_call"> Ti sei collegato alla chiamata in voce </string> + <string name="you_auto_rejected_call-im"> + Hai rifiutato automaticamente la chiamata voce mentre era attivata la modalità 'Non disturbare'. + </string> <string name="name_started_call"> [NAME] ha iniziato una chiamata vocale </string> @@ -3897,6 +3900,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="hang_up-im"> Chiusa la chiamata </string> + <string name="conference-title"> + Chat con più persone + </string> <string name="conference-title-incoming"> Chiamata in conferenza con [AGENT_NAME] </string> @@ -4769,6 +4775,9 @@ Prova a racchiudere il percorso dell'editor in doppie virgolette. <string name="Command_Chat_Label"> Chat </string> + <string name="Command_Conversations_Label"> + Conversazioni + </string> <string name="Command_Compass_Label"> Bussola </string> @@ -4844,6 +4853,9 @@ Prova a racchiudere il percorso dell'editor in doppie virgolette. <string name="Command_Chat_Tooltip"> Chatta con persone vicine usando il testo </string> + <string name="Command_Conversations_Tooltip"> + Conversa con chiunque + </string> <string name="Command_Compass_Tooltip"> Bussola </string> @@ -4973,4 +4985,13 @@ Prova a racchiudere il percorso dell'editor in doppie virgolette. <string name="UserDictionary"> [User] </string> + <string name="logging_calls_disabled_log_empty"> + Le conversazioni non vengono registrate. Per iniziare a registrare, seleziona "Salva: Solo registro" oppure "Salva: Registri e trascrizioni" in Preferenze > Chat. + </string> + <string name="logging_calls_disabled_log_not_empty"> + Non verranno registrate più le conversazioni. Per riprendere a registrare, seleziona "Salva: Solo registro" oppure "Salva: Registri e trascrizioni" in Preferenze > Chat. + </string> + <string name="logging_calls_enabled_log_empty"> + Nessuna conversazione in registro. Dopo che hai contattato qualcuno o se qualcuno ti contatta, una voce del registro verrà mostrata qui. + </string> </strings> diff --git a/indra/newview/skins/default/xui/ja/floater_conversation_log.xml b/indra/newview/skins/default/xui/ja/floater_conversation_log.xml new file mode 100644 index 0000000000..98b1a59a0d --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="会話ãƒã‚°"> + <panel name="buttons_panel"> + <filter_editor label="人をフィルター" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="表示 / 並ã¹æ›¿ãˆã®ã‚ªãƒ—ション"/> + <menu_button name="conversations_gear_btn" tool_tip="é¸æŠžã—ãŸä½äººãƒ»ã‚°ãƒ«ãƒ¼ãƒ—ã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_conversation_preview.xml b/indra/newview/skins/default/xui/ja/floater_conversation_preview.xml new file mode 100644 index 0000000000..ea0b23de48 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="会話:"> + <floater.string name="Title"> + 会話:[NAME] + </floater.string> + <text name="page_label" value="ページ"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_im_container.xml b/indra/newview/skins/default/xui/ja/floater_im_container.xml index 06b65e27f0..a155efdc1e 100644 --- a/indra/newview/skins/default/xui/ja/floater_im_container.xml +++ b/indra/newview/skins/default/xui/ja/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="会話"/> +<multi_floater name="floater_im_box" title="会話"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="オプションã®è¡¨ç¤º / 並ã¹æ›¿ãˆ"/> + <button name="add_btn" tool_tip="æ–°ã—ã„会話を開始"/> + <button name="speak_btn" tool_tip="マイクを使ã£ã¦äººã¨è©±ã™"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="ã“ã®ãƒªã‚¹ãƒˆã‚’é–‰ã˜ã‚‹ / é–‹ã"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="ã“ã®ãƒšã‚¤ãƒ³ã‚’é–‰ã˜ã‚‹"/> + <text name="stub_textbox"> + ã“ã®ä¼šè©±ã¯ã€åˆ¥ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚[secondlife:/// 戻る.] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/ja/floater_im_session.xml b/indra/newview/skins/default/xui/ja/floater_im_session.xml index dfa1c85ca2..a44c843df7 100644 --- a/indra/newview/skins/default/xui/ja/floater_im_session.xml +++ b/indra/newview/skins/default/xui/ja/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="宛先" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] ã¯ä¼šè©±ã«æ‹›å¾…ã•ã‚Œã¾ã—ãŸã€‚"/> + <floater.string name="multiple_participants_added" value="[NAME] ã¯ä¼šè©±ã«æ‹›å¾…ã•ã‚Œã¾ã—ãŸã€‚"/> + <floater.string name="tooltip_to_separate_window" value="ã“ã®ä¼šè©±ã‚’別ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¸ç§»å‹•ã™ã‚‹"/> + <floater.string name="tooltip_to_main_window" value="ã“ã®ä¼šè©±ã‚’メインウィンドウã¸æˆ»ã™"/> + <floater.string name="start_call_button_tooltip" value="会話ã®æŽ¥ç¶šã‚’é–‹ã"/> + <floater.string name="end_call_button_tooltip" value="会話ã®æŽ¥ç¶šã‚’é–‰ã˜ã‚‹"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="ã“ã®ãƒšã‚¤ãƒ³ã‚’é–‰ã˜ã‚‹"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="å‚åŠ è€…ãƒªã‚¹ãƒˆã‚’é–‰ã˜ã‚‹"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="å‚åŠ è€…ãƒªã‚¹ãƒˆã‚’é–‹ã"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="表示 / 並ã¹æ›¿ãˆã®ã‚ªãƒ—ション"/> + <menu_button name="gear_btn" tool_tip="é¸æŠžã—ãŸäººã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³"/> + <button name="add_btn" tool_tip="ã“ã®ä¼šè©±ã«ä»–ã®äººã‚’è¿½åŠ ã™ã‚‹"/> + <button name="voice_call_btn" tool_tip="会話ã®æŽ¥ç¶šã‚’é–‹ã"/> + <button name="close_btn" tool_tip="ã“ã®ä¼šè©±ã‚’終了ã™ã‚‹"/> + <button name="expand_collapse_btn" tool_tip="ã“ã®ãƒšã‚¤ãƒ³ã‚’é–‰ã˜ã‚‹ / é–‹ã"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="ãƒãƒ£ãƒƒãƒˆã‚’翻訳" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="宛先" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="メッセージパãƒãƒ«ã®è¡¨ç¤º / éžè¡¨ç¤º"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml index f152fcd738..308f6f9a3d 100644 --- a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml @@ -10,7 +10,7 @@ 匿åユーザー </floater.string> <floater.string name="VoiceInviteP2P"> - ãŒã‚³ãƒ¼ãƒ«ã—ã¦ã„ã¾ã™ã€‚ + ã‹ã‚‰ã‚³ãƒ¼ãƒ«ã‚’å—ã‘ã¦ã„ã¾ã™ã€‚ </floater.string> <floater.string name="VoiceInviteAdHoc"> ãŒã‚³ãƒ³ãƒ•ã‚¡ãƒ¬ãƒ³ã‚¹ãƒãƒ£ãƒƒãƒˆã§ã€ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã—ã¾ã—ãŸã€‚ @@ -25,9 +25,9 @@ [CURRENT_CHAT]を退å¸ã—ã¦ã€ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã—ã¾ã™ã‹ï¼Ÿ </floater.string> <text name="question"> - [CURRENT_CHAT] を退å¸ã—ã¦ã€ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã—ã¾ã™ã‹ï¼Ÿ + コールã«å¿œç”ã™ã‚‹ã¨ã€ç¾åœ¨ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‹ã‚‰åˆ‡æ–ã•ã‚Œã¾ã™ã€‚ </text> - <button label="ã¯ã„" label_selected="ã¯ã„" name="Accept"/> - <button label="ã„ã„ãˆ" label_selected="ã„ã„ãˆ" name="Reject"/> - <button label="IM" name="Start IM"/> + <button label="å–ã‚‹" label_selected="å–ã‚‹" name="Accept"/> + <button label="無視" label_selected="無視" name="Reject"/> + <button label="代ã‚ã‚Šã« IM ã‚’é–‹ã" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml index ec107f3e6b..9733c61918 100644 --- a/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> 表示: </text> - <check_box label="世界" name="show_world"/> + <check_box label="テスト" name="show_world"/> <check_box label="å¯å‹•ç‰©ã®ã¿" name="show_world_movables_only"/> <check_box label="ナビメッシュ" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml index 3773812bb6..37233d3e68 100644 --- a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml @@ -20,7 +20,7 @@ <button label="ブランク" label_selected="ブランク" name="Blank"/> <button label="ãªã—" label_selected="ãªã—" name="None"/> <button label="" label_selected="" name="Pipette"/> - <check_box initial_value="true" label="ライブプレビュー" name="apply_immediate_check"/> + <check_box initial_value="true" label="今ã™ãé©ç”¨" name="apply_immediate_check"/> <text name="preview_disabled" value="プレビュー無効"/> <filter_editor label="テクスãƒãƒ£ã‚’フィルター" name="inventory search editor"/> <check_box initial_value="false" label="フォルダを表示" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/ja/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/ja/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..44e96c35ad --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="ボイスãƒãƒ£ãƒƒãƒˆã®éŸ³é‡"> + <slider label="ボイスãƒãƒ£ãƒƒãƒˆ" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_voice_effect.xml b/indra/newview/skins/default/xui/ja/floater_voice_effect.xml index ee675e143b..b38ea9331a 100644 --- a/indra/newview/skins/default/xui/ja/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/ja/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="å ´æ‰€" name="voice_effects" title="ボイスモーフィング"> +<floater label="å ´æ‰€" name="voice_effects" title="ボイスモーフィングã®ãƒ—レビュー"> <string name="no_voice_effect"> (ボイスモーフィングãªã—) </string> diff --git a/indra/newview/skins/default/xui/ja/floater_voice_volume.xml b/indra/newview/skins/default/xui/ja/floater_voice_volume.xml new file mode 100644 index 0000000000..a380615d5a --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="ボイス音é‡"> + <slider name="volume_slider" tool_tip="ボイス音é‡" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/menu_cof_gear.xml b/indra/newview/skins/default/xui/ja/menu_cof_gear.xml index a071abbd2e..07bcefd9b3 100644 --- a/indra/newview/skins/default/xui/ja/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear COF"> +<toggleable_menu name="Gear COF"> <menu label="衣類" name="COF.Gear.New_Clothes"/> - <menu label="æ–°ã—ã„身体部ä½" name="COF.Geear.New_Body_Parts"/> -</menu> + <menu label="æ–°ã—ã„身体部ä½" name="COF.Gear.New_Body_Parts"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_conversation.xml b/indra/newview/skins/default/xui/ja/menu_conversation.xml new file mode 100644 index 0000000000..c7df20d252 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="会話を終ãˆã‚‹" name="close_conversation"/> + <menu_item_call label="ボイスãƒãƒ£ãƒƒãƒˆã‚’始ã‚ã‚‹" name="open_voice_conversation"/> + <menu_item_call label="ボイスãƒãƒ£ãƒƒãƒˆã‚’切æ–ã™ã‚‹" name="disconnect_from_voice"/> + <menu_item_call label="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’表示" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="offer_teleport"/> + <menu_item_call label="ボイスコール" name="voice_call"/> + <menu_item_call label="ãƒãƒ£ãƒƒãƒˆã®å±¥æ´..." name="chat_history"/> + <menu_item_call label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="add_friend"/> + <menu_item_call label="フレンドを削除" name="remove_friend"/> + <menu_item_call label="フレンドを削除" name="remove_friends"/> + <menu_item_call label="グループã«æ‹›å¾…..." name="invite_to_group"/> + <menu_item_call label="ズームイン" name="zoom_in"/> + <menu_item_call label="地図" name="map"/> + <menu_item_call label="共有" name="share"/> + <menu_item_call label="支払ã„" name="pay"/> + <menu_item_check label="ボイスをブãƒãƒƒã‚¯" name="block_unblock"/> + <menu_item_check label="æ–‡å—をブãƒãƒƒã‚¯ã™ã‚‹" name="MuteText"/> + <menu_item_call label="ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±" name="group_profile"/> + <menu_item_call label="グループをアクティブã«ã™ã‚‹" name="activate_group"/> + <menu_item_call label="グループã‹ã‚‰è„±é€€ã™ã‚‹" name="leave_group"/> + <context_menu label="モデレーターã®ã‚ªãƒ—ション" name="Moderator Options"> + <menu_item_check label="æ–‡å—ãƒãƒ£ãƒƒãƒˆã‚’許å¯" name="AllowTextChat"/> + <menu_item_call label="ã“ã®å‚åŠ è€…ã‚’ãƒŸãƒ¥ãƒ¼ãƒˆã™ã‚‹" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="ã“ã®å‚åŠ è€…ã®ãƒŸãƒ¥ãƒ¼ãƒˆã‚’解除ã™ã‚‹" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="全員ã®éŸ³å£°ã‚’ミュートã™ã‚‹" name="ModerateVoiceMute"/> + <menu_item_call label="全員ã®ãƒŸãƒ¥ãƒ¼ãƒˆã‚’解除ã™ã‚‹" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..c9d4f947a4 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="IM..." name="IM"/> + <menu_item_call label="ボイスコール..." name="Call"/> + <menu_item_call label="ãƒãƒ£ãƒƒãƒˆã®å±¥æ´ã‚’é–‹ã..." name="Chat history"/> + <menu_item_call label="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’表示" name="View Profile"/> + <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="teleport"/> + <menu_item_call label="フレンド登録" name="add_friend"/> + <menu_item_call label="フレンドを削除" name="remove_friend"/> + <menu_item_call label="グループã«æ‹›å¾…..." name="Invite"/> + <menu_item_call label="地図" name="Map"/> + <menu_item_call label="共有" name="Share"/> + <menu_item_call label="支払ã„" name="Pay"/> + <menu_item_check label="ブãƒãƒƒã‚¯ãƒ»ãƒ–ãƒãƒƒã‚¯è§£é™¤" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml new file mode 100644 index 0000000000..bd4812603f --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_name"/> + <menu_item_check label="日付ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_date"/> + <menu_item_check label="上ä½ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’並ã¹æ›¿ãˆ" name="sort_by_friends"/> + <menu_item_call label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆã®å±¥æ´ã‚’表示..." name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_im_conversation.xml b/indra/newview/skins/default/xui/ja/menu_im_conversation.xml new file mode 100644 index 0000000000..55cd6610f7 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’表示" name="View Profile"/> + <menu_item_call label="フレンド登録" name="Add Friend"/> + <menu_item_call label="フレンドを削除" name="remove_friend"/> + <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="offer_teleport"/> + <menu_item_call label="グループã«æ‹›å¾…..." name="invite_to_group"/> + <menu_item_call label="ãƒãƒ£ãƒƒãƒˆã®å±¥æ´..." name="chat_history"/> + <menu_item_call label="ズームイン" name="zoom_in"/> + <menu_item_call label="地図" name="map"/> + <menu_item_call label="共有" name="Share"/> + <menu_item_call label="支払ã„" name="Pay"/> + <menu_item_check label="ボイスをブãƒãƒƒã‚¯" name="Block/Unblock"/> + <menu_item_check label="æ–‡å—をブãƒãƒƒã‚¯ã™ã‚‹" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..222a741718 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="簡略表示" name="compact_view"/> + <menu_item_check label="詳細表示" name="expanded_view"/> + <menu_item_check label="時間を表示" name="IMShowTime"/> + <menu_item_check label="1対1ã®ä¼šè©±ã§åå‰ã‚’表示" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_object_icon.xml b/indra/newview/skins/default/xui/ja/menu_object_icon.xml index 8c4f328661..6448e9244e 100644 --- a/indra/newview/skins/default/xui/ja/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/ja/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="オブジェクトã®ãƒ—ãƒãƒ•ã‚£ãƒ¼ãƒ«..." name="Object Profile"/> <menu_item_call label="ブãƒãƒƒã‚¯..." name="Block"/> + <menu_item_call label="地図ã«è¡¨ç¤º" name="show_on_map"/> + <menu_item_call label="オブジェクトã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml index 2bcbe1915b..1969ae2a10 100644 --- a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="髪" name="New Hair"/> <menu_item_call label="ç›®" name="New Eyes"/> </menu> + <menu_item_call label="フォルダをã™ã¹ã¦é–‹ã" name="expand"/> + <menu_item_call label="フォルダをã™ã¹ã¦é–‰ã˜ã‚‹" name="collapse"/> <menu_item_call label="アウトフィットã®åå‰ã‚’変更ã™ã‚‹" name="rename"/> <menu_item_call label="アウトフィットを削除ã™ã‚‹" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_participant_view.xml b/indra/newview/skins/default/xui/ja/menu_participant_view.xml new file mode 100644 index 0000000000..5816351d9d --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="会話をタイプã§ä¸¦ã¹æ›¿ãˆ" name="sort_sessions_by_type"/> + <menu_item_check label="会話をåå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_sessions_by_name"/> + <menu_item_check label="会話を最新アクティビティã§ä¸¦ã¹æ›¿ãˆ" name="sort_sessions_by_recent"/> + <menu_item_check label="å‚åŠ è€…ã‚’åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_participants_by_name"/> + <menu_item_check label="å‚åŠ è€…ã‚’æœ€æ–°ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ãƒ†ã‚£ã§ä¸¦ã¹æ›¿ãˆ" name="sort_participants_by_recent"/> + <menu_item_call label="ãƒãƒ£ãƒƒãƒˆã®ç’°å¢ƒè¨å®š..." name="chat_preferences"/> + <menu_item_call label="プライãƒã‚·ãƒ¼ã®ç’°å¢ƒè¨å®š..." name="privacy_preferences"/> + <menu_item_check label="会話ãƒã‚°..." name="Conversation"/> + <menu_item_check label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆã‚’翻訳" name="Translate_chat"/> + <menu_item_check label="翻訳ã®è¨å®š..." name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..b5c9d11e02 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="ブãƒãƒƒã‚¯è§£é™¤" name="unblock"/> + <menu_item_call label="プãƒãƒ•ã‚£ãƒ¼ãƒ«..." name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..3e74b2ddff --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="åå‰ã§ä½äººã‚’ブãƒãƒƒã‚¯..." name="block_resident_by_name"/> + <menu_item_call label="åå‰ã§ã‚ªãƒ–ジェクトをブãƒãƒƒã‚¯..." name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml new file mode 100644 index 0000000000..4b86a353f4 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_name"/> + <menu_item_check label="タイプã«ã‚ˆã‚‹ä¸¦ã¹æ›¿ãˆ" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml b/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml new file mode 100644 index 0000000000..b95d11fdbd --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_name"/> + <menu_item_check label="オンライン状æ³ã§ä¸¦ã¹æ›¿ãˆ" name="sort_status"/> + <menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="view_icons"/> + <menu_item_check label="与ãˆã‚‰ã‚ŒãŸæ¨©é™ã‚’表示" name="view_permissions"/> + <menu_item_check label="会話ãƒã‚°ã‚’表示..." name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_groups.xml b/indra/newview/skins/default/xui/ja/menu_people_groups.xml index 842d79dc4b..2c0c85ba28 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="æƒ…å ±ã‚’è¡¨ç¤º" name="View Info"/> <menu_item_call label="ãƒãƒ£ãƒƒãƒˆ" name="Chat"/> - <menu_item_call label="コール" name="Call"/> + <menu_item_call label="ボイスコール" name="Call"/> <menu_item_call label="アクティブ" name="Activate"/> <menu_item_call label="脱退" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml b/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml new file mode 100644 index 0000000000..4a9e402fa4 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="グループアイコンを表示" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml index 8d84b0e521..972ab767bf 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã®è¡¨ç¤º" name="View Profile"/> - <menu_item_call label="フレンド登録" name="Add Friend"/> - <menu_item_call label="フレンドを削除" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="コール" name="Call"/> - <menu_item_call label="地図" name="Map"/> - <menu_item_call label="共有" name="Share"/> - <menu_item_call label="支払ã†" name="Pay"/> - <menu_item_check label="ブãƒãƒƒã‚¯ãƒ»ãƒ–ãƒãƒƒã‚¯è§£é™¤" name="Block/Unblock"/> - <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="teleport"/> + <menu_item_call label="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’表示" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="offer_teleport"/> + <menu_item_call label="ボイスコール" name="voice_call"/> + <menu_item_call label="ãƒãƒ£ãƒƒãƒˆã®å±¥æ´ã‚’表示..." name="chat_history"/> + <menu_item_call label="フレンド登録" name="add_friend"/> + <menu_item_call label="フレンドを削除" name="remove_friend"/> + <menu_item_call label="グループã«æ‹›å¾…..." name="invite_to_group"/> + <menu_item_call label="ズームイン" name="zoom_in"/> + <menu_item_call label="地図" name="map"/> + <menu_item_call label="共有" name="share"/> + <menu_item_call label="支払ã„" name="pay"/> + <menu_item_check label="ブãƒãƒƒã‚¯ãƒ»ãƒ–ãƒãƒƒã‚¯è§£é™¤" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml index 3f20e5d3ab..fe85e278cf 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="フレンド登録" name="Add Friends"/> - <menu_item_call label="フレンドを削除" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="コール" name="Call"/> - <menu_item_call label="共有" name="Share"/> - <menu_item_call label="支払ã†" name="Pay"/> - <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="teleport"/> + <menu_item_call label="フレンド登録" name="add_friends"/> + <menu_item_call label="フレンドを削除" name="remove_friends"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="コール" name="call"/> + <menu_item_call label="共有" name="share"/> + <menu_item_call label="支払ã„" name="pay"/> + <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml new file mode 100644 index 0000000000..b7cccc4396 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="最近ã®ç™ºè¨€è€…ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_recent_speakers"/> + <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_name"/> + <menu_item_check label="è·é›¢ã§ä¸¦ã¹æ›¿ãˆ" name="sort_distance"/> + <menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="view_icons"/> + <menu_item_check label="地図を表示" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml b/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml new file mode 100644 index 0000000000..feaeba4398 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="æ–°ã—ã„é †ã«ä¸¦ã¹æ›¿ãˆ" name="sort_most"/> + <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_name"/> + <menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_agent.xml b/indra/newview/skins/default/xui/ja/menu_url_agent.xml index 92d118a5ae..72722db7cc 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="ä½äººã®ãƒ—ãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’表示" name="show_agent"/> + <menu_item_call label="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’表示" name="show_agent"/> + <menu_item_call label="IM ã‚’é€ä¿¡..." name="send_im"/> + <menu_item_call label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ ..." name="add_friend"/> <menu_item_call label="åå‰ã‚’クリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/> <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml index d6a048dcfc..9e340e3239 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="オブジェクトã®æƒ…å ±ã‚’è¡¨ç¤º" name="show_object"/> + <menu_item_call label="オブジェクトã®ãƒ—ãƒãƒ•ã‚£ãƒ¼ãƒ«..." name="show_object"/> <menu_item_call label="地図ã«è¡¨ç¤º" name="show_on_map"/> <menu_item_call label="オブジェクトã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport_to_object"/> <menu_item_call label="オブジェクトåをクリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml index 74859076c2..725ceff208 100644 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="ç§ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ¢ã™ã‚‹" name="Stop Animating My Avatar"/> <menu_item_call label="æ©è¡Œï¼èµ°è¡Œï¼é£›è¡Œ..." name="Walk / run / fly"/> </menu> - <menu label="ãƒã‚°ã‚¤ãƒ³" name="Status"> - <menu_item_call label="一時退å¸ä¸" name="Set Away"/> - <menu_item_call label="å–ã‚Šè¾¼ã¿ä¸" name="Set Busy"/> - </menu> + <menu label="ãƒã‚°ã‚¤ãƒ³" name="Status"/> <menu_item_call label="L$ ã®è³¼å…¥..." name="Buy and Sell L$"/> <menu_item_call label="マーãƒãƒ£ãƒ³ãƒˆã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹..." name="MerchantOutbox"/> <menu_item_call label="マイアカウント..." name="Manage My Account"> @@ -32,14 +29,18 @@ <menu_item_call label="[APP_NAME] を終了" name="Quit"/> </menu> <menu label="コミュニケーション" name="Communicate"> - <menu_item_check label="ãƒãƒ£ãƒƒãƒˆ..." name="Nearby Chat"/> + <menu_item_check label="会話..." name="Conversations"/> + <menu_item_check label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ..." name="Nearby Chat"/> <menu_item_check label="話ã™" name="Speak"/> - <menu_item_check label="ボイスè¨å®š..." name="Nearby Voice"/> - <menu_item_check label="ボイスモーフィング..." name="ShowVoice"/> + <menu label="ボイスモーフィング" name="VoiceMorphing"> + <menu_item_check label="ボイスモーフィングãªã—" name="NoVoiceMorphing"/> + <menu_item_check label="プレビュー..." name="Preview"/> + <menu_item_call label="申ã—込む..." name="Subscribe"/> + </menu> <menu_item_check label="ジェスãƒãƒ£ãƒ¼..." name="Gestures"/> - <menu_item_call label="フレンド" name="My Friends"/> - <menu_item_call label="グループ" name="My Groups"/> - <menu_item_call label="è¿‘ãã«ã„る人" name="Active Speakers"/> + <menu_item_check label="フレンド" name="My Friends"/> + <menu_item_check label="グループ" name="My Groups"/> + <menu_item_check label="è¿‘ãã«ã„る人" name="Active Speakers"/> <menu_item_call label="リストをブãƒãƒƒã‚¯" name="Block List"/> </menu> <menu label="世界" name="World"> diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index d5cff18a24..356506f191 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -538,6 +538,24 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã </url> <usetemplate ignoretext="使用ã—ã¦ã„るグラフィックドライãƒãŒå¤ã„å ´åˆ" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> + <notification name="AMDOldDriver"> + ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒãƒƒãƒ—ã«ã¯æœ€æ–°ã®ãƒ‰ãƒ©ã‚¤ãƒãŒå˜åœ¨ã™ã‚‹ã‚ˆã†ã§ã™ã€‚グラフィックドライãƒã‚’æ›´æ–°ã™ã‚‹ã¨ã€ãƒ‘フォーマンスãŒå¤§å¹…ã«æ”¹å–„ã•ã‚Œã¾ã™ã€‚ + +[_URL] ã¸ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€ãƒ‰ãƒ©ã‚¤ãƒãƒ¼ã‚’æ›´æ–°ã—ã¾ã™ã‹ã€‚ + <url name="url"> + http://support.amd.com/us/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="自分ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ‰ãƒ©ã‚¤ãƒãŒæ—§ããªã‚Šã¾ã—ãŸã€‚" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="NVIDIAOldDriver"> + ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒãƒƒãƒ—ã«ã¯æœ€æ–°ã®ãƒ‰ãƒ©ã‚¤ãƒãŒå˜åœ¨ã™ã‚‹ã‚ˆã†ã§ã™ã€‚グラフィックドライãƒã‚’æ›´æ–°ã™ã‚‹ã¨ã€ãƒ‘フォーマンスãŒå¤§å¹…ã«æ”¹å–„ã•ã‚Œã¾ã™ã€‚ + +[_URL] ã¸ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€ãƒ‰ãƒ©ã‚¤ãƒãƒ¼ã‚’æ›´æ–°ã—ã¾ã™ã‹ã€‚ + <url name="url"> + http://www.nvidia.com/Download/index.aspx?lang=en-us + </url> + <usetemplate ignoretext="自分ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ‰ãƒ©ã‚¤ãƒãŒæ—§ããªã‚Šã¾ã—ãŸã€‚" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> <notification name="UnknownGPU"> ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã¯ã€[APP_NAME] ãŒèªè˜ã§ããªã„グラフィックカードãŒæ載ã•ã‚Œã¦ã„ã¾ã™ã€‚ [APP_NAME] ã§ã¾ã テストã•ã‚Œã¦ã„ãªã„最新ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®ãŸã‚ã ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ å•é¡Œãªã„ã¨ã¯æ€ã„ã¾ã™ãŒã€ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã®è¨å®šã‚’調整ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 @@ -1582,10 +1600,13 @@ http://secondlife.com/download ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã ç¾åœ¨ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚·ãƒƒãƒ—ã‚’é€ã‚Œã¾ã›ã‚“。数分後ã«ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="BusyModeSet"> - å–ã‚Šè¾¼ã¿ä¸ãƒ¢ãƒ¼ãƒ‰ã«ãªã‚Šã¾ã—ãŸã€‚ -ãƒãƒ£ãƒƒãƒˆã¨ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯è¡¨ç¤ºã•ã‚Œã¾ã›ã‚“。 å—ä¿¡ã™ã‚‹ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯å–ã‚Šè¾¼ã¿ä¸è¿”ç”メッセージãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ テレãƒãƒ¼ãƒˆã®ã‚ªãƒ•ã‚¡ãƒ¼ã¯å—ã‘å–ã‚Šæ‹’å¦ã¨ãªã‚Šã¾ã™ã€‚ アイテムã®ã‚ªãƒ•ã‚¡ãƒ¼ã¯ã™ã¹ã¦ã”ã¿ç®±ã«å…¥ã‚Šã¾ã™ã€‚ - <usetemplate ignoretext="ãƒã‚°ã‚¤ãƒ³çŠ¶æ…‹ã‚’å–ã‚Šè¾¼ã¿ä¸ãƒ¢ãƒ¼ãƒ‰ã«å¤‰æ›´ã™ã‚‹ã¨ã" name="okignore" yestext="OK"/> + <notification name="DoNotDisturbModeSet"> + 「通知をå—ã‘ãªã„ã€ãŒã‚ªãƒ³ã«ãªã‚Šã¾ã™ã€‚ç€ä¿¡é€šä¿¡ã¯ã‚ãªãŸã«ã¯é€šçŸ¥ã•ã‚Œã¾ã›ã‚“。 + +- ä»–ã®ä½æ°‘ã¯ã€Œé€šçŸ¥ã‚’å—ã‘ãªã„ã€ã®å¿œç”(「è¨å®šã€>「一般ã€ã§è¨å®šï¼‰ã‚’å—ã‘å–ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ +- テレãƒãƒ¼ãƒˆã®ã‚ªãƒ•ã‚¡ãƒ¼ã¯ã™ã¹ã¦å—ã‘å–ã‚Šæ‹’å¦ã¨ãªã‚Šã¾ã™ã€‚ +- ボイスコールã¯æ‹’å¦ã•ã‚Œã¾ã™ã€‚ + <usetemplate ignoretext="マイ ãƒã‚°ã‚¤ãƒ³çŠ¶æ…‹ã‚’「通知をå—ã‘ãªã„ã€ãƒ¢ãƒ¼ãƒ‰ã«å¤‰æ›´ã—ã¾ã—ãŸã€‚" name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> åŠ å…¥ã§ãるグループã®æœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ãŸã‚ã«ä»–ã®ã‚°ãƒ«ãƒ¼ãƒ—を脱退ã™ã‚‹ã‹ã€ã“ã®ç”³ã—入れをæ–ã£ã¦ãã ã•ã„。 @@ -2076,6 +2097,10 @@ L$ [AMOUNT] ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã‚’今ã™ã公開ã—ã¾ã™ã [http://jp.secondlife.com/account/ マイアカウント] ページã«ç§»å‹•ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ´ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ´ã‚’見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + æ—¢å˜ã®ä¼šè©±ã«äººã‚’åŠ ãˆã‚‹ã¨ã€æ–°ã—ã„会話ãŒä½œæˆã•ã‚Œã¾ã™ã€‚å‚åŠ è€…å…¨å“¡ã«æ–°ã—ã„会話ã«ã¤ã„ã¦ã®é€šçŸ¥ãŒé…ä¿¡ã•ã‚Œã¾ã™ã€‚ + <usetemplate ignoretext="ãƒãƒ£ãƒƒãƒˆã®å‚åŠ è€…ã®è¿½åŠ を確èªã—ã¦ãã ã•ã„" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + </notification> <notification name="ConfirmQuit"> 終了ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚続ã‘ã¾ã™ã‹ï¼Ÿ <usetemplate ignoretext="終了時ã®ç¢ºèª" name="okcancelignore" notext="終了ã—ãªã„" yestext="終了"/> @@ -2153,14 +2178,14 @@ Linden Lab <button ignore="交æ›ã—ãªã„" name="No" text="ã‚ャンセル"/> </form> </notification> - <notification label="å–ã‚Šè¾¼ã¿ä¸ã®è¦å‘Š" name="BusyModePay"> - ç¾åœ¨ã€ã€Œå–ã‚Šè¾¼ã¿ä¸ã€ãƒ¢ãƒ¼ãƒ‰ã®ãŸã‚ã€æ”¯æ‰•ã„ã¨å¼•ãæ›ãˆã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + <notification label="「通知をå—ã‘ãªã„ã€ãƒ¢ãƒ¼ãƒ‰ã®è¦å‘Š" name="DoNotDisturbModePay"> + 「通知をå—ã‘ãªã„ã€ã‚’オンã«ã—ã¾ã™ã€‚ã“ã®æ”¯æ‰•ã¨ã®äº¤æ›ã§æä¾›ã•ã‚Œã‚‹ã‚¢ã‚¤ãƒ†ãƒ ãŒå—ä¿¡ã•ã‚Œãªããªã‚Šã¾ã™ã€‚ -ã“ã®å–引を行ã†ãŸã‚ã«ã€Œå–ã‚Šè¾¼ã¿ä¸ã€ã®è¨å®šã‚’解除ã—ã¾ã™ã‹ï¼Ÿ +ã“ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’完了ã™ã‚‹ãŸã‚ã«ã€ã€Œé€šçŸ¥ã‚’å—ã‘ãªã„ã€ã‚’オフã«ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ã€‚ <form name="form"> - <ignore name="ignore" save_option="true" text="å–ã‚Šè¾¼ã¿ä¸ãƒ¢ãƒ¼ãƒ‰æ™‚ã«æ”¯æ‰•ã‚’ã™ã‚‹ã¨ã"/> - <button ignore="常ã«ã€Œå–ã‚Šè¾¼ã¿ä¸ã€ã®è¨å®šã‚’解除" name="Yes" text="OK"/> - <button ignore="常ã«ã€Œå–ã‚Šè¾¼ã¿ä¸ã€ã®è¨å®šã‚’継続" name="No" text="ã‚ャンセル"/> + <ignore name="ignore" text="「通知をå—ã‘ãªã„ã€ãƒ¢ãƒ¼ãƒ‰æ™‚ã«ã€äººã‚„物を支払ã†äºˆå®šã§ã™ã€‚"/> + <button ignore="「通知をå—ã‘ãªã„ã€ãƒ¢ãƒ¼ãƒ‰ã‚’ç¶æŒã—ãªã„" name="Yes" text="OK"/> + <button ignore="「通知をå—ã‘ãªã„ã€ãƒ¢ãƒ¼ãƒ‰ã‚’ç¶æŒã™ã‚‹" name="No" text="å–り消ã—"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2296,11 +2321,8 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã <notification name="GroupNotice"> 件å: [SUBJECT]ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š [MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™ - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã™ + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> 㯠[STATUS] ã§ã™ </notification> <notification name="AddSelfFriend"> 残念ãªãŒã‚‰è‡ªåˆ†è‡ªèº«ã‚’フレンド登録ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 @@ -2530,13 +2552,6 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã <notification name="DynamicPathfindingDisabled"> ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã§ãƒ€ã‚¤ãƒŠãƒŸãƒƒã‚¯ãƒ‘スファインディングãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã›ã‚“。パスファインディング LSL 呼ã³å‡ºã—を使用ã™ã‚‹ã‚¹ã‚¯ãƒªãƒ—ト化ã•ã‚ŒãŸã‚ªãƒ–ジェクトãŒã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã§ã¯å‹•ä½œã§ãã¾ã›ã‚“。 </notification> - <notification name="PathfindingRebakeNavmesh"> - ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã®ã‚ªãƒ–ジェクトを変更ã™ã‚‹ã¨ã€ä»–ã®ç§»å‹•ã‚ªãƒ–ジェクトãŒæ£ã—ã動作ã—ãªããªã‚‹æã‚ŒãŒã‚ã‚Šã¾ã™ã€‚移動オブジェクトをæ£ã—ã動作ã•ã›ã‚‹ã«ã¯ã€ã€Œåœ°åŸŸã®å†æ§‹ç¯‰ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¾ã™ã€‚詳ã—ã„æƒ…å ±ã¯è¦‹ã‚‹ã«ã¯ã€Œãƒ˜ãƒ«ãƒ—ã€ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="ヘルプ" ignoretext="ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã®ã‚ªãƒ–ジェクトを変更ã™ã‚‹ã¨ã€ä»–ã®ç§»å‹•ã‚ªãƒ–ジェクトãŒæ£ã—ã動作ã—ãªããªã‚‹æã‚ŒãŒã‚ã‚Šã¾ã™ã€‚" name="okhelpignore" yestext="OK"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¾ãŸã¯ã‚µãƒ¼ãƒãƒ¼ã«å•é¡ŒãŒã‚ã‚‹ã‹ã€åˆ¶ä½œæ¨©ãŒãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®å•é¡Œã¯ã€ä¸€åº¦ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã¦ã‹ã‚‰ã€ãƒã‚°ã‚¤ãƒ³ã—ç›´ã™ã¨è§£æ±ºã•ã‚Œã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ <usetemplate name="okbutton" yestext="OK"/> @@ -2797,9 +2812,9 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã </form> </notification> <notification name="ScriptQuestionCaution"> - è¦å‘Šï¼šã‚ªãƒ–ジェクト '<nolink>[OBJECTNAME]</nolink>' ã¯ã‚ãªãŸã®ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¸ã®ãƒˆãƒ¼ã‚¿ãƒ«ã‚¢ã‚¯ã‚»ã‚¹ã‚’希望ã—ã¦ã„ã¾ã™ã€‚アクセスを許å¯ã™ã‚‹ã¨ã€ã“ã®ã‚ªãƒ–ジェクトã¯ã„ã¤ã§ã‚‚ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‹ã‚‰è³‡é‡‘を削除ã—ãŸã‚Šã€ä»Šå¾Œè¦å‘Šã‚’表示ã™ã‚‹ã“ã¨ãªã継続的ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’完全ã«ç©ºã«ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ + è¦å‘Š:オブジェクト '<nolink>[OBJECTNAME]</nolink>' ã¯ã€ã‚ãªãŸã®ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¸ã®ãƒ•ãƒ«ã‚¢ã‚¯ã‚»ã‚¹ã‚’è¦æ±‚ã—ã¦ã„ã¾ã™ã€‚アクセスを許å¯ã™ã‚‹ã¨ã€ã“ã®ã‚ªãƒ–ジェクトã¯ã€ç‰¹ã«è¦å‘Šã‚’発ã›ãšã«å˜ç™ºã§ã€éšæ™‚アカウントã‹ã‚‰è³‡é‡‘を削除ã™ã‚‹ã‹ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’完全ã«ç©ºã«ã—ã¾ã™ã€‚ -ã“ã®ã‚ˆã†ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒæ£å½“ã§ã‚ã‚‹ã“ã¨ã¯ç¨€ã§ã™ã€‚ã“ã®ã‚ªãƒ–ジェクトãŒã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã‚¢ã‚¯ã‚»ã‚¹ã—ãŸã„ç†ç”±ã‚’完全ã«ç†è§£ã—ã¦ã„ã‚‹å ´åˆã‚’除ãã€ã‚¢ã‚¯ã‚»ã‚¹ã®è¨±å¯ã¯é¿ã‘ã¦ãã ã•ã„。 +ãã®ã‚ªãƒ–ジェクトãŒã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’è¦æ±‚ã™ã‚‹ç†ç”±ãŒã‚ˆãã‚ã‹ã‚‰ãªã„å ´åˆã¯ã€ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ãªã„ã§ãã ã•ã„。 <form name="form"> <button name="Grant" text="トータルアクセスを許å¯"/> <button name="Deny" text="æ‹’å¦"/> @@ -3378,4 +3393,627 @@ M ã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ [NUM_ITEMS] 個ã®ã‚¢ã‚¤ãƒ†ãƒ を削除ä¸ã§ã™ã€‚続ã‘ã¾ã™ã‹ï¼Ÿ <usetemplate ignoretext="複数ã®ã‚¢ã‚¤ãƒ†ãƒ を削除ã—ã¾ã™ã‹ï¼Ÿ" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] ã«ã‚ˆã£ã¦ã‚ãªãŸã¯ãƒ•ãƒªãƒ¼ã‚ºã•ã‚Œã¦ã„ã¾ã™ã€‚世界を動ã‹ã™ã“ã¨ã‚‚ã€ä¸–ç•Œã¨ã‚¤ãƒ³ã‚¿ãƒ©ã‚¯ã‚·ãƒ§ãƒ³ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] ã«ã‚ˆã£ã¦ã€ã‚ãªãŸã¯ [AV_FREEZE_TIME] 秒間フリーズã•ã‚Œã¾ã—ãŸã€‚世界を動ã‹ã™ã“ã¨ã‚‚ã€ä¸–ç•Œã¨ã‚¤ãƒ³ã‚¿ãƒ©ã‚¯ã‚·ãƒ§ãƒ³ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 + </notification> + <notification name="YouFrozeAvatar"> + ã‚¢ãƒã‚¿ãƒ¼ãŒãƒ•ãƒªãƒ¼ã‚ºã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] ã«ã‚ˆã£ã¦ãƒ•ãƒªãƒ¼ã‚ºãŒè§£é™¤ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="AvatarUnFrozen"> + ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ•ãƒªãƒ¼ã‚ºãŒè§£é™¤ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="AvatarFreezeFailure"> + ãã®åŒºç”»ã®ç®¡ç†æ¨©é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€ãƒ•ãƒªãƒ¼ã‚ºã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="AvatarFreezeThaw"> + フリーズ期間ãŒåˆ‡ã‚Œã¾ã—ãŸã€‚仕事ã«æˆ»ã£ã¦ãã ã•ã„。 + </notification> + <notification name="AvatarCantFreeze"> + 残念ãªãŒã‚‰ã€ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’フリーズã§ãã¾ã›ã‚“。 + </notification> + <notification name="NowOwnObject"> + ã“ã‚Œã§ã€ã‚ªãƒ–ジェクト [OBJECT_NAME] ã®æ‰€æœ‰è€…ã«ãªã‚Šã¾ã—㟠+ </notification> + <notification name="CantRezOnLand"> + ã“ã®åœŸåœ°ã®æ‰€æœ‰è€…ãŒè¨±å¯ã—ã¦ã„ãªã„ãŸã‚ã€[OBJECT_POS] ã§ã‚ªãƒ–ジェクトを Rez ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。土地ツールを使用ã—ã¦ã€åœŸåœ°ã®æ‰€æœ‰ã‚’確èªã—ã¦ãã ã•ã„。 + </notification> + <notification name="RezFailTooManyRequests"> + リクエストãŒå¤šã™ãŽã¦ã€ã‚ªãƒ–ジェクトを Rez ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="SitFailCantMove"> + 今回移動ã§ããªã‹ã£ãŸãŸã‚ã€åº§ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="SitFailNotAllowedOnLand"> + ãã®åœŸåœ°ã«å¯¾ã—ã¦è¨±å¯ã‚’å—ã‘ã¦ã„ãªã„ãŸã‚ã€åº§ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="SitFailNotSameRegion"> + 移動ã—ã¦è¿‘ã¥ã‘ã¦ã¿ã¦ãã ã•ã„。オブジェクトãŒåŒã˜ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトをé…ç½®ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoNewObjectRegionFull"> + æ–°ã—ã„オブジェクトを作æˆã§ãã¾ã›ã‚“。リージョンãŒåŸ‹ã¾ã£ã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="FailedToPlaceObject"> + 指定ã—ãŸå ´æ‰€ã«ã‚ªãƒ–ジェクトをé…ç½®ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="NoOwnNoGardening"> + 所有ã—ã¦ã„ãªã„土地ã«æœ¨ã‚„è‰ã‚’æ¤ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoCopyPermsNoObject"> + オブジェクト '[OBJ_NAME]' をコピーã™ã‚‹æ¨©é™ãŒãªã„ãŸã‚ã€ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="NoTransPermsNoObject"> + オブジェクト '[OBJ_NAME]' ã‚’ã‚ãªãŸã«è»¢é€ã§ããªã„ãŸã‚ã€ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="AddToNavMeshNoCopy"> + オブジェクト '[OBJ_NAME]' ãŒãƒŠãƒ“メッシュã«è²¢çŒ®ã—ã¦ã„ã‚‹ãŸã‚ã€ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="DupeWithNoRootsSelected"> + ルートオブジェクトをé¸æŠžã›ãšã«è¤‡è£½ã—ã¾ã™ã€‚ + </notification> + <notification name="CantDupeCuzRegionIsFull"> + リージョンãŒåŸ‹ã¾ã£ã¦ã„ã‚‹ãŸã‚ã€ã‚ªãƒ–ジェクトã®ã‚³ãƒ”ーを作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantDupeCuzParcelNotFound"> + オブジェクトã®ã‚³ãƒ”ーを作æˆã§ãã¾ã›ã‚“。オブジェクトã®ã‚る区画ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantCreateCuzParcelFull"> + 区画ãŒã„ã£ã±ã„ã®ãŸã‚〠+オブジェクトを作æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="RezAttemptFailed"> + オブジェクトã¸ã® Rez ã®è©¦ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="ToxicInvRezAttemptFailed"> + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§å•é¡Œã‚’引ãèµ·ã“ã™ã‚¢ã‚¤ãƒ†ãƒ ã¯ä½œæˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="InvItemIsBlacklisted"> + ãã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã¯ãƒ–ラックリストã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="NoCanRezObjects"> + ç¾åœ¨ã‚ãªãŸã«ã¯ã‚ªãƒ–ジェクトを作æˆã™ã‚‹ãŸã‚ã®è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="LandSearchBlocked"> + 土地ã®æ¤œç´¢ãŒãƒ–ãƒãƒƒã‚¯ã•ã‚Œã¾ã—ãŸã€‚ +çŸæœŸé–“ã«å¤šãã®åœŸåœ°ã‚’検索ã—ãŸãŸã‚ã§ã™ã€‚ +ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="NotEnoughResourcesToAttach"> + オブジェクトã®ç€ç”¨ã«ä½¿ç”¨ã§ãるスクリプトリソースãŒè¶³ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="YouDiedAndGotTPHome"> + æ»ã‚“ã§ã—ã¾ã£ãŸã®ã§ã€ãƒ›ãƒ¼ãƒ ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="EjectComingSoon"> + ã“ã“ã¸ã®å…¥å ´ãŒè¨±å¯ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€[EJECT_TIME] 秒後ã«è¿½æ”¾ã•ã‚Œã¾ã™ã€‚ + </notification> + <notification name="NoEnterServerFull"> + サーãƒãƒ¼ãŒåŸ‹ã¾ã£ã¦ã„ã‚‹ãŸã‚〠+ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥å ´ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="SaveBackToInvDisabled"> + 「「æŒã¡ç‰©ã€ã«ä¿å˜ã€ãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="NoExistNoSaveToContents"> + '[OBJ_NAME]' ã® Rez å…ƒã§ã‚るオブジェクトãŒå˜åœ¨ã—ãªã„ãŸã‚ã€ã“ã®ã‚ªãƒ–ジェクトをオブジェクトコンテンツã«ä¿å˜ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoModNoSaveToContents"> + オブジェクト '[DEST_NAME]' ã‚’ä¿®æ£ã™ã‚‹æ¨©é™ãŒãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã« '[OBJ_NAME]' ã‚’ä¿å˜ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoSaveBackToInvDisabled"> + インベントリ㫠'[OBJ_NAME]' ã‚’ä¿å˜ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ - ã“ã®æ“作ãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="NoCopyNoSelCopy"> + オブジェクト '[OBJ_NAME]' を変更ã™ã‚‹æ¨©é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’コピーã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoTransNoSelCopy"> + オブジェクト '[OBJ_NAME]' を転é€ã§ããªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’コピーã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoTransNoCopy"> + オブジェクト '[OBJ_NAME]' を転é€ã§ããªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’コピーã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoPermsNoRemoval"> + シミュレータã‹ã‚‰ã®ã‚ªãƒ–ジェクト '[OBJ_NAME]' ã®å‰Šé™¤ã¯ã€æ¨©é™ã‚·ã‚¹ãƒ†ãƒ ã«ã‚ˆã£ã¦ç„¡åŠ¹ã«ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="NoModNoSaveSelection"> + オブジェクト '[OBJ_NAME]' を変更ã™ã‚‹æ¨©é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’ä¿å˜ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoCopyNoSaveSelection"> + オブジェクト '[OBJ_NAME]' をコピーã§ããªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’ä¿å˜ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoModNoTaking"> + オブジェクト '[OBJ_NAME]' を変更ã™ã‚‹æ¨©é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’å–å¾—ã§ãã¾ã›ã‚“。 + </notification> + <notification name="RezDestInternalError"> + 内部エラー: ä¸æ˜Žãªå®›å…ˆã‚¿ã‚¤ãƒ—。 + </notification> + <notification name="DeleteFailObjNotFound"> + オブジェクトãŒè¦‹ã¤ã‹ã‚‰ãªã„ãŸã‚削除ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="SorryCantEjectUser"> + 残念ãªãŒã‚‰ã€ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追放ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="RegionSezNotAHome"> + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€ã“ã“ã«ãƒ›ãƒ¼ãƒ ã®ä½ç½®ã‚’è¨å®šã§ãã¾ã›ã‚“。 + </notification> + <notification name="HomeLocationLimits"> + ホームã®å ´æ‰€ã‚’è¨å®šã§ãã‚‹ã®ã¯ã€è‡ªåˆ†ã®åœŸåœ°ã‹ã€ã¾ãŸã¯ãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã®ã‚¤ãƒ³ãƒ•ã‚©ãƒãƒ–ã§ã®ã¿ã§ã™ã€‚ + </notification> + <notification name="HomePositionSet"> + 家ã®é…ç½®ã®è¨å®šã€‚ + </notification> + <notification name="AvatarEjected"> + ã‚¢ãƒã‚¿ãƒ¼ãŒè¿½æ”¾ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="AvatarEjectFailed"> + ãã®åŒºç”»ã®ç®¡ç†æ¨©é™ãŒãªã„ãŸã‚ã€è¿½æ”¾ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="CantMoveObjectParcelFull"> + 区画ãŒåŸ‹ã¾ã£ã¦ã„ã‚‹ãŸã‚ã€ã‚ªãƒ–ジェクト '[OBJECT_NAME]' ã‚’ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ [REGION_NAME] 内㮠[OBJ_POSITION] ã«ç§»å‹•ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantMoveObjectParcelPerms"> + オブジェクト '[OBJECT_NAME]' ã¯ã€ã“ã®åŒºç”»ã§è¨±å¯ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ [REGION_NAME] 内㮠[OBJ_POSITION] ã«ç§»å‹•ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantMoveObjectParcelResources"> + ã“ã®åŒºç”»ã§ã“ã®ã‚ªãƒ–ジェクトã®ãƒªã‚½ãƒ¼ã‚¹ãŒä¸è¶³ã—ã¦ã„ã‚‹ãŸã‚ã€ã‚ªãƒ–ジェクト '[OBJECT_NAME]' をリージョン [REGION_NAME] 内㮠[OBJ_POSITION] ã«ç§»å‹•ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantMoveObjectRegionVersion"> + オブジェクト '[OBJECT_NAME]' をリージョン [REGION_NAME] 内㮠[OBJ_POSITION] ã«ç§»å‹•ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。他ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®å¢ƒç•Œã‚’ã¾ãŸã„ã ã“ã®ã‚ªãƒ–ジェクトをå—ä¿¡ã™ã‚‹ã“ã¨ãŒã§ããªã„å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’実行ã—ã¦ã„ã‚‹ãŸã‚ã§ã™ã€‚ + </notification> + <notification name="CantMoveObjectNavMesh"> + リージョン境界をã¾ãŸãナビメッシュを変更ã§ããªã„ãŸã‚ã€ã‚ªãƒ–ジェクト '[OBJECT_NAME]' をリージョン [REGION_NAME] 内㮠[OBJ_POSITION] ã«ç§»å‹•ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantMoveObjectWTF"> + ä¸æ˜Žãªç†ç”±ã«ã‚ˆã‚Šã€ã‚ªãƒ–ジェクト '[OBJECT_NAME]' ã‚’ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ [REGION_NAME] 内㮠[OBJ_POSITION] ã«ç§»å‹•ã§ãã¾ã›ã‚“。 +([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + ãã®ã‚ªãƒ–ジェクトを変更ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“ + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + ナビメッシュã«è²¢çŒ®ã™ã‚‹ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦ç‰©ç†ã‚’有効ã«ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantEnablePhysKeyframedObj"> + ã‚ーフレームオブジェクトã®ãŸã‚ã«ç‰©ç†ã‚’有効ã«ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + 土地ã®ãƒªã‚½ãƒ¼ã‚¹ãŒè¶³ã‚Šãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®ç‰©ç†ã‚’有効ã«ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantEnablePhysCostTooGreat"> + [MAX_OBJECTS] より大ãã„物ç†ãƒªã‚½ãƒ¼ã‚¹ã‚³ã‚¹ãƒˆã‚’æŒã¤ã‚ªãƒ–ジェクトã§ã¯ã€ç‰©ç†ã‚’有効ã«ã§ãã¾ã›ã‚“。 + </notification> + <notification name="PhantomWithConcavePiece"> + ã“ã®ã‚ªãƒ–ジェクトã¯ãƒ•ã‚¡ãƒ³ãƒˆãƒ ã§ã€ãƒŠãƒ“メッシュã«è²¢çŒ®ã—ã¦ã„ã‚‹ãŸã‚ã€ãã¼ã¿ã‚’æŒãŸã›ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="UnableAddItem"> + ã‚¢ã‚¤ãƒ†ãƒ ã‚’è¿½åŠ ã§ãã¾ã›ã‚“! + </notification> + <notification name="UnableEditItem"> + ã“ã‚Œã¯ç·¨é›†ã§ãã¾ã›ã‚“! + </notification> + <notification name="NoPermToEdit"> + ã“れを編集ã™ã‚‹è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="NoPermToCopyInventory"> + ãã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‚’コピーã™ã‚‹ã“ã¨ã¯è¨±å¯ã•ã‚Œã¾ã›ã‚“。 + </notification> + <notification name="CantSaveItemDoesntExist"> + オブジェクトã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«ä¿å˜ã§ãã¾ã›ã‚“。アイテムãŒå˜åœ¨ã—ã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CantSaveItemAlreadyExists"> + オブジェクトã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«ä¿å˜ã§ãã¾ã›ã‚“。åŒã˜åå‰ã‚’æŒã¤ã‚¢ã‚¤ãƒ†ãƒ ãŒã™ã§ã«ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«å˜åœ¨ã—ã¾ã™ã€‚ + </notification> + <notification name="CantSaveModifyAttachment"> + オブジェクトã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«ä¿å˜ã§ãã¾ã›ã‚“。ã“ã®ãŸã‚ã€ã‚¢ã‚¿ãƒƒãƒãƒ¡ãƒ³ãƒˆã®æ¨©é™ãŒå¤‰æ›´ã•ã‚Œã¾ã™ã€‚ + </notification> + <notification name="TooManyScripts"> + スクリプトãŒå¤šã™ãŽã¾ã™ã€‚ + </notification> + <notification name="UnableAddScript"> + テã‚ã‚¹ãƒˆã‚’è¿½åŠ ã§ãã¾ã›ã‚“! + </notification> + <notification name="AssetServerTimeoutObjReturn"> + 資産サーãƒãƒ¼ãŒã‚¿ã‚¤ãƒ リーã«å¿œç”ã—ã¾ã›ã‚“ã§ã—ãŸã€‚オブジェクト㌠sim ã«è¿”ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="RegionDisablePhysicsShapes"> + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€ç‰©ç†çš„シェイプãŒæœ‰åŠ¹ã«ã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="NoModNavmeshAcrossRegions"> + リージョンã®å¢ƒç•Œã‚’ã¾ãŸãナビメッシュã¯å¤‰æ›´ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + ãã®ã‚ªãƒ–ジェクトタイプã®ç‰©ç†çš„プãƒãƒ‘ティをè¨å®šã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoSetRootPrimWithNoShape"> + ルートプリムをè¨å®šã§ããªã„ãŸã‚ã€ã‚·ã‚§ã‚¤ãƒ—ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="NoRegionSupportPhysMats"> + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€ç‰©ç†çš„ç´ æãŒæœ‰åŠ¹ã«ã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="OnlyRootPrimPhysMats"> + 物ç†çš„ç´ æを調整ã§ãã‚‹ã®ã¯ã€ãƒ«ãƒ¼ãƒˆãƒ—リムã ã‘ã§ã™ã€‚ + </notification> + <notification name="NoSupportCharacterPhysMats"> + ã‚ャラクターã¸ã®ç‰©ç†çš„ç´ æã®è¨å®šã¯ã¾ã サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="InvalidPhysMatProperty"> + 指定ã—ãŸç‰©ç†çš„ç´ æã®ãƒ—ãƒãƒ‘ティ㌠1 ã¤ä»¥ä¸Šç„¡åŠ¹ã§ã™ã€‚ + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + メッシュオブジェクトã®ç¸«ã„ç›®ã®ã‚¿ã‚¤ãƒ—を変更ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + メッシュオブジェクトã®å½¢çŠ¶ã‚’変更ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ + </notification> + <notification name="FullRegionCantEnter"> + リージョンãŒåŸ‹ã¾ã£ã¦ã„ã‚‹ãŸã‚ã€\nã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥å ´ã§ãã¾ã›ã‚“。 + </notification> + <notification name="LinkFailedOwnersDiffer"> + リンクエラー -- 所有者ãŒé•ã„ã¾ã™ + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + リンクエラー -- リージョンã®å¢ƒç•Œã‚’ã¾ãŸãナビメッシュã¯å¤‰æ›´ã§ãã¾ã›ã‚“。 + </notification> + <notification name="LinkFailedNoPermToEdit"> + リンクエラー -- 編集権é™ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="LinkFailedTooManyPrims"> + リンクエラー -- プリミティブãŒå¤šã™ãŽã¾ã™ã€‚ + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + リンクエラー -- コピーãªã—ã¨è»¢é€ãªã—をリンクã§ãã¾ã›ã‚“。 + </notification> + <notification name="LinkFailedNothingLinkable"> + リンクエラー -- リンクã§ãã‚‹ã‚‚ã®ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + リンクエラー -- パスファインディングã®æ–‡å—æ•°ãŒå¤šã™ãŽã¾ã™ + </notification> + <notification name="LinkFailedInsufficientLand"> + リンクエラー -- 土地ã®ãƒªã‚½ãƒ¼ã‚¹ãŒè¶³ã‚Šã¾ã›ã‚“ + </notification> + <notification name="LinkFailedTooMuchPhysics"> + オブジェクトãŒä½¿ç”¨ã—ã¦ã„る物ç†ãƒªã‚½ãƒ¼ã‚¹ãŒå¤šã™ãŽãŸãŸã‚ã€ãƒ€ã‚¤ãƒŠãƒŸãƒƒã‚¯ã‚¹ãŒç„¡åŠ¹ã«ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + 区画 '[PARCEL_NAME]' ã®ã‚ªãƒ–ジェクト '[OBJECT_NAME]' ã«ã‚ˆã£ã¦ã€ã‚ãªãŸã¯ãƒ›ãƒ¼ãƒ ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="TeleportedHomeByObject"> + ​オブジェクト ​'[OBJECT_NAME]' ã«ã‚ˆã£ã¦ã€ã‚ãªãŸã¯ãƒ›ãƒ¼ãƒ ã¸ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="TeleportedByAttachment"> + [ITEM_ID] ã¸ã®ã‚¢ã‚¿ãƒƒãƒãƒ¡ãƒ³ãƒˆã«ã‚ˆã£ã¦ã€ã‚ãªãŸã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="TeleportedByObjectOnParcel"> + 区画 '[PARCEL_NAME]' ã®ã‚ªãƒ–ジェクト '[OBJECT_NAME]' ã«ã‚ˆã£ã¦ã€ã‚ãªãŸã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="TeleportedByObjectOwnedBy"> + [OWNER_ID] ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクト '[OBJECT_NAME]' ã«ã‚ˆã£ã¦ã€ã‚ãªãŸã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="TeleportedByObjectUnknownUser"> + ä¸æ˜Žãªãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクト '[OBJECT_NAME]' ã«ã‚ˆã£ã¦ã€ã‚ãªãŸã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="CantCreateObjectRegionFull"> + リクエストã•ã‚ŒãŸã‚ªãƒ–ジェクトを作æˆã§ãã¾ã›ã‚“。リージョンãŒåŸ‹ã¾ã£ã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + 1 ã¤ã®å ´æ‰€ã«è¤‡æ•°ã®ã‚ªãƒ–ジェクトをç€ç”¨ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + ã“ã“ã§ã¯ã€è¤‡æ•°ã®ã‚ªãƒ–ジェクトを作æˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="UnableToCreateObjTimeOut"> + リクエストã•ã‚ŒãŸã‚ªãƒ–ジェクトを作æˆã§ãã¾ã›ã‚“。オブジェクトãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="UnableToCreateObjUnknown"> + リクエストã•ã‚ŒãŸã‚ªãƒ–ジェクトを作æˆã§ãã¾ã›ã‚“。リクエストãŒã‚¿ã‚¤ãƒ アウトã«ãªã‚Šã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + è¦æ±‚ã•ã‚ŒãŸã‚ªãƒ–ジェクトを作æˆã§ãã¾ã›ã‚“。もã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="RezFailureTookTooLong"> + リクエストã•ã‚ŒãŸã‚ªãƒ–ジェクトã®ãƒãƒ¼ãƒ‰ã«æ™‚é–“ãŒã‹ã‹ã‚Šã™ãŽãŸãŸã‚ã€Rez ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="FailedToPlaceObjAtLoc"> + 指定ã—ãŸå ´æ‰€ã«ã‚ªãƒ–ジェクトをé…ç½®ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="CantCreatePlantsOnLand"> + ã“ã®åœŸåœ°ã«æœ¨ã‚’æ¤ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + オブジェクトをリストアã§ãã¾ã›ã‚“。ワールドã®ä½ç½®ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantRezObjectInvalidMeshData"> + メッシュデータãŒç„¡åŠ¹ãªãŸã‚ã€ã‚ªãƒ–ジェクトを Rez ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantRezObjectTooManyScripts"> + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«æ—¢ã«å¤šãã®ã‚¹ã‚¯ãƒªãƒ—トãŒå˜åœ¨ã™ã‚‹ãŸã‚ã€ã‚ªãƒ–ジェクトを Rez ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantCreateObjectNoAccess"> + ç¾åœ¨ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã§ã¯ã€ãã“ã«ã‚ªãƒ–ジェクトを作æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantCreateObject"> + ç¾åœ¨ã‚ãªãŸã«ã¯ã‚ªãƒ–ジェクト作æˆã™ã‚‹è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="InvalidObjectParams"> + 無効ãªã‚ªãƒ–ジェクトパラメーター + </notification> + <notification name="CantDuplicateObjectNoAcess"> + ç¾åœ¨ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã§ã¯ã€ã“ã“ã«ã‚ªãƒ–ジェクトã®ã‚³ãƒ”ーを作æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantChangeShape"> + ã‚ãªãŸã«ã¯ã“ã®ã‚·ã‚§ã‚¤ãƒ—を変更ã™ã‚‹è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="NoAccessToClaimObjects"> + ç¾åœ¨ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã§ã¯ã€ã“ã“ã«ã‚ªãƒ–ジェクトをå–å¾—ã§ãã¾ã›ã‚“。 + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚ªãƒ–ジェクトをè²æ¸¡ã™ã‚‹æ¨©é™ãŒãªã„ãŸã‚ã€è²æ¸¡ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="NoPrivsToBuyObject"> + ç¾åœ¨ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã§ã¯ã€ã“ã“ã§ã‚ªãƒ–ジェクトを購入ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + ã‚¢ãƒã‚¿ãƒ¼ãŒã‚ªãƒ–ジェクトã«å˜åœ¨ã™ã‚‹ãŸã‚ã€ã‚ªãƒ–ジェクトをç€ç”¨ã§ãã¾ã›ã‚“。 + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + 木やè‰ã‚’アタッãƒãƒ¡ãƒ³ãƒˆã¨ã—ã¦ç€ç”¨ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantAttachGroupOwnedObjs"> + グループãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトã¯ç€ç”¨ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantAttachObjectsNotOwned"> + 所有ã—ã¦ã„ãªã„オブジェクトã¯ç€ç”¨ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantAttachNavmeshObjects"> + ナビメッシュã«è²¢çŒ®ã—ã¦ã„るオブジェクトã¯ç€ç”¨ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + ã‚ãªãŸã«ã¯ã‚ªãƒ–ジェクトを移動ã™ã‚‹æ¨©é™ãŒãªã„ãŸã‚ã€ãã®ã‚ªãƒ–ジェクト添付ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + オブジェクトã®ç€ç”¨ã«ä½¿ç”¨ã§ãるスクリプトリソースãŒè¶³ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantDropItemTrialUser"> + オブジェクトをã“ã“ã«ãƒ‰ãƒãƒƒãƒ—ã§ãã¾ã›ã‚“ã€‚ãƒ•ãƒªãƒ¼ãƒˆãƒ©ã‚¤ã‚¢ãƒ«é ˜åŸŸã‚’ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="CantDropMeshAttachment"> + メッシュアタッãƒãƒ¡ãƒ³ãƒˆã‚’ドãƒãƒƒãƒ—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。インベントリã‹ã‚‰åˆ‡ã‚Šé›¢ã—ã¦ã€ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§ Rez ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CantDropAttachmentNoPermission"> + アタッãƒãƒ¡ãƒ³ãƒˆã®ãƒ‰ãƒãƒƒãƒ—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ãã“ã¸ãƒ‰ãƒãƒƒãƒ—ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + アタッãƒãƒ¡ãƒ³ãƒˆã®ãƒ‰ãƒãƒƒãƒ—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚利用ã§ãる土地リソースã®æ•°ãŒè¶³ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + 利用ã§ãるリソースãŒè¶³ã‚Šãªã„ãŸã‚ã€ã‚¢ã‚¿ãƒƒãƒãƒ¡ãƒ³ãƒˆã®ãƒ‰ãƒãƒƒãƒ—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="CantDropObjectFullParcel"> + ã“ã“ã«ã‚ªãƒ–ジェクトをドãƒãƒƒãƒ—ã§ãã¾ã›ã‚“。区画ãŒåŸ‹ã¾ã£ã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + 土地区画ã«å…¥å ´ã™ã‚‹ã“ã¨ã‚’ç¦æ¢ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚ªãƒ–ジェクトを触ã£ãŸã‚Šã€ã¤ã‹ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="PlzNarrowDeleteParams"> + 削除パラメーターを絞ã£ã¦ãã ã•ã„。 + </notification> + <notification name="UnableToUploadAsset"> + 資産をアップãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantTeleportCouldNotFindUser"> + ホームをテレãƒãƒ¼ãƒˆã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="GodlikeRequestFailed"> + éŽå‰°ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒå¤±æ•—ã—ã¾ã—㟠+ </notification> + <notification name="GenericRequestFailed"> + 一般的ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆã«å¤±æ•—ã—ã¾ã—㟠+ </notification> + <notification name="CantUploadPostcard"> + ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã‚’アップãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + グループ通知ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã®è©³ç´°ã‚’å–å¾—ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + グループ通知ã®é€ä¿¡ãŒè¨±å¯ã•ã‚Œãªã„ãŸã‚ã€é€ä¿¡ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + グループ通知をé€ä¿¡ã§ãã¾ã›ã‚“。æŒã¡ç‰©ã‚’作æˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantParceInventoryInNotice"> + 通知内ã®æŒã¡ç‰©ã‚’検出ã§ãã¾ã›ã‚“。 + </notification> + <notification name="TerrainUploadFailed"> + 地形ã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="TerrainFileWritten"> + 地形ファイルãŒæ›¸ãè¾¼ã¾ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + 地形ファイルを書ã出ã—ã€ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã‚’開始ã—ã¦ã„ã¾ã™... + </notification> + <notification name="TerrainBaked"> + 地形ãŒãƒ™ãƒ¼ã‚¯ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + é¸æŠžã•ã‚ŒãŸæœ€åˆã® 10 個ã®ã‚ªãƒ–ジェクトã®ã¿ãŒç„¡åŠ¹ã«ã•ã‚Œã¾ã—ãŸã€‚å¿…è¦ã«å¿œã˜ã¦ã€ãƒªãƒ•ãƒ¬ãƒƒã‚·ãƒ¥ã—ã¦é¸æŠžå†…å®¹ã‚’è¿½åŠ ã—ã¦ãã ã•ã„。 + </notification> + <notification name="UpdateViewerBuyParcel"> + ã“ã®åŒºç”»ã‚’購入ã™ã‚‹ã«ã¯ã€ãƒ“ューワをアップデートã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + </notification> + <notification name="CantBuyParcelNotForSale"> + 購入ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。ã“ã®åŒºç”»ã¯è²©å£²å¯¾è±¡ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + è²©å£²ä¾¡æ ¼ã¾ãŸã¯åœŸåœ°ã®é¢ç©ãŒå¤‰ã‚ã£ãŸãŸã‚ã€è³¼å…¥ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantBuyParcelNotAuthorized"> + ã‚ãªãŸã¯ã“ã®åŒºç”»ã®å§”ä»»ã•ã‚ŒãŸè²·ã„手ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + ã™ã§ã«è³¼å…¥ã®èªè¨¼ã‚’å¾…æ©Ÿã—ã¦ã„ã‚‹ãŸã‚ã€ã“ã®åŒºç”»ã‚’購入ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantBuildOverflowParcel"> + 区画をオーãƒãƒ¼ãƒ•ãƒãƒ¼ã™ã‚‹ãŸã‚ã€ã“ã“ã§ã‚ªãƒ–ジェクトを構築ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="SelectedMultipleOwnedLand"> + 所有者ã®é•ã†åœŸåœ°ã‚’é¸ã³ã¾ã—ãŸã€‚é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + é¸æŠžç¯„囲ã®ãƒªãƒ¼ã‚¹åŒºç”»ã®æ•°ãŒå°‘ãªã„ãŸã‚ã€å‚åŠ ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + 土地を分割ã§ãã¾ã›ã‚“。\n区画ãŒè¤‡æ•°é¸æŠžã•ã‚Œã¦ã„ã¾ã™ã€‚\nã‚‚ã£ã¨å°ã•ã„土地をé¸æŠžã—ã¦ã¿ã¦ãã ã•ã„。 + </notification> + <notification name="CantDivideLandCantFindParcel"> + 土地を分解ã§ãã¾ã›ã‚“。\n区画ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。\n「Helpã€>「Reprt Bug...ã€ã§ãƒ¬ãƒãƒ¼ãƒˆã‚’è¡Œã£ã¦ãã ã•ã„。 + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + 土地を分割ã§ãã¾ã›ã‚“。区画全体をé¸æŠžã—ã¾ã™ã€‚\nå°ã•ã„土地をé¸æŠžã—ã¦ã¿ã¦ãã ã•ã„。 + </notification> + <notification name="LandHasBeenDivided"> + 土地ãŒåˆ†å‰²ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="PassPurchased"> + å…¥å ´è¨±å¯ã‚’購入ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="RegionDisallowsClassifieds"> + リージョンã§ã¯ã€ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã‚’許å¯ã—ã¾ã›ã‚“。 + </notification> + <notification name="LandPassExpireSoon"> + ã“ã®åœŸåœ°ã¸ã®å…¥å ´è¨±å¯ã¯ã¾ã‚‚ãªã期é™ãŒåˆ‡ã‚Œã¾ã™ã€‚ + </notification> + <notification name="CantSitNoSuitableSurface"> + é…ç½®ã«é©ã—ãŸè¡¨é¢ãŒã‚ã‚Šã¾ã›ã‚“。別ã®å ´æ‰€ã‚’試ã—ã¦ã¿ãŸãã ã•ã„。 + </notification> + <notification name="CantSitNoRoom"> + ã“ã“ã«ã¯åº§ã‚‹ä½™åœ°ãŒã‚ã‚Šã¾ã›ã‚“。他ã®å ´æ‰€ã‚’試ã—ã¦ãã ã•ã„。 + </notification> + <notification name="ClaimObjectFailedNoPermission"> + 権é™ãŒãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="ClaimObjectFailedNoMoney"> + リンデンドルãŒè¶³ã‚Šãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="CantDeedGroupLand"> + グループ所有ã®åœŸåœ°ã¯ã€è²æ¸¡ã§ãã¾ã›ã‚“。 + </notification> + <notification name="BuyObjectFailedNoMoney"> + リンデンドルãŒè¶³ã‚Šãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®è³¼å…¥ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="BuyInventoryFailedNoMoney"> + リンデンドルãŒä¸è¶³ã—ã¦ã„ã‚‹ãŸã‚ã€ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‚’購入ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="BuyPassFailedNoMoney"> + リンデンドルãŒè¶³ã‚Šãªã„ãŸã‚ã€ã“ã®åœŸåœ°ã¸ã®å…¥å ´è¨±å¯ã‚’購入ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantBuyPassTryAgain"> + 今ã™ãã«ã¯å…¥å ´è¨±å¯ã‚’購入ã§ãã¾ã›ã‚“。後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="CantCreateObjectParcelFull"> + 区画ãŒåŸ‹ã¾ã£ã¦ã„ã‚‹ãŸã‚ã€ã‚ªãƒ–ジェクトを\n作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="FailedPlacingObject"> + 指定ã—ãŸå ´æ‰€ã«ã‚ªãƒ–ジェクトをé…ç½®ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="CantCreateLandmarkForEvent"> + イベントã®ãŸã‚ã®ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="GodBeatsFreeze"> + 強力ãªåŠ›ã§ãƒ•ãƒªãƒ¼ã‚ºã‚’解除ã—ã¾ã™ã€‚ + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + 特殊ãªæ¨©é™ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã“ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯ãƒã‚°ã«è¨˜éŒ²ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="ExpireExplanation"> + システムã¯ã€ç¾åœ¨ã‚ãªãŸã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’処ç†ã§ãã¾ã›ã‚“。リクエストãŒã‚¿ã‚¤ãƒ アウトã«ãªã‚Šã¾ã—ãŸã€‚ + </notification> + <notification name="DieExplanation"> + システムã¯ã€ã‚ãªãŸã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’処ç†ã§ãã¾ã›ã‚“。 + </notification> + <notification name="AddPrimitiveFailure"> + プリミティブ広告を出ã™ã«ã¯ã€è³‡é‡‘ãŒè¶³ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="RezObjectFailure"> + 資金ãŒè¶³ã‚Šãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトを作æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="ResetHomePositionNotLegal"> + ホームãŒä¸æ£ãªãŸã‚ã€ãƒ›ãƒ¼ãƒ ã®ä½ç½®ã‚’リセットã—ã¾ã™ã€‚ + </notification> + <notification name="CantInviteRegionFull"> + リージョンãŒåŸ‹ã¾ã£ã¦ã„ã‚‹ãŸã‚ã€ç¾åœ¨ã®å ´æ‰€ã«èª°ã‹ã‚’招待ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="CantSetHomeAtRegion"> + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€ã“ã“ã«ãƒ›ãƒ¼ãƒ ã®ä½ç½®ã‚’è¨å®šã§ãã¾ã›ã‚“。 + </notification> + <notification name="ListValidHomeLocations"> + ホームã®å ´æ‰€ã‚’è¨å®šã§ãã‚‹ã®ã¯ã€è‡ªåˆ†ã®åœŸåœ°ã‹ã€ã¾ãŸã¯ãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã®ã‚¤ãƒ³ãƒ•ã‚©ãƒãƒ–ã§ã®ã¿ã§ã™ã€‚ + </notification> + <notification name="SetHomePosition"> + 家ã®é…ç½®ã®è¨å®šã€‚ + </notification> + <notification name="CantDerezInventoryError"> + インベントリエラーã®ãŸã‚ã€ã‚ªãƒ–ジェクト㮠Rez 解除ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantCreateRequestedInv"> + リクエストã•ã‚ŒãŸã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‚’作æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantCreateRequestedInvFolder"> + リクエストã•ã‚ŒãŸæŒã¡ç‰©ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã‚’作æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantCreateInventory"> + ãã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‚’作æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantCreateLandmark"> + ランドマークを作æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantCreateOutfit"> + アウトフィットをã™ãã«ã¯ä½œæˆã§ãã¾ã›ã‚“。ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="InventoryNotForSale"> + インベントリã¯è²©å£²å¯¾è±¡ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantFindInvItem"> + æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="CantFindObject"> + オブジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + オブジェクトã¸ã®é€é‡‘ã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ç¾åœ¨ç„¡åŠ¹ã«ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="CantPayNoAgent"> + 支払ã„ã®ç›¸æ‰‹ã‚’把æ¡ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="CantDonateToPublicObjects"> + パブリックオブジェクトã«ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚’与ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + インワールドオブジェクトã§ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="UserBalanceOrLandUsageError"> + 内部エラーãŒç™ºç”Ÿã—ãŸãŸã‚ã€ãƒ“ューワをæ£ã—ãæ›´æ–°ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ビューワã«è¡¨ç¤ºã•ã‚Œã‚‹ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã®æ®‹é«˜ã¾ãŸã¯åŒºç”»ã®æ‰€æœ‰ã¯ã€ã‚µãƒ¼ãƒãƒ¼ä¸Šã®å®Ÿéš›ã®æ®‹é«˜ã‚’åæ˜ ã—ã¦ã„ãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + </notification> + <notification name="LargePrimAgentIntersect"> + ä»–ã®ãƒ—レイヤーã®é–¢å¿ƒã‚’引ã大ããªãƒ—リムを作æˆã§ãã¾ã›ã‚“。他ã®ãƒ—レイヤーãŒç§»å‹•ã—ãŸã¨ãã«å†è©¦è¡Œã—ã¦ãã ã•ã„。 + </notification> + <notification name="PreferenceChatClearLog"> + ã“ã‚Œã«ã‚ˆã‚Šã€éŽåŽ»ã®ä¼šè©±ã®ãƒã‚°ã€ãŠã‚ˆã³ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã™ã¹ã¦ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒå‰Šé™¤ã•ã‚Œã¾ã™ã€‚ + <usetemplate ignoretext="以å‰ã®ä¼šè©±ã®ãƒã‚°ã‚’削除ã™ã‚‹å‰ã«ç¢ºèªã—ã¦ãã ã•ã„。" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + ã“ã‚Œã«ã‚ˆã‚Šã€ä»¥å‰ã®ã™ã¹ã¦ã®ä¼šè©±ã®ãƒ†ã‚ストãŒå‰Šé™¤ã•ã‚Œã¾ã™ã€‚éŽåŽ»ã®ä¼šè©±ã®ãƒªã‚¹ãƒˆã«ã¯å½±éŸ¿ã—ã¾ã›ã‚“。.txt ãŠã‚ˆã³ txt.backup ã®æ‹¡å¼µåãŒä»˜ã„ãŸã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒ [FOLDER] フォルダーã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã™ã€‚ + <usetemplate ignoretext="テã‚ストを削除ã™ã‚‹ã¾ãˆã«ç¢ºèªã—ã¦ãã ã•ã„。" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="PreferenceChatPathChanged"> + ファイルを移動ã§ãã¾ã›ã‚“。以å‰ã®ãƒ‘スãŒãƒªã‚¹ãƒˆã‚¢ã•ã‚Œã¾ã—ãŸã€‚ + <usetemplate ignoretext="ファイルを移動ã§ãã¾ã›ã‚“。以å‰ã®ãƒ‘スãŒãƒªã‚¹ãƒˆã‚¢ã•ã‚Œã¾ã—ãŸã€‚" name="okignore" yestext="OK"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml index 70d37c3bad..3ef8eba19f 100644 --- a/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml @@ -27,5 +27,6 @@ <icon name="permission_edit_mine_icon" tool_tip="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã¯ã€ã‚ãªãŸã®ã‚ªãƒ–ジェクトを編集・削除・å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/> <icon name="permission_map_icon" tool_tip="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã¯åœ°å›³ä¸Šã§ã‚ãªãŸã®ä½ç½®ã‚’表示ã§ãã¾ã™"/> <icon name="permission_online_icon" tool_tip="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã¯ã‚ãªãŸãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã«ã„ã‚‹ã“ã¨ã‚’確èªã§ãã¾ã™"/> + <button name="info_btn" tool_tip="詳細"/> <button name="profile_btn" tool_tip="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã®è¡¨ç¤º"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/ja/panel_block_list_sidetray.xml index 5d6a6065ae..9263e5f347 100644 --- a/indra/newview/skins/default/xui/ja/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/ja/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> - <text name="title_text"> - ブãƒãƒƒã‚¯ãƒªã‚¹ãƒˆ - </text> - <scroll_list name="blocked" tool_tip="ç¾åœ¨ãƒ–ãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹ä½äººä¸€è¦§"/> - <button label="ã‚¢ãƒã‚¿ãƒ¼ã‚’ブãƒãƒƒã‚¯" label_selected="ä½äººã‚’ブãƒãƒƒã‚¯..." name="Block resident..." tool_tip="ブãƒãƒƒã‚¯ã—ãŸã„ä½äººã‚’é¸ã‚“ã§ãã ã•ã„"/> - <button label="åå‰ã§ã‚ªãƒ–ジェクトをブãƒãƒƒã‚¯..." label_selected="åå‰ã§ã‚ªãƒ–ジェクトをブãƒãƒƒã‚¯..." name="Block object by name..." tool_tip="åå‰ã§ãƒ–ãƒãƒƒã‚¯ã—ãŸã„オブジェクトをé¸ã‚“ã§ãã ã•ã„"/> - <button label="ブãƒãƒƒã‚¯è§£é™¤" label_selected="ブãƒãƒƒã‚¯è§£é™¤" name="Unblock" tool_tip="ブãƒãƒƒã‚¯ãƒªã‚¹ãƒˆã‹ã‚‰ä½äººãƒ»ã‚ªãƒ–ジェクトを削除"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="フィルター" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="é¸æŠžã—ãŸä½äººãƒ»ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³"/> + <menu_button name="view_btn" tool_tip="オプションを並ã¹æ›¿ãˆã‚‹"/> + <menu_button name="plus_btn" tool_tip="ブãƒãƒƒã‚¯ã™ã‚‹ä½äººãƒ»ã‚ªãƒ–ジェクトをé¸æŠž"/> + <button name="unblock_btn" tool_tip="ブãƒãƒƒã‚¯ãƒªã‚¹ãƒˆã‹ã‚‰ä½äººãƒ»ã‚ªãƒ–ジェクトを削除"/> + </panel> + <block_list name="blocked" tool_tip="ç¾åœ¨ãƒ–ãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹ä½äººä¸€è¦§"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/ja/panel_conversation_list_item.xml new file mode 100644 index 0000000000..09ffb92d36 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ï¼‰"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/ja/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..e05a67e31d --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="ボイスãƒãƒ£ãƒƒãƒˆ"/> + <icon name="unread_ims_icon" tool_tip="ãƒã‚°ã‚¢ã‚¦ãƒˆæ™‚ã«è¡¨ç¤ºã•ã‚Œã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸"/> + <button name="delete_btn" tool_tip="ã“ã®ã‚¨ãƒ³ãƒˆãƒªãƒ¼ã‚’削除"/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_group_list_item.xml b/indra/newview/skins/default/xui/ja/panel_group_list_item.xml index 4b548049c8..77d3d8f391 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="ä¸æ˜Ž"/> + <button name="info_btn" tool_tip="詳細"/> <button name="profile_btn" tool_tip="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã®è¡¨ç¤º"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_people.xml b/indra/newview/skins/default/xui/ja/panel_people.xml index 88c31451b5..03ce87537a 100644 --- a/indra/newview/skins/default/xui/ja/panel_people.xml +++ b/indra/newview/skins/default/xui/ja/panel_people.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <!-- Side tray panel --> <panel label="人" name="people_panel"> <string name="no_recent_people" value="最近交æµã—ãŸäººã¯ã„ã¾ã›ã‚“。 一緒ã«ä½•ã‹ã™ã‚‹ä»²é–“ã‚’ãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿ [secondlife:///app/search/people 検索] ã‹ [secondlife:///app/worldmap 世界地図] ã‚’ãŠè©¦ã—ãã ã•ã„。"/> @@ -14,81 +14,53 @@ <string name="no_filtered_friends_msg"> ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/people/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。 </string> - <string name="people_filter_label" value="人をフィルター"/> - <string name="groups_filter_label" value="グループをフィルター"/> <string name="no_filtered_groups_msg" value="ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/groups/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/> <string name="no_groups_msg" value="グループをãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿ [secondlife:///app/search/groups 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/> <string name="MiniMapToolTipMsg" value="[地域](ダブルクリックã§åœ°å›³ã‚’é–‹ã。Shiftâ€ãƒ‰ãƒ©ãƒƒã‚°ã§æ°´å¹³ãƒ»åž‚直移動)"/> <string name="AltMiniMapToolTipMsg" value="[地域](ダブルクリックã§ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€‚Shiftâ€ãƒ‰ãƒ©ãƒƒã‚°ã§æ°´å¹³ãƒ»åž‚直移動)"/> - <filter_editor label="フィルター" name="filter_input"/> <tab_container name="tabs"> <panel label="è¿‘ã" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="オプション"/> - <button name="add_friend_btn" tool_tip="é¸æŠžã—ãŸä½äººã‚’フレンドリストã«ç™»éŒ²"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="人をフィルター" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="é¸æŠžã—ãŸäººã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³"/> + <menu_button name="nearby_view_btn" tool_tip="表示 / 並ã¹æ›¿ãˆã®ã‚ªãƒ—ション"/> + <button name="add_friend_btn" tool_tip="フレンド登録を申ã—出ã¾ã™"/> + <dnd_button name="nearby_del_btn" tool_tip="フレンドã¨ã—ã¦é¸æŠžã•ã‚Œã¦ã„る人を削除"/> </panel> </panel> - <panel label="マイ フレンド" name="friends_panel"> + <panel label="フレンド" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="人をフィルター" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="é¸æŠžã—ãŸäººã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³"/> + <menu_button name="friends_view_btn" tool_tip="表示 / 並ã¹æ›¿ãˆã®ã‚ªãƒ—ション"/> + <button name="friends_add_btn" tool_tip="フレンド登録を申ã—出ã¾ã™"/> + <dnd_button name="friends_del_btn" tool_tip="フレンドã¨ã—ã¦é¸æŠžã•ã‚Œã¦ã„る人を削除"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="オンライン"/> <accordion_tab name="tab_all" title="全員"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="オプションを表示ã—ã¾ã™"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="フレンド登録を申ã—出る"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="é¸æŠžã—ãŸäººã‚’フレンドリストã‹ã‚‰å‰Šé™¤"/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="マイ グループ" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="オプション"/> - <button name="plus_btn" tool_tip="グループã«å‚åŠ / æ–°è¦ã‚°ãƒ«ãƒ¼ãƒ—を作æˆã—ã¾ã™"/> - <button name="activate_btn" tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—をアクティブã«ã—ã¾ã™"/> + <panel label="グループ" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="フィルターグループ" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³"/> + <menu_button name="groups_view_btn" tool_tip="表示 / 並ã¹æ›¿ãˆã®ã‚ªãƒ—ション"/> + <menu_button name="plus_btn" tool_tip="グループã«å‚åŠ / æ–°è¦ã‚°ãƒ«ãƒ¼ãƒ—を作æˆã—ã¾ã™"/> + <dnd_button name="minus_btn" tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰è„±é€€"/> </panel> </panel> <panel label="最新" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="オプション"/> - <button name="add_friend_btn" tool_tip="é¸æŠžã—ãŸä½äººã‚’フレンドリストã«ç™»éŒ²"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="人をフィルター" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="é¸æŠžã—ãŸäººã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³"/> + <menu_button name="recent_view_btn" tool_tip="表示 / 並ã¹æ›¿ãˆã®ã‚ªãƒ—ション"/> + <button name="add_friend_btn" tool_tip="フレンド登録を申ã—出ã¾ã™"/> + <dnd_button name="recent_del_btn" tool_tip="フレンドã¨ã—ã¦é¸æŠžã•ã‚Œã¦ã„る人を削除"/> </panel> </panel> + <panel label="åœæ¢" name="blocked_panel"> + <panel label="ブãƒãƒƒã‚¯ã•ã‚ŒãŸä½äººã¨ã‚ªãƒ–ジェクト" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="プãƒãƒ•ã‚£ãƒ¼ãƒ«" name="view_profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãã®ä»–ä½äººæƒ…å ±ã‚’è¡¨ç¤º"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="IM" name="im_btn" tool_tip="インスタントメッセージを開ãã¾ã™"/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="コール" name="call_btn" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="共有" name="share_btn" tool_tip="インベントリã®ã‚¢ã‚¤ãƒ†ãƒ を共有ã™ã‚‹"/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="グループプãƒãƒ•ã‚£ãƒ¼ãƒ«" name="group_info_btn" tool_tip="グループプãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’表示ã—ã¾ã™"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="グループãƒãƒ£ãƒƒãƒˆ" name="chat_btn" tool_tip="ãƒãƒ£ãƒƒãƒˆã‚’開始ã—ã¾ã™"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="グループコール" name="group_call_btn" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml index b6e344ca48..ae5391c7bd 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="ãƒãƒ£ãƒƒãƒˆ" name="chat"> - <text name="font_size"> - æ–‡å—ã®å¤§ãã•ï¼š - </text> - <radio_group name="chat_font_size"> - <radio_item label="å°" name="radio" value="0"/> - <radio_item label="ä¸" name="radio2" value="1"/> - <radio_item label="大" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="true" label="ãƒãƒ£ãƒƒãƒˆä¸ã«ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/> - <check_box label="オフライン時ã«å—ã‘å–ã£ãŸ IM をメールã§å—ä¿¡" name="send_im_to_email"/> - <check_box label="IM ã¨ãƒãƒ£ãƒƒãƒˆå±¥æ´ã«æ–‡å—ã ã‘表示ã™ã‚‹" name="plain_text_chat_history"/> - <check_box label="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆ" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - IM ã®è¡¨ç¤ºæ–¹æ³•ï¼š - </text> - <text name="requires_restart_label"> - (å†èµ·å‹•å¾Œã«åæ˜ ï¼‰ - </text> - <radio_group name="chat_window" tool_tip="インスタントメッセージを別フãƒãƒ¼ã‚¿ãƒ¼ã€ã¾ãŸã¯1ã¤ã®ãƒ•ãƒãƒ¼ã‚¿ãƒ¼ã«è¤‡æ•°ã‚¿ãƒ–ã§è¡¨ç¤ºã—ã¾ã™ï¼ˆè¦å†èµ·å‹•ï¼‰"> - <radio_item label="別々ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="radio" value="0"/> - <radio_item label="タブ" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - å—ä¿¡ãƒãƒ£ãƒƒãƒˆã®ãƒãƒƒãƒ—アップを有効ã«ã™ã‚‹ - </text> - <check_box label="グループãƒãƒ£ãƒƒãƒˆ" name="EnableGroupChatPopups" tool_tip="ã“れをé¸æŠžã™ã‚‹ã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã—ãŸéš›ã«ãƒãƒƒãƒ—アップãŒè¡¨ç¤ºã•ã‚Œã¾ã™"/> - <check_box label="IM ãƒãƒ£ãƒƒãƒˆ" name="EnableIMChatPopups" tool_tip="ã“れをé¸æŠžã™ã‚‹ã¨ã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã—ãŸéš›ã«ãƒãƒƒãƒ—アップãŒè¡¨ç¤ºã•ã‚Œã¾ã™"/> - <spinner label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè¡¨ç¤ºã•ã‚Œã‚‹é•·ã•ï¼š" name="nearby_toasts_lifetime"/> - <spinner label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæ¶ˆãˆã‚‹ã¾ã§ã®é•·ã•ï¼š" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="true" label="ãƒãƒ£ãƒƒãƒˆä¸ã«ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/> + <check_box label="オフライン時ã«å—ã‘å–ã£ãŸ IM をメールã§å—ä¿¡" name="send_im_to_email"/> + <check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã¯ã‚³ãƒ¼ãƒ«ã¨ IM ã‚’å—ä¿¡ã—ãªã„" name="voice_call_friends_only_check"/> + <text name="font_size"> + æ–‡å—ã®å¤§ãã•ï¼š + </text> + <combo_box name="chat_font_size"> + <item label="å°è¦æ¨¡" name="Small" value="0"/> + <item label="ä¸" name="Medium" value="1"/> + <item label="大è¦æ¨¡" name="Large" value="2"/> + </combo_box> + <check_box label="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆ" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + 通知 + </text> + <text name="friend_ims"> + フレンド IM: + </text> + <combo_box name="FriendIMOptions"> + <item label="会話ウィンドウを開ã" name="OpenConversationsWindow" value="openconversations"/> + <item label="メッセージã®ãƒãƒƒãƒ—アップ" name="PopUpMessage" value="toast"/> + <item label="Flash ツールãƒãƒ¼ãƒœã‚¿ãƒ³" name="FlashToolbarButton" value="flash"/> + <item label="フィルターãªã—" name="None" value="none"/> + </combo_box> + <text name="non_friend_ims"> + éžãƒ•ãƒ¬ãƒ³ãƒ‰ IM: + </text> + <combo_box name="NonFriendIMOptions"> + <item label="会話ウィンドウを開ã" name="OpenConversationsWindow" value="openconversations"/> + <item label="メッセージã®ãƒãƒƒãƒ—アップ" name="PopUpMessage" value="toast"/> + <item label="Flash ツールãƒãƒ¼ãƒœã‚¿ãƒ³" name="FlashToolbarButton" value="flash"/> + <item label="フィルターãªã—" name="None" value="none"/> + </combo_box> + <text name="conference_ims"> + コンファレンス IM: + </text> + <combo_box name="ConferenceIMOptions"> + <item label="会話ウィンドウを開ã" name="OpenConversationsWindow" value="openconversations"/> + <item label="メッセージã®ãƒãƒƒãƒ—アップ" name="PopUpMessage" value="toast"/> + <item label="Flashツールãƒãƒ¼ãƒœã‚¿ãƒ³" name="FlashToolbarButton" value="flash"/> + <item label="フィルターãªã—" name="None" value="none"/> + </combo_box> + <text name="group_chat"> + グループãƒãƒ£ãƒƒãƒˆ: + </text> + <combo_box name="GroupChatOptions"> + <item label="会話ウィンドウを開ã" name="OpenConversationsWindow" value="openconversations"/> + <item label="メッセージã®ãƒãƒƒãƒ—アップ" name="PopUpMessage" value="toast"/> + <item label="Flash ツールãƒãƒ¼ãƒœã‚¿ãƒ³" name="FlashToolbarButton" value="flash"/> + <item label="ãªã—" name="None" value="none"/> + </combo_box> + <text name="nearby_chat"> + è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ: + </text> + <combo_box name="NearbyChatOptions"> + <item label="会話ウィンドウを開ã" name="OpenConversationsWindow" value="openconversations"/> + <item label="メッセージã®ãƒãƒƒãƒ—アップ" name="PopUpMessage" value="toast"/> + <item label="Flash ツールãƒãƒ¼ãƒœã‚¿ãƒ³" name="FlashToolBarButton" value="flash"/> + <item label="フィルターãªã—" name="None" value="none"/> + </combo_box> + <text name="notifications_alert"> + ã™ã¹ã¦ã®é€šçŸ¥ã‚’一時的ã«å—ã‘付ã‘ãªã„よã†ã«ã™ã‚‹ã«ã¯ã€ã€Œã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ãƒˆã€>「通知をå—ã‘ãªã„ã€ã‚’使用ã—ã¾ã™ã€‚ + </text> + </panel> + <panel> + <text name="play_sound"> + 音ã®å†ç”Ÿ: + </text> + <check_box label="æ–°ã—ã„会話" name="new_conversation"/> + <check_box label="ボイスコールã®ç€ä¿¡" name="incoming_voice_call"/> + <check_box label="テレãƒãƒ¼ãƒˆã‚’渡ã™" name="teleport_offer"/> + <check_box label="アイテムã®ã‚ªãƒ•ã‚¡ãƒ¼" name="inventory_offer"/> + </panel> + <panel> + <button label="ãƒã‚°ã®ã‚¯ãƒªã‚¢..." name="clear_log"/> + <button label="テã‚ストã®å‰Šé™¤..." name="delete_transcripts"/> + <button label="å‚ç…§..." label_selected="å‚ç…§" name="log_path_button"/> + </panel> <button label="ä»–ã®è¨€èªž..." name="ok_btn"/> <button label="自動置æ›..." name="autoreplace_showgui"/> <button label="スペルãƒã‚§ãƒƒã‚¯ä¸..." name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml index 91e1514e49..d70af7e099 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml @@ -69,9 +69,9 @@ <combo_box.item label="一時退å¸è¨å®šãªã—" name="item4"/> </combo_box> <text name="text_box3"> - å–ã‚Šè¾¼ã¿ä¸ãƒ¢ãƒ¼ãƒ‰æ™‚ã®è¿”事: + 「通知をå—ã‘ãªã„ã€å¿œç”: </text> - <text_editor name="busy_response"> + <text_editor name="do_not_disturb_response"> log_in_to_change </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml index c61c73657f..4f65c8477b 100644 --- a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="オブジェクトを買ã†" name="Buyobject"/> <combo_box.item label="オブジェクトã«æ”¯æ‰•ã†" name="Payobject"/> <combo_box.item label="é–‹ã" name="Open"/> + <combo_box.item label="ズーム" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index 50697e5500..b27904c4d7 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -137,7 +137,7 @@ 終了 </string> <string name="create_account_url"> - http://join.secondlife.com/index.php?lang=ja-JP&sourceid=[sourceid] + http://join.secondlife.com/?sourceid=[sourceid] </string> <string name="LoginFailedViewerNotPermitted"> ãŠä½¿ã„ã®å¤ã„ビューワã§ã¯ Second Life ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。以下ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰æ–°ã—ã„ビューワをダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã•ã„: @@ -622,8 +622,8 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="AvatarAway"> 一時退å¸ä¸ </string> - <string name="AvatarBusy"> - å–ã‚Šè¾¼ã¿ä¸ + <string name="AvatarDoNotDisturb"> + 通知をå—ã‘ãªã„ </string> <string name="AvatarMuted"> ブãƒãƒƒã‚¯ä¸ @@ -859,6 +859,12 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="ST_NO_JOINT"> ROOT ã¾ãŸã¯ JOINT ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ </string> + <string name="NearbyChatTitle"> + è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ + </string> + <string name="NearbyChatLabel"> + (è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ) + </string> <string name="whisper"> ã®ã•ã•ã‚„ã: </string> @@ -922,12 +928,15 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="ControlYourCamera"> カメラã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ« </string> - <string name="TeleportYourAgent"> - ã‚ãªãŸã‚’テレãƒãƒ¼ãƒˆ - </string> <string name="NotConnected"> 接続ã•ã‚Œã¦ã„ã¾ã›ã‚“ </string> + <string name="AgentNameSubst"> + (ã‚ãªãŸ) + </string> + <string name="TeleportYourAgent"> + ã‚ãªãŸã‚’テレãƒãƒ¼ãƒˆ + </string> <string name="SIM_ACCESS_PG"> General </string> @@ -1009,18 +1018,6 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="dictionary_files"> 辞書 </string> - <string name="AvatarSetNotAway"> - 一時退å¸ä¸è§£é™¤ - </string> - <string name="AvatarSetAway"> - 一時退å¸ä¸ - </string> - <string name="AvatarSetNotBusy"> - å–ã‚Šè¾¼ã¿ä¸è§£é™¤ - </string> - <string name="AvatarSetBusy"> - å–ã‚Šè¾¼ã¿ä¸ - </string> <string name="shape"> シェイプ </string> @@ -1989,8 +1986,8 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="PanelContentsNewScript"> æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト </string> - <string name="BusyModeResponseDefault"> - メッセージをé€ã£ãŸä½äººã¯ã€èª°ã«ã‚‚邪é”ã‚’ã•ã‚ŒãŸããªã„ãŸã‚ç¾åœ¨ã€Œå–ã‚Šè¾¼ã¿ä¸ã€ãƒ¢ãƒ¼ãƒ‰ã§ã™ã€‚ ã‚ãªãŸã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ã‚ã¨ã§ç¢ºèªã§ãるよã†ã« IM パãƒãƒ«ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ + <string name="DoNotDisturbModeResponseDefault"> + ã“ã®ä½æ°‘ãŒã€Œé€šçŸ¥ã‚’å—ã‘ãªã„ã€ã‚’オンã«ã™ã‚‹ã¨ã€ã‚ãªãŸã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¾Œã§è¡¨ç¤ºã•ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ </string> <string name="MuteByName"> (å称別) @@ -2103,9 +2100,6 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="GroupMoneyDate"> [year,datetime,utc]å¹´[mth,datetime,utc]月[day,datetime,utc]æ—¥[weekday,datetime,utc] </string> - <string name="ViewerObjectContents"> - 内容 - </string> <string name="AcquiredItems"> å–得アイテム</string> @@ -3877,7 +3871,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã General リージョン </string> <string name="LocationCtrlSeeAVsTooltip"> - ã“ã®åŒºç”»å¤–ã«ã‚¢ãƒã‚¿ãƒ¼ã‚’見ãˆã‚‹ã‚ˆã†ã«ã—ã¦ã€ãƒãƒ£ãƒƒãƒˆã‚‚è¨±å¯ + ã“ã®åŒºç”»å†…ã®ã‚¢ãƒã‚¿ãƒ¼ã¯ã€ã“ã®åŒºç”»ã®å¤–ã«ã„ã‚‹ã‚¢ãƒã‚¿ãƒ¼ã‹ã‚‰ã¯è¦‹ã‚‹ã“ã¨ã‚‚èžãã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 </string> <string name="LocationCtrlPathfindingDirtyTooltip"> 地域(リージョン)ãŒå†æ§‹ç¯‰ã•ã‚Œã‚‹ã¾ã§ã€ç§»å‹•ã™ã‚‹ã‚ªãƒ–ジェクトã¯æ£ã—ã動作ã—ãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ @@ -3954,6 +3948,12 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã <string name="IM_unblock_only_groups_friends"> ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã«ã¯ã€ã€Œç’°å¢ƒè¨å®šã€ã®ã€Œãƒ—ライãƒã‚·ãƒ¼ã€ã§ã€Œãƒ•ãƒ¬ãƒ³ãƒ‰ã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã¯ã‚³ãƒ¼ãƒ«ã¨ IM ã‚’å—ä¿¡ã—ãªã„ã€ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã‚’オフã«ã—ã¾ã™ã€‚ </string> + <string name="OnlineStatus"> + オンライン + </string> + <string name="OfflineStatus"> + オフライン + </string> <string name="answered_call"> 相手ãŒã‚³ãƒ¼ãƒ«ã‚’å—ã‘ã¾ã—㟠</string> @@ -3963,6 +3963,9 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã <string name="you_joined_call"> ボイスコールã«å‚åŠ ã—ã¾ã—㟠</string> + <string name="you_auto_rejected_call-im"> + 「通知をå—ã‘ãªã„ã€ãŒã‚ªãƒ³ã®ã¨ãã«ã€è‡ªå‹•çš„ã«ãƒœã‚¤ã‚¹ã‚³ãƒ¼ãƒ«ã‚’æ‹’å¦ã—ã¾ã—ãŸã€‚ + </string> <string name="name_started_call"> [NAME] ã¯ãƒœã‚¤ã‚¹ã‚³ãƒ¼ãƒ«ã‚’開始ã—ã¾ã™ </string> @@ -3979,7 +3982,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã 接続ä¸... </string> <string name="conference-title"> - アドホックコンファレンス + 複数人ãƒãƒ£ãƒƒãƒˆ </string> <string name="conference-title-incoming"> [AGENT_NAME] ã¨ã‚³ãƒ³ãƒ•ã‚¡ãƒ¬ãƒ³ã‚¹ã™ã‚‹ @@ -4859,6 +4862,9 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã <string name="Command_Chat_Label"> ãƒãƒ£ãƒƒãƒˆ </string> + <string name="Command_Conversations_Label"> + 会話 + </string> <string name="Command_Compass_Label"> コンパス </string> @@ -4934,6 +4940,9 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã <string name="Command_Chat_Tooltip"> è¿‘ãã®äººã¨æ–‡å—ãƒãƒ£ãƒƒãƒˆã™ã‚‹ </string> + <string name="Command_Conversations_Tooltip"> + 全員ã¨ã®ä¼šè©± + </string> <string name="Command_Compass_Tooltip"> コンパス </string> @@ -5063,4 +5072,13 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã <string name="UserDictionary"> [User] </string> + <string name="logging_calls_disabled_log_empty"> + 会話ã¯ãƒã‚°ã«è¨˜éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“。ãƒã‚°ã®è¨˜éŒ²ã‚’開始ã™ã‚‹ã«ã¯ã€ã€Œç’°å¢ƒè¨å®šã€>「ãƒãƒ£ãƒƒãƒˆã€ã§ã€Œä¿å˜: ãƒã‚°ã®ã¿ã€ã¾ãŸã¯ã€Œä¿å˜: ãƒã‚°ã¨ä¼šè©±ã®ãƒ†ã‚ストã€ã‚’é¸æŠžã—ã¾ã™ã€‚ + </string> + <string name="logging_calls_disabled_log_not_empty"> + ã“れ以上ã®ä¼šè©±ã¯è¨˜éŒ²ã•ã‚Œã¾ã›ã‚“。ãƒã‚°ã®è¨˜éŒ²ã‚’å†é–‹ã™ã‚‹ã«ã¯ã€ã€Œç’°å¢ƒè¨å®šã€>「ãƒãƒ£ãƒƒãƒˆã€ã§ã€Œä¿å˜: ãƒã‚°ã®ã¿ã€ã¾ãŸã¯ã€Œä¿å˜: ãƒã‚°ã¨ä¼šè©±ã®ãƒ†ã‚ストã€ã‚’é¸æŠžã—ã¾ã™ã€‚ + </string> + <string name="logging_calls_enabled_log_empty"> + ãƒã‚°ã‚¤ãƒ³æ™‚ã®ä¼šè©±ã¯ã‚ã‚Šã¾ã›ã‚“。誰ã‹ã«ã”連絡ã—ãŸå¾Œã€ã¾ãŸã¯èª°ã‹ãŒã‚ãªãŸã«é€£çµ¡ã—ãŸå¾Œã€ãƒã‚°ã‚¨ãƒ³ãƒˆãƒªãŒã“ã“ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ + </string> </strings> diff --git a/indra/newview/skins/default/xui/pt/floater_conversation_log.xml b/indra/newview/skins/default/xui/pt/floater_conversation_log.xml new file mode 100644 index 0000000000..ae7dd3c441 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="REGISTRO DE CONVERSA"> + <panel name="buttons_panel"> + <filter_editor label="Filtrar pessoas" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="Opções de exibição/ordenação"/> + <menu_button name="conversations_gear_btn" tool_tip="Ações em uma pessoa ou um grupo selecionado"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_conversation_preview.xml b/indra/newview/skins/default/xui/pt/floater_conversation_preview.xml new file mode 100644 index 0000000000..97a2e8327c --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="CONVERSA:"> + <floater.string name="Title"> + CONVERSA: [NAME] + </floater.string> + <text name="page_label" value="Página"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_im_container.xml b/indra/newview/skins/default/xui/pt/floater_im_container.xml index 0fbb826a96..a1cea72b1e 100644 --- a/indra/newview/skins/default/xui/pt/floater_im_container.xml +++ b/indra/newview/skins/default/xui/pt/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="CONVERSAS"/> +<multi_floater name="floater_im_box" title="CONVERSAS"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="Opções de exibição/ordenação"/> + <button name="add_btn" tool_tip="Iniciar uma nova conversa"/> + <button name="speak_btn" tool_tip="Fale com pessoas usando seu microfone"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="Recolher/expandir esta lista"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="Recolher este painel"/> + <text name="stub_textbox"> + Esta conversa está em uma janela separada. [secondlife:/// Trazer de volta.] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/pt/floater_im_session.xml b/indra/newview/skins/default/xui/pt/floater_im_session.xml index 5543ffa41d..9f6a7a06ad 100644 --- a/indra/newview/skins/default/xui/pt/floater_im_session.xml +++ b/indra/newview/skins/default/xui/pt/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="Para" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] foi convidado para a conversa."/> + <floater.string name="multiple_participants_added" value="[NAME] foram convidados para a conversa."/> + <floater.string name="tooltip_to_separate_window" value="Mover esta conversa para uma janela separada"/> + <floater.string name="tooltip_to_main_window" value="Mover esta conversa para a janela principal"/> + <floater.string name="start_call_button_tooltip" value="Abrir conexão por voz"/> + <floater.string name="end_call_button_tooltip" value="Encerrar conexão por voz"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="Recolher este painel"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="Recolher lista de participantes"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="Expandir a lista de participantes"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="Opções de exibição/ordenação"/> + <menu_button name="gear_btn" tool_tip="Ações nas pessoas selecionadas"/> + <button name="add_btn" tool_tip="Adicionar alguém a esta conversa"/> + <button name="voice_call_btn" tool_tip="Abrir conexão por voz"/> + <button name="close_btn" tool_tip="Encerrar esta conversa"/> + <button name="expand_collapse_btn" tool_tip="Recolher/expandir este painel"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Traduzir bate-papo" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="Para" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="Mostrar/ocultar painel de mensagens"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_incoming_call.xml b/indra/newview/skins/default/xui/pt/floater_incoming_call.xml index 6344258fa0..1e86f847ad 100644 --- a/indra/newview/skins/default/xui/pt/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/pt/floater_incoming_call.xml @@ -25,9 +25,9 @@ Sair do [CURRENT_CHAT] e entrar neste bate-papo de voz? </floater.string> <text name="question"> - Sair do [CURRENT_CHAT] e entrar neste bate-papo? + Se você atender, será desconectado de suas conversas de voz atuais. </text> - <button label="Aceitar" label_selected="Aceitar" name="Accept"/> - <button label="Rejeitar" label_selected="Rejeitar" name="Reject"/> - <button label="Enviar MI" name="Start IM"/> + <button label="Atender" label_selected="Atender" name="Accept"/> + <button label="Ignorar" label_selected="Ignorar" name="Reject"/> + <button label="Iniciar MI em vez disso" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/pt/floater_pathfinding_console.xml index 182f2513e0..d04cf2a173 100644 --- a/indra/newview/skins/default/xui/pt/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/pt/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Exibir: </text> - <check_box label="Mundo" name="show_world"/> + <check_box label="Testar" name="show_world"/> <check_box label="Apenas móveis" name="show_world_movables_only"/> <check_box label="Navmesh" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml index a75cf34a94..ba4ef0afde 100644 --- a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml @@ -19,7 +19,7 @@ <button label="Padrão" label_selected="Padrão" name="Default"/> <button label="Branco" label_selected="Branco" name="Blank"/> <button label="Nenhum" label_selected="Nenhum" name="None"/> - <check_box initial_value="true" label="Visualização em tempo real" name="apply_immediate_check"/> + <check_box initial_value="true" label="Inscrever-se agora" name="apply_immediate_check"/> <text name="preview_disabled" value="Visualização desativada"/> <filter_editor label="Filtrar texturas" name="inventory search editor"/> <check_box initial_value="false" label="Exibir pastas" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/pt/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/pt/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..de7aa2df12 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="VOLUME DO BATE-PAPO DE VOZ"> + <slider label="Bate-papo de voz" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_voice_effect.xml b/indra/newview/skins/default/xui/pt/floater_voice_effect.xml index b29ca3d699..71d3c33ae5 100644 --- a/indra/newview/skins/default/xui/pt/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/pt/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Lugares" name="voice_effects" title="EFEITOS DE VOZ"> +<floater label="Lugares" name="voice_effects" title="AMOSTRA DE DISTORÇÃO DE VOZ"> <string name="no_voice_effect"> (Não distorcer voz) </string> diff --git a/indra/newview/skins/default/xui/pt/floater_voice_volume.xml b/indra/newview/skins/default/xui/pt/floater_voice_volume.xml new file mode 100644 index 0000000000..dae47a99ae --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="VOLUME DE VOZ"> + <slider name="volume_slider" tool_tip="Volume de voz" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/menu_cof_gear.xml b/indra/newview/skins/default/xui/pt/menu_cof_gear.xml index 8716992a5e..b59895573e 100644 --- a/indra/newview/skins/default/xui/pt/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/pt/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear COF"> +<toggleable_menu name="Gear COF"> <menu label="Roupas novas" name="COF.Gear.New_Clothes"/> - <menu label="Nova parte do corpo" name="COF.Geear.New_Body_Parts"/> -</menu> + <menu label="Novas partes do corpo" name="COF.Gear.New_Body_Parts"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_conversation.xml b/indra/newview/skins/default/xui/pt/menu_conversation.xml new file mode 100644 index 0000000000..01316b887d --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="Encerrar conversa" name="close_conversation"/> + <menu_item_call label="Abrir conversa de voz" name="open_voice_conversation"/> + <menu_item_call label="Desconectar de voz" name="disconnect_from_voice"/> + <menu_item_call label="Exibir perfil" name="view_profile"/> + <menu_item_call label="MI" name="im"/> + <menu_item_call label="Oferecer teletransporte" name="offer_teleport"/> + <menu_item_call label="Chamada de voz" name="voice_call"/> + <menu_item_call label="Histórico de bate-papo..." name="chat_history"/> + <menu_item_call label="Adicionar amigo" name="add_friend"/> + <menu_item_call label="Remover amigo" name="remove_friend"/> + <menu_item_call label="Remover amigos" name="remove_friends"/> + <menu_item_call label="Convidar para entrar no grupo..." name="invite_to_group"/> + <menu_item_call label="Mais zoom" name="zoom_in"/> + <menu_item_call label="Mapa" name="map"/> + <menu_item_call label="Compartilhar" name="share"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_check label="Bloquear voz" name="block_unblock"/> + <menu_item_check label="Bloquear texto" name="MuteText"/> + <menu_item_call label="Perfil do grupo" name="group_profile"/> + <menu_item_call label="Ativar grupo" name="activate_group"/> + <menu_item_call label="Sair do grupo" name="leave_group"/> + <context_menu label="Opções do moderador >" name="Moderator Options"> + <menu_item_check label="Pode bater papo por escrito" name="AllowTextChat"/> + <menu_item_call label="Silenciar este participante" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Desfazer silenciar deste participante" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Silenciar todos" name="ModerateVoiceMute"/> + <menu_item_call label="Desfazer silenciar para todos" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/pt/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..616e6db46e --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="MI..." name="IM"/> + <menu_item_call label="Chamada de voz..." name="Call"/> + <menu_item_call label="Abrir histórico de bate-papo..." name="Chat history"/> + <menu_item_call label="Exibir perfil" name="View Profile"/> + <menu_item_call label="Oferecer teletransporte" name="teleport"/> + <menu_item_call label="Adicionar amigo" name="add_friend"/> + <menu_item_call label="Remover amigo" name="remove_friend"/> + <menu_item_call label="Convidar para entrar no grupo..." name="Invite"/> + <menu_item_call label="Mapa" name="Map"/> + <menu_item_call label="Compartilhar" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_check label="Bloquear/desbloquear" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/pt/menu_conversation_log_view.xml new file mode 100644 index 0000000000..cab81175a0 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="Ordenar por nome" name="sort_by_name"/> + <menu_item_check label="Ordenar por data" name="sort_by_date"/> + <menu_item_check label="Ordenar com amigos acima" name="sort_by_friends"/> + <menu_item_call label="Exibir histórico de Bate-papo local..." name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_im_conversation.xml b/indra/newview/skins/default/xui/pt/menu_im_conversation.xml new file mode 100644 index 0000000000..a8434dc336 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="Exibir perfil" name="View Profile"/> + <menu_item_call label="Adicionar amigo" name="Add Friend"/> + <menu_item_call label="Remover amigo" name="remove_friend"/> + <menu_item_call label="Oferecer teletransporte" name="offer_teleport"/> + <menu_item_call label="Convidar para entrar no grupo..." name="invite_to_group"/> + <menu_item_call label="Histórico de bate-papo..." name="chat_history"/> + <menu_item_call label="Mais zoom" name="zoom_in"/> + <menu_item_call label="Mapa" name="map"/> + <menu_item_call label="Compartilhar" name="Share"/> + <menu_item_call label="Pagar" name="Pay"/> + <menu_item_check label="Bloquear voz" name="Block/Unblock"/> + <menu_item_check label="Bloquear texto" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/pt/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..398b890f66 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="Exibição compacta" name="compact_view"/> + <menu_item_check label="Exibição expandida" name="expanded_view"/> + <menu_item_check label="Mostrar hora" name="IMShowTime"/> + <menu_item_check label="Mostrar nomes em conversas individuais" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_object_icon.xml b/indra/newview/skins/default/xui/pt/menu_object_icon.xml index 7af760a6ee..df224a88fa 100644 --- a/indra/newview/skins/default/xui/pt/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/pt/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="Perfil do objeto..." name="Object Profile"/> <menu_item_call label="Bloquear..." name="Block"/> + <menu_item_call label="Mostrar no mapa" name="show_on_map"/> + <menu_item_call label="Teletransportar para lugar do objeto" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml b/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml index 894f1d741c..3602bdaac4 100644 --- a/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="Novo cabelo" name="New Hair"/> <menu_item_call label="Novos olhos" name="New Eyes"/> </menu> + <menu_item_call label="Expandir todas as pastas" name="expand"/> + <menu_item_call label="Recolher todas as pastas" name="collapse"/> <menu_item_call label="Renomear look" name="rename"/> <menu_item_call label="Excluir visual" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_participant_view.xml b/indra/newview/skins/default/xui/pt/menu_participant_view.xml new file mode 100644 index 0000000000..b61108cf54 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="Ordenar conversas por tipo" name="sort_sessions_by_type"/> + <menu_item_check label="Ordenar conversas por nome" name="sort_sessions_by_name"/> + <menu_item_check label="Ordenar conversas por atividade recente" name="sort_sessions_by_recent"/> + <menu_item_check label="Ordenar participantes por nome" name="sort_participants_by_name"/> + <menu_item_check label="Ordenar participantes por atividade recente" name="sort_participants_by_recent"/> + <menu_item_call label="Preferências de bate-papo..." name="chat_preferences"/> + <menu_item_call label="Preferências de privacidade..." name="privacy_preferences"/> + <menu_item_check label="Registro de conversas..." name="Conversation"/> + <menu_item_check label="Traduzir Bate-papo local" name="Translate_chat"/> + <menu_item_check label="Configurações de tradução..." name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/pt/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..8bbde9b38c --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="Desbloquear" name="unblock"/> + <menu_item_call label="Perfil..." name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/pt/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..e69935995c --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="Bloquear residente por nome..." name="block_resident_by_name"/> + <menu_item_call label="Bloquear objeto por nome" name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/pt/menu_people_blocked_view.xml new file mode 100644 index 0000000000..b80d683c7b --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="Ordenar por nome" name="sort_by_name"/> + <menu_item_check label="Ordenar por tipo" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_friends_view.xml b/indra/newview/skins/default/xui/pt/menu_people_friends_view.xml new file mode 100644 index 0000000000..46caeae310 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ordenar por nome" name="sort_name"/> + <menu_item_check label="Ordenar por status" name="sort_status"/> + <menu_item_check label="Exibir Ãcones de pessoas" name="view_icons"/> + <menu_item_check label="Exibir permissões concedidas" name="view_permissions"/> + <menu_item_check label="Exibir registro de conversas..." name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_groups.xml b/indra/newview/skins/default/xui/pt/menu_people_groups.xml index 9a924ad7b9..2ba7af17cd 100644 --- a/indra/newview/skins/default/xui/pt/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/pt/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="Ver dados" name="View Info"/> <menu_item_call label="Bate-papo" name="Chat"/> - <menu_item_call label="Ligar" name="Call"/> + <menu_item_call label="Chamada de voz" name="Call"/> <menu_item_call label="Ativar" name="Activate"/> <menu_item_call label="Sair" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_groups_view.xml b/indra/newview/skins/default/xui/pt/menu_people_groups_view.xml new file mode 100644 index 0000000000..637e591ae1 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Mostrar Ãcones de grupos" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby.xml index 7c720f262b..51464fed68 100644 --- a/indra/newview/skins/default/xui/pt/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/pt/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="Ver perfil" name="View Profile"/> - <menu_item_call label="Adicionar amigo..." name="Add Friend"/> - <menu_item_call label="Remover amigo..." name="Remove Friend"/> - <menu_item_call label="MI" name="IM"/> - <menu_item_call label="Ligar" name="Call"/> - <menu_item_call label="Mapa" name="Map"/> - <menu_item_call label="Compartilhar" name="Share"/> - <menu_item_call label="Pagar" name="Pay"/> - <menu_item_check label="Bloquear/desbloquear" name="Block/Unblock"/> - <menu_item_call label="Teletransportar?" name="teleport"/> + <menu_item_call label="Exibir perfil" name="view_profile"/> + <menu_item_call label="MI" name="im"/> + <menu_item_call label="Oferecer teletransporte" name="offer_teleport"/> + <menu_item_call label="Chamada de voz" name="voice_call"/> + <menu_item_call label="Exibir histórico de bate-papo..." name="chat_history"/> + <menu_item_call label="Adicionar amigo" name="add_friend"/> + <menu_item_call label="Remover amigo" name="remove_friend"/> + <menu_item_call label="Convidar para entrar no grupo..." name="invite_to_group"/> + <menu_item_call label="Mais zoom" name="zoom_in"/> + <menu_item_call label="Mapa" name="map"/> + <menu_item_call label="Compartilhar" name="share"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_check label="Bloquear/desbloquear" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml index 79edb96b1c..7f3c6ace27 100644 --- a/indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="Adicionar amigo..." name="Add Friends"/> - <menu_item_call label="Remover amigo..." name="Remove Friend"/> - <menu_item_call label="MI" name="IM"/> - <menu_item_call label="Ligar" name="Call"/> - <menu_item_call label="Compartilhar" name="Share"/> - <menu_item_call label="Pagar" name="Pay"/> - <menu_item_call label="Teletransportar?" name="teleport"/> + <menu_item_call label="Adicionar amigo..." name="add_friends"/> + <menu_item_call label="Remover amigo..." name="remove_friends"/> + <menu_item_call label="MI" name="im"/> + <menu_item_call label="Ligar" name="call"/> + <menu_item_call label="Compartilhar" name="share"/> + <menu_item_call label="Pagar" name="pay"/> + <menu_item_call label="Oferecer teletransporte" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby_view.xml new file mode 100644 index 0000000000..bce015e732 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ordenar por conversas mais recentes" name="sort_by_recent_speakers"/> + <menu_item_check label="Ordenar por nome" name="sort_name"/> + <menu_item_check label="Ordenar por distância" name="sort_distance"/> + <menu_item_check label="Exibir Ãcones de pessoas" name="view_icons"/> + <menu_item_check label="Exibir mapa" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_people_recent_view.xml b/indra/newview/skins/default/xui/pt/menu_people_recent_view.xml new file mode 100644 index 0000000000..e4b368fe14 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ordenar por mais recente" name="sort_most"/> + <menu_item_check label="Ordenar por nome" name="sort_name"/> + <menu_item_check label="Exibir Ãcones de pessoas" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_url_agent.xml b/indra/newview/skins/default/xui/pt/menu_url_agent.xml index ba5e055124..aa0a426405 100644 --- a/indra/newview/skins/default/xui/pt/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/pt/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostrar perfil de residente" name="show_agent"/> + <menu_item_call label="Exibir perfil" name="show_agent"/> + <menu_item_call label="Enviar MI..." name="send_im"/> + <menu_item_call label="Adicionar amigo..." name="add_friend"/> <menu_item_call label="Copiar nome para área de transferência" name="url_copy_label"/> <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_url_objectim.xml b/indra/newview/skins/default/xui/pt/menu_url_objectim.xml index c197444181..247a92567a 100644 --- a/indra/newview/skins/default/xui/pt/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/pt/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Mostrar informações sobre o objeto" name="show_object"/> + <menu_item_call label="Perfil do objeto..." name="show_object"/> <menu_item_call label="Mostrar no mapa" name="show_on_map"/> <menu_item_call label="Teletransportar para lugar do objeto" name="teleport_to_object"/> <menu_item_call label="Copiar nome do objeto para área de transferência" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml index e8baff5af2..e54d49fc45 100644 --- a/indra/newview/skins/default/xui/pt/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="Parar minha animação" name="Stop Animating My Avatar"/> <menu_item_call label="Andar/correr/voar..." name="Walk / run / fly"/> </menu> - <menu label="Status" name="Status"> - <menu_item_call label="Ausente" name="Set Away"/> - <menu_item_call label="Ocupado" name="Set Busy"/> - </menu> + <menu label="Status" name="Status"/> <menu_item_call label="Comprar L$..." name="Buy and Sell L$"/> <menu_item_call label="Caixa de saÃda do lojista..." name="MerchantOutbox"/> <menu_item_call label="Painel da conta..." name="Manage My Account"> @@ -32,14 +29,18 @@ <menu_item_call label="Sair do [APP_NAME]" name="Quit"/> </menu> <menu label="Comunicar" name="Communicate"> - <menu_item_check label="Bate-papo..." name="Nearby Chat"/> + <menu_item_check label="Conversas..." name="Conversations"/> + <menu_item_check label="Bate-papo local..." name="Nearby Chat"/> <menu_item_check label="Falar" name="Speak"/> - <menu_item_check label="Configurações de voz..." name="Nearby Voice"/> - <menu_item_check label="Distorção de voz..." name="ShowVoice"/> + <menu label="Distorção de voz" name="VoiceMorphing"> + <menu_item_check label="Não distorcer voz" name="NoVoiceMorphing"/> + <menu_item_check label="Visualizar..." name="Preview"/> + <menu_item_call label="Assinar..." name="Subscribe"/> + </menu> <menu_item_check label="Gestos..." name="Gestures"/> - <menu_item_call label="Amigos" name="My Friends"/> - <menu_item_call label="Grupos" name="My Groups"/> - <menu_item_call label="Pessoas próximas" name="Active Speakers"/> + <menu_item_check label="Amigos" name="My Friends"/> + <menu_item_check label="Grupos" name="My Groups"/> + <menu_item_check label="Pessoas próximas" name="Active Speakers"/> <menu_item_call label="Lista de bloqueados" name="Block List"/> </menu> <menu label="Mundo" name="World"> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index ff7382bf80..d9f5e48745 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -510,6 +510,24 @@ Consultar [_URL] para mais informações? </url> <usetemplate ignoretext="Meu driver gráfico está desatualizado" name="okcancelignore" notext="Não" yestext="Sim"/> </notification> + <notification name="AMDOldDriver"> + Provavelmente, há um driver mais recente para o seu chip gráfico. A atualização dos drivers gráficos pode melhorar significativamente o desempenho. + + Visitar [_URL] para verificar se há atualizações do driver? + <url name="url"> + http://support.amd.com/us/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="Meu driver gráfico está desatualizado" name="okcancelignore" notext="Não" yestext="Sim"/> + </notification> + <notification name="NVIDIAOldDriver"> + Provavelmente, há um driver mais recente para o seu chip gráfico. A atualização dos drivers gráficos pode melhorar significativamente o desempenho. + + Visitar [_URL] para verificar se há atualizações do driver? + <url name="url"> + http://www.nvidia.com.br/Download/index.aspx?lang=br + </url> + <usetemplate ignoretext="Meu driver gráfico está desatualizado" name="okcancelignore" notext="Não" yestext="Sim"/> + </notification> <notification name="UnknownGPU"> A placa de vÃdeo do seu sistema não é reconhecida pelo [APP_NAME]. Isto acontece quando novos hardwares que ainda não foram testados no [APP_NAME]. Talvez isso não cause problemas, mas pode ser preciso checar as configurações de vÃdeo. @@ -1533,10 +1551,13 @@ Para instalar a atualização, será preciso reiniciar o [APP_NAME]. Não é possÃvel oferecer amizade neste momento. Por favor, tente novamente em breve. <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="BusyModeSet"> - Modo ocupado ativado. -O bate-papo e MIs não serão exibidos. MIs enviadas para você receberão sua resposta de modo ocupado. Todas as ofertas de teletransporte serão recusadas. Todas as ofertas de inventário serão colocadas na Lixeira. - <usetemplate ignoretext="Passar meu status para o modo ocupado" name="okignore" yestext="OK"/> + <notification name="DoNotDisturbModeSet"> + Não perturbe está ativado. Você não será notificado de comunicações recebidas. + +- Outros residentes receberão a sua resposta de Não perturbe (definida em Preferências > Geral). +- As ofertas de teletransporte serão recusadas. +- Chamadas de voz serão recusadas. + <usetemplate ignoretext="Altero meu status para o modo Não perturbe" name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> Você atingiu o limite máximo de grupos. Saia de outro grupo para poder entrar nesse ou recuse o convite. @@ -2022,6 +2043,10 @@ Mover para o inventário o(s) item(s)? Deseja abrir o [http://secondlife.com/account/ Painel] para ver o histórico da sua conta? <usetemplate ignoretext="Abrir o navegador para acessar minha conta" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + Quando você adiciona uma pessoa a uma conversa existente, uma nova conversa é criada. Todos os participantes recebem notificações sobre a nova conversa. + <usetemplate ignoretext="Confirme a inclusão de participantes no bate-papo" name="okcancelignore" notext="Cancelar" yestext="Ok"/> + </notification> <notification name="ConfirmQuit"> Tem certeza que deseja sair? <usetemplate ignoretext="Confirmar antes de sair" name="okcancelignore" notext="Não sair" yestext="Sair"/> @@ -2096,14 +2121,14 @@ Você deseja substituÃ-lo pelo objeto selecionado? <button ignore="Never Replace" name="No" text="Não"/> </form> </notification> - <notification label="Aviso de Modo Ocupado" name="BusyModePay"> - Você está no modo Ocupado, o que significa que você não receberá quaisquer itens oferecidos em troca deste pagamento. + <notification label="Aviso de modo Não perturbe" name="DoNotDisturbModePay"> + Você ativou o Não perturbe. Você não receberá qualquer item oferecido em troca deste pagamento. -Você gostaria de deixar o modo Ocupado antes de completar esta transação? +Deseja desativar o Não perturbe antes de concluir esta transação? <form name="form"> - <ignore name="ignore" save_option="true" text="Estou prestes a pagar alguém ou um objeto no modo ocupado"/> - <button ignore="Always leave Busy Mode" name="Yes" text="Sim"/> - <button ignore="Never leave Busy Mode" name="No" text="Não"/> + <ignore name="ignore" text="Estou prestes a pagar alguém ou um objeto no modo Não perturbe"/> + <button ignore="Sempre manter no modo Não perturbe" name="Yes" text="OK"/> + <button ignore="Nunca sair do modo Não perturbe" name="No" text="Cancelar"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2238,11 +2263,8 @@ Inclua um link para facilitar o acesso para visitantes. Teste o link na barra de <notification name="GroupNotice"> Assunto: [SUBJECT], Mensagem: [MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> está online - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> está offline + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> está [STATUS] </notification> <notification name="AddSelfFriend"> Você é o máximo! Mesmo assim, não dá para adicionar a si mesmo(a) como amigo(a). @@ -2467,13 +2489,6 @@ Logo, não é possÃvel voar aqui. <notification name="DynamicPathfindingDisabled"> O pathfinding dinâmico não está habilitado nesta região. Os objetos com script usando chamadas LSL de pathfinding podem não operar como o esperado na região. </notification> - <notification name="PathfindingRebakeNavmesh"> - A alteração de determinados objetos nesta região pode resultar no comportamento incorreto de outros objeto em movimento. Para fazer com que os objetos em movimento se comportem corretamente, clique no botão “Recarregar regiãoâ€. Escolha “Ajuda†para obter mais informações. - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="Ajuda" ignoretext="A alteração de determinados objetos nesta região pode resultar no comportamento incorreto de outros objeto em movimento." name="okhelpignore" yestext="OK"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> Erro. Pode haver um erro de rede ou do servidor, ou você pode não ter direitos de construção. Às vezes, fazer login e logout novamente resolve este problema. <usetemplate name="okbutton" yestext="OK"/> @@ -2736,7 +2751,7 @@ OK? <notification name="ScriptQuestionCaution"> Aviso: O objeto '<nolink>[OBJECTNAME]</nolink>' deseja obter acesso total à sua conta de dólares Linden. Se você conceder acesso, ele poderá remover fundos de sua conta a qualquer momento ou esvaziar sua conta completamente, continuamente e sem avisos adicionais. -Esse tipo de pedido raramente é legÃtimo. Não conceda acesso se você não entender completamente por que ele deseja acessar sua conta. +Não conceda acesso se você não entender completamente por que ele deseja acessar sua conta. <form name="form"> <button name="Grant" text="Permitir acesso total"/> <button name="Deny" text="Negar"/> @@ -3310,4 +3325,633 @@ Tentativa cancelada. Você está excluindo [NUM_ITEMS] itens. Tem certeza de que deseja continuar? <usetemplate ignoretext="Tem certeza de que deseja excluir múltiplos itens?" name="okcancelignore" notext="Não" yestext="Sim"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] congelou você. Você não pode se mover ou interagir com o mundo. + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] congelou você por [AV_FREEZE_TIME] segundos. Você não pode se mover ou interagir com o mundo. + </notification> + <notification name="YouFrozeAvatar"> + Avatar congelado. + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] descongelou você. + </notification> + <notification name="AvatarUnFrozen"> + Avatar descongelado. + </notification> + <notification name="AvatarFreezeFailure"> + O congelamento falhou porque você não tem permissão de administrador para esse lote. + </notification> + <notification name="AvatarFreezeThaw"> + Seu congelamento expirou, vá cuidar da sua vida. + </notification> + <notification name="AvatarCantFreeze"> + Não é possÃvel congelar esse usuário. + </notification> + <notification name="NowOwnObject"> + Agora você é o proprietário do objeto [OBJECT_NAME] + </notification> + <notification name="CantRezOnLand"> + Não é possÃvel renderizar objeto em [OBJECT_POS] porque o proprietário do terreno não permite. Use a ferramenta de terrenos para ver a propriedade do terreno. + </notification> + <notification name="RezFailTooManyRequests"> + O objeto não pode ser renderizado porque há muitas solicitações. + </notification> + <notification name="SitFailCantMove"> + Você não pode sentar porque não pode se mover no momento. + </notification> + <notification name="SitFailNotAllowedOnLand"> + Você não pode sentar porque não está autorizado a sentar nesse terreno. + </notification> + <notification name="SitFailNotSameRegion"> + Tente chegar mais perto. Não é possÃvel sentar no objeto porque +ele não está na mesma região que você. + </notification> + <notification name="NoNewObjectRegionFull"> + Não foi possÃvel criar um novo objeto. A região está cheia. + </notification> + <notification name="FailedToPlaceObject"> + Falha ao posicionar objeto em local especÃfico. Tente novamente. + </notification> + <notification name="NoOwnNoGardening"> + Você não pode criar árvores e grama em terrenos que não são sua propriedade. + </notification> + <notification name="NoCopyPermsNoObject"> + A cópia falhou porque você não está autorizado a copiar o objeto '[OBJ_NAME]'. + </notification> + <notification name="NoTransPermsNoObject"> + A cópia falhou porque o objeto '[OBJ_NAME]' não pode ser transferido para você. + </notification> + <notification name="AddToNavMeshNoCopy"> + A cópia falhou porque o objeto '[OBJ_NAME]' contribui para o navmesh. + </notification> + <notification name="DupeWithNoRootsSelected"> + Duplicar sem objetos raiz selecionados. + </notification> + <notification name="CantDupeCuzRegionIsFull"> + Não é possÃvel duplicar objetos porque a região está cheia. + </notification> + <notification name="CantDupeCuzParcelNotFound"> + Não é possÃvel duplicar os objetos - não é possÃvel encontrar o lote em que eles estão. + </notification> + <notification name="CantCreateCuzParcelFull"> + Não é possÃvel criar objeto porque +o lote está cheio. + </notification> + <notification name="RezAttemptFailed"> + Falha na tentativa de renderizar um objeto. + </notification> + <notification name="ToxicInvRezAttemptFailed"> + Não é possÃvel criar um item que causou problemas a essa região. + </notification> + <notification name="InvItemIsBlacklisted"> + Esse item do inventário foi incluÃdo na lista. + </notification> + <notification name="NoCanRezObjects"> + No momento, você não está autorizado a criar objetos. + </notification> + <notification name="LandSearchBlocked"> + Pesquisa de terreno bloqueada. +Você realizou muitas pesquisas de terreno muito rápido. +Tente novamente em instantes. + </notification> + <notification name="NotEnoughResourcesToAttach"> + Não há recursos de script disponÃveis suficientes para anexar objeto! + </notification> + <notification name="YouDiedAndGotTPHome"> + Você morreu e foi teletransportado para seu inÃcio + </notification> + <notification name="EjectComingSoon"> + Você não tem mais permissão para ficar aqui e tem [EJECT_TIME] segundos para sair. + </notification> + <notification name="NoEnterServerFull"> + Você não pode entrar nesta região porque +o servidor está cheio. + </notification> + <notification name="SaveBackToInvDisabled"> + Salvar no inventário foi desativado. + </notification> + <notification name="NoExistNoSaveToContents"> + Não é possÃvel salvar '[OBJ_NAME]' no conteúdo do objeto porque o objeto do qual ele foi renderizado não existe mais. + </notification> + <notification name="NoModNoSaveToContents"> + Não é possÃvel salvar '[OBJ_NAME]' no conteúdo do objeto porque você não tem permissão para modificar o objeto '[DEST_NAME]'. + </notification> + <notification name="NoSaveBackToInvDisabled"> + Não é possÃvel salvar '[OBJ_NAME]' no inventário -- essa operação foi desativada. + </notification> + <notification name="NoCopyNoSelCopy"> + Você não pode copiar sua seleção porque não está autorizado a copiar o objeto '[OBJ_NAME]'. + </notification> + <notification name="NoTransNoSelCopy"> + Você não pode copiar a seleção porque o objeto '[OBJ_NAME]' não é transferÃvel. + </notification> + <notification name="NoTransNoCopy"> + Você não pode copiar a seleção porque o objeto '[OBJ_NAME]' não é transferÃvel. + </notification> + <notification name="NoPermsNoRemoval"> + A remoção do objeto '[OBJ_NAME]' do simulador é proibida pelo sistema de permissões. + </notification> + <notification name="NoModNoSaveSelection"> + Você não pode salvar sua seleção porque não está autorizado a modificar o objeto '[OBJ_NAME]'. + </notification> + <notification name="NoCopyNoSaveSelection"> + Não é possÃvel salvar sua seleção porque o objeto '[OBJ_NAME]' não é copiável. + </notification> + <notification name="NoModNoTaking"> + Você não pode levar sua seleção porque não está autorizado a modificar o objeto '[OBJ_NAME]'. + </notification> + <notification name="RezDestInternalError"> + Erro interno: tipo de destino desconhecido. + </notification> + <notification name="DeleteFailObjNotFound"> + A exclusão falhou porque o objeto não foi encontrado + </notification> + <notification name="SorryCantEjectUser"> + Não é possÃvel expulsar esse usuário. + </notification> + <notification name="RegionSezNotAHome"> + Esta região não permite que você a defina como seu inÃcio. + </notification> + <notification name="HomeLocationLimits"> + Você só pode definir seu "InÃcio" em seu terreno ou em um Infohub do continente. + </notification> + <notification name="HomePositionSet"> + Posição de inÃcio definida. + </notification> + <notification name="AvatarEjected"> + Avatar expulso. + </notification> + <notification name="AvatarEjectFailed"> + A expulsão falhou porque você não tem permissão de administrador para esse lote. + </notification> + <notification name="CantMoveObjectParcelFull"> + Não é possÃvel mover '[OBJECT_NAME]' para +[OBJ_POSITION] na região [REGION_NAME] porque o lote está cheio. + </notification> + <notification name="CantMoveObjectParcelPerms"> + Não é possÃvel mover '[OBJECT_NAME]' para +[OBJ_POSITION] na região [REGION_NAME] porque seus objetos não são permitidos neste lote. + </notification> + <notification name="CantMoveObjectParcelResources"> + Não é possÃvel mover '[OBJECT_NAME]' para +[OBJ_POSITION] na região [REGION_NAME] porque não há recursos suficientes para este objeto neste lote. + </notification> + <notification name="CantMoveObjectRegionVersion"> + Não é possÃvel mover '[OBJECT_NAME]' para +[OBJ_POSITION] na região [REGION_NAME] porque outra região está executando uma versão mais antiga, que não dá suporte o recebimento deste objeto por meio de passagem de regiões. + </notification> + <notification name="CantMoveObjectNavMesh"> + Não é possÃvel mover '[OBJECT_NAME]' para +[OBJ_POSITION] na região [REGION_NAME] porque você não está autorizado a modificar o navmesh além dos limites da região. + </notification> + <notification name="CantMoveObjectWTF"> + Não é possÃvel mover '[OBJECT_NAME]' para +[OBJ_POSITION] na região [REGION_NAME] por uma razão desconhecida. ([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + Você não está autorizado a modificar este objeto + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + Não é possÃvel ativar propriedades fÃsicas para um objeto que contribui para o navmesh. + </notification> + <notification name="CantEnablePhysKeyframedObj"> + Não é possÃvel ativar propriedades fÃsicas para objetos keyframe. + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + Não é possÃvel ativar propriedades fÃsicas para o objeto -- recursos de terreno insuficientes. + </notification> + <notification name="CantEnablePhysCostTooGreat"> + Não é possÃvel ativar propriedades fÃsicas para objeto com custo de recursos fÃsicos acima de [MAX_OBJECTS] + </notification> + <notification name="PhantomWithConcavePiece"> + Este objeto não pode ter uma peça côncava porque é phantom e contribui para o navmesh. + </notification> + <notification name="UnableAddItem"> + Não é possÃvel adicionar item! + </notification> + <notification name="UnableEditItem"> + Não é possÃvel editar isso! + </notification> + <notification name="NoPermToEdit"> + Não é permitido editar isso. + </notification> + <notification name="NoPermToCopyInventory"> + Não é permitido copiar esse inventário. + </notification> + <notification name="CantSaveItemDoesntExist"> + Não é possÃvel salvar no conteúdo do objeto: O item não existe mais. + </notification> + <notification name="CantSaveItemAlreadyExists"> + Não é possÃvel salvar no conteúdo do objeto: já existe um item com esse nome no inventário + </notification> + <notification name="CantSaveModifyAttachment"> + Não é possÃvel salvar no conteúdo do objeto: isso modificaria as permissões de anexo. + </notification> + <notification name="TooManyScripts"> + Muitos scripts. + </notification> + <notification name="UnableAddScript"> + Não é possÃvel adicionar script! + </notification> + <notification name="AssetServerTimeoutObjReturn"> + Servidor de objetos não respondeu a tempo. Objeto retornado a sim. + </notification> + <notification name="RegionDisablePhysicsShapes"> + Esta região não tem formas fÃsicas ativadas. + </notification> + <notification name="NoModNavmeshAcrossRegions"> + Você não pode modificar o navmesh além dos limites da região. + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + Não é possÃvel definir as propriedades fÃsicas neste tipo de objeto. + </notification> + <notification name="NoSetRootPrimWithNoShape"> + Não é possÃvel definir que um prim raiz não tenha forma. + </notification> + <notification name="NoRegionSupportPhysMats"> + Esta região não tem materiais fÃsicos ativados. + </notification> + <notification name="OnlyRootPrimPhysMats"> + Apenas prims raiz podem ter seus materiais fÃsicos ajustados. + </notification> + <notification name="NoSupportCharacterPhysMats"> + Ainda não há suporte para a configuração dos materiais fÃsicos em personagens. + </notification> + <notification name="InvalidPhysMatProperty"> + Uma ou mais das propriedades do material fÃsico são inválidas. + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + Você não pode alterar o tipo de acabamento de um objeto mesh. + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + Você não pode alterar a forma de um objeto mesh + </notification> + <notification name="FullRegionCantEnter"> + Você não pode entrar nesta região porque \nela está cheia. + </notification> + <notification name="LinkFailedOwnersDiffer"> + Falha na vinculação -- proprietários diferentes + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + Falha na vinculação -- não é possÃvel modificar o navmesh além dos limites da região. + </notification> + <notification name="LinkFailedNoPermToEdit"> + Ocorreu uma falha na vinculação porque você não tem permissão de edição. + </notification> + <notification name="LinkFailedTooManyPrims"> + Falha na vinculação -- muitos prims + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + Falha na vinculação -- não é possÃvel vincular itens com cópia proibida a itens com transferência proibida + </notification> + <notification name="LinkFailedNothingLinkable"> + Falha na vinculação -- nada é vinculável. + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + Falha na vinculação -- muitos personagens com pathfinding + </notification> + <notification name="LinkFailedInsufficientLand"> + Falha na vinculação -- recursos de terreno insuficientes + </notification> + <notification name="LinkFailedTooMuchPhysics"> + O objeto usa muitos recursos fÃsicos – sua dinâmica foi desativada. + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + Você foi teletransportado para seu inÃcio pelo objeto '[OBJECT_NAME]' no lote '[PARCEL_NAME]' + </notification> + <notification name="TeleportedHomeByObject"> + Você foi teletransportado para seu inÃcio pelo objeto '[OBJECT_NAME]' + </notification> + <notification name="TeleportedByAttachment"> + Você foi teletransportado por um anexo em [ITEM_ID] + </notification> + <notification name="TeleportedByObjectOnParcel"> + Você foi teletransportado pelo objeto '[OBJECT_NAME]' no lote '[PARCEL_NAME]' + </notification> + <notification name="TeleportedByObjectOwnedBy"> + Você foi teletransportado pelo objeto '[OBJECT_NAME]' de propriedade de [OWNER_ID] + </notification> + <notification name="TeleportedByObjectUnknownUser"> + Você foi teletransportado pelo objeto '[OBJECT_NAME]' de propriedade de um usuário desconhecido. + </notification> + <notification name="CantCreateObjectRegionFull"> + Não foi possÃvel criar o objeto solicitado. A região está cheia. + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + Não é possÃvel anexar vários objetos a um local. + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + Você não pode criar vários objetos aqui. + </notification> + <notification name="UnableToCreateObjTimeOut"> + Não foi possÃvel criar o objeto solicitado. Objeto ausente do banco de dados. + </notification> + <notification name="UnableToCreateObjUnknown"> + Não foi possÃvel criar o objeto solicitado. A solicitação expirou. Tente novamente. + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + Não foi possÃvel criar o objeto solicitado. Tente novamente. + </notification> + <notification name="RezFailureTookTooLong"> + Falha na renderização, objeto solicitado demorou muito a carregar. + </notification> + <notification name="FailedToPlaceObjAtLoc"> + Falha ao posicionar objeto em local especÃfico. Tente novamente. + </notification> + <notification name="CantCreatePlantsOnLand"> + Você não pode criar plantas neste terreno. + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + Não é possÃvel restaurar o objeto. Nenhuma posição encontrada no mundo. + </notification> + <notification name="CantRezObjectInvalidMeshData"> + Não é possÃvel renderizar o objeto porque os dados de mesh são inválidos. + </notification> + <notification name="CantRezObjectTooManyScripts"> + Não foi possÃvel renderizar objeto porque já há muitos scripts nesta região. + </notification> + <notification name="CantCreateObjectNoAccess"> + Seus privilégios de acesso não permitem que você crie objetos aqui. + </notification> + <notification name="CantCreateObject"> + No momento, você não está autorizado a criar objetos. + </notification> + <notification name="InvalidObjectParams"> + Parâmetros de objeto inválidos + </notification> + <notification name="CantDuplicateObjectNoAcess"> + Seus privilégios de acesso não permitem que você duplique objetos aqui. + </notification> + <notification name="CantChangeShape"> + Você não está autorizado a alterar essa forma. + </notification> + <notification name="NoAccessToClaimObjects"> + Seus privilégios de acesso não permitem que você reivindique objetos aqui. + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + A doação falhou porque você não está autorizado a doar objetos ao seu grupo. + </notification> + <notification name="NoPrivsToBuyObject"> + Seus privilégios de acesso não permitem que você compre objetos aqui. + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + Não é possÃvel anexar objeto porque um avatar está sentado nele. + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + Ãrvores e grama não podem ser usadas como anexos. + </notification> + <notification name="CantAttachGroupOwnedObjs"> + Não é possÃvel anexar objetos de propriedade de um grupo. + </notification> + <notification name="CantAttachObjectsNotOwned"> + Não é possÃvel anexar objetos que não sua propriedade. + </notification> + <notification name="CantAttachNavmeshObjects"> + Não é possÃvel anexar objetos que contribuem com o navmesh. + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + Não é possÃvel vincular objeto porque você não tem permissão para movê-lo. + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + Não há recursos de script disponÃveis suficientes para anexar objeto! + </notification> + <notification name="CantDropItemTrialUser"> + Não é possÃvel largar objetos aqui. Tente a área de Avaliação grátis. + </notification> + <notification name="CantDropMeshAttachment"> + Você não pode largar anexos mesh. Separe para o inventário e depois renderize no mundo. + </notification> + <notification name="CantDropAttachmentNoPermission"> + Falha ao largar anexo: você não está autorizado a largá-lo aqui. + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + Falha ao largar anexo: recursos de terreno disponÃveis insuficientes. + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + Falha ao largar anexos: recursos disponÃveis insuficientes. + </notification> + <notification name="CantDropObjectFullParcel"> + Não é possÃvel largar objeto aqui. O lote está cheio. + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + Não é possÃvel tocar/pegar este objeto porque você foi banido do lote de terreno. + </notification> + <notification name="PlzNarrowDeleteParams"> + Detalhe seus parâmetros de exclusão. + </notification> + <notification name="UnableToUploadAsset"> + Não é possÃvel carregar objeto. + </notification> + <notification name="CantTeleportCouldNotFindUser"> + Não foi possÃvel encontrar usuário para teletransportar para inÃcio + </notification> + <notification name="GodlikeRequestFailed"> + solicitação de poderes de deus falhou + </notification> + <notification name="GenericRequestFailed"> + falha em solicitação genérica + </notification> + <notification name="CantUploadPostcard"> + Não foi possÃvel carregar cartão postal. Tente novamente mais tarde. + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + Não foi possÃvel obter detalhes de inventário para o anúncio de grupo. + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + Não é possÃvel enviar anúncio de grupo -- não permitido. + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + Não é possÃvel enviar anúncio de grupo -- não foi possÃvel construir inventário. + </notification> + <notification name="CantParceInventoryInNotice"> + Não é possÃvel processar o inventário do anúncio. + </notification> + <notification name="TerrainUploadFailed"> + Falha no envio de terreno. + </notification> + <notification name="TerrainFileWritten"> + Arquivo de terreno gravado. + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + Arquivo de terreno criado, iniciando o download... + </notification> + <notification name="TerrainBaked"> + Terreno confeccionado. + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + Apenas os 10 primeiros objetos selecionados foram desativados. Atualize e faça novas seleções, se necessário. + </notification> + <notification name="UpdateViewerBuyParcel"> + Você precisa atualizar seu visualizador para comprar este lote. + </notification> + <notification name="CantBuyParcelNotForSale"> + Não é possÃvel comprar, este lote não está à venda. + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + Não é possÃvel comprar, o preço de venda ou a área do terreno foram alterados. + </notification> + <notification name="CantBuyParcelNotAuthorized"> + Você não é o comprador autorizado deste lote. + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + Você não pode comprar este lote porque já está aguardando aut. de compra + </notification> + <notification name="CantBuildOverflowParcel"> + Não é possÃvel criar objeto aqui porque isso sobrecarregaria o lote. + </notification> + <notification name="SelectedMultipleOwnedLand"> + Você selecionou terreno com proprietários diferentes. Selecione uma área menor e tente novamente. + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + Não há lotes alugados suficientes na seleção para reunir. + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + Não é possÃvel dividir o terreno.\nHá mais de um lote selecionado.\nTente selecionar um pedaço menor de terreno. + </notification> + <notification name="CantDivideLandCantFindParcel"> + Não é possÃvel dividir o terreno.\nNão é possÃvel encontrar o lote.\nComunique isso em Ajuda -> Relatar bug... + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + Não é possÃvel dividir o terreno. O lote inteiro está selecionado.\nTente selecionar um pedaço menor do terreno. + </notification> + <notification name="LandHasBeenDivided"> + O terreno foi dividido. + </notification> + <notification name="PassPurchased"> + Você comprou um passe. + </notification> + <notification name="RegionDisallowsClassifieds"> + A região não permite classificados. + </notification> + <notification name="LandPassExpireSoon"> + Seu passe para este terreno está prestes a expirar. + </notification> + <notification name="CantSitNoSuitableSurface"> + Não há uma superfÃcie adequada para sentar, tente outro local. + </notification> + <notification name="CantSitNoRoom"> + Não há espaço para sentar aqui, tente outro local. + </notification> + <notification name="ClaimObjectFailedNoPermission"> + A reivindicação do objeto falhou porque você não tem permissão + </notification> + <notification name="ClaimObjectFailedNoMoney"> + A reivindicação do objeto falhou porque você não tem L$ suficiente. + </notification> + <notification name="CantDeedGroupLand"> + Não é possÃvel doar terrenos de propriedade de um grupo. + </notification> + <notification name="BuyObjectFailedNoMoney"> + A compra do objeto falhou porque você não tem L$ suficientes. + </notification> + <notification name="BuyInventoryFailedNoMoney"> + A compra do inventário falhou porque você não tem L$ suficiente + </notification> + <notification name="BuyPassFailedNoMoney"> + Você não tem L $ suficientes para comprar um passe para este terreno. + </notification> + <notification name="CantBuyPassTryAgain"> + Não é possÃvel comprar passe no momento. Tente novamente mais tarde. + </notification> + <notification name="CantCreateObjectParcelFull"> + Não é possÃvel criar objeto porque \no lote está cheio. + </notification> + <notification name="FailedPlacingObject"> + Falha ao posicionar objeto em local especÃfico. Tente novamente. + </notification> + <notification name="CantCreateLandmarkForEvent"> + Não é possÃvel criar marco para o evento. + </notification> + <notification name="GodBeatsFreeze"> + Seus poderes de deus rompem o congelamento! + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + Falha na solicitação de poderes especiais. Essa solicitação foi registrada. + </notification> + <notification name="ExpireExplanation"> + O sistema não pode processar sua solicitação no momento. A solicitação expirou. + </notification> + <notification name="DieExplanation"> + O sistema não pode processar sua solicitação. + </notification> + <notification name="AddPrimitiveFailure"> + Fundos insuficientes para criar prim. + </notification> + <notification name="RezObjectFailure"> + Fundos insuficientes para criar objeto. + </notification> + <notification name="ResetHomePositionNotLegal"> + Redefinir InÃcio pois o InÃcio não era legal. + </notification> + <notification name="CantInviteRegionFull"> + No momento, você não pode convidar ninguém para seu local pois a região está cheia. Tente novamente mais tarde. + </notification> + <notification name="CantSetHomeAtRegion"> + Esta região não permite que você a defina como seu inÃcio. + </notification> + <notification name="ListValidHomeLocations"> + Você só pode definir seu "InÃcio" em seu terreno ou em um Infohub do continente. + </notification> + <notification name="SetHomePosition"> + Posição de inÃcio definida. + </notification> + <notification name="CantDerezInventoryError"> + Não é possÃvel desrenderizar objeto devido a uma falha de inventário. + </notification> + <notification name="CantCreateRequestedInv"> + Não é possÃvel criar o inventário solicitado. + </notification> + <notification name="CantCreateRequestedInvFolder"> + Não é possÃvel criar a pasta de inventário solicitada. + </notification> + <notification name="CantCreateInventory"> + Não é possÃvel criar esse inventário. + </notification> + <notification name="CantCreateLandmark"> + Não é possÃvel criar marco. + </notification> + <notification name="CantCreateOutfit"> + Não é possÃvel criar roupa agora. Tente novamente em instantes. + </notification> + <notification name="InventoryNotForSale"> + O inventário não está à venda. + </notification> + <notification name="CantFindInvItem"> + Não é possÃvel encontrar item do inventário. + </notification> + <notification name="CantFindObject"> + Não foi possÃvel encontrar objeto. + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + Transferências de dinheiro para objetos estão desativadas para esta região no momento. + </notification> + <notification name="CantPayNoAgent"> + Não foi possÃvel descobrir a quem pagar. + </notification> + <notification name="CantDonateToPublicObjects"> + Não é possÃvel dar L$ a objetos públicos. + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + Falha na criação de inventário de objetos do mundo virtual. + </notification> + <notification name="UserBalanceOrLandUsageError"> + Um erro interno impediu que seu visualizador fosse atualizado corretamente. O saldo em L$ ou a propriedade de lotes exibidos em seu visualizador pode não refletir o saldo real nos servidores. + </notification> + <notification name="LargePrimAgentIntersect"> + Não é possÃvel criar grandes prims que interceptam outros jogadores. Tente novamente quando os outros jogadores tiverem se movido. + </notification> + <notification name="PreferenceChatClearLog"> + Isso excluirá os registros das conversas anteriores e qualquer backup desse arquivo. + <usetemplate ignoretext="Confirmar antes de excluir o registro com conversas anteriores." name="okcancelignore" notext="Cancelar" yestext="OK"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + Isso excluirá todas as transcrições de todas as conversas anteriores. A lista de conversas antigas não será afetada. Todos os arquivos com as extensões .txt e txt.backup na pasta [FOLDER] serão excluÃdos. + <usetemplate ignoretext="Confirmar antes de excluir transcrições." name="okcancelignore" notext="Cancelar" yestext="OK"/> + </notification> + <notification name="PreferenceChatPathChanged"> + Não foi possÃvel mover arquivos. Caminho anterior restaurado. + <usetemplate ignoretext="Não foi possÃvel mover arquivos. Caminho anterior restaurado." name="okignore" yestext="OK"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml index b444593af8..22eb23ebc5 100644 --- a/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml @@ -26,5 +26,6 @@ <icon name="permission_edit_mine_icon" tool_tip="Este amigo pode editar, excluir ou pegar seus pertences"/> <icon name="permission_map_icon" tool_tip="Este amigo pode localizar você no mapa"/> <icon name="permission_online_icon" tool_tip="Este amigo pode saber quando você estiver online"/> + <button name="info_btn" tool_tip="Mais informações"/> <button name="profile_btn" tool_tip="Ver perfil"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml index c5f93d719a..2fcf6b9932 100644 --- a/indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> - <text name="title_text"> - Lista de bloqueados - </text> - <scroll_list name="blocked" tool_tip="Lista atual dos residentes bloqueados"/> - <button label="Bloquear residente..." label_selected="Bloquear residente..." name="Block resident..." tool_tip="Selecione o residente a bloquear"/> - <button label="Bloquear objeto por nome..." label_selected="Bloquear objeto por nome..." name="Block object by name..."/> - <button label="Desbloquear" label_selected="Desbloquear" name="Unblock" tool_tip="Remover residente ou objeto da lista dos bloqueados"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="Filtrar" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="Ações em uma pessoa ou um objeto selecionado"/> + <menu_button name="view_btn" tool_tip="Opções de ordenação"/> + <menu_button name="plus_btn" tool_tip="Escolher um residente ou um objeto a ser bloqueado"/> + <button name="unblock_btn" tool_tip="Remover residente ou objeto da lista dos bloqueados"/> + </panel> + <block_list name="blocked" tool_tip="Lista atual dos residentes bloqueados"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/pt/panel_conversation_list_item.xml new file mode 100644 index 0000000000..f56168c962 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(carregando)"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/pt/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..74daded58f --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="Uma conversa de voz foi incluÃda"/> + <icon name="unread_ims_icon" tool_tip="Chegaram mensagens enquanto você estava desconectado"/> + <button name="delete_btn" tool_tip="Remover esta entrada"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_group_list_item.xml b/indra/newview/skins/default/xui/pt/panel_group_list_item.xml index 19c34d2f10..0490878507 100644 --- a/indra/newview/skins/default/xui/pt/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/pt/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="Desconhecido"/> + <button name="info_btn" tool_tip="Mais informações"/> <button name="profile_btn" tool_tip="Ver perfil"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_people.xml b/indra/newview/skins/default/xui/pt/panel_people.xml index f3af15b991..babb48c208 100644 --- a/indra/newview/skins/default/xui/pt/panel_people.xml +++ b/indra/newview/skins/default/xui/pt/panel_people.xml @@ -14,81 +14,53 @@ Em busca de alguém para conversar? Procure no [secondlife:///app/worldmap Mapa- <string name="no_filtered_friends_msg"> Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search]. </string> - <string name="people_filter_label" value="Filtro de pessoas"/> - <string name="groups_filter_label" value="Filtro de grupos"/> <string name="no_filtered_groups_msg" value="Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search]."/> <string name="no_groups_msg" value="À procura de grupos interessantes? Tente fazer uma [secondlife:///app/search/groups Busca]."/> <string name="MiniMapToolTipMsg" value="[REGION](Clique duas vezes para abrir o mapa, shift+arraste para a visão pan)"/> <string name="AltMiniMapToolTipMsg" value="[REGION](Clique duas vezes para teletransportar, shift+arraste para a visão pan)"/> - <filter_editor label="Filtro" name="filter_input"/> <tab_container name="tabs"> <panel label="PROXIMIDADE" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="Opções"/> - <button name="add_friend_btn" tool_tip="Adicionar o residente selecionado para sua lista de amigos"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="Filtrar pessoas" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="Ações nas pessoas selecionadas"/> + <menu_button name="nearby_view_btn" tool_tip="Opções de exibição/ordenação"/> + <button name="add_friend_btn" tool_tip="Oferecer amizade ao residente"/> + <dnd_button name="nearby_del_btn" tool_tip="Remover a pessoa selecionada dos amigos"/> </panel> </panel> - <panel label="MEUS AMIGOS" name="friends_panel"> + <panel label="AMIGOS" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="Filtrar pessoas" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="Ações nas pessoas selecionadas"/> + <menu_button name="friends_view_btn" tool_tip="Opções de exibição/ordenação"/> + <button name="friends_add_btn" tool_tip="Oferecer amizade ao residente"/> + <dnd_button name="friends_del_btn" tool_tip="Remover a pessoa selecionada dos amigos"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="Online"/> <accordion_tab name="tab_all" title="Todos"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="Mostrar opções adicionais"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="Oferecer amizade para um residente"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="Remover a pessoa selecionada da sua lista de amigos"/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="MEUS GRUPOS" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="Opções"/> - <button name="plus_btn" tool_tip="Ingressar em um grupo/Criar novo grupo"/> - <button name="activate_btn" tool_tip="Ativar o grupo selecionado"/> + <panel label="GRUPOS" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="Filtrar grupos" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="Ações no grupo selecionado"/> + <menu_button name="groups_view_btn" tool_tip="Opções de exibição/ordenação"/> + <menu_button name="plus_btn" tool_tip="Entrar em um grupo/Criar novo grupo"/> + <dnd_button name="minus_btn" tool_tip="Sair do grupo selecionado"/> </panel> </panel> <panel label="RECENTE" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="Opções"/> - <button name="add_friend_btn" tool_tip="Adicionar o residente selecionado para sua lista de amigos"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="Filtrar pessoas" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="Ações nas pessoas selecionadas"/> + <menu_button name="recent_view_btn" tool_tip="Opções de exibição/ordenação"/> + <button name="add_friend_btn" tool_tip="Oferecer amizade ao residente"/> + <dnd_button name="recent_del_btn" tool_tip="Remover a pessoa selecionada dos amigos"/> </panel> </panel> + <panel label="BLOQUEADA" name="blocked_panel"> + <panel label="Residentes e objetos bloqueados" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="Perfil" name="view_profile_btn" tool_tip="Exibir fotografia, grupos e outras informações dos residentes"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="MI" name="im_btn" tool_tip="Abrir sessão de mensagem instantânea"/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="Ligar" name="call_btn" tool_tip="Ligar para este residente"/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="Compartilhar" name="share_btn" tool_tip="Compartilhar item de inventário"/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="Perfil do grupo" name="group_info_btn" tool_tip="Exibir dados do grupo"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="Bate-papo de grupo" name="chat_btn" tool_tip="Nova sessão de bate-papo"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="Ligar para o grupo" name="group_call_btn" tool_tip="Ligar para este grupo"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml index 350d53b81c..baf14c2c23 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Chat" name="chat"> - <text name="font_size"> - Tamanho da fonte: - </text> - <radio_group name="chat_font_size"> - <radio_item label="Pequeno" name="radio" value="0"/> - <radio_item label="Médio" name="radio2" value="1"/> - <radio_item label="Grande" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="true" label="Executar animação digitada quando estiver conversando" name="play_typing_animation"/> - <check_box label="Enviar MIs por email se estiver desconectado" name="send_im_to_email"/> - <check_box label="Ativar MIs e bate-papos de texto simples" name="plain_text_chat_history"/> - <check_box label="Balão de bate-papo" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - Mostrar MIs em: - </text> - <text name="requires_restart_label"> - (Reinicie para ativar) - </text> - <radio_group name="chat_window" tool_tip="Exibir cada bate-papo em uma janela separada ou exibir todos em uma única janela com uma aba para cada pessoa (requer reinÃcio)"> - <radio_item label="Janelas separadas" name="radio" value="0"/> - <radio_item label="Guias" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - Ativar pop-ups de novos bate-papos: - </text> - <check_box label="Bate-papo de grupo" name="EnableGroupChatPopups" tool_tip="Exibir pop-up de bate-papos novos de grupos"/> - <check_box label="Bate-papos de MI" name="EnableIMChatPopups" tool_tip="Exibir pop-up de mensagens instantâneas novas"/> - <spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_lifetime"/> - <spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="true" label="Executar animação digitada quando estiver conversando" name="play_typing_animation"/> + <check_box label="Enviar MIs por email se estiver desconectado" name="send_im_to_email"/> + <check_box label="Apenas amigos e grupos podem me ligar ou enviar MIs" name="voice_call_friends_only_check"/> + <text name="font_size"> + Tamanho da fonte: + </text> + <combo_box name="chat_font_size"> + <item label="Pequeno" name="Small" value="0"/> + <item label="Médio" name="Medium" value="1"/> + <item label="Grande" name="Large" value="2"/> + </combo_box> + <check_box label="Balão de bate-papo" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + Notificações + </text> + <text name="friend_ims"> + MIs de amigos: + </text> + <combo_box name="FriendIMOptions"> + <item label="Abrir janela Conversas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Abrir pop up com mensagem" name="PopUpMessage" value="toast"/> + <item label="Piscar botão da barra de ferramentas" name="FlashToolbarButton" value="flash"/> + <item label="Nenhum" name="None" value="none"/> + </combo_box> + <text name="non_friend_ims"> + MIs de não amigos: + </text> + <combo_box name="NonFriendIMOptions"> + <item label="Abrir janela Conversas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Abrir pop up com mensagem" name="PopUpMessage" value="toast"/> + <item label="Piscar botão da barra de ferramentas" name="FlashToolbarButton" value="flash"/> + <item label="Nenhum" name="None" value="none"/> + </combo_box> + <text name="conference_ims"> + MIs de conferências: + </text> + <combo_box name="ConferenceIMOptions"> + <item label="Abrir janela Conversas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Abrir pop up com mensagem" name="PopUpMessage" value="toast"/> + <item label="Piscar botão da barra de ferramentas" name="FlashToolbarButton" value="flash"/> + <item label="Nenhum" name="None" value="none"/> + </combo_box> + <text name="group_chat"> + Bate-papo de grupo: + </text> + <combo_box name="GroupChatOptions"> + <item label="Abrir janela Conversas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Abrir pop up com mensagem" name="PopUpMessage" value="toast"/> + <item label="Piscar botão da barra de ferramentas" name="FlashToolbarButton" value="flash"/> + <item label="Nenhum" name="None" value="none"/> + </combo_box> + <text name="nearby_chat"> + Bate-papo local: + </text> + <combo_box name="NearbyChatOptions"> + <item label="Abrir janela Conversas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Abrir pop up com mensagem" name="PopUpMessage" value="toast"/> + <item label="Piscar botão da barra de ferramentas" name="FlashToolBarButton" value="flash"/> + <item label="Nenhum" name="None" value="none"/> + </combo_box> + <text name="notifications_alert"> + Para interromper temporariamente todas as notificações, use Comunicar > Não perturbe. + </text> + </panel> + <panel> + <text name="play_sound"> + Executar som: + </text> + <check_box label="Nova conversa" name="new_conversation"/> + <check_box label="Chamada de voz recebida" name="incoming_voice_call"/> + <check_box label="Oferta de teletransporte" name="teleport_offer"/> + <check_box label="Oferta de inventário" name="inventory_offer"/> + </panel> + <panel> + <button label="Limpar registro..." name="clear_log"/> + <button label="Excluir transcrições..." name="delete_transcripts"/> + <button label="Procurar..." label_selected="Procurar" name="log_path_button"/> + </panel> <button label="Tradução..." name="ok_btn"/> <button label="Substituição automática..." name="autoreplace_showgui"/> <button label="Verificando a ortografia..." name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml index c53aa7d5f7..8a0495f9bb 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml @@ -69,6 +69,9 @@ <combo_box.item label="(nunca)" name="item4"/> </combo_box> <text name="text_box3"> - Mensagem do modo ocupado: + Resposta de Não perturbe: </text> + <text_editor name="do_not_disturb_response"> + log_in_to_change + </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml index 3cfe0fe4f4..f0fd438cef 100644 --- a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="Comprar objeto" name="Buyobject"/> <combo_box.item label="Pagar por objeto" name="Payobject"/> <combo_box.item label="Abrir" name="Open"/> + <combo_box.item label="Zoom" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index bc72b86020..4bf18aab70 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -128,7 +128,7 @@ Sair </string> <string name="create_account_url"> - http://join.secondlife.com/index.php?lang=pt-BR&sourceid=[sourceid] + http://join.secondlife.com/?sourceid=[sourceid] </string> <string name="LoginFailedViewerNotPermitted"> O visualizador utilizado já não é compatÃvel com o Second Life. Visite a página abaixo para baixar uma versão atual: http://secondlife.com/download @@ -571,8 +571,8 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para <string name="AvatarAway"> Distante </string> - <string name="AvatarBusy"> - Ocupado + <string name="AvatarDoNotDisturb"> + Não perturbe </string> <string name="AvatarMuted"> Mudo @@ -808,6 +808,12 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para <string name="ST_NO_JOINT"> Não é possÃvel encontrar a raiz (ROOT) ou junção (JOINT). </string> + <string name="NearbyChatTitle"> + Bate-papo local + </string> + <string name="NearbyChatLabel"> + (Bate-papo local) + </string> <string name="whisper"> sussurra: </string> @@ -871,6 +877,9 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para <string name="ControlYourCamera"> Controle sua camera </string> + <string name="AgentNameSubst"> + (Você) + </string> <string name="TeleportYourAgent"> Teletransportá-lo </string> @@ -955,18 +964,6 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para <string name="dictionary_files"> Dicionários </string> - <string name="AvatarSetNotAway"> - deixar como ausente - </string> - <string name="AvatarSetAway"> - deixar como ausente - </string> - <string name="AvatarSetNotBusy"> - deixar como não ocupado - </string> - <string name="AvatarSetBusy"> - Deixar como ocupado - </string> <string name="shape"> Silhueta </string> @@ -1923,8 +1920,8 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para <string name="PanelContentsNewScript"> Novo Script </string> - <string name="BusyModeResponseDefault"> - O residente para o qual escreveu está no modo 'ocupado', ou seja, ele prefere não receber nada no momento. Sua mensagem será exibida como uma MI mais tarde. + <string name="DoNotDisturbModeResponseDefault"> + Este residente ativou o "Não perturbe" e verá sua mensagem mais tarde. </string> <string name="MuteByName"> (por nome) @@ -2037,9 +2034,6 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para <string name="GroupMoneyDate"> [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] </string> - <string name="ViewerObjectContents"> - Conteúdo - </string> <string name="AcquiredItems"> Itens adquiridos </string> @@ -3753,7 +3747,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. Região em geral </string> <string name="LocationCtrlSeeAVsTooltip"> - Avatar visÃveis e bate-papo permitido fora deste terreno + Os avatares neste lote não podem ser vistos ou ouvidos por avatares fora dele </string> <string name="LocationCtrlPathfindingDirtyTooltip"> Os objetos que se movem podem não se comportar corretamente nesta região até que ela seja recarregada. @@ -3830,6 +3824,12 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="IM_unblock_only_groups_friends"> Para visualizar esta mensagem, você deve desmarcar "Apenas amigos e grupos podem me ligar ou enviar MIs" em Preferências/Privacidade. </string> + <string name="OnlineStatus"> + Conectado + </string> + <string name="OfflineStatus"> + Desconectado + </string> <string name="answered_call"> Ligação atendida </string> @@ -3839,6 +3839,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="you_joined_call"> Você entrou na ligação </string> + <string name="you_auto_rejected_call-im"> + Você recusou automaticamente a chamada de voz enquanto "Não perturbe" estava ativado. + </string> <string name="name_started_call"> [NAME] iniciou uma ligação de voz </string> @@ -3851,6 +3854,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="hang_up-im"> Saiu da ligação de voz </string> + <string name="conference-title"> + Bate-papo com várias pessoas + </string> <string name="conference-title-incoming"> Conversa com [AGENT_NAME] </string> @@ -4726,6 +4732,9 @@ Tente colocar o caminho do editor entre aspas. <string name="Command_Chat_Label"> Bate-papo </string> + <string name="Command_Conversations_Label"> + Conversas + </string> <string name="Command_Compass_Label"> Bússola </string> @@ -4801,6 +4810,9 @@ Tente colocar o caminho do editor entre aspas. <string name="Command_Chat_Tooltip"> Bater papo com pessoas próximas usando texto </string> + <string name="Command_Conversations_Tooltip"> + Conversar com todos + </string> <string name="Command_Compass_Tooltip"> Bússola </string> @@ -4930,4 +4942,13 @@ Tente colocar o caminho do editor entre aspas. <string name="UserDictionary"> [Usuário] </string> + <string name="logging_calls_disabled_log_empty"> + As conversas não estão sendo registradas. Para começar a manter um registro, selecione "Salvar: apenas registro" ou "Salvar: registro e transcrições" em Preferências> Bate-papo. + </string> + <string name="logging_calls_disabled_log_not_empty"> + Nenhuma conversa será registrada. Para recomeçar a gravação de registros, selecione "Salvar: apenas registro" ou "Salvar: registro e transcrições" em Preferências> Bate-papo. + </string> + <string name="logging_calls_enabled_log_empty"> + Não há conversas registradas. Depois que você entrar em contato com alguém, ou alguém entrar em contato com você, um registro será exibido aqui. + </string> </strings> diff --git a/indra/newview/skins/default/xui/ru/floater_conversation_log.xml b/indra/newview/skins/default/xui/ru/floater_conversation_log.xml new file mode 100644 index 0000000000..090ac7193a --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="ЖУРÐÐЛ Ð ÐЗГОВОРÐ"> + <panel name="buttons_panel"> + <filter_editor label="Фильтр Ð´Ð»Ñ Ð»ÑŽÐ´ÐµÐ¹" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="Параметры проÑмотра/Ñортировки"/> + <menu_button name="conversations_gear_btn" tool_tip="ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ жителем или группой"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_conversation_preview.xml b/indra/newview/skins/default/xui/ru/floater_conversation_preview.xml new file mode 100644 index 0000000000..23225fcf56 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="Ð ÐЗГОВОР:"> + <floater.string name="Title"> + Ð ÐЗГОВОР: [NAME] + </floater.string> + <text name="page_label" value="Страница"/> +</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_im_container.xml b/indra/newview/skins/default/xui/ru/floater_im_container.xml index b147cfa2b3..eba7a19cd4 100644 --- a/indra/newview/skins/default/xui/ru/floater_im_container.xml +++ b/indra/newview/skins/default/xui/ru/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="ОБЩЕÐИЕ"/> +<multi_floater name="floater_im_box" title="ОБЩЕÐИЕ"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="Параметры проÑмотра/Ñортировки"/> + <button name="add_btn" tool_tip="Ðачать разговор"/> + <button name="speak_btn" tool_tip="Разговаривать через микрофон"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="Свернуть/развернуть Ñтот ÑпиÑок"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="Свернуть Ñту панель"/> + <text name="stub_textbox"> + Разговор отображаетÑÑ Ð² отдельном окне. [secondlife:/// Вернуть.] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/ru/floater_im_session.xml b/indra/newview/skins/default/xui/ru/floater_im_session.xml index 604d9dc6d3..ea110ffb44 100644 --- a/indra/newview/skins/default/xui/ru/floater_im_session.xml +++ b/indra/newview/skins/default/xui/ru/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="Кому" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] приглашен(а) на разговор."/> + <floater.string name="multiple_participants_added" value="[NAME] приглашены на разговор."/> + <floater.string name="tooltip_to_separate_window" value="ПеренеÑти Ñтот разговор в отдельное окно"/> + <floater.string name="tooltip_to_main_window" value="Вернуть Ñтот разговор в главное окно"/> + <floater.string name="start_call_button_tooltip" value="Открыть голоÑовое подключение"/> + <floater.string name="end_call_button_tooltip" value="Закрыть голоÑовое подключение"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="Свернуть Ñту панель"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="Свернуть ÑпиÑок учаÑтников"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="Развернуть ÑпиÑок учаÑтников"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="Параметры проÑмотра/Ñортировки"/> + <menu_button name="gear_btn" tool_tip="ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ жителем"/> + <button name="add_btn" tool_tip="Добавить учаÑтника в Ñтот разговор"/> + <button name="voice_call_btn" tool_tip="Открыть голоÑовое подключение"/> + <button name="close_btn" tool_tip="Завершить Ñтот разговор"/> + <button name="expand_collapse_btn" tool_tip="Развернуть/Ñвернуть Ñту панель"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Переводить чат" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="Кому" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="Показать/Ñкрыть панель Ñообщений"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/ru/floater_incoming_call.xml b/indra/newview/skins/default/xui/ru/floater_incoming_call.xml index 072c20147d..3f61421d0c 100644 --- a/indra/newview/skins/default/xui/ru/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/ru/floater_incoming_call.xml @@ -10,7 +10,7 @@ анонимно </floater.string> <floater.string name="VoiceInviteP2P"> - вызывает. + вызывает ваÑ. </floater.string> <floater.string name="VoiceInviteAdHoc"> теперь учаÑтвует в групповом голоÑовом чате. @@ -25,9 +25,9 @@ Хотите выйти из чата «[CURRENT_CHAT]» и приÑоединитьÑÑ Ðº Ñтому голоÑовому чату? </floater.string> <text name="question"> - Хотите выйти из чата «[CURRENT_CHAT]» и приÑоединитьÑÑ Ðº Ñтому голоÑовому чату? + ЕÑли вы ответите, вы покинете текущий голоÑовой чат. </text> - <button label="ПринÑÑ‚ÑŒ" label_selected="ПринÑÑ‚ÑŒ" name="Accept"/> - <button label="Отклонить" label_selected="Отклонить" name="Reject"/> - <button label="Ðачать IM" name="Start IM"/> + <button label="Ответить" label_selected="Ответить" name="Accept"/> + <button label="Игнорировать" label_selected="Игнорировать" name="Reject"/> + <button label="Открыть IM" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/ru/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/ru/floater_pathfinding_console.xml index fa72df04fd..8faddb1805 100644 --- a/indra/newview/skins/default/xui/ru/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/ru/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Показать: </text> - <check_box label="Мир" name="show_world"/> + <check_box label="ТеÑÑ‚" name="show_world"/> <check_box label="Только перемещаемые предметы" name="show_world_movables_only"/> <check_box label="ÐÐ°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ñетка" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml index db37089aeb..a9a21e7d4a 100644 --- a/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml @@ -19,7 +19,7 @@ <button label="По умолчанию" label_selected="По умолчанию" name="Default"/> <button label="ОчиÑтить" label_selected="ОчиÑтить" name="Blank"/> <button label="Ðет" label_selected="Ðет" name="None"/> - <check_box initial_value="иÑтина" label="ПроÑмотр вживую" name="apply_immediate_check"/> + <check_box initial_value="иÑтина" label="Применить ÑейчаÑ" name="apply_immediate_check"/> <text name="preview_disabled" value="ПроÑмотр отключен"/> <filter_editor label="Фильтровать текÑтуры" name="inventory search editor"/> <check_box initial_value="ложь" label="Показывать папки" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/ru/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/ru/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..5a7e7a7061 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="ГРОМКОСТЬ ГОЛОСОВОГО ЧÐТÐ"> + <slider label="ГолоÑовой чат" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_voice_effect.xml b/indra/newview/skins/default/xui/ru/floater_voice_effect.xml index 1eb8a94d7a..d3cef042a3 100644 --- a/indra/newview/skins/default/xui/ru/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/ru/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="МеÑта" name="voice_effects" title="ИЗМЕÐЕÐИЕ ГОЛОСÐ"> +<floater label="МеÑта" name="voice_effects" title="ПРОСМОТРИЗМЕÐЕÐИЯ ГОЛОСÐ"> <string name="no_voice_effect"> (Ðет Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа) </string> diff --git a/indra/newview/skins/default/xui/ru/floater_voice_volume.xml b/indra/newview/skins/default/xui/ru/floater_voice_volume.xml new file mode 100644 index 0000000000..aca6bd518a --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="ГРОМКОСТЬ ГОЛОСÐ"> + <slider name="volume_slider" tool_tip="ГромкоÑÑ‚ÑŒ голоÑа" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/ru/menu_cof_gear.xml b/indra/newview/skins/default/xui/ru/menu_cof_gear.xml index 0332c03a04..b7a32dfd75 100644 --- a/indra/newview/skins/default/xui/ru/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/ru/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="Gear COF"> <menu label="ÐÐ¾Ð²Ð°Ñ Ð¾Ð´ÐµÐ¶Ð´Ð°" name="COF.Gear.New_Clothes"/> - <menu label="Ðовые чаÑти тела" name="COF.Geear.New_Body_Parts"/> + <menu label="Ðовые чаÑти тела" name="COF.Gear.New_Body_Parts"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_conversation.xml b/indra/newview/skins/default/xui/ru/menu_conversation.xml new file mode 100644 index 0000000000..530b1ea704 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="Закрыть разговор" name="close_conversation"/> + <menu_item_call label="Открыть голоÑовой чат" name="open_voice_conversation"/> + <menu_item_call label="Прекратить голоÑовой чат" name="disconnect_from_voice"/> + <menu_item_call label="Смотреть профиль" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Предложить телепортацию" name="offer_teleport"/> + <menu_item_call label="ГолоÑовой вызов" name="voice_call"/> + <menu_item_call label="Журнал чата..." name="chat_history"/> + <menu_item_call label="Добавить друга" name="add_friend"/> + <menu_item_call label="Удалить друга" name="remove_friend"/> + <menu_item_call label="Удалить друзей" name="remove_friends"/> + <menu_item_call label="ПриглаÑить в группу..." name="invite_to_group"/> + <menu_item_call label="Приблизить" name="zoom_in"/> + <menu_item_call label="Карта" name="map"/> + <menu_item_call label="ПоделитьÑÑ" name="share"/> + <menu_item_call label="Заплатить" name="pay"/> + <menu_item_check label="Блокировать голоÑ" name="block_unblock"/> + <menu_item_check label="Блокировать текÑÑ‚" name="MuteText"/> + <menu_item_call label="Профиль группы" name="group_profile"/> + <menu_item_call label="Ðктивировать группу" name="activate_group"/> + <menu_item_call label="Покинуть группу" name="leave_group"/> + <context_menu label="Параметры модератора" name="Moderator Options"> + <menu_item_check label="Разрешить текÑтовый чат" name="AllowTextChat"/> + <menu_item_call label="Заглушить Ñтого учаÑтника" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Позволить говорить Ñтому учаÑтнику" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Заглушить вÑех" name="ModerateVoiceMute"/> + <menu_item_call label="Позволить говорить вÑем" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/ru/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..3fbffbe038 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="IM..." name="IM"/> + <menu_item_call label="ГолоÑовой вызов..." name="Call"/> + <menu_item_call label="Открыть журнал чата..." name="Chat history"/> + <menu_item_call label="Смотреть профиль" name="View Profile"/> + <menu_item_call label="Предложить телепорт" name="teleport"/> + <menu_item_call label="Добавить друга" name="add_friend"/> + <menu_item_call label="Удалить из друзей" name="remove_friend"/> + <menu_item_call label="ПриглаÑить в группу..." name="Invite"/> + <menu_item_call label="Карта" name="Map"/> + <menu_item_call label="ПоделитьÑÑ" name="Share"/> + <menu_item_call label="Заплатить" name="Pay"/> + <menu_item_check label="Черный ÑпиÑок" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/ru/menu_conversation_log_view.xml new file mode 100644 index 0000000000..928146e273 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="Сортировать по имени" name="sort_by_name"/> + <menu_item_check label="Сортировать по дате" name="sort_by_date"/> + <menu_item_check label="Сначала друзьÑ" name="sort_by_friends"/> + <menu_item_call label="ПоÑмотреть журнал локального чата..." name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_im_conversation.xml b/indra/newview/skins/default/xui/ru/menu_im_conversation.xml new file mode 100644 index 0000000000..1db0b8bae3 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="Смотреть профиль" name="View Profile"/> + <menu_item_call label="Добавить друга" name="Add Friend"/> + <menu_item_call label="Удалить друга" name="remove_friend"/> + <menu_item_call label="Предложить телепортацию" name="offer_teleport"/> + <menu_item_call label="ПриглаÑить в группу..." name="invite_to_group"/> + <menu_item_call label="Журнал чата..." name="chat_history"/> + <menu_item_call label="Приблизить" name="zoom_in"/> + <menu_item_call label="Карта" name="map"/> + <menu_item_call label="ПоделитьÑÑ" name="Share"/> + <menu_item_call label="Заплатить" name="Pay"/> + <menu_item_check label="Блокировать голоÑ" name="Block/Unblock"/> + <menu_item_check label="Блокировать текÑÑ‚" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/ru/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..35cff8e4bf --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="Компактный вид" name="compact_view"/> + <menu_item_check label="Развернутый вид" name="expanded_view"/> + <menu_item_check label="Показать времÑ" name="IMShowTime"/> + <menu_item_check label="Показывать имена при разговорах" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_object_icon.xml b/indra/newview/skins/default/xui/ru/menu_object_icon.xml index 6229b2e72f..0c50abcfbd 100644 --- a/indra/newview/skins/default/xui/ru/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/ru/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="Профиль объекта..." name="Object Profile"/> <menu_item_call label="Блокировать..." name="Block"/> + <menu_item_call label="Показать на карте" name="show_on_map"/> + <menu_item_call label="Телепорт в меÑтоположение объекта" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml b/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml index 93dbd7d6a7..d379a17216 100644 --- a/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="Ðовые волоÑÑ‹" name="New Hair"/> <menu_item_call label="Ðовые глаза" name="New Eyes"/> </menu> + <menu_item_call label="Открыть вÑе папки" name="expand"/> + <menu_item_call label="Закрыть вÑе папки" name="collapse"/> <menu_item_call label="Переименовать коÑтюм" name="rename"/> <menu_item_call label="Удалить коÑтюм" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_participant_view.xml b/indra/newview/skins/default/xui/ru/menu_participant_view.xml new file mode 100644 index 0000000000..851a42d428 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="Сортировать разговоры по типу" name="sort_sessions_by_type"/> + <menu_item_check label="Сортировать разговоры по имени" name="sort_sessions_by_name"/> + <menu_item_check label="Сортировать разговоры по поÑледнему дейÑтвию" name="sort_sessions_by_recent"/> + <menu_item_check label="Сортировать учаÑтников по имени" name="sort_participants_by_name"/> + <menu_item_check label="Сортировать учаÑтников по поÑледнему дейÑтвию" name="sort_participants_by_recent"/> + <menu_item_call label="Изменить наÑтройки..." name="chat_preferences"/> + <menu_item_call label="ÐаÑтройки приватноÑти..." name="privacy_preferences"/> + <menu_item_check label="Журнал разговора..." name="Conversation"/> + <menu_item_check label="ПеревеÑти локальный чат" name="Translate_chat"/> + <menu_item_check label="ÐаÑтройки перевода..." name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/ru/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..157f2ad5e2 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="Разблокировать" name="unblock"/> + <menu_item_call label="Профиль…" name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/ru/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..f42e8f8609 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="Блокировать Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¿Ð¾ имени..." name="block_resident_by_name"/> + <menu_item_call label="Блокировать объект по имени" name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/ru/menu_people_blocked_view.xml new file mode 100644 index 0000000000..8c0150e8ae --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="Сортировать по имени" name="sort_by_name"/> + <menu_item_check label="Сортировать по типу" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_friends_view.xml b/indra/newview/skins/default/xui/ru/menu_people_friends_view.xml new file mode 100644 index 0000000000..7b2dba0539 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Сортировать по имени" name="sort_name"/> + <menu_item_check label="Сортировать по ÑтатуÑу" name="sort_status"/> + <menu_item_check label="Показывать значки людей" name="view_icons"/> + <menu_item_check label="Показывать разрешенные дейÑтвиÑ" name="view_permissions"/> + <menu_item_check label="ПоÑмотреть журнал разговора..." name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_groups.xml b/indra/newview/skins/default/xui/ru/menu_people_groups.xml index e734a83ef0..78d73c9d1e 100644 --- a/indra/newview/skins/default/xui/ru/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/ru/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="ИнформациÑ" name="View Info"/> <menu_item_call label="Чат" name="Chat"/> - <menu_item_call label="Звонок" name="Call"/> + <menu_item_call label="ГолоÑовой вызов" name="Call"/> <menu_item_call label="ÐктивациÑ" name="Activate"/> <menu_item_call label="Покинуть" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_groups_view.xml b/indra/newview/skins/default/xui/ru/menu_people_groups_view.xml new file mode 100644 index 0000000000..cbf1c64774 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Показывать значки группы" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_nearby.xml b/indra/newview/skins/default/xui/ru/menu_people_nearby.xml index ebce959044..d05b7e7d01 100644 --- a/indra/newview/skins/default/xui/ru/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/ru/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="Смотреть профиль" name="View Profile"/> - <menu_item_call label="Ð’ друзьÑ" name="Add Friend"/> - <menu_item_call label="Удалить из друзей" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="Звонок" name="Call"/> - <menu_item_call label="Карта" name="Map"/> - <menu_item_call label="ПоделитьÑÑ" name="Share"/> - <menu_item_call label="Заплатить" name="Pay"/> - <menu_item_check label="Черный ÑпиÑок" name="Block/Unblock"/> - <menu_item_call label="Предложить телепорт" name="teleport"/> + <menu_item_call label="Смотреть профиль" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Предложить телепорт" name="offer_teleport"/> + <menu_item_call label="ГолоÑовой вызов" name="voice_call"/> + <menu_item_call label="ПоÑмотреть журнал чата..." name="chat_history"/> + <menu_item_call label="Добавить друга" name="add_friend"/> + <menu_item_call label="Удалить из друзей" name="remove_friend"/> + <menu_item_call label="ПриглаÑить в группу..." name="invite_to_group"/> + <menu_item_call label="Приблизить" name="zoom_in"/> + <menu_item_call label="Карта" name="map"/> + <menu_item_call label="ПоделитьÑÑ" name="share"/> + <menu_item_call label="Заплатить" name="pay"/> + <menu_item_check label="Черный ÑпиÑок" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/ru/menu_people_nearby_multiselect.xml index 0e8e0d4053..88eb56c9f5 100644 --- a/indra/newview/skins/default/xui/ru/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/ru/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="Добавить в друзьÑ" name="Add Friends"/> - <menu_item_call label="Удалить из друзей" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="Звонок" name="Call"/> - <menu_item_call label="ПоделитьÑÑ" name="Share"/> - <menu_item_call label="Заплатить" name="Pay"/> - <menu_item_call label="Предложить телепорт" name="teleport"/> + <menu_item_call label="Добавить в друзьÑ" name="add_friends"/> + <menu_item_call label="Удалить из друзей" name="remove_friends"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="Звонок" name="call"/> + <menu_item_call label="ПоделитьÑÑ" name="share"/> + <menu_item_call label="Заплатить" name="pay"/> + <menu_item_call label="Предложить телепорт" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/ru/menu_people_nearby_view.xml new file mode 100644 index 0000000000..2bc353ad58 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Сортировать по недавно говорившим" name="sort_by_recent_speakers"/> + <menu_item_check label="Сортировать по имени" name="sort_name"/> + <menu_item_check label="Сортировать по раÑÑтоÑнию" name="sort_distance"/> + <menu_item_check label="Показывать значки людей" name="view_icons"/> + <menu_item_check label="Смотреть карту" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_people_recent_view.xml b/indra/newview/skins/default/xui/ru/menu_people_recent_view.xml new file mode 100644 index 0000000000..a009cf081f --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Сортировать по времени" name="sort_most"/> + <menu_item_check label="Сортировать по имени" name="sort_name"/> + <menu_item_check label="Показывать значки людей" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_url_agent.xml b/indra/newview/skins/default/xui/ru/menu_url_agent.xml index 0ba3ee152a..230d049fad 100644 --- a/indra/newview/skins/default/xui/ru/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/ru/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Показать профиль жителÑ" name="show_agent"/> + <menu_item_call label="Смотреть профиль" name="show_agent"/> + <menu_item_call label="Отправить Ñообщение..." name="send_im"/> + <menu_item_call label="Добавить в друзьÑ..." name="add_friend"/> <menu_item_call label="Копировать название в буфер обмена" name="url_copy_label"/> <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_url_objectim.xml b/indra/newview/skins/default/xui/ru/menu_url_objectim.xml index 6e7800d3f5..1326db708e 100644 --- a/indra/newview/skins/default/xui/ru/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/ru/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Показать информацию об объекте" name="show_object"/> + <menu_item_call label="Профиль объекта..." name="show_object"/> <menu_item_call label="Показать на карте" name="show_on_map"/> <menu_item_call label="Телепорт в меÑтоположение объекта" name="teleport_to_object"/> <menu_item_call label="Копировать название объекта в буфер обмена" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml index c292b8a287..92a9943b93 100644 --- a/indra/newview/skins/default/xui/ru/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="ОÑтановить анимацию" name="Stop Animating My Avatar"/> <menu_item_call label="Ходьба / бег / полет..." name="Walk / run / fly"/> </menu> - <menu label="СтатуÑ" name="Status"> - <menu_item_call label="Ðет на меÑте" name="Set Away"/> - <menu_item_call label="Ðе беÑпокоить" name="Set Busy"/> - </menu> + <menu label="СтатуÑ" name="Status"/> <menu_item_call label="Купить L$..." name="Buy and Sell L$"/> <menu_item_call label="Торговые иÑходÑщие..." name="MerchantOutbox"/> <menu_item_call label="Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ аккаунта..." name="Manage My Account"/> @@ -30,14 +27,18 @@ <menu_item_call label="Выход из [APP_NAME]" name="Quit"/> </menu> <menu label="Общение" name="Communicate"> - <menu_item_check label="Чат..." name="Nearby Chat"/> + <menu_item_check label="Разговоры..." name="Conversations"/> + <menu_item_check label="Локальный чат..." name="Nearby Chat"/> <menu_item_check label="Говорить" name="Speak"/> - <menu_item_check label="ÐаÑтройки голоÑа..." name="Nearby Voice"/> - <menu_item_check label="Изменение голоÑа..." name="ShowVoice"/> + <menu label="Изменение голоÑа" name="VoiceMorphing"> + <menu_item_check label="Без Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа" name="NoVoiceMorphing"/> + <menu_item_check label="ПроÑмотр..." name="Preview"/> + <menu_item_call label="ПодпиÑатьÑÑ..." name="Subscribe"/> + </menu> <menu_item_check label="ЖеÑÑ‚Ñ‹..." name="Gestures"/> - <menu_item_call label="ДрузьÑ" name="My Friends"/> - <menu_item_call label="Группы" name="My Groups"/> - <menu_item_call label="Люди неподалеку" name="Active Speakers"/> + <menu_item_check label="ДрузьÑ" name="My Friends"/> + <menu_item_check label="Группы" name="My Groups"/> + <menu_item_check label="Люди неподалеку" name="Active Speakers"/> <menu_item_call label="Черный ÑпиÑок" name="Block List"/> </menu> <menu label="Мир" name="World"> diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml index 85b7074253..00ab0b5763 100644 --- a/indra/newview/skins/default/xui/ru/notifications.xml +++ b/indra/newview/skins/default/xui/ru/notifications.xml @@ -516,6 +516,24 @@ </url> <usetemplate ignoretext="Мой графичеÑкий драйвер уÑтарел" name="okcancelignore" notext="Ðет" yestext="Да"/> </notification> + <notification name="AMDOldDriver"> + Возможно, Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ видеокарты имеетÑÑ Ð±Ð¾Ð»ÐµÐµ новый драйвер. Обновление драйвера может ÑущеÑтвенно повыÑить быÑтродейÑтвие. + + Проверить наличие Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð° по адреÑу [_URL]? + <url name="url"> + http://support.amd.com/us/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="Мой графичеÑкий драйвер уÑтарел" name="okcancelignore" notext="Ðет" yestext="Да"/> + </notification> + <notification name="NVIDIAOldDriver"> + Возможно, Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ видеокарты имеетÑÑ Ð±Ð¾Ð»ÐµÐµ новый драйвер. Обновление драйвера может ÑущеÑтвенно повыÑить быÑтродейÑтвие. + + Проверить наличие Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð° по адреÑу [_URL]? + <url name="url"> + http://www.nvidia.com/Download/index.aspx?lang=ru-ru + </url> + <usetemplate ignoretext="Мой графичеÑкий драйвер уÑтарел" name="okcancelignore" notext="Ðет" yestext="Да"/> + </notification> <notification name="UnknownGPU"> Ð’ вашей ÑиÑтеме уÑтановлена графичеÑÐºÐ°Ñ ÐºÐ°Ñ€Ñ‚Ð°, которую [APP_NAME] не может раÑпознать. Так чаÑто бывает, еÑли новое оборудование еще не было проверено на работу Ñ [APP_NAME]. Скорее вÑего, оно будет работать нормально, но, возможно, придетÑÑ Ð¾Ñ‚Ñ€ÐµÐ³ÑƒÐ»Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ параметры графики. @@ -1546,10 +1564,13 @@ http://secondlife.com/download. Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ предложить дружбу. Повторите попытку через минуту. <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="BusyModeSet"> - УÑтановлен режим «ЗанÑт». -Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‡Ð°Ñ‚Ð° и IM будут Ñкрыты. Ðа IM-ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ возвращатьÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¹ ответ в режиме «ЗанÑт». Ð’Ñе Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ð¸ будут отклонÑÑ‚ÑŒÑÑ. Ð’Ñе Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð±ÑƒÐ´ÑƒÑ‚ направлены в корзину. - <usetemplate ignoretext="Смена моего ÑтатуÑа на режим «ЗанÑт»" name="okignore" yestext="OK"/> + <notification name="DoNotDisturbModeSet"> + Режим «Ðе беÑпокоить» включен. Ð’Ñ‹ не будете получать уведомлений о входÑщих вызовах. + +- Другие жители будут получать ваш ответ, уÑтановленный Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° «Ðе беÑпокоить» (ÐаÑтройки > Общие). +- ÐŸÑ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ð¸ будут отклонÑÑ‚ÑŒÑÑ. +- ГолоÑовые вызовы будут отклонÑÑ‚ÑŒÑÑ. + <usetemplate ignoretext="Смена моего ÑтатуÑа на режим «Ðе беÑпокоить»" name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> ДоÑтигнуто макÑимальное количеÑтво групп. Выйдите из другой группы, прежде чем вÑтупать в Ñту, или отклоните предложение. @@ -2033,6 +2054,10 @@ http://secondlife.com/download. Перейти на [http://secondlife.com/account/ информационную панель], чтобы увидеть иÑторию аккаунта? <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра иÑтории аккаунта" name="okcancelignore" notext="Отмена" yestext="Перейти на Ñтраницу"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + При добавлении учаÑтника в ÑущеÑтвующий разговор будет Ñоздан новый разговор. Ð’Ñе учаÑтники получат ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ новом разговоре. + <usetemplate ignoretext="Подтвердите добавление учаÑтников чата" name="okcancelignore" notext="Отмена" yestext="ОК"/> + </notification> <notification name="ConfirmQuit"> Выйти из программы? <usetemplate ignoretext="Подтверждать перед выходом" name="okcancelignore" notext="Ðе выходить" yestext="Выйти"/> @@ -2107,14 +2132,14 @@ http://secondlife.com/download. <button ignore="Ðе заменÑÑ‚ÑŒ" name="No" text="Отмена"/> </form> </notification> - <notification label="Предупреждение о режиме «ЗанÑт»" name="BusyModePay"> - У Ð²Ð°Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½ режим «ЗанÑт», поÑтому вы не получите никаких предметов, предлагаемых в обмен на Ñтот платеж. + <notification label="Предупреждение режима «Ðе беÑпокоить»" name="DoNotDisturbModePay"> + Включен режим «Ðе беÑпокоить». Ð’Ñ‹ не будете получать никаких предметов, предлагаемых в обмен за Ñтот платеж. -Хотите отключить режим «ЗанÑт» до Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñтой транзакции? +Отключить режим «Ðе беÑпокоить» перед завершением Ñтой операции? <form name="form"> - <ignore name="ignore" text="Я ÑобираюÑÑŒ заплатить за Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ объект, когда включен режим «ЗанÑт»"/> - <button ignore="Ð’Ñегда отключать режим «ЗанÑт»" name="Yes" text="OK"/> - <button ignore="Ðе отключать режим «ЗанÑт»" name="No" text="Отмена"/> + <ignore name="ignore" text="Я ÑобираюÑÑŒ заплатить за Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ объект, когда включен режим «Ðе беÑпокоить»"/> + <button ignore="Ð’Ñегда выходить из режима «Ðе беÑпокоить»" name="Yes" text="OK"/> + <button ignore="Ðе выходить из режима «Ðе беÑпокоить»" name="No" text="Отмена"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2249,11 +2274,8 @@ http://secondlife.com/download. <notification name="GroupNotice"> Раздел: [SUBJECT], Ñообщение: [MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> в Ñети - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> не в Ñети + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> [STATUS] </notification> <notification name="AddSelfFriend"> Ð’Ñ‹ лучше вÑех, но Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ в Ð´Ñ€ÑƒÐ·ÑŒÑ ÑÐµÐ±Ñ Ñамого. @@ -2482,13 +2504,6 @@ http://secondlife.com/download. <notification name="DynamicPathfindingDisabled"> Ð’ Ñтом регионе не разрешен динамичеÑкий поиÑк пути. Возможны Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñкриптовых объектов Ñ Ð¸Ñпользованием вызовов LSL поиÑка пути. </notification> - <notification name="PathfindingRebakeNavmesh"> - Изменение некоторых объектов в регионе может привеÑти к неправильному поведению других подвижных объектов. Чтобы иÑправить их поведение, нажмите кнопку «ВоÑÑтановить регион». Более Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ â€“ по ÑÑылке «Справка». - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="Справка" ignoretext="Изменение некоторых объектов в регионе может привеÑти к неправильному поведению других подвижных объектов." name="okhelpignore" yestext="OK"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> Произошла ошибка. Возможно, неполадка в Ñети или на Ñервере, или у Ð²Ð°Ñ Ð½ÐµÑ‚ прав на ÑтроительÑтво. Иногда Ð´Ð»Ñ ÑƒÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñтой проблемы доÑтаточно выйти и Ñнова войти. <usetemplate name="okbutton" yestext="OK"/> @@ -2751,7 +2766,7 @@ http://secondlife.com/download. <notification name="ScriptQuestionCaution"> Предупреждение. Объект «<nolink>[OBJECTNAME]</nolink>» требует полного доÑтупа к вашему аккаунту Ð´Ð»Ñ Linden-долларов. ЕÑли разрешить такой доÑтуп, объект Ñможет в любое Ð²Ñ€ÐµÐ¼Ñ Ñнимать ÑредÑтва Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ аккаунта или полноÑтью опуÑтошать его неоднократно и без предупреждениÑ. -Такое требование чаще вÑего незаконно. Ðе разрешайте доÑтуп к Ñвоему аккаунту, еÑли только не полноÑтью оÑознаете, зачем он нужен Ñтому объекту. +Ðе разрешайте доÑтуп к Ñвоему аккаунту, еÑли только не полноÑтью оÑознаете, зачем он нужен Ñтому объекту. <form name="form"> <button name="Grant" text="Разрешить полный доÑтуп"/> <button name="Deny" text="Отклонить"/> @@ -3333,4 +3348,632 @@ http://secondlife.com/download. Ð’Ñ‹ удалÑете неÑколько предметов ([NUM_ITEMS]). Продолжить? <usetemplate ignoretext="Удалить неÑколько предметов?" name="okcancelignore" notext="Ðет" yestext="Да"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] заморозил ваÑ. Ð’ Ñто Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹ не можете перемещатьÑÑ Ð¸ выполнÑÑ‚ÑŒ другие дейÑÑ‚Ð²Ð¸Ñ Ñ Ð¼Ð¸Ñ€Ð¾Ð¼. + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] заморозил Ð²Ð°Ñ Ð½Ð° [AV_FREEZE_TIME] Ñек. Ð’ Ñто Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹ не можете перемещатьÑÑ Ð¸ выполнÑÑ‚ÑŒ другие дейÑÑ‚Ð²Ð¸Ñ Ñ Ð¼Ð¸Ñ€Ð¾Ð¼. + </notification> + <notification name="YouFrozeAvatar"> + Ðватар заморожен. + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] разморозил ваÑ. + </notification> + <notification name="AvatarUnFrozen"> + Ðватар разморожен. + </notification> + <notification name="AvatarFreezeFailure"> + Ðе удалоÑÑŒ заморозить: у Ð²Ð°Ñ Ð½ÐµÑ‚ прав админиÑтратора на Ñтом учаÑтке. + </notification> + <notification name="AvatarFreezeThaw"> + Заморозка кончилаÑÑŒ, занимайтеÑÑŒ Ñвоим делом. + </notification> + <notification name="AvatarCantFreeze"> + Ðевозможно заморозить Ñтого пользователÑ. + </notification> + <notification name="NowOwnObject"> + Ð’Ñ‹ Ñтали владельцем объекта [OBJECT_NAME] + </notification> + <notification name="CantRezOnLand"> + ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð»Ð¾Ð¶Ð¸Ñ‚ÑŒ объект на [OBJECT_POS]: Ñто не разрешено владельцем земли. Узнать, кто владелец, можно Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ инÑтрумента «ЗемлÑ». + </notification> + <notification name="RezFailTooManyRequests"> + Ðевозможно выложить объект: Ñлишком много запроÑов. + </notification> + <notification name="SitFailCantMove"> + ÐÐµÐ»ÑŒÐ·Ñ ÑеÑÑ‚ÑŒ: ÑÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ не можете двигатьÑÑ. + </notification> + <notification name="SitFailNotAllowedOnLand"> + Вам не разрешено ÑадитьÑÑ Ð½Ð° Ñтой земле. + </notification> + <notification name="SitFailNotSameRegion"> + Попробуйте перемеÑтитьÑÑ Ð±Ð»Ð¸Ð¶Ðµ. ÐÐµÐ»ÑŒÐ·Ñ ÑеÑÑ‚ÑŒ на объект: +он находитÑÑ Ð² другом регионе. + </notification> + <notification name="NoNewObjectRegionFull"> + Ðевозможно Ñоздать новый объект. Регион уже заполнен. + </notification> + <notification name="FailedToPlaceObject"> + Ðе удалоÑÑŒ помеÑтить объект в указанное меÑто. Повторите попытку. + </notification> + <notification name="NoOwnNoGardening"> + Ð’Ñ‹ не можете Ñоздавать Ð´ÐµÑ€ÐµÐ²ÑŒÑ Ð¸ траву на чужой земле. + </notification> + <notification name="NoCopyPermsNoObject"> + Ðе удалоÑÑŒ Ñкопировать: вам не разрешено копировать объект «[OBJ_NAME]». + </notification> + <notification name="NoTransPermsNoObject"> + Ðе удалоÑÑŒ Ñкопировать: объект «[OBJ_NAME]» Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ½ÐµÑти к вам. + </notification> + <notification name="AddToNavMeshNoCopy"> + Ðе удалоÑÑŒ Ñкопировать: объект «[OBJ_NAME]» отноÑитÑÑ Ðº навигационной Ñетке. + </notification> + <notification name="DupeWithNoRootsSelected"> + Выбран дубликат без корневых объектов. + </notification> + <notification name="CantDupeCuzRegionIsFull"> + Ðевозможно дублировать объекты: регион заполнен. + </notification> + <notification name="CantDupeCuzParcelNotFound"> + Ðевозможно дублировать объекты: не удалоÑÑŒ найти их учаÑток. + </notification> + <notification name="CantCreateCuzParcelFull"> + ÐÐµÐ»ÑŒÐ·Ñ Ñоздать объект: +учаÑток уже заполнен. + </notification> + <notification name="RezAttemptFailed"> + Ðе удалоÑÑŒ выложить объект. + </notification> + <notification name="ToxicInvRezAttemptFailed"> + Ðевозможно Ñоздать Ñлемент, который вызвал проблемы в Ñтом регионе. + </notification> + <notification name="InvItemIsBlacklisted"> + Ðтот предмет Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð² черном ÑпиÑке. + </notification> + <notification name="NoCanRezObjects"> + Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ð°Ð¼ не разрешено Ñоздавать объекты. + </notification> + <notification name="LandSearchBlocked"> + ПоиÑк по земле заблокирован. +Ð’Ñ‹ провели Ñлишком много операций поиÑка за короткое времÑ. +Повторите попытку через минуту. + </notification> + <notification name="NotEnoughResourcesToAttach"> + ÐедоÑтаточно Ñвободных реÑурÑов Ñкриптинга Ð´Ð»Ñ Ð¿Ñ€Ð¸ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°! + </notification> + <notification name="YouDiedAndGotTPHome"> + Ð’Ñ‹ умерли и были телепортированы в ваше домашнее меÑтоположение + </notification> + <notification name="EjectComingSoon"> + Вам запрещено здеÑÑŒ приÑутÑтвовать; у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ [EJECT_TIME] Ñек, чтобы покинуть Ñто меÑто. + </notification> + <notification name="NoEnterServerFull"> + Вам нет доÑтупа в Ñтот регион: +Ñерпер переполнен. + </notification> + <notification name="SaveBackToInvDisabled"> + Сохранение в инвентаре отключено. + </notification> + <notification name="NoExistNoSaveToContents"> + ÐÐµÐ»ÑŒÐ·Ñ Ñохранить «[OBJ_NAME]» в Ñодержимом объекта: объект, из которого оно было выложено, уже не ÑущеÑтвует. + </notification> + <notification name="NoModNoSaveToContents"> + ÐÐµÐ»ÑŒÐ·Ñ Ñохранить «[OBJ_NAME]» в Ñодержимом объекта: вам не разрешено изменÑÑ‚ÑŒ объект «[DEST_NAME]». + </notification> + <notification name="NoSaveBackToInvDisabled"> + Ðевозможно Ñохранить «[OBJ_NAME]» в инвентаре: Ñта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ð°. + </notification> + <notification name="NoCopyNoSelCopy"> + ÐÐµÐ»ÑŒÐ·Ñ Ñкопировать выбранное: вам не разрешено копировать объект «[OBJ_NAME]». + </notification> + <notification name="NoTransNoSelCopy"> + Ðевозможно Ñкопировать выбранный предмет: объект «[OBJ_NAME]» не переноÑитÑÑ. + </notification> + <notification name="NoTransNoCopy"> + Ðевозможно Ñкопировать выбранный предмет: объект «[OBJ_NAME]» не переноÑитÑÑ. + </notification> + <notification name="NoPermsNoRemoval"> + Удаление объекта «[OBJ_NAME]» из ÑимулÑтора запрещено ÑиÑтемой разрешений. + </notification> + <notification name="NoModNoSaveSelection"> + ÐÐµÐ»ÑŒÐ·Ñ Ñохранить выбранное: вам не разрешено изменÑÑ‚ÑŒ объект «[OBJ_NAME]». + </notification> + <notification name="NoCopyNoSaveSelection"> + Ðевозможно Ñохранить выбранный предмет: объект «[OBJ_NAME]» не копируетÑÑ. + </notification> + <notification name="NoModNoTaking"> + ÐÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð±Ñ€Ð°Ñ‚ÑŒ выбранное: вам не разрешено изменÑÑ‚ÑŒ объект «[OBJ_NAME]». + </notification> + <notification name="RezDestInternalError"> + ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: неизвеÑтный тип меÑта назначениÑ. + </notification> + <notification name="DeleteFailObjNotFound"> + Ðевозможно удалить: объект не найден + </notification> + <notification name="SorryCantEjectUser"> + Ðевозможно выброÑить Ñтого пользователÑ. + </notification> + <notification name="RegionSezNotAHome"> + Вам не разрешено уÑтанавливать Ñвое домашнее меÑтоположение в Ñтом регионе. + </notification> + <notification name="HomeLocationLimits"> + Задать домашнее меÑтоположение можно только на вашей земле или в Инфохабе материка. + </notification> + <notification name="HomePositionSet"> + Задано положение дома. + </notification> + <notification name="AvatarEjected"> + Ðватар выброшен. + </notification> + <notification name="AvatarEjectFailed"> + Ðе удалоÑÑŒ выброÑить: у Ð²Ð°Ñ Ð½ÐµÑ‚ прав админиÑтратора на Ñтом учаÑтке. + </notification> + <notification name="CantMoveObjectParcelFull"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить объект «[OBJECT_NAME]» в позицию «[OBJ_POSITION]» региона [REGION_NAME]: учаÑток уже заполнен. + </notification> + <notification name="CantMoveObjectParcelPerms"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить объект «[OBJECT_NAME]» в позицию +«[OBJ_POSITION]» региона [REGION_NAME]: вашим объектам не разрешено приÑутÑтвовать на Ñтом учаÑтке. + </notification> + <notification name="CantMoveObjectParcelResources"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить объект «[OBJECT_NAME]» в позицию +«[OBJ_POSITION]» региона [REGION_NAME]: на Ñтом учаÑтке недоÑтаточно реÑурÑов Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ объекта. + </notification> + <notification name="CantMoveObjectRegionVersion"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить объект «[OBJECT_NAME]» в позицию +[OBJ_POSITION] региона [REGION_NAME]: в другом регионе работает ÑÑ‚Ð°Ñ€Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÑимулÑтора, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ðµ поддерживает прием Ñтого объекта через границу регионов. + </notification> + <notification name="CantMoveObjectNavMesh"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить объект «[OBJECT_NAME]» в позицию +«[OBJ_POSITION]» региона [REGION_NAME]: вам не разрешено изменÑÑ‚ÑŒ навигационную Ñетку за пределами региона. + </notification> + <notification name="CantMoveObjectWTF"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить объект «[OBJECT_NAME]» в позицию +[OBJ_POSITION] региона [REGION_NAME] по неизвеÑтной причине. ([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на изменение Ñтого объекта + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + ÐÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ физику Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°, который отноÑитÑÑ Ðº навигационной Ñетке. + </notification> + <notification name="CantEnablePhysKeyframedObj"> + ÐÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ физику Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð² Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ð¼Ð¸ кадрами. + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + ÐÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ физику Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° -- недоÑтаточно земельных реÑурÑов. + </notification> + <notification name="CantEnablePhysCostTooGreat"> + ÐÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ физику Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° Ñ Ñ€Ð°Ñходом реÑурÑов физики больше [MAX_OBJECTS] + </notification> + <notification name="PhantomWithConcavePiece"> + Ðтот объект не может Ñодержать вогнутых Ñлементов: Ñто фантом, который отноÑитÑÑ Ðº навигационной Ñетке. + </notification> + <notification name="UnableAddItem"> + Ðевозможно добавить предмет! + </notification> + <notification name="UnableEditItem"> + Редактирование невозможно! + </notification> + <notification name="NoPermToEdit"> + Редактирование не разрешено. + </notification> + <notification name="NoPermToCopyInventory"> + Ðе разрешено копировать Ñтот инвентарь. + </notification> + <notification name="CantSaveItemDoesntExist"> + ÐÐµÐ»ÑŒÐ·Ñ Ñохранить в Ñодержимом объекта: предмет уже не ÑущеÑтвует. + </notification> + <notification name="CantSaveItemAlreadyExists"> + ÐÐµÐ»ÑŒÐ·Ñ Ñохранить в Ñодержимом объекта: предмет Ñ Ñ‚Ð°ÐºÐ¸Ð¼ названием уже еÑÑ‚ÑŒ в инвентаре + </notification> + <notification name="CantSaveModifyAttachment"> + ÐÐµÐ»ÑŒÐ·Ñ Ñохранить в Ñодержимом объекта: Ñто приведет к изменению разрешений прикрепленного объекта. + </notification> + <notification name="TooManyScripts"> + Слишком много Ñкриптов. + </notification> + <notification name="UnableAddScript"> + Ðевозможно добавить Ñкрипт! + </notification> + <notification name="AssetServerTimeoutObjReturn"> + Сервер активов не ответил в заданное времÑ. Объект возвращен в ÑимулÑтор. + </notification> + <notification name="RegionDisablePhysicsShapes"> + Ð’ Ñтом регионе не разрешены фигуры Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑкими данными. + </notification> + <notification name="NoModNavmeshAcrossRegions"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ навигационную Ñетку за пределами региона. + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + ÐÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ ÑвойÑтва физики Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° Ñтого типа. + </notification> + <notification name="NoSetRootPrimWithNoShape"> + ÐÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ корневой примитив без фигуры. + </notification> + <notification name="NoRegionSupportPhysMats"> + Ð’ Ñтом регионе не разрешены материалы Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑкими данными. + </notification> + <notification name="OnlyRootPrimPhysMats"> + ÐаÑтройка материалов Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑкими данными разрешена только Ð´Ð»Ñ ÐºÐ¾Ñ€Ð½ÐµÐ²Ñ‹Ñ… примитивов. + </notification> + <notification name="NoSupportCharacterPhysMats"> + ПриÑвоение перÑонажам материалов Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑкими данными еще не поддерживаетÑÑ. + </notification> + <notification name="InvalidPhysMatProperty"> + Одно или неÑколько ÑвойÑтв указанного материала Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑкими данными недопуÑтимы. + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + Ðе разрешаетÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ тип Ñтыковки меш-объекта. + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + Ðе разрешаетÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ форму меш-объекта + </notification> + <notification name="FullRegionCantEnter"> + Вам нет доÑтупа в Ñтот регион: \nрегион заполнен. + </notification> + <notification name="LinkFailedOwnersDiffer"> + СвÑзь невозможна -- разные владельцы + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + СвÑзь невозможна – Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ навигационную Ñетку за пределами региона. + </notification> + <notification name="LinkFailedNoPermToEdit"> + СвÑзь невозможна: у Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° редактирование. + </notification> + <notification name="LinkFailedTooManyPrims"> + СвÑзь невозможна -- Ñлишком много примитивов + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + СвÑзь невозможна -- Ð½ÐµÐ»ÑŒÐ·Ñ ÑвÑзать некопируемый и непереноÑимый объекты + </notification> + <notification name="LinkFailedNothingLinkable"> + СвÑзь невозможна -- нет ÑвÑзываемых объектов. + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + СвÑзь невозможна -- Ñлишком много перÑонажей Ñ Ð¿Ð¾Ð¸Ñком пути + </notification> + <notification name="LinkFailedInsufficientLand"> + СвÑзь невозможна -- недоÑтаточно земельных реÑурÑов + </notification> + <notification name="LinkFailedTooMuchPhysics"> + Объект иÑпользует Ñлишком много реÑурÑов физики -- динамичеÑкое поведение отключено. + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + Ð’Ñ‹ были телепортированы домой объектом «[OBJECT_NAME]» на учаÑтке «[PARCEL_NAME]» + </notification> + <notification name="TeleportedHomeByObject"> + Ð’Ñ‹ были телепортированы домой объектом «[OBJECT_NAME]» + </notification> + <notification name="TeleportedByAttachment"> + Ð’Ñ‹ были телепортированы прикрепленным объектом [ITEM_ID] + </notification> + <notification name="TeleportedByObjectOnParcel"> + Ð’Ñ‹ были телепортированы объектом «[OBJECT_NAME]» на учаÑтке «[PARCEL_NAME]» + </notification> + <notification name="TeleportedByObjectOwnedBy"> + Ð’Ñ‹ были телепортированы объектом «[OBJECT_NAME]», владелец – [OWNER_ID] + </notification> + <notification name="TeleportedByObjectUnknownUser"> + Ð’Ñ‹ были телепортированы объектом «[OBJECT_NAME]», владелец неизвеÑтен. + </notification> + <notification name="CantCreateObjectRegionFull"> + Ðевозможно Ñоздать запрошенный объект. Регион уже заполнен. + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ñоединить неÑколько объектов к одной точке. + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + ЗдеÑÑŒ Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздать неÑколько объектов. + </notification> + <notification name="UnableToCreateObjTimeOut"> + Ðевозможно Ñоздать запрошенный объект. Объекта нет в базе данных. + </notification> + <notification name="UnableToCreateObjUnknown"> + Ðевозможно Ñоздать запрошенный объект. ИÑтекло Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа. Повторите попытку. + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + Ðевозможно Ñоздать запрошенный объект. Повторите попытку. + </notification> + <notification name="RezFailureTookTooLong"> + Ðе удалоÑÑŒ выложить, загрузка нужного объекта длитÑÑ Ñлишком долго. + </notification> + <notification name="FailedToPlaceObjAtLoc"> + Ðе удалоÑÑŒ помеÑтить объект в указанное меÑто. Повторите попытку. + </notification> + <notification name="CantCreatePlantsOnLand"> + Вам Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать раÑÑ‚ÐµÐ½Ð¸Ñ Ð½Ð° Ñтой земле. + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + Ðевозможно воÑÑтановить объект. Ðе найдена Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð² игровом мире. + </notification> + <notification name="CantRezObjectInvalidMeshData"> + Ðевозможно выложить объект: его данные Ñетки неверны. + </notification> + <notification name="CantRezObjectTooManyScripts"> + Ðевозможно выложить объект: в Ñтом регионе уже Ñликом много Ñкриптов. + </notification> + <notification name="CantCreateObjectNoAccess"> + Ваши привилегии доÑтупа не разрешают Ñоздание объектов на Ñтом меÑте. + </notification> + <notification name="CantCreateObject"> + Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ð°Ð¼ не разрешено Ñоздавать объекты. + </notification> + <notification name="InvalidObjectParams"> + Ðеверные параметры объекта + </notification> + <notification name="CantDuplicateObjectNoAcess"> + Ваши привилегии доÑтупа не разрешают дублирование объектов на Ñтом меÑте. + </notification> + <notification name="CantChangeShape"> + Вам не разрешено изменÑÑ‚ÑŒ Ñту фигуру. + </notification> + <notification name="NoAccessToClaimObjects"> + Ваши привилегии доÑтупа не разрешают претендовать на объекты на Ñтом меÑте. + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + Ðе удалоÑÑŒ передать: вам не разрешено передавать объекты Ð´Ð»Ñ Ñтой группы. + </notification> + <notification name="NoPrivsToBuyObject"> + Ваши привилегии доÑтупа не разрешают покупать объекты на Ñтом меÑте. + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + Ðевозможно приÑоединить объект: на нем Ñидит аватар. + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + Ð”ÐµÑ€ÐµÐ²ÑŒÑ Ð¸ траву Ð½ÐµÐ»ÑŒÐ·Ñ Ð½Ð¾Ñить как прикрепленные объекты. + </notification> + <notification name="CantAttachGroupOwnedObjs"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸ÑоединÑÑ‚ÑŒ объекты, принадлежащие группе. + </notification> + <notification name="CantAttachObjectsNotOwned"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸ÐºÑ€ÐµÐ¿Ð»ÑÑ‚ÑŒ объекты, которыми вы не владеете. + </notification> + <notification name="CantAttachNavmeshObjects"> + Ðевозможно приÑоединить объекты, которые отноÑÑÑ‚ÑÑ Ðº навигационной Ñетке. + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ñоединить объект: вам не разрешено его перемещать. + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + ÐедоÑтаточно Ñвободных реÑурÑов Ñкриптинга Ð´Ð»Ñ Ð¿Ñ€Ð¸ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°! + </notification> + <notification name="CantDropItemTrialUser"> + ЗдеÑÑŒ Ð½ÐµÐ»ÑŒÐ·Ñ ÑбраÑывать объекты; перейдите в беÑплатную облаÑÑ‚ÑŒ Ð´Ð»Ñ Ð³Ð¾Ñтей. + </notification> + <notification name="CantDropMeshAttachment"> + ÐÐµÐ»ÑŒÐ·Ñ ÑбраÑывать прикрепленные меш-объекты. ОтÑоедините их в инвентарь, а затем выложите в игровой мир. + </notification> + <notification name="CantDropAttachmentNoPermission"> + Ðе удалоÑÑŒ ÑброÑить прикрепленный объект: вам не разрешено оÑтавлÑÑ‚ÑŒ его здеÑÑŒ. + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + Ðе удалоÑÑŒ ÑброÑить прикрепленный объект: не хватает Ñвободных земельных реÑурÑов. + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + Ðе удалоÑÑŒ ÑброÑить прикрепленные объекты: не хватает Ñвободных реÑурÑов. + </notification> + <notification name="CantDropObjectFullParcel"> + ÐÐµÐ»ÑŒÐ·Ñ ÑброÑить объект здеÑÑŒ. УчаÑток уже заполнен. + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + ÐÐµÐ»ÑŒÐ·Ñ ÐºÐ¾ÑнутьÑÑ/взÑÑ‚ÑŒ Ñтот объект: вы забанены на Ñтом учаÑтке. + </notification> + <notification name="PlzNarrowDeleteParams"> + Уточните параметры удалениÑ. + </notification> + <notification name="UnableToUploadAsset"> + Ðевозможно отправить актив. + </notification> + <notification name="CantTeleportCouldNotFindUser"> + Ðе удалоÑÑŒ найти Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ð¸ домой + </notification> + <notification name="GodlikeRequestFailed"> + режим творца недоÑтупен + </notification> + <notification name="GenericRequestFailed"> + не удалоÑÑŒ выполнить общий Ð·Ð°Ð¿Ñ€Ð¾Ñ + </notification> + <notification name="CantUploadPostcard"> + Ðевозможно отправить открытку. Повторите попытку позже. + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + Ðевозможно получить данные Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¾Ð²Ð¾Ð³Ð¾ уведомлениÑ. + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + Ðевозможно отправить групповое уведомление -- не разрешено. + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + Ðевозможно отправить групповое уведомление -- не удалоÑÑŒ Ñобрать инвентарь. + </notification> + <notification name="CantParceInventoryInNotice"> + Ðевозможно проанализировать инвентарь, указанный в уведомлении. + </notification> + <notification name="TerrainUploadFailed"> + Ðе удалоÑÑŒ загрузить ландшафт. + </notification> + <notification name="TerrainFileWritten"> + Файл ландшафта запиÑан. + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + Файл ландшафта запиÑан, начинаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°... + </notification> + <notification name="TerrainBaked"> + Ландшафт готов. + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + Отключены только первые 10 выбранных объектов. Обновите Ñкран и выберите объекты Ñнова, еÑли требуетÑÑ. + </notification> + <notification name="UpdateViewerBuyParcel"> + Ð”Ð»Ñ Ð¿Ð¾ÐºÑƒÐ¿ÐºÐ¸ Ñтого учаÑтка необходимо обновить клиент. + </notification> + <notification name="CantBuyParcelNotForSale"> + Ðевозможно купить, Ñтот учаÑток не предназначен Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸. + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + Ðевозможно купить: цена или площадь земли изменилиÑÑŒ. + </notification> + <notification name="CantBuyParcelNotAuthorized"> + Вам не разрешено покупать Ñтот учаÑток. + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + Ð’Ñ‹ не можете приобреÑти Ñтот учаÑток: он уже ожидает Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÑƒÐ¿ÐºÐ¸ + </notification> + <notification name="CantBuildOverflowParcel"> + ЗдеÑÑŒ Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать объекты – учаÑток будет переполнен. + </notification> + <notification name="SelectedMultipleOwnedLand"> + Ð’Ñ‹ выбрали землю Ñ Ñ€Ð°Ð·Ð½Ñ‹Ð¼Ð¸ владельцами. Выберите меньшую облаÑÑ‚ÑŒ и повторите попытку. + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + Выбрано недоÑтаточно арендуемых учаÑтков Ð´Ð»Ñ Ð²ÑтуплениÑ. + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + ÐÐµÐ»ÑŒÐ·Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÑŒ землю.\nВыбрано больше одного учаÑтка.\nВыберите меньшую территорию. + </notification> + <notification name="CantDivideLandCantFindParcel"> + ÐÐµÐ»ÑŒÐ·Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÑŒ землю.\nÐе удалоÑÑŒ найти учаÑток.\nСообщите об Ñтой неполадке: Справка -> Сообщить об ошибке... + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + Ðевозможно разделить землю. Выбран веÑÑŒ учаÑток.\nПопробуйте выбрать территорию поменьше. + </notification> + <notification name="LandHasBeenDivided"> + Ð—ÐµÐ¼Ð»Ñ Ñ€Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð°. + </notification> + <notification name="PassPurchased"> + Ð’Ñ‹ приобрели пропуÑк. + </notification> + <notification name="RegionDisallowsClassifieds"> + Ð’ регионе не разрешены рекламные объÑвлениÑ. + </notification> + <notification name="LandPassExpireSoon"> + Ваш пропуÑк на Ñту землю Ñкоро закончитÑÑ. + </notification> + <notification name="CantSitNoSuitableSurface"> + Ðет подходÑщей поверхноÑти, чтобы ÑеÑÑ‚ÑŒ. Попробуйте в другом меÑте. + </notification> + <notification name="CantSitNoRoom"> + ЗдеÑÑŒ нет меÑта, чтобы ÑеÑÑ‚ÑŒ. Попробуйте в другом меÑте. + </notification> + <notification name="ClaimObjectFailedNoPermission"> + Ðевозможно претендовать на объект: у Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ + </notification> + <notification name="ClaimObjectFailedNoMoney"> + Ðевозможно претендовать на объект: у Ð²Ð°Ñ Ð½Ðµ хватает L$. + </notification> + <notification name="CantDeedGroupLand"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚ÑŒ землю, принадлежащую группе. + </notification> + <notification name="BuyObjectFailedNoMoney"> + Ðе удалоÑÑŒ купить объект: у Ð²Ð°Ñ Ð½Ðµ хватает L$. + </notification> + <notification name="BuyInventoryFailedNoMoney"> + Ðе удалоÑÑŒ купить инвентарь: у Ð²Ð°Ñ Ð½Ðµ хватает L$. + </notification> + <notification name="BuyPassFailedNoMoney"> + У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтаточно L$, чтобы заплатить за проход на Ñту землю. + </notification> + <notification name="CantBuyPassTryAgain"> + Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ пропуÑк. Повторите попытку позже. + </notification> + <notification name="CantCreateObjectParcelFull"> + Ðевозможно Ñоздать объект:\nучаÑток заполнен. + </notification> + <notification name="FailedPlacingObject"> + Ðе удалоÑÑŒ помеÑтить объект в указанное меÑто. Повторите попытку. + </notification> + <notification name="CantCreateLandmarkForEvent"> + Ðевозможно Ñоздать закладку Ð´Ð»Ñ ÑобытиÑ. + </notification> + <notification name="GodBeatsFreeze"> + Сила творца одолевает заморозку! + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + Ðе удалоÑÑŒ выполнить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° оÑобые ÑпоÑобноÑти. Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрирован. + </notification> + <notification name="ExpireExplanation"> + СиÑтема ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ðµ может обработать ваш запроÑ. ИÑтекло Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа. + </notification> + <notification name="DieExplanation"> + СиÑтема не может обработать ваш запроÑ. + </notification> + <notification name="AddPrimitiveFailure"> + ÐедоÑтаточно денег Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸Ð¼Ð¸Ñ‚Ð¸Ð²Ð°. + </notification> + <notification name="RezObjectFailure"> + ÐедоÑтаточно денег Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°. + </notification> + <notification name="ResetHomePositionNotLegal"> + ÐедопуÑтимое домашнее меÑтоположение; воÑÑтановлено Ñтандартное меÑтоположение. + </notification> + <notification name="CantInviteRegionFull"> + Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ не можете никого приглаÑить к Ñебе: регион уже заполнен. Повторите попытку позже. + </notification> + <notification name="CantSetHomeAtRegion"> + Вам не разрешено уÑтанавливать Ñвое домашнее меÑтоположение в Ñтом регионе. + </notification> + <notification name="ListValidHomeLocations"> + Задать домашнее меÑтоположение можно только на вашей земле или в Инфохабе материка. + </notification> + <notification name="SetHomePosition"> + Домашнее меÑтоположение задано. + </notification> + <notification name="CantDerezInventoryError"> + Ðевозможно забрать объект: Ñбой инвентарÑ. + </notification> + <notification name="CantCreateRequestedInv"> + Ðевозможно Ñоздать требуемый инвентарь. + </notification> + <notification name="CantCreateRequestedInvFolder"> + Ðевозможно Ñоздать требуемую папку инвентарÑ. + </notification> + <notification name="CantCreateInventory"> + Ðевозможно Ñоздать Ñтот инвентарь. + </notification> + <notification name="CantCreateLandmark"> + Ðевозможно Ñоздать закладку. + </notification> + <notification name="CantCreateOutfit"> + Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздать коÑтюм. Попробуйте через минуту. + </notification> + <notification name="InventoryNotForSale"> + Инвентарь не Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸. + </notification> + <notification name="CantFindInvItem"> + Ðе удалоÑÑŒ найти предмет из инвентарÑ. + </notification> + <notification name="CantFindObject"> + Ðе удалоÑÑŒ найти объект. + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð² Ñтом регионе запрещен перевод денег на объекты. + </notification> + <notification name="CantPayNoAgent"> + ÐепонÑтно, кому платить. + </notification> + <notification name="CantDonateToPublicObjects"> + ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð´Ð°Ð²Ð°Ñ‚ÑŒ L$ за общедоÑтупные объекты. + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + Ðе удалоÑÑŒ Ñоздать инвентарь в объекте игрового мира. + </notification> + <notification name="UserBalanceOrLandUsageError"> + Ðе удалоÑÑŒ обновить клиент из-за внутренней ошибки. Отображаемый в клиенте Ð±Ð°Ð»Ð°Ð½Ñ L$ или владение учаÑтками могут не ÑоответÑтвовать дейÑтвительному баланÑу на Ñерверах. + </notification> + <notification name="LargePrimAgentIntersect"> + ÐÐµÐ»ÑŒÐ·Ñ Ñоздавать большие примитивы, которые переÑекаютÑÑ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ игроками. Повторите попытку, когда другие игроки уйдут. + </notification> + <notification name="PreferenceChatClearLog"> + Будут удалены журналы предыдущих разговоров и вÑе резервные копии Ñтих файлов. + <usetemplate ignoretext="Подтверждать удаление журнала предыдущих разговоров." name="okcancelignore" notext="Отмена" yestext="OK"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + Будут удалены запиÑи вÑех предыдущих разговоров. СпиÑок прошедших разговоров не изменитÑÑ. Ð’Ñе файлы Ñ Ñ€Ð°ÑширениÑми .txt и txt.backup в папке [FOLDER] будут удалены. + <usetemplate ignoretext="Подтверждать удаление запиÑей." name="okcancelignore" notext="Отмена" yestext="OK"/> + </notification> + <notification name="PreferenceChatPathChanged"> + Ðевозможно перемеÑтить файлы. ВоÑÑтановлен прежний путь. + <usetemplate ignoretext="Ðевозможно перемеÑтить файлы. ВоÑÑтановлен прежний путь." name="okignore" yestext="OK"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/ru/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/ru/panel_avatar_list_item.xml index 75e396222f..4866bb7ed6 100644 --- a/indra/newview/skins/default/xui/ru/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/ru/panel_avatar_list_item.xml @@ -27,5 +27,6 @@ <icon name="permission_edit_mine_icon" tool_tip="Ðтот друг может изменÑÑ‚ÑŒ, удалÑÑ‚ÑŒ или брать ваши объекты"/> <icon name="permission_map_icon" tool_tip="Ðтот друг может видеть Ð²Ð°Ñ Ð½Ð° карте"/> <icon name="permission_online_icon" tool_tip="Ðтот друг может видеть ваш ÑÑ‚Ð°Ñ‚ÑƒÑ Ð² Ñети"/> + <button name="info_btn" tool_tip="Дополнительно"/> <button name="profile_btn" tool_tip="Смотреть профиль"/> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/ru/panel_block_list_sidetray.xml index 214ca8bf3a..70a1b25996 100644 --- a/indra/newview/skins/default/xui/ru/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/ru/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> - <text name="title_text"> - Черный ÑпиÑок - </text> - <scroll_list name="blocked" tool_tip="СпиÑок заблокированных жителей"/> - <button label="Заблокировать жителÑ" name="Block resident..." tool_tip="Выберите Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸"/> - <button label="Блокировать объект по имени" name="Block object by name..." tool_tip="Выберите объект Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ по имени"/> - <button label="Разблокировать" name="Unblock" tool_tip="Удалить объект или Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð· ÑпиÑка заблокированных"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="Фильтр" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ жителем или объектом"/> + <menu_button name="view_btn" tool_tip="Параметры Ñортировки"/> + <menu_button name="plus_btn" tool_tip="Выберите Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ объект Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸"/> + <button name="unblock_btn" tool_tip="Удалить объект или Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð· ÑпиÑка заблокированных"/> + </panel> + <block_list name="blocked" tool_tip="СпиÑок заблокированных жителей"/> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/ru/panel_conversation_list_item.xml new file mode 100644 index 0000000000..4fdb4f9122 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(загрузка)"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/ru/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/ru/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..98fe7b99be --- /dev/null +++ b/indra/newview/skins/default/xui/ru/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="Ð’ÐºÐ»ÑŽÑ‡Ð°Ñ Ð³Ð¾Ð»Ð¾Ñовой чат"/> + <icon name="unread_ims_icon" tool_tip="За Ð²Ñ€ÐµÐ¼Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ отÑутÑÑ‚Ð²Ð¸Ñ Ð¿Ñ€Ð¸ÑˆÐ»Ð¸ ÑообщениÑ"/> + <button name="delete_btn" tool_tip="Удалить Ñту запиÑÑŒ"/> +</panel> diff --git a/indra/newview/skins/default/xui/ru/panel_group_list_item.xml b/indra/newview/skins/default/xui/ru/panel_group_list_item.xml index 7f000fb5a0..b043ffbbe2 100644 --- a/indra/newview/skins/default/xui/ru/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/ru/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="ÐеизвеÑтно"/> + <button name="info_btn" tool_tip="Дополнительно"/> <button name="profile_btn" tool_tip="Смотреть профиль"/> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_people.xml b/indra/newview/skins/default/xui/ru/panel_people.xml index 607921f2d6..7da7fb3191 100644 --- a/indra/newview/skins/default/xui/ru/panel_people.xml +++ b/indra/newview/skins/default/xui/ru/panel_people.xml @@ -14,81 +14,53 @@ <string name="no_filtered_friends_msg"> Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/people/[SEARCH_TERM] поиÑком]. </string> - <string name="people_filter_label" value="Фильтр Ð´Ð»Ñ Ð»ÑŽÐ´ÐµÐ¹"/> - <string name="groups_filter_label" value="Фильтр Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿"/> <string name="no_filtered_groups_msg" value="Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/groups/[SEARCH_TERM] поиÑком]."/> <string name="no_groups_msg" value="Ищете группу, чтобы приÑоединитьÑÑ Ðº ней? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/groups поиÑком]."/> <string name="MiniMapToolTipMsg" value="[REGION](Двойной щелчок открывает карту, shift+перетÑгивание – обзор)"/> <string name="AltMiniMapToolTipMsg" value="[REGION](Двойной щелчок – телепортациÑ, shift+перетÑгивание – обзор)"/> - <filter_editor label="Фильтр" name="filter_input"/> <tab_container name="tabs"> <panel label="РЯДОМ" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="Опции"/> - <button name="add_friend_btn" tool_tip="Добавить выбранного Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² ÑпиÑок друзей"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="Фильтр Ð´Ð»Ñ Ð»ÑŽÐ´ÐµÐ¹" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ жителем"/> + <menu_button name="nearby_view_btn" tool_tip="Параметры проÑмотра/Ñортировки"/> + <button name="add_friend_btn" tool_tip="Предложить жителю дружбу"/> + <dnd_button name="nearby_del_btn" tool_tip="Удалить выбранного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð· друзей"/> </panel> </panel> - <panel label="МОИ ДРУЗЬЯ" name="friends_panel"> + <panel label="ДРУЗЬЯ" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="Фильтр Ð´Ð»Ñ Ð»ÑŽÐ´ÐµÐ¹" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ жителем"/> + <menu_button name="friends_view_btn" tool_tip="Параметры проÑмотра/Ñортировки"/> + <button name="friends_add_btn" tool_tip="Предложить жителю дружбу"/> + <dnd_button name="friends_del_btn" tool_tip="Удалить выбранного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð· друзей"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="Онлайн"/> <accordion_tab name="tab_all" title="Ð’Ñе"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="Показать дополнительные параметры"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="Предложить жителю дружбу"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="Удалить выбранного Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð· ÑпиÑка друзей"/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="МОИ ГРУППЫ" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="Опции"/> - <button name="plus_btn" tool_tip="ПриÑоединитьÑÑ Ðº группе/Ñоздать новую группу"/> - <button name="activate_btn" tool_tip="Ðктивировать выбранную группу"/> + <panel label="ГРУППЫ" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="Фильтр Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ группой"/> + <menu_button name="groups_view_btn" tool_tip="Параметры проÑмотра/Ñортировки"/> + <menu_button name="plus_btn" tool_tip="ПриÑоединитьÑÑ Ðº группе/Ñоздать новую группу"/> + <dnd_button name="minus_btn" tool_tip="Покинуть выбранную группу"/> </panel> </panel> <panel label="ÐЕДÐÐ’ÐИЕ" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="Опции"/> - <button name="add_friend_btn" tool_tip="Добавить выбранного Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² ÑпиÑок друзей"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="Фильтр Ð´Ð»Ñ Ð»ÑŽÐ´ÐµÐ¹" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ жителем"/> + <menu_button name="recent_view_btn" tool_tip="Параметры проÑмотра/Ñортировки"/> + <button name="add_friend_btn" tool_tip="Предложить жителю дружбу"/> + <dnd_button name="recent_del_btn" tool_tip="Удалить выбранного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð· друзей"/> </panel> </panel> + <panel label="БЛОКИРОВÐÐ" name="blocked_panel"> + <panel label="Черный ÑпиÑок жителей и объектов" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="Профиль" name="view_profile_btn" tool_tip="Показать изображение, группы и прочую информацию о жителе"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="IM" name="im_btn" tool_tip="Ðачать ÑÐµÐ°Ð½Ñ IM"/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="Звонок" name="call_btn" tool_tip="Позвонить Ñтому жителю"/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="ПоделитьÑÑ" name="share_btn" tool_tip="ПоделитьÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð¼ из инвентарÑ"/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="ТелепортациÑ" name="teleport_btn" tool_tip="Предложить телепортацию"/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="Профиль группы" name="group_info_btn" tool_tip="Показать информацию о группе"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="Групповой чат" name="chat_btn" tool_tip="Открыть ÑÐµÐ°Ð½Ñ Ñ‡Ð°Ñ‚Ð°"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="Звонок группе" name="group_call_btn" tool_tip="Позвонить Ñтой группе"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml index 9283fc9e6e..6383fc8c2c 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="ТекÑтовый чат" name="chat"> - <text name="font_size"> - Размер шрифта: - </text> - <radio_group name="chat_font_size"> - <radio_item label="Мелкий" name="radio" value="0"/> - <radio_item label="Средний" name="radio2" value="1"/> - <radio_item label="Крупный" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="иÑтина" label="ВоÑпроизводить анимацию ввода текÑта при общении" name="play_typing_animation"/> - <check_box label="ОтправлÑÑ‚ÑŒ мне ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ почте, когда Ð¼ÐµÐ½Ñ Ð½ÐµÑ‚ в Ñети" name="send_im_to_email"/> - <check_box label="ВеÑти журнал текÑтового IM и чата" name="plain_text_chat_history"/> - <check_box label="Чат в пузырьках" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - Показывать ÑообщениÑ: - </text> - <text name="requires_restart_label"> - (требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк) - </text> - <radio_group name="chat_window" tool_tip="Показывать IM-ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² отдельных окнах или же в одном окне Ñ Ð½ÐµÑколькими вкладками (требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк)"> - <radio_item label="Ð’ отдельных окнах" name="radio" value="0"/> - <radio_item label="Ðа вкладках" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - Включить вÑплывающие ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð½Ð¾Ð²Ñ‹Ð¼Ð¸ репликами в чате: - </text> - <check_box label="Групповой чат" name="EnableGroupChatPopups" tool_tip="Отображать вÑплывающие ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ поÑвлении Ñообщений в групповом чате"/> - <check_box label="ТекÑтовые чаты" name="EnableIMChatPopups" tool_tip="Отображать вÑплывающие ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ получении IM-Ñообщений"/> - <spinner label="Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²Ñплывающих реплик:" name="nearby_toasts_lifetime"/> - <spinner label="Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ñ‚ÑƒÑ…Ð°Ð½Ð¸Ñ Ð²Ñплывающих реплик:" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="иÑтина" label="ВоÑпроизводить анимацию ввода текÑта при общении" name="play_typing_animation"/> + <check_box label="ОтправлÑÑ‚ÑŒ мне ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ почте, когда Ð¼ÐµÐ½Ñ Ð½ÐµÑ‚ в Ñети" name="send_im_to_email"/> + <check_box label="Только Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¸ группы могут звонить мне и отправлÑÑ‚ÑŒ IM" name="voice_call_friends_only_check"/> + <text name="font_size"> + Размер шрифта: + </text> + <combo_box name="chat_font_size"> + <item label="Мелкий" name="Small" value="0"/> + <item label="Средний" name="Medium" value="1"/> + <item label="Крупный" name="Large" value="2"/> + </combo_box> + <check_box label="Чат в пузырьках" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ + </text> + <text name="friend_ims"> + IM друзей: + </text> + <combo_box name="FriendIMOptions"> + <item label="Открыть окно разговоров" name="OpenConversationsWindow" value="openconversations"/> + <item label="Сообщение во вÑплывающем окне" name="PopUpMessage" value="вÑплывание"/> + <item label="Мигание кнопки на панели инÑтрументов" name="FlashToolbarButton" value="мигание"/> + <item label="Ðет" name="None" value="нет"/> + </combo_box> + <text name="non_friend_ims"> + IM чужих: + </text> + <combo_box name="NonFriendIMOptions"> + <item label="Открыть окно разговоров" name="OpenConversationsWindow" value="openconversations"/> + <item label="Сообщение во вÑплывающем окне" name="PopUpMessage" value="вÑплывание"/> + <item label="Мигание кнопки на панели инÑтрументов" name="FlashToolbarButton" value="мигание"/> + <item label="Ðет" name="None" value="нет"/> + </combo_box> + <text name="conference_ims"> + IM конференции: + </text> + <combo_box name="ConferenceIMOptions"> + <item label="Открыть окно разговоров" name="OpenConversationsWindow" value="openconversations"/> + <item label="Сообщение во вÑплывающем окне" name="PopUpMessage" value="вÑплывание"/> + <item label="Мигание кнопки на панели инÑтрументов" name="FlashToolbarButton" value="мигание"/> + <item label="Ðет" name="None" value="нет"/> + </combo_box> + <text name="group_chat"> + Групповой чат: + </text> + <combo_box name="GroupChatOptions"> + <item label="Открыть окно разговоров" name="OpenConversationsWindow" value="openconversations"/> + <item label="Сообщение во вÑплывающем окне" name="PopUpMessage" value="вÑплывание"/> + <item label="Мигание кнопки на панели инÑтрументов" name="FlashToolbarButton" value="мигание"/> + <item label="Ðет" name="None" value="нет"/> + </combo_box> + <text name="nearby_chat"> + Локальный чат: + </text> + <combo_box name="NearbyChatOptions"> + <item label="Открыть окно разговоров" name="OpenConversationsWindow" value="openconversations"/> + <item label="Сообщение во вÑплывающем окне" name="PopUpMessage" value="вÑплывание"/> + <item label="Мигание кнопки на панели инÑтрументов" name="FlashToolBarButton" value="мигание"/> + <item label="Ðет" name="None" value="нет"/> + </combo_box> + <text name="notifications_alert"> + Ð”Ð»Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð³Ð¾ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð²Ñех уведомлений вызовите меню «Общение > Ðе беÑпокоить». + </text> + </panel> + <panel> + <text name="play_sound"> + Звук: + </text> + <check_box label="Ðовый разговор" name="new_conversation"/> + <check_box label="ВходÑщий голоÑовой вызов" name="incoming_voice_call"/> + <check_box label="Предложение телепортации" name="teleport_offer"/> + <check_box label="Предложение инвентарÑ" name="inventory_offer"/> + </panel> + <panel> + <button label="ОчиÑтить журнал..." name="clear_log"/> + <button label="Удалить запиÑи..." name="delete_transcripts"/> + <button label="Обзор..." label_selected="Обзор" name="log_path_button"/> + </panel> <button label="Перевод..." name="ok_btn"/> <button label="Ðвтозамена..." name="autoreplace_showgui"/> <button label="Проверка правопиÑаниÑ..." name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_general.xml b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml index d1bfedf2d8..c7a850f78a 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml @@ -68,9 +68,9 @@ <combo_box.item label="никогда" name="item4"/> </combo_box> <text name="text_box3"> - Ответ в режиме «ЗанÑт»: + Ответ в режиме «Ðе беÑпокоить»: </text> - <text_editor name="busy_response"> + <text_editor name="do_not_disturb_response"> log_in_to_change </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml index e9dd3760b5..5502530ca4 100644 --- a/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="Купить объект" name="Buyobject"/> <combo_box.item label="Заплатить за объект" name="Payobject"/> <combo_box.item label="Открыть" name="Open"/> + <combo_box.item label="Приблизить" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index f9ded799bf..d7d4df4a37 100644 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -137,7 +137,7 @@ Выйти </string> <string name="create_account_url"> - http://join.secondlife.com/index.php?lang=ru-RU&sourceid=[sourceid] + http://join.secondlife.com/?sourceid=[sourceid] </string> <string name="LoginFailedViewerNotPermitted"> У клиента, которым вы пользуетеÑÑŒ, больше нет доÑтупа к игре Second Life. Загрузить новую верÑию клиента можно по адреÑу @@ -619,7 +619,7 @@ support@secondlife.com. <string name="AvatarAway"> Ðет на меÑте </string> - <string name="AvatarBusy"> + <string name="AvatarDoNotDisturb"> Ðе беÑпокоить </string> <string name="AvatarMuted"> @@ -856,6 +856,12 @@ support@secondlife.com. <string name="ST_NO_JOINT"> Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ объект ROOT или JOINT. </string> + <string name="NearbyChatTitle"> + Локальный чат + </string> + <string name="NearbyChatLabel"> + (Локальный чат) + </string> <string name="whisper"> шепчет: </string> @@ -919,12 +925,15 @@ support@secondlife.com. <string name="ControlYourCamera"> УправлÑÑ‚ÑŒ камерой </string> - <string name="TeleportYourAgent"> - Телепортировать Ð²Ð°Ñ - </string> <string name="NotConnected"> Ðет Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ </string> + <string name="AgentNameSubst"> + (Ð’Ñ‹) + </string> + <string name="TeleportYourAgent"> + Телепортировать Ð²Ð°Ñ + </string> <string name="SIM_ACCESS_PG"> Общий </string> @@ -1006,18 +1015,6 @@ support@secondlife.com. <string name="dictionary_files"> Словари </string> - <string name="AvatarSetNotAway"> - Ðа меÑте - </string> - <string name="AvatarSetAway"> - Ðет на меÑте - </string> - <string name="AvatarSetNotBusy"> - Ðе занÑÑ‚(а) - </string> - <string name="AvatarSetBusy"> - Ðе беÑпокоить - </string> <string name="shape"> Фигура </string> @@ -1986,8 +1983,8 @@ support@secondlife.com. <string name="PanelContentsNewScript"> Ðовый Ñкрипт </string> - <string name="BusyModeResponseDefault"> - У адреÑата вашего ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ð½ ÑÑ‚Ð°Ñ‚ÑƒÑ Â«Ðе беÑпокоить». Ваше Ñообщение вÑе равно будет отображено на панели IM Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра позже. + <string name="DoNotDisturbModeResponseDefault"> + Ðтот житель включил режим «Ðе беÑпокоить» и увидит ваше Ñообщение позже. </string> <string name="MuteByName"> (по имени) @@ -2100,9 +2097,6 @@ support@secondlife.com. <string name="GroupMoneyDate"> [weekday,datetime,utc], [day,datetime,utc] [mth,datetime,utc] [year,datetime,utc] </string> - <string name="ViewerObjectContents"> - Контент - </string> <string name="AcquiredItems"> Купленные вещи </string> @@ -3871,7 +3865,7 @@ support@secondlife.com. ОблаÑÑ‚ÑŒ общей дозволенноÑти </string> <string name="LocationCtrlSeeAVsTooltip"> - Ð’Ñе жители Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… учаÑтков могут видеть аватары и общатьÑÑ Ð² чате + Ðватары на Ñтом учаÑтке невидимы и неÑлышимы Ð´Ð»Ñ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð¾Ð² Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… учаÑтков </string> <string name="LocationCtrlPathfindingDirtyTooltip"> Возможны неполадки подвижных объектов в Ñтом регионе, пока регион не будет воÑÑтановлен. @@ -3948,6 +3942,12 @@ support@secondlife.com. <string name="IM_unblock_only_groups_friends"> Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñтого ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñнимите флажок «Только Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¸ группы могут звонить мне и отправлÑÑ‚ÑŒ IM» в окне «ÐаÑтройки/ПриватноÑть». </string> + <string name="OnlineStatus"> + Онлайн + </string> + <string name="OfflineStatus"> + Оффлайн + </string> <string name="answered_call"> Ðа ваш звонок ответили </string> @@ -3957,6 +3957,9 @@ support@secondlife.com. <string name="you_joined_call"> Ð’Ñ‹ приÑоединилиÑÑŒ к голоÑовой беÑеде </string> + <string name="you_auto_rejected_call-im"> + ГолоÑовой вызов автоматичеÑки отклонен, так как включен режим «Ðе беÑпокоить». + </string> <string name="name_started_call"> Житель [NAME] начал голоÑовую беÑеду </string> @@ -3973,7 +3976,7 @@ support@secondlife.com. СоединÑетÑÑ... </string> <string name="conference-title"> - Ð¡Ð¿Ð¾Ð½Ñ‚Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ + Чат Ñ Ð½ÐµÑколькими учаÑтниками </string> <string name="conference-title-incoming"> ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ñ Ð¶Ð¸Ñ‚ÐµÐ»ÐµÐ¼ [AGENT_NAME] @@ -4865,6 +4868,9 @@ support@secondlife.com. <string name="Command_Chat_Label"> Чат </string> + <string name="Command_Conversations_Label"> + Разговоры + </string> <string name="Command_Compass_Label"> ÐšÐ¾Ð¼Ð¿Ð°Ñ </string> @@ -4940,6 +4946,9 @@ support@secondlife.com. <string name="Command_Chat_Tooltip"> ОбменивайтеÑÑŒ текÑтовыми репликами Ñ Ð»ÑŽÐ´ÑŒÐ¼Ð¸ вокруг Ð²Ð°Ñ </string> + <string name="Command_Conversations_Tooltip"> + Поговорить Ñо вÑеми + </string> <string name="Command_Compass_Tooltip"> ÐšÐ¾Ð¼Ð¿Ð°Ñ </string> @@ -5069,4 +5078,13 @@ support@secondlife.com. <string name="UserDictionary"> [Пользователь] </string> + <string name="logging_calls_disabled_log_empty"> + Разговоры не запиÑываютÑÑ. Чтобы начать запиÑÑŒ разговора, в меню «ÐаÑтройки > Чат» выберите «СохранÑÑ‚ÑŒ: только журнал» или «СохранÑÑ‚ÑŒ: журнал и запиÑи». + </string> + <string name="logging_calls_disabled_log_not_empty"> + Разговоры больше не будут запиÑыватьÑÑ. Чтобы воÑÑтановить запиÑÑŒ разговора, в меню «ÐаÑтройки > Чат» выберите «СохранÑÑ‚ÑŒ: только журнал» или «СохранÑÑ‚ÑŒ: журнал и запиÑи». + </string> + <string name="logging_calls_enabled_log_empty"> + Ðет зарегиÑтрированных разговоров. ЕÑли вы обратитеÑÑŒ к кому-то или наоборот, в журнале поÑвитÑÑ Ð½Ð¾Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ. + </string> </strings> diff --git a/indra/newview/skins/default/xui/tr/floater_conversation_log.xml b/indra/newview/skins/default/xui/tr/floater_conversation_log.xml new file mode 100644 index 0000000000..5f8dac506f --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="SOHBET GÃœNLÜĞÜ"> + <panel name="buttons_panel"> + <filter_editor label="KiÅŸileri Filtrele" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="Gösterme/sıralama seçenekleri"/> + <menu_button name="conversations_gear_btn" tool_tip="Seçilen kiÅŸi veya grup üzerindeki eylemler"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_conversation_preview.xml b/indra/newview/skins/default/xui/tr/floater_conversation_preview.xml new file mode 100644 index 0000000000..84403dfd68 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="KONUÅžMA:"> + <floater.string name="Title"> + KONUÅžMA: [NAME] + </floater.string> + <text name="page_label" value="Sayfa"/> +</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_im_container.xml b/indra/newview/skins/default/xui/tr/floater_im_container.xml index 4451d1d309..6504430b3c 100644 --- a/indra/newview/skins/default/xui/tr/floater_im_container.xml +++ b/indra/newview/skins/default/xui/tr/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="SOHBETLER"/> +<multi_floater name="floater_im_box" title="SOHBETLER"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="Gösterme/sıralama seçenekleri"/> + <button name="add_btn" tool_tip="Yeni bir sohbet baÅŸlat"/> + <button name="speak_btn" tool_tip="Mikrofonunuzu kullanarak kiÅŸilerle konuÅŸun"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="Bu listeyi Daralt/GeniÅŸlet"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="Bu panoyu daralt"/> + <text name="stub_textbox"> + Sohbet ayrı bir pencerede. [secondlife:/// Bunu geri getir.] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/tr/floater_im_session.xml b/indra/newview/skins/default/xui/tr/floater_im_session.xml index bed08b36c6..8ce8f0fe13 100644 --- a/indra/newview/skins/default/xui/tr/floater_im_session.xml +++ b/indra/newview/skins/default/xui/tr/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="Kime" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] sohbete davet edildi."/> + <floater.string name="multiple_participants_added" value="[NAME] sohbete davet edildi."/> + <floater.string name="tooltip_to_separate_window" value="Bu sohbeti ayrı bir pencereye taşı"/> + <floater.string name="tooltip_to_main_window" value="Bu sohbeti ana pencereye geri taşı"/> + <floater.string name="start_call_button_tooltip" value="Ses baÄŸlantısını aç"/> + <floater.string name="end_call_button_tooltip" value="Ses baÄŸlantısını kapat"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="Bu panoyu daralt"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="Katılımcı listesini daralt"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="Katılımcı listesini geniÅŸlet"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="Gösterme/sıralama seçenekleri"/> + <menu_button name="gear_btn" tool_tip="Seçilen kiÅŸi üzerindeki eylemler"/> + <button name="add_btn" tool_tip="Bu sohbete birini ekle"/> + <button name="voice_call_btn" tool_tip="Ses baÄŸlantısını aç"/> + <button name="close_btn" tool_tip="Bu sohbeti bitir"/> + <button name="expand_collapse_btn" tool_tip="Bu panoyu Daralt/GeniÅŸlet"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Sohbeti çevir" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="Kime" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="Mesaj panelini gösterir/gizler"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/tr/floater_incoming_call.xml b/indra/newview/skins/default/xui/tr/floater_incoming_call.xml index adb03c2dff..0f2b27241e 100644 --- a/indra/newview/skins/default/xui/tr/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/tr/floater_incoming_call.xml @@ -10,7 +10,7 @@ anonim </floater.string> <floater.string name="VoiceInviteP2P"> - arıyor. + sizi arıyor. </floater.string> <floater.string name="VoiceInviteAdHoc"> bir Sesli Sohbet aramasına bir konferans araması ile katıldı. @@ -25,9 +25,9 @@ [CURRENT_CHAT] sohbetinden ayrılıp, bu sesli sohbete katılmak istiyor musunuz? </floater.string> <text name="question"> - [CURRENT_CHAT] sohbetinden ayrılıp, bu sesli sohbete katılmak istiyor musunuz? + Yanıtlarsanız, mevcut sesli sohbetinizle baÄŸlantınız kesilecek. </text> - <button label="Kabul Et" label_selected="Kabul Et" name="Accept"/> - <button label="Reddet" label_selected="Reddet" name="Reject"/> - <button label="AÄ° BaÅŸlat" name="Start IM"/> + <button label="Yanıtla" label_selected="Yanıtla" name="Accept"/> + <button label="Yok say" label_selected="Yok say" name="Reject"/> + <button label="Bunun yerine AÄ° aç" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/tr/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/tr/floater_pathfinding_console.xml index 6eecc7fb77..35f47e6dfa 100644 --- a/indra/newview/skins/default/xui/tr/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/tr/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Göster: </text> - <check_box label="Dünya" name="show_world"/> + <check_box label="Test" name="show_world"/> <check_box label="Sadece hareket ettirilebilir nesneler" name="show_world_movables_only"/> <check_box label="Navigasyon örgüsü" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml index 889425f23a..42483c09e1 100644 --- a/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml @@ -19,7 +19,7 @@ <button label="Varsayılan" label_selected="Varsayılan" name="Default"/> <button label="BoÅŸ" label_selected="BoÅŸ" name="Blank"/> <button label="Hiçbiri" label_selected="Hiçbiri" name="None"/> - <check_box initial_value="true" label="Canlı Önizleme" name="apply_immediate_check"/> + <check_box initial_value="true" label="Åžimdi uygula" name="apply_immediate_check"/> <text name="preview_disabled" value="Önizleme Devre Dışı"/> <filter_editor label="Dokuları Filtrele" name="inventory search editor"/> <check_box initial_value="false" label="Klasörleri göster" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/tr/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/tr/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..ec350bee60 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="SOHBET SES DÃœZEYÄ°"> + <slider label="Sesli Sohbet" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_voice_effect.xml b/indra/newview/skins/default/xui/tr/floater_voice_effect.xml index 3534a3fe90..7a157244cd 100644 --- a/indra/newview/skins/default/xui/tr/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/tr/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Yerler" name="voice_effects" title="SES ÅžEKÄ°LLENDÄ°RME"> +<floater label="Yerler" name="voice_effects" title="SES ÅžEKÄ°LLENDÄ°RME ÖNÄ°ZLEMESÄ°"> <string name="no_voice_effect"> (Ses Åžekillendirme Yok) </string> diff --git a/indra/newview/skins/default/xui/tr/floater_voice_volume.xml b/indra/newview/skins/default/xui/tr/floater_voice_volume.xml new file mode 100644 index 0000000000..acf99d6199 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="SES DÃœZEYÄ°"> + <slider name="volume_slider" tool_tip="Ses düzeyi" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/tr/menu_cof_gear.xml b/indra/newview/skins/default/xui/tr/menu_cof_gear.xml index f910e1fe91..9480d30029 100644 --- a/indra/newview/skins/default/xui/tr/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/tr/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="Gear COF"> <menu label="Yeni Giysiler" name="COF.Gear.New_Clothes"/> - <menu label="Yeni Vücut Bölümleri" name="COF.Geear.New_Body_Parts"/> + <menu label="Yeni Vücut Bölümleri" name="COF.Gear.New_Body_Parts"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_conversation.xml b/indra/newview/skins/default/xui/tr/menu_conversation.xml new file mode 100644 index 0000000000..31404f2501 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="Sohbeti kapat" name="close_conversation"/> + <menu_item_call label="Ses sohbetini aç" name="open_voice_conversation"/> + <menu_item_call label="Ses baÄŸlantısını kes" name="disconnect_from_voice"/> + <menu_item_call label="Profili Göster" name="view_profile"/> + <menu_item_call label="AÄ°" name="im"/> + <menu_item_call label="Işınlama teklif et" name="offer_teleport"/> + <menu_item_call label="Sesli arama" name="voice_call"/> + <menu_item_call label="Sohbet geçmiÅŸi..." name="chat_history"/> + <menu_item_call label="ArkadaÅŸ ekle" name="add_friend"/> + <menu_item_call label="Arkadaşı çıkar" name="remove_friend"/> + <menu_item_call label="ArkadaÅŸları çıkar" name="remove_friends"/> + <menu_item_call label="Gruba davet et..." name="invite_to_group"/> + <menu_item_call label="YakınlaÅŸtır" name="zoom_in"/> + <menu_item_call label="Harita" name="map"/> + <menu_item_call label="PaylaÅŸ" name="share"/> + <menu_item_call label="Öde" name="pay"/> + <menu_item_check label="Sesi Engelle" name="block_unblock"/> + <menu_item_check label="Metni Engelle" name="MuteText"/> + <menu_item_call label="Grup Profili" name="group_profile"/> + <menu_item_call label="Grubu EtkinleÅŸtir" name="activate_group"/> + <menu_item_call label="Gruptan Ayrıl" name="leave_group"/> + <context_menu label="Moderatör Seçenekleri" name="Moderator Options"> + <menu_item_check label="Metin sohbetine izin ver" name="AllowTextChat"/> + <menu_item_call label="Bu katılımcıyı engelle" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Bu katılımcının engellemesini kaldır" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Herkesi engelle" name="ModerateVoiceMute"/> + <menu_item_call label="Herkesin engellemesini kaldır" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/tr/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..9e91780eb8 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="AÄ°..." name="IM"/> + <menu_item_call label="Sesli arama..." name="Call"/> + <menu_item_call label="Sohbet geçmiÅŸini aç..." name="Chat history"/> + <menu_item_call label="Profili Göster" name="View Profile"/> + <menu_item_call label="Işınlama Teklif Et" name="teleport"/> + <menu_item_call label="ArkadaÅŸ Ekle" name="add_friend"/> + <menu_item_call label="Arkadaşı Çıkar" name="remove_friend"/> + <menu_item_call label="Gruba davet et..." name="Invite"/> + <menu_item_call label="Harita" name="Map"/> + <menu_item_call label="PaylaÅŸ" name="Share"/> + <menu_item_call label="Öde" name="Pay"/> + <menu_item_check label="Engelle/Engeli Kaldır" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/tr/menu_conversation_log_view.xml new file mode 100644 index 0000000000..9a77eaadd9 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="Ada göre sırala" name="sort_by_name"/> + <menu_item_check label="Tarihe göre sırala" name="sort_by_date"/> + <menu_item_check label="ArkadaÅŸlar üstte olacak ÅŸekilde sırala" name="sort_by_friends"/> + <menu_item_call label="Yakındaki sohbet geçmiÅŸini göster..." name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_im_conversation.xml b/indra/newview/skins/default/xui/tr/menu_im_conversation.xml new file mode 100644 index 0000000000..3b9738edce --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="Profili Göster" name="View Profile"/> + <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friend"/> + <menu_item_call label="Arkadaşı çıkar" name="remove_friend"/> + <menu_item_call label="Işınlama teklif et" name="offer_teleport"/> + <menu_item_call label="Gruba davet et..." name="invite_to_group"/> + <menu_item_call label="Sohbet geçmiÅŸi..." name="chat_history"/> + <menu_item_call label="YakınlaÅŸtır" name="zoom_in"/> + <menu_item_call label="Harita" name="map"/> + <menu_item_call label="PaylaÅŸ" name="Share"/> + <menu_item_call label="Öde" name="Pay"/> + <menu_item_check label="Sesi Engelle" name="Block/Unblock"/> + <menu_item_check label="Metni Engelle" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/tr/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..c4d4357ac9 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="Daraltılmış görünüm" name="compact_view"/> + <menu_item_check label="GeniÅŸletilmiÅŸ görünüm" name="expanded_view"/> + <menu_item_check label="Zamanı göster" name="IMShowTime"/> + <menu_item_check label="Bire bir sohbetlerde adları göster" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_object_icon.xml b/indra/newview/skins/default/xui/tr/menu_object_icon.xml index 34a2661d8a..3d5c68d9d3 100644 --- a/indra/newview/skins/default/xui/tr/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/tr/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="Nesne Profili..." name="Object Profile"/> <menu_item_call label="Engelle..." name="Block"/> + <menu_item_call label="Haritada Göster" name="show_on_map"/> + <menu_item_call label="Nesne Konumuna Işınla" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml b/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml index d2e7e7107a..674041e9c9 100644 --- a/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="Yeni Saç" name="New Hair"/> <menu_item_call label="Yeni Gözler" name="New Eyes"/> </menu> + <menu_item_call label="Tüm klasörleri geniÅŸlet" name="expand"/> + <menu_item_call label="Tüm klasörleri daralt" name="collapse"/> <menu_item_call label="Dış Görünümü Yeniden Adlandır" name="rename"/> <menu_item_call label="Dış Görünümü Sil" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_participant_view.xml b/indra/newview/skins/default/xui/tr/menu_participant_view.xml new file mode 100644 index 0000000000..e9411ff350 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="Sohbetleri türe göre sırala" name="sort_sessions_by_type"/> + <menu_item_check label="Sohbetleri ada göre sırala" name="sort_sessions_by_name"/> + <menu_item_check label="Sohbetleri son faaliyetlere göre sırala" name="sort_sessions_by_recent"/> + <menu_item_check label="Katılımcıları ada göre sırala" name="sort_participants_by_name"/> + <menu_item_check label="Katılımcıları son faaliyetlere göre sırala" name="sort_participants_by_recent"/> + <menu_item_call label="Sohbet tercihleri..." name="chat_preferences"/> + <menu_item_call label="Gizlilik tercihleri..." name="privacy_preferences"/> + <menu_item_check label="Sohbet günlüğü..." name="Conversation"/> + <menu_item_check label="Yakındaki sohbeti çevir" name="Translate_chat"/> + <menu_item_check label="Çeviri ayarları..." name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/tr/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..2bf1101b48 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="Engellemeyi Kaldır" name="unblock"/> + <menu_item_call label="Profil..." name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/tr/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..a869e2ae7d --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="Sakini ada göre engelle..." name="block_resident_by_name"/> + <menu_item_call label="Nesneyi ada göre engelle" name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/tr/menu_people_blocked_view.xml new file mode 100644 index 0000000000..14b3de3a9f --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="Ada göre sırala" name="sort_by_name"/> + <menu_item_check label="Türe göre sırala" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_friends_view.xml b/indra/newview/skins/default/xui/tr/menu_people_friends_view.xml new file mode 100644 index 0000000000..609584d6a6 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Ada Göre Sırala" name="sort_name"/> + <menu_item_check label="Duruma Göre Sırala" name="sort_status"/> + <menu_item_check label="KiÅŸi Simgelerini Göster" name="view_icons"/> + <menu_item_check label="Verilen Ä°zinleri Göster" name="view_permissions"/> + <menu_item_check label="Sohbet Günlüğünü Göster..." name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_groups.xml b/indra/newview/skins/default/xui/tr/menu_people_groups.xml index 9f2946e310..743b01844d 100644 --- a/indra/newview/skins/default/xui/tr/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/tr/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="Bilgileri Görüntüle" name="View Info"/> <menu_item_call label="Sohbet" name="Chat"/> - <menu_item_call label="Ara" name="Call"/> + <menu_item_call label="Sesli arama" name="Call"/> <menu_item_call label="EtkinleÅŸtir" name="Activate"/> <menu_item_call label="Ayrıl" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_groups_view.xml b/indra/newview/skins/default/xui/tr/menu_people_groups_view.xml new file mode 100644 index 0000000000..e550b20add --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Grup Simgelerini Göster" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_nearby.xml b/indra/newview/skins/default/xui/tr/menu_people_nearby.xml index ee859a9450..2d61461c91 100644 --- a/indra/newview/skins/default/xui/tr/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/tr/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="Profili Göster" name="View Profile"/> - <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friend"/> - <menu_item_call label="Arkadaşı Çıkar" name="Remove Friend"/> - <menu_item_call label="AÄ°" name="IM"/> - <menu_item_call label="Ara" name="Call"/> - <menu_item_call label="Harita" name="Map"/> - <menu_item_call label="PaylaÅŸ" name="Share"/> - <menu_item_call label="Öde" name="Pay"/> - <menu_item_check label="Engelle/Engeli Kaldır" name="Block/Unblock"/> - <menu_item_call label="Işınlama Teklif Et" name="teleport"/> + <menu_item_call label="Profili Göster" name="view_profile"/> + <menu_item_call label="AÄ°" name="im"/> + <menu_item_call label="Işınlama Teklif Et" name="offer_teleport"/> + <menu_item_call label="Sesli arama" name="voice_call"/> + <menu_item_call label="Sohbet geçmiÅŸini göster..." name="chat_history"/> + <menu_item_call label="ArkadaÅŸ Ekle" name="add_friend"/> + <menu_item_call label="Arkadaşı Çıkar" name="remove_friend"/> + <menu_item_call label="Gruba davet et..." name="invite_to_group"/> + <menu_item_call label="YakınlaÅŸtır" name="zoom_in"/> + <menu_item_call label="Harita" name="map"/> + <menu_item_call label="PaylaÅŸ" name="share"/> + <menu_item_call label="Öde" name="pay"/> + <menu_item_check label="Engelle/Engeli Kaldır" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/tr/menu_people_nearby_multiselect.xml index 5c89f87906..20695d98e8 100644 --- a/indra/newview/skins/default/xui/tr/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/tr/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friends"/> - <menu_item_call label="Arkadaşı Çıkar" name="Remove Friend"/> - <menu_item_call label="AÄ°" name="IM"/> - <menu_item_call label="Ara" name="Call"/> - <menu_item_call label="PaylaÅŸ" name="Share"/> - <menu_item_call label="Öde" name="Pay"/> - <menu_item_call label="Işınlama Teklif Et" name="teleport"/> + <menu_item_call label="ArkadaÅŸ Ekle" name="add_friends"/> + <menu_item_call label="Arkadaşı Çıkar" name="remove_friends"/> + <menu_item_call label="AÄ°" name="im"/> + <menu_item_call label="Ara" name="call"/> + <menu_item_call label="PaylaÅŸ" name="share"/> + <menu_item_call label="Öde" name="pay"/> + <menu_item_call label="Işınlama Teklif Et" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/tr/menu_people_nearby_view.xml new file mode 100644 index 0000000000..59ea7c145f --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="Son KonuÅŸanlara Göre Sırala" name="sort_by_recent_speakers"/> + <menu_item_check label="Ada Göre Sırala" name="sort_name"/> + <menu_item_check label="Mesafeye Göre Sırala" name="sort_distance"/> + <menu_item_check label="KiÅŸi Simgelerini Göster" name="view_icons"/> + <menu_item_check label="Haritayı Göster" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_people_recent_view.xml b/indra/newview/skins/default/xui/tr/menu_people_recent_view.xml new file mode 100644 index 0000000000..02be715ed2 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="En Sonunculara Göre Sırala" name="sort_most"/> + <menu_item_check label="Ada Göre Sırala" name="sort_name"/> + <menu_item_check label="KiÅŸi Simgelerini Göster" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_url_agent.xml b/indra/newview/skins/default/xui/tr/menu_url_agent.xml index d82b52aea8..b14a0509bf 100644 --- a/indra/newview/skins/default/xui/tr/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/tr/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Sakin Profilini Göster" name="show_agent"/> + <menu_item_call label="Profili Göster" name="show_agent"/> + <menu_item_call label="AÄ° Gönder..." name="send_im"/> + <menu_item_call label="ArkadaÅŸ Ekle..." name="add_friend"/> <menu_item_call label="Adı panoya kopyala" name="url_copy_label"/> <menu_item_call label="SLurl'yi Panoya Kopyala" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_url_objectim.xml b/indra/newview/skins/default/xui/tr/menu_url_objectim.xml index d55e34c11c..00fa3c27c2 100644 --- a/indra/newview/skins/default/xui/tr/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/tr/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Nesne Bilgilerini Göster" name="show_object"/> + <menu_item_call label="Nesne Profili..." name="show_object"/> <menu_item_call label="Haritada Göster" name="show_on_map"/> <menu_item_call label="Nesne Konumuna Işınla" name="teleport_to_object"/> <menu_item_call label="Nesne Adını panoya kopyala" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml index 28f28db6d2..6ec5e6d7a3 100644 --- a/indra/newview/skins/default/xui/tr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="Beni Anime Etmeyi Durdur" name="Stop Animating My Avatar"/> <menu_item_call label="Yürü / koÅŸ / uç..." name="Walk / run / fly"/> </menu> - <menu label="Durum" name="Status"> - <menu_item_call label="Uzakta" name="Set Away"/> - <menu_item_call label="MeÅŸgul" name="Set Busy"/> - </menu> + <menu label="Durum" name="Status"/> <menu_item_call label="L$ Satın Al..." name="Buy and Sell L$"/> <menu_item_call label="Satıcı Giden Kutusu..." name="MerchantOutbox"/> <menu_item_call label="Hesap kontrol paneli..." name="Manage My Account"/> @@ -30,14 +27,18 @@ <menu_item_call label="[APP_NAME]'den Çık" name="Quit"/> </menu> <menu label="Ä°letiÅŸim Kur" name="Communicate"> - <menu_item_check label="Sohbet..." name="Nearby Chat"/> + <menu_item_check label="Sohbetler..." name="Conversations"/> + <menu_item_check label="Yakındaki Sohbet..." name="Nearby Chat"/> <menu_item_check label="KonuÅŸ" name="Speak"/> - <menu_item_check label="Ses ayarları..." name="Nearby Voice"/> - <menu_item_check label="Ses ÅŸekillendirme..." name="ShowVoice"/> + <menu label="Ses ÅŸekillendirme" name="VoiceMorphing"> + <menu_item_check label="Ses ÅŸekillendirme yok" name="NoVoiceMorphing"/> + <menu_item_check label="Önizleme..." name="Preview"/> + <menu_item_call label="Abone ol..." name="Subscribe"/> + </menu> <menu_item_check label="Mimikler..." name="Gestures"/> - <menu_item_call label="ArkadaÅŸlar" name="My Friends"/> - <menu_item_call label="Gruplar" name="My Groups"/> - <menu_item_call label="Yakındaki kiÅŸiler" name="Active Speakers"/> + <menu_item_check label="ArkadaÅŸlar" name="My Friends"/> + <menu_item_check label="Gruplar" name="My Groups"/> + <menu_item_check label="Yakındaki kiÅŸiler" name="Active Speakers"/> <menu_item_call label="Engelleme Listesi" name="Block List"/> </menu> <menu label="Dünya" name="World"> diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml index 488702f9ca..ad92a4b478 100644 --- a/indra/newview/skins/default/xui/tr/notifications.xml +++ b/indra/newview/skins/default/xui/tr/notifications.xml @@ -516,6 +516,24 @@ Daha fazla bilgi için [_URL] adresini ziyaret etmek ister misiniz? </url> <usetemplate ignoretext="Grafik sürücüm güncel deÄŸil" name="okcancelignore" notext="Hayır" yestext="Evet"/> </notification> + <notification name="AMDOldDriver"> + Grafik yonganız için muhtemelen daha yeni bir sürücü mevcut. Grafik sürücüleri güncellemek performansınızı kayda deÄŸer ÅŸekilde artırabilir. + + Sürücü güncellemeleri için [_URL] adresini ziyaret etmek ister misiniz? + <url name="url"> + http://support.amd.com/us/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="Grafik sürücüm güncel deÄŸil" name="okcancelignore" notext="Hayır" yestext="Evet"/> + </notification> + <notification name="NVIDIAOldDriver"> + Grafik yonganız için muhtemelen daha yeni bir sürücü mevcut. Grafik sürücüleri güncellemek performansınızı kayda deÄŸer ÅŸekilde artırabilir. + + Sürücü güncellemeleri için [_URL] adresini ziyaret etmek ister misiniz? + <url name="url"> + http://www.nvidia.com/Download/index.aspx?lang=en-us + </url> + <usetemplate ignoretext="Grafik sürücüm güncel deÄŸil" name="okcancelignore" notext="Hayır" yestext="Evet"/> + </notification> <notification name="UnknownGPU"> Sisteminiz [APP_NAME] uygulamasının tanımadığı bir grafik kartı içeriyor. Bu durum genellikle [APP_NAME] uygulaması ile henüz denenmemiÅŸ yeni donanımlar kullanıldığında ortaya çıkar. Büyük olasılıkla bir sorun çıkmayacaktır, fakat grafik ayarlarınızı deÄŸiÅŸtirmeniz gerekebilir. @@ -1546,10 +1564,13 @@ Gruptan ayrılmak istiyor musunuz? Åžu anda arkadaÅŸlık teklif edilemiyor. Lütfen biraz sonra tekrar deneyin. <usetemplate name="okbutton" yestext="Tamam"/> </notification> - <notification name="BusyModeSet"> - Durumunuz MeÅŸgul olarak ayarlandı. -Sohbet ve anlık iletiler gizlenecek. Anlık iletilere MeÅŸgul durumu için belirlediÄŸiniz yanıt gönderilecek. Tüm ışınlanma teklifleri reddedilecek. Tüm envanter teklifleri Çöp Kutunuza gidecek. - <usetemplate ignoretext="Durumumu MeÅŸgul olarak deÄŸiÅŸtiriyorum" name="okignore" yestext="Tamam"/> + <notification name="DoNotDisturbModeSet"> + Rahatsız Etme açık. Gelen iletiÅŸimlerle ilgili size bilgi verilmeyecek. + +- DiÄŸer sakinlere sizin Rahatsız Etmeyin yanıtı iletilecektir (Tercihler > Genel içerisinde ayarlanır). +- Işınlanma teklifleri reddedilecektir. +- Sesli aramalar reddedilecektir. + <usetemplate ignoretext="Durumumu Rahatsız Etme moduna deÄŸiÅŸtiriyorum" name="okignore" yestext="Tamam"/> </notification> <notification name="JoinedTooManyGroupsMember"> Maksimum grup sayısına eriÅŸtiniz. Lütfen bu gruba katılmadan önce baÅŸka bir gruptan ayrılın ya da bu teklifi reddedin. @@ -2033,6 +2054,10 @@ Envanter öğesi/öğeleri taşınsın mı? Hesap geçmiÅŸinizi görüntülemek için [http://secondlife.com/account/ Kontrol Paneli] adresine gitmek istiyor musunuz? <usetemplate ignoretext="Hesap geçmiÅŸimi görüntülemek için tarayıcımı baÅŸlat" name="okcancelignore" notext="Ä°ptal" yestext="Sayfaya git"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + Mevcut bir sohbete bir kiÅŸi eklediÄŸinizde yeni bir sohbet oluÅŸturulur. Tüm katılımcılara yeni sohbet bildirimi gönderilir. + <usetemplate ignoretext="Sohbet katılımcılarının eklenmesini doÄŸrula" name="okcancelignore" notext="Ä°ptal" yestext="Tamam"/> + </notification> <notification name="ConfirmQuit"> Çıkmak istediÄŸinize emin misiniz? <usetemplate ignoretext="Çıkmadan önce doÄŸrulama iste" name="okcancelignore" notext="Çıkma" yestext="Çık"/> @@ -2107,14 +2132,14 @@ Bu nesneyi seçilen nesne ile deÄŸiÅŸtirmek istiyor musunuz? <button ignore="Hiçbir Zaman DeÄŸiÅŸtirme" name="No" text="Ä°ptal"/> </form> </notification> - <notification label="MeÅŸgul Durumu Uyarısı" name="BusyModePay"> - Durumunuz MeÅŸgul olarak ayarlanmış; bu da, bu ödemenin karşılığında teklif edilen hiçbir öğeyi almayacağınız anlamına gelir. + <notification label="Rahatsız Etme Modu Uyarısı" name="DoNotDisturbModePay"> + Rahatsız Etme seçeneÄŸini devreye aldınız. Bu ödemenin karşılığında sunulan hiçbir öğeyi almayacaksınız. -Bu iÅŸlemi tamamlamadan önce MeÅŸgul durumundan çıkmak ister misiniz? +Bu iÅŸlemi tamamlamadan önce Rahatsız Etme'yi kapatmak ister misiniz? <form name="form"> - <ignore name="ignore" text="MeÅŸgul durumundayken bir kiÅŸiye veya bir nesneye ödeme yapmak üzereyim."/> - <button ignore="Her zaman MeÅŸgul durumundan çık" name="Yes" text="Tamam"/> - <button ignore="Hiçbir zaman MeÅŸgul durumundan çıkma" name="No" text="Ä°ptal"/> + <ignore name="ignore" text="Rahatsız Etmeyin modundayken bir kiÅŸiye veya bir nesneye ödeme yapmak üzereyim"/> + <button ignore="Rahatsız Etme Modundan daima çıkılsın" name="Yes" text="Tamam"/> + <button ignore="Rahatsız Etme Modundan asla çıkılmasın" name="No" text="Ä°ptal"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2249,11 +2274,8 @@ DiÄŸer kiÅŸilerin bu konuma kolayca eriÅŸmesini saÄŸlamak için bu adrese bir we <notification name="GroupNotice"> Konu: [SUBJECT], Ä°leti: [MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> çevrimiçi - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> çevrimdışı + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> durumu: [STATUS] </notification> <notification name="AddSelfFriend"> Çok iyi biri olduÄŸunuza eminiz fakat kendinizi arkadaÅŸ olarak ekleyemezsiniz. @@ -2482,13 +2504,6 @@ Burada uçamazsınız. <notification name="DynamicPathfindingDisabled"> Bu bölgede dinamik yol bulma etkin deÄŸil. Yol bulma LSL çaÄŸrılarını kullanan komut dosyalı nesneler, bu bölgede beklendiiÄŸi gibi çalışmayabilir. </notification> - <notification name="PathfindingRebakeNavmesh"> - Bu bölgede belirli diÄŸer nesneleri deÄŸiÅŸtirmek, hareket eden baÅŸka nesnelerin yanlış davranmasına neden olabilir. Hareket eden baÅŸka nesnelerin doÄŸru davranmasını saÄŸlamak için “Bölgeyi yeniden kaydet†düğmesine tıklayın. Daha fazla bilgi edinmek için “Yardım†seçimini yapın. - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="Yardım" ignoretext="Bu bölgede belirli diÄŸer nesneleri deÄŸiÅŸtirmek, hareket eden baÅŸka nesnelerin yanlış davranmasına neden olabilir." name="okhelpignore" yestext="Tamam"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> Bir hata meydana geldi. Bir aÄŸ veya sunucu sorunu olabilir ya da oluÅŸturma haklarına sahip olmayabilirsiniz. Bazen oturumu kapatıp, tekrar açmak bu sorunu çözer. <usetemplate name="okbutton" yestext="Tamam"/> @@ -2751,7 +2766,7 @@ Kabul ediyor musunuz? <notification name="ScriptQuestionCaution"> Uyarı: '<nolink>[OBJECTNAME]</nolink>' nesnesi, Linden Dolar hesabınıza tam eriÅŸim istiyor. EÄŸer eriÅŸime izin verirseniz, süregelen bir ÅŸekilde, ilave uyarı olmaksızın, hesabınızdan herhangi bir zamanda fon çekebilir veya hesabınızı tamamen boÅŸaltabilir. -Bu türden bir talebin yerinde olması nadir bir durumdur. EÄŸer hesabınıza neden eriÅŸmek istediÄŸini tam olarak anlamıyorsanız, eriÅŸime izin vermeyin. +EÄŸer hesabınıza neden eriÅŸmek istediÄŸini tam olarak anlamıyorsanız, eriÅŸime izin vermeyin. <form name="form"> <button name="Grant" text="Tam eriÅŸime izin ver"/> <button name="Deny" text="Reddet"/> @@ -3333,4 +3348,626 @@ GiriÅŸim iptal edildi. [NUM_ITEMS] öğeyi siliyorsunuz. Devam etmek istediÄŸinize emin misiniz? <usetemplate ignoretext="Birden çok öğeyi silmek istediÄŸinize emin misiniz?" name="okcancelignore" notext="Hayır" yestext="Evet"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] sizi dondurdu. Hareket edemez veya dünyayla etkileÅŸim kuramazsınız. + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] sizi [AV_FREEZE_TIME] saniye boyunca dondurdu. Hareket edemez veya dünyayla etkileÅŸim kuramazsınız. + </notification> + <notification name="YouFrozeAvatar"> + Avatar donduruldu. + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] sizin dondurulmanızı kaldırdı. + </notification> + <notification name="AvatarUnFrozen"> + Avatar artık dondurulmuÅŸ deÄŸil. + </notification> + <notification name="AvatarFreezeFailure"> + Dondurma baÅŸarılamadı çünkü bu parsel için yönetici iznine sahip deÄŸilsiniz. + </notification> + <notification name="AvatarFreezeThaw"> + Dondurmanızın süresi sona erdi, istediÄŸinizi yapabilirsiniz. + </notification> + <notification name="AvatarCantFreeze"> + Ãœzgünüz, bu kullanıcı dondurulamaz. + </notification> + <notification name="NowOwnObject"> + Artık [OBJECT_NAME] nesnesinin sahibisiniz + </notification> + <notification name="CantRezOnLand"> + [OBJECT_POS] konumunda nesneyi oluÅŸturamazsınız çünkü bu arazinin sahibi buna izin vermiyor. Arazinin sahibini görmek için arazi aracını kullanın. + </notification> + <notification name="RezFailTooManyRequests"> + Çok fazla talep olduÄŸu için nesne oluÅŸturulamadı. + </notification> + <notification name="SitFailCantMove"> + Oturamazsınız çünkü ÅŸu anda hareket edemezsiniz. + </notification> + <notification name="SitFailNotAllowedOnLand"> + Oturamazsınız çünkü bu araziye girme izniniz yok. + </notification> + <notification name="SitFailNotSameRegion"> + Daha yakına gelmeyi deneyin. Nesne sizinle aynı bölgede olmadığı için nesnenin üzerine oturulamaz. + </notification> + <notification name="NoNewObjectRegionFull"> + Yeni nesne oluÅŸturulamıyor. Bölge dolu. + </notification> + <notification name="FailedToPlaceObject"> + Belirtilen konuma nesne yerleÅŸtirilemedi. Lütfen tekrar deneyin. + </notification> + <notification name="NoOwnNoGardening"> + Sahibi olmadığınız arazide aÄŸaçlar ve çimen oluÅŸturamazsınız. + </notification> + <notification name="NoCopyPermsNoObject"> + '[OBJ_NAME]' nesnesini kopyalama izniniz olmadığı için kopyalama baÅŸarılamadı. + </notification> + <notification name="NoTransPermsNoObject"> + '[OBJ_NAME]' nesnesi size aktarılamadığı için kopyalama baÅŸarılamadı. + </notification> + <notification name="AddToNavMeshNoCopy"> + '[OBJ_NAME]' nesnesi navmesh'e katkıda bulunduÄŸu için kopyalama baÅŸarılamadı. + </notification> + <notification name="DupeWithNoRootsSelected"> + Kök nesne seçili olmayan kopya. + </notification> + <notification name="CantDupeCuzRegionIsFull"> + Nesneler çoÄŸaltılamıyor çünkü bölge dolu. + </notification> + <notification name="CantDupeCuzParcelNotFound"> + Nesneler çoÄŸaltılamadı - Ãœzerinde oldukları parsel bulunamadı. + </notification> + <notification name="CantCreateCuzParcelFull"> + Nesne oluÅŸturulamıyor çünkü +parsel dolu. + </notification> + <notification name="RezAttemptFailed"> + Bir nesneyi oluÅŸturma giriÅŸimi baÅŸarısız oldu. + </notification> + <notification name="ToxicInvRezAttemptFailed"> + Bu bölgede hatalara yol açmış olan öğe oluÅŸturulamıyor. + </notification> + <notification name="InvItemIsBlacklisted"> + Bu envanter öğesi kara listeye alınmış. + </notification> + <notification name="NoCanRezObjects"> + Åžu anda nesne oluÅŸturmanıza izin verilmiyor. + </notification> + <notification name="LandSearchBlocked"> + Arazi Arama Engellendi. +Çok fazla sayıda arazi aramasını çok hızlı gerçekleÅŸtirdiniz. +Lütfen bir dakika sonra tekrar deneyin. + </notification> + <notification name="NotEnoughResourcesToAttach"> + Nesneyi iliÅŸtirmek için yeterli komut dosyası kaynağı mevcut deÄŸil! + </notification> + <notification name="YouDiedAndGotTPHome"> + Hayatınızı kaybettiniz ve ana konumunuza ışınlandınız + </notification> + <notification name="EjectComingSoon"> + Daha fazla burada olma izniniz yok ve ayrılmak için [EJECT_TIME] saniyeniz var. + </notification> + <notification name="NoEnterServerFull"> + Bu bölgeye giremezsiniz çünkü +sunucu dolu. + </notification> + <notification name="SaveBackToInvDisabled"> + Envantere Geri Kaydet devre dışı bırakıldı. + </notification> + <notification name="NoExistNoSaveToContents"> + '[OBJ_NAME]' nesne içeriÄŸine kaydedilemedi, çünkü oluÅŸturulurken temel alınan nesne artık mevcut deÄŸil. + </notification> + <notification name="NoModNoSaveToContents"> + '[DEST_NAME]' nesnesini deÄŸiÅŸtirme izniniz olmadığı için '[OBJ_NAME]' nesne içeriÄŸine kaydedilemedi. + </notification> + <notification name="NoSaveBackToInvDisabled"> + '[OBJ_NAME]' envantere geri kaydedilemez -- bu iÅŸlem devre dışı bırakıldı. + </notification> + <notification name="NoCopyNoSelCopy"> + '[OBJ_NAME]' nesnesini kopyalama izniniz olmadığı için seçiminizi kopyalamayazsınız. + </notification> + <notification name="NoTransNoSelCopy"> + '[OBJ_NAME]' nesnesi aktarılamaz olduÄŸu için seçiminizi kopyalayamazsınız. + </notification> + <notification name="NoTransNoCopy"> + '[OBJ_NAME]' nesnesi aktarılamaz olduÄŸu için seçiminizi kopyalayamazsınız. + </notification> + <notification name="NoPermsNoRemoval"> + Benzeticiden '[OBJ_NAME]' nesnesinin kaldırılmasına izinler sistemi izin vermiyor. + </notification> + <notification name="NoModNoSaveSelection"> + '[OBJ_NAME]' nesnesini deÄŸiÅŸtirme izniniz olmadığı için seçiminizi kaydedemezsiniz. + </notification> + <notification name="NoCopyNoSaveSelection"> + '[OBJ_NAME]' nesnesi kopyalanamaz olduÄŸu için seçiminizi kaydedemezsiniz. + </notification> + <notification name="NoModNoTaking"> + '[OBJ_NAME]' nesnesini deÄŸiÅŸtirme izniniz olmadığı için seçiminizi alamazsınız. + </notification> + <notification name="RezDestInternalError"> + Dahili Hata: Bilinmeyen hedef türü. + </notification> + <notification name="DeleteFailObjNotFound"> + Nesne bulunamadığı için silme baÅŸarılamadı + </notification> + <notification name="SorryCantEjectUser"> + Ãœzgünüz, bu kullanıcı çıkartılamaz. + </notification> + <notification name="RegionSezNotAHome"> + Bu bölge, ana konumunuzu buraya kurmanıza izin vermiyor. + </notification> + <notification name="HomeLocationLimits"> + 'Ana Konum'unuzu sadece arazinizde veya anakarada bir Bilgi Ä°stasyonu'nda ayarlayabilirsiniz. + </notification> + <notification name="HomePositionSet"> + Ana konum ayarlandı. + </notification> + <notification name="AvatarEjected"> + Avatar çıkartıldı. + </notification> + <notification name="AvatarEjectFailed"> + Çıkarma baÅŸarılamadı çünkü bu parsel için yönetici iznine sahip deÄŸilsiniz. + </notification> + <notification name="CantMoveObjectParcelFull"> + [REGION_NAME] bölgesinde '[OBJECT_NAME]' nesnesi [OBJ_POSITION] konumuna hareket ettirilemiyor çünkü parsel dolu. + </notification> + <notification name="CantMoveObjectParcelPerms"> + [REGION_NAME] bölgesinde '[OBJECT_NAME]' nesnesi [OBJ_POSITION] konumuna hareket ettirilemiyor çünkü bu parselde nesnelerinize izin verilmiyor. + </notification> + <notification name="CantMoveObjectParcelResources"> + [REGION_NAME] bölgesinde '[OBJECT_NAME]' nesnesi [OBJ_POSITION] konumuna hareket ettirilemiyor, çünkü bu parselde bu nesne için yeterli kaynak yok. + </notification> + <notification name="CantMoveObjectRegionVersion"> + [REGION_NAME] bölgesinde '[OBJECT_NAME]' nesnesi [OBJ_POSITION] konumuna hareket ettirilemiyor çünkü bölgede çalıştırılan eski versiyon, bölge deÄŸiÅŸtirme üzerinden bu nesnenin alınmasını desteklemiyor. + </notification> + <notification name="CantMoveObjectNavMesh"> + [REGION_NAME] bölgesinde '[OBJECT_NAME]' nesnesi [OBJ_POSITION] konumuna hareket ettirilemiyor çünkü navmesh'i bölge sınırları ötesinde deÄŸiÅŸtiremezsiniz. + </notification> + <notification name="CantMoveObjectWTF"> + Bilinmeyen bir nedenden ötürü [REGION_NAME] bölgesinde '[OBJECT_NAME]' nesnesi [OBJ_POSITION] konumuna hareket ettirilemiyor. ([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + Bu nesneyi deÄŸiÅŸtirme izniniz yok + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + Navmesh'e katkıda bulunan bir nesne için fizik etkinleÅŸtirilemez. + </notification> + <notification name="CantEnablePhysKeyframedObj"> + Anahtar karelenmiÅŸ nesneler için fizik etkinleÅŸtirilemez. + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + Nesne için fizik etkinleÅŸtirilemedi -- arazi kaynakları yetersiz. + </notification> + <notification name="CantEnablePhysCostTooGreat"> + Fizik kaynağı maliyeti [MAX_OBJECTS]'dan büyük nesne için fizik etkinleÅŸtirilemedi + </notification> + <notification name="PhantomWithConcavePiece"> + Bu nesne fantom olduÄŸu ve navmesh'e katkıda bulunduÄŸu için konkav bir parçaya sahip olamaz. + </notification> + <notification name="UnableAddItem"> + Öğe eklenemedi! + </notification> + <notification name="UnableEditItem"> + Bu düzenlenemiyor! + </notification> + <notification name="NoPermToEdit"> + Bunu düzenleme izni yok. + </notification> + <notification name="NoPermToCopyInventory"> + Bu envanteri kopyalama izni yok. + </notification> + <notification name="CantSaveItemDoesntExist"> + Nesne içeriklerine kaydedilemedi: Öğe artık mevcut deÄŸil. + </notification> + <notification name="CantSaveItemAlreadyExists"> + Nesne içeriklerine kaydedilemedi: Bu ada sahip öğe envanterde zaten mevcut + </notification> + <notification name="CantSaveModifyAttachment"> + Nesne içeriklerine kaydedilemedi: Bu, aksesuar izinlerini deÄŸiÅŸtirmeyi gerektirirdi. + </notification> + <notification name="TooManyScripts"> + Çok fazla komut dosyası. + </notification> + <notification name="UnableAddScript"> + Komut dosyası eklenemedi! + </notification> + <notification name="AssetServerTimeoutObjReturn"> + Varlık sunucusu zamanında yanıt vermedi. Nesne sime iade edildi. + </notification> + <notification name="RegionDisablePhysicsShapes"> + Bu bölgede fiziksel ÅŸekiller etkin deÄŸil. + </notification> + <notification name="NoModNavmeshAcrossRegions"> + Navmesh'i bölge sınırlarının ötesinde deÄŸiÅŸtiremezsiniz. + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + Bu nesne türü üzerinde fizik özellikleri ayarlanamaz. + </notification> + <notification name="NoSetRootPrimWithNoShape"> + Kök prim ÅŸekilsiz olacak ÅŸekilde ayarlanamaz. + </notification> + <notification name="NoRegionSupportPhysMats"> + Bu bölgede fiziksel malzemeler etkin deÄŸil. + </notification> + <notification name="OnlyRootPrimPhysMats"> + Sadece kök primlerin fizik malzemeleri ayarlanabilir. + </notification> + <notification name="NoSupportCharacterPhysMats"> + Karakterler üzerinde fizik malzemelerin ayarlanması henüz desteklenmiyor. + </notification> + <notification name="InvalidPhysMatProperty"> + Belirtilen fizik malzemesi özelliklerinden biri veya daha fazlası geçersiz. + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + Bir örgü nesnesinin dikiÅŸ türünü deÄŸiÅŸtiremezsiniz. + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + Bir örgü nesnesinin ÅŸeklini deÄŸiÅŸtiremezsiniz + </notification> + <notification name="FullRegionCantEnter"> + Bu bölgeye giremezsiniz çünkü \nbölge dolu. + </notification> + <notification name="LinkFailedOwnersDiffer"> + BaÄŸlantı baÅŸarısız oldu -- sahipler farklı + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + BaÄŸlntı baÅŸarılamadı -- navmesh'i bölge sınırlarının ötesinde deÄŸiÅŸtiremezsiniz. + </notification> + <notification name="LinkFailedNoPermToEdit"> + Düzenleme iznine sahip olmadığınız için baÄŸlantı baÅŸarılamadı. + </notification> + <notification name="LinkFailedTooManyPrims"> + BaÄŸlantı baÅŸarısız oldu -- çok fazla ilkel öğe var + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + BaÄŸlantı baÅŸarısız oldu -- aktarılamayanla kopyalanamayan arasında baÄŸlantı kurulamaz + </notification> + <notification name="LinkFailedNothingLinkable"> + BaÄŸlantı baÅŸarısız oldu -- baÄŸlantı verilebilecek bir ÅŸey yok. + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + BaÄŸlantı baÅŸarısız oldu -- çok fazla yol bulma karakteri var + </notification> + <notification name="LinkFailedInsufficientLand"> + BaÄŸlantı baÅŸarısız oldu -- arazi kaynakları yetersiz + </notification> + <notification name="LinkFailedTooMuchPhysics"> + Nesne çok fazla fizik kaynağı kullanıyor -- dinamikleri devre dışı bırakıldı. + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + '[PARCEL_NAME]' parseli üzerindeki '[OBJECT_NAME]' nesnesi tarafından ana konuma ışınlandınız + </notification> + <notification name="TeleportedHomeByObject"> + '[OBJECT_NAME]' nesnesi tarafından ana konuma ışınlandınız + </notification> + <notification name="TeleportedByAttachment"> + You have been teleported by an attachment on [ITEM_ID] + </notification> + <notification name="TeleportedByObjectOnParcel"> + '[PARCEL_NAME]' parseli üzerindeki '[OBJECT_NAME]' nesnesi tarafından ışınlandınız + </notification> + <notification name="TeleportedByObjectOwnedBy"> + Sahibi [OWNER_ID] olan '[OBJECT_NAME]' nesnesi tarafından ışınlandınız + </notification> + <notification name="TeleportedByObjectUnknownUser"> + Bilinmeyen bir sahibi olan '[OBJECT_NAME]' nesnesi tarafından ışınlandınız. + </notification> + <notification name="CantCreateObjectRegionFull"> + Talep edilen nesne oluÅŸturulamıyor. Bölge dolu. + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + Tek bir noktaya birden fazla nesne iliÅŸtiremezsiniz. + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + Burada birden fazla nesne oluÅŸturamazsınız. + </notification> + <notification name="UnableToCreateObjTimeOut"> + Talep edilen nesne oluÅŸturulamıyor. Nesne veri tabanında yok. + </notification> + <notification name="UnableToCreateObjUnknown"> + Talep edilen nesne oluÅŸturulamıyor. Talep zaman aşımına uÄŸradı. Lütfen tekrar deneyin. + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + Talep edilen nesne oluÅŸturulamıyor. Lütfen tekrar deneyin. + </notification> + <notification name="RezFailureTookTooLong"> + OluÅŸturma baÅŸarısız oldu, talep edilen nesnenin yüklenmesi çok zaman aldı. + </notification> + <notification name="FailedToPlaceObjAtLoc"> + Belirtilen konuma nesne yerleÅŸtirilemedi. Lütfen tekrar deneyin. + </notification> + <notification name="CantCreatePlantsOnLand"> + Bu arazide bitkiler oluÅŸturamazsınız. + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + Nesne geri yüklenemiyor. Dünya konumu bulunamadı. + </notification> + <notification name="CantRezObjectInvalidMeshData"> + Örgü verileri geçersiz olduÄŸu için nesne oluÅŸturulamadı. + </notification> + <notification name="CantRezObjectTooManyScripts"> + Bölgede zaten fazlasıyla komut dosyası olduÄŸu için nesne oluÅŸturulamadı. + </notification> + <notification name="CantCreateObjectNoAccess"> + EriÅŸim ayrıcalıklarınız orada nesne oluÅŸturmanıza izin vermiyor. + </notification> + <notification name="CantCreateObject"> + Åžu anda nesne oluÅŸturmanıza izin verilmiyor. + </notification> + <notification name="InvalidObjectParams"> + Geçersiz nesne parametreleri + </notification> + <notification name="CantDuplicateObjectNoAcess"> + EriÅŸim ayrıcalıklarınız burada nesne çoÄŸaltmanıza izin vermiyor. + </notification> + <notification name="CantChangeShape"> + Bu ÅŸekli deÄŸiÅŸtirmenize izin verilmiyor. + </notification> + <notification name="NoAccessToClaimObjects"> + EriÅŸim ayrıcalıklarınız burada nesneler üzerinde hak talebinde bulunmanıza izin vermiyor. + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + Grubunuz adına nesne devretmek için gerekli izne sahip olmadığınız için devretme baÅŸarılamadı. + </notification> + <notification name="NoPrivsToBuyObject"> + EriÅŸim ayrıcalıklarınız burada nesneler satın almanıza izin vermiyor. + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + Ãœzerinde bir avatar oturduÄŸu için nesne iliÅŸtirilemiyor. + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + AÄŸaçlar ve çimen aksesuar olarak giyilemez. + </notification> + <notification name="CantAttachGroupOwnedObjs"> + Sahibi grup olan nesneler iliÅŸtirilemiyor. + </notification> + <notification name="CantAttachObjectsNotOwned"> + Sahip olmadığınız nesneleri iliÅŸtiremezsiniz. + </notification> + <notification name="CantAttachNavmeshObjects"> + Navmesh'e katkıda bulunan nesneler iliÅŸtirilemez. + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + Nesneyi hareket ettirme izniniz olmadığı için nesneyi iliÅŸtiremiyorsanız. + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + Nesneyi iliÅŸtirmek için yeterli komut dosyası kaynağı mevcut deÄŸil! + </notification> + <notification name="CantDropItemTrialUser"> + Buraya nesne düşüremezsiniz; Ãœcretsiz Deneme alanını deneyin. + </notification> + <notification name="CantDropMeshAttachment"> + Örgü aksesuarlarını düşüremezsiniz. Envantere ayırın, sonra dünyada oluÅŸturun. + </notification> + <notification name="CantDropAttachmentNoPermission"> + Aksesuar düşürülemedi: Burada düşürme izniniz yok. + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + Aksesuar düşürülemedi: Mevcut arazi kaynakları yetersiz. + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + Aksesuarlar düşürülemedi: Mevcut kaynaklar yetersiz. + </notification> + <notification name="CantDropObjectFullParcel"> + Nesne buraya düşürülemez. Parsel dolu. + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + Bu arazi parselinde yasaklandığınız için bu nesneye dokunamıyor/tutamıyorsunuz. + </notification> + <notification name="PlzNarrowDeleteParams"> + Lütfen silme parametrelerinizi daraltın. + </notification> + <notification name="UnableToUploadAsset"> + Varlık karşıya yüklenemiyor. + </notification> + <notification name="CantTeleportCouldNotFindUser"> + Ana konuma ışınlanacak kullanıcı bulunamadı + </notification> + <notification name="GodlikeRequestFailed"> + tanrısal talep baÅŸarısız oldu + </notification> + <notification name="GenericRequestFailed"> + genel talep baÅŸarısız oldu + </notification> + <notification name="CantUploadPostcard"> + Posta kartı karşıya yüklenemiyor. Daha sonra tekrar deneyin. + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + Grup bildirimi için envanter ayrıntıları alınamadı. + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + Grup bildirimi gönderilemedi -- izin verilmiyor. + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + Grup bildirimi gönderilemedi -- envanter oluÅŸturulamadı. + </notification> + <notification name="CantParceInventoryInNotice"> + Bildirimde envanter ayrıştırılamadı. + </notification> + <notification name="TerrainUploadFailed"> + Yüzeyin karşıya yüklemesi baÅŸarılamadı. + </notification> + <notification name="TerrainFileWritten"> + Yüzey dosyası yazıldı. + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + Yüzey dosyası yazıldı, karşıdan yükleme baÅŸlatılıyor... + </notification> + <notification name="TerrainBaked"> + Yüzey kaydedildi. + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + Sadece seçilen ilk 10 nesne devre dışı bırakıldı. Gerekiyorsa yenileyin ve ilave seçimler yapın. + </notification> + <notification name="UpdateViewerBuyParcel"> + Bu parseli satın almak için görüntüleyicinizi güncelleÅŸtirmelisiniz. + </notification> + <notification name="CantBuyParcelNotForSale"> + Satın alınamıyor, bu parsel satılık deÄŸil. + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + Satın alınamıyor, satış fiyatı veya arazi bölgesi deÄŸiÅŸmiÅŸ. + </notification> + <notification name="CantBuyParcelNotAuthorized"> + Bu parsel için yetkili alıcı deÄŸilsiniz. + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + Bu parseli satın alamazsınız çünkü zaten satın alım yetkilendirmesi bekliyor + </notification> + <notification name="CantBuildOverflowParcel"> + Burada nesneler inÅŸa edemezsiniz, aksi halde parselin kaynak sınırları aşılır. + </notification> + <notification name="SelectedMultipleOwnedLand"> + Farklı sahiplere ait araziler seçtiniz. Lütfen daha küçük bir alan seçin ve tekrar deneyin. + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + Seçimde birleÅŸtirilecek yeterli sayıda lease edilmiÅŸ parsel yok. + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + Arazi bölünemedi.\nBirden fazla parsel seçili durumda.\nDaha küçük bir arazi parçası seçmeyi deneyin. + </notification> + <notification name="CantDivideLandCantFindParcel"> + Arazi bölünemiyor.\nParsel bulunamıyor.\nLütfen Yardım -> Hata Bildir ile bildirin... + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + Arazi bölünemiyor. Tüm parsel seçilidir.\nDaha küçük bir arazi parçası seçmeyi deneyin. + </notification> + <notification name="LandHasBeenDivided"> + Arazi bölündü. + </notification> + <notification name="PassPurchased"> + Bir geçiÅŸ hakkı satın aldınız. + </notification> + <notification name="RegionDisallowsClassifieds"> + Bölgede seri ilanlara izin verilmiyor. + </notification> + <notification name="LandPassExpireSoon"> + Bu arazi için geçiÅŸ hakkınız sona ermek üzere. + </notification> + <notification name="CantSitNoSuitableSurface"> + Ãœzerinde oturulabilecek uygun bir yüzey yok, baÅŸka bir noktayı deneyin. + </notification> + <notification name="CantSitNoRoom"> + Burada oturacak yer yok, baÅŸka bir yer deneyin. + </notification> + <notification name="ClaimObjectFailedNoPermission"> + Ä°zniniz olmadığı için nesne üzerinde hak talep etme baÅŸarılamadı + </notification> + <notification name="ClaimObjectFailedNoMoney"> + Sahip olduÄŸunuz L$ yeterli olmadığı için nesne üzerinde hak talep etme baÅŸarılamadı. + </notification> + <notification name="CantDeedGroupLand"> + Grubun sahip olduÄŸu araziyi devredemezsiniz. + </notification> + <notification name="BuyObjectFailedNoMoney"> + Sahip olduÄŸunuz L$ yeterli olmadığı için nesne satın alma baÅŸarılamadı. + </notification> + <notification name="BuyInventoryFailedNoMoney"> + Sahip olduÄŸunuz L$ yeterli olmadığı için envanter satın alma baÅŸarılamadı. + </notification> + <notification name="BuyPassFailedNoMoney"> + Sahibi olduÄŸunuz L$ bu araziye geçiÅŸ hakkı almanıza yeterli deÄŸil. + </notification> + <notification name="CantBuyPassTryAgain"> + Åžu anda geçiÅŸ hakkı satın alınamıyor. Daha sonra tekrar deneyin. + </notification> + <notification name="CantCreateObjectParcelFull"> + Nesne oluÅŸturulamıyor çünkü \nparsel dolu. + </notification> + <notification name="FailedPlacingObject"> + Belirtilen konuma nesne yerleÅŸtirilemedi. Lütfen tekrar deneyin. + </notification> + <notification name="CantCreateLandmarkForEvent"> + Etkinlik için yer imi oluÅŸturulamıyor. + </notification> + <notification name="GodBeatsFreeze"> + Tanrısal güçleriniz dondurmayı devre dışı bıraktı! + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + Özel yetkiler talebi baÅŸarısız oldu. Bu talep günlüğe kaydedildi. + </notification> + <notification name="ExpireExplanation"> + Sistem ÅŸu anda talebinizi iÅŸleyemiyor. Talep zaman aşımına uÄŸradı. + </notification> + <notification name="DieExplanation"> + Sistem talebinizi iÅŸleyemiyor. + </notification> + <notification name="AddPrimitiveFailure"> + Ä°lkel öğeyi oluÅŸturmak için yeterli fon yok. + </notification> + <notification name="RezObjectFailure"> + Nesneyi oluÅŸturmak için yeterli fon yok. + </notification> + <notification name="ResetHomePositionNotLegal"> + Ana konum sıfırlandı çünkü Ana konum yasal deÄŸildi. + </notification> + <notification name="CantInviteRegionFull"> + Åžu anda konumunuza kimseyi davet edemezsiniz çünkü bölge dolu. Daha sonra tekrar deneyin. + </notification> + <notification name="CantSetHomeAtRegion"> + Bu bölge, ana konumunuzu buraya kurmanıza izin vermiyor. + </notification> + <notification name="ListValidHomeLocations"> + 'Ana Konum'unuzu sadece arazinizde veya anakarada bir Bilgi Ä°stasyonu'nda ayarlayabilirsiniz. + </notification> + <notification name="SetHomePosition"> + Ana konum ayarlandı. + </notification> + <notification name="CantDerezInventoryError"> + Envanter hatasından ötürü nesne oluÅŸturulması geri alınamıyor. + </notification> + <notification name="CantCreateRequestedInv"> + Talep edilen envanter oluÅŸturulamadı. + </notification> + <notification name="CantCreateRequestedInvFolder"> + Talep edilen envanter klasörü oluÅŸturulamadı. + </notification> + <notification name="CantCreateInventory"> + Bu envanter oluÅŸturulamadı. + </notification> + <notification name="CantCreateLandmark"> + Yer imi oluÅŸturulamıyor. + </notification> + <notification name="CantCreateOutfit"> + Dış görünüm ÅŸu anda oluÅŸturulamıyor. Bir dakika sonra tekrar deneyin. + </notification> + <notification name="InventoryNotForSale"> + Envanter satılık deÄŸil. + </notification> + <notification name="CantFindInvItem"> + Envanter öğesi bulunamıyor. + </notification> + <notification name="CantFindObject"> + Nesne bulunamıyor. + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + Nesnelere para transferleri bölgede ÅŸu anda devre dışı bırakılmış durumda. + </notification> + <notification name="CantPayNoAgent"> + Kime ödeme yapılacağı belirlenemedi. + </notification> + <notification name="CantDonateToPublicObjects"> + Kamusal nesnelere L$ veremezsiniz. + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + Dünya içerisindeki nesnede envater oluÅŸturma baÅŸarısız oldu. + </notification> + <notification name="UserBalanceOrLandUsageError"> + Dahili bir hata nedeniyle görüntüleyicinizi gerektiÄŸi gibi güncelleyemedik. Görüntüleyicinizde gösterilen L$ bakiyesi veya parsel tutarı sunucular üzerinde gerçekteki bakiyenizi yansıtmayabilir. + </notification> + <notification name="LargePrimAgentIntersect"> + BaÅŸka oyuncularla kesiÅŸen büyük primler oluÅŸturulamaz. Öbür oyuncular hareket ettiÄŸinde lütfen tekrar deneyin. + </notification> + <notification name="PreferenceChatClearLog"> + Bu, geçmiÅŸ sohbetlerin günlüklerini ve bu dosyanın tüm yedeklerini silecektir. + <usetemplate ignoretext="Ben geçmiÅŸ sohbetlerin günlüğünü silmeden önce doÄŸrula." name="okcancelignore" notext="Ä°ptal" yestext="Tamam"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + Bu, tüm geçmiÅŸ sohbetlerin dökümlerini silecektir. GeçmiÅŸ sohbetlerin listesi bundan etkilenmez. [FOLDER] klasöründe .txt ve txt.backup uzantısına sahip tüm dosyalar silinecektir. + <usetemplate ignoretext="Ben dökümleri silmeden önce doÄŸrulama iste." name="okcancelignore" notext="Ä°ptal" yestext="Tamam"/> + </notification> + <notification name="PreferenceChatPathChanged"> + Dosyalar taşınamıyor. Önceki yol geri yüklendi. + <usetemplate ignoretext="Dosyalar taşınamıyor. Önceki yol geri yüklendi." name="okignore" yestext="Tamam"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/tr/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/tr/panel_avatar_list_item.xml index 7542778aca..f330bd85e8 100644 --- a/indra/newview/skins/default/xui/tr/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/tr/panel_avatar_list_item.xml @@ -27,5 +27,6 @@ <icon name="permission_edit_mine_icon" tool_tip="Bu arkadaşınız nesnelerinizi düzenleyebilir, silebilir veya alabilir"/> <icon name="permission_map_icon" tool_tip="Bu arkadaşınız haritada sizi bulabilir"/> <icon name="permission_online_icon" tool_tip="Bu arkadaşınız çevrimiçi olduÄŸunuzda sizi görebilir"/> + <button name="info_btn" tool_tip="Ek bilgi"/> <button name="profile_btn" tool_tip="Profili göster"/> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/tr/panel_block_list_sidetray.xml index 0464b7ec07..87b67e249e 100644 --- a/indra/newview/skins/default/xui/tr/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/tr/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> - <text name="title_text"> - Listeyi Engelle - </text> - <scroll_list name="blocked" tool_tip="Åžu anda engellenmiÅŸ olan Sakinler listesi"/> - <button label="KiÅŸiyi engelle" name="Block resident..." tool_tip="Engellenecek bir Sakin seç"/> - <button label="Nesneyi ada göre engelle" name="Block object by name..." tool_tip="Ada göre engellenecek bir nesne seç"/> - <button label="Engellemeyi Kaldır" name="Unblock" tool_tip="Engelleme listesinden Sakini veya nesneyi kaldır"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="Filtrele" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="Seçilen kiÅŸi veya nesne üzerindeki eylemler"/> + <menu_button name="view_btn" tool_tip="Sıralama seçenekleri"/> + <menu_button name="plus_btn" tool_tip="Engellenecek bir Sakin veya nesne seç"/> + <button name="unblock_btn" tool_tip="Engelleme listesinden Sakini veya nesneyi kaldır"/> + </panel> + <block_list name="blocked" tool_tip="Åžu anda engellenmiÅŸ olan Sakinler listesi"/> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/tr/panel_conversation_list_item.xml new file mode 100644 index 0000000000..c7227f02b6 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(yükleniyor)"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/tr/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/tr/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..79895f9c21 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="Sohbet ses dahil edildi"/> + <icon name="unread_ims_icon" tool_tip="Oturumunuz kapalıyken mesajlar geldi"/> + <button name="delete_btn" tool_tip="Bu giriÅŸi kaldır"/> +</panel> diff --git a/indra/newview/skins/default/xui/tr/panel_group_list_item.xml b/indra/newview/skins/default/xui/tr/panel_group_list_item.xml index 2bc597f2fa..f44d2b5e76 100644 --- a/indra/newview/skins/default/xui/tr/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/tr/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="Bilinmiyor"/> + <button name="info_btn" tool_tip="Ek bilgi"/> <button name="profile_btn" tool_tip="Profili göster"/> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_people.xml b/indra/newview/skins/default/xui/tr/panel_people.xml index 1a1e53bac2..08efd0aa61 100644 --- a/indra/newview/skins/default/xui/tr/panel_people.xml +++ b/indra/newview/skins/default/xui/tr/panel_people.xml @@ -14,81 +14,53 @@ Birlikte takılacak kiÅŸiler mi arıyorsunuz? [secondlife:///app/worldmap Dünya <string name="no_filtered_friends_msg"> Aradığınızı bulamadınız mı? [secondlife:///app/search/people/[SEARCH_TERM] Ara] deneyin. </string> - <string name="people_filter_label" value="KiÅŸileri Filtrele"/> - <string name="groups_filter_label" value="Grupları Filtrele"/> <string name="no_filtered_groups_msg" value="Aradığınızı bulamadınız mı? [secondlife:///app/search/groups/[SEARCH_TERM] Ara] deneyin."/> <string name="no_groups_msg" value="Katılacak Gruplar mı arıyorsunuz? [secondlife:///app/search/groups Ara] deneyin."/> <string name="MiniMapToolTipMsg" value="[REGION](Haritayı açmak için çift tıkla, yatay hareket için shift çek)"/> <string name="AltMiniMapToolTipMsg" value="[REGION](Işınlamak için çift tıkla, yatay hareket için shift çek)"/> - <filter_editor label="Filtrele" name="filter_input"/> <tab_container name="tabs"> <panel label="YAKIN" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="Seçenklr."/> - <button name="add_friend_btn" tool_tip="Seçilen Sakini arkadaÅŸ listene ekle"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="KiÅŸileri Filtrele" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="Seçilen kiÅŸi üzerindeki eylemler"/> + <menu_button name="nearby_view_btn" tool_tip="Gösterme/sıralama seçenekleri"/> + <button name="add_friend_btn" tool_tip="Bir sakine arkadaÅŸlık öner"/> + <dnd_button name="nearby_del_btn" tool_tip="Seçilen kiÅŸiyi arkadaÅŸ olarak kaldır"/> </panel> </panel> - <panel label="ARKADAÅžLARIM" name="friends_panel"> + <panel label="ARKADAÅžLAR" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="KiÅŸileri Filtrele" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="Seçilen kiÅŸi üzerindeki eylemler"/> + <menu_button name="friends_view_btn" tool_tip="Seçenekleri göster/sırala"/> + <button name="friends_add_btn" tool_tip="Bir sakine arkadaÅŸlık öner"/> + <dnd_button name="friends_del_btn" tool_tip="Seçilen kiÅŸiyi arkadaÅŸ olarak kaldır"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="Çevrimiçi"/> <accordion_tab name="tab_all" title="Tümü"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="Ä°lave seçenekleri göster"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="Bir Sakine arkadaÅŸlık öner"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="Seçilen kiÅŸiyi arkadaÅŸ Listenden çıkar"/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="GRUPLARIM" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="Seçenklr."/> - <button name="plus_btn" tool_tip="Gruba katıl/yeni grup oluÅŸtur"/> - <button name="activate_btn" tool_tip="Seçilen grubu etkinleÅŸtir"/> + <panel label="GRUPLAR" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="Grupları Filtrele" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="Seçilen grup üzerindeki eylemler"/> + <menu_button name="groups_view_btn" tool_tip="Seçenekleri göster/sırala"/> + <menu_button name="plus_btn" tool_tip="Gruba katıl/yeni grup oluÅŸtur"/> + <dnd_button name="minus_btn" tool_tip="Seçilen gruptan ayrıl"/> </panel> </panel> <panel label="SON" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="Seçenklr."/> - <button name="add_friend_btn" tool_tip="Seçilen Sakini arkadaÅŸ listene ekle"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="KiÅŸileri Filtrele" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="Seçilen kiÅŸi üzerindeki eylemler"/> + <menu_button name="recent_view_btn" tool_tip="Seçenekleri göster/sırala"/> + <button name="add_friend_btn" tool_tip="Bir sakine arkadaÅŸlık öner"/> + <dnd_button name="recent_del_btn" tool_tip="Seçilen kiÅŸiyi arkadaÅŸ olarak kaldır"/> </panel> </panel> + <panel label="ENGELLENMÄ°Åž" name="blocked_panel"> + <panel label="EngellenmiÅŸ Sakinler ve Nesneler" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="Profil" name="view_profile_btn" tool_tip="Resim, grup ve diÄŸer Sakin bilgilerini göster"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="AÄ°" name="im_btn" tool_tip="Anlık ileti oturumu aç"/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="Ara" name="call_btn" tool_tip="Bu Sakini ara"/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="PaylaÅŸ" name="share_btn" tool_tip="Bir envanter öğesini paylaÅŸ"/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="Işınla" name="teleport_btn" tool_tip="Işınlama teklif et"/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="Grup Profili" name="group_info_btn" tool_tip="Grup bilgilerini göster"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="Grup Sohbeti" name="chat_btn" tool_tip="Sohbet oturumu aç"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="Grup Araması" name="group_call_btn" tool_tip="Bu grubu ara"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml index 231e8fc5fe..aaeebdfe6e 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Metin Sohbeti" name="chat"> - <text name="font_size"> - Font büyüklüğü: - </text> - <radio_group name="chat_font_size"> - <radio_item label="Küçük" name="radio" value="0"/> - <radio_item label="Orta" name="radio2" value="1"/> - <radio_item label="Büyük" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="true" label="Sohbet sırasında yazma animasyonunu oynat" name="play_typing_animation"/> - <check_box label="Çevrimdışı olduÄŸunda AÄ°'ler e-posta ile bana gönderilsin" name="send_im_to_email"/> - <check_box label="Düz metin AÄ°'ler ve sohbet geçmiÅŸini etkinleÅŸtir" name="plain_text_chat_history"/> - <check_box label="Balon Sohbeti" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - AÄ°'leri ÅŸurada göster: - </text> - <text name="requires_restart_label"> - (tekrar baÅŸlatma gerekir) - </text> - <radio_group name="chat_window" tool_tip="Anlık Ä°letileri ayrı gezdiricilerde veya çoklu sekmelere sahip tek bir gezdiricide gösterin (tekrar baÅŸlatma gerekir)"> - <radio_item label="Ayrı Pencereler" name="radio" value="0"/> - <radio_item label="Sekmeler" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - Gelen sohbet için açılır pencereleri etkinleÅŸtir: - </text> - <check_box label="Grup Sohbetleri" name="EnableGroupChatPopups" tool_tip="Bir Grup Sohbet iletisi gönderildiÄŸinde açılır pencereleri görmek için iÅŸaretle"/> - <check_box label="AÄ° Sohbetleri" name="EnableIMChatPopups" tool_tip="Bir anlık ileti geldiÄŸinde açılır pencereleri görmek için iÅŸaretle"/> - <spinner label="Yakındaki sohbet iletilerinin vurgulanma süresi:" name="nearby_toasts_lifetime"/> - <spinner label="Yakındaki sohbet iletilerinin sönme süresi:" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="true" label="Sohbet sırasında yazma animasyonunu oynat" name="play_typing_animation"/> + <check_box label="Çevrimdışı olduÄŸunda AÄ°'ler e-posta ile bana gönderilsin" name="send_im_to_email"/> + <check_box label="Sadece arkadaÅŸlar ve gruplar beni arasın veya AÄ° göndersin" name="voice_call_friends_only_check"/> + <text name="font_size"> + Font büyüklüğü: + </text> + <combo_box name="chat_font_size"> + <item label="Küçük" name="Small" value="0"/> + <item label="Orta" name="Medium" value="1"/> + <item label="Büyük" name="Large" value="2"/> + </combo_box> + <check_box label="Balon Sohbeti" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + Bildirimler + </text> + <text name="friend_ims"> + ArkadaÅŸ AÄ°'leri: + </text> + <combo_box name="FriendIMOptions"> + <item label="Sohbetler penceresini aç" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mesajı aç" name="PopUpMessage" value="toast"/> + <item label="Araç çubuÄŸu düğmesi yanıp sönsün" name="FlashToolbarButton" value="flash"/> + <item label="Hiçbiri" name="None" value="none"/> + </combo_box> + <text name="non_friend_ims"> + ArkadaÅŸ harici AÄ°'ler: + </text> + <combo_box name="NonFriendIMOptions"> + <item label="Sohbetler penceresini aç" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mesajı açılır pencerede göster" name="PopUpMessage" value="toast"/> + <item label="Araç çubuÄŸu düğmesi yanıp sönsün" name="FlashToolbarButton" value="flash"/> + <item label="Hiçbiri" name="None" value="none"/> + </combo_box> + <text name="conference_ims"> + Konferans AÄ°'leri: + </text> + <combo_box name="ConferenceIMOptions"> + <item label="Sohbetler penceresini aç" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mesajı aç" name="PopUpMessage" value="toast"/> + <item label="Araç çubuÄŸu düğmesi yanıp sönsün" name="FlashToolbarButton" value="flash"/> + <item label="Hiçbiri" name="None" value="none"/> + </combo_box> + <text name="group_chat"> + Grup sohbeti: + </text> + <combo_box name="GroupChatOptions"> + <item label="Sohbetler penceresini aç" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mesajı aç" name="PopUpMessage" value="toast"/> + <item label="Araç çubuÄŸu düğmesi yanıp sönsün" name="FlashToolbarButton" value="flash"/> + <item label="Hiçbiri" name="None" value="none"/> + </combo_box> + <text name="nearby_chat"> + Yakındaki sohbet: + </text> + <combo_box name="NearbyChatOptions"> + <item label="Sohbetler penceresini aç" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mesajı aç" name="PopUpMessage" value="toast"/> + <item label="Araç çubuÄŸu düğmesi yanıp sönsün" name="FlashToolBarButton" value="flash"/> + <item label="Hiçbiri" name="None" value="none"/> + </combo_box> + <text name="notifications_alert"> + Tüm bildirimleri geçici olarak durdurmak için Ä°letiÅŸim Kur > Rahatsız Etme seçeneÄŸini kullanın. + </text> + </panel> + <panel> + <text name="play_sound"> + Sesi çal: + </text> + <check_box label="Yeni sohbet" name="new_conversation"/> + <check_box label="Gelen sesli arama" name="incoming_voice_call"/> + <check_box label="Işınlama teklifi" name="teleport_offer"/> + <check_box label="Envanter teklifi" name="inventory_offer"/> + </panel> + <panel> + <button label="Günlüğü temizle..." name="clear_log"/> + <button label="Dökümleri sil..." name="delete_transcripts"/> + <button label="Gözat..." label_selected="Gözat" name="log_path_button"/> + </panel> <button label="Çeviri..." name="ok_btn"/> <button label="Otomatik Yerine Koy..." name="autoreplace_showgui"/> <button label="Yazım Denetimi Yapılıyor..." name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml index 4a48b1588c..1a13cf8f71 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml @@ -68,9 +68,9 @@ <combo_box.item label="asla" name="item4"/> </combo_box> <text name="text_box3"> - MeÅŸgul durumu cevabı: + Rahatsız Etme yanıtı: </text> - <text_editor name="busy_response"> + <text_editor name="do_not_disturb_response"> log_in_to_change </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml index b0b9ab7716..9a4cf54fa7 100644 --- a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="Nesneyi satın al" name="Buyobject"/> <combo_box.item label="Nesneye ödeme yap" name="Payobject"/> <combo_box.item label="Aç" name="Open"/> + <combo_box.item label="YakınlaÅŸtır" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index 1be8f5974c..155dc8749a 100644 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -137,7 +137,7 @@ Çık </string> <string name="create_account_url"> - http://join.secondlife.com/index.php?lang=tr-TR&sourceid=[sourceid] + http://join.secondlife.com/?sourceid=[sourceid] </string> <string name="LoginFailedViewerNotPermitted"> Kullandığınız görüntüleyici ile artık Second Life'a eriÅŸemezsiniz. Yeni bir görüntüleyiciyi karşıdan yüklemek için lütfen ÅŸu sayfayı ziyaret edin: @@ -619,8 +619,8 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. <string name="AvatarAway"> Uzakta </string> - <string name="AvatarBusy"> - MeÅŸgul + <string name="AvatarDoNotDisturb"> + Rahatsız Etme </string> <string name="AvatarMuted"> EngellenmiÅŸ @@ -856,6 +856,12 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. <string name="ST_NO_JOINT"> KÖK veya EKLEM bulunamıyor. </string> + <string name="NearbyChatTitle"> + Yakındaki sohbet + </string> + <string name="NearbyChatLabel"> + (Yakındaki sohbet) + </string> <string name="whisper"> fısıldar: </string> @@ -919,12 +925,15 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. <string name="ControlYourCamera"> Kameranızı kontrol etmek </string> - <string name="TeleportYourAgent"> - Sizi ışınlama - </string> <string name="NotConnected"> BaÄŸlı DeÄŸil </string> + <string name="AgentNameSubst"> + (Siz) + </string> + <string name="TeleportYourAgent"> + Sizi ışınlama + </string> <string name="SIM_ACCESS_PG"> Genel </string> @@ -1006,18 +1015,6 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. <string name="dictionary_files"> Sözlükler </string> - <string name="AvatarSetNotAway"> - Uzakta DeÄŸil - </string> - <string name="AvatarSetAway"> - Uzakta - </string> - <string name="AvatarSetNotBusy"> - MeÅŸgul DeÄŸil - </string> - <string name="AvatarSetBusy"> - MeÅŸgul - </string> <string name="shape"> Åžekil </string> @@ -1986,8 +1983,8 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. <string name="PanelContentsNewScript"> Yeni Komut Dosyası </string> - <string name="BusyModeResponseDefault"> - Ä°leti gönderdiÄŸiniz Sakin 'meÅŸgul modu'nda, bu da rahatsız edilmek istemediÄŸi anlamına geliyor. Ä°letiniz daha sonra incelenmesi için kendisine ait AÄ° panelinde gösterilecektir. + <string name="DoNotDisturbModeResponseDefault"> + Bu sakin "Rahatsız Etme" seçeneÄŸini devreye almış, mesajınızı sonra görecek. </string> <string name="MuteByName"> (Adına göre) @@ -2100,9 +2097,6 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. <string name="GroupMoneyDate"> [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] </string> - <string name="ViewerObjectContents"> - İçerik - </string> <string name="AcquiredItems"> Alınan Öğeler </string> @@ -3874,7 +3868,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. Genel Bölge </string> <string name="LocationCtrlSeeAVsTooltip"> - Bu parselin dışında avatarlar görünür durumda ve sohbete izin veriliyor + Bu parselin içindeki avatarlar, bu parselin dışındaki avatarlar tarafından görülemez veya iÅŸitilemez </string> <string name="LocationCtrlPathfindingDirtyTooltip"> Bölge yeniden kaydedilinceye kadar hareket eden nesneler bu bölgede doÄŸru davranmayabilir. @@ -3951,6 +3945,12 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. <string name="IM_unblock_only_groups_friends"> Bu mesajı görmek için Tercihler/Gizlilik'de 'Sadece arkadaÅŸlar ve gruplar beni arasın veya AÄ° göndersin' seçeneÄŸinin iÅŸaretini kaldırmalısınız. </string> + <string name="OnlineStatus"> + Çevrimiçi + </string> + <string name="OfflineStatus"> + Çevrimdışı + </string> <string name="answered_call"> Aramanız yanıtlandı </string> @@ -3960,6 +3960,9 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. <string name="you_joined_call"> Sesli aramaya katıldınız </string> + <string name="you_auto_rejected_call-im"> + "Rahatsız Etme" seçeneÄŸini devredeyken sesli aramayı otomatik olarak reddettiniz. + </string> <string name="name_started_call"> [NAME] bir sesli arama baÅŸlattı </string> @@ -3976,7 +3979,7 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. BaÄŸlanıyor... </string> <string name="conference-title"> - Özel Konferans + Çok kiÅŸili sohbet </string> <string name="conference-title-incoming"> [AGENT_NAME] ile konferans @@ -4866,6 +4869,9 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. <string name="Command_Chat_Label"> Sohbet </string> + <string name="Command_Conversations_Label"> + Sohbetler + </string> <string name="Command_Compass_Label"> Pusula </string> @@ -4941,6 +4947,9 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. <string name="Command_Chat_Tooltip"> Metin kullanarak yakındaki kiÅŸilerle sohbet etmek </string> + <string name="Command_Conversations_Tooltip"> + Herkesle sohbet et + </string> <string name="Command_Compass_Tooltip"> Pusula </string> @@ -5070,4 +5079,13 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. <string name="UserDictionary"> [User] </string> + <string name="logging_calls_disabled_log_empty"> + Sohbetlerin günlüğü tutulmuyor. Bir günlük tutmaya baÅŸlamak için, Tercihler > Sohbet altında "Kaydet: Sadece günlük" veya "Kaydet: Günlük ve dökümler" seçimini yapın. + </string> + <string name="logging_calls_disabled_log_not_empty"> + Bundan böyle sohbetlerin günlükleri tutulmayacak. Bir günlük tutmaya devam etmek için, Tercihler > Sohbet altında "Kaydet: Sadece günlük" veya "Kaydet: Günlük ve dökümler" seçimini yapın. + </string> + <string name="logging_calls_enabled_log_empty"> + Günlüğü tutulmuÅŸ sohbet yok. Siz biriyle iletiÅŸime geçtikten sonra veya biri sizinle iletiÅŸime geçtikten sonra, burada bir günlük giriÅŸi gösterilir. + </string> </strings> diff --git a/indra/newview/skins/default/xui/zh/floater_conversation_log.xml b/indra/newview/skins/default/xui/zh/floater_conversation_log.xml new file mode 100644 index 0000000000..37115a0310 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/floater_conversation_log.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_conversation_log" title="交談記錄"> + <panel name="buttons_panel"> + <filter_editor label="人員éŽæ¿¾å™¨" name="people_filter_input"/> + <menu_button name="conversation_view_btn" tool_tip="檢視/排åºçš„é¸é …"/> + <menu_button name="conversations_gear_btn" tool_tip="å°æ‰€é¸çš„人或群組採å–動作"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/zh/floater_conversation_preview.xml b/indra/newview/skins/default/xui/zh/floater_conversation_preview.xml new file mode 100644 index 0000000000..ece263f440 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/floater_conversation_preview.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_conversation" title="交談:"> + <floater.string name="Title"> + 交談:[NAME] + </floater.string> + <text name="page_label" value="é "/> +</floater> diff --git a/indra/newview/skins/default/xui/zh/floater_im_container.xml b/indra/newview/skins/default/xui/zh/floater_im_container.xml index 2d66c659fe..84ad869100 100644 --- a/indra/newview/skins/default/xui/zh/floater_im_container.xml +++ b/indra/newview/skins/default/xui/zh/floater_im_container.xml @@ -1,2 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="floater_im_box" title="交談"/> +<multi_floater name="floater_im_box" title="交談"> + <string name="collapse_icon" value="Conv_toolbar_collapse"/> + <string name="expand_icon" value="Conv_toolbar_expand"/> + <layout_stack name="conversations_stack"> + <layout_panel name="conversations_layout_panel"> + <layout_stack name="conversations_pane_buttons_stack"> + <layout_panel name="conversations_pane_buttons_expanded"> + <menu_button name="sort_btn" tool_tip="檢視/排åºçš„é¸é …"/> + <button name="add_btn" tool_tip="開始新的交談"/> + <button name="speak_btn" tool_tip="用麥克風和大家交談"/> + </layout_panel> + <layout_panel name="conversations_pane_buttons_collapsed"> + <button name="expand_collapse_btn" tool_tip="縮疊/展開這個清單"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="messages_layout_panel"> + <panel_container name="im_box_tab_container"> + <panel name="stub_panel"> + <button name="stub_collapse_btn" tool_tip="縮疊這一å€å¡Š"/> + <text name="stub_textbox"> + 這個交談å¦é–‹äº†æ–°è¦–窗。 [secondlife:/// 把它收回來] + </text> + </panel> + </panel_container> + </layout_panel> + </layout_stack> +</multi_floater> diff --git a/indra/newview/skins/default/xui/zh/floater_im_session.xml b/indra/newview/skins/default/xui/zh/floater_im_session.xml index 808a0b6720..d63c5507db 100644 --- a/indra/newview/skins/default/xui/zh/floater_im_session.xml +++ b/indra/newview/skins/default/xui/zh/floater_im_session.xml @@ -1,8 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> - <layout_stack name="im_panels"> - <layout_panel> - <line_editor label="至" name="chat_editor"/> - </layout_panel> - </layout_stack> + <floater.string name="call_btn_start"> + Conv_toolbar_open_call + </floater.string> + <floater.string name="call_btn_stop"> + Conv_toolbar_hang_up + </floater.string> + <floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/> + <floater.string name="expandline_icon" value="Conv_expand_one_line"/> + <floater.string name="collapse_icon" value="Conv_toolbar_collapse"/> + <floater.string name="expand_icon" value="Conv_toolbar_expand"/> + <floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/> + <floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/> + <floater.string name="participant_added" value="[NAME] å·²å—é‚€åŠ å…¥äº¤è«‡ã€‚"/> + <floater.string name="multiple_participants_added" value="[NAME] å·²å—é‚€åŠ å…¥äº¤è«‡ã€‚"/> + <floater.string name="tooltip_to_separate_window" value="為這個交談å¦é–‹æ–°è¦–窗"/> + <floater.string name="tooltip_to_main_window" value="將這個交談移回到主視窗"/> + <floater.string name="start_call_button_tooltip" value="建立語音通è¯"/> + <floater.string name="end_call_button_tooltip" value="切斷語音通è¯"/> + <floater.string name="expcol_button_not_tearoff_tooltip" value="縮疊這一å€å¡Š"/> + <floater.string name="expcol_button_tearoff_and_expanded_tooltip" value="縮疊åƒèˆ‡è€…清單"/> + <floater.string name="expcol_button_tearoff_and_collapsed_tooltip" value="展開åƒèˆ‡è€…清單"/> + <view name="contents_view"> + <layout_stack name="main_stack"> + <layout_panel name="toolbar_panel"> + <menu_button name="view_options_btn" tool_tip="檢視/排åºçš„é¸é …"/> + <menu_button name="gear_btn" tool_tip="å°é¸å–的人採å–動作"/> + <button name="add_btn" tool_tip="新增æŸäººåˆ°é€™å€‹äº¤è«‡"/> + <button name="voice_call_btn" tool_tip="建立語音通è¯"/> + <button name="close_btn" tool_tip="çµæŸé€™å€‹äº¤è«‡"/> + <button name="expand_collapse_btn" tool_tip="縮疊/展開這個框"/> + </layout_panel> + <layout_panel name="body_panel"> + <layout_stack name="im_panels"> + <layout_panel name="right_part_holder"> + <panel name="trnsAndChat_panel"> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="ç¿»è¯èŠå¤©å…§å®¹" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> + </panel> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="chat_layout_panel"> + <layout_stack name="input_panels"> + <layout_panel name="input_editor_layout_panel"> + <chat_editor label="至" name="chat_editor"/> + </layout_panel> + <layout_panel name="input_button_layout_panel"> + <button name="minz_btn" tool_tip="顯示/éš±è—訊æ¯æ¡†"/> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </view> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_incoming_call.xml b/indra/newview/skins/default/xui/zh/floater_incoming_call.xml index 45a003d3c8..4526eff21d 100644 --- a/indra/newview/skins/default/xui/zh/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/zh/floater_incoming_call.xml @@ -25,9 +25,9 @@ 是å¦é›¢é–‹ [CURRENT_CHAT] ä¸¦åŠ å…¥é€™å€‹èªžéŸ³èŠå¤©ï¼Ÿ </floater.string> <text name="question"> - 是å¦é›¢é–‹ [CURRENT_CHAT] ä¸¦åŠ å…¥é€™å€‹èªžéŸ³èŠå¤©ï¼Ÿ + 如果接è½ï¼Œä½ 將切斷目å‰çš„語音交談。 </text> - <button label="接å—" label_selected="接å—" name="Accept"/> - <button label="拒絕" label_selected="拒絕" name="Reject"/> - <button label="開始 IM" name="Start IM"/> + <button label="接è½" label_selected="接è½" name="Accept"/> + <button label="忽視" label_selected="忽視" name="Reject"/> + <button label="ä¸æŽ¥è½ä½†é–‹å•Ÿ IM" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/zh/floater_pathfinding_console.xml index be009b54d8..d0978b8b01 100644 --- a/indra/newview/skins/default/xui/zh/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/zh/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> 顯示: </text> - <check_box label="世界" name="show_world"/> + <check_box label="測試" name="show_world"/> <check_box label="僅é™å¯ç§»å‹•çš„" name="show_world_movables_only"/> <check_box label="導航網é¢" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml index e909a67e2c..02d06323d4 100644 --- a/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml @@ -19,7 +19,7 @@ <button label="é è¨" label_selected="é è¨" name="Default"/> <button label="空白" label_selected="空白" name="Blank"/> <button label="ç„¡" label_selected="ç„¡" name="None"/> - <check_box initial_value="true" label="實時é 覽" name="apply_immediate_check"/> + <check_box initial_value="true" label="ç«‹å³å¥—用" name="apply_immediate_check"/> <text name="preview_disabled" value="å·²åœç”¨é 覽"/> <filter_editor label="æ質éŽæ¿¾å™¨" name="inventory search editor"/> <check_box initial_value="false" label="顯示資料夾" name="show_folders_check"/> diff --git a/indra/newview/skins/default/xui/zh/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/zh/floater_voice_chat_volume.xml new file mode 100644 index 0000000000..96caa7d333 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/floater_voice_chat_volume.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_voice_volume" title="語音èŠå¤©éŸ³é‡"> + <slider label="語音èŠå¤©" name="chat_voice_volume"/> +</floater> diff --git a/indra/newview/skins/default/xui/zh/floater_voice_effect.xml b/indra/newview/skins/default/xui/zh/floater_voice_effect.xml index 81e0204262..aab5fa6028 100644 --- a/indra/newview/skins/default/xui/zh/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/zh/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="地點" name="voice_effects" title="語音變è²"> +<floater label="地點" name="voice_effects" title="語音變è²è©¦è½"> <string name="no_voice_effect"> (無變è²æ•ˆæžœï¼‰ </string> diff --git a/indra/newview/skins/default/xui/zh/floater_voice_volume.xml b/indra/newview/skins/default/xui/zh/floater_voice_volume.xml new file mode 100644 index 0000000000..4260a8d331 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/floater_voice_volume.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="floater_voice_volume" title="音é‡"> + <slider name="volume_slider" tool_tip="音é‡" value="0.5"/> +</floater> diff --git a/indra/newview/skins/default/xui/zh/menu_cof_gear.xml b/indra/newview/skins/default/xui/zh/menu_cof_gear.xml index cd069f9601..eb7093a23c 100644 --- a/indra/newview/skins/default/xui/zh/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/zh/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="Gear COF"> <menu label="æ–°è¡£æœ" name="COF.Gear.New_Clothes"/> - <menu label="新身體部ä½" name="COF.Geear.New_Body_Parts"/> + <menu label="新身體部ä½" name="COF.Gear.New_Body_Parts"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_conversation.xml b/indra/newview/skins/default/xui/zh/menu_conversation.xml new file mode 100644 index 0000000000..507255d0c0 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_conversation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_participant"> + <menu_item_call label="關閉交談" name="close_conversation"/> + <menu_item_call label="開啟語音交談" name="open_voice_conversation"/> + <menu_item_call label="切斷語音交談" name="disconnect_from_voice"/> + <menu_item_call label="察看檔案" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="發出瞬間傳é€é‚€è«‹" name="offer_teleport"/> + <menu_item_call label="語音通話" name="voice_call"/> + <menu_item_call label="èŠå¤©æ·å²â€¦â€¦" name="chat_history"/> + <menu_item_call label="新增朋å‹" name="add_friend"/> + <menu_item_call label="移除朋å‹" name="remove_friend"/> + <menu_item_call label="移除朋å‹" name="remove_friends"/> + <menu_item_call label="é‚€è«‹åŠ å…¥ç¾¤çµ„â€¦â€¦" name="invite_to_group"/> + <menu_item_call label="放大" name="zoom_in"/> + <menu_item_call label="地圖" name="map"/> + <menu_item_call label="分享" name="share"/> + <menu_item_call label="支付" name="pay"/> + <menu_item_check label="ç¦æ¢èªžéŸ³" name="block_unblock"/> + <menu_item_check label="ç¦æ¢æ–‡å—" name="MuteText"/> + <menu_item_call label="群組檔案" name="group_profile"/> + <menu_item_call label="啟用群組" name="activate_group"/> + <menu_item_call label="離開群組" name="leave_group"/> + <context_menu label="主æŒäººé¸é …" name="Moderator Options"> + <menu_item_check label="å…許文å—èŠå¤©" name="AllowTextChat"/> + <menu_item_call label="å°‡æ¤äººæ¶ˆéŸ³" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="å–消å°æ¤äººçš„消音" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="所有人消音" name="ModerateVoiceMute"/> + <menu_item_call label="å–消所有人的消音" name="ModerateVoiceUnmute"/> + </context_menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/zh/menu_conversation_log_gear.xml new file mode 100644 index 0000000000..49e91417e8 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_conversation_log_gear.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Context Menu"> + <menu_item_call label="IM…" name="IM"/> + <menu_item_call label="語音通話…" name="Call"/> + <menu_item_call label="é–‹å•ŸèŠå¤©æ·å²â€¦" name="Chat history"/> + <menu_item_call label="察看檔案" name="View Profile"/> + <menu_item_call label="發給瞬間傳é€è«‹æ±‚" name="teleport"/> + <menu_item_call label="åŠ ç‚ºæœ‹å‹" name="add_friend"/> + <menu_item_call label="移除朋å‹" name="remove_friend"/> + <menu_item_call label="é‚€è«‹åŠ å…¥ç¾¤çµ„â€¦â€¦" name="Invite"/> + <menu_item_call label="地圖" name="Map"/> + <menu_item_call label="分享" name="Share"/> + <menu_item_call label="支付" name="Pay"/> + <menu_item_check label="å°éŽ–/ä¸å†å°éŽ–" name="Block/Unblock"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/zh/menu_conversation_log_view.xml new file mode 100644 index 0000000000..3fa99a5cd7 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_conversation_log_view.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_conversation_view"> + <menu_item_check label="ä¾å稱排åº" name="sort_by_name"/> + <menu_item_check label="ä¾æ—¥æœŸæŽ’åº" name="sort_by_date"/> + <menu_item_check label="將朋å‹åˆ—åœ¨é ‚ç«¯" name="sort_by_friends"/> + <menu_item_call label="檢視附近èŠå¤©æ·å²â€¦â€¦" name="view_nearby_chat_history"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_im_conversation.xml b/indra/newview/skins/default/xui/zh/menu_im_conversation.xml new file mode 100644 index 0000000000..815b0b594c --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_im_conversation.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Conversation Gear Menu"> + <menu_item_call label="察看檔案" name="View Profile"/> + <menu_item_call label="åŠ ç‚ºæœ‹å‹" name="Add Friend"/> + <menu_item_call label="移除朋å‹" name="remove_friend"/> + <menu_item_call label="發出瞬間傳é€é‚€è«‹" name="offer_teleport"/> + <menu_item_call label="é‚€è«‹åŠ å…¥ç¾¤çµ„â€¦â€¦" name="invite_to_group"/> + <menu_item_call label="èŠå¤©æ·å²â€¦â€¦" name="chat_history"/> + <menu_item_call label="放大" name="zoom_in"/> + <menu_item_call label="地圖" name="map"/> + <menu_item_call label="分享" name="Share"/> + <menu_item_call label="支付" name="Pay"/> + <menu_item_check label="ç¦æ¢èªžéŸ³" name="Block/Unblock"/> + <menu_item_check label="ç¦æ¢æ–‡å—" name="MuteText"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/zh/menu_im_session_showmodes.xml new file mode 100644 index 0000000000..a7006e524a --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_im_session_showmodes.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_modes"> + <menu_item_check label="精簡視野" name="compact_view"/> + <menu_item_check label="全展視野" name="expanded_view"/> + <menu_item_check label="顯示時間" name="IMShowTime"/> + <menu_item_check label="一å°ä¸€äº¤è«‡æ™‚顯示åå—" name="IMShowNamesForP2PConv"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_object_icon.xml b/indra/newview/skins/default/xui/zh/menu_object_icon.xml index f4f93b0bdc..9655732f2e 100644 --- a/indra/newview/skins/default/xui/zh/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/zh/menu_object_icon.xml @@ -2,4 +2,6 @@ <menu name="Object Icon Menu"> <menu_item_call label="物件檔案..." name="Object Profile"/> <menu_item_call label="å°éŽ–…" name="Block"/> + <menu_item_call label="顯示在地圖上" name="show_on_map"/> + <menu_item_call label="瞬間傳é€åˆ°ç‰©ä»¶ä½ç½®" name="teleport_to_object"/> </menu> diff --git a/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml b/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml index e85b4b7182..258d0d6b20 100644 --- a/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml @@ -23,6 +23,8 @@ <menu_item_call label="æ–°é é«®" name="New Hair"/> <menu_item_call label="新眼ç›" name="New Eyes"/> </menu> + <menu_item_call label="展開全部資料夾" name="expand"/> + <menu_item_call label="摺疊全部資料夾" name="collapse"/> <menu_item_call label="è£æ‰®æ›´å" name="rename"/> <menu_item_call label="刪除è£æ‰®" name="delete_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_participant_view.xml b/indra/newview/skins/default/xui/zh/menu_participant_view.xml new file mode 100644 index 0000000000..8b35860eb6 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_participant_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="participant_manu_view"> + <menu_item_check label="將交談ä¾é¡žåž‹æŽ’åº" name="sort_sessions_by_type"/> + <menu_item_check label="將交談ä¾åå—排åº" name="sort_sessions_by_name"/> + <menu_item_check label="將交談ä¾æœ€è¿‘活動排åº" name="sort_sessions_by_recent"/> + <menu_item_check label="å°‡åƒèˆ‡è€…ä¾åå—排åº" name="sort_participants_by_name"/> + <menu_item_check label="å°‡åƒèˆ‡è€…ä¾æœ€è¿‘活動排åº" name="sort_participants_by_recent"/> + <menu_item_call label="èŠå¤©å好è¨å®šâ€¦â€¦" name="chat_preferences"/> + <menu_item_call label="éš±ç§å好è¨å®šâ€¦â€¦" name="privacy_preferences"/> + <menu_item_check label="交談記錄……" name="Conversation"/> + <menu_item_check label="ç¿»è¯é™„è¿‘çš„èŠå¤©" name="Translate_chat"/> + <menu_item_check label="ç¿»è¯è¨å®šâ€¦â€¦" name="Translation_settings"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/zh/menu_people_blocked_gear.xml new file mode 100644 index 0000000000..9a2a3c403d --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_people_blocked_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_gear"> + <menu_item_call label="解除å°éŽ–" name="unblock"/> + <menu_item_call label="檔案..." name="profile"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/zh/menu_people_blocked_plus.xml new file mode 100644 index 0000000000..a8cecb4e14 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_people_blocked_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_plus"> + <menu_item_call label="按åå—å°éŽ–居民……" name="block_resident_by_name"/> + <menu_item_call label="ä¾å稱å°éŽ–物件" name="block_object_by_name"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/zh/menu_people_blocked_view.xml new file mode 100644 index 0000000000..5b70cd35bf --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_people_blocked_view.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_blocked_view"> + <menu_item_check label="ä¾å稱排åº" name="sort_by_name"/> + <menu_item_check label="ä¾é¡žåž‹æŽ’åº" name="sort_by_type"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_friends_view.xml b/indra/newview/skins/default/xui/zh/menu_people_friends_view.xml new file mode 100644 index 0000000000..4251238fd9 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_people_friends_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="ä¾å稱排åº" name="sort_name"/> + <menu_item_check label="ä¾ç‹€æ…‹æŽ’åº" name="sort_status"/> + <menu_item_check label="察看人群圖示" name="view_icons"/> + <menu_item_check label="察看許å¯æ¬Šé™" name="view_permissions"/> + <menu_item_check label="檢視交談記錄……" name="view_conversation"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_groups.xml b/indra/newview/skins/default/xui/zh/menu_people_groups.xml index 5768c554c9..b4b566f5ca 100644 --- a/indra/newview/skins/default/xui/zh/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/zh/menu_people_groups.xml @@ -2,7 +2,7 @@ <menu name="menu_group_plus"> <menu_item_call label="察看資訊" name="View Info"/> <menu_item_call label="èŠå¤©" name="Chat"/> - <menu_item_call label="通話" name="Call"/> + <menu_item_call label="語音通話" name="Call"/> <menu_item_call label="å•Ÿå‹•" name="Activate"/> <menu_item_call label="退出" name="Leave"/> </menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_groups_view.xml b/indra/newview/skins/default/xui/zh/menu_people_groups_view.xml new file mode 100644 index 0000000000..05a30d938f --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_people_groups_view.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="顯示群組圖示" name="Display Group Icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby.xml index 38d5f3d324..d25adaf8fb 100644 --- a/indra/newview/skins/default/xui/zh/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/zh/menu_people_nearby.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Avatar Context Menu"> - <menu_item_call label="察看檔案" name="View Profile"/> - <menu_item_call label="åŠ ç‚ºæœ‹å‹" name="Add Friend"/> - <menu_item_call label="移除朋å‹" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="通話" name="Call"/> - <menu_item_call label="地圖" name="Map"/> - <menu_item_call label="分享" name="Share"/> - <menu_item_call label="支付" name="Pay"/> - <menu_item_check label="å°éŽ–/ä¸å†å°éŽ–" name="Block/Unblock"/> - <menu_item_call label="發給瞬間傳é€è«‹æ±‚" name="teleport"/> + <menu_item_call label="察看檔案" name="view_profile"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="發給瞬間傳é€è«‹æ±‚" name="offer_teleport"/> + <menu_item_call label="語音通話" name="voice_call"/> + <menu_item_call label="檢視èŠå¤©æ·å²â€¦â€¦" name="chat_history"/> + <menu_item_call label="åŠ ç‚ºæœ‹å‹" name="add_friend"/> + <menu_item_call label="移除朋å‹" name="remove_friend"/> + <menu_item_call label="é‚€è«‹åŠ å…¥ç¾¤çµ„â€¦â€¦" name="invite_to_group"/> + <menu_item_call label="放大" name="zoom_in"/> + <menu_item_call label="地圖" name="map"/> + <menu_item_call label="分享" name="share"/> + <menu_item_call label="支付" name="pay"/> + <menu_item_check label="å°éŽ–/ä¸å†å°éŽ–" name="block_unblock"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml index 1380e0b307..69f0eab7dc 100644 --- a/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Multi-Selected People Context Menu"> - <menu_item_call label="åŠ ç‚ºæœ‹å‹" name="Add Friends"/> - <menu_item_call label="移除朋å‹" name="Remove Friend"/> - <menu_item_call label="IM" name="IM"/> - <menu_item_call label="通話" name="Call"/> - <menu_item_call label="分享" name="Share"/> - <menu_item_call label="支付" name="Pay"/> - <menu_item_call label="發給瞬間傳é€è«‹æ±‚" name="teleport"/> + <menu_item_call label="åŠ ç‚ºæœ‹å‹" name="add_friends"/> + <menu_item_call label="移除朋å‹" name="remove_friends"/> + <menu_item_call label="IM" name="im"/> + <menu_item_call label="通話" name="call"/> + <menu_item_call label="分享" name="share"/> + <menu_item_call label="支付" name="pay"/> + <menu_item_call label="發給瞬間傳é€è«‹æ±‚" name="offer_teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby_view.xml new file mode 100644 index 0000000000..9bc5638472 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_people_nearby_view.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="ä¾æœ€è¿‘說話者排åº" name="sort_by_recent_speakers"/> + <menu_item_check label="ä¾å稱排åº" name="sort_name"/> + <menu_item_check label="ä¾è·é›¢æŽ’åº" name="sort_distance"/> + <menu_item_check label="察看人群圖示" name="view_icons"/> + <menu_item_check label="察看地圖" name="view_map"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_recent_view.xml b/indra/newview/skins/default/xui/zh/menu_people_recent_view.xml new file mode 100644 index 0000000000..382234c3ec --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_people_recent_view.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_group_plus"> + <menu_item_check label="ä¾æœ€è¿‘排åº" name="sort_most"/> + <menu_item_check label="ä¾å稱排åº" name="sort_name"/> + <menu_item_check label="察看人群圖示" name="view_icons"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_url_agent.xml b/indra/newview/skins/default/xui/zh/menu_url_agent.xml index 592bb6561e..72629822d4 100644 --- a/indra/newview/skins/default/xui/zh/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/zh/menu_url_agent.xml @@ -1,6 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="顯示居民檔案" name="show_agent"/> + <menu_item_call label="察看檔案" name="show_agent"/> + <menu_item_call label="é€å‡º IM..." name="send_im"/> + <menu_item_call label="åŠ ç‚ºæœ‹å‹..." name="add_friend"/> <menu_item_call label="覆製å稱到剪貼簿" name="url_copy_label"/> <menu_item_call label="覆製 SLurl 到剪貼簿" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_url_objectim.xml b/indra/newview/skins/default/xui/zh/menu_url_objectim.xml index b344b21c62..9f3a9d58ff 100644 --- a/indra/newview/skins/default/xui/zh/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/zh/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="顯示物件資訊" name="show_object"/> + <menu_item_call label="物件檔案..." name="show_object"/> <menu_item_call label="顯示在地圖上" name="show_on_map"/> <menu_item_call label="瞬間傳é€åˆ°ç‰©ä»¶ä½ç½®" name="teleport_to_object"/> <menu_item_call label="覆製物件å稱到剪貼簿" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml index 9a95e8c4d6..fdae3f3bd4 100644 --- a/indra/newview/skins/default/xui/zh/menu_viewer.xml +++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml @@ -16,10 +16,7 @@ <menu_item_call label="åœæ¢æˆ‘身上的動作" name="Stop Animating My Avatar"/> <menu_item_call label="行走 / è·‘æ¥ / 飛行…" name="Walk / run / fly"/> </menu> - <menu label="狀態" name="Status"> - <menu_item_call label="離開" name="Set Away"/> - <menu_item_call label="忙碌" name="Set Busy"/> - </menu> + <menu label="狀態" name="Status"/> <menu_item_call label="購買 L$…" name="Buy and Sell L$"/> <menu_item_call label="商家發件匣…" name="MerchantOutbox"/> <menu_item_call label="帳戶主控臺…" name="Manage My Account"/> @@ -30,14 +27,18 @@ <menu_item_call label="退出 [APP_NAME]" name="Quit"/> </menu> <menu label="æºé€š" name="Communicate"> - <menu_item_check label="èŠå¤©â€¦" name="Nearby Chat"/> + <menu_item_check label="交談……" name="Conversations"/> + <menu_item_check label="附近的èŠå¤©â€¦â€¦" name="Nearby Chat"/> <menu_item_check label="說話" name="Speak"/> - <menu_item_check label="語音è¨å®šâ€¦" name="Nearby Voice"/> - <menu_item_check label="語音變è²â€¦" name="ShowVoice"/> + <menu label="語音變è²" name="VoiceMorphing"> + <menu_item_check label="沒有變è²æ•ˆæžœ" name="NoVoiceMorphing"/> + <menu_item_check label="é 覽……" name="Preview"/> + <menu_item_call label="訂閱……" name="Subscribe"/> + </menu> <menu_item_check label="姿勢…" name="Gestures"/> - <menu_item_call label="朋å‹" name="My Friends"/> - <menu_item_call label="群組" name="My Groups"/> - <menu_item_call label="附近的人群" name="Active Speakers"/> + <menu_item_check label="朋å‹" name="My Friends"/> + <menu_item_check label="群組" name="My Groups"/> + <menu_item_check label="附近的人群" name="Active Speakers"/> <menu_item_call label="å°éŽ–清單" name="Block List"/> </menu> <menu label="世界" name="World"> diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml index 9fecf2c104..59be26d43b 100644 --- a/indra/newview/skins/default/xui/zh/notifications.xml +++ b/indra/newview/skins/default/xui/zh/notifications.xml @@ -516,6 +516,24 @@ </url> <usetemplate ignoretext="我的顯示驅動程å¼å¤ªè€èˆŠ" name="okcancelignore" notext="å¦" yestext="是"/> </notification> + <notification name="AMDOldDriver"> + ä½ çš„é¡¯ç¤ºå¡å¾ˆå¯èƒ½æœ‰æ–°ç‰ˆçš„驅動程å¼ã€‚ 更新顯示驅動程å¼æœƒå¤§å¹…改善性能。 + + å‰å¾€ [_URL] 察看是å¦æœ‰æ–°ç‰ˆé©…動程å¼ï¼Ÿ + <url name="url"> + http://support.amd.com/us/Pages/AMDSupportHub.aspx + </url> + <usetemplate ignoretext="我的顯示驅動程å¼å¤ªè€èˆŠ" name="okcancelignore" notext="å¦" yestext="是"/> + </notification> + <notification name="NVIDIAOldDriver"> + ä½ çš„é¡¯ç¤ºå¡å¾ˆå¯èƒ½æœ‰æ–°ç‰ˆçš„驅動程å¼ã€‚ 更新顯示驅動程å¼æœƒå¤§å¹…改善性能。 + + å‰å¾€ [_URL] 察看是å¦æœ‰æ–°ç‰ˆé©…動程å¼ï¼Ÿ + <url name="url"> + http://www.nvidia.com/Download/index.aspx?lang=tw + </url> + <usetemplate ignoretext="我的顯示驅動程å¼å¤ªè€èˆŠ" name="okcancelignore" notext="å¦" yestext="是"/> + </notification> <notification name="UnknownGPU"> ä½ çš„ç³»çµ±å«æœ‰ä¸€å€‹ [APP_NAME] 無法辨èªçš„顯åƒå¡ã€‚ åŽŸå› å¾ˆå¯èƒ½æ˜¯ [APP_NAME] 尚未é‡å°æ–°ç¡¬é«”完æˆæ¸¬è©¦ã€‚ 這大概ä¸æœƒå‡ºå•é¡Œï¼Œä½†ä½ å¯èƒ½éœ€è¦èª¿æ•´é¡¯åƒè¨å®šã€‚ @@ -1536,10 +1554,13 @@ SHA1 指紋:[MD5_DIGEST] æ¤æ™‚無法發出交å‹é‚€è«‹ã€‚ è«‹ç¨å€™å†è©¦ã€‚ <usetemplate name="okbutton" yestext="確定"/> </notification> - <notification name="BusyModeSet"> - å·²è¨ç‚ºå¿™ç¢Œæ¨¡å¼ã€‚ -èŠå¤©å’Œå³æ™‚訊æ¯å…§å®¹å°‡è¢«éš±è—。 å³æ™‚訊æ¯ç™¼é€è€…å°‡æ”¶åˆ°ä½ çš„ã€Œå¿™ç¢Œæ¨¡å¼ã€å›žæ‡‰ã€‚ 所有的瞬間傳é€é‚€è«‹éƒ½å°‡è¢«å©‰æ‹’。 æ¤æ™‚èµ·é€çµ¦ä½ 的收ç´å€ç‰©é …都將丟入垃圾桶。 - <usetemplate ignoretext="我變更我的狀態為忙碌模å¼" name="okignore" yestext="確定"/> + <notification name="DoNotDisturbModeSet"> + 「請勿打擾ã€æ¨¡å¼ç›®å‰æ˜¯é–‹å•Ÿç‹€æ…‹ã€‚ ä½ å°‡ä¸æœƒæ”¶åˆ°ä»»ä½•ç™¼çµ¦ä½ 的訊æ¯é€šçŸ¥ã€‚ + +- å…¶ä»–å±…æ°‘å°‡æ”¶åˆ°ä½ çš„ã€Œè«‹å‹¿æ‰“æ“¾ã€å›žæ‡‰ï¼ˆå›žæ‡‰å…§å®¹è¨æ–¼ã€Œå好è¨å®š > 一般è¨å®šã€ï¼‰ã€‚ +- 所有瞬間傳é€çš„邀請都將被婉拒。 +- 所有語音來電都將拒絕接è½ã€‚ + <usetemplate ignoretext="我變更我的狀態為「請勿打擾ã€æ¨¡å¼" name="okignore" yestext="確定"/> </notification> <notification name="JoinedTooManyGroupsMember"> ä½ å·²é”å¯åŒæ™‚åŠ å…¥çš„ç¾¤çµ„æ•¸ä¸Šé™ã€‚ 請先離開å¦ä¸€å€‹ç¾¤çµ„å†åŠ å…¥é€™ä¸€å€‹ï¼Œæˆ–å©‰æ‹’åŠ å…¥é‚€è«‹ã€‚ @@ -2024,6 +2045,10 @@ SHA1 指紋:[MD5_DIGEST] å‰å¾€ä½ çš„[http://secondlife.com/account/ 塗鴉牆]ä»¥å¯Ÿçœ‹ä½ çš„å¸³æˆ¶æ·å²ç´€éŒ„? <usetemplate ignoretext="啟動我的ç€è¦½å™¨ä»¥å¯Ÿçœ‹æˆ‘的帳戶æ·å²ç´€éŒ„" name="okcancelignore" notext="å–消" yestext="å‰å¾€é é¢"/> </notification> + <notification name="ConfirmAddingChatParticipants"> + 新增一個人到ç¾æœ‰çš„交談,ç‰æ–¼å»ºç«‹æ–°çš„交談。 所有交談者將會收到新交談通知。 + <usetemplate ignoretext="確èªæ–°å¢žèŠå¤©è€…" name="okcancelignore" notext="å–消" yestext="確定"/> + </notification> <notification name="ConfirmQuit"> ä½ ç¢ºå®šä½ è¦çµæŸé€€å‡ºï¼Ÿ <usetemplate ignoretext="當我çµæŸé€€å‡ºæ™‚進行確èª" name="okcancelignore" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/> @@ -2098,14 +2123,14 @@ SHA1 指紋:[MD5_DIGEST] <button ignore="絕ä¸å–代" name="No" text="å–消"/> </form> </notification> - <notification label="忙碌模å¼è¦å‘Š" name="BusyModePay"> - ä½ ç¾åœ¨è™•æ–¼å¿™ç¢Œæ¨¡å¼ï¼Œé€™æ„å‘³è‘—ä½ ä»˜è²»å¾Œä»å°‡ä¸æœƒæ”¶åˆ°ä»»ä½•ç‰©é …。 + <notification label="「請勿打擾ã€æ¨¡å¼è¦å‘Š" name="DoNotDisturbModePay"> + ä½ å·²é–‹å•Ÿã€Œè«‹å‹¿æ‰“æ“¾ã€ã€‚ ä½ å°‡ä¸æœƒæ”¶åˆ°ä»»ä½•ä»˜æ¬¾è³¼è²·çš„ç‰©é …ã€‚ -ä½ æ˜¯å¦è¦å…ˆé›¢é–‹å¿™ç¢Œæ¨¡å¼ï¼Œå†å®Œæˆäº¤æ˜“? +是å¦è¦åœ¨å®Œæˆäº¤æ˜“之å‰ï¼Œå…ˆé—œé–‰ã€Œè«‹å‹¿æ‰“擾ã€æ¨¡å¼ï¼Ÿ <form name="form"> - <ignore name="ignore" text="當我在忙碌模å¼æ™‚,將è¦æ”¯ä»˜é‡‘錢或給他人物件"/> - <button ignore="總是離開忙碌模å¼" name="Yes" text="確定"/> - <button ignore="絕ä¸é›¢é–‹å¿™ç¢Œæ¨¡å¼" name="No" text="å–消"/> + <ignore name="ignore" text="我å³å°‡åœ¨ã€Œè«‹å‹¿æ‰“擾ã€æ¨¡å¼ä¸‹ï¼Œè©¦åœ–付錢給他人或給一個物件"/> + <button ignore="固定é¸æ“‡é›¢é–‹ã€Œè«‹å‹¿æ‰“擾ã€æ¨¡å¼" name="Yes" text="確定"/> + <button ignore="æ°¸ä¸é›¢é–‹ã€Œè«‹å‹¿æ‰“擾ã€æ¨¡å¼" name="No" text="å–消"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> @@ -2240,11 +2265,8 @@ SHA1 指紋:[MD5_DIGEST] <notification name="GroupNotice"> 主旨:[SUBJECT],訊æ¯ï¼š[MESSAGE] </notification> - <notification name="FriendOnline"> - <nolink>[NAME]</nolink> ç›®å‰åœ¨ç·šä¸Š - </notification> - <notification name="FriendOffline"> - <nolink>[NAME]</nolink> ç›®å‰é›¢ç·š + <notification name="FriendOnlineOffline"> + <nolink>[NAME]</nolink> ç›®å‰ç‹€æ…‹ç‚º [STATUS] </notification> <notification name="AddSelfFriend"> é›–ç„¶ä½ äººå¾ˆå¥½ï¼Œä½ é‚„æ˜¯ä¸èƒ½æŠŠè‡ªå·±åŠ 為朋å‹ã€‚ @@ -2472,13 +2494,6 @@ SHA1 指紋:[MD5_DIGEST] <notification name="DynamicPathfindingDisabled"> 這地å€ä¸¦æœªå•Ÿç”¨å‹•æ…‹å°‹å¾‘。 使用尋徑 LSL 呼å«çš„帶腳本物件,在æ¤åœ°å€å¯èƒ½ç„¡æ³•æ£å¸¸é‹ä½œã€‚ </notification> - <notification name="PathfindingRebakeNavmesh"> - 更改本地å€çš„æŸäº›ç‰©ä»¶å°‡å°Žè‡´å…¶ä»–移動物件的é‹ä½œç™¼ç”Ÿå•é¡Œã€‚ è¦ä½¿ç§»å‹•ç‰©ä»¶æ£å¸¸é‹ä½œï¼Œè«‹é»žæŒ‰ã€Œé‡æ–°ç”¢å‡ºåœ°å€ã€æŒ‰éˆ•ã€‚ 欲ç²çŸ¥è©³æƒ…è«‹é¸æ“‡ã€Œå¹«åŠ©ã€ã€‚ - <url name="url"> - http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer - </url> - <usetemplate helptext="幫助" ignoretext="更改本地å€çš„æŸäº›ç‰©ä»¶å°‡å°Žè‡´å…¶ä»–移動物件的é‹ä½œç™¼ç”Ÿå•é¡Œã€‚" name="okhelpignore" yestext="確定"/> - </notification> <notification name="PathfindingCannotRebakeNavmesh"> 發生錯誤。 å•é¡Œå¯èƒ½å‡ºåœ¨ç¶²è·¯æˆ–伺æœå™¨ï¼Œä¹Ÿå¯èƒ½å› ç‚ºä½ ç„¡æ¬Šå»ºè£½ç‰©ä»¶ã€‚ 有時,åªè¦ç™»å‡ºå†ç™»å…¥å³èƒ½è§£æ±ºé€™é¡žå•é¡Œã€‚ <usetemplate name="okbutton" yestext="確定"/> @@ -2741,7 +2756,7 @@ SHA1 指紋:[MD5_DIGEST] <notification name="ScriptQuestionCaution"> è¦å‘Šï¼šç‰©ä»¶ '<nolink>[OBJECTNAME]</nolink>' è¦æ±‚全權å˜å–ä½ çš„æž—ç™»å¹£å¸³æˆ¶ã€‚ ä½ å¦‚æžœå…許å˜å–帳戶,它將å¯åœ¨ä»»ä½•æ™‚å€™å¾žä½ å¸³æˆ¶å–èµ°è³‡é‡‘ï¼Œæˆ–å®Œå…¨åŠ ä»¥æ¸…ç©ºï¼Œæˆ–å®šæœŸå–走部分資金,且ä¸æœƒç™¼å‡ºè¦å‘Šã€‚ -這很å¯èƒ½æ˜¯ç¨®ä¸ç•¶çš„è¦æ±‚。 å¦‚æžœä½ ä¸å®Œå…¨çžè§£å®ƒç‚ºä½•è¦æ±‚å˜å–ä½ çš„å¸³æˆ¶ï¼Œè«‹å‹¿å…准。 +å¦‚æžœä½ ä¸å®Œå…¨çžè§£å®ƒç‚ºä½•è¦æ±‚å˜å–ä½ çš„å¸³æˆ¶ï¼Œè«‹å‹¿å…准。 <form name="form"> <button name="Grant" text="å…許全權å˜å–"/> <button name="Deny" text="拒絕"/> @@ -3323,4 +3338,633 @@ SHA1 指紋:[MD5_DIGEST] ä½ æ£åœ¨åˆªé™¤ [NUM_ITEMS] å€‹ç‰©é …ã€‚ ä½ ç¢ºå®šä½ è¦ç¹¼çºŒï¼Ÿ <usetemplate ignoretext="確定è¦åˆªé™¤å¤šå€‹ç‰©é …?" name="okcancelignore" notext="å¦" yestext="是"/> </notification> + <notification name="AvatarFrozen"> + [AV_FREEZER] å‡çµäº†ä½ 。 ä½ æ¤æ™‚無法移動或與周é互動。 + </notification> + <notification name="AvatarFrozenDuration"> + [AV_FREEZER] å‡çµäº†ä½ [AV_FREEZE_TIME] 秒é˜ã€‚ ä½ æ¤æ™‚無法移動或與周é互動。 + </notification> + <notification name="YouFrozeAvatar"> + 化身已å‡çµã€‚ + </notification> + <notification name="AvatarHasUnFrozenYou"> + [AV_FREEZER] 解除了å°ä½ çš„å‡çµã€‚ + </notification> + <notification name="AvatarUnFrozen"> + 化身已解除å‡çµã€‚ + </notification> + <notification name="AvatarFreezeFailure"> + å‡çµå¤±æ•—ï¼Œå› ç‚ºä½ åœ¨è©²åœ°æ®µæ²’æœ‰ç®¡ç†å“¡æ¬Šé™ã€‚ + </notification> + <notification name="AvatarFreezeThaw"> + ä½ éå‡çµçš„時間已éŽï¼Œè«‹æ¢å¾©æ£å¸¸æ´»å‹•ã€‚ + </notification> + <notification name="AvatarCantFreeze"> + 抱æ‰ï¼Œç„¡æ³•å‡çµè©²ç”¨æˆ¶ã€‚ + </notification> + <notification name="NowOwnObject"> + ä½ ç¾åœ¨æ˜¯ç‰©ä»¶ [OBJECT_NAME] 的所有人 + </notification> + <notification name="CantRezOnLand"> + 無法在 [OBJECT_POS] ç”¢ç”Ÿç‰©ä»¶ï¼Œå› ç‚ºé€™åœŸåœ°çš„æ‰€æœ‰äººä¸å…許。 請用土地工具察看所有人。 + </notification> + <notification name="RezFailTooManyRequests"> + 無法產生物件,æ¤åˆ»è¦æ±‚數目éŽå¤šã€‚ + </notification> + <notification name="SitFailCantMove"> + ä½ ç„¡æ³•åä¸‹ï¼Œå› ç‚ºæ¤åˆ»ä½ ä¸èƒ½ç§»å‹•ã€‚ + </notification> + <notification name="SitFailNotAllowedOnLand"> + ä½ ä¸èƒ½åä¸‹ï¼Œå› ç‚ºè©²åœŸåœ°ä¸å…許。 + </notification> + <notification name="SitFailNotSameRegion"> + 請挨近一點。 無法ååœ¨ç‰©ä»¶ä¸Šï¼Œå› ç‚º +å®ƒå’Œä½ ä¸åœ¨åŒä¸€å€‹åœ°å€ã€‚ + </notification> + <notification name="NoNewObjectRegionFull"> + 無法建立新物件。 地å€å·²æ»¿è¼‰ã€‚ + </notification> + <notification name="FailedToPlaceObject"> + 無法將物件置於指定地點。 è«‹å†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="NoOwnNoGardening"> + ä½ ç„¡æ³•åœ¨åˆ¥äººçš„åœŸåœ°ä¸Šå»ºç«‹æ¨¹å’Œè‰ã€‚ + </notification> + <notification name="NoCopyPermsNoObject"> + è¤‡è£½å¤±æ•—ï¼Œä½ ç„¡æ¬Šè¤‡è£½ç‰©ä»¶ '[OBJ_NAME]'。 + </notification> + <notification name="NoTransPermsNoObject"> + è¤‡è£½å¤±æ•—ï¼Œå› ç‚ºç‰©ä»¶ '[OBJ_NAME]' ç„¡æ³•è½‰ç§»çµ¦ä½ ã€‚ + </notification> + <notification name="AddToNavMeshNoCopy"> + è¤‡è£½å¤±æ•—ï¼Œå› ç‚ºç‰©ä»¶ '[OBJ_NAME]' å°å°Žèˆªç¶²é¢æœ‰è²¢ç»ã€‚ + </notification> + <notification name="DupeWithNoRootsSelected"> + é¸å–äº†æ²’æœ‰æ ¹çš„é‡è¦†ç‰©ä»¶ã€‚ + </notification> + <notification name="CantDupeCuzRegionIsFull"> + ç„¡æ³•è¤‡è£½ç‰©ä»¶ï¼Œå› ç‚ºåœ°å€æ»¿è¼‰ã€‚ + </notification> + <notification name="CantDupeCuzParcelNotFound"> + 無法複製物件,找ä¸åˆ°å®ƒå€‘所在的地段。 + </notification> + <notification name="CantCreateCuzParcelFull"> + ç„¡æ³•å»ºç«‹ç‰©ä»¶ï¼Œå› ç‚º +地段滿載。 + </notification> + <notification name="RezAttemptFailed"> + 試圖產生物件失敗。 + </notification> + <notification name="ToxicInvRezAttemptFailed"> + 無法建立已在æ¤åœ°å€é€ æˆå•é¡Œçš„物件。 + </notification> + <notification name="InvItemIsBlacklisted"> + 該收ç´å€ç‰©é …已被列入黑å單。 + </notification> + <notification name="NoCanRezObjects"> + ä½ æ¤æ™‚無權建立物件。 + </notification> + <notification name="LandSearchBlocked"> + 土地æœå°‹éç¦ã€‚ +ä½ åœ¨çŸæ™‚間內進行了太多次土地æœå°‹ã€‚ +è«‹ç¨å€™å†è©¦ã€‚ + </notification> + <notification name="NotEnoughResourcesToAttach"> + 腳本資æºä¸è¶³ï¼Œç„¡æ³•é™„è‘—ç‰©ä»¶ï¼ + </notification> + <notification name="YouDiedAndGotTPHome"> + ä½ å·²ç¶“æ»äº¡ä¸¦ä¸”被瞬間傳é€å›žä½ 的家的ä½ç½® + </notification> + <notification name="EjectComingSoon"> + ä½ ä¸å†å…è¨±å¾…åœ¨é€™è£¡ï¼Œå¿…é ˆåœ¨ [EJECT_TIME] 秒內離開。 + </notification> + <notification name="NoEnterServerFull"> + ä½ ç„¡æ³•é€²å…¥é€™åœ°å€ï¼Œå› 為 +伺æœå™¨æ»¿è¼‰ã€‚ + </notification> + <notification name="SaveBackToInvDisabled"> + 「儲å˜å›žæ”¶ç´å€ã€åŠŸèƒ½å·²è¢«åœç”¨ã€‚ + </notification> + <notification name="NoExistNoSaveToContents"> + 無法將 '[OBJ_NAME]' 儲å˜åˆ°ç‰©ä»¶å…§å®¹ï¼Œå› 為產生它的來æºç‰©ä»¶å·²ä¸å˜åœ¨ã€‚ + </notification> + <notification name="NoModNoSaveToContents"> + ç„¡æ³•å„²å˜ [OBJ_NAME] åˆ°ç‰©ä»¶å…§å®¹ï¼Œä½ ç„¡æ¬Šä¿®æ”¹ '[DEST_NAME]' 物件。 + </notification> + <notification name="NoSaveBackToInvDisabled"> + 無法將 '[OBJ_NAME]' 儲å˜å›žæ”¶ç´å€ï¼Œæ¤å‹•ä½œå·²è¢«åœç”¨ã€‚ + </notification> + <notification name="NoCopyNoSelCopy"> + ç„¡æ³•è¤‡è£½ä½ æ‰€é¸çš„ï¼Œå› ç‚ºä½ ç„¡æ¬Šè¤‡è£½ç‰©ä»¶ '[OBJ_NAME]'。 + </notification> + <notification name="NoTransNoSelCopy"> + 無法é¸å–è¤‡è£½ï¼Œå› ç‚ºç‰©ä»¶ '[OBJ_NAME]' ä¸å¯è½‰ç§»ã€‚ + </notification> + <notification name="NoTransNoCopy"> + 無法é¸å–è¤‡è£½ï¼Œå› ç‚ºç‰©ä»¶ '[OBJ_NAME]' ä¸å¯è½‰ç§»ã€‚ + </notification> + <notification name="NoPermsNoRemoval"> + 權é™ç³»çµ±ä¸å…許從模擬器移除物件 '[OBJ_NAME]'。 + </notification> + <notification name="NoModNoSaveSelection"> + 無法儲å˜ä½ 所é¸çš„ï¼Œå› ç‚ºä½ ç„¡æ¬Šä¿®æ”¹ '[OBJ_NAME]' 物件。 + </notification> + <notification name="NoCopyNoSaveSelection"> + 無法儲å˜ä½ 所é¸çš„ï¼Œå› ç‚ºç‰©ä»¶ '[OBJ_NAME]' ä¸å¯è¤‡è£½ã€‚ + </notification> + <notification name="NoModNoTaking"> + 無法拿å–ä½ æ‰€é¸çš„ï¼Œå› ç‚ºä½ ç„¡æ¬Šä¿®æ”¹ '[OBJ_NAME]' 物件。 + </notification> + <notification name="RezDestInternalError"> + 內部錯誤:未知的目的地類型。 + </notification> + <notification name="DeleteFailObjNotFound"> + åˆªé™¤å¤±æ•—ï¼Œå› ç‚ºæ‰¾ä¸åˆ°ç‰©ä»¶ + </notification> + <notification name="SorryCantEjectUser"> + 抱æ‰ï¼Œç„¡æ³•è¸¢å‡ºè©²ç”¨æˆ¶ã€‚ + </notification> + <notification name="RegionSezNotAHome"> + æ¤åœ°å€ä¸è¨±ä½ 在æ¤è¨å®šã€Œæˆ‘的家ã€ã€‚ + </notification> + <notification name="HomeLocationLimits"> + ä½ åªèƒ½åœ¨è‡ªå·±çš„土地或大陸資訊ä¸å¿ƒä¸Šè¨å®šã€Œæˆ‘的家ã€ã€‚ + </notification> + <notification name="HomePositionSet"> + 我的家ä½ç½®å·²å®šã€‚ + </notification> + <notification name="AvatarEjected"> + 化身已被踢出。 + </notification> + <notification name="AvatarEjectFailed"> + è¸¢å‡ºå¤±æ•—ï¼Œå› ç‚ºä½ åœ¨è©²åœ°æ®µæ²’æœ‰ç®¡ç†å“¡æ¬Šé™ã€‚ + </notification> + <notification name="CantMoveObjectParcelFull"> + 無法移動 '[OBJECT_NAME]' 物件到 +åœ°å€ [REGION_NAME] çš„ [OBJ_POSITION]ï¼Œå› ç‚ºè©²ç›®æ¨™åœ°æ®µå·²æ»¿è¼‰ã€‚ + </notification> + <notification name="CantMoveObjectParcelPerms"> + 無法移動 '[OBJECT_NAME]' 物件到 +åœ°å€ [REGION_NAME] çš„ [OBJ_POSITION]ï¼Œå› ç‚ºæ¤åœ°æ®µä¸å…è¨±ä½ çš„ç‰©ä»¶ã€‚ + </notification> + <notification name="CantMoveObjectParcelResources"> + 無法移動 '[OBJECT_NAME]' 物件到 + [REGION_NAME] 地å€çš„ [OBJ_POSITION]ï¼Œå› ç‚ºæ¤åœ°æ®µè³‡æºä¸è¶³å®¹ç´æ¤ç‰©ä»¶ã€‚ + </notification> + <notification name="CantMoveObjectRegionVersion"> + 無法移動 '[OBJECT_NAME]' 物件到 + [REGION_NAME] 地å€çš„ [OBJ_POSITION]ï¼Œå› ç‚ºè©²åœ°å€æ‰€åŸ·è¡Œçš„軟體版本éŽèˆŠï¼Œä¸æ”¯æ´è·¨åœ°å€æŽ¥å—這個物件。 + </notification> + <notification name="CantMoveObjectNavMesh"> + 無法移動 '[OBJECT_NAME]' 物件到 +åœ°å€ [REGION_NAME] çš„ [OBJ_POSITION]ï¼Œå› ç‚ºä½ ä¸å¾—修改跨越地å€ç•Œé™çš„導航網é¢ã€‚ + </notification> + <notification name="CantMoveObjectWTF"> + 無法移動 '[OBJECT_NAME]' 物件到 +åœ°å€ [REGION_NAME] çš„ [OBJ_POSITION]ï¼ŒåŽŸå› ä¸æ˜Žã€‚ ([FAILURE_TYPE]) + </notification> + <notification name="NoPermModifyObject"> + ä½ ç„¡æ¬Šè®Šæ›´è©²ç‰©ä»¶ + </notification> + <notification name="CantEnablePhysObjContributesToNav"> + å°å°Žèˆªç¶²é¢æœ‰è²¢ç»çš„物件,無法啟用物ç†ã€‚ + </notification> + <notification name="CantEnablePhysKeyframedObj"> + éµæ ¼å‹•ç•«ç‰©ä»¶ç„¡æ³•å•Ÿç”¨ç‰©ç†ã€‚ + </notification> + <notification name="CantEnablePhysNotEnoughLandResources"> + 無法啟用物件的物ç†â€”—土地資æºä¸è¶³ã€‚ + </notification> + <notification name="CantEnablePhysCostTooGreat"> + 物件的物ç†è³‡æºæˆæœ¬è¶…éŽ [MAX_OBJECTS]ï¼Œç„¡æ³•å•Ÿç”¨ç‰©ç† + </notification> + <notification name="PhantomWithConcavePiece"> + æ¤ç‰©ä»¶ä¸å¾—有凹é¢éƒ¨ä»¶ï¼Œå› 為物件是幻影物件,å°å°Žèˆªç¶²é¢æœ‰è²¢ç»ã€‚ + </notification> + <notification name="UnableAddItem"> + ç„¡æ³•æ–°å¢žé …ç›®ï¼ + </notification> + <notification name="UnableEditItem"> + ç„¡æ³•ç·¨è¼¯é€™é …ç›®ï¼ + </notification> + <notification name="NoPermToEdit"> + ç„¡æ¬Šç·¨è¼¯é€™é …ç›®ã€‚ + </notification> + <notification name="NoPermToCopyInventory"> + 無權複製該收ç´å€ã€‚ + </notification> + <notification name="CantSaveItemDoesntExist"> + 無法儲å˜åˆ°ç‰©ä»¶å…§å®¹ï¼šè©²é …目已ä¸å˜åœ¨ã€‚ + </notification> + <notification name="CantSaveItemAlreadyExists"> + 無法儲å˜åˆ°ç‰©ä»¶å…§å®¹ï¼šæ”¶ç´å€å·²å˜åœ¨åŒåç¨±çš„é …ç›® + </notification> + <notification name="CantSaveModifyAttachment"> + 無法儲å˜åˆ°ç‰©ä»¶å…§å®¹ï¼šé€™éº¼åšå°‡ä¿®æ”¹é™„件的權é™ã€‚ + </notification> + <notification name="TooManyScripts"> + 腳本太多。 + </notification> + <notification name="UnableAddScript"> + ç„¡æ³•æ–°å¢žè…³æœ¬ï¼ + </notification> + <notification name="AssetServerTimeoutObjReturn"> + 資產伺æœå™¨æœªåœ¨æ£å¸¸æ™‚é–“å…§å應。 物件已返交模擬器。 + </notification> + <notification name="RegionDisablePhysicsShapes"> + 本地å€æœªå•Ÿç”¨ç‰©ç†å½¢ç‹€ã€‚ + </notification> + <notification name="NoModNavmeshAcrossRegions"> + ä½ ç„¡æ³•è®Šæ›´è·¨è¶Šåœ°å€ç•Œé™çš„導航網é¢ã€‚ + </notification> + <notification name="NoSetPhysicsPropertiesOnObjectType"> + 該物件類型ä¸å¾—è¨å®šç‰©ç†æ€§è³ªã€‚ + </notification> + <notification name="NoSetRootPrimWithNoShape"> + æ ¹å¹¾ä½•å…ƒä»¶ç„¡æ³•è¨æˆç„¡å½¢ç‹€ã€‚ + </notification> + <notification name="NoRegionSupportPhysMats"> + 本地å€æœªå•Ÿç”¨ç‰©ç†æ料。 + </notification> + <notification name="OnlyRootPrimPhysMats"> + åªèƒ½èª¿æ•´æ ¹å¹¾ä½•å…ƒä»¶çš„物ç†æ料。 + </notification> + <notification name="NoSupportCharacterPhysMats"> + å°šä¸æ”¯æ´è§’色è¨å®šç‰©ç†æ料。 + </notification> + <notification name="InvalidPhysMatProperty"> + 指定的物ç†æ料屬性ä¸ï¼Œè‡³å°‘有一個無效。 + </notification> + <notification name="NoPermsAlterStitchingMeshObj"> + 網é¢ç‰©ä»¶çš„縫åˆé¡žåž‹ä¸å¾—變更。 + </notification> + <notification name="NoPermsAlterShapeMeshObj"> + 網é¢ç‰©ä»¶çš„形狀ä¸å¾—變更。 + </notification> + <notification name="FullRegionCantEnter"> + ä½ ç„¡æ³•é€²å…¥é€™åœ°å€ï¼Œ\nå› ç‚ºåœ°å€æ»¿è¼‰ã€‚ + </notification> + <notification name="LinkFailedOwnersDiffer"> + è¯çµå¤±æ•———所有人ä¸åŒ + </notification> + <notification name="LinkFailedNoModNavmeshAcrossRegions"> + è¯çµå¤±æ•———無法修改跨越地å€ç•Œé™çš„導航網é¢ã€‚ + </notification> + <notification name="LinkFailedNoPermToEdit"> + è¯çµå¤±æ•—ï¼Œä½ ç„¡æ¬Šç·¨è¼¯ã€‚ + </notification> + <notification name="LinkFailedTooManyPrims"> + è¯çµå¤±æ•———幾何元件太多 + </notification> + <notification name="LinkFailedCantLinkNoCopyNoTrans"> + è¯çµå¤±æ•———無法將「ç¦æ¢è¤‡è£½ã€å’Œã€Œç¦æ¢è½‰ç§»ã€ç‰©ä»¶è¯çµèµ·ä¾† + </notification> + <notification name="LinkFailedNothingLinkable"> + è¯çµå¤±æ•———沒有å¯è¯çµçš„æ±è¥¿ã€‚ + </notification> + <notification name="LinkFailedTooManyPathfindingChars"> + è¯çµå¤±æ•———尋徑角色太多 + </notification> + <notification name="LinkFailedInsufficientLand"> + è¯çµå¤±æ•———土地資æºä¸è¶³ + </notification> + <notification name="LinkFailedTooMuchPhysics"> + 物件使用了éŽå¤šç‰©ç†è³‡æºï¼Œå…¶å‹•æ…‹ç‰¹æ€§å·²è¢«åœç”¨ã€‚ + </notification> + <notification name="TeleportedHomeByObjectOnParcel"> + ä½ å·²è¢« '[PARCEL_NAME]' 地段的物件 '[OBJECT_NAME]' æˆåŠŸçž¬é–“傳é€å›žå®¶ + </notification> + <notification name="TeleportedHomeByObject"> + ä½ å·²æˆåŠŸè¢«ç‰©ä»¶ '[OBJECT_NAME]' 瞬間傳é€å›žå®¶ + </notification> + <notification name="TeleportedByAttachment"> + ä½ å·²æˆåŠŸè¢« [ITEM_ID] ä¸Šçš„ä¸€å€‹é™„ä»¶çž¬é–“å‚³é€ + </notification> + <notification name="TeleportedByObjectOnParcel"> + ä½ å·²æˆåŠŸè¢« '[PARCEL_NAME]' 地段的物件 '[OBJECT_NAME]' çž¬é–“å‚³é€ + </notification> + <notification name="TeleportedByObjectOwnedBy"> + ä½ å·²æˆåŠŸè¢« [OWNER_ID] æ“有的物件 '[OBJECT_NAME]' çž¬é–“å‚³é€ + </notification> + <notification name="TeleportedByObjectUnknownUser"> + ä½ å·²æˆåŠŸè¢«æŸæœªçŸ¥ç”¨æˆ¶æ“有的物件 '[OBJECT_NAME]' 瞬間傳é€ã€‚ + </notification> + <notification name="CantCreateObjectRegionFull"> + 無法建立è¦æ±‚的物件。 地å€å·²æ»¿è¼‰ã€‚ + </notification> + <notification name="CantAttackMultipleObjOneSpot"> + ä½ ä¸èƒ½å°‡å¤šå€‹ç‰©ä»¶é™„著到åŒä¸€å€‹é»žã€‚ + </notification> + <notification name="CantCreateMultipleObjAtLoc"> + ä½ ä¸èƒ½åœ¨æ¤å»ºç«‹å¤šå€‹ç‰©ä»¶ã€‚ + </notification> + <notification name="UnableToCreateObjTimeOut"> + 無法建立è¦æ±‚的物件。 物件在資料庫ä¸æ‰¾ä¸åˆ°ã€‚ + </notification> + <notification name="UnableToCreateObjUnknown"> + 無法建立è¦æ±‚的物件。 è¦æ±‚逾時,無法完æˆã€‚ è«‹å†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="UnableToCreateObjMissingFromDB"> + 無法建立è¦æ±‚的物件。 è«‹å†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="RezFailureTookTooLong"> + 物件產生失敗,è¦æ±‚的物件載入時間太久。 + </notification> + <notification name="FailedToPlaceObjAtLoc"> + 無法將物件置於指定地點。 è«‹å†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="CantCreatePlantsOnLand"> + ä½ ä¸å¾—在這土地上建立æ¤ç‰©ã€‚ + </notification> + <notification name="CantRestoreObjectNoWorldPos"> + 無法æ¢å¾©ç‰©ä»¶ã€‚ 找ä¸åˆ°è™›æ“¬ä¸–界的ä½ç½®ã€‚ + </notification> + <notification name="CantRezObjectInvalidMeshData"> + 無法產生物件,它的網é¢è³‡æ–™ç„¡æ•ˆã€‚ + </notification> + <notification name="CantRezObjectTooManyScripts"> + ç„¡æ³•ç”¢ç”Ÿç‰©ä»¶ï¼Œå› ç‚ºé€™åœ°å€å·²æœ‰å¤ªå¤šçš„腳本。 + </notification> + <notification name="CantCreateObjectNoAccess"> + ä½ ç„¡æ¬Šåœ¨æ¤å»ºç«‹ç‰©ä»¶ã€‚ + </notification> + <notification name="CantCreateObject"> + ä½ æ¤æ™‚無權建立物件。 + </notification> + <notification name="InvalidObjectParams"> + 無效的物件åƒæ•¸ + </notification> + <notification name="CantDuplicateObjectNoAcess"> + ä½ æ¬Šé™ä¸å¤ ,無法在æ¤è¤‡è£½ç‰©ä»¶ã€‚ + </notification> + <notification name="CantChangeShape"> + ä½ ç„¡æ¬Šè®Šæ›´é€™å€‹å½¢ç‹€ã€‚ + </notification> + <notification name="NoAccessToClaimObjects"> + ä½ æ¬Šé™ä¸å¤ ,無法在æ¤æ”¶å–物件。 + </notification> + <notification name="DeedFailedNoPermToDeedForGroup"> + è®“æ¸¡å¤±æ•—ï¼Œä½ ç„¡æ¬Šç‚ºä½ çš„ç¾¤çµ„è®“æ¸¡ç‰©ä»¶ã€‚ + </notification> + <notification name="NoPrivsToBuyObject"> + ä½ æ¬Šé™ä¸å¤ ,無法在æ¤è³¼è²·ç‰©ä»¶ã€‚ + </notification> + <notification name="CantAttachObjectAvatarSittingOnIt"> + 無法附著物件,有個化身æ£å在物件上。 + </notification> + <notification name="WhyAreYouTryingToWearShrubbery"> + 樹和è‰ä¸èƒ½ç•¶é™„件穿戴。 + </notification> + <notification name="CantAttachGroupOwnedObjs"> + 無法附著群組所æ“有的物件。 + </notification> + <notification name="CantAttachObjectsNotOwned"> + 無法附著ä¸æ˜¯ä½ æ“有的物件。 + </notification> + <notification name="CantAttachNavmeshObjects"> + 無法附著å°å°Žèˆªç¶²é¢æœ‰è²¢ç»çš„物件。 + </notification> + <notification name="CantAttachObjectNoMovePermissions"> + ç„¡æ³•é™„è‘—ç‰©ä»¶ï¼Œä½ ç„¡æ¬Šç§»å‹•è©²ç‰©ä»¶ã€‚ + </notification> + <notification name="CantAttachNotEnoughScriptResources"> + 腳本資æºä¸è¶³ï¼Œç„¡æ³•é™„è‘—ç‰©ä»¶ï¼ + </notification> + <notification name="CantDropItemTrialUser"> + ä½ ç„¡æ³•åœ¨æ¤å¸é™¤ç‰©ä»¶ï¼Œè«‹åˆ°ã€Œè‡ªç”±å˜—試ã€å€åŸŸå†è©¦ã€‚ + </notification> + <notification name="CantDropMeshAttachment"> + ä½ ç„¡æ³•åœ¨æ¤å¸é™¤é™„件。 è«‹é¸æ“‡æŠŠå¸é™¤é™„件é€å›žæ”¶ç´å€ï¼Œå†é‡æ–°æˆå½¢ã€‚ + </notification> + <notification name="CantDropAttachmentNoPermission"> + å¸é™¤é™„ä»¶å¤±æ•—ï¼šä½ ç„¡æ¬Šåœ¨æ¤è™•å¸é™¤ã€‚ + </notification> + <notification name="CantDropAttachmentInsufficientLandResources"> + å¸é™¤é™„件失敗:å¯ç”¨åœŸåœ°è³‡æºä¸è¶³ã€‚ + </notification> + <notification name="CantDropAttachmentInsufficientResources"> + å¸é™¤é™„件失敗:å¯ç”¨è³‡æºä¸è¶³ã€‚ + </notification> + <notification name="CantDropObjectFullParcel"> + 無法在æ¤å¸é™¤ç‰©ä»¶ã€‚ 地段滿載。 + </notification> + <notification name="CantTouchObjectBannedFromParcel"> + 無法觸摸/抓å–æ¤ç‰©ä»¶ï¼Œå› ç‚ºä½ åœ¨è©²åœŸåœ°åœ°æ®µéç¦ã€‚ + </notification> + <notification name="PlzNarrowDeleteParams"> + 請將刪除åƒæ•¸ç¯„åœèª¿å°ä¸€é»žã€‚ + </notification> + <notification name="UnableToUploadAsset"> + 無法上傳資產。 + </notification> + <notification name="CantTeleportCouldNotFindUser"> + 找ä¸åˆ°è¦çž¬é–“傳é€åˆ°å®¶çš„用戶 + </notification> + <notification name="GodlikeRequestFailed"> + è¦æ±‚神的權力失敗 + </notification> + <notification name="GenericRequestFailed"> + 普通請求失敗 + </notification> + <notification name="CantUploadPostcard"> + 無法上傳明信片。 è«‹ç¨å€™å†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="CantFetchInventoryForGroupNotice"> + 無法å–得群組通知的收ç´å€ç´°ç¯€ã€‚ + </notification> + <notification name="CantSendGroupNoticeNotPermitted"> + 無法é€å‡ºç¾¤çµ„通知——未准許。 + </notification> + <notification name="CantSendGroupNoticeCantConstructInventory"> + 無法é€å‡ºç¾¤çµ„通知——收ç´å€å»ºç«‹å¤±æ•—。 + </notification> + <notification name="CantParceInventoryInNotice"> + 無法剖æžé€šçŸ¥è£¡çš„收ç´å“é …ã€‚ + </notification> + <notification name="TerrainUploadFailed"> + 地形上傳失敗。 + </notification> + <notification name="TerrainFileWritten"> + 地形檔案已寫入。 + </notification> + <notification name="TerrainFileWrittenStartingDownload"> + 地形檔案已寫入,開始下載…… + </notification> + <notification name="TerrainBaked"> + 地形已定貌。 + </notification> + <notification name="TenObjectsDisabledPlzRefresh"> + åªæˆåŠŸåœç”¨å‰ 10 個所é¸ç‰©ä»¶ã€‚ 若有需è¦ï¼Œè«‹åˆ·æ–°ä¹‹å¾Œå†é¸å–æ›´å¤šçš„é …ç›®ã€‚ + </notification> + <notification name="UpdateViewerBuyParcel"> + ä½ å¿…é ˆå…ˆæ›´æ–°ç€è¦½å™¨å¾Œï¼Œæ‰å¯è³¼è²·é€™å€‹åœ°æ®µã€‚ + </notification> + <notification name="CantBuyParcelNotForSale"> + 無法購買,æ¤åœ°æ®µä¸ä¾›å‡ºå”®ã€‚ + </notification> + <notification name="CantBuySalePriceOrLandAreaChanged"> + 無法購買,售價或土地é¢ç©å·²è®Šã€‚ + </notification> + <notification name="CantBuyParcelNotAuthorized"> + ä½ ä¸æ˜¯æ¤åœ°æ®µçš„ç²æŽˆæ¬Šçš„買主。 + </notification> + <notification name="CantBuyParcelAwaitingPurchaseAuth"> + ä½ ç„¡æ³•è³¼è²·æ¤åœ°æ®µï¼Œè©²åœ°æ®µå·²åœ¨ç‰å€™æ‰¹å‡†è³¼è²· + </notification> + <notification name="CantBuildOverflowParcel"> + ä½ ä¸å¾—在æ¤å»ºç«‹ç‰©ä»¶ï¼Œé€™éº¼åšå°‡å°Žè‡´åœ°æ®µè¶…載。 + </notification> + <notification name="SelectedMultipleOwnedLand"> + ä½ é¸æ“‡çš„土地範åœï¼Œç‚ºä¸åŒäººæ‰€æ“有。 請縮å°é¸æ“‡ç¯„åœï¼Œå†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="CantJoinTooFewLeasedParcels"> + 未é¸å–è¶³å¤ ç§Ÿç”¨åœ°æ®µï¼Œç„¡æ³•åˆä½µã€‚ + </notification> + <notification name="CantDivideLandMultipleParcelsSelected"> + 無法分割土地,\nå› ç‚ºä½ é¸å–了多個地段,\n請縮å°æ‰€é¸åœŸåœ°ã€‚ + </notification> + <notification name="CantDivideLandCantFindParcel"> + 無法分割土地。\n找ä¸åˆ°åœ°æ®µã€‚\n請到「幫助 > å›žå ±éŒ¯èª¤â€¦â€¦ã€å›žå ±å•é¡Œ + </notification> + <notification name="CantDivideLandWholeParcelSelected"> + 無法分割土地。 é¸å–了整個地段。\n請試著縮å°æ‰€é¸çš„土地。 + </notification> + <notification name="LandHasBeenDivided"> + 土地分割æˆåŠŸã€‚ + </notification> + <notification name="PassPurchased"> + ä½ è³¼è²·äº†é€šè¡Œæ¬Šã€‚ + </notification> + <notification name="RegionDisallowsClassifieds"> + 地å€ä¸å…許分類廣告。 + </notification> + <notification name="LandPassExpireSoon"> + ä½ åœ¨æ¤åœŸåœ°çš„通行權å³å°‡åˆ°æœŸå¤±æ•ˆã€‚ + </notification> + <notification name="CantSitNoSuitableSurface"> + 沒有åˆé©çš„表é¢è®“ä½ å下,請試一試別處。 + </notification> + <notification name="CantSitNoRoom"> + é€™è£¡æ²’æœ‰ç©ºé–“è®“ä½ å下,請試試å¦ä¸€è™•ã€‚ + </notification> + <notification name="ClaimObjectFailedNoPermission"> + 收å–ç‰©ä»¶å¤±æ•—ï¼Œå› ç‚ºä½ æ¬Šé™ä¸è¶³ã€‚ + </notification> + <notification name="ClaimObjectFailedNoMoney"> + 收å–ç‰©ä»¶å¤±æ•—ï¼Œå› ç‚ºä½ L$ 金é¡ä¸è¶³ã€‚ + </notification> + <notification name="CantDeedGroupLand"> + 無法讓渡群組所æ“有的土地。 + </notification> + <notification name="BuyObjectFailedNoMoney"> + è³¼è²·ç‰©ä»¶å¤±æ•—ï¼Œä½ L$ 金é¡ä¸è¶³ã€‚ + </notification> + <notification name="BuyInventoryFailedNoMoney"> + 購買收ç´å€å¤±æ•—ï¼Œä½ L$ 金é¡ä¸è¶³ã€‚ + </notification> + <notification name="BuyPassFailedNoMoney"> + ä½ çš„ L$ ä¸è¶³ï¼Œç„¡æ³•è³¼è²·æ¤åœŸåœ°çš„通行權。 + </notification> + <notification name="CantBuyPassTryAgain"> + æ¤æ™‚無法購買通行權。 è«‹ç¨å€™å†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="CantCreateObjectParcelFull"> + 無法建立物件,\n地段滿載。 + </notification> + <notification name="FailedPlacingObject"> + 無法將物件置於指定地點。 è«‹å†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="CantCreateLandmarkForEvent"> + 無法為活動建立地標。 + </notification> + <notification name="GodBeatsFreeze"> + ä½ æ“有的神力解除了å‡çµï¼ + </notification> + <notification name="SpecialPowersRequestFailedLogged"> + è¦æ±‚特殊能力失敗。 該è¦æ±‚已載入記錄。 + </notification> + <notification name="ExpireExplanation"> + 系統æ¤æ™‚無法處ç†ä½ çš„è¦æ±‚。 è¦æ±‚逾時,無法完æˆã€‚ + </notification> + <notification name="DieExplanation"> + 系統無法處ç†ä½ çš„è¦æ±‚。 + </notification> + <notification name="AddPrimitiveFailure"> + 金é¡ä¸è¶³ï¼Œç„¡æ³•å»ºç«‹å¹¾ä½•å…ƒä»¶ã€‚ + </notification> + <notification name="RezObjectFailure"> + 金é¡ä¸è¶³ï¼Œç„¡æ³•å»ºç«‹ç‰©ä»¶ã€‚ + </notification> + <notification name="ResetHomePositionNotLegal"> + å·²é‡è¨ã€Œæˆ‘的家ã€ä½ç½®ï¼Œå› 為å‰ä¸€å€‹ä½ç½®ä¸åˆæ³•ã€‚ + </notification> + <notification name="CantInviteRegionFull"> + æ¤åˆ»ä½ ç„¡æ³•é‚€è«‹ä»»ä½•äººåˆ°ä½ çš„ä½ç½®ï¼Œå› 為地å€æ»¿è¼‰ã€‚ è«‹ç¨å€™å†è©¦ä¸€æ¬¡ã€‚ + </notification> + <notification name="CantSetHomeAtRegion"> + æ¤åœ°å€ä¸è¨±ä½ 在æ¤è¨å®šã€Œæˆ‘的家ã€ã€‚ + </notification> + <notification name="ListValidHomeLocations"> + ä½ åªèƒ½åœ¨è‡ªå·±çš„土地或大陸資訊ä¸å¿ƒä¸Šè¨å®šã€Œæˆ‘的家ã€ã€‚ + </notification> + <notification name="SetHomePosition"> + 我的家ä½ç½®å·²å®šã€‚ + </notification> + <notification name="CantDerezInventoryError"> + 收ç´å€å‡ºéŒ¯ï¼Œç„¡æ³•æ”¶ç´ç‰©ä»¶ã€‚ + </notification> + <notification name="CantCreateRequestedInv"> + 無法建立è¦æ±‚的收ç´å€ã€‚ + </notification> + <notification name="CantCreateRequestedInvFolder"> + 無法建立è¦æ±‚的收ç´å€è³‡æ–™å¤¾ã€‚ + </notification> + <notification name="CantCreateInventory"> + 無法建立該收ç´å€ã€‚ + </notification> + <notification name="CantCreateLandmark"> + 無法建立地標。 + </notification> + <notification name="CantCreateOutfit"> + æ¤æ™‚無法建立è£æ‰®ã€‚ è«‹éŽä¸€åˆ†é˜å¾Œå†è©¦ã€‚ + </notification> + <notification name="InventoryNotForSale"> + 收ç´å€æ²’有待售。 + </notification> + <notification name="CantFindInvItem"> + 找ä¸åˆ°æ”¶ç´å€ç‰©é …。 + </notification> + <notification name="CantFindObject"> + 找ä¸åˆ°ç‰©ä»¶ã€‚ + </notification> + <notification name="CantTransfterMoneyRegionDisabled"> + æ¤åœ°å€ç›®å‰æœªå•Ÿç”¨è½‰ç§»é‡‘錢給物件的功能。 + </notification> + <notification name="CantPayNoAgent"> + 無法決定付款給誰。 + </notification> + <notification name="CantDonateToPublicObjects"> + ä½ ç„¡æ³•å°‡ L$ é€çµ¦å…¬å…±ç‰©ä»¶ã€‚ + </notification> + <notification name="InventoryCreationInWorldObjectFailed"> + é‡å°è™›æ“¬ä¸–界物件建立收ç´å€å¤±æ•—。 + </notification> + <notification name="UserBalanceOrLandUsageError"> + ç™¼ç”Ÿå…§éƒ¨éŒ¯èª¤ï¼Œæˆ‘å€‘ç„¡æ³•å¦‚å¸¸æ›´æ–°ä½ çš„ç€è¦½å™¨ã€‚ ä½ ç€è¦½å™¨é¡¯ç¤ºçš„ L$ 餘é¡æˆ–æ“有地段,å¯èƒ½å’Œä¼ºæœå™¨ä¸Šçš„æ£ç¢ºæ•¸é¡ä¸ä¸€è‡´ã€‚ + </notification> + <notification name="LargePrimAgentIntersect"> + 無法建立和其他åƒèˆ‡è€…發生交截的大型幾何元件。 è«‹ç‰å…¶ä»–åƒèˆ‡è€…移開後å†è©¦ã€‚ + </notification> + <notification name="PreferenceChatClearLog"> + 這動作將刪除先å‰äº¤è«‡çš„記錄,和所有記錄備份。 + <usetemplate ignoretext="刪除先å‰äº¤è«‡è¨˜éŒ„å‰ï¼Œå…ˆå‘我確èªã€‚" name="okcancelignore" notext="å–消" yestext="確定"/> + </notification> + <notification name="PreferenceChatDeleteTranscripts"> + 這將刪除所有先å‰äº¤è«‡çš„內容記錄。 éŽåŽ»äº¤è«‡æ·å²æ¸…å–®ä¸å—影響。 資料夾 [FOLDER] 所有副檔å .txt å’Œ txt.backup 的檔案都將刪除。 + <usetemplate ignoretext="刪除交談內容記錄å‰å…ˆå‘我確èªã€‚" name="okcancelignore" notext="å–消" yestext="確定"/> + </notification> + <notification name="PreferenceChatPathChanged"> + 無法移動檔案。 å·²æ¢å¾©å‰ä¸€å€‹è·¯å¾‘。 + <usetemplate ignoretext="無法移動檔案。 å·²æ¢å¾©å‰ä¸€å€‹è·¯å¾‘。" name="okignore" yestext="確定"/> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml index 1c8b56b3d6..e0a49a0add 100644 --- a/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml @@ -27,5 +27,6 @@ <icon name="permission_edit_mine_icon" tool_tip="這ä½æœ‹å‹èƒ½ç·¨è¼¯ã€åˆªé™¤æˆ–å–å¾—ä½ çš„ç‰©ä»¶"/> <icon name="permission_map_icon" tool_tip="這ä½æœ‹å‹èƒ½åœ¨åœ°åœ–ä¸Šæ‰¾åˆ°ä½ çš„ä½ç½®"/> <icon name="permission_online_icon" tool_tip="這ä½æœ‹å‹ç•¶ä½ 上線能看到訊æ¯"/> + <button name="info_btn" tool_tip="詳情"/> <button name="profile_btn" tool_tip="察看檔案"/> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml index 1dfa024138..9f59bb32f8 100644 --- a/indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="block_list_panel"> - <text name="title_text"> - å°éŽ–清單 - </text> - <scroll_list name="blocked" tool_tip="ç›®å‰å°éŽ–的居民清單"/> - <button label="å°éŽ–他人" name="Block resident..." tool_tip="挑é¸ä¸€ä½å±…民以進行å°éŽ–"/> - <button label="ä¾å稱å°éŽ–物件" name="Block object by name..." tool_tip="ä¾å稱挑é¸ä¸€å€‹ç‰©ä»¶é€²è¡Œå°éŽ–"/> - <button label="解除å°éŽ–" name="Unblock" tool_tip="將居民或物件由å°éŽ–清單ä¸ç§»é™¤"/> + <panel label="bottom_panel" name="blocked_buttons_panel"> + <filter_editor label="éŽæ¿¾å™¨" name="blocked_filter_input"/> + <menu_button name="blocked_gear_btn" tool_tip="å°æ‰€é¸çš„人或物件採å–動作"/> + <menu_button name="view_btn" tool_tip="排åºé¸é …"/> + <menu_button name="plus_btn" tool_tip="挑é¸ä¸€ä½å±…æ°‘æˆ–ç‰©ä»¶ï¼ŒåŠ ä»¥å°éŽ–"/> + <button name="unblock_btn" tool_tip="將居民或物件由å°éŽ–清單ä¸ç§»é™¤"/> + </panel> + <block_list name="blocked" tool_tip="ç›®å‰å°éŽ–的居民清單"/> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/zh/panel_conversation_list_item.xml new file mode 100644 index 0000000000..6524d41645 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/panel_conversation_list_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_list_item"> + <layout_stack name="conversation_item_stack"> + <layout_panel name="conversation_title_panel"> + <text name="conversation_title" value="(載入ä¸ï¼‰"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/zh/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/zh/panel_conversation_log_list_item.xml new file mode 100644 index 0000000000..8446ce2130 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/panel_conversation_log_list_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="conversation_log_list_item"> + <icon name="voice_session_icon" tool_tip="包å«èªžéŸ³äº¤è«‡"/> + <icon name="unread_ims_icon" tool_tip="訊æ¯åœ¨ä½ 登出期間傳來"/> + <button name="delete_btn" tool_tip="移除æ¤é …ç›®"/> +</panel> diff --git a/indra/newview/skins/default/xui/zh/panel_group_list_item.xml b/indra/newview/skins/default/xui/zh/panel_group_list_item.xml index 175293cdf7..fec4bb572a 100644 --- a/indra/newview/skins/default/xui/zh/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/zh/panel_group_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="group_list_item"> <text name="group_name" value="未知"/> + <button name="info_btn" tool_tip="詳情"/> <button name="profile_btn" tool_tip="察看檔案"/> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_people.xml b/indra/newview/skins/default/xui/zh/panel_people.xml index 59ea7b70e2..5f7aca387a 100644 --- a/indra/newview/skins/default/xui/zh/panel_people.xml +++ b/indra/newview/skins/default/xui/zh/panel_people.xml @@ -14,81 +14,53 @@ <string name="no_filtered_friends_msg"> 找ä¸åˆ°ä½ è¦æ‰¾çš„嗎? 請試試[secondlife:///app/search/people/[SEARCH_TERM] æœå°‹]。 </string> - <string name="people_filter_label" value="人員éŽæ¿¾å™¨"/> - <string name="groups_filter_label" value="群組éŽæ¿¾å™¨"/> <string name="no_filtered_groups_msg" value="找ä¸åˆ°ä½ è¦æ‰¾çš„嗎? 請試試[secondlife:///app/search/groups/[SEARCH_TERM] æœå°‹]。"/> <string name="no_groups_msg" value="è¦å°‹æ‰¾ç¾¤çµ„è€ƒæ…®åŠ å…¥å—Žï¼Ÿ 請試試[secondlife:///app/search/groups æœå°‹]。"/> <string name="MiniMapToolTipMsg" value="[REGION](雙擊以開啟地圖,按下 shift éµæ‹–曳來平移)"/> <string name="AltMiniMapToolTipMsg" value="[REGION](雙擊以瞬間傳é€ï¼ŒæŒ‰ä¸‹ shift éµæ‹–曳來平移)"/> - <filter_editor label="éŽæ¿¾å™¨" name="filter_input"/> <tab_container name="tabs"> <panel label="附近" name="nearby_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="nearby_view_sort_btn" tool_tip="é¸é …"/> - <button name="add_friend_btn" tool_tip="æ·»åŠ æ‰€é¸çš„å±…æ°‘åˆ°ä½ çš„æœ‹å‹æ¸…å–®"/> + <panel label="bottom_panel" name="nearby_buttons_panel"> + <filter_editor label="人員éŽæ¿¾å™¨" name="nearby_filter_input"/> + <button name="gear_btn" tool_tip="å°é¸å–的人採å–動作"/> + <menu_button name="nearby_view_btn" tool_tip="檢視/排åºçš„é¸é …"/> + <button name="add_friend_btn" tool_tip="å‘æŸä½å±…民發出交å‹é‚€è«‹"/> + <dnd_button name="nearby_del_btn" tool_tip="å°‡é¸å–的人從朋å‹å單移除"/> </panel> </panel> - <panel label="我的朋å‹" name="friends_panel"> + <panel label="朋å‹" name="friends_panel"> + <panel label="bottom_panel" name="friends_buttons_panel"> + <filter_editor label="人員éŽæ¿¾å™¨" name="friends_filter_input"/> + <button name="gear_btn" tool_tip="å°é¸å–的人採å–動作"/> + <menu_button name="friends_view_btn" tool_tip="檢視/排åºçš„é¸é …"/> + <button name="friends_add_btn" tool_tip="å‘æŸä½å±…民發出交å‹é‚€è«‹"/> + <dnd_button name="friends_del_btn" tool_tip="å°‡é¸å–的人從朋å‹å單移除"/> + </panel> <accordion name="friends_accordion"> <accordion_tab name="tab_online" title="上線"/> <accordion_tab name="tab_all" title="全部"/> </accordion> - <panel label="bottom_panel" name="bottom_panel"> - <layout_stack name="bottom_panel"> - <layout_panel name="options_gear_btn_panel"> - <menu_button name="friends_viewsort_btn" tool_tip="顯示é¡å¤–é¸é …"/> - </layout_panel> - <layout_panel name="add_btn_panel"> - <button name="add_btn" tool_tip="å‘居民發出交å‹é‚€è«‹"/> - </layout_panel> - <layout_panel name="trash_btn_panel"> - <dnd_button name="del_btn" tool_tip="ç”±ä½ çš„æœ‹å‹æ¸…單移除所é¸æ“‡çš„人"/> - </layout_panel> - </layout_stack> - </panel> </panel> - <panel label="我的群組" name="groups_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="groups_viewsort_btn" tool_tip="é¸é …"/> - <button name="plus_btn" tool_tip="åŠ å…¥ç¾¤çµ„/創立新群組"/> - <button name="activate_btn" tool_tip="啟用所é¸æ“‡çš„群組"/> + <panel label="群組" name="groups_panel"> + <panel label="bottom_panel" name="groups_buttons_panel"> + <filter_editor label="群組éŽæ¿¾å™¨" name="groups_filter_input"/> + <menu_button name="groups_gear_btn" tool_tip="å°æ‰€é¸ç¾¤çµ„採å–動作"/> + <menu_button name="groups_view_btn" tool_tip="檢視/排åºçš„é¸é …"/> + <menu_button name="plus_btn" tool_tip="åŠ å…¥ç¾¤çµ„/創立新群組"/> + <dnd_button name="minus_btn" tool_tip="離開所é¸ç¾¤çµ„"/> </panel> </panel> <panel label="最近" name="recent_panel"> - <panel label="bottom_panel" name="bottom_panel"> - <menu_button name="recent_viewsort_btn" tool_tip="é¸é …"/> - <button name="add_friend_btn" tool_tip="æ·»åŠ æ‰€é¸çš„å±…æ°‘åˆ°ä½ çš„æœ‹å‹æ¸…å–®"/> + <panel label="bottom_panel" name="recent_buttons_panel"> + <filter_editor label="人員éŽæ¿¾å™¨" name="recent_filter_input"/> + <button name="gear_btn" tool_tip="å°é¸å–的人採å–動作"/> + <menu_button name="recent_view_btn" tool_tip="檢視/排åºçš„é¸é …"/> + <button name="add_friend_btn" tool_tip="å‘æŸä½å±…民發出交å‹é‚€è«‹"/> + <dnd_button name="recent_del_btn" tool_tip="å°‡é¸å–的人從朋å‹å單移除"/> </panel> </panel> + <panel label="å·²å°éŽ–çš„" name="blocked_panel"> + <panel label="被å°éŽ–的居民與物件" name="panel_block_list_sidetray"/> + </panel> </tab_container> - <panel name="button_bar"> - <layout_stack name="bottom_bar_ls"> - <layout_panel name="view_profile_btn_lp"> - <button label="檔案" name="view_profile_btn" tool_tip="顯示圖片ã€ç¾¤çµ„與其他居民資訊"/> - </layout_panel> - <layout_panel name="im_btn_lp"> - <button label="IM" name="im_btn" tool_tip="é–‹å•Ÿå³æ™‚訊æ¯æœƒè©±"/> - </layout_panel> - <layout_panel name="call_btn_lp"> - <button label="通話" name="call_btn" tool_tip="和這ä½å±…民通話"/> - </layout_panel> - <layout_panel name="share_btn_lp"> - <button label="分享" name="share_btn" tool_tip="分享一個收ç´å€ç‰©å“"/> - </layout_panel> - <layout_panel name="teleport_btn_lp"> - <button label="瞬間傳é€" name="teleport_btn" tool_tip="發出瞬間傳é€é‚€è«‹"/> - </layout_panel> - </layout_stack> - <layout_stack name="bottom_bar_ls1"> - <layout_panel name="group_info_btn_lp"> - <button label="群組檔案" name="group_info_btn" tool_tip="顯示群組資訊"/> - </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="群組èŠå¤©" name="chat_btn" tool_tip="é–‹å•ŸèŠå¤©æœƒè©±"/> - </layout_panel> - <layout_panel name="group_call_btn_lp"> - <button label="群組通話" name="group_call_btn" tool_tip="與æ¤ç¾¤çµ„進行通話"/> - </layout_panel> - </layout_stack> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml index cf2f81d313..e700e35516 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml @@ -1,34 +1,86 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="æ–‡å—èŠå¤©" name="chat"> - <text name="font_size"> - å—型尺寸: - </text> - <radio_group name="chat_font_size"> - <radio_item label="å°" name="radio" value="0"/> - <radio_item label="ä¸" name="radio2" value="1"/> - <radio_item label="大" name="radio3" value="2"/> - </radio_group> - <check_box initial_value="true" label="èŠå¤©æ™‚æ’放打å—動作" name="play_typing_animation"/> - <check_box label="當我離線時將收到的 IM 訊æ¯éƒµå¯„給我" name="send_im_to_email"/> - <check_box label="啟用純本文 IM 與èŠå¤©æ·å²ç´€éŒ„" name="plain_text_chat_history"/> - <check_box label="èŠå¤©æ³¡æ³¡" name="bubble_text_chat"/> - <text name="show_ims_in_label"> - 顯示 IMs 於: - </text> - <text name="requires_restart_label"> - ï¼ˆé ˆé‡æ–°å•Ÿå‹•ï¼‰ - </text> - <radio_group name="chat_window" tool_tip="é¡¯ç¤ºä½ çš„å³æ™‚訊æ¯åœ¨åˆ†é–‹çš„浮動視窗,或是使用很多é ç±¤çš„å–®ä¸€æµ®å‹•è¦–çª—ï¼ˆé ˆé‡æ–°å•Ÿå‹•ï¼‰"> - <radio_item label="分開視窗" name="radio" value="0"/> - <radio_item label="é 籤" name="radio2" value="1"/> - </radio_group> - <text name="disable_toast_label"> - 啟用傳入èŠå¤©çš„çªé¡¯ç¤ºè¦–窗: - </text> - <check_box label="群組èŠå¤©" name="EnableGroupChatPopups" tool_tip="當群組èŠå¤©è¨Šæ¯æŠµé”時查看çªé¡¯å¼è¦–窗"/> - <check_box label="IM èŠå¤©" name="EnableIMChatPopups" tool_tip="當å³æ™‚訊æ¯æŠµé”時查看çªé¡¯å¼è¦–窗"/> - <spinner label="附近èŠå¤©å…§å®¹æ示框åœé§æ™‚間:" name="nearby_toasts_lifetime"/> - <spinner label="附近èŠå¤©å…§å®¹æ示框消退時間:" name="nearby_toasts_fadingtime"/> + <panel> + <check_box initial_value="true" label="èŠå¤©æ™‚æ’放打å—動作" name="play_typing_animation"/> + <check_box label="當我離線時將收到的 IM 訊æ¯éƒµå¯„給我" name="send_im_to_email"/> + <check_box label="åªæœ‰æˆ‘的朋å‹å’Œç¾¤çµ„å¯ä»¥ IM 或與我通話。" name="voice_call_friends_only_check"/> + <text name="font_size"> + å—型尺寸: + </text> + <combo_box name="chat_font_size"> + <item label="å°" name="Small" value="0"/> + <item label="ä¸" name="Medium" value="1"/> + <item label="大" name="Large" value="2"/> + </combo_box> + <check_box label="èŠå¤©æ³¡æ³¡" name="bubble_text_chat"/> + </panel> + <panel> + <text name="notifications"> + 通知 + </text> + <text name="friend_ims"> + æœ‹å‹ IM: + </text> + <combo_box name="FriendIMOptions"> + <item label="開啟交談視窗" name="OpenConversationsWindow" value="openconversations"/> + <item label="以çªé¡¯å¼è¦–窗顯示訊æ¯" name="PopUpMessage" value="toast"/> + <item label="Flash 工具列按鈕" name="FlashToolbarButton" value="flash"/> + <item label="ç„¡" name="None" value="ç„¡"/> + </combo_box> + <text name="non_friend_ims"> + éžæœ‹å‹ IM: + </text> + <combo_box name="NonFriendIMOptions"> + <item label="開啟交談視窗" name="OpenConversationsWindow" value="openconversations"/> + <item label="以çªé¡¯å¼è¦–窗顯示訊æ¯" name="PopUpMessage" value="toast"/> + <item label="Flash 工具列按鈕" name="FlashToolbarButton" value="flash"/> + <item label="ç„¡" name="None" value="ç„¡"/> + </combo_box> + <text name="conference_ims"> + 多方交談 IM: + </text> + <combo_box name="ConferenceIMOptions"> + <item label="開啟交談視窗" name="OpenConversationsWindow" value="openconversations"/> + <item label="以çªé¡¯å¼è¦–窗顯示訊æ¯" name="PopUpMessage" value="toast"/> + <item label="Flash 工具列按鈕" name="FlashToolbarButton" value="flash"/> + <item label="ç„¡" name="None" value="ç„¡"/> + </combo_box> + <text name="group_chat"> + 群組èŠå¤©ï¼š + </text> + <combo_box name="GroupChatOptions"> + <item label="開啟交談視窗" name="OpenConversationsWindow" value="openconversations"/> + <item label="以çªé¡¯å¼è¦–窗顯示訊æ¯" name="PopUpMessage" value="toast"/> + <item label="Flash 工具列按鈕" name="FlashToolbarButton" value="flash"/> + <item label="ç„¡" name="None" value="ç„¡"/> + </combo_box> + <text name="nearby_chat"> + 附近的èŠå¤©ï¼š + </text> + <combo_box name="NearbyChatOptions"> + <item label="開啟交談視窗" name="OpenConversationsWindow" value="openconversations"/> + <item label="以çªé¡¯å¼è¦–窗顯示訊æ¯" name="PopUpMessage" value="toast"/> + <item label="Flash 工具列按鈕" name="FlashToolBarButton" value="flash"/> + <item label="ç„¡" name="None" value="ç„¡"/> + </combo_box> + <text name="notifications_alert"> + è‹¥è¦æš«æ™‚åœæ¢æ‰€æœ‰é€šçŸ¥ï¼Œè«‹è¨å®šã€Œæºé€š > 請勿打擾ã€ã€‚ + </text> + </panel> + <panel> + <text name="play_sound"> + æ’放è²éŸ³ï¼š + </text> + <check_box label="新交談" name="new_conversation"/> + <check_box label="語音通話來電" name="incoming_voice_call"/> + <check_box label="瞬間傳é€é‚€è«‹" name="teleport_offer"/> + <check_box label="收ç´ç‰©å“è´ˆé€" name="inventory_offer"/> + </panel> + <panel> + <button label="清空記錄……" name="clear_log"/> + <button label="刪除交談內容記錄……" name="delete_transcripts"/> + <button label="ç€è¦½â€¦" label_selected="ç€è¦½" name="log_path_button"/> + </panel> <button label="ç¿»è¯â€¦" name="ok_btn"/> <button label="自動å–代…" name="autoreplace_showgui"/> <button label="拼å—檢查…" name="spellcheck_showgui"/> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml index 7e67a0d02d..044edbed70 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml @@ -68,9 +68,9 @@ <combo_box.item label="絕ä¸" name="item4"/> </combo_box> <text name="text_box3"> - 忙碌模å¼å›žæ‡‰ï¼š + 「請勿打擾ã€é è¨å›žæ‡‰ï¼š </text> - <text_editor name="busy_response"> + <text_editor name="do_not_disturb_response"> log_in_to_change </text_editor> </panel> diff --git a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml index 982dde4010..60f44a3d88 100644 --- a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml @@ -72,6 +72,7 @@ <combo_box.item label="購買物件" name="Buyobject"/> <combo_box.item label="支付物件" name="Payobject"/> <combo_box.item label="打開" name="Open"/> + <combo_box.item label="縮放" name="Zoom"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml index 7e17ed6864..31713ac281 100644 --- a/indra/newview/skins/default/xui/zh/strings.xml +++ b/indra/newview/skins/default/xui/zh/strings.xml @@ -614,8 +614,8 @@ http://secondlife.com/viewer-access-faq <string name="AvatarAway"> 離開 </string> - <string name="AvatarBusy"> - 忙碌 + <string name="AvatarDoNotDisturb"> + 請勿打擾 </string> <string name="AvatarMuted"> å°éŽ–çš„ @@ -851,6 +851,12 @@ http://secondlife.com/viewer-access-faq <string name="ST_NO_JOINT"> 找ä¸åˆ° ROOT 或旋軸。 </string> + <string name="NearbyChatTitle"> + 附近的èŠå¤©ä¸ + </string> + <string name="NearbyChatLabel"> + (附近的èŠå¤©ï¼‰ + </string> <string name="whisper"> 低語: </string> @@ -914,12 +920,15 @@ http://secondlife.com/viewer-access-faq <string name="ControlYourCamera"> æŽ§åˆ¶ä½ çš„æ”影機 </string> - <string name="TeleportYourAgent"> - 瞬間傳é€ä½ 本人 - </string> <string name="NotConnected"> 未è¯æŽ¥ </string> + <string name="AgentNameSubst"> + ï¼ˆä½ ï¼‰ + </string> + <string name="TeleportYourAgent"> + 瞬間傳é€ä½ 本人 + </string> <string name="SIM_ACCESS_PG"> 一般普級 </string> @@ -1001,18 +1010,6 @@ http://secondlife.com/viewer-access-faq <string name="dictionary_files"> å—å…¸ </string> - <string name="AvatarSetNotAway"> - éžé›¢é–‹ - </string> - <string name="AvatarSetAway"> - 離開 - </string> - <string name="AvatarSetNotBusy"> - éžå¿™ç¢Œ - </string> - <string name="AvatarSetBusy"> - 忙碌 - </string> <string name="shape"> 體形 </string> @@ -1981,8 +1978,8 @@ http://secondlife.com/viewer-access-faq <string name="PanelContentsNewScript"> 新腳本 </string> - <string name="BusyModeResponseDefault"> - ä½ å‚³è¨ŠéŽåŽ»çš„å±…æ°‘ç›®å‰è™•æ–¼å¿™ç¢Œç‹€æ…‹ï¼Œé€™æ„味著他è¦æ±‚ä¸è¢«æ‰“擾。 ä½ çš„è¨Šæ¯ä»å°‡ç•™å˜ä¸¦é¡¯ç¤ºæ–¼å°æ–¹çš„ IM é¢æ¿ä¸Šä¾›ç¨å¾ŒæŸ¥é–±ã€‚ + <string name="DoNotDisturbModeResponseDefault"> + 這居民處於「請勿打擾ã€ç‹€æ…‹ï¼Œä¸æœƒç«‹å³çœ‹åˆ°ä½ 的訊æ¯ã€‚ </string> <string name="MuteByName"> (按å稱) @@ -2095,9 +2092,6 @@ http://secondlife.com/viewer-access-faq <string name="GroupMoneyDate"> [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc] </string> - <string name="ViewerObjectContents"> - 內容 - </string> <string name="AcquiredItems"> å–å¾—ç‰©å“ </string> @@ -3869,7 +3863,7 @@ http://secondlife.com/viewer-access-faq ä¸€èˆ¬æ™®ç´šåœ°å€ </string> <string name="LocationCtrlSeeAVsTooltip"> - å¯çœ‹åˆ°æœ¬åœ°æ®µå¤–的化身,並與之交談 + 這地段外的其他化身,看ä¸è¦‹ä¹Ÿè½ä¸åˆ°ä½æ–¼åœ°æ®µè£¡çš„化身 </string> <string name="LocationCtrlPathfindingDirtyTooltip"> 地å€é‡æ–°ç”¢å‡ºä¹‹å‰ï¼Œå¯ç§»å‹•ç‰©ä»¶å¯èƒ½ç„¡æ³•æ£å¸¸é‹ä½œã€‚ @@ -3946,6 +3940,12 @@ http://secondlife.com/viewer-access-faq <string name="IM_unblock_only_groups_friends"> è¦å¯Ÿçœ‹é€™è¨Šæ¯ï¼Œä½ å¿…é ˆåˆ°ã€Œå好è¨å®š / éš±ç§ã€ï¼Œå–消勾é¸ã€Œåªæœ‰æˆ‘的朋å‹å’Œç¾¤çµ„å¯ä»¥ IM 或與我通話ã€ã€‚ </string> + <string name="OnlineStatus"> + 上線 + </string> + <string name="OfflineStatus"> + 離線 + </string> <string name="answered_call"> ä½ çš„é€šè©±å·²ç¶“æŽ¥é€š </string> @@ -3955,6 +3955,9 @@ http://secondlife.com/viewer-access-faq <string name="you_joined_call"> ä½ ç™¼èµ·äº†èªžéŸ³é€šè©± </string> + <string name="you_auto_rejected_call-im"> + å› ç‚ºè™•æ–¼ã€Œè«‹å‹¿æ‰“æ“¾ã€æ¨¡å¼ï¼Œä½ 已自動拒è½é€™é€šèªžéŸ³ä¾†é›»ã€‚ + </string> <string name="name_started_call"> [NAME] 發起了語音通話 </string> @@ -3971,7 +3974,7 @@ http://secondlife.com/viewer-access-faq è¯æŽ¥ä¸... </string> <string name="conference-title"> - 臨時多方通話 + 多人èŠå¤© </string> <string name="conference-title-incoming"> å’Œ [AGENT_NAME] 多方通話 @@ -4863,6 +4866,9 @@ http://secondlife.com/viewer-access-faq <string name="Command_Chat_Label"> èŠå¤© </string> + <string name="Command_Conversations_Label"> + 交談 + </string> <string name="Command_Compass_Label"> 羅盤 </string> @@ -4938,6 +4944,9 @@ http://secondlife.com/viewer-access-faq <string name="Command_Chat_Tooltip"> é€éŽæ–‡å—和附近人們èŠå¤© </string> + <string name="Command_Conversations_Tooltip"> + 和所有人交談 + </string> <string name="Command_Compass_Tooltip"> 指å—é‡ </string> @@ -5067,4 +5076,13 @@ http://secondlife.com/viewer-access-faq <string name="UserDictionary"> [User] </string> + <string name="logging_calls_disabled_log_empty"> + 交談未留記錄。 若想開始留記錄,請到「å好è¨å®š > èŠå¤©ã€ï¼Œé¸æ“‡ã€Œå„²å˜ï¼šåªç•™æ·å²è¨˜éŒ„ã€æˆ–「儲å˜ï¼šæ·å²è¨˜éŒ„兼交談內容ã€ã€‚ + </string> + <string name="logging_calls_disabled_log_not_empty"> + å°‡ä¸å†ç‚ºäº¤è«‡ç•™è¨˜éŒ„。 若想æ¢å¾©ç•™å˜è¨˜éŒ„,請到「å好è¨å®š > èŠå¤©ã€ï¼Œé¸æ“‡ã€Œå„²å˜ï¼šåªç•™æ·å²è¨˜éŒ„ã€æˆ–「儲å˜ï¼šæ·å²è¨˜éŒ„兼交談內容ã€ã€‚ + </string> + <string name="logging_calls_enabled_log_empty"> + ç›®å‰æ²’有交談記錄。 åœ¨ä½ è¯çµ¡æŸäººæˆ–æŸäººè¯çµ¡ä½ 之後,這裡將留å˜è¨˜éŒ„。 + </string> </strings> diff --git a/indra/newview/tests/llmediadataclient_test.cpp b/indra/newview/tests/llmediadataclient_test.cpp index 37f94b82df..3e55336f2d 100644 --- a/indra/newview/tests/llmediadataclient_test.cpp +++ b/indra/newview/tests/llmediadataclient_test.cpp @@ -127,7 +127,9 @@ void LLHTTPClient::post( result[LLTextureEntry::OBJECT_ID_KEY] = body[LLTextureEntry::OBJECT_ID_KEY]; if ( url == FAKE_OBJECT_MEDIA_CAP_URL_503 ) { - responder->error(HTTP_SERVICE_UNAVAILABLE, "fake reason"); + LLSD content; + content["reason"] = "fake reason"; + responder->errorWithContent(HTTP_SERVICE_UNAVAILABLE, "fake reason", content); return; } else if (url == FAKE_OBJECT_MEDIA_NAVIGATE_CAP_URL_ERROR) diff --git a/indra/newview/tests/llviewerassetstats_test.cpp b/indra/newview/tests/llviewerassetstats_test.cpp index f8923b9868..a331d9aa9e 100644 --- a/indra/newview/tests/llviewerassetstats_test.cpp +++ b/indra/newview/tests/llviewerassetstats_test.cpp @@ -37,30 +37,6 @@ #include "llregionhandle.h" #include "../llvoavatar.h" -void LLVOAvatar::getNearbyRezzedStats(std::vector<S32>& counts) -{ - counts.resize(3); - counts[0] = 0; - counts[1] = 0; - counts[2] = 1; -} - -// static -std::string LLVOAvatar::rezStatusToString(S32 rez_status) -{ - if (rez_status==0) return "cloud"; - if (rez_status==1) return "gray"; - if (rez_status==2) return "textured"; - return "unknown"; -} - -// static -LLViewerStats::StatsAccumulator& LLViewerStats::PhaseMap::getPhaseStats(const std::string& phase_name) -{ - static LLViewerStats::StatsAccumulator junk; - return junk; -} - static const char * all_keys[] = { "duration", @@ -123,31 +99,34 @@ is_empty_map(const LLSD & sd) { return sd.isMap() && 0 == sd.size(); } +#endif +#if 0 static bool is_single_key_map(const LLSD & sd, const std::string & key) { return sd.isMap() && 1 == sd.size() && sd.has(key); } +#endif static bool is_double_key_map(const LLSD & sd, const std::string & key1, const std::string & key2) { return sd.isMap() && 2 == sd.size() && sd.has(key1) && sd.has(key2); } -#endif +#if 0 static bool is_triple_key_map(const LLSD & sd, const std::string & key1, const std::string & key2, const std::string& key3) { return sd.isMap() && 3 == sd.size() && sd.has(key1) && sd.has(key2) && sd.has(key3); } - +#endif static bool is_no_stats_map(const LLSD & sd) { - return is_triple_key_map(sd, "duration", "regions", "avatar"); + return is_double_key_map(sd, "duration", "regions"); } static bool @@ -258,7 +237,7 @@ namespace tut // Once the region is set, we will get a response even with no data collection it->setRegion(region1_handle); sd_full = it->asLLSD(false); - ensure("Correct single-key LLSD map root", is_triple_key_map(sd_full, "duration", "regions", "avatar")); + ensure("Correct single-key LLSD map root", is_double_key_map(sd_full, "duration", "regions")); ensure("Correct single-slot LLSD array regions", is_single_slot_array(sd_full["regions"], region1_handle)); LLSD sd = sd_full["regions"][0]; @@ -299,7 +278,7 @@ namespace tut it->setRegion(region1_handle); LLSD sd = it->asLLSD(false); - ensure("Correct single-key LLSD map root", is_triple_key_map(sd, "regions", "duration", "avatar")); + ensure("Correct single-key LLSD map root", is_double_key_map(sd, "regions", "duration")); ensure("Correct single-slot LLSD array regions", is_single_slot_array(sd["regions"], region1_handle)); sd = sd[0]; @@ -324,7 +303,7 @@ namespace tut LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false); LLSD sd = gViewerAssetStatsMain->asLLSD(false); - ensure("Correct single-key LLSD map root", is_triple_key_map(sd, "regions", "duration", "avatar")); + ensure("Correct single-key LLSD map root", is_double_key_map(sd, "regions", "duration")); ensure("Correct single-slot LLSD array regions", is_single_slot_array(sd["regions"], region1_handle)); sd = sd["regions"][0]; @@ -364,7 +343,7 @@ namespace tut LLSD sd = gViewerAssetStatsThread1->asLLSD(false); ensure("Other collector is empty", is_no_stats_map(sd)); sd = gViewerAssetStatsMain->asLLSD(false); - ensure("Correct single-key LLSD map root", is_triple_key_map(sd, "regions", "duration", "avatar")); + ensure("Correct single-key LLSD map root", is_double_key_map(sd, "regions", "duration")); ensure("Correct single-slot LLSD array regions", is_single_slot_array(sd["regions"], region1_handle)); sd = sd["regions"][0]; @@ -414,7 +393,7 @@ namespace tut // std::cout << sd << std::endl; - ensure("Correct double-key LLSD map root", is_triple_key_map(sd, "duration", "regions", "avatar")); + ensure("Correct double-key LLSD map root", is_double_key_map(sd, "duration", "regions")); ensure("Correct double-slot LLSD array regions", is_double_slot_array(sd["regions"], region1_handle, region2_handle)); LLSD sd1 = get_region(sd, region1_handle); LLSD sd2 = get_region(sd, region2_handle); @@ -437,7 +416,7 @@ namespace tut // Reset leaves current region in place gViewerAssetStatsMain->reset(); sd = gViewerAssetStatsMain->asLLSD(false); - ensure("Correct single-key LLSD map root", is_triple_key_map(sd, "regions", "duration", "avatar")); + ensure("Correct single-key LLSD map root", is_double_key_map(sd, "regions", "duration")); ensure("Correct single-slot LLSD array regions (p2)", is_single_slot_array(sd["regions"], region2_handle)); sd2 = sd["regions"][0]; @@ -486,7 +465,7 @@ namespace tut LLSD sd = gViewerAssetStatsMain->asLLSD(false); - ensure("Correct double-key LLSD map root", is_triple_key_map(sd, "duration", "regions", "avatar")); + ensure("Correct double-key LLSD map root", is_double_key_map(sd, "duration", "regions")); ensure("Correct double-slot LLSD array regions", is_double_slot_array(sd["regions"], region1_handle, region2_handle)); LLSD sd1 = get_region(sd, region1_handle); LLSD sd2 = get_region(sd, region2_handle); @@ -509,7 +488,7 @@ namespace tut // Reset leaves current region in place gViewerAssetStatsMain->reset(); sd = gViewerAssetStatsMain->asLLSD(false); - ensure("Correct single-key LLSD map root", is_triple_key_map(sd, "duration", "regions", "avatar")); + ensure("Correct single-key LLSD map root", is_double_key_map(sd, "duration", "regions")); ensure("Correct single-slot LLSD array regions (p2)", is_single_slot_array(sd["regions"], region2_handle)); sd2 = get_region(sd, region2_handle); ensure("Region2 is present in results", sd2.isMap()); @@ -555,7 +534,7 @@ namespace tut LLSD sd = gViewerAssetStatsThread1->asLLSD(false); ensure("Other collector is empty", is_no_stats_map(sd)); sd = gViewerAssetStatsMain->asLLSD(false); - ensure("Correct single-key LLSD map root", is_triple_key_map(sd, "regions", "duration", "avatar")); + ensure("Correct single-key LLSD map root", is_double_key_map(sd, "regions", "duration")); ensure("Correct single-slot LLSD array regions", is_single_slot_array(sd["regions"], region1_handle)); sd = get_region(sd, region1_handle); ensure("Region1 is present in results", sd.isMap()); diff --git a/indra/newview/tests/llviewertexture_stub.cpp b/indra/newview/tests/llviewertexture_stub.cpp new file mode 100644 index 0000000000..889ab9bea5 --- /dev/null +++ b/indra/newview/tests/llviewertexture_stub.cpp @@ -0,0 +1,34 @@ +/** + * @file llviewertexture_stub.cpp + * @brief stub class to allow unit testing + * + * $LicenseInfo:firstyear=2012&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" +#include "../llviewertexture.h" +#include "../../llrender/llgltexture.h" + +void LLViewerTexture::setBoostLevel(int level) +{ +} + diff --git a/indra/newview/tests/llworldmap_test.cpp b/indra/newview/tests/llworldmap_test.cpp index acc6e814bc..84194adb5d 100644 --- a/indra/newview/tests/llworldmap_test.cpp +++ b/indra/newview/tests/llworldmap_test.cpp @@ -47,9 +47,9 @@ // * A simulator for a class can be implemented here. Please comment and document thoroughly. // Stub image calls -void LLViewerTexture::setBoostLevel(S32 ) { } -void LLViewerTexture::setAddressMode(LLTexUnit::eTextureAddressMode ) { } -LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(const LLUUID&, BOOL, LLViewerTexture::EBoostLevel, S8, +void LLGLTexture::setBoostLevel(S32 ) { } +void LLGLTexture::setAddressMode(LLTexUnit::eTextureAddressMode ) { } +LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(const LLUUID&, FTType, BOOL, LLGLTexture::EBoostLevel, S8, LLGLint, LLGLenum, LLHost ) { return NULL; } // Stub related map calls diff --git a/indra/newview/tests/llworldmipmap_test.cpp b/indra/newview/tests/llworldmipmap_test.cpp index e7ef017760..142d75bcfd 100644 --- a/indra/newview/tests/llworldmipmap_test.cpp +++ b/indra/newview/tests/llworldmipmap_test.cpp @@ -42,8 +42,8 @@ // * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code) // * A simulator for a class can be implemented here. Please comment and document thoroughly. -void LLViewerTexture::setBoostLevel(S32 ) { } -LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromUrl(const std::string&, BOOL, LLViewerTexture::EBoostLevel, S8, +void LLGLTexture::setBoostLevel(S32 ) { } +LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromUrl(const std::string&, FTType, BOOL, LLGLTexture::EBoostLevel, S8, LLGLint, LLGLenum, const LLUUID& ) { return NULL; } LLControlGroup::LLControlGroup(const std::string& name) : LLInstanceTracker<LLControlGroup, std::string>(name) { } diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 3c107d67a3..276ae8fc01 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -202,7 +202,7 @@ class ViewerManifest(LLManifest): grid_flags = '' if not self.default_grid(): grid_flags = "--grid %(grid)s "\ - %\ + "--helperuri http://preview-%(grid)s.secondlife.com/helpers/" %\ {'grid':self.grid()} # set command line flags for channel @@ -367,10 +367,14 @@ class WindowsManifest(ViewerManifest): print err.message print "Skipping COLLADA and GLOD libraries (assumming linked statically)" - - # Get fmod dll, continue if missing - if not self.path("fmod.dll"): - print "Skipping fmod.dll" + # Get fmodex dll, continue if missing + try: + if self.args['configuration'].lower() == 'debug': + self.path("fmodexL.dll") + else: + self.path("fmodex.dll") + except: + print "Skipping fmodex audio library(assuming other audio engine)" # For textures if self.args['configuration'].lower() == 'debug': @@ -743,6 +747,7 @@ class DarwinManifest(ViewerManifest): "libcollada14dom.dylib", "libexpat.1.5.2.dylib", "libexception_handler.dylib", + "libfmodex.dylib", "libGLOD.dylib", ): dylibs += path_optional(os.path.join(libdir, libfile), libfile) @@ -758,10 +763,6 @@ class DarwinManifest(ViewerManifest): ): self.path2basename(libdir, libfile) - # FMOD for sound - libfile = "libfmodwrapper.dylib" - path_optional(os.path.join(self.args['configuration'], libfile), libfile) - # our apps for app_bld_dir, app in (("mac_crash_logger", "mac-crash-logger.app"), ("mac_updater", "mac-updater.app"), @@ -1079,7 +1080,7 @@ class Linux_i686Manifest(LinuxManifest): self.path("libcrypto.so.*") self.path("libexpat.so.*") self.path("libssl.so.1.0.0") - self.path("libglod.so") + self.path("libGLOD.so") self.path("libminizip.so") self.path("libuuid.so*") self.path("libSDL-1.2.so.*") @@ -1120,11 +1121,13 @@ class Linux_i686Manifest(LinuxManifest): pass try: - self.path("libfmod-3.75.so") + self.path("libfmodex-*.so") + self.path("libfmodex.so") pass except: - print "Skipping libfmod-3.75.so - not found" + print "Skipping libfmodex.so - not found" pass + self.end_prefix("lib") # Vivox runtimes |