llviewermenu.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:209k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llviewermenu.cpp
  3.  * @brief Builds menus out of items.
  4.  *
  5.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2002-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. #include "llviewermenu.h" 
  34. // linden library includes
  35. #include "llfloaterreg.h"
  36. #include "llcombobox.h"
  37. #include "llinventorypanel.h"
  38. #include "llnotifications.h"
  39. #include "llnotificationsutil.h"
  40. // newview includes
  41. #include "llagent.h"
  42. #include "llagentwearables.h"
  43. #include "llagentpilot.h"
  44. #include "llbottomtray.h"
  45. #include "llcompilequeue.h"
  46. #include "llconsole.h"
  47. #include "lldebugview.h"
  48. #include "llfilepicker.h"
  49. //#include "llfirstuse.h"
  50. #include "llfloaterbuy.h"
  51. #include "llfloaterbuycontents.h"
  52. #include "llfloaterbuycurrency.h"
  53. #include "llfloatercustomize.h"
  54. #include "llfloatergodtools.h"
  55. #include "llfloaterinventory.h"
  56. #include "llfloaterland.h"
  57. #include "llfloaterpay.h"
  58. #include "llfloaterreporter.h"
  59. #include "llfloatersearch.h"
  60. #include "llfloaterscriptdebug.h"
  61. #include "llfloatersnapshot.h"
  62. #include "llfloatertools.h"
  63. #include "llfloaterworldmap.h"
  64. #include "llavataractions.h"
  65. #include "lllandmarkactions.h"
  66. #include "llgroupmgr.h"
  67. #include "lltooltip.h"
  68. #include "llhudeffecttrail.h"
  69. #include "llhudmanager.h"
  70. #include "llimview.h"
  71. #include "llinventorybridge.h"
  72. #include "llpanellogin.h"
  73. #include "llpanelblockedlist.h"
  74. #include "llmenucommands.h"
  75. #include "llmoveview.h"
  76. #include "llparcel.h"
  77. #include "llrootview.h"
  78. #include "llselectmgr.h"
  79. #include "llsidetray.h"
  80. #include "llstatusbar.h"
  81. #include "lltextureview.h"
  82. #include "lltoolcomp.h"
  83. #include "lltoolmgr.h"
  84. #include "lltoolpie.h"
  85. #include "lltoolselectland.h"
  86. #include "llviewergenericmessage.h"
  87. #include "llviewerhelp.h"
  88. #include "llviewermenufile.h" // init_menu_file()
  89. #include "llviewermessage.h"
  90. #include "llviewernetwork.h"
  91. #include "llviewerobjectlist.h"
  92. #include "llviewerparcelmgr.h"
  93. #include "llviewerstats.h"
  94. #include "llvoavatarself.h"
  95. #include "llworldmap.h"
  96. #include "pipeline.h"
  97. #include "llviewerjoystick.h"
  98. #include "llwlanimator.h"
  99. #include "llwlparammanager.h"
  100. #include "llfloatercamera.h"
  101. #include "lluilistener.h"
  102. #include "llappearancemgr.h"
  103. using namespace LLVOAvatarDefines;
  104. BOOL enable_land_build(void*);
  105. BOOL enable_object_build(void*);
  106. LLVOAvatar* find_avatar_from_object( LLViewerObject* object );
  107. LLVOAvatar* find_avatar_from_object( const LLUUID& object_id );
  108. void handle_test_load_url(void*);
  109. //
  110. // Evil hackish imported globals
  111. //extern BOOL gHideSelectedObjects;
  112. //extern BOOL gAllowSelectAvatar;
  113. //extern BOOL gDebugAvatarRotation;
  114. extern BOOL gDebugClicks;
  115. extern BOOL gDebugWindowProc;
  116. //extern BOOL gDebugTextEditorTips;
  117. //extern BOOL gDebugSelectMgr;
  118. //
  119. // Globals
  120. //
  121. LLMenuBarGL *gMenuBarView = NULL;
  122. LLViewerMenuHolderGL *gMenuHolder = NULL;
  123. LLMenuGL *gPopupMenuView = NULL;
  124. LLMenuBarGL *gLoginMenuBarView = NULL;
  125. // Pie menus
  126. LLContextMenu *gMenuAvatarSelf = NULL;
  127. LLContextMenu *gMenuAvatarOther = NULL;
  128. LLContextMenu *gMenuObject = NULL;
  129. LLContextMenu *gMenuAttachmentSelf = NULL;
  130. LLContextMenu *gMenuAttachmentOther = NULL;
  131. LLContextMenu *gMenuLand = NULL;
  132. const std::string SAVE_INTO_INVENTORY("Save Object Back to My Inventory");
  133. const std::string SAVE_INTO_TASK_INVENTORY("Save Object Back to Object Contents");
  134. LLMenuGL* gAttachSubMenu = NULL;
  135. LLMenuGL* gDetachSubMenu = NULL;
  136. LLMenuGL* gTakeOffClothes = NULL;
  137. LLContextMenu* gAttachScreenPieMenu = NULL;
  138. LLContextMenu* gAttachPieMenu = NULL;
  139. LLContextMenu* gAttachBodyPartPieMenus[8];
  140. LLContextMenu* gDetachPieMenu = NULL;
  141. LLContextMenu* gDetachScreenPieMenu = NULL;
  142. LLContextMenu* gDetachBodyPartPieMenus[8];
  143. LLMenuItemCallGL* gAFKMenu = NULL;
  144. LLMenuItemCallGL* gBusyMenu = NULL;
  145. //
  146. // Local prototypes
  147. // File Menu
  148. const char* upload_pick(void* data);
  149. void handle_compress_image(void*);
  150. // Edit menu
  151. void handle_dump_group_info(void *);
  152. void handle_dump_capabilities_info(void *);
  153. // Advanced->Consoles menu
  154. void handle_region_dump_settings(void*);
  155. void handle_region_dump_temp_asset_data(void*);
  156. void handle_region_clear_temp_asset_data(void*);
  157. // Object pie menu
  158. BOOL sitting_on_selection();
  159. void near_sit_object();
  160. //void label_sit_or_stand(std::string& label, void*);
  161. // buy and take alias into the same UI positions, so these
  162. // declarations handle this mess.
  163. BOOL is_selection_buy_not_take();
  164. S32 selection_price();
  165. BOOL enable_take();
  166. void handle_take();
  167. bool confirm_take(const LLSD& notification, const LLSD& response);
  168. void handle_buy_object(LLSaleInfo sale_info);
  169. void handle_buy_contents(LLSaleInfo sale_info);
  170. // Land pie menu
  171. void near_sit_down_point(BOOL success, void *);
  172. // Avatar pie menu
  173. // Debug menu
  174. void velocity_interpolate( void* );
  175. void handle_rebake_textures(void*);
  176. BOOL check_admin_override(void*);
  177. void handle_admin_override_toggle(void*);
  178. #ifdef TOGGLE_HACKED_GODLIKE_VIEWER
  179. void handle_toggle_hacked_godmode(void*);
  180. BOOL check_toggle_hacked_godmode(void*);
  181. bool enable_toggle_hacked_godmode(void*);
  182. #endif
  183. void toggle_show_xui_names(void *);
  184. BOOL check_show_xui_names(void *);
  185. // Debug UI
  186. void handle_buy_currency_test(void*);
  187. void handle_save_to_xml(void*);
  188. void handle_load_from_xml(void*);
  189. void handle_god_mode(void*);
  190. // God menu
  191. void handle_leave_god_mode(void*);
  192. void handle_reset_view();
  193. void handle_duplicate_in_place(void*);
  194. void handle_object_owner_self(void*);
  195. void handle_object_owner_permissive(void*);
  196. void handle_object_lock(void*);
  197. void handle_object_asset_ids(void*);
  198. void force_take_copy(void*);
  199. #ifdef _CORY_TESTING
  200. void force_export_copy(void*);
  201. void force_import_geometry(void*);
  202. #endif
  203. void handle_force_parcel_owner_to_me(void*);
  204. void handle_force_parcel_to_content(void*);
  205. void handle_claim_public_land(void*);
  206. void handle_god_request_avatar_geometry(void *); // Hack for easy testing of new avatar geometry
  207. void reload_vertex_shader(void *);
  208. void handle_disconnect_viewer(void *);
  209. void force_error_breakpoint(void *);
  210. void force_error_llerror(void *);
  211. void force_error_bad_memory_access(void *);
  212. void force_error_infinite_loop(void *);
  213. void force_error_software_exception(void *);
  214. void force_error_driver_crash(void *);
  215. void handle_force_delete(void*);
  216. void print_object_info(void*);
  217. void print_agent_nvpairs(void*);
  218. void toggle_debug_menus(void*);
  219. void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExtStat ext_status);
  220. void dump_select_mgr(void*);
  221. void dump_inventory(void*);
  222. void toggle_visibility(void*);
  223. BOOL get_visibility(void*);
  224. // Avatar Pie menu
  225. void request_friendship(const LLUUID& agent_id);
  226. // Tools menu
  227. void handle_selected_texture_info(void*);
  228. void handle_dump_followcam(void*);
  229. void handle_viewer_enable_message_log(void*);
  230. void handle_viewer_disable_message_log(void*);
  231. BOOL enable_buy_land(void*);
  232. // Help menu
  233. void handle_test_male(void *);
  234. void handle_test_female(void *);
  235. void handle_toggle_pg(void*);
  236. void handle_dump_attachments(void *);
  237. void handle_dump_avatar_local_textures(void*);
  238. void handle_debug_avatar_textures(void*);
  239. void handle_grab_texture(void*);
  240. BOOL enable_grab_texture(void*);
  241. void handle_dump_region_object_cache(void*);
  242. BOOL enable_save_into_inventory(void*);
  243. BOOL enable_save_into_task_inventory(void*);
  244. BOOL enable_detach(const LLSD& = LLSD());
  245. void menu_toggle_attached_lights(void* user_data);
  246. void menu_toggle_attached_particles(void* user_data);
  247. class LLMenuParcelObserver : public LLParcelObserver
  248. {
  249. public:
  250. LLMenuParcelObserver();
  251. ~LLMenuParcelObserver();
  252. virtual void changed();
  253. };
  254. static LLMenuParcelObserver* gMenuParcelObserver = NULL;
  255. static LLUIListener sUIListener;
  256. LLMenuParcelObserver::LLMenuParcelObserver()
  257. {
  258. LLViewerParcelMgr::getInstance()->addObserver(this);
  259. }
  260. LLMenuParcelObserver::~LLMenuParcelObserver()
  261. {
  262. LLViewerParcelMgr::getInstance()->removeObserver(this);
  263. }
  264. void LLMenuParcelObserver::changed()
  265. {
  266. gMenuHolder->childSetEnabled("Land Buy Pass", LLPanelLandGeneral::enableBuyPass(NULL));
  267. BOOL buyable = enable_buy_land(NULL);
  268. gMenuHolder->childSetEnabled("Land Buy", buyable);
  269. gMenuHolder->childSetEnabled("Buy Land...", buyable);
  270. }
  271. void initialize_menus();
  272. //-----------------------------------------------------------------------------
  273. // Initialize main menus
  274. //
  275. // HOW TO NAME MENUS:
  276. //
  277. // First Letter Of Each Word Is Capitalized, Even At Or And
  278. //
  279. // Items that lead to dialog boxes end in "..."
  280. //
  281. // Break up groups of more than 6 items with separators
  282. //-----------------------------------------------------------------------------
  283. void set_underclothes_menu_options()
  284. {
  285. if (gMenuHolder && gAgent.isTeen())
  286. {
  287. gMenuHolder->getChild<LLView>("Self Underpants")->setVisible(FALSE);
  288. gMenuHolder->getChild<LLView>("Self Undershirt")->setVisible(FALSE);
  289. }
  290. if (gMenuBarView && gAgent.isTeen())
  291. {
  292. gMenuBarView->getChild<LLView>("Menu Underpants")->setVisible(FALSE);
  293. gMenuBarView->getChild<LLView>("Menu Undershirt")->setVisible(FALSE);
  294. }
  295. }
  296. void init_menus()
  297. {
  298. S32 top = gViewerWindow->getRootView()->getRect().getHeight();
  299. // Initialize actions
  300. initialize_menus();
  301. ///
  302. /// Popup menu
  303. ///
  304. /// The popup menu is now populated by the show_context_menu()
  305. /// method.
  306. LLMenuGL::Params menu_params;
  307. menu_params.name = "Popup";
  308. menu_params.visible = false;
  309. gPopupMenuView = LLUICtrlFactory::create<LLMenuGL>(menu_params);
  310. gMenuHolder->addChild( gPopupMenuView );
  311. ///
  312. /// Context menus
  313. ///
  314. const widget_registry_t& registry =
  315. LLViewerMenuHolderGL::child_registry_t::instance();
  316. gMenuAvatarSelf = LLUICtrlFactory::createFromFile<LLContextMenu>(
  317. "menu_avatar_self.xml", gMenuHolder, registry);
  318. gMenuAvatarOther = LLUICtrlFactory::createFromFile<LLContextMenu>(
  319. "menu_avatar_other.xml", gMenuHolder, registry);
  320. gDetachScreenPieMenu = gMenuHolder->getChild<LLContextMenu>("Object Detach HUD", true);
  321. gDetachPieMenu = gMenuHolder->getChild<LLContextMenu>("Object Detach", true);
  322. gMenuObject = LLUICtrlFactory::createFromFile<LLContextMenu>(
  323. "menu_object.xml", gMenuHolder, registry);
  324. gAttachScreenPieMenu = gMenuHolder->getChild<LLContextMenu>("Object Attach HUD");
  325. gAttachPieMenu = gMenuHolder->getChild<LLContextMenu>("Object Attach");
  326. gMenuAttachmentSelf = LLUICtrlFactory::createFromFile<LLContextMenu>(
  327. "menu_attachment_self.xml", gMenuHolder, registry);
  328. gMenuAttachmentOther = LLUICtrlFactory::createFromFile<LLContextMenu>(
  329. "menu_attachment_other.xml", gMenuHolder, registry);
  330. gMenuLand = LLUICtrlFactory::createFromFile<LLContextMenu>(
  331. "menu_land.xml", gMenuHolder, registry);
  332. ///
  333. /// set up the colors
  334. ///
  335. LLColor4 color;
  336. LLColor4 context_menu_color = LLUIColorTable::instance().getColor("MenuPopupBgColor");
  337. gMenuAvatarSelf->setBackgroundColor( context_menu_color );
  338. gMenuAvatarOther->setBackgroundColor( context_menu_color );
  339. gMenuObject->setBackgroundColor( context_menu_color );
  340. gMenuAttachmentSelf->setBackgroundColor( context_menu_color );
  341. gMenuAttachmentOther->setBackgroundColor( context_menu_color );
  342. gMenuLand->setBackgroundColor( context_menu_color );
  343. color = LLUIColorTable::instance().getColor( "MenuPopupBgColor" );
  344. gPopupMenuView->setBackgroundColor( color );
  345. // If we are not in production, use a different color to make it apparent.
  346. if (LLViewerLogin::getInstance()->isInProductionGrid())
  347. {
  348. color = LLUIColorTable::instance().getColor( "MenuBarBgColor" );
  349. }
  350. else
  351. {
  352. color = LLUIColorTable::instance().getColor( "MenuNonProductionBgColor" );
  353. }
  354. gMenuBarView = LLUICtrlFactory::getInstance()->createFromFile<LLMenuBarGL>("menu_viewer.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
  355. gMenuBarView->setRect(LLRect(0, top, 0, top - MENU_BAR_HEIGHT));
  356. gMenuBarView->setBackgroundColor( color );
  357. gMenuHolder->addChild(gMenuBarView);
  358.   
  359.     gViewerWindow->setMenuBackgroundColor(false, 
  360.         LLViewerLogin::getInstance()->isInProductionGrid());
  361. // Assume L$10 for now, the server will tell us the real cost at login
  362. // *TODO:Also fix cost in llfolderview.cpp for Inventory menus
  363. const std::string upload_cost("10");
  364. gMenuHolder->childSetLabelArg("Upload Image", "[COST]", upload_cost);
  365. gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", upload_cost);
  366. gMenuHolder->childSetLabelArg("Upload Animation", "[COST]", upload_cost);
  367. gMenuHolder->childSetLabelArg("Bulk Upload", "[COST]", upload_cost);
  368. gAFKMenu = gMenuBarView->getChild<LLMenuItemCallGL>("Set Away", TRUE);
  369. gBusyMenu = gMenuBarView->getChild<LLMenuItemCallGL>("Set Busy", TRUE);
  370. gAttachSubMenu = gMenuBarView->findChildMenuByName("Attach Object", TRUE);
  371. gDetachSubMenu = gMenuBarView->findChildMenuByName("Detach Object", TRUE);
  372. #if !MEM_TRACK_MEM
  373. // Don't display the Memory console menu if the feature is turned off
  374. LLMenuItemCheckGL *memoryMenu = gMenuBarView->getChild<LLMenuItemCheckGL>("Memory", TRUE);
  375. if (memoryMenu)
  376. {
  377. memoryMenu->setVisible(FALSE);
  378. }
  379. #endif
  380. gMenuBarView->createJumpKeys();
  381. // Let land based option enable when parcel changes
  382. gMenuParcelObserver = new LLMenuParcelObserver();
  383. gLoginMenuBarView = LLUICtrlFactory::getInstance()->createFromFile<LLMenuBarGL>("menu_login.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
  384. gLoginMenuBarView->arrangeAndClear();
  385. LLRect menuBarRect = gLoginMenuBarView->getRect();
  386. gLoginMenuBarView->setRect(LLRect(menuBarRect.mLeft, menuBarRect.mTop, gViewerWindow->getRootView()->getRect().getWidth() - menuBarRect.mLeft,  menuBarRect.mBottom));
  387. gLoginMenuBarView->setBackgroundColor( color );
  388. gMenuHolder->addChild(gLoginMenuBarView);
  389. // tooltips are on top of EVERYTHING, including menus
  390. gViewerWindow->getRootView()->sendChildToFront(gToolTipView);
  391. }
  392. ///////////////////
  393. // SHOW CONSOLES //
  394. ///////////////////
  395. class LLAdvancedToggleConsole : public view_listener_t
  396. {
  397. bool handleEvent(const LLSD& userdata)
  398. {
  399. std::string console_type = userdata.asString();
  400. if ("texture" == console_type)
  401. {
  402. toggle_visibility( (void*)gTextureView );
  403. }
  404. else if ("debug" == console_type)
  405. {
  406. toggle_visibility( (void*)static_cast<LLUICtrl*>(gDebugView->mDebugConsolep));
  407. }
  408. else if (gTextureSizeView && "texture size" == console_type)
  409. {
  410. toggle_visibility( (void*)gTextureSizeView );
  411. }
  412. else if (gTextureCategoryView && "texture category" == console_type)
  413. {
  414. toggle_visibility( (void*)gTextureCategoryView );
  415. }
  416. else if ("fast timers" == console_type)
  417. {
  418. toggle_visibility( (void*)gDebugView->mFastTimerView );
  419. }
  420. #if MEM_TRACK_MEM
  421. else if ("memory view" == console_type)
  422. {
  423. toggle_visibility( (void*)gDebugView->mMemoryView );
  424. }
  425. #endif
  426. return true;
  427. }
  428. };
  429. class LLAdvancedCheckConsole : public view_listener_t
  430. {
  431. bool handleEvent(const LLSD& userdata)
  432. {
  433. std::string console_type = userdata.asString();
  434. bool new_value = false;
  435. if ("texture" == console_type)
  436. {
  437. new_value = get_visibility( (void*)gTextureView );
  438. }
  439. else if ("debug" == console_type)
  440. {
  441. new_value = get_visibility( (void*)((LLView*)gDebugView->mDebugConsolep) );
  442. }
  443. else if (gTextureSizeView && "texture size" == console_type)
  444. {
  445. new_value = get_visibility( (void*)gTextureSizeView );
  446. }
  447. else if (gTextureCategoryView && "texture category" == console_type)
  448. {
  449. new_value = get_visibility( (void*)gTextureCategoryView );
  450. }
  451. else if ("fast timers" == console_type)
  452. {
  453. new_value = get_visibility( (void*)gDebugView->mFastTimerView );
  454. }
  455. #if MEM_TRACK_MEM
  456. else if ("memory view" == console_type)
  457. {
  458. new_value = get_visibility( (void*)gDebugView->mMemoryView );
  459. }
  460. #endif
  461. return new_value;
  462. }
  463. };
  464. //////////////////////////
  465. // DUMP INFO TO CONSOLE //
  466. //////////////////////////
  467. class LLAdvancedDumpInfoToConsole : public view_listener_t
  468. {
  469. bool handleEvent(const LLSD& userdata)
  470. {
  471. std::string info_type = userdata.asString();
  472. if ("region" == info_type)
  473. {
  474. handle_region_dump_settings(NULL);
  475. }
  476. else if ("group" == info_type)
  477. {
  478. handle_dump_group_info(NULL);
  479. }
  480. else if ("capabilities" == info_type)
  481. {
  482. handle_dump_capabilities_info(NULL);
  483. }
  484. return true;
  485. }
  486. };
  487. //////////////
  488. // HUD INFO //
  489. //////////////
  490. class LLAdvancedToggleHUDInfo : public view_listener_t
  491. {
  492. bool handleEvent(const LLSD& userdata)
  493. {
  494. std::string info_type = userdata.asString();
  495. if ("camera" == info_type)
  496. {
  497. gDisplayCameraPos = !(gDisplayCameraPos);
  498. }
  499. else if ("wind" == info_type)
  500. {
  501. gDisplayWindInfo = !(gDisplayWindInfo);
  502. }
  503. else if ("fov" == info_type)
  504. {
  505. gDisplayFOV = !(gDisplayFOV);
  506. }
  507. else if ("badge" == info_type)
  508. {
  509. gDisplayBadge = !(gDisplayBadge);
  510. }
  511. return true;
  512. }
  513. };
  514. class LLAdvancedCheckHUDInfo : public view_listener_t
  515. {
  516. bool handleEvent(const LLSD& userdata)
  517. {
  518. std::string info_type = userdata.asString();
  519. bool new_value = false;
  520. if ("camera" == info_type)
  521. {
  522. new_value = gDisplayCameraPos;
  523. }
  524. else if ("wind" == info_type)
  525. {
  526. new_value = gDisplayWindInfo;
  527. }
  528. else if ("fov" == info_type)
  529. {
  530. new_value = gDisplayFOV;
  531. }
  532. else if ("badge" == info_type)
  533. {
  534. new_value = gDisplayBadge;
  535. }
  536. return new_value;
  537. }
  538. };
  539. //////////////
  540. // FLYING   //
  541. //////////////
  542. class LLAdvancedAgentFlyingInfo : public view_listener_t
  543. {
  544. bool handleEvent(const LLSD&)
  545. {
  546. return gAgent.getFlying();
  547. }
  548. };
  549. ///////////////////////
  550. // CLEAR GROUP CACHE //
  551. ///////////////////////
  552. class LLAdvancedClearGroupCache : public view_listener_t
  553. {
  554. bool handleEvent(const LLSD& userdata)
  555. {
  556. LLGroupMgr::debugClearAllGroups(NULL);
  557. return true;
  558. }
  559. };
  560. /////////////////
  561. // RENDER TYPE //
  562. /////////////////
  563. U32 render_type_from_string(std::string render_type)
  564. {
  565. if ("simple" == render_type)
  566. {
  567. return LLPipeline::RENDER_TYPE_SIMPLE;
  568. }
  569. else if ("alpha" == render_type)
  570. {
  571. return LLPipeline::RENDER_TYPE_ALPHA;
  572. }
  573. else if ("tree" == render_type)
  574. {
  575. return LLPipeline::RENDER_TYPE_TREE;
  576. }
  577. else if ("character" == render_type)
  578. {
  579. return LLPipeline::RENDER_TYPE_AVATAR;
  580. }
  581. else if ("surfacePath" == render_type)
  582. {
  583. return LLPipeline::RENDER_TYPE_TERRAIN;
  584. }
  585. else if ("sky" == render_type)
  586. {
  587. return LLPipeline::RENDER_TYPE_SKY;
  588. }
  589. else if ("water" == render_type)
  590. {
  591. return LLPipeline::RENDER_TYPE_WATER;
  592. }
  593. else if ("ground" == render_type)
  594. {
  595. return LLPipeline::RENDER_TYPE_GROUND;
  596. }
  597. else if ("volume" == render_type)
  598. {
  599. return LLPipeline::RENDER_TYPE_VOLUME;
  600. }
  601. else if ("grass" == render_type)
  602. {
  603. return LLPipeline::RENDER_TYPE_GRASS;
  604. }
  605. else if ("clouds" == render_type)
  606. {
  607. return LLPipeline::RENDER_TYPE_CLOUDS;
  608. }
  609. else if ("particles" == render_type)
  610. {
  611. return LLPipeline::RENDER_TYPE_PARTICLES;
  612. }
  613. else if ("bump" == render_type)
  614. {
  615. return LLPipeline::RENDER_TYPE_BUMP;
  616. }
  617. else
  618. {
  619. return 0;
  620. }
  621. }
  622. class LLAdvancedToggleRenderType : public view_listener_t
  623. {
  624. bool handleEvent(const LLSD& userdata)
  625. {
  626. U32 render_type = render_type_from_string( userdata.asString() );
  627. if ( render_type != 0 )
  628. {
  629. LLPipeline::toggleRenderTypeControl( (void*)render_type );
  630. }
  631. return true;
  632. }
  633. };
  634. class LLAdvancedCheckRenderType : public view_listener_t
  635. {
  636. bool handleEvent(const LLSD& userdata)
  637. {
  638. U32 render_type = render_type_from_string( userdata.asString() );
  639. bool new_value = false;
  640. if ( render_type != 0 )
  641. {
  642. new_value = LLPipeline::hasRenderTypeControl( (void*)render_type );
  643. }
  644. return new_value;
  645. }
  646. };
  647. /////////////
  648. // FEATURE //
  649. /////////////
  650. U32 feature_from_string(std::string feature)
  651. if ("ui" == feature)
  652. return LLPipeline::RENDER_DEBUG_FEATURE_UI;
  653. }
  654. else if ("selected" == feature)
  655. {
  656. return LLPipeline::RENDER_DEBUG_FEATURE_SELECTED;
  657. }
  658. else if ("highlighted" == feature)
  659. {
  660. return LLPipeline::RENDER_DEBUG_FEATURE_HIGHLIGHTED;
  661. }
  662. else if ("dynamic textures" == feature)
  663. {
  664. return LLPipeline::RENDER_DEBUG_FEATURE_DYNAMIC_TEXTURES;
  665. }
  666. else if ("foot shadows" == feature)
  667. {
  668. return LLPipeline::RENDER_DEBUG_FEATURE_FOOT_SHADOWS;
  669. }
  670. else if ("fog" == feature)
  671. {
  672. return LLPipeline::RENDER_DEBUG_FEATURE_FOG;
  673. }
  674. else if ("fr info" == feature)
  675. {
  676. return LLPipeline::RENDER_DEBUG_FEATURE_FR_INFO;
  677. }
  678. else if ("flexible" == feature)
  679. {
  680. return LLPipeline::RENDER_DEBUG_FEATURE_FLEXIBLE;
  681. }
  682. else
  683. {
  684. return 0;
  685. }
  686. };
  687. class LLAdvancedToggleFeature : public view_listener_t{
  688. bool handleEvent(const LLSD& userdata)
  689. {
  690. U32 feature = feature_from_string( userdata.asString() );
  691. if ( feature != 0 )
  692. {
  693. LLPipeline::toggleRenderDebugFeature( (void*)feature );
  694. }
  695. return true;
  696. }
  697. };
  698. class LLAdvancedCheckFeature : public view_listener_t
  699. {bool handleEvent(const LLSD& userdata)
  700. {
  701. U32 feature = feature_from_string( userdata.asString() );
  702. bool new_value = false;
  703. if ( feature != 0 )
  704. {
  705. new_value = LLPipeline::toggleRenderDebugFeatureControl( (void*)feature );
  706. }
  707. return new_value;
  708. }
  709. };
  710. //////////////////
  711. // INFO DISPLAY //
  712. //////////////////
  713. U32 info_display_from_string(std::string info_display)
  714. {
  715. if ("verify" == info_display)
  716. {
  717. return LLPipeline::RENDER_DEBUG_VERIFY;
  718. }
  719. else if ("bboxes" == info_display)
  720. {
  721. return LLPipeline::RENDER_DEBUG_BBOXES;
  722. }
  723. else if ("points" == info_display)
  724. {
  725. return LLPipeline::RENDER_DEBUG_POINTS;
  726. }
  727. else if ("octree" == info_display)
  728. {
  729. return LLPipeline::RENDER_DEBUG_OCTREE;
  730. }
  731. else if ("shadow frusta" == info_display)
  732. {
  733. return LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA;
  734. }
  735. else if ("occlusion" == info_display)
  736. {
  737. return LLPipeline::RENDER_DEBUG_OCCLUSION;
  738. }
  739. else if ("render batches" == info_display)
  740. {
  741. return LLPipeline::RENDER_DEBUG_BATCH_SIZE;
  742. }
  743. else if ("texture anim" == info_display)
  744. {
  745. return LLPipeline::RENDER_DEBUG_TEXTURE_ANIM;
  746. }
  747. else if ("texture priority" == info_display)
  748. {
  749. return LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY;
  750. }
  751. else if ("shame" == info_display)
  752. {
  753. return LLPipeline::RENDER_DEBUG_SHAME;
  754. }
  755. else if ("texture area" == info_display)
  756. {
  757. return LLPipeline::RENDER_DEBUG_TEXTURE_AREA;
  758. }
  759. else if ("face area" == info_display)
  760. {
  761. return LLPipeline::RENDER_DEBUG_FACE_AREA;
  762. }
  763. else if ("lights" == info_display)
  764. {
  765. return LLPipeline::RENDER_DEBUG_LIGHTS;
  766. }
  767. else if ("particles" == info_display)
  768. {
  769. return LLPipeline::RENDER_DEBUG_PARTICLES;
  770. }
  771. else if ("composition" == info_display)
  772. {
  773. return LLPipeline::RENDER_DEBUG_COMPOSITION;
  774. }
  775. else if ("glow" == info_display)
  776. {
  777. return LLPipeline::RENDER_DEBUG_GLOW;
  778. }
  779. else if ("collision skeleton" == info_display)
  780. {
  781. return LLPipeline::RENDER_DEBUG_AVATAR_VOLUME;
  782. }
  783. else if ("raycast" == info_display)
  784. {
  785. return LLPipeline::RENDER_DEBUG_RAYCAST;
  786. }
  787. else if ("agent target" == info_display)
  788. {
  789. return LLPipeline::RENDER_DEBUG_AGENT_TARGET;
  790. }
  791. else
  792. {
  793. return 0;
  794. }
  795. };
  796. class LLAdvancedToggleInfoDisplay : public view_listener_t
  797. {
  798. bool handleEvent(const LLSD& userdata)
  799. {
  800. U32 info_display = info_display_from_string( userdata.asString() );
  801. if ( info_display != 0 )
  802. {
  803. LLPipeline::toggleRenderDebug( (void*)info_display );
  804. }
  805. return true;
  806. }
  807. };
  808. class LLAdvancedCheckInfoDisplay : public view_listener_t
  809. {
  810. bool handleEvent(const LLSD& userdata)
  811. {
  812. U32 info_display = info_display_from_string( userdata.asString() );
  813. bool new_value = false;
  814. if ( info_display != 0 )
  815. {
  816. new_value = LLPipeline::toggleRenderDebugControl( (void*)info_display );
  817. }
  818. return new_value;
  819. }
  820. };
  821. ///////////////////////////
  822. //// RANDOMIZE FRAMERATE //
  823. ///////////////////////////
  824. class LLAdvancedToggleRandomizeFramerate : public view_listener_t
  825. {
  826. bool handleEvent(const LLSD& userdata)
  827. {
  828. gRandomizeFramerate = !(gRandomizeFramerate);
  829. return true;
  830. }
  831. };
  832. class LLAdvancedCheckRandomizeFramerate : public view_listener_t
  833. {
  834. bool handleEvent(const LLSD& userdata)
  835. {
  836. bool new_value = gRandomizeFramerate;
  837. return new_value;
  838. }
  839. };
  840. void run_vectorize_perf_test(void *)
  841. {
  842. gSavedSettings.setBOOL("VectorizePerfTest", TRUE);
  843. }
  844. ////////////////////////////////
  845. // RUN Vectorized Perform Test//
  846. ////////////////////////////////
  847. class LLAdvancedVectorizePerfTest : public view_listener_t
  848. {
  849. bool handleEvent(const LLSD& userdata)
  850. {
  851. run_vectorize_perf_test(NULL);
  852. return true;
  853. }
  854. };
  855. ///////////////////////////
  856. //// PERIODIC SLOW FRAME //
  857. ///////////////////////////
  858. class LLAdvancedTogglePeriodicSlowFrame : public view_listener_t
  859. {
  860. bool handleEvent(const LLSD& userdata)
  861. {
  862. gPeriodicSlowFrame = !(gPeriodicSlowFrame);
  863. return true;
  864. }
  865. };
  866. class LLAdvancedCheckPeriodicSlowFrame : public view_listener_t
  867. {
  868. bool handleEvent(const LLSD& userdata)
  869. {
  870. bool new_value = gPeriodicSlowFrame;
  871. return new_value;
  872. }
  873. };
  874. ////////////////
  875. // FRAME TEST //
  876. ////////////////
  877. class LLAdvancedToggleFrameTest : public view_listener_t
  878. {
  879. bool handleEvent(const LLSD& userdata)
  880. {
  881. LLPipeline::sRenderFrameTest = !(LLPipeline::sRenderFrameTest);
  882. return true;
  883. }
  884. };
  885. class LLAdvancedCheckFrameTest : public view_listener_t
  886. {
  887. bool handleEvent(const LLSD& userdata)
  888. {
  889. bool new_value = LLPipeline::sRenderFrameTest;
  890. return new_value;
  891. }
  892. };
  893. ///////////////////////////
  894. // SELECTED TEXTURE INFO //
  895. ///////////////////////////
  896. class LLAdvancedSelectedTextureInfo : public view_listener_t
  897. {
  898. bool handleEvent(const LLSD& userdata)
  899. {
  900. handle_selected_texture_info(NULL);
  901. return true;
  902. }
  903. };
  904. //////////////////////
  905. // TOGGLE WIREFRAME //
  906. //////////////////////
  907. class LLAdvancedToggleWireframe : public view_listener_t
  908. {
  909. bool handleEvent(const LLSD& userdata)
  910. {
  911. gUseWireframe = !(gUseWireframe);
  912. return true;
  913. }
  914. };
  915. class LLAdvancedCheckWireframe : public view_listener_t
  916. {
  917. bool handleEvent(const LLSD& userdata)
  918. {
  919. bool new_value = gUseWireframe;
  920. return new_value;
  921. }
  922. };
  923. //////////////////////
  924. // TEXTURE ATLAS //
  925. //////////////////////
  926. class LLAdvancedToggleTextureAtlas : public view_listener_t
  927. {
  928. bool handleEvent(const LLSD& userdata)
  929. {
  930. LLViewerTexture::sUseTextureAtlas = !LLViewerTexture::sUseTextureAtlas;
  931. gSavedSettings.setBOOL("EnableTextureAtlas", LLViewerTexture::sUseTextureAtlas) ;
  932. return true;
  933. }
  934. };
  935. class LLAdvancedCheckTextureAtlas : public view_listener_t
  936. {
  937. bool handleEvent(const LLSD& userdata)
  938. {
  939. bool new_value = LLViewerTexture::sUseTextureAtlas; // <-- make this using LLCacheControl
  940. return new_value;
  941. }
  942. };
  943. //////////////////////////
  944. // DUMP SCRIPTED CAMERA //
  945. //////////////////////////
  946. class LLAdvancedDumpScriptedCamera : public view_listener_t
  947. {
  948. bool handleEvent(const LLSD& userdata)
  949. {
  950. handle_dump_followcam(NULL);
  951. return true;
  952. }
  953. };
  954. //////////////////////////////
  955. // DUMP REGION OBJECT CACHE //
  956. //////////////////////////////
  957. class LLAdvancedDumpRegionObjectCache : public view_listener_t
  958. {
  959. bool handleEvent(const LLSD& userdata)
  960. {
  961. handle_dump_region_object_cache(NULL);
  962. return true;
  963. }
  964. };
  965. class LLAdvancedBuyCurrencyTest : public view_listener_t
  966. {
  967. bool handleEvent(const LLSD& userdata)
  968. {
  969. handle_buy_currency_test(NULL);
  970. return true;
  971. }
  972. };
  973. /////////////////////
  974. // DUMP SELECT MGR //
  975. /////////////////////
  976. class LLAdvancedDumpSelectMgr : public view_listener_t
  977. {
  978. bool handleEvent(const LLSD& userdata)
  979. {
  980. dump_select_mgr(NULL);
  981. return true;
  982. }
  983. };
  984. ////////////////////
  985. // DUMP INVENTORY //
  986. ////////////////////
  987. class LLAdvancedDumpInventory : public view_listener_t
  988. {
  989. bool handleEvent(const LLSD& userdata)
  990. {
  991. dump_inventory(NULL);
  992. return true;
  993. }
  994. };
  995. ////////////////////////////////
  996. // PRINT SELECTED OBJECT INFO //
  997. ////////////////////////////////
  998. class LLAdvancedPrintSelectedObjectInfo : public view_listener_t
  999. {
  1000. bool handleEvent(const LLSD& userdata)
  1001. {
  1002. print_object_info(NULL);
  1003. return true;
  1004. }
  1005. };
  1006. //////////////////////
  1007. // PRINT AGENT INFO //
  1008. //////////////////////
  1009. class LLAdvancedPrintAgentInfo : public view_listener_t
  1010. {
  1011. bool handleEvent(const LLSD& userdata)
  1012. {
  1013. print_agent_nvpairs(NULL);
  1014. return true;
  1015. }
  1016. };
  1017. ////////////////////////////////
  1018. // PRINT TEXTURE MEMORY STATS //
  1019. ////////////////////////////////
  1020. class LLAdvancedPrintTextureMemoryStats : public view_listener_t
  1021. {
  1022. bool handleEvent(const LLSD& userdata)
  1023. {
  1024. output_statistics(NULL);
  1025. return true;
  1026. }
  1027. };
  1028. //////////////////
  1029. // DEBUG CLICKS //
  1030. //////////////////
  1031. class LLAdvancedToggleDebugClicks : public view_listener_t
  1032. {
  1033. bool handleEvent(const LLSD& userdata)
  1034. {
  1035. gDebugClicks = !(gDebugClicks);
  1036. return true;
  1037. }
  1038. };
  1039. class LLAdvancedCheckDebugClicks : public view_listener_t
  1040. {
  1041. bool handleEvent(const LLSD& userdata)
  1042. {
  1043. bool new_value = gDebugClicks;
  1044. return new_value;
  1045. }
  1046. };
  1047. /////////////////
  1048. // DEBUG VIEWS //
  1049. /////////////////
  1050. class LLAdvancedToggleDebugViews : public view_listener_t
  1051. {
  1052. bool handleEvent(const LLSD& userdata)
  1053. {
  1054. LLView::sDebugRects = !(LLView::sDebugRects);
  1055. return true;
  1056. }
  1057. };
  1058. class LLAdvancedCheckDebugViews : public view_listener_t
  1059. {
  1060. bool handleEvent(const LLSD& userdata)
  1061. {
  1062. bool new_value = LLView::sDebugRects;
  1063. return new_value;
  1064. }
  1065. };
  1066. ///////////////////////
  1067. // XUI NAME TOOLTIPS //
  1068. ///////////////////////
  1069. class LLAdvancedToggleXUINameTooltips : public view_listener_t
  1070. {
  1071. bool handleEvent(const LLSD& userdata)
  1072. {
  1073. toggle_show_xui_names(NULL);
  1074. return true;
  1075. }
  1076. };
  1077. class LLAdvancedCheckXUINameTooltips : public view_listener_t
  1078. {
  1079. bool handleEvent(const LLSD& userdata)
  1080. {
  1081. bool new_value = check_show_xui_names(NULL);
  1082. return new_value;
  1083. }
  1084. };
  1085. ////////////////////////
  1086. // DEBUG MOUSE EVENTS //
  1087. ////////////////////////
  1088. class LLAdvancedToggleDebugMouseEvents : public view_listener_t
  1089. {
  1090. bool handleEvent(const LLSD& userdata)
  1091. {
  1092. LLView::sDebugMouseHandling = !(LLView::sDebugMouseHandling);
  1093. return true;
  1094. }
  1095. };
  1096. class LLAdvancedCheckDebugMouseEvents : public view_listener_t
  1097. {
  1098. bool handleEvent(const LLSD& userdata)
  1099. {
  1100. bool new_value = LLView::sDebugMouseHandling;
  1101. return new_value;
  1102. }
  1103. };
  1104. ////////////////
  1105. // DEBUG KEYS //
  1106. ////////////////
  1107. class LLAdvancedToggleDebugKeys : public view_listener_t
  1108. {
  1109. bool handleEvent(const LLSD& userdata)
  1110. {
  1111. LLView::sDebugKeys = !(LLView::sDebugKeys);
  1112. return true;
  1113. }
  1114. };
  1115. class LLAdvancedCheckDebugKeys : public view_listener_t
  1116. {
  1117. bool handleEvent(const LLSD& userdata)
  1118. {
  1119. bool new_value = LLView::sDebugKeys;
  1120. return new_value;
  1121. }
  1122. };
  1123. ///////////////////////
  1124. // DEBUG WINDOW PROC //
  1125. ///////////////////////
  1126. class LLAdvancedToggleDebugWindowProc : public view_listener_t
  1127. {
  1128. bool handleEvent(const LLSD& userdata)
  1129. {
  1130. gDebugWindowProc = !(gDebugWindowProc);
  1131. return true;
  1132. }
  1133. };
  1134. class LLAdvancedCheckDebugWindowProc : public view_listener_t
  1135. {
  1136. bool handleEvent(const LLSD& userdata)
  1137. {
  1138. bool new_value = gDebugWindowProc;
  1139. return new_value;
  1140. }
  1141. };
  1142. // ------------------------------XUI MENU ---------------------------
  1143. //////////////////////
  1144. // LOAD UI FROM XML //
  1145. //////////////////////
  1146. class LLAdvancedLoadUIFromXML : public view_listener_t
  1147. {
  1148. bool handleEvent(const LLSD& userdata)
  1149. {
  1150. handle_load_from_xml(NULL);
  1151. return true;
  1152. }
  1153. };
  1154. ////////////////////
  1155. // SAVE UI TO XML //
  1156. ////////////////////
  1157. class LLAdvancedSaveUIToXML : public view_listener_t
  1158. {
  1159. bool handleEvent(const LLSD& userdata)
  1160. {
  1161. handle_save_to_xml(NULL);
  1162. return true;
  1163. }
  1164. };
  1165. class LLAdvancedSendTestIms : public view_listener_t
  1166. {
  1167. bool handleEvent(const LLSD& userdata)
  1168. {
  1169. LLIMModel::instance().testMessages();
  1170. return true;
  1171. }
  1172. };
  1173. ///////////////
  1174. // XUI NAMES //
  1175. ///////////////
  1176. class LLAdvancedToggleXUINames : public view_listener_t
  1177. {
  1178. bool handleEvent(const LLSD& userdata)
  1179. {
  1180. toggle_show_xui_names(NULL);
  1181. return true;
  1182. }
  1183. };
  1184. class LLAdvancedCheckXUINames : public view_listener_t
  1185. {
  1186. bool handleEvent(const LLSD& userdata)
  1187. {
  1188. bool new_value = check_show_xui_names(NULL);
  1189. return new_value;
  1190. }
  1191. };
  1192. ////////////////////////
  1193. // GRAB BAKED TEXTURE //
  1194. ////////////////////////
  1195. class LLAdvancedGrabBakedTexture : public view_listener_t
  1196. {
  1197. bool handleEvent(const LLSD& userdata)
  1198. {
  1199. std::string texture_type = userdata.asString();
  1200. if ("iris" == texture_type)
  1201. {
  1202. handle_grab_texture( (void*)TEX_EYES_BAKED );
  1203. }
  1204. else if ("head" == texture_type)
  1205. {
  1206. handle_grab_texture( (void*)TEX_HEAD_BAKED );
  1207. }
  1208. else if ("upper" == texture_type)
  1209. {
  1210. handle_grab_texture( (void*)TEX_UPPER_BAKED );
  1211. }
  1212. else if ("lower" == texture_type)
  1213. {
  1214. handle_grab_texture( (void*)TEX_SKIRT_BAKED );
  1215. }
  1216. else if ("skirt" == texture_type)
  1217. {
  1218. handle_grab_texture( (void*)TEX_SKIRT_BAKED );
  1219. }
  1220. else if ("hair" == texture_type)
  1221. {
  1222. handle_grab_texture( (void*)TEX_HAIR_BAKED );
  1223. }
  1224. return true;
  1225. }
  1226. };
  1227. class LLAdvancedEnableGrabBakedTexture : public view_listener_t
  1228. {
  1229. bool handleEvent(const LLSD& userdata)
  1230. {
  1231. std::string texture_type = userdata.asString();
  1232. bool new_value = false;
  1233. if ("iris" == texture_type)
  1234. {
  1235. new_value = enable_grab_texture( (void*)TEX_EYES_BAKED );
  1236. }
  1237. else if ("head" == texture_type)
  1238. {
  1239. new_value = enable_grab_texture( (void*)TEX_HEAD_BAKED );
  1240. }
  1241. else if ("upper" == texture_type)
  1242. {
  1243. new_value = enable_grab_texture( (void*)TEX_UPPER_BAKED );
  1244. }
  1245. else if ("lower" == texture_type)
  1246. {
  1247. new_value = enable_grab_texture( (void*)TEX_LOWER_BAKED );
  1248. }
  1249. else if ("skirt" == texture_type)
  1250. {
  1251. new_value = enable_grab_texture( (void*)TEX_SKIRT_BAKED );
  1252. }
  1253. return new_value;
  1254. }
  1255. };
  1256. ///////////////////////
  1257. // APPEARANCE TO XML //
  1258. ///////////////////////
  1259. class LLAdvancedAppearanceToXML : public view_listener_t
  1260. {
  1261. bool handleEvent(const LLSD& userdata)
  1262. {
  1263. LLVOAvatar::dumpArchetypeXML(NULL);
  1264. return true;
  1265. }
  1266. };
  1267. ///////////////////////////////
  1268. // TOGGLE CHARACTER GEOMETRY //
  1269. ///////////////////////////////
  1270. class LLAdvancedToggleCharacterGeometry : public view_listener_t
  1271. {
  1272. bool handleEvent(const LLSD& userdata)
  1273. {
  1274. handle_god_request_avatar_geometry(NULL);
  1275. return true;
  1276. }
  1277. };
  1278. /////////////////////////////
  1279. // TEST MALE / TEST FEMALE //
  1280. /////////////////////////////
  1281. class LLAdvancedTestMale : public view_listener_t
  1282. {
  1283. bool handleEvent(const LLSD& userdata)
  1284. {
  1285. handle_test_male(NULL);
  1286. return true;
  1287. }
  1288. };
  1289. class LLAdvancedTestFemale : public view_listener_t
  1290. {
  1291. bool handleEvent(const LLSD& userdata)
  1292. {
  1293. handle_test_female(NULL);
  1294. return true;
  1295. }
  1296. };
  1297. ///////////////
  1298. // TOGGLE PG //
  1299. ///////////////
  1300. class LLAdvancedTogglePG : public view_listener_t
  1301. {
  1302. bool handleEvent(const LLSD& userdata)
  1303. {
  1304. handle_toggle_pg(NULL);
  1305. return true;
  1306. }
  1307. };
  1308. class LLAdvancedForceParamsToDefault : public view_listener_t
  1309. {
  1310. bool handleEvent(const LLSD& userdata)
  1311. {
  1312. LLAgent::clearVisualParams(NULL);
  1313. return true;
  1314. }
  1315. };
  1316. //////////////////////////
  1317. // RELOAD VERTEX SHADER //
  1318. //////////////////////////
  1319. class LLAdvancedReloadVertexShader : public view_listener_t
  1320. {
  1321. bool handleEvent(const LLSD& userdata)
  1322. {
  1323. reload_vertex_shader(NULL);
  1324. return true;
  1325. }
  1326. };
  1327. ////////////////////
  1328. // ANIMATION INFO //
  1329. ////////////////////
  1330. class LLAdvancedToggleAnimationInfo : public view_listener_t
  1331. {
  1332. bool handleEvent(const LLSD& userdata)
  1333. {
  1334. LLVOAvatar::sShowAnimationDebug = !(LLVOAvatar::sShowAnimationDebug);
  1335. return true;
  1336. }
  1337. };
  1338. class LLAdvancedCheckAnimationInfo : public view_listener_t
  1339. {
  1340. bool handleEvent(const LLSD& userdata)
  1341. {
  1342. bool new_value = LLVOAvatar::sShowAnimationDebug;
  1343. return new_value;
  1344. }
  1345. };
  1346. //////////////////
  1347. // SHOW LOOK AT //
  1348. //////////////////
  1349. class LLAdvancedToggleShowLookAt : public view_listener_t
  1350. {
  1351. bool handleEvent(const LLSD& userdata)
  1352. {
  1353. LLHUDEffectLookAt::sDebugLookAt = !(LLHUDEffectLookAt::sDebugLookAt);
  1354. return true;
  1355. }
  1356. };
  1357. class LLAdvancedCheckShowLookAt : public view_listener_t
  1358. {
  1359. bool handleEvent(const LLSD& userdata)
  1360. {
  1361. bool new_value = LLHUDEffectLookAt::sDebugLookAt;
  1362. return new_value;
  1363. }
  1364. };
  1365. ///////////////////
  1366. // SHOW POINT AT //
  1367. ///////////////////
  1368. class LLAdvancedToggleShowPointAt : public view_listener_t
  1369. {
  1370. bool handleEvent(const LLSD& userdata)
  1371. {
  1372. LLHUDEffectPointAt::sDebugPointAt = !(LLHUDEffectPointAt::sDebugPointAt);
  1373. return true;
  1374. }
  1375. };
  1376. class LLAdvancedCheckShowPointAt : public view_listener_t
  1377. {
  1378. bool handleEvent(const LLSD& userdata)
  1379. {
  1380. bool new_value = LLHUDEffectPointAt::sDebugPointAt;
  1381. return new_value;
  1382. }
  1383. };
  1384. /////////////////////////
  1385. // DEBUG JOINT UPDATES //
  1386. /////////////////////////
  1387. class LLAdvancedToggleDebugJointUpdates : public view_listener_t
  1388. {
  1389. bool handleEvent(const LLSD& userdata)
  1390. {
  1391. LLVOAvatar::sJointDebug = !(LLVOAvatar::sJointDebug);
  1392. return true;
  1393. }
  1394. };
  1395. class LLAdvancedCheckDebugJointUpdates : public view_listener_t
  1396. {
  1397. bool handleEvent(const LLSD& userdata)
  1398. {
  1399. bool new_value = LLVOAvatar::sJointDebug;
  1400. return new_value;
  1401. }
  1402. };
  1403. /////////////////
  1404. // DISABLE LOD //
  1405. /////////////////
  1406. class LLAdvancedToggleDisableLOD : public view_listener_t
  1407. {
  1408. bool handleEvent(const LLSD& userdata)
  1409. {
  1410. LLViewerJoint::sDisableLOD = !(LLViewerJoint::sDisableLOD);
  1411. return true;
  1412. }
  1413. };
  1414. class LLAdvancedCheckDisableLOD : public view_listener_t
  1415. {
  1416. bool handleEvent(const LLSD& userdata)
  1417. {
  1418. bool new_value = LLViewerJoint::sDisableLOD;
  1419. return new_value;
  1420. }
  1421. };
  1422. /////////////////////////
  1423. // DEBUG CHARACTER VIS //
  1424. /////////////////////////
  1425. class LLAdvancedToggleDebugCharacterVis : public view_listener_t
  1426. {
  1427. bool handleEvent(const LLSD& userdata)
  1428. {
  1429. LLVOAvatar::sDebugInvisible = !(LLVOAvatar::sDebugInvisible);
  1430. return true;
  1431. }
  1432. };
  1433. class LLAdvancedCheckDebugCharacterVis : public view_listener_t
  1434. {
  1435. bool handleEvent(const LLSD& userdata)
  1436. {
  1437. bool new_value = LLVOAvatar::sDebugInvisible;
  1438. return new_value;
  1439. }
  1440. };
  1441. //////////////////////
  1442. // DUMP ATTACHMENTS //
  1443. //////////////////////
  1444. class LLAdvancedDumpAttachments : public view_listener_t
  1445. {
  1446. bool handleEvent(const LLSD& userdata)
  1447. {
  1448. handle_dump_attachments(NULL);
  1449. return true;
  1450. }
  1451. };
  1452. /////////////////////
  1453. // REBAKE TEXTURES //
  1454. /////////////////////
  1455. class LLAdvancedRebakeTextures : public view_listener_t
  1456. {
  1457. bool handleEvent(const LLSD& userdata)
  1458. {
  1459. handle_rebake_textures(NULL);
  1460. return true;
  1461. }
  1462. };
  1463. #if 1 //ndef LL_RELEASE_FOR_DOWNLOAD
  1464. ///////////////////////////
  1465. // DEBUG AVATAR TEXTURES //
  1466. ///////////////////////////
  1467. class LLAdvancedDebugAvatarTextures : public view_listener_t
  1468. {
  1469. bool handleEvent(const LLSD& userdata)
  1470. {
  1471. #ifndef LL_RELEASE_FOR_DOWNLOAD
  1472. handle_debug_avatar_textures(NULL);
  1473. #endif
  1474. return true;
  1475. }
  1476. };
  1477. ////////////////////////////////
  1478. // DUMP AVATAR LOCAL TEXTURES //
  1479. ////////////////////////////////
  1480. class LLAdvancedDumpAvatarLocalTextures : public view_listener_t
  1481. {
  1482. bool handleEvent(const LLSD& userdata)
  1483. {
  1484. #ifndef LL_RELEASE_FOR_DOWNLOAD
  1485. handle_dump_avatar_local_textures(NULL);
  1486. #endif
  1487. return true;
  1488. }
  1489. };
  1490. #endif
  1491. /////////////////
  1492. // MESSAGE LOG //
  1493. /////////////////
  1494. class LLAdvancedEnableMessageLog : public view_listener_t
  1495. {
  1496. bool handleEvent(const LLSD& userdata)
  1497. {
  1498. handle_viewer_enable_message_log(NULL);
  1499. return true;
  1500. }
  1501. };
  1502. class LLAdvancedDisableMessageLog : public view_listener_t
  1503. {
  1504. bool handleEvent(const LLSD& userdata)
  1505. {
  1506. handle_viewer_disable_message_log(NULL);
  1507. return true;
  1508. }
  1509. };
  1510. /////////////////
  1511. // DROP PACKET //
  1512. /////////////////
  1513. class LLAdvancedDropPacket : public view_listener_t
  1514. {
  1515. bool handleEvent(const LLSD& userdata)
  1516. {
  1517. gMessageSystem->mPacketRing.dropPackets(1);
  1518. return true;
  1519. }
  1520. };
  1521. /////////////////
  1522. // AGENT PILOT //
  1523. /////////////////
  1524. class LLAdvancedAgentPilot : public view_listener_t
  1525. {
  1526. bool handleEvent(const LLSD& userdata)
  1527. {
  1528. std::string command = userdata.asString();
  1529. if ("start playback" == command)
  1530. {
  1531. LLAgentPilot::startPlayback(NULL);
  1532. }
  1533. else if ("stop playback" == command)
  1534. {
  1535. LLAgentPilot::stopPlayback(NULL);
  1536. }
  1537. else if ("start record" == command)
  1538. {
  1539. LLAgentPilot::startRecord(NULL);
  1540. }
  1541. else if ("stop record" == command)
  1542. {
  1543. LLAgentPilot::saveRecord(NULL);
  1544. }
  1545. return true;
  1546. }
  1547. };
  1548. //////////////////////
  1549. // AGENT PILOT LOOP //
  1550. //////////////////////
  1551. class LLAdvancedToggleAgentPilotLoop : public view_listener_t
  1552. {
  1553. bool handleEvent(const LLSD& userdata)
  1554. {
  1555. LLAgentPilot::sLoop = !(LLAgentPilot::sLoop);
  1556. return true;
  1557. }
  1558. };
  1559. class LLAdvancedCheckAgentPilotLoop : public view_listener_t
  1560. {
  1561. bool handleEvent(const LLSD& userdata)
  1562. {
  1563. bool new_value = LLAgentPilot::sLoop;
  1564. return new_value;
  1565. }
  1566. };
  1567. /////////////////////////
  1568. // SHOW OBJECT UPDATES //
  1569. /////////////////////////
  1570. class LLAdvancedToggleShowObjectUpdates : public view_listener_t
  1571. {
  1572. bool handleEvent(const LLSD& userdata)
  1573. {
  1574. gShowObjectUpdates = !(gShowObjectUpdates);
  1575. return true;
  1576. }
  1577. };
  1578. class LLAdvancedCheckShowObjectUpdates : public view_listener_t
  1579. {
  1580. bool handleEvent(const LLSD& userdata)
  1581. {
  1582. bool new_value = gShowObjectUpdates;
  1583. return new_value;
  1584. }
  1585. };
  1586. ////////////////////
  1587. // COMPRESS IMAGE //
  1588. ////////////////////
  1589. class LLAdvancedCompressImage : public view_listener_t
  1590. {
  1591. bool handleEvent(const LLSD& userdata)
  1592. {
  1593. handle_compress_image(NULL);
  1594. return true;
  1595. }
  1596. };
  1597. /////////////////////////
  1598. // SHOW DEBUG SETTINGS //
  1599. /////////////////////////
  1600. class LLAdvancedShowDebugSettings : public view_listener_t
  1601. {
  1602. bool handleEvent(const LLSD& userdata)
  1603. {
  1604. LLFloaterReg::showInstance("settings_debug",userdata);
  1605. return true;
  1606. }
  1607. };
  1608. ////////////////////////
  1609. // VIEW ADMIN OPTIONS //
  1610. ////////////////////////
  1611. class LLAdvancedToggleViewAdminOptions : public view_listener_t
  1612. {
  1613. bool handleEvent(const LLSD& userdata)
  1614. {
  1615. handle_admin_override_toggle(NULL);
  1616. return true;
  1617. }
  1618. };
  1619. class LLAdvancedCheckViewAdminOptions : public view_listener_t
  1620. {
  1621. bool handleEvent(const LLSD& userdata)
  1622. {
  1623. bool new_value = check_admin_override(NULL);
  1624. return new_value;
  1625. }
  1626. };
  1627. /////////////////////////////////////
  1628. // Enable Object Object Occlusion ///
  1629. /////////////////////////////////////
  1630. class LLAdvancedEnableObjectObjectOcclusion: public view_listener_t
  1631. {
  1632. bool handleEvent(const LLSD& userdata)
  1633. {
  1634. bool new_value = gGLManager.mHasOcclusionQuery; // && LLFeatureManager::getInstance()->isFeatureAvailable(userdata.asString());
  1635. return new_value;
  1636. }
  1637. };
  1638. /////////////////////////////////////
  1639. // Enable Framebuffer Objects   ///
  1640. /////////////////////////////////////
  1641. class LLAdvancedEnableRenderFBO: public view_listener_t
  1642. {
  1643. bool handleEvent(const LLSD& userdata)
  1644. {
  1645. bool new_value = gGLManager.mHasFramebufferObject;
  1646. return new_value;
  1647. }
  1648. };
  1649. /////////////////////////////////////
  1650. // Enable Deferred Rendering   ///
  1651. /////////////////////////////////////
  1652. class LLAdvancedEnableRenderDeferred: public view_listener_t
  1653. {
  1654. bool handleEvent(const LLSD& userdata)
  1655. {
  1656. bool new_value = gSavedSettings.getBOOL("RenderUseFBO") && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_WINDLIGHT > 0) &&
  1657. LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) > 0;
  1658. return new_value;
  1659. }
  1660. };
  1661. /////////////////////////////////////
  1662. // Enable Global Illumination    ///
  1663. /////////////////////////////////////
  1664. class LLAdvancedEnableRenderDeferredGI: public view_listener_t
  1665. {
  1666. bool handleEvent(const LLSD& userdata)
  1667. {
  1668. bool new_value = gSavedSettings.getBOOL("RenderUseFBO") && gSavedSettings.getBOOL("RenderDeferred");
  1669. return new_value;
  1670. }
  1671. };
  1672. //////////////////
  1673. // ADMIN STATUS //
  1674. //////////////////
  1675. class LLAdvancedRequestAdminStatus : public view_listener_t
  1676. {
  1677. bool handleEvent(const LLSD& userdata)
  1678. {
  1679. handle_god_mode(NULL);
  1680. return true;
  1681. }
  1682. };
  1683. class LLAdvancedLeaveAdminStatus : public view_listener_t
  1684. {
  1685. bool handleEvent(const LLSD& userdata)
  1686. {
  1687. handle_leave_god_mode(NULL);
  1688. return true;
  1689. }
  1690. };
  1691. //////////////////////////
  1692. // Advanced > Debugging //
  1693. //////////////////////////
  1694. class LLAdvancedForceErrorBreakpoint : public view_listener_t
  1695. {
  1696. bool handleEvent(const LLSD& userdata)
  1697. {
  1698. force_error_breakpoint(NULL);
  1699. return true;
  1700. }
  1701. };
  1702. class LLAdvancedForceErrorLlerror : public view_listener_t
  1703. {
  1704. bool handleEvent(const LLSD& userdata)
  1705. {
  1706. force_error_llerror(NULL);
  1707. return true;
  1708. }
  1709. };
  1710. class LLAdvancedForceErrorBadMemoryAccess : public view_listener_t
  1711. {
  1712. bool handleEvent(const LLSD& userdata)
  1713. {
  1714. force_error_bad_memory_access(NULL);
  1715. return true;
  1716. }
  1717. };
  1718. class LLAdvancedForceErrorInfiniteLoop : public view_listener_t
  1719. {
  1720. bool handleEvent(const LLSD& userdata)
  1721. {
  1722. force_error_infinite_loop(NULL);
  1723. return true;
  1724. }
  1725. };
  1726. class LLAdvancedForceErrorSoftwareException : public view_listener_t
  1727. {
  1728. bool handleEvent(const LLSD& userdata)
  1729. {
  1730. force_error_software_exception(NULL);
  1731. return true;
  1732. }
  1733. };
  1734. class LLAdvancedForceErrorDriverCrash : public view_listener_t
  1735. {
  1736. bool handleEvent(const LLSD& userdata)
  1737. {
  1738. force_error_driver_crash(NULL);
  1739. return true;
  1740. }
  1741. };
  1742. class LLAdvancedForceErrorDisconnectViewer : public view_listener_t
  1743. {
  1744. bool handleEvent(const LLSD& userdata)
  1745. {
  1746. handle_disconnect_viewer(NULL);
  1747. return true;
  1748. }
  1749. };
  1750. #ifdef TOGGLE_HACKED_GODLIKE_VIEWER
  1751. class LLAdvancedHandleToggleHackedGodmode : public view_listener_t
  1752. {
  1753. bool handleEvent(const LLSD& userdata)
  1754. {
  1755. handle_toggle_hacked_godmode(NULL);
  1756. return true;
  1757. }
  1758. };
  1759. class LLAdvancedCheckToggleHackedGodmode : public view_listener_t
  1760. {
  1761. bool handleEvent(const LLSD& userdata)
  1762. {
  1763. check_toggle_hacked_godmode(NULL);
  1764. return true;
  1765. }
  1766. };
  1767. class LLAdvancedEnableToggleHackedGodmode : public view_listener_t
  1768. {
  1769. bool handleEvent(const LLSD& userdata)
  1770. {
  1771. bool new_value = enable_toggle_hacked_godmode(NULL);
  1772. return new_value;
  1773. }
  1774. };
  1775. #endif
  1776. //
  1777. ////-------------------------------------------------------------------
  1778. //// Advanced menu
  1779. ////-------------------------------------------------------------------
  1780. //////////////////
  1781. // ADMIN MENU   //
  1782. //////////////////
  1783. // Admin > Object
  1784. class LLAdminForceTakeCopy : public view_listener_t
  1785. {
  1786. bool handleEvent(const LLSD& userdata)
  1787. {
  1788. force_take_copy(NULL);
  1789. return true;
  1790. }
  1791. };
  1792. class LLAdminHandleObjectOwnerSelf : public view_listener_t
  1793. {
  1794. bool handleEvent(const LLSD& userdata)
  1795. {
  1796. handle_object_owner_self(NULL);
  1797. return true;
  1798. }
  1799. };
  1800. class LLAdminHandleObjectOwnerPermissive : public view_listener_t
  1801. {
  1802. bool handleEvent(const LLSD& userdata)
  1803. {
  1804. handle_object_owner_permissive(NULL);
  1805. return true;
  1806. }
  1807. };
  1808. class LLAdminHandleForceDelete : public view_listener_t
  1809. {
  1810. bool handleEvent(const LLSD& userdata)
  1811. {
  1812. handle_force_delete(NULL);
  1813. return true;
  1814. }
  1815. };
  1816. class LLAdminHandleObjectLock : public view_listener_t
  1817. {
  1818. bool handleEvent(const LLSD& userdata)
  1819. {
  1820. handle_object_lock(NULL);
  1821. return true;
  1822. }
  1823. };
  1824. class LLAdminHandleObjectAssetIDs: public view_listener_t
  1825. {
  1826. bool handleEvent(const LLSD& userdata)
  1827. {
  1828. handle_object_asset_ids(NULL);
  1829. return true;
  1830. }
  1831. };
  1832. //Admin >Parcel
  1833. class LLAdminHandleForceParcelOwnerToMe: public view_listener_t
  1834. {
  1835. bool handleEvent(const LLSD& userdata)
  1836. {
  1837. handle_force_parcel_owner_to_me(NULL);
  1838. return true;
  1839. }
  1840. };
  1841. class LLAdminHandleForceParcelToContent: public view_listener_t
  1842. {
  1843. bool handleEvent(const LLSD& userdata)
  1844. {
  1845. handle_force_parcel_to_content(NULL);
  1846. return true;
  1847. }
  1848. };
  1849. class LLAdminHandleClaimPublicLand: public view_listener_t
  1850. {
  1851. bool handleEvent(const LLSD& userdata)
  1852. {
  1853. handle_claim_public_land(NULL);
  1854. return true;
  1855. }
  1856. };
  1857. // Admin > Region
  1858. class LLAdminHandleRegionDumpTempAssetData: public view_listener_t
  1859. {
  1860. bool handleEvent(const LLSD& userdata)
  1861. {
  1862. handle_region_dump_temp_asset_data(NULL);
  1863. return true;
  1864. }
  1865. };
  1866. //Admin (Top Level)
  1867. class LLAdminOnSaveState: public view_listener_t
  1868. {
  1869. bool handleEvent(const LLSD& userdata)
  1870. {
  1871. LLPanelRegionTools::onSaveState(NULL);
  1872. return true;
  1873. }
  1874. };
  1875. //-----------------------------------------------------------------------------
  1876. // cleanup_menus()
  1877. //-----------------------------------------------------------------------------
  1878. void cleanup_menus()
  1879. {
  1880. delete gMenuParcelObserver;
  1881. gMenuParcelObserver = NULL;
  1882. delete gMenuAvatarSelf;
  1883. gMenuAvatarSelf = NULL;
  1884. delete gMenuAvatarOther;
  1885. gMenuAvatarOther = NULL;
  1886. delete gMenuObject;
  1887. gMenuObject = NULL;
  1888. delete gMenuAttachmentSelf;
  1889. gMenuAttachmentSelf = NULL;
  1890. delete gMenuAttachmentOther;
  1891. gMenuAttachmentSelf = NULL;
  1892. delete gMenuLand;
  1893. gMenuLand = NULL;
  1894. delete gMenuBarView;
  1895. gMenuBarView = NULL;
  1896. delete gPopupMenuView;
  1897. gPopupMenuView = NULL;
  1898. delete gMenuHolder;
  1899. gMenuHolder = NULL;
  1900. }
  1901. //-----------------------------------------------------------------------------
  1902. // Object pie menu
  1903. //-----------------------------------------------------------------------------
  1904. class LLObjectReportAbuse : public view_listener_t
  1905. {
  1906. bool handleEvent(const LLSD& userdata)
  1907. {
  1908. LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
  1909. if (objectp)
  1910. {
  1911. LLFloaterReporter::showFromObject(objectp->getID());
  1912. }
  1913. return true;
  1914. }
  1915. };
  1916. // Enabled it you clicked an object
  1917. class LLObjectEnableReportAbuse : public view_listener_t
  1918. {
  1919. bool handleEvent(const LLSD& userdata)
  1920. {
  1921. bool new_value = LLSelectMgr::getInstance()->getSelection()->getObjectCount() != 0;
  1922. return new_value;
  1923. }
  1924. };
  1925. void handle_object_touch()
  1926. {
  1927. LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
  1928. if (!object) return;
  1929. LLPickInfo pick = LLToolPie::getInstance()->getPick();
  1930. LLMessageSystem *msg = gMessageSystem;
  1931. msg->newMessageFast(_PREHASH_ObjectGrab);
  1932. msg->nextBlockFast( _PREHASH_AgentData);
  1933. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  1934. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  1935. msg->nextBlockFast( _PREHASH_ObjectData);
  1936. msg->addU32Fast(    _PREHASH_LocalID, object->mLocalID);
  1937. msg->addVector3Fast(_PREHASH_GrabOffset, LLVector3::zero );
  1938. msg->nextBlock("SurfaceInfo");
  1939. msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
  1940. msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
  1941. msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
  1942. msg->addVector3("Position", pick.mIntersection);
  1943. msg->addVector3("Normal", pick.mNormal);
  1944. msg->addVector3("Binormal", pick.mBinormal);
  1945. msg->sendMessage( object->getRegion()->getHost());
  1946. // *NOTE: Hope the packets arrive safely and in order or else
  1947. // there will be some problems.
  1948. // *TODO: Just fix this bad assumption.
  1949. msg->newMessageFast(_PREHASH_ObjectDeGrab);
  1950. msg->nextBlockFast(_PREHASH_AgentData);
  1951. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  1952. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  1953. msg->nextBlockFast(_PREHASH_ObjectData);
  1954. msg->addU32Fast(_PREHASH_LocalID, object->mLocalID);
  1955. msg->nextBlock("SurfaceInfo");
  1956. msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
  1957. msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
  1958. msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
  1959. msg->addVector3("Position", pick.mIntersection);
  1960. msg->addVector3("Normal", pick.mNormal);
  1961. msg->addVector3("Binormal", pick.mBinormal);
  1962. msg->sendMessage(object->getRegion()->getHost());
  1963. }
  1964. bool enable_object_touch()
  1965. {
  1966. LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
  1967. return obj && obj->flagHandleTouch();
  1968. }
  1969. // One object must have touch sensor
  1970. class LLObjectEnableTouch : public view_listener_t
  1971. {
  1972. bool handleEvent(const LLSD& userdata)
  1973. {
  1974. bool new_value = enable_object_touch();
  1975. // Update label based on the node touch name if available.
  1976. std::string touch_text;
  1977. LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode();
  1978. if (node && node->mValid && !node->mTouchName.empty())
  1979. {
  1980. touch_text = node->mTouchName;
  1981. }
  1982. else
  1983. {
  1984. touch_text = userdata.asString();
  1985. }
  1986. gMenuHolder->childSetText("Object Touch", touch_text);
  1987. gMenuHolder->childSetText("Attachment Object Touch", touch_text);
  1988. return new_value;
  1989. }
  1990. };
  1991. //void label_touch(std::string& label, void*)
  1992. //{
  1993. // LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode();
  1994. // if (node && node->mValid && !node->mTouchName.empty())
  1995. // {
  1996. // label.assign(node->mTouchName);
  1997. // }
  1998. // else
  1999. // {
  2000. // label.assign("Touch");
  2001. // }
  2002. //}
  2003. void handle_object_open()
  2004. {
  2005. LLFloaterReg::showInstance("openobject");
  2006. }
  2007. bool enable_object_open()
  2008. {
  2009. // Look for contents in root object, which is all the LLFloaterOpenObject
  2010. // understands.
  2011. LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
  2012. if (!obj) return false;
  2013. LLViewerObject* root = obj->getRootEdit();
  2014. if (!root) return false;
  2015. return root->allowOpen();
  2016. }
  2017. class LLViewJoystickFlycam : public view_listener_t
  2018. {
  2019. bool handleEvent(const LLSD& userdata)
  2020. {
  2021. handle_toggle_flycam();
  2022. return true;
  2023. }
  2024. };
  2025. class LLViewCheckJoystickFlycam : public view_listener_t
  2026. {
  2027. bool handleEvent(const LLSD& userdata)
  2028. {
  2029. bool new_value = LLViewerJoystick::getInstance()->getOverrideCamera();
  2030. return new_value;
  2031. }
  2032. };
  2033. void handle_toggle_flycam()
  2034. {
  2035. LLViewerJoystick::getInstance()->toggleFlycam();
  2036. }
  2037. class LLObjectBuild : public view_listener_t
  2038. {
  2039. bool handleEvent(const LLSD& userdata)
  2040. {
  2041. if (gAgent.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit() && gSavedSettings.getBOOL("EditCameraMovement") )
  2042. {
  2043. // zoom in if we're looking at the avatar
  2044. gAgent.setFocusOnAvatar(FALSE, ANIMATE);
  2045. gAgent.setFocusGlobal(LLToolPie::getInstance()->getPick());
  2046. gAgent.cameraZoomIn(0.666f);
  2047. gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD );
  2048. gViewerWindow->moveCursorToCenter();
  2049. }
  2050. else if ( gSavedSettings.getBOOL("EditCameraMovement") )
  2051. {
  2052. gAgent.setFocusGlobal(LLToolPie::getInstance()->getPick());
  2053. gViewerWindow->moveCursorToCenter();
  2054. }
  2055. LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
  2056. LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolCompCreate::getInstance() );
  2057. // Could be first use
  2058. //LLFirstUse::useBuild();
  2059. return true;
  2060. }
  2061. };
  2062. void handle_object_edit()
  2063. {
  2064. LLViewerParcelMgr::getInstance()->deselectLand();
  2065. if (gAgent.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit())
  2066. {
  2067. LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
  2068. if (selection->getSelectType() == SELECT_TYPE_HUD || !gSavedSettings.getBOOL("EditCameraMovement"))
  2069. {
  2070. // always freeze camera in space, even if camera doesn't move
  2071. // so, for example, follow cam scripts can't affect you when in build mode
  2072. gAgent.setFocusGlobal(gAgent.calcFocusPositionTargetGlobal(), LLUUID::null);
  2073. gAgent.setFocusOnAvatar(FALSE, ANIMATE);
  2074. }
  2075. else
  2076. {
  2077. gAgent.setFocusOnAvatar(FALSE, ANIMATE);
  2078. LLViewerObject* selected_objectp = selection->getFirstRootObject();
  2079. if (selected_objectp)
  2080. {
  2081.   // zoom in on object center instead of where we clicked, as we need to see the manipulator handles
  2082.   gAgent.setFocusGlobal(selected_objectp->getPositionGlobal(), selected_objectp->getID());
  2083.   gAgent.cameraZoomIn(0.666f);
  2084.   gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD );
  2085.   gViewerWindow->moveCursorToCenter();
  2086. }
  2087. }
  2088. }
  2089. LLFloaterReg::showInstance("build");
  2090. LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
  2091. gFloaterTools->setEditTool( LLToolCompTranslate::getInstance() );
  2092. LLViewerJoystick::getInstance()->moveObjects(true);
  2093. LLViewerJoystick::getInstance()->setNeedsReset(true);
  2094. // Could be first use
  2095. //LLFirstUse::useBuild();
  2096. return;
  2097. }
  2098. void handle_object_inspect()
  2099. {
  2100. LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
  2101. LLViewerObject* selected_objectp = selection->getFirstRootObject();
  2102. if (selected_objectp)
  2103. {
  2104. LLSD key;
  2105. key["task"] = "task";
  2106. LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
  2107. }
  2108. /*
  2109. // Old floater properties
  2110. LLFloaterReg::showInstance("inspect", LLSD());
  2111. */
  2112. }
  2113. //---------------------------------------------------------------------------
  2114. // Land pie menu
  2115. //---------------------------------------------------------------------------
  2116. class LLLandBuild : public view_listener_t
  2117. {
  2118. bool handleEvent(const LLSD& userdata)
  2119. {
  2120. LLViewerParcelMgr::getInstance()->deselectLand();
  2121. if (gAgent.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit() && gSavedSettings.getBOOL("EditCameraMovement") )
  2122. {
  2123. // zoom in if we're looking at the avatar
  2124. gAgent.setFocusOnAvatar(FALSE, ANIMATE);
  2125. gAgent.setFocusGlobal(LLToolPie::getInstance()->getPick());
  2126. gAgent.cameraZoomIn(0.666f);
  2127. gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD );
  2128. gViewerWindow->moveCursorToCenter();
  2129. }
  2130. else if ( gSavedSettings.getBOOL("EditCameraMovement")  )
  2131. {
  2132. // otherwise just move focus
  2133. gAgent.setFocusGlobal(LLToolPie::getInstance()->getPick());
  2134. gViewerWindow->moveCursorToCenter();
  2135. }
  2136. LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
  2137. LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolCompCreate::getInstance() );
  2138. // Could be first use
  2139. //LLFirstUse::useBuild();
  2140. return true;
  2141. }
  2142. };
  2143. class LLLandBuyPass : public view_listener_t
  2144. {
  2145. bool handleEvent(const LLSD& userdata)
  2146. {
  2147. LLPanelLandGeneral::onClickBuyPass((void *)FALSE);
  2148. return true;
  2149. }
  2150. };
  2151. class LLLandEnableBuyPass : public view_listener_t
  2152. {
  2153. bool handleEvent(const LLSD& userdata)
  2154. {
  2155. bool new_value = LLPanelLandGeneral::enableBuyPass(NULL);
  2156. return new_value;
  2157. }
  2158. };
  2159. // BUG: Should really check if CLICK POINT is in a parcel where you can build.
  2160. BOOL enable_land_build(void*)
  2161. {
  2162. if (gAgent.isGodlike()) return TRUE;
  2163. if (gAgent.inPrelude()) return FALSE;
  2164. BOOL can_build = FALSE;
  2165. LLParcel* agent_parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
  2166. if (agent_parcel)
  2167. {
  2168. can_build = agent_parcel->getAllowModify();
  2169. }
  2170. return can_build;
  2171. }
  2172. // BUG: Should really check if OBJECT is in a parcel where you can build.
  2173. BOOL enable_object_build(void*)
  2174. {
  2175. if (gAgent.isGodlike()) return TRUE;
  2176. if (gAgent.inPrelude()) return FALSE;
  2177. BOOL can_build = FALSE;
  2178. LLParcel* agent_parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
  2179. if (agent_parcel)
  2180. {
  2181. can_build = agent_parcel->getAllowModify();
  2182. }
  2183. return can_build;
  2184. }
  2185. bool enable_object_edit()
  2186. {
  2187. // *HACK:  The new "prelude" Help Islands have a build sandbox area,
  2188. // so users need the Edit and Create pie menu options when they are
  2189. // there.  Eventually this needs to be replaced with code that only 
  2190. // lets you edit objects if you have permission to do so (edit perms,
  2191. // group edit, god).  See also lltoolbar.cpp.  JC
  2192. bool enable = false;
  2193. if (gAgent.inPrelude())
  2194. {
  2195. enable = LLViewerParcelMgr::getInstance()->allowAgentBuild()
  2196. || LLSelectMgr::getInstance()->getSelection()->isAttachment();
  2197. else if (LLSelectMgr::getInstance()->selectGetAllValidAndObjectsFound())
  2198. {
  2199. enable = true;
  2200. }
  2201. return enable;
  2202. }
  2203. // mutually exclusive - show either edit option or build in menu
  2204. bool enable_object_build()
  2205. {
  2206. return !enable_object_edit();
  2207. }
  2208. class LLSelfRemoveAllAttachments : public view_listener_t
  2209. {
  2210. bool handleEvent(const LLSD& userdata)
  2211. {
  2212. LLAgentWearables::userRemoveAllAttachments();
  2213. return true;
  2214. }
  2215. };
  2216. class LLSelfEnableRemoveAllAttachments : public view_listener_t
  2217. {
  2218. bool handleEvent(const LLSD& userdata)
  2219. {
  2220. bool new_value = false;
  2221. if (gAgent.getAvatarObject())
  2222. {
  2223. LLVOAvatar* avatarp = gAgent.getAvatarObject();
  2224. for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); 
  2225.  iter != avatarp->mAttachmentPoints.end(); )
  2226. {
  2227. LLVOAvatar::attachment_map_t::iterator curiter = iter++;
  2228. LLViewerJointAttachment* attachment = curiter->second;
  2229. if (attachment->getNumObjects() > 0)
  2230. {
  2231. new_value = true;
  2232. break;
  2233. }
  2234. }
  2235. }
  2236. return new_value;
  2237. }
  2238. };
  2239. BOOL enable_has_attachments(void*)
  2240. {
  2241. return FALSE;
  2242. }
  2243. //---------------------------------------------------------------------------
  2244. // Avatar pie menu
  2245. //---------------------------------------------------------------------------
  2246. //void handle_follow(void *userdata)
  2247. //{
  2248. // // follow a given avatar by ID
  2249. // LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
  2250. // if (objectp)
  2251. // {
  2252. // gAgent.startFollowPilot(objectp->getID());
  2253. // }
  2254. //}
  2255. bool enable_object_mute()
  2256. {
  2257. LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
  2258. if (!object) return false;
  2259. LLVOAvatar* avatar = find_avatar_from_object(object); 
  2260. if (avatar)
  2261. {
  2262. // It's an avatar
  2263. LLNameValue *lastname = avatar->getNVPair("LastName");
  2264. bool is_linden =
  2265. lastname && !LLStringUtil::compareStrings(lastname->getString(), "Linden");
  2266. bool is_self = avatar->isSelf();
  2267. return !is_linden && !is_self;
  2268. }
  2269. else
  2270. {
  2271. // Just a regular object
  2272. return LLSelectMgr::getInstance()->getSelection()->
  2273. contains( object, SELECT_ALL_TES );
  2274. }
  2275. }
  2276. class LLObjectMute : public view_listener_t
  2277. {
  2278. bool handleEvent(const LLSD& userdata)
  2279. {
  2280. LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
  2281. if (!object) return true;
  2282. LLUUID id;
  2283. std::string name;
  2284. LLMute::EType type;
  2285. LLVOAvatar* avatar = find_avatar_from_object(object); 
  2286. if (avatar)
  2287. {
  2288. id = avatar->getID();
  2289. LLNameValue *firstname = avatar->getNVPair("FirstName");
  2290. LLNameValue *lastname = avatar->getNVPair("LastName");
  2291. if (firstname && lastname)
  2292. {
  2293. name = firstname->getString();
  2294. name += " ";
  2295. name += lastname->getString();
  2296. }
  2297. type = LLMute::AGENT;
  2298. }
  2299. else
  2300. {
  2301. // it's an object
  2302. id = object->getID();
  2303. LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode();
  2304. if (node)
  2305. {
  2306. name = node->mName;
  2307. }
  2308. type = LLMute::OBJECT;
  2309. }
  2310. LLMute mute(id, name, type);
  2311. if (LLMuteList::getInstance()->isMuted(mute.mID, mute.mName))
  2312. {
  2313. LLMuteList::getInstance()->remove(mute);
  2314. }
  2315. else
  2316. {
  2317. LLMuteList::getInstance()->add(mute);
  2318. LLPanelBlockedList::showPanelAndSelect(mute.mID);
  2319. }
  2320. return true;
  2321. }
  2322. };
  2323. bool handle_go_to()
  2324. {
  2325. // try simulator autopilot
  2326. std::vector<std::string> strings;
  2327. std::string val;
  2328. LLVector3d pos = LLToolPie::getInstance()->getPick().mPosGlobal;
  2329. val = llformat("%g", pos.mdV[VX]);
  2330. strings.push_back(val);
  2331. val = llformat("%g", pos.mdV[VY]);
  2332. strings.push_back(val);
  2333. val = llformat("%g", pos.mdV[VZ]);
  2334. strings.push_back(val);
  2335. send_generic_message("autopilot", strings);
  2336. LLViewerParcelMgr::getInstance()->deselectLand();
  2337. if (gAgent.getAvatarObject() && !gSavedSettings.getBOOL("AutoPilotLocksCamera"))
  2338. {
  2339. gAgent.setFocusGlobal(gAgent.getFocusTargetGlobal(), gAgent.getAvatarObject()->getID());
  2340. }
  2341. else 
  2342. {
  2343. // Snap camera back to behind avatar
  2344. gAgent.setFocusOnAvatar(TRUE, ANIMATE);
  2345. }
  2346. // Could be first use
  2347. //LLFirstUse::useGoTo();
  2348. return true;
  2349. }
  2350. class LLGoToObject : public view_listener_t
  2351. {
  2352. bool handleEvent(const LLSD& userdata)
  2353. {
  2354. return handle_go_to();
  2355. }
  2356. };
  2357. class LLAvatarReportAbuse : public view_listener_t
  2358. {
  2359. bool handleEvent(const LLSD& userdata)
  2360. {
  2361. LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
  2362. if(avatar)
  2363. {
  2364. LLFloaterReporter::showFromObject(avatar->getID());
  2365. }
  2366. return true;
  2367. }
  2368. };
  2369. //---------------------------------------------------------------------------
  2370. // Parcel freeze, eject, etc.
  2371. //---------------------------------------------------------------------------
  2372. bool callback_freeze(const LLSD& notification, const LLSD& response)
  2373. {
  2374. LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
  2375. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  2376. if (0 == option || 1 == option)
  2377. {
  2378. U32 flags = 0x0;
  2379. if (1 == option)
  2380. {
  2381. // unfreeze
  2382. flags |= 0x1;
  2383. }
  2384. LLMessageSystem* msg = gMessageSystem;
  2385. LLViewerObject* avatar = gObjectList.findObject(avatar_id);
  2386. if (avatar)
  2387. {
  2388. msg->newMessage("FreezeUser");
  2389. msg->nextBlock("AgentData");
  2390. msg->addUUID("AgentID", gAgent.getID());
  2391. msg->addUUID("SessionID", gAgent.getSessionID());
  2392. msg->nextBlock("Data");
  2393. msg->addUUID("TargetID", avatar_id );
  2394. msg->addU32("Flags", flags );
  2395. msg->sendReliable( avatar->getRegion()->getHost() );
  2396. }
  2397. }
  2398. return false;
  2399. }
  2400. void handle_avatar_freeze(const LLSD& avatar_id)
  2401. {
  2402. // Use avatar_id if available, otherwise default to right-click avatar
  2403. LLVOAvatar* avatar = NULL;
  2404. if (avatar_id.asUUID().notNull())
  2405. {
  2406. avatar = find_avatar_from_object(avatar_id.asUUID());
  2407. }
  2408. else
  2409. {
  2410. avatar = find_avatar_from_object(
  2411. LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
  2412. }
  2413. if( avatar )
  2414. {
  2415. std::string fullname = avatar->getFullname();
  2416. LLSD payload;
  2417. payload["avatar_id"] = avatar->getID();
  2418. if (!fullname.empty())
  2419. {
  2420. LLSD args;
  2421. args["AVATAR_NAME"] = fullname;
  2422. LLNotificationsUtil::add("FreezeAvatarFullname",
  2423. args,
  2424. payload,
  2425. callback_freeze);
  2426. }
  2427. else
  2428. {
  2429. LLNotificationsUtil::add("FreezeAvatar",
  2430. LLSD(),
  2431. payload,
  2432. callback_freeze);
  2433. }
  2434. }
  2435. }
  2436. class LLAvatarVisibleDebug : public view_listener_t
  2437. {
  2438. bool handleEvent(const LLSD& userdata)
  2439. {
  2440. return gAgent.isGodlike();
  2441. }
  2442. };
  2443. class LLAvatarDebug : public view_listener_t
  2444. {
  2445. bool handleEvent(const LLSD& userdata)
  2446. {
  2447. LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
  2448. if( avatar )
  2449. {
  2450. if (avatar->isSelf())
  2451. {
  2452. ((LLVOAvatarSelf *)avatar)->dumpLocalTextures();
  2453. }
  2454. llinfos << "Dumping temporary asset data to simulator logs for avatar " << avatar->getID() << llendl;
  2455. std::vector<std::string> strings;
  2456. strings.push_back(avatar->getID().asString());
  2457. LLUUID invoice;
  2458. send_generic_message("dumptempassetdata", strings, invoice);
  2459. LLFloaterReg::showInstance( "avatar_textures", LLSD(avatar->getID()) );
  2460. }
  2461. return true;
  2462. }
  2463. };
  2464. bool callback_eject(const LLSD& notification, const LLSD& response)
  2465. {
  2466. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  2467. if (2 == option)
  2468. {
  2469. // Cancel button.
  2470. return false;
  2471. }
  2472. LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
  2473. bool ban_enabled = notification["payload"]["ban_enabled"].asBoolean();
  2474. if (0 == option)
  2475. {
  2476. // Eject button
  2477. LLMessageSystem* msg = gMessageSystem;
  2478. LLViewerObject* avatar = gObjectList.findObject(avatar_id);
  2479. if (avatar)
  2480. {
  2481. U32 flags = 0x0;
  2482. msg->newMessage("EjectUser");
  2483. msg->nextBlock("AgentData");
  2484. msg->addUUID("AgentID", gAgent.getID() );
  2485. msg->addUUID("SessionID", gAgent.getSessionID() );
  2486. msg->nextBlock("Data");
  2487. msg->addUUID("TargetID", avatar_id );
  2488. msg->addU32("Flags", flags );
  2489. msg->sendReliable( avatar->getRegion()->getHost() );
  2490. }
  2491. }
  2492. else if (ban_enabled)
  2493. {
  2494. // This is tricky. It is similar to say if it is not an 'Eject' button,
  2495. // and it is also not an 'Cancle' button, and ban_enabled==ture, 
  2496. // it should be the 'Eject and Ban' button.
  2497. LLMessageSystem* msg = gMessageSystem;
  2498. LLViewerObject* avatar = gObjectList.findObject(avatar_id);
  2499. if (avatar)
  2500. {
  2501. U32 flags = 0x1;
  2502. msg->newMessage("EjectUser");
  2503. msg->nextBlock("AgentData");
  2504. msg->addUUID("AgentID", gAgent.getID() );
  2505. msg->addUUID("SessionID", gAgent.getSessionID() );
  2506. msg->nextBlock("Data");
  2507. msg->addUUID("TargetID", avatar_id );
  2508. msg->addU32("Flags", flags );
  2509. msg->sendReliable( avatar->getRegion()->getHost() );
  2510. }
  2511. }
  2512. return false;
  2513. }
  2514. void handle_avatar_eject(const LLSD& avatar_id)
  2515. {
  2516. // Use avatar_id if available, otherwise default to right-click avatar
  2517. LLVOAvatar* avatar = NULL;
  2518. if (avatar_id.asUUID().notNull())
  2519. {
  2520. avatar = find_avatar_from_object(avatar_id.asUUID());
  2521. }
  2522. else
  2523. {
  2524. avatar = find_avatar_from_object(
  2525. LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
  2526. }
  2527. if( avatar )
  2528. {
  2529. LLSD payload;
  2530. payload["avatar_id"] = avatar->getID();
  2531. std::string fullname = avatar->getFullname();
  2532. const LLVector3d& pos = avatar->getPositionGlobal();
  2533. LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos)->getParcel();
  2534. if (LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_MANAGE_BANNED))
  2535. {
  2536.                 payload["ban_enabled"] = true;
  2537. if (!fullname.empty())
  2538. {
  2539.      LLSD args;
  2540.      args["AVATAR_NAME"] = fullname;
  2541.      LLNotificationsUtil::add("EjectAvatarFullname",
  2542.      args,
  2543.      payload,
  2544.      callback_eject);
  2545. }
  2546. else
  2547. {
  2548.      LLNotificationsUtil::add("EjectAvatarFullname",
  2549.      LLSD(),
  2550.      payload,
  2551.      callback_eject);
  2552. }
  2553. }
  2554. else
  2555. {
  2556.                 payload["ban_enabled"] = false;
  2557. if (!fullname.empty())
  2558. {
  2559.      LLSD args;
  2560.      args["AVATAR_NAME"] = fullname;
  2561.      LLNotificationsUtil::add("EjectAvatarFullnameNoBan",
  2562.      args,
  2563.      payload,
  2564.      callback_eject);
  2565. }
  2566. else
  2567. {
  2568.      LLNotificationsUtil::add("EjectAvatarNoBan",
  2569.      LLSD(),
  2570.      payload,
  2571.      callback_eject);
  2572. }
  2573. }
  2574. }
  2575. }
  2576. bool enable_freeze_eject(const LLSD& avatar_id)
  2577. {
  2578. // Use avatar_id if available, otherwise default to right-click avatar
  2579. LLVOAvatar* avatar = NULL;
  2580. if (avatar_id.asUUID().notNull())
  2581. {
  2582. avatar = find_avatar_from_object(avatar_id.asUUID());
  2583. }
  2584. else
  2585. {
  2586. avatar = find_avatar_from_object(
  2587. LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
  2588. }
  2589. if (!avatar) return false;
  2590. // Gods can always freeze
  2591. if (gAgent.isGodlike()) return true;
  2592. // Estate owners / managers can freeze
  2593. // Parcel owners can also freeze
  2594. const LLVector3& pos = avatar->getPositionRegion();
  2595. const LLVector3d& pos_global = avatar->getPositionGlobal();
  2596. LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel();
  2597. LLViewerRegion* region = avatar->getRegion();
  2598. if (!region) return false;
  2599. bool new_value = region->isOwnedSelf(pos);
  2600. if (!new_value || region->isOwnedGroup(pos))
  2601. {
  2602. new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN);
  2603. }
  2604. return new_value;
  2605. }
  2606. class LLAvatarGiveCard : public view_listener_t
  2607. {
  2608. bool handleEvent(const LLSD& userdata)
  2609. {
  2610. llinfos << "handle_give_card()" << llendl;
  2611. LLViewerObject* dest = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
  2612. if(dest && dest->isAvatar())
  2613. {
  2614. bool found_name = false;
  2615. LLSD args;
  2616. LLSD old_args;
  2617. LLNameValue* nvfirst = dest->getNVPair("FirstName");
  2618. LLNameValue* nvlast = dest->getNVPair("LastName");
  2619. if(nvfirst && nvlast)
  2620. {
  2621. args["FIRST"] = nvfirst->getString();
  2622. args["LAST"] = nvlast->getString();
  2623. old_args["FIRST"] = nvfirst->getString();
  2624. old_args["LAST"] = nvlast->getString();
  2625. found_name = true;
  2626. }
  2627. LLViewerRegion* region = dest->getRegion();
  2628. LLHost dest_host;
  2629. if(region)
  2630. {
  2631. dest_host = region->getHost();
  2632. }
  2633. if(found_name && dest_host.isOk())
  2634. {
  2635. LLMessageSystem* msg = gMessageSystem;
  2636. msg->newMessage("OfferCallingCard");
  2637. msg->nextBlockFast(_PREHASH_AgentData);
  2638. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  2639. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  2640. msg->nextBlockFast(_PREHASH_AgentBlock);
  2641. msg->addUUIDFast(_PREHASH_DestID, dest->getID());
  2642. LLUUID transaction_id;
  2643. transaction_id.generate();
  2644. msg->addUUIDFast(_PREHASH_TransactionID, transaction_id);
  2645. msg->sendReliable(dest_host);
  2646. LLNotificationsUtil::add("OfferedCard", args);
  2647. }
  2648. else
  2649. {
  2650. LLNotificationsUtil::add("CantOfferCallingCard", old_args);
  2651. }
  2652. }
  2653. return true;
  2654. }
  2655. };
  2656. void login_done(S32 which, void *user)
  2657. {
  2658. llinfos << "Login done " << which << llendl;
  2659. LLPanelLogin::closePanel();
  2660. }
  2661. bool callback_leave_group(const LLSD& notification, const LLSD& response)
  2662. {
  2663. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  2664. if (option == 0)
  2665. {
  2666. LLMessageSystem *msg = gMessageSystem;
  2667. msg->newMessageFast(_PREHASH_LeaveGroupRequest);
  2668. msg->nextBlockFast(_PREHASH_AgentData);
  2669. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  2670. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  2671. msg->nextBlockFast(_PREHASH_GroupData);
  2672. msg->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID() );
  2673. gAgent.sendReliableMessage();
  2674. }
  2675. return false;
  2676. }
  2677. void append_aggregate(std::string& string, const LLAggregatePermissions& ag_perm, PermissionBit bit, const char* txt)
  2678. {
  2679. LLAggregatePermissions::EValue val = ag_perm.getValue(bit);
  2680. std::string buffer;
  2681. switch(val)
  2682. {
  2683.   case LLAggregatePermissions::AP_NONE:
  2684. buffer = llformat( "* %s Nonen", txt);
  2685. break;
  2686.   case LLAggregatePermissions::AP_SOME:
  2687. buffer = llformat( "* %s Somen", txt);
  2688. break;
  2689.   case LLAggregatePermissions::AP_ALL:
  2690. buffer = llformat( "* %s Alln", txt);
  2691. break;
  2692.   case LLAggregatePermissions::AP_EMPTY:
  2693.   default:
  2694. break;
  2695. }
  2696. string.append(buffer);
  2697. }
  2698. bool enable_buy_object()
  2699. {
  2700.     // In order to buy, there must only be 1 purchaseable object in
  2701.     // the selection manger.
  2702. if(LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() != 1) return false;
  2703.     LLViewerObject* obj = NULL;
  2704.     LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode();
  2705. if(node)
  2706.     {
  2707.         obj = node->getObject();
  2708.         if(!obj) return false;
  2709. if( for_sale_selection(node) )
  2710. {
  2711. // *NOTE: Is this needed?  This checks to see if anyone owns the
  2712. // object, dating back to when we had "public" objects owned by
  2713. // no one.  JC
  2714. if(obj->permAnyOwner()) return true;
  2715. }
  2716.     }
  2717. return false;
  2718. }
  2719. // Note: This will only work if the selected object's data has been
  2720. // received by the viewer and cached in the selection manager.
  2721. void handle_buy_object(LLSaleInfo sale_info)
  2722. {
  2723. if(!LLSelectMgr::getInstance()->selectGetAllRootsValid())
  2724. {
  2725. LLNotificationsUtil::add("UnableToBuyWhileDownloading");
  2726. return;
  2727. }
  2728. LLUUID owner_id;
  2729. std::string owner_name;
  2730. BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);
  2731. if (!owners_identical)
  2732. {
  2733. LLNotificationsUtil::add("CannotBuyObjectsFromDifferentOwners");
  2734. return;
  2735. }
  2736. LLPermissions perm;
  2737. BOOL valid = LLSelectMgr::getInstance()->selectGetPermissions(perm);
  2738. LLAggregatePermissions ag_perm;
  2739. valid &= LLSelectMgr::getInstance()->selectGetAggregatePermissions(ag_perm);
  2740. if(!valid || !sale_info.isForSale() || !perm.allowTransferTo(gAgent.getID()))
  2741. {
  2742. LLNotificationsUtil::add("ObjectNotForSale");
  2743. return;
  2744. }
  2745. S32 price = sale_info.getSalePrice();
  2746. if (price > 0 && price > gStatusBar->getBalance())
  2747. {
  2748. LLFloaterBuyCurrency::buyCurrency("This object costs", price);
  2749. return;
  2750. }
  2751. LLFloaterBuy::show(sale_info);
  2752. }
  2753. void handle_buy_contents(LLSaleInfo sale_info)
  2754. {
  2755. LLFloaterBuyContents::show(sale_info);
  2756. }
  2757. void handle_region_dump_temp_asset_data(void*)
  2758. {
  2759. llinfos << "Dumping temporary asset data to simulator logs" << llendl;
  2760. std::vector<std::string> strings;
  2761. LLUUID invoice;
  2762. send_generic_message("dumptempassetdata", strings, invoice);
  2763. }
  2764. void handle_region_clear_temp_asset_data(void*)
  2765. {
  2766. llinfos << "Clearing temporary asset data" << llendl;
  2767. std::vector<std::string> strings;
  2768. LLUUID invoice;
  2769. send_generic_message("cleartempassetdata", strings, invoice);
  2770. }
  2771. void handle_region_dump_settings(void*)
  2772. {
  2773. LLViewerRegion* regionp = gAgent.getRegion();
  2774. if (regionp)
  2775. {
  2776. llinfos << "Damage:    " << (regionp->getAllowDamage() ? "on" : "off") << llendl;
  2777. llinfos << "Landmark:  " << (regionp->getAllowLandmark() ? "on" : "off") << llendl;
  2778. llinfos << "SetHome:   " << (regionp->getAllowSetHome() ? "on" : "off") << llendl;
  2779. llinfos << "ResetHome: " << (regionp->getResetHomeOnTeleport() ? "on" : "off") << llendl;
  2780. llinfos << "SunFixed:  " << (regionp->getSunFixed() ? "on" : "off") << llendl;
  2781. llinfos << "BlockFly:  " << (regionp->getBlockFly() ? "on" : "off") << llendl;
  2782. llinfos << "AllowP2P:  " << (regionp->getAllowDirectTeleport() ? "on" : "off") << llendl;
  2783. llinfos << "Water:     " << (regionp->getWaterHeight()) << llendl;
  2784. }
  2785. }
  2786. void handle_dump_group_info(void *)
  2787. {
  2788. gAgent.dumpGroupInfo();
  2789. }
  2790. void handle_dump_capabilities_info(void *)
  2791. {
  2792. LLViewerRegion* regionp = gAgent.getRegion();
  2793. if (regionp)
  2794. {
  2795. regionp->logActiveCapabilities();
  2796. }
  2797. }
  2798. void handle_dump_region_object_cache(void*)
  2799. {
  2800. LLViewerRegion* regionp = gAgent.getRegion();
  2801. if (regionp)
  2802. {
  2803. regionp->dumpCache();
  2804. }
  2805. }
  2806. void handle_dump_focus()
  2807. {
  2808. LLUICtrl *ctrl = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
  2809. llinfos << "Keyboard focus " << (ctrl ? ctrl->getName() : "(none)") << llendl;
  2810. }
  2811. class LLSelfStandUp : public view_listener_t
  2812. {
  2813. bool handleEvent(const LLSD& userdata)
  2814. {
  2815. gAgent.standUp();
  2816. return true;
  2817. }
  2818. };
  2819. bool enable_standup_self()
  2820. {
  2821. bool new_value = gAgent.getAvatarObject() && gAgent.getAvatarObject()->isSitting();
  2822. return new_value;
  2823. }
  2824. // Used from the login screen to aid in UI work on side tray
  2825. void handle_show_side_tray()
  2826. {
  2827. LLSideTray* side_tray = LLSideTray::getInstance();
  2828. LLView* root = gViewerWindow->getRootView();
  2829. // automatically removes and re-adds if there already
  2830. root->addChild(side_tray);
  2831. }
  2832. // Toggle one of "People" panel tabs in side tray.
  2833. class LLTogglePanelPeopleTab : public view_listener_t
  2834. {
  2835. bool handleEvent(const LLSD& userdata)
  2836. {
  2837. std::string panel_name = userdata.asString();
  2838. LLSD param;
  2839. param["people_panel_tab_name"] = panel_name;
  2840. static LLPanel* friends_panel = NULL;
  2841. static LLPanel* groups_panel = NULL;
  2842. static LLPanel* nearby_panel = NULL;
  2843. if (panel_name == "friends_panel")
  2844. {
  2845. return togglePeoplePanel(friends_panel, panel_name, param);
  2846. }
  2847. else if (panel_name == "groups_panel")
  2848. {
  2849. return togglePeoplePanel(groups_panel, panel_name, param);
  2850. }
  2851. else if (panel_name == "nearby_panel")
  2852. {
  2853. return togglePeoplePanel(nearby_panel, panel_name, param);
  2854. }
  2855. else
  2856. {
  2857. return false;
  2858. }
  2859. }
  2860. static bool togglePeoplePanel(LLPanel* &panel, const std::string& panel_name, const LLSD& param)
  2861. {
  2862. if(!panel)
  2863. {
  2864. panel = LLSideTray::getInstance()->getPanel(panel_name);
  2865. if(!panel)
  2866. return false;
  2867. }
  2868. LLSideTray::getInstance()->togglePanel(panel, "panel_people", param);
  2869. return true;
  2870. }
  2871. };
  2872. BOOL check_admin_override(void*)
  2873. {
  2874. return gAgent.getAdminOverride();
  2875. }
  2876. void handle_admin_override_toggle(void*)
  2877. {
  2878. gAgent.setAdminOverride(!gAgent.getAdminOverride());
  2879. // The above may have affected which debug menus are visible
  2880. show_debug_menus();
  2881. }
  2882. void handle_god_mode(void*)
  2883. {
  2884. gAgent.requestEnterGodMode();
  2885. }
  2886. void handle_leave_god_mode(void*)
  2887. {
  2888. gAgent.requestLeaveGodMode();
  2889. }
  2890. void set_god_level(U8 god_level)
  2891. {
  2892. U8 old_god_level = gAgent.getGodLevel();
  2893. gAgent.setGodLevel( god_level );
  2894. LLViewerParcelMgr::getInstance()->notifyObservers();
  2895. // God mode changes region visibility
  2896. LLWorldMap::getInstance()->reloadItems(true);
  2897. // inventory in items may change in god mode
  2898. gObjectList.dirtyAllObjectInventory();
  2899.         if(gViewerWindow)
  2900.         {
  2901.             gViewerWindow->setMenuBackgroundColor(god_level > GOD_NOT,
  2902.             LLViewerLogin::getInstance()->isInProductionGrid());
  2903.         }
  2904.     
  2905.         LLSD args;
  2906. if(god_level > GOD_NOT)
  2907. {
  2908. args["LEVEL"] = llformat("%d",(S32)god_level);
  2909. LLNotificationsUtil::add("EnteringGodMode", args);
  2910. }
  2911. else
  2912. {
  2913. args["LEVEL"] = llformat("%d",(S32)old_god_level);
  2914. LLNotificationsUtil::add("LeavingGodMode", args);
  2915. }
  2916. // changing god-level can affect which menus we see
  2917. show_debug_menus();
  2918. // changing god-level can invalidate search results
  2919. LLFloaterSearch *search = dynamic_cast<LLFloaterSearch*>(LLFloaterReg::getInstance("search"));
  2920. if (search)
  2921. {
  2922. search->godLevelChanged(god_level);
  2923. }
  2924. }
  2925. #ifdef TOGGLE_HACKED_GODLIKE_VIEWER
  2926. void handle_toggle_hacked_godmode(void*)
  2927. {
  2928. gHackGodmode = !gHackGodmode;
  2929. set_god_level(gHackGodmode ? GOD_MAINTENANCE : GOD_NOT);
  2930. }
  2931. BOOL check_toggle_hacked_godmode(void*)
  2932. {
  2933. return gHackGodmode;
  2934. }
  2935. bool enable_toggle_hacked_godmode(void*)
  2936. {
  2937.   return !LLViewerLogin::getInstance()->isInProductionGrid();
  2938. }
  2939. #endif
  2940. void process_grant_godlike_powers(LLMessageSystem* msg, void**)
  2941. {
  2942. LLUUID agent_id;
  2943. msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
  2944. LLUUID session_id;
  2945. msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_SessionID, session_id);
  2946. if((agent_id == gAgent.getID()) && (session_id == gAgent.getSessionID()))
  2947. {
  2948. U8 god_level;
  2949. msg->getU8Fast(_PREHASH_GrantData, _PREHASH_GodLevel, god_level);
  2950. set_god_level(god_level);
  2951. }
  2952. else
  2953. {
  2954. llwarns << "Grant godlike for wrong agent " << agent_id << llendl;
  2955. }
  2956. }
  2957. /*
  2958. class LLHaveCallingcard : public LLInventoryCollectFunctor
  2959. {
  2960. public:
  2961. LLHaveCallingcard(const LLUUID& agent_id);
  2962. virtual ~LLHaveCallingcard() {}
  2963. virtual bool operator()(LLInventoryCategory* cat,
  2964. LLInventoryItem* item);
  2965. BOOL isThere() const { return mIsThere;}
  2966. protected:
  2967. LLUUID mID;
  2968. BOOL mIsThere;
  2969. };
  2970. LLHaveCallingcard::LLHaveCallingcard(const LLUUID& agent_id) :
  2971. mID(agent_id),
  2972. mIsThere(FALSE)
  2973. {
  2974. }
  2975. bool LLHaveCallingcard::operator()(LLInventoryCategory* cat,
  2976.    LLInventoryItem* item)
  2977. {
  2978. if(item)
  2979. {
  2980. if((item->getType() == LLAssetType::AT_CALLINGCARD)
  2981.    && (item->getCreatorUUID() == mID))
  2982. {
  2983. mIsThere = TRUE;
  2984. }
  2985. }
  2986. return FALSE;
  2987. }
  2988. */
  2989. BOOL is_agent_mappable(const LLUUID& agent_id)
  2990. {
  2991. const LLRelationship* buddy_info = NULL;
  2992. bool is_friend = LLAvatarActions::isFriend(agent_id);
  2993. if (is_friend)
  2994. buddy_info = LLAvatarTracker::instance().getBuddyInfo(agent_id);
  2995. return (buddy_info &&
  2996. buddy_info->isOnline() &&
  2997. buddy_info->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)
  2998. );
  2999. }
  3000. // Enable a menu item when you don't have someone's card.
  3001. class LLAvatarEnableAddFriend : public view_listener_t
  3002. {
  3003. bool handleEvent(const LLSD& userdata)
  3004. {
  3005. LLVOAvatar* avatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
  3006. bool new_value = avatar && !LLAvatarActions::isFriend(avatar->getID());
  3007. return new_value;
  3008. }
  3009. };
  3010. void request_friendship(const LLUUID& dest_id)
  3011. {
  3012. LLViewerObject* dest = gObjectList.findObject(dest_id);
  3013. if(dest && dest->isAvatar())
  3014. {
  3015. std::string fullname;
  3016. LLSD args;
  3017. LLNameValue* nvfirst = dest->getNVPair("FirstName");
  3018. LLNameValue* nvlast = dest->getNVPair("LastName");
  3019. if(nvfirst && nvlast)
  3020. {
  3021. args["FIRST"] = nvfirst->getString();
  3022. args["LAST"] = nvlast->getString();
  3023. fullname = nvfirst->getString();
  3024. fullname += " ";
  3025. fullname += nvlast->getString();
  3026. }
  3027. if (!fullname.empty())
  3028. {
  3029. LLAvatarActions::requestFriendshipDialog(dest_id, fullname);
  3030. }
  3031. else
  3032. {
  3033. LLNotificationsUtil::add("CantOfferFriendship");
  3034. }
  3035. }
  3036. }
  3037. class LLEditEnableCustomizeAvatar : public view_listener_t
  3038. {
  3039. bool handleEvent(const LLSD& userdata)
  3040. {
  3041. bool new_value = gAgentWearables.areWearablesLoaded();
  3042. return new_value;
  3043. }
  3044. };
  3045. bool enable_sit_object()
  3046. {
  3047. LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
  3048. if (object && object->getPCode() == LL_PCODE_VOLUME)
  3049. {
  3050. return true;
  3051. }
  3052. else
  3053. {
  3054. return false;
  3055. }
  3056. }
  3057. // only works on pie menu
  3058. void handle_object_sit_or_stand()
  3059. {
  3060. LLPickInfo pick = LLToolPie::getInstance()->getPick();
  3061. LLViewerObject *object = pick.getObject();;
  3062. if (!object || pick.mPickType == LLPickInfo::PICK_FLORA)
  3063. {
  3064. return;
  3065. }
  3066. if (sitting_on_selection())
  3067. {
  3068. gAgent.standUp();
  3069. return;
  3070. }
  3071. // get object selection offset 
  3072. if (object && object->getPCode() == LL_PCODE_VOLUME)
  3073. {
  3074. gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit);
  3075. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  3076. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  3077. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  3078. gMessageSystem->nextBlockFast(_PREHASH_TargetObject);
  3079. gMessageSystem->addUUIDFast(_PREHASH_TargetID, object->mID);
  3080. gMessageSystem->addVector3Fast(_PREHASH_Offset, pick.mObjectOffset);
  3081. object->getRegion()->sendReliableMessage();
  3082. }
  3083. }
  3084. void near_sit_down_point(BOOL success, void *)
  3085. {
  3086. if (success)
  3087. {
  3088. gAgent.setFlying(FALSE);
  3089. gAgent.setControlFlags(AGENT_CONTROL_SIT_ON_GROUND);
  3090. // Might be first sit
  3091. //LLFirstUse::useSit();
  3092. }
  3093. }
  3094. class LLLandSit : public view_listener_t
  3095. {
  3096. bool handleEvent(const LLSD& userdata)
  3097. {
  3098. gAgent.standUp();
  3099. LLViewerParcelMgr::getInstance()->deselectLand();
  3100. LLVector3d posGlobal = LLToolPie::getInstance()->getPick().mPosGlobal;
  3101. LLQuaternion target_rot;
  3102. if (gAgent.getAvatarObject())
  3103. {
  3104. target_rot = gAgent.getAvatarObject()->getRotation();
  3105. }
  3106. else
  3107. {
  3108. target_rot = gAgent.getFrameAgent().getQuaternion();
  3109. }
  3110. gAgent.startAutoPilotGlobal(posGlobal, "Sit", &target_rot, near_sit_down_point, NULL, 0.7f);
  3111. return true;
  3112. }
  3113. };
  3114. //-------------------------------------------------------------------
  3115. // Help menu functions
  3116. //-------------------------------------------------------------------
  3117. //
  3118. // Major mode switching
  3119. //
  3120. void reset_view_final( BOOL proceed );
  3121. void handle_reset_view()
  3122. {
  3123. if( (CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode()) && gFloaterCustomize )
  3124. {
  3125. // Show dialog box if needed.
  3126. gFloaterCustomize->askToSaveIfDirty( reset_view_final );
  3127. }
  3128. else
  3129. {
  3130. gAgent.switchCameraPreset(CAMERA_PRESET_REAR_VIEW);
  3131. reset_view_final( TRUE );
  3132. LLFloaterCamera::resetCameraMode();
  3133. }
  3134. }
  3135. class LLViewResetView : public view_listener_t
  3136. {
  3137. bool handleEvent(const LLSD& userdata)
  3138. {
  3139. handle_reset_view();
  3140. return true;
  3141. }
  3142. };
  3143. // Note: extra parameters allow this function to be called from dialog.
  3144. void reset_view_final( BOOL proceed ) 
  3145. {
  3146. if( !proceed )
  3147. {
  3148. return;
  3149. }
  3150. gAgent.resetView(TRUE, TRUE);
  3151. gAgent.setLookAt(LOOKAT_TARGET_CLEAR);
  3152. }
  3153. class LLViewLookAtLastChatter : public view_listener_t
  3154. {
  3155. bool handleEvent(const LLSD& userdata)
  3156. {
  3157. gAgent.lookAtLastChat();
  3158. return true;
  3159. }
  3160. };
  3161. class LLViewMouselook : public view_listener_t
  3162. {
  3163. bool handleEvent(const LLSD& userdata)
  3164. {
  3165. if (!gAgent.cameraMouselook())
  3166. {
  3167. gAgent.changeCameraToMouselook();
  3168. }
  3169. else
  3170. {
  3171. gAgent.changeCameraToDefault();
  3172. }
  3173. return true;
  3174. }
  3175. };
  3176. class LLViewFullscreen : public view_listener_t
  3177. {
  3178. bool handleEvent(const LLSD& userdata)
  3179. {
  3180. gViewerWindow->toggleFullscreen(TRUE);
  3181. return true;
  3182. }
  3183. };
  3184. class LLViewDefaultUISize : public view_listener_t
  3185. {
  3186. bool handleEvent(const LLSD& userdata)
  3187. {
  3188. gSavedSettings.setF32("UIScaleFactor", 1.0f);
  3189. gSavedSettings.setBOOL("UIAutoScale", FALSE);
  3190. gViewerWindow->reshape(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
  3191. return true;
  3192. }
  3193. };
  3194. class LLEditDuplicate : public view_listener_t
  3195. {
  3196. bool handleEvent(const LLSD& userdata)
  3197. {
  3198. if(LLEditMenuHandler::gEditMenuHandler)
  3199. {
  3200. LLEditMenuHandler::gEditMenuHandler->duplicate();
  3201. }
  3202. return true;
  3203. }
  3204. };
  3205. class LLEditEnableDuplicate : public view_listener_t
  3206. {
  3207. bool handleEvent(const LLSD& userdata)
  3208. {
  3209. bool new_value = LLEditMenuHandler::gEditMenuHandler && LLEditMenuHandler::gEditMenuHandler->canDuplicate();
  3210. return new_value;
  3211. }
  3212. };
  3213. void handle_duplicate_in_place(void*)
  3214. {
  3215. llinfos << "handle_duplicate_in_place" << llendl;
  3216. LLVector3 offset(0.f, 0.f, 0.f);
  3217. LLSelectMgr::getInstance()->selectDuplicate(offset, TRUE);
  3218. }
  3219. /* dead code 30-apr-2008
  3220. void handle_deed_object_to_group(void*)
  3221. {
  3222. LLUUID group_id;
  3223. LLSelectMgr::getInstance()->selectGetGroup(group_id);
  3224. LLSelectMgr::getInstance()->sendOwner(LLUUID::null, group_id, FALSE);
  3225. LLViewerStats::getInstance()->incStat(LLViewerStats::ST_RELEASE_COUNT);
  3226. }
  3227. BOOL enable_deed_object_to_group(void*)
  3228. {
  3229. if(LLSelectMgr::getInstance()->getSelection()->isEmpty()) return FALSE;
  3230. LLPermissions perm;
  3231. LLUUID group_id;
  3232. if (LLSelectMgr::getInstance()->selectGetGroup(group_id) &&
  3233. gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) &&
  3234. LLSelectMgr::getInstance()->selectGetPermissions(perm) &&
  3235. perm.deedToGroup(gAgent.getID(), group_id))
  3236. {
  3237. return TRUE;
  3238. }
  3239. return FALSE;
  3240. }
  3241. */
  3242. /*
  3243.  * No longer able to support viewer side manipulations in this way
  3244.  *
  3245. void god_force_inv_owner_permissive(LLViewerObject* object,
  3246. InventoryObjectList* inventory,
  3247. S32 serial_num,
  3248. void*)
  3249. {
  3250. typedef std::vector<LLPointer<LLViewerInventoryItem> > item_array_t;
  3251. item_array_t items;
  3252. InventoryObjectList::const_iterator inv_it = inventory->begin();
  3253. InventoryObjectList::const_iterator inv_end = inventory->end();
  3254. for ( ; inv_it != inv_end; ++inv_it)
  3255. {
  3256. if(((*inv_it)->getType() != LLAssetType::AT_CATEGORY))
  3257. {
  3258. LLInventoryObject* obj = *inv_it;
  3259. LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem((LLViewerInventoryItem*)obj);
  3260. LLPermissions perm(new_item->getPermissions());
  3261. perm.setMaskBase(PERM_ALL);
  3262. perm.setMaskOwner(PERM_ALL);
  3263. new_item->setPermissions(perm);
  3264. items.push_back(new_item);
  3265. }
  3266. }
  3267. item_array_t::iterator end = items.end();
  3268. item_array_t::iterator it;
  3269. for(it = items.begin(); it != end; ++it)
  3270. {
  3271. // since we have the inventory item in the callback, it should not
  3272. // invalidate iteration through the selection manager.
  3273. object->updateInventory((*it), TASK_INVENTORY_ITEM_KEY, false);
  3274. }
  3275. }
  3276. */
  3277. void handle_object_owner_permissive(void*)
  3278. {
  3279. // only send this if they're a god.
  3280. if(gAgent.isGodlike())
  3281. {
  3282. // do the objects.
  3283. LLSelectMgr::getInstance()->selectionSetObjectPermissions(PERM_BASE, TRUE, PERM_ALL, TRUE);
  3284. LLSelectMgr::getInstance()->selectionSetObjectPermissions(PERM_OWNER, TRUE, PERM_ALL, TRUE);
  3285. }
  3286. }
  3287. void handle_object_owner_self(void*)
  3288. {
  3289. // only send this if they're a god.
  3290. if(gAgent.isGodlike())
  3291. {
  3292. LLSelectMgr::getInstance()->sendOwner(gAgent.getID(), gAgent.getGroupID(), TRUE);
  3293. }
  3294. }
  3295. // Shortcut to set owner permissions to not editable.
  3296. void handle_object_lock(void*)
  3297. {
  3298. LLSelectMgr::getInstance()->selectionSetObjectPermissions(PERM_OWNER, FALSE, PERM_MODIFY);
  3299. }
  3300. void handle_object_asset_ids(void*)
  3301. {
  3302. // only send this if they're a god.
  3303. if (gAgent.isGodlike())
  3304. {
  3305. LLSelectMgr::getInstance()->sendGodlikeRequest("objectinfo", "assetids");
  3306. }
  3307. }
  3308. void handle_force_parcel_owner_to_me(void*)
  3309. {
  3310. LLViewerParcelMgr::getInstance()->sendParcelGodForceOwner( gAgent.getID() );
  3311. }
  3312. void handle_force_parcel_to_content(void*)
  3313. {
  3314. LLViewerParcelMgr::getInstance()->sendParcelGodForceToContent();
  3315. }
  3316. void handle_claim_public_land(void*)
  3317. {
  3318. if (LLViewerParcelMgr::getInstance()->getSelectionRegion() != gAgent.getRegion())
  3319. {
  3320. LLNotificationsUtil::add("ClaimPublicLand");
  3321. return;
  3322. }
  3323. LLVector3d west_south_global;
  3324. LLVector3d east_north_global;
  3325. LLViewerParcelMgr::getInstance()->getSelection(west_south_global, east_north_global);
  3326. LLVector3 west_south = gAgent.getPosAgentFromGlobal(west_south_global);
  3327. LLVector3 east_north = gAgent.getPosAgentFromGlobal(east_north_global);
  3328. LLMessageSystem* msg = gMessageSystem;
  3329. msg->newMessage("GodlikeMessage");
  3330. msg->nextBlock("AgentData");
  3331. msg->addUUID("AgentID", gAgent.getID());
  3332. msg->addUUID("SessionID", gAgent.getSessionID());
  3333. msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
  3334. msg->nextBlock("MethodData");
  3335. msg->addString("Method", "claimpublicland");
  3336. msg->addUUID("Invoice", LLUUID::null);
  3337. std::string buffer;
  3338. buffer = llformat( "%f", west_south.mV[VX]);
  3339. msg->nextBlock("ParamList");
  3340. msg->addString("Parameter", buffer);
  3341. buffer = llformat( "%f", west_south.mV[VY]);
  3342. msg->nextBlock("ParamList");
  3343. msg->addString("Parameter", buffer);
  3344. buffer = llformat( "%f", east_north.mV[VX]);
  3345. msg->nextBlock("ParamList");
  3346. msg->addString("Parameter", buffer);
  3347. buffer = llformat( "%f", east_north.mV[VY]);
  3348. msg->nextBlock("ParamList");
  3349. msg->addString("Parameter", buffer);
  3350. gAgent.sendReliableMessage();
  3351. }
  3352. // HACK for easily testing new avatar geometry
  3353. void handle_god_request_avatar_geometry(void *)
  3354. {
  3355. if (gAgent.isGodlike())
  3356. {
  3357. LLSelectMgr::getInstance()->sendGodlikeRequest("avatar toggle", "");
  3358. }
  3359. }
  3360. void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)
  3361. {
  3362. if(gAgent.cameraMouselook())
  3363. {
  3364. gAgent.changeCameraToDefault();
  3365. }
  3366. //gInventoryView->setPanelOpen(TRUE);
  3367. std::string error;
  3368. LLDynamicArray<LLViewerObject*> derez_objects;
  3369. // Check conditions that we can't deal with, building a list of
  3370. // everything that we'll actually be derezzing.
  3371. LLViewerRegion* first_region = NULL;
  3372. for (LLObjectSelection::valid_root_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_root_begin();
  3373.  iter != LLSelectMgr::getInstance()->getSelection()->valid_root_end(); iter++)
  3374. {
  3375. LLSelectNode* node = *iter;
  3376. LLViewerObject* object = node->getObject();
  3377. LLViewerRegion* region = object->getRegion();
  3378. if (!first_region)
  3379. {
  3380. first_region = region;
  3381. }
  3382. else
  3383. {
  3384. if(region != first_region)
  3385. {
  3386. // Derez doesn't work at all if the some of the objects
  3387. // are in regions besides the first object selected.
  3388. // ...crosses region boundaries
  3389. error = "AcquireErrorObjectSpan";
  3390. break;
  3391. }
  3392. }
  3393. if (object->isAvatar())
  3394. {
  3395. // ...don't acquire avatars
  3396. continue;
  3397. }
  3398. // If AssetContainers are being sent back, they will appear as 
  3399. // boxes in the owner's inventory.
  3400. if (object->getNVPair("AssetContainer")
  3401. && dest != DRD_RETURN_TO_OWNER)
  3402. {
  3403. // this object is an asset container, derez its contents, not it
  3404. llwarns << "Attempt to derez deprecated AssetContainer object type not supported." << llendl;
  3405. /*
  3406. object->requestInventory(container_inventory_arrived, 
  3407. (void *)(BOOL)(DRD_TAKE_INTO_AGENT_INVENTORY == dest));
  3408. */
  3409. continue;
  3410. }
  3411. BOOL can_derez_current = FALSE;
  3412. switch(dest)
  3413. {
  3414. case DRD_TAKE_INTO_AGENT_INVENTORY: