From 9dfe0ca9a0228c4fa75c8a3e51840696cc6b4960 Mon Sep 17 00:00:00 2001 From: Adam Moss Date: Fri, 22 May 2009 09:58:47 +0000 Subject: svn merge -r121194:121210 svn+ssh://svn.lindenlab.com/svn/linden/branches/viewer/viewer-1.23.onetwo-merge-1 QAR-1531 viewer 1.23rc1+1.23rc2 merge to trunk --- indra/llcharacter/lleditingmotion.cpp | 8 - indra/llcommon/llapr.cpp | 10 + indra/llcommon/llapr.h | 1 + indra/llcommon/lldate.h | 8 + indra/llcommon/llerror.cpp | 65 + indra/llcommon/llversionviewer.h | 2 +- indra/llui/llmenugl.cpp | 28 +- indra/llui/llmenugl.h | 4 + indra/llui/llnotifications.cpp | 9 +- indra/llui/llpanel.cpp | 8 +- indra/llwindow/lldxhardware.cpp | 32 +- indra/llxml/llcontrol.cpp | 25 +- indra/newview/app_settings/settings.xml | 23 +- indra/newview/character/avatar_lad.xml | 104 +- indra/newview/installers/windows/lang_nl.nsi | Bin 7388 -> 7414 bytes indra/newview/linux_tools/launch_url.sh | 76 +- indra/newview/llagent.cpp | 171 +- indra/newview/llappviewer.cpp | 45 +- indra/newview/llappviewermacosx.cpp | 25 + indra/newview/llappviewermacosx.h | 1 + indra/newview/llassetuploadresponders.cpp | 3 + indra/newview/llcurrencyuimanager.cpp | 3 +- indra/newview/llfloaterabout.cpp | 18 + indra/newview/llfloaterbulkpermission.cpp | 6 + indra/newview/llfloaterbulkpermission.h | 1 + indra/newview/llfloaterbuycurrency.cpp | 2 +- indra/newview/llfloaterchat.cpp | 5 +- indra/newview/llfloaterimagepreview.cpp | 5 +- indra/newview/llfloatersnapshot.cpp | 6 +- indra/newview/llinventorybridge.cpp | 3 +- indra/newview/llmutelist.cpp | 36 +- indra/newview/llpanelclassified.cpp | 33 +- indra/newview/llpanelclassified.h | 2 +- indra/newview/llpanelplace.cpp | 3 +- indra/newview/llselectmgr.cpp | 5 + indra/newview/llstartup.cpp | 2 +- indra/newview/lltexlayer.cpp | 70 +- indra/newview/lltexlayer.h | 10 +- indra/newview/llviewercamera.cpp | 2 +- indra/newview/llviewerdisplay.cpp | 23 +- indra/newview/llviewermenu.cpp | 33 +- indra/newview/llviewermessage.cpp | 11 +- indra/newview/llviewertexteditor.cpp | 62 +- indra/newview/llviewertexteditor.h | 13 +- indra/newview/llviewerwindow.cpp | 60 +- indra/newview/llviewerwindow.h | 3 +- indra/newview/llvoavatar.cpp | 71 +- indra/newview/llvoavatar.h | 1 + indra/newview/llvopartgroup.cpp | 4 +- indra/newview/llvotree.cpp | 28 + indra/newview/llvotree.h | 5 + indra/newview/llworldmapview.cpp | 12 +- indra/newview/pipeline.h | 1 + .../newview/skins/default/xui/de/floater_about.xml | 3 +- .../skins/default/xui/de/floater_about_land.xml | 207 +- .../skins/default/xui/de/floater_avatar_picker.xml | 54 +- .../default/xui/de/floater_avatar_textures.xml | 47 +- .../skins/default/xui/de/floater_bulk_perms.xml | 44 + .../skins/default/xui/de/floater_buy_land.xml | 205 +- .../skins/default/xui/de/floater_customize.xml | 530 +- .../skins/default/xui/de/floater_font_test.xml | 6 + .../skins/default/xui/de/floater_joystick.xml | 44 +- .../skins/default/xui/de/floater_land_holdings.xml | 21 +- .../skins/default/xui/de/floater_notification.xml | 7 + .../xui/de/floater_notifications_console.xml | 5 + .../skins/default/xui/de/floater_perm_prefs.xml | 16 + .../skins/default/xui/de/floater_report_abuse.xml | 24 +- .../skins/default/xui/de/floater_sell_land.xml | 28 +- .../skins/default/xui/de/floater_snapshot.xml | 4 +- .../skins/default/xui/de/floater_sound_preview.xml | 4 +- .../skins/default/xui/de/floater_statistics.xml | 2 + .../newview/skins/default/xui/de/floater_tools.xml | 427 +- .../skins/default/xui/de/floater_world_map.xml | 38 +- .../skins/default/xui/de/menu_inventory.xml | 119 +- .../newview/skins/default/xui/de/menu_mini_map.xml | 8 + indra/newview/skins/default/xui/de/menu_viewer.xml | 37 +- .../newview/skins/default/xui/de/notifications.xml | 7378 ++++++------------ .../skins/default/xui/de/panel_group_general.xml | 14 +- .../skins/default/xui/de/panel_group_invite.xml | 8 +- .../default/xui/de/panel_group_land_money.xml | 44 +- .../skins/default/xui/de/panel_group_roles.xml | 2 +- .../default/xui/de/panel_notifications_channel.xml | 15 + .../default/xui/de/panel_preferences_general.xml | 45 +- .../skins/default/xui/de/panel_region_covenant.xml | 96 +- .../skins/default/xui/de/panel_region_general.xml | 72 +- indra/newview/skins/default/xui/de/strings.xml | 99 +- .../skins/default/xui/de/teleport_strings.xml | 30 +- .../newview/skins/default/xui/es/floater_about.xml | 2 +- .../skins/default/xui/es/floater_about_land.xml | 251 +- .../skins/default/xui/es/floater_avatar_picker.xml | 43 +- .../skins/default/xui/es/floater_bulk_perms.xml | 44 + .../skins/default/xui/es/floater_buy_currency.xml | 10 +- .../skins/default/xui/es/floater_buy_land.xml | 28 +- .../skins/default/xui/es/floater_customize.xml | 171 +- .../skins/default/xui/es/floater_font_test.xml | 6 + .../skins/default/xui/es/floater_joystick.xml | 2 + .../skins/default/xui/es/floater_land_holdings.xml | 5 +- .../skins/default/xui/es/floater_perm_prefs.xml | 16 + .../skins/default/xui/es/floater_report_abuse.xml | 18 +- .../skins/default/xui/es/floater_sell_land.xml | 8 +- .../skins/default/xui/es/floater_sound_preview.xml | 2 +- .../skins/default/xui/es/floater_statistics.xml | 2 + .../newview/skins/default/xui/es/floater_tools.xml | 90 +- .../skins/default/xui/es/floater_world_map.xml | 37 +- .../skins/default/xui/es/menu_inventory.xml | 1 + .../newview/skins/default/xui/es/menu_mini_map.xml | 8 + indra/newview/skins/default/xui/es/menu_viewer.xml | 14 +- .../newview/skins/default/xui/es/notifications.xml | 8093 +++++++------------ .../skins/default/xui/es/panel_group_general.xml | 13 +- .../skins/default/xui/es/panel_group_invite.xml | 4 +- .../default/xui/es/panel_group_land_money.xml | 10 +- .../skins/default/xui/es/panel_group_roles.xml | 2 +- .../default/xui/es/panel_preferences_general.xml | 41 +- .../skins/default/xui/es/panel_region_covenant.xml | 86 +- .../skins/default/xui/es/panel_region_general.xml | 21 +- indra/newview/skins/default/xui/es/strings.xml | 73 +- .../skins/default/xui/es/teleport_strings.xml | 6 +- .../newview/skins/default/xui/fr/floater_about.xml | 5 +- .../skins/default/xui/fr/floater_about_land.xml | 263 +- .../skins/default/xui/fr/floater_avatar_picker.xml | 53 +- .../default/xui/fr/floater_avatar_textures.xml | 55 +- .../skins/default/xui/fr/floater_beacons.xml | 4 +- .../skins/default/xui/fr/floater_bulk_perms.xml | 10 +- .../skins/default/xui/fr/floater_buy_contents.xml | 2 +- .../skins/default/xui/fr/floater_buy_currency.xml | 17 +- .../skins/default/xui/fr/floater_buy_land.xml | 22 +- .../skins/default/xui/fr/floater_customize.xml | 235 +- .../skins/default/xui/fr/floater_font_test.xml | 14 +- .../skins/default/xui/fr/floater_god_tools.xml | 14 +- indra/newview/skins/default/xui/fr/floater_im.xml | 2 +- .../skins/default/xui/fr/floater_land_holdings.xml | 21 +- .../default/xui/fr/floater_live_lsleditor.xml | 2 +- .../xui/fr/floater_notifications_console.xml | 4 +- .../skins/default/xui/fr/floater_perm_prefs.xml | 4 +- .../skins/default/xui/fr/floater_report_abuse.xml | 20 +- .../skins/default/xui/fr/floater_sell_land.xml | 8 +- .../skins/default/xui/fr/floater_sound_preview.xml | 2 +- .../skins/default/xui/fr/floater_statistics.xml | 2 + .../newview/skins/default/xui/fr/floater_tools.xml | 39 +- .../skins/default/xui/fr/floater_top_objects.xml | 12 +- .../skins/default/xui/fr/floater_world_map.xml | 64 +- indra/newview/skins/default/xui/fr/menu_login.xml | 2 +- .../newview/skins/default/xui/fr/menu_mini_map.xml | 8 + indra/newview/skins/default/xui/fr/menu_viewer.xml | 18 +- .../newview/skins/default/xui/fr/notifications.xml | 7503 ++++++------------ .../newview/skins/default/xui/fr/panel_friends.xml | 12 +- .../skins/default/xui/fr/panel_group_general.xml | 52 +- .../default/xui/fr/panel_group_land_money.xml | 18 +- .../default/xui/fr/panel_notifications_channel.xml | 2 +- .../default/xui/fr/panel_preferences_general.xml | 29 + .../skins/default/xui/fr/panel_region_covenant.xml | 95 +- .../skins/default/xui/fr/panel_region_debug.xml | 6 +- .../skins/default/xui/fr/panel_region_general.xml | 28 +- .../newview/skins/default/xui/fr/role_actions.xml | 4 +- indra/newview/skins/default/xui/fr/strings.xml | 28 +- .../skins/default/xui/fr/teleport_strings.xml | 31 +- .../newview/skins/default/xui/it/floater_about.xml | 2 +- .../skins/default/xui/it/floater_about_land.xml | 289 +- .../skins/default/xui/it/floater_avatar_picker.xml | 43 +- .../skins/default/xui/it/floater_bulk_perms.xml | 44 + .../skins/default/xui/it/floater_buy_currency.xml | 21 +- .../skins/default/xui/it/floater_buy_land.xml | 29 +- .../skins/default/xui/it/floater_color_picker.xml | 12 +- .../skins/default/xui/it/floater_customize.xml | 213 +- .../skins/default/xui/it/floater_font_test.xml | 6 + .../skins/default/xui/it/floater_joystick.xml | 2 + .../skins/default/xui/it/floater_land_holdings.xml | 5 +- .../skins/default/xui/it/floater_perm_prefs.xml | 16 + .../skins/default/xui/it/floater_report_abuse.xml | 18 +- .../skins/default/xui/it/floater_sell_land.xml | 17 +- .../skins/default/xui/it/floater_sound_preview.xml | 2 +- .../skins/default/xui/it/floater_statistics.xml | 2 + .../newview/skins/default/xui/it/floater_tools.xml | 82 +- .../skins/default/xui/it/floater_world_map.xml | 46 +- .../skins/default/xui/it/menu_inventory.xml | 1 + .../newview/skins/default/xui/it/menu_mini_map.xml | 8 + indra/newview/skins/default/xui/it/menu_viewer.xml | 16 +- .../newview/skins/default/xui/it/notifications.xml | 7708 ++++++------------- .../skins/default/xui/it/panel_group_general.xml | 12 +- .../skins/default/xui/it/panel_group_invite.xml | 8 +- .../default/xui/it/panel_group_land_money.xml | 8 +- .../skins/default/xui/it/panel_group_roles.xml | 2 +- indra/newview/skins/default/xui/it/panel_login.xml | 20 +- .../default/xui/it/panel_preferences_chat.xml | 3 +- .../default/xui/it/panel_preferences_general.xml | 47 +- .../skins/default/xui/it/panel_region_covenant.xml | 72 +- .../skins/default/xui/it/panel_region_general.xml | 20 +- indra/newview/skins/default/xui/it/strings.xml | 73 +- .../skins/default/xui/it/teleport_strings.xml | 6 +- .../newview/skins/default/xui/ja/floater_about.xml | 5 +- .../skins/default/xui/ja/floater_about_land.xml | 176 +- .../skins/default/xui/ja/floater_avatar_picker.xml | 59 +- .../default/xui/ja/floater_avatar_textures.xml | 49 +- .../skins/default/xui/ja/floater_bulk_perms.xml | 1 + .../skins/default/xui/ja/floater_buy_currency.xml | 4 +- .../skins/default/xui/ja/floater_buy_land.xml | 22 +- .../skins/default/xui/ja/floater_customize.xml | 508 +- .../skins/default/xui/ja/floater_font_test.xml | 6 + .../skins/default/xui/ja/floater_god_tools.xml | 2 +- .../skins/default/xui/ja/floater_land_holdings.xml | 5 +- .../default/xui/ja/floater_preview_gesture.xml | 4 +- .../skins/default/xui/ja/floater_report_abuse.xml | 82 +- .../skins/default/xui/ja/floater_sell_land.xml | 14 +- .../skins/default/xui/ja/floater_sound_preview.xml | 2 +- .../skins/default/xui/ja/floater_statistics.xml | 2 + .../skins/default/xui/ja/floater_telehub.xml | 6 +- .../newview/skins/default/xui/ja/floater_tools.xml | 66 +- .../skins/default/xui/ja/floater_world_map.xml | 96 +- indra/newview/skins/default/xui/ja/menu_login.xml | 2 +- .../newview/skins/default/xui/ja/menu_mini_map.xml | 8 + indra/newview/skins/default/xui/ja/menu_viewer.xml | 16 +- .../newview/skins/default/xui/ja/notifications.xml | 7941 +++++++------------ .../skins/default/xui/ja/panel_group_general.xml | 18 +- .../default/xui/ja/panel_group_land_money.xml | 8 +- .../skins/default/xui/ja/panel_group_notices.xml | 2 +- .../default/xui/ja/panel_notifications_channel.xml | 2 +- .../default/xui/ja/panel_preferences_chat.xml | 2 +- .../default/xui/ja/panel_preferences_general.xml | 29 + .../skins/default/xui/ja/panel_region_covenant.xml | 89 +- .../skins/default/xui/ja/panel_region_general.xml | 78 +- .../newview/skins/default/xui/ja/role_actions.xml | 92 +- indra/newview/skins/default/xui/ja/strings.xml | 26 +- .../skins/default/xui/ja/teleport_strings.xml | 26 +- .../newview/skins/default/xui/nl/floater_about.xml | 2 +- .../skins/default/xui/nl/floater_about_land.xml | 252 +- .../skins/default/xui/nl/floater_bulk_perms.xml | 44 + .../skins/default/xui/nl/floater_buy_currency.xml | 16 +- .../skins/default/xui/nl/floater_buy_land.xml | 32 +- .../skins/default/xui/nl/floater_customize.xml | 148 +- .../skins/default/xui/nl/floater_font_test.xml | 6 + .../skins/default/xui/nl/floater_joystick.xml | 2 + .../skins/default/xui/nl/floater_perm_prefs.xml | 16 + .../skins/default/xui/nl/floater_report_abuse.xml | 18 +- .../skins/default/xui/nl/floater_sell_land.xml | 15 +- .../skins/default/xui/nl/floater_statistics.xml | 2 + .../newview/skins/default/xui/nl/floater_tools.xml | 84 +- .../skins/default/xui/nl/floater_world_map.xml | 31 +- .../skins/default/xui/nl/menu_inventory.xml | 1 + .../newview/skins/default/xui/nl/menu_mini_map.xml | 8 + indra/newview/skins/default/xui/nl/menu_viewer.xml | 14 +- .../newview/skins/default/xui/nl/notifications.xml | 8122 +++++++------------- .../skins/default/xui/nl/panel_group_general.xml | 12 +- .../skins/default/xui/nl/panel_group_invite.xml | 4 +- .../skins/default/xui/nl/panel_group_roles.xml | 2 +- .../skins/default/xui/nl/panel_region_general.xml | 23 +- indra/newview/skins/default/xui/nl/strings.xml | 73 +- .../skins/default/xui/nl/teleport_strings.xml | 8 +- .../skins/default/xui/pl/floater_about_land.xml | 178 +- .../default/xui/pl/floater_animation_preview.xml | 32 +- .../skins/default/xui/pl/floater_auction.xml | 2 +- .../skins/default/xui/pl/floater_avatar_picker.xml | 49 +- .../default/xui/pl/floater_avatar_textures.xml | 4 +- .../skins/default/xui/pl/floater_beacons.xml | 2 +- .../skins/default/xui/pl/floater_build_options.xml | 2 +- .../skins/default/xui/pl/floater_bulk_perms.xml | 44 + .../newview/skins/default/xui/pl/floater_bumps.xml | 2 +- .../skins/default/xui/pl/floater_buy_currency.xml | 18 +- .../skins/default/xui/pl/floater_buy_land.xml | 70 +- .../skins/default/xui/pl/floater_camera.xml | 2 +- .../skins/default/xui/pl/floater_critical.xml | 2 +- .../skins/default/xui/pl/floater_customize.xml | 472 +- .../skins/default/xui/pl/floater_font_test.xml | 6 + .../skins/default/xui/pl/floater_god_tools.xml | 41 +- indra/newview/skins/default/xui/pl/floater_im.xml | 2 +- .../skins/default/xui/pl/floater_land_holdings.xml | 23 +- .../skins/default/xui/pl/floater_mute_object.xml | 7 +- .../skins/default/xui/pl/floater_perm_prefs.xml | 16 + .../skins/default/xui/pl/floater_post_process.xml | 2 +- .../default/xui/pl/floater_preview_gesture.xml | 37 +- .../default/xui/pl/floater_preview_notecard.xml | 2 +- .../skins/default/xui/pl/floater_report_abuse.xml | 20 +- .../skins/default/xui/pl/floater_script_search.xml | 6 +- .../skins/default/xui/pl/floater_sound_preview.xml | 2 +- .../skins/default/xui/pl/floater_statistics.xml | 2 + .../skins/default/xui/pl/floater_telehub.xml | 27 +- .../skins/default/xui/pl/floater_texture_ctrl.xml | 2 +- .../newview/skins/default/xui/pl/floater_tools.xml | 90 +- .../skins/default/xui/pl/floater_top_objects.xml | 32 +- indra/newview/skins/default/xui/pl/floater_tos.xml | 4 +- .../default/xui/pl/floater_windlight_options.xml | 2 +- .../skins/default/xui/pl/floater_world_map.xml | 82 +- .../skins/default/xui/pl/menu_inventory.xml | 119 +- .../newview/skins/default/xui/pl/menu_mini_map.xml | 8 + indra/newview/skins/default/xui/pl/menu_viewer.xml | 402 +- .../newview/skins/default/xui/pl/notifications.xml | 8007 +++++++------------ .../skins/default/xui/pl/panel_audio_device.xml | 2 +- .../newview/skins/default/xui/pl/panel_friends.xml | 2 +- .../skins/default/xui/pl/panel_group_general.xml | 53 +- .../skins/default/xui/pl/panel_group_invite.xml | 8 +- .../default/xui/pl/panel_group_land_money.xml | 33 +- .../skins/default/xui/pl/panel_group_roles.xml | 4 +- .../default/xui/pl/panel_preferences_chat.xml | 6 +- .../default/xui/pl/panel_preferences_general.xml | 63 +- .../default/xui/pl/panel_preferences_graphics1.xml | 2 +- .../skins/default/xui/pl/panel_region_covenant.xml | 81 +- .../skins/default/xui/pl/panel_region_general.xml | 73 +- .../skins/default/xui/pl/panel_status_bar.xml | 30 +- .../newview/skins/default/xui/pl/role_actions.xml | 44 +- indra/newview/skins/default/xui/pl/strings.xml | 101 +- .../skins/default/xui/pl/teleport_strings.xml | 16 +- .../newview/skins/default/xui/pt/floater_about.xml | 2 +- .../skins/default/xui/pt/floater_about_land.xml | 175 +- .../skins/default/xui/pt/floater_avatar_picker.xml | 43 +- .../skins/default/xui/pt/floater_bulk_perms.xml | 44 + .../skins/default/xui/pt/floater_buy_currency.xml | 6 +- .../skins/default/xui/pt/floater_buy_land.xml | 36 +- .../skins/default/xui/pt/floater_customize.xml | 140 +- .../skins/default/xui/pt/floater_font_test.xml | 6 + .../skins/default/xui/pt/floater_joystick.xml | 2 + .../skins/default/xui/pt/floater_land_holdings.xml | 5 +- .../skins/default/xui/pt/floater_mute_object.xml | 4 +- .../skins/default/xui/pt/floater_perm_prefs.xml | 16 + .../skins/default/xui/pt/floater_report_abuse.xml | 18 +- .../skins/default/xui/pt/floater_sell_land.xml | 15 +- .../skins/default/xui/pt/floater_sound_preview.xml | 2 +- .../skins/default/xui/pt/floater_statistics.xml | 2 + .../newview/skins/default/xui/pt/floater_tools.xml | 84 +- .../skins/default/xui/pt/floater_world_map.xml | 42 +- .../skins/default/xui/pt/menu_inventory.xml | 5 +- .../newview/skins/default/xui/pt/menu_mini_map.xml | 8 + indra/newview/skins/default/xui/pt/menu_viewer.xml | 16 +- .../newview/skins/default/xui/pt/notifications.xml | 8038 +++++++------------ .../skins/default/xui/pt/panel_group_general.xml | 12 +- .../skins/default/xui/pt/panel_group_invite.xml | 8 +- .../default/xui/pt/panel_group_land_money.xml | 8 +- .../skins/default/xui/pt/panel_group_roles.xml | 2 +- .../default/xui/pt/panel_preferences_general.xml | 39 +- .../skins/default/xui/pt/panel_region_covenant.xml | 86 +- .../skins/default/xui/pt/panel_region_general.xml | 21 +- indra/newview/skins/default/xui/pt/strings.xml | 73 +- indra/win_updater/updater.cpp | 273 +- 331 files changed, 28524 insertions(+), 46968 deletions(-) create mode 100644 indra/newview/skins/default/xui/de/floater_bulk_perms.xml create mode 100644 indra/newview/skins/default/xui/de/floater_font_test.xml create mode 100644 indra/newview/skins/default/xui/de/floater_notification.xml create mode 100644 indra/newview/skins/default/xui/de/floater_notifications_console.xml create mode 100644 indra/newview/skins/default/xui/de/floater_perm_prefs.xml create mode 100644 indra/newview/skins/default/xui/de/floater_statistics.xml create mode 100644 indra/newview/skins/default/xui/de/menu_mini_map.xml create mode 100644 indra/newview/skins/default/xui/de/panel_notifications_channel.xml create mode 100644 indra/newview/skins/default/xui/es/floater_bulk_perms.xml create mode 100644 indra/newview/skins/default/xui/es/floater_font_test.xml create mode 100644 indra/newview/skins/default/xui/es/floater_perm_prefs.xml create mode 100644 indra/newview/skins/default/xui/es/floater_statistics.xml create mode 100644 indra/newview/skins/default/xui/es/menu_mini_map.xml create mode 100644 indra/newview/skins/default/xui/fr/floater_statistics.xml create mode 100644 indra/newview/skins/default/xui/fr/menu_mini_map.xml create mode 100644 indra/newview/skins/default/xui/it/floater_bulk_perms.xml create mode 100644 indra/newview/skins/default/xui/it/floater_font_test.xml create mode 100644 indra/newview/skins/default/xui/it/floater_perm_prefs.xml create mode 100644 indra/newview/skins/default/xui/it/floater_statistics.xml create mode 100644 indra/newview/skins/default/xui/it/menu_mini_map.xml create mode 100644 indra/newview/skins/default/xui/ja/floater_font_test.xml create mode 100644 indra/newview/skins/default/xui/ja/floater_statistics.xml create mode 100644 indra/newview/skins/default/xui/ja/menu_mini_map.xml create mode 100644 indra/newview/skins/default/xui/nl/floater_bulk_perms.xml create mode 100644 indra/newview/skins/default/xui/nl/floater_font_test.xml create mode 100644 indra/newview/skins/default/xui/nl/floater_perm_prefs.xml create mode 100644 indra/newview/skins/default/xui/nl/floater_statistics.xml create mode 100644 indra/newview/skins/default/xui/nl/menu_mini_map.xml create mode 100644 indra/newview/skins/default/xui/pl/floater_bulk_perms.xml create mode 100644 indra/newview/skins/default/xui/pl/floater_font_test.xml create mode 100644 indra/newview/skins/default/xui/pl/floater_perm_prefs.xml create mode 100644 indra/newview/skins/default/xui/pl/floater_statistics.xml create mode 100644 indra/newview/skins/default/xui/pl/menu_mini_map.xml create mode 100644 indra/newview/skins/default/xui/pt/floater_bulk_perms.xml create mode 100644 indra/newview/skins/default/xui/pt/floater_font_test.xml create mode 100644 indra/newview/skins/default/xui/pt/floater_perm_prefs.xml create mode 100644 indra/newview/skins/default/xui/pt/floater_statistics.xml create mode 100644 indra/newview/skins/default/xui/pt/menu_mini_map.xml (limited to 'indra') diff --git a/indra/llcharacter/lleditingmotion.cpp b/indra/llcharacter/lleditingmotion.cpp index 6907df82d4..381d19e614 100644 --- a/indra/llcharacter/lleditingmotion.cpp +++ b/indra/llcharacter/lleditingmotion.cpp @@ -187,14 +187,6 @@ BOOL LLEditingMotion::onUpdate(F32 time, U8* joint_mask) } focus_pt += mCharacter->getCharacterPosition(); - if (!llfinite(focus_pt.magVecSquared())) - { - LLVector3 tmp = mCharacter->getCharacterPosition() ; - LL_WARNS_ONCE("Animation") << "Non finite focus point in editing motion. focus point: " << focus_pt << " and character position: " << - tmp << " and pointAtPt: " << pointAtPt << - " - ignoring anim" << LL_ENDL; - return FALSE; - } // propagate joint positions to kinematic chain mParentJoint.setPosition( mParentState->getJoint()->getWorldPosition() ); diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp index 82530b1489..669afc5330 100644 --- a/indra/llcommon/llapr.cpp +++ b/indra/llcommon/llapr.cpp @@ -38,6 +38,7 @@ apr_pool_t *gAPRPoolp = NULL; // Global APR memory pool LLVolatileAPRPool *LLAPRFile::sAPRFilePoolp = NULL ; //global volatile APR memory pool. apr_thread_mutex_t *gLogMutexp = NULL; +apr_thread_mutex_t *gCallStacksLogMutexp = NULL; const S32 FULL_VOLATILE_APR_POOL = 1024 ; //number of references to LLVolatileAPRPool @@ -51,6 +52,7 @@ void ll_init_apr() // Initialize the logging mutex apr_thread_mutex_create(&gLogMutexp, APR_THREAD_MUTEX_UNNESTED, gAPRPoolp); + apr_thread_mutex_create(&gCallStacksLogMutexp, APR_THREAD_MUTEX_UNNESTED, gAPRPoolp); } if(!LLAPRFile::sAPRFilePoolp) @@ -72,6 +74,14 @@ void ll_cleanup_apr() apr_thread_mutex_destroy(gLogMutexp); gLogMutexp = NULL; } + if (gCallStacksLogMutexp) + { + // Clean up the logging mutex + + // All other threads NEED to be done before we clean up APR, so this is okay. + apr_thread_mutex_destroy(gCallStacksLogMutexp); + gCallStacksLogMutexp = NULL; + } if (gAPRPoolp) { apr_pool_destroy(gAPRPoolp); diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h index 44ad2dd50f..63130a89fc 100644 --- a/indra/llcommon/llapr.h +++ b/indra/llcommon/llapr.h @@ -49,6 +49,7 @@ #include "llstring.h" extern apr_thread_mutex_t* gLogMutexp; +extern apr_thread_mutex_t* gCallStacksLogMutexp; /** * @brief initialize the common apr constructs -- apr itself, the diff --git a/indra/llcommon/lldate.h b/indra/llcommon/lldate.h index 32825b18dc..7cc9c8aceb 100644 --- a/indra/llcommon/lldate.h +++ b/indra/llcommon/lldate.h @@ -140,6 +140,14 @@ public: bool operator!=(const LLDate& rhs) const { return (*this < rhs) || (rhs < *this); } bool operator==(const LLDate& rhs) const { return !(*this != rhs); } + /** + * @brief Compare to epoch UTC. + */ + + bool isNull() const { return mSecondsSinceEpoch == 0.0; } + bool notNull() const { return mSecondsSinceEpoch != 0.0; } + + private: F64 mSecondsSinceEpoch; }; diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index d671decccb..b135dafb3c 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -1223,9 +1223,62 @@ namespace LLError char** LLCallStacks::sBuffer = NULL ; S32 LLCallStacks::sIndex = 0 ; + class CallStacksLogLock + { + public: + CallStacksLogLock(); + ~CallStacksLogLock(); + bool ok() const { return mOK; } + private: + bool mLocked; + bool mOK; + }; + + CallStacksLogLock::CallStacksLogLock() + : mLocked(false), mOK(false) + { + if (!gCallStacksLogMutexp) + { + mOK = true; + return; + } + + const int MAX_RETRIES = 5; + for (int attempts = 0; attempts < MAX_RETRIES; ++attempts) + { + apr_status_t s = apr_thread_mutex_trylock(gCallStacksLogMutexp); + if (!APR_STATUS_IS_EBUSY(s)) + { + mLocked = true; + mOK = true; + return; + } + + ms_sleep(1); + } + + // We're hosed, we can't get the mutex. Blah. + std::cerr << "CallStacksLogLock::CallStacksLogLock: failed to get mutex for log" + << std::endl; + } + + CallStacksLogLock::~CallStacksLogLock() + { + if (mLocked) + { + apr_thread_mutex_unlock(gCallStacksLogMutexp); + } + } + //static void LLCallStacks::push(const char* function, const int line) { + CallStacksLogLock lock; + if (!lock.ok()) + { + return; + } + if(!sBuffer) { sBuffer = new char*[512] ; @@ -1261,6 +1314,12 @@ namespace LLError //static void LLCallStacks::end(std::ostringstream* _out) { + CallStacksLogLock lock; + if (!lock.ok()) + { + return; + } + if(!sBuffer) { sBuffer = new char*[512] ; @@ -1283,6 +1342,12 @@ namespace LLError //static void LLCallStacks::print() { + CallStacksLogLock lock; + if (!lock.ok()) + { + return; + } + if(sIndex > 0) { llinfos << " ************* PRINT OUT LL CALL STACKS ************* " << llendl ; diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index 15f0e98330..a28d0f7268 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -35,7 +35,7 @@ const S32 LL_VERSION_MAJOR = 1; const S32 LL_VERSION_MINOR = 24; -const S32 LL_VERSION_PATCH = 0; +const S32 LL_VERSION_PATCH = 2; const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Release"; diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 5fb0e57c06..0762d7c12d 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -2179,7 +2179,9 @@ void LLMenuGL::arrange( void ) { if ((*item_iter)->getVisible()) { - if (!getTornOff() && width + (*item_iter)->getNominalWidth() > max_width - spillover_item_width) + if (!getTornOff() + && item_iter != mItems.begin() // Don't spillover the first item! + && width + (*item_iter)->getNominalWidth() > max_width - spillover_item_width) { // no room for any more items createSpilloverBranch(); @@ -2189,15 +2191,15 @@ void LLMenuGL::arrange( void ) { LLMenuItemGL* itemp = (*spillover_iter); removeChild(itemp); - mSpilloverMenu->append(itemp); + mSpilloverMenu->appendNoArrange(itemp); // *NOTE:Mani Favor addChild() in merge with skinning } + mSpilloverMenu->arrange(); // *NOTE: Mani Remove line in merge with skinning/viewer2.0 branch + mSpilloverMenu->updateParent(LLMenuGL::sMenuContainer); // *NOTE: Mani Remove line in merge with skinning/viewer2.0 branch mItems.erase(item_iter, mItems.end()); - mItems.push_back(mSpilloverBranch); addChild(mSpilloverBranch); height = llmax(height, mSpilloverBranch->getNominalHeight()); width += mSpilloverBranch->getNominalWidth(); - break; } else @@ -2216,7 +2218,9 @@ void LLMenuGL::arrange( void ) { if ((*item_iter)->getVisible()) { - if (!getTornOff() && height + (*item_iter)->getNominalHeight() > max_height - spillover_item_height) + if (!getTornOff() + && item_iter != mItems.begin() // Don't spillover the first item! + && height + (*item_iter)->getNominalHeight() > max_height - spillover_item_height) { // no room for any more items createSpilloverBranch(); @@ -2226,14 +2230,15 @@ void LLMenuGL::arrange( void ) { LLMenuItemGL* itemp = (*spillover_iter); removeChild(itemp); - mSpilloverMenu->append(itemp); + mSpilloverMenu->appendNoArrange(itemp); // *NOTE:Mani Favor addChild() in merge with skinning } + mSpilloverMenu->arrange(); // *NOTE: Mani Remove line in merge with skinning/viewer2.0 branch + mSpilloverMenu->updateParent(LLMenuGL::sMenuContainer); // *NOTE: Mani Remove line in merge with skinning/viewer2.0 branch mItems.erase(item_iter, mItems.end()); mItems.push_back(mSpilloverBranch); addChild(mSpilloverBranch); height += mSpilloverBranch->getNominalHeight(); width = llmax( width, mSpilloverBranch->getNominalWidth() ); - break; } else @@ -2478,6 +2483,15 @@ BOOL LLMenuGL::append( LLMenuItemGL* item ) return TRUE; } +// *NOTE:Mani - appendNoArrange() should be removed when merging to skinning/viewer2.0 +// Its added as a fix to a viewer 1.23 bug that has already been address by skinning work. +BOOL LLMenuGL::appendNoArrange( LLMenuItemGL* item ) +{ + mItems.push_back( item ); + addChild( item ); + return TRUE; +} + // add a separator to this menu BOOL LLMenuGL::appendSeparator( const std::string &separator_name ) { diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index a2ef968bcd..030b81b58c 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -439,6 +439,10 @@ public: // Add the menu item to this menu. virtual BOOL append( LLMenuItemGL* item ); + // *NOTE:Mani - appendNoArrange() should be removed when merging to skinning/viewer2.0 + // Its added as a fix to a viewer 1.23 bug that has already been address by skinning work. + virtual BOOL appendNoArrange( LLMenuItemGL* item ); + // add a separator to this menu virtual BOOL appendSeparator( const std::string &separator_name = LLStringUtil::null ); diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 2ae96726af..6b7dd0a3de 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -310,7 +310,7 @@ void LLNotificationForm::addElement(const std::string& type, const std::string& LLSD element; element["type"] = type; element["name"] = name; - element["label"] = name; + element["text"] = name; element["value"] = value; element["index"] = mFormData.size(); mFormData.append(element); @@ -525,7 +525,12 @@ std::string LLNotification::getSelectedOptionName(const LLSD& response) void LLNotification::respond(const LLSD& response) { mRespondedTo = true; - LLNotificationFunctorRegistry::instance().getFunctor(mResponseFunctorName)(asLLSD(), response); + // look up the functor + LLNotificationFunctorRegistry::ResponseFunctor functor = + LLNotificationFunctorRegistry::instance().getFunctor(mResponseFunctorName); + // and then call it + functor(asLLSD(), response); + if (mTemporaryResponder) { LLNotificationFunctorRegistry::instance().unregisterFunctor(mResponseFunctorName); diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index 92d045d114..28780c7adb 100644 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -1085,11 +1085,15 @@ struct LLLayoutStack::LLEmbeddedPanel { if (mOrientation == HORIZONTAL) { - return mVisibleAmt * clamp_rescale(mCollapseAmt, 0.f, 1.f, 1.f, (F32)mMinWidth / (F32)mPanel->getRect().getWidth()); + F32 collapse_amt = + clamp_rescale(mCollapseAmt, 0.f, 1.f, 1.f, (F32)mMinWidth / (F32)llmax(1, mPanel->getRect().getWidth())); + return mVisibleAmt * collapse_amt; } else { - return mVisibleAmt * clamp_rescale(mCollapseAmt, 0.f, 1.f, 1.f, (F32)mMinHeight / (F32)mPanel->getRect().getHeight()); + F32 collapse_amt = + clamp_rescale(mCollapseAmt, 0.f, 1.f, 1.f, llmin(1.f, (F32)mMinHeight / (F32)llmax(1, mPanel->getRect().getHeight()))); + return mVisibleAmt * collapse_amt; } } diff --git a/indra/llwindow/lldxhardware.cpp b/indra/llwindow/lldxhardware.cpp index beab131856..e0cb82d2be 100644 --- a/indra/llwindow/lldxhardware.cpp +++ b/indra/llwindow/lldxhardware.cpp @@ -624,7 +624,37 @@ LLSD LLDXHardware::getDisplayInfo() ret["DeviceName"] = device_name; std::string device_driver= get_string(device_containerp, L"szDriverVersion"); ret["DriverVersion"] = device_driver; - } + + // ATI has a slightly different version string + if(device_name.length() >= 4 && device_name.substr(0,4) == "ATI ") + { + // get the key + HKEY hKey; + const DWORD RV_SIZE = 100; + WCHAR release_version[RV_SIZE]; + + // Hard coded registry entry. Using this since it's simpler for now. + // And using EnumDisplayDevices to get a registry key also requires + // a hard coded Query value. + if(ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\ATI Technologies\\CBT"), &hKey)) + { + // get the value + DWORD dwType = REG_SZ; + DWORD dwSize = sizeof(WCHAR) * RV_SIZE; + if(ERROR_SUCCESS == RegQueryValueEx(hKey, TEXT("ReleaseVersion"), + NULL, &dwType, (LPBYTE)release_version, &dwSize)) + { + // print the value + // windows doesn't guarantee to be null terminated + release_version[RV_SIZE - 1] = NULL; + ret["DriverVersion"] = utf16str_to_utf8str(release_version); + + } + RegCloseKey(hKey); + } + } + } + LCleanup: SAFE_RELEASE(file_containerp); SAFE_RELEASE(driver_containerp); diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index d9ed45ab9d..8bd04d727c 100644 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -309,10 +309,13 @@ BOOL LLControlGroup::declareControl(const std::string& name, eControlType type, { if (persist && existing_control->isType(type)) { - // Sometimes we need to declare a control *after* it has been loaded from a settings file. - LLSD cur_value = existing_control->getValue(); // get the current value - existing_control->setDefaultValue(initial_val); // set the default to the declared value - existing_control->setValue(cur_value); // now set to the loaded value + if (!existing_control->llsd_compare(existing_control->getDefault(), initial_val)) + { + // Sometimes we need to declare a control *after* it has been loaded from a settings file. + LLSD cur_value = existing_control->getValue(); // get the current value + existing_control->setDefaultValue(initial_val); // set the default to the declared value + existing_control->setValue(cur_value); // now set to the loaded value + } } else { @@ -1059,10 +1062,10 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v } U32 validitems = 0; - bool persist = true; bool hidefromsettingseditor = false; for(LLSD::map_const_iterator itr = settings.beginMap(); itr != settings.endMap(); ++itr) { + bool persist = true; name = (*itr).first; control_map = (*itr).second; @@ -1171,13 +1174,13 @@ static std::string get_warn_name(const std::string& name) void LLControlGroup::addWarning(const std::string& name) { + // Note: may get called more than once per warning + // (e.g. if allready loaded from a settings file), + // but that is OK, declareBOOL will handle it std::string warnname = get_warn_name(name); - if(mNameTable.find(warnname) == mNameTable.end()) - { - std::string comment = std::string("Enables ") + name + std::string(" warning dialog"); - declareBOOL(warnname, TRUE, comment); - mWarnings.insert(warnname); - } + std::string comment = std::string("Enables ") + name + std::string(" warning dialog"); + declareBOOL(warnname, TRUE, comment); + mWarnings.insert(warnname); } BOOL LLControlGroup::getWarning(const std::string& name) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 0081893869..7ae92129dc 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -4801,16 +4801,16 @@ 1.0 - IMInChatHistory + IMInChatConsole Comment - Copy IM into chat history + Copy IM into background chat console Persist 1 Type Boolean Value - 0 + 1 IMShowTimestamps @@ -6501,8 +6501,8 @@ Value 0 - 550 - 500 + 586 + 576 0 @@ -7383,6 +7383,17 @@ Value 0 + RenderHUDParticles + + Comment + Display particle systems in HUD attachments (experimental) + Persist + 1 + Type + Boolean + Value + 0 + RenderHiddenSelections Comment @@ -11629,7 +11640,7 @@ Type Boolean Value - 1 + 0 WaterEditPresets diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index f484167cab..0ed5663ec1 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -5615,13 +5615,31 @@ - - - + + - + + + + + + + + + - - - - - - - - - - - - - - - - - - --> - + + + + + + + + diff --git a/indra/newview/installers/windows/lang_nl.nsi b/indra/newview/installers/windows/lang_nl.nsi index c8ffa8bfcd..8884b1e858 100644 Binary files a/indra/newview/installers/windows/lang_nl.nsi and b/indra/newview/installers/windows/lang_nl.nsi differ diff --git a/indra/newview/linux_tools/launch_url.sh b/indra/newview/linux_tools/launch_url.sh index d2c8919d46..404ea36f26 100755 --- a/indra/newview/linux_tools/launch_url.sh +++ b/indra/newview/linux_tools/launch_url.sh @@ -7,17 +7,15 @@ # # On Unixoids we try, in order of decreasing priority: # - $BROWSER if set (preferred) -# - kfmclient openURL +# - Default GNOME browser +# - Default KDE browser # - x-www-browser -# - opera -# - firefox -# - mozilla -# - netscape +# - The first browser in $BROWSER_COMMANDS that is found. URL="$1" if [ -z "$URL" ]; then - echo "Usage: $0 URL" + echo "Usage: $(basename "$0") URL" exit fi @@ -47,46 +45,42 @@ if [ ! -z "$XBROWSER" ]; then echo "$0: Trying some others..." fi -# else kfmclient -# (embodies KDE concept of 'preferred browser') -if which kfmclient >/dev/null; then - kfmclient openURL "$URL" & - exit -fi - -# else x-www-browser -# (Debianesque idea of a working X browser) -if which x-www-browser >/dev/null; then - x-www-browser "$URL" & - exit -fi - -# else opera -# (if user has opera in their path, they probably went to the -# trouble of installing it -> prefer it) -if which opera >/dev/null; then - opera "$URL" & +# Launcher the default GNOME browser. +if [ ! -z "$GNOME_DESKTOP_SESSION_ID" ] && which gnome-open >/dev/null; then + gnome-open "$URL" & exit fi -# else firefox -if which firefox >/dev/null; then - firefox "$URL" & +# Launch the default KDE browser. +if [ ! -z "$KDE_FULL_SESSION" ] && which kfmclient >/dev/null; then + kfmclient openURL "$URL" & exit fi -# else mozilla -if which mozilla >/dev/null; then - mozilla "$URL" & - exit -fi - -# else netscape -if which netscape >/dev/null; then - netscape "$URL" & - exit -fi +# List of browser commands that will be tried in the order listed. x-www-browser +# will be tried first, which is a debian alternative. +BROWSER_COMMANDS=" \ + x-www-browser \ + firefox \ + mozilla-firefox \ + iceweasel \ + iceape \ + opera \ + epiphany-browser \ + epiphany-gecko \ + epiphany-webkit \ + epiphany \ + mozilla \ + seamonkey \ + galeon \ + dillo \ + netscape" +for browser_cmd in $BROWSER_COMMANDS; do + if which $browser_cmd >/dev/null; then + $browser_cmd "$URL" & + exit + fi +done echo '$0: Failed to find a known browser. Please consider setting the $BROWSER environment variable.' - -# end. +exit 1 diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 9785940ff6..98526c8a57 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -1315,167 +1315,166 @@ LLQuaternion LLAgent::getQuat() const //----------------------------------------------------------------------------- // calcFocusOffset() //----------------------------------------------------------------------------- -LLVector3 LLAgent::calcFocusOffset(LLViewerObject *object, LLVector3 pos_agent, S32 x, S32 y) +LLVector3 LLAgent::calcFocusOffset(LLViewerObject *object, LLVector3 original_focus_point, S32 x, S32 y) { // calculate offset based on view direction BOOL is_avatar = object->isAvatar(); - LLMatrix4 obj_matrix = is_avatar ? ((LLVOAvatar*)object)->mPelvisp->getWorldMatrix() : object->getRenderMatrix(); - LLQuaternion obj_rot = is_avatar ? ((LLVOAvatar*)object)->mPelvisp->getWorldRotation() : object->getRenderRotation(); - LLVector3 obj_pos = is_avatar ? ((LLVOAvatar*)object)->mPelvisp->getWorldPosition() : object->getRenderPosition(); - LLQuaternion inv_obj_rot = ~obj_rot; - - LLVector3 obj_dir_abs = obj_pos - LLViewerCamera::getInstance()->getOrigin(); - obj_dir_abs.rotVec(inv_obj_rot); - obj_dir_abs.normalize(); - obj_dir_abs.abs(); - + // since the animation system allows the avatars facing and position to deviate from its nominal LLViewerObject/LLDrawable transform + // calculate the focus-specific orientation for avatars based off the pelvis joint + // NOTE: pelvis no longer good candidate, removed. DEV-30589 + LLMatrix4 obj_matrix = object->getRenderMatrix(); + LLQuaternion obj_rot = object->getRenderRotation(); + LLVector3 obj_pos = object->getRenderPosition(); + LLQuaternion inv_obj_rot = ~obj_rot; // get inverse of rotation LLVector3 object_extents = object->getScale(); // make sure they object extents are non-zero object_extents.clamp(0.001f, F32_MAX); - LLVector3 object_half_extents = object_extents * 0.5f; - obj_dir_abs.mV[VX] = obj_dir_abs.mV[VX] / object_extents.mV[VX]; - obj_dir_abs.mV[VY] = obj_dir_abs.mV[VY] / object_extents.mV[VY]; - obj_dir_abs.mV[VZ] = obj_dir_abs.mV[VZ] / object_extents.mV[VZ]; + // obj_to_cam_ray is unit vector pointing from object center to camera, in the coordinate frame of the object + LLVector3 obj_to_cam_ray = obj_pos - LLViewerCamera::getInstance()->getOrigin(); + obj_to_cam_ray.rotVec(inv_obj_rot); + obj_to_cam_ray.normalize(); - LLVector3 normal; - if (obj_dir_abs.mV[VX] > obj_dir_abs.mV[VY] && obj_dir_abs.mV[VX] > obj_dir_abs.mV[VZ]) + // obj_to_cam_ray_proportions are the (positive) ratios of + // the obj_to_cam_ray x,y,z components with the x,y,z object dimensions. + LLVector3 obj_to_cam_ray_proportions; + obj_to_cam_ray_proportions.mV[VX] = llabs(obj_to_cam_ray.mV[VX] / object_extents.mV[VX]); + obj_to_cam_ray_proportions.mV[VY] = llabs(obj_to_cam_ray.mV[VY] / object_extents.mV[VY]); + obj_to_cam_ray_proportions.mV[VZ] = llabs(obj_to_cam_ray.mV[VZ] / object_extents.mV[VZ]); + + // find the largest ratio stored in obj_to_cam_ray_proportions + // this corresponds to the object's local axial plane (XY, YZ, XZ) that is *most* facing the camera + LLVector3 longest_object_axis; + // is x-axis longest? + if (obj_to_cam_ray_proportions.mV[VX] > obj_to_cam_ray_proportions.mV[VY] + && obj_to_cam_ray_proportions.mV[VX] > obj_to_cam_ray_proportions.mV[VZ]) { - normal.setVec(obj_matrix.getFwdRow4()); + // then grab it + longest_object_axis.setVec(obj_matrix.getFwdRow4()); } - else if (obj_dir_abs.mV[VY] > obj_dir_abs.mV[VZ]) + // is y-axis longest? + else if (obj_to_cam_ray_proportions.mV[VY] > obj_to_cam_ray_proportions.mV[VZ]) { - normal.setVec(obj_matrix.getLeftRow4()); + // then grab it + longest_object_axis.setVec(obj_matrix.getLeftRow4()); } + // otherwise, use z axis else { - normal.setVec(obj_matrix.getUpRow4()); + longest_object_axis.setVec(obj_matrix.getUpRow4()); } - normal.normalize(); + + // Use this axis as the normal to project mouse click on to plane with that normal, at the object center. + // This generates a point behind the mouse cursor that is approximately in the middle of the object in + // terms of depth. + // We do this to allow the camera rotation tool to "tumble" the object by rotating the camera. + // If the focus point were the object surface under the mouse, camera rotation would introduce an undesirable + // eccentricity to the object orientation + LLVector3 focus_plane_normal(longest_object_axis); + focus_plane_normal.normalize(); LLVector3d focus_pt_global; - // RN: should we check return value for valid pick? - gViewerWindow->mousePointOnPlaneGlobal(focus_pt_global, x, y, gAgent.getPosGlobalFromAgent(obj_pos), normal); + gViewerWindow->mousePointOnPlaneGlobal(focus_pt_global, x, y, gAgent.getPosGlobalFromAgent(obj_pos), focus_plane_normal); LLVector3 focus_pt = gAgent.getPosAgentFromGlobal(focus_pt_global); - // find vector from camera to focus point in object coordinates - LLVector3 camera_focus_vec = focus_pt - LLViewerCamera::getInstance()->getOrigin(); - // convert to object-local space - camera_focus_vec.rotVec(inv_obj_rot); + + // find vector from camera to focus point in object space + LLVector3 camera_to_focus_vec = focus_pt - LLViewerCamera::getInstance()->getOrigin(); + camera_to_focus_vec.rotVec(inv_obj_rot); // find vector from object origin to focus point in object coordinates - LLVector3 focus_delta = focus_pt - obj_pos; + LLVector3 focus_offset_from_object_center = focus_pt - obj_pos; // convert to object-local space - focus_delta.rotVec(inv_obj_rot); + focus_offset_from_object_center.rotVec(inv_obj_rot); - // calculate clip percentage needed to get focus offset back in bounds along the camera_focus axis + // We need to project the focus point back into the bounding box of the focused object. + // Do this by calculating the XYZ scale factors needed to get focus offset back in bounds along the camera_focus axis LLVector3 clip_fraction; + // for each axis... for (U32 axis = VX; axis <= VZ; axis++) { - F32 clip_amt; - if (focus_delta.mV[axis] > 0.f) + //...calculate distance that focus offset sits outside of bounding box along that axis... + //NOTE: dist_out_of_bounds keeps the sign of focus_offset_from_object_center + F32 dist_out_of_bounds; + if (focus_offset_from_object_center.mV[axis] > 0.f) { - clip_amt = llmax(0.f, focus_delta.mV[axis] - object_half_extents.mV[axis]); + dist_out_of_bounds = llmax(0.f, focus_offset_from_object_center.mV[axis] - (object_extents.mV[axis] * 0.5f)); } else { - clip_amt = llmin(0.f, focus_delta.mV[axis] + object_half_extents.mV[axis]); + dist_out_of_bounds = llmin(0.f, focus_offset_from_object_center.mV[axis] + (object_extents.mV[axis] * 0.5f)); } - // don't divide by very small nunber - if (llabs(camera_focus_vec.mV[axis]) < 0.0001f) + //...then calculate the scale factor needed to push camera_to_focus_vec back in bounds along current axis + if (llabs(camera_to_focus_vec.mV[axis]) < 0.0001f) { + // don't divide by very small number clip_fraction.mV[axis] = 0.f; } else { - clip_fraction.mV[axis] = clip_amt / camera_focus_vec.mV[axis]; + clip_fraction.mV[axis] = dist_out_of_bounds / camera_to_focus_vec.mV[axis]; } } LLVector3 abs_clip_fraction = clip_fraction; abs_clip_fraction.abs(); - // find greatest shrinkage factor and + // find axis of focus offset that is *most* outside the bounding box and use that to // rescale focus offset to inside object extents - if (abs_clip_fraction.mV[VX] > abs_clip_fraction.mV[VY] && - abs_clip_fraction.mV[VX] > abs_clip_fraction.mV[VZ]) + if (abs_clip_fraction.mV[VX] > abs_clip_fraction.mV[VY] + && abs_clip_fraction.mV[VX] > abs_clip_fraction.mV[VZ]) { - focus_delta -= clip_fraction.mV[VX] * camera_focus_vec; + focus_offset_from_object_center -= clip_fraction.mV[VX] * camera_to_focus_vec; } else if (abs_clip_fraction.mV[VY] > abs_clip_fraction.mV[VZ]) { - focus_delta -= clip_fraction.mV[VY] * camera_focus_vec; + focus_offset_from_object_center -= clip_fraction.mV[VY] * camera_to_focus_vec; } else { - focus_delta -= clip_fraction.mV[VZ] * camera_focus_vec; + focus_offset_from_object_center -= clip_fraction.mV[VZ] * camera_to_focus_vec; } // convert back to world space - focus_delta.rotVec(obj_rot); + focus_offset_from_object_center.rotVec(obj_rot); + // now, based on distance of camera from object relative to object size + // push the focus point towards the near surface of the object when (relatively) close to the objcet + // or keep the focus point in the object middle when (relatively) far + // NOTE: leave focus point in middle of avatars, since the behavior you want when alt-zooming on avatars + // is almost always "tumble about middle" and not "spin around surface point" if (!is_avatar) { - //unproject relative clicked coordinate from window coordinate using GL - /*GLint viewport[4]; - GLdouble modelview[16]; - GLdouble projection[16]; - GLfloat winX, winY, winZ; - GLdouble posX, posY, posZ; - - // convert our matrices to something that has a multiply that works - glh::matrix4f newModel((F32*)LLViewerCamera::getInstance()->getModelview().mMatrix); - glh::matrix4f tmpObjMat((F32*)obj_matrix.mMatrix); - newModel *= tmpObjMat; - - for(U32 i = 0; i < 16; ++i) - { - modelview[i] = newModel.m[i]; - projection[i] = LLViewerCamera::getInstance()->getProjection().mMatrix[i/4][i%4]; - } - glGetIntegerv( GL_VIEWPORT, viewport ); - - winX = ((F32)x) * gViewerWindow->getDisplayScale().mV[VX]; - winY = ((F32)y) * gViewerWindow->getDisplayScale().mV[VY]; - glReadPixels( llfloor(winX), llfloor(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ ); - - gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);*/ - - LLVector3 obj_rel = pos_agent - object->getRenderPosition(); + LLVector3 obj_rel = original_focus_point - object->getRenderPosition(); - LLVector3 obj_center = LLVector3(0, 0, 0) * object->getRenderMatrix(); - //now that we have the object relative position, we should bias toward the center of the object //based on the distance of the camera to the focus point vs. the distance of the camera to the focus F32 relDist = llabs(obj_rel * LLViewerCamera::getInstance()->getAtAxis()); - F32 viewDist = dist_vec(obj_center + obj_rel, LLViewerCamera::getInstance()->getOrigin()); + F32 viewDist = dist_vec(obj_pos + obj_rel, LLViewerCamera::getInstance()->getOrigin()); LLBBox obj_bbox = object->getBoundingBoxAgent(); F32 bias = 0.f; + // virtual_camera_pos is the camera position we are simulating by backing the camera off + // and adjusting the FOV LLVector3 virtual_camera_pos = gAgent.getPosAgentFromGlobal(mFocusTargetGlobal + (getCameraPositionGlobal() - mFocusTargetGlobal) / (1.f + mCameraFOVZoomFactor)); - if(obj_bbox.containsPointAgent(virtual_camera_pos)) - { - // if the camera is inside the object (large, hollow objects, for example) - // force focus point all the way to destination depth, away from object center - bias = 1.f; - } - else + // if the camera is inside the object (large, hollow objects, for example) + // leave focus point all the way to destination depth, away from object center + if(!obj_bbox.containsPointAgent(virtual_camera_pos)) { // perform magic number biasing of focus point towards surface vs. planar center bias = clamp_rescale(relDist/viewDist, 0.1f, 0.7f, 0.0f, 1.0f); + obj_rel = lerp(focus_offset_from_object_center, obj_rel, bias); } - - obj_rel = lerp(focus_delta, obj_rel, bias); - - return LLVector3(obj_rel); + + focus_offset_from_object_center = obj_rel; } - return LLVector3(focus_delta.mV[VX], focus_delta.mV[VY], focus_delta.mV[VZ]); + return focus_offset_from_object_center; } //----------------------------------------------------------------------------- diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 640b835da2..0c34d018a2 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2042,8 +2042,18 @@ bool LLAppViewer::initConfiguration() void LLAppViewer::checkForCrash(void) { -#if LL_SEND_CRASH_REPORTS - if (gLastExecEvent == LAST_EXEC_FROZE || gLastExecEvent == LAST_EXEC_OTHER_CRASH) +#if 1 //*REMOVE:Mani LL_SEND_CRASH_REPORTS + //*NOTE:Mani The current state of the crash handler has the MacOSX + // sending all crash reports as freezes, in order to let + // the MacOSX CrashRepoter generate stacks before spawning the + // SL crash logger. + // The Linux and Windows clients generate their own stacks and + // spawn the SL crash logger immediately. This may change in the future. +#if LL_DARWIN + if(gLastExecEvent != LAST_EXEC_NORMAL) +#else + if (gLastExecEvent == LAST_EXEC_FROZE || gLastExecEvent == LAST_EXEC_OTHER_CRASH) +#endif { llinfos << "Last execution froze, requesting to send crash report." << llendl; // @@ -2285,7 +2295,7 @@ void LLAppViewer::handleViewerCrash() llinfos << "Handle viewer crash entry." << llendl; //print out recorded call stacks if there are any. - LLError::LLCallStacks::print() ; + LLError::LLCallStacks::print(); LLAppViewer* pApp = LLAppViewer::instance(); if (pApp->beingDebugged()) @@ -3728,6 +3738,35 @@ void LLAppViewer::disconnectViewer() { gFloaterView->restoreAll(); } + + + std::list floaters_to_close; + for(LLView::child_list_const_iter_t it = gFloaterView->getChildList()->begin(); + it != gFloaterView->getChildList()->end(); + ++it) + { + // The following names are defined in the + // floater_image_preview.xml + // floater_sound_preview.xml + // floater_animation_preview.xml + // files. + LLFloater* fl = static_cast(*it); + if(fl + && (fl->getName() == "Image Preview" + || fl->getName() == "Sound Preview" + || fl->getName() == "Animation Preview" + )) + { + floaters_to_close.push_back(fl); + } + } + + while(!floaters_to_close.empty()) + { + LLFloater* fl = floaters_to_close.front(); + floaters_to_close.pop_front(); + fl->close(); + } } if (LLSelectMgr::getInstance()) diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 1c32f0c564..7c2e341bed 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -135,6 +135,31 @@ bool LLAppViewerMacOSX::init() return LLAppViewer::init(); } +bool LLAppViewerMacOSX::initLogging() +{ + // Remove the crash stack log from previous executions. + // Since we've started logging a new instance of the app, we can assume + // The old crash stack is invalid for the next crash report. + char path[MAX_PATH]; + FSRef folder; + if(FSFindFolder(kUserDomain, kLogsFolderType, false, &folder) == noErr) + { + // folder is an FSRef to ~/Library/Logs/ + if(FSRefMakePath(&folder, (UInt8*)&path, sizeof(path)) == noErr) + { + std::string pathname = std::string(path) + std::string("/CrashReporter/"); + std::string mask = "Second Life*"; + std::string file_name; + while(gDirUtilp->getNextFileInDir(pathname, mask, file_name, false)) + { + LLFile::remove(pathname + file_name); + } + } + } + + return LLAppViewer::initLogging(); +} + // MacOSX may add and addition command line arguement for the process serial number. // The option takes a form like '-psn_0_12345'. The following method should be able to recognize // and either ignore or return a pair of values for the option. diff --git a/indra/newview/llappviewermacosx.h b/indra/newview/llappviewermacosx.h index bc841fc3a7..0928916a57 100644 --- a/indra/newview/llappviewermacosx.h +++ b/indra/newview/llappviewermacosx.h @@ -55,6 +55,7 @@ protected: virtual void handleSyncCrashTrace(); std::string generateSerialNumber(); + virtual bool initLogging(); virtual bool initParseCommandLine(LLCommandLineParser& clp); }; diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 5b04e241a1..4fca9b1f19 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -171,6 +171,9 @@ void LLAssetUploadResponder::uploadUpload(const LLSD& content) void LLAssetUploadResponder::uploadFailure(const LLSD& content) { + // remove the "Uploading..." message + LLUploadDialog::modalUploadFinished(); + std::string reason = content["state"]; // deal with L$ errors if (reason == "insufficient funds") diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp index 71ecca5d41..86821249a0 100644 --- a/indra/newview/llcurrencyuimanager.cpp +++ b/indra/newview/llcurrencyuimanager.cpp @@ -121,7 +121,8 @@ LLCurrencyUIManager::Impl::Impl(LLPanel& dialog) : mPanel(dialog), mHidden(false), mError(false), - mUserCurrencyBuy(1000), mUserEnteredCurrencyBuy(false), + mUserCurrencyBuy(2000), // note, this is a default, real value set in llfloaterbuycurrency.cpp + mUserEnteredCurrencyBuy(false), mSiteCurrencyEstimated(false), mSiteCurrencyEstimatedCost(0), mBought(false), diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 2652387bfe..810799d27c 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -59,7 +59,11 @@ #include "llappviewer.h" #include "llglheaders.h" #include "llmediamanager.h" +#include "llwindow.h" +#if LL_WINDOWS +#include "lldxhardware.h" +#endif extern LLCPUInfo gSysCPU; extern LLMemoryInfo gSysMemory; @@ -193,6 +197,20 @@ LLFloaterAbout::LLFloaterAbout() support.append( (const char*) glGetString(GL_RENDERER) ); support.append("\n"); +#if LL_WINDOWS + getWindow()->incBusyCount(); + getWindow()->setCursor(UI_CURSOR_ARROW); + support.append("Windows Graphics Driver Version: "); + LLSD driver_info = gDXHardware.getDisplayInfo(); + if (driver_info.has("DriverVersion")) + { + support.append(driver_info["DriverVersion"]); + } + support.append("\n"); + getWindow()->decBusyCount(); + getWindow()->setCursor(UI_CURSOR_ARROW); +#endif + support.append("OpenGL Version: "); support.append( (const char*) glGetString(GL_VERSION) ); support.append("\n"); diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp index 4697296e16..d4e1e98125 100644 --- a/indra/newview/llfloaterbulkpermission.cpp +++ b/indra/newview/llfloaterbulkpermission.cpp @@ -61,6 +61,7 @@ LLFloaterBulkPermission::LLFloaterBulkPermission(const LLSD& seed) : mDone(FALSE mID.generate(); LLUICtrlFactory::getInstance()->buildFloater(this,"floater_bulk_perms.xml"); childSetEnabled("next_owner_transfer", gSavedSettings.getBOOL("BulkChangeNextOwnerCopy")); + childSetAction("help", onHelpBtn, this); childSetAction("apply", onApplyBtn, this); childSetAction("close", onCloseBtn, this); childSetAction("check_all", onCheckAll, this); @@ -149,6 +150,11 @@ void LLFloaterBulkPermission::onApplyBtn(void* user_data) self->doApply(); } +void LLFloaterBulkPermission::onHelpBtn(void* user_data) +{ + LLNotifications::instance().add("HelpBulkPermission"); +} + void LLFloaterBulkPermission::onCloseBtn(void* user_data) { LLFloaterBulkPermission* self = static_cast(user_data); diff --git a/indra/newview/llfloaterbulkpermission.h b/indra/newview/llfloaterbulkpermission.h index 09af27045a..a26b5b4f79 100644 --- a/indra/newview/llfloaterbulkpermission.h +++ b/indra/newview/llfloaterbulkpermission.h @@ -76,6 +76,7 @@ private: U8 key, bool is_new); + static void onHelpBtn(void* user_data); static void onCloseBtn(void* user_data); static void onApplyBtn(void* user_data); static void onCommitCopy(LLUICtrl* ctrl, void* data); diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp index 37cac9e271..cfbc5da761 100644 --- a/indra/newview/llfloaterbuycurrency.cpp +++ b/indra/newview/llfloaterbuycurrency.cpp @@ -46,7 +46,7 @@ #include "llwindow.h" #include "llappviewer.h" -static const S32 STANDARD_BUY_AMOUNT = 1000; +static const S32 STANDARD_BUY_AMOUNT = 2000; static const S32 MINIMUM_BALANCE_AMOUNT = 0; class LLFloaterBuyCurrencyUI diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp index 682ed8e26b..ea529d1883 100644 --- a/indra/newview/llfloaterchat.cpp +++ b/indra/newview/llfloaterchat.cpp @@ -398,7 +398,7 @@ void LLFloaterChat::addChat(const LLChat& chat, size = INSTANT_MSG_SIZE; } // We display anything if it's not an IM. If it's an IM, check pref... - if ( !from_instant_message || gSavedSettings.getBOOL("IMInChatHistory") ) + if ( !from_instant_message || gSavedSettings.getBOOL("IMInChatConsole") ) { gConsole->addLine(chat.mText, size, text_color); } @@ -406,9 +406,6 @@ void LLFloaterChat::addChat(const LLChat& chat, if(from_instant_message && gSavedPerAccountSettings.getBOOL("LogChatIM")) log_chat_text(chat); - - if(from_instant_message && gSavedSettings.getBOOL("IMInChatHistory")) - addChatHistory(chat,false); LLTextParser* highlight = LLTextParser::getInstance(); highlight->triggerAlerts(gAgent.getID(), gAgent.getPositionGlobal(), chat.mText, gViewerWindow->getWindow()); diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index c8a76cbe55..d39824ee05 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -52,6 +52,7 @@ #include "llui.h" #include "llviewercamera.h" #include "llviewerwindow.h" +#include "llviewerobjectlist.h" #include "llvoavatar.h" #include "pipeline.h" #include "lluictrlfactory.h" @@ -110,7 +111,7 @@ BOOL LLFloaterImagePreview::postBuild() childHide("bad_image_text"); - if (mRawImagep.notNull()) + if (mRawImagep.notNull() && gAgent.getRegion() != NULL) { mAvatarPreview = new LLImagePreviewAvatar(256, 256); mAvatarPreview->setPreviewTarget("mPelvis", "mUpperBodyMesh0", mRawImagep, 2.f, FALSE); @@ -612,7 +613,7 @@ LLImagePreviewAvatar::LLImagePreviewAvatar(S32 width, S32 height) : LLDynamicTex mCameraPitch = 0.f; mCameraZoom = 1.f; - mDummyAvatar = new LLVOAvatar(LLUUID::null, LL_PCODE_LEGACY_AVATAR, gAgent.getRegion()); + mDummyAvatar = (LLVOAvatar*)gObjectList.createObjectViewer(LL_PCODE_LEGACY_AVATAR, gAgent.getRegion()); mDummyAvatar->createDrawable(&gPipeline); mDummyAvatar->mIsDummy = TRUE; mDummyAvatar->mSpecialRenderMode = 2; diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 34dbce67c2..e68d699d03 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -236,7 +236,7 @@ LLSnapshotLivePreview::LLSnapshotLivePreview (const LLRect& rect) : mImageScaled[0] = FALSE; mImageScaled[1] = FALSE; - mMaxImageSize = MAX_IMAGE_SIZE ; + mMaxImageSize = MAX_SNAPSHOT_IMAGE_SIZE ; mKeepAspectRatio = gSavedSettings.getBOOL("KeepAspectForSnapshot") ; mThumbnailUpdateLock = FALSE ; mThumbnailUpToDate = FALSE ; @@ -255,13 +255,13 @@ LLSnapshotLivePreview::~LLSnapshotLivePreview() void LLSnapshotLivePreview::setMaxImageSize(S32 size) { - if(size < MAX_IMAGE_SIZE) + if(size < MAX_SNAPSHOT_IMAGE_SIZE) { mMaxImageSize = size; } else { - mMaxImageSize = MAX_IMAGE_SIZE ; + mMaxImageSize = MAX_SNAPSHOT_IMAGE_SIZE ; } } diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 2697ef25f9..e4459e38bd 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -3452,7 +3452,8 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) items.push_back(std::string("Object Wear")); items.push_back(std::string("Attach To")); items.push_back(std::string("Attach To HUD")); - items.push_back(std::string("Restore to Last Position")); + // commented out for DEV-32347 + //items.push_back(std::string("Restore to Last Position")); LLMenuGL* attach_menu = menu.getChildMenuByName("Attach To", TRUE); LLMenuGL* attach_hud_menu = menu.getChildMenuByName("Attach To HUD", TRUE); diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index 841330483c..40b1c64146 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -67,7 +67,6 @@ #include "llfloaterchat.h" #include "llimpanel.h" #include "llimview.h" -#include "lltrans.h" #include "llnotifications.h" #include "lluistring.h" #include "llviewerobject.h" @@ -507,35 +506,42 @@ void notify_automute_callback(const LLUUID& agent_id, const std::string& first_n U32 temp_data = (U32) (uintptr_t) user_data; LLMuteList::EAutoReason reason = (LLMuteList::EAutoReason)temp_data; - std::string auto_message; + std::string notif_name; switch (reason) { default: case LLMuteList::AR_IM: - auto_message = LLTrans::getString("AutoUnmuteByIM"); + notif_name = "AutoUnmuteByIM"; break; case LLMuteList::AR_INVENTORY: - auto_message = LLTrans::getString("AutoUnmuteByInventory"); + notif_name = "AutoUnmuteByInventory"; break; case LLMuteList::AR_MONEY: - auto_message = LLTrans::getString("AutoUnmuteByMoney"); + notif_name = "AutoUnmuteByMoney"; break; } - std::string message = LLNotification::format(auto_message, - LLSD().insert("FIRST", first_name).insert("LAST", last_name)); - - if (reason == LLMuteList::AR_IM) + LLSD args; + args["FIRST"] = first_name; + args["LAST"] = last_name; + + LLNotificationPtr notif_ptr = LLNotifications::instance().add(notif_name, args); + if (notif_ptr) { - LLFloaterIMPanel *timp = gIMMgr->findFloaterBySession(agent_id); - if (timp) + std::string message = notif_ptr->getMessage(); + + if (reason == LLMuteList::AR_IM) { - timp->addHistoryLine(message); + LLFloaterIMPanel *timp = gIMMgr->findFloaterBySession(agent_id); + if (timp) + { + timp->addHistoryLine(message); + } } - } - LLChat auto_chat(message); - LLFloaterChat::addChat(auto_chat, FALSE, FALSE); + LLChat auto_chat(message); + LLFloaterChat::addChat(auto_chat, FALSE, FALSE); + } } diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index afaaea28f0..9e4f9709a8 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -754,22 +754,18 @@ void LLPanelClassified::refresh() mDescEditor->setEnabled(is_self); //mPriceEditor->setEnabled(is_self); mCategoryCombo->setEnabled(is_self); + mMatureCombo->setEnabled(is_self); if( is_self ) { if( mMatureCombo->getCurrentIndex() == 0 ) { // It's a new panel. - // PG regions must have PG classifieds. AO must have mature. - // Only Mature can be PG or Mature. + // PG regions should have PG classifieds. AO should have mature. - constrainAccessCombo(); + setDefaultAccessCombo(); } } - else - { - mMatureCombo->setEnabled( FALSE ); - } if (mAutoRenewCheck) { @@ -1007,7 +1003,7 @@ void LLPanelClassified::onClickSet(void* data) self->mLocationEditor->setText(location_text); self->mLocationChanged = true; - self->constrainAccessCombo(); + self->setDefaultAccessCombo(); // Set this to null so it updates on the next save. self->mParcelID.setNull(); @@ -1137,35 +1133,22 @@ void LLFloaterPriceForListing::buttonCore(S32 button, void* data) } } -void LLPanelClassified::constrainAccessCombo() +void LLPanelClassified::setDefaultAccessCombo() { - // Location changed. - // PG regions must have PG classifieds. AO must have mature. - // Only Mature can be PG or Mature. - - bool pref_visible = TRUE; + // PG regions should have PG classifieds. AO should have mature. - S32 force_access = MATURE_UNDEFINED; LLViewerRegion *regionp = gAgent.getRegion(); switch( regionp->getSimAccess() ) { case SIM_ACCESS_PG: - force_access = PG_CONTENT; + mMatureCombo->setCurrentByIndex(PG_CONTENT); break; case SIM_ACCESS_ADULT: - force_access = MATURE_CONTENT; + mMatureCombo->setCurrentByIndex(MATURE_CONTENT); break; default: // You are free to move about the cabin. break; } - - if ( force_access != MATURE_UNDEFINED ) - { - pref_visible = FALSE; - mMatureCombo->setCurrentByIndex(force_access); - } - - mMatureCombo->setEnabled(pref_visible); } diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h index 68a5a33321..417eddf460 100644 --- a/indra/newview/llpanelclassified.h +++ b/indra/newview/llpanelclassified.h @@ -120,7 +120,7 @@ protected: static void focusReceived(LLFocusableElement* ctrl, void* data); static void onCommitAny(LLUICtrl* ctrl, void* data); - void constrainAccessCombo(); // Force AO and PG regions to proper classified access + void setDefaultAccessCombo(); // Default AO and PG regions to proper classified access BOOL checkDirty(); // Update and return mDirty diff --git a/indra/newview/llpanelplace.cpp b/indra/newview/llpanelplace.cpp index 815152c69f..7ca3622634 100644 --- a/indra/newview/llpanelplace.cpp +++ b/indra/newview/llpanelplace.cpp @@ -466,7 +466,8 @@ bool LLPanelPlace::callbackAuctionWebPage(const LLSD& notification, const LLSD& if (0 == option) { std::string url; - url = AUCTION_URL + llformat("%010d", response["auction_id"].asInteger()); + S32 auction_id = notification["payload"]["auction_id"].asInteger(); + url = AUCTION_URL + llformat("%010d", auction_id ); llinfos << "Loading auction page " << url << llendl; diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 564313980d..0c6b2980dc 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -5392,6 +5392,11 @@ void dialog_refresh_all() gPieObject->arrange(); } + if( gPieAttachment->getVisible() ) + { + gPieAttachment->arrange(); + } + LLFloaterProperties::dirtyAll(); LLFloaterInspect::dirty(); } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 984646e959..2c0d11baab 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -3424,7 +3424,7 @@ void LLStartUp::multimediaInit() { LL_DEBUGS("AppInit") << "Initializing Multimedia...." << LL_ENDL; std::string msg = LLTrans::getString("LoginInitializingMultimedia"); - set_startup_status(0.50f, msg.c_str(), gAgent.mMOTD.c_str()); + set_startup_status(0.42f, msg.c_str(), gAgent.mMOTD.c_str()); display_startup(); LLViewerMedia::initClass(); diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp index eea4acf053..b05da8c6d8 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/newview/lltexlayer.cpp @@ -68,8 +68,12 @@ S32 LLTexLayerSetBuffer::sGLBumpByteCount = 0; //----------------------------------------------------------------------------- // LLBakedUploadData() //----------------------------------------------------------------------------- -LLBakedUploadData::LLBakedUploadData( LLVOAvatar* avatar, LLTexLayerSetBuffer* layerset_buffer, const LLUUID & id ) : +LLBakedUploadData::LLBakedUploadData( LLVOAvatar* avatar, + LLTexLayerSet* layerset, + LLTexLayerSetBuffer* layerset_buffer, + const LLUUID & id ) : mAvatar( avatar ), + mLayerSet( layerset ), mLayerSetBuffer( layerset_buffer ), mID(id) { @@ -485,7 +489,8 @@ void LLTexLayerSetBuffer::readBackAndUpload(U8* baked_bump_data) if( valid ) { // baked_upload_data is owned by the responder and deleted after the request completes - LLBakedUploadData* baked_upload_data = new LLBakedUploadData( gAgent.getAvatarObject(), this, asset_id ); + LLBakedUploadData* baked_upload_data = + new LLBakedUploadData( gAgent.getAvatarObject(), this->mTexLayerSet, this, asset_id ); mUploadID = asset_id; // upload the image @@ -547,40 +552,51 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, void* user // Sanity check: only the user's avatar should be uploading textures. if( baked_upload_data->mAvatar == avatar ) { - // Because the avatar is still valid, it's layerset buffers should be valid also. - LLTexLayerSetBuffer* layerset_buffer = baked_upload_data->mLayerSetBuffer; - layerset_buffer->mUploadPending = FALSE; - - if (layerset_buffer->mUploadID.isNull()) + // Composite may have changed since the pointer was stored - need to do some checking. + LLTexLayerSetBuffer* prev_layerset_buffer = baked_upload_data->mLayerSetBuffer; + // Can't just call getComposite() because this will trigger creation if none exists. + LLTexLayerSetBuffer* curr_layerset_buffer = + baked_upload_data->mLayerSet->hasComposite()?baked_upload_data->mLayerSet->getComposite():NULL; + + if (prev_layerset_buffer != curr_layerset_buffer) { - // The upload got canceled, we should be in the process of baking a new texture - // so request an upload with the new data - layerset_buffer->requestUpload(); + llinfos << "Baked texture out of date, composite no longer valid, ignored" << llendl; } - else if( baked_upload_data->mID == layerset_buffer->mUploadID ) + else { - // This is the upload we're currently waiting for. - layerset_buffer->mUploadID.setNull(); - - if( result >= 0 ) + curr_layerset_buffer->mUploadPending = FALSE; + + if (curr_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 + curr_layerset_buffer->requestUpload(); + } + else if( baked_upload_data->mID == curr_layerset_buffer->mUploadID ) { - ETextureIndex baked_te = avatar->getBakedTE( layerset_buffer->mTexLayerSet ); - U64 now = LLFrameTimer::getTotalTime(); // Record starting time - llinfos << "Baked texture upload took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl; - avatar->setNewBakedTexture( baked_te, uuid ); + // This is the upload we're currently waiting for. + curr_layerset_buffer->mUploadID.setNull(); + + if( result >= 0 ) + { + ETextureIndex baked_te = avatar->getBakedTE( curr_layerset_buffer->mTexLayerSet ); + U64 now = LLFrameTimer::getTotalTime(); // Record starting time + llinfos << "Baked texture upload took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl; + avatar->setNewBakedTexture( baked_te, uuid ); + } + else + { + llinfos << "Baked upload failed. Reason: " << result << llendl; + // *FIX: retry upload after n seconds, asset server could be busy + } } else { - llinfos << "Baked upload failed. Reason: " << result << llendl; - // *FIX: retry upload after n seconds, asset server could be busy + llinfos << "Received baked texture out of date, ignored." << llendl; } - } - else - { - llinfos << "Received baked texture out of date, ignored." << llendl; - } - avatar->dirtyMesh(); + avatar->dirtyMesh(); + } } } else diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h index 18e6d6b24f..1924d0bee3 100644 --- a/indra/newview/lltexlayer.h +++ b/indra/newview/lltexlayer.h @@ -534,14 +534,22 @@ public: }; // Used by LLTexLayerSetBuffer for a callback. + +// For DEV-DEV-31590, "Heap corruption and crash after outfit +// changes", added the mLayerSet member. The current +// LLTexLayerSetBuffer can be found by querying mLayerSet->mComposite, +// but we still store the original mLayerSetBuffer here so we can +// detect when an upload is out of date. This prevents a memory +// stomp. See LLTexLayerSetBuffer::onTextureUploadComplete() for usage. class LLBakedUploadData { public: - LLBakedUploadData( LLVOAvatar* avatar, LLTexLayerSetBuffer* layerset_buffer, const LLUUID & id); + LLBakedUploadData( LLVOAvatar* avatar, LLTexLayerSet* layerset, LLTexLayerSetBuffer* layerset_buffer, const LLUUID & id); ~LLBakedUploadData() {} LLUUID mID; LLVOAvatar* mAvatar; // just backlink, don't LLPointer + LLTexLayerSet* mLayerSet; LLTexLayerSetBuffer* mLayerSetBuffer; LLUUID mWearableAssets[WT_COUNT]; U64 mStartTime; // Used to measure time baked texture upload requires diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp index f54830f39f..72d1494d96 100644 --- a/indra/newview/llviewercamera.cpp +++ b/indra/newview/llviewercamera.cpp @@ -772,7 +772,7 @@ BOOL LLViewerCamera::areVertsVisible(LLViewerObject* volumep, BOOL all_verts) // changes local camera and broadcasts change /* virtual */ void LLViewerCamera::setView(F32 vertical_fov_rads) { - F32 old_fov = LLViewerCamera::getInstance()->getDefaultFOV(); + F32 old_fov = LLViewerCamera::getInstance()->getView(); // cap the FoV vertical_fov_rads = llclamp(vertical_fov_rads, getMinView(), getMaxView()); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 54c6f0a71f..977582ba24 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -514,7 +514,12 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) { //don't draw hud objects in this frame gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_HUD); } - + + if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD_PARTICLES)) + { //don't draw hud particles in this frame + gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_HUD_PARTICLES); + } + //upkeep gl name pools LLGLNamePool::upkeepPools(); @@ -884,16 +889,26 @@ void render_hud_attachments() hud_cam.setOrigin(-1.f,0,0); hud_cam.setAxes(LLVector3(1,0,0), LLVector3(0,1,0), LLVector3(0,0,1)); LLViewerCamera::updateFrustumPlanes(hud_cam, TRUE); + + bool render_particles = gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES) && gSavedSettings.getBOOL("RenderHUDParticles"); //only render hud objects U32 mask = gPipeline.getRenderTypeMask(); + // turn off everything gPipeline.setRenderTypeMask(0); - if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD)) + // turn on HUD + gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_HUD); + // turn on HUD particles + gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_HUD_PARTICLES); + + // if particles are off, turn off hud-particles as well + if (!render_particles) { - gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_HUD); + // turn back off HUD particles + gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_HUD_PARTICLES); } - BOOL has_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI); + bool has_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI); if (has_ui) { gPipeline.toggleRenderDebugFeature((void*) LLPipeline::RENDER_DEBUG_FEATURE_UI); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index a50ff1df9f..fe91da05fa 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -212,6 +212,7 @@ #include "llwlanimator.h" #include "llwlparammanager.h" #include "llwaterparammanager.h" +#include "llfloaternotificationsconsole.h" #include "lltexlayer.h" @@ -297,6 +298,8 @@ void handle_dump_group_info(void *); void handle_dump_capabilities_info(void *); void handle_dump_focus(void*); +// Advanced->Consoles menu +void handle_show_notifications_console(void*); void handle_region_dump_settings(void*); void handle_region_dump_temp_asset_data(void*); void handle_region_clear_temp_asset_data(void*); @@ -746,7 +749,16 @@ void init_client_menu(LLMenuGL* menu) (void*)gDebugView->mMemoryView, '0', MASK_CONTROL|MASK_SHIFT ) ); #endif + + sub->appendSeparator(); + + // Debugging view for unified notifications + sub->append(new LLMenuItemCallGL("Notifications Console...", + &handle_show_notifications_console, NULL, NULL, '5', MASK_CONTROL|MASK_SHIFT )); + + sub->appendSeparator(); + sub->append(new LLMenuItemCallGL("Region Info to Debug Console", &handle_region_dump_settings, NULL)); sub->append(new LLMenuItemCallGL("Group Info to Debug Console", @@ -1023,7 +1035,8 @@ void init_debug_ui_menu(LLMenuGL* menu) menu->appendSeparator(); menu->append(new LLMenuItemCallGL("Web Browser Test", &handle_web_browser_test)); - menu->append(new LLMenuItemCallGL("Buy Currency Test", &handle_buy_currency_test)); + // commented out until work is complete: DEV-32268 + // menu->append(new LLMenuItemCallGL("Buy Currency Test", &handle_buy_currency_test)); menu->append(new LLMenuItemCallGL("Editable UI", &edit_ui)); menu->append(new LLMenuItemCallGL( "Dump SelectMgr", &dump_select_mgr)); menu->append(new LLMenuItemCallGL( "Dump Inventory", &dump_inventory)); @@ -1592,15 +1605,20 @@ class LLObjectEnableTouch : public view_listener_t // Update label based on the node touch name if available. LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(); + + std::string touch_text; if (node && node->mValid && !node->mTouchName.empty()) { - gMenuHolder->childSetText("Object Touch", node->mTouchName); + touch_text = node->mTouchName; } else { - gMenuHolder->childSetText("Object Touch", userdata["data"].asString()); + touch_text = userdata["data"].asString(); } + gMenuHolder->childSetText("Object Touch", touch_text); + gMenuHolder->childSetText("Attachment Object Touch", touch_text); + return true; } }; @@ -2605,6 +2623,11 @@ void handle_region_dump_settings(void*) } } +void handle_show_notifications_console(void *) +{ + LLFloaterNotificationConsole::showInstance(); +} + void handle_dump_group_info(void *) { llinfos << "group " << gAgent.mGroupName << llendl; @@ -2865,7 +2888,9 @@ class LLEditEnableCustomizeAvatar : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - bool new_value = gAgent.areWearablesLoaded(); + bool new_value = (gAgent.getAvatarObject() && + gAgent.getAvatarObject()->isFullyLoaded() && + gAgent.areWearablesLoaded()); gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 520de0e403..bbfd480e0b 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -5246,6 +5246,7 @@ void process_script_dialog(LLMessageSystem* msg, void**) S32 button_count = msg->getNumberOfBlocks("Buttons"); if (button_count > SCRIPT_DIALOG_MAX_BUTTONS) { + llwarns << "Too many script dialog buttons - omitting some" << llendl; button_count = SCRIPT_DIALOG_MAX_BUTTONS; } @@ -5454,7 +5455,15 @@ void process_covenant_reply(LLMessageSystem* msg, void**) LLFloaterBuyLand::updateEstateName(estate_name); // standard message, not from system - std::string last_modified = std::string("Last Modified ") + formatted_time((time_t)covenant_timestamp); + std::string last_modified; + if (covenant_timestamp == 0) + { + last_modified = LLTrans::getString("covenant_never_modified"); + } + else + { + last_modified = LLTrans::getString("covenant_modified") + " " + formatted_time((time_t)covenant_timestamp); + } LLPanelEstateCovenant::updateLastModified(last_modified); LLPanelLandCovenant::updateLastModified(last_modified); diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 728509e39c..d64700b523 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -569,6 +569,7 @@ LLViewerTextEditor::LLViewerTextEditor(const std::string& name, const LLFontGL* font, BOOL allow_embedded_items) : LLTextEditor(name, rect, max_length, default_text, font, allow_embedded_items), + mDragItemChar(0), mDragItemSaved(FALSE), mInventoryCallback(new LLEmbeddedNotecardOpener) { @@ -694,6 +695,7 @@ BOOL LLViewerTextEditor::handleMouseDown(S32 x, S32 y, MASK mask) if (item_at_pos) { mDragItem = item_at_pos; + mDragItemChar = wc; mDragItemSaved = LLEmbeddedItems::getEmbeddedItemSaved(wc); gFocusMgr.setMouseCapture( this ); mMouseDownX = x; @@ -907,8 +909,9 @@ BOOL LLViewerTextEditor::handleMouseUp(S32 x, S32 y, MASK mask) { if(mDragItemSaved) { - openEmbeddedItem(mDragItem); - }else + openEmbeddedItem(mDragItem, mDragItemChar); + } + else { showUnsavedAlertDialog(mDragItem); } @@ -1060,7 +1063,15 @@ BOOL LLViewerTextEditor::handleDragAndDrop(S32 x, S32 y, MASK mask, std::string& tooltip_msg) { BOOL handled = FALSE; - + + LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); + if (LLToolDragAndDrop::SOURCE_NOTECARD == source) + { + // We currently do not handle dragging items from one notecard to another + // since items in a notecard must be in Inventory to be verified. See DEV-2891. + return FALSE; + } + if (mTakesNonScrollClicks) { if (getEnabled() && acceptsTextInput()) @@ -1096,7 +1107,7 @@ BOOL LLViewerTextEditor::handleDragAndDrop(S32 x, S32 y, MASK mask, case DAD_GESTURE: { LLInventoryItem *item = (LLInventoryItem *)cargo_data; - if( allowsEmbeddedItems() ) + if( item && allowsEmbeddedItems() ) { U32 mask_next = item->getPermissions().getMaskNextOwner(); if((mask_next & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) @@ -1302,13 +1313,14 @@ BOOL LLViewerTextEditor::openEmbeddedItemAtPos(S32 pos) { if( pos < getLength()) { - LLInventoryItem* item = LLEmbeddedItems::getEmbeddedItem( getWChar(pos) ); + llwchar wc = getWChar(pos); + LLInventoryItem* item = LLEmbeddedItems::getEmbeddedItem( wc ); if( item ) { - BOOL saved = LLEmbeddedItems::getEmbeddedItemSaved( getWChar(pos) ); + BOOL saved = LLEmbeddedItems::getEmbeddedItemSaved( wc ); if (saved) { - return openEmbeddedItem(item); + return openEmbeddedItem(item, wc); } else { @@ -1320,25 +1332,25 @@ BOOL LLViewerTextEditor::openEmbeddedItemAtPos(S32 pos) } -BOOL LLViewerTextEditor::openEmbeddedItem(LLInventoryItem* item) +BOOL LLViewerTextEditor::openEmbeddedItem(LLInventoryItem* item, llwchar wc) { switch( item->getType() ) { case LLAssetType::AT_TEXTURE: - openEmbeddedTexture( item ); + openEmbeddedTexture( item, wc ); return TRUE; case LLAssetType::AT_SOUND: - openEmbeddedSound( item ); + openEmbeddedSound( item, wc ); return TRUE; case LLAssetType::AT_NOTECARD: - openEmbeddedNotecard( item ); + openEmbeddedNotecard( item, wc ); return TRUE; case LLAssetType::AT_LANDMARK: - openEmbeddedLandmark( item ); + openEmbeddedLandmark( item, wc ); return TRUE; case LLAssetType::AT_LSL_TEXT: @@ -1347,7 +1359,7 @@ BOOL LLViewerTextEditor::openEmbeddedItem(LLInventoryItem* item) case LLAssetType::AT_BODYPART: case LLAssetType::AT_ANIMATION: case LLAssetType::AT_GESTURE: - showCopyToInvDialog( item ); + showCopyToInvDialog( item, wc ); return TRUE; default: return FALSE; @@ -1356,7 +1368,7 @@ BOOL LLViewerTextEditor::openEmbeddedItem(LLInventoryItem* item) } -void LLViewerTextEditor::openEmbeddedTexture( LLInventoryItem* item ) +void LLViewerTextEditor::openEmbeddedTexture( LLInventoryItem* item, llwchar wc ) { // See if we can bring an existing preview to the front // *NOTE: Just for embedded Texture , we should use getAssetUUID(), @@ -1384,7 +1396,7 @@ void LLViewerTextEditor::openEmbeddedTexture( LLInventoryItem* item ) } } -void LLViewerTextEditor::openEmbeddedSound( LLInventoryItem* item ) +void LLViewerTextEditor::openEmbeddedSound( LLInventoryItem* item, llwchar wc ) { // Play sound locally LLVector3d lpos_global = gAgent.getPositionGlobal(); @@ -1393,18 +1405,18 @@ void LLViewerTextEditor::openEmbeddedSound( LLInventoryItem* item ) { gAudiop->triggerSound(item->getAssetUUID(), gAgentID, SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_UI, lpos_global); } - showCopyToInvDialog( item ); + showCopyToInvDialog( item, wc ); } -void LLViewerTextEditor::openEmbeddedLandmark( LLInventoryItem* item ) +void LLViewerTextEditor::openEmbeddedLandmark( LLInventoryItem* item, llwchar wc ) { std::string title = std::string(" ") + LLLandmarkBridge::prefix() + item->getName(); open_landmark((LLViewerInventoryItem*)item, title, FALSE, item->getUUID(), TRUE); } -void LLViewerTextEditor::openEmbeddedNotecard( LLInventoryItem* item ) +void LLViewerTextEditor::openEmbeddedNotecard( LLInventoryItem* item, llwchar wc ) { copyInventory(item, gInventoryCallbacks.registerCB(mInventoryCallback)); } @@ -1432,11 +1444,12 @@ bool LLViewerTextEditor::onNotecardDialog(const LLSD& notification, const LLSD& -void LLViewerTextEditor::showCopyToInvDialog( LLInventoryItem* item ) +void LLViewerTextEditor::showCopyToInvDialog( LLInventoryItem* item, llwchar wc ) { LLSD payload; - payload["item_id"] = item->getUUID(); - payload["notecard_id"] = mNotecardInventoryID; + LLUUID item_id = item->getUUID(); + payload["item_id"] = item_id; + payload["item_wc"] = LLSD::Integer(wc); LLNotifications::instance().add( "ConfirmItemCopy", LLSD(), payload, boost::bind(&LLViewerTextEditor::onCopyToInvDialog, this, _1, _2)); } @@ -1446,8 +1459,11 @@ bool LLViewerTextEditor::onCopyToInvDialog(const LLSD& notification, const LLSD& S32 option = LLNotification::getSelectedOption(notification, response); if( 0 == option ) { - LLInventoryItem* itemp = gInventory.getItem(notification["payload"]["item_id"].asUUID()); - copyInventory(itemp); + LLUUID item_id = notification["payload"]["item_id"].asUUID(); + llwchar wc = llwchar(notification["payload"]["item_wc"].asInteger()); + LLInventoryItem* itemp = LLEmbeddedItems::getEmbeddedItem(wc); + if (itemp) + copyInventory(itemp); } return false; } diff --git a/indra/newview/llviewertexteditor.h b/indra/newview/llviewertexteditor.h index 1ed60a57fe..f29caee602 100644 --- a/indra/newview/llviewertexteditor.h +++ b/indra/newview/llviewertexteditor.h @@ -105,21 +105,22 @@ private: BOOL getEmbeddedItemToolTipAtPos(S32 pos, LLWString &wmsg) const; BOOL openEmbeddedItemAtPos( S32 pos ); - BOOL openEmbeddedItem(LLInventoryItem* item); + BOOL openEmbeddedItem(LLInventoryItem* item, llwchar wc); S32 insertEmbeddedItem(S32 pos, LLInventoryItem* item); - void openEmbeddedTexture( LLInventoryItem* item ); - void openEmbeddedSound( LLInventoryItem* item ); - void openEmbeddedLandmark( LLInventoryItem* item ); - void openEmbeddedNotecard( LLInventoryItem* item); - void showCopyToInvDialog( LLInventoryItem* item ); + void openEmbeddedTexture( LLInventoryItem* item, llwchar wc ); + void openEmbeddedSound( LLInventoryItem* item, llwchar wc ); + void openEmbeddedLandmark( LLInventoryItem* item, llwchar wc ); + void openEmbeddedNotecard( LLInventoryItem* item, llwchar wc); + void showCopyToInvDialog( LLInventoryItem* item, llwchar wc ); void showUnsavedAlertDialog( LLInventoryItem* item ); bool onCopyToInvDialog(const LLSD& notification, const LLSD& response ); static bool onNotecardDialog(const LLSD& notification, const LLSD& response ); LLPointer mDragItem; + llwchar mDragItemChar; BOOL mDragItemSaved; class LLEmbeddedItems* mEmbeddedItemList; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index c827d3fcf4..f2fcad8861 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1424,29 +1424,10 @@ void LLViewerWindow::initBase() // Console llassert( !gConsole ); - LLRect console_rect = full_window; - console_rect.mTop -= 24; - - console_rect.mBottom += getChatConsoleBottomPad(); - - // TODO: Eliminate magic constants - please used named constants if changing this - don't be a programmer hater - console_rect.mLeft += 24; //gSavedSettings.getS32("StatusBarButtonWidth") + gSavedSettings.getS32("StatusBarPad"); - - if (gSavedSettings.getBOOL("ChatFullWidth")) - { - console_rect.mRight -= 10; - } - else - { - // Make console rect somewhat narrow so having inventory open is - // less of a problem. - console_rect.mRight = console_rect.mLeft + 2 * width / 3; - } - gConsole = new LLConsole( "console", gSavedSettings.getS32("ConsoleBufferSize"), - console_rect, + getChatConsoleRect(), gSavedSettings.getS32("ChatFontSize"), gSavedSettings.getF32("ChatPersistTime") ); gConsole->setFollows(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_BOTTOM); @@ -2205,12 +2186,12 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) } } - // Debugging view for unified notifications -- we need Ctrl+Shift+Alt to get it - // since Ctrl+Shift maps to Nighttime under windlight. + // Debugging view for unified notifications: CTRL-SHIFT-5 + // *FIXME: Having this special-cased right here (just so this can be invoked from the login screen) sucks. if ((MASK_SHIFT & mask) - && (MASK_CONTROL & mask) - && (MASK_ALT & mask) - && ('N' == key || 'n' == key)) + && (!(MASK_ALT & mask)) + && (MASK_CONTROL & mask) + && ('5' == key)) { LLFloaterNotificationConsole::showInstance(); return TRUE; @@ -2811,7 +2792,7 @@ BOOL LLViewerWindow::handlePerFrameHover() } // Always update console - LLRect console_rect = gConsole->getRect(); + LLRect console_rect = getChatConsoleRect(); console_rect.mBottom = gHUDView->getRect().mBottom + getChatConsoleBottomPad(); gConsole->reshape(console_rect.getWidth(), console_rect.getHeight()); gConsole->setRect(console_rect); @@ -4823,6 +4804,33 @@ S32 LLViewerWindow::getChatConsoleBottomPad() return offset; } +LLRect LLViewerWindow::getChatConsoleRect() +{ + LLRect full_window(0, getWindowHeight(), getWindowWidth(), 0); + LLRect console_rect = full_window; + + const S32 CONSOLE_PADDING_TOP = 24; + const S32 CONSOLE_PADDING_LEFT = 24; + const S32 CONSOLE_PADDING_RIGHT = 10; + + console_rect.mTop -= CONSOLE_PADDING_TOP; + console_rect.mBottom += getChatConsoleBottomPad(); + + console_rect.mLeft += CONSOLE_PADDING_LEFT; + + if (gSavedSettings.getBOOL("ChatFullWidth")) + { + console_rect.mRight -= CONSOLE_PADDING_RIGHT; + } + else + { + // Make console rect somewhat narrow so having inventory open is + // less of a problem. + console_rect.mRight = console_rect.mLeft + 2 * getWindowWidth() / 3; + } + + return console_rect; +} //---------------------------------------------------------------------------- diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index e0ddac6fa5..509a7c4884 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -125,7 +125,7 @@ private: }; -#define MAX_IMAGE_SIZE 6144 //6 * 1024, max snapshot image size 6144 * 6144 +static const U32 MAX_SNAPSHOT_IMAGE_SIZE = 6 * 1024; // max snapshot image size 6144 * 6144 class LLViewerWindow : public LLWindowCallbacks { @@ -371,6 +371,7 @@ private: void initFonts(F32 zoom_factor = 1.f); void schedulePick(LLPickInfo& pick_info); S32 getChatConsoleBottomPad(); // Vertical padding for child console rect, varied by bottom clutter + LLRect getChatConsoleRect(); // Get optimal cosole rect. public: LLWindow* mWindow; // graphical window object diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index b06652a5dc..168b0056e5 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -769,6 +769,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mBakedTextureData[i].mLastTextureIndex = IMG_DEFAULT_AVATAR; mBakedTextureData[i].mTexLayerSet = NULL; mBakedTextureData[i].mIsLoaded = false; + mBakedTextureData[i].mIsUsed = false; mBakedTextureData[i].mMaskTexName = 0; mBakedTextureData[i].mTextureIndex = getTextureIndex((EBakedTextureIndex)i); } @@ -1451,6 +1452,7 @@ void LLVOAvatar::getSpatialExtents(LLVector3& newMin, LLVector3& newMax) LLVector3 pos = getRenderPosition(); newMin = pos - buffer; newMax = pos + buffer; + float max_attachment_span = DEFAULT_MAX_PRIM_SCALE * 5.0f; //stretch bounding box by joint positions for (polymesh_map_t::iterator i = mMeshes.begin(); i != mMeshes.end(); ++i) @@ -1487,8 +1489,18 @@ void LLVOAvatar::getSpatialExtents(LLVector3& newMin, LLVector3& newMax) if (bridge) { const LLVector3* ext = bridge->getSpatialExtents(); - update_min_max(newMin,newMax,ext[0]); - update_min_max(newMin,newMax,ext[1]); + LLVector3 distance = (ext[1] - ext[0]); + + // Only add the prim to spatial extents calculations if it isn't a megaprim. + // max_attachment_span calculated at the start of the function + // (currently 5 times our max prim size) + if (distance.mV[0] < max_attachment_span + && distance.mV[1] < max_attachment_span + && distance.mV[2] < max_attachment_span) + { + update_min_max(newMin,newMax,ext[0]); + update_min_max(newMin,newMax,ext[1]); + } } } } @@ -4140,9 +4152,13 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass) if (pass == AVATAR_RENDER_PASS_SINGLE) { const bool should_alpha_mask = mHasBakedHair && isTextureDefined(TEX_HEAD_BAKED) && isTextureDefined(TEX_UPPER_BAKED) - && isTextureDefined(TEX_LOWER_BAKED) && mBakedTextureData[BAKED_HEAD].mIsLoaded + && isTextureDefined(TEX_LOWER_BAKED) + && mBakedTextureData[BAKED_HEAD].mIsLoaded && mBakedTextureData[BAKED_UPPER].mIsLoaded && mBakedTextureData[BAKED_LOWER].mIsLoaded - && !LLDrawPoolAlpha::sShowDebugAlpha; // Don't alpha mask if "Highlight Transparent" checked + && mBakedTextureData[BAKED_HEAD].mIsUsed + && mBakedTextureData[BAKED_UPPER].mIsUsed && mBakedTextureData[BAKED_LOWER].mIsUsed + && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked + && !(isSelf() && gAgent.cameraCustomizeAvatar()); // don't alpha mask if in customize mode LLGLState test(GL_ALPHA_TEST, should_alpha_mask); @@ -4179,11 +4195,8 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass) if (!LLDrawPoolAvatar::sSkipTransparent || LLPipeline::sImpostorRender) { - if (!mIsDummy) - { - LLGLEnable blend(GL_BLEND); - LLGLEnable test(GL_ALPHA_TEST); - } + LLGLState blend(GL_BLEND, !mIsDummy); + LLGLState test(GL_ALPHA_TEST, !mIsDummy); num_indices += renderTransparent(first_pass); } } @@ -4261,7 +4274,11 @@ U32 LLVOAvatar::renderRigid() if (isTextureVisible(TEX_EYES_BAKED) || mIsDummy) { // If the meshes need to be drawn, enable alpha masking but not blending - bool should_alpha_mask = mHasBakedHair && mBakedTextureData[BAKED_EYES].mIsLoaded; + bool should_alpha_mask = mHasBakedHair + && mBakedTextureData[BAKED_EYES].mIsLoaded + && mBakedTextureData[BAKED_EYES].mIsUsed + && !(isSelf() && gAgent.cameraCustomizeAvatar()); + LLGLState test(GL_ALPHA_TEST, should_alpha_mask); if (should_alpha_mask) @@ -6896,6 +6913,7 @@ void LLVOAvatar::updateMeshTextures() if (use_lkg_baked_layer[i] && !self_customizing ) { LLViewerImage* baked_img = gImageList.getImageFromHost( mBakedTextureData[i].mLastTextureIndex, target_host ); + mBakedTextureData[i].mIsUsed = TRUE; for (U32 k=0; k < mBakedTextureData[i].mMeshes.size(); k++) { mBakedTextureData[i].mMeshes[k]->setTexture( baked_img ); @@ -6925,6 +6943,7 @@ void LLVOAvatar::updateMeshTextures() { mBakedTextureData[i].mTexLayerSet->createComposite(); mBakedTextureData[i].mTexLayerSet->setUpdatesEnabled( TRUE ); + mBakedTextureData[i].mIsUsed = FALSE; for (U32 k=0; k < mBakedTextureData[i].mMeshes.size(); k++) { mBakedTextureData[i].mMeshes[k]->setLayerSet( mBakedTextureData[i].mTexLayerSet ); @@ -6935,7 +6954,7 @@ void LLVOAvatar::updateMeshTextures() // ! BACKWARDS COMPATIBILITY ! // Workaround for viewing avatars from old viewers that haven't baked hair textures. // if (!isTextureDefined(mBakedTextureData[BAKED_HAIR].mTextureIndex)) - if (!is_layer_baked[BAKED_HAIR]) + if (!is_layer_baked[BAKED_HAIR] || self_customizing) { const LLColor4 color = mTexHairColor ? mTexHairColor->getColor() : LLColor4(1,1,1,1); LLViewerImage* hair_img = getTEImage( TEX_HAIR ); @@ -6948,10 +6967,6 @@ void LLVOAvatar::updateMeshTextures() } else { - for (U32 i = 0; i < mBakedTextureData[BAKED_HAIR].mMeshes.size(); i++) - { - mBakedTextureData[BAKED_HAIR].mMeshes[i]->setColor( 1.f, 1.f, 1.f, 1.f ); - } mHasBakedHair = TRUE; } @@ -7761,7 +7776,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) } LLMemType mt(LLMemType::MTYPE_AVATAR); - + // llinfos << "processAvatarAppearance start " << mID << llendl; BOOL is_first_appearance_message = !mFirstAppearanceMessageReceived; @@ -7789,6 +7804,18 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) unpackTEMessage(mesgsys, _PREHASH_ObjectData); // dumpAvatarTEs( "POST processAvatarAppearance()" ); + // prevent the overwriting of valid baked textures with invalid baked textures + for (U8 baked_index = 0; baked_index < mBakedTextureData.size(); baked_index++) + { + if (!isTextureDefined(mBakedTextureData[baked_index].mTextureIndex) + && mBakedTextureData[baked_index].mLastTextureIndex != IMG_DEFAULT + && baked_index != BAKED_SKIRT) + { + setTEImage(mBakedTextureData[baked_index].mTextureIndex, gImageList.getImage(mBakedTextureData[baked_index].mLastTextureIndex)); + } + } + + //llinfos << "Received AvatarAppearance: " << (mIsSelf ? "(self): " : "(other): ") << std::endl << // (isTextureDefined(TEX_HEAD_BAKED) ? "HEAD " : "head " ) << (getTEImage(TEX_HEAD_BAKED)->getID()) << std::endl << // (isTextureDefined(TEX_UPPER_BAKED) ? "UPPER " : "upper " ) << (getTEImage(TEX_UPPER_BAKED)->getID()) << std::endl << @@ -8079,6 +8106,7 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) if (id == image_baked->getID()) { mBakedTextureData[i].mIsLoaded = true; + mBakedTextureData[i].mIsUsed = true; mBakedTextureData[i].mLastTextureIndex = id; for (U32 k = 0; k < mBakedTextureData[i].mMeshes.size(); k++) { @@ -8095,6 +8123,17 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) { setLocalTexture(*local_tex_iter, getTEImage(*local_tex_iter), TRUE); } + + // ! BACKWARDS COMPATIBILITY ! + // Workaround for viewing avatars from old viewers that haven't baked hair textures. + // This is paired with similar code in updateMeshTextures that sets hair mesh color. + if (i == BAKED_HAIR) + { + for (U32 i = 0; i < mBakedTextureData[BAKED_HAIR].mMeshes.size(); i++) + { + mBakedTextureData[BAKED_HAIR].mMeshes[i]->setColor( 1.f, 1.f, 1.f, 1.f ); + } + } } } diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 50eec80ba7..f8b2c068ff 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -699,6 +699,7 @@ private: LLUUID mLastTextureIndex; LLTexLayerSet* mTexLayerSet; bool mIsLoaded; + bool mIsUsed; LLVOAvatarDefines::ETextureIndex mTextureIndex; U32 mMaskTexName; // Stores pointers to the joint meshes that this baked texture deals with diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index 82003daaf4..29036f4947 100644 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -365,7 +365,7 @@ LLParticlePartition::LLParticlePartition() LLHUDParticlePartition::LLHUDParticlePartition() : LLParticlePartition() { - mDrawableType = LLPipeline::RENDER_TYPE_HUD; + mDrawableType = LLPipeline::RENDER_TYPE_HUD_PARTICLES; mPartitionType = LLViewerRegion::PARTITION_HUD_PARTICLE; } @@ -509,7 +509,7 @@ LLDrawable* LLVOHUDPartGroup::createDrawable(LLPipeline *pipeline) { pipeline->allocDrawable(this); mDrawable->setLit(FALSE); - mDrawable->setRenderType(LLPipeline::RENDER_TYPE_HUD); + mDrawable->setRenderType(LLPipeline::RENDER_TYPE_HUD_PARTICLES); return mDrawable; } diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 3b76127eb2..3fd5054fd1 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -329,6 +329,9 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys, mBillboardRatio = sSpeciesTable[mSpecies]->mBillboardRatio; mTrunkAspect = sSpeciesTable[mSpecies]->mTrunkAspect; mBranchAspect = sSpeciesTable[mSpecies]->mBranchAspect; + + // position change not caused by us, etc. make sure to rebuild. + gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL); return retval; } @@ -397,6 +400,31 @@ BOOL LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) { gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, FALSE); } + else + { + // we're not animating but we may *still* need to + // regenerate the mesh if we moved, since position + // and rotation are baked into the mesh. + // *TODO: I don't know what's so special about trees + // that they don't get REBUILD_POSITION automatically + // at a higher level. + const LLVector3 &this_position = getPositionAgent(); + if (this_position != mLastPosition) + { + gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_POSITION); + mLastPosition = this_position; + } + else + { + const LLQuaternion &this_rotation = getRotation(); + + if (this_rotation != mLastRotation) + { + gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_POSITION); + mLastRotation = this_rotation; + } + } + } } mTrunkLOD = trunk_LOD; diff --git a/indra/newview/llvotree.h b/indra/newview/llvotree.h index 473f1c340e..42a6d54f62 100644 --- a/indra/newview/llvotree.h +++ b/indra/newview/llvotree.h @@ -179,6 +179,11 @@ protected: F32 mTrunkAspect; // Ratio between width/length of trunk F32 mBranchAspect; // Ratio between width/length of branch F32 mRandomLeafRotate; // How much to randomly rotate leaves about arbitrary axis + + // cache last position+rotation so we can detect the need for a + // complete rebuild when not animating + LLVector3 mLastPosition; + LLQuaternion mLastRotation; U32 mFrameCount; diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 99f559cc79..2e18b710a7 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -305,8 +305,8 @@ void LLWorldMapView::draw() const S32 width = getRect().getWidth(); const S32 height = getRect().getHeight(); - const S32 half_width = width / 2; - const S32 half_height = height / 2; + const F32 half_width = F32(width) / 2.0f; + const F32 half_height = F32(height) / 2.0f; LLVector3d camera_global = gAgent.getCameraPositionGlobal(); LLLocalClipRect clip(getLocalRect()); @@ -350,8 +350,8 @@ void LLWorldMapView::draw() // Find x and y position relative to camera's center. LLVector3d rel_region_pos = origin_global - camera_global; - S32 relative_x = lltrunc((rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * gMapScale); - S32 relative_y = lltrunc((rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * gMapScale); + F32 relative_x = (rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * gMapScale; + F32 relative_y = (rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * gMapScale; F32 pix_width = gMapScale*(layer->LayerExtents.getWidth() + 1); F32 pix_height = gMapScale*(layer->LayerExtents.getHeight() + 1); @@ -456,8 +456,8 @@ void LLWorldMapView::draw() // Find x and y position relative to camera's center. LLVector3d rel_region_pos = origin_global - camera_global; - S32 relative_x = lltrunc((rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * gMapScale); - S32 relative_y = lltrunc((rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * gMapScale); + F32 relative_x = (rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * gMapScale; + F32 relative_y = (rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * gMapScale; // When the view isn't panned, 0,0 = center of rectangle F32 bottom = sPanY + half_height + relative_y; diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 0ec4e43806..1a32b30831 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -323,6 +323,7 @@ public: RENDER_TYPE_VOLUME, RENDER_TYPE_PARTICLES, RENDER_TYPE_CLOUDS, + RENDER_TYPE_HUD_PARTICLES }; enum LLRenderDebugFeatureMask diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml index 238dfd5baf..c3935882af 100644 --- a/indra/newview/skins/default/xui/de/floater_about.xml +++ b/indra/newview/skins/default/xui/de/floater_about.xml @@ -20,13 +20,14 @@ SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. zlib Copyright (C) 1995-2002 Jean-loup Gailly und Mark Adler. +google-perftools Copyright (c) 2005, Google Inc. Alle Rechte vorbehalten. Details siehe licenses.txt. Voice-Chat-Audiocoding: Polycom(R) Siren14(TM) (ITU-T Empf.G.722.1 Anhang C) -I get by with a little help from my friends. (etwa: Ich überlebe mit ein bisschen Unterstützung von meinen Freunden.) --Richard Starkey +Um im Geschäftsleben erfolreich zu sein, sei kühn, sei schnell, sei anders. --Henry Marchant Sie befinden sich in [POSITION] diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml index c2b22caa20..93e7297fd2 100644 --- a/indra/newview/skins/default/xui/de/floater_about_land.xml +++ b/indra/newview/skins/default/xui/de/floater_about_land.xml @@ -8,6 +8,18 @@ Beschreibung: + + Typ: + + + Mainland / Homestead + + + Einstufung: + + + Adult + Eigentümer: @@ -29,9 +41,10 @@ Nicht zu verkaufen. - Preis: [PRICE] L$. + Preis: [PRICE] L$ ([PRICE_PER_SQM] L$/qm.). -