diff options
Diffstat (limited to 'indra')
248 files changed, 4248 insertions, 3911 deletions
diff --git a/indra/cmake/Linking.cmake b/indra/cmake/Linking.cmake index 8e91dac109..a1a24de04b 100644 --- a/indra/cmake/Linking.cmake +++ b/indra/cmake/Linking.cmake @@ -67,7 +67,6 @@ elseif (WINDOWS)            legacy_stdio_definitions            )  elseif (DARWIN) -  include(CMakeFindFrameworks)    find_library(COREFOUNDATION_LIBRARY CoreFoundation)    find_library(CARBON_LIBRARY Carbon)    find_library(COCOA_LIBRARY Cocoa) diff --git a/indra/doxygen/CMakeLists.txt b/indra/doxygen/CMakeLists.txt index 616b5cd09c..354ae7b636 100644 --- a/indra/doxygen/CMakeLists.txt +++ b/indra/doxygen/CMakeLists.txt @@ -1,11 +1,5 @@  # -*- cmake -*- -# cmake_minimum_required should appear before any -# other commands to guarantee full compatibility -# with the version specified -## prior to 2.8, the add_custom_target commands used in setting the version did not work correctly -cmake_minimum_required(VERSION 3.8.0 FATAL_ERROR) -  set(ROOT_PROJECT_NAME "SecondLife" CACHE STRING      "The root project/makefile/solution name. Defaults to SecondLife.")  project(${ROOT_PROJECT_NAME}) diff --git a/indra/llappearance/llpolymorph.cpp b/indra/llappearance/llpolymorph.cpp index 8df8a9726f..5ee6649164 100644 --- a/indra/llappearance/llpolymorph.cpp +++ b/indra/llappearance/llpolymorph.cpp @@ -550,12 +550,12 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )      mLastSex = avatar_sex; -    // Check for NaN condition (NaN is detected if a variable doesn't equal itself. -    if (mCurWeight != mCurWeight) +    // Check for NaN condition +    if (llisnan(mCurWeight))      { -        mCurWeight = 0.0; +        mCurWeight = 0.f;      } -    if (mLastWeight != mLastWeight) +    if (llisnan(mLastWeight))      {          mLastWeight = mCurWeight+.001f;      } diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h index d2de88ff0a..a0394da281 100644 --- a/indra/llcommon/indra_constants.h +++ b/indra/llcommon/indra_constants.h @@ -31,15 +31,15 @@  class LLUUID; -static const F32 REGION_WIDTH_METERS = 256.f; -static const S32 REGION_WIDTH_UNITS = 256; -static const U32 REGION_WIDTH_U32 = 256; +static constexpr F32 REGION_WIDTH_METERS = 256.f; +static constexpr S32 REGION_WIDTH_UNITS = 256; +static constexpr U32 REGION_WIDTH_U32 = 256; -const F32 REGION_HEIGHT_METERS = 4096.f; +constexpr F32 REGION_HEIGHT_METERS = 4096.f; -const   F32     DEFAULT_AGENT_DEPTH     = 0.45f; -const   F32     DEFAULT_AGENT_WIDTH     = 0.60f; -const   F32     DEFAULT_AGENT_HEIGHT    = 1.9f; +constexpr   F32     DEFAULT_AGENT_DEPTH     = 0.45f; +constexpr   F32     DEFAULT_AGENT_WIDTH     = 0.60f; +constexpr   F32     DEFAULT_AGENT_HEIGHT    = 1.9f;  enum ETerrainBrushType  { @@ -67,112 +67,112 @@ enum EMouseClickType{  // keys  // Bit masks for various keyboard modifier keys. -const MASK MASK_NONE =          0x0000; -const MASK MASK_CONTROL =       0x0001;     // Mapped to cmd on Macs -const MASK MASK_ALT =           0x0002; -const MASK MASK_SHIFT =         0x0004; -const MASK MASK_NORMALKEYS =    0x0007;     // A real mask - only get the bits for normal modifier keys -const MASK MASK_MAC_CONTROL =   0x0008;     // Un-mapped Ctrl key on Macs, not used on Windows -const MASK MASK_MODIFIERS =     MASK_CONTROL|MASK_ALT|MASK_SHIFT|MASK_MAC_CONTROL; +constexpr MASK MASK_NONE =          0x0000; +constexpr MASK MASK_CONTROL =       0x0001;     // Mapped to cmd on Macs +constexpr MASK MASK_ALT =           0x0002; +constexpr MASK MASK_SHIFT =         0x0004; +constexpr MASK MASK_NORMALKEYS =    0x0007;     // A real mask - only get the bits for normal modifier keys +constexpr MASK MASK_MAC_CONTROL =   0x0008;     // Un-mapped Ctrl key on Macs, not used on Windows +constexpr MASK MASK_MODIFIERS =     MASK_CONTROL|MASK_ALT|MASK_SHIFT|MASK_MAC_CONTROL;  // Special keys go into >128 -const KEY KEY_SPECIAL = 0x80;   // special keys start here -const KEY KEY_RETURN =  0x81; -const KEY KEY_LEFT =    0x82; -const KEY KEY_RIGHT =   0x83; -const KEY KEY_UP =      0x84; -const KEY KEY_DOWN =    0x85; -const KEY KEY_ESCAPE =  0x86; -const KEY KEY_BACKSPACE =0x87; -const KEY KEY_DELETE =  0x88; -const KEY KEY_SHIFT =   0x89; -const KEY KEY_CONTROL = 0x8A; -const KEY KEY_ALT =     0x8B; -const KEY KEY_HOME =    0x8C; -const KEY KEY_END =     0x8D; -const KEY KEY_PAGE_UP = 0x8E; -const KEY KEY_PAGE_DOWN = 0x8F; -const KEY KEY_HYPHEN = 0x90; -const KEY KEY_EQUALS = 0x91; -const KEY KEY_INSERT = 0x92; -const KEY KEY_CAPSLOCK = 0x93; -const KEY KEY_TAB =     0x94; -const KEY KEY_ADD =     0x95; -const KEY KEY_SUBTRACT =0x96; -const KEY KEY_MULTIPLY =0x97; -const KEY KEY_DIVIDE =  0x98; -const KEY KEY_F1        = 0xA1; -const KEY KEY_F2        = 0xA2; -const KEY KEY_F3        = 0xA3; -const KEY KEY_F4        = 0xA4; -const KEY KEY_F5        = 0xA5; -const KEY KEY_F6        = 0xA6; -const KEY KEY_F7        = 0xA7; -const KEY KEY_F8        = 0xA8; -const KEY KEY_F9        = 0xA9; -const KEY KEY_F10       = 0xAA; -const KEY KEY_F11       = 0xAB; -const KEY KEY_F12       = 0xAC; - -const KEY KEY_PAD_UP        = 0xC0; -const KEY KEY_PAD_DOWN      = 0xC1; -const KEY KEY_PAD_LEFT      = 0xC2; -const KEY KEY_PAD_RIGHT     = 0xC3; -const KEY KEY_PAD_HOME      = 0xC4; -const KEY KEY_PAD_END       = 0xC5; -const KEY KEY_PAD_PGUP      = 0xC6; -const KEY KEY_PAD_PGDN      = 0xC7; -const KEY KEY_PAD_CENTER    = 0xC8; // the 5 in the middle -const KEY KEY_PAD_INS       = 0xC9; -const KEY KEY_PAD_DEL       = 0xCA; -const KEY KEY_PAD_RETURN    = 0xCB; -const KEY KEY_PAD_ADD       = 0xCC; // not used -const KEY KEY_PAD_SUBTRACT  = 0xCD; // not used -const KEY KEY_PAD_MULTIPLY  = 0xCE; // not used -const KEY KEY_PAD_DIVIDE    = 0xCF; // not used - -const KEY KEY_BUTTON0   = 0xD0; -const KEY KEY_BUTTON1   = 0xD1; -const KEY KEY_BUTTON2   = 0xD2; -const KEY KEY_BUTTON3   = 0xD3; -const KEY KEY_BUTTON4   = 0xD4; -const KEY KEY_BUTTON5   = 0xD5; -const KEY KEY_BUTTON6   = 0xD6; -const KEY KEY_BUTTON7   = 0xD7; -const KEY KEY_BUTTON8   = 0xD8; -const KEY KEY_BUTTON9   = 0xD9; -const KEY KEY_BUTTON10  = 0xDA; -const KEY KEY_BUTTON11  = 0xDB; -const KEY KEY_BUTTON12  = 0xDC; -const KEY KEY_BUTTON13  = 0xDD; -const KEY KEY_BUTTON14  = 0xDE; -const KEY KEY_BUTTON15  = 0xDF; - -const KEY KEY_NONE =    0xFF; // not sent from keyboard.  For internal use only. - -const S32 KEY_COUNT = 256; - - -const F32 DEFAULT_WATER_HEIGHT  = 20.0f; +constexpr KEY KEY_SPECIAL = 0x80;   // special keys start here +constexpr KEY KEY_RETURN =  0x81; +constexpr KEY KEY_LEFT =    0x82; +constexpr KEY KEY_RIGHT =   0x83; +constexpr KEY KEY_UP =      0x84; +constexpr KEY KEY_DOWN =    0x85; +constexpr KEY KEY_ESCAPE =  0x86; +constexpr KEY KEY_BACKSPACE =0x87; +constexpr KEY KEY_DELETE =  0x88; +constexpr KEY KEY_SHIFT =   0x89; +constexpr KEY KEY_CONTROL = 0x8A; +constexpr KEY KEY_ALT =     0x8B; +constexpr KEY KEY_HOME =    0x8C; +constexpr KEY KEY_END =     0x8D; +constexpr KEY KEY_PAGE_UP = 0x8E; +constexpr KEY KEY_PAGE_DOWN = 0x8F; +constexpr KEY KEY_HYPHEN = 0x90; +constexpr KEY KEY_EQUALS = 0x91; +constexpr KEY KEY_INSERT = 0x92; +constexpr KEY KEY_CAPSLOCK = 0x93; +constexpr KEY KEY_TAB =     0x94; +constexpr KEY KEY_ADD =     0x95; +constexpr KEY KEY_SUBTRACT =0x96; +constexpr KEY KEY_MULTIPLY =0x97; +constexpr KEY KEY_DIVIDE =  0x98; +constexpr KEY KEY_F1        = 0xA1; +constexpr KEY KEY_F2        = 0xA2; +constexpr KEY KEY_F3        = 0xA3; +constexpr KEY KEY_F4        = 0xA4; +constexpr KEY KEY_F5        = 0xA5; +constexpr KEY KEY_F6        = 0xA6; +constexpr KEY KEY_F7        = 0xA7; +constexpr KEY KEY_F8        = 0xA8; +constexpr KEY KEY_F9        = 0xA9; +constexpr KEY KEY_F10       = 0xAA; +constexpr KEY KEY_F11       = 0xAB; +constexpr KEY KEY_F12       = 0xAC; + +constexpr KEY KEY_PAD_UP        = 0xC0; +constexpr KEY KEY_PAD_DOWN      = 0xC1; +constexpr KEY KEY_PAD_LEFT      = 0xC2; +constexpr KEY KEY_PAD_RIGHT     = 0xC3; +constexpr KEY KEY_PAD_HOME      = 0xC4; +constexpr KEY KEY_PAD_END       = 0xC5; +constexpr KEY KEY_PAD_PGUP      = 0xC6; +constexpr KEY KEY_PAD_PGDN      = 0xC7; +constexpr KEY KEY_PAD_CENTER    = 0xC8; // the 5 in the middle +constexpr KEY KEY_PAD_INS       = 0xC9; +constexpr KEY KEY_PAD_DEL       = 0xCA; +constexpr KEY KEY_PAD_RETURN    = 0xCB; +constexpr KEY KEY_PAD_ADD       = 0xCC; // not used +constexpr KEY KEY_PAD_SUBTRACT  = 0xCD; // not used +constexpr KEY KEY_PAD_MULTIPLY  = 0xCE; // not used +constexpr KEY KEY_PAD_DIVIDE    = 0xCF; // not used + +constexpr KEY KEY_BUTTON0   = 0xD0; +constexpr KEY KEY_BUTTON1   = 0xD1; +constexpr KEY KEY_BUTTON2   = 0xD2; +constexpr KEY KEY_BUTTON3   = 0xD3; +constexpr KEY KEY_BUTTON4   = 0xD4; +constexpr KEY KEY_BUTTON5   = 0xD5; +constexpr KEY KEY_BUTTON6   = 0xD6; +constexpr KEY KEY_BUTTON7   = 0xD7; +constexpr KEY KEY_BUTTON8   = 0xD8; +constexpr KEY KEY_BUTTON9   = 0xD9; +constexpr KEY KEY_BUTTON10  = 0xDA; +constexpr KEY KEY_BUTTON11  = 0xDB; +constexpr KEY KEY_BUTTON12  = 0xDC; +constexpr KEY KEY_BUTTON13  = 0xDD; +constexpr KEY KEY_BUTTON14  = 0xDE; +constexpr KEY KEY_BUTTON15  = 0xDF; + +constexpr KEY KEY_NONE =    0xFF; // not sent from keyboard.  For internal use only. + +constexpr S32 KEY_COUNT = 256; + + +constexpr F32 DEFAULT_WATER_HEIGHT  = 20.0f;  // Maturity ratings for simulators -const U8 SIM_ACCESS_MIN     = 0;        // Treated as 'unknown', usually ends up being SIM_ACCESS_PG -const U8 SIM_ACCESS_PG      = 13; -const U8 SIM_ACCESS_MATURE  = 21; -const U8 SIM_ACCESS_ADULT   = 42;       // Seriously Adult Only -const U8 SIM_ACCESS_DOWN    = 254; -const U8 SIM_ACCESS_MAX     = SIM_ACCESS_ADULT; +constexpr U8 SIM_ACCESS_MIN     = 0;        // Treated as 'unknown', usually ends up being SIM_ACCESS_PG +constexpr U8 SIM_ACCESS_PG      = 13; +constexpr U8 SIM_ACCESS_MATURE  = 21; +constexpr U8 SIM_ACCESS_ADULT   = 42;       // Seriously Adult Only +constexpr U8 SIM_ACCESS_DOWN    = 254; +constexpr U8 SIM_ACCESS_MAX     = SIM_ACCESS_ADULT;  // attachment constants -const U8  ATTACHMENT_ADD = 0x80; +constexpr U8  ATTACHMENT_ADD = 0x80;  // god levels -const U8 GOD_MAINTENANCE = 250; -const U8 GOD_FULL = 200; -const U8 GOD_LIAISON = 150; -const U8 GOD_CUSTOMER_SERVICE = 100; -const U8 GOD_LIKE = 1; -const U8 GOD_NOT = 0; +constexpr U8 GOD_MAINTENANCE = 250; +constexpr U8 GOD_FULL = 200; +constexpr U8 GOD_LIAISON = 150; +constexpr U8 GOD_CUSTOMER_SERVICE = 100; +constexpr U8 GOD_LIKE = 1; +constexpr U8 GOD_NOT = 0;  // "agent id" for things that should be done to ALL agents  LL_COMMON_API extern const LLUUID LL_UUID_ALL_AGENTS; @@ -239,121 +239,123 @@ LL_COMMON_API extern const LLUUID BLANK_OBJECT_NORMAL;  LL_COMMON_API extern const LLUUID BLANK_MATERIAL_ASSET_ID;  // radius within which a chat message is fully audible -const F32 CHAT_NORMAL_RADIUS = 20.f; +constexpr F32 CHAT_NORMAL_RADIUS = 20.f;  // media commands -const U32 PARCEL_MEDIA_COMMAND_STOP  = 0; -const U32 PARCEL_MEDIA_COMMAND_PAUSE = 1; -const U32 PARCEL_MEDIA_COMMAND_PLAY  = 2; -const U32 PARCEL_MEDIA_COMMAND_LOOP  = 3; -const U32 PARCEL_MEDIA_COMMAND_TEXTURE = 4; -const U32 PARCEL_MEDIA_COMMAND_URL = 5; -const U32 PARCEL_MEDIA_COMMAND_TIME = 6; -const U32 PARCEL_MEDIA_COMMAND_AGENT = 7; -const U32 PARCEL_MEDIA_COMMAND_UNLOAD = 8; -const U32 PARCEL_MEDIA_COMMAND_AUTO_ALIGN = 9; -const U32 PARCEL_MEDIA_COMMAND_TYPE = 10; -const U32 PARCEL_MEDIA_COMMAND_SIZE = 11; -const U32 PARCEL_MEDIA_COMMAND_DESC = 12; -const U32 PARCEL_MEDIA_COMMAND_LOOP_SET = 13; +constexpr U32 PARCEL_MEDIA_COMMAND_STOP  = 0; +constexpr U32 PARCEL_MEDIA_COMMAND_PAUSE = 1; +constexpr U32 PARCEL_MEDIA_COMMAND_PLAY  = 2; +constexpr U32 PARCEL_MEDIA_COMMAND_LOOP  = 3; +constexpr U32 PARCEL_MEDIA_COMMAND_TEXTURE = 4; +constexpr U32 PARCEL_MEDIA_COMMAND_URL = 5; +constexpr U32 PARCEL_MEDIA_COMMAND_TIME = 6; +constexpr U32 PARCEL_MEDIA_COMMAND_AGENT = 7; +constexpr U32 PARCEL_MEDIA_COMMAND_UNLOAD = 8; +constexpr U32 PARCEL_MEDIA_COMMAND_AUTO_ALIGN = 9; +constexpr U32 PARCEL_MEDIA_COMMAND_TYPE = 10; +constexpr U32 PARCEL_MEDIA_COMMAND_SIZE = 11; +constexpr U32 PARCEL_MEDIA_COMMAND_DESC = 12; +constexpr U32 PARCEL_MEDIA_COMMAND_LOOP_SET = 13;  const S32 CHAT_CHANNEL_DEBUG = S32_MAX;  // agent constants -const U32 CONTROL_AT_POS_INDEX              = 0; -const U32 CONTROL_AT_NEG_INDEX              = 1; -const U32 CONTROL_LEFT_POS_INDEX            = 2; -const U32 CONTROL_LEFT_NEG_INDEX            = 3; -const U32 CONTROL_UP_POS_INDEX              = 4; -const U32 CONTROL_UP_NEG_INDEX              = 5; -const U32 CONTROL_PITCH_POS_INDEX           = 6; -const U32 CONTROL_PITCH_NEG_INDEX           = 7; -const U32 CONTROL_YAW_POS_INDEX             = 8; -const U32 CONTROL_YAW_NEG_INDEX             = 9; -const U32 CONTROL_FAST_AT_INDEX             = 10; -const U32 CONTROL_FAST_LEFT_INDEX           = 11; -const U32 CONTROL_FAST_UP_INDEX             = 12; -const U32 CONTROL_FLY_INDEX                 = 13; -const U32 CONTROL_STOP_INDEX                = 14; -const U32 CONTROL_FINISH_ANIM_INDEX         = 15; -const U32 CONTROL_STAND_UP_INDEX            = 16; -const U32 CONTROL_SIT_ON_GROUND_INDEX       = 17; -const U32 CONTROL_MOUSELOOK_INDEX           = 18; -const U32 CONTROL_NUDGE_AT_POS_INDEX        = 19; -const U32 CONTROL_NUDGE_AT_NEG_INDEX        = 20; -const U32 CONTROL_NUDGE_LEFT_POS_INDEX      = 21; -const U32 CONTROL_NUDGE_LEFT_NEG_INDEX      = 22; -const U32 CONTROL_NUDGE_UP_POS_INDEX        = 23; -const U32 CONTROL_NUDGE_UP_NEG_INDEX        = 24; -const U32 CONTROL_TURN_LEFT_INDEX           = 25; -const U32 CONTROL_TURN_RIGHT_INDEX          = 26; -const U32 CONTROL_AWAY_INDEX                = 27; -const U32 CONTROL_LBUTTON_DOWN_INDEX        = 28; -const U32 CONTROL_LBUTTON_UP_INDEX          = 29; -const U32 CONTROL_ML_LBUTTON_DOWN_INDEX     = 30; -const U32 CONTROL_ML_LBUTTON_UP_INDEX       = 31; -const U32 TOTAL_CONTROLS                    = 32; - -const U32 AGENT_CONTROL_AT_POS              = 0x1 << CONTROL_AT_POS_INDEX;          // 0x00000001 -const U32 AGENT_CONTROL_AT_NEG              = 0x1 << CONTROL_AT_NEG_INDEX;          // 0x00000002 -const U32 AGENT_CONTROL_LEFT_POS            = 0x1 << CONTROL_LEFT_POS_INDEX;        // 0x00000004 -const U32 AGENT_CONTROL_LEFT_NEG            = 0x1 << CONTROL_LEFT_NEG_INDEX;        // 0x00000008 -const U32 AGENT_CONTROL_UP_POS              = 0x1 << CONTROL_UP_POS_INDEX;          // 0x00000010 -const U32 AGENT_CONTROL_UP_NEG              = 0x1 << CONTROL_UP_NEG_INDEX;          // 0x00000020 -const U32 AGENT_CONTROL_PITCH_POS           = 0x1 << CONTROL_PITCH_POS_INDEX;       // 0x00000040 -const U32 AGENT_CONTROL_PITCH_NEG           = 0x1 << CONTROL_PITCH_NEG_INDEX;       // 0x00000080 -const U32 AGENT_CONTROL_YAW_POS             = 0x1 << CONTROL_YAW_POS_INDEX;         // 0x00000100 -const U32 AGENT_CONTROL_YAW_NEG             = 0x1 << CONTROL_YAW_NEG_INDEX;         // 0x00000200 - -const U32 AGENT_CONTROL_FAST_AT             = 0x1 << CONTROL_FAST_AT_INDEX;         // 0x00000400 -const U32 AGENT_CONTROL_FAST_LEFT           = 0x1 << CONTROL_FAST_LEFT_INDEX;       // 0x00000800 -const U32 AGENT_CONTROL_FAST_UP             = 0x1 << CONTROL_FAST_UP_INDEX;         // 0x00001000 - -const U32 AGENT_CONTROL_FLY                 = 0x1 << CONTROL_FLY_INDEX;             // 0x00002000 -const U32 AGENT_CONTROL_STOP                = 0x1 << CONTROL_STOP_INDEX;            // 0x00004000 -const U32 AGENT_CONTROL_FINISH_ANIM         = 0x1 << CONTROL_FINISH_ANIM_INDEX;     // 0x00008000 -const U32 AGENT_CONTROL_STAND_UP            = 0x1 << CONTROL_STAND_UP_INDEX;        // 0x00010000 -const U32 AGENT_CONTROL_SIT_ON_GROUND       = 0x1 << CONTROL_SIT_ON_GROUND_INDEX;   // 0x00020000 -const U32 AGENT_CONTROL_MOUSELOOK           = 0x1 << CONTROL_MOUSELOOK_INDEX;       // 0x00040000 - -const U32 AGENT_CONTROL_NUDGE_AT_POS        = 0x1 << CONTROL_NUDGE_AT_POS_INDEX;    // 0x00080000 -const U32 AGENT_CONTROL_NUDGE_AT_NEG        = 0x1 << CONTROL_NUDGE_AT_NEG_INDEX;    // 0x00100000 -const U32 AGENT_CONTROL_NUDGE_LEFT_POS      = 0x1 << CONTROL_NUDGE_LEFT_POS_INDEX;  // 0x00200000 -const U32 AGENT_CONTROL_NUDGE_LEFT_NEG      = 0x1 << CONTROL_NUDGE_LEFT_NEG_INDEX;  // 0x00400000 -const U32 AGENT_CONTROL_NUDGE_UP_POS        = 0x1 << CONTROL_NUDGE_UP_POS_INDEX;    // 0x00800000 -const U32 AGENT_CONTROL_NUDGE_UP_NEG        = 0x1 << CONTROL_NUDGE_UP_NEG_INDEX;    // 0x01000000 -const U32 AGENT_CONTROL_TURN_LEFT           = 0x1 << CONTROL_TURN_LEFT_INDEX;       // 0x02000000 -const U32 AGENT_CONTROL_TURN_RIGHT          = 0x1 << CONTROL_TURN_RIGHT_INDEX;      // 0x04000000 - -const U32 AGENT_CONTROL_AWAY                = 0x1 << CONTROL_AWAY_INDEX;            // 0x08000000 - -const U32 AGENT_CONTROL_LBUTTON_DOWN        = 0x1 << CONTROL_LBUTTON_DOWN_INDEX;    // 0x10000000 -const U32 AGENT_CONTROL_LBUTTON_UP          = 0x1 << CONTROL_LBUTTON_UP_INDEX;      // 0x20000000 -const U32 AGENT_CONTROL_ML_LBUTTON_DOWN     = 0x1 << CONTROL_ML_LBUTTON_DOWN_INDEX; // 0x40000000 -const U32 AGENT_CONTROL_ML_LBUTTON_UP       = ((U32)0x1) << CONTROL_ML_LBUTTON_UP_INDEX;    // 0x80000000 +constexpr U32 CONTROL_AT_POS_INDEX              = 0; +constexpr U32 CONTROL_AT_NEG_INDEX              = 1; +constexpr U32 CONTROL_LEFT_POS_INDEX            = 2; +constexpr U32 CONTROL_LEFT_NEG_INDEX            = 3; +constexpr U32 CONTROL_UP_POS_INDEX              = 4; +constexpr U32 CONTROL_UP_NEG_INDEX              = 5; +constexpr U32 CONTROL_PITCH_POS_INDEX           = 6; +constexpr U32 CONTROL_PITCH_NEG_INDEX           = 7; +constexpr U32 CONTROL_YAW_POS_INDEX             = 8; +constexpr U32 CONTROL_YAW_NEG_INDEX             = 9; +constexpr U32 CONTROL_FAST_AT_INDEX             = 10; +constexpr U32 CONTROL_FAST_LEFT_INDEX           = 11; +constexpr U32 CONTROL_FAST_UP_INDEX             = 12; +constexpr U32 CONTROL_FLY_INDEX                 = 13; +constexpr U32 CONTROL_STOP_INDEX                = 14; +constexpr U32 CONTROL_FINISH_ANIM_INDEX         = 15; +constexpr U32 CONTROL_STAND_UP_INDEX            = 16; +constexpr U32 CONTROL_SIT_ON_GROUND_INDEX       = 17; +constexpr U32 CONTROL_MOUSELOOK_INDEX           = 18; +constexpr U32 CONTROL_NUDGE_AT_POS_INDEX        = 19; +constexpr U32 CONTROL_NUDGE_AT_NEG_INDEX        = 20; +constexpr U32 CONTROL_NUDGE_LEFT_POS_INDEX      = 21; +constexpr U32 CONTROL_NUDGE_LEFT_NEG_INDEX      = 22; +constexpr U32 CONTROL_NUDGE_UP_POS_INDEX        = 23; +constexpr U32 CONTROL_NUDGE_UP_NEG_INDEX        = 24; +constexpr U32 CONTROL_TURN_LEFT_INDEX           = 25; +constexpr U32 CONTROL_TURN_RIGHT_INDEX          = 26; +constexpr U32 CONTROL_AWAY_INDEX                = 27; +constexpr U32 CONTROL_LBUTTON_DOWN_INDEX        = 28; +constexpr U32 CONTROL_LBUTTON_UP_INDEX          = 29; +constexpr U32 CONTROL_ML_LBUTTON_DOWN_INDEX     = 30; +constexpr U32 CONTROL_ML_LBUTTON_UP_INDEX       = 31; +constexpr U32 TOTAL_CONTROLS                    = 32; + +constexpr U32 AGENT_CONTROL_AT_POS              = 0x1 << CONTROL_AT_POS_INDEX;          // 0x00000001 +constexpr U32 AGENT_CONTROL_AT_NEG              = 0x1 << CONTROL_AT_NEG_INDEX;          // 0x00000002 +constexpr U32 AGENT_CONTROL_LEFT_POS            = 0x1 << CONTROL_LEFT_POS_INDEX;        // 0x00000004 +constexpr U32 AGENT_CONTROL_LEFT_NEG            = 0x1 << CONTROL_LEFT_NEG_INDEX;        // 0x00000008 +constexpr U32 AGENT_CONTROL_UP_POS              = 0x1 << CONTROL_UP_POS_INDEX;          // 0x00000010 +constexpr U32 AGENT_CONTROL_UP_NEG              = 0x1 << CONTROL_UP_NEG_INDEX;          // 0x00000020 +constexpr U32 AGENT_CONTROL_PITCH_POS           = 0x1 << CONTROL_PITCH_POS_INDEX;       // 0x00000040 +constexpr U32 AGENT_CONTROL_PITCH_NEG           = 0x1 << CONTROL_PITCH_NEG_INDEX;       // 0x00000080 +constexpr U32 AGENT_CONTROL_YAW_POS             = 0x1 << CONTROL_YAW_POS_INDEX;         // 0x00000100 +constexpr U32 AGENT_CONTROL_YAW_NEG             = 0x1 << CONTROL_YAW_NEG_INDEX;         // 0x00000200 + +constexpr U32 AGENT_CONTROL_FAST_AT             = 0x1 << CONTROL_FAST_AT_INDEX;         // 0x00000400 +constexpr U32 AGENT_CONTROL_FAST_LEFT           = 0x1 << CONTROL_FAST_LEFT_INDEX;       // 0x00000800 +constexpr U32 AGENT_CONTROL_FAST_UP             = 0x1 << CONTROL_FAST_UP_INDEX;         // 0x00001000 + +constexpr U32 AGENT_CONTROL_FLY                 = 0x1 << CONTROL_FLY_INDEX;             // 0x00002000 +constexpr U32 AGENT_CONTROL_STOP                = 0x1 << CONTROL_STOP_INDEX;            // 0x00004000 +constexpr U32 AGENT_CONTROL_FINISH_ANIM         = 0x1 << CONTROL_FINISH_ANIM_INDEX;     // 0x00008000 +constexpr U32 AGENT_CONTROL_STAND_UP            = 0x1 << CONTROL_STAND_UP_INDEX;        // 0x00010000 +constexpr U32 AGENT_CONTROL_SIT_ON_GROUND       = 0x1 << CONTROL_SIT_ON_GROUND_INDEX;   // 0x00020000 +constexpr U32 AGENT_CONTROL_MOUSELOOK           = 0x1 << CONTROL_MOUSELOOK_INDEX;       // 0x00040000 + +constexpr U32 AGENT_CONTROL_NUDGE_AT_POS        = 0x1 << CONTROL_NUDGE_AT_POS_INDEX;    // 0x00080000 +constexpr U32 AGENT_CONTROL_NUDGE_AT_NEG        = 0x1 << CONTROL_NUDGE_AT_NEG_INDEX;    // 0x00100000 +constexpr U32 AGENT_CONTROL_NUDGE_LEFT_POS      = 0x1 << CONTROL_NUDGE_LEFT_POS_INDEX;  // 0x00200000 +constexpr U32 AGENT_CONTROL_NUDGE_LEFT_NEG      = 0x1 << CONTROL_NUDGE_LEFT_NEG_INDEX;  // 0x00400000 +constexpr U32 AGENT_CONTROL_NUDGE_UP_POS        = 0x1 << CONTROL_NUDGE_UP_POS_INDEX;    // 0x00800000 +constexpr U32 AGENT_CONTROL_NUDGE_UP_NEG        = 0x1 << CONTROL_NUDGE_UP_NEG_INDEX;    // 0x01000000 +constexpr U32 AGENT_CONTROL_TURN_LEFT           = 0x1 << CONTROL_TURN_LEFT_INDEX;       // 0x02000000 +constexpr U32 AGENT_CONTROL_TURN_RIGHT          = 0x1 << CONTROL_TURN_RIGHT_INDEX;      // 0x04000000 + +constexpr U32 AGENT_CONTROL_AWAY                = 0x1 << CONTROL_AWAY_INDEX;            // 0x08000000 + +constexpr U32 AGENT_CONTROL_LBUTTON_DOWN        = 0x1 << CONTROL_LBUTTON_DOWN_INDEX;    // 0x10000000 +constexpr U32 AGENT_CONTROL_LBUTTON_UP          = 0x1 << CONTROL_LBUTTON_UP_INDEX;      // 0x20000000 +constexpr U32 AGENT_CONTROL_ML_LBUTTON_DOWN     = 0x1 << CONTROL_ML_LBUTTON_DOWN_INDEX; // 0x40000000 +constexpr U32 AGENT_CONTROL_ML_LBUTTON_UP       = ((U32)0x1) << CONTROL_ML_LBUTTON_UP_INDEX;    // 0x80000000  // move these up so that we can hide them in "State" for object updates  // (for now) -const U32 AGENT_ATTACH_OFFSET               = 4; -const U32 AGENT_ATTACH_MASK                 = 0xf << AGENT_ATTACH_OFFSET; +constexpr U32 AGENT_ATTACH_OFFSET               = 4; +constexpr U32 AGENT_ATTACH_MASK                 = 0xf << AGENT_ATTACH_OFFSET;  // RN: this method swaps the upper and lower nibbles to maintain backward  // compatibility with old objects that only used the upper nibble  #define ATTACHMENT_ID_FROM_STATE(state) ((S32)((((U8)state & AGENT_ATTACH_MASK) >> 4) | (((U8)state & ~AGENT_ATTACH_MASK) << 4)))  // DO NOT CHANGE THE SEQUENCE OF THIS LIST!! -const U8 CLICK_ACTION_NONE = 0; -const U8 CLICK_ACTION_TOUCH = 0; -const U8 CLICK_ACTION_SIT = 1; -const U8 CLICK_ACTION_BUY = 2; -const U8 CLICK_ACTION_PAY = 3; -const U8 CLICK_ACTION_OPEN = 4; -const U8 CLICK_ACTION_PLAY = 5; -const U8 CLICK_ACTION_OPEN_MEDIA = 6; -const U8 CLICK_ACTION_ZOOM = 7; -const U8 CLICK_ACTION_DISABLED = 8; -const U8 CLICK_ACTION_IGNORE = 9; +constexpr U8 CLICK_ACTION_NONE = 0; +constexpr U8 CLICK_ACTION_TOUCH = 0; +constexpr U8 CLICK_ACTION_SIT = 1; +constexpr U8 CLICK_ACTION_BUY = 2; +constexpr U8 CLICK_ACTION_PAY = 3; +constexpr U8 CLICK_ACTION_OPEN = 4; +constexpr U8 CLICK_ACTION_PLAY = 5; +constexpr U8 CLICK_ACTION_OPEN_MEDIA = 6; +constexpr U8 CLICK_ACTION_ZOOM = 7; +constexpr U8 CLICK_ACTION_DISABLED = 8; +constexpr U8 CLICK_ACTION_IGNORE = 9;  // DO NOT CHANGE THE SEQUENCE OF THIS LIST!! +constexpr U32 BEACON_SHOW_MAP  = 0x0001; +constexpr U32 BEACON_FOCUS_MAP = 0x0002;  #endif diff --git a/indra/llcommon/lldefs.h b/indra/llcommon/lldefs.h index 2fbb26dc1a..232987da14 100644 --- a/indra/llcommon/lldefs.h +++ b/indra/llcommon/lldefs.h @@ -171,13 +171,13 @@ constexpr U32   MAXADDRSTR      = 17;       // 123.567.901.345 = 15 chars + \0 +  // recursion tail  template <typename T> -inline auto llmax(T data) +constexpr auto llmax(T data)  {      return data;  }  template <typename T0, typename T1, typename... Ts> -inline auto llmax(T0 d0, T1 d1, Ts... rest) +constexpr auto llmax(T0 d0, T1 d1, Ts... rest)  {      auto maxrest = llmax(d1, rest...);      return (d0 > maxrest)? d0 : maxrest; @@ -185,20 +185,20 @@ inline auto llmax(T0 d0, T1 d1, Ts... rest)  // recursion tail  template <typename T> -inline auto llmin(T data) +constexpr auto llmin(T data)  {      return data;  }  template <typename T0, typename T1, typename... Ts> -inline auto llmin(T0 d0, T1 d1, Ts... rest) +constexpr auto llmin(T0 d0, T1 d1, Ts... rest)  {      auto minrest = llmin(d1, rest...);      return (d0 < minrest) ? d0 : minrest;  }  template <typename A, typename MIN, typename MAX> -inline A llclamp(A a, MIN minval, MAX maxval) +constexpr A llclamp(A a, MIN minval, MAX maxval)  {      A aminval{ static_cast<A>(minval) }, amaxval{ static_cast<A>(maxval) };      if ( a < aminval ) @@ -213,13 +213,13 @@ inline A llclamp(A a, MIN minval, MAX maxval)  }  template <class LLDATATYPE> -inline LLDATATYPE llclampf(LLDATATYPE a) +constexpr LLDATATYPE llclampf(LLDATATYPE a)  {      return llmin(llmax(a, LLDATATYPE(0)), LLDATATYPE(1));  }  template <class LLDATATYPE> -inline LLDATATYPE llclampb(LLDATATYPE a) +constexpr LLDATATYPE llclampb(LLDATATYPE a)  {      return llmin(llmax(a, LLDATATYPE(0)), LLDATATYPE(255));  } diff --git a/indra/llcommon/llsdutil.h b/indra/llcommon/llsdutil.h index 38bbe19ddd..c31030c5ea 100644 --- a/indra/llcommon/llsdutil.h +++ b/indra/llcommon/llsdutil.h @@ -553,6 +553,61 @@ LLSD shallow(LLSD value, LLSD filter=LLSD()) { return llsd_shallow(value, filter  } // namespace llsd +/***************************************************************************** + *   toArray(), toMap() + *****************************************************************************/ +namespace llsd +{ + +// For some T convertible to LLSD, given std::vector<T> myVec, +// toArray(myVec) returns an LLSD array whose entries correspond to the +// items in myVec. +// For some U convertible to LLSD, given function U xform(const T&), +// toArray(myVec, xform) returns an LLSD array whose every entry is +// xform(item) of the corresponding item in myVec. +// toArray() actually works with any container<C> usable with range +// 'for', not just std::vector. +// (Once we get C++20 we can use std::identity instead of this default lambda.) +template<typename C, typename FUNC> +LLSD toArray(const C& container, FUNC&& func = [](const auto& arg) { return arg; }) +{ +    LLSD array; +    for (const auto& item : container) +    { +        array.append(std::forward<FUNC>(func)(item)); +    } +    return array; +} + +// For some T convertible to LLSD, given std::map<std::string, T> myMap, +// toMap(myMap) returns an LLSD map whose entries correspond to the +// (key, value) pairs in myMap. +// For some U convertible to LLSD, given function +// std::pair<std::string, U> xform(const std::pair<std::string, T>&), +// toMap(myMap, xform) returns an LLSD map whose every entry is +// xform(pair) of the corresponding (key, value) pair in myMap. +// toMap() actually works with any container usable with range 'for', not +// just std::map. It need not even be an associative container, as long as +// you pass an xform function that returns std::pair<std::string, U>. +// (Once we get C++20 we can use std::identity instead of this default lambda.) +template<typename C, typename FUNC> +LLSD toMap(const C& container, FUNC&& func = [](const auto& arg) { return arg; }) +{ +    LLSD map; +    for (const auto& pair : container) +    { +        const auto& [key, value] = std::forward<FUNC>(func)(pair); +        map[key] = value; +    } +    return map; +} + +} // namespace llsd + +/***************************************************************************** + *   boost::hash<LLSD> + *****************************************************************************/ +  // Specialization for generating a hash value from an LLSD block.  namespace boost  { diff --git a/indra/llcommon/lluuid.cpp b/indra/llcommon/lluuid.cpp index 6d7cf473f5..3fbc45baaf 100644 --- a/indra/llcommon/lluuid.cpp +++ b/indra/llcommon/lluuid.cpp @@ -174,14 +174,6 @@ void LLUUID::toString(std::string& out) const          (U8)(mData[15]));  } -// *TODO: deprecate -void LLUUID::toString(char* out) const -{ -    std::string buffer; -    toString(buffer); -    strcpy(out, buffer.c_str()); /* Flawfinder: ignore */ -} -  void LLUUID::toCompressedString(std::string& out) const  {      char bytes[UUID_BYTES + 1]; @@ -190,13 +182,6 @@ void LLUUID::toCompressedString(std::string& out) const      out.assign(bytes, UUID_BYTES);  } -// *TODO: deprecate -void LLUUID::toCompressedString(char* out) const -{ -    memcpy(out, mData, UUID_BYTES);     /* Flawfinder: ignore */ -    out[UUID_BYTES] = '\0'; -} -  std::string LLUUID::getString() const  {      return asString(); diff --git a/indra/llcommon/lluuid.h b/indra/llcommon/lluuid.h index bd4edc7993..ca1cf03c4d 100644 --- a/indra/llcommon/lluuid.h +++ b/indra/llcommon/lluuid.h @@ -103,9 +103,7 @@ public:      friend LL_COMMON_API std::ostream&   operator<<(std::ostream& s, const LLUUID &uuid);      friend LL_COMMON_API std::istream&   operator>>(std::istream& s, LLUUID &uuid); -    void toString(char *out) const;     // Does not allocate memory, needs 36 characters (including \0)      void toString(std::string& out) const; -    void toCompressedString(char *out) const;   // Does not allocate memory, needs 17 characters (including \0)      void toCompressedString(std::string& out) const;      std::string asString() const; diff --git a/indra/llcommon/stdtypes.h b/indra/llcommon/stdtypes.h index b40a718593..78d5e50e4b 100644 --- a/indra/llcommon/stdtypes.h +++ b/indra/llcommon/stdtypes.h @@ -169,14 +169,14 @@ private:      FROM mValue;  public: -    narrow(FROM value): mValue(value) {} +    constexpr narrow(FROM value): mValue(value) {}      /*---------------------- Narrowing unsigned to signed ----------------------*/      template <typename TO,                typename std::enable_if<std::is_unsigned<FROM>::value &&                                        std::is_signed<TO>::value,                                        bool>::type = true> -    inline +    constexpr      operator TO() const      {          // The reason we skip the @@ -194,7 +194,7 @@ public:                typename std::enable_if<! (std::is_unsigned<FROM>::value &&                                           std::is_signed<TO>::value),                                        bool>::type = true> -    inline +    constexpr      operator TO() const      {          // two different assert()s so we can tell which condition failed diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h index 67d713db1f..759638b956 100644 --- a/indra/llinventory/llparcel.h +++ b/indra/llinventory/llparcel.h @@ -262,6 +262,8 @@ public:      void setMediaURLResetTimer(F32 time);      virtual void    setLocalID(S32 local_id); +    void setRegionID(const LLUUID& id) { mRegionID = id; } +    const LLUUID& getRegionID() const { return mRegionID; }      // blow away all the extra stuff lurking in parcels, including urls, access lists, etc      void clearParcel(); @@ -651,6 +653,7 @@ public:      S32                 mLocalID;      LLUUID              mBanListTransactionID;      LLUUID              mAccessListTransactionID; +    LLUUID              mRegionID;      std::map<LLUUID,LLAccessEntry>  mAccessList;      std::map<LLUUID,LLAccessEntry>  mBanList;      std::map<LLUUID,LLAccessEntry>  mTempBanList; diff --git a/indra/llinventory/llsettingsbase.h b/indra/llinventory/llsettingsbase.h index 7de71588ef..bea6fdec97 100644 --- a/indra/llinventory/llsettingsbase.h +++ b/indra/llinventory/llsettingsbase.h @@ -398,7 +398,7 @@ protected:  private:      bool        mLLSDDirty; -    bool        mDirty; +    bool        mDirty; // gates updateSettings      bool        mReplaced; // super dirty!      static LLSD combineSDMaps(const LLSD &first, const LLSD &other); diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp index e8ecc94b4b..ad37b08df7 100644 --- a/indra/llinventory/llsettingssky.cpp +++ b/indra/llinventory/llsettingssky.cpp @@ -1933,6 +1933,7 @@ LLUUID LLSettingsSky::getCloudNoiseTextureId() const  void LLSettingsSky::setCloudNoiseTextureId(const LLUUID &id)  {      mCloudTextureId = id; +    setDirtyFlag(true);      setLLSDDirty();  } @@ -1977,6 +1978,7 @@ LLVector2 LLSettingsSky::getCloudScrollRate() const  void LLSettingsSky::setCloudScrollRate(const LLVector2 &val)  {      mScrollRate = val; +    setDirtyFlag(true);      setLLSDDirty();  } @@ -2135,6 +2137,7 @@ LLUUID LLSettingsSky::getMoonTextureId() const  void LLSettingsSky::setMoonTextureId(LLUUID id)  {      mMoonTextureId = id; +    setDirtyFlag(true);      setLLSDDirty();  } @@ -2219,6 +2222,7 @@ LLUUID LLSettingsSky::getSunTextureId() const  void LLSettingsSky::setSunTextureId(LLUUID id)  {      mSunTextureId = id; +    setDirtyFlag(true);      setLLSDDirty();  } diff --git a/indra/llmath/llcamera.h b/indra/llmath/llcamera.h index b6e0e4a2be..6201761c46 100644 --- a/indra/llmath/llcamera.h +++ b/indra/llmath/llcamera.h @@ -33,23 +33,23 @@  #include "llplane.h"  #include "llvector4a.h" -const F32 DEFAULT_FIELD_OF_VIEW     = 60.f * DEG_TO_RAD; -const F32 DEFAULT_ASPECT_RATIO      = 640.f / 480.f; -const F32 DEFAULT_NEAR_PLANE        = 0.25f; -const F32 DEFAULT_FAR_PLANE         = 64.f; // far reaches across two horizontal, not diagonal, regions +constexpr F32 DEFAULT_FIELD_OF_VIEW = 60.f * DEG_TO_RAD; +constexpr F32 DEFAULT_ASPECT_RATIO  = 640.f / 480.f; +constexpr F32 DEFAULT_NEAR_PLANE    = 0.25f; +constexpr F32 DEFAULT_FAR_PLANE     = 64.f; // far reaches across two horizontal, not diagonal, regions -const F32 MAX_ASPECT_RATIO  = 50.0f; -const F32 MAX_NEAR_PLANE    = 1023.9f; // Clamp the near plane just before the skybox ends -const F32 MAX_FAR_PLANE     = 100000.0f; //1000000.0f; // Max allowed. Not good Z precision though. -const F32 MAX_FAR_CLIP      = 512.0f; +constexpr F32 MAX_ASPECT_RATIO  = 50.0f; +constexpr F32 MAX_NEAR_PLANE    = 1023.9f;   // Clamp the near plane just before the skybox ends +constexpr F32 MAX_FAR_PLANE     = 100000.0f; //1000000.0f; // Max allowed. Not good Z precision though. +constexpr F32 MAX_FAR_CLIP      = 512.0f; -const F32 MIN_ASPECT_RATIO  = 0.02f; -const F32 MIN_NEAR_PLANE    = 0.1f; -const F32 MIN_FAR_PLANE     = 0.2f; +constexpr F32 MIN_ASPECT_RATIO  = 0.02f; +constexpr F32 MIN_NEAR_PLANE    = 0.1f; +constexpr F32 MIN_FAR_PLANE     = 0.2f;  // Min/Max FOV values for square views. Call getMin/MaxView to get extremes based on current aspect ratio. -static const F32 MIN_FIELD_OF_VIEW = 5.0f * DEG_TO_RAD; -static const F32 MAX_FIELD_OF_VIEW = 175.f * DEG_TO_RAD; +constexpr F32 MIN_FIELD_OF_VIEW = 5.0f * DEG_TO_RAD; +constexpr F32 MAX_FIELD_OF_VIEW = 175.f * DEG_TO_RAD;  // An LLCamera is an LLCoorFrame with a view frustum.  // This means that it has several methods for moving it around diff --git a/indra/llmath/llcoordframe.cpp b/indra/llmath/llcoordframe.cpp index 4d6276b2cd..15c9f6ff3f 100644 --- a/indra/llmath/llcoordframe.cpp +++ b/indra/llmath/llcoordframe.cpp @@ -26,7 +26,6 @@  #include "linden_common.h" -//#include "vmath.h"  #include "v3math.h"  #include "m3math.h"  #include "v4math.h" diff --git a/indra/llmath/llcoordframe.h b/indra/llmath/llcoordframe.h index aaa701f792..458f6132c9 100644 --- a/indra/llmath/llcoordframe.h +++ b/indra/llmath/llcoordframe.h @@ -61,7 +61,7 @@ public:      //LLCoordFrame(const F32 *origin, const F32 *rotation); // Assumes "origin" is 1x3 and "rotation" is 1x9 array      //LLCoordFrame(const F32 *origin_and_rotation);         // Assumes "origin_and_rotation" is 1x12 array -    bool isFinite() { return mOrigin.isFinite() && mXAxis.isFinite() && mYAxis.isFinite() && mZAxis.isFinite(); } +    bool isFinite() const { return mOrigin.isFinite() && mXAxis.isFinite() && mYAxis.isFinite() && mZAxis.isFinite(); }      void reset();      void resetAxes(); diff --git a/indra/llmath/llline.h b/indra/llmath/llline.h index 33c1eb61a4..e98e173d1f 100644 --- a/indra/llmath/llline.h +++ b/indra/llmath/llline.h @@ -33,7 +33,7 @@  #include "stdtypes.h"  #include "v3math.h" -const F32 DEFAULT_INTERSECTION_ERROR = 0.000001f; +constexpr F32 DEFAULT_INTERSECTION_ERROR = 0.000001f;  class LLLine  { diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h index a72993a21a..7f51de7820 100644 --- a/indra/llmath/llmath.h +++ b/indra/llmath/llmath.h @@ -39,18 +39,8 @@  // llcommon depend on llmath.  #include "is_approx_equal_fraction.h" -// work around for Windows & older gcc non-standard function names. -#if LL_WINDOWS -#include <float.h> -#define llisnan(val)    _isnan(val) -#define llfinite(val)   _finite(val) -#elif (LL_LINUX && __GNUC__ <= 2) -#define llisnan(val)    isnan(val) -#define llfinite(val)   isfinite(val) -#else -#define llisnan(val)    std::isnan(val) -#define llfinite(val)   std::isfinite(val) -#endif +#define llisnan(val)  std::isnan(val) +#define llfinite(val) std::isfinite(val)  // Single Precision Floating Point Routines  // (There used to be more defined here, but they appeared to be redundant and @@ -89,7 +79,7 @@ constexpr F32   GIMBAL_THRESHOLD = 0.000436f; // sets the gimballock threshold 0  constexpr F32 FP_MAG_THRESHOLD = 0.0000001f;  // TODO: Replace with logic like is_approx_equal -inline bool is_approx_zero( F32 f ) { return (-F_APPROXIMATELY_ZERO < f) && (f < F_APPROXIMATELY_ZERO); } +constexpr bool is_approx_zero(F32 f) { return (-F_APPROXIMATELY_ZERO < f) && (f < F_APPROXIMATELY_ZERO); }  // These functions work by interpreting sign+exp+mantissa as an unsigned  // integer. @@ -148,33 +138,17 @@ inline F64 llabs(const F64 a)      return F64(std::fabs(a));  } -inline S32 lltrunc( F32 f ) +constexpr S32 lltrunc(F32 f)  { -#if LL_WINDOWS && !defined( __INTEL_COMPILER ) && (ADDRESS_SIZE == 32) -        // Avoids changing the floating point control word. -        // Add or subtract 0.5 - epsilon and then round -        const static U32 zpfp[] = { 0xBEFFFFFF, 0x3EFFFFFF }; -        S32 result; -        __asm { -            fld     f -            mov     eax,    f -            shr     eax,    29 -            and     eax,    4 -            fadd    dword ptr [zpfp + eax] -            fistp   result -        } -        return result; -#else -        return (S32)f; -#endif +    return narrow(f);  } -inline S32 lltrunc( F64 f ) +constexpr S32 lltrunc(F64 f)  { -    return (S32)f; +    return narrow(f);  } -inline S32 llfloor( F32 f ) +inline S32 llfloor(F32 f)  {  #if LL_WINDOWS && !defined( __INTEL_COMPILER ) && (ADDRESS_SIZE == 32)          // Avoids changing the floating point control word. @@ -284,7 +258,7 @@ constexpr F32 FAST_MAG_BETA = 0.397824734759f;  //constexpr F32 FAST_MAG_ALPHA = 0.948059448969f;  //constexpr F32 FAST_MAG_BETA = 0.392699081699f; -inline F32 fastMagnitude(F32 a, F32 b) +constexpr F32 fastMagnitude(F32 a, F32 b)  {      a = (a > 0) ? a : -a;      b = (b > 0) ? b : -b; @@ -342,7 +316,7 @@ inline F32 llfastpow(const F32 x, const F32 y)  } -inline F32 snap_to_sig_figs(F32 foo, S32 sig_figs) +constexpr F32 snap_to_sig_figs(F32 foo, S32 sig_figs)  {      // compute the power of ten      F32 bar = 1.f; @@ -358,16 +332,9 @@ inline F32 snap_to_sig_figs(F32 foo, S32 sig_figs)      return new_foo;  } -#ifdef __GNUC__  using std::lerp; -#else -inline F32 lerp(F32 a, F32 b, F32 u) -{ -    return a + ((b - a) * u); -} -#endif -inline F32 lerp2d(F32 x00, F32 x01, F32 x10, F32 x11, F32 u, F32 v) +constexpr F32 lerp2d(F32 x00, F32 x01, F32 x10, F32 x11, F32 u, F32 v)  {      F32 a = x00 + (x01-x00)*u;      F32 b = x10 + (x11-x10)*u; @@ -375,17 +342,17 @@ inline F32 lerp2d(F32 x00, F32 x01, F32 x10, F32 x11, F32 u, F32 v)      return r;  } -inline F32 ramp(F32 x, F32 a, F32 b) +constexpr F32 ramp(F32 x, F32 a, F32 b)  {      return (a == b) ? 0.0f : ((a - x) / (a - b));  } -inline F32 rescale(F32 x, F32 x1, F32 x2, F32 y1, F32 y2) +constexpr F32 rescale(F32 x, F32 x1, F32 x2, F32 y1, F32 y2)  {      return lerp(y1, y2, ramp(x, x1, x2));  } -inline F32 clamp_rescale(F32 x, F32 x1, F32 x2, F32 y1, F32 y2) +constexpr F32 clamp_rescale(F32 x, F32 x1, F32 x2, F32 y1, F32 y2)  {      if (y1 < y2)      { @@ -398,7 +365,7 @@ inline F32 clamp_rescale(F32 x, F32 x1, F32 x2, F32 y1, F32 y2)  } -inline F32 cubic_step( F32 x, F32 x0, F32 x1, F32 s0, F32 s1 ) +constexpr F32 cubic_step( F32 x, F32 x0, F32 x1, F32 s0, F32 s1 )  {      if (x <= x0)          return s0; @@ -411,14 +378,14 @@ inline F32 cubic_step( F32 x, F32 x0, F32 x1, F32 s0, F32 s1 )      return  s0 + (s1 - s0) * (f * f) * (3.0f - 2.0f * f);  } -inline F32 cubic_step( F32 x ) +constexpr F32 cubic_step( F32 x )  {      x = llclampf(x);      return  (x * x) * (3.0f - 2.0f * x);  } -inline F32 quadratic_step( F32 x, F32 x0, F32 x1, F32 s0, F32 s1 ) +constexpr F32 quadratic_step( F32 x, F32 x0, F32 x1, F32 s0, F32 s1 )  {      if (x <= x0)          return s0; @@ -432,7 +399,7 @@ inline F32 quadratic_step( F32 x, F32 x0, F32 x1, F32 s0, F32 s1 )      return  (s0 * (1.f - f_squared)) + ((s1 - s0) * f_squared);  } -inline F32 llsimple_angle(F32 angle) +constexpr F32 llsimple_angle(F32 angle)  {      while(angle <= -F_PI)          angle += F_TWO_PI; @@ -442,7 +409,7 @@ inline F32 llsimple_angle(F32 angle)  }  //SDK - Renamed this to get_lower_power_two, since this is what this actually does. -inline U32 get_lower_power_two(U32 val, U32 max_power_two) +constexpr U32 get_lower_power_two(U32 val, U32 max_power_two)  {      if(!max_power_two)      { @@ -464,7 +431,7 @@ inline U32 get_lower_power_two(U32 val, U32 max_power_two)  // number of digits, then add one.  We subtract 1 initially to handle  // the case where the number passed in is actually a power of two.  // WARNING: this only works with 32 bit ints. -inline U32 get_next_power_two(U32 val, U32 max_power_two) +constexpr U32 get_next_power_two(U32 val, U32 max_power_two)  {      if(!max_power_two)      { @@ -490,7 +457,7 @@ inline U32 get_next_power_two(U32 val, U32 max_power_two)  //get the gaussian value given the linear distance from axis x and guassian value o  inline F32 llgaussian(F32 x, F32 o)  { -    return 1.f/(F_SQRT_TWO_PI*o)*powf(F_E, -(x*x)/(2*o*o)); +    return 1.f/(F_SQRT_TWO_PI*o)*powf(F_E, -(x*x)/(2.f*o*o));  }  //helper function for removing outliers @@ -543,7 +510,8 @@ inline void ll_remove_outliers(std::vector<VEC_TYPE>& data, F32 k)  // Note: in our code, values labeled as sRGB are ALWAYS gamma corrected linear values, NOT linear values with monitor gamma applied  // Note: stored color values should always be gamma corrected linear (i.e. the values returned from an on-screen color swatch)  // Note: DO NOT cache the conversion.  This leads to error prone synchronization and is actually slower in the typical case due to cache misses -inline float linearTosRGB(const float val) { +inline float linearTosRGB(const float val) +{      if (val < 0.0031308f) {          return val * 12.92f;      } @@ -558,7 +526,8 @@ inline float linearTosRGB(const float val) {  // Note: Stored color values should generally be gamma corrected sRGB.  //       If you're serializing the return value of this function, you're probably doing it wrong.  // Note: DO NOT cache the conversion.  This leads to error prone synchronization and is actually slower in the typical case due to cache misses. -inline float sRGBtoLinear(const float val) { +inline float sRGBtoLinear(const float val) +{      if (val < 0.04045f) {          return val / 12.92f;      } diff --git a/indra/llmath/llquaternion.cpp b/indra/llmath/llquaternion.cpp index aefb82b2f0..1ab3a73d79 100644 --- a/indra/llmath/llquaternion.cpp +++ b/indra/llmath/llquaternion.cpp @@ -30,7 +30,6 @@  #include "llquaternion.h" -//#include "vmath.h"  #include "v3math.h"  #include "v3dmath.h"  #include "v4math.h" diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 6335da5b62..ca7bd8907b 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -1298,10 +1298,11 @@ void LLPath::genNGon(const LLPathParams& params, S32 sides, F32 startOff, F32 en      c       = cos(ang)*lerp(radius_start, radius_end, t); -    pt->mPos.set(0 + lerp(0,params.getShear().mV[0],s) +    pt->mPos.set(0 + lerp(0.f, params.getShear().mV[VX], s)                        + lerp(-skew ,skew, t) * 0.5f, -                    c + lerp(0,params.getShear().mV[1],s), +                    c + lerp(0.f, params.getShear().mV[VY], s),                      s); +      pt->mScale.set(hole_x * lerp(taper_x_begin, taper_x_end, t),          hole_y * lerp(taper_y_begin, taper_y_end, t),          0,1); @@ -1331,9 +1332,9 @@ void LLPath::genNGon(const LLPathParams& params, S32 sides, F32 startOff, F32 en          c   = cos(ang)*lerp(radius_start, radius_end, t);          s   = sin(ang)*lerp(radius_start, radius_end, t); -        pt->mPos.set(0 + lerp(0,params.getShear().mV[0],s) +        pt->mPos.set(0 + lerp(0.f, params.getShear().mV[VX], s)                            + lerp(-skew ,skew, t) * 0.5f, -                        c + lerp(0,params.getShear().mV[1],s), +                        c + lerp(0.f, params.getShear().mV[VY], s),                          s);          pt->mScale.set(hole_x * lerp(taper_x_begin, taper_x_end, t), @@ -1358,9 +1359,9 @@ void LLPath::genNGon(const LLPathParams& params, S32 sides, F32 startOff, F32 en      c   = cos(ang)*lerp(radius_start, radius_end, t);      s   = sin(ang)*lerp(radius_start, radius_end, t); -    pt->mPos.set(0 + lerp(0,params.getShear().mV[0],s) +    pt->mPos.set(0 + lerp(0.f, params.getShear().mV[VX], s)                        + lerp(-skew ,skew, t) * 0.5f, -                    c + lerp(0,params.getShear().mV[1],s), +                    c + lerp(0.f, params.getShear().mV[VY], s),                      s);      pt->mScale.set(hole_x * lerp(taper_x_begin, taper_x_end, t),                     hole_y * lerp(taper_y_begin, taper_y_end, t), @@ -1498,8 +1499,8 @@ bool LLPath::generate(const LLPathParams& params, F32 detail, S32 split,              for (S32 i=0;i<np;i++)              {                  F32 t = lerp(params.getBegin(),params.getEnd(),(F32)i * mStep); -                mPath[i].mPos.set(lerp(0,params.getShear().mV[0],t), -                                     lerp(0,params.getShear().mV[1],t), +                mPath[i].mPos.set(lerp(0.f, params.getShear().mV[VX], t), +                                     lerp(0.f ,params.getShear().mV[VY], t),                                       t - 0.5f);                  LLQuaternion quat;                  quat.setQuat(lerp(F_PI * params.getTwistBegin(),F_PI * params.getTwist(),t),0,0,1); @@ -1563,10 +1564,10 @@ bool LLPath::generate(const LLPathParams& params, F32 detail, S32 split,          {              F32 t = (F32)i * mStep;              mPath[i].mPos.set(0, -                                lerp(0,   -sin(F_PI*params.getTwist()*t)*0.5f,t), -                                lerp(-0.5f, cos(F_PI*params.getTwist()*t)*0.5f,t)); -            mPath[i].mScale.set(lerp(1,params.getScale().mV[0],t), -                                lerp(1,params.getScale().mV[1],t), 0,1); +                                lerp(0.f,  -sin(F_PI*params.getTwist() * t) * 0.5f, t), +                                lerp(-0.5f, cos(F_PI*params.getTwist() * t) * 0.5f, t)); +            mPath[i].mScale.set(lerp(1.f, params.getScale().mV[VX], t), +                                lerp(1.f, params.getScale().mV[VY], t), 0.f, 1.f);              mPath[i].mTexT  = t;              LLQuaternion quat;              quat.setQuat(F_PI * params.getTwist() * t,1,0,0); diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h index 27c5fc5a49..3496928f7b 100644 --- a/indra/llmath/llvolume.h +++ b/indra/llmath/llvolume.h @@ -45,7 +45,6 @@ class LLVolumeOctree;  #include "lluuid.h"  #include "v4color.h" -//#include "vmath.h"  #include "v2math.h"  #include "v3math.h"  #include "v3dmath.h" diff --git a/indra/llmath/m3math.cpp b/indra/llmath/m3math.cpp index 472d340af5..3c2097f947 100644 --- a/indra/llmath/m3math.cpp +++ b/indra/llmath/m3math.cpp @@ -26,7 +26,6 @@  #include "linden_common.h" -//#include "vmath.h"  #include "v3math.h"  #include "v3dmath.h"  #include "v4math.h" diff --git a/indra/llmath/m4math.cpp b/indra/llmath/m4math.cpp index c46ee587cb..a9853fe7e9 100644 --- a/indra/llmath/m4math.cpp +++ b/indra/llmath/m4math.cpp @@ -26,7 +26,6 @@  #include "linden_common.h" -//#include "vmath.h"  #include "v3math.h"  #include "v4math.h"  #include "m4math.h" diff --git a/indra/llmath/v2math.cpp b/indra/llmath/v2math.cpp index 4649e13376..59e6d947ca 100644 --- a/indra/llmath/v2math.cpp +++ b/indra/llmath/v2math.cpp @@ -26,7 +26,6 @@  #include "linden_common.h" -//#include "vmath.h"  #include "v2math.h"  #include "v3math.h"  #include "v4math.h" @@ -47,8 +46,8 @@ bool LLVector2::abs()  {      bool ret{ false }; -    if (mV[0] < 0.f) { mV[0] = -mV[0]; ret = true; } -    if (mV[1] < 0.f) { mV[1] = -mV[1]; ret = true; } +    if (mV[VX] < 0.f) { mV[VX] = -mV[VX]; ret = true; } +    if (mV[VY] < 0.f) { mV[VY] = -mV[VY]; ret = true; }      return ret;  } @@ -67,14 +66,14 @@ F32 angle_between(const LLVector2& a, const LLVector2& b)      return angle;  } -bool are_parallel(const LLVector2 &a, const LLVector2 &b, float epsilon) +bool are_parallel(const LLVector2& a, const LLVector2& b, F32 epsilon)  {      LLVector2 an = a;      LLVector2 bn = b;      an.normVec();      bn.normVec();      F32 dot = an * bn; -    if ( (1.0f - fabs(dot)) < epsilon) +    if ((1.0f - fabs(dot)) < epsilon)      {          return true;      } @@ -82,28 +81,28 @@ bool are_parallel(const LLVector2 &a, const LLVector2 &b, float epsilon)  } -F32 dist_vec(const LLVector2 &a, const LLVector2 &b) +F32 dist_vec(const LLVector2& a, const LLVector2& b)  { -    F32 x = a.mV[0] - b.mV[0]; -    F32 y = a.mV[1] - b.mV[1]; +    F32 x = a.mV[VX] - b.mV[VX]; +    F32 y = a.mV[VY] - b.mV[VY];      return (F32) sqrt( x*x + y*y );  } -F32 dist_vec_squared(const LLVector2 &a, const LLVector2 &b) +F32 dist_vec_squared(const LLVector2& a, const LLVector2& b)  { -    F32 x = a.mV[0] - b.mV[0]; -    F32 y = a.mV[1] - b.mV[1]; +    F32 x = a.mV[VX] - b.mV[VX]; +    F32 y = a.mV[VY] - b.mV[VY];      return x*x + y*y;  } -F32 dist_vec_squared2D(const LLVector2 &a, const LLVector2 &b) +F32 dist_vec_squared2D(const LLVector2& a, const LLVector2& b)  { -    F32 x = a.mV[0] - b.mV[0]; -    F32 y = a.mV[1] - b.mV[1]; +    F32 x = a.mV[VX] - b.mV[VX]; +    F32 y = a.mV[VY] - b.mV[VY];      return x*x + y*y;  } -LLVector2 lerp(const LLVector2 &a, const LLVector2 &b, F32 u) +LLVector2 lerp(const LLVector2& a, const LLVector2& b, F32 u)  {      return LLVector2(          a.mV[VX] + (b.mV[VX] - a.mV[VX]) * u, @@ -113,14 +112,14 @@ LLVector2 lerp(const LLVector2 &a, const LLVector2 &b, F32 u)  LLSD LLVector2::getValue() const  {      LLSD ret; -    ret[0] = mV[0]; -    ret[1] = mV[1]; +    ret[VX] = mV[VX]; +    ret[VY] = mV[VY];      return ret;  }  void LLVector2::setValue(const LLSD& sd)  { -    mV[0] = (F32) sd[0].asReal(); -    mV[1] = (F32) sd[1].asReal(); +    mV[VX] = (F32) sd[0].asReal(); +    mV[VY] = (F32) sd[1].asReal();  } diff --git a/indra/llmath/v2math.h b/indra/llmath/v2math.h index a61c946304..18ad02a411 100644 --- a/indra/llmath/v2math.h +++ b/indra/llmath/v2math.h @@ -36,7 +36,7 @@ class LLQuaternion;  //  Llvector2 = |x y z w| -static const U32 LENGTHOFVECTOR2 = 2; +static constexpr U32 LENGTHOFVECTOR2 = 2;  class LLVector2  { @@ -82,7 +82,7 @@ class LLVector2          const LLVector2&    scaleVec(const LLVector2& vec);             // scales per component by vec -        bool isNull();          // Returns true if vector has a _very_small_ length +        bool isNull() const;          // Returns true if vector has a _very_small_ length          bool isExactlyZero() const      { return !mV[VX] && !mV[VY]; }          F32 operator[](int idx) const { return mV[idx]; } @@ -113,16 +113,16 @@ class LLVector2  // Non-member functions -F32 angle_between(const LLVector2 &a, const LLVector2 &b);  // Returns angle (radians) between a and b -bool are_parallel(const LLVector2 &a, const LLVector2 &b, F32 epsilon=F_APPROXIMATELY_ZERO);    // Returns true if a and b are very close to parallel -F32 dist_vec(const LLVector2 &a, const LLVector2 &b);       // Returns distance between a and b -F32 dist_vec_squared(const LLVector2 &a, const LLVector2 &b);// Returns distance squared between a and b -F32 dist_vec_squared2D(const LLVector2 &a, const LLVector2 &b);// Returns distance squared between a and b ignoring Z component -LLVector2 lerp(const LLVector2 &a, const LLVector2 &b, F32 u); // Returns a vector that is a linear interpolation between a and b +F32 angle_between(const LLVector2& a, const LLVector2& b);  // Returns angle (radians) between a and b +bool are_parallel(const LLVector2& a, const LLVector2& b, F32 epsilon = F_APPROXIMATELY_ZERO);    // Returns true if a and b are very close to parallel +F32 dist_vec(const LLVector2& a, const LLVector2& b);       // Returns distance between a and b +F32 dist_vec_squared(const LLVector2& a, const LLVector2& b);// Returns distance squared between a and b +F32 dist_vec_squared2D(const LLVector2& a, const LLVector2& b);// Returns distance squared between a and b ignoring Z component +LLVector2 lerp(const LLVector2& a, const LLVector2& b, F32 u); // Returns a vector that is a linear interpolation between a and b  // Constructors -inline LLVector2::LLVector2(void) +inline LLVector2::LLVector2()  {      mV[VX] = 0.f;      mV[VY] = 0.f; @@ -153,27 +153,27 @@ inline LLVector2::LLVector2(const LLSD &sd)  // Clear and Assignment Functions -inline void LLVector2::clear(void) +inline void LLVector2::clear()  {      mV[VX] = 0.f;      mV[VY] = 0.f;  } -inline void LLVector2::setZero(void) +inline void LLVector2::setZero()  {      mV[VX] = 0.f;      mV[VY] = 0.f;  }  // deprecated -inline void LLVector2::clearVec(void) +inline void LLVector2::clearVec()  {      mV[VX] = 0.f;      mV[VY] = 0.f;  }  // deprecated -inline void LLVector2::zeroVec(void) +inline void LLVector2::zeroVec()  {      mV[VX] = 0.f;      mV[VY] = 0.f; @@ -222,31 +222,31 @@ inline void LLVector2::setVec(const F32 *vec)  // LLVector2 Magnitude and Normalization Functions -inline F32 LLVector2::length(void) const +inline F32 LLVector2::length() const  { -    return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1]); +    return sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY]);  } -inline F32 LLVector2::lengthSquared(void) const +inline F32 LLVector2::lengthSquared() const  { -    return mV[0]*mV[0] + mV[1]*mV[1]; +    return mV[VX]*mV[VX] + mV[VY]*mV[VY];  } -inline F32 LLVector2::normalize(void) +inline F32 LLVector2::normalize()  { -    F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1]); +    F32 mag = sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY]);      F32 oomag;      if (mag > FP_MAG_THRESHOLD)      {          oomag = 1.f/mag; -        mV[0] *= oomag; -        mV[1] *= oomag; +        mV[VX] *= oomag; +        mV[VY] *= oomag;      }      else      { -        mV[0] = 0.f; -        mV[1] = 0.f; +        mV[VX] = 0.f; +        mV[VY] = 0.f;          mag = 0;      }      return (mag); @@ -259,33 +259,33 @@ inline bool LLVector2::isFinite() const  }  // deprecated -inline F32      LLVector2::magVec(void) const +inline F32 LLVector2::magVec() const  { -    return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1]); +    return sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY]);  }  // deprecated -inline F32      LLVector2::magVecSquared(void) const +inline F32 LLVector2::magVecSquared() const  { -    return mV[0]*mV[0] + mV[1]*mV[1]; +    return mV[VX]*mV[VX] + mV[VY]*mV[VY];  }  // deprecated -inline F32      LLVector2::normVec(void) +inline F32 LLVector2::normVec()  { -    F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1]); +    F32 mag = sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY]);      F32 oomag;      if (mag > FP_MAG_THRESHOLD)      {          oomag = 1.f/mag; -        mV[0] *= oomag; -        mV[1] *= oomag; +        mV[VX] *= oomag; +        mV[VY] *= oomag;      }      else      { -        mV[0] = 0.f; -        mV[1] = 0.f; +        mV[VX] = 0.f; +        mV[VY] = 0.f;          mag = 0;      }      return (mag); @@ -299,9 +299,9 @@ inline const LLVector2& LLVector2::scaleVec(const LLVector2& vec)      return *this;  } -inline bool LLVector2::isNull() +inline bool LLVector2::isNull() const  { -    if ( F_APPROXIMATELY_ZERO > mV[VX]*mV[VX] + mV[VY]*mV[VY] ) +    if (F_APPROXIMATELY_ZERO > mV[VX]*mV[VX] + mV[VY]*mV[VY])      {          return true;      } @@ -312,9 +312,9 @@ inline bool LLVector2::isNull()  // LLVector2 Operators  // For sorting. By convention, x is "more significant" than y. -inline bool operator<(const LLVector2 &a, const LLVector2 &b) +inline bool operator<(const LLVector2& a, const LLVector2& b)  { -    if( a.mV[VX] == b.mV[VX] ) +    if (a.mV[VX] == b.mV[VX])      {          return a.mV[VY] < b.mV[VY];      } @@ -325,95 +325,95 @@ inline bool operator<(const LLVector2 &a, const LLVector2 &b)  } -inline LLVector2 operator+(const LLVector2 &a, const LLVector2 &b) +inline LLVector2 operator+(const LLVector2& a, const LLVector2& b)  {      LLVector2 c(a);      return c += b;  } -inline LLVector2 operator-(const LLVector2 &a, const LLVector2 &b) +inline LLVector2 operator-(const LLVector2& a, const LLVector2& b)  {      LLVector2 c(a);      return c -= b;  } -inline F32  operator*(const LLVector2 &a, const LLVector2 &b) +inline F32 operator*(const LLVector2& a, const LLVector2& b)  { -    return (a.mV[0]*b.mV[0] + a.mV[1]*b.mV[1]); +    return (a.mV[VX]*b.mV[VX] + a.mV[VY]*b.mV[VY]);  } -inline LLVector2 operator%(const LLVector2 &a, const LLVector2 &b) +inline LLVector2 operator%(const LLVector2& a, const LLVector2& b)  { -    return LLVector2(a.mV[0]*b.mV[1] - b.mV[0]*a.mV[1], a.mV[1]*b.mV[0] - b.mV[1]*a.mV[0]); +    return LLVector2(a.mV[VX]*b.mV[VY] - b.mV[VX]*a.mV[VY], a.mV[VY]*b.mV[VX] - b.mV[VY]*a.mV[VX]);  } -inline LLVector2 operator/(const LLVector2 &a, F32 k) +inline LLVector2 operator/(const LLVector2& a, F32 k)  {      F32 t = 1.f / k; -    return LLVector2( a.mV[0] * t, a.mV[1] * t ); +    return LLVector2( a.mV[VX] * t, a.mV[VY] * t );  } -inline LLVector2 operator*(const LLVector2 &a, F32 k) +inline LLVector2 operator*(const LLVector2& a, F32 k)  { -    return LLVector2( a.mV[0] * k, a.mV[1] * k ); +    return LLVector2( a.mV[VX] * k, a.mV[VY] * k );  } -inline LLVector2 operator*(F32 k, const LLVector2 &a) +inline LLVector2 operator*(F32 k, const LLVector2& a)  { -    return LLVector2( a.mV[0] * k, a.mV[1] * k ); +    return LLVector2( a.mV[VX] * k, a.mV[VY] * k );  } -inline bool operator==(const LLVector2 &a, const LLVector2 &b) +inline bool operator==(const LLVector2& a, const LLVector2& b)  { -    return (  (a.mV[0] == b.mV[0]) -            &&(a.mV[1] == b.mV[1])); +    return (  (a.mV[VX] == b.mV[VX]) +            &&(a.mV[VY] == b.mV[VY]));  } -inline bool operator!=(const LLVector2 &a, const LLVector2 &b) +inline bool operator!=(const LLVector2& a, const LLVector2& b)  { -    return (  (a.mV[0] != b.mV[0]) -            ||(a.mV[1] != b.mV[1])); +    return (  (a.mV[VX] != b.mV[VX]) +            ||(a.mV[VY] != b.mV[VY]));  } -inline const LLVector2& operator+=(LLVector2 &a, const LLVector2 &b) +inline const LLVector2& operator+=(LLVector2& a, const LLVector2& b)  { -    a.mV[0] += b.mV[0]; -    a.mV[1] += b.mV[1]; +    a.mV[VX] += b.mV[VX]; +    a.mV[VY] += b.mV[VY];      return a;  } -inline const LLVector2& operator-=(LLVector2 &a, const LLVector2 &b) +inline const LLVector2& operator-=(LLVector2& a, const LLVector2& b)  { -    a.mV[0] -= b.mV[0]; -    a.mV[1] -= b.mV[1]; +    a.mV[VX] -= b.mV[VX]; +    a.mV[VY] -= b.mV[VY];      return a;  } -inline const LLVector2& operator%=(LLVector2 &a, const LLVector2 &b) +inline const LLVector2& operator%=(LLVector2& a, const LLVector2& b)  { -    LLVector2 ret(a.mV[0]*b.mV[1] - b.mV[0]*a.mV[1], a.mV[1]*b.mV[0] - b.mV[1]*a.mV[0]); +    LLVector2 ret(a.mV[VX]*b.mV[VY] - b.mV[VX]*a.mV[VY], a.mV[VY]*b.mV[VX] - b.mV[VY]*a.mV[VX]);      a = ret;      return a;  } -inline const LLVector2& operator*=(LLVector2 &a, F32 k) +inline const LLVector2& operator*=(LLVector2& a, F32 k)  { -    a.mV[0] *= k; -    a.mV[1] *= k; +    a.mV[VX] *= k; +    a.mV[VY] *= k;      return a;  } -inline const LLVector2& operator/=(LLVector2 &a, F32 k) +inline const LLVector2& operator/=(LLVector2& a, F32 k)  {      F32 t = 1.f / k; -    a.mV[0] *= t; -    a.mV[1] *= t; +    a.mV[VX] *= t; +    a.mV[VY] *= t;      return a;  } -inline LLVector2 operator-(const LLVector2 &a) +inline LLVector2 operator-(const LLVector2& a)  { -    return LLVector2( -a.mV[0], -a.mV[1] ); +    return LLVector2( -a.mV[VX], -a.mV[VY] );  }  inline void update_min_max(LLVector2& min, LLVector2& max, const LLVector2& pos) @@ -431,7 +431,7 @@ inline void update_min_max(LLVector2& min, LLVector2& max, const LLVector2& pos)      }  } -inline std::ostream& operator<<(std::ostream& s, const LLVector2 &a) +inline std::ostream& operator<<(std::ostream& s, const LLVector2& a)  {      s << "{ " << a.mV[VX] << ", " << a.mV[VY] << " }";      return s; diff --git a/indra/llmath/v3color.cpp b/indra/llmath/v3color.cpp index 4367b993f8..08b3795020 100644 --- a/indra/llmath/v3color.cpp +++ b/indra/llmath/v3color.cpp @@ -32,74 +32,79 @@  LLColor3 LLColor3::white(1.0f, 1.0f, 1.0f);  LLColor3 LLColor3::black(0.0f, 0.0f, 0.0f); -LLColor3 LLColor3::grey (0.5f, 0.5f, 0.5f); +LLColor3 LLColor3::grey(0.5f, 0.5f, 0.5f); -LLColor3::LLColor3(const LLColor4 &a) +LLColor3::LLColor3(const LLColor4& a)  { -    mV[0] = a.mV[0]; -    mV[1] = a.mV[1]; -    mV[2] = a.mV[2]; +    mV[VRED]   = a.mV[VRED]; +    mV[VGREEN] = a.mV[VGREEN]; +    mV[VBLUE]  = a.mV[VBLUE];  } -LLColor3::LLColor3(const LLVector4 &a) +LLColor3::LLColor3(const LLVector4& a)  { -    mV[0] = a.mV[0]; -    mV[1] = a.mV[1]; -    mV[2] = a.mV[2]; +    mV[VRED]   = a.mV[VRED]; +    mV[VGREEN] = a.mV[VGREEN]; +    mV[VBLUE]  = a.mV[VBLUE];  } -LLColor3::LLColor3(const LLSD &sd) +LLColor3::LLColor3(const LLSD& sd)  {      setValue(sd);  } -const LLColor3& LLColor3::operator=(const LLColor4 &a) +const LLColor3& LLColor3::operator=(const LLColor4& a)  { -    mV[0] = a.mV[0]; -    mV[1] = a.mV[1]; -    mV[2] = a.mV[2]; +    mV[VRED]   = a.mV[VRED]; +    mV[VGREEN] = a.mV[VGREEN]; +    mV[VBLUE]  = a.mV[VBLUE];      return (*this);  } -std::ostream& operator<<(std::ostream& s, const LLColor3 &a) +std::ostream& operator<<(std::ostream& s, const LLColor3& a)  {      s << "{ " << a.mV[VRED] << ", " << a.mV[VGREEN] << ", " << a.mV[VBLUE] << " }";      return s;  } -static F32 hueToRgb ( F32 val1In, F32 val2In, F32 valHUeIn ) +static F32 hueToRgb(F32 val1In, F32 val2In, F32 valHUeIn)  { -    if ( valHUeIn < 0.0f ) valHUeIn += 1.0f; -    if ( valHUeIn > 1.0f ) valHUeIn -= 1.0f; -    if ( ( 6.0f * valHUeIn ) < 1.0f ) return ( val1In + ( val2In - val1In ) * 6.0f * valHUeIn ); -    if ( ( 2.0f * valHUeIn ) < 1.0f ) return ( val2In ); -    if ( ( 3.0f * valHUeIn ) < 2.0f ) return ( val1In + ( val2In - val1In ) * ( ( 2.0f / 3.0f ) - valHUeIn ) * 6.0f ); -    return ( val1In ); +    if (valHUeIn < 0.0f) +        valHUeIn += 1.0f; +    if (valHUeIn > 1.0f) +        valHUeIn -= 1.0f; +    if ((6.0f * valHUeIn) < 1.0f) +        return (val1In + (val2In - val1In) * 6.0f * valHUeIn); +    if ((2.0f * valHUeIn) < 1.0f) +        return (val2In); +    if ((3.0f * valHUeIn) < 2.0f) +        return (val1In + (val2In - val1In) * ((2.0f / 3.0f) - valHUeIn) * 6.0f); +    return (val1In);  } -void LLColor3::setHSL ( F32 hValIn, F32 sValIn, F32 lValIn) +void LLColor3::setHSL(F32 hValIn, F32 sValIn, F32 lValIn)  { -    if ( sValIn < 0.00001f ) +    if (sValIn < 0.00001f)      { -        mV[VRED] = lValIn; +        mV[VRED]   = lValIn;          mV[VGREEN] = lValIn; -        mV[VBLUE] = lValIn; +        mV[VBLUE]  = lValIn;      }      else      {          F32 interVal1;          F32 interVal2; -        if ( lValIn < 0.5f ) -            interVal2 = lValIn * ( 1.0f + sValIn ); +        if (lValIn < 0.5f) +            interVal2 = lValIn * (1.0f + sValIn);          else -            interVal2 = ( lValIn + sValIn ) - ( sValIn * lValIn ); +            interVal2 = (lValIn + sValIn) - (sValIn * lValIn);          interVal1 = 2.0f * lValIn - interVal2; -        mV[VRED] = hueToRgb ( interVal1, interVal2, hValIn + ( 1.f / 3.f ) ); -        mV[VGREEN] = hueToRgb ( interVal1, interVal2, hValIn ); -        mV[VBLUE] = hueToRgb ( interVal1, interVal2, hValIn - ( 1.f / 3.f ) ); +        mV[VRED]   = hueToRgb(interVal1, interVal2, hValIn + (1.f / 3.f)); +        mV[VGREEN] = hueToRgb(interVal1, interVal2, hValIn); +        mV[VBLUE]  = hueToRgb(interVal1, interVal2, hValIn - (1.f / 3.f));      }  } @@ -109,45 +114,48 @@ void LLColor3::calcHSL(F32* hue, F32* saturation, F32* luminance) const      F32 var_G = mV[VGREEN];      F32 var_B = mV[VBLUE]; -    F32 var_Min = ( var_R < ( var_G < var_B ? var_G : var_B ) ? var_R : ( var_G < var_B ? var_G : var_B ) ); -    F32 var_Max = ( var_R > ( var_G > var_B ? var_G : var_B ) ? var_R : ( var_G > var_B ? var_G : var_B ) ); +    F32 var_Min = (var_R < (var_G < var_B ? var_G : var_B) ? var_R : (var_G < var_B ? var_G : var_B)); +    F32 var_Max = (var_R > (var_G > var_B ? var_G : var_B) ? var_R : (var_G > var_B ? var_G : var_B));      F32 del_Max = var_Max - var_Min; -    F32 L = ( var_Max + var_Min ) / 2.0f; +    F32 L = (var_Max + var_Min) / 2.0f;      F32 H = 0.0f;      F32 S = 0.0f; -    if ( del_Max == 0.0f ) +    if (del_Max == 0.0f)      { -       H = 0.0f; -       S = 0.0f; +        H = 0.0f; +        S = 0.0f;      }      else      { -        if ( L < 0.5 ) -            S = del_Max / ( var_Max + var_Min ); +        if (L < 0.5) +            S = del_Max / (var_Max + var_Min);          else -            S = del_Max / ( 2.0f - var_Max - var_Min ); +            S = del_Max / (2.0f - var_Max - var_Min); -        F32 del_R = ( ( ( var_Max - var_R ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; -        F32 del_G = ( ( ( var_Max - var_G ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; -        F32 del_B = ( ( ( var_Max - var_B ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; +        F32 del_R = (((var_Max - var_R) / 6.0f) + (del_Max / 2.0f)) / del_Max; +        F32 del_G = (((var_Max - var_G) / 6.0f) + (del_Max / 2.0f)) / del_Max; +        F32 del_B = (((var_Max - var_B) / 6.0f) + (del_Max / 2.0f)) / del_Max; -        if ( var_R >= var_Max ) +        if (var_R >= var_Max)              H = del_B - del_G; -        else -        if ( var_G >= var_Max ) -            H = ( 1.0f / 3.0f ) + del_R - del_B; -        else -        if ( var_B >= var_Max ) -            H = ( 2.0f / 3.0f ) + del_G - del_R; - -        if ( H < 0.0f ) H += 1.0f; -        if ( H > 1.0f ) H -= 1.0f; +        else if (var_G >= var_Max) +            H = (1.0f / 3.0f) + del_R - del_B; +        else if (var_B >= var_Max) +            H = (2.0f / 3.0f) + del_G - del_R; + +        if (H < 0.0f) +            H += 1.0f; +        if (H > 1.0f) +            H -= 1.0f;      } -    if (hue) *hue = H; -    if (saturation) *saturation = S; -    if (luminance) *luminance = L; +    if (hue) +        *hue = H; +    if (saturation) +        *saturation = S; +    if (luminance) +        *luminance = L;  } diff --git a/indra/llmath/v3color.h b/indra/llmath/v3color.h index f7af469e66..48b36e7c8a 100644 --- a/indra/llmath/v3color.h +++ b/indra/llmath/v3color.h @@ -33,12 +33,12 @@ class LLVector4;  #include "llerror.h"  #include "llmath.h"  #include "llsd.h" -#include "v3math.h"  // needed for linearColor3v implemtation below +#include "v3math.h" // needed for linearColor3v implemtation below  #include <string.h>  //  LLColor3 = |r g b| -static const U32 LENGTHOFCOLOR3 = 3; +static constexpr U32 LENGTHOFCOLOR3 = 3;  class LLColor3  { @@ -50,44 +50,43 @@ public:      static LLColor3 grey;  public: -    LLColor3();                         // Initializes LLColor3 to (0, 0, 0) -    LLColor3(F32 r, F32 g, F32 b);      // Initializes LLColor3 to (r, g, b) -    LLColor3(const F32 *vec);           // Initializes LLColor3 to (vec[0]. vec[1], vec[2]) -    LLColor3(const char *color_string);       // html format color ie "#FFDDEE" -    explicit LLColor3(const LLColor4& color4);  // "explicit" to avoid automatic conversion -    explicit LLColor3(const LLVector4& vector4);  // "explicit" to avoid automatic conversion +    LLColor3();                                  // Initializes LLColor3 to (0, 0, 0) +    LLColor3(F32 r, F32 g, F32 b);               // Initializes LLColor3 to (r, g, b) +    LLColor3(const F32* vec);                    // Initializes LLColor3 to (vec[0]. vec[1], vec[2]) +    LLColor3(const char* color_string);          // html format color ie "#FFDDEE" +    explicit LLColor3(const LLColor4& color4);   // "explicit" to avoid automatic conversion +    explicit LLColor3(const LLVector4& vector4); // "explicit" to avoid automatic conversion      LLColor3(const LLSD& sd); -      LLSD getValue() const      {          LLSD ret; -        ret[0] = mV[0]; -        ret[1] = mV[1]; -        ret[2] = mV[2]; +        ret[VRED]   = mV[VRED]; +        ret[VGREEN] = mV[VGREEN]; +        ret[VBLUE]  = mV[VBLUE];          return ret;      }      void setValue(const LLSD& sd)      { -        mV[0] = (F32) sd[0].asReal();; -        mV[1] = (F32) sd[1].asReal();; -        mV[2] = (F32) sd[2].asReal();; +        mV[VRED]   = (F32)sd[VRED].asReal(); +        mV[VGREEN] = (F32)sd[VGREEN].asReal(); +        mV[VBLUE]  = (F32)sd[VBLUE].asReal();      }      void setHSL(F32 hue, F32 saturation, F32 luminance);      void calcHSL(F32* hue, F32* saturation, F32* luminance) const; -    const LLColor3& setToBlack();                   // Clears LLColor3 to (0, 0, 0) -    const LLColor3& setToWhite();                   // Zero LLColor3 to (0, 0, 0) +    const LLColor3& setToBlack(); // Clears LLColor3 to (0, 0, 0) +    const LLColor3& setToWhite(); // Zero LLColor3 to (0, 0, 0) -    const LLColor3& setVec(F32 x, F32 y, F32 z);    // deprecated -    const LLColor3& setVec(const LLColor3 &vec);    // deprecated -    const LLColor3& setVec(const F32 *vec);         // deprecated +    const LLColor3& setVec(F32 x, F32 y, F32 z); // deprecated +    const LLColor3& setVec(const LLColor3& vec); // deprecated +    const LLColor3& setVec(const F32* vec);      // deprecated -    const LLColor3& set(F32 x, F32 y, F32 z);   // Sets LLColor3 to (x, y, z) -    const LLColor3& set(const LLColor3 &vec);   // Sets LLColor3 to vec -    const LLColor3& set(const F32 *vec);        // Sets LLColor3 to vec +    const LLColor3& set(F32 x, F32 y, F32 z); // Sets LLColor3 to (x, y, z) +    const LLColor3& set(const LLColor3& vec); // Sets LLColor3 to vec +    const LLColor3& set(const F32* vec);      // Sets LLColor3 to vec      // set from a vector of unknown type and size      // may leave some data unmodified @@ -99,414 +98,390 @@ public:      template<typename T>      void write(std::vector<T>& v) const; -    F32     magVec() const;             // deprecated -    F32     magVecSquared() const;      // deprecated -    F32     normVec();                  // deprecated +    F32 magVec() const;        // deprecated +    F32 magVecSquared() const; // deprecated +    F32 normVec();             // deprecated -    F32     length() const;             // Returns magnitude of LLColor3 -    F32     lengthSquared() const;      // Returns magnitude squared of LLColor3 -    F32     normalize();                // Normalizes and returns the magnitude of LLColor3 +    F32 length() const;        // Returns magnitude of LLColor3 +    F32 lengthSquared() const; // Returns magnitude squared of LLColor3 +    F32 normalize();           // Normalizes and returns the magnitude of LLColor3 -    F32     brightness() const;         // Returns brightness of LLColor3 +    F32 brightness() const; // Returns brightness of LLColor3 -    const LLColor3& operator=(const LLColor4 &a); +    const LLColor3& operator=(const LLColor4& a); -    LL_FORCE_INLINE LLColor3 divide(const LLColor3 &col2) +    LL_FORCE_INLINE LLColor3 divide(const LLColor3& col2) const      { -        return LLColor3( -                mV[0] / col2.mV[0], -                mV[1] / col2.mV[1], -                mV[2] / col2.mV[2] ); +        return LLColor3(mV[VRED] / col2.mV[VRED], mV[VGREEN] / col2.mV[VGREEN], mV[VBLUE] / col2.mV[VBLUE]);      } -    LL_FORCE_INLINE LLColor3 color_norm() +    LL_FORCE_INLINE LLColor3 color_norm() const      {          F32 l = length(); -        return LLColor3( -                mV[0] / l, -                mV[1] / l, -                mV[2] / l ); +        return LLColor3(mV[VRED] / l, mV[VGREEN] / l, mV[VBLUE] / l);      } -    friend std::ostream&     operator<<(std::ostream& s, const LLColor3 &a);        // Print a -    friend LLColor3 operator+(const LLColor3 &a, const LLColor3 &b);    // Return vector a + b -    friend LLColor3 operator-(const LLColor3 &a, const LLColor3 &b);    // Return vector a minus b +    friend std::ostream& operator<<(std::ostream& s, const LLColor3& a);  // Print a +    friend LLColor3      operator+(const LLColor3& a, const LLColor3& b); // Return vector a + b +    friend LLColor3      operator-(const LLColor3& a, const LLColor3& b); // Return vector a minus b -    friend const LLColor3& operator+=(LLColor3 &a, const LLColor3 &b);  // Return vector a + b -    friend const LLColor3& operator-=(LLColor3 &a, const LLColor3 &b);  // Return vector a minus b -    friend const LLColor3& operator*=(LLColor3 &a, const LLColor3 &b); +    friend const LLColor3& operator+=(LLColor3& a, const LLColor3& b); // Return vector a + b +    friend const LLColor3& operator-=(LLColor3& a, const LLColor3& b); // Return vector a minus b +    friend const LLColor3& operator*=(LLColor3& a, const LLColor3& b); -    friend LLColor3 operator*(const LLColor3 &a, const LLColor3 &b);    // Return component wise a * b -    friend LLColor3 operator*(const LLColor3 &a, F32 k);                // Return a times scaler k -    friend LLColor3 operator*(F32 k, const LLColor3 &a);                // Return a times scaler k +    friend LLColor3 operator*(const LLColor3& a, const LLColor3& b); // Return component wise a * b +    friend LLColor3 operator*(const LLColor3& a, F32 k);             // Return a times scaler k +    friend LLColor3 operator*(F32 k, const LLColor3& a);             // Return a times scaler k -    friend bool operator==(const LLColor3 &a, const LLColor3 &b);       // Return a == b -    friend bool operator!=(const LLColor3 &a, const LLColor3 &b);       // Return a != b +    friend bool operator==(const LLColor3& a, const LLColor3& b); // Return a == b +    friend bool operator!=(const LLColor3& a, const LLColor3& b); // Return a != b -    friend const LLColor3& operator*=(LLColor3 &a, F32 k);              // Return a times scaler k +    friend const LLColor3& operator*=(LLColor3& a, F32 k); // Return a times scaler k -    friend LLColor3 operator-(const LLColor3 &a);                   // Return vector 1-rgb (inverse) +    friend LLColor3 operator-(const LLColor3& a); // Return vector 1-rgb (inverse)      inline void clamp(); -    inline void exp();  // Do an exponential on the color +    inline void exp(); // Do an exponential on the color  }; -LLColor3 lerp(const LLColor3 &a, const LLColor3 &b, F32 u); - +LLColor3 lerp(const LLColor3& a, const LLColor3& b, F32 u);  void LLColor3::clamp()  {      // Clamp the color... -    if (mV[0] < 0.f) +    if (mV[VRED] < 0.f)      { -        mV[0] = 0.f; +        mV[VRED] = 0.f;      } -    else if (mV[0] > 1.f) +    else if (mV[VRED] > 1.f)      { -        mV[0] = 1.f; +        mV[VRED] = 1.f;      } -    if (mV[1] < 0.f) +    if (mV[VGREEN] < 0.f)      { -        mV[1] = 0.f; +        mV[VGREEN] = 0.f;      } -    else if (mV[1] > 1.f) +    else if (mV[VGREEN] > 1.f)      { -        mV[1] = 1.f; +        mV[VGREEN] = 1.f;      } -    if (mV[2] < 0.f) +    if (mV[VBLUE] < 0.f)      { -        mV[2] = 0.f; +        mV[VBLUE] = 0.f;      } -    else if (mV[2] > 1.f) +    else if (mV[VBLUE] > 1.f)      { -        mV[2] = 1.f; +        mV[VBLUE] = 1.f;      }  }  // Non-member functions -F32     distVec(const LLColor3 &a, const LLColor3 &b);      // Returns distance between a and b -F32     distVec_squared(const LLColor3 &a, const LLColor3 &b);// Returns distance squared between a and b +F32 distVec(const LLColor3& a, const LLColor3& b);         // Returns distance between a and b +F32 distVec_squared(const LLColor3& a, const LLColor3& b); // Returns distance squared between a and b -inline LLColor3::LLColor3(void) +inline LLColor3::LLColor3()  { -    mV[0] = 0.f; -    mV[1] = 0.f; -    mV[2] = 0.f; +    mV[VRED]   = 0.f; +    mV[VGREEN] = 0.f; +    mV[VBLUE]  = 0.f;  }  inline LLColor3::LLColor3(F32 r, F32 g, F32 b)  { -    mV[VRED] = r; +    mV[VRED]   = r;      mV[VGREEN] = g; -    mV[VBLUE] = b; +    mV[VBLUE]  = b;  } - -inline LLColor3::LLColor3(const F32 *vec) +inline LLColor3::LLColor3(const F32* vec)  { -    mV[VRED] = vec[VRED]; +    mV[VRED]   = vec[VRED];      mV[VGREEN] = vec[VGREEN]; -    mV[VBLUE] = vec[VBLUE]; +    mV[VBLUE]  = vec[VBLUE];  }  inline LLColor3::LLColor3(const char* color_string) // takes a string of format "RRGGBB" where RR is hex 00..FF  { -    if (strlen(color_string) <  6)      /* Flawfinder: ignore */ +    if (strlen(color_string) < 6) /* Flawfinder: ignore */      { -        mV[0] = 0.f; -        mV[1] = 0.f; -        mV[2] = 0.f; +        mV[VRED]   = 0.f; +        mV[VGREEN] = 0.f; +        mV[VBLUE]  = 0.f;          return;      }      char tempstr[7]; -    strncpy(tempstr,color_string,6);        /* Flawfinder: ignore */ +    strncpy(tempstr, color_string, 6); /* Flawfinder: ignore */      tempstr[6] = '\0'; -    mV[VBLUE] = (F32)strtol(&tempstr[4],NULL,16)/255.f; +    mV[VBLUE]  = (F32)strtol(&tempstr[4], nullptr, 16) / 255.f;      tempstr[4] = '\0'; -    mV[VGREEN] = (F32)strtol(&tempstr[2],NULL,16)/255.f; +    mV[VGREEN] = (F32)strtol(&tempstr[2], nullptr, 16) / 255.f;      tempstr[2] = '\0'; -    mV[VRED] = (F32)strtol(&tempstr[0],NULL,16)/255.f; +    mV[VRED]   = (F32)strtol(&tempstr[0], nullptr, 16) / 255.f;  } -inline const LLColor3&  LLColor3::setToBlack(void) +inline const LLColor3& LLColor3::setToBlack()  { -    mV[0] = 0.f; -    mV[1] = 0.f; -    mV[2] = 0.f; +    mV[VRED]   = 0.f; +    mV[VGREEN] = 0.f; +    mV[VBLUE]  = 0.f;      return (*this);  } -inline const LLColor3&  LLColor3::setToWhite(void) +inline const LLColor3& LLColor3::setToWhite()  { -    mV[0] = 1.f; -    mV[1] = 1.f; -    mV[2] = 1.f; +    mV[VRED]   = 1.f; +    mV[VGREEN] = 1.f; +    mV[VBLUE]  = 1.f;      return (*this);  } -inline const LLColor3&  LLColor3::set(F32 r, F32 g, F32 b) +inline const LLColor3& LLColor3::set(F32 r, F32 g, F32 b)  { -    mV[0] = r; -    mV[1] = g; -    mV[2] = b; +    mV[VRED]   = r; +    mV[VGREEN] = g; +    mV[VBLUE]  = b;      return (*this);  } -inline const LLColor3&  LLColor3::set(const LLColor3 &vec) +inline const LLColor3& LLColor3::set(const LLColor3& vec)  { -    mV[0] = vec.mV[0]; -    mV[1] = vec.mV[1]; -    mV[2] = vec.mV[2]; +    mV[VRED]   = vec.mV[VRED]; +    mV[VGREEN] = vec.mV[VGREEN]; +    mV[VBLUE]  = vec.mV[VBLUE];      return (*this);  } -inline const LLColor3&  LLColor3::set(const F32 *vec) +inline const LLColor3& LLColor3::set(const F32* vec)  { -    mV[0] = vec[0]; -    mV[1] = vec[1]; -    mV[2] = vec[2]; +    mV[VRED]   = vec[VRED]; +    mV[VGREEN] = vec[VGREEN]; +    mV[VBLUE]  = vec[VBLUE];      return (*this);  }  // deprecated -inline const LLColor3&  LLColor3::setVec(F32 r, F32 g, F32 b) +inline const LLColor3& LLColor3::setVec(F32 r, F32 g, F32 b)  { -    mV[0] = r; -    mV[1] = g; -    mV[2] = b; +    mV[VRED]   = r; +    mV[VGREEN] = g; +    mV[VBLUE]  = b;      return (*this);  }  // deprecated -inline const LLColor3&  LLColor3::setVec(const LLColor3 &vec) +inline const LLColor3& LLColor3::setVec(const LLColor3& vec)  { -    mV[0] = vec.mV[0]; -    mV[1] = vec.mV[1]; -    mV[2] = vec.mV[2]; +    mV[VRED]   = vec.mV[VRED]; +    mV[VGREEN] = vec.mV[VGREEN]; +    mV[VBLUE]  = vec.mV[VBLUE];      return (*this);  }  // deprecated -inline const LLColor3&  LLColor3::setVec(const F32 *vec) +inline const LLColor3& LLColor3::setVec(const F32* vec)  { -    mV[0] = vec[0]; -    mV[1] = vec[1]; -    mV[2] = vec[2]; +    mV[VRED]   = vec[VRED]; +    mV[VGREEN] = vec[VGREEN]; +    mV[VBLUE]  = vec[VBLUE];      return (*this);  } -inline F32      LLColor3::brightness(void) const +inline F32 LLColor3::brightness() const  { -    return (mV[0] + mV[1] + mV[2]) / 3.0f; +    return (mV[VRED] + mV[VGREEN] + mV[VBLUE]) / 3.0f;  } -inline F32      LLColor3::length(void) const +inline F32 LLColor3::length() const  { -    return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]); +    return sqrt(mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE]);  } -inline F32      LLColor3::lengthSquared(void) const +inline F32 LLColor3::lengthSquared() const  { -    return mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]; +    return mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE];  } -inline F32      LLColor3::normalize(void) +inline F32 LLColor3::normalize()  { -    F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]); +    F32 mag = sqrt(mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE]);      F32 oomag;      if (mag)      { -        oomag = 1.f/mag; -        mV[0] *= oomag; -        mV[1] *= oomag; -        mV[2] *= oomag; +        oomag = 1.f / mag; +        mV[VRED] *= oomag; +        mV[VGREEN] *= oomag; +        mV[VBLUE] *= oomag;      } -    return (mag); +    return mag;  }  // deprecated -inline F32      LLColor3::magVec(void) const +inline F32 LLColor3::magVec() const  { -    return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]); +    return sqrt(mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE]);  }  // deprecated -inline F32      LLColor3::magVecSquared(void) const +inline F32 LLColor3::magVecSquared() const  { -    return mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]; +    return mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE];  }  // deprecated -inline F32      LLColor3::normVec(void) +inline F32 LLColor3::normVec()  { -    F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]); +    F32 mag = sqrt(mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE]);      F32 oomag;      if (mag)      { -        oomag = 1.f/mag; -        mV[0] *= oomag; -        mV[1] *= oomag; -        mV[2] *= oomag; +        oomag = 1.f / mag; +        mV[VRED] *= oomag; +        mV[VGREEN] *= oomag; +        mV[VBLUE] *= oomag;      } -    return (mag); +    return mag;  }  inline void LLColor3::exp()  {  #if 0 -    mV[0] = ::exp(mV[0]); -    mV[1] = ::exp(mV[1]); -    mV[2] = ::exp(mV[2]); +    mV[VRED] = ::exp(mV[VRED]); +    mV[VGREEN] = ::exp(mV[VGREEN]); +    mV[VBLUE] = ::exp(mV[VBLUE]);  #else -    mV[0] = (F32)LL_FAST_EXP(mV[0]); -    mV[1] = (F32)LL_FAST_EXP(mV[1]); -    mV[2] = (F32)LL_FAST_EXP(mV[2]); +    mV[VRED]   = (F32)LL_FAST_EXP(mV[VRED]); +    mV[VGREEN] = (F32)LL_FAST_EXP(mV[VGREEN]); +    mV[VBLUE]  = (F32)LL_FAST_EXP(mV[VBLUE]);  #endif  } - -inline LLColor3 operator+(const LLColor3 &a, const LLColor3 &b) +inline LLColor3 operator+(const LLColor3& a, const LLColor3& b)  { -    return LLColor3( -        a.mV[0] + b.mV[0], -        a.mV[1] + b.mV[1], -        a.mV[2] + b.mV[2]); +    return LLColor3(a.mV[VRED] + b.mV[VRED], a.mV[VGREEN] + b.mV[VGREEN], a.mV[VBLUE] + b.mV[VBLUE]);  } -inline LLColor3 operator-(const LLColor3 &a, const LLColor3 &b) +inline LLColor3 operator-(const LLColor3& a, const LLColor3& b)  { -    return LLColor3( -        a.mV[0] - b.mV[0], -        a.mV[1] - b.mV[1], -        a.mV[2] - b.mV[2]); +    return LLColor3(a.mV[VRED] - b.mV[VRED], a.mV[VGREEN] - b.mV[VGREEN], a.mV[VBLUE] - b.mV[VBLUE]);  } -inline LLColor3  operator*(const LLColor3 &a, const LLColor3 &b) +inline LLColor3 operator*(const LLColor3& a, const LLColor3& b)  { -    return LLColor3( -        a.mV[0] * b.mV[0], -        a.mV[1] * b.mV[1], -        a.mV[2] * b.mV[2]); +    return LLColor3(a.mV[VRED] * b.mV[VRED], a.mV[VGREEN] * b.mV[VGREEN], a.mV[VBLUE] * b.mV[VBLUE]);  } -inline LLColor3 operator*(const LLColor3 &a, F32 k) +inline LLColor3 operator*(const LLColor3& a, F32 k)  { -    return LLColor3( a.mV[0] * k, a.mV[1] * k, a.mV[2] * k ); +    return LLColor3(a.mV[VRED] * k, a.mV[VGREEN] * k, a.mV[VBLUE] * k);  } -inline LLColor3 operator*(F32 k, const LLColor3 &a) +inline LLColor3 operator*(F32 k, const LLColor3& a)  { -    return LLColor3( a.mV[0] * k, a.mV[1] * k, a.mV[2] * k ); +    return LLColor3(a.mV[VRED] * k, a.mV[VGREEN] * k, a.mV[VBLUE] * k);  } -inline bool operator==(const LLColor3 &a, const LLColor3 &b) +inline bool operator==(const LLColor3& a, const LLColor3& b)  { -    return (  (a.mV[0] == b.mV[0]) -            &&(a.mV[1] == b.mV[1]) -            &&(a.mV[2] == b.mV[2])); +    return ((a.mV[VRED] == b.mV[VRED]) && (a.mV[VGREEN] == b.mV[VGREEN]) && (a.mV[VBLUE] == b.mV[VBLUE]));  } -inline bool operator!=(const LLColor3 &a, const LLColor3 &b) +inline bool operator!=(const LLColor3& a, const LLColor3& b)  { -    return (  (a.mV[0] != b.mV[0]) -            ||(a.mV[1] != b.mV[1]) -            ||(a.mV[2] != b.mV[2])); +    return ((a.mV[VRED] != b.mV[VRED]) || (a.mV[VGREEN] != b.mV[VGREEN]) || (a.mV[VBLUE] != b.mV[VBLUE]));  } -inline const LLColor3 &operator*=(LLColor3 &a, const LLColor3 &b) +inline const LLColor3& operator*=(LLColor3& a, const LLColor3& b)  { -    a.mV[0] *= b.mV[0]; -    a.mV[1] *= b.mV[1]; -    a.mV[2] *= b.mV[2]; +    a.mV[VRED] *= b.mV[VRED]; +    a.mV[VGREEN] *= b.mV[VGREEN]; +    a.mV[VBLUE] *= b.mV[VBLUE];      return a;  } -inline const LLColor3& operator+=(LLColor3 &a, const LLColor3 &b) +inline const LLColor3& operator+=(LLColor3& a, const LLColor3& b)  { -    a.mV[0] += b.mV[0]; -    a.mV[1] += b.mV[1]; -    a.mV[2] += b.mV[2]; +    a.mV[VRED] += b.mV[VRED]; +    a.mV[VGREEN] += b.mV[VGREEN]; +    a.mV[VBLUE] += b.mV[VBLUE];      return a;  } -inline const LLColor3& operator-=(LLColor3 &a, const LLColor3 &b) +inline const LLColor3& operator-=(LLColor3& a, const LLColor3& b)  { -    a.mV[0] -= b.mV[0]; -    a.mV[1] -= b.mV[1]; -    a.mV[2] -= b.mV[2]; +    a.mV[VRED] -= b.mV[VRED]; +    a.mV[VGREEN] -= b.mV[VGREEN]; +    a.mV[VBLUE] -= b.mV[VBLUE];      return a;  } -inline const LLColor3& operator*=(LLColor3 &a, F32 k) +inline const LLColor3& operator*=(LLColor3& a, F32 k)  { -    a.mV[0] *= k; -    a.mV[1] *= k; -    a.mV[2] *= k; +    a.mV[VRED] *= k; +    a.mV[VGREEN] *= k; +    a.mV[VBLUE] *= k;      return a;  } -inline LLColor3 operator-(const LLColor3 &a) +inline LLColor3 operator-(const LLColor3& a)  { -    return LLColor3( -        1.f - a.mV[0], -        1.f - a.mV[1], -        1.f - a.mV[2] ); +    return LLColor3(1.f - a.mV[VRED], 1.f - a.mV[VGREEN], 1.f - a.mV[VBLUE]);  }  // Non-member functions -inline F32      distVec(const LLColor3 &a, const LLColor3 &b) +inline F32 distVec(const LLColor3& a, const LLColor3& b)  { -    F32 x = a.mV[0] - b.mV[0]; -    F32 y = a.mV[1] - b.mV[1]; -    F32 z = a.mV[2] - b.mV[2]; -    return (F32) sqrt( x*x + y*y + z*z ); +    F32 x = a.mV[VRED] - b.mV[VRED]; +    F32 y = a.mV[VGREEN] - b.mV[VGREEN]; +    F32 z = a.mV[VBLUE] - b.mV[VBLUE]; +    return sqrt(x * x + y * y + z * z);  } -inline F32      distVec_squared(const LLColor3 &a, const LLColor3 &b) +inline F32 distVec_squared(const LLColor3& a, const LLColor3& b)  { -    F32 x = a.mV[0] - b.mV[0]; -    F32 y = a.mV[1] - b.mV[1]; -    F32 z = a.mV[2] - b.mV[2]; -    return x*x + y*y + z*z; +    F32 x = a.mV[VRED] - b.mV[VRED]; +    F32 y = a.mV[VGREEN] - b.mV[VGREEN]; +    F32 z = a.mV[VBLUE] - b.mV[VBLUE]; +    return x * x + y * y + z * z;  } -inline LLColor3 lerp(const LLColor3 &a, const LLColor3 &b, F32 u) +inline LLColor3 lerp(const LLColor3& a, const LLColor3& b, F32 u)  { -    return LLColor3( -        a.mV[VX] + (b.mV[VX] - a.mV[VX]) * u, -        a.mV[VY] + (b.mV[VY] - a.mV[VY]) * u, -        a.mV[VZ] + (b.mV[VZ] - a.mV[VZ]) * u); +    return LLColor3(a.mV[VX] + (b.mV[VX] - a.mV[VX]) * u, a.mV[VY] + (b.mV[VY] - a.mV[VY]) * u, a.mV[VZ] + (b.mV[VZ] - a.mV[VZ]) * u);  } -inline const LLColor3 srgbColor3(const LLColor3 &a) { +inline const LLColor3 srgbColor3(const LLColor3& a) +{      LLColor3 srgbColor; -    srgbColor.mV[0] = linearTosRGB(a.mV[0]); -    srgbColor.mV[1] = linearTosRGB(a.mV[1]); -    srgbColor.mV[2] = linearTosRGB(a.mV[2]); +    srgbColor.mV[VRED]   = linearTosRGB(a.mV[VRED]); +    srgbColor.mV[VGREEN] = linearTosRGB(a.mV[VGREEN]); +    srgbColor.mV[VBLUE]  = linearTosRGB(a.mV[VBLUE]);      return srgbColor;  } -inline const LLColor3 linearColor3p(const F32* v) { +inline const LLColor3 linearColor3p(const F32* v) +{      LLColor3 linearColor; -    linearColor.mV[0] = sRGBtoLinear(v[0]); -    linearColor.mV[1] = sRGBtoLinear(v[1]); -    linearColor.mV[2] = sRGBtoLinear(v[2]); +    linearColor.mV[VRED]   = sRGBtoLinear(v[VRED]); +    linearColor.mV[VGREEN] = sRGBtoLinear(v[VGREEN]); +    linearColor.mV[VBLUE]  = sRGBtoLinear(v[VBLUE]);      return linearColor;  }  template<class T> -inline const LLColor3 linearColor3(const T& a) { +inline const LLColor3 linearColor3(const T& a) +{      return linearColor3p(a.mV);  }  template<class T> -inline const LLVector3 linearColor3v(const T& a) { +inline const LLVector3 linearColor3v(const T& a) +{      return LLVector3(linearColor3p(a.mV).mV);  } diff --git a/indra/llmath/v3colorutil.h b/indra/llmath/v3colorutil.h index af8799e42a..4dc3100443 100644 --- a/indra/llmath/v3colorutil.h +++ b/indra/llmath/v3colorutil.h @@ -30,59 +30,46 @@  #include "v3color.h"  #include "v4color.h" -inline LLColor3 componentDiv(LLColor3 const &left, LLColor3 const & right) +inline LLColor3 componentDiv(const LLColor3& left, const LLColor3& right)  { -    return LLColor3(left.mV[0] / right.mV[0], -        left.mV[1] / right.mV[1], -        left.mV[2] / right.mV[2]); +    return LLColor3(left.mV[VRED] / right.mV[VRED], left.mV[VGREEN] / right.mV[VGREEN], left.mV[VBLUE] / right.mV[VBLUE]);  } - -inline LLColor3 componentMult(LLColor3 const &left, LLColor3 const & right) +inline LLColor3 componentMult(const LLColor3& left, const LLColor3& right)  { -    return LLColor3(left.mV[0] * right.mV[0], -        left.mV[1] * right.mV[1], -        left.mV[2] * right.mV[2]); +    return LLColor3(left.mV[VRED] * right.mV[VRED], left.mV[VGREEN] * right.mV[VGREEN], left.mV[VBLUE] * right.mV[VBLUE]);  } - -inline LLColor3 componentExp(LLColor3 const &v) +inline LLColor3 componentExp(const LLColor3& v)  { -    return LLColor3(exp(v.mV[0]), -        exp(v.mV[1]), -        exp(v.mV[2])); +    return LLColor3(exp(v.mV[VRED]), exp(v.mV[VGREEN]), exp(v.mV[VBLUE]));  } -inline LLColor3 componentPow(LLColor3 const &v, F32 exponent) +inline LLColor3 componentPow(const LLColor3& v, F32 exponent)  { -    return LLColor3(pow(v.mV[0], exponent), -        pow(v.mV[1], exponent), -        pow(v.mV[2], exponent)); +    return LLColor3(pow(v.mV[VRED], exponent), pow(v.mV[VGREEN], exponent), pow(v.mV[VBLUE], exponent));  } -inline LLColor3 componentSaturate(LLColor3 const &v) +inline LLColor3 componentSaturate(const LLColor3& v)  { -    return LLColor3(std::max(std::min(v.mV[0], 1.f), 0.f), -        std::max(std::min(v.mV[1], 1.f), 0.f), -        std::max(std::min(v.mV[2], 1.f), 0.f)); +    return LLColor3(std::max(std::min(v.mV[VRED], 1.f), 0.f), +                    std::max(std::min(v.mV[VGREEN], 1.f), 0.f), +                    std::max(std::min(v.mV[VBLUE], 1.f), 0.f));  } - -inline LLColor3 componentSqrt(LLColor3 const &v) +inline LLColor3 componentSqrt(const LLColor3& v)  { -    return LLColor3(sqrt(v.mV[0]), -        sqrt(v.mV[1]), -        sqrt(v.mV[2])); +    return LLColor3(sqrt(v.mV[VRED]), sqrt(v.mV[VGREEN]), sqrt(v.mV[VBLUE]));  } -inline void componentMultBy(LLColor3 & left, LLColor3 const & right) +inline void componentMultBy(LLColor3& left, const LLColor3& right)  { -    left.mV[0] *= right.mV[0]; -    left.mV[1] *= right.mV[1]; -    left.mV[2] *= right.mV[2]; +    left.mV[VRED] *= right.mV[VRED]; +    left.mV[VGREEN] *= right.mV[VGREEN]; +    left.mV[VBLUE] *= right.mV[VBLUE];  } -inline LLColor3 colorMix(LLColor3 const & left, LLColor3 const & right, F32 amount) +inline LLColor3 colorMix(const LLColor3& left, const LLColor3& right, F32 amount)  {      return (left + ((right - left) * amount));  } @@ -92,25 +79,24 @@ inline LLColor3 smear(F32 val)      return LLColor3(val, val, val);  } -inline F32 color_intens(const LLColor3 &col) +inline F32 color_intens(const LLColor3& col)  { -    return col.mV[0] + col.mV[1] + col.mV[2]; +    return col.mV[VRED] + col.mV[VGREEN] + col.mV[VBLUE];  } -inline F32 color_max(const LLColor3 &col) +inline F32 color_max(const LLColor3& col)  { -    return llmax(col.mV[0], col.mV[1], col.mV[2]); +    return llmax(col.mV[VRED], col.mV[VGREEN], col.mV[VBLUE]);  } -inline F32 color_max(const LLColor4 &col) +inline F32 color_max(const LLColor4& col)  { -    return llmax(col.mV[0], col.mV[1], col.mV[2]); +    return llmax(col.mV[VRED], col.mV[VGREEN], col.mV[VBLUE]);  } - -inline F32 color_min(const LLColor3 &col) +inline F32 color_min(const LLColor3& col)  { -    return llmin(col.mV[0], col.mV[1], col.mV[2]); +    return llmin(col.mV[VRED], col.mV[VGREEN], col.mV[VBLUE]);  }  #endif diff --git a/indra/llmath/v3dmath.cpp b/indra/llmath/v3dmath.cpp index bb55c812b5..b051303686 100644 --- a/indra/llmath/v3dmath.cpp +++ b/indra/llmath/v3dmath.cpp @@ -30,7 +30,6 @@  #include "v3dmath.h" -//#include "vmath.h"  #include "v4math.h"  #include "m4math.h"  #include "m3math.h" @@ -57,13 +56,13 @@ bool LLVector3d::clamp(F64 min, F64 max)  {      bool ret{ false }; -    if (mdV[0] < min) { mdV[0] = min; ret = true; } -    if (mdV[1] < min) { mdV[1] = min; ret = true; } -    if (mdV[2] < min) { mdV[2] = min; ret = true; } +    if (mdV[VX] < min) { mdV[VX] = min; ret = true; } +    if (mdV[VY] < min) { mdV[VY] = min; ret = true; } +    if (mdV[VZ] < min) { mdV[VZ] = min; ret = true; } -    if (mdV[0] > max) { mdV[0] = max; ret = true; } -    if (mdV[1] > max) { mdV[1] = max; ret = true; } -    if (mdV[2] > max) { mdV[2] = max; ret = true; } +    if (mdV[VX] > max) { mdV[VX] = max; ret = true; } +    if (mdV[VY] > max) { mdV[VY] = max; ret = true; } +    if (mdV[VZ] > max) { mdV[VZ] = max; ret = true; }      return ret;  } @@ -74,9 +73,9 @@ bool LLVector3d::abs()  {      bool ret{ false }; -    if (mdV[0] < 0.0) { mdV[0] = -mdV[0]; ret = true; } -    if (mdV[1] < 0.0) { mdV[1] = -mdV[1]; ret = true; } -    if (mdV[2] < 0.0) { mdV[2] = -mdV[2]; ret = true; } +    if (mdV[VX] < 0.0) { mdV[VX] = -mdV[VX]; ret = true; } +    if (mdV[VY] < 0.0) { mdV[VY] = -mdV[VY]; ret = true; } +    if (mdV[VZ] < 0.0) { mdV[VZ] = -mdV[VZ]; ret = true; }      return ret;  } @@ -89,37 +88,37 @@ std::ostream& operator<<(std::ostream& s, const LLVector3d &a)  const LLVector3d& LLVector3d::operator=(const LLVector4 &a)  { -    mdV[0] = a.mV[0]; -    mdV[1] = a.mV[1]; -    mdV[2] = a.mV[2]; +    mdV[VX] = a.mV[VX]; +    mdV[VY] = a.mV[VY]; +    mdV[VZ] = a.mV[VZ];      return *this;  } -const LLVector3d&   LLVector3d::rotVec(const LLMatrix3 &mat) +const LLVector3d& LLVector3d::rotVec(const LLMatrix3& mat)  {      *this = *this * mat;      return *this;  } -const LLVector3d&   LLVector3d::rotVec(const LLQuaternion &q) +const LLVector3d& LLVector3d::rotVec(const LLQuaternion& q)  {      *this = *this * q;      return *this;  } -const LLVector3d&   LLVector3d::rotVec(F64 angle, const LLVector3d &vec) +const LLVector3d& LLVector3d::rotVec(F64 angle, const LLVector3d& vec)  { -    if ( !vec.isExactlyZero() && angle ) +    if (!vec.isExactlyZero() && angle)      {          *this = *this * LLMatrix3((F32)angle, vec);      }      return *this;  } -const LLVector3d&   LLVector3d::rotVec(F64 angle, F64 x, F64 y, F64 z) +const LLVector3d& LLVector3d::rotVec(F64 angle, F64 x, F64 y, F64 z)  {      LLVector3d vec(x, y, z); -    if ( !vec.isExactlyZero() && angle ) +    if (!vec.isExactlyZero() && angle)      {          *this = *this * LLMatrix3((F32)angle, vec);      } @@ -129,16 +128,16 @@ const LLVector3d&   LLVector3d::rotVec(F64 angle, F64 x, F64 y, F64 z)  bool LLVector3d::parseVector3d(const std::string& buf, LLVector3d* value)  { -    if( buf.empty() || value == nullptr) +    if (buf.empty() || value == nullptr)      {          return false;      }      LLVector3d v; -    S32 count = sscanf( buf.c_str(), "%lf %lf %lf", v.mdV + 0, v.mdV + 1, v.mdV + 2 ); -    if( 3 == count ) +    S32 count = sscanf(buf.c_str(), "%lf %lf %lf", v.mdV + VX, v.mdV + VY, v.mdV + VZ); +    if (3 == count)      { -        value->setVec( v ); +        value->setVec(v);          return true;      } diff --git a/indra/llmath/v3dmath.h b/indra/llmath/v3dmath.h index ece8c54ea4..fcce2c30eb 100644 --- a/indra/llmath/v3dmath.h +++ b/indra/llmath/v3dmath.h @@ -32,128 +32,127 @@  class LLVector3d  { -    public: -        F64 mdV[3]; - -        const static LLVector3d zero; -        const static LLVector3d x_axis; -        const static LLVector3d y_axis; -        const static LLVector3d z_axis; -        const static LLVector3d x_axis_neg; -        const static LLVector3d y_axis_neg; -        const static LLVector3d z_axis_neg; - -        inline LLVector3d();                            // Initializes LLVector3d to (0, 0, 0) -        inline LLVector3d(const F64 x, const F64 y, const F64 z);           // Initializes LLVector3d to (x. y, z) -        inline explicit LLVector3d(const F64 *vec);             // Initializes LLVector3d to (vec[0]. vec[1], vec[2]) -        inline explicit LLVector3d(const LLVector3 &vec); -        explicit LLVector3d(const LLSD& sd) -        { -            setValue(sd); -        } - -        void setValue(const LLSD& sd) -        { -            mdV[0] = sd[0].asReal(); -            mdV[1] = sd[1].asReal(); -            mdV[2] = sd[2].asReal(); -        } - -        LLSD getValue() const -        { -            LLSD ret; -            ret[0] = mdV[0]; -            ret[1] = mdV[1]; -            ret[2] = mdV[2]; -            return ret; -        } - -        inline bool isFinite() const;                                   // checks to see if all values of LLVector3d are finite -        bool        clamp(const F64 min, const F64 max);        // Clamps all values to (min,max), returns true if data changed -        bool        abs();                      // sets all values to absolute value of original value (first octant), returns true if changed - -        inline const LLVector3d&    clear();        // Clears LLVector3d to (0, 0, 0, 1) -        inline const LLVector3d&    clearVec();     // deprecated -        inline const LLVector3d&    setZero();      // Zero LLVector3d to (0, 0, 0, 0) -        inline const LLVector3d&    zeroVec();      // deprecated -        inline const LLVector3d&    set(const F64 x, const F64 y, const F64 z); // Sets LLVector3d to (x, y, z, 1) -        inline const LLVector3d&    set(const LLVector3d &vec); // Sets LLVector3d to vec -        inline const LLVector3d&    set(const F64 *vec);        // Sets LLVector3d to vec -        inline const LLVector3d&    set(const LLVector3 &vec); -        inline const LLVector3d&    setVec(const F64 x, const F64 y, const F64 z);  // deprecated -        inline const LLVector3d&    setVec(const LLVector3d &vec);  // deprecated -        inline const LLVector3d&    setVec(const F64 *vec);         // deprecated -        inline const LLVector3d&    setVec(const LLVector3 &vec);   // deprecated - -        F64     magVec() const;             // deprecated -        F64     magVecSquared() const;      // deprecated -        inline F64      normVec();                  // deprecated - -        F64 length() const;         // Returns magnitude of LLVector3d -        F64 lengthSquared() const;  // Returns magnitude squared of LLVector3d -        inline F64 normalize();     // Normalizes and returns the magnitude of LLVector3d - -        const LLVector3d&   rotVec(const F64 angle, const LLVector3d &vec); // Rotates about vec by angle radians -        const LLVector3d&   rotVec(const F64 angle, const F64 x, const F64 y, const F64 z);     // Rotates about x,y,z by angle radians -        const LLVector3d&   rotVec(const LLMatrix3 &mat);               // Rotates by LLMatrix4 mat -        const LLVector3d&   rotVec(const LLQuaternion &q);              // Rotates by LLQuaternion q - -        bool isNull() const;            // Returns true if vector has a _very_small_ length -        bool isExactlyZero() const      { return !mdV[VX] && !mdV[VY] && !mdV[VZ]; } - -        const LLVector3d&   operator=(const LLVector4 &a); - -        F64 operator[](int idx) const { return mdV[idx]; } -        F64 &operator[](int idx) { return mdV[idx]; } - -        friend LLVector3d operator+(const LLVector3d& a, const LLVector3d& b);  // Return vector a + b -        friend LLVector3d operator-(const LLVector3d& a, const LLVector3d& b);  // Return vector a minus b -        friend F64 operator*(const LLVector3d& a, const LLVector3d& b);     // Return a dot b -        friend LLVector3d operator%(const LLVector3d& a, const LLVector3d& b);  // Return a cross b -        friend LLVector3d operator*(const LLVector3d& a, const F64 k);              // Return a times scaler k -        friend LLVector3d operator/(const LLVector3d& a, const F64 k);              // Return a divided by scaler k -        friend LLVector3d operator*(const F64 k, const LLVector3d& a);              // Return a times scaler k -        friend bool operator==(const LLVector3d& a, const LLVector3d& b);       // Return a == b -        friend bool operator!=(const LLVector3d& a, const LLVector3d& b);       // Return a != b - -        friend const LLVector3d& operator+=(LLVector3d& a, const LLVector3d& b);    // Return vector a + b -        friend const LLVector3d& operator-=(LLVector3d& a, const LLVector3d& b);    // Return vector a minus b -        friend const LLVector3d& operator%=(LLVector3d& a, const LLVector3d& b);    // Return a cross b -        friend const LLVector3d& operator*=(LLVector3d& a, const F64 k);                // Return a times scaler k -        friend const LLVector3d& operator/=(LLVector3d& a, const F64 k);                // Return a divided by scaler k - -        friend LLVector3d operator-(const LLVector3d& a);                   // Return vector -a - -        friend std::ostream&     operator<<(std::ostream& s, const LLVector3d& a);      // Stream a - -        static bool parseVector3d(const std::string& buf, LLVector3d* value); +public: +    F64 mdV[3]; + +    const static LLVector3d zero; +    const static LLVector3d x_axis; +    const static LLVector3d y_axis; +    const static LLVector3d z_axis; +    const static LLVector3d x_axis_neg; +    const static LLVector3d y_axis_neg; +    const static LLVector3d z_axis_neg; + +    inline LLVector3d();                            // Initializes LLVector3d to (0, 0, 0) +    inline LLVector3d(const F64 x, const F64 y, const F64 z);           // Initializes LLVector3d to (x. y, z) +    inline explicit LLVector3d(const F64 *vec);             // Initializes LLVector3d to (vec[0]. vec[1], vec[2]) +    inline explicit LLVector3d(const LLVector3 &vec); +    explicit LLVector3d(const LLSD& sd) +    { +        setValue(sd); +    } + +    void setValue(const LLSD& sd) +    { +        mdV[VX] = sd[0].asReal(); +        mdV[VY] = sd[1].asReal(); +        mdV[VZ] = sd[2].asReal(); +    } +    LLSD getValue() const +    { +        LLSD ret; +        ret[0] = mdV[VX]; +        ret[1] = mdV[VY]; +        ret[2] = mdV[VZ]; +        return ret; +    } + +    inline bool isFinite() const;                                   // checks to see if all values of LLVector3d are finite +    bool        clamp(const F64 min, const F64 max);        // Clamps all values to (min,max), returns true if data changed +    bool        abs();                      // sets all values to absolute value of original value (first octant), returns true if changed + +    inline const LLVector3d&    clear();        // Clears LLVector3d to (0, 0, 0, 1) +    inline const LLVector3d&    clearVec();     // deprecated +    inline const LLVector3d&    setZero();      // Zero LLVector3d to (0, 0, 0, 0) +    inline const LLVector3d&    zeroVec();      // deprecated +    inline const LLVector3d&    set(const F64 x, const F64 y, const F64 z); // Sets LLVector3d to (x, y, z, 1) +    inline const LLVector3d&    set(const LLVector3d &vec); // Sets LLVector3d to vec +    inline const LLVector3d&    set(const F64 *vec);        // Sets LLVector3d to vec +    inline const LLVector3d&    set(const LLVector3 &vec); +    inline const LLVector3d&    setVec(const F64 x, const F64 y, const F64 z);  // deprecated +    inline const LLVector3d&    setVec(const LLVector3d &vec);  // deprecated +    inline const LLVector3d&    setVec(const F64 *vec);         // deprecated +    inline const LLVector3d&    setVec(const LLVector3 &vec);   // deprecated + +    F64     magVec() const;             // deprecated +    F64     magVecSquared() const;      // deprecated +    inline F64      normVec();                  // deprecated + +    F64 length() const;         // Returns magnitude of LLVector3d +    F64 lengthSquared() const;  // Returns magnitude squared of LLVector3d +    inline F64 normalize();     // Normalizes and returns the magnitude of LLVector3d + +    const LLVector3d&   rotVec(const F64 angle, const LLVector3d &vec); // Rotates about vec by angle radians +    const LLVector3d&   rotVec(const F64 angle, const F64 x, const F64 y, const F64 z);     // Rotates about x,y,z by angle radians +    const LLVector3d&   rotVec(const LLMatrix3 &mat);               // Rotates by LLMatrix4 mat +    const LLVector3d&   rotVec(const LLQuaternion &q);              // Rotates by LLQuaternion q + +    bool isNull() const;            // Returns true if vector has a _very_small_ length +    bool isExactlyZero() const      { return !mdV[VX] && !mdV[VY] && !mdV[VZ]; } + +    const LLVector3d&   operator=(const LLVector4 &a); + +    F64 operator[](int idx) const { return mdV[idx]; } +    F64 &operator[](int idx) { return mdV[idx]; } + +    friend LLVector3d operator+(const LLVector3d& a, const LLVector3d& b);  // Return vector a + b +    friend LLVector3d operator-(const LLVector3d& a, const LLVector3d& b);  // Return vector a minus b +    friend F64 operator*(const LLVector3d& a, const LLVector3d& b);     // Return a dot b +    friend LLVector3d operator%(const LLVector3d& a, const LLVector3d& b);  // Return a cross b +    friend LLVector3d operator*(const LLVector3d& a, const F64 k);              // Return a times scaler k +    friend LLVector3d operator/(const LLVector3d& a, const F64 k);              // Return a divided by scaler k +    friend LLVector3d operator*(const F64 k, const LLVector3d& a);              // Return a times scaler k +    friend bool operator==(const LLVector3d& a, const LLVector3d& b);       // Return a == b +    friend bool operator!=(const LLVector3d& a, const LLVector3d& b);       // Return a != b + +    friend const LLVector3d& operator+=(LLVector3d& a, const LLVector3d& b);    // Return vector a + b +    friend const LLVector3d& operator-=(LLVector3d& a, const LLVector3d& b);    // Return vector a minus b +    friend const LLVector3d& operator%=(LLVector3d& a, const LLVector3d& b);    // Return a cross b +    friend const LLVector3d& operator*=(LLVector3d& a, const F64 k);                // Return a times scaler k +    friend const LLVector3d& operator/=(LLVector3d& a, const F64 k);                // Return a divided by scaler k + +    friend LLVector3d operator-(const LLVector3d& a);                   // Return vector -a + +    friend std::ostream&     operator<<(std::ostream& s, const LLVector3d& a);      // Stream a + +    static bool parseVector3d(const std::string& buf, LLVector3d* value);  };  typedef LLVector3d LLGlobalVec;  inline const LLVector3d &LLVector3d::set(const LLVector3 &vec)  { -    mdV[0] = vec.mV[0]; -    mdV[1] = vec.mV[1]; -    mdV[2] = vec.mV[2]; +    mdV[VX] = vec.mV[VX]; +    mdV[VY] = vec.mV[VY]; +    mdV[VZ] = vec.mV[VZ];      return *this;  }  inline const LLVector3d &LLVector3d::setVec(const LLVector3 &vec)  { -    mdV[0] = vec.mV[0]; -    mdV[1] = vec.mV[1]; -    mdV[2] = vec.mV[2]; +    mdV[VX] = vec.mV[VX]; +    mdV[VY] = vec.mV[VY]; +    mdV[VZ] = vec.mV[VZ];      return *this;  }  inline LLVector3d::LLVector3d(void)  { -    mdV[0] = 0.f; -    mdV[1] = 0.f; -    mdV[2] = 0.f; +    mdV[VX] = 0.f; +    mdV[VY] = 0.f; +    mdV[VZ] = 0.f;  }  inline LLVector3d::LLVector3d(const F64 x, const F64 y, const F64 z) @@ -199,33 +198,33 @@ inline bool LLVector3d::isFinite() const  inline const LLVector3d&    LLVector3d::clear(void)  { -    mdV[0] = 0.f; -    mdV[1] = 0.f; -    mdV[2]= 0.f; +    mdV[VX] = 0.f; +    mdV[VY] = 0.f; +    mdV[VZ] = 0.f;      return (*this);  }  inline const LLVector3d&    LLVector3d::clearVec(void)  { -    mdV[0] = 0.f; -    mdV[1] = 0.f; -    mdV[2]= 0.f; +    mdV[VX] = 0.f; +    mdV[VY] = 0.f; +    mdV[VZ] = 0.f;      return (*this);  }  inline const LLVector3d&    LLVector3d::setZero(void)  { -    mdV[0] = 0.f; -    mdV[1] = 0.f; -    mdV[2] = 0.f; +    mdV[VX] = 0.f; +    mdV[VY] = 0.f; +    mdV[VZ] = 0.f;      return (*this);  }  inline const LLVector3d&    LLVector3d::zeroVec(void)  { -    mdV[0] = 0.f; -    mdV[1] = 0.f; -    mdV[2] = 0.f; +    mdV[VX] = 0.f; +    mdV[VY] = 0.f; +    mdV[VZ] = 0.f;      return (*this);  } @@ -239,17 +238,17 @@ inline const LLVector3d&    LLVector3d::set(const F64 x, const F64 y, const F64  inline const LLVector3d&    LLVector3d::set(const LLVector3d &vec)  { -    mdV[0] = vec.mdV[0]; -    mdV[1] = vec.mdV[1]; -    mdV[2] = vec.mdV[2]; +    mdV[VX] = vec.mdV[VX]; +    mdV[VY] = vec.mdV[VY]; +    mdV[VZ] = vec.mdV[VZ];      return (*this);  }  inline const LLVector3d&    LLVector3d::set(const F64 *vec)  { -    mdV[0] = vec[0]; -    mdV[1] = vec[1]; -    mdV[2] = vec[2]; +    mdV[VX] = vec[0]; +    mdV[VY] = vec[1]; +    mdV[VZ] = vec[2];      return (*this);  } @@ -261,61 +260,62 @@ inline const LLVector3d&    LLVector3d::setVec(const F64 x, const F64 y, const F      return (*this);  } -inline const LLVector3d&    LLVector3d::setVec(const LLVector3d &vec) +inline const LLVector3d&    LLVector3d::setVec(const LLVector3d& vec)  { -    mdV[0] = vec.mdV[0]; -    mdV[1] = vec.mdV[1]; -    mdV[2] = vec.mdV[2]; +    mdV[VX] = vec.mdV[VX]; +    mdV[VY] = vec.mdV[VY]; +    mdV[VZ] = vec.mdV[VZ];      return (*this);  } -inline const LLVector3d&    LLVector3d::setVec(const F64 *vec) +inline const LLVector3d&    LLVector3d::setVec(const F64* vec)  { -    mdV[0] = vec[0]; -    mdV[1] = vec[1]; -    mdV[2] = vec[2]; +    mdV[VX] = vec[VX]; +    mdV[VY] = vec[VY]; +    mdV[VZ] = vec[VZ];      return (*this);  } -inline F64 LLVector3d::normVec(void) +inline F64 LLVector3d::normVec()  { -    F64 mag = (F32) sqrt(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]); +    F64 mag = (F32)sqrt(mdV[VX]*mdV[VX] + mdV[VY]*mdV[VY] + mdV[VZ]*mdV[VZ]); // This explicit cast to F32 limits the precision for numerical stability. +                                                                              // Without it, Unit test "v3dmath_h" fails at "1:angle_between" on macos.      F64 oomag;      if (mag > FP_MAG_THRESHOLD)      { -        oomag = 1.f/mag; -        mdV[0] *= oomag; -        mdV[1] *= oomag; -        mdV[2] *= oomag; +        oomag = 1.0/mag; +        mdV[VX] *= oomag; +        mdV[VY] *= oomag; +        mdV[VZ] *= oomag;      }      else      { -        mdV[0] = 0.f; -        mdV[1] = 0.f; -        mdV[2] = 0.f; +        mdV[VX] = 0.0; +        mdV[VY] = 0.0; +        mdV[VZ] = 0.0;          mag = 0;      }      return (mag);  } -inline F64 LLVector3d::normalize(void) +inline F64 LLVector3d::normalize()  { -    F64 mag = (F32) sqrt(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]); +    F64 mag = (F32)sqrt(mdV[VX]*mdV[VX] + mdV[VY]*mdV[VY] + mdV[VZ]*mdV[VZ]); // Same as in normVec() above.      F64 oomag;      if (mag > FP_MAG_THRESHOLD)      { -        oomag = 1.f/mag; -        mdV[0] *= oomag; -        mdV[1] *= oomag; -        mdV[2] *= oomag; +        oomag = 1.0/mag; +        mdV[VX] *= oomag; +        mdV[VY] *= oomag; +        mdV[VZ] *= oomag;      }      else      { -        mdV[0] = 0.f; -        mdV[1] = 0.f; -        mdV[2] = 0.f; +        mdV[VX] = 0.0; +        mdV[VY] = 0.0; +        mdV[VZ] = 0.0;          mag = 0;      }      return (mag); @@ -323,24 +323,24 @@ inline F64 LLVector3d::normalize(void)  // LLVector3d Magnitude and Normalization Functions -inline F64  LLVector3d::magVec(void) const +inline F64  LLVector3d::magVec() const  { -    return (F32) sqrt(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]); +    return sqrt(mdV[VX]*mdV[VX] + mdV[VY]*mdV[VY] + mdV[VZ]*mdV[VZ]);  } -inline F64  LLVector3d::magVecSquared(void) const +inline F64  LLVector3d::magVecSquared() const  { -    return mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]; +    return mdV[VX]*mdV[VX] + mdV[VY]*mdV[VY] + mdV[VZ]*mdV[VZ];  } -inline F64  LLVector3d::length(void) const +inline F64  LLVector3d::length() const  { -    return (F32) sqrt(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]); +    return sqrt(mdV[VX]*mdV[VX] + mdV[VY]*mdV[VY] + mdV[VZ]*mdV[VZ]);  } -inline F64  LLVector3d::lengthSquared(void) const +inline F64  LLVector3d::lengthSquared() const  { -    return mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]; +    return mdV[VX]*mdV[VX] + mdV[VY]*mdV[VY] + mdV[VZ]*mdV[VZ];  }  inline LLVector3d operator+(const LLVector3d& a, const LLVector3d& b) @@ -357,109 +357,109 @@ inline LLVector3d operator-(const LLVector3d& a, const LLVector3d& b)  inline F64  operator*(const LLVector3d& a, const LLVector3d& b)  { -    return (a.mdV[0]*b.mdV[0] + a.mdV[1]*b.mdV[1] + a.mdV[2]*b.mdV[2]); +    return (a.mdV[VX]*b.mdV[VX] + a.mdV[VY]*b.mdV[VY] + a.mdV[VZ]*b.mdV[VZ]);  }  inline LLVector3d operator%(const LLVector3d& a, const LLVector3d& b)  { -    return LLVector3d( a.mdV[1]*b.mdV[2] - b.mdV[1]*a.mdV[2], a.mdV[2]*b.mdV[0] - b.mdV[2]*a.mdV[0], a.mdV[0]*b.mdV[1] - b.mdV[0]*a.mdV[1] ); +    return LLVector3d( a.mdV[VY]*b.mdV[VZ] - b.mdV[VY]*a.mdV[VZ], a.mdV[VZ]*b.mdV[VX] - b.mdV[VZ]*a.mdV[VX], a.mdV[VX]*b.mdV[VY] - b.mdV[VX]*a.mdV[VY] );  }  inline LLVector3d operator/(const LLVector3d& a, const F64 k)  {      F64 t = 1.f / k; -    return LLVector3d( a.mdV[0] * t, a.mdV[1] * t, a.mdV[2] * t ); +    return LLVector3d( a.mdV[VX] * t, a.mdV[VY] * t, a.mdV[VZ] * t );  }  inline LLVector3d operator*(const LLVector3d& a, const F64 k)  { -    return LLVector3d( a.mdV[0] * k, a.mdV[1] * k, a.mdV[2] * k ); +    return LLVector3d( a.mdV[VX] * k, a.mdV[VY] * k, a.mdV[VZ] * k );  }  inline LLVector3d operator*(F64 k, const LLVector3d& a)  { -    return LLVector3d( a.mdV[0] * k, a.mdV[1] * k, a.mdV[2] * k ); +    return LLVector3d( a.mdV[VX] * k, a.mdV[VY] * k, a.mdV[VZ] * k );  }  inline bool operator==(const LLVector3d& a, const LLVector3d& b)  { -    return (  (a.mdV[0] == b.mdV[0]) -            &&(a.mdV[1] == b.mdV[1]) -            &&(a.mdV[2] == b.mdV[2])); +    return (  (a.mdV[VX] == b.mdV[VX]) +            &&(a.mdV[VY] == b.mdV[VY]) +            &&(a.mdV[VZ] == b.mdV[VZ]));  }  inline bool operator!=(const LLVector3d& a, const LLVector3d& b)  { -    return (  (a.mdV[0] != b.mdV[0]) -            ||(a.mdV[1] != b.mdV[1]) -            ||(a.mdV[2] != b.mdV[2])); +    return (  (a.mdV[VX] != b.mdV[VX]) +            ||(a.mdV[VY] != b.mdV[VY]) +            ||(a.mdV[VZ] != b.mdV[VZ]));  }  inline const LLVector3d& operator+=(LLVector3d& a, const LLVector3d& b)  { -    a.mdV[0] += b.mdV[0]; -    a.mdV[1] += b.mdV[1]; -    a.mdV[2] += b.mdV[2]; +    a.mdV[VX] += b.mdV[VX]; +    a.mdV[VY] += b.mdV[VY]; +    a.mdV[VZ] += b.mdV[VZ];      return a;  }  inline const LLVector3d& operator-=(LLVector3d& a, const LLVector3d& b)  { -    a.mdV[0] -= b.mdV[0]; -    a.mdV[1] -= b.mdV[1]; -    a.mdV[2] -= b.mdV[2]; +    a.mdV[VX] -= b.mdV[VX]; +    a.mdV[VY] -= b.mdV[VY]; +    a.mdV[VZ] -= b.mdV[VZ];      return a;  }  inline const LLVector3d& operator%=(LLVector3d& a, const LLVector3d& b)  { -    LLVector3d ret( a.mdV[1]*b.mdV[2] - b.mdV[1]*a.mdV[2], a.mdV[2]*b.mdV[0] - b.mdV[2]*a.mdV[0], a.mdV[0]*b.mdV[1] - b.mdV[0]*a.mdV[1]); +    LLVector3d ret( a.mdV[VY]*b.mdV[VZ] - b.mdV[VY]*a.mdV[VZ], a.mdV[VZ]*b.mdV[VX] - b.mdV[VZ]*a.mdV[VX], a.mdV[VX]*b.mdV[VY] - b.mdV[VX]*a.mdV[VY]);      a = ret;      return a;  }  inline const LLVector3d& operator*=(LLVector3d& a, const F64 k)  { -    a.mdV[0] *= k; -    a.mdV[1] *= k; -    a.mdV[2] *= k; +    a.mdV[VX] *= k; +    a.mdV[VY] *= k; +    a.mdV[VZ] *= k;      return a;  }  inline const LLVector3d& operator/=(LLVector3d& a, const F64 k)  {      F64 t = 1.f / k; -    a.mdV[0] *= t; -    a.mdV[1] *= t; -    a.mdV[2] *= t; +    a.mdV[VX] *= t; +    a.mdV[VY] *= t; +    a.mdV[VZ] *= t;      return a;  }  inline LLVector3d operator-(const LLVector3d& a)  { -    return LLVector3d( -a.mdV[0], -a.mdV[1], -a.mdV[2] ); +    return LLVector3d( -a.mdV[VX], -a.mdV[VY], -a.mdV[VZ] );  }  inline F64  dist_vec(const LLVector3d& a, const LLVector3d& b)  { -    F64 x = a.mdV[0] - b.mdV[0]; -    F64 y = a.mdV[1] - b.mdV[1]; -    F64 z = a.mdV[2] - b.mdV[2]; +    F64 x = a.mdV[VX] - b.mdV[VX]; +    F64 y = a.mdV[VY] - b.mdV[VY]; +    F64 z = a.mdV[VZ] - b.mdV[VZ];      return (F32) sqrt( x*x + y*y + z*z );  }  inline F64  dist_vec_squared(const LLVector3d& a, const LLVector3d& b)  { -    F64 x = a.mdV[0] - b.mdV[0]; -    F64 y = a.mdV[1] - b.mdV[1]; -    F64 z = a.mdV[2] - b.mdV[2]; +    F64 x = a.mdV[VX] - b.mdV[VX]; +    F64 y = a.mdV[VY] - b.mdV[VY]; +    F64 z = a.mdV[VZ] - b.mdV[VZ];      return x*x + y*y + z*z;  }  inline F64  dist_vec_squared2D(const LLVector3d& a, const LLVector3d& b)  { -    F64 x = a.mdV[0] - b.mdV[0]; -    F64 y = a.mdV[1] - b.mdV[1]; +    F64 x = a.mdV[VX] - b.mdV[VX]; +    F64 y = a.mdV[VY] - b.mdV[VY];      return x*x + y*y;  } diff --git a/indra/llmath/v3math.cpp b/indra/llmath/v3math.cpp index 73ad2a4ed6..eac95ed023 100644 --- a/indra/llmath/v3math.cpp +++ b/indra/llmath/v3math.cpp @@ -28,7 +28,6 @@  #include "v3math.h" -//#include "vmath.h"  #include "v2math.h"  #include "v4math.h"  #include "m4math.h" @@ -58,13 +57,13 @@ bool LLVector3::clamp(F32 min, F32 max)  {      bool ret{ false }; -    if (mV[0] < min) { mV[0] = min; ret = true; } -    if (mV[1] < min) { mV[1] = min; ret = true; } -    if (mV[2] < min) { mV[2] = min; ret = true; } +    if (mV[VX] < min) { mV[VX] = min; ret = true; } +    if (mV[VY] < min) { mV[VY] = min; ret = true; } +    if (mV[VZ] < min) { mV[VZ] = min; ret = true; } -    if (mV[0] > max) { mV[0] = max; ret = true; } -    if (mV[1] > max) { mV[1] = max; ret = true; } -    if (mV[2] > max) { mV[2] = max; ret = true; } +    if (mV[VX] > max) { mV[VX] = max; ret = true; } +    if (mV[VY] > max) { mV[VY] = max; ret = true; } +    if (mV[VZ] > max) { mV[VZ] = max; ret = true; }      return ret;  } @@ -85,9 +84,9 @@ bool LLVector3::clampLength( F32 length_limit )              {                  length_limit = 0.f;              } -            mV[0] *= length_limit; -            mV[1] *= length_limit; -            mV[2] *= length_limit; +            mV[VX] *= length_limit; +            mV[VY] *= length_limit; +            mV[VZ] *= length_limit;              changed = true;          }      } @@ -116,35 +115,35 @@ bool LLVector3::clampLength( F32 length_limit )          {              // yes it can be salvaged -->              // bring the components down before we normalize -            mV[0] /= max_abs_component; -            mV[1] /= max_abs_component; -            mV[2] /= max_abs_component; +            mV[VX] /= max_abs_component; +            mV[VY] /= max_abs_component; +            mV[VZ] /= max_abs_component;              normalize();              if (length_limit < 0.f)              {                  length_limit = 0.f;              } -            mV[0] *= length_limit; -            mV[1] *= length_limit; -            mV[2] *= length_limit; +            mV[VX] *= length_limit; +            mV[VY] *= length_limit; +            mV[VZ] *= length_limit;          }      }      return changed;  } -bool LLVector3::clamp(const LLVector3 &min_vec, const LLVector3 &max_vec) +bool LLVector3::clamp(const LLVector3& min_vec, const LLVector3& max_vec)  {      bool ret{ false }; -    if (mV[0] < min_vec[0]) { mV[0] = min_vec[0]; ret = true; } -    if (mV[1] < min_vec[1]) { mV[1] = min_vec[1]; ret = true; } -    if (mV[2] < min_vec[2]) { mV[2] = min_vec[2]; ret = true; } +    if (mV[VX] < min_vec[0]) { mV[VX] = min_vec[0]; ret = true; } +    if (mV[VY] < min_vec[1]) { mV[VY] = min_vec[1]; ret = true; } +    if (mV[VZ] < min_vec[2]) { mV[VZ] = min_vec[2]; ret = true; } -    if (mV[0] > max_vec[0]) { mV[0] = max_vec[0]; ret = true; } -    if (mV[1] > max_vec[1]) { mV[1] = max_vec[1]; ret = true; } -    if (mV[2] > max_vec[2]) { mV[2] = max_vec[2]; ret = true; } +    if (mV[VX] > max_vec[0]) { mV[VX] = max_vec[0]; ret = true; } +    if (mV[VY] > max_vec[1]) { mV[VY] = max_vec[1]; ret = true; } +    if (mV[VZ] > max_vec[2]) { mV[VZ] = max_vec[2]; ret = true; }      return ret;  } @@ -156,15 +155,15 @@ bool LLVector3::abs()  {      bool ret{ false }; -    if (mV[0] < 0.f) { mV[0] = -mV[0]; ret = true; } -    if (mV[1] < 0.f) { mV[1] = -mV[1]; ret = true; } -    if (mV[2] < 0.f) { mV[2] = -mV[2]; ret = true; } +    if (mV[VX] < 0.f) { mV[VX] = -mV[VX]; ret = true; } +    if (mV[VY] < 0.f) { mV[VY] = -mV[VY]; ret = true; } +    if (mV[VZ] < 0.f) { mV[VZ] = -mV[VZ]; ret = true; }      return ret;  }  // Quatizations -void    LLVector3::quantize16(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz) +void LLVector3::quantize16(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz)  {      F32 x = mV[VX];      F32 y = mV[VY]; @@ -179,7 +178,7 @@ void    LLVector3::quantize16(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz)      mV[VZ] = z;  } -void    LLVector3::quantize8(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz) +void LLVector3::quantize8(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz)  {      mV[VX] = U8_to_F32(F32_to_U8(mV[VX], lowerxy, upperxy), lowerxy, upperxy);;      mV[VY] = U8_to_F32(F32_to_U8(mV[VY], lowerxy, upperxy), lowerxy, upperxy); @@ -187,20 +186,20 @@ void    LLVector3::quantize8(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz)  } -void    LLVector3::snap(S32 sig_digits) +void LLVector3::snap(S32 sig_digits)  {      mV[VX] = snap_to_sig_figs(mV[VX], sig_digits);      mV[VY] = snap_to_sig_figs(mV[VY], sig_digits);      mV[VZ] = snap_to_sig_figs(mV[VZ], sig_digits);  } -const LLVector3&    LLVector3::rotVec(const LLMatrix3 &mat) +const LLVector3& LLVector3::rotVec(const LLMatrix3& mat)  {      *this = *this * mat;      return *this;  } -const LLVector3&    LLVector3::rotVec(const LLQuaternion &q) +const LLVector3& LLVector3::rotVec(const LLQuaternion& q)  {      *this = *this * q;      return *this; @@ -228,26 +227,26 @@ const LLVector3& LLVector3::transVec(const LLMatrix4& mat)  } -const LLVector3&    LLVector3::rotVec(F32 angle, const LLVector3 &vec) +const LLVector3& LLVector3::rotVec(F32 angle, const LLVector3& vec)  { -    if ( !vec.isExactlyZero() && angle ) +    if (!vec.isExactlyZero() && angle)      {          *this = *this * LLQuaternion(angle, vec);      }      return *this;  } -const LLVector3&    LLVector3::rotVec(F32 angle, F32 x, F32 y, F32 z) +const LLVector3& LLVector3::rotVec(F32 angle, F32 x, F32 y, F32 z)  {      LLVector3 vec(x, y, z); -    if ( !vec.isExactlyZero() && angle ) +    if (!vec.isExactlyZero() && angle)      {          *this = *this * LLQuaternion(angle, vec);      }      return *this;  } -const LLVector3&    LLVector3::scaleVec(const LLVector3& vec) +const LLVector3& LLVector3::scaleVec(const LLVector3& vec)  {      mV[VX] *= vec.mV[VX];      mV[VY] *= vec.mV[VY]; @@ -256,42 +255,42 @@ const LLVector3&    LLVector3::scaleVec(const LLVector3& vec)      return *this;  } -LLVector3           LLVector3::scaledVec(const LLVector3& vec) const +LLVector3 LLVector3::scaledVec(const LLVector3& vec) const  {      LLVector3 ret = LLVector3(*this);      ret.scaleVec(vec);      return ret;  } -const LLVector3&    LLVector3::set(const LLVector3d &vec) +const LLVector3& LLVector3::set(const LLVector3d& vec)  { -    mV[0] = (F32)vec.mdV[0]; -    mV[1] = (F32)vec.mdV[1]; -    mV[2] = (F32)vec.mdV[2]; +    mV[VX] = (F32)vec.mdV[VX]; +    mV[VY] = (F32)vec.mdV[VY]; +    mV[VZ] = (F32)vec.mdV[VZ];      return (*this);  } -const LLVector3&    LLVector3::set(const LLVector4 &vec) +const LLVector3& LLVector3::set(const LLVector4& vec)  { -    mV[0] = vec.mV[0]; -    mV[1] = vec.mV[1]; -    mV[2] = vec.mV[2]; +    mV[VX] = vec.mV[VX]; +    mV[VY] = vec.mV[VY]; +    mV[VZ] = vec.mV[VZ];      return (*this);  } -const LLVector3&    LLVector3::setVec(const LLVector3d &vec) +const LLVector3& LLVector3::setVec(const LLVector3d& vec)  { -    mV[0] = (F32)vec.mdV[0]; -    mV[1] = (F32)vec.mdV[1]; -    mV[2] = (F32)vec.mdV[2]; +    mV[VX] = (F32)vec.mdV[0]; +    mV[VY] = (F32)vec.mdV[1]; +    mV[VZ] = (F32)vec.mdV[2];      return (*this);  } -const LLVector3&    LLVector3::setVec(const LLVector4 &vec) +const LLVector3& LLVector3::setVec(const LLVector4& vec)  { -    mV[0] = vec.mV[0]; -    mV[1] = vec.mV[1]; -    mV[2] = vec.mV[2]; +    mV[VX] = vec.mV[VX]; +    mV[VY] = vec.mV[VY]; +    mV[VZ] = vec.mV[VZ];      return (*this);  } @@ -299,17 +298,17 @@ LLVector3::LLVector3(const LLVector2 &vec)  {      mV[VX] = (F32)vec.mV[VX];      mV[VY] = (F32)vec.mV[VY]; -    mV[VZ] = 0; +    mV[VZ] = 0.f;  } -LLVector3::LLVector3(const LLVector3d &vec) +LLVector3::LLVector3(const LLVector3d& vec)  {      mV[VX] = (F32)vec.mdV[VX];      mV[VY] = (F32)vec.mdV[VY];      mV[VZ] = (F32)vec.mdV[VZ];  } -LLVector3::LLVector3(const LLVector4 &vec) +LLVector3::LLVector3(const LLVector4& vec)  {      mV[VX] = (F32)vec.mV[VX];      mV[VY] = (F32)vec.mV[VY]; @@ -319,7 +318,6 @@ LLVector3::LLVector3(const LLVector4 &vec)  LLVector3::LLVector3(const LLVector4a& vec)      : LLVector3(vec.getF32ptr())  { -  }  LLVector3::LLVector3(const LLSD& sd) @@ -330,20 +328,20 @@ LLVector3::LLVector3(const LLSD& sd)  LLSD LLVector3::getValue() const  {      LLSD ret; -    ret[0] = mV[0]; -    ret[1] = mV[1]; -    ret[2] = mV[2]; +    ret[VX] = mV[VX]; +    ret[VY] = mV[VY]; +    ret[VZ] = mV[VZ];      return ret;  }  void LLVector3::setValue(const LLSD& sd)  { -    mV[0] = (F32) sd[0].asReal(); -    mV[1] = (F32) sd[1].asReal(); -    mV[2] = (F32) sd[2].asReal(); +    mV[VX] = (F32) sd[VX].asReal(); +    mV[VY] = (F32) sd[VY].asReal(); +    mV[VZ] = (F32) sd[VZ].asReal();  } -const LLVector3& operator*=(LLVector3 &a, const LLQuaternion &rot) +const LLVector3& operator*=(LLVector3& a, const LLQuaternion& rot)  {      const F32 rw = - rot.mQ[VX] * a.mV[VX] - rot.mQ[VY] * a.mV[VY] - rot.mQ[VZ] * a.mV[VZ];      const F32 rx =   rot.mQ[VW] * a.mV[VX] + rot.mQ[VY] * a.mV[VZ] - rot.mQ[VZ] * a.mV[VY]; @@ -360,16 +358,16 @@ const LLVector3& operator*=(LLVector3 &a, const LLQuaternion &rot)  // static  bool LLVector3::parseVector3(const std::string& buf, LLVector3* value)  { -    if( buf.empty() || value == nullptr) +    if (buf.empty() || value == nullptr)      {          return false;      }      LLVector3 v; -    S32 count = sscanf( buf.c_str(), "%f %f %f", v.mV + 0, v.mV + 1, v.mV + 2 ); -    if( 3 == count ) +    S32 count = sscanf(buf.c_str(), "%f %f %f", v.mV + VX, v.mV + VY, v.mV + VZ); +    if (3 == count)      { -        value->setVec( v ); +        value->setVec(v);          return true;      } @@ -381,7 +379,7 @@ bool LLVector3::parseVector3(const std::string& buf, LLVector3* value)  LLVector3 point_to_box_offset(LLVector3& pos, const LLVector3* box)  {      LLVector3 offset; -    for (S32 k=0; k<3; k++) +    for (S32 k = 0; k < 3; k++)      {          offset[k] = 0;          if (pos[k] < box[0][k]) @@ -410,4 +408,3 @@ bool box_valid_and_non_zero(const LLVector3* box)      }      return false;  } - diff --git a/indra/llmath/v3math.h b/indra/llmath/v3math.h index a3bfa68060..551c7df6c9 100644 --- a/indra/llmath/v3math.h +++ b/indra/llmath/v3math.h @@ -46,7 +46,7 @@ class LLQuaternion;  //  LLvector3 = |x y z w| -static const U32 LENGTHOFVECTOR3 = 3; +static constexpr U32 LENGTHOFVECTOR3 = 3;  class LLVector3  { @@ -181,11 +181,11 @@ LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u); // Returns a vect  LLVector3 point_to_box_offset(LLVector3& pos, const LLVector3* box); // Displacement from query point to nearest point on bounding box.  bool box_valid_and_non_zero(const LLVector3* box); -inline LLVector3::LLVector3(void) +inline LLVector3::LLVector3()  { -    mV[0] = 0.f; -    mV[1] = 0.f; -    mV[2] = 0.f; +    mV[VX] = 0.f; +    mV[VY] = 0.f; +    mV[VZ] = 0.f;  }  inline LLVector3::LLVector3(const F32 x, const F32 y, const F32 z) @@ -236,32 +236,32 @@ inline bool LLVector3::isFinite() const  // Clear and Assignment Functions -inline void LLVector3::clear(void) +inline void LLVector3::clear()  { -    mV[0] = 0.f; -    mV[1] = 0.f; -    mV[2] = 0.f; +    mV[VX] = 0.f; +    mV[VY] = 0.f; +    mV[VZ] = 0.f;  } -inline void LLVector3::setZero(void) +inline void LLVector3::setZero()  { -    mV[0] = 0.f; -    mV[1] = 0.f; -    mV[2] = 0.f; +    mV[VX] = 0.f; +    mV[VY] = 0.f; +    mV[VZ] = 0.f;  } -inline void LLVector3::clearVec(void) +inline void LLVector3::clearVec()  { -    mV[0] = 0.f; -    mV[1] = 0.f; -    mV[2] = 0.f; +    mV[VX] = 0.f; +    mV[VY] = 0.f; +    mV[VZ] = 0.f;  } -inline void LLVector3::zeroVec(void) +inline void LLVector3::zeroVec()  { -    mV[0] = 0.f; -    mV[1] = 0.f; -    mV[2] = 0.f; +    mV[VX] = 0.f; +    mV[VY] = 0.f; +    mV[VZ] = 0.f;  }  inline void LLVector3::set(F32 x, F32 y, F32 z) @@ -271,18 +271,18 @@ inline void LLVector3::set(F32 x, F32 y, F32 z)      mV[VZ] = z;  } -inline void LLVector3::set(const LLVector3 &vec) +inline void LLVector3::set(const LLVector3& vec)  { -    mV[0] = vec.mV[0]; -    mV[1] = vec.mV[1]; -    mV[2] = vec.mV[2]; +    mV[VX] = vec.mV[VX]; +    mV[VY] = vec.mV[VY]; +    mV[VZ] = vec.mV[VZ];  } -inline void LLVector3::set(const F32 *vec) +inline void LLVector3::set(const F32* vec)  { -    mV[0] = vec[0]; -    mV[1] = vec[1]; -    mV[2] = vec[2]; +    mV[VX] = vec[VX]; +    mV[VY] = vec[VY]; +    mV[VZ] = vec[VZ];  }  inline void LLVector3::set(const glm::vec4& vec) @@ -308,61 +308,61 @@ inline void LLVector3::setVec(F32 x, F32 y, F32 z)  }  // deprecated -inline void LLVector3::setVec(const LLVector3 &vec) +inline void LLVector3::setVec(const LLVector3& vec)  { -    mV[0] = vec.mV[0]; -    mV[1] = vec.mV[1]; -    mV[2] = vec.mV[2]; +    mV[VX] = vec.mV[VX]; +    mV[VY] = vec.mV[VY]; +    mV[VZ] = vec.mV[VZ];  }  // deprecated -inline void LLVector3::setVec(const F32 *vec) +inline void LLVector3::setVec(const F32* vec)  { -    mV[0] = vec[0]; -    mV[1] = vec[1]; -    mV[2] = vec[2]; +    mV[VX] = vec[0]; +    mV[VY] = vec[1]; +    mV[VZ] = vec[2];  } -inline F32 LLVector3::normalize(void) +inline F32 LLVector3::normalize()  { -    F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]); +    F32 mag = (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);      F32 oomag;      if (mag > FP_MAG_THRESHOLD)      {          oomag = 1.f/mag; -        mV[0] *= oomag; -        mV[1] *= oomag; -        mV[2] *= oomag; +        mV[VX] *= oomag; +        mV[VY] *= oomag; +        mV[VZ] *= oomag;      }      else      { -        mV[0] = 0.f; -        mV[1] = 0.f; -        mV[2] = 0.f; +        mV[VX] = 0.f; +        mV[VY] = 0.f; +        mV[VZ] = 0.f;          mag = 0;      }      return (mag);  }  // deprecated -inline F32 LLVector3::normVec(void) +inline F32 LLVector3::normVec()  { -    F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]); +    F32 mag = sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);      F32 oomag;      if (mag > FP_MAG_THRESHOLD)      {          oomag = 1.f/mag; -        mV[0] *= oomag; -        mV[1] *= oomag; -        mV[2] *= oomag; +        mV[VX] *= oomag; +        mV[VY] *= oomag; +        mV[VZ] *= oomag;      }      else      { -        mV[0] = 0.f; -        mV[1] = 0.f; -        mV[2] = 0.f; +        mV[VX] = 0.f; +        mV[VY] = 0.f; +        mV[VZ] = 0.f;          mag = 0;      }      return (mag); @@ -370,145 +370,144 @@ inline F32 LLVector3::normVec(void)  // LLVector3 Magnitude and Normalization Functions -inline F32  LLVector3::length(void) const +inline F32  LLVector3::length() const  { -    return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]); +    return sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);  } -inline F32  LLVector3::lengthSquared(void) const +inline F32  LLVector3::lengthSquared() const  { -    return mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]; +    return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];  } -inline F32  LLVector3::magVec(void) const +inline F32  LLVector3::magVec() const  { -    return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]); +    return sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);  } -inline F32  LLVector3::magVecSquared(void) const +inline F32  LLVector3::magVecSquared() const  { -    return mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]; +    return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];  }  inline bool LLVector3::inRange( F32 min, F32 max ) const  { -    return mV[0] >= min && mV[0] <= max && -           mV[1] >= min && mV[1] <= max && -           mV[2] >= min && mV[2] <= max; +    return mV[VX] >= min && mV[VX] <= max && +           mV[VY] >= min && mV[VY] <= max && +           mV[VZ] >= min && mV[VZ] <= max;  } -inline LLVector3 operator+(const LLVector3 &a, const LLVector3 &b) +inline LLVector3 operator+(const LLVector3& a, const LLVector3& b)  {      LLVector3 c(a);      return c += b;  } -inline LLVector3 operator-(const LLVector3 &a, const LLVector3 &b) +inline LLVector3 operator-(const LLVector3& a, const LLVector3& b)  {      LLVector3 c(a);      return c -= b;  } -inline F32  operator*(const LLVector3 &a, const LLVector3 &b) +inline F32  operator*(const LLVector3& a, const LLVector3& b)  { -    return (a.mV[0]*b.mV[0] + a.mV[1]*b.mV[1] + a.mV[2]*b.mV[2]); +    return (a.mV[VX]*b.mV[VX] + a.mV[VY]*b.mV[VY] + a.mV[VZ]*b.mV[VZ]);  } -inline LLVector3 operator%(const LLVector3 &a, const LLVector3 &b) +inline LLVector3 operator%(const LLVector3& a, const LLVector3& b)  { -    return LLVector3( a.mV[1]*b.mV[2] - b.mV[1]*a.mV[2], a.mV[2]*b.mV[0] - b.mV[2]*a.mV[0], a.mV[0]*b.mV[1] - b.mV[0]*a.mV[1] ); +    return LLVector3( a.mV[VY]*b.mV[VZ] - b.mV[VY]*a.mV[VZ], a.mV[VZ]*b.mV[VX] - b.mV[VZ]*a.mV[VX], a.mV[VX]*b.mV[VY] - b.mV[VX]*a.mV[VY] );  } -inline LLVector3 operator/(const LLVector3 &a, F32 k) +inline LLVector3 operator/(const LLVector3& a, F32 k)  {      F32 t = 1.f / k; -    return LLVector3( a.mV[0] * t, a.mV[1] * t, a.mV[2] * t ); +    return LLVector3( a.mV[VX] * t, a.mV[VY] * t, a.mV[VZ] * t );  } -inline LLVector3 operator*(const LLVector3 &a, F32 k) +inline LLVector3 operator*(const LLVector3& a, F32 k)  { -    return LLVector3( a.mV[0] * k, a.mV[1] * k, a.mV[2] * k ); +    return LLVector3( a.mV[VX] * k, a.mV[VY] * k, a.mV[VZ] * k );  } -inline LLVector3 operator*(F32 k, const LLVector3 &a) +inline LLVector3 operator*(F32 k, const LLVector3& a)  { -    return LLVector3( a.mV[0] * k, a.mV[1] * k, a.mV[2] * k ); +    return LLVector3( a.mV[VX] * k, a.mV[VY] * k, a.mV[VZ] * k );  } -inline bool operator==(const LLVector3 &a, const LLVector3 &b) +inline bool operator==(const LLVector3& a, const LLVector3& b)  { -    return (  (a.mV[0] == b.mV[0]) -            &&(a.mV[1] == b.mV[1]) -            &&(a.mV[2] == b.mV[2])); +    return (  (a.mV[VX] == b.mV[VX]) +            &&(a.mV[VY] == b.mV[VY]) +            &&(a.mV[VZ] == b.mV[VZ]));  } -inline bool operator!=(const LLVector3 &a, const LLVector3 &b) +inline bool operator!=(const LLVector3& a, const LLVector3& b)  { -    return (  (a.mV[0] != b.mV[0]) -            ||(a.mV[1] != b.mV[1]) -            ||(a.mV[2] != b.mV[2])); +    return (  (a.mV[VX] != b.mV[VX]) +            ||(a.mV[VY] != b.mV[VY]) +            ||(a.mV[VZ] != b.mV[VZ]));  } -inline bool operator<(const LLVector3 &a, const LLVector3 &b) +inline bool operator<(const LLVector3& a, const LLVector3& b)  { -    return (a.mV[0] < b.mV[0] -            || (a.mV[0] == b.mV[0] -                && (a.mV[1] < b.mV[1] -                    || ((a.mV[1] == b.mV[1]) -                        && a.mV[2] < b.mV[2])))); +    return (a.mV[VX] < b.mV[VX] +            || (a.mV[VX] == b.mV[VX] +                && (a.mV[VY] < b.mV[VY] +                    || ((a.mV[VY] == b.mV[VY]) +                        && a.mV[VZ] < b.mV[VZ]))));  } -inline const LLVector3& operator+=(LLVector3 &a, const LLVector3 &b) +inline const LLVector3& operator+=(LLVector3& a, const LLVector3& b)  { -    a.mV[0] += b.mV[0]; -    a.mV[1] += b.mV[1]; -    a.mV[2] += b.mV[2]; +    a.mV[VX] += b.mV[VX]; +    a.mV[VY] += b.mV[VY]; +    a.mV[VZ] += b.mV[VZ];      return a;  } -inline const LLVector3& operator-=(LLVector3 &a, const LLVector3 &b) +inline const LLVector3& operator-=(LLVector3& a, const LLVector3& b)  { -    a.mV[0] -= b.mV[0]; -    a.mV[1] -= b.mV[1]; -    a.mV[2] -= b.mV[2]; +    a.mV[VX] -= b.mV[VX]; +    a.mV[VY] -= b.mV[VY]; +    a.mV[VZ] -= b.mV[VZ];      return a;  } -inline const LLVector3& operator%=(LLVector3 &a, const LLVector3 &b) +inline const LLVector3& operator%=(LLVector3& a, const LLVector3& b)  { -    LLVector3 ret( a.mV[1]*b.mV[2] - b.mV[1]*a.mV[2], a.mV[2]*b.mV[0] - b.mV[2]*a.mV[0], a.mV[0]*b.mV[1] - b.mV[0]*a.mV[1]); +    LLVector3 ret( a.mV[VY]*b.mV[VZ] - b.mV[VY]*a.mV[VZ], a.mV[VZ]*b.mV[VX] - b.mV[VZ]*a.mV[VX], a.mV[VX]*b.mV[VY] - b.mV[VX]*a.mV[VY]);      a = ret;      return a;  } -inline const LLVector3& operator*=(LLVector3 &a, F32 k) +inline const LLVector3& operator*=(LLVector3& a, F32 k)  { -    a.mV[0] *= k; -    a.mV[1] *= k; -    a.mV[2] *= k; +    a.mV[VX] *= k; +    a.mV[VY] *= k; +    a.mV[VZ] *= k;      return a;  } -inline const LLVector3& operator*=(LLVector3 &a, const LLVector3 &b) +inline const LLVector3& operator*=(LLVector3& a, const LLVector3& b)  { -    a.mV[0] *= b.mV[0]; -    a.mV[1] *= b.mV[1]; -    a.mV[2] *= b.mV[2]; +    a.mV[VX] *= b.mV[VX]; +    a.mV[VY] *= b.mV[VY]; +    a.mV[VZ] *= b.mV[VZ];      return a;  } -inline const LLVector3& operator/=(LLVector3 &a, F32 k) +inline const LLVector3& operator/=(LLVector3& a, F32 k)  { -    F32 t = 1.f / k; -    a.mV[0] *= t; -    a.mV[1] *= t; -    a.mV[2] *= t; +    a.mV[VX] /= k; +    a.mV[VY] /= k; +    a.mV[VZ] /= k;      return a;  } -inline LLVector3 operator-(const LLVector3 &a) +inline LLVector3 operator-(const LLVector3& a)  { -    return LLVector3( -a.mV[0], -a.mV[1], -a.mV[2] ); +    return LLVector3(-a.mV[VX], -a.mV[VY], -a.mV[VZ]);  }  inline LLVector3::operator glm::vec3() const @@ -522,30 +521,30 @@ inline LLVector3::operator glm::vec4() const      return glm::vec4(mV[VX], mV[VY], mV[VZ], 1.f);  } -inline F32  dist_vec(const LLVector3 &a, const LLVector3 &b) +inline F32 dist_vec(const LLVector3& a, const LLVector3& b)  { -    F32 x = a.mV[0] - b.mV[0]; -    F32 y = a.mV[1] - b.mV[1]; -    F32 z = a.mV[2] - b.mV[2]; -    return (F32) sqrt( x*x + y*y + z*z ); +    F32 x = a.mV[VX] - b.mV[VX]; +    F32 y = a.mV[VY] - b.mV[VY]; +    F32 z = a.mV[VZ] - b.mV[VZ]; +    return sqrt( x*x + y*y + z*z );  } -inline F32  dist_vec_squared(const LLVector3 &a, const LLVector3 &b) +inline F32 dist_vec_squared(const LLVector3& a, const LLVector3& b)  { -    F32 x = a.mV[0] - b.mV[0]; -    F32 y = a.mV[1] - b.mV[1]; -    F32 z = a.mV[2] - b.mV[2]; +    F32 x = a.mV[VX] - b.mV[VX]; +    F32 y = a.mV[VY] - b.mV[VY]; +    F32 z = a.mV[VZ] - b.mV[VZ];      return x*x + y*y + z*z;  } -inline F32  dist_vec_squared2D(const LLVector3 &a, const LLVector3 &b) +inline F32 dist_vec_squared2D(const LLVector3& a, const LLVector3& b)  { -    F32 x = a.mV[0] - b.mV[0]; -    F32 y = a.mV[1] - b.mV[1]; +    F32 x = a.mV[VX] - b.mV[VX]; +    F32 y = a.mV[VY] - b.mV[VY];      return x*x + y*y;  } -inline LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b) +inline LLVector3 projected_vec(const LLVector3& a, const LLVector3& b)  {      F32 bb = b * b;      if (bb > FP_MAG_THRESHOLD * FP_MAG_THRESHOLD) @@ -570,18 +569,18 @@ inline LLVector3 inverse_projected_vec(const LLVector3& a, const LLVector3& b)      return normalized_a * (b_length / dot_product);  } -inline LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b) +inline LLVector3 parallel_component(const LLVector3& a, const LLVector3& b)  {      return projected_vec(a, b);  } -inline LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b) +inline LLVector3 orthogonal_component(const LLVector3& a, const LLVector3& b)  {      return a - projected_vec(a, b);  } -inline LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u) +inline LLVector3 lerp(const LLVector3& a, const LLVector3& b, F32 u)  {      return LLVector3(          a.mV[VX] + (b.mV[VX] - a.mV[VX]) * u, @@ -640,7 +639,7 @@ inline F32 angle_between(const LLVector3& a, const LLVector3& b)      return atan2f(sqrtf(c * c), ab); // return the angle  } -inline bool are_parallel(const LLVector3 &a, const LLVector3 &b, F32 epsilon) +inline bool are_parallel(const LLVector3& a, const LLVector3& b, F32 epsilon)  {      LLVector3 an = a;      LLVector3 bn = b; diff --git a/indra/llmath/v4color.cpp b/indra/llmath/v4color.cpp index ad13656bbd..1b687642ca 100644 --- a/indra/llmath/v4color.cpp +++ b/indra/llmath/v4color.cpp @@ -124,65 +124,64 @@ LLColor4 LLColor4::cyan6(0.2f, 0.6f, 0.6f, 1.0f);  // conversion  LLColor4::operator LLColor4U() const  { -    return LLColor4U( -        (U8)llclampb(ll_round(mV[VRED]*255.f)), -        (U8)llclampb(ll_round(mV[VGREEN]*255.f)), -        (U8)llclampb(ll_round(mV[VBLUE]*255.f)), -        (U8)llclampb(ll_round(mV[VALPHA]*255.f))); +    return LLColor4U((U8)llclampb(ll_round(mV[VRED] * 255.f)), +                     (U8)llclampb(ll_round(mV[VGREEN] * 255.f)), +                     (U8)llclampb(ll_round(mV[VBLUE] * 255.f)), +                     (U8)llclampb(ll_round(mV[VALPHA] * 255.f)));  } -LLColor4::LLColor4(const LLColor3 &vec, F32 a) +LLColor4::LLColor4(const LLColor3& vec, F32 a)  { -    mV[VRED] = vec.mV[VRED]; +    mV[VRED]   = vec.mV[VRED];      mV[VGREEN] = vec.mV[VGREEN]; -    mV[VBLUE] = vec.mV[VBLUE]; +    mV[VBLUE]  = vec.mV[VBLUE];      mV[VALPHA] = a;  }  LLColor4::LLColor4(const LLColor4U& color4u)  { -    const F32 SCALE = 1.f/255.f; -    mV[VRED] = color4u.mV[VRED] * SCALE; -    mV[VGREEN] = color4u.mV[VGREEN] * SCALE; -    mV[VBLUE] = color4u.mV[VBLUE] * SCALE; -    mV[VALPHA] = color4u.mV[VALPHA] * SCALE; +    constexpr F32 SCALE = 1.f / 255.f; +    mV[VRED]            = color4u.mV[VRED] * SCALE; +    mV[VGREEN]          = color4u.mV[VGREEN] * SCALE; +    mV[VBLUE]           = color4u.mV[VBLUE] * SCALE; +    mV[VALPHA]          = color4u.mV[VALPHA] * SCALE;  }  LLColor4::LLColor4(const LLVector4& vector4)  { -    mV[VRED] = vector4.mV[VRED]; +    mV[VRED]   = vector4.mV[VRED];      mV[VGREEN] = vector4.mV[VGREEN]; -    mV[VBLUE] = vector4.mV[VBLUE]; +    mV[VBLUE]  = vector4.mV[VBLUE];      mV[VALPHA] = vector4.mV[VALPHA];  }  const LLColor4& LLColor4::set(const LLColor4U& color4u)  { -    const F32 SCALE = 1.f/255.f; -    mV[VRED] = color4u.mV[VRED] * SCALE; -    mV[VGREEN] = color4u.mV[VGREEN] * SCALE; -    mV[VBLUE] = color4u.mV[VBLUE] * SCALE; -    mV[VALPHA] = color4u.mV[VALPHA] * SCALE; +    constexpr F32 SCALE = 1.f / 255.f; +    mV[VRED]            = color4u.mV[VRED] * SCALE; +    mV[VGREEN]          = color4u.mV[VGREEN] * SCALE; +    mV[VBLUE]           = color4u.mV[VBLUE] * SCALE; +    mV[VALPHA]          = color4u.mV[VALPHA] * SCALE;      return (*this);  } -const LLColor4& LLColor4::set(const LLColor3 &vec) +const LLColor4& LLColor4::set(const LLColor3& vec)  { -    mV[VRED] = vec.mV[VRED]; +    mV[VRED]   = vec.mV[VRED];      mV[VGREEN] = vec.mV[VGREEN]; -    mV[VBLUE] = vec.mV[VBLUE]; +    mV[VBLUE]  = vec.mV[VBLUE]; -//  no change to alpha! -//  mV[VALPHA] = 1.f; +    //  no change to alpha! +    //  mV[VALPHA] = 1.f;      return (*this);  } -const LLColor4& LLColor4::set(const LLColor3 &vec, F32 a) +const LLColor4& LLColor4::set(const LLColor3& vec, F32 a)  { -    mV[VRED] = vec.mV[VRED]; +    mV[VRED]   = vec.mV[VRED];      mV[VGREEN] = vec.mV[VGREEN]; -    mV[VBLUE] = vec.mV[VBLUE]; +    mV[VBLUE]  = vec.mV[VBLUE];      mV[VALPHA] = a;      return (*this);  } @@ -190,33 +189,33 @@ const LLColor4& LLColor4::set(const LLColor3 &vec, F32 a)  // deprecated -- use set()  const LLColor4& LLColor4::setVec(const LLColor4U& color4u)  { -    const F32 SCALE = 1.f/255.f; -    mV[VRED] = color4u.mV[VRED] * SCALE; -    mV[VGREEN] = color4u.mV[VGREEN] * SCALE; -    mV[VBLUE] = color4u.mV[VBLUE] * SCALE; -    mV[VALPHA] = color4u.mV[VALPHA] * SCALE; +    constexpr F32 SCALE = 1.f / 255.f; +    mV[VRED]            = color4u.mV[VRED] * SCALE; +    mV[VGREEN]          = color4u.mV[VGREEN] * SCALE; +    mV[VBLUE]           = color4u.mV[VBLUE] * SCALE; +    mV[VALPHA]          = color4u.mV[VALPHA] * SCALE;      return (*this);  }  // deprecated -- use set() -const LLColor4& LLColor4::setVec(const LLColor3 &vec) +const LLColor4& LLColor4::setVec(const LLColor3& vec)  { -    mV[VRED] = vec.mV[VRED]; +    mV[VRED]   = vec.mV[VRED];      mV[VGREEN] = vec.mV[VGREEN]; -    mV[VBLUE] = vec.mV[VBLUE]; +    mV[VBLUE]  = vec.mV[VBLUE]; -//  no change to alpha! -//  mV[VALPHA] = 1.f; +    //  no change to alpha! +    //  mV[VALPHA] = 1.f;      return (*this);  }  // deprecated -- use set() -const LLColor4& LLColor4::setVec(const LLColor3 &vec, F32 a) +const LLColor4& LLColor4::setVec(const LLColor3& vec, F32 a)  { -    mV[VRED] = vec.mV[VRED]; +    mV[VRED]   = vec.mV[VRED];      mV[VGREEN] = vec.mV[VGREEN]; -    mV[VBLUE] = vec.mV[VBLUE]; +    mV[VBLUE]  = vec.mV[VBLUE];      mV[VALPHA] = a;      return (*this);  } @@ -228,110 +227,110 @@ void LLColor4::setValue(const LLSD& sd)      F32 val;      bool out_of_range = false;      val = sd[0].asReal(); -    mV[0] = llclamp(val, 0.f, 1.f); -    out_of_range = mV[0] != val; +    mV[VRED] = llclamp(val, 0.f, 1.f); +    out_of_range = mV[VRED] != val;      val = sd[1].asReal(); -    mV[1] = llclamp(val, 0.f, 1.f); -    out_of_range |= mV[1] != val; +    mV[VGREEN] = llclamp(val, 0.f, 1.f); +    out_of_range |= mV[VGREEN] != val;      val = sd[2].asReal(); -    mV[2] = llclamp(val, 0.f, 1.f); -    out_of_range |= mV[2] != val; +    mV[VBLUE] = llclamp(val, 0.f, 1.f); +    out_of_range |= mV[VBLUE] != val;      val = sd[3].asReal(); -    mV[3] = llclamp(val, 0.f, 1.f); -    out_of_range |= mV[3] != val; +    mV[VALPHA] = llclamp(val, 0.f, 1.f); +    out_of_range |= mV[VALPHA] != val;      if (out_of_range)      {          LL_WARNS() << "LLSD color value out of range!" << LL_ENDL;      }  #else -    mV[0] = (F32) sd[0].asReal(); -    mV[1] = (F32) sd[1].asReal(); -    mV[2] = (F32) sd[2].asReal(); -    mV[3] = (F32) sd[3].asReal(); +    mV[VRED]   = (F32)sd[VRED].asReal(); +    mV[VGREEN] = (F32)sd[VGREEN].asReal(); +    mV[VBLUE]  = (F32)sd[VBLUE].asReal(); +    mV[VALPHA] = (F32)sd[VALPHA].asReal();  #endif  } -const LLColor4& LLColor4::operator=(const LLColor3 &a) +const LLColor4& LLColor4::operator=(const LLColor3& a)  { -    mV[VRED] = a.mV[VRED]; +    mV[VRED]   = a.mV[VRED];      mV[VGREEN] = a.mV[VGREEN]; -    mV[VBLUE] = a.mV[VBLUE]; +    mV[VBLUE]  = a.mV[VBLUE]; -// converting from an rgb sets a=1 (opaque) +    // converting from an rgb sets a=1 (opaque)      mV[VALPHA] = 1.f;      return (*this);  } - -std::ostream& operator<<(std::ostream& s, const LLColor4 &a) +std::ostream& operator<<(std::ostream& s, const LLColor4& a)  {      s << "{ " << a.mV[VRED] << ", " << a.mV[VGREEN] << ", " << a.mV[VBLUE] << ", " << a.mV[VALPHA] << " }";      return s;  } -bool operator==(const LLColor4 &a, const LLColor3 &b) +bool operator==(const LLColor4& a, const LLColor3& b)  { -    return (  (a.mV[VRED] == b.mV[VRED]) -            &&(a.mV[VGREEN] == b.mV[VGREEN]) -            &&(a.mV[VBLUE] == b.mV[VBLUE])); +    return ((a.mV[VRED] == b.mV[VRED]) && (a.mV[VGREEN] == b.mV[VGREEN]) && (a.mV[VBLUE] == b.mV[VBLUE]));  } -bool operator!=(const LLColor4 &a, const LLColor3 &b) +bool operator!=(const LLColor4& a, const LLColor3& b)  { -    return (  (a.mV[VRED] != b.mV[VRED]) -            ||(a.mV[VGREEN] != b.mV[VGREEN]) -            ||(a.mV[VBLUE] != b.mV[VBLUE])); +    return ((a.mV[VRED] != b.mV[VRED]) || (a.mV[VGREEN] != b.mV[VGREEN]) || (a.mV[VBLUE] != b.mV[VBLUE]));  } -LLColor3    vec4to3(const LLColor4 &vec) +LLColor3 vec4to3(const LLColor4& vec)  { -    LLColor3    temp(vec.mV[VRED], vec.mV[VGREEN], vec.mV[VBLUE]); +    LLColor3 temp(vec.mV[VRED], vec.mV[VGREEN], vec.mV[VBLUE]);      return temp;  } -LLColor4    vec3to4(const LLColor3 &vec) +LLColor4 vec3to4(const LLColor3& vec)  { -    LLColor3    temp(vec.mV[VRED], vec.mV[VGREEN], vec.mV[VBLUE]); +    LLColor3 temp(vec.mV[VRED], vec.mV[VGREEN], vec.mV[VBLUE]);      return temp;  } -static F32 hueToRgb ( F32 val1In, F32 val2In, F32 valHUeIn ) +static F32 hueToRgb(F32 val1In, F32 val2In, F32 valHUeIn)  { -    if ( valHUeIn < 0.0f ) valHUeIn += 1.0f; -    if ( valHUeIn > 1.0f ) valHUeIn -= 1.0f; -    if ( ( 6.0f * valHUeIn ) < 1.0f ) return ( val1In + ( val2In - val1In ) * 6.0f * valHUeIn ); -    if ( ( 2.0f * valHUeIn ) < 1.0f ) return ( val2In ); -    if ( ( 3.0f * valHUeIn ) < 2.0f ) return ( val1In + ( val2In - val1In ) * ( ( 2.0f / 3.0f ) - valHUeIn ) * 6.0f ); -    return ( val1In ); +    if (valHUeIn < 0.0f) +        valHUeIn += 1.0f; +    if (valHUeIn > 1.0f) +        valHUeIn -= 1.0f; +    if ((6.0f * valHUeIn) < 1.0f) +        return (val1In + (val2In - val1In) * 6.0f * valHUeIn); +    if ((2.0f * valHUeIn) < 1.0f) +        return (val2In); +    if ((3.0f * valHUeIn) < 2.0f) +        return (val1In + (val2In - val1In) * ((2.0f / 3.0f) - valHUeIn) * 6.0f); +    return (val1In);  } -void LLColor4::setHSL ( F32 hValIn, F32 sValIn, F32 lValIn) +void LLColor4::setHSL(F32 hValIn, F32 sValIn, F32 lValIn)  { -    if ( sValIn < 0.00001f ) +    if (sValIn < 0.00001f)      { -        mV[VRED] = lValIn; +        mV[VRED]   = lValIn;          mV[VGREEN] = lValIn; -        mV[VBLUE] = lValIn; +        mV[VBLUE]  = lValIn;      }      else      {          F32 interVal1;          F32 interVal2; -        if ( lValIn < 0.5f ) -            interVal2 = lValIn * ( 1.0f + sValIn ); +        if (lValIn < 0.5f) +            interVal2 = lValIn * (1.0f + sValIn);          else -            interVal2 = ( lValIn + sValIn ) - ( sValIn * lValIn ); +            interVal2 = (lValIn + sValIn) - (sValIn * lValIn);          interVal1 = 2.0f * lValIn - interVal2; -        mV[VRED] = hueToRgb ( interVal1, interVal2, hValIn + ( 1.f / 3.f ) ); -        mV[VGREEN] = hueToRgb ( interVal1, interVal2, hValIn ); -        mV[VBLUE] = hueToRgb ( interVal1, interVal2, hValIn - ( 1.f / 3.f ) ); +        mV[VRED]   = hueToRgb(interVal1, interVal2, hValIn + (1.f / 3.f)); +        mV[VGREEN] = hueToRgb(interVal1, interVal2, hValIn); +        mV[VBLUE]  = hueToRgb(interVal1, interVal2, hValIn - (1.f / 3.f));      }  } @@ -341,58 +340,61 @@ void LLColor4::calcHSL(F32* hue, F32* saturation, F32* luminance) const      F32 var_G = mV[VGREEN];      F32 var_B = mV[VBLUE]; -    F32 var_Min = ( var_R < ( var_G < var_B ? var_G : var_B ) ? var_R : ( var_G < var_B ? var_G : var_B ) ); -    F32 var_Max = ( var_R > ( var_G > var_B ? var_G : var_B ) ? var_R : ( var_G > var_B ? var_G : var_B ) ); +    F32 var_Min = (var_R < (var_G < var_B ? var_G : var_B) ? var_R : (var_G < var_B ? var_G : var_B)); +    F32 var_Max = (var_R > (var_G > var_B ? var_G : var_B) ? var_R : (var_G > var_B ? var_G : var_B));      F32 del_Max = var_Max - var_Min; -    F32 L = ( var_Max + var_Min ) / 2.0f; +    F32 L = (var_Max + var_Min) / 2.0f;      F32 H = 0.0f;      F32 S = 0.0f; -    if ( del_Max == 0.0f ) +    if (del_Max == 0.0f)      { -       H = 0.0f; -       S = 0.0f; +        H = 0.0f; +        S = 0.0f;      }      else      { -        if ( L < 0.5 ) -            S = del_Max / ( var_Max + var_Min ); +        if (L < 0.5f) +            S = del_Max / (var_Max + var_Min);          else -            S = del_Max / ( 2.0f - var_Max - var_Min ); +            S = del_Max / (2.0f - var_Max - var_Min); -        F32 del_R = ( ( ( var_Max - var_R ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; -        F32 del_G = ( ( ( var_Max - var_G ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; -        F32 del_B = ( ( ( var_Max - var_B ) / 6.0f ) + ( del_Max / 2.0f ) ) / del_Max; +        F32 del_R = (((var_Max - var_R) / 6.0f) + (del_Max / 2.0f)) / del_Max; +        F32 del_G = (((var_Max - var_G) / 6.0f) + (del_Max / 2.0f)) / del_Max; +        F32 del_B = (((var_Max - var_B) / 6.0f) + (del_Max / 2.0f)) / del_Max; -        if ( var_R >= var_Max ) +        if (var_R >= var_Max)              H = del_B - del_G; -        else -        if ( var_G >= var_Max ) -            H = ( 1.0f / 3.0f ) + del_R - del_B; -        else -        if ( var_B >= var_Max ) -            H = ( 2.0f / 3.0f ) + del_G - del_R; - -        if ( H < 0.0f ) H += 1.0f; -        if ( H > 1.0f ) H -= 1.0f; +        else if (var_G >= var_Max) +            H = (1.0f / 3.0f) + del_R - del_B; +        else if (var_B >= var_Max) +            H = (2.0f / 3.0f) + del_G - del_R; + +        if (H < 0.0f) +            H += 1.0f; +        if (H > 1.0f) +            H -= 1.0f;      } -    if (hue) *hue = H; -    if (saturation) *saturation = S; -    if (luminance) *luminance = L; +    if (hue) +        *hue = H; +    if (saturation) +        *saturation = S; +    if (luminance) +        *luminance = L;  }  // static  bool LLColor4::parseColor(const std::string& buf, LLColor4* color)  { -    if( buf.empty() || color == nullptr) +    if (buf.empty() || color == nullptr)      {          return false;      } -    boost_tokenizer tokens(buf, boost::char_separator<char>(", ")); +    boost_tokenizer           tokens(buf, boost::char_separator<char>(", "));      boost_tokenizer::iterator token_iter = tokens.begin();      if (token_iter == tokens.end())      { @@ -401,16 +403,16 @@ bool LLColor4::parseColor(const std::string& buf, LLColor4* color)      // Grab the first token into a string, since we don't know      // if this is a float or a color name. -    std::string color_name( (*token_iter) ); +    std::string color_name((*token_iter));      ++token_iter;      if (token_iter != tokens.end())      {          // There are more tokens to read.  This must be a vector.          LLColor4 v; -        LLStringUtil::convertToF32( color_name,  v.mV[VRED] ); -        LLStringUtil::convertToF32( *token_iter, v.mV[VGREEN] ); -        v.mV[VBLUE] = 0.0f; +        LLStringUtil::convertToF32(color_name, v.mV[VRED]); +        LLStringUtil::convertToF32(*token_iter, v.mV[VGREEN]); +        v.mV[VBLUE]  = 0.0f;          v.mV[VALPHA] = 1.0f;          ++token_iter; @@ -422,283 +424,284 @@ bool LLColor4::parseColor(const std::string& buf, LLColor4* color)          else          {              // There is a z-component. -            LLStringUtil::convertToF32( *token_iter, v.mV[VBLUE] ); +            LLStringUtil::convertToF32(*token_iter, v.mV[VBLUE]);              ++token_iter;              if (token_iter != tokens.end())              {                  // There is an alpha component. -                LLStringUtil::convertToF32( *token_iter, v.mV[VALPHA] ); +                LLStringUtil::convertToF32(*token_iter, v.mV[VALPHA]);              }          }          //  Make sure all values are between 0 and 1.          if (v.mV[VRED] > 1.f || v.mV[VGREEN] > 1.f || v.mV[VBLUE] > 1.f || v.mV[VALPHA] > 1.f)          { -            v = v * (1.f / 255.f); +            constexpr F32 SCALE{ 1.f / 255.f }; +            v *= SCALE;          } -        color->set( v ); +        color->set(v);      }      else // Single value.  Read as a named color.      {          // We have a color name -        if ( "red" == color_name ) +        if ("red" == color_name)          {              color->set(LLColor4::red);          } -        else if ( "red1" == color_name ) +        else if ("red1" == color_name)          {              color->set(LLColor4::red1);          } -        else if ( "red2" == color_name ) +        else if ("red2" == color_name)          {              color->set(LLColor4::red2);          } -        else if ( "red3" == color_name ) +        else if ("red3" == color_name)          {              color->set(LLColor4::red3);          } -        else if ( "red4" == color_name ) +        else if ("red4" == color_name)          {              color->set(LLColor4::red4);          } -        else if ( "red5" == color_name ) +        else if ("red5" == color_name)          {              color->set(LLColor4::red5);          } -        else if( "green" == color_name ) +        else if ("green" == color_name)          {              color->set(LLColor4::green);          } -        else if( "green1" == color_name ) +        else if ("green1" == color_name)          {              color->set(LLColor4::green1);          } -        else if( "green2" == color_name ) +        else if ("green2" == color_name)          {              color->set(LLColor4::green2);          } -        else if( "green3" == color_name ) +        else if ("green3" == color_name)          {              color->set(LLColor4::green3);          } -        else if( "green4" == color_name ) +        else if ("green4" == color_name)          {              color->set(LLColor4::green4);          } -        else if( "green5" == color_name ) +        else if ("green5" == color_name)          {              color->set(LLColor4::green5);          } -        else if( "green6" == color_name ) +        else if ("green6" == color_name)          {              color->set(LLColor4::green6);          } -        else if( "blue" == color_name ) +        else if ("blue" == color_name)          {              color->set(LLColor4::blue);          } -        else if( "blue1" == color_name ) +        else if ("blue1" == color_name)          {              color->set(LLColor4::blue1);          } -        else if( "blue2" == color_name ) +        else if ("blue2" == color_name)          {              color->set(LLColor4::blue2);          } -        else if( "blue3" == color_name ) +        else if ("blue3" == color_name)          {              color->set(LLColor4::blue3);          } -        else if( "blue4" == color_name ) +        else if ("blue4" == color_name)          {              color->set(LLColor4::blue4);          } -        else if( "blue5" == color_name ) +        else if ("blue5" == color_name)          {              color->set(LLColor4::blue5);          } -        else if( "blue6" == color_name ) +        else if ("blue6" == color_name)          {              color->set(LLColor4::blue6);          } -        else if( "black" == color_name ) +        else if ("black" == color_name)          {              color->set(LLColor4::black);          } -        else if( "white" == color_name ) +        else if ("white" == color_name)          {              color->set(LLColor4::white);          } -        else if( "yellow" == color_name ) +        else if ("yellow" == color_name)          {              color->set(LLColor4::yellow);          } -        else if( "yellow1" == color_name ) +        else if ("yellow1" == color_name)          {              color->set(LLColor4::yellow1);          } -        else if( "yellow2" == color_name ) +        else if ("yellow2" == color_name)          {              color->set(LLColor4::yellow2);          } -        else if( "yellow3" == color_name ) +        else if ("yellow3" == color_name)          {              color->set(LLColor4::yellow3);          } -        else if( "yellow4" == color_name ) +        else if ("yellow4" == color_name)          {              color->set(LLColor4::yellow4);          } -        else if( "yellow5" == color_name ) +        else if ("yellow5" == color_name)          {              color->set(LLColor4::yellow5);          } -        else if( "yellow6" == color_name ) +        else if ("yellow6" == color_name)          {              color->set(LLColor4::yellow6);          } -        else if( "magenta" == color_name ) +        else if ("magenta" == color_name)          {              color->set(LLColor4::magenta);          } -        else if( "magenta1" == color_name ) +        else if ("magenta1" == color_name)          {              color->set(LLColor4::magenta1);          } -        else if( "magenta2" == color_name ) +        else if ("magenta2" == color_name)          {              color->set(LLColor4::magenta2);          } -        else if( "magenta3" == color_name ) +        else if ("magenta3" == color_name)          {              color->set(LLColor4::magenta3);          } -        else if( "magenta4" == color_name ) +        else if ("magenta4" == color_name)          {              color->set(LLColor4::magenta4);          } -        else if( "purple" == color_name ) +        else if ("purple" == color_name)          {              color->set(LLColor4::purple);          } -        else if( "purple1" == color_name ) +        else if ("purple1" == color_name)          {              color->set(LLColor4::purple1);          } -        else if( "purple2" == color_name ) +        else if ("purple2" == color_name)          {              color->set(LLColor4::purple2);          } -        else if( "purple3" == color_name ) +        else if ("purple3" == color_name)          {              color->set(LLColor4::purple3);          } -        else if( "purple4" == color_name ) +        else if ("purple4" == color_name)          {              color->set(LLColor4::purple4);          } -        else if( "purple5" == color_name ) +        else if ("purple5" == color_name)          {              color->set(LLColor4::purple5);          } -        else if( "purple6" == color_name ) +        else if ("purple6" == color_name)          {              color->set(LLColor4::purple6);          } -        else if( "pink" == color_name ) +        else if ("pink" == color_name)          {              color->set(LLColor4::pink);          } -        else if( "pink1" == color_name ) +        else if ("pink1" == color_name)          {              color->set(LLColor4::pink1);          } -        else if( "pink2" == color_name ) +        else if ("pink2" == color_name)          {              color->set(LLColor4::pink2);          } -        else if( "cyan" == color_name ) +        else if ("cyan" == color_name)          {              color->set(LLColor4::cyan);          } -        else if( "cyan1" == color_name ) +        else if ("cyan1" == color_name)          {              color->set(LLColor4::cyan1);          } -        else if( "cyan2" == color_name ) +        else if ("cyan2" == color_name)          {              color->set(LLColor4::cyan2);          } -        else if( "cyan3" == color_name ) +        else if ("cyan3" == color_name)          {              color->set(LLColor4::cyan3);          } -        else if( "cyan4" == color_name ) +        else if ("cyan4" == color_name)          {              color->set(LLColor4::cyan4);          } -        else if( "cyan5" == color_name ) +        else if ("cyan5" == color_name)          {              color->set(LLColor4::cyan5);          } -        else if( "cyan6" == color_name ) +        else if ("cyan6" == color_name)          {              color->set(LLColor4::cyan6);          } -        else if( "smoke" == color_name ) +        else if ("smoke" == color_name)          {              color->set(LLColor4::smoke);          } -        else if( "grey" == color_name ) +        else if ("grey" == color_name)          {              color->set(LLColor4::grey);          } -        else if( "grey1" == color_name ) +        else if ("grey1" == color_name)          {              color->set(LLColor4::grey1);          } -        else if( "grey2" == color_name ) +        else if ("grey2" == color_name)          {              color->set(LLColor4::grey2);          } -        else if( "grey3" == color_name ) +        else if ("grey3" == color_name)          {              color->set(LLColor4::grey3);          } -        else if( "grey4" == color_name ) +        else if ("grey4" == color_name)          {              color->set(LLColor4::grey4);          } -        else if( "orange" == color_name ) +        else if ("orange" == color_name)          {              color->set(LLColor4::orange);          } -        else if( "orange1" == color_name ) +        else if ("orange1" == color_name)          {              color->set(LLColor4::orange1);          } -        else if( "orange2" == color_name ) +        else if ("orange2" == color_name)          {              color->set(LLColor4::orange2);          } -        else if( "orange3" == color_name ) +        else if ("orange3" == color_name)          {              color->set(LLColor4::orange3);          } -        else if( "orange4" == color_name ) +        else if ("orange4" == color_name)          {              color->set(LLColor4::orange4);          } -        else if( "orange5" == color_name ) +        else if ("orange5" == color_name)          {              color->set(LLColor4::orange5);          } -        else if( "orange6" == color_name ) +        else if ("orange6" == color_name)          {              color->set(LLColor4::orange6);          } -        else if ( "clear" == color_name ) +        else if ("clear" == color_name)          {              color->set(0.f, 0.f, 0.f, 0.f);          } @@ -714,21 +717,21 @@ bool LLColor4::parseColor(const std::string& buf, LLColor4* color)  // static  bool LLColor4::parseColor4(const std::string& buf, LLColor4* value)  { -    if( buf.empty() || value == nullptr) +    if (buf.empty() || value == nullptr)      {          return false;      }      LLColor4 v; -    S32 count = sscanf( buf.c_str(), "%f, %f, %f, %f", v.mV + 0, v.mV + 1, v.mV + 2, v.mV + 3 ); -    if (1 == count ) +    S32      count = sscanf(buf.c_str(), "%f, %f, %f, %f", v.mV + 0, v.mV + 1, v.mV + 2, v.mV + 3); +    if (1 == count)      {          // try this format -        count = sscanf( buf.c_str(), "%f %f %f %f", v.mV + 0, v.mV + 1, v.mV + 2, v.mV + 3 ); +        count = sscanf(buf.c_str(), "%f %f %f %f", v.mV + 0, v.mV + 1, v.mV + 2, v.mV + 3);      } -    if( 4 == count ) +    if (4 == count)      { -        value->setVec( v ); +        value->setVec(v);          return true;      } diff --git a/indra/llmath/v4color.h b/indra/llmath/v4color.h index cafdbd9d7c..2f1cb21113 100644 --- a/indra/llmath/v4color.h +++ b/indra/llmath/v4color.h @@ -28,7 +28,6 @@  #define LL_V4COLOR_H  #include "llerror.h" -//#include "vmath.h"  #include "llmath.h"  #include "llsd.h" @@ -38,213 +37,212 @@ class LLVector4;  //  LLColor4 = |x y z w| -static const U32 LENGTHOFCOLOR4 = 4; +static constexpr U32 LENGTHOFCOLOR4 = 4; -static const U32 MAX_LENGTH_OF_COLOR_NAME = 15; //Give plenty of room for additional colors... +static constexpr U32 MAX_LENGTH_OF_COLOR_NAME = 15; // Give plenty of room for additional colors...  class LLColor4  { -    public: -        F32 mV[LENGTHOFCOLOR4]; -        LLColor4();                     // Initializes LLColor4 to (0, 0, 0, 1) -        LLColor4(F32 r, F32 g, F32 b);      // Initializes LLColor4 to (r, g, b, 1) -        LLColor4(F32 r, F32 g, F32 b, F32 a);       // Initializes LLColor4 to (r. g, b, a) -        LLColor4(const LLColor3 &vec, F32 a = 1.f); // Initializes LLColor4 to (vec, a) -        explicit LLColor4(const LLSD& sd); -        explicit LLColor4(const F32 *vec);          // Initializes LLColor4 to (vec[0]. vec[1], vec[2], 1) -        explicit LLColor4(U32 clr);                         // Initializes LLColor4 to (r=clr>>24, etc)) -        explicit LLColor4(const LLColor4U& color4u);  // "explicit" to avoid automatic conversion -        explicit LLColor4(const LLVector4& vector4);  // "explicit" to avoid automatic conversion - -        LLSD getValue() const -        { -            LLSD ret; -            ret[0] = mV[0]; -            ret[1] = mV[1]; -            ret[2] = mV[2]; -            ret[3] = mV[3]; -            return ret; -        } - -        void setValue(const LLSD& sd); - -        void setHSL(F32 hue, F32 saturation, F32 luminance); -        void calcHSL(F32* hue, F32* saturation, F32* luminance) const; - -        const LLColor4& setToBlack();                       // zero LLColor4 to (0, 0, 0, 1) -        const LLColor4& setToWhite();                       // zero LLColor4 to (0, 0, 0, 1) - -        const LLColor4& setVec(F32 r, F32 g, F32 b, F32 a); // deprecated -- use set() -        const LLColor4& setVec(F32 r, F32 g, F32 b);        // deprecated -- use set() -        const LLColor4& setVec(const LLColor4 &vec);        // deprecated -- use set() -        const LLColor4& setVec(const LLColor3 &vec);        // deprecated -- use set() -        const LLColor4& setVec(const LLColor3 &vec, F32 a); // deprecated -- use set() -        const LLColor4& setVec(const F32 *vec);             // deprecated -- use set() -        const LLColor4& setVec(const LLColor4U& color4u);   // deprecated -- use set() - -        const LLColor4& set(F32 r, F32 g, F32 b, F32 a);    // Sets LLColor4 to (r, g, b, a) -        const LLColor4& set(F32 r, F32 g, F32 b);   // Sets LLColor4 to (r, g, b) (no change in a) -        const LLColor4& set(const LLColor4 &vec);   // Sets LLColor4 to vec -        const LLColor4& set(const LLColor3 &vec);   // Sets LLColor4 to LLColor3 vec (no change in alpha) -        const LLColor4& set(const LLColor3 &vec, F32 a);    // Sets LLColor4 to LLColor3 vec, with alpha specified -        const LLColor4& set(const F32 *vec);            // Sets LLColor4 to vec -        const LLColor4& set(const F64 *vec);            // Sets LLColor4 to (double)vec -        const LLColor4& set(const LLColor4U& color4u); // Sets LLColor4 to color4u, rescaled. - -        // set from a vector of unknown type and size -        // may leave some data unmodified -        template<typename T> -        const LLColor4& set(const std::vector<T>& v); - -        // write to a vector of unknown type and size -        // maye leave some data unmodified -        template<typename T> -        void write(std::vector<T>& v) const; - -        const LLColor4&    setAlpha(F32 a); - -        F32         magVec() const;             // deprecated -- use length() -        F32         magVecSquared() const;      // deprecated -- use lengthSquared() -        F32         normVec();                  // deprecated -- use normalize() - -        F32         length() const;             // Returns magnitude of LLColor4 -        F32         lengthSquared() const;      // Returns magnitude squared of LLColor4 -        F32         normalize();                // deprecated -- use normalize() - -        bool        isOpaque() { return mV[VALPHA] == 1.f; } - -        F32 operator[](int idx) const { return mV[idx]; } -        F32 &operator[](int idx) { return mV[idx]; } - -        const LLColor4& operator=(const LLColor3 &a);   // Assigns vec3 to vec4 and returns vec4 - -        bool operator<(const LLColor4& rhs) const; -        friend std::ostream&     operator<<(std::ostream& s, const LLColor4 &a);        // Print a -        friend LLColor4 operator+(const LLColor4 &a, const LLColor4 &b);    // Return vector a + b -        friend LLColor4 operator-(const LLColor4 &a, const LLColor4 &b);    // Return vector a minus b -        friend LLColor4 operator*(const LLColor4 &a, const LLColor4 &b);    // Return component wise a * b -        friend LLColor4 operator*(const LLColor4 &a, F32 k);                // Return rgb times scaler k (no alpha change) -        friend LLColor4 operator/(const LLColor4 &a, F32 k);                // Return rgb divided by scalar k (no alpha change) -        friend LLColor4 operator*(F32 k, const LLColor4 &a);                // Return rgb times scaler k (no alpha change) -        friend LLColor4 operator%(const LLColor4 &a, F32 k);                // Return alpha times scaler k (no rgb change) -        friend LLColor4 operator%(F32 k, const LLColor4 &a);                // Return alpha times scaler k (no rgb change) - -        friend bool operator==(const LLColor4 &a, const LLColor4 &b);       // Return a == b -        friend bool operator!=(const LLColor4 &a, const LLColor4 &b);       // Return a != b - -        friend bool operator==(const LLColor4 &a, const LLColor3 &b);       // Return a == b -        friend bool operator!=(const LLColor4 &a, const LLColor3 &b);       // Return a != b - -        friend const LLColor4& operator+=(LLColor4 &a, const LLColor4 &b);  // Return vector a + b -        friend const LLColor4& operator-=(LLColor4 &a, const LLColor4 &b);  // Return vector a minus b -        friend const LLColor4& operator*=(LLColor4 &a, F32 k);              // Return rgb times scaler k (no alpha change) -        friend const LLColor4& operator%=(LLColor4 &a, F32 k);              // Return alpha times scaler k (no rgb change) - -        friend const LLColor4& operator*=(LLColor4 &a, const LLColor4 &b); // Doesn't multiply alpha! (for lighting) - -        // conversion -        operator LLColor4U() const; - -        // Basic color values. -        static LLColor4 red; -        static LLColor4 green; -        static LLColor4 blue; -        static LLColor4 black; -        static LLColor4 white; -        static LLColor4 yellow; -        static LLColor4 magenta; -        static LLColor4 cyan; -        static LLColor4 smoke; -        static LLColor4 grey; -        static LLColor4 orange; -        static LLColor4 purple; -        static LLColor4 pink; -        static LLColor4 transparent; - -        // Extra color values. -        static LLColor4 grey1; -        static LLColor4 grey2; -        static LLColor4 grey3; -        static LLColor4 grey4; - -        static LLColor4 red1; -        static LLColor4 red2; -        static LLColor4 red3; -        static LLColor4 red4; -        static LLColor4 red5; - -        static LLColor4 green1; -        static LLColor4 green2; -        static LLColor4 green3; -        static LLColor4 green4; -        static LLColor4 green5; -        static LLColor4 green6; - -        static LLColor4 blue1; -        static LLColor4 blue2; -        static LLColor4 blue3; -        static LLColor4 blue4; -        static LLColor4 blue5; -        static LLColor4 blue6; - -        static LLColor4 yellow1; -        static LLColor4 yellow2; -        static LLColor4 yellow3; -        static LLColor4 yellow4; -        static LLColor4 yellow5; -        static LLColor4 yellow6; -        static LLColor4 yellow7; -        static LLColor4 yellow8; -        static LLColor4 yellow9; - -        static LLColor4 orange1; -        static LLColor4 orange2; -        static LLColor4 orange3; -        static LLColor4 orange4; -        static LLColor4 orange5; -        static LLColor4 orange6; - -        static LLColor4 magenta1; -        static LLColor4 magenta2; -        static LLColor4 magenta3; -        static LLColor4 magenta4; - -        static LLColor4 purple1; -        static LLColor4 purple2; -        static LLColor4 purple3; -        static LLColor4 purple4; -        static LLColor4 purple5; -        static LLColor4 purple6; - -        static LLColor4 pink1; -        static LLColor4 pink2; - -        static LLColor4 cyan1; -        static LLColor4 cyan2; -        static LLColor4 cyan3; -        static LLColor4 cyan4; -        static LLColor4 cyan5; -        static LLColor4 cyan6; - -        static bool parseColor(const std::string& buf, LLColor4* color); -        static bool parseColor4(const std::string& buf, LLColor4* color); - -        inline void clamp(); -}; +public: +    F32 mV[LENGTHOFCOLOR4]; +    LLColor4();                                 // Initializes LLColor4 to (0, 0, 0, 1) +    LLColor4(F32 r, F32 g, F32 b);              // Initializes LLColor4 to (r, g, b, 1) +    LLColor4(F32 r, F32 g, F32 b, F32 a);       // Initializes LLColor4 to (r. g, b, a) +    LLColor4(const LLColor3& vec, F32 a = 1.f); // Initializes LLColor4 to (vec, a) +    explicit LLColor4(const LLSD& sd); +    explicit LLColor4(const F32* vec);           // Initializes LLColor4 to (vec[0]. vec[1], vec[2], 1) +    explicit LLColor4(U32 clr);                  // Initializes LLColor4 to (r=clr>>24, etc)) +    explicit LLColor4(const LLColor4U& color4u); // "explicit" to avoid automatic conversion +    explicit LLColor4(const LLVector4& vector4); // "explicit" to avoid automatic conversion + +    LLSD getValue() const +    { +        LLSD ret; +        ret[VRED]   = mV[VRED]; +        ret[VGREEN] = mV[VGREEN]; +        ret[VBLUE]  = mV[VBLUE]; +        ret[VALPHA] = mV[VALPHA]; +        return ret; +    } +    void setValue(const LLSD& sd); + +    void setHSL(F32 hue, F32 saturation, F32 luminance); +    void calcHSL(F32* hue, F32* saturation, F32* luminance) const; + +    const LLColor4& setToBlack(); // zero LLColor4 to (0, 0, 0, 1) +    const LLColor4& setToWhite(); // zero LLColor4 to (0, 0, 0, 1) + +    const LLColor4& setVec(F32 r, F32 g, F32 b, F32 a); // deprecated -- use set() +    const LLColor4& setVec(F32 r, F32 g, F32 b);        // deprecated -- use set() +    const LLColor4& setVec(const LLColor4& vec);        // deprecated -- use set() +    const LLColor4& setVec(const LLColor3& vec);        // deprecated -- use set() +    const LLColor4& setVec(const LLColor3& vec, F32 a); // deprecated -- use set() +    const LLColor4& setVec(const F32* vec);             // deprecated -- use set() +    const LLColor4& setVec(const LLColor4U& color4u);   // deprecated -- use set() + +    const LLColor4& set(F32 r, F32 g, F32 b, F32 a); // Sets LLColor4 to (r, g, b, a) +    const LLColor4& set(F32 r, F32 g, F32 b);        // Sets LLColor4 to (r, g, b) (no change in a) +    const LLColor4& set(const LLColor4& vec);        // Sets LLColor4 to vec +    const LLColor4& set(const LLColor3& vec);        // Sets LLColor4 to LLColor3 vec (no change in alpha) +    const LLColor4& set(const LLColor3& vec, F32 a); // Sets LLColor4 to LLColor3 vec, with alpha specified +    const LLColor4& set(const F32* vec);             // Sets LLColor4 to vec +    const LLColor4& set(const F64* vec);             // Sets LLColor4 to (double)vec +    const LLColor4& set(const LLColor4U& color4u);   // Sets LLColor4 to color4u, rescaled. + +    // set from a vector of unknown type and size +    // may leave some data unmodified +    template<typename T> +    const LLColor4& set(const std::vector<T>& v); + +    // write to a vector of unknown type and size +    // maye leave some data unmodified +    template<typename T> +    void write(std::vector<T>& v) const; + +    const LLColor4& setAlpha(F32 a); + +    F32 magVec() const;        // deprecated -- use length() +    F32 magVecSquared() const; // deprecated -- use lengthSquared() +    F32 normVec();             // deprecated -- use normalize() + +    F32 length() const;        // Returns magnitude of LLColor4 +    F32 lengthSquared() const; // Returns magnitude squared of LLColor4 +    F32 normalize();           // deprecated -- use normalize() + +    bool isOpaque() const { return mV[VALPHA] == 1.f; } + +    F32  operator[](int idx) const { return mV[idx]; } +    F32& operator[](int idx) { return mV[idx]; } + +    const LLColor4& operator=(const LLColor3& a); // Assigns vec3 to vec4 and returns vec4 + +    bool                 operator<(const LLColor4& rhs) const; +    friend std::ostream& operator<<(std::ostream& s, const LLColor4& a);  // Print a +    friend LLColor4      operator+(const LLColor4& a, const LLColor4& b); // Return vector a + b +    friend LLColor4      operator-(const LLColor4& a, const LLColor4& b); // Return vector a minus b +    friend LLColor4      operator*(const LLColor4& a, const LLColor4& b); // Return component wise a * b +    friend LLColor4      operator*(const LLColor4& a, F32 k);             // Return rgb times scaler k (no alpha change) +    friend LLColor4      operator/(const LLColor4& a, F32 k);             // Return rgb divided by scalar k (no alpha change) +    friend LLColor4      operator*(F32 k, const LLColor4& a);             // Return rgb times scaler k (no alpha change) +    friend LLColor4      operator%(const LLColor4& a, F32 k);             // Return alpha times scaler k (no rgb change) +    friend LLColor4      operator%(F32 k, const LLColor4& a);             // Return alpha times scaler k (no rgb change) + +    friend bool operator==(const LLColor4& a, const LLColor4& b); // Return a == b +    friend bool operator!=(const LLColor4& a, const LLColor4& b); // Return a != b + +    friend bool operator==(const LLColor4& a, const LLColor3& b); // Return a == b +    friend bool operator!=(const LLColor4& a, const LLColor3& b); // Return a != b + +    friend const LLColor4& operator+=(LLColor4& a, const LLColor4& b); // Return vector a + b +    friend const LLColor4& operator-=(LLColor4& a, const LLColor4& b); // Return vector a minus b +    friend const LLColor4& operator*=(LLColor4& a, F32 k);             // Return rgb times scaler k (no alpha change) +    friend const LLColor4& operator%=(LLColor4& a, F32 k);             // Return alpha times scaler k (no rgb change) + +    friend const LLColor4& operator*=(LLColor4& a, const LLColor4& b); // Doesn't multiply alpha! (for lighting) + +    // conversion +    operator LLColor4U() const; + +    // Basic color values. +    static LLColor4 red; +    static LLColor4 green; +    static LLColor4 blue; +    static LLColor4 black; +    static LLColor4 white; +    static LLColor4 yellow; +    static LLColor4 magenta; +    static LLColor4 cyan; +    static LLColor4 smoke; +    static LLColor4 grey; +    static LLColor4 orange; +    static LLColor4 purple; +    static LLColor4 pink; +    static LLColor4 transparent; + +    // Extra color values. +    static LLColor4 grey1; +    static LLColor4 grey2; +    static LLColor4 grey3; +    static LLColor4 grey4; + +    static LLColor4 red1; +    static LLColor4 red2; +    static LLColor4 red3; +    static LLColor4 red4; +    static LLColor4 red5; + +    static LLColor4 green1; +    static LLColor4 green2; +    static LLColor4 green3; +    static LLColor4 green4; +    static LLColor4 green5; +    static LLColor4 green6; + +    static LLColor4 blue1; +    static LLColor4 blue2; +    static LLColor4 blue3; +    static LLColor4 blue4; +    static LLColor4 blue5; +    static LLColor4 blue6; + +    static LLColor4 yellow1; +    static LLColor4 yellow2; +    static LLColor4 yellow3; +    static LLColor4 yellow4; +    static LLColor4 yellow5; +    static LLColor4 yellow6; +    static LLColor4 yellow7; +    static LLColor4 yellow8; +    static LLColor4 yellow9; + +    static LLColor4 orange1; +    static LLColor4 orange2; +    static LLColor4 orange3; +    static LLColor4 orange4; +    static LLColor4 orange5; +    static LLColor4 orange6; + +    static LLColor4 magenta1; +    static LLColor4 magenta2; +    static LLColor4 magenta3; +    static LLColor4 magenta4; + +    static LLColor4 purple1; +    static LLColor4 purple2; +    static LLColor4 purple3; +    static LLColor4 purple4; +    static LLColor4 purple5; +    static LLColor4 purple6; + +    static LLColor4 pink1; +    static LLColor4 pink2; + +    static LLColor4 cyan1; +    static LLColor4 cyan2; +    static LLColor4 cyan3; +    static LLColor4 cyan4; +    static LLColor4 cyan5; +    static LLColor4 cyan6; + +    static bool parseColor(const std::string& buf, LLColor4* color); +    static bool parseColor4(const std::string& buf, LLColor4* color); + +    inline void clamp(); +};  // Non-member functions -F32     distVec(const LLColor4 &a, const LLColor4 &b);          // Returns distance between a and b -F32     distVec_squared(const LLColor4 &a, const LLColor4 &b);  // Returns distance squared between a and b -LLColor3    vec4to3(const LLColor4 &vec); -LLColor4    vec3to4(const LLColor3 &vec); -LLColor4 lerp(const LLColor4 &a, const LLColor4 &b, F32 u); +F32      distVec(const LLColor4& a, const LLColor4& b);         // Returns distance between a and b +F32      distVec_squared(const LLColor4& a, const LLColor4& b); // Returns distance squared between a and b +LLColor3 vec4to3(const LLColor4& vec); +LLColor4 vec3to4(const LLColor3& vec); +LLColor4 lerp(const LLColor4& a, const LLColor4& b, F32 u); -inline LLColor4::LLColor4(void) +inline LLColor4::LLColor4()  { -    mV[VRED] = 0.f; +    mV[VRED]   = 0.f;      mV[VGREEN] = 0.f; -    mV[VBLUE] = 0.f; +    mV[VBLUE]  = 0.f;      mV[VALPHA] = 1.f;  } @@ -255,149 +253,146 @@ inline LLColor4::LLColor4(const LLSD& sd)  inline LLColor4::LLColor4(F32 r, F32 g, F32 b)  { -    mV[VRED] = r; +    mV[VRED]   = r;      mV[VGREEN] = g; -    mV[VBLUE] = b; +    mV[VBLUE]  = b;      mV[VALPHA] = 1.f;  }  inline LLColor4::LLColor4(F32 r, F32 g, F32 b, F32 a)  { -    mV[VRED] = r; +    mV[VRED]   = r;      mV[VGREEN] = g; -    mV[VBLUE] = b; +    mV[VBLUE]  = b;      mV[VALPHA] = a;  }  inline LLColor4::LLColor4(U32 clr)  { -    mV[VRED] = (clr&0xff) * (1.0f/255.0f); -    mV[VGREEN] = ((clr>>8)&0xff) * (1.0f/255.0f); -    mV[VBLUE] = ((clr>>16)&0xff) * (1.0f/255.0f); -    mV[VALPHA] = (clr>>24) * (1.0f/255.0f); +    mV[VRED]   = (clr & 0xff) * (1.0f / 255.0f); +    mV[VGREEN] = ((clr >> 8) & 0xff) * (1.0f / 255.0f); +    mV[VBLUE]  = ((clr >> 16) & 0xff) * (1.0f / 255.0f); +    mV[VALPHA] = (clr >> 24) * (1.0f / 255.0f);  } - -inline LLColor4::LLColor4(const F32 *vec) +inline LLColor4::LLColor4(const F32* vec)  { -    mV[VRED] = vec[VRED]; +    mV[VRED]   = vec[VRED];      mV[VGREEN] = vec[VGREEN]; -    mV[VBLUE] = vec[VBLUE]; +    mV[VBLUE]  = vec[VBLUE];      mV[VALPHA] = vec[VALPHA];  } -inline const LLColor4&  LLColor4::setToBlack(void) +inline const LLColor4& LLColor4::setToBlack(void)  { -    mV[VRED] = 0.f; +    mV[VRED]   = 0.f;      mV[VGREEN] = 0.f; -    mV[VBLUE] = 0.f; +    mV[VBLUE]  = 0.f;      mV[VALPHA] = 1.f;      return (*this);  } -inline const LLColor4&  LLColor4::setToWhite(void) +inline const LLColor4& LLColor4::setToWhite(void)  { -    mV[VRED] = 1.f; +    mV[VRED]   = 1.f;      mV[VGREEN] = 1.f; -    mV[VBLUE] = 1.f; +    mV[VBLUE]  = 1.f;      mV[VALPHA] = 1.f;      return (*this);  } -inline const LLColor4&  LLColor4::set(F32 x, F32 y, F32 z) +inline const LLColor4& LLColor4::set(F32 x, F32 y, F32 z)  { -    mV[VRED] = x; +    mV[VRED]   = x;      mV[VGREEN] = y; -    mV[VBLUE] = z; +    mV[VBLUE]  = z; -//  no change to alpha! -//  mV[VALPHA] = 1.f; +    //  no change to alpha! +    //  mV[VALPHA] = 1.f;      return (*this);  } -inline const LLColor4&  LLColor4::set(F32 x, F32 y, F32 z, F32 a) +inline const LLColor4& LLColor4::set(F32 x, F32 y, F32 z, F32 a)  { -    mV[VRED] = x; +    mV[VRED]   = x;      mV[VGREEN] = y; -    mV[VBLUE] = z; +    mV[VBLUE]  = z;      mV[VALPHA] = a;      return (*this);  } -inline const LLColor4&  LLColor4::set(const LLColor4 &vec) +inline const LLColor4& LLColor4::set(const LLColor4& vec)  { -    mV[VRED] = vec.mV[VRED]; +    mV[VRED]   = vec.mV[VRED];      mV[VGREEN] = vec.mV[VGREEN]; -    mV[VBLUE] = vec.mV[VBLUE]; +    mV[VBLUE]  = vec.mV[VBLUE];      mV[VALPHA] = vec.mV[VALPHA];      return (*this);  } - -inline const LLColor4&  LLColor4::set(const F32 *vec) +inline const LLColor4& LLColor4::set(const F32* vec)  { -    mV[VRED] = vec[VRED]; +    mV[VRED]   = vec[VRED];      mV[VGREEN] = vec[VGREEN]; -    mV[VBLUE] = vec[VBLUE]; +    mV[VBLUE]  = vec[VBLUE];      mV[VALPHA] = vec[VALPHA];      return (*this);  } -inline const LLColor4&  LLColor4::set(const F64 *vec) +inline const LLColor4& LLColor4::set(const F64* vec)  { -    mV[VRED] = static_cast<F32>(vec[VRED]); +    mV[VRED]   = static_cast<F32>(vec[VRED]);      mV[VGREEN] = static_cast<F32>(vec[VGREEN]); -    mV[VBLUE] = static_cast<F32>(vec[VBLUE]); +    mV[VBLUE]  = static_cast<F32>(vec[VBLUE]);      mV[VALPHA] = static_cast<F32>(vec[VALPHA]);      return (*this);  }  // deprecated -inline const LLColor4&  LLColor4::setVec(F32 x, F32 y, F32 z) +inline const LLColor4& LLColor4::setVec(F32 x, F32 y, F32 z)  { -    mV[VRED] = x; +    mV[VRED]   = x;      mV[VGREEN] = y; -    mV[VBLUE] = z; +    mV[VBLUE]  = z; -//  no change to alpha! -//  mV[VALPHA] = 1.f; +    //  no change to alpha! +    //  mV[VALPHA] = 1.f;      return (*this);  }  // deprecated -inline const LLColor4&  LLColor4::setVec(F32 x, F32 y, F32 z, F32 a) +inline const LLColor4& LLColor4::setVec(F32 x, F32 y, F32 z, F32 a)  { -    mV[VRED] = x; +    mV[VRED]   = x;      mV[VGREEN] = y; -    mV[VBLUE] = z; +    mV[VBLUE]  = z;      mV[VALPHA] = a;      return (*this);  }  // deprecated -inline const LLColor4&  LLColor4::setVec(const LLColor4 &vec) +inline const LLColor4& LLColor4::setVec(const LLColor4& vec)  { -    mV[VRED] = vec.mV[VRED]; +    mV[VRED]   = vec.mV[VRED];      mV[VGREEN] = vec.mV[VGREEN]; -    mV[VBLUE] = vec.mV[VBLUE]; +    mV[VBLUE]  = vec.mV[VBLUE];      mV[VALPHA] = vec.mV[VALPHA];      return (*this);  } -  // deprecated -inline const LLColor4&  LLColor4::setVec(const F32 *vec) +inline const LLColor4& LLColor4::setVec(const F32* vec)  { -    mV[VRED] = vec[VRED]; +    mV[VRED]   = vec[VRED];      mV[VGREEN] = vec[VGREEN]; -    mV[VBLUE] = vec[VBLUE]; +    mV[VBLUE]  = vec[VBLUE];      mV[VALPHA] = vec[VALPHA];      return (*this);  } -inline const LLColor4&  LLColor4::setAlpha(F32 a) +inline const LLColor4& LLColor4::setAlpha(F32 a)  {      mV[VALPHA] = a;      return (*this); @@ -405,155 +400,116 @@ inline const LLColor4&  LLColor4::setAlpha(F32 a)  // LLColor4 Magnitude and Normalization Functions -inline F32      LLColor4::length(void) const +inline F32 LLColor4::length() const  { -    return (F32) sqrt(mV[VRED]*mV[VRED] + mV[VGREEN]*mV[VGREEN] + mV[VBLUE]*mV[VBLUE]); +    return sqrt(mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE]);  } -inline F32      LLColor4::lengthSquared(void) const +inline F32 LLColor4::lengthSquared() const  { -    return mV[VRED]*mV[VRED] + mV[VGREEN]*mV[VGREEN] + mV[VBLUE]*mV[VBLUE]; +    return mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE];  } -inline F32      LLColor4::normalize(void) +inline F32 LLColor4::normalize()  { -    F32 mag = (F32) sqrt(mV[VRED]*mV[VRED] + mV[VGREEN]*mV[VGREEN] + mV[VBLUE]*mV[VBLUE]); +    F32 mag = sqrt(mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE]);      F32 oomag;      if (mag)      { -        oomag = 1.f/mag; +        oomag = 1.f / mag;          mV[VRED] *= oomag;          mV[VGREEN] *= oomag;          mV[VBLUE] *= oomag;      } -    return (mag); +    return mag;  }  // deprecated -inline F32      LLColor4::magVec(void) const +inline F32 LLColor4::magVec() const  { -    return (F32) sqrt(mV[VRED]*mV[VRED] + mV[VGREEN]*mV[VGREEN] + mV[VBLUE]*mV[VBLUE]); +    return sqrt(mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE]);  }  // deprecated -inline F32      LLColor4::magVecSquared(void) const +inline F32 LLColor4::magVecSquared() const  { -    return mV[VRED]*mV[VRED] + mV[VGREEN]*mV[VGREEN] + mV[VBLUE]*mV[VBLUE]; +    return mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE];  }  // deprecated -inline F32      LLColor4::normVec(void) +inline F32 LLColor4::normVec()  { -    F32 mag = (F32) sqrt(mV[VRED]*mV[VRED] + mV[VGREEN]*mV[VGREEN] + mV[VBLUE]*mV[VBLUE]); +    F32 mag = sqrt(mV[VRED] * mV[VRED] + mV[VGREEN] * mV[VGREEN] + mV[VBLUE] * mV[VBLUE]);      F32 oomag;      if (mag)      { -        oomag = 1.f/mag; +        oomag = 1.f / mag;          mV[VRED] *= oomag;          mV[VGREEN] *= oomag;          mV[VBLUE] *= oomag;      } -    return (mag); +    return mag;  }  // LLColor4 Operators - -inline LLColor4 operator+(const LLColor4 &a, const LLColor4 &b) +inline LLColor4 operator+(const LLColor4& a, const LLColor4& b)  { -    return LLColor4( -        a.mV[VRED] + b.mV[VRED], -        a.mV[VGREEN] + b.mV[VGREEN], -        a.mV[VBLUE] + b.mV[VBLUE], -        a.mV[VALPHA] + b.mV[VALPHA]); +    return LLColor4(a.mV[VRED] + b.mV[VRED], a.mV[VGREEN] + b.mV[VGREEN], a.mV[VBLUE] + b.mV[VBLUE], a.mV[VALPHA] + b.mV[VALPHA]);  } -inline LLColor4 operator-(const LLColor4 &a, const LLColor4 &b) +inline LLColor4 operator-(const LLColor4& a, const LLColor4& b)  { -    return LLColor4( -        a.mV[VRED] - b.mV[VRED], -        a.mV[VGREEN] - b.mV[VGREEN], -        a.mV[VBLUE] - b.mV[VBLUE], -        a.mV[VALPHA] - b.mV[VALPHA]); +    return LLColor4(a.mV[VRED] - b.mV[VRED], a.mV[VGREEN] - b.mV[VGREEN], a.mV[VBLUE] - b.mV[VBLUE], a.mV[VALPHA] - b.mV[VALPHA]);  } -inline LLColor4  operator*(const LLColor4 &a, const LLColor4 &b) +inline LLColor4 operator*(const LLColor4& a, const LLColor4& b)  { -    return LLColor4( -        a.mV[VRED] * b.mV[VRED], -        a.mV[VGREEN] * b.mV[VGREEN], -        a.mV[VBLUE] * b.mV[VBLUE], -        a.mV[VALPHA] * b.mV[VALPHA]); +    return LLColor4(a.mV[VRED] * b.mV[VRED], a.mV[VGREEN] * b.mV[VGREEN], a.mV[VBLUE] * b.mV[VBLUE], a.mV[VALPHA] * b.mV[VALPHA]);  } -inline LLColor4 operator*(const LLColor4 &a, F32 k) +inline LLColor4 operator*(const LLColor4& a, F32 k)  {      // only affects rgb (not a!) -    return LLColor4( -        a.mV[VRED] * k, -        a.mV[VGREEN] * k, -        a.mV[VBLUE] * k, -        a.mV[VALPHA]); +    return LLColor4(a.mV[VRED] * k, a.mV[VGREEN] * k, a.mV[VBLUE] * k, a.mV[VALPHA]);  } -inline LLColor4 operator/(const LLColor4 &a, F32 k) +inline LLColor4 operator/(const LLColor4& a, F32 k)  { -    return LLColor4( -        a.mV[VRED] / k, -        a.mV[VGREEN] / k, -        a.mV[VBLUE] / k, -        a.mV[VALPHA]); +    return LLColor4(a.mV[VRED] / k, a.mV[VGREEN] / k, a.mV[VBLUE] / k, a.mV[VALPHA]);  } -inline LLColor4 operator*(F32 k, const LLColor4 &a) +inline LLColor4 operator*(F32 k, const LLColor4& a)  {      // only affects rgb (not a!) -    return LLColor4( -        a.mV[VRED] * k, -        a.mV[VGREEN] * k, -        a.mV[VBLUE] * k, -        a.mV[VALPHA]); +    return LLColor4(a.mV[VRED] * k, a.mV[VGREEN] * k, a.mV[VBLUE] * k, a.mV[VALPHA]);  } -inline LLColor4 operator%(F32 k, const LLColor4 &a) +inline LLColor4 operator%(F32 k, const LLColor4& a)  {      // only affects alpha (not rgb!) -    return LLColor4( -        a.mV[VRED], -        a.mV[VGREEN], -        a.mV[VBLUE], -        a.mV[VALPHA] * k); +    return LLColor4(a.mV[VRED], a.mV[VGREEN], a.mV[VBLUE], a.mV[VALPHA] * k);  } -inline LLColor4 operator%(const LLColor4 &a, F32 k) +inline LLColor4 operator%(const LLColor4& a, F32 k)  {      // only affects alpha (not rgb!) -    return LLColor4( -        a.mV[VRED], -        a.mV[VGREEN], -        a.mV[VBLUE], -        a.mV[VALPHA] * k); +    return LLColor4(a.mV[VRED], a.mV[VGREEN], a.mV[VBLUE], a.mV[VALPHA] * k);  } -inline bool operator==(const LLColor4 &a, const LLColor4 &b) +inline bool operator==(const LLColor4& a, const LLColor4& b)  { -    return (  (a.mV[VRED] == b.mV[VRED]) -            &&(a.mV[VGREEN] == b.mV[VGREEN]) -            &&(a.mV[VBLUE] == b.mV[VBLUE]) -            &&(a.mV[VALPHA] == b.mV[VALPHA])); +    return ((a.mV[VRED] == b.mV[VRED]) && (a.mV[VGREEN] == b.mV[VGREEN]) && (a.mV[VBLUE] == b.mV[VBLUE]) && (a.mV[VALPHA] == b.mV[VALPHA]));  } -inline bool operator!=(const LLColor4 &a, const LLColor4 &b) +inline bool operator!=(const LLColor4& a, const LLColor4& b)  { -    return (  (a.mV[VRED] != b.mV[VRED]) -            ||(a.mV[VGREEN] != b.mV[VGREEN]) -            ||(a.mV[VBLUE] != b.mV[VBLUE]) -            ||(a.mV[VALPHA] != b.mV[VALPHA])); +    return ((a.mV[VRED] != b.mV[VRED]) || (a.mV[VGREEN] != b.mV[VGREEN]) || (a.mV[VBLUE] != b.mV[VBLUE]) || (a.mV[VALPHA] != b.mV[VALPHA]));  } -inline const LLColor4& operator+=(LLColor4 &a, const LLColor4 &b) +inline const LLColor4& operator+=(LLColor4& a, const LLColor4& b)  {      a.mV[VRED] += b.mV[VRED];      a.mV[VGREEN] += b.mV[VGREEN]; @@ -562,7 +518,7 @@ inline const LLColor4& operator+=(LLColor4 &a, const LLColor4 &b)      return a;  } -inline const LLColor4& operator-=(LLColor4 &a, const LLColor4 &b) +inline const LLColor4& operator-=(LLColor4& a, const LLColor4& b)  {      a.mV[VRED] -= b.mV[VRED];      a.mV[VGREEN] -= b.mV[VGREEN]; @@ -571,7 +527,7 @@ inline const LLColor4& operator-=(LLColor4 &a, const LLColor4 &b)      return a;  } -inline const LLColor4& operator*=(LLColor4 &a, F32 k) +inline const LLColor4& operator*=(LLColor4& a, F32 k)  {      // only affects rgb (not a!)      a.mV[VRED] *= k; @@ -580,121 +536,120 @@ inline const LLColor4& operator*=(LLColor4 &a, F32 k)      return a;  } -inline const LLColor4& operator *=(LLColor4 &a, const LLColor4 &b) +inline const LLColor4& operator*=(LLColor4& a, const LLColor4& b)  {      a.mV[VRED] *= b.mV[VRED];      a.mV[VGREEN] *= b.mV[VGREEN];      a.mV[VBLUE] *= b.mV[VBLUE]; -//  a.mV[VALPHA] *= b.mV[VALPHA]; +    //  a.mV[VALPHA] *= b.mV[VALPHA];      return a;  } -inline const LLColor4& operator%=(LLColor4 &a, F32 k) +inline const LLColor4& operator%=(LLColor4& a, F32 k)  {      // only affects alpha (not rgb!)      a.mV[VALPHA] *= k;      return a;  } -  // Non-member functions -inline F32      distVec(const LLColor4 &a, const LLColor4 &b) +inline F32 distVec(const LLColor4& a, const LLColor4& b)  {      LLColor4 vec = a - b; -    return (vec.length()); +    return vec.length();  } -inline F32      distVec_squared(const LLColor4 &a, const LLColor4 &b) +inline F32 distVec_squared(const LLColor4& a, const LLColor4& b)  {      LLColor4 vec = a - b; -    return (vec.lengthSquared()); +    return vec.lengthSquared();  } -inline LLColor4 lerp(const LLColor4 &a, const LLColor4 &b, F32 u) +inline LLColor4 lerp(const LLColor4& a, const LLColor4& b, F32 u)  { -    return LLColor4( -        a.mV[VRED] + (b.mV[VRED] - a.mV[VRED]) * u, -        a.mV[VGREEN] + (b.mV[VGREEN] - a.mV[VGREEN]) * u, -        a.mV[VBLUE] + (b.mV[VBLUE] - a.mV[VBLUE]) * u, -        a.mV[VALPHA] + (b.mV[VALPHA] - a.mV[VALPHA]) * u); +    return LLColor4(a.mV[VRED] + (b.mV[VRED] - a.mV[VRED]) * u, +                    a.mV[VGREEN] + (b.mV[VGREEN] - a.mV[VGREEN]) * u, +                    a.mV[VBLUE] + (b.mV[VBLUE] - a.mV[VBLUE]) * u, +                    a.mV[VALPHA] + (b.mV[VALPHA] - a.mV[VALPHA]) * u);  }  inline bool LLColor4::operator<(const LLColor4& rhs) const  { -    if (mV[0] != rhs.mV[0]) +    if (mV[VRED] != rhs.mV[VRED])      { -        return mV[0] < rhs.mV[0]; +        return mV[VRED] < rhs.mV[VRED];      } -    if (mV[1] != rhs.mV[1]) +    if (mV[VGREEN] != rhs.mV[VGREEN])      { -        return mV[1] < rhs.mV[1]; +        return mV[VGREEN] < rhs.mV[VGREEN];      } -    if (mV[2] != rhs.mV[2]) +    if (mV[VBLUE] != rhs.mV[VBLUE])      { -        return mV[2] < rhs.mV[2]; +        return mV[VBLUE] < rhs.mV[VBLUE];      } -    return mV[3] < rhs.mV[3]; +    return mV[VALPHA] < rhs.mV[VALPHA];  }  void LLColor4::clamp()  {      // Clamp the color... -    if (mV[0] < 0.f) +    if (mV[VRED] < 0.f)      { -        mV[0] = 0.f; +        mV[VRED] = 0.f;      } -    else if (mV[0] > 1.f) +    else if (mV[VRED] > 1.f)      { -        mV[0] = 1.f; +        mV[VRED] = 1.f;      } -    if (mV[1] < 0.f) +    if (mV[VGREEN] < 0.f)      { -        mV[1] = 0.f; +        mV[VGREEN] = 0.f;      } -    else if (mV[1] > 1.f) +    else if (mV[VGREEN] > 1.f)      { -        mV[1] = 1.f; +        mV[VGREEN] = 1.f;      } -    if (mV[2] < 0.f) +    if (mV[VBLUE] < 0.f)      { -        mV[2] = 0.f; +        mV[VBLUE] = 0.f;      } -    else if (mV[2] > 1.f) +    else if (mV[VBLUE] > 1.f)      { -        mV[2] = 1.f; +        mV[VBLUE] = 1.f;      } -    if (mV[3] < 0.f) +    if (mV[VALPHA] < 0.f)      { -        mV[3] = 0.f; +        mV[VALPHA] = 0.f;      } -    else if (mV[3] > 1.f) +    else if (mV[VALPHA] > 1.f)      { -        mV[3] = 1.f; +        mV[VALPHA] = 1.f;      }  }  // Return the given linear space color value in gamma corrected (sRGB) space -inline const LLColor4 srgbColor4(const LLColor4 &a) { +inline const LLColor4 srgbColor4(const LLColor4& a) +{      LLColor4 srgbColor; -    srgbColor.mV[0] = linearTosRGB(a.mV[0]); -    srgbColor.mV[1] = linearTosRGB(a.mV[1]); -    srgbColor.mV[2] = linearTosRGB(a.mV[2]); -    srgbColor.mV[3] = a.mV[3]; +    srgbColor.mV[VRED]   = linearTosRGB(a.mV[VRED]); +    srgbColor.mV[VGREEN] = linearTosRGB(a.mV[VGREEN]); +    srgbColor.mV[VBLUE]  = linearTosRGB(a.mV[VBLUE]); +    srgbColor.mV[VALPHA] = a.mV[VALPHA];      return srgbColor;  }  // Return the given gamma corrected (sRGB) color in linear space -inline const LLColor4 linearColor4(const LLColor4 &a) +inline const LLColor4 linearColor4(const LLColor4& a)  {      LLColor4 linearColor; -    linearColor.mV[0] = sRGBtoLinear(a.mV[0]); -    linearColor.mV[1] = sRGBtoLinear(a.mV[1]); -    linearColor.mV[2] = sRGBtoLinear(a.mV[2]); -    linearColor.mV[3] = a.mV[3]; +    linearColor.mV[VRED]   = sRGBtoLinear(a.mV[VRED]); +    linearColor.mV[VGREEN] = sRGBtoLinear(a.mV[VGREEN]); +    linearColor.mV[VBLUE]  = sRGBtoLinear(a.mV[VBLUE]); +    linearColor.mV[VALPHA] = a.mV[VALPHA];      return linearColor;  } @@ -720,4 +675,3 @@ void LLColor4::write(std::vector<T>& v) const  }  #endif - diff --git a/indra/llmath/v4coloru.cpp b/indra/llmath/v4coloru.cpp index acf349245a..c495ffdb4c 100644 --- a/indra/llmath/v4coloru.cpp +++ b/indra/llmath/v4coloru.cpp @@ -26,10 +26,7 @@  #include "linden_common.h" -//#include "v3coloru.h"  #include "v4coloru.h" -#include "v4color.h" -//#include "vmath.h"  #include "llmath.h"  // LLColor4U @@ -39,49 +36,7 @@ LLColor4U LLColor4U::red  (255,   0,   0, 255);  LLColor4U LLColor4U::green(  0, 255,   0, 255);  LLColor4U LLColor4U::blue (  0,   0, 255, 255); -// conversion -/* inlined to fix gcc compile link error -LLColor4U::operator LLColor4() -{ -    return(LLColor4((F32)mV[VRED]/255.f,(F32)mV[VGREEN]/255.f,(F32)mV[VBLUE]/255.f,(F32)mV[VALPHA]/255.f)); -} -*/ - -// Constructors - - -/* -LLColor4U::LLColor4U(const LLColor3 &vec) -{ -    mV[VRED] = vec.mV[VRED]; -    mV[VGREEN] = vec.mV[VGREEN]; -    mV[VBLUE] = vec.mV[VBLUE]; -    mV[VALPHA] = 255; -} -*/ - - -// Clear and Assignment Functions - - - -// LLColor4U Operators - -/* -LLColor4U LLColor4U::operator=(const LLColor3 &a) -{ -    mV[VRED] = a.mV[VRED]; -    mV[VGREEN] = a.mV[VGREEN]; -    mV[VBLUE] = a.mV[VBLUE]; - -// converting from an rgb sets a=1 (opaque) -    mV[VALPHA] = 255; -    return (*this); -} -*/ - - -std::ostream& operator<<(std::ostream& s, const LLColor4U &a) +std::ostream& operator<<(std::ostream& s, const LLColor4U& a)  {      s << "{ " << (S32)a.mV[VRED] << ", " << (S32)a.mV[VGREEN] << ", " << (S32)a.mV[VBLUE] << ", " << (S32)a.mV[VALPHA] << " }";      return s; @@ -90,31 +45,31 @@ std::ostream& operator<<(std::ostream& s, const LLColor4U &a)  // static  bool LLColor4U::parseColor4U(const std::string& buf, LLColor4U* value)  { -    if( buf.empty() || value == nullptr) +    if (buf.empty() || value == nullptr)      {          return false;      } -    U32 v[4]; -    S32 count = sscanf( buf.c_str(), "%u, %u, %u, %u", v + 0, v + 1, v + 2, v + 3 ); -    if (1 == count ) +    U32 v[4]{}; +    S32 count = sscanf(buf.c_str(), "%u, %u, %u, %u", v + 0, v + 1, v + 2, v + 3); +    if (1 == count)      {          // try this format -        count = sscanf( buf.c_str(), "%u %u %u %u", v + 0, v + 1, v + 2, v + 3 ); +        count = sscanf(buf.c_str(), "%u %u %u %u", v + 0, v + 1, v + 2, v + 3);      } -    if( 4 != count ) +    if (4 != count)      {          return false;      } -    for( S32 i = 0; i < 4; i++ ) +    for (S32 i = 0; i < 4; i++)      { -        if( v[i] > U8_MAX ) +        if (v[i] > U8_MAX)          {              return false;          }      } -    value->set( U8(v[0]), U8(v[1]), U8(v[2]), U8(v[3]) ); +    value->set(U8(v[VRED]), U8(v[VGREEN]), U8(v[VBLUE]), U8(v[VALPHA]));      return true;  } diff --git a/indra/llmath/v4coloru.h b/indra/llmath/v4coloru.h index 29128a08a7..bfa998bc58 100644 --- a/indra/llmath/v4coloru.h +++ b/indra/llmath/v4coloru.h @@ -28,104 +28,93 @@  #define LL_V4COLORU_H  #include "llerror.h" -//#include "vmath.h"  #include "llmath.h" -//#include "v4color.h"  #include "v3color.h"  #include "v4color.h" -//class LLColor3U;  class LLColor4;  //  LLColor4U = | red green blue alpha | -static const U32 LENGTHOFCOLOR4U = 4; - +static constexpr U32 LENGTHOFCOLOR4U = 4;  class LLColor4U  {  public: -      U8 mV[LENGTHOFCOLOR4U]; -    LLColor4U();                        // Initializes LLColor4U to (0, 0, 0, 1) -    LLColor4U(U8 r, U8 g, U8 b);        // Initializes LLColor4U to (r, g, b, 1) -    LLColor4U(U8 r, U8 g, U8 b, U8 a);      // Initializes LLColor4U to (r. g, b, a) -    LLColor4U(const U8 *vec);           // Initializes LLColor4U to (vec[0]. vec[1], vec[2], 1) -    explicit LLColor4U(const LLSD& sd) -    { -        setValue(sd); -    } +    LLColor4U();                       // Initializes LLColor4U to (0, 0, 0, 1) +    LLColor4U(U8 r, U8 g, U8 b);       // Initializes LLColor4U to (r, g, b, 1) +    LLColor4U(U8 r, U8 g, U8 b, U8 a); // Initializes LLColor4U to (r. g, b, a) +    LLColor4U(const U8* vec);          // Initializes LLColor4U to (vec[0]. vec[1], vec[2], 1) +    explicit LLColor4U(const LLSD& sd) { setValue(sd); }      void setValue(const LLSD& sd)      { -        mV[0] = sd[0].asInteger(); -        mV[1] = sd[1].asInteger(); -        mV[2] = sd[2].asInteger(); -        mV[3] = sd[3].asInteger(); +        mV[VRED]   = sd[VRED].asInteger(); +        mV[VGREEN] = sd[VGREEN].asInteger(); +        mV[VBLUE]  = sd[VBLUE].asInteger(); +        mV[VALPHA] = sd[VALPHA].asInteger();      }      LLSD getValue() const      {          LLSD ret; -        ret[0] = mV[0]; -        ret[1] = mV[1]; -        ret[2] = mV[2]; -        ret[3] = mV[3]; +        ret[VRED]   = mV[VRED]; +        ret[VGREEN] = mV[VGREEN]; +        ret[VBLUE]  = mV[VBLUE]; +        ret[VALPHA] = mV[VALPHA];          return ret;      } -    const LLColor4U&    setToBlack();                       // zero LLColor4U to (0, 0, 0, 1) -    const LLColor4U&    setToWhite();                       // zero LLColor4U to (0, 0, 0, 1) +    const LLColor4U& setToBlack(); // zero LLColor4U to (0, 0, 0, 1) +    const LLColor4U& setToWhite(); // zero LLColor4U to (0, 0, 0, 1) -    const LLColor4U&    set(U8 r, U8 g, U8 b, U8 a);// Sets LLColor4U to (r, g, b, a) -    const LLColor4U&    set(U8 r, U8 g, U8 b);      // Sets LLColor4U to (r, g, b) (no change in a) -    const LLColor4U&    set(const LLColor4U &vec);  // Sets LLColor4U to vec -    const LLColor4U&    set(const U8 *vec);         // Sets LLColor4U to vec +    const LLColor4U& set(U8 r, U8 g, U8 b, U8 a); // Sets LLColor4U to (r, g, b, a) +    const LLColor4U& set(U8 r, U8 g, U8 b);       // Sets LLColor4U to (r, g, b) (no change in a) +    const LLColor4U& set(const LLColor4U& vec);   // Sets LLColor4U to vec +    const LLColor4U& set(const U8* vec);          // Sets LLColor4U to vec -    const LLColor4U&    setVec(U8 r, U8 g, U8 b, U8 a); // deprecated -- use set() -    const LLColor4U&    setVec(U8 r, U8 g, U8 b);       // deprecated -- use set() -    const LLColor4U&    setVec(const LLColor4U &vec);   // deprecated -- use set() -    const LLColor4U&    setVec(const U8 *vec);          // deprecated -- use set() +    const LLColor4U& setVec(U8 r, U8 g, U8 b, U8 a); // deprecated -- use set() +    const LLColor4U& setVec(U8 r, U8 g, U8 b);       // deprecated -- use set() +    const LLColor4U& setVec(const LLColor4U& vec);   // deprecated -- use set() +    const LLColor4U& setVec(const U8* vec);          // deprecated -- use set() -    const LLColor4U&    setAlpha(U8 a); +    const LLColor4U& setAlpha(U8 a); -    F32         magVec() const;             // deprecated -- use length() -    F32         magVecSquared() const;      // deprecated -- use lengthSquared() +    F32 magVec() const;        // deprecated -- use length() +    F32 magVecSquared() const; // deprecated -- use lengthSquared() -    F32         length() const;             // Returns magnitude squared of LLColor4U -    F32         lengthSquared() const;      // Returns magnitude squared of LLColor4U +    F32 length() const;        // Returns magnitude squared of LLColor4U +    F32 lengthSquared() const; // Returns magnitude squared of LLColor4U -    friend std::ostream&     operator<<(std::ostream& s, const LLColor4U &a);       // Print a -    friend LLColor4U operator+(const LLColor4U &a, const LLColor4U &b); // Return vector a + b -    friend LLColor4U operator-(const LLColor4U &a, const LLColor4U &b); // Return vector a minus b -    friend LLColor4U operator*(const LLColor4U &a, const LLColor4U &b); // Return a * b -    friend bool operator==(const LLColor4U &a, const LLColor4U &b);     // Return a == b -    friend bool operator!=(const LLColor4U &a, const LLColor4U &b);     // Return a != b +    friend std::ostream& operator<<(std::ostream& s, const LLColor4U& a);    // Print a +    friend LLColor4U     operator+(const LLColor4U& a, const LLColor4U& b);  // Return vector a + b +    friend LLColor4U     operator-(const LLColor4U& a, const LLColor4U& b);  // Return vector a minus b +    friend LLColor4U     operator*(const LLColor4U& a, const LLColor4U& b);  // Return a * b +    friend bool          operator==(const LLColor4U& a, const LLColor4U& b); // Return a == b +    friend bool          operator!=(const LLColor4U& a, const LLColor4U& b); // Return a != b -    friend const LLColor4U& operator+=(LLColor4U &a, const LLColor4U &b);   // Return vector a + b -    friend const LLColor4U& operator-=(LLColor4U &a, const LLColor4U &b);   // Return vector a minus b -    friend const LLColor4U& operator*=(LLColor4U &a, U8 k);             // Return rgb times scaler k (no alpha change) -    friend const LLColor4U& operator%=(LLColor4U &a, U8 k);             // Return alpha times scaler k (no rgb change) +    friend const LLColor4U& operator+=(LLColor4U& a, const LLColor4U& b); // Return vector a + b +    friend const LLColor4U& operator-=(LLColor4U& a, const LLColor4U& b); // Return vector a minus b +    friend const LLColor4U& operator*=(LLColor4U& a, U8 k);               // Return rgb times scaler k (no alpha change) +    friend const LLColor4U& operator%=(LLColor4U& a, U8 k);               // Return alpha times scaler k (no rgb change) -    LLColor4U addClampMax(const LLColor4U &color);                      // Add and clamp the max +    LLColor4U addClampMax(const LLColor4U& color); // Add and clamp the max -    LLColor4U multAll(const F32 k);                                     // Multiply ALL channels by scalar k +    LLColor4U multAll(const F32 k); // Multiply ALL channels by scalar k -    inline void setVecScaleClamp(const LLColor3 &color); -    inline void setVecScaleClamp(const LLColor4 &color); +    inline void setVecScaleClamp(const LLColor3& color); +    inline void setVecScaleClamp(const LLColor4& color);      static bool parseColor4U(const std::string& buf, LLColor4U* value);      // conversion -    operator LLColor4() const -    { -        return LLColor4(*this); -    } +    operator LLColor4() const { return LLColor4(*this); } -    U32 asRGBA() const; -    void fromRGBA( U32 aVal ); +    U32  asRGBA() const; +    void fromRGBA(U32 aVal);      static LLColor4U white;      static LLColor4U black; @@ -134,104 +123,95 @@ public:      static LLColor4U blue;  }; -  // Non-member functions -F32     distVec(const LLColor4U &a, const LLColor4U &b);            // Returns distance between a and b -F32     distVec_squared(const LLColor4U &a, const LLColor4U &b);    // Returns distance squared between a and b - +F32 distVec(const LLColor4U& a, const LLColor4U& b);         // Returns distance between a and b +F32 distVec_squared(const LLColor4U& a, const LLColor4U& b); // Returns distance squared between a and b  inline LLColor4U::LLColor4U()  { -    mV[VRED] = 0; +    mV[VRED]   = 0;      mV[VGREEN] = 0; -    mV[VBLUE] = 0; +    mV[VBLUE]  = 0;      mV[VALPHA] = 255;  }  inline LLColor4U::LLColor4U(U8 r, U8 g, U8 b)  { -    mV[VRED] = r; +    mV[VRED]   = r;      mV[VGREEN] = g; -    mV[VBLUE] = b; +    mV[VBLUE]  = b;      mV[VALPHA] = 255;  }  inline LLColor4U::LLColor4U(U8 r, U8 g, U8 b, U8 a)  { -    mV[VRED] = r; +    mV[VRED]   = r;      mV[VGREEN] = g; -    mV[VBLUE] = b; +    mV[VBLUE]  = b;      mV[VALPHA] = a;  } -inline LLColor4U::LLColor4U(const U8 *vec) +inline LLColor4U::LLColor4U(const U8* vec)  { -    mV[VRED] = vec[VRED]; +    mV[VRED]   = vec[VRED];      mV[VGREEN] = vec[VGREEN]; -    mV[VBLUE] = vec[VBLUE]; +    mV[VBLUE]  = vec[VBLUE];      mV[VALPHA] = vec[VALPHA];  } -/* -inline LLColor4U::operator LLColor4() -{ -    return(LLColor4((F32)mV[VRED]/255.f,(F32)mV[VGREEN]/255.f,(F32)mV[VBLUE]/255.f,(F32)mV[VALPHA]/255.f)); -} -*/ -  inline const LLColor4U& LLColor4U::setToBlack(void)  { -    mV[VRED] = 0; +    mV[VRED]   = 0;      mV[VGREEN] = 0; -    mV[VBLUE] = 0; +    mV[VBLUE]  = 0;      mV[VALPHA] = 255;      return (*this);  }  inline const LLColor4U& LLColor4U::setToWhite(void)  { -    mV[VRED] = 255; +    mV[VRED]   = 255;      mV[VGREEN] = 255; -    mV[VBLUE] = 255; +    mV[VBLUE]  = 255;      mV[VALPHA] = 255;      return (*this);  }  inline const LLColor4U& LLColor4U::set(const U8 x, const U8 y, const U8 z)  { -    mV[VRED] = x; +    mV[VRED]   = x;      mV[VGREEN] = y; -    mV[VBLUE] = z; +    mV[VBLUE]  = z; -//  no change to alpha! -//  mV[VALPHA] = 255; +    //  no change to alpha! +    //  mV[VALPHA] = 255;      return (*this);  }  inline const LLColor4U& LLColor4U::set(const U8 r, const U8 g, const U8 b, U8 a)  { -    mV[0] = r; -    mV[1] = g; -    mV[2] = b; -    mV[3] = a; +    mV[VRED]   = r; +    mV[VGREEN] = g; +    mV[VBLUE]  = b; +    mV[VALPHA] = a;      return (*this);  } -inline const LLColor4U& LLColor4U::set(const LLColor4U &vec) +inline const LLColor4U& LLColor4U::set(const LLColor4U& vec)  { -    mV[VRED] = vec.mV[VRED]; +    mV[VRED]   = vec.mV[VRED];      mV[VGREEN] = vec.mV[VGREEN]; -    mV[VBLUE] = vec.mV[VBLUE]; +    mV[VBLUE]  = vec.mV[VBLUE];      mV[VALPHA] = vec.mV[VALPHA];      return (*this);  } -inline const LLColor4U& LLColor4U::set(const U8 *vec) +inline const LLColor4U& LLColor4U::set(const U8* vec)  { -    mV[VRED] = vec[VRED]; +    mV[VRED]   = vec[VRED];      mV[VGREEN] = vec[VGREEN]; -    mV[VBLUE] = vec[VBLUE]; +    mV[VBLUE]  = vec[VBLUE];      mV[VALPHA] = vec[VALPHA];      return (*this);  } @@ -239,12 +219,12 @@ inline const LLColor4U& LLColor4U::set(const U8 *vec)  // deprecated  inline const LLColor4U& LLColor4U::setVec(const U8 x, const U8 y, const U8 z)  { -    mV[VRED] = x; +    mV[VRED]   = x;      mV[VGREEN] = y; -    mV[VBLUE] = z; +    mV[VBLUE]  = z; -//  no change to alpha! -//  mV[VALPHA] = 255; +    //  no change to alpha! +    //  mV[VALPHA] = 255;      return (*this);  } @@ -252,29 +232,29 @@ inline const LLColor4U& LLColor4U::setVec(const U8 x, const U8 y, const U8 z)  // deprecated  inline const LLColor4U& LLColor4U::setVec(const U8 r, const U8 g, const U8 b, U8 a)  { -    mV[0] = r; -    mV[1] = g; -    mV[2] = b; -    mV[3] = a; +    mV[VRED]   = r; +    mV[VGREEN] = g; +    mV[VBLUE]  = b; +    mV[VALPHA] = a;      return (*this);  }  // deprecated -inline const LLColor4U& LLColor4U::setVec(const LLColor4U &vec) +inline const LLColor4U& LLColor4U::setVec(const LLColor4U& vec)  { -    mV[VRED] = vec.mV[VRED]; +    mV[VRED]   = vec.mV[VRED];      mV[VGREEN] = vec.mV[VGREEN]; -    mV[VBLUE] = vec.mV[VBLUE]; +    mV[VBLUE]  = vec.mV[VBLUE];      mV[VALPHA] = vec.mV[VALPHA];      return (*this);  }  // deprecated -inline const LLColor4U& LLColor4U::setVec(const U8 *vec) +inline const LLColor4U& LLColor4U::setVec(const U8* vec)  { -    mV[VRED] = vec[VRED]; +    mV[VRED]   = vec[VRED];      mV[VGREEN] = vec[VGREEN]; -    mV[VBLUE] = vec[VBLUE]; +    mV[VBLUE]  = vec[VBLUE];      mV[VALPHA] = vec[VALPHA];      return (*this);  } @@ -287,131 +267,68 @@ inline const LLColor4U& LLColor4U::setAlpha(U8 a)  // LLColor4U Magnitude and Normalization Functions -inline F32      LLColor4U::length(void) const +inline F32 LLColor4U::length() const  { -    return (F32) sqrt( ((F32)mV[VRED]) * mV[VRED] + ((F32)mV[VGREEN]) * mV[VGREEN] + ((F32)mV[VBLUE]) * mV[VBLUE] ); +    return sqrt(((F32)mV[VRED]) * mV[VRED] + ((F32)mV[VGREEN]) * mV[VGREEN] + ((F32)mV[VBLUE]) * mV[VBLUE]);  } -inline F32      LLColor4U::lengthSquared(void) const +inline F32 LLColor4U::lengthSquared() const  {      return ((F32)mV[VRED]) * mV[VRED] + ((F32)mV[VGREEN]) * mV[VGREEN] + ((F32)mV[VBLUE]) * mV[VBLUE];  }  // deprecated -inline F32      LLColor4U::magVec(void) const +inline F32 LLColor4U::magVec() const  { -    return (F32) sqrt( ((F32)mV[VRED]) * mV[VRED] + ((F32)mV[VGREEN]) * mV[VGREEN] + ((F32)mV[VBLUE]) * mV[VBLUE] ); +    return sqrt(((F32)mV[VRED]) * mV[VRED] + ((F32)mV[VGREEN]) * mV[VGREEN] + ((F32)mV[VBLUE]) * mV[VBLUE]);  }  // deprecated -inline F32      LLColor4U::magVecSquared(void) const +inline F32 LLColor4U::magVecSquared() const  {      return ((F32)mV[VRED]) * mV[VRED] + ((F32)mV[VGREEN]) * mV[VGREEN] + ((F32)mV[VBLUE]) * mV[VBLUE];  } -inline LLColor4U operator+(const LLColor4U &a, const LLColor4U &b) +inline LLColor4U operator+(const LLColor4U& a, const LLColor4U& b)  { -    return LLColor4U( -        a.mV[VRED] + b.mV[VRED], -        a.mV[VGREEN] + b.mV[VGREEN], -        a.mV[VBLUE] + b.mV[VBLUE], -        a.mV[VALPHA] + b.mV[VALPHA]); +    return LLColor4U(a.mV[VRED] + b.mV[VRED], a.mV[VGREEN] + b.mV[VGREEN], a.mV[VBLUE] + b.mV[VBLUE], a.mV[VALPHA] + b.mV[VALPHA]);  } -inline LLColor4U operator-(const LLColor4U &a, const LLColor4U &b) +inline LLColor4U operator-(const LLColor4U& a, const LLColor4U& b)  { -    return LLColor4U( -        a.mV[VRED] - b.mV[VRED], -        a.mV[VGREEN] - b.mV[VGREEN], -        a.mV[VBLUE] - b.mV[VBLUE], -        a.mV[VALPHA] - b.mV[VALPHA]); +    return LLColor4U(a.mV[VRED] - b.mV[VRED], a.mV[VGREEN] - b.mV[VGREEN], a.mV[VBLUE] - b.mV[VBLUE], a.mV[VALPHA] - b.mV[VALPHA]);  } -inline LLColor4U  operator*(const LLColor4U &a, const LLColor4U &b) +inline LLColor4U operator*(const LLColor4U& a, const LLColor4U& b)  { -    return LLColor4U( -        a.mV[VRED] * b.mV[VRED], -        a.mV[VGREEN] * b.mV[VGREEN], -        a.mV[VBLUE] * b.mV[VBLUE], -        a.mV[VALPHA] * b.mV[VALPHA]); +    return LLColor4U(a.mV[VRED] * b.mV[VRED], a.mV[VGREEN] * b.mV[VGREEN], a.mV[VBLUE] * b.mV[VBLUE], a.mV[VALPHA] * b.mV[VALPHA]);  } -inline LLColor4U LLColor4U::addClampMax(const LLColor4U &color) +inline LLColor4U LLColor4U::addClampMax(const LLColor4U& color)  {      return LLColor4U(llmin((S32)mV[VRED] + color.mV[VRED], 255), -                    llmin((S32)mV[VGREEN] + color.mV[VGREEN], 255), -                    llmin((S32)mV[VBLUE] + color.mV[VBLUE], 255), -                    llmin((S32)mV[VALPHA] + color.mV[VALPHA], 255)); +                     llmin((S32)mV[VGREEN] + color.mV[VGREEN], 255), +                     llmin((S32)mV[VBLUE] + color.mV[VBLUE], 255), +                     llmin((S32)mV[VALPHA] + color.mV[VALPHA], 255));  }  inline LLColor4U LLColor4U::multAll(const F32 k)  {      // Round to nearest -    return LLColor4U( -        (U8)ll_round(mV[VRED] * k), -        (U8)ll_round(mV[VGREEN] * k), -        (U8)ll_round(mV[VBLUE] * k), -        (U8)ll_round(mV[VALPHA] * k)); -} -/* -inline LLColor4U operator*(const LLColor4U &a, U8 k) -{ -    // only affects rgb (not a!) -    return LLColor4U( -        a.mV[VRED] * k, -        a.mV[VGREEN] * k, -        a.mV[VBLUE] * k, -        a.mV[VALPHA]); +    return LLColor4U((U8)ll_round(mV[VRED] * k), (U8)ll_round(mV[VGREEN] * k), (U8)ll_round(mV[VBLUE] * k), (U8)ll_round(mV[VALPHA] * k));  } -inline LLColor4U operator*(U8 k, const LLColor4U &a) +inline bool operator==(const LLColor4U& a, const LLColor4U& b)  { -    // only affects rgb (not a!) -    return LLColor4U( -        a.mV[VRED] * k, -        a.mV[VGREEN] * k, -        a.mV[VBLUE] * k, -        a.mV[VALPHA]); +    return ((a.mV[VRED] == b.mV[VRED]) && (a.mV[VGREEN] == b.mV[VGREEN]) && (a.mV[VBLUE] == b.mV[VBLUE]) && (a.mV[VALPHA] == b.mV[VALPHA]));  } -inline LLColor4U operator%(U8 k, const LLColor4U &a) +inline bool operator!=(const LLColor4U& a, const LLColor4U& b)  { -    // only affects alpha (not rgb!) -    return LLColor4U( -        a.mV[VRED], -        a.mV[VGREEN], -        a.mV[VBLUE], -        a.mV[VALPHA] * k ); +    return ((a.mV[VRED] != b.mV[VRED]) || (a.mV[VGREEN] != b.mV[VGREEN]) || (a.mV[VBLUE] != b.mV[VBLUE]) || (a.mV[VALPHA] != b.mV[VALPHA]));  } -inline LLColor4U operator%(const LLColor4U &a, U8 k) -{ -    // only affects alpha (not rgb!) -    return LLColor4U( -        a.mV[VRED], -        a.mV[VGREEN], -        a.mV[VBLUE], -        a.mV[VALPHA] * k ); -} -*/ - -inline bool operator==(const LLColor4U &a, const LLColor4U &b) -{ -    return (  (a.mV[VRED] == b.mV[VRED]) -            &&(a.mV[VGREEN] == b.mV[VGREEN]) -            &&(a.mV[VBLUE] == b.mV[VBLUE]) -            &&(a.mV[VALPHA] == b.mV[VALPHA])); -} - -inline bool operator!=(const LLColor4U &a, const LLColor4U &b) -{ -    return (  (a.mV[VRED] != b.mV[VRED]) -            ||(a.mV[VGREEN] != b.mV[VGREEN]) -            ||(a.mV[VBLUE] != b.mV[VBLUE]) -            ||(a.mV[VALPHA] != b.mV[VALPHA])); -} - -inline const LLColor4U& operator+=(LLColor4U &a, const LLColor4U &b) +inline const LLColor4U& operator+=(LLColor4U& a, const LLColor4U& b)  {      a.mV[VRED] += b.mV[VRED];      a.mV[VGREEN] += b.mV[VGREEN]; @@ -420,7 +337,7 @@ inline const LLColor4U& operator+=(LLColor4U &a, const LLColor4U &b)      return a;  } -inline const LLColor4U& operator-=(LLColor4U &a, const LLColor4U &b) +inline const LLColor4U& operator-=(LLColor4U& a, const LLColor4U& b)  {      a.mV[VRED] -= b.mV[VRED];      a.mV[VGREEN] -= b.mV[VGREEN]; @@ -429,7 +346,7 @@ inline const LLColor4U& operator-=(LLColor4U &a, const LLColor4U &b)      return a;  } -inline const LLColor4U& operator*=(LLColor4U &a, U8 k) +inline const LLColor4U& operator*=(LLColor4U& a, U8 k)  {      // only affects rgb (not a!)      a.mV[VRED] *= k; @@ -438,20 +355,20 @@ inline const LLColor4U& operator*=(LLColor4U &a, U8 k)      return a;  } -inline const LLColor4U& operator%=(LLColor4U &a, U8 k) +inline const LLColor4U& operator%=(LLColor4U& a, U8 k)  {      // only affects alpha (not rgb!)      a.mV[VALPHA] *= k;      return a;  } -inline F32      distVec(const LLColor4U &a, const LLColor4U &b) +inline F32 distVec(const LLColor4U& a, const LLColor4U& b)  {      LLColor4U vec = a - b;      return (vec.length());  } -inline F32      distVec_squared(const LLColor4U &a, const LLColor4U &b) +inline F32 distVec_squared(const LLColor4U& a, const LLColor4U& b)  {      LLColor4U vec = a - b;      return (vec.lengthSquared()); @@ -460,13 +377,13 @@ inline F32      distVec_squared(const LLColor4U &a, const LLColor4U &b)  void LLColor4U::setVecScaleClamp(const LLColor4& color)  {      F32 color_scale_factor = 255.f; -    F32 max_color = llmax(color.mV[0], color.mV[1], color.mV[2]); +    F32 max_color          = llmax(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE]);      if (max_color > 1.f)      {          color_scale_factor /= max_color;      } -    const S32 MAX_COLOR = 255; -    S32 r = ll_round(color.mV[0] * color_scale_factor); +    constexpr S32 MAX_COLOR = 255; +    S32           r         = ll_round(color.mV[VRED] * color_scale_factor);      if (r > MAX_COLOR)      {          r = MAX_COLOR; @@ -475,9 +392,9 @@ void LLColor4U::setVecScaleClamp(const LLColor4& color)      {          r = 0;      } -    mV[0] = r; +    mV[VRED] = r; -    S32 g = ll_round(color.mV[1] * color_scale_factor); +    S32 g = ll_round(color.mV[VGREEN] * color_scale_factor);      if (g > MAX_COLOR)      {          g = MAX_COLOR; @@ -486,9 +403,9 @@ void LLColor4U::setVecScaleClamp(const LLColor4& color)      {          g = 0;      } -    mV[1] = g; +    mV[VGREEN] = g; -    S32 b = ll_round(color.mV[2] * color_scale_factor); +    S32 b = ll_round(color.mV[VBLUE] * color_scale_factor);      if (b > MAX_COLOR)      {          b = MAX_COLOR; @@ -497,10 +414,10 @@ void LLColor4U::setVecScaleClamp(const LLColor4& color)      {          b = 0;      } -    mV[2] = b; +    mV[VBLUE] = b;      // Alpha shouldn't be scaled, just clamped... -    S32 a = ll_round(color.mV[3] * MAX_COLOR); +    S32 a = ll_round(color.mV[VALPHA] * MAX_COLOR);      if (a > MAX_COLOR)      {          a = MAX_COLOR; @@ -509,44 +426,42 @@ void LLColor4U::setVecScaleClamp(const LLColor4& color)      {          a = 0;      } -    mV[3] = a; +    mV[VALPHA] = a;  }  void LLColor4U::setVecScaleClamp(const LLColor3& color)  {      F32 color_scale_factor = 255.f; -    F32 max_color = llmax(color.mV[0], color.mV[1], color.mV[2]); +    F32 max_color          = llmax(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE]);      if (max_color > 1.f)      {          color_scale_factor /= max_color;      }      const S32 MAX_COLOR = 255; -    S32 r = ll_round(color.mV[0] * color_scale_factor); +    S32       r         = ll_round(color.mV[VRED] * color_scale_factor);      if (r > MAX_COLOR)      {          r = MAX_COLOR;      } -    else -    if (r < 0) +    else if (r < 0)      {          r = 0;      } -    mV[0] = r; +    mV[VRED] = r; -    S32 g = ll_round(color.mV[1] * color_scale_factor); +    S32 g = ll_round(color.mV[VGREEN] * color_scale_factor);      if (g > MAX_COLOR)      {          g = MAX_COLOR;      } -    else -    if (g < 0) +    else if (g < 0)      {          g = 0;      } -    mV[1] = g; +    mV[VGREEN] = g; -    S32 b = ll_round(color.mV[2] * color_scale_factor); +    S32 b = ll_round(color.mV[VBLUE] * color_scale_factor);      if (b > MAX_COLOR)      {          b = MAX_COLOR; @@ -555,31 +470,29 @@ void LLColor4U::setVecScaleClamp(const LLColor3& color)      {          b = 0;      } -    mV[2] = b; +    mV[VBLUE] = b; -    mV[3] = 255; +    mV[VALPHA] = 255;  }  inline U32 LLColor4U::asRGBA() const  {      // Little endian: values are swapped in memory. The original code access the array like a U32, so we need to swap here -    return (mV[3] << 24) | (mV[2] << 16) | (mV[1] << 8) | mV[0]; +    return (mV[VALPHA] << 24) | (mV[VBLUE] << 16) | (mV[VGREEN] << 8) | mV[VRED];  } -inline void LLColor4U::fromRGBA( U32 aVal ) +inline void LLColor4U::fromRGBA(U32 aVal)  {      // Little endian: values are swapped in memory. The original code access the array like a U32, so we need to swap here -    mV[ 0 ] = aVal & 0xFF; +    mV[VRED] = aVal & 0xFF;      aVal >>= 8; -    mV[ 1 ] = aVal & 0xFF; +    mV[VGREEN] = aVal & 0xFF;      aVal >>= 8; -    mV[ 2 ] = aVal & 0xFF; +    mV[VBLUE] = aVal & 0xFF;      aVal >>= 8; -    mV[ 3 ] = aVal & 0xFF; +    mV[VALPHA] = aVal & 0xFF;  } -  #endif - diff --git a/indra/llmath/v4math.cpp b/indra/llmath/v4math.cpp index 0aa6eb09c3..cd475380d6 100644 --- a/indra/llmath/v4math.cpp +++ b/indra/llmath/v4math.cpp @@ -26,7 +26,6 @@  #include "linden_common.h" -//#include "vmath.h"  #include "v3math.h"  #include "v4math.h"  #include "m4math.h" @@ -36,13 +35,13 @@  // LLVector4  // Axis-Angle rotations -const LLVector4&    LLVector4::rotVec(const LLMatrix4 &mat) +const LLVector4&    LLVector4::rotVec(const LLMatrix4& mat)  {      *this = *this * mat;      return *this;  } -const LLVector4&    LLVector4::rotVec(const LLQuaternion &q) +const LLVector4&    LLVector4::rotVec(const LLQuaternion& q)  {      *this = *this * q;      return *this; @@ -64,16 +63,16 @@ bool LLVector4::abs()  {      bool ret{ false }; -    if (mV[0] < 0.f) { mV[0] = -mV[0]; ret = true; } -    if (mV[1] < 0.f) { mV[1] = -mV[1]; ret = true; } -    if (mV[2] < 0.f) { mV[2] = -mV[2]; ret = true; } -    if (mV[3] < 0.f) { mV[3] = -mV[3]; ret = true; } +    if (mV[VX] < 0.f) { mV[VX] = -mV[VX]; ret = true; } +    if (mV[VY] < 0.f) { mV[VY] = -mV[VY]; ret = true; } +    if (mV[VZ] < 0.f) { mV[VZ] = -mV[VZ]; ret = true; } +    if (mV[VW] < 0.f) { mV[VW] = -mV[VW]; ret = true; }      return ret;  } -std::ostream& operator<<(std::ostream& s, const LLVector4 &a) +std::ostream& operator<<(std::ostream& s, const LLVector4& a)  {      s << "{ " << a.mV[VX] << ", " << a.mV[VY] << ", " << a.mV[VZ] << ", " << a.mV[VW] << " }";      return s; @@ -108,12 +107,12 @@ bool are_parallel(const LLVector4 &a, const LLVector4 &b, F32 epsilon)  } -LLVector3 vec4to3(const LLVector4 &vec) +LLVector3 vec4to3(const LLVector4& vec)  {      return LLVector3( vec.mV[VX], vec.mV[VY], vec.mV[VZ] );  } -LLVector4 vec3to4(const LLVector3 &vec) +LLVector4 vec3to4(const LLVector3& vec)  {      return LLVector4(vec.mV[VX], vec.mV[VY], vec.mV[VZ]);  } diff --git a/indra/llmath/v4math.h b/indra/llmath/v4math.h index a4c9668fdd..37492e7f98 100644 --- a/indra/llmath/v4math.h +++ b/indra/llmath/v4math.h @@ -42,108 +42,108 @@ class LLQuaternion;  //  LLVector4 = |x y z w| -static const U32 LENGTHOFVECTOR4 = 4; +static constexpr U32 LENGTHOFVECTOR4 = 4;  class LLVector4  { -    public: -        F32 mV[LENGTHOFVECTOR4]; -        LLVector4();                        // Initializes LLVector4 to (0, 0, 0, 1) -        explicit LLVector4(const F32 *vec);         // Initializes LLVector4 to (vec[0]. vec[1], vec[2], vec[3]) -        explicit LLVector4(const F64 *vec);         // Initialized LLVector4 to ((F32) vec[0], (F32) vec[1], (F32) vec[3], (F32) vec[4]); -        explicit LLVector4(const LLVector2 &vec); -        explicit LLVector4(const LLVector2 &vec, F32 z, F32 w); -        explicit LLVector4(const LLVector3 &vec);           // Initializes LLVector4 to (vec, 1) -        explicit LLVector4(const LLVector3 &vec, F32 w);    // Initializes LLVector4 to (vec, w) -        explicit LLVector4(const LLSD &sd); -        LLVector4(F32 x, F32 y, F32 z);     // Initializes LLVector4 to (x. y, z, 1) -        LLVector4(F32 x, F32 y, F32 z, F32 w); - -        LLSD getValue() const -        { -            LLSD ret; -            ret[0] = mV[0]; -            ret[1] = mV[1]; -            ret[2] = mV[2]; -            ret[3] = mV[3]; -            return ret; -        } - -        void setValue(const LLSD& sd) -        { -            mV[0] = (F32)sd[0].asReal(); -            mV[1] = (F32)sd[1].asReal(); -            mV[2] = (F32)sd[2].asReal(); -            mV[3] = (F32)sd[3].asReal(); -        } - -        // GLM interop -        explicit LLVector4(const glm::vec3& vec); // Initializes LLVector4 to (vec, 1) -        explicit LLVector4(const glm::vec4& vec); // Initializes LLVector4 to vec -        explicit operator glm::vec3() const;      // Initializes glm::vec3 to (vec[0]. vec[1], vec[2]) -        explicit operator glm::vec4() const;      // Initializes glm::vec4 to (vec[0]. vec[1], vec[2], vec[3]) - -        inline bool isFinite() const;                                   // checks to see if all values of LLVector3 are finite - -        inline void clear();        // Clears LLVector4 to (0, 0, 0, 1) -        inline void clearVec();     // deprecated -        inline void zeroVec();      // deprecated - -        inline void set(F32 x, F32 y, F32 z);           // Sets LLVector4 to (x, y, z, 1) -        inline void set(F32 x, F32 y, F32 z, F32 w);    // Sets LLVector4 to (x, y, z, w) -        inline void set(const LLVector4 &vec);          // Sets LLVector4 to vec -        inline void set(const LLVector3 &vec, F32 w = 1.f); // Sets LLVector4 to LLVector3 vec -        inline void set(const F32 *vec);                // Sets LLVector4 to vec -        inline void set(const glm::vec4& vec); // Sets LLVector4 to vec -        inline void set(const glm::vec3& vec, F32 w = 1.f); // Sets LLVector4 to LLVector3 vec with w defaulted to 1 - -        inline void setVec(F32 x, F32 y, F32 z);        // deprecated -        inline void setVec(F32 x, F32 y, F32 z, F32 w); // deprecated -        inline void setVec(const LLVector4 &vec);       // deprecated -        inline void setVec(const LLVector3 &vec, F32 w = 1.f); // deprecated -        inline void setVec(const F32 *vec);             // deprecated - -        F32 length() const;             // Returns magnitude of LLVector4 -        F32 lengthSquared() const;      // Returns magnitude squared of LLVector4 -        F32 normalize();                // Normalizes and returns the magnitude of LLVector4 - -        F32         magVec() const;             // deprecated -        F32         magVecSquared() const;      // deprecated -        F32         normVec();                  // deprecated - -        // Sets all values to absolute value of their original values -        // Returns true if data changed -        bool abs(); - -        bool isExactlyClear() const     { return (mV[VW] == 1.0f) && !mV[VX] && !mV[VY] && !mV[VZ]; } -        bool isExactlyZero() const      { return !mV[VW] && !mV[VX] && !mV[VY] && !mV[VZ]; } - -        const LLVector4&    rotVec(const LLMatrix4 &mat);               // Rotates by MAT4 mat -        const LLVector4&    rotVec(const LLQuaternion &q);              // Rotates by QUAT q - -        const LLVector4&    scaleVec(const LLVector4& vec); // Scales component-wise by vec - -        F32 operator[](int idx) const { return mV[idx]; } -        F32 &operator[](int idx) { return mV[idx]; } - -        friend std::ostream&     operator<<(std::ostream& s, const LLVector4 &a);       // Print a -        friend LLVector4 operator+(const LLVector4 &a, const LLVector4 &b); // Return vector a + b -        friend LLVector4 operator-(const LLVector4 &a, const LLVector4 &b); // Return vector a minus b -        friend F32  operator*(const LLVector4 &a, const LLVector4 &b);      // Return a dot b -        friend LLVector4 operator%(const LLVector4 &a, const LLVector4 &b); // Return a cross b -        friend LLVector4 operator/(const LLVector4 &a, F32 k);              // Return a divided by scaler k -        friend LLVector4 operator*(const LLVector4 &a, F32 k);              // Return a times scaler k -        friend LLVector4 operator*(F32 k, const LLVector4 &a);              // Return a times scaler k -        friend bool operator==(const LLVector4 &a, const LLVector4 &b);     // Return a == b -        friend bool operator!=(const LLVector4 &a, const LLVector4 &b);     // Return a != b - -        friend const LLVector4& operator+=(LLVector4 &a, const LLVector4 &b);   // Return vector a + b -        friend const LLVector4& operator-=(LLVector4 &a, const LLVector4 &b);   // Return vector a minus b -        friend const LLVector4& operator%=(LLVector4 &a, const LLVector4 &b);   // Return a cross b -        friend const LLVector4& operator*=(LLVector4 &a, F32 k);                // Return a times scaler k -        friend const LLVector4& operator/=(LLVector4 &a, F32 k);                // Return a divided by scaler k - -        friend LLVector4 operator-(const LLVector4 &a);                 // Return vector -a +public: +    F32 mV[LENGTHOFVECTOR4]; +    LLVector4();                        // Initializes LLVector4 to (0, 0, 0, 1) +    explicit LLVector4(const F32 *vec);         // Initializes LLVector4 to (vec[0]. vec[1], vec[2], vec[3]) +    explicit LLVector4(const F64 *vec);         // Initialized LLVector4 to ((F32) vec[0], (F32) vec[1], (F32) vec[3], (F32) vec[4]); +    explicit LLVector4(const LLVector2 &vec); +    explicit LLVector4(const LLVector2 &vec, F32 z, F32 w); +    explicit LLVector4(const LLVector3 &vec);           // Initializes LLVector4 to (vec, 1) +    explicit LLVector4(const LLVector3 &vec, F32 w);    // Initializes LLVector4 to (vec, w) +    explicit LLVector4(const LLSD &sd); +    LLVector4(F32 x, F32 y, F32 z);     // Initializes LLVector4 to (x. y, z, 1) +    LLVector4(F32 x, F32 y, F32 z, F32 w); + +    LLSD getValue() const +    { +        LLSD ret; +        ret[VX] = mV[VX]; +        ret[VY] = mV[VY]; +        ret[VZ] = mV[VZ]; +        ret[VW] = mV[VW]; +        return ret; +    } + +    void setValue(const LLSD& sd) +    { +        mV[VX] = (F32)sd[VX].asReal(); +        mV[VY] = (F32)sd[VY].asReal(); +        mV[VZ] = (F32)sd[VZ].asReal(); +        mV[VW] = (F32)sd[VW].asReal(); +    } + +    // GLM interop +    explicit LLVector4(const glm::vec3& vec); // Initializes LLVector4 to (vec, 1) +    explicit LLVector4(const glm::vec4& vec); // Initializes LLVector4 to vec +    explicit operator glm::vec3() const;      // Initializes glm::vec3 to (vec[0]. vec[1], vec[2]) +    explicit operator glm::vec4() const;      // Initializes glm::vec4 to (vec[0]. vec[1], vec[2], vec[3]) + +    inline bool isFinite() const;                                   // checks to see if all values of LLVector3 are finite + +    inline void clear();        // Clears LLVector4 to (0, 0, 0, 1) +    inline void clearVec();     // deprecated +    inline void zeroVec();      // deprecated + +    inline void set(F32 x, F32 y, F32 z);           // Sets LLVector4 to (x, y, z, 1) +    inline void set(F32 x, F32 y, F32 z, F32 w);    // Sets LLVector4 to (x, y, z, w) +    inline void set(const LLVector4 &vec);          // Sets LLVector4 to vec +    inline void set(const LLVector3 &vec, F32 w = 1.f); // Sets LLVector4 to LLVector3 vec +    inline void set(const F32 *vec);                // Sets LLVector4 to vec +    inline void set(const glm::vec4& vec); // Sets LLVector4 to vec +    inline void set(const glm::vec3& vec, F32 w = 1.f); // Sets LLVector4 to LLVector3 vec with w defaulted to 1 + +    inline void setVec(F32 x, F32 y, F32 z);        // deprecated +    inline void setVec(F32 x, F32 y, F32 z, F32 w); // deprecated +    inline void setVec(const LLVector4 &vec);       // deprecated +    inline void setVec(const LLVector3 &vec, F32 w = 1.f); // deprecated +    inline void setVec(const F32 *vec);             // deprecated + +    F32 length() const;             // Returns magnitude of LLVector4 +    F32 lengthSquared() const;      // Returns magnitude squared of LLVector4 +    F32 normalize();                // Normalizes and returns the magnitude of LLVector4 + +    F32         magVec() const;             // deprecated +    F32         magVecSquared() const;      // deprecated +    F32         normVec();                  // deprecated + +    // Sets all values to absolute value of their original values +    // Returns true if data changed +    bool abs(); + +    bool isExactlyClear() const     { return (mV[VW] == 1.0f) && !mV[VX] && !mV[VY] && !mV[VZ]; } +    bool isExactlyZero() const      { return !mV[VW] && !mV[VX] && !mV[VY] && !mV[VZ]; } + +    const LLVector4&    rotVec(const LLMatrix4 &mat);               // Rotates by MAT4 mat +    const LLVector4&    rotVec(const LLQuaternion &q);              // Rotates by QUAT q + +    const LLVector4&    scaleVec(const LLVector4& vec); // Scales component-wise by vec + +    F32 operator[](int idx) const { return mV[idx]; } +    F32 &operator[](int idx) { return mV[idx]; } + +    friend std::ostream&     operator<<(std::ostream& s, const LLVector4 &a);       // Print a +    friend LLVector4 operator+(const LLVector4 &a, const LLVector4 &b); // Return vector a + b +    friend LLVector4 operator-(const LLVector4 &a, const LLVector4 &b); // Return vector a minus b +    friend F32  operator*(const LLVector4 &a, const LLVector4 &b);      // Return a dot b +    friend LLVector4 operator%(const LLVector4 &a, const LLVector4 &b); // Return a cross b +    friend LLVector4 operator/(const LLVector4 &a, F32 k);              // Return a divided by scaler k +    friend LLVector4 operator*(const LLVector4 &a, F32 k);              // Return a times scaler k +    friend LLVector4 operator*(F32 k, const LLVector4 &a);              // Return a times scaler k +    friend bool operator==(const LLVector4 &a, const LLVector4 &b);     // Return a == b +    friend bool operator!=(const LLVector4 &a, const LLVector4 &b);     // Return a != b + +    friend const LLVector4& operator+=(LLVector4 &a, const LLVector4 &b);   // Return vector a + b +    friend const LLVector4& operator-=(LLVector4 &a, const LLVector4 &b);   // Return vector a minus b +    friend const LLVector4& operator%=(LLVector4 &a, const LLVector4 &b);   // Return a cross b +    friend const LLVector4& operator*=(LLVector4 &a, F32 k);                // Return a times scaler k +    friend const LLVector4& operator/=(LLVector4 &a, F32 k);                // Return a divided by scaler k + +    friend LLVector4 operator-(const LLVector4 &a);                 // Return vector -a  };  // Non-member functions @@ -257,7 +257,7 @@ inline bool LLVector4::isFinite() const  // Clear and Assignment Functions -inline void LLVector4::clear(void) +inline void LLVector4::clear()  {      mV[VX] = 0.f;      mV[VY] = 0.f; @@ -266,7 +266,7 @@ inline void LLVector4::clear(void)  }  // deprecated -inline void LLVector4::clearVec(void) +inline void LLVector4::clearVec()  {      mV[VX] = 0.f;      mV[VY] = 0.f; @@ -275,7 +275,7 @@ inline void LLVector4::clearVec(void)  }  // deprecated -inline void LLVector4::zeroVec(void) +inline void LLVector4::zeroVec()  {      mV[VX] = 0.f;      mV[VY] = 0.f; @@ -299,7 +299,7 @@ inline void LLVector4::set(F32 x, F32 y, F32 z, F32 w)      mV[VW] = w;  } -inline void LLVector4::set(const LLVector4 &vec) +inline void LLVector4::set(const LLVector4& vec)  {      mV[VX] = vec.mV[VX];      mV[VY] = vec.mV[VY]; @@ -307,7 +307,7 @@ inline void LLVector4::set(const LLVector4 &vec)      mV[VW] = vec.mV[VW];  } -inline void LLVector4::set(const LLVector3 &vec, F32 w) +inline void LLVector4::set(const LLVector3& vec, F32 w)  {      mV[VX] = vec.mV[VX];      mV[VY] = vec.mV[VY]; @@ -315,7 +315,7 @@ inline void LLVector4::set(const LLVector3 &vec, F32 w)      mV[VW] = w;  } -inline void LLVector4::set(const F32 *vec) +inline void LLVector4::set(const F32* vec)  {      mV[VX] = vec[VX];      mV[VY] = vec[VY]; @@ -358,7 +358,7 @@ inline void LLVector4::setVec(F32 x, F32 y, F32 z, F32 w)  }  // deprecated -inline void LLVector4::setVec(const LLVector4 &vec) +inline void LLVector4::setVec(const LLVector4& vec)  {      mV[VX] = vec.mV[VX];      mV[VY] = vec.mV[VY]; @@ -367,7 +367,7 @@ inline void LLVector4::setVec(const LLVector4 &vec)  }  // deprecated -inline void LLVector4::setVec(const LLVector3 &vec, F32 w) +inline void LLVector4::setVec(const LLVector3& vec, F32 w)  {      mV[VX] = vec.mV[VX];      mV[VY] = vec.mV[VY]; @@ -376,7 +376,7 @@ inline void LLVector4::setVec(const LLVector3 &vec, F32 w)  }  // deprecated -inline void LLVector4::setVec(const F32 *vec) +inline void LLVector4::setVec(const F32* vec)  {      mV[VX] = vec[VX];      mV[VY] = vec[VY]; @@ -386,75 +386,75 @@ inline void LLVector4::setVec(const F32 *vec)  // LLVector4 Magnitude and Normalization Functions -inline F32      LLVector4::length(void) const +inline F32      LLVector4::length() const  { -    return (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]); +    return sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);  } -inline F32      LLVector4::lengthSquared(void) const +inline F32      LLVector4::lengthSquared() const  {      return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];  } -inline F32      LLVector4::magVec(void) const +inline F32      LLVector4::magVec() const  { -    return (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]); +    return sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);  } -inline F32      LLVector4::magVecSquared(void) const +inline F32      LLVector4::magVecSquared() const  {      return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];  }  // LLVector4 Operators -inline LLVector4 operator+(const LLVector4 &a, const LLVector4 &b) +inline LLVector4 operator+(const LLVector4& a, const LLVector4& b)  {      LLVector4 c(a);      return c += b;  } -inline LLVector4 operator-(const LLVector4 &a, const LLVector4 &b) +inline LLVector4 operator-(const LLVector4& a, const LLVector4& b)  {      LLVector4 c(a);      return c -= b;  } -inline F32  operator*(const LLVector4 &a, const LLVector4 &b) +inline F32  operator*(const LLVector4& a, const LLVector4& b)  {      return (a.mV[VX]*b.mV[VX] + a.mV[VY]*b.mV[VY] + a.mV[VZ]*b.mV[VZ]);  } -inline LLVector4 operator%(const LLVector4 &a, const LLVector4 &b) +inline LLVector4 operator%(const LLVector4& a, const LLVector4& b)  {      return LLVector4(a.mV[VY]*b.mV[VZ] - b.mV[VY]*a.mV[VZ], a.mV[VZ]*b.mV[VX] - b.mV[VZ]*a.mV[VX], a.mV[VX]*b.mV[VY] - b.mV[VX]*a.mV[VY]);  } -inline LLVector4 operator/(const LLVector4 &a, F32 k) +inline LLVector4 operator/(const LLVector4& a, F32 k)  {      F32 t = 1.f / k;      return LLVector4( a.mV[VX] * t, a.mV[VY] * t, a.mV[VZ] * t );  } -inline LLVector4 operator*(const LLVector4 &a, F32 k) +inline LLVector4 operator*(const LLVector4& a, F32 k)  {      return LLVector4( a.mV[VX] * k, a.mV[VY] * k, a.mV[VZ] * k );  } -inline LLVector4 operator*(F32 k, const LLVector4 &a) +inline LLVector4 operator*(F32 k, const LLVector4& a)  {      return LLVector4( a.mV[VX] * k, a.mV[VY] * k, a.mV[VZ] * k );  } -inline bool operator==(const LLVector4 &a, const LLVector4 &b) +inline bool operator==(const LLVector4& a, const LLVector4& b)  {      return (  (a.mV[VX] == b.mV[VX])              &&(a.mV[VY] == b.mV[VY])              &&(a.mV[VZ] == b.mV[VZ]));  } -inline bool operator!=(const LLVector4 &a, const LLVector4 &b) +inline bool operator!=(const LLVector4& a, const LLVector4& b)  {      return (  (a.mV[VX] != b.mV[VX])              ||(a.mV[VY] != b.mV[VY]) @@ -462,7 +462,7 @@ inline bool operator!=(const LLVector4 &a, const LLVector4 &b)              ||(a.mV[VW] != b.mV[VW]) );  } -inline const LLVector4& operator+=(LLVector4 &a, const LLVector4 &b) +inline const LLVector4& operator+=(LLVector4& a, const LLVector4& b)  {      a.mV[VX] += b.mV[VX];      a.mV[VY] += b.mV[VY]; @@ -470,7 +470,7 @@ inline const LLVector4& operator+=(LLVector4 &a, const LLVector4 &b)      return a;  } -inline const LLVector4& operator-=(LLVector4 &a, const LLVector4 &b) +inline const LLVector4& operator-=(LLVector4& a, const LLVector4& b)  {      a.mV[VX] -= b.mV[VX];      a.mV[VY] -= b.mV[VY]; @@ -478,14 +478,14 @@ inline const LLVector4& operator-=(LLVector4 &a, const LLVector4 &b)      return a;  } -inline const LLVector4& operator%=(LLVector4 &a, const LLVector4 &b) +inline const LLVector4& operator%=(LLVector4& a, const LLVector4& b)  {      LLVector4 ret(a.mV[VY]*b.mV[VZ] - b.mV[VY]*a.mV[VZ], a.mV[VZ]*b.mV[VX] - b.mV[VZ]*a.mV[VX], a.mV[VX]*b.mV[VY] - b.mV[VX]*a.mV[VY]);      a = ret;      return a;  } -inline const LLVector4& operator*=(LLVector4 &a, F32 k) +inline const LLVector4& operator*=(LLVector4& a, F32 k)  {      a.mV[VX] *= k;      a.mV[VY] *= k; @@ -493,7 +493,7 @@ inline const LLVector4& operator*=(LLVector4 &a, F32 k)      return a;  } -inline const LLVector4& operator/=(LLVector4 &a, F32 k) +inline const LLVector4& operator/=(LLVector4& a, F32 k)  {      F32 t = 1.f / k;      a.mV[VX] *= t; @@ -502,7 +502,7 @@ inline const LLVector4& operator/=(LLVector4 &a, F32 k)      return a;  } -inline LLVector4 operator-(const LLVector4 &a) +inline LLVector4 operator-(const LLVector4& a)  {      return LLVector4( -a.mV[VX], -a.mV[VY], -a.mV[VZ] );  } @@ -517,19 +517,19 @@ inline LLVector4::operator glm::vec4() const      return glm::make_vec4(mV);  } -inline F32  dist_vec(const LLVector4 &a, const LLVector4 &b) +inline F32  dist_vec(const LLVector4& a, const LLVector4& b)  {      LLVector4 vec = a - b;      return (vec.length());  } -inline F32  dist_vec_squared(const LLVector4 &a, const LLVector4 &b) +inline F32  dist_vec_squared(const LLVector4& a, const LLVector4& b)  {      LLVector4 vec = a - b;      return (vec.lengthSquared());  } -inline LLVector4 lerp(const LLVector4 &a, const LLVector4 &b, F32 u) +inline LLVector4 lerp(const LLVector4& a, const LLVector4& b, F32 u)  {      return LLVector4(          a.mV[VX] + (b.mV[VX] - a.mV[VX]) * u, @@ -538,9 +538,9 @@ inline LLVector4 lerp(const LLVector4 &a, const LLVector4 &b, F32 u)          a.mV[VW] + (b.mV[VW] - a.mV[VW]) * u);  } -inline F32      LLVector4::normalize(void) +inline F32      LLVector4::normalize()  { -    F32 mag = (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]); +    F32 mag = sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);      F32 oomag;      if (mag > FP_MAG_THRESHOLD) @@ -552,18 +552,18 @@ inline F32      LLVector4::normalize(void)      }      else      { -        mV[0] = 0.f; -        mV[1] = 0.f; -        mV[2] = 0.f; -        mag = 0; +        mV[VX] = 0.f; +        mV[VY] = 0.f; +        mV[VZ] = 0.f; +        mag = 0.f;      }      return (mag);  }  // deprecated -inline F32      LLVector4::normVec(void) +inline F32      LLVector4::normVec()  { -    F32 mag = (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]); +    F32 mag = sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);      F32 oomag;      if (mag > FP_MAG_THRESHOLD) @@ -575,22 +575,23 @@ inline F32      LLVector4::normVec(void)      }      else      { -        mV[0] = 0.f; -        mV[1] = 0.f; -        mV[2] = 0.f; -        mag = 0; +        mV[VX] = 0.f; +        mV[VY] = 0.f; +        mV[VZ] = 0.f; +        mag = 0.f;      }      return (mag);  }  // Because apparently some parts of the viewer use this for color info. -inline const LLVector4 srgbVector4(const LLVector4 &a) { +inline const LLVector4 srgbVector4(const LLVector4& a) +{      LLVector4 srgbColor; -    srgbColor.mV[0] = linearTosRGB(a.mV[0]); -    srgbColor.mV[1] = linearTosRGB(a.mV[1]); -    srgbColor.mV[2] = linearTosRGB(a.mV[2]); -    srgbColor.mV[3] = a.mV[3]; +    srgbColor.mV[VX] = linearTosRGB(a.mV[VX]); +    srgbColor.mV[VY] = linearTosRGB(a.mV[VY]); +    srgbColor.mV[VZ] = linearTosRGB(a.mV[VZ]); +    srgbColor.mV[VW] = a.mV[VW];      return srgbColor;  } diff --git a/indra/llmath/xform.h b/indra/llmath/xform.h index 7434301670..fa45fffeae 100644 --- a/indra/llmath/xform.h +++ b/indra/llmath/xform.h @@ -115,7 +115,7 @@ public:      void        clearChanged(U32 bits)                      { mChanged &= ~bits; }      void        setScaleChildOffset(bool scale)             { mScaleChildOffset = scale; } -    bool        getScaleChildOffset()                       { return mScaleChildOffset; } +    bool        getScaleChildOffset() const                 { return mScaleChildOffset; }      LLXform* getParent() const { return mParent; }      LLXform* getRoot() const; diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp index c264a9f086..21dbf35783 100644 --- a/indra/llmessage/message_prehash.cpp +++ b/indra/llmessage/message_prehash.cpp @@ -1402,3 +1402,4 @@ char const* const _PREHASH_HoverHeight = LLMessageStringTable::getInstance()->ge  char const* const _PREHASH_Experience = LLMessageStringTable::getInstance()->getString("Experience");  char const* const _PREHASH_ExperienceID = LLMessageStringTable::getInstance()->getString("ExperienceID");  char const* const _PREHASH_LargeGenericMessage = LLMessageStringTable::getInstance()->getString("LargeGenericMessage"); +char const* const _PREHASH_MetaData = LLMessageStringTable::getInstance()->getString("MetaData"); diff --git a/indra/llmessage/message_prehash.h b/indra/llmessage/message_prehash.h index 1d30b69b67..8a2ad1587c 100644 --- a/indra/llmessage/message_prehash.h +++ b/indra/llmessage/message_prehash.h @@ -1403,5 +1403,6 @@ extern char const* const _PREHASH_HoverHeight;  extern char const* const _PREHASH_Experience;  extern char const* const _PREHASH_ExperienceID;  extern char const* const _PREHASH_LargeGenericMessage; +extern char const* const _PREHASH_MetaData;  #endif diff --git a/indra/llprimitive/object_flags.h b/indra/llprimitive/object_flags.h index e2cdba072a..06e216ba49 100644 --- a/indra/llprimitive/object_flags.h +++ b/indra/llprimitive/object_flags.h @@ -57,16 +57,16 @@ const U32   FLAGS_CAMERA_SOURCE        = (1U << 22);  //const U32 FLAGS_UNUSED_001           = (1U << 23); // was FLAGS_CAST_SHADOWS -//const U32 FLAGS_UNUSED_002           = (1U << 24); -//const U32 FLAGS_UNUSED_003           = (1U << 25); -//const U32 FLAGS_UNUSED_004           = (1U << 26); -//const U32 FLAGS_UNUSED_005           = (1U << 27); +const U32   FLAGS_SERVER_AUTOPILOT     = (1U << 24); // Update was for an agent AND that agent is being autopiloted from the server +//const U32 FLAGS_UNUSED_002           = (1U << 25); +//const U32 FLAGS_UNUSED_003           = (1U << 26); +//const U32 FLAGS_UNUSED_004           = (1U << 27);  const U32   FLAGS_OBJECT_OWNER_MODIFY  = (1U << 28);  const U32   FLAGS_TEMPORARY_ON_REZ     = (1U << 29); -//const U32 FLAGS_UNUSED_006           = (1U << 30); // was FLAGS_TEMPORARY -//const U32 FLAGS_UNUSED_007           = (1U << 31); // was FLAGS_ZLIB_COMPRESSED +//const U32 FLAGS_UNUSED_005           = (1U << 30); // was FLAGS_TEMPORARY +//const U32 FLAGS_UNUSED_006           = (1U << 31); // was FLAGS_ZLIB_COMPRESSED  const U32   FLAGS_LOCAL                = FLAGS_ANIM_SOURCE | FLAGS_CAMERA_SOURCE;  const U32   FLAGS_WORLD                = FLAGS_USE_PHYSICS | FLAGS_PHANTOM | FLAGS_TEMPORARY_ON_REZ; diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index 2d8b8a0fee..41d0a1af31 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -656,7 +656,14 @@ LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, l      LLImageGL *image_gl = mFontBitmapCachep->getImageGL(bitmap_glyph_type, bitmap_num);      LLImageRaw *image_raw = mFontBitmapCachep->getImageRaw(bitmap_glyph_type, bitmap_num); -    image_gl->setSubImage(image_raw, 0, 0, image_gl->getWidth(), image_gl->getHeight()); +    if (image_gl && image_raw) +    { +        image_gl->setSubImage(image_raw, 0, 0, image_gl->getWidth(), image_gl->getHeight()); +    } +    else +    { +        llassert(false); //images were just inserted by nextOpenPos, they shouldn't be missing +    }      return gi;  } @@ -840,7 +847,12 @@ bool LLFontFreetype::setSubImageBGRA(U32 x, U32 y, U32 bitmap_num, U16 width, U1  {      LLImageRaw* image_raw = mFontBitmapCachep->getImageRaw(EFontGlyphType::Color, bitmap_num);      llassert(!mIsFallback); -    llassert(image_raw && (image_raw->getComponents() == 4)); +    if (!image_raw) +    { +        llassert(false); +        return false; +    } +    llassert(image_raw->getComponents() == 4);      // NOTE: inspired by LLImageRaw::setSubImage()      U32* image_data = (U32*)image_raw->getData(); @@ -868,10 +880,17 @@ bool LLFontFreetype::setSubImageBGRA(U32 x, U32 y, U32 bitmap_num, U16 width, U1  void LLFontFreetype::setSubImageLuminanceAlpha(U32 x, U32 y, U32 bitmap_num, U32 width, U32 height, U8 *data, S32 stride) const  {      LLImageRaw *image_raw = mFontBitmapCachep->getImageRaw(EFontGlyphType::Grayscale, bitmap_num); -    LLImageDataLock lock(image_raw);      llassert(!mIsFallback); -    llassert(image_raw && (image_raw->getComponents() == 2)); +    if (!image_raw) +    { +        llassert(false); +        return; +    } + +    LLImageDataLock lock(image_raw); + +    llassert(image_raw->getComponents() == 2);      U8 *target = image_raw->getData();      llassert(target); diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 3b506d6965..70a28a1740 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -1233,28 +1233,9 @@ bool LLGLManager::initGL()      }  #endif -#if LL_WINDOWS -    if (mVRAM < 256) -    { -        // Something likely went wrong using the above extensions -        // try WMI first and fall back to old method (from dxdiag) if all else fails -        // Function will check all GPUs WMI knows of and will pick up the one with most -        // memory. We need to check all GPUs because system can switch active GPU to -        // weaker one, to preserve power when not under load. -        U32 mem = LLDXHardware::getMBVideoMemoryViaWMI(); -        if (mem != 0) -        { -            mVRAM = mem; -            LL_WARNS("RenderInit") << "VRAM Detected (WMI):" << mVRAM<< LL_ENDL; -        } -    } -#endif -      if (mVRAM < 256 && old_vram > 0)      {          // fall back to old method -        // Note: on Windows value will be from LLDXHardware. -        // Either received via dxdiag or via WMI by id from dxdiag.          mVRAM = old_vram;      } diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 3d7bf500f1..e0c2db058a 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -1285,23 +1285,40 @@ S32 LLGLSLShader::disableTexture(S32 uniform, LLTexUnit::eTextureType mode)          llassert(false);          return -1;      } +      S32 index = mTexture[uniform]; -    if (index != -1 && gGL.getTexUnit(index)->getCurrType() != LLTexUnit::TT_NONE) +    if (index < 0) +    { +        // Invalid texture index - nothing to disable +        return index; +    } + +    LLTexUnit* tex_unit = gGL.getTexUnit(index); +    if (!tex_unit)      { -        if (gDebugGL && gGL.getTexUnit(index)->getCurrType() != mode) +        // Invalid texture unit +        LL_WARNS_ONCE("Shader") << "Invalid texture unit at index: " << index << LL_ENDL; +        return index; +    } + +    LLTexUnit::eTextureType curr_type = tex_unit->getCurrType(); +    if (curr_type != LLTexUnit::TT_NONE) +    { +        if (gDebugGL && curr_type != mode)          {              if (gDebugSession)              { -                gFailLog << "Texture channel " << index << " texture type corrupted." << std::endl; +                gFailLog << "Texture channel " << index << " texture type corrupted. Expected: " << mode << ", Found: " << curr_type << std::endl;                  ll_fail("LLGLSLShader::disableTexture failed");              }              else              { -                LL_ERRS() << "Texture channel " << index << " texture type corrupted." << LL_ENDL; +                LL_ERRS() << "Texture channel " << index << " texture type corrupted. Expected: " << mode << ", Found: " << curr_type << LL_ENDL;              }          } -        gGL.getTexUnit(index)->disable(); +        tex_unit->disable();      } +      return index;  } diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h index cf3569683e..3fdcf9f7f2 100644 --- a/indra/llui/llaccordionctrltab.h +++ b/indra/llui/llaccordionctrltab.h @@ -126,7 +126,7 @@ public:      void setSelected(bool is_selected); -    bool getCollapsible() { return mCollapsible; }; +    bool getCollapsible() const { return mCollapsible; };      void setCollapsible(bool collapsible) { mCollapsible = collapsible; };      void changeOpenClose(bool is_open); @@ -181,7 +181,7 @@ public:      void setHeaderVisible(bool value); -    bool getHeaderVisible() { return mHeaderVisible;} +    bool getHeaderVisible() const { return mHeaderVisible;}      S32 mExpandedHeight; // Height of expanded ctrl.                           // Used to restore height after expand. diff --git a/indra/llui/llchatentry.cpp b/indra/llui/llchatentry.cpp index da5afd0386..e8d942b8af 100644 --- a/indra/llui/llchatentry.cpp +++ b/indra/llui/llchatentry.cpp @@ -45,7 +45,8 @@ LLChatEntry::LLChatEntry(const Params& p)      mExpandLinesCount(p.expand_lines_count),      mPrevLinesCount(0),      mSingleLineMode(false), -    mPrevExpandedLineCount(S32_MAX) +    mPrevExpandedLineCount(S32_MAX), +    mCurrentInput("")  {      // Initialize current history line iterator      mCurrentHistoryLine = mLineHistory.begin(); @@ -189,6 +190,7 @@ bool LLChatEntry::handleSpecialKey(const KEY key, const MASK mask)          {              needsReflow();          } +        mCurrentInput = "";          break;      case KEY_UP: @@ -196,6 +198,11 @@ bool LLChatEntry::handleSpecialKey(const KEY key, const MASK mask)          {              if (!mLineHistory.empty() && mCurrentHistoryLine > mLineHistory.begin())              { +                if (mCurrentHistoryLine == mLineHistory.end()) +                { +                    mCurrentInput = getText(); +                } +                  setText(*(--mCurrentHistoryLine));                  endOfDoc();              } @@ -210,16 +217,15 @@ bool LLChatEntry::handleSpecialKey(const KEY key, const MASK mask)      case KEY_DOWN:          if (mHasHistory && MASK_CONTROL == mask)          { -            if (!mLineHistory.empty() && mCurrentHistoryLine < (mLineHistory.end() - 1) ) +            if (!mLineHistory.empty() && mCurrentHistoryLine < (mLineHistory.end() - 1))              {                  setText(*(++mCurrentHistoryLine));                  endOfDoc();              } -            else if (!mLineHistory.empty() && mCurrentHistoryLine == (mLineHistory.end() - 1) ) +            else if (!mLineHistory.empty() && mCurrentHistoryLine == (mLineHistory.end() - 1))              {                  mCurrentHistoryLine++; -                std::string empty(""); -                setText(empty); +                setText(mCurrentInput);                  needsReflow();                  endOfDoc();              } diff --git a/indra/llui/llchatentry.h b/indra/llui/llchatentry.h index 5621ede1e7..9a0e8ee91e 100644 --- a/indra/llui/llchatentry.h +++ b/indra/llui/llchatentry.h @@ -101,6 +101,8 @@ private:      S32                                 mExpandLinesCount;      S32                                 mPrevLinesCount;      S32                                 mPrevExpandedLineCount; + +    std::string                         mCurrentInput;  };  #endif /* LLCHATENTRY_H_ */ diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h index 135f128692..4068741978 100644 --- a/indra/llui/llcheckboxctrl.h +++ b/indra/llui/llcheckboxctrl.h @@ -36,8 +36,8 @@  // Constants  // -const bool  RADIO_STYLE = true; -const bool  CHECK_STYLE = false; +constexpr bool RADIO_STYLE = true; +constexpr bool CHECK_STYLE = false;  //  // Classes @@ -94,7 +94,7 @@ public:      // LLUICtrl interface      virtual void        setValue(const LLSD& value );      virtual LLSD        getValue() const; -            bool        get() { return (bool)getValue().asBoolean(); } +            bool        get() const { return (bool)getValue().asBoolean(); }              void        set(bool value) { setValue(value); }      virtual void        setTentative(bool b); @@ -106,7 +106,7 @@ public:      virtual void        onCommit();      // LLCheckBoxCtrl interface -    virtual bool        toggle()                { return mButton->toggleState(); }      // returns new state +    virtual bool        toggle() { return mButton->toggleState(); }      // returns new state      void                setBtnFocus() { mButton->setFocus(true); } diff --git a/indra/llui/llcontainerview.h b/indra/llui/llcontainerview.h index c6dd401e85..2675d21c22 100644 --- a/indra/llui/llcontainerview.h +++ b/indra/llui/llcontainerview.h @@ -65,21 +65,21 @@ protected:  public:      ~LLContainerView(); -    /*virtual*/ bool postBuild(); -    /*virtual*/ bool addChild(LLView* view, S32 tab_group = 0); +    bool postBuild() override; +    bool addChild(LLView* view, S32 tab_group = 0) override; -    /*virtual*/ bool handleDoubleClick(S32 x, S32 y, MASK mask); -    /*virtual*/ bool handleMouseDown(S32 x, S32 y, MASK mask); -    /*virtual*/ bool handleMouseUp(S32 x, S32 y, MASK mask); +    bool handleDoubleClick(S32 x, S32 y, MASK mask) override; +    bool handleMouseDown(S32 x, S32 y, MASK mask) override; +    bool handleMouseUp(S32 x, S32 y, MASK mask) override; -    /*virtual*/ void draw(); -    /*virtual*/ void reshape(S32 width, S32 height, bool called_from_parent = true); -    /*virtual*/ LLRect getRequiredRect();   // Return the height of this object, given the set options. +    void draw() override; +    void reshape(S32 width, S32 height, bool called_from_parent = true) override; +    LLRect getRequiredRect() override;   // Return the height of this object, given the set options.      void setLabel(const std::string& label);      void showLabel(bool show) { mShowLabel = show; }      void setDisplayChildren(bool displayChildren); -    bool getDisplayChildren() { return mDisplayChildren; } +    bool getDisplayChildren() const { return mDisplayChildren; }      void setScrollContainer(LLScrollContainer* scroll) {mScrollContainer = scroll;}   private: diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h index 3effc977db..9c516e23a4 100644 --- a/indra/llui/lldockablefloater.h +++ b/indra/llui/lldockablefloater.h @@ -112,8 +112,8 @@ public:      virtual bool overlapsScreenChannel() { return mOverlapsScreenChannel && getVisible() && isDocked(); }      virtual void setOverlapsScreenChannel(bool overlaps) { mOverlapsScreenChannel = overlaps; } -    bool getUniqueDocking() { return mUniqueDocking;    } -    bool getUseTongue() { return mUseTongue; } +    bool getUniqueDocking() const { return mUniqueDocking;    } +    bool getUseTongue() const { return mUseTongue; }      void setUseTongue(bool use_tongue) { mUseTongue = use_tongue;}  private: diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp index 11dbad8c09..1a00c03856 100644 --- a/indra/llui/lldockcontrol.cpp +++ b/indra/llui/lldockcontrol.cpp @@ -156,7 +156,7 @@ void LLDockControl::repositionDockable()      }  } -bool LLDockControl::isDockVisible() +bool LLDockControl::isDockVisible() const  {      bool res = true; diff --git a/indra/llui/lldockcontrol.h b/indra/llui/lldockcontrol.h index 7e31330713..b6ac9c19dd 100644 --- a/indra/llui/lldockcontrol.h +++ b/indra/llui/lldockcontrol.h @@ -61,19 +61,19 @@ public:      void off();      void forceRecalculatePosition();      void setDock(LLView* dockWidget); -    LLView* getDock() +    LLView* getDock() const      {          return mDockWidgetHandle.get();      }      void repositionDockable();      void drawToungue(); -    bool isDockVisible(); +    bool isDockVisible() const;      // gets a rect that bounds possible positions for a dockable control (EXT-1111)      void getAllowedRect(LLRect& rect); -    S32 getTongueWidth() { return mDockTongue->getWidth(); } -    S32 getTongueHeight() { return mDockTongue->getHeight(); } +    S32 getTongueWidth() const { return mDockTongue->getWidth(); } +    S32 getTongueHeight() const { return mDockTongue->getHeight(); }  private:      virtual void moveDockable(); diff --git a/indra/llui/lldraghandle.h b/indra/llui/lldraghandle.h index a522e63243..73211d5292 100644 --- a/indra/llui/lldraghandle.h +++ b/indra/llui/lldraghandle.h @@ -66,7 +66,7 @@ public:      void            setMaxTitleWidth(S32 max_width) {mMaxTitleWidth = llmin(max_width, mMaxTitleWidth); }      S32             getMaxTitleWidth() const { return mMaxTitleWidth; }      void            setButtonsRect(const LLRect& rect){ mButtonsRect = rect; } -    LLRect          getButtonsRect() { return mButtonsRect; } +    LLRect          getButtonsRect() const { return mButtonsRect; }      void            setTitleVisible(bool visible);      virtual void    setTitle( const std::string& title ) = 0; diff --git a/indra/llui/llemojihelper.cpp b/indra/llui/llemojihelper.cpp index b9441a9c91..b2c59ce775 100644 --- a/indra/llui/llemojihelper.cpp +++ b/indra/llui/llemojihelper.cpp @@ -99,6 +99,7 @@ void LLEmojiHelper::showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, c          LLFloater* pHelperFloater = LLFloaterReg::getInstance(DEFAULT_EMOJI_HELPER_FLOATER);          mHelperHandle = pHelperFloater->getHandle();          mHelperCommitConn = pHelperFloater->setCommitCallback(std::bind([&](const LLSD& sdValue) { onCommitEmoji(utf8str_to_wstring(sdValue.asStringRef())[0]); }, std::placeholders::_2)); +        mHelperCloseConn = pHelperFloater->setCloseCallback([this](LLUICtrl* ctrl, const LLSD& param) { onCloseHelper(ctrl, param); });      }      setHostCtrl(hostctrl_p);      mEmojiCommitCb = cb; @@ -148,6 +149,16 @@ void LLEmojiHelper::onCommitEmoji(llwchar emoji)      }  } +void LLEmojiHelper::onCloseHelper(LLUICtrl* ctrl, const LLSD& param) +{ +    mCloseSignal(ctrl, param); +} + +boost::signals2::connection LLEmojiHelper::setCloseCallback(const commit_signal_t::slot_type& cb) +{ +    return mCloseSignal.connect(cb); +} +  void LLEmojiHelper::setHostCtrl(LLUICtrl* hostctrl_p)  {      const LLUICtrl* pCurHostCtrl = mHostHandle.get(); diff --git a/indra/llui/llemojihelper.h b/indra/llui/llemojihelper.h index 2834b06061..26840eef94 100644 --- a/indra/llui/llemojihelper.h +++ b/indra/llui/llemojihelper.h @@ -51,16 +51,23 @@ public:      // Eventing      bool handleKey(const LLUICtrl* ctrl_p, KEY key, MASK mask);      void onCommitEmoji(llwchar emoji); +    void onCloseHelper(LLUICtrl* ctrl, const LLSD& param); + +    typedef boost::signals2::signal<void(LLUICtrl* ctrl, const LLSD& param)> commit_signal_t; +    boost::signals2::connection setCloseCallback(const commit_signal_t::slot_type& cb);  protected:      LLUICtrl* getHostCtrl() const { return mHostHandle.get(); }      void      setHostCtrl(LLUICtrl* hostctrl_p);  private: +    commit_signal_t mCloseSignal; +      LLHandle<LLUICtrl>  mHostHandle;      LLHandle<LLFloater> mHelperHandle;      boost::signals2::connection mHostCtrlFocusLostConn;      boost::signals2::connection mHelperCommitConn; +    boost::signals2::connection mHelperCloseConn;      std::function<void(llwchar)> mEmojiCommitCb;      bool mIsHideDisabled;  }; diff --git a/indra/llui/llfiltereditor.h b/indra/llui/llfiltereditor.h index 686827d94c..685219c9f6 100644 --- a/indra/llui/llfiltereditor.h +++ b/indra/llui/llfiltereditor.h @@ -49,7 +49,7 @@ protected:      LLFilterEditor(const Params&);      friend class LLUICtrlFactory; -    /*virtual*/ void handleKeystroke(); +    void handleKeystroke() override;  };  #endif  // LL_FILTEREDITOR_H diff --git a/indra/llui/llflashtimer.cpp b/indra/llui/llflashtimer.cpp index c3db24c987..54f54653e2 100644 --- a/indra/llui/llflashtimer.cpp +++ b/indra/llui/llflashtimer.cpp @@ -85,12 +85,12 @@ void LLFlashTimer::stopFlashing()      mCurrentTickCount = 0;  } -bool LLFlashTimer::isFlashingInProgress() +bool LLFlashTimer::isFlashingInProgress() const  {      return mIsFlashingInProgress;  } -bool LLFlashTimer::isCurrentlyHighlighted() +bool LLFlashTimer::isCurrentlyHighlighted() const  {      return mIsCurrentlyHighlighted;  } diff --git a/indra/llui/llflashtimer.h b/indra/llui/llflashtimer.h index b55ce53fc0..4ef70faf2d 100644 --- a/indra/llui/llflashtimer.h +++ b/indra/llui/llflashtimer.h @@ -51,8 +51,8 @@ public:      void startFlashing();      void stopFlashing(); -    bool isFlashingInProgress(); -    bool isCurrentlyHighlighted(); +    bool isFlashingInProgress() const; +    bool isCurrentlyHighlighted() const;      /*       * Use this instead of deleting this object.       * The next call to tick() will return true and that will destroy this object. diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp index 53f39766c6..b8c833f4fd 100644 --- a/indra/llui/llflatlistview.cpp +++ b/indra/llui/llflatlistview.cpp @@ -1337,7 +1337,7 @@ void LLFlatListViewEx::updateNoItemsMessage(const std::string& filter_string)      }  } -bool LLFlatListViewEx::getForceShowingUnmatchedItems() +bool LLFlatListViewEx::getForceShowingUnmatchedItems() const  {      return mForceShowingUnmatchedItems;  } diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h index 6d75e9f282..0ea3115f30 100644 --- a/indra/llui/llflatlistview.h +++ b/indra/llui/llflatlistview.h @@ -113,7 +113,7 @@ public:      };      // disable traversal when finding widget to hand focus off to -    /*virtual*/ bool canFocusChildren() const { return false; } +    /*virtual*/ bool canFocusChildren() const override { return false; }      /**       * Connects callback to signal called when Return key is pressed. @@ -121,15 +121,15 @@ public:      boost::signals2::connection setReturnCallback( const commit_signal_t::slot_type& cb ) { return mOnReturnSignal.connect(cb); }      /** Overridden LLPanel's reshape, height is ignored, the list sets its height to accommodate all items */ -    virtual void reshape(S32 width, S32 height, bool called_from_parent  = true); +    virtual void reshape(S32 width, S32 height, bool called_from_parent  = true) override;      /** Returns full rect of child panel */      const LLRect& getItemsRect() const; -    LLRect getRequiredRect() { return getItemsRect(); } +    LLRect getRequiredRect() override { return getItemsRect(); }      /** Returns distance between items */ -    const S32 getItemsPad() { return mItemPad; } +    const S32 getItemsPad() const { return mItemPad; }      /**       * Adds and item and LLSD value associated with it to the list at specified position @@ -264,13 +264,13 @@ public:      void setCommitOnSelectionChange(bool b)     { mCommitOnSelectionChange = b; }      /** Get number of selected items in the list */ -    U32 numSelected() const {return static_cast<U32>(mSelectedItemPairs.size()); } +    U32 numSelected() const { return static_cast<U32>(mSelectedItemPairs.size()); }      /** Get number of (visible) items in the list */      U32 size(const bool only_visible_items = true) const;      /** Removes all items from the list */ -    virtual void clear(); +    virtual void clear() override;      /**       * Removes all items that can be detached from the list but doesn't destroy @@ -294,10 +294,10 @@ public:      void scrollToShowFirstSelectedItem(); -    void selectFirstItem    (); -    void selectLastItem     (); +    void selectFirstItem(); +    void selectLastItem(); -    virtual S32 notify(const LLSD& info) ; +    virtual S32 notify(const LLSD& info) override;      virtual ~LLFlatListView(); @@ -346,8 +346,8 @@ protected:      virtual bool selectNextItemPair(bool is_up_direction, bool reset_selection); -    virtual bool canSelectAll() const; -    virtual void selectAll(); +    virtual bool canSelectAll() const override; +    virtual void selectAll() override;      virtual bool isSelected(item_pair_t* item_pair) const; @@ -364,15 +364,15 @@ protected:       */      void notifyParentItemsRectChanged(); -    virtual bool handleKeyHere(KEY key, MASK mask); +    virtual bool handleKeyHere(KEY key, MASK mask) override; -    virtual bool postBuild(); +    virtual bool postBuild() override; -    virtual void onFocusReceived(); +    virtual void onFocusReceived() override; -    virtual void onFocusLost(); +    virtual void onFocusLost() override; -    virtual void draw(); +    virtual void draw() override;      LLRect getLastSelectedItemRect(); @@ -478,7 +478,7 @@ public:      void setNoItemsMsg(const std::string& msg) { mNoItemsMsg = msg; }      void setNoFilteredItemsMsg(const std::string& msg) { mNoFilteredItemsMsg = msg; } -    bool getForceShowingUnmatchedItems(); +    bool getForceShowingUnmatchedItems() const;      void setForceShowingUnmatchedItems(bool show); @@ -486,7 +486,7 @@ public:       * Sets up new filter string and filters the list.       */      void setFilterSubString(const std::string& filter_str, bool notify_parent); -    std::string getFilterSubString() { return mFilterSubString; } +    std::string getFilterSubString() const { return mFilterSubString; }      /**       * Filters the list, rearranges and notifies parent about shape changes. diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 4b904f09e0..fd07b2ec5d 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -2165,7 +2165,7 @@ void LLFloater::setCanDrag(bool can_drag)      }  } -bool LLFloater::getCanDrag() +bool LLFloater::getCanDrag() const  {      return mDragHandle->getEnabled();  } diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 9be2240f6f..9e1594bdd2 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -46,24 +46,24 @@ class LLMultiFloater;  class LLFloater; -const bool RESIZE_YES = true; -const bool RESIZE_NO = false; +constexpr bool RESIZE_YES = true; +constexpr bool RESIZE_NO = false; -const bool DRAG_ON_TOP = false; -const bool DRAG_ON_LEFT = true; +constexpr bool DRAG_ON_TOP = false; +constexpr bool DRAG_ON_LEFT = true; -const bool MINIMIZE_YES = true; -const bool MINIMIZE_NO = false; +constexpr bool MINIMIZE_YES = true; +constexpr bool MINIMIZE_NO = false; -const bool CLOSE_YES = true; -const bool CLOSE_NO = false; +constexpr bool CLOSE_YES = true; +constexpr bool CLOSE_NO = false; -const bool ADJUST_VERTICAL_YES = true; -const bool ADJUST_VERTICAL_NO = false; +constexpr bool ADJUST_VERTICAL_YES = true; +constexpr bool ADJUST_VERTICAL_NO = false; -const F32 CONTEXT_CONE_IN_ALPHA = 0.f; -const F32 CONTEXT_CONE_OUT_ALPHA = 1.f; -const F32 CONTEXT_CONE_FADE_TIME = .08f; +constexpr F32 CONTEXT_CONE_IN_ALPHA = 0.f; +constexpr F32 CONTEXT_CONE_OUT_ALPHA = 1.f; +constexpr F32 CONTEXT_CONE_FADE_TIME = .08f;  namespace LLFloaterEnums  { @@ -228,7 +228,7 @@ public:      /*virtual*/ void setIsChrome(bool is_chrome);      /*virtual*/ void setRect(const LLRect &rect);                  void setIsSingleInstance(bool is_single_instance); -                bool getIsSingleInstance() { return mSingleInstance; } +                bool getIsSingleInstance() const { return mSingleInstance; }      void            initFloater(const Params& p); @@ -274,17 +274,17 @@ public:      static bool     isShown(const LLFloater* floater);      static bool     isVisible(const LLFloater* floater);      static bool     isMinimized(const LLFloater* floater); -    bool            isFirstLook() { return mFirstLook; } // EXT-2653: This function is necessary to prevent overlapping for secondary showed toasts +    bool            isFirstLook() const { return mFirstLook; } // EXT-2653: This function is necessary to prevent overlapping for secondary showed toasts      virtual bool    isFrontmost(); -    bool            isDependent()                   { return !mDependeeHandle.isDead(); } +    bool            isDependent() const { return !mDependeeHandle.isDead(); }      void            setCanMinimize(bool can_minimize);      void            setCanClose(bool can_close);      void            setCanTearOff(bool can_tear_off);      virtual void    setCanResize(bool can_resize);      void            setCanDrag(bool can_drag); -    bool            getCanDrag(); +    bool            getCanDrag() const;      void            setHost(LLMultiFloater* host); -    bool            isResizable() const             { return mResizable; } +    bool            isResizable() const { return mResizable; }      void            setResizeLimits( S32 min_width, S32 min_height );      void            getResizeLimits( S32* min_width, S32* min_height ) { *min_width = mMinWidth; *min_height = mMinHeight; } @@ -347,7 +347,7 @@ public:      virtual void    setDocked(bool docked, bool pop_on_undock = true);      virtual void    setTornOff(bool torn_off) { mTornOff = torn_off; } -    bool isTornOff() {return mTornOff;} +    bool isTornOff() const { return mTornOff; }      void setOpenPositioning(LLFloaterEnums::EOpenPositioning pos) {mPositioning = pos;} @@ -377,6 +377,10 @@ public:      void            enableResizeCtrls(bool enable, bool width = true, bool height = true);      bool            isPositioning(LLFloaterEnums::EOpenPositioning p) const { return (p == mPositioning); } + +    void            setAutoFocus(bool focus) { mAutoFocus = focus; } // whether to automatically take focus when opened +    bool            getAutoFocus() const { return mAutoFocus; } +  protected:      void            applyControlsAndPosition(LLFloater* other); @@ -401,8 +405,6 @@ protected:      void            setExpandedRect(const LLRect& rect) { mExpandedRect = rect; } // size when not minimized      const LLRect&   getExpandedRect() const { return mExpandedRect; } -    void            setAutoFocus(bool focus) { mAutoFocus = focus; } // whether to automatically take focus when opened -    bool            getAutoFocus() const { return mAutoFocus; }      LLDragHandle*   getDragHandle() const { return mDragHandle; }      void            destroy(); // Don't call this directly.  You probably want to call closeFloater() @@ -423,7 +425,6 @@ protected:  private:      void            setForeground(bool b);  // called only by floaterview      void            cleanupHandles(); // remove handles to dead floaters -    void            createMinimizeButton();      void            buildButtons(const Params& p);      // Images and tooltips are named in the XML, but we want to look them diff --git a/indra/llui/llfloaterreglistener.h b/indra/llui/llfloaterreglistener.h index a36072892c..28f6e7c66b 100644 --- a/indra/llui/llfloaterreglistener.h +++ b/indra/llui/llfloaterreglistener.h @@ -30,7 +30,6 @@  #define LL_LLFLOATERREGLISTENER_H  #include "lleventapi.h" -#include <string>  class LLSD; diff --git a/indra/llui/llflyoutbutton.h b/indra/llui/llflyoutbutton.h index 7a49501318..73190fc984 100644 --- a/indra/llui/llflyoutbutton.h +++ b/indra/llui/llflyoutbutton.h @@ -54,7 +54,7 @@ protected:      LLFlyoutButton(const Params&);      friend class LLUICtrlFactory;  public: -    virtual void    draw(); +    void draw() override;      void setToggleState(bool state); diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h index 1fa0ac137e..89fee5c9f1 100644 --- a/indra/llui/llfocusmgr.h +++ b/indra/llui/llfocusmgr.h @@ -97,7 +97,7 @@ public:      LLFocusableElement*     getLastKeyboardFocus() const { return mLastKeyboardFocus; }      bool            childHasKeyboardFocus( const LLView* parent ) const;      void            removeKeyboardFocusWithoutCallback( const LLFocusableElement* focus ); -    bool            getKeystrokesOnly() { return mKeystrokesOnly; } +    bool            getKeystrokesOnly() const { return mKeystrokesOnly; }      void            setKeystrokesOnly(bool keystrokes_only) { mKeystrokesOnly = keystrokes_only; }      F32             getFocusFlashAmt() const; diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h index 7ed10d9223..bdce9dec54 100644 --- a/indra/llui/llfolderview.h +++ b/indra/llui/llfolderview.h @@ -124,11 +124,11 @@ public:      void setSelectCallback(const signal_t::slot_type& cb) { mSelectSignal.connect(cb); }      void setReshapeCallback(const signal_t::slot_type& cb) { mReshapeSignal.connect(cb); } -    bool getAllowMultiSelect() { return mAllowMultiSelect; } -    bool getAllowDrag() { return mAllowDrag; } +    bool getAllowMultiSelect() const { return mAllowMultiSelect; } +    bool getAllowDrag() const { return mAllowDrag; }      void setSingleFolderMode(bool is_single_mode) { mSingleFolderMode = is_single_mode; } -    bool isSingleFolderMode() { return mSingleFolderMode; } +    bool isSingleFolderMode() const { return mSingleFolderMode; }      // Close all folders in the view      void closeAllFolders(); @@ -142,7 +142,7 @@ public:      virtual S32 getItemHeight() const;      void arrangeAll() { mArrangeGeneration++; } -    S32 getArrangeGeneration() { return mArrangeGeneration; } +    S32 getArrangeGeneration() const { return mArrangeGeneration; }      // applies filters to control visibility of items      virtual void filter( LLFolderViewFilter& filter); @@ -227,27 +227,27 @@ public:      void setShowSelectionContext(bool show) { mShowSelectionContext = show; }      bool getShowSelectionContext();      void setShowSingleSelection(bool show); -    bool getShowSingleSelection() { return mShowSingleSelection; } -    F32  getSelectionFadeElapsedTime() { return mMultiSelectionFadeTimer.getElapsedTimeF32(); } -    bool getUseEllipses() { return mUseEllipses; } -    S32 getSelectedCount() { return (S32)mSelectedItems.size(); } +    bool getShowSingleSelection() const { return mShowSingleSelection; } +    F32  getSelectionFadeElapsedTime() const { return mMultiSelectionFadeTimer.getElapsedTimeF32(); } +    bool getUseEllipses() const { return mUseEllipses; } +    S32 getSelectedCount() const { return (S32)mSelectedItems.size(); } -    void    update();                       // needs to be called periodically (e.g. once per frame) +    void update(); // needs to be called periodically (e.g. once per frame) -    bool needsAutoSelect() { return mNeedsAutoSelect && !mAutoSelectOverride; } -    bool needsAutoRename() { return mNeedsAutoRename; } +    bool needsAutoSelect() const { return mNeedsAutoSelect && !mAutoSelectOverride; } +    bool needsAutoRename() const { return mNeedsAutoRename; }      void setNeedsAutoRename(bool val) { mNeedsAutoRename = val; }      void setPinningSelectedItem(bool val) { mPinningSelectedItem = val; }      void setAutoSelectOverride(bool val) { mAutoSelectOverride = val; } -    bool showItemLinkOverlays() { return mShowItemLinkOverlays; } +    bool showItemLinkOverlays() const { return mShowItemLinkOverlays; }      void setCallbackRegistrar(LLUICtrl::CommitCallbackRegistry::ScopedRegistrar* registrar) { mCallbackRegistrar = registrar; }      void setEnableRegistrar(LLUICtrl::EnableCallbackRegistry::ScopedRegistrar* registrar) { mEnableRegistrar = registrar; }      void setForceArrange(bool force) { mForceArrange = force; } -    LLPanel* getParentPanel() { return mParentPanel.get(); } +    LLPanel* getParentPanel() const { return mParentPanel.get(); }      // DEBUG only      void dumpSelectionInformation(); @@ -255,7 +255,7 @@ public:      void setShowEmptyMessage(bool show_msg) { mShowEmptyMessage = show_msg; } -    bool useLabelSuffix() { return mUseLabelSuffix; } +    bool useLabelSuffix() const { return mUseLabelSuffix; }      virtual void updateMenu();      void finishRenamingItem( void ); @@ -391,7 +391,7 @@ public:      virtual ~LLSelectFirstFilteredItem() {}      virtual void doFolder(LLFolderViewFolder* folder);      virtual void doItem(LLFolderViewItem* item); -    bool wasItemSelected() { return mItemSelected || mFolderSelected; } +    bool wasItemSelected() const { return mItemSelected || mFolderSelected; }  protected:      bool mItemSelected;      bool mFolderSelected; diff --git a/indra/llui/llfolderviewitem.h b/indra/llui/llfolderviewitem.h index cc8a7d934c..234d0dc7f9 100644 --- a/indra/llui/llfolderviewitem.h +++ b/indra/llui/llfolderviewitem.h @@ -282,7 +282,7 @@ public:      // Does not need filter update      virtual void refreshSuffix(); -    bool isSingleFolderMode() { return mSingleFolderMode; } +    bool isSingleFolderMode() const { return mSingleFolderMode; }      // LLView functionality      virtual bool handleRightMouseDown( S32 x, S32 y, MASK mask ); @@ -415,9 +415,6 @@ public:      // doesn't delete it.      virtual void extractItem( LLFolderViewItem* item, bool deparent_model = true); -    // This function is called by a child that needs to be resorted. -    void resort(LLFolderViewItem* item); -      void setAutoOpenCountdown(F32 countdown) { mAutoOpenCountdown = countdown; }      // folders can be opened. This will usually be called by internal diff --git a/indra/llui/llkeywords.cpp b/indra/llui/llkeywords.cpp index 7bf43c22c1..2bea8fb4ed 100644 --- a/indra/llui/llkeywords.cpp +++ b/indra/llui/llkeywords.cpp @@ -170,7 +170,7 @@ std::string LLKeywords::getAttribute(std::string_view key)      return (it != mAttributes.end()) ? it->second : "";  } -LLUIColor LLKeywords::getColorGroup(std::string_view key_in) +LLUIColor LLKeywords::getColorGroup(std::string_view key_in) const  {      std::string color_group = "ScriptText";      if (key_in == "functions") diff --git a/indra/llui/llkeywords.h b/indra/llui/llkeywords.h index 328561c92a..5892238593 100644 --- a/indra/llui/llkeywords.h +++ b/indra/llui/llkeywords.h @@ -111,8 +111,8 @@ public:      ~LLKeywords();      void        clearLoaded() { mLoaded = false; } -    LLUIColor    getColorGroup(std::string_view key_in); -    bool        isLoaded() const    { return mLoaded; } +    LLUIColor    getColorGroup(std::string_view key_in) const; +    bool        isLoaded() const { return mLoaded; }      void        findSegments(std::vector<LLTextSegmentPtr> *seg_list,                               const LLWString& text, diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index 1c59938f90..fe0591ce4b 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -36,8 +36,8 @@  #include "lliconctrl.h"  #include "boost/foreach.hpp" -static const F32 MIN_FRACTIONAL_SIZE = 0.00001f; -static const F32 MAX_FRACTIONAL_SIZE = 1.f; +static constexpr F32 MIN_FRACTIONAL_SIZE = 0.00001f; +static constexpr F32 MAX_FRACTIONAL_SIZE = 1.f;  static LLDefaultChildRegistry::Register<LLLayoutStack> register_layout_stack("layout_stack");  static LLLayoutStack::LayoutStackRegistry::Register<LLLayoutPanel> register_layout_panel("layout_panel"); diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index 8459921c60..9e3536aaff 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -75,9 +75,6 @@ public:      /*virtual*/ bool addChild(LLView* child, S32 tab_group = 0);      /*virtual*/ void reshape(S32 width, S32 height, bool called_from_parent = true); - -    static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr output_node = NULL); -      typedef enum e_animate      {          NO_ANIMATE, @@ -86,7 +83,7 @@ public:      void addPanel(LLLayoutPanel* panel, EAnimate animate = NO_ANIMATE);      void collapsePanel(LLPanel* panel, bool collapsed = true); -    S32 getNumPanels() { return static_cast<S32>(mPanels.size()); } +    S32 getNumPanels() const { return static_cast<S32>(mPanels.size()); }      void updateLayout(); @@ -190,7 +187,6 @@ public:      bool isCollapsed() const { return mCollapsed;}      void setOrientation(LLView::EOrientation orientation); -    void storeOriginalDim();      void setIgnoreReshape(bool ignore) { mIgnoreReshape = ignore; } diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 66b274c33f..45dab88e87 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -2505,9 +2505,24 @@ void LLLineEditor::resetPreedit()      if (hasPreeditString())      {          const S32 preedit_pos = mPreeditPositions.front(); -        mText.erase(preedit_pos, mPreeditPositions.back() - preedit_pos); -        mText.insert(preedit_pos, mPreeditOverwrittenWString); -        setCursor(preedit_pos); +        const S32 end = mPreeditPositions.back(); +        const S32 len = end - preedit_pos; +        const S32 size = mText.length(); +        if (preedit_pos < size +            && end <= size +            && preedit_pos >= 0 +            && len > 0) +        { +            mText.erase(preedit_pos, len); +            mText.insert(preedit_pos, mPreeditOverwrittenWString); +            setCursor(preedit_pos); +        } +        else +        { +            LL_WARNS() << "Index out of bounds. Start: " << preedit_pos +                << ", end:" << end +                << ", full string length: " << size << LL_ENDL; +        }          mPreeditWString.clear();          mPreeditOverwrittenWString.clear(); diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 12fe800acb..7533f76f1d 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -306,8 +306,6 @@ public:      S32             calcCursorPos(S32 mouse_x);      bool            handleSpecialKey(KEY key, MASK mask);      bool            handleSelectionKey(KEY key, MASK mask); -    bool            handleControlKey(KEY key, MASK mask); -    S32             handleCommitKey(KEY key, MASK mask);      void            updateTextPadding();      // Draw the background image depending on enabled/focused state. @@ -444,7 +442,7 @@ private:              mText = ed->getText();          } -        void doRollback( LLLineEditor* ed ) +        void doRollback(LLLineEditor* ed) const          {              ed->mCursorPos = mCursorPos;              ed->mScrollHPos = mScrollHPos; @@ -455,7 +453,7 @@ private:              ed->mPrevText = mText;          } -        std::string getText()   { return mText; } +        std::string getText() const { return mText; }      private:          std::string mText; diff --git a/indra/llui/llmenubutton.h b/indra/llui/llmenubutton.h index a77ae7dae7..3f96b28246 100644 --- a/indra/llui/llmenubutton.h +++ b/indra/llui/llmenubutton.h @@ -65,8 +65,8 @@ public:      boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb ); -    /*virtual*/ bool handleMouseDown(S32 x, S32 y, MASK mask); -    /*virtual*/ bool handleKeyHere(KEY key, MASK mask ); +    bool handleMouseDown(S32 x, S32 y, MASK mask) override; +    bool handleKeyHere(KEY key, MASK mask) override;      void hideMenu(); diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 66f84393fe..ff9456acc6 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -439,8 +439,6 @@ protected:  public:      virtual ~LLMenuGL( void ); -    void parseChildXML(LLXMLNodePtr child, LLView* parent); -      // LLView Functionality      /*virtual*/ bool handleUnicodeCharHere( llwchar uni_char );      /*virtual*/ bool handleHover( S32 x, S32 y, MASK mask ); diff --git a/indra/llui/llmultifloater.cpp b/indra/llui/llmultifloater.cpp index a7f9b8b2d9..f53e22c349 100644 --- a/indra/llui/llmultifloater.cpp +++ b/indra/llui/llmultifloater.cpp @@ -390,7 +390,7 @@ LLFloater* LLMultiFloater::getActiveFloater()      return (LLFloater*)mTabContainer->getCurrentPanel();  } -S32 LLMultiFloater::getFloaterCount() +S32 LLMultiFloater::getFloaterCount() const  {      return mTabContainer->getTabCount();  } diff --git a/indra/llui/llmultifloater.h b/indra/llui/llmultifloater.h index eb0f917695..e0cd58aa3f 100644 --- a/indra/llui/llmultifloater.h +++ b/indra/llui/llmultifloater.h @@ -66,7 +66,7 @@ public:      virtual LLFloater*  getActiveFloater();      virtual bool        isFloaterFlashing(LLFloater* floaterp); -    virtual S32         getFloaterCount(); +    virtual S32         getFloaterCount() const;      virtual void setFloaterFlashing(LLFloater* floaterp, bool flashing);      virtual bool closeAllFloaters();    //Returns false if the floater could not be closed due to pending confirmation dialogs diff --git a/indra/llui/llmultislider.h b/indra/llui/llmultislider.h index b2bfc8bc84..af255bcc8f 100644 --- a/indra/llui/llmultislider.h +++ b/indra/llui/llmultislider.h @@ -117,10 +117,10 @@ public:      /*virtual*/ void    onMouseLeave(S32 x, S32 y, MASK mask) override;      /*virtual*/ void    draw() override; -    S32             getMaxNumSliders() { return mMaxNumSliders; } -    S32             getCurNumSliders() { return static_cast<S32>(mValue.size()); } -    F32             getOverlapThreshold() { return mOverlapThreshold; } -    bool            canAddSliders() { return mValue.size() < mMaxNumSliders; } +    S32             getMaxNumSliders() const { return mMaxNumSliders; } +    S32             getCurNumSliders() const { return static_cast<S32>(mValue.size()); } +    F32             getOverlapThreshold() const { return mOverlapThreshold; } +    bool            canAddSliders() const { return mValue.size() < mMaxNumSliders; }  protected: diff --git a/indra/llui/llmultisliderctrl.h b/indra/llui/llmultisliderctrl.h index dec6cb48b9..2c2bc5e4d9 100644 --- a/indra/llui/llmultisliderctrl.h +++ b/indra/llui/llmultisliderctrl.h @@ -124,10 +124,10 @@ public:      F32             getMinValue() const { return mMultiSlider->getMinValue(); }      F32             getMaxValue() const { return mMultiSlider->getMaxValue(); } -    S32             getMaxNumSliders() { return mMultiSlider->getMaxNumSliders(); } -    S32             getCurNumSliders() { return mMultiSlider->getCurNumSliders(); } -    F32             getOverlapThreshold() { return mMultiSlider->getOverlapThreshold(); } -    bool            canAddSliders() { return mMultiSlider->canAddSliders(); } +    S32             getMaxNumSliders() const { return mMultiSlider->getMaxNumSliders(); } +    S32             getCurNumSliders() const { return mMultiSlider->getCurNumSliders(); } +    F32             getOverlapThreshold() const { return mMultiSlider->getOverlapThreshold(); } +    bool            canAddSliders() const { return mMultiSlider->canAddSliders(); }      void            setLabel(const std::string& label)              { if (mLabelBox) mLabelBox->setText(label); }      void            setLabelColor(const LLUIColor& c)            { mTextEnabledColor = c; } @@ -147,7 +147,6 @@ public:      static void     onEditorCommit(LLUICtrl* ctrl, const LLSD& userdata);      static void     onEditorGainFocus(LLFocusableElement* caller, void *userdata); -    static void     onEditorChangeFocus(LLUICtrl* caller, S32 direction, void *userdata);  private:      void            updateText(); diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index 138f1969d5..3c8e1e85fa 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -247,7 +247,6 @@ public:      LLNotificationForm(const LLSD& sd);      LLNotificationForm(const std::string& name, const Params& p); -    void fromLLSD(const LLSD& sd);      LLSD asLLSD() const;      S32 getNumElements() { return static_cast<S32>(mFormData.size()); } @@ -266,8 +265,8 @@ public:      bool getIgnored();      void setIgnored(bool ignored); -    EIgnoreType getIgnoreType() { return mIgnore; } -    std::string getIgnoreMessage() { return mIgnoreMsg; } +    EIgnoreType getIgnoreType()const { return mIgnore; } +    std::string getIgnoreMessage() const { return mIgnoreMsg; }  private:      LLSD                                mFormData; @@ -971,8 +970,6 @@ private:      /*virtual*/ void initSingleton() override;      /*virtual*/ void cleanupSingleton() override; -    void loadPersistentNotifications(); -      bool expirationFilter(LLNotificationPtr pNotification);      bool expirationHandler(const LLSD& payload);      bool uniqueFilter(LLNotificationPtr pNotification); diff --git a/indra/llui/llprogressbar.h b/indra/llui/llprogressbar.h index 0d5d32cf21..7245bbf1cf 100644 --- a/indra/llui/llprogressbar.h +++ b/indra/llui/llprogressbar.h @@ -48,9 +48,9 @@ public:      LLProgressBar(const Params&);      virtual ~LLProgressBar(); -    void setValue(const LLSD& value); +    void setValue(const LLSD& value) override; -    /*virtual*/ void draw(); +    void draw() override;  private:      F32 mPercentDone; diff --git a/indra/llui/llresizebar.h b/indra/llui/llresizebar.h index 4b0f435834..68bf0fd95e 100644 --- a/indra/llui/llresizebar.h +++ b/indra/llui/llresizebar.h @@ -61,7 +61,7 @@ public:      void            setResizeLimits( S32 min_size, S32 max_size ) { mMinSize = min_size; mMaxSize = max_size; }      void            setEnableSnapping(bool enable) { mSnappingEnabled = enable; }      void            setAllowDoubleClickSnapping(bool allow) { mAllowDoubleClickSnapping = allow; } -    bool            canResize() { return getEnabled() && mMaxSize > mMinSize; } +    bool            canResize() const { return getEnabled() && mMaxSize > mMinSize; }      void            setResizeListener(boost::function<void(void*)> listener) {mResizeListener = listener;}      void            setImagePanel(LLPanel * panelp);      LLPanel *       getImagePanel() const; diff --git a/indra/llui/llresizehandle.h b/indra/llui/llresizehandle.h index 9cc4123544..caec33405c 100644 --- a/indra/llui/llresizehandle.h +++ b/indra/llui/llresizehandle.h @@ -50,10 +50,10 @@ protected:      LLResizeHandle(const LLResizeHandle::Params&);      friend class LLUICtrlFactory;  public: -    virtual void    draw(); -    virtual bool    handleHover(S32 x, S32 y, MASK mask); -    virtual bool    handleMouseDown(S32 x, S32 y, MASK mask); -    virtual bool    handleMouseUp(S32 x, S32 y, MASK mask); +    void    draw() override; +    bool    handleHover(S32 x, S32 y, MASK mask) override; +    bool    handleMouseDown(S32 x, S32 y, MASK mask) override; +    bool    handleMouseUp(S32 x, S32 y, MASK mask) override;      void            setResizeLimits( S32 min_width, S32 min_height ) { mMinWidth = min_width; mMinHeight = min_height; } @@ -71,8 +71,8 @@ private:      const ECorner   mCorner;  }; -const S32 RESIZE_HANDLE_HEIGHT = 11; -const S32 RESIZE_HANDLE_WIDTH = 11; +constexpr S32 RESIZE_HANDLE_HEIGHT = 11; +constexpr S32 RESIZE_HANDLE_WIDTH = 11;  #endif  // LL_RESIZEHANDLE_H diff --git a/indra/llui/llrngwriter.h b/indra/llui/llrngwriter.h index 33ec049a1a..2c39472607 100644 --- a/indra/llui/llrngwriter.h +++ b/indra/llui/llrngwriter.h @@ -37,7 +37,7 @@ public:      void writeRNG(const std::string& name, LLXMLNodePtr node, const LLInitParam::BaseBlock& block, const std::string& xml_namespace);      void addDefinition(const std::string& type_name, const LLInitParam::BaseBlock& block); -    /*virtual*/ std::string getCurrentElementName() { return LLStringUtil::null; } +    std::string getCurrentElementName() override { return LLStringUtil::null; }      LLRNGWriter(); diff --git a/indra/llui/llscrolllistcell.h b/indra/llui/llscrolllistcell.h index e7ff5c8424..7dded3c0b7 100644 --- a/indra/llui/llscrolllistcell.h +++ b/indra/llui/llscrolllistcell.h @@ -105,7 +105,7 @@ public:      virtual const LLSD      getAltValue() const;      virtual void            setValue(const LLSD& value) { }      virtual void            setAltValue(const LLSD& value) { } -    virtual const std::string &getToolTip() const { return mToolTip; } +    virtual const std::string& getToolTip() const { return mToolTip; }      virtual void            setToolTip(const std::string &str) { mToolTip = str; }      virtual bool            getVisible() const { return true; }      virtual void            setWidth(S32 width) { mWidth = width; } diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index c24784338a..1f04100306 100644 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -165,7 +165,6 @@ public:      void            deleteAllItems() { clearRows(); }      // Sets an array of column descriptors -    void            setColumnHeadings(const LLSD& headings);      void            sortByColumnIndex(U32 column, bool ascending);      // LLCtrlListInterface functions @@ -318,7 +317,7 @@ public:      void setAllowKeyboardMovement(bool b)       { mAllowKeyboardMovement = b; }      void            setMaxSelectable(U32 max_selected) { mMaxSelectable = max_selected; } -    S32             getMaxSelectable() { return mMaxSelectable; } +    S32             getMaxSelectable() const { return mMaxSelectable; }      virtual S32     getScrollPos() const; @@ -334,7 +333,7 @@ public:      // support right-click context menus for avatar/group lists      enum ContextMenuType { MENU_NONE, MENU_AVATAR, MENU_GROUP };      void setContextMenu(const ContextMenuType &menu) { mContextMenuType = menu; } -    ContextMenuType getContextMenuType() { return mContextMenuType; } +    ContextMenuType getContextMenuType() const { return mContextMenuType; }      // Overridden from LLView      /*virtual*/ void    draw(); @@ -362,7 +361,6 @@ public:      virtual void    fitContents(S32 max_width, S32 max_height);      virtual LLRect  getRequiredRect(); -    static  bool    rowPreceeds(LLScrollListItem *new_row, LLScrollListItem *test_row);      LLRect          getItemListRect() { return mItemListRect; } @@ -384,7 +382,6 @@ public:       * then display all items.       */      void setPageLines(S32 page_lines ); -    void setCollapseEmptyColumns(bool collapse);      LLScrollListItem*   hitItem(S32 x,S32 y);      virtual void        scrollToShowSelected(); @@ -401,7 +398,7 @@ public:      void            setNumDynamicColumns(S32 num) { mNumDynamicWidthColumns = num; }      void            updateStaticColumnWidth(LLScrollListColumn* col, S32 new_width); -    S32             getTotalStaticColumnWidth() { return mTotalStaticColumnWidth; } +    S32             getTotalStaticColumnWidth() const { return mTotalStaticColumnWidth; }      std::string     getSortColumnName();      bool            getSortAscending() { return mSortColumns.empty() ? true : mSortColumns.back().second; } diff --git a/indra/llui/llsliderctrl.h b/indra/llui/llsliderctrl.h index 311377a61f..23ce8fd955 100644 --- a/indra/llui/llsliderctrl.h +++ b/indra/llui/llsliderctrl.h @@ -132,7 +132,6 @@ public:      static void     onEditorCommit(LLUICtrl* ctrl, const LLSD& userdata);      static void     onEditorGainFocus(LLFocusableElement* caller, void *userdata); -    static void     onEditorChangeFocus(LLUICtrl* caller, S32 direction, void *userdata);  protected:      virtual std::string _getSearchText() const diff --git a/indra/llui/llspinctrl.h b/indra/llui/llspinctrl.h index 58b38dc630..4ba8c97c63 100644 --- a/indra/llui/llspinctrl.h +++ b/indra/llui/llspinctrl.h @@ -94,7 +94,6 @@ public:      void            onEditorCommit(const LLSD& data);      static void     onEditorGainFocus(LLFocusableElement* caller, void *userdata);      static void     onEditorLostFocus(LLFocusableElement* caller, void *userdata); -    static void     onEditorChangeFocus(LLUICtrl* caller, S32 direction, void *userdata);      void            onUpBtn(const LLSD& data);      void            onDownBtn(const LLSD& data); diff --git a/indra/llui/llstatbar.h b/indra/llui/llstatbar.h index c36a138566..bbbf0b3a19 100644 --- a/indra/llui/llstatbar.h +++ b/indra/llui/llstatbar.h @@ -67,7 +67,7 @@ public:      void setStat(const std::string& stat_name);      void setRange(F32 bar_min, F32 bar_max); -    void getRange(F32& bar_min, F32& bar_max) { bar_min = mTargetMinBar; bar_max = mTargetMaxBar; } +    void getRange(F32& bar_min, F32& bar_max) const { bar_min = mTargetMinBar; bar_max = mTargetMaxBar; }      /*virtual*/ LLRect getRequiredRect();   // Return the height of this object, given the set options. diff --git a/indra/llui/llstatgraph.cpp b/indra/llui/llstatgraph.cpp index d97051247e..0af717d447 100644 --- a/indra/llui/llstatgraph.cpp +++ b/indra/llui/llstatgraph.cpp @@ -36,7 +36,6 @@  #include "llglheaders.h"  #include "lltracerecording.h"  #include "lltracethreadrecorder.h" -//#include "llviewercontrol.h"  /////////////////////////////////////////////////////////////////////////////////// diff --git a/indra/llui/llstatgraph.h b/indra/llui/llstatgraph.h index c254821870..6d9e3d1064 100644 --- a/indra/llui/llstatgraph.h +++ b/indra/llui/llstatgraph.h @@ -99,9 +99,7 @@ public:      void setMin(const F32 min);      void setMax(const F32 max); -    virtual void draw(); - -    /*virtual*/ void setValue(const LLSD& value); +    void draw() override;  private:      LLTrace::StatType<LLTrace::CountAccumulator>*   mNewStatFloatp; @@ -133,9 +131,6 @@ private:      };      typedef std::vector<Threshold> threshold_vec_t;      threshold_vec_t mThresholds; -    //S32 mNumThresholds; -    //F32 mThresholds[4]; -    //LLColor4 mThresholdColors[4];  };  #endif  // LL_LLSTATGRAPH_H diff --git a/indra/llui/llstatview.h b/indra/llui/llstatview.h index b5187f886d..a396773057 100644 --- a/indra/llui/llstatview.h +++ b/indra/llui/llstatview.h @@ -29,7 +29,6 @@  #include "llstatbar.h"  #include "llcontainerview.h" -#include <vector>  class LLStatBar; diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 595ab0bd2b..5e0985c79c 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -1370,17 +1370,17 @@ LLPanel* LLTabContainer::getCurrentPanel()      return NULL;  } -S32 LLTabContainer::getCurrentPanelIndex() +S32 LLTabContainer::getCurrentPanelIndex() const  {      return mCurrentTabIdx;  } -S32 LLTabContainer::getTabCount() +S32 LLTabContainer::getTabCount() const  {      return static_cast<S32>(mTabList.size());  } -LLPanel* LLTabContainer::getPanelByIndex(S32 index) +LLPanel* LLTabContainer::getPanelByIndex(S32 index) const  {      if (index >= 0 && index < (S32)mTabList.size())      { @@ -1389,7 +1389,7 @@ LLPanel* LLTabContainer::getPanelByIndex(S32 index)      return NULL;  } -S32 LLTabContainer::getIndexForPanel(LLPanel* panel) +S32 LLTabContainer::getIndexForPanel(LLPanel* panel) const  {      for (S32 index = 0; index < (S32)mTabList.size(); index++)      { @@ -1401,7 +1401,7 @@ S32 LLTabContainer::getIndexForPanel(LLPanel* panel)      return -1;  } -S32 LLTabContainer::getPanelIndexByTitle(std::string_view title) +S32 LLTabContainer::getPanelIndexByTitle(std::string_view title) const  {      for (S32 index = 0 ; index < (S32)mTabList.size(); index++)      { diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h index 40f272ffa8..4ac7e73d25 100644 --- a/indra/llui/lltabcontainer.h +++ b/indra/llui/lltabcontainer.h @@ -182,15 +182,15 @@ public:      void        removeTabPanel( LLPanel* child );      void        lockTabs(S32 num_tabs = 0);      void        unlockTabs(); -    S32         getNumLockedTabs() { return mLockedTabCount; } +    S32         getNumLockedTabs() const { return mLockedTabCount; }      void        enableTabButton(S32 which, bool enable);      void        deleteAllTabs();      LLPanel*    getCurrentPanel(); -    S32         getCurrentPanelIndex(); -    S32         getTabCount(); -    LLPanel*    getPanelByIndex(S32 index); -    S32         getIndexForPanel(LLPanel* panel); -    S32         getPanelIndexByTitle(std::string_view title); +    S32         getCurrentPanelIndex() const; +    S32         getTabCount() const; +    LLPanel*    getPanelByIndex(S32 index) const; +    S32         getIndexForPanel(LLPanel* panel) const; +    S32         getPanelIndexByTitle(std::string_view title) const;      LLPanel*    getPanelByName(std::string_view name);      S32         getTotalTabWidth() const;      void        setCurrentTabName(const std::string& name); diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 76d4e160af..e62b56963d 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -145,7 +145,6 @@ public:      /*virtual*/ void                setStyle(LLStyleConstSP style)  { mStyle = style; }      /*virtual*/ void                setToken( LLKeywordToken* token )   { mToken = token; }      /*virtual*/ LLKeywordToken*     getToken() const                    { return mToken; } -    /*virtual*/ bool                getToolTip( std::string& msg ) const;      /*virtual*/ void                setToolTip(const std::string& tooltip);      /*virtual*/ void                dump() const; @@ -450,7 +449,7 @@ public:      virtual void            setText(const LLStringExplicit &utf8str , const LLStyle::Params& input_params = LLStyle::Params()); // uses default style      /*virtual*/ const std::string& getText() const override;      void                    setMaxTextLength(S32 length) { mMaxTextByteLength = length; } -    S32                     getMaxTextLength() { return mMaxTextByteLength; } +    S32                     getMaxTextLength() const { return mMaxTextByteLength; }      // wide-char versions      void                    setWText(const LLWString& text); @@ -489,10 +488,10 @@ public:      LLRect                  getTextBoundingRect();      LLRect                  getVisibleDocumentRect() const; -    S32                     getVPad() { return mVPad; } -    S32                     getHPad() { return mHPad; } -    F32                     getLineSpacingMult() { return mLineSpacingMult; } -    S32                     getLineSpacingPixels() { return mLineSpacingPixels; } // only for multiline +    S32                     getVPad() const { return mVPad; } +    S32                     getHPad() const { return mHPad; } +    F32                     getLineSpacingMult() const { return mLineSpacingMult; } +    S32                     getLineSpacingPixels() const { return mLineSpacingPixels; } // only for multiline      S32                     getDocIndexFromLocalCoord( S32 local_x, S32 local_y, bool round, bool hit_past_end_of_line = true) const;      LLRect                  getLocalRectFromDocIndex(S32 pos) const; @@ -502,7 +501,7 @@ public:      bool                    getReadOnly() const { return mReadOnly; }      void                    setSkipLinkUnderline(bool skip_link_underline) { mSkipLinkUnderline = skip_link_underline; } -    bool                    getSkipLinkUnderline() { return mSkipLinkUnderline;  } +    bool                    getSkipLinkUnderline() const { return mSkipLinkUnderline;  }      void                    setParseURLs(bool parse_urls) { mParseHTML = parse_urls; } @@ -516,8 +515,8 @@ public:      void                    endOfLine();      void                    startOfDoc();      void                    endOfDoc(); -    void                    changePage( S32 delta ); -    void                    changeLine( S32 delta ); +    void                    changePage(S32 delta); +    void                    changeLine(S32 delta);      bool                    scrolledToStart();      bool                    scrolledToEnd(); @@ -675,7 +674,6 @@ protected:      void                            appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params = LLStyle::Params());      void                            appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, bool underline_on_hover_only = false); -    S32 normalizeUri(std::string& uri);  protected:      // virtual diff --git a/indra/llui/lltextbox.h b/indra/llui/lltextbox.h index 500dc8669f..507d8f3ee6 100644 --- a/indra/llui/lltextbox.h +++ b/indra/llui/lltextbox.h @@ -46,39 +46,39 @@ protected:      friend class LLUICtrlFactory;  public: -    virtual ~LLTextBox(); +    ~LLTextBox() override; -    /*virtual*/ bool handleMouseDown(S32 x, S32 y, MASK mask); -    /*virtual*/ bool handleMouseUp(S32 x, S32 y, MASK mask); -    /*virtual*/ bool handleHover(S32 x, S32 y, MASK mask); +    bool handleMouseDown(S32 x, S32 y, MASK mask) override; +    bool handleMouseUp(S32 x, S32 y, MASK mask) override; +    bool handleHover(S32 x, S32 y, MASK mask) override; -    /*virtual*/ void setEnabled(bool enabled); +    void setEnabled(bool enabled) override; -    /*virtual*/ void setText( const LLStringExplicit& text, const LLStyle::Params& input_params = LLStyle::Params() ); +    void setText(const LLStringExplicit& text, const LLStyle::Params& input_params = LLStyle::Params()) override; -    void            setRightAlign()                         { mHAlign = LLFontGL::RIGHT; } -    void            setHAlign( LLFontGL::HAlign align )     { mHAlign = align; } -    void            setClickedCallback( boost::function<void (void*)> cb, void* userdata = NULL ); +    void setRightAlign() { mHAlign = LLFontGL::RIGHT; } +    void setHAlign(LLFontGL::HAlign align) { mHAlign = align; } +    void setClickedCallback(boost::function<void(void*)> cb, void* userdata = NULL); -    void            reshapeToFitText(bool called_from_parent = false); +    void reshapeToFitText(bool called_from_parent = false); -    S32             getTextPixelWidth(); -    S32             getTextPixelHeight(); +    S32 getTextPixelWidth(); +    S32 getTextPixelHeight(); -    /*virtual*/ LLSD    getValue() const; -    /*virtual*/ bool    setTextArg( const std::string& key, const LLStringExplicit& text ); +    LLSD getValue() const override; +    bool setTextArg(const std::string& key, const LLStringExplicit& text) override; -    void            setShowCursorHand(bool show_cursor) { mShowCursorHand = show_cursor; } +    void setShowCursorHand(bool show_cursor) { mShowCursorHand = show_cursor; }  protected: -    void            onUrlLabelUpdated(const std::string &url, const std::string &label); +    void onUrlLabelUpdated(const std::string& url, const std::string& label);      LLUIString          mText;      callback_t          mClickedCallback;      bool                mShowCursorHand;  protected: -    virtual std::string _getSearchText() const +    virtual std::string _getSearchText() const override      {          return LLTextBase::_getSearchText() + mText.getString();      } diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 77a4976f6b..fe4cce29ab 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1218,6 +1218,14 @@ void LLTextEditor::showEmojiHelper()      LLEmojiHelper::instance().showHelper(this, cursorRect.mLeft, cursorRect.mTop, LLStringUtil::null, cb);  } +void LLTextEditor::hideEmojiHelper() +{ +    if (mShowEmojiHelper) +    { +        LLEmojiHelper::instance().hideHelper(this); +    } +} +  void LLTextEditor::tryToShowEmojiHelper()  {      if (mReadOnly || !mShowEmojiHelper) diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index e9e7070414..353a7b93a0 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -200,13 +200,13 @@ public:      const LLUUID&   getSourceID() const                     { return mSourceID; }      const LLTextSegmentPtr  getPreviousSegment() const; -    const LLTextSegmentPtr  getLastSegment() const;      void            getSelectedSegments(segment_vec_t& segments) const;      void            setShowContextMenu(bool show) { mShowContextMenu = show; }      bool            getShowContextMenu() const { return mShowContextMenu; }      void            showEmojiHelper(); +    void            hideEmojiHelper();      void            setShowEmojiHelper(bool show);      bool            getShowEmojiHelper() const { return mShowEmojiHelper; } @@ -216,8 +216,6 @@ protected:      void            showContextMenu(S32 x, S32 y);      void            drawPreeditMarker(); -    void            assignEmbedded(const std::string &s); -      void            removeCharOrTab();      void            indentSelectedLines( S32 spaces ); @@ -237,7 +235,6 @@ protected:      void            autoIndent(); -    void            findEmbeddedItemSegments(S32 start, S32 end);      void            getSegmentsInRange(segment_vec_t& segments, S32 start, S32 end, bool include_partial) const;      virtual llwchar pasteEmbeddedItem(llwchar ext_char) { return ext_char; } @@ -304,7 +301,7 @@ private:      // Methods      //      void            pasteHelper(bool is_primary); -    void            cleanStringForPaste(LLWString & clean_string); +    void            cleanStringForPaste(LLWString& clean_string);      void            pasteTextWithLinebreaks(LLWString & clean_string);      void            onKeyStroke(); diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h index c57c979525..5556406fbd 100644 --- a/indra/llui/lltoolbar.h +++ b/indra/llui/lltoolbar.h @@ -68,7 +68,7 @@ public:      void reshape(S32 width, S32 height, bool called_from_parent = true);      void setEnabled(bool enabled);      void setCommandId(const LLCommandId& id) { mId = id; } -    LLCommandId getCommandId() { return mId; } +    LLCommandId getCommandId() const { return mId; }      void setStartDragCallback(tool_startdrag_callback_t cb)   { mStartDragItemCallback  = cb; }      void setHandleDragCallback(tool_handledrag_callback_t cb) { mHandleDragItemCallback = cb; } @@ -256,7 +256,7 @@ public:      // Methods used in loading and saving toolbar settings      void setButtonType(LLToolBarEnums::ButtonType button_type); -    LLToolBarEnums::ButtonType getButtonType() { return mButtonType; } +    LLToolBarEnums::ButtonType getButtonType() const { return mButtonType; }      command_id_list_t& getCommandsList() { return mButtonCommands; }      void clearCommandsList(); diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp index 86525c2f7e..74f03618cf 100644 --- a/indra/llui/lltooltip.cpp +++ b/indra/llui/lltooltip.cpp @@ -390,22 +390,22 @@ void LLToolTip::draw()      }  } -bool LLToolTip::isFading() +bool LLToolTip::isFading() const  {      return mFadeTimer.getStarted();  } -F32 LLToolTip::getVisibleTime() +F32 LLToolTip::getVisibleTime() const  {      return mVisibleTimer.getStarted() ? mVisibleTimer.getElapsedTimeF32() : 0.f;  } -bool LLToolTip::hasClickCallback() +bool LLToolTip::hasClickCallback() const  {      return mHasClickCallback;  } -void LLToolTip::getToolTipMessage(std::string & message) +void LLToolTip::getToolTipMessage(std::string& message) const  {      if (mTextBox)      { diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h index 8515504e3b..760acddd6f 100644 --- a/indra/llui/lltooltip.h +++ b/indra/llui/lltooltip.h @@ -44,15 +44,15 @@ public:          Params();      };      LLToolTipView(const LLToolTipView::Params&); -    /*virtual*/ bool handleHover(S32 x, S32 y, MASK mask); -    /*virtual*/ bool handleMouseDown(S32 x, S32 y, MASK mask); -    /*virtual*/ bool handleMiddleMouseDown(S32 x, S32 y, MASK mask); -    /*virtual*/ bool handleRightMouseDown(S32 x, S32 y, MASK mask); -    /*virtual*/ bool handleScrollWheel( S32 x, S32 y, S32 clicks ); +    bool handleHover(S32 x, S32 y, MASK mask) override; +    bool handleMouseDown(S32 x, S32 y, MASK mask) override; +    bool handleMiddleMouseDown(S32 x, S32 y, MASK mask) override; +    bool handleRightMouseDown(S32 x, S32 y, MASK mask) override; +    bool handleScrollWheel( S32 x, S32 y, S32 clicks ) override;      void drawStickyRect(); -    /*virtual*/ void draw(); +    void draw() override;  };  class LLToolTip : public LLPanel @@ -98,20 +98,20 @@ public:          Params();      }; -    /*virtual*/ void draw(); -    /*virtual*/ bool handleHover(S32 x, S32 y, MASK mask); -    /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask); -    /*virtual*/ void setVisible(bool visible); +    void draw() override; +    bool handleHover(S32 x, S32 y, MASK mask) override; +    void onMouseLeave(S32 x, S32 y, MASK mask) override; +    void setVisible(bool visible) override; -    bool isFading(); -    F32 getVisibleTime(); -    bool hasClickCallback(); +    bool isFading() const; +    F32 getVisibleTime() const; +    bool hasClickCallback() const;      LLToolTip(const Params& p);      virtual void initFromParams(const LLToolTip::Params& params); -    void getToolTipMessage(std::string & message); -    bool isTooltipPastable() { return mIsTooltipPastable; } +    void getToolTipMessage(std::string & message) const; +    bool isTooltipPastable() const { return mIsTooltipPastable; }  protected:      void updateTextBox(); diff --git a/indra/llui/llui.h b/indra/llui/llui.h index 9890d3f7ef..b2dcb6dc88 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -154,7 +154,7 @@ public:              sanitizeRange();          } -        S32 clamp(S32 input) +        S32 clamp(S32 input) const          {              if (input < mMin) return mMin;              if (input > mMax) return mMax; @@ -168,8 +168,8 @@ public:              sanitizeRange();          } -        S32 getMin() { return mMin; } -        S32 getMax() { return mMax; } +        S32 getMin() const { return mMin; } +        S32 getMax() const { return mMax; }          bool operator==(const RangeS32& other) const          { @@ -223,7 +223,7 @@ public:              mValue = clamp(value);          } -        S32 get() +        S32 get() const          {              return mValue;          } @@ -253,7 +253,7 @@ public:      static std::string getLanguage(); // static for lldateutil_test compatibility      //helper functions (should probably move free standing rendering helper functions here) -    LLView* getRootView() { return mRootView; } +    LLView* getRootView() const { return mRootView; }      void setRootView(LLView* view) { mRootView = view; }      /**       * Walk the LLView tree to resolve a path @@ -296,7 +296,7 @@ public:      LLControlGroup& getControlControlGroup (std::string_view controlname);      F32 getMouseIdleTime() { return mMouseIdleTimer.getElapsedTimeF32(); }      void resetMouseIdleTimer() { mMouseIdleTimer.reset(); } -    LLWindow* getWindow() { return mWindow; } +    LLWindow* getWindow() const { return mWindow; }      void addPopup(LLView*);      void removePopup(LLView*); diff --git a/indra/llui/lluiconstants.h b/indra/llui/lluiconstants.h index 5fdfd37c6e..a317c66008 100644 --- a/indra/llui/lluiconstants.h +++ b/indra/llui/lluiconstants.h @@ -28,23 +28,23 @@  #define LL_LLUICONSTANTS_H  // spacing for small font lines of text, like LLTextBoxes -const S32 LINE = 16; +constexpr S32 LINE = 16;  // spacing for larger lines of text -const S32 LINE_BIG = 24; +constexpr S32 LINE_BIG = 24;  // default vertical padding -const S32 VPAD = 4; +constexpr S32 VPAD = 4;  // default horizontal padding -const S32 HPAD = 4; +constexpr S32 HPAD = 4;  // Account History, how far to look into past -const S32 SUMMARY_INTERVAL = 7;     // one week -const S32 SUMMARY_MAX = 8;          // -const S32 DETAILS_INTERVAL = 1;     // one day -const S32 DETAILS_MAX = 30;         // one month -const S32 TRANSACTIONS_INTERVAL = 1;// one day -const S32 TRANSACTIONS_MAX = 30;    // one month +constexpr S32 SUMMARY_INTERVAL = 7;     // one week +constexpr S32 SUMMARY_MAX = 8;          // +constexpr S32 DETAILS_INTERVAL = 1;     // one day +constexpr S32 DETAILS_MAX = 30;         // one month +constexpr S32 TRANSACTIONS_INTERVAL = 1;// one day +constexpr S32 TRANSACTIONS_MAX = 30;    // one month  #endif diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h index 8cd9950917..bcaf479b0f 100644 --- a/indra/llui/lluictrl.h +++ b/indra/llui/lluictrl.h @@ -39,9 +39,9 @@  #include "llviewmodel.h"        // *TODO move dependency to .cpp file  #include "llsearchablecontrol.h" -const bool TAKE_FOCUS_YES = true; -const bool TAKE_FOCUS_NO  = false; -const S32 DROP_SHADOW_FLOATER = 5; +constexpr bool TAKE_FOCUS_YES = true; +constexpr bool TAKE_FOCUS_NO  = false; +constexpr S32 DROP_SHADOW_FLOATER = 5;  class LLUICtrl      : public LLView, public boost::signals2::trackable diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h index 75e7e396bc..91221dc7f3 100644 --- a/indra/llui/lluictrlfactory.h +++ b/indra/llui/lluictrlfactory.h @@ -184,7 +184,7 @@ fail:      template<class T>      static T* getDefaultWidget(std::string_view name)      { -        typename T::Params widget_params; +        typename T::Params widget_params{};          widget_params.name = std::string(name);          return create<T>(widget_params);      } diff --git a/indra/llui/llundo.h b/indra/llui/llundo.h index dc40702be0..990745e530 100644 --- a/indra/llui/llundo.h +++ b/indra/llui/llundo.h @@ -42,7 +42,7 @@ public:          LLUndoAction(): mClusterID(0) {};          virtual ~LLUndoAction(){};      private: -        S32     mClusterID; +        S32 mClusterID;      };      LLUndoBuffer( LLUndoAction (*create_func()), S32 initial_count ); @@ -51,8 +51,8 @@ public:      LLUndoAction *getNextAction(bool setClusterBegin = true);      bool undoAction();      bool redoAction(); -    bool canUndo() { return (mNextAction != mFirstAction); } -    bool canRedo() { return (mNextAction != mLastAction); } +    bool canUndo() const { return (mNextAction != mFirstAction); } +    bool canRedo() const { return (mNextAction != mLastAction); }      void flushActions(); diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h index 0f54b66299..ac9741a7ad 100644 --- a/indra/llui/llurlaction.h +++ b/indra/llui/llurlaction.h @@ -45,8 +45,6 @@  class LLUrlAction  {  public: -    LLUrlAction(); -      /// load a Url in the user's preferred web browser      static void openURL(std::string url); diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 3cc0c05ffa..77f132e9d8 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -221,6 +221,16 @@ bool LLUrlEntryBase::isWikiLinkCorrect(const std::string &labeled_url) const      },          L'\u002F'); // Solidus +    std::replace_if(wlabel.begin(), +        wlabel.end(), +        [](const llwchar& chr) +    { +        return // Not a decomposition, but suficiently similar +            (chr == L'\u04BA') // "Cyrillic Capital Letter Shha" +            || (chr == L'\u04BB'); // "Cyrillic Small Letter Shha" +    }, +        L'\u0068'); // "Latin Small Letter H" +      std::string label = wstring_to_utf8str(wlabel);      if ((label.find(".com") != std::string::npos           || label.find("www.") != std::string::npos) diff --git a/indra/llui/llurlmatch.h b/indra/llui/llurlmatch.h index ba822fbda6..887796bb37 100644 --- a/indra/llui/llurlmatch.h +++ b/indra/llui/llurlmatch.h @@ -31,7 +31,6 @@  //#include "linden_common.h"  #include <string> -#include <vector>  #include "llstyle.h"  /// diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h index 64cfec3960..c22af0dbc4 100644 --- a/indra/llui/llurlregistry.h +++ b/indra/llui/llurlregistry.h @@ -34,7 +34,6 @@  #include "llstring.h"  #include <string> -#include <vector>  class LLKeyBindingToStringHandler; diff --git a/indra/llui/llview.h b/indra/llui/llview.h index 710ec3d05e..97212a9d2d 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -54,17 +54,17 @@  class LLSD; -const U32   FOLLOWS_NONE    = 0x00; -const U32   FOLLOWS_LEFT    = 0x01; -const U32   FOLLOWS_RIGHT   = 0x02; -const U32   FOLLOWS_TOP     = 0x10; -const U32   FOLLOWS_BOTTOM  = 0x20; -const U32   FOLLOWS_ALL     = 0x33; +constexpr U32   FOLLOWS_NONE    = 0x00; +constexpr U32   FOLLOWS_LEFT    = 0x01; +constexpr U32   FOLLOWS_RIGHT   = 0x02; +constexpr U32   FOLLOWS_TOP     = 0x10; +constexpr U32   FOLLOWS_BOTTOM  = 0x20; +constexpr U32   FOLLOWS_ALL     = 0x33; -const bool  MOUSE_OPAQUE = true; -const bool  NOT_MOUSE_OPAQUE = false; +constexpr bool  MOUSE_OPAQUE = true; +constexpr bool  NOT_MOUSE_OPAQUE = false; -const U32 GL_NAME_UI_RESERVED = 2; +constexpr U32 GL_NAME_UI_RESERVED = 2;  // maintains render state during traversal of UI tree @@ -241,7 +241,7 @@ public:      void        setUseBoundingRect( bool use_bounding_rect );      bool        getUseBoundingRect() const; -    ECursorType getHoverCursor() { return mHoverCursor; } +    ECursorType getHoverCursor() const { return mHoverCursor; }      static F32 getTooltipTimeout();      virtual const std::string getToolTip() const; @@ -265,7 +265,7 @@ public:      void setDefaultTabGroup(S32 d)              { mDefaultTabGroup = d; }      S32 getDefaultTabGroup() const              { return mDefaultTabGroup; } -    S32 getLastTabGroup()                       { return mLastTabGroup; } +    S32 getLastTabGroup() const                 { return mLastTabGroup; }      bool        isInVisibleChain() const;      bool        isInEnabledChain() const; diff --git a/indra/llui/llviewborder.h b/indra/llui/llviewborder.h index 1f118a0d20..a4bb748b77 100644 --- a/indra/llui/llviewborder.h +++ b/indra/llui/llviewborder.h @@ -92,7 +92,6 @@ public:  private:      void        drawOnePixelLines();      void        drawTwoPixelLines(); -    void        drawTextures();      EBevel      mBevel;      EStyle      mStyle; diff --git a/indra/llui/llviewereventrecorder.h b/indra/llui/llviewereventrecorder.h index 9e752e8090..5636c068d8 100644 --- a/indra/llui/llviewereventrecorder.h +++ b/indra/llui/llviewereventrecorder.h @@ -61,7 +61,7 @@ public:    std::string get_xui();    void update_xui(std::string xui); -  bool getLoggingStatus(){return logEvents;}; +  bool getLoggingStatus() const { return logEvents; }    void setEventLoggingOn();    void setEventLoggingOff(); diff --git a/indra/llui/llvirtualtrackball.h b/indra/llui/llvirtualtrackball.h index 61a78b2398..fbfda04585 100644 --- a/indra/llui/llvirtualtrackball.h +++ b/indra/llui/llvirtualtrackball.h @@ -78,20 +78,20 @@ public:      }; -    virtual ~LLVirtualTrackball(); -    /*virtual*/ bool postBuild(); +    ~LLVirtualTrackball() override; +    bool postBuild() override; -    virtual bool    handleHover(S32 x, S32 y, MASK mask); -    virtual bool    handleMouseUp(S32 x, S32 y, MASK mask); -    virtual bool    handleMouseDown(S32 x, S32 y, MASK mask); -    virtual bool    handleRightMouseDown(S32 x, S32 y, MASK mask); -    virtual bool    handleKeyHere(KEY key, MASK mask); +    bool    handleHover(S32 x, S32 y, MASK mask) override; +    bool    handleMouseUp(S32 x, S32 y, MASK mask) override; +    bool    handleMouseDown(S32 x, S32 y, MASK mask) override; +    bool    handleRightMouseDown(S32 x, S32 y, MASK mask) override; +    bool    handleKeyHere(KEY key, MASK mask) override; -    virtual void    draw(); +    void    draw() override; -    virtual void    setValue(const LLSD& value); -    void            setValue(F32 x, F32 y, F32 z, F32 w); -    virtual LLSD    getValue() const; +    void    setValue(const LLSD& value) override; +    void    setValue(F32 x, F32 y, F32 z, F32 w); +    LLSD    getValue() const override;      void            setRotation(const LLQuaternion &value);      LLQuaternion    getRotation() const; @@ -102,7 +102,6 @@ public:  protected:      friend class LLUICtrlFactory;      LLVirtualTrackball(const Params&); -    void onEditChange();  protected:      LLTextBox*          mNLabel; diff --git a/indra/llui/llwindowshade.h b/indra/llui/llwindowshade.h index da29188943..ee230cd2f6 100644 --- a/indra/llui/llwindowshade.h +++ b/indra/llui/llwindowshade.h @@ -49,7 +49,7 @@ public:      };      void show(LLNotificationPtr); -    /*virtual*/ void draw(); +    void draw() override;      void hide();      bool isShown() const; diff --git a/indra/llui/llxyvector.h b/indra/llui/llxyvector.h index bc41213c13..646771f387 100644 --- a/indra/llui/llxyvector.h +++ b/indra/llui/llxyvector.h @@ -65,18 +65,18 @@ public:      }; -    virtual ~LLXYVector(); -    /*virtual*/ bool postBuild(); +    ~LLXYVector() override; +    bool postBuild() override; -    virtual bool    handleHover(S32 x, S32 y, MASK mask); -    virtual bool    handleMouseUp(S32 x, S32 y, MASK mask); -    virtual bool    handleMouseDown(S32 x, S32 y, MASK mask); +    bool handleHover(S32 x, S32 y, MASK mask) override; +    bool handleMouseUp(S32 x, S32 y, MASK mask) override; +    bool handleMouseDown(S32 x, S32 y, MASK mask) override; -    virtual void    draw(); +    void draw() override; -    virtual void    setValue(const LLSD& value); -    void            setValue(F32 x, F32 y); -    virtual LLSD    getValue() const; +    void setValue(const LLSD& value) override; +    void setValue(F32 x, F32 y); +    LLSD getValue() const override;  protected:      friend class LLUICtrlFactory; diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt index ce9134e7f1..6b347b357c 100644 --- a/indra/llwindow/CMakeLists.txt +++ b/indra/llwindow/CMakeLists.txt @@ -183,7 +183,6 @@ endif (SDL_FOUND)    target_include_directories(llwindow INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})  if (DARWIN) -  include(CMakeFindFrameworks)    find_library(CARBON_LIBRARY Carbon)    target_link_libraries(llwindow ${CARBON_LIBRARY})  endif (DARWIN) diff --git a/indra/llwindow/lldxhardware.cpp b/indra/llwindow/lldxhardware.cpp index 4bc069c5a4..387982dfc2 100644 --- a/indra/llwindow/lldxhardware.cpp +++ b/indra/llwindow/lldxhardware.cpp @@ -47,7 +47,6 @@  #include "llstl.h"  #include "lltimer.h" -void (*gWriteDebug)(const char* msg) = NULL;  LLDXHardware gDXHardware;  //----------------------------------------------------------------------------- @@ -61,170 +60,6 @@ typedef BOOL ( WINAPI* PfnCoSetProxyBlanket )( IUnknown* pProxy, DWORD dwAuthnSv                                                 OLECHAR* pServerPrincName, DWORD dwAuthnLevel, DWORD dwImpLevel,                                                 RPC_AUTH_IDENTITY_HANDLE pAuthInfo, DWORD dwCapabilities ); -HRESULT GetVideoMemoryViaWMI(WCHAR* strInputDeviceID, DWORD* pdwAdapterRam) -{ -    HRESULT hr; -    bool bGotMemory = false; -    IWbemLocator* pIWbemLocator = nullptr; -    IWbemServices* pIWbemServices = nullptr; -    BSTR pNamespace = nullptr; - -    *pdwAdapterRam = 0; -    CoInitializeEx(0, COINIT_APARTMENTTHREADED); - -    hr = CoCreateInstance( CLSID_WbemLocator, -                           nullptr, -                           CLSCTX_INPROC_SERVER, -                           IID_IWbemLocator, -                           ( LPVOID* )&pIWbemLocator ); -#ifdef PRINTF_DEBUGGING -    if( FAILED( hr ) ) wprintf( L"WMI: CoCreateInstance failed: 0x%0.8x\n", hr ); -#endif - -    if( SUCCEEDED( hr ) && pIWbemLocator ) -    { -        // Using the locator, connect to WMI in the given namespace. -        pNamespace = SysAllocString( L"\\\\.\\root\\cimv2" ); - -        hr = pIWbemLocator->ConnectServer( pNamespace, nullptr, nullptr, 0L, -                                           0L, nullptr, nullptr, &pIWbemServices ); -#ifdef PRINTF_DEBUGGING -        if( FAILED( hr ) ) wprintf( L"WMI: pIWbemLocator->ConnectServer failed: 0x%0.8x\n", hr ); -#endif -        if( SUCCEEDED( hr ) && pIWbemServices != 0 ) -        { -            HINSTANCE hinstOle32 = nullptr; - -            hinstOle32 = LoadLibraryW( L"ole32.dll" ); -            if( hinstOle32 ) -            { -                PfnCoSetProxyBlanket pfnCoSetProxyBlanket = nullptr; - -                pfnCoSetProxyBlanket = ( PfnCoSetProxyBlanket )GetProcAddress( hinstOle32, "CoSetProxyBlanket" ); -                if( pfnCoSetProxyBlanket != 0 ) -                { -                    // Switch security level to IMPERSONATE. -                    pfnCoSetProxyBlanket( pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nullptr, -                                          RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, 0 ); -                } - -                FreeLibrary( hinstOle32 ); -            } - -            IEnumWbemClassObject* pEnumVideoControllers = nullptr; -            BSTR pClassName = nullptr; - -            pClassName = SysAllocString( L"Win32_VideoController" ); - -            hr = pIWbemServices->CreateInstanceEnum( pClassName, 0, -                                                     nullptr, &pEnumVideoControllers ); -#ifdef PRINTF_DEBUGGING -            if( FAILED( hr ) ) wprintf( L"WMI: pIWbemServices->CreateInstanceEnum failed: 0x%0.8x\n", hr ); -#endif - -            if( SUCCEEDED( hr ) && pEnumVideoControllers ) -            { -                IWbemClassObject* pVideoControllers[10] = {0}; -                DWORD uReturned = 0; -                BSTR pPropName = nullptr; - -                // Get the first one in the list -                pEnumVideoControllers->Reset(); -                hr = pEnumVideoControllers->Next( 5000,             // timeout in 5 seconds -                                                  10,                  // return the first 10 -                                                  pVideoControllers, -                                                  &uReturned ); -#ifdef PRINTF_DEBUGGING -                if( FAILED( hr ) ) wprintf( L"WMI: pEnumVideoControllers->Next failed: 0x%0.8x\n", hr ); -                if( uReturned == 0 ) wprintf( L"WMI: pEnumVideoControllers uReturned == 0\n" ); -#endif - -                VARIANT var; -                if( SUCCEEDED( hr ) ) -                { -                    bool bFound = false; -                    for( UINT iController = 0; iController < uReturned; iController++ ) -                    { -                        if ( !pVideoControllers[iController] ) -                            continue; - -                        // if strInputDeviceID is set find this specific device and return memory or specific device -                        // if strInputDeviceID is not set return the best device -                        if (strInputDeviceID) -                        { -                            pPropName = SysAllocString( L"PNPDeviceID" ); -                            hr = pVideoControllers[iController]->Get( pPropName, 0L, &var, nullptr, nullptr ); -#ifdef PRINTF_DEBUGGING -                            if( FAILED( hr ) ) -                                wprintf( L"WMI: pVideoControllers[iController]->Get PNPDeviceID failed: 0x%0.8x\n", hr ); -#endif -                            if( SUCCEEDED( hr ) && strInputDeviceID) -                            { -                                if( wcsstr( var.bstrVal, strInputDeviceID ) != 0 ) -                                    bFound = true; -                            } -                            VariantClear( &var ); -                            if( pPropName ) SysFreeString( pPropName ); -                        } - -                        if( bFound || !strInputDeviceID ) -                        { -                            pPropName = SysAllocString( L"AdapterRAM" ); -                            hr = pVideoControllers[iController]->Get( pPropName, 0L, &var, nullptr, nullptr ); -#ifdef PRINTF_DEBUGGING -                            if( FAILED( hr ) ) -                                wprintf( L"WMI: pVideoControllers[iController]->Get AdapterRAM failed: 0x%0.8x\n", -                                         hr ); -#endif -                            if( SUCCEEDED( hr ) ) -                            { -                                bGotMemory = true; -                                *pdwAdapterRam = llmax(var.ulVal, *pdwAdapterRam); -                            } -                            VariantClear( &var ); -                            if( pPropName ) SysFreeString( pPropName ); -                        } - -                        SAFE_RELEASE( pVideoControllers[iController] ); - -                        if (bFound) -                        { -                            break; -                        } -                    } -                } -            } - -            if( pClassName ) -                SysFreeString( pClassName ); -            SAFE_RELEASE( pEnumVideoControllers ); -        } - -        if( pNamespace ) -            SysFreeString( pNamespace ); -        SAFE_RELEASE( pIWbemServices ); -    } - -    SAFE_RELEASE( pIWbemLocator ); - -    CoUninitialize(); - -    if( bGotMemory ) -        return S_OK; -    else -        return E_FAIL; -} - -//static -U32 LLDXHardware::getMBVideoMemoryViaWMI() -{ -    DWORD vram = 0; -    if (SUCCEEDED(GetVideoMemoryViaWMI(NULL, &vram))) -    { -        return vram / (1024 * 1024);; -    } -    return 0; -}  //Getting the version of graphics controller driver via WMI  std::string LLDXHardware::getDriverVersionWMI(EGPUVendor vendor) @@ -480,495 +315,14 @@ std::string get_string(IDxDiagContainer *containerp, const WCHAR *wszPropName)      return utf16str_to_utf8str(wszPropValue);  } - -LLVersion::LLVersion() -{ -    mValid = false; -    S32 i; -    for (i = 0; i < 4; i++) -    { -        mFields[i] = 0; -    } -} - -bool LLVersion::set(const std::string &version_string) -{ -    S32 i; -    for (i = 0; i < 4; i++) -    { -        mFields[i] = 0; -    } -    // Split the version string. -    std::string str(version_string); -    typedef boost::tokenizer<boost::char_separator<char> > tokenizer; -    boost::char_separator<char> sep(".", "", boost::keep_empty_tokens); -    tokenizer tokens(str, sep); - -    tokenizer::iterator iter = tokens.begin(); -    S32 count = 0; -    for (;(iter != tokens.end()) && (count < 4);++iter) -    { -        mFields[count] = atoi(iter->c_str()); -        count++; -    } -    if (count < 4) -    { -        //LL_WARNS() << "Potentially bogus version string!" << version_string << LL_ENDL; -        for (i = 0; i < 4; i++) -        { -            mFields[i] = 0; -        } -        mValid = false; -    } -    else -    { -        mValid = true; -    } -    return mValid; -} - -S32 LLVersion::getField(const S32 field_num) -{ -    if (!mValid) -    { -        return -1; -    } -    else -    { -        return mFields[field_num]; -    } -} - -std::string LLDXDriverFile::dump() -{ -    if (gWriteDebug) -    { -        gWriteDebug("Filename:"); -        gWriteDebug(mName.c_str()); -        gWriteDebug("\n"); -        gWriteDebug("Ver:"); -        gWriteDebug(mVersionString.c_str()); -        gWriteDebug("\n"); -        gWriteDebug("Date:"); -        gWriteDebug(mDateString.c_str()); -        gWriteDebug("\n"); -    } -    LL_INFOS() << mFilepath << LL_ENDL; -    LL_INFOS() << mName << LL_ENDL; -    LL_INFOS() << mVersionString << LL_ENDL; -    LL_INFOS() << mDateString << LL_ENDL; - -    return ""; -} - -LLDXDevice::~LLDXDevice() -{ -    for_each(mDriverFiles.begin(), mDriverFiles.end(), DeletePairedPointer()); -    mDriverFiles.clear(); -} - -std::string LLDXDevice::dump() -{ -    if (gWriteDebug) -    { -        gWriteDebug("StartDevice\n"); -        gWriteDebug("DeviceName:"); -        gWriteDebug(mName.c_str()); -        gWriteDebug("\n"); -        gWriteDebug("PCIString:"); -        gWriteDebug(mPCIString.c_str()); -        gWriteDebug("\n"); -    } -    LL_INFOS() << LL_ENDL; -    LL_INFOS() << "DeviceName:" << mName << LL_ENDL; -    LL_INFOS() << "PCIString:" << mPCIString << LL_ENDL; -    LL_INFOS() << "Drivers" << LL_ENDL; -    LL_INFOS() << "-------" << LL_ENDL; -    for (driver_file_map_t::iterator iter = mDriverFiles.begin(), -             end = mDriverFiles.end(); -         iter != end; iter++) -    { -        LLDXDriverFile *filep = iter->second; -        filep->dump(); -    } -    if (gWriteDebug) -    { -        gWriteDebug("EndDevice\n"); -    } - -    return ""; -} - -LLDXDriverFile *LLDXDevice::findDriver(const std::string &driver) -{ -    for (driver_file_map_t::iterator iter = mDriverFiles.begin(), -             end = mDriverFiles.end(); -         iter != end; iter++) -    { -        LLDXDriverFile *filep = iter->second; -        if (!utf8str_compare_insensitive(filep->mName,driver)) -        { -            return filep; -        } -    } - -    return NULL; -} -  LLDXHardware::LLDXHardware()  { -    mVRAM = 0; -    gWriteDebug = NULL;  }  void LLDXHardware::cleanup()  { -  // for_each(mDevices.begin(), mDevices.end(), DeletePairedPointer()); -  // mDevices.clear(); -} - -/* -std::string LLDXHardware::dumpDevices() -{ -    if (gWriteDebug) -    { -        gWriteDebug("\n"); -        gWriteDebug("StartAllDevices\n"); -    } -    for (device_map_t::iterator iter = mDevices.begin(), -             end = mDevices.end(); -         iter != end; iter++) -    { -        LLDXDevice *devicep = iter->second; -        devicep->dump(); -    } -    if (gWriteDebug) -    { -        gWriteDebug("EndAllDevices\n\n"); -    } -    return "";  } -LLDXDevice *LLDXHardware::findDevice(const std::string &vendor, const std::string &devices) -{ -    // Iterate through different devices tokenized in devices string -    std::string str(devices); -    typedef boost::tokenizer<boost::char_separator<char> > tokenizer; -    boost::char_separator<char> sep("|", "", boost::keep_empty_tokens); -    tokenizer tokens(str, sep); - -    tokenizer::iterator iter = tokens.begin(); -    for (;iter != tokens.end();++iter) -    { -        std::string dev_str = *iter; -        for (device_map_t::iterator iter = mDevices.begin(), -                 end = mDevices.end(); -             iter != end; iter++) -        { -            LLDXDevice *devicep = iter->second; -            if ((devicep->mVendorID == vendor) -                && (devicep->mDeviceID == dev_str)) -            { -                return devicep; -            } -        } -    } - -    return NULL; -} -*/ - -bool LLDXHardware::getInfo(bool vram_only) -{ -    LLTimer hw_timer; -    bool ok = false; -    HRESULT       hr; - -    // CLSID_DxDiagProvider does not work with Multithreaded? -    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); - -    IDxDiagProvider *dx_diag_providerp = NULL; -    IDxDiagContainer *dx_diag_rootp = NULL; -    IDxDiagContainer *devices_containerp = NULL; -    // IDxDiagContainer *system_device_containerp= NULL; -    IDxDiagContainer *device_containerp = NULL; -    IDxDiagContainer *file_containerp = NULL; -    IDxDiagContainer *driver_containerp = NULL; -    DWORD dw_device_count; - -    mVRAM = 0; - -    // CoCreate a IDxDiagProvider* -    LL_DEBUGS("AppInit") << "CoCreateInstance IID_IDxDiagProvider" << LL_ENDL; -    hr = CoCreateInstance(CLSID_DxDiagProvider, -                          NULL, -                          CLSCTX_INPROC_SERVER, -                          IID_IDxDiagProvider, -                          (LPVOID*) &dx_diag_providerp); - -    if (FAILED(hr)) -    { -        LL_WARNS("AppInit") << "No DXDiag provider found!  DirectX 9 not installed!" << LL_ENDL; -        gWriteDebug("No DXDiag provider found!  DirectX 9 not installed!\n"); -        goto LCleanup; -    } -    if (SUCCEEDED(hr)) // if FAILED(hr) then dx9 is not installed -    { -        // Fill out a DXDIAG_INIT_PARAMS struct and pass it to IDxDiagContainer::Initialize -        // Passing in TRUE for bAllowWHQLChecks, allows dxdiag to check if drivers are -        // digital signed as logo'd by WHQL which may connect via internet to update -        // WHQL certificates. -        DXDIAG_INIT_PARAMS dx_diag_init_params; -        ZeroMemory(&dx_diag_init_params, sizeof(DXDIAG_INIT_PARAMS)); - -        dx_diag_init_params.dwSize                  = sizeof(DXDIAG_INIT_PARAMS); -        dx_diag_init_params.dwDxDiagHeaderVersion   = DXDIAG_DX9_SDK_VERSION; -        dx_diag_init_params.bAllowWHQLChecks        = TRUE; -        dx_diag_init_params.pReserved               = NULL; - -        LL_DEBUGS("AppInit") << "dx_diag_providerp->Initialize" << LL_ENDL; -        hr = dx_diag_providerp->Initialize(&dx_diag_init_params); -        if(FAILED(hr)) -        { -            goto LCleanup; -        } - -        LL_DEBUGS("AppInit") << "dx_diag_providerp->GetRootContainer" << LL_ENDL; -        hr = dx_diag_providerp->GetRootContainer( &dx_diag_rootp ); -        if(FAILED(hr) || !dx_diag_rootp) -        { -            goto LCleanup; -        } - -        HRESULT hr; - -        // Get display driver information -        LL_DEBUGS("AppInit") << "dx_diag_rootp->GetChildContainer" << LL_ENDL; -        hr = dx_diag_rootp->GetChildContainer(L"DxDiag_DisplayDevices", &devices_containerp); -        if(FAILED(hr) || !devices_containerp) -        { -            // do not release 'dirty' devices_containerp at this stage, only dx_diag_rootp -            devices_containerp = NULL; -            goto LCleanup; -        } - -        // make sure there is something inside -        hr = devices_containerp->GetNumberOfChildContainers(&dw_device_count); -        if (FAILED(hr) || dw_device_count == 0) -        { -            goto LCleanup; -        } - -        // Get device 0 -        // By default 0 device is the primary one, howhever in case of various hybrid graphics -        // like itegrated AMD and PCI AMD GPUs system might switch. -        LL_DEBUGS("AppInit") << "devices_containerp->GetChildContainer" << LL_ENDL; -        hr = devices_containerp->GetChildContainer(L"0", &device_containerp); -        if(FAILED(hr) || !device_containerp) -        { -            goto LCleanup; -        } - -        DWORD vram = 0; - -        WCHAR deviceID[512]; - -        get_wstring(device_containerp, L"szDeviceID", deviceID, 512); -        // Example: searches id like 1F06 in pnp string (aka VEN_10DE&DEV_1F06) -        // doesn't seem to work on some systems since format is unrecognizable -        // but in such case keyDeviceID works -        if (SUCCEEDED(GetVideoMemoryViaWMI(deviceID, &vram))) -        { -            mVRAM = vram/(1024*1024); -        } -        else -        { -            get_wstring(device_containerp, L"szKeyDeviceID", deviceID, 512); -            LL_WARNS() << "szDeviceID" << deviceID << LL_ENDL; -            // '+9' to avoid ENUM\\PCI\\ prefix -            // Returns string like Enum\\PCI\\VEN_10DE&DEV_1F06&SUBSYS... -            // and since GetVideoMemoryViaWMI searches by PNPDeviceID it is sufficient -            if (SUCCEEDED(GetVideoMemoryViaWMI(deviceID + 9, &vram))) -            { -                mVRAM = vram / (1024 * 1024); -            } -        } - -        if (mVRAM == 0) -        { // Get the English VRAM string -          std::string ram_str = get_string(device_containerp, L"szDisplayMemoryEnglish"); - -          // We don't need the device any more -          SAFE_RELEASE(device_containerp); - -          // Dump the string as an int into the structure -          char *stopstring; -          mVRAM = strtol(ram_str.c_str(), &stopstring, 10); -          LL_INFOS("AppInit") << "VRAM Detected: " << mVRAM << " DX9 string: " << ram_str << LL_ENDL; -        } - -        if (vram_only) -        { -            ok = true; -            goto LCleanup; -        } - - -        /* for now, we ONLY do vram_only the rest of this -           is commented out, to ensure no-one is tempted -           to use it - -        // Now let's get device and driver information -        // Get the IDxDiagContainer object called "DxDiag_SystemDevices". -        // This call may take some time while dxdiag gathers the info. -        DWORD num_devices = 0; -        WCHAR wszContainer[256]; -        LL_DEBUGS("AppInit") << "dx_diag_rootp->GetChildContainer DxDiag_SystemDevices" << LL_ENDL; -        hr = dx_diag_rootp->GetChildContainer(L"DxDiag_SystemDevices", &system_device_containerp); -        if (FAILED(hr)) -        { -            goto LCleanup; -        } - -        hr = system_device_containerp->GetNumberOfChildContainers(&num_devices); -        if (FAILED(hr)) -        { -            goto LCleanup; -        } - -        LL_DEBUGS("AppInit") << "DX9 iterating over devices" << LL_ENDL; -        S32 device_num = 0; -        for (device_num = 0; device_num < (S32)num_devices; device_num++) -        { -            hr = system_device_containerp->EnumChildContainerNames(device_num, wszContainer, 256); -            if (FAILED(hr)) -            { -                goto LCleanup; -            } - -            hr = system_device_containerp->GetChildContainer(wszContainer, &device_containerp); -            if (FAILED(hr) || device_containerp == NULL) -            { -                goto LCleanup; -            } - -            std::string device_name = get_string(device_containerp, L"szDescription"); - -            std::string device_id = get_string(device_containerp, L"szDeviceID"); - -            LLDXDevice *dxdevicep = new LLDXDevice; -            dxdevicep->mName = device_name; -            dxdevicep->mPCIString = device_id; -            mDevices[dxdevicep->mPCIString] = dxdevicep; - -            // Split the PCI string based on vendor, device, subsys, rev. -            std::string str(device_id); -            typedef boost::tokenizer<boost::char_separator<char> > tokenizer; -            boost::char_separator<char> sep("&\\", "", boost::keep_empty_tokens); -            tokenizer tokens(str, sep); - -            tokenizer::iterator iter = tokens.begin(); -            S32 count = 0; -            bool valid = true; -            for (;(iter != tokens.end()) && (count < 3);++iter) -            { -                switch (count) -                { -                case 0: -                    if (strcmp(iter->c_str(), "PCI")) -                    { -                        valid = false; -                    } -                    break; -                case 1: -                    dxdevicep->mVendorID = iter->c_str(); -                    break; -                case 2: -                    dxdevicep->mDeviceID = iter->c_str(); -                    break; -                default: -                    // Ignore it -                    break; -                } -                count++; -            } - - - - -            // Now, iterate through the related drivers -            hr = device_containerp->GetChildContainer(L"Drivers", &driver_containerp); -            if (FAILED(hr) || !driver_containerp) -            { -                goto LCleanup; -            } - -            DWORD num_files = 0; -            hr = driver_containerp->GetNumberOfChildContainers(&num_files); -            if (FAILED(hr)) -            { -                goto LCleanup; -            } - -            S32 file_num = 0; -            for (file_num = 0; file_num < (S32)num_files; file_num++ ) -            { - -                hr = driver_containerp->EnumChildContainerNames(file_num, wszContainer, 256); -                if (FAILED(hr)) -                { -                    goto LCleanup; -                } - -                hr = driver_containerp->GetChildContainer(wszContainer, &file_containerp); -                if (FAILED(hr) || file_containerp == NULL) -                { -                    goto LCleanup; -                } - -                std::string driver_path = get_string(file_containerp, L"szPath"); -                std::string driver_name = get_string(file_containerp, L"szName"); -                std::string driver_version = get_string(file_containerp, L"szVersion"); -                std::string driver_date = get_string(file_containerp, L"szDatestampEnglish"); - -                LLDXDriverFile *dxdriverfilep = new LLDXDriverFile; -                dxdriverfilep->mName = driver_name; -                dxdriverfilep->mFilepath= driver_path; -                dxdriverfilep->mVersionString = driver_version; -                dxdriverfilep->mVersion.set(driver_version); -                dxdriverfilep->mDateString = driver_date; - -                dxdevicep->mDriverFiles[driver_name] = dxdriverfilep; - -                SAFE_RELEASE(file_containerp); -            } -            SAFE_RELEASE(device_containerp); -        } -        */ -    } - -    // dumpDevices(); -    ok = true; - -LCleanup: -    if (!ok) -    { -        LL_WARNS("AppInit") << "DX9 probe failed" << LL_ENDL; -        gWriteDebug("DX9 probe failed\n"); -    } - -    SAFE_RELEASE(file_containerp); -    SAFE_RELEASE(driver_containerp); -    SAFE_RELEASE(device_containerp); -    SAFE_RELEASE(devices_containerp); -    SAFE_RELEASE(dx_diag_rootp); -    SAFE_RELEASE(dx_diag_providerp); - -    CoUninitialize(); - -    return ok; -    } -  LLSD LLDXHardware::getDisplayInfo()  {      LLTimer hw_timer; @@ -995,7 +349,6 @@ LLSD LLDXHardware::getDisplayInfo()      if (FAILED(hr))      {          LL_WARNS() << "No DXDiag provider found!  DirectX 9 not installed!" << LL_ENDL; -        gWriteDebug("No DXDiag provider found!  DirectX 9 not installed!\n");          goto LCleanup;      }      if (SUCCEEDED(hr)) // if FAILED(hr) then dx9 is not installed @@ -1111,9 +464,4 @@ LCleanup:      return ret;  } -void LLDXHardware::setWriteDebugFunc(void (*func)(const char*)) -{ -    gWriteDebug = func; -} -  #endif diff --git a/indra/llwindow/lldxhardware.h b/indra/llwindow/lldxhardware.h index 2b879e021c..8d8a08a4eb 100644 --- a/indra/llwindow/lldxhardware.h +++ b/indra/llwindow/lldxhardware.h @@ -30,64 +30,16 @@  #include <map>  #include "stdtypes.h" -#include "llstring.h"  #include "llsd.h" -class LLVersion -{ -public: -    LLVersion(); -    bool set(const std::string &version_string); -    S32 getField(const S32 field_num); -protected: -    std::string mVersionString; -    S32 mFields[4]; -    bool mValid; -}; - -class LLDXDriverFile -{ -public: -    std::string dump(); - -public: -    std::string mFilepath; -    std::string mName; -    std::string mVersionString; -    LLVersion mVersion; -    std::string mDateString; -}; - -class LLDXDevice -{ -public: -    ~LLDXDevice(); -    std::string dump(); - -    LLDXDriverFile *findDriver(const std::string &driver); -public: -    std::string mName; -    std::string mPCIString; -    std::string mVendorID; -    std::string mDeviceID; - -    typedef std::map<std::string, LLDXDriverFile *> driver_file_map_t; -    driver_file_map_t mDriverFiles; -}; -  class LLDXHardware  {  public:      LLDXHardware(); -    void setWriteDebugFunc(void (*func)(const char*));      void cleanup(); -    // Returns true on success. -    // vram_only true does a "light" probe. -    bool getInfo(bool vram_only); -      // WMI can return multiple GPU drivers      // specify which one to output      typedef enum { @@ -98,29 +50,9 @@ public:      } EGPUVendor;      std::string getDriverVersionWMI(EGPUVendor vendor); -    S32 getVRAM() const { return mVRAM; } -      LLSD getDisplayInfo(); - -    // Will get memory of best GPU in MB, return memory on sucsess, 0 on failure -    // Note: WMI is not accurate in some cases -    static U32 getMBVideoMemoryViaWMI(); - -    // Find a particular device that matches the following specs. -    // Empty strings indicate that you don't care. -    // You can separate multiple devices with '|' chars to indicate you want -    // ANY of them to match and return. -    // LLDXDevice *findDevice(const std::string &vendor, const std::string &devices); - -    // std::string dumpDevices(); -public: -    typedef std::map<std::string, LLDXDevice *> device_map_t; -    // device_map_t mDevices; -protected: -    S32 mVRAM;  }; -extern void (*gWriteDebug)(const char* msg);  extern LLDXHardware gDXHardware;  #endif // LL_LLDXHARDWARE_H diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 730e658c6a..a781e638ee 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -4681,9 +4681,18 @@ void LLWindowWin32::LLWindowWin32Thread::checkDXMem()                          if (phys_mb > 0)                          { -                            // Intel uses 'shared' vram, cap it to 25% of total memory -                            // Todo: consider caping all adapters at least to 50% ram -                            budget_mb = llmin(budget_mb, (UINT64)(phys_mb * 0.25)); +                            if (gGLManager.mIsIntel) +                            { +                                // Intel uses 'shared' vram, cap it to 25% of total memory +                                // Todo: consider a way of detecting integrated Intel and AMD +                                budget_mb = llmin(budget_mb, (UINT64)(phys_mb * 0.25)); +                            } +                            else +                            { +                                // More budget is generally better, but the way viewer +                                // utilizes even dedicated VRAM leaves a footprint in RAM +                                budget_mb = llmin(budget_mb, (UINT64)(phys_mb * 0.75)); +                            }                          }                          else                          { diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 8d7f37142f..0f81c2b8ef 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -103,6 +103,7 @@ set(viewer_SOURCE_FILES      llagentwearables.cpp      llanimstatelabels.cpp      llappcorehttp.cpp +    llappearancelistener.cpp      llappearancemgr.cpp      llappviewer.cpp      llappviewerlistener.cpp @@ -778,6 +779,7 @@ set(viewer_HEADER_FILES      llanimstatelabels.h      llappcorehttp.h      llappearance.h +    llappearancelistener.h      llappearancemgr.h      llappviewer.h      llappviewerlistener.h diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f8487c020e..561957477e 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -368,6 +368,17 @@        <key>Value</key>        <real>0.5</real>      </map> +    <key>AudioLevelWind</key> +    <map> +      <key>Comment</key> +      <string>Audio level of wind noise when standing still</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.5</real> +    </map>  	<key>AudioStreamingMedia</key>      <map>        <key>Comment</key> @@ -9628,6 +9639,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>RenderBalanceInSnapshot</key> +    <map> +      <key>Comment</key> +      <string>Display L$ balance in snapshot</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderUIBuffer</key>      <map>        <key>Comment</key> diff --git a/indra/newview/app_settings/shaders/class1/deferred/tonemapUtilF.glsl b/indra/newview/app_settings/shaders/class1/deferred/tonemapUtilF.glsl index a63b8d7c2b..774ccb6baf 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/tonemapUtilF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/tonemapUtilF.glsl @@ -117,27 +117,34 @@ uniform float exposure;  uniform float tonemap_mix;  uniform int tonemap_type; +  vec3 toneMap(vec3 color)  {  #ifndef NO_POST -    float exp_scale = texture(exposureMap, vec2(0.5,0.5)).r; - -    color *= exposure * exp_scale; +    vec3 linear_input_color = color; -    vec3 clamped_color = clamp(color.rgb, vec3(0.0), vec3(1.0)); +    float exp_scale = texture(exposureMap, vec2(0.5,0.5)).r; +    float final_exposure = exposure * exp_scale; +    vec3 exposed_color = color * final_exposure; +    vec3 tonemapped_color = exposed_color;      switch(tonemap_type)      {      case 0: -        color = PBRNeutralToneMapping(color); +        tonemapped_color = PBRNeutralToneMapping(exposed_color);          break;      case 1: -        color = toneMapACES_Hill(color); +        tonemapped_color = toneMapACES_Hill(exposed_color);          break;      } -    // mix tonemapped and linear here to provide adjustment -    color = mix(clamped_color, color, tonemap_mix); +    vec3 exposed_linear_input = linear_input_color * final_exposure; +    color = mix(exposed_linear_input, tonemapped_color, tonemap_mix); + +    color = clamp(color, 0.0, 1.0); +#else +    color *= exposure * texture(exposureMap, vec2(0.5,0.5)).r; +    color = clamp(color, 0.0, 1.0);  #endif      return color; @@ -147,20 +154,24 @@ vec3 toneMap(vec3 color)  vec3 toneMapNoExposure(vec3 color)  {  #ifndef NO_POST -    vec3 clamped_color = clamp(color.rgb, vec3(0.0), vec3(1.0)); +    vec3 linear_input_color = color; +    vec3 tonemapped_color = color;      switch(tonemap_type)      {      case 0: -        color = PBRNeutralToneMapping(color); +        tonemapped_color = PBRNeutralToneMapping(color);          break;      case 1: -        color = toneMapACES_Hill(color); +        tonemapped_color = toneMapACES_Hill(color);          break;      } -    // mix tonemapped and linear here to provide adjustment -    color = mix(clamped_color, color, tonemap_mix); +    color = mix(linear_input_color, tonemapped_color, tonemap_mix); + +    color = clamp(color, 0.0, 1.0); +#else +     color = clamp(color, 0.0, 1.0);  #endif      return color; diff --git a/indra/newview/groupchatlistener.cpp b/indra/newview/groupchatlistener.cpp index 43507f13e9..ed9e34d1bf 100644 --- a/indra/newview/groupchatlistener.cpp +++ b/indra/newview/groupchatlistener.cpp @@ -2,11 +2,11 @@   * @file   groupchatlistener.cpp   * @author Nat Goodspeed   * @date   2011-04-11 - * @brief  Implementation for groupchatlistener. + * @brief  Implementation for LLGroupChatListener.   * - * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * $LicenseInfo:firstyear=2024&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2011, Linden Research, Inc. + * Copyright (C) 2024, Linden Research, Inc.   *   * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public @@ -34,43 +34,69 @@  // std headers  // external library headers  // other Linden headers +#include "llchat.h"  #include "llgroupactions.h"  #include "llimview.h" +LLGroupChatListener::LLGroupChatListener(): +    LLEventAPI("GroupChat", +               "API to enter, leave, send and intercept group chat messages") +{ +    add("startGroupChat", +        "Enter a group chat in group with UUID [\"group_id\"]\n" +        "Assumes the logged-in agent is already a member of this group.", +        &LLGroupChatListener::startGroupChat, +        llsd::map("group_id", LLSD())); +    add("leaveGroupChat", +        "Leave a group chat in group with UUID [\"group_id\"]\n" +        "Assumes a prior successful startIM request.", +        &LLGroupChatListener::leaveGroupChat, +        llsd::map("group_id", LLSD())); +    add("sendGroupIM", +        "send a [\"message\"] to group with UUID [\"group_id\"]", +        &LLGroupChatListener::sendGroupIM, +        llsd::map("message", LLSD(), "group_id", LLSD())); +} -namespace { -    void startIm_wrapper(LLSD const & event) +bool is_in_group(LLEventAPI::Response &response, const LLSD &data) +{ +    if (!LLGroupActions::isInGroup(data["group_id"]))      { -        LLUUID session_id = LLGroupActions::startIM(event["id"].asUUID()); -        sendReply(LLSDMap("session_id", LLSD(session_id)), event); +        response.error(stringize("You are not the member of the group:", std::quoted(data["group_id"].asString()))); +        return false;      } +    return true; +} -    void send_message_wrapper(const std::string& text, const LLUUID& session_id, const LLUUID& group_id) +void LLGroupChatListener::startGroupChat(LLSD const &data) +{ +    Response response(LLSD(), data); +    if (!is_in_group(response, data)) +    { +        return; +    } +    if (LLGroupActions::startIM(data["group_id"]).isNull())      { -        LLIMModel::sendMessage(text, session_id, group_id, IM_SESSION_GROUP_START); +        return response.error(stringize("Failed to start group chat session ", std::quoted(data["group_id"].asString())));      }  } +void LLGroupChatListener::leaveGroupChat(LLSD const &data) +{ +    Response response(LLSD(), data); +    if (is_in_group(response, data)) +    { +        LLGroupActions::endIM(data["group_id"].asUUID()); +    } +} -GroupChatListener::GroupChatListener(): -    LLEventAPI("GroupChat", -               "API to enter, leave, send and intercept group chat messages") +void LLGroupChatListener::sendGroupIM(LLSD const &data)  { -    add("startIM", -        "Enter a group chat in group with UUID [\"id\"]\n" -        "Assumes the logged-in agent is already a member of this group.", -        &startIm_wrapper); -    add("endIM", -        "Leave a group chat in group with UUID [\"id\"]\n" -        "Assumes a prior successful startIM request.", -        &LLGroupActions::endIM, -        llsd::array("id")); -    add("sendIM", -        "send a groupchat IM", -        &send_message_wrapper, -        llsd::array("text", "session_id", "group_id")); +    Response response(LLSD(), data); +    if (!is_in_group(response, data)) +    { +        return; +    } +    LLUUID group_id(data["group_id"]); +    LLIMModel::sendMessage(data["message"], gIMMgr->computeSessionID(IM_SESSION_GROUP_START, group_id), group_id, IM_SESSION_SEND);  } -/* -    static void sendMessage(const std::string& utf8_text, const LLUUID& im_session_id, -                                const LLUUID& other_participant_id, EInstantMessage dialog); -*/ diff --git a/indra/newview/groupchatlistener.h b/indra/newview/groupchatlistener.h index 3819ac59b7..14cd7266a3 100644 --- a/indra/newview/groupchatlistener.h +++ b/indra/newview/groupchatlistener.h @@ -26,15 +26,20 @@   * $/LicenseInfo$   */ -#if ! defined(LL_GROUPCHATLISTENER_H) -#define LL_GROUPCHATLISTENER_H +#if ! defined(LL_LLGROUPCHATLISTENER_H) +#define LL_LLGROUPCHATLISTENER_H  #include "lleventapi.h" -class GroupChatListener: public LLEventAPI +class LLGroupChatListener: public LLEventAPI  {  public: -    GroupChatListener(); +    LLGroupChatListener(); + +private: +    void startGroupChat(LLSD const &data); +    void leaveGroupChat(LLSD const &data); +    void sendGroupIM(LLSD const &data);  }; -#endif /* ! defined(LL_GROUPCHATLISTENER_H) */ +#endif /* ! defined(LL_LLGROUPCHATLISTENER_H) */ diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp index 0c120ae01d..5ddb87558a 100644 --- a/indra/newview/llagentlistener.cpp +++ b/indra/newview/llagentlistener.cpp @@ -31,19 +31,25 @@  #include "llagentlistener.h"  #include "llagent.h" +#include "llagentcamera.h" +#include "llavatarname.h" +#include "llavatarnamecache.h"  #include "llvoavatar.h"  #include "llcommandhandler.h" +#include "llinventorymodel.h"  #include "llslurl.h"  #include "llurldispatcher.h" +#include "llviewercontrol.h"  #include "llviewernetwork.h"  #include "llviewerobject.h"  #include "llviewerobjectlist.h"  #include "llviewerregion.h" +#include "llvoavatarself.h"  #include "llsdutil.h"  #include "llsdutil_math.h"  #include "lltoolgrab.h"  #include "llhudeffectlookat.h" -#include "llagentcamera.h" +#include "llviewercamera.h"  LLAgentListener::LLAgentListener(LLAgent &agent)    : LLEventAPI("LLAgent", @@ -69,13 +75,6 @@ LLAgentListener::LLAgentListener(LLAgent &agent)      add("resetAxes",          "Set the agent to a fixed orientation (optionally specify [\"lookat\"] = array of [x, y, z])",          &LLAgentListener::resetAxes); -    add("getAxes", -        "Obsolete - use getPosition instead\n" -        "Send information about the agent's orientation on [\"reply\"]:\n" -        "[\"euler\"]: map of {roll, pitch, yaw}\n" -        "[\"quat\"]:  array of [x, y, z, w] quaternion values", -        &LLAgentListener::getAxes, -        LLSDMap("reply", LLSD()));      add("getPosition",          "Send information about the agent's position and orientation on [\"reply\"]:\n"          "[\"region\"]: array of region {x, y, z} position\n" @@ -87,33 +86,34 @@ LLAgentListener::LLAgentListener(LLAgent &agent)      add("startAutoPilot",          "Start the autopilot system using the following parameters:\n"          "[\"target_global\"]: array of target global {x, y, z} position\n" -        "[\"stop_distance\"]: target maxiumum distance from target [default: autopilot guess]\n" +        "[\"stop_distance\"]: maximum stop distance from target [default: autopilot guess]\n"          "[\"target_rotation\"]: array of [x, y, z, w] quaternion values [default: no target]\n"          "[\"rotation_threshold\"]: target maximum angle from target facing rotation [default: 0.03 radians]\n" -        "[\"behavior_name\"]: name of the autopilot behavior [default: \"\"]" -        "[\"allow_flying\"]: allow flying during autopilot [default: True]", -        //"[\"callback_pump\"]: pump to send success/failure and callback data to [default: none]\n" -        //"[\"callback_data\"]: data to send back during a callback [default: none]", -        &LLAgentListener::startAutoPilot); +        "[\"behavior_name\"]: name of the autopilot behavior [default: \"\"]\n" +        "[\"allow_flying\"]: allow flying during autopilot [default: True]\n" +        "event with [\"success\"] flag is sent to 'LLAutopilot' event pump, when auto pilot is terminated", +        &LLAgentListener::startAutoPilot, +        llsd::map("target_global", LLSD()));      add("getAutoPilot",          "Send information about current state of the autopilot system to [\"reply\"]:\n"          "[\"enabled\"]: boolean indicating whether or not autopilot is enabled\n"          "[\"target_global\"]: array of target global {x, y, z} position\n"          "[\"leader_id\"]: uuid of target autopilot is following\n" -        "[\"stop_distance\"]: target maximum distance from target\n" +        "[\"stop_distance\"]: maximum stop distance from target\n"          "[\"target_distance\"]: last known distance from target\n"          "[\"use_rotation\"]: boolean indicating if autopilot has a target facing rotation\n"          "[\"target_facing\"]: array of {x, y} target direction to face\n"          "[\"rotation_threshold\"]: target maximum angle from target facing rotation\n"          "[\"behavior_name\"]: name of the autopilot behavior",          &LLAgentListener::getAutoPilot, -        LLSDMap("reply", LLSD())); +        llsd::map("reply", LLSD()));      add("startFollowPilot",          "[\"leader_id\"]: uuid of target to follow using the autopilot system (optional with avatar_name)\n"          "[\"avatar_name\"]: avatar name to follow using the autopilot system (optional with leader_id)\n"          "[\"allow_flying\"]: allow flying during autopilot [default: True]\n" -        "[\"stop_distance\"]: target maxiumum distance from target [default: autopilot guess]", -        &LLAgentListener::startFollowPilot); +        "[\"stop_distance\"]: maximum stop distance from target [default: autopilot guess]", +        &LLAgentListener::startFollowPilot, +        llsd::map("reply", LLSD()));      add("setAutoPilotTarget",          "Update target for currently running autopilot:\n"          "[\"target_global\"]: array of target global {x, y, z} position", @@ -138,6 +138,69 @@ LLAgentListener::LLAgentListener(LLAgent &agent)          "[\"contrib\"]: user's land contribution to this group\n",          &LLAgentListener::getGroups,          LLSDMap("reply", LLSD())); +    //camera params are similar to LSL, see https://wiki.secondlife.com/wiki/LlSetCameraParams +    add("setCameraParams", +        "Set Follow camera params, and then activate it:\n" +        "[\"camera_pos\"]: vector3, camera position in region coordinates\n" +        "[\"focus_pos\"]: vector3, what the camera is aimed at (in region coordinates)\n" +        "[\"focus_offset\"]: vector3, adjusts the camera focus position relative to the target, default is (1, 0, 0)\n" +        "[\"distance\"]: float (meters), distance the camera wants to be from its target, default is 3\n" +        "[\"focus_threshold\"]: float (meters), sets the radius of a sphere around the camera's target position within which its focus is not affected by target motion, default is 1\n" +        "[\"camera_threshold\"]: float (meters), sets the radius of a sphere around the camera's ideal position within which it is not affected by target motion, default is 1\n" +        "[\"focus_lag\"]: float (seconds), how much the camera lags as it tries to aim towards the target, default is 0.1\n" +        "[\"camera_lag\"]: float (seconds), how much the camera lags as it tries to move towards its 'ideal' position, default is 0.1\n" +        "[\"camera_pitch\"]: float (degrees), adjusts the angular amount that the camera aims straight ahead vs. straight down, maintaining the same distance, default is 0\n" +        "[\"behindness_angle\"]: float (degrees), sets the angle in degrees within which the camera is not constrained by changes in target rotation, default is 10\n" +        "[\"behindness_lag\"]: float (seconds), sets how strongly the camera is forced to stay behind the target if outside of behindness angle, default is 0\n" +        "[\"camera_locked\"]: bool, locks the camera position so it will not move\n" +        "[\"focus_locked\"]: bool, locks the camera focus so it will not move", +        &LLAgentListener::setFollowCamParams); +    add("setFollowCamActive", +        "Turns on or off scripted control of the camera using boolean [\"active\"]", +        &LLAgentListener::setFollowCamActive, +        llsd::map("active", LLSD())); +    add("removeCameraParams", +        "Reset Follow camera params", +        &LLAgentListener::removeFollowCamParams); + +    add("playAnimation", +        "Play [\"item_id\"] animation locally (by default) or [\"inworld\"] (when set to true)", +        &LLAgentListener::playAnimation, +        llsd::map("item_id", LLSD(), "reply", LLSD())); +    add("stopAnimation", +        "Stop playing [\"item_id\"] animation", +        &LLAgentListener::stopAnimation, +        llsd::map("item_id", LLSD(), "reply", LLSD())); +    add("getAnimationInfo", +        "Return information about [\"item_id\"] animation", +        &LLAgentListener::getAnimationInfo, +        llsd::map("item_id", LLSD(), "reply", LLSD())); + +    add("getID", +        "Return your own avatar ID", +        &LLAgentListener::getID, +        llsd::map("reply", LLSD())); + +    add("getNearbyAvatarsList", +        "Return result set key [\"result\"] for nearby avatars in a range of [\"dist\"]\n" +        "if [\"dist\"] is not specified, 'RenderFarClip' setting is used\n" +        "reply contains \"result\" table with \"id\", \"name\", \"global_pos\", \"region_pos\", \"region_id\" fields", +        &LLAgentListener::getNearbyAvatarsList, +        llsd::map("reply", LLSD())); + +    add("getNearbyObjectsList", +        "Return result set key [\"result\"] for nearby objects in a range of [\"dist\"]\n" +        "if [\"dist\"] is not specified, 'RenderFarClip' setting is used\n" +        "reply contains \"result\" table with \"id\", \"global_pos\", \"region_pos\", \"region_id\" fields", +        &LLAgentListener::getNearbyObjectsList, +        llsd::map("reply", LLSD())); + +    add("getAgentScreenPos", +        "Return screen position of the [\"avatar_id\"] avatar or own avatar if not specified\n" +        "reply contains \"x\", \"y\" coordinates and \"onscreen\" flag to indicate if it's actually in within the current window\n" +        "avatar render position is used as the point", +        &LLAgentListener::getAgentScreenPos, +        llsd::map("reply", LLSD()));  }  void LLAgentListener::requestTeleport(LLSD const & event_data) const @@ -168,7 +231,7 @@ void LLAgentListener::requestSit(LLSD const & event_data) const      //mAgent.getAvatarObject()->sitOnObject();      // shamelessly ripped from llviewermenu.cpp:handle_sit_or_stand()      // *TODO - find a permanent place to share this code properly. - +    Response response(LLSD(), event_data);      LLViewerObject *object = NULL;      if (event_data.has("obj_uuid"))      { @@ -177,7 +240,13 @@ void LLAgentListener::requestSit(LLSD const & event_data) const      else if (event_data.has("position"))      {          LLVector3 target_position = ll_vector3_from_sd(event_data["position"]); -        object = findObjectClosestTo(target_position); +        object = findObjectClosestTo(target_position, true); +    } +    else +    { +        //just sit on the ground +        mAgent.setControlFlags(AGENT_CONTROL_SIT_ON_GROUND); +        return;      }      if (object && object->getPCode() == LL_PCODE_VOLUME) @@ -194,8 +263,7 @@ void LLAgentListener::requestSit(LLSD const & event_data) const      }      else      { -        LL_WARNS() << "LLAgent requestSit could not find the sit target: " -            << event_data << LL_ENDL; +        response.error("requestSit could not find the sit target");      }  } @@ -205,7 +273,7 @@ void LLAgentListener::requestStand(LLSD const & event_data) const  } -LLViewerObject * LLAgentListener::findObjectClosestTo( const LLVector3 & position ) const +LLViewerObject * LLAgentListener::findObjectClosestTo(const LLVector3 & position, bool sit_target) const  {      LLViewerObject *object = NULL; @@ -216,8 +284,13 @@ LLViewerObject * LLAgentListener::findObjectClosestTo( const LLVector3 & positio      while (cur_index < num_objects)      {          LLViewerObject * cur_object = gObjectList.getObject(cur_index++); -        if (cur_object) -        {   // Calculate distance from the target position +        if (cur_object && !cur_object->isAttachment()) +        { +            if(sit_target && (cur_object->getPCode() != LL_PCODE_VOLUME)) +            { +                continue; +            } +            // Calculate distance from the target position              LLVector3 target_diff = cur_object->getPositionRegion() - position;              F32 distance_to_target = target_diff.length();              if (distance_to_target < min_distance) @@ -296,22 +369,6 @@ void LLAgentListener::resetAxes(const LLSD& event_data) const      }  } -void LLAgentListener::getAxes(const LLSD& event_data) const -{ -    LLQuaternion quat(mAgent.getQuat()); -    F32 roll, pitch, yaw; -    quat.getEulerAngles(&roll, &pitch, &yaw); -    // The official query API for LLQuaternion's [x, y, z, w] values is its -    // public member mQ... -    LLSD reply = LLSD::emptyMap(); -    reply["quat"] = llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ)); -    reply["euler"] = LLSD::emptyMap(); -    reply["euler"]["roll"] = roll; -    reply["euler"]["pitch"] = pitch; -    reply["euler"]["yaw"] = yaw; -    sendReply(reply, event_data); -} -  void LLAgentListener::getPosition(const LLSD& event_data) const  {      F32 roll, pitch, yaw; @@ -333,14 +390,13 @@ void LLAgentListener::getPosition(const LLSD& event_data) const  void LLAgentListener::startAutoPilot(LLSD const & event_data)  { -    LLQuaternion target_rotation_value;      LLQuaternion* target_rotation = NULL;      if (event_data.has("target_rotation"))      { -        target_rotation_value = ll_quaternion_from_sd(event_data["target_rotation"]); +        LLQuaternion target_rotation_value = ll_quaternion_from_sd(event_data["target_rotation"]);          target_rotation = &target_rotation_value;      } -    // *TODO: Use callback_pump and callback_data +      F32 rotation_threshold = 0.03f;      if (event_data.has("rotation_threshold"))      { @@ -360,13 +416,24 @@ void LLAgentListener::startAutoPilot(LLSD const & event_data)          stop_distance = (F32)event_data["stop_distance"].asReal();      } +    std::string behavior_name = LLCoros::getName(); +    if (event_data.has("behavior_name")) +    { +        behavior_name = event_data["behavior_name"].asString(); +    } +      // Clear follow target, this is doing a path      mFollowTarget.setNull(); +    auto finish_cb = [](bool success, void*) +    { +        LLEventPumps::instance().obtain("LLAutopilot").post(llsd::map("success", success)); +    }; +      mAgent.startAutoPilotGlobal(ll_vector3d_from_sd(event_data["target_global"]), -                                event_data["behavior_name"], +                                behavior_name,                                  target_rotation, -                                NULL, NULL, +                                finish_cb, NULL,                                  stop_distance,                                  rotation_threshold,                                  allow_flying); @@ -374,7 +441,7 @@ void LLAgentListener::startAutoPilot(LLSD const & event_data)  void LLAgentListener::getAutoPilot(const LLSD& event_data) const  { -    LLSD reply = LLSD::emptyMap(); +    Response reply(LLSD(), event_data);      LLSD::Boolean enabled = mAgent.getAutoPilot();      reply["enabled"] = enabled; @@ -403,12 +470,11 @@ void LLAgentListener::getAutoPilot(const LLSD& event_data) const      reply["rotation_threshold"] = mAgent.getAutoPilotRotationThreshold();      reply["behavior_name"] = mAgent.getAutoPilotBehaviorName();      reply["fly"] = (LLSD::Boolean) mAgent.getFlying(); - -    sendReply(reply, event_data);  }  void LLAgentListener::startFollowPilot(LLSD const & event_data)  { +    Response response(LLSD(), event_data);      LLUUID target_id;      bool allow_flying = true; @@ -442,6 +508,10 @@ void LLAgentListener::startFollowPilot(LLSD const & event_data)              }          }      } +    else +    { +        return response.error("'leader_id' or 'avatar_name' should be specified"); +    }      F32 stop_distance = 0.f;      if (event_data.has("stop_distance")) @@ -449,13 +519,16 @@ void LLAgentListener::startFollowPilot(LLSD const & event_data)          stop_distance = (F32)event_data["stop_distance"].asReal();      } -    if (target_id.notNull()) +    if (!gObjectList.findObject(target_id))      { -        mAgent.setFlying(allow_flying); -        mFollowTarget = target_id;  // Save follow target so we can report distance later - -        mAgent.startFollowPilot(target_id, allow_flying, stop_distance); +        std::string target_info = event_data.has("leader_id") ? event_data["leader_id"] : event_data["avatar_name"]; +        return response.error(stringize("Target ", std::quoted(target_info), " was not found"));      } + +    mAgent.setFlying(allow_flying); +    mFollowTarget = target_id;  // Save follow target so we can report distance later + +    mAgent.startFollowPilot(target_id, allow_flying, stop_distance);  }  void LLAgentListener::setAutoPilotTarget(LLSD const & event_data) const @@ -519,3 +592,209 @@ void LLAgentListener::getGroups(const LLSD& event) const      }      sendReply(LLSDMap("groups", reply), event);  } + +/*----------------------------- camera control -----------------------------*/ +// specialize LLSDParam to support (const LLVector3&) arguments -- this +// wouldn't even be necessary except that the relevant LLVector3 constructor +// is explicitly explicit +template <> +class LLSDParam<const LLVector3&>: public LLSDParamBase +{ +public: +    LLSDParam(const LLSD& value): value(LLVector3(value)) {} + +    operator const LLVector3&() const { return value; } + +private: +    LLVector3 value; +}; + +// accept any of a number of similar LLFollowCamMgr methods with different +// argument types, and return a wrapper lambda that accepts LLSD and converts +// to the target argument type +template <typename T> +auto wrap(void (LLFollowCamMgr::*method)(const LLUUID& source, T arg)) +{ +    return [method](LLFollowCamMgr& followcam, const LLUUID& source, const LLSD& arg) +    { (followcam.*method)(source, LLSDParam<T>(arg)); }; +} + +// table of supported LLFollowCamMgr methods, +// with the corresponding setFollowCamParams() argument keys +static std::pair<std::string, std::function<void(LLFollowCamMgr&, const LLUUID&, const LLSD&)>> +cam_params[] = +{ +    { "camera_pos",       wrap(&LLFollowCamMgr::setPosition) }, +    { "focus_pos",        wrap(&LLFollowCamMgr::setFocus) }, +    { "focus_offset",     wrap(&LLFollowCamMgr::setFocusOffset) }, +    { "camera_locked",    wrap(&LLFollowCamMgr::setPositionLocked) }, +    { "focus_locked",     wrap(&LLFollowCamMgr::setFocusLocked) }, +    { "distance",         wrap(&LLFollowCamMgr::setDistance) }, +    { "focus_threshold",  wrap(&LLFollowCamMgr::setFocusThreshold) }, +    { "camera_threshold", wrap(&LLFollowCamMgr::setPositionThreshold) }, +    { "focus_lag",        wrap(&LLFollowCamMgr::setFocusLag) }, +    { "camera_lag",       wrap(&LLFollowCamMgr::setPositionLag) }, +    { "camera_pitch",     wrap(&LLFollowCamMgr::setPitch) }, +    { "behindness_lag",   wrap(&LLFollowCamMgr::setBehindnessLag) }, +    { "behindness_angle", wrap(&LLFollowCamMgr::setBehindnessAngle) }, +}; + +void LLAgentListener::setFollowCamParams(const LLSD& event) const +{ +    auto& followcam{ LLFollowCamMgr::instance() }; +    for (const auto& pair : cam_params) +    { +        if (event.has(pair.first)) +        { +            pair.second(followcam, gAgentID, event[pair.first]); +        } +    } +    followcam.setCameraActive(gAgentID, true); +} + +void LLAgentListener::setFollowCamActive(LLSD const & event) const +{ +    LLFollowCamMgr::getInstance()->setCameraActive(gAgentID, event["active"]); +} + +void LLAgentListener::removeFollowCamParams(LLSD const & event) const +{ +    LLFollowCamMgr::getInstance()->removeFollowCamParams(gAgentID); +} + +LLViewerInventoryItem* get_anim_item(LLEventAPI::Response &response, const LLSD &event_data) +{ +    LLViewerInventoryItem* item = gInventory.getItem(event_data["item_id"].asUUID()); +    if (!item || (item->getInventoryType() != LLInventoryType::IT_ANIMATION)) +    { +        response.error(stringize("Animation item ", std::quoted(event_data["item_id"].asString()), " was not found")); +        return NULL; +    } +    return item; +} + +void LLAgentListener::playAnimation(LLSD const &event_data) +{ +    Response response(LLSD(), event_data); +    if (LLViewerInventoryItem* item = get_anim_item(response, event_data)) +    { +        if (event_data["inworld"].asBoolean()) +        { +            mAgent.sendAnimationRequest(item->getAssetUUID(), ANIM_REQUEST_START); +        } +        else +        { +            gAgentAvatarp->startMotion(item->getAssetUUID()); +        } +    } +} + +void LLAgentListener::stopAnimation(LLSD const &event_data) +{ +    Response response(LLSD(), event_data); +    if (LLViewerInventoryItem* item = get_anim_item(response, event_data)) +    { +        gAgentAvatarp->stopMotion(item->getAssetUUID()); +        mAgent.sendAnimationRequest(item->getAssetUUID(), ANIM_REQUEST_STOP); +    } +} + +void LLAgentListener::getAnimationInfo(LLSD const &event_data) +{ +    Response response(LLSD(), event_data); +    if (LLViewerInventoryItem* item = get_anim_item(response, event_data)) +    { +        // if motion exists, will return existing one +        LLMotion* motion = gAgentAvatarp->createMotion(item->getAssetUUID()); +        response["anim_info"] = llsd::map("duration", motion->getDuration(), +                                               "is_loop", motion->getLoop(), +                                               "num_joints", motion->getNumJointMotions(), +                                               "asset_id", item->getAssetUUID(), +                                               "priority", motion->getPriority()); +    } +} + +void LLAgentListener::getID(LLSD const& event_data) +{ +    Response response(llsd::map("id", gAgentID), event_data); +} + +F32 get_search_radius(LLSD const& event_data) +{ +    static LLCachedControl<F32> render_far_clip(gSavedSettings, "RenderFarClip", 64); +    F32 dist = render_far_clip; +    if (event_data.has("dist")) +    { +        dist = llclamp((F32)event_data["dist"].asReal(), 1, 512); +    } +   return dist * dist; +} + +void LLAgentListener::getNearbyAvatarsList(LLSD const& event_data) +{ +    Response response(LLSD(), event_data); +    F32 radius = get_search_radius(event_data); +    LLVector3d agent_pos = gAgent.getPositionGlobal(); +    for (LLCharacter* character : LLCharacter::sInstances) +    { +        LLVOAvatar* avatar = (LLVOAvatar*)character; +        if (avatar && !avatar->isDead() && !avatar->isControlAvatar() && !avatar->isSelf()) +        { +            if ((dist_vec_squared(avatar->getPositionGlobal(), agent_pos) <= radius)) +            { +                LLAvatarName av_name; +                LLAvatarNameCache::get(avatar->getID(), &av_name); +                LLVector3 region_pos = avatar->getCharacterPosition(); +                response["result"].append(llsd::map("id", avatar->getID(), "global_pos", ll_sd_from_vector3d(avatar->getPosGlobalFromAgent(region_pos)), +                                                    "region_pos", ll_sd_from_vector3(region_pos), "name", av_name.getUserName(), "region_id", avatar->getRegion()->getRegionID())); +            } +        } +    } +} + +void LLAgentListener::getNearbyObjectsList(LLSD const& event_data) +{ +    Response response(LLSD(), event_data); +    F32 radius = get_search_radius(event_data); +    S32 num_objects = gObjectList.getNumObjects(); +    LLVector3d agent_pos = gAgent.getPositionGlobal(); +    for (S32 i = 0; i < num_objects; ++i) +    { +        LLViewerObject* object = gObjectList.getObject(i); +        if (object && object->getVolume() && !object->isAttachment()) +        { +            if ((dist_vec_squared(object->getPositionGlobal(), agent_pos) <= radius)) +            { +                response["result"].append(llsd::map("id", object->getID(), "global_pos", ll_sd_from_vector3d(object->getPositionGlobal()), "region_pos", +                          ll_sd_from_vector3(object->getPositionRegion()), "region_id", object->getRegion()->getRegionID())); +            } +        } +    } +} + +void LLAgentListener::getAgentScreenPos(LLSD const& event_data) +{ +    Response response(LLSD(), event_data); +    LLVector3 render_pos; +    if (event_data.has("avatar_id") && (event_data["avatar_id"].asUUID() != gAgentID)) +    { +        LLUUID avatar_id(event_data["avatar_id"]); +        for (LLCharacter* character : LLCharacter::sInstances) +        { +            LLVOAvatar* avatar = (LLVOAvatar*)character; +            if (!avatar->isDead() && (avatar->getID() == avatar_id)) +            { +                render_pos = avatar->getRenderPosition(); +                break; +            } +        } +    } +    else if (gAgentAvatarp.notNull() && gAgentAvatarp->isValid()) +    { +        render_pos = gAgentAvatarp->getRenderPosition(); +    } +    LLCoordGL screen_pos; +    response["onscreen"] = LLViewerCamera::getInstance()->projectPosAgentToScreen(render_pos, screen_pos, false); +    response["x"] = screen_pos.mX; +    response["y"] = screen_pos.mY; +} diff --git a/indra/newview/llagentlistener.h b/indra/newview/llagentlistener.h index c544d089ce..b5bea8c0bd 100644 --- a/indra/newview/llagentlistener.h +++ b/indra/newview/llagentlistener.h @@ -48,7 +48,6 @@ private:      void requestStand(LLSD const & event_data) const;      void requestTouch(LLSD const & event_data) const;      void resetAxes(const LLSD& event_data) const; -    void getAxes(const LLSD& event_data) const;      void getGroups(const LLSD& event) const;      void getPosition(const LLSD& event_data) const;      void startAutoPilot(const LLSD& event_data); @@ -58,7 +57,20 @@ private:      void stopAutoPilot(const LLSD& event_data) const;      void lookAt(LLSD const & event_data) const; -    LLViewerObject * findObjectClosestTo( const LLVector3 & position ) const; +    void setFollowCamParams(LLSD const & event_data) const; +    void setFollowCamActive(LLSD const & event_data) const; +    void removeFollowCamParams(LLSD const & event_data) const; + +    void playAnimation(LLSD const &event_data); +    void stopAnimation(LLSD const &event_data); +    void getAnimationInfo(LLSD const &event_data); + +    void getID(LLSD const& event_data); +    void getNearbyAvatarsList(LLSD const& event_data); +    void getNearbyObjectsList(LLSD const& event_data); +    void getAgentScreenPos(LLSD const& event_data); + +    LLViewerObject * findObjectClosestTo( const LLVector3 & position, bool sit_target = false ) const;  private:      LLAgent &   mAgent; diff --git a/indra/newview/llappearancelistener.cpp b/indra/newview/llappearancelistener.cpp new file mode 100644 index 0000000000..dc7bbc3236 --- /dev/null +++ b/indra/newview/llappearancelistener.cpp @@ -0,0 +1,158 @@ +/** + * @file llappearancelistener.cpp + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llappearancelistener.h" + +#include "llappearancemgr.h" +#include "llinventoryfunctions.h" +#include "lltransutil.h" +#include "llwearableitemslist.h" +#include "stringize.h" + +LLAppearanceListener::LLAppearanceListener() +  : LLEventAPI("LLAppearance", +               "API to wear a specified outfit and wear/remove individual items") +{ +    add("wearOutfit", +        "Wear outfit by folder id: [\"folder_id\"] OR by folder name: [\"folder_name\"]\n" +        "When [\"append\"] is true, outfit will be added to COF\n" +        "otherwise it will replace current oufit", +        &LLAppearanceListener::wearOutfit); + +    add("wearItems", +        "Wear items by id: [items_id]", +        &LLAppearanceListener::wearItems, +        llsd::map("items_id", LLSD(), "replace", LLSD())); + +    add("detachItems", +        "Detach items by id: [items_id]", +        &LLAppearanceListener::detachItems, +        llsd::map("items_id", LLSD())); + +    add("getOutfitsList", +        "Return the table with Outfits info(id and name)", +         &LLAppearanceListener::getOutfitsList); + +    add("getOutfitItems", +        "Return the table of items with info(id : name, wearable_type, is_worn) inside specified outfit folder", +         &LLAppearanceListener::getOutfitItems); +} + + +void LLAppearanceListener::wearOutfit(LLSD const &data) +{ +    Response response(LLSD(), data); +    if (!data.has("folder_id") && !data.has("folder_name")) +    { +        return response.error("Either [folder_id] or [folder_name] is required"); +    } + +    bool append = data.has("append") ? data["append"].asBoolean() : false; +    if (!LLAppearanceMgr::instance().wearOutfit(data, append)) +    { +        response.error("Failed to wear outfit"); +    } +} + +void LLAppearanceListener::wearItems(LLSD const &data) +{ +    const LLSD& items_id{ data["items_id"] }; +    uuid_vec_t  ids; +    if (!items_id.isArray()) +    { +        ids.push_back(items_id.asUUID()); +    } +    else // array +    { +        for (const auto& id : llsd::inArray(items_id)) +        { +            ids.push_back(id); +        } +    } +    LLAppearanceMgr::instance().wearItemsOnAvatar(ids, true, data["replace"].asBoolean()); +} + +void LLAppearanceListener::detachItems(LLSD const &data) +{ +    const LLSD& items_id{ data["items_id"] }; +    uuid_vec_t  ids; +    if (!items_id.isArray()) +    { +        ids.push_back(items_id.asUUID()); +    } +    else // array +    { +        for (const auto& id : llsd::inArray(items_id)) +        { +            ids.push_back(id); +        } +    } +    LLAppearanceMgr::instance().removeItemsFromAvatar(ids); +} + +void LLAppearanceListener::getOutfitsList(LLSD const &data) +{ +    Response response(LLSD(), data); +    const LLUUID outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + +    LLInventoryModel::cat_array_t cat_array; +    LLInventoryModel::item_array_t item_array; + +    LLIsFolderType is_category(LLFolderType::FT_OUTFIT); +    gInventory.collectDescendentsIf(outfits_id, cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, is_category); + +    response["outfits"] = llsd::toMap(cat_array, +        [](const LLPointer<LLViewerInventoryCategory> &cat) +        { return std::make_pair(cat->getUUID().asString(), cat->getName()); }); +} + +void LLAppearanceListener::getOutfitItems(LLSD const &data) +{ +    Response response(LLSD(), data); +    LLUUID outfit_id(data["outfit_id"].asUUID()); +    LLViewerInventoryCategory *cat = gInventory.getCategory(outfit_id); +    if (!cat || cat->getPreferredType() != LLFolderType::FT_OUTFIT) +    { +        return response.error(stringize("Couldn't find outfit ", outfit_id.asString())); +    } +    LLInventoryModel::cat_array_t  cat_array; +    LLInventoryModel::item_array_t item_array; + +    LLFindOutfitItems collector = LLFindOutfitItems(); +    gInventory.collectDescendentsIf(outfit_id, cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, collector); + +    response["items"] = llsd::toMap(item_array, +        [](const LLPointer<LLViewerInventoryItem> &it) +        { +            return std::make_pair( +                it->getUUID().asString(), +                llsd::map( +                    "name", it->getName(), +                    "wearable_type", LLWearableType::getInstance()->getTypeName(it->isWearableType() ? it->getWearableType() : LLWearableType::WT_NONE), +                    "is_worn", get_is_item_worn(it))); +        }); +} diff --git a/indra/newview/llappearancelistener.h b/indra/newview/llappearancelistener.h new file mode 100644 index 0000000000..04c5eac2eb --- /dev/null +++ b/indra/newview/llappearancelistener.h @@ -0,0 +1,46 @@ +/** + * @file llappearancelistener.h + * + * $LicenseInfo:firstyear=2024&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2024, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + + +#ifndef LL_LLAPPEARANCELISTENER_H +#define LL_LLAPPEARANCELISTENER_H + +#include "lleventapi.h" + +class LLAppearanceListener : public LLEventAPI +{ +public: +    LLAppearanceListener(); + +private: +    void wearOutfit(LLSD const &data); +    void wearItems(LLSD const &data); +    void detachItems(LLSD const &data); +    void getOutfitsList(LLSD const &data); +    void getOutfitItems(LLSD const &data); +}; + +#endif // LL_LLAPPEARANCELISTENER_H + diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 101aca3823..e9d455ae53 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -31,6 +31,7 @@  #include "llagent.h"  #include "llagentcamera.h"  #include "llagentwearables.h" +#include "llappearancelistener.h"  #include "llappearancemgr.h"  #include "llattachmentsmgr.h"  #include "llcommandhandler.h" @@ -66,6 +67,8 @@  #include "llavatarpropertiesprocessor.h" +LLAppearanceListener sAppearanceListener; +  namespace  {      const S32   BAKE_RETRY_MAX_COUNT = 5; @@ -4762,6 +4765,11 @@ bool wear_category(const LLSD& query_map, bool append)      return false;  } +bool LLAppearanceMgr::wearOutfit(const LLSD& query_map, bool append) +{ +    return wear_category(query_map, append); +} +  class LLWearFolderHandler : public LLCommandHandler  {  public: diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 6c45a32856..bc7dc9506b 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -60,6 +60,7 @@ public:      void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append);      void wearCategoryFinal(const LLUUID& cat_id, bool copy_items, bool append);      void wearOutfitByName(const std::string& name); +    bool wearOutfit(const LLSD& query_map, bool append = false);      void changeOutfit(bool proceed, const LLUUID& category, bool append);      void replaceCurrentOutfit(const LLUUID& new_outfit);      void renameOutfit(const LLUUID& outfit_id); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index c5190fe486..87b165b739 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -4585,6 +4585,7 @@ void LLAppViewer::saveFinalSnapshot()                                      false,                                      gSavedSettings.getBOOL("RenderHUDInSnapshot"),                                      true, +                                    false,                                      LLSnapshotModel::SNAPSHOT_TYPE_COLOR,                                      LLSnapshotModel::SNAPSHOT_FORMAT_PNG);          mSavedFinalSnapshot = true; @@ -5299,6 +5300,8 @@ void LLAppViewer::sendLogoutRequest()          msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());          gAgent.sendReliableMessage(); +        LL_INFOS("Agent") << "Logging out as agent: " << gAgent.getID() << " Session: " << gAgent.getSessionID() << LL_ENDL; +          gLogoutTimer.reset();          gLogoutMaxTime = LOGOUT_REQUEST_TIME;          mLogoutRequestSent = true; diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 169fea320a..ef609026ad 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -814,69 +814,11 @@ void write_debug_dx(const std::string& str)  bool LLAppViewerWin32::initHardwareTest()  { -    // -    // Do driver verification and initialization based on DirectX -    // hardware polling and driver versions -    // -    if (true == gSavedSettings.getBOOL("ProbeHardwareOnStartup") && false == gSavedSettings.getBOOL("NoHardwareProbe")) -    { -        // per DEV-11631 - disable hardware probing for everything -        // but vram. -        bool vram_only = true; - -        LLSplashScreen::update(LLTrans::getString("StartupDetectingHardware")); - -        LL_DEBUGS("AppInit") << "Attempting to poll DirectX for hardware info" << LL_ENDL; -        gDXHardware.setWriteDebugFunc(write_debug_dx); -        bool probe_ok = gDXHardware.getInfo(vram_only); - -        if (!probe_ok -            && gWarningSettings.getBOOL("AboutDirectX9")) -        { -            LL_WARNS("AppInit") << "DirectX probe failed, alerting user." << LL_ENDL; - -            // Warn them that runnin without DirectX 9 will -            // not allow us to tell them about driver issues -            std::ostringstream msg; -            msg << LLTrans::getString ("MBNoDirectX"); -            S32 button = OSMessageBox( -                msg.str(), -                LLTrans::getString("MBWarning"), -                OSMB_YESNO); -            if (OSBTN_NO== button) -            { -                LL_INFOS("AppInit") << "User quitting after failed DirectX 9 detection" << LL_ENDL; -                LLWeb::loadURLExternal("http://secondlife.com/support/", false); -                return false; -            } -            gWarningSettings.setBOOL("AboutDirectX9", false); -        } -        LL_DEBUGS("AppInit") << "Done polling DirectX for hardware info" << LL_ENDL; - -        // Only probe once after installation -        gSavedSettings.setBOOL("ProbeHardwareOnStartup", false); - -        // Disable so debugger can work -        std::string splash_msg; -        LLStringUtil::format_map_t args; -        args["[APP_NAME]"] = LLAppViewer::instance()->getSecondLifeTitle(); -        splash_msg = LLTrans::getString("StartupLoading", args); - -        LLSplashScreen::update(splash_msg); -    } -      if (!restoreErrorTrap())      { -        LL_WARNS("AppInit") << " Someone took over my exception handler (post hardware probe)!" << LL_ENDL; +        LL_WARNS("AppInit") << " Someone took over my exception handler!" << LL_ENDL;      } -    if (gGLManager.mVRAM == 0) -    { -        gGLManager.mVRAM = gDXHardware.getVRAM(); -    } - -    LL_INFOS("AppInit") << "Detected VRAM: " << gGLManager.mVRAM << LL_ENDL; -      return true;  } diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 95f96e85d6..90ee95d424 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -491,7 +491,6 @@ void LLDrawPoolAvatar::beginImpostor()      if (!LLPipeline::sReflectionRender)      { -        LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f);          LLVOAvatar::sNumVisibleAvatars = 0;      } @@ -547,7 +546,6 @@ void LLDrawPoolAvatar::beginDeferredImpostor()      if (!LLPipeline::sReflectionRender)      { -        LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f);          LLVOAvatar::sNumVisibleAvatars = 0;      } diff --git a/indra/newview/lldrawpoolterrain.h b/indra/newview/lldrawpoolterrain.h index 5380463d01..23cf253b6a 100644 --- a/indra/newview/lldrawpoolterrain.h +++ b/indra/newview/lldrawpoolterrain.h @@ -38,6 +38,7 @@ public:          VERTEX_DATA_MASK = LLVertexBuffer::MAP_VERTEX |                      LLVertexBuffer::MAP_NORMAL |                      LLVertexBuffer::MAP_TANGENT | // Only PBR terrain uses this currently +                    LLVertexBuffer::MAP_TEXCOORD0 | // Ownership overlay                      LLVertexBuffer::MAP_TEXCOORD1      }; diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp index 0017a724ea..875dac103c 100644 --- a/indra/newview/llenvironment.cpp +++ b/indra/newview/llenvironment.cpp @@ -2563,7 +2563,6 @@ void LLEnvironment::setSharedEnvironment()  {      clearEnvironment(LLEnvironment::ENV_LOCAL);      setSelectedEnvironment(LLEnvironment::ENV_LOCAL); -    updateEnvironment();  }  void LLEnvironment::setExperienceEnvironment(LLUUID experience_id, LLUUID asset_id, F32 transition_time) diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp index 42307dd3f8..0a8b8d321d 100644 --- a/indra/newview/llfloatereditextdaycycle.cpp +++ b/indra/newview/llfloatereditextdaycycle.cpp @@ -495,7 +495,6 @@ void LLFloaterEditExtDayCycle::setEditDayCycle(const LLSettingsDay::ptr_t &pday)      updateEditEnvironment();      LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_EDIT, LLEnvironment::TRANSITION_INSTANT); -    LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_INSTANT);      synchronizeTabs();      updateTabs();      refresh(); @@ -824,7 +823,6 @@ void LLFloaterEditExtDayCycle::onClearTrack()      updateEditEnvironment();      LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_EDIT, LLEnvironment::TRANSITION_INSTANT); -    LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_INSTANT);      synchronizeTabs();      updateTabs();      refresh(); diff --git a/indra/newview/llfloaterenvironmentadjust.cpp b/indra/newview/llfloaterenvironmentadjust.cpp index 35f8340997..4825cbf7fb 100644 --- a/indra/newview/llfloaterenvironmentadjust.cpp +++ b/indra/newview/llfloaterenvironmentadjust.cpp @@ -242,9 +242,7 @@ void LLFloaterEnvironmentAdjust::captureCurrentEnvironment()          environment.setEnvironment(LLEnvironment::ENV_LOCAL, mLiveSky, FLOATER_ENVIRONMENT_UPDATE);          environment.setEnvironment(LLEnvironment::ENV_LOCAL, mLiveWater, FLOATER_ENVIRONMENT_UPDATE);      } -    environment.setSelectedEnvironment(LLEnvironment::ENV_LOCAL); -    environment.updateEnvironment(LLEnvironment::TRANSITION_INSTANT); - +    environment.setSelectedEnvironment(LLEnvironment::ENV_LOCAL, LLEnvironment::TRANSITION_INSTANT);  }  void LLFloaterEnvironmentAdjust::onButtonReset() @@ -258,7 +256,6 @@ void LLFloaterEnvironmentAdjust::onButtonReset()              this->closeFloater();              LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_LOCAL);              LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL); -            LLEnvironment::instance().updateEnvironment();          }      }); @@ -455,9 +452,29 @@ void LLFloaterEnvironmentAdjust::onMoonAzimElevChanged()  void LLFloaterEnvironmentAdjust::onCloudMapChanged()  {      if (!mLiveSky) +    {          return; -    mLiveSky->setCloudNoiseTextureId(getChild<LLTextureCtrl>(FIELD_SKY_CLOUD_MAP)->getValue().asUUID()); -    mLiveSky->update(); +    } + +    LLTextureCtrl* picker_ctrl = getChild<LLTextureCtrl>(FIELD_SKY_CLOUD_MAP); + +    LLUUID new_texture_id = picker_ctrl->getValue().asUUID(); + +    LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL); + +    LLSettingsSky::ptr_t sky_to_set = mLiveSky->buildClone(); +    if (!sky_to_set) +    { +        return; +    } + +    sky_to_set->setCloudNoiseTextureId(new_texture_id); + +    LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, sky_to_set); + +    LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_INSTANT, true); + +    picker_ctrl->setValue(new_texture_id);  }  void LLFloaterEnvironmentAdjust::onWaterMapChanged() diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp index 28c651f0cd..db6f9ac22a 100644 --- a/indra/newview/llfloaterimnearbychat.cpp +++ b/indra/newview/llfloaterimnearbychat.cpp @@ -52,6 +52,7 @@  #include "llfirstuse.h"  #include "llfloaterimnearbychat.h" +#include "llfloaterimnearbychatlistener.h"  #include "llagent.h" // gAgent  #include "llgesturemgr.h"  #include "llmultigesture.h" @@ -71,6 +72,8 @@  S32 LLFloaterIMNearbyChat::sLastSpecialChatChannel = 0; +static LLFloaterIMNearbyChatListener sChatListener; +  constexpr S32 EXPANDED_HEIGHT = 266;  constexpr S32 COLLAPSED_HEIGHT = 60;  constexpr S32 EXPANDED_MIN_HEIGHT = 150; diff --git a/indra/newview/llfloaterimnearbychatlistener.cpp b/indra/newview/llfloaterimnearbychatlistener.cpp index 43173d3680..b15a32ce40 100644 --- a/indra/newview/llfloaterimnearbychatlistener.cpp +++ b/indra/newview/llfloaterimnearbychatlistener.cpp @@ -34,12 +34,12 @@  #include "llagent.h"  #include "llchat.h"  #include "llviewercontrol.h" +#include "stringize.h" +static const F32 CHAT_THROTTLE_PERIOD = 1.f; -LLFloaterIMNearbyChatListener::LLFloaterIMNearbyChatListener(LLFloaterIMNearbyChat & chatbar) -  : LLEventAPI("LLChatBar", -               "LLChatBar listener to (e.g.) sendChat, etc."), -    mChatbar(chatbar) +LLFloaterIMNearbyChatListener::LLFloaterIMNearbyChatListener() : +    LLEventAPI("LLChatBar", "LLChatBar listener to (e.g.) sendChat, etc.")  {      add("sendChat",          "Send chat to the simulator:\n" @@ -49,10 +49,18 @@ LLFloaterIMNearbyChatListener::LLFloaterIMNearbyChatListener(LLFloaterIMNearbyCh          &LLFloaterIMNearbyChatListener::sendChat);  } -  // "sendChat" command -void LLFloaterIMNearbyChatListener::sendChat(LLSD const & chat_data) const +void LLFloaterIMNearbyChatListener::sendChat(LLSD const& chat_data)  { +    F64 cur_time = LLTimer::getElapsedSeconds(); + +    if (cur_time < mLastThrottleTime + CHAT_THROTTLE_PERIOD) +    { +        LL_WARNS("LLFloaterIMNearbyChatListener") << "'sendChat' was  throttled" << LL_ENDL; +        return; +    } +    mLastThrottleTime = cur_time; +      // Extract the data      std::string chat_text = chat_data["message"].asString(); @@ -81,20 +89,12 @@ void LLFloaterIMNearbyChatListener::sendChat(LLSD const & chat_data) const      }      // Have to prepend /42 style channel numbers -    std::string chat_to_send; -    if (channel == 0) -    { -        chat_to_send = chat_text; -    } -    else +    if (channel)      { -        chat_to_send += "/"; -        chat_to_send += chat_data["channel"].asString(); -        chat_to_send += " "; -        chat_to_send += chat_text; +        chat_text = stringize("/", chat_data["channel"].asString(), " ", chat_text);      }      // Send it as if it was typed in -    mChatbar.sendChatFromViewer(chat_to_send, type_o_chat, ((bool)(channel == 0)) && gSavedSettings.getBOOL("PlayChatAnim")); +    LLFloaterIMNearbyChat::sendChatFromViewer(chat_text, type_o_chat, (channel == 0) && gSavedSettings.getBOOL("PlayChatAnim"));  } diff --git a/indra/newview/llfloaterimnearbychatlistener.h b/indra/newview/llfloaterimnearbychatlistener.h index 96184d95b3..71eba53a9a 100644 --- a/indra/newview/llfloaterimnearbychatlistener.h +++ b/indra/newview/llfloaterimnearbychatlistener.h @@ -38,12 +38,12 @@ class LLFloaterIMNearbyChat;  class LLFloaterIMNearbyChatListener : public LLEventAPI  {  public: -    LLFloaterIMNearbyChatListener(LLFloaterIMNearbyChat & chatbar); +    LLFloaterIMNearbyChatListener();  private: -    void sendChat(LLSD const & chat_data) const; +    void sendChat(LLSD const & chat_data); -    LLFloaterIMNearbyChat & mChatbar; +    F64 mLastThrottleTime{0};  };  #endif // LL_LLFLOATERIMNEARBYCHATLISTENER_H diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 335aba2cc9..553aa1ff4b 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -39,6 +39,7 @@  #include "llchicletbar.h"  #include "lldraghandle.h"  #include "llemojidictionary.h" +#include "llemojihelper.h"  #include "llfloaterreg.h"  #include "llfloateremojipicker.h"  #include "llfloaterimsession.h" @@ -300,6 +301,8 @@ bool LLFloaterIMSessionTab::postBuild()      mEmojiPickerShowBtn = getChild<LLButton>("emoji_picker_show_btn");      mEmojiPickerShowBtn->setClickedCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerShowBtnClicked(); }); +    mEmojiPickerShowBtn->setMouseDownCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerShowBtnDown(); }); +    mEmojiCloseConn = LLEmojiHelper::instance().setCloseCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerClosed(); });      mGearBtn = getChild<LLButton>("gear_btn");      mAddBtn = getChild<LLButton>("add_btn"); @@ -532,8 +535,43 @@ void LLFloaterIMSessionTab::onEmojiRecentPanelToggleBtnClicked()  void LLFloaterIMSessionTab::onEmojiPickerShowBtnClicked()  { -    mInputEditor->setFocus(true); -    mInputEditor->showEmojiHelper(); +    if (!mEmojiPickerShowBtn->getToggleState()) +    { +        mInputEditor->hideEmojiHelper(); +        mInputEditor->setFocus(true); +        mInputEditor->showEmojiHelper(); +        mEmojiPickerShowBtn->setToggleState(true); // in case hideEmojiHelper closed a visible instance +    } +    else +    { +        mInputEditor->hideEmojiHelper(); +        mEmojiPickerShowBtn->setToggleState(false); +    } +} + +void LLFloaterIMSessionTab::onEmojiPickerShowBtnDown() +{ +    if (mEmojiHelperLastCallbackFrame == LLFrameTimer::getFrameCount()) +    { +        // Helper gets closed by focus lost event on Down before before onEmojiPickerShowBtnDown +        // triggers. +        // If this condition is true, user pressed button and it was 'toggled' during press, +        // restore 'toggled' state so that button will not reopen helper. +        mEmojiPickerShowBtn->setToggleState(true); +    } +} + +void LLFloaterIMSessionTab::onEmojiPickerClosed() +{ +    if (mEmojiPickerShowBtn->getToggleState()) +    { +        mEmojiPickerShowBtn->setToggleState(false); +        // Helper gets closed by focus lost event on Down before onEmojiPickerShowBtnDown +        // triggers. If mEmojiHelperLastCallbackFrame is set and matches Down, means close +        // was triggered by user's press. +        // A bit hacky, but I can't think of a better way to handle this without rewriting helper. +        mEmojiHelperLastCallbackFrame = LLFrameTimer::getFrameCount(); +    }  }  void LLFloaterIMSessionTab::initEmojiRecentPanel() diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h index 367d988f26..6d04d622e1 100644 --- a/indra/newview/llfloaterimsessiontab.h +++ b/indra/newview/llfloaterimsessiontab.h @@ -235,6 +235,8 @@ private:      void onEmojiRecentPanelToggleBtnClicked();      void onEmojiPickerShowBtnClicked(); +    void onEmojiPickerShowBtnDown(); +    void onEmojiPickerClosed();      void initEmojiRecentPanel();      void onEmojiRecentPanelFocusReceived();      void onEmojiRecentPanelFocusLost(); @@ -249,6 +251,9 @@ private:      S32 mInputEditorPad;      S32 mChatLayoutPanelHeight;      S32 mFloaterHeight; + +    boost::signals2::connection mEmojiCloseConn; +    U32 mEmojiHelperLastCallbackFrame = { 0 };  }; diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 68b9e758a1..faf7ed0d8c 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -60,12 +60,13 @@ LLPanelSnapshot* LLFloaterSnapshot::Impl::getActivePanel(LLFloaterSnapshotBase*  {      LLSideTrayPanelContainer* panel_container = floater->getChild<LLSideTrayPanelContainer>("panel_container");      LLPanelSnapshot* active_panel = dynamic_cast<LLPanelSnapshot*>(panel_container->getCurrentPanel()); -    if (!active_panel) -    { -        LL_WARNS() << "No snapshot active panel, current panel index: " << panel_container->getCurrentPanelIndex() << LL_ENDL; -    } +      if (!ok_if_not_found)      { +        if (!active_panel) +        { +            LL_WARNS() << "No snapshot active panel, current panel index: " << panel_container->getCurrentPanelIndex() << LL_ENDL; +        }          llassert_always(active_panel != NULL);      }      return active_panel; @@ -516,34 +517,13 @@ void LLFloaterSnapshotBase::ImplBase::onClickFilter(LLUICtrl *ctrl, void* data)  }  // static -void LLFloaterSnapshotBase::ImplBase::onClickUICheck(LLUICtrl *ctrl, void* data) +void LLFloaterSnapshotBase::ImplBase::onClickDisplaySetting(LLUICtrl* ctrl, void* data)  { -    LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; -    gSavedSettings.setBOOL( "RenderUIInSnapshot", check->get() ); - -    LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; +    LLFloaterSnapshot* view = (LLFloaterSnapshot*)data;      if (view)      {          LLSnapshotLivePreview* previewp = view->getPreviewView(); -        if(previewp) -        { -            previewp->updateSnapshot(true, true); -        } -        view->impl->updateControls(view); -    } -} - -// static -void LLFloaterSnapshotBase::ImplBase::onClickHUDCheck(LLUICtrl *ctrl, void* data) -{ -    LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; -    gSavedSettings.setBOOL( "RenderHUDInSnapshot", check->get() ); - -    LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; -    if (view) -    { -        LLSnapshotLivePreview* previewp = view->getPreviewView(); -        if(previewp) +        if (previewp)          {              previewp->updateSnapshot(true, true);          } @@ -1002,11 +982,9 @@ bool LLFloaterSnapshot::postBuild()      mSucceessLblPanel = getChild<LLUICtrl>("succeeded_panel");      mFailureLblPanel = getChild<LLUICtrl>("failed_panel"); -    childSetCommitCallback("ui_check", ImplBase::onClickUICheck, this); -    getChild<LLUICtrl>("ui_check")->setValue(gSavedSettings.getBOOL("RenderUIInSnapshot")); - -    childSetCommitCallback("hud_check", ImplBase::onClickHUDCheck, this); -    getChild<LLUICtrl>("hud_check")->setValue(gSavedSettings.getBOOL("RenderHUDInSnapshot")); +    childSetCommitCallback("ui_check", ImplBase::onClickDisplaySetting, this); +    childSetCommitCallback("balance_check", ImplBase::onClickDisplaySetting, this); +    childSetCommitCallback("hud_check", ImplBase::onClickDisplaySetting, this);      ((Impl*)impl)->setAspectRatioCheckboxValue(this, gSavedSettings.getBOOL("KeepAspectForSnapshot")); diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index 6df851b839..186d9c41cf 100644 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -103,8 +103,7 @@ public:      static void onClickAutoSnap(LLUICtrl *ctrl, void* data);      static void onClickNoPost(LLUICtrl *ctrl, void* data);      static void onClickFilter(LLUICtrl *ctrl, void* data); -    static void onClickUICheck(LLUICtrl *ctrl, void* data); -    static void onClickHUDCheck(LLUICtrl *ctrl, void* data); +    static void onClickDisplaySetting(LLUICtrl *ctrl, void* data);      static void onCommitFreezeFrame(LLUICtrl* ctrl, void* data);      virtual LLPanelSnapshot* getActivePanel(LLFloaterSnapshotBase* floater, bool ok_if_not_found = true) = 0; diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 30ed723db6..a798ba31ee 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -486,8 +486,11 @@ void LLFloaterWorldMap::onOpen(const LLSD& key)          const LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);          LLInventoryModelBackgroundFetch::instance().start(landmark_folder_id); -        mLocationEditor->setFocus( true); -        gFocusMgr.triggerFocusFlash(); +        if (hasFocus()) +        { +            mLocationEditor->setFocus( true); +            gFocusMgr.triggerFocusFlash(); +        }          buildAvatarIDList();          buildLandmarkIDLists(); diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index ba9c9fa13f..34d96aa024 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -46,7 +46,7 @@  //  // Globals  // -static GroupChatListener sGroupChatListener; +static LLGroupChatListener sGroupChatListener;  class LLGroupHandler : public LLCommandHandler  { diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp index 4e8bcc4f7a..4c02511268 100644 --- a/indra/newview/llimprocessing.cpp +++ b/indra/newview/llimprocessing.cpp @@ -422,6 +422,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,      U8 *binary_bucket,      S32 binary_bucket_size,      LLHost &sender, +    LLSD metadata,      LLUUID aux_id)  {      LLChat chat; @@ -451,6 +452,28 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,      bool is_linden = chat.mSourceType != CHAT_SOURCE_OBJECT &&          LLMuteList::isLinden(name); +    /*** +    * The simulator may have flagged this sender as a bot, if the viewer would like to display +    * the chat text in a different color or font, the below code is how the viewer can +    * tell if the sender is a bot. +    *----------------------------------------------------- +    bool is_bot = false; +    if (metadata.has("sender")) +    {   // The server has identified this sender as a bot. +        is_bot = metadata["sender"]["bot"].asBoolean(); +    } +    *----------------------------------------------------- +    */ + +    std::string notice_name; +    LLSD notice_args; +    if (metadata.has("notice")) +    {   // The server has injected a notice into the IM conversation. +        // These will be things like bot notifications, etc. +        notice_name = metadata["notice"]["id"].asString(); +        notice_args = metadata["notice"]["data"]; +    } +      chat.mMuted = is_muted;      chat.mFromID = from_id;      chat.mFromName = name; @@ -544,7 +567,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,              }              else              { -                // standard message, not from system +                // standard message, server may have injected a notice into the conversation.                  std::string saved;                  if (offline == IM_OFFLINE)                  { @@ -579,8 +602,17 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,                              region_message = true;                          }                      } -                    gIMMgr->addMessage( -                        session_id, + +                    std::string real_name; + +                    if (!notice_name.empty()) +                    {   // The simulator has injected some sort of notice into the conversation. +                        // findString will only replace the contents of buffer if the notice_id is found. +                        LLTrans::findString(buffer, notice_name, notice_args); +                        real_name = SYSTEM_FROM; +                    } + +                    gIMMgr->addMessage(session_id,                          from_id,                          name,                          buffer, @@ -591,7 +623,9 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,                          region_id,                          position,                          region_message, -                        timestamp); +                        timestamp, +                        LLUUID::null, +                        real_name);                  }                  else                  { @@ -1619,6 +1653,12 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)              from_group = message_data["from_group"].asString() == "Y";          } +        LLSD metadata; +        if (message_data.has("metadata")) +        { +            metadata = message_data["metadata"]; +        } +          EInstantMessage dialog = static_cast<EInstantMessage>(message_data["dialog"].asInteger());          LLUUID session_id = message_data["transaction-id"].asUUID();          if (session_id.isNull() && dialog == IM_FROM_TASK) @@ -1646,6 +1686,7 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)                      local_bin_bucket.data(),                      S32(local_bin_bucket.size()),                      local_sender, +                    metadata,                      message_data["asset_id"].asUUID());              }); diff --git a/indra/newview/llimprocessing.h b/indra/newview/llimprocessing.h index 030d28b198..66ffc59ae0 100644 --- a/indra/newview/llimprocessing.h +++ b/indra/newview/llimprocessing.h @@ -48,6 +48,7 @@ public:          U8 *binary_bucket,          S32 binary_bucket_size,          LLHost &sender, +        LLSD metadata,          LLUUID aux_id = LLUUID::null);      // Either receives list of offline messages from 'ReadOfflineMsgs' capability diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 756f3b33ed..77451a6248 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -3144,9 +3144,16 @@ void LLIMMgr::addMessage(      const LLUUID& region_id,      const LLVector3& position,      bool is_region_msg, -    U32 timestamp)      // May be zero +    U32 timestamp,  // May be zero +    LLUUID display_id, +    std::string_view display_name)  {      LLUUID other_participant_id = target_id; +    std::string message_display_name = (display_name.empty()) ? from : std::string(display_name); +    if (display_id.isNull() && (display_name.empty())) +    { +        display_id = other_participant_id; +    }      LLUUID new_session_id = session_id;      if (new_session_id.isNull()) @@ -3243,7 +3250,7 @@ void LLIMMgr::addMessage(              }              //Play sound for new conversations -            if (!skip_message & !gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation"))) +            if (!skip_message && !gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation")))              {                  make_ui_sound("UISndNewIncomingIMSession");              } @@ -3257,7 +3264,7 @@ void LLIMMgr::addMessage(      if (!LLMuteList::getInstance()->isMuted(other_participant_id, LLMute::flagTextChat) && !skip_message)      { -        LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg, true, is_region_msg, timestamp); +        LLIMModel::instance().addMessage(new_session_id, message_display_name, display_id, msg, true, is_region_msg, timestamp);      }      // Open conversation floater if offline messages are present diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 61776860e3..23f90ca795 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -368,7 +368,9 @@ public:                      const LLUUID& region_id = LLUUID::null,                      const LLVector3& position = LLVector3::zero,                      bool is_region_msg = false, -                    U32 timestamp = 0); +                    U32 timestamp = 0, +                    LLUUID display_id = LLUUID::null, +                    std::string_view display_name = "");      void addSystemMessage(const LLUUID& session_id, const std::string& message_name, const LLSD& args); diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 15190854a2..ee530c163b 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -104,7 +104,6 @@ static bool check_item(const LLUUID& item_id,                         LLInventoryFilter* filter);  // Helper functions -  bool isAddAction(const std::string& action)  {      return ("wear" == action || "attach" == action || "activate" == action); @@ -2697,7 +2696,12 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,          U32 max_items_to_wear = gSavedSettings.getU32("WearFolderLimit");          if (is_movable && move_is_into_outfit)          { -            if (mUUID == my_outifts_id) +            if ((inv_cat->getPreferredType() != LLFolderType::FT_NONE) && (inv_cat->getPreferredType() != LLFolderType::FT_OUTFIT)) +            { +                tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); +                is_movable = false; +            } +            else if (mUUID == my_outifts_id)              {                  if (source != LLToolDragAndDrop::SOURCE_AGENT || move_is_from_marketplacelistings)                  { @@ -2714,13 +2718,39 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,                      is_movable = false;                  }              } -            else if(getCategory() && getCategory()->getPreferredType() == LLFolderType::FT_NONE) +            else if (!getCategory())              { -                is_movable = ((inv_cat->getPreferredType() == LLFolderType::FT_NONE) || (inv_cat->getPreferredType() == LLFolderType::FT_OUTFIT)); +                is_movable = false; +                tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit");              }              else              { -                is_movable = false; +                EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); +                EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); +                if ((dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) && inv_res == MY_OUTFITS_OUTFIT) +                { +                    is_movable = false; +                    tooltip_msg = LLTrans::getString("TooltipCantMoveOutfitIntoOutfit"); +                } +                else if (dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) +                { +                    is_movable = false; +                    tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); +                } +                else if (dest_res == MY_OUTFITS_SUBFOLDER && inv_res == MY_OUTFITS_SUBOUTFIT) +                { +                    is_movable = false; +                    tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); +                } +                else if (can_move_to_my_outfits(model, inv_cat, max_items_to_wear)) +                { +                    is_movable = true; +                } +                else +                { +                    is_movable = false; +                    tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); +                }              }          }          if (is_movable && move_is_into_current_outfit && is_link) @@ -2912,9 +2942,77 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,              if (mUUID == my_outifts_id)              { -                // Category can contains objects, -                // create a new folder and populate it with links to original objects -                dropToMyOutfits(inv_cat, cb); +                EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); +                if (inv_res == MY_OUTFITS_SUBFOLDER || inv_res == MY_OUTFITS_OUTFIT) +                { +                    LLInvFVBridge::changeCategoryParent( +                        model, +                        (LLViewerInventoryCategory*)inv_cat, +                        mUUID, +                        false); +                    if (cb) cb->fire(inv_cat->getUUID()); +                } +                else +                { +                    // Moving from inventory +                    // create a new folder and populate it with links to original objects +                    dropToMyOutfits(inv_cat, cb); +                } +            } +            else if (move_is_into_my_outfits) +            { +                EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); +                EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); +                switch (inv_res) +                { +                case MY_OUTFITS_NO: +                    // Moning from outside outfits into outfits +                    if (dest_res == MY_OUTFITS_SUBFOLDER) +                    { +                        // turn it into outfit +                        dropToMyOutfitsSubfolder(inv_cat, mUUID, LLFolderType::FT_OUTFIT, cb); +                    } +                    else +                    { +                        // or link it? +                        dropToMyOutfitsSubfolder(inv_cat, mUUID, LLFolderType::FT_NONE, cb); +                    } +                    break; +                case MY_OUTFITS_SUBFOLDER: +                case MY_OUTFITS_OUTFIT: +                    // only permit moving subfodlers and outfits into other subfolders +                    if (dest_res == MY_OUTFITS_SUBFOLDER) +                    { +                        LLInvFVBridge::changeCategoryParent( +                            model, +                            (LLViewerInventoryCategory*)inv_cat, +                            mUUID, +                            false); +                        if (cb) cb->fire(inv_cat->getUUID()); +                    } +                    else +                    { +                        assert(false); // mot permitted, shouldn't have accepted +                    } +                    break; +                case MY_OUTFITS_SUBOUTFIT: +                    if (dest_res == MY_OUTFITS_SUBOUTFIT || dest_res == MY_OUTFITS_OUTFIT) +                    { +                        LLInvFVBridge::changeCategoryParent( +                            model, +                            (LLViewerInventoryCategory*)inv_cat, +                            mUUID, +                            false); +                        if (cb) cb->fire(inv_cat->getUUID()); +                    } +                    else +                    { +                        assert(false); // mot permitted, shouldn't have accepted +                    } +                    break; +                default: +                    break; +                }              }              // if target is current outfit folder we use link              else if (move_is_into_current_outfit && @@ -4008,6 +4106,7 @@ void LLFolderBridge::perform_pasteFromClipboard()                  {                      if (!move_is_into_my_outfits && item && can_move_to_outfit(item, move_is_into_current_outfit))                      { +                        // todo: this is going to create dupplicate folders?                          dropToOutfit(item, move_is_into_current_outfit, cb);                      }                      else if (move_is_into_my_outfits && LLAssetType::AT_CATEGORY == obj->getType()) @@ -4016,7 +4115,23 @@ void LLFolderBridge::perform_pasteFromClipboard()                          U32 max_items_to_wear = gSavedSettings.getU32("WearFolderLimit");                          if (cat && can_move_to_my_outfits(model, cat, max_items_to_wear))                          { -                            dropToMyOutfits(cat, cb); +                            if (mUUID == my_outifts_id) +                            { +                                dropToMyOutfits(cat, cb); +                            } +                            else if (move_is_into_my_outfits) +                            { +                                EMyOutfitsSubfolderType res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); +                                if (res == MY_OUTFITS_SUBFOLDER) +                                { +                                    // turn it into outfit +                                    dropToMyOutfitsSubfolder(cat, mUUID, LLFolderType::FT_OUTFIT, cb); +                                } +                                else +                                { +                                    dropToMyOutfitsSubfolder(cat, mUUID, LLFolderType::FT_NONE, cb); +                                } +                            }                          }                          else                          { @@ -4256,6 +4371,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items      if (outfits_id == mUUID)      { +        items.push_back(std::string("New Outfit Folder"));          items.push_back(std::string("New Outfit"));      } @@ -4349,63 +4465,83 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items      else if(isAgentInventory()) // do not allow creating in library      {          LLViewerInventoryCategory *cat = getCategory(); -        // BAP removed protected check to re-enable standard ops in untyped folders. -        // Not sure what the right thing is to do here. -        if (!isCOFFolder() && cat && (cat->getPreferredType() != LLFolderType::FT_OUTFIT)) -        { -            if (!isInboxFolder() // don't allow creation in inbox -                && outfits_id != mUUID) -            { -                bool menu_items_added = false; -                // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694. -                if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat)) -                { -                    items.push_back(std::string("New Folder")); -                    menu_items_added = true; -                } -                if (!isMarketplaceListingsFolder()) -                { -                    items.push_back(std::string("upload_def")); -                    items.push_back(std::string("create_new")); -                    items.push_back(std::string("New Script")); -                    items.push_back(std::string("New Note")); -                    items.push_back(std::string("New Gesture")); -                    items.push_back(std::string("New Material")); -                    items.push_back(std::string("New Clothes")); -                    items.push_back(std::string("New Body Parts")); -                    items.push_back(std::string("New Settings")); -                    if (!LLEnvironment::instance().isInventoryEnabled()) -                    { -                        disabled_items.push_back("New Settings"); -                    } -                } -                else -                { -                    items.push_back(std::string("New Listing Folder")); -                } -                if (menu_items_added) -                { -                    items.push_back(std::string("Create Separator")); -                } -            } -            getClipboardEntries(false, items, disabled_items, flags); -        } -        else + +        if (cat)          { -            // Want some but not all of the items from getClipboardEntries for outfits. -            if (cat && (cat->getPreferredType() == LLFolderType::FT_OUTFIT)) +            if (cat->getPreferredType() == LLFolderType::FT_OUTFIT)              { +                // Want some but not all of the items from getClipboardEntries for outfits.                  items.push_back(std::string("Rename"));                  items.push_back(std::string("thumbnail"));                  addDeleteContextMenuOptions(items, disabled_items);                  // EXT-4030: disallow deletion of currently worn outfit -                const LLViewerInventoryItem *base_outfit_link = LLAppearanceMgr::instance().getBaseOutfitLink(); +                const LLViewerInventoryItem* base_outfit_link = LLAppearanceMgr::instance().getBaseOutfitLink();                  if (base_outfit_link && (cat == base_outfit_link->getLinkedCategory()))                  {                      disabled_items.push_back(std::string("Delete"));                  }              } +            else if (outfits_id == mUUID) +            { +                getClipboardEntries(false, items, disabled_items, flags); +            } +            else if (!isCOFFolder()) +            { +                EMyOutfitsSubfolderType in_my_outfits = myoutfit_object_subfolder_type(model, mUUID, outfits_id); +                if (in_my_outfits != MY_OUTFITS_NO) +                { +                    if (in_my_outfits == MY_OUTFITS_SUBFOLDER) +                    { +                        // Not inside an outfit, but inside 'my outfits' +                        items.push_back(std::string("New Outfit")); +                        items.push_back(std::string("New Outfit Folder")); +                    } +                    items.push_back(std::string("Rename")); +                    items.push_back(std::string("thumbnail")); + +                    addDeleteContextMenuOptions(items, disabled_items); +                } +                else +                { +                    if (!isInboxFolder() // don't allow creation in inbox +                        && outfits_id != mUUID) +                    { +                        bool menu_items_added = false; +                        // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694. +                        if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat)) +                        { +                            items.push_back(std::string("New Folder")); +                            menu_items_added = true; +                        } +                        if (!isMarketplaceListingsFolder()) +                        { +                            items.push_back(std::string("upload_def")); +                            items.push_back(std::string("create_new")); +                            items.push_back(std::string("New Script")); +                            items.push_back(std::string("New Note")); +                            items.push_back(std::string("New Gesture")); +                            items.push_back(std::string("New Material")); +                            items.push_back(std::string("New Clothes")); +                            items.push_back(std::string("New Body Parts")); +                            items.push_back(std::string("New Settings")); +                            if (!LLEnvironment::instance().isInventoryEnabled()) +                            { +                                disabled_items.push_back("New Settings"); +                            } +                        } +                        else +                        { +                            items.push_back(std::string("New Listing Folder")); +                        } +                        if (menu_items_added) +                        { +                            items.push_back(std::string("Create Separator")); +                        } +                    } +                    getClipboardEntries(false, items, disabled_items, flags); +                } +            }          }          if (model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT) == mUUID) @@ -4560,7 +4696,11 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags,   menuentry_vec_t&          if (((flags & ITEM_IN_MULTI_SELECTION) == 0) && hasChildren() && (type != LLFolderType::FT_OUTFIT))          { -            items.push_back(std::string("Ungroup folder items")); +            const LLUUID my_outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); +            if (!gInventory.isObjectDescendentOf(mUUID, my_outfits)) +            { +                items.push_back(std::string("Ungroup folder items")); +            }          }      }      else @@ -5333,13 +5473,24 @@ void LLFolderBridge::dropToMyOutfits(LLInventoryCategory* inv_cat, LLPointer<LLI      // Note: creation will take time, so passing folder id to callback is slightly unreliable,      // but so is collecting and passing descendants' ids      inventory_func_type func = boost::bind(outfitFolderCreatedCallback, inv_cat->getUUID(), _1, cb, mInventoryPanel); -    gInventory.createNewCategory(dest_id, +    getInventoryModel()->createNewCategory(dest_id,                                   LLFolderType::FT_OUTFIT,                                   inv_cat->getName(),                                   func,                                   inv_cat->getThumbnailUUID());  } +void LLFolderBridge::dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id, LLFolderType::EType preferred_type, LLPointer<LLInventoryCallback> cb) +{ +    const LLUUID outfits_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); +    inventory_func_type func = boost::bind(outfitFolderCreatedCallback, inv_cat->getUUID(), _1, cb, mInventoryPanel); +    getInventoryModel()->createNewCategory(dest_id, +        preferred_type, +        inv_cat->getName(), +        func, +        inv_cat->getThumbnailUUID()); +} +  void LLFolderBridge::outfitFolderCreatedCallback(LLUUID cat_source_id,                                                   LLUUID cat_dest_id,                                                   LLPointer<LLInventoryCallback> cb, @@ -5513,7 +5664,9 @@ bool LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,          }          else if (user_confirm && (move_is_into_current_outfit || move_is_into_outfit))          { -            accept = can_move_to_outfit(inv_item, move_is_into_current_outfit); +            EMyOutfitsSubfolderType res = myoutfit_object_subfolder_type(model, mUUID, my_outifts_id); +            // don't allow items in my outfits' subfodlers, only in outfits and outfit's subfolders +            accept = res != MY_OUTFITS_SUBFOLDER && can_move_to_outfit(inv_item, move_is_into_current_outfit);          }          else if (user_confirm && (move_is_into_favorites || move_is_into_landmarks))          { diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 3e7f74384b..a101c7368a 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -369,6 +369,7 @@ protected:      void dropToFavorites(LLInventoryItem* inv_item, LLPointer<LLInventoryCallback> cb = NULL);      void dropToOutfit(LLInventoryItem* inv_item, bool move_is_into_current_outfit, LLPointer<LLInventoryCallback> cb = NULL);      void dropToMyOutfits(LLInventoryCategory* inv_cat, LLPointer<LLInventoryCallback> cb = NULL); +    void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest, LLFolderType::EType preferred_type, LLPointer<LLInventoryCallback> cb = NULL);      //--------------------------------------------------------------------      // Messy hacks for handling folder options diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 1ccefa3212..7fff88fba7 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -2493,6 +2493,40 @@ bool can_share_item(const LLUUID& item_id)      return can_share;  } + +EMyOutfitsSubfolderType myoutfit_object_subfolder_type( +    LLInventoryModel* model, +    const LLUUID& obj_id, +    const LLUUID& my_outfits_id) +{ +    if (obj_id == my_outfits_id) return MY_OUTFITS_NO; + +    const LLViewerInventoryCategory* test_cat = model->getCategory(obj_id); +    if (test_cat->getPreferredType() == LLFolderType::FT_OUTFIT) +    { +        return MY_OUTFITS_OUTFIT; +    } +    while (test_cat) +    { +        if (test_cat->getPreferredType() == LLFolderType::FT_OUTFIT) +        { +            return MY_OUTFITS_SUBOUTFIT; +        } + +        const LLUUID& parent_id = test_cat->getParentUUID(); +        if (parent_id.isNull()) +        { +            return MY_OUTFITS_NO; +        } +        if (parent_id == my_outfits_id) +        { +            return MY_OUTFITS_SUBFOLDER; +        } +        test_cat = model->getCategory(parent_id); +    } + +    return MY_OUTFITS_NO; +}  ///----------------------------------------------------------------------------  /// LLMarketplaceValidator implementations  ///---------------------------------------------------------------------------- @@ -2621,6 +2655,11 @@ bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(const LLInventoryIte      return false;  } +bool LLIsFolderType::operator()(LLInventoryCategory* cat, LLInventoryItem* item) +{ +    return cat && cat->getPreferredType() == mType; +} +  bool LLIsType::operator()(LLInventoryCategory* cat, LLInventoryItem* item)  {      if(mType == LLAssetType::AT_CATEGORY) diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index 13a64f21dc..0ab045f2a0 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -121,6 +121,18 @@ std::string get_searchable_creator_name(LLInventoryModel* model, const LLUUID& i  std::string get_searchable_UUID(LLInventoryModel* model, const LLUUID& item_id);  bool can_share_item(const LLUUID& item_id); +enum EMyOutfitsSubfolderType +{ +    MY_OUTFITS_NO, +    MY_OUTFITS_SUBFOLDER, +    MY_OUTFITS_OUTFIT, +    MY_OUTFITS_SUBOUTFIT, +}; +EMyOutfitsSubfolderType myoutfit_object_subfolder_type( +    LLInventoryModel* model, +    const LLUUID& obj_id, +    const LLUUID& my_outfits_id); +  /**                    Miscellaneous global functions   **                                                                            **   *******************************************************************************/ @@ -234,6 +246,24 @@ protected:  // the type is the type passed in during construction.  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLIsFolderType : public LLInventoryCollectFunctor +{ +public: +    LLIsFolderType(LLFolderType::EType type) : mType(type) {} +    virtual ~LLIsFolderType() {} +    virtual bool operator()(LLInventoryCategory* cat, +        LLInventoryItem* item); +protected: +    LLFolderType::EType mType; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLIsType +// +// Implementation of a LLInventoryCollectFunctor which returns true if +// the type is the type passed in during construction. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +  class LLIsType : public LLInventoryCollectFunctor  {  public: diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index c4f93cee98..eb47af85fd 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -60,10 +60,12 @@ static LLPanelInjector<LLInventoryGallery> t_inventory_gallery("inventory_galler  const S32 GALLERY_ITEMS_PER_ROW_MIN = 2;  const S32 FAST_LOAD_THUMBNAIL_TRSHOLD = 50; // load folders below this value immediately +  // Helper dnd functions  bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, bool drop, std::string& tooltip_msg, bool is_link);  bool dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, bool drop, std::string& tooltip_msg, bool user_confirm);  void dropToMyOutfits(LLInventoryCategory* inv_cat); +void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID& dest_id, LLFolderType::EType preferred_type);  class LLGalleryPanel: public LLPanel  { @@ -3745,7 +3747,12 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat,          U32 max_items_to_wear = gSavedSettings.getU32("WearFolderLimit");          if (is_movable && move_is_into_outfit)          { -            if (dest_id == my_outifts_id) +            if ((inv_cat->getPreferredType() != LLFolderType::FT_NONE) && (inv_cat->getPreferredType() != LLFolderType::FT_OUTFIT)) +            { +                tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); +                is_movable = false; +            } +            else if (dest_id == my_outifts_id)              {                  if (source != LLToolDragAndDrop::SOURCE_AGENT || move_is_from_marketplacelistings)                  { @@ -3762,13 +3769,39 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat,                      is_movable = false;                  }              } -            else if (dest_cat && dest_cat->getPreferredType() == LLFolderType::FT_NONE) +            else if (!dest_cat)              { -                is_movable = ((inv_cat->getPreferredType() == LLFolderType::FT_NONE) || (inv_cat->getPreferredType() == LLFolderType::FT_OUTFIT)); +                is_movable = false; +                tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit");              }              else              { -                is_movable = false; +                EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, dest_id, my_outifts_id); +                EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); +                if ((dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) && inv_res == MY_OUTFITS_OUTFIT) +                { +                    is_movable = false; +                    tooltip_msg = LLTrans::getString("TooltipCantMoveOutfitIntoOutfit"); +                } +                else if (dest_res == MY_OUTFITS_OUTFIT || dest_res == MY_OUTFITS_SUBOUTFIT) +                { +                    is_movable = false; +                    tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); +                } +                else if (dest_res == MY_OUTFITS_SUBFOLDER && inv_res == MY_OUTFITS_SUBOUTFIT) +                { +                    is_movable = false; +                    tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); +                } +                else if (can_move_to_my_outfits(model, inv_cat, max_items_to_wear)) +                { +                    is_movable = true; +                } +                else +                { +                    is_movable = false; +                    tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit"); +                }              }          }          if (is_movable && move_is_into_current_outfit && is_link) @@ -3894,9 +3927,70 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat,              if (dest_id == my_outifts_id)              { -                // Category can contains objects, -                // create a new folder and populate it with links to original objects -                dropToMyOutfits(inv_cat); +                EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); +                if (inv_res == MY_OUTFITS_SUBFOLDER || inv_res == MY_OUTFITS_OUTFIT) +                { +                    gInventory.changeCategoryParent( +                        (LLViewerInventoryCategory*)inv_cat, +                        dest_id, +                        move_is_into_trash); +                } +                else +                { +                    // Category can contains objects, +                    // create a new folder and populate it with links to original objects +                    dropToMyOutfits(inv_cat); +                } +            } +            else if (move_is_into_my_outfits) +            { +                EMyOutfitsSubfolderType dest_res = myoutfit_object_subfolder_type(model, dest_id, my_outifts_id); +                EMyOutfitsSubfolderType inv_res = myoutfit_object_subfolder_type(model, cat_id, my_outifts_id); +                switch (inv_res) +                { +                case MY_OUTFITS_NO: +                    // Moning from outside outfits into outfits +                    if (dest_res == MY_OUTFITS_SUBFOLDER) +                    { +                        // turn it into outfit +                        dropToMyOutfitsSubfolder(inv_cat, dest_id, LLFolderType::FT_OUTFIT); +                    } +                    else +                    { +                        dropToMyOutfitsSubfolder(inv_cat, dest_id, LLFolderType::FT_NONE); +                    } +                    break; +                case MY_OUTFITS_SUBFOLDER: +                case MY_OUTFITS_OUTFIT: +                    // only permit moving subfodlers and outfits into other subfolders +                    if (dest_res == MY_OUTFITS_SUBFOLDER) +                    { +                        gInventory.changeCategoryParent( +                            (LLViewerInventoryCategory*)inv_cat, +                            dest_id, +                            move_is_into_trash); +                    } +                    else +                    { +                        assert(false); // mot permitted, shouldn't have accepted +                    } +                    break; +                case MY_OUTFITS_SUBOUTFIT: +                    if (dest_res == MY_OUTFITS_SUBOUTFIT || dest_res == MY_OUTFITS_OUTFIT) +                    { +                        gInventory.changeCategoryParent( +                            (LLViewerInventoryCategory*)inv_cat, +                            dest_id, +                            move_is_into_trash); +                    } +                    else +                    { +                        assert(false); // mot permitted, shouldn't have accepted +                    } +                    break; +                default: +                    break; +                }              }              // if target is current outfit folder we use link              else if (move_is_into_current_outfit && @@ -4041,3 +4135,11 @@ void dropToMyOutfits(LLInventoryCategory* inv_cat)      inventory_func_type func = boost::bind(&outfitFolderCreatedCallback, inv_cat->getUUID(), _1);      gInventory.createNewCategory(dest_id, LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID());  } + +void dropToMyOutfitsSubfolder(LLInventoryCategory* inv_cat, const LLUUID &dest_id, LLFolderType::EType preferred_type) +{ +    // Note: creation will take time, so passing folder id to callback is slightly unreliable, +    // but so is collecting and passing descendants' ids +    inventory_func_type func = boost::bind(&outfitFolderCreatedCallback, inv_cat->getUUID(), _1); +    gInventory.createNewCategory(dest_id, preferred_type, inv_cat->getName(), func, inv_cat->getThumbnailUUID()); +} diff --git a/indra/newview/llinventorygallerymenu.cpp b/indra/newview/llinventorygallerymenu.cpp index 0c35a7f695..3fede1a001 100644 --- a/indra/newview/llinventorygallerymenu.cpp +++ b/indra/newview/llinventorygallerymenu.cpp @@ -607,7 +607,9 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men      bool is_trash = (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH));      bool is_in_trash = gInventory.isObjectDescendentOf(selected_id, gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH));      bool is_lost_and_found = (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND)); -    bool is_outfits= (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS)); +    const LLUUID my_outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); +    bool is_outfits= (selected_id == my_outfits); +    bool is_in_outfits = is_outfits || gInventory.isObjectDescendentOf(selected_id, my_outfits);      bool is_in_favorites = gInventory.isObjectDescendentOf(selected_id, gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE));      //bool is_favorites= (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE)); @@ -746,7 +748,7 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men      }      else      { -        if (is_agent_inventory && !is_inbox && !is_cof && !is_in_favorites && !is_outfits) +        if (is_agent_inventory && !is_inbox && !is_cof && !is_in_favorites && !is_outfits && !is_in_outfits)          {              LLViewerInventoryCategory* category = gInventory.getCategory(selected_id);              if (!category || !LLFriendCardsManager::instance().isCategoryInFriendFolder(category)) @@ -792,15 +794,26 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men              items.push_back(std::string("Set favorite folder")); -            if(is_outfits && !isRootFolder()) +            if(is_outfits)              { -                items.push_back(std::string("New Outfit")); +                EMyOutfitsSubfolderType res = myoutfit_object_subfolder_type(&gInventory, selected_id, my_outfits); +                if (res != MY_OUTFITS_OUTFIT && res != MY_OUTFITS_SUBOUTFIT) +                { +                    items.push_back(std::string("New Outfit")); +                    items.push_back(std::string("New Outfit Folder")); +                } +                items.push_back(std::string("Delete")); +                items.push_back(std::string("Rename")); +                if (!get_is_category_and_children_removable(&gInventory, selected_id, false)) +                { +                    disabled_items.push_back(std::string("Delete")); +                }              }              items.push_back(std::string("Subfolder Separator")); -            if (!is_system_folder && !isRootFolder()) +            if (!is_system_folder && !isRootFolder() && !is_outfits)              { -                if(has_children && (folder_type != LLFolderType::FT_OUTFIT)) +                if(has_children && (folder_type != LLFolderType::FT_OUTFIT) && !is_in_outfits)                  {                      items.push_back(std::string("Ungroup folder items"));                  } diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index b6ff31a7ed..de1c7a7ed8 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1007,7 +1007,8 @@ void LLInventoryModel::createNewCategory(const LLUUID& parent_id,          return;      } -    if (preferred_type != LLFolderType::FT_NONE) +    if (preferred_type != LLFolderType::FT_NONE +        && preferred_type != LLFolderType::FT_OUTFIT)      {          // Ultimately this should only be done for non-singleton          // types. Requires back-end changes to guarantee that others @@ -3525,7 +3526,7 @@ bool LLInventoryModel::saveToFile(const std::string& filename,          fileXML.close(); -        LL_INFOS(LOG_INV) << "Inventory saved: " << cat_count << " categories, " << it_count << " items." << LL_ENDL; +        LL_INFOS(LOG_INV) << "Inventory saved: " << (S32)cat_count << " categories, " << (S32)it_count << " items." << LL_ENDL;      }      catch (...)      { diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp index 101ee215cb..e31fbb188a 100644 --- a/indra/newview/lllocalbitmaps.cpp +++ b/indra/newview/lllocalbitmaps.cpp @@ -38,6 +38,7 @@  /* image compression headers. */  #include "llimagebmp.h"  #include "llimagetga.h" +#include "llimagej2c.h"  #include "llimagejpeg.h"  #include "llimagepng.h" @@ -106,6 +107,10 @@ LLLocalBitmap::LLLocalBitmap(std::string filename)      {          mExtension = ET_IMG_JPG;      } +    else if (temp_exten == "j2c" || temp_exten == "jp2") +    { +        mExtension = ET_IMG_J2C; +    }      else if (temp_exten == "png")      {          mExtension = ET_IMG_PNG; @@ -354,6 +359,21 @@ bool LLLocalBitmap::decodeBitmap(LLPointer<LLImageRaw> rawimg)              break;          } +        case ET_IMG_J2C: +        { +            LLPointer<LLImageJ2C> jpeg_image = new LLImageJ2C; +            if (jpeg_image->load(mFilename)) +            { +                jpeg_image->setDiscardLevel(0); +                if (jpeg_image->decode(rawimg, 0.0f)) +                { +                    rawimg->biasedScaleToPowerOfTwo(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT); +                    decode_successful = true; +                } +            } +            break; +        } +          case ET_IMG_PNG:          {              LLPointer<LLImagePNG> png_image = new LLImagePNG; diff --git a/indra/newview/lllocalbitmaps.h b/indra/newview/lllocalbitmaps.h index de2dcb3467..6c9d65e3b6 100644 --- a/indra/newview/lllocalbitmaps.h +++ b/indra/newview/lllocalbitmaps.h @@ -89,6 +89,7 @@ class LLLocalBitmap              ET_IMG_BMP,              ET_IMG_TGA,              ET_IMG_JPG, +            ET_IMG_J2C,              ET_IMG_PNG          }; diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index a8c6f69425..48c80842b9 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1210,6 +1210,12 @@ void LLMeshRepoThread::run()          LL_WARNS(LOG_MESH) << "Convex decomposition unable to be quit." << LL_ENDL;      }  } +void LLMeshRepoThread::cleanup() +{ +    mShuttingDown = true; +    mSignal->broadcast(); +    mMeshThreadPool->close(); +}  // Mutex:  LLMeshRepoThread::mMutex must be held on entry  void LLMeshRepoThread::loadMeshSkinInfo(const LLUUID& mesh_id) @@ -1493,6 +1499,11 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)                          [mesh_id, buffer, size]                          ()                      { +                        if (gMeshRepo.mThread->isShuttingDown()) +                        { +                            delete[] buffer; +                            return; +                        }                          if (!gMeshRepo.mThread->skinInfoReceived(mesh_id, buffer, size))                          {                              // either header is faulty or something else overwrote the cache @@ -1993,6 +2004,11 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)                          [params, mesh_id, lod, buffer, size]                          ()                      { +                        if (gMeshRepo.mThread->isShuttingDown()) +                        { +                            delete[] buffer; +                            return; +                        }                          if (gMeshRepo.mThread->lodReceived(params, lod, buffer, size) == MESH_OK)                          {                              LL_DEBUGS(LOG_MESH) << "Mesh/Cache: Mesh body for ID " << mesh_id << " - was retrieved from the cache." << LL_ENDL; @@ -3792,6 +3808,11 @@ void LLMeshLODHandler::processData(LLCore::BufferArray * /* body */, S32 /* body              [shrd_handler, data, data_size]              ()          { +            if (gMeshRepo.mThread->isShuttingDown()) +            { +                delete[] data; +                return; +            }              LLMeshLODHandler* handler = (LLMeshLODHandler * )shrd_handler.get();              handler->processLod(data, data_size);              delete[] data; @@ -3905,6 +3926,11 @@ void LLMeshSkinInfoHandler::processData(LLCore::BufferArray * /* body */, S32 /*              [shrd_handler, data, data_size]              ()          { +            if (gMeshRepo.mThread->isShuttingDown()) +            { +                delete[] data; +                return; +            }              LLMeshSkinInfoHandler* handler = (LLMeshSkinInfoHandler*)shrd_handler.get();              handler->processSkin(data, data_size);              delete[] data; @@ -4127,8 +4153,7 @@ void LLMeshRepository::shutdown()          mUploads[i]->discard() ; //discard the uploading requests.      } -    mThread->mSignal->broadcast(); -    mThread->mMeshThreadPool->close(); +    mThread->cleanup();      while (!mThread->isStopped())      { diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index 0d9da32e27..b9acb3573f 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -515,6 +515,8 @@ public:      ~LLMeshRepoThread();      virtual void run(); +    void cleanup(); +    bool isShuttingDown() { return mShuttingDown; }      void lockAndLoadMeshLOD(const LLVolumeParams& mesh_params, S32 lod);      void loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod); @@ -583,6 +585,7 @@ private:      U8* getDiskCacheBuffer(S32 size);      S32 mDiskCacheBufferSize = 0;      U8* mDiskCacheBuffer = nullptr; +    bool mShuttingDown = false;  }; diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index 64ea1710f5..d8e05e1d01 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -132,20 +132,21 @@ std::string getLodSuffix(S32 lod)      return suffix;  } -void FindModel(LLModelLoader::scene& scene, const std::string& name_to_match, LLModel*& baseModelOut, LLMatrix4& matOut) +static bool FindModel(const LLModelLoader::scene& scene, const std::string& name_to_match, LLModel*& baseModelOut, LLMatrix4& matOut)  { -    for (auto scene_iter = scene.begin(); scene_iter != scene.end(); scene_iter++) +    for (const auto& scene_pair : scene)      { -        for (auto model_iter = scene_iter->second.begin(); model_iter != scene_iter->second.end(); model_iter++) +        for (const auto& model_iter : scene_pair.second)          { -            if (model_iter->mModel && (model_iter->mModel->mLabel == name_to_match)) +            if (model_iter.mModel && (model_iter.mModel->mLabel == name_to_match))              { -                baseModelOut = model_iter->mModel; -                matOut = scene_iter->first; -                return; +                baseModelOut = model_iter.mModel; +                matOut = scene_pair.first; +                return true;              }          }      } +    return false;  }  //----------------------------------------------------------------------------- @@ -319,10 +320,8 @@ void LLModelPreview::rebuildUploadData()          mat *= scale_mat; -        for (auto model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter) -        { // for each instance with said transform applied -            LLModelInstance instance = *model_iter; - +        for (LLModelInstance& instance : iter->second) +        { //for each instance with said transform applied              LLModel* base_model = instance.mModel;              if (base_model && !requested_name.empty()) @@ -354,7 +353,7 @@ void LLModelPreview::rebuildUploadData()                      }                      else                      { -                        //Physics can be inherited from other LODs or loaded, so we need to adjust what extension we are searching for +                        // Physics can be inherited from other LODs or loaded, so we need to adjust what extension we are searching for                          extensionLOD = mPhysicsSearchLOD;                      } @@ -365,9 +364,9 @@ void LLModelPreview::rebuildUploadData()                          name_to_match += toAdd;                      } -                    FindModel(mScene[i], name_to_match, lod_model, transform); +                    bool found = FindModel(mScene[i], name_to_match, lod_model, transform); -                    if (!lod_model && i != LLModel::LOD_PHYSICS) +                    if (!found && i != LLModel::LOD_PHYSICS)                      {                          if (mImporterDebug)                          { @@ -380,7 +379,7 @@ void LLModelPreview::rebuildUploadData()                          }                          int searchLOD = (i > LLModel::LOD_HIGH) ? LLModel::LOD_HIGH : i; -                        while ((searchLOD <= LLModel::LOD_HIGH) && !lod_model) +                        for (; searchLOD <= LLModel::LOD_HIGH; ++searchLOD)                          {                              std::string name_to_match = instance.mLabel;                              llassert(!name_to_match.empty()); @@ -394,8 +393,8 @@ void LLModelPreview::rebuildUploadData()                              // See if we can find an appropriately named model in LOD 'searchLOD'                              // -                            FindModel(mScene[searchLOD], name_to_match, lod_model, transform); -                            searchLOD++; +                            if (FindModel(mScene[searchLOD], name_to_match, lod_model, transform)) +                                break;                          }                      }                  } @@ -1174,8 +1173,7 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)                          LLModel* found_model = NULL;                          LLMatrix4 transform; -                        FindModel(mBaseScene, loaded_name, found_model, transform); -                        if (found_model) +                        if (FindModel(mBaseScene, loaded_name, found_model, transform))                          { // don't rename correctly named models (even if they are placed in a wrong order)                              name_based = true;                          } diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 6e666b8a4b..9d8493549d 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -819,6 +819,50 @@ void LLOutfitListBase::observerCallback(const LLUUID& category_id)      refreshList(category_id);  } +class LLIsOutfitListFolder : public LLInventoryCollectFunctor +{ +public: +    LLIsOutfitListFolder() +    { +        mOutfitsId = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); +    } +    virtual ~LLIsOutfitListFolder() {} + +    bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) override +    { +        if (cat) +        { +            if (cat->getPreferredType() == LLFolderType::FT_OUTFIT) +            { +                return true; +            } +            if (cat->getPreferredType() == LLFolderType::FT_NONE +                && cat->getParentUUID() == mOutfitsId) +            { +                LLViewerInventoryCategory* inv_cat = dynamic_cast<LLViewerInventoryCategory*>(cat); +                if (inv_cat && inv_cat->getDescendentCount() > 3) +                { +                    LLInventoryModel::cat_array_t* cats; +                    LLInventoryModel::item_array_t* items; +                    gInventory.getDirectDescendentsOf(inv_cat->getUUID(), cats, items); +                    if (cats->empty() // protection against outfits inside +                        && items->size() > 3) // eyes, skin, hair and shape are required +                    { +                        // For now assume this to be an old style outfit, not a subfolder +                        // but ideally no such 'outfits' should be left in My Outfits +                        // Todo: stop counting FT_NONE as outfits, +                        // convert obvious outfits into FT_OUTFIT +                        return true; +                    } +                } +            } +        } +        return false; +    } +protected: +    LLUUID mOutfitsId; +}; +  void LLOutfitListBase::refreshList(const LLUUID& category_id)  {      bool wasNull = mRefreshListState.CategoryUUID.isNull(); @@ -828,13 +872,13 @@ void LLOutfitListBase::refreshList(const LLUUID& category_id)      LLInventoryModel::item_array_t item_array;      // Collect all sub-categories of a given category. -    LLIsType is_category(LLAssetType::AT_CATEGORY); +    LLIsOutfitListFolder is_outfit;      gInventory.collectDescendentsIf(          category_id,          cat_array,          item_array,          LLInventoryModel::EXCLUDE_TRASH, -        is_category); +        is_outfit);      // Memorize item names for each UUID      std::map<LLUUID, std::string> names; diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 4ada9c445c..3a164ec94b 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -3644,7 +3644,7 @@ void LLPanelFace::onCommitRepeatsPerMeter()      bool identical_scale_t = false;      LLSelectedTE::getObjectScaleS(obj_scale_s, identical_scale_s); -    LLSelectedTE::getObjectScaleS(obj_scale_t, identical_scale_t); +    LLSelectedTE::getObjectScaleT(obj_scale_t, identical_scale_t);      if (gSavedSettings.getBOOL("SyncMaterialSettings"))      { @@ -5151,6 +5151,7 @@ void LLPanelFace::LLSelectedTEMaterial::getMaxSpecularRepeats(F32& repeats, bool              LLMaterial* mat = object->getTE(face)->getMaterialParams().get();              U32 s_axis = VX;              U32 t_axis = VY; +            LLPrimitive::getTESTAxes(face, &s_axis, &t_axis);              F32 repeats_s = 1.0f;              F32 repeats_t = 1.0f;              if (mat) @@ -5175,6 +5176,7 @@ void LLPanelFace::LLSelectedTEMaterial::getMaxNormalRepeats(F32& repeats, bool&              LLMaterial* mat = object->getTE(face)->getMaterialParams().get();              U32 s_axis = VX;              U32 t_axis = VY; +            LLPrimitive::getTESTAxes(face, &s_axis, &t_axis);              F32 repeats_s = 1.0f;              F32 repeats_t = 1.0f;              if (mat) diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 7b562337a3..b1c8b5f36a 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -777,7 +777,7 @@ void LLPanelPrimMediaControls::draw()      else if(mFadeTimer.getStarted())      {          F32 time = mFadeTimer.getElapsedTimeF32(); -        alpha *= llmax(lerp(1.0f, 0.0f, time / mControlFadeTime), 0.0f); +        alpha *= llmax(lerp(1.f, 0.f, time / mControlFadeTime), 0.0f);          if(time >= mControlFadeTime)          { diff --git a/indra/newview/llpanelprofileclassifieds.h b/indra/newview/llpanelprofileclassifieds.h index 42cd5f8975..2e6b7c4428 100644 --- a/indra/newview/llpanelprofileclassifieds.h +++ b/indra/newview/llpanelprofileclassifieds.h @@ -157,17 +157,17 @@ public:      void setParcelId(const LLUUID& id) { mParcelId = id; } -    LLUUID getParcelId() { return mParcelId; } +    LLUUID getParcelId() const { return mParcelId; }      void setSimName(const std::string& sim_name) { mSimName = sim_name; } -    std::string getSimName() { return mSimName; } +    std::string getSimName() const { return mSimName; }      void setFromSearch(bool val) { mFromSearch = val; } -    bool fromSearch() { return mFromSearch; } +    bool fromSearch() const { return mFromSearch; } -    bool getInfoLoaded() { return mInfoLoaded; } +    bool getInfoLoaded() const { return mInfoLoaded; }      void setInfoLoaded(bool loaded) { mInfoLoaded = loaded; } @@ -175,9 +175,9 @@ public:      void resetDirty() override; -    bool isNew() { return mIsNew; } +    bool isNew() const { return mIsNew; } -    bool isNewWithErrors() { return mIsNewWithErrors; } +    bool isNewWithErrors() const { return mIsNewWithErrors; }      bool canClose(); @@ -191,10 +191,10 @@ public:      bool getAutoRenew(); -    S32 getPriceForListing() { return mPriceForListing; } +    S32 getPriceForListing() const { return mPriceForListing; }      void setEditMode(bool edit_mode); -    bool getEditMode() {return mEditMode;} +    bool getEditMode() const { return mEditMode; }      static void setClickThrough(          const LLUUID& classified_id, diff --git a/indra/newview/llpanelsnapshot.cpp b/indra/newview/llpanelsnapshot.cpp index 32c9f6f402..56c0294dbe 100644 --- a/indra/newview/llpanelsnapshot.cpp +++ b/indra/newview/llpanelsnapshot.cpp @@ -37,6 +37,7 @@  // newview  #include "llsidetraypanelcontainer.h" +#include "llsnapshotlivepreview.h"  #include "llviewercontrol.h" // gSavedSettings  #include "llagentbenefits.h" @@ -99,6 +100,17 @@ void LLPanelSnapshot::onOpen(const LLSD& key)      {          getParentByType<LLFloater>()->notify(LLSD().with("image-format-change", true));      } + +    // If resolution is set to "Current Window", force a snapshot update +    // each time a snapshot panel is opened to determine the correct +    // image size (and upload fee) depending on the snapshot type. +    if (mSnapshotFloater && getChild<LLUICtrl>(getImageSizeComboName())->getValue().asString() == "[i0,i0]") +    { +        if (LLSnapshotLivePreview* preview = mSnapshotFloater->getPreviewView()) +        { +            preview->mForceUpdateSnapshot = true; +        } +    }  }  LLSnapshotModel::ESnapshotFormat LLPanelSnapshot::getImageFormat() const diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp index 96b17acc40..b81b891685 100644 --- a/indra/newview/llpanelsnapshotinventory.cpp +++ b/indra/newview/llpanelsnapshotinventory.cpp @@ -42,77 +42,35 @@  /**   * The panel provides UI for saving snapshot as an inventory texture.   */ -class LLPanelSnapshotInventoryBase -    : public LLPanelSnapshot -{ -    LOG_CLASS(LLPanelSnapshotInventoryBase); - -public: -    LLPanelSnapshotInventoryBase(); - -    /*virtual*/ bool postBuild(); -protected: -    void onSend(); -    /*virtual*/ LLSnapshotModel::ESnapshotType getSnapshotType(); -}; -  class LLPanelSnapshotInventory -    : public LLPanelSnapshotInventoryBase +    : public LLPanelSnapshot  {      LOG_CLASS(LLPanelSnapshotInventory);  public:      LLPanelSnapshotInventory(); -    /*virtual*/ bool postBuild(); -    /*virtual*/ void onOpen(const LLSD& key); +    bool postBuild() override; +    void onOpen(const LLSD& key) override;      void onResolutionCommit(LLUICtrl* ctrl);  private: -    /*virtual*/ std::string getWidthSpinnerName() const     { return "inventory_snapshot_width"; } -    /*virtual*/ std::string getHeightSpinnerName() const    { return "inventory_snapshot_height"; } -    /*virtual*/ std::string getAspectRatioCBName() const    { return "inventory_keep_aspect_check"; } -    /*virtual*/ std::string getImageSizeComboName() const   { return "texture_size_combo"; } -    /*virtual*/ std::string getImageSizePanelName() const   { return LLStringUtil::null; } -    /*virtual*/ void updateControls(const LLSD& info); - -}; - -class LLPanelOutfitSnapshotInventory -    : public LLPanelSnapshotInventoryBase -{ -    LOG_CLASS(LLPanelOutfitSnapshotInventory); - -public: -    LLPanelOutfitSnapshotInventory(); -        /*virtual*/ bool postBuild(); -        /*virtual*/ void onOpen(const LLSD& key); +    std::string getWidthSpinnerName() const override   { return "inventory_snapshot_width"; } +    std::string getHeightSpinnerName() const override  { return "inventory_snapshot_height"; } +    std::string getAspectRatioCBName() const override  { return "inventory_keep_aspect_check"; } +    std::string getImageSizeComboName() const override { return "texture_size_combo"; } +    std::string getImageSizePanelName() const override { return LLStringUtil::null; } +    LLSnapshotModel::ESnapshotType getSnapshotType() override; +    void updateControls(const LLSD& info) override; -private: -    /*virtual*/ std::string getWidthSpinnerName() const     { return ""; } -    /*virtual*/ std::string getHeightSpinnerName() const    { return ""; } -    /*virtual*/ std::string getAspectRatioCBName() const    { return ""; } -    /*virtual*/ std::string getImageSizeComboName() const   { return "texture_size_combo"; } -    /*virtual*/ std::string getImageSizePanelName() const   { return LLStringUtil::null; } -    /*virtual*/ void updateControls(const LLSD& info); - -    /*virtual*/ void cancel(); +    void onSend(); +    void updateUploadCost(); +    S32 calculateUploadCost();  };  static LLPanelInjector<LLPanelSnapshotInventory> panel_class1("llpanelsnapshotinventory"); -static LLPanelInjector<LLPanelOutfitSnapshotInventory> panel_class2("llpaneloutfitsnapshotinventory"); - -LLPanelSnapshotInventoryBase::LLPanelSnapshotInventoryBase() -{ -} - -bool LLPanelSnapshotInventoryBase::postBuild() -{ -    return LLPanelSnapshot::postBuild(); -} - -LLSnapshotModel::ESnapshotType LLPanelSnapshotInventoryBase::getSnapshotType() +LLSnapshotModel::ESnapshotType LLPanelSnapshotInventory::getSnapshotType()  {      return LLSnapshotModel::SNAPSHOT_TEXTURE;  } @@ -130,12 +88,14 @@ bool LLPanelSnapshotInventory::postBuild()      getChild<LLSpinCtrl>(getHeightSpinnerName())->setAllowEdit(false);      getChild<LLUICtrl>(getImageSizeComboName())->setCommitCallback(boost::bind(&LLPanelSnapshotInventory::onResolutionCommit, this, _1)); -    return LLPanelSnapshotInventoryBase::postBuild(); +    return LLPanelSnapshot::postBuild();  }  // virtual  void LLPanelSnapshotInventory::onOpen(const LLSD& key)  { +    updateUploadCost(); +      LLPanelSnapshot::onOpen(key);  } @@ -144,6 +104,8 @@ void LLPanelSnapshotInventory::updateControls(const LLSD& info)  {      const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true;      getChild<LLUICtrl>("save_btn")->setEnabled(have_snapshot); + +    updateUploadCost();  }  void LLPanelSnapshotInventory::onResolutionCommit(LLUICtrl* ctrl) @@ -153,21 +115,9 @@ void LLPanelSnapshotInventory::onResolutionCommit(LLUICtrl* ctrl)      getChild<LLSpinCtrl>(getHeightSpinnerName())->setVisible(!current_window_selected);  } -void LLPanelSnapshotInventoryBase::onSend() +void LLPanelSnapshotInventory::onSend()  { -    S32 w = 0; -    S32 h = 0; - -    if( mSnapshotFloater ) -    { -        LLSnapshotLivePreview* preview = mSnapshotFloater->getPreviewView(); -        if( preview ) -        { -            preview->getSize(w, h); -        } -    } - -    S32 expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost(w, h); +    S32 expected_upload_cost = calculateUploadCost();      if (can_afford_transaction(expected_upload_cost))      {          if (mSnapshotFloater) @@ -188,36 +138,24 @@ void LLPanelSnapshotInventoryBase::onSend()      }  } -LLPanelOutfitSnapshotInventory::LLPanelOutfitSnapshotInventory() +void LLPanelSnapshotInventory::updateUploadCost()  { -    mCommitCallbackRegistrar.add("Inventory.SaveOutfitPhoto", boost::bind(&LLPanelOutfitSnapshotInventory::onSend, this)); -    mCommitCallbackRegistrar.add("Inventory.SaveOutfitCancel", boost::bind(&LLPanelOutfitSnapshotInventory::cancel, this)); +    getChild<LLUICtrl>("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", calculateUploadCost()));  } -// virtual -bool LLPanelOutfitSnapshotInventory::postBuild() +S32 LLPanelSnapshotInventory::calculateUploadCost()  { -    return LLPanelSnapshotInventoryBase::postBuild(); -} - -// virtual -void LLPanelOutfitSnapshotInventory::onOpen(const LLSD& key) -{ -    getChild<LLUICtrl>("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", LLAgentBenefitsMgr::current().getTextureUploadCost())); -    LLPanelSnapshot::onOpen(key); -} - -// virtual -void LLPanelOutfitSnapshotInventory::updateControls(const LLSD& info) -{ -    const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true; -    getChild<LLUICtrl>("save_btn")->setEnabled(have_snapshot); -} +    S32 w = 0; +    S32 h = 0; -void LLPanelOutfitSnapshotInventory::cancel() -{      if (mSnapshotFloater)      { -        mSnapshotFloater->closeFloater(); +        if (LLSnapshotLivePreview* preview = mSnapshotFloater->getPreviewView()) +        { +            w = preview->getEncodedImageWidth(); +            h = preview->getEncodedImageHeight(); +        }      } + +    return LLAgentBenefitsMgr::current().getTextureUploadCost(w, h);  } diff --git a/indra/newview/llpanelsnapshotlocal.cpp b/indra/newview/llpanelsnapshotlocal.cpp index 366030c0fa..57759fbcaa 100644 --- a/indra/newview/llpanelsnapshotlocal.cpp +++ b/indra/newview/llpanelsnapshotlocal.cpp @@ -47,18 +47,18 @@ class LLPanelSnapshotLocal  public:      LLPanelSnapshotLocal(); -    /*virtual*/ bool postBuild(); -    /*virtual*/ void onOpen(const LLSD& key); +    bool postBuild() override; +    void onOpen(const LLSD& key) override;  private: -    /*virtual*/ std::string getWidthSpinnerName() const     { return "local_snapshot_width"; } -    /*virtual*/ std::string getHeightSpinnerName() const    { return "local_snapshot_height"; } -    /*virtual*/ std::string getAspectRatioCBName() const    { return "local_keep_aspect_check"; } -    /*virtual*/ std::string getImageSizeComboName() const   { return "local_size_combo"; } -    /*virtual*/ std::string getImageSizePanelName() const   { return "local_image_size_lp"; } -    /*virtual*/ LLSnapshotModel::ESnapshotFormat getImageFormat() const; -    /*virtual*/ LLSnapshotModel::ESnapshotType getSnapshotType(); -    /*virtual*/ void updateControls(const LLSD& info); +    std::string getWidthSpinnerName() const  override  { return "local_snapshot_width"; } +    std::string getHeightSpinnerName() const override  { return "local_snapshot_height"; } +    std::string getAspectRatioCBName() const override  { return "local_keep_aspect_check"; } +    std::string getImageSizeComboName() const override { return "local_size_combo"; } +    std::string getImageSizePanelName() const override { return "local_image_size_lp"; } +    LLSnapshotModel::ESnapshotFormat getImageFormat() const override; +    LLSnapshotModel::ESnapshotType getSnapshotType() override; +    void updateControls(const LLSD& info) override;      S32 mLocalFormat; diff --git a/indra/newview/llpanelsnapshotoptions.cpp b/indra/newview/llpanelsnapshotoptions.cpp index 962d3bba16..05cd9e7b3a 100644 --- a/indra/newview/llpanelsnapshotoptions.cpp +++ b/indra/newview/llpanelsnapshotoptions.cpp @@ -30,12 +30,8 @@  #include "llsidetraypanelcontainer.h"  #include "llfloatersnapshot.h" // FIXME: create a snapshot model -#include "llsnapshotlivepreview.h"  #include "llfloaterreg.h" -#include "llagentbenefits.h" - -  /**   * Provides several ways to save a snapshot.   */ @@ -46,12 +42,9 @@ class LLPanelSnapshotOptions  public:      LLPanelSnapshotOptions(); -    ~LLPanelSnapshotOptions(); -    /*virtual*/ bool postBuild(); -    /*virtual*/ void onOpen(const LLSD& key); +    bool postBuild() override;  private: -    void updateUploadCost();      void openPanel(const std::string& panel_name);      void onSaveToProfile();      void onSaveToEmail(); @@ -71,10 +64,6 @@ LLPanelSnapshotOptions::LLPanelSnapshotOptions()      mCommitCallbackRegistrar.add("Snapshot.SaveToComputer",     boost::bind(&LLPanelSnapshotOptions::onSaveToComputer,  this));  } -LLPanelSnapshotOptions::~LLPanelSnapshotOptions() -{ -} -  // virtual  bool LLPanelSnapshotOptions::postBuild()  { @@ -82,30 +71,6 @@ bool LLPanelSnapshotOptions::postBuild()      return LLPanel::postBuild();  } -// virtual -void LLPanelSnapshotOptions::onOpen(const LLSD& key) -{ -    updateUploadCost(); -} - -void LLPanelSnapshotOptions::updateUploadCost() -{ -    S32 w = 0; -    S32 h = 0; - -    if( mSnapshotFloater ) -    { -        LLSnapshotLivePreview* preview = mSnapshotFloater->getPreviewView(); -        if( preview ) -        { -            preview->getSize(w, h); -        } -    } - -    S32 upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost(w, h); -    getChild<LLUICtrl>("save_to_inventory_btn")->setLabelArg("[AMOUNT]", llformat("%d", upload_cost)); -} -  void LLPanelSnapshotOptions::openPanel(const std::string& panel_name)  {      LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent()); diff --git a/indra/newview/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp index 23e8789e3f..f3dfdc9250 100644 --- a/indra/newview/llpanelsnapshotpostcard.cpp +++ b/indra/newview/llpanelsnapshotpostcard.cpp @@ -56,18 +56,18 @@ class LLPanelSnapshotPostcard  public:      LLPanelSnapshotPostcard(); -    /*virtual*/ bool postBuild(); -    /*virtual*/ void onOpen(const LLSD& key); +    bool postBuild() override; +    void onOpen(const LLSD& key) override;  private: -    /*virtual*/ std::string getWidthSpinnerName() const     { return "postcard_snapshot_width"; } -    /*virtual*/ std::string getHeightSpinnerName() const    { return "postcard_snapshot_height"; } -    /*virtual*/ std::string getAspectRatioCBName() const    { return "postcard_keep_aspect_check"; } -    /*virtual*/ std::string getImageSizeComboName() const   { return "postcard_size_combo"; } -    /*virtual*/ std::string getImageSizePanelName() const   { return "postcard_image_size_lp"; } -    /*virtual*/ LLSnapshotModel::ESnapshotFormat getImageFormat() const { return LLSnapshotModel::SNAPSHOT_FORMAT_JPEG; } -    /*virtual*/ LLSnapshotModel::ESnapshotType getSnapshotType(); -    /*virtual*/ void updateControls(const LLSD& info); +    std::string getWidthSpinnerName() const override   { return "postcard_snapshot_width"; } +    std::string getHeightSpinnerName() const override  { return "postcard_snapshot_height"; } +    std::string getAspectRatioCBName() const override  { return "postcard_keep_aspect_check"; } +    std::string getImageSizeComboName() const override { return "postcard_size_combo"; } +    std::string getImageSizePanelName() const override { return "postcard_image_size_lp"; } +    LLSnapshotModel::ESnapshotFormat getImageFormat() const override { return LLSnapshotModel::SNAPSHOT_FORMAT_JPEG; } +    LLSnapshotModel::ESnapshotType getSnapshotType() override; +    void updateControls(const LLSD& info) override;      bool missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response);      static void sendPostcardFinished(LLSD result); diff --git a/indra/newview/llpanelsnapshotprofile.cpp b/indra/newview/llpanelsnapshotprofile.cpp index aa257dea9e..b533d7bbbc 100644 --- a/indra/newview/llpanelsnapshotprofile.cpp +++ b/indra/newview/llpanelsnapshotprofile.cpp @@ -49,17 +49,17 @@ class LLPanelSnapshotProfile  public:      LLPanelSnapshotProfile(); -    /*virtual*/ bool postBuild(); -    /*virtual*/ void onOpen(const LLSD& key); +    bool postBuild() override; +    void onOpen(const LLSD& key) override;  private: -    /*virtual*/ std::string getWidthSpinnerName() const     { return "profile_snapshot_width"; } -    /*virtual*/ std::string getHeightSpinnerName() const    { return "profile_snapshot_height"; } -    /*virtual*/ std::string getAspectRatioCBName() const    { return "profile_keep_aspect_check"; } -    /*virtual*/ std::string getImageSizeComboName() const   { return "profile_size_combo"; } -    /*virtual*/ std::string getImageSizePanelName() const   { return "profile_image_size_lp"; } -    /*virtual*/ LLSnapshotModel::ESnapshotFormat getImageFormat() const { return LLSnapshotModel::SNAPSHOT_FORMAT_PNG; } -    /*virtual*/ void updateControls(const LLSD& info); +    std::string getWidthSpinnerName() const override   { return "profile_snapshot_width"; } +    std::string getHeightSpinnerName() const override  { return "profile_snapshot_height"; } +    std::string getAspectRatioCBName() const override  { return "profile_keep_aspect_check"; } +    std::string getImageSizeComboName() const override { return "profile_size_combo"; } +    std::string getImageSizePanelName() const override { return "profile_image_size_lp"; } +    LLSnapshotModel::ESnapshotFormat getImageFormat() const override { return LLSnapshotModel::SNAPSHOT_FORMAT_PNG; } +    void updateControls(const LLSD& info) override;      void onSend();  }; diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index 951dc45a78..2fbdbeaf59 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -576,32 +576,48 @@ void LLPanelVolume::getState( )              return object->getMaterial();          }      } func; -    bool material_same = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, material_code ); +    LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); +    bool material_same = selection->getSelectedTEValue( &func, material_code );      std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright"); -    if (editable && single_volume && material_same) + +    bool enable_material = editable && single_volume && material_same; +    LLCachedControl<bool> edit_linked(gSavedSettings, "EditLinkedParts", false); +    if (!enable_material && !edit_linked())      { -        mComboMaterial->setEnabled( true ); -        if (material_code == LL_MCODE_LIGHT) +        LLViewerObject* root = selection->getPrimaryObject(); +        while (root && !root->isAvatar() && root->getParent())          { -            if (mComboMaterial->getItemCount() == mComboMaterialItemCount) +            LLViewerObject* parent = (LLViewerObject*)root->getParent(); +            if (parent->isAvatar())              { -                mComboMaterial->add(LEGACY_FULLBRIGHT_DESC); +                break;              } -            mComboMaterial->setSimple(LEGACY_FULLBRIGHT_DESC); +            root = parent;          } -        else +        if (root)          { -            if (mComboMaterial->getItemCount() != mComboMaterialItemCount) -            { -                mComboMaterial->remove(LEGACY_FULLBRIGHT_DESC); -            } +            material_code = root->getMaterial(); +        } +    } -            mComboMaterial->setSimple(std::string(LLMaterialTable::basic.getName(material_code))); +    mComboMaterial->setEnabled(enable_material); + +    if (material_code == LL_MCODE_LIGHT) +    { +        if (mComboMaterial->getItemCount() == mComboMaterialItemCount) +        { +            mComboMaterial->add(LEGACY_FULLBRIGHT_DESC);          } +        mComboMaterial->setSimple(LEGACY_FULLBRIGHT_DESC);      }      else      { -        mComboMaterial->setEnabled( false ); +        if (mComboMaterial->getItemCount() != mComboMaterialItemCount) +        { +            mComboMaterial->remove(LEGACY_FULLBRIGHT_DESC); +        } + +        mComboMaterial->setSimple(std::string(LLMaterialTable::basic.getName(material_code)));      }      // Physics properties diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 86291708b0..e5c84728fe 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -646,18 +646,17 @@ bool LLPhysicsMotion::onUpdate(F32 time)              velocity_new_local = 0;          } -        // Check for NaN values.  A NaN value is detected if the variables doesn't equal itself. -        // If NaN, then reset everything. -        if ((mPosition_local != mPosition_local) || -            (mVelocity_local != mVelocity_local) || -            (position_new_local != position_new_local)) +        // Check for NaN values. If NaN, then reset everything. +        if (llisnan(mPosition_local) || +            llisnan(mVelocity_local) || +            llisnan(position_new_local))          { -            position_new_local = 0; -            mVelocity_local = 0; -            mVelocityJoint_local = 0; -            mAccelerationJoint_local = 0; -            mPosition_local = 0; -            mPosition_world = LLVector3(0,0,0); +            position_new_local = 0.f; +            mVelocity_local = 0.f; +            mVelocityJoint_local = 0.f; +            mAccelerationJoint_local = 0.f; +            mPosition_local = 0.f; +            mPosition_world = LLVector3(0.f,0.f,0.f);          }          const F32 position_new_local_clamped = llclamp(position_new_local, diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 02a4c7fb26..c2aa4925bd 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -703,9 +703,10 @@ void LLScriptEdCore::sync()      }  } -bool LLScriptEdCore::hasChanged() +bool LLScriptEdCore::hasChanged() const  { -    if (!mEditor) return false; +    if (!mEditor) +        return false;      return ((!mEditor->isPristine() || mEnableSave) && mHasScriptData);  } diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index 70ee1a4274..0bbe540207 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -143,7 +143,7 @@ public:      void            setItemRemoved(bool script_removed){mScriptRemoved = script_removed;};      void            setAssetID( const LLUUID& asset_id){ mAssetID = asset_id; }; -    LLUUID          getAssetID() { return mAssetID; } +    LLUUID          getAssetID() const { return mAssetID; }      bool isFontSizeChecked(const LLSD &userdata);      void onChangeFontSize(const LLSD &size_name); @@ -155,7 +155,7 @@ public:      void        onBtnDynamicHelp();      void        onBtnUndoChanges(); -    bool        hasChanged(); +    bool        hasChanged() const;      void selectFirstError(); @@ -211,7 +211,6 @@ class LLScriptEdContainer : public LLPreview  public:      LLScriptEdContainer(const LLSD& key); -    LLScriptEdContainer(const LLSD& key, const bool live);      bool handleKeyHere(KEY key, MASK mask); diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 1876cd3086..41895d7d6a 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -3139,6 +3139,8 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch)                      F32 scale_x = 1;                      F32 scale_y = 1; +                    F32 offset_x = 0; +                    F32 offset_y = 0;                      for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)                      { @@ -3155,6 +3157,21 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch)                              scale_y = scale_ratio.mV[t_axis] * object_scale.mV[t_axis];                          }                          material->mTextureTransform[i].mScale.set(scale_x, scale_y); + +                        LLVector2 scales = selectNode->mGLTFScales[te_num][i]; +                        LLVector2 offsets = selectNode->mGLTFOffsets[te_num][i]; +                        F64 int_part = 0; +                        offset_x = (F32)modf((offsets[VX] + (scales[VX] - scale_x)) / 2, &int_part); +                        if (offset_x < 0) +                        { +                            offset_x++; +                        } +                        offset_y = (F32)modf((offsets[VY] + (scales[VY] - scale_y)) / 2, &int_part); +                        if (offset_y < 0) +                        { +                            offset_y++; +                        } +                        material->mTextureTransform[i].mOffset.set(offset_x, offset_y);                      }                      const LLGLTFMaterial* base_material = tep->getGLTFMaterial(); @@ -6909,6 +6926,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)  {      mTextureScaleRatios.clear();      mGLTFScaleRatios.clear(); +    mGLTFScales.clear(); +    mGLTFOffsets.clear();      if (mObject.notNull())      { @@ -6949,6 +6968,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)              F32 scale_x = 1;              F32 scale_y = 1;              std::vector<LLVector3> material_v_vec; +            std::vector<LLVector2> material_scales_vec; +            std::vector<LLVector2> material_offset_vec;              for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)              {                  if (material) @@ -6956,12 +6977,16 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)                      LLGLTFMaterial::TextureTransform& transform = material->mTextureTransform[i];                      scale_x = transform.mScale[VX];                      scale_y = transform.mScale[VY]; +                    material_scales_vec.push_back(transform.mScale); +                    material_offset_vec.push_back(transform.mOffset);                  }                  else                  {                      // Not having an override doesn't mean that there is no material                      scale_x = 1;                      scale_y = 1; +                    material_scales_vec.emplace_back(scale_x, scale_y); +                    material_offset_vec.emplace_back(0.f, 0.f);                  }                  if (tep->getTexGen() == LLTextureEntry::TEX_GEN_PLANAR) @@ -6977,6 +7002,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)                  material_v_vec.push_back(material_v);              }              mGLTFScaleRatios.push_back(material_v_vec); +            mGLTFScales.push_back(material_scales_vec); +            mGLTFOffsets.push_back(material_offset_vec);          }      }  } diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 0dbdc133e3..792a37297f 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -242,6 +242,8 @@ public:      gltf_materials_vec_t mSavedGLTFOverrideMaterials;      std::vector<LLVector3>  mTextureScaleRatios;      std::vector< std::vector<LLVector3> >  mGLTFScaleRatios; +    std::vector< std::vector<LLVector2> >  mGLTFScales; +    std::vector< std::vector<LLVector2> >  mGLTFOffsets;      std::vector<LLVector3>  mSilhouetteVertices;    // array of vertices to render silhouette of object      std::vector<LLVector3>  mSilhouetteNormals; // array of normals to render silhouette of object      bool                    mSilhouetteExists;  // need to generate silhouette? diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp index ea95d71b27..68b4ab381a 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -694,6 +694,7 @@ bool LLSnapshotLivePreview::onIdle( void* snapshot_preview )      static LLCachedControl<bool> freeze_time(gSavedSettings, "FreezeTime", false);      static LLCachedControl<bool> use_freeze_frame(gSavedSettings, "UseFreezeFrame", false);      static LLCachedControl<bool> render_ui(gSavedSettings, "RenderUIInSnapshot", false); +    static LLCachedControl<bool> render_balance(gSavedSettings, "RenderBalanceInSnapshot", false);      static LLCachedControl<bool> render_hud(gSavedSettings, "RenderHUDInSnapshot", false);      static LLCachedControl<bool> render_no_post(gSavedSettings, "RenderSnapshotNoPost", false); @@ -750,6 +751,7 @@ bool LLSnapshotLivePreview::onIdle( void* snapshot_preview )                  render_hud,                  false,                  render_no_post, +                render_balance,                  previewp->mSnapshotBufferType,                  previewp->getMaxImageSize()))          { diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 1bab602364..bda75c16e7 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -759,6 +759,10 @@ void LLStatusBar::updateBalancePanelPosition()      balance_bg_view->setShape(balance_bg_rect);  } +void LLStatusBar::setBalanceVisible(bool visible) +{ +    mBoxBalance->setVisible(visible); +}  // Implements secondlife:///app/balance/request to request a L$ balance  // update via UDP message system. JC diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h index 7e1ecf08ca..86c1ccd051 100644 --- a/indra/newview/llstatusbar.h +++ b/indra/newview/llstatusbar.h @@ -93,6 +93,8 @@ public:      S32 getSquareMetersCommitted() const;      S32 getSquareMetersLeft() const; +    void setBalanceVisible(bool visible); +      LLPanelNearByMedia* getNearbyMediaPanel() { return mPanelNearByMedia; }  private: diff --git a/indra/newview/llsurfacepatch.cpp b/indra/newview/llsurfacepatch.cpp index 4315c4c6b0..6f99da5957 100644 --- a/indra/newview/llsurfacepatch.cpp +++ b/indra/newview/llsurfacepatch.cpp @@ -201,7 +201,7 @@ LLVector2 LLSurfacePatch::getTexCoords(const U32 x, const U32 y) const  void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3 *vertex, LLVector3 *normal, -                          LLVector2 *tex1) const +                          LLVector2* tex0, LLVector2 *tex1) const  {      if (!mSurfacep || !mSurfacep->getRegion() || !mSurfacep->getGridsPerEdge() || !mVObjp)      { @@ -210,6 +210,7 @@ void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3      llassert_always(vertex && normal && tex1);      U32 surface_stride = mSurfacep->getGridsPerEdge(); +    U32 texture_stride = mSurfacep->getGridsPerEdge() - 1;      U32 point_offset = x + y*surface_stride;      *normal = getNormal(x, y); @@ -220,6 +221,12 @@ void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3      pos_agent.mV[VZ]  = *(mDataZ + point_offset);      *vertex     = pos_agent-mVObjp->getRegion()->getOriginAgent(); +    // tex0 is used for ownership overlay +    LLVector3 rel_pos = pos_agent - mSurfacep->getOriginAgent(); +    LLVector3 tex_pos = rel_pos * (1.f / (texture_stride * mSurfacep->getMetersPerGrid())); +    tex0->mV[0] = tex_pos.mV[0]; +    tex0->mV[1] = tex_pos.mV[1]; +      tex1->mV[0] = mSurfacep->getRegion()->getCompositionXY(llfloor(mOriginRegion.mV[0])+x, llfloor(mOriginRegion.mV[1])+y);      const F32 xyScale = 4.9215f*7.f; //0.93284f; diff --git a/indra/newview/llsurfacepatch.h b/indra/newview/llsurfacepatch.h index f4831487c1..505fc8c24c 100644 --- a/indra/newview/llsurfacepatch.h +++ b/indra/newview/llsurfacepatch.h @@ -116,7 +116,7 @@ public:      void calcNormalFlat(LLVector3& normal_out, const U32 x, const U32 y, const U32 index /* 0 or 1 */);      void eval(const U32 x, const U32 y, const U32 stride, -                LLVector3 *vertex, LLVector3 *normal, LLVector2 *tex1) const; +                LLVector3 *vertex, LLVector3 *normal, LLVector2* tex0, LLVector2 *tex1) const; diff --git a/indra/newview/llterrainpaintmap.cpp b/indra/newview/llterrainpaintmap.cpp index 8ccde74c93..c7a82013e4 100644 --- a/indra/newview/llterrainpaintmap.cpp +++ b/indra/newview/llterrainpaintmap.cpp @@ -204,8 +204,9 @@ bool LLTerrainPaintMap::bakeHeightNoiseIntoPBRPaintMapRGB(const LLViewerRegion&                      {                          LLVector3 scratch3;                          LLVector3 pos3; +                        LLVector2 tex0_temp;                          LLVector2 tex1_temp; -                        patch->eval(i, j, stride, &pos3, &scratch3, &tex1_temp); +                        patch->eval(i, j, stride, &pos3, &scratch3, &tex0_temp, &tex1_temp);                          (*pos++).set(pos3.mV[VX], pos3.mV[VY], pos3.mV[VZ]);                          *tex1++ = tex1_temp;                          vertex_total++; diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index be7653c011..442c627d07 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -1347,27 +1347,39 @@ U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries)      }      for (U32 idx=0; idx<num_entries; idx++)      { -        Entry entry; -        S32 bytes_read = aprfile->read((void*)(&entry), (S32)sizeof(Entry)); -        if (bytes_read < sizeof(Entry)) +        try +        { +            Entry entry; +            S32 bytes_read = aprfile->read((void*)(&entry), (S32)sizeof(Entry)); +            if (bytes_read < sizeof(Entry)) +            { +                LL_WARNS() << "Corrupted header entries, failed at " << idx << " / " << num_entries << LL_ENDL; +                return 0; +            } +            entries.push_back(entry); +            //      LL_INFOS() << "ENTRY: " << entry.mTime << " TEX: " << entry.mID << " IDX: " << idx << " Size: " << entry.mImageSize << LL_ENDL; +            if (entry.mImageSize > entry.mBodySize) +            { +                mHeaderIDMap[entry.mID] = idx; +                mTexturesSizeMap[entry.mID] = entry.mBodySize; +                mTexturesSizeTotal += entry.mBodySize; +            } +            else +            { +                mFreeList.insert(idx); +            } +        } +        catch (std::bad_alloc&)          { -            LL_WARNS() << "Corrupted header entries, failed at " << idx << " / " << num_entries << LL_ENDL; +            // Too little ram yet very large cache? +            // Should this actually crash viewer? +            entries.clear(); +            LL_WARNS() << "Bad alloc trying to read texture entries from cache, mFreeList: " << (S32)mFreeList.size() +                << ", added entries: " << idx << ", total entries: " << num_entries << LL_ENDL;              closeHeaderEntriesFile();              purgeAllTextures(false);              return 0;          } -        entries.push_back(entry); -//      LL_INFOS() << "ENTRY: " << entry.mTime << " TEX: " << entry.mID << " IDX: " << idx << " Size: " << entry.mImageSize << LL_ENDL; -        if(entry.mImageSize > entry.mBodySize) -        { -            mHeaderIDMap[entry.mID] = idx; -            mTexturesSizeMap[entry.mID] = entry.mBodySize; -            mTexturesSizeTotal += entry.mBodySize; -        } -        else -        { -            mFreeList.insert(idx); -        }      }      closeHeaderEntriesFile();      return num_entries; diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index b3b4f43e57..404297c58f 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -541,8 +541,8 @@ void audio_update_wind(bool force_update)          // whereas steady-state avatar walk velocity is only 3.2 m/s.          // Without this the world feels desolate on first login when you are          // standing still. -        const F32 WIND_LEVEL = 0.5f; -        LLVector3 scaled_wind_vec = gWindVec * WIND_LEVEL; +        static LLUICachedControl<F32> wind_level("AudioLevelWind", 0.5f); +        LLVector3 scaled_wind_vec = gWindVec * wind_level;          // Mix in the avatar's motion, subtract because when you walk north,          // the apparent wind moves south. diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 24f1be3d1c..10fa0fd3cd 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -215,11 +215,15 @@ void display_update_camera()          final_far = gSavedSettings.getF32("RenderReflectionProbeDrawDistance");      }      else if (CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode()) -      {          final_far *= 0.5f;      } +    else if (LLViewerTexture::sDesiredDiscardBias > 2.f) +    { +        final_far = llmax(32.f, final_far / (LLViewerTexture::sDesiredDiscardBias - 1.f)); +    }      LLViewerCamera::getInstance()->setFar(final_far); +    LLVOAvatar::sRenderDistance = llclamp(final_far, 16.f, 256.f);      gViewerWindow->setup3DRender();      if (!gCubeSnapshot) diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index ce66dbc03f..9743ec0c59 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -932,6 +932,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t          bool render_ui = gSavedSettings.getBOOL("RenderUIInSnapshot");          bool render_hud = gSavedSettings.getBOOL("RenderHUDInSnapshot");          bool render_no_post = gSavedSettings.getBOOL("RenderSnapshotNoPost"); +        bool render_balance = gSavedSettings.getBOOL("RenderBalanceInSnapshot");          bool high_res = gSavedSettings.getBOOL("HighResSnapshot");          if (high_res) @@ -952,6 +953,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t                                         render_hud,                                         false,                                         render_no_post, +                                       render_balance,                                         LLSnapshotModel::SNAPSHOT_TYPE_COLOR,                                         high_res ? S32_MAX : MAX_SNAPSHOT_IMAGE_SIZE)) //per side          { diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 5fd820f91d..bdcfec34f6 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2137,6 +2137,21 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)      EInstantMessage dialog = (EInstantMessage)d;      LLHost sender = msg->getSender(); +    LLSD metadata; +    if (msg->getNumberOfBlocksFast(_PREHASH_MetaData) > 0) +    { +        S32 metadata_size = msg->getSizeFast(_PREHASH_MetaData, 0, _PREHASH_Data); +        std::string metadata_buffer; +        metadata_buffer.resize(metadata_size, 0); + +        msg->getBinaryDataFast(_PREHASH_MetaData, _PREHASH_Data, &metadata_buffer[0], metadata_size, 0, metadata_size ); +        std::stringstream metadata_stream(metadata_buffer); +        if (LLSDSerialize::fromBinary(metadata, metadata_stream, metadata_size) == LLSDParser::PARSE_FAILURE) +        { +            metadata.clear(); +        } +    } +      LLIMProcessing::processNewMessage(from_id,          from_group,          to_id, @@ -2151,7 +2166,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)          position,          binary_bucket,          binary_bucket_size, -        sender); +        sender, +        metadata);  }  void send_do_not_disturb_message (LLMessageSystem* msg, const LLUUID& from_id, const LLUUID& session_id) @@ -5039,6 +5055,7 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)                                          false, //UI                                          gSavedSettings.getBOOL("RenderHUDInSnapshot"),                                          false, +                                        false,                                          LLSnapshotModel::SNAPSHOT_TYPE_COLOR,                                          LLSnapshotModel::SNAPSHOT_FORMAT_PNG);          } @@ -5144,6 +5161,7 @@ static void process_special_alert_messages(const std::string & message)                                      false,                                      gSavedSettings.getBOOL("RenderHUDInSnapshot"),                                      false, +                                    false,                                      LLSnapshotModel::SNAPSHOT_TYPE_COLOR,                                      LLSnapshotModel::SNAPSHOT_FORMAT_PNG);      } @@ -6641,7 +6659,6 @@ void process_initiate_download(LLMessageSystem* msg, void**)          (void**)new std::string(viewer_filename));  } -  void process_script_teleport_request(LLMessageSystem* msg, void**)  {      if (!gSavedSettings.getBOOL("ScriptsCanShowUI")) return; @@ -6655,6 +6672,11 @@ void process_script_teleport_request(LLMessageSystem* msg, void**)      msg->getString("Data", "SimName", sim_name);      msg->getVector3("Data", "SimPosition", pos);      msg->getVector3("Data", "LookAt", look_at); +    U32 flags = (BEACON_SHOW_MAP | BEACON_FOCUS_MAP); +    if (msg->has("Options")) +    { +        msg->getU32("Options", "Flags", flags); +    }      LLFloaterWorldMap* instance = LLFloaterWorldMap::getInstance();      if(instance) @@ -6665,7 +6687,13 @@ void process_script_teleport_request(LLMessageSystem* msg, void**)              << LL_ENDL;          instance->trackURL(sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]); -        LLFloaterReg::showInstance("world_map", "center"); +        if (flags & BEACON_SHOW_MAP) +        { +            bool old_auto_focus = instance->getAutoFocus(); +            instance->setAutoFocus(flags & BEACON_FOCUS_MAP); +            instance->openFloater("center"); +            instance->setAutoFocus(old_auto_focus); +        }      }      // remove above two lines and replace with below line diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index c5e81dd179..8d90187e91 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2325,6 +2325,12 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,          // Set the rotation of the object followed by adjusting for the accumulated angular velocity (llSetTargetOmega)          setRotation(new_rot * mAngularVelocityRot); +        if ((mFlags & FLAGS_SERVER_AUTOPILOT) && asAvatar() && asAvatar()->isSelf()) +        { +            gAgent.resetAxes(); +            gAgent.rotate(new_rot); +            gAgentCamera.resetView(); +        }          setChanged(ROTATED | SILHOUETTE);      } diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 8e6657b4b9..432da2e990 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -42,6 +42,7 @@  // Viewer includes  #include "llagent.h"  #include "llagentaccess.h" +#include "llcallbacklist.h"  #include "llviewerparcelaskplay.h"  #include "llviewerwindow.h"  #include "llviewercontrol.h" @@ -1327,12 +1328,12 @@ const S32 LLViewerParcelMgr::getAgentParcelId() const      return INVALID_PARCEL_ID;  } -void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, bool use_agent_region) +void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel)  {      if(!parcel)          return; -    LLViewerRegion *region = use_agent_region ? gAgent.getRegion() : LLWorld::getInstance()->getRegionFromPosGlobal( mWestSouth ); +    LLViewerRegion *region = LLWorld::getInstance()->getRegionFromID(parcel->getRegionID());      if (!region)          return; @@ -1676,10 +1677,16 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use      // Actually extract the data.      if (parcel)      { +        // store region_id in the parcel so we can find it again later +        LLViewerRegion* parcel_region = LLWorld::getInstance()->getRegion(msg->getSender()); +        if (parcel_region) +        { +            parcel->setRegionID(parcel_region->getRegionID()); +        } +          if (local_id == parcel_mgr.mAgentParcel->getLocalID())          {              // Parcels in different regions can have same ids. -            LLViewerRegion* parcel_region = LLWorld::getInstance()->getRegion(msg->getSender());              LLViewerRegion* agent_region = gAgent.getRegion();              if (parcel_region && agent_region && parcel_region->getRegionID() == agent_region->getRegionID())              { @@ -1750,6 +1757,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use                  {                      instance->mTeleportFinishedSignal(instance->mTeleportInProgressPosition, false);                  } +                instance->postTeleportFinished(instance->mTeleportWithinRegion); +                instance->mTeleportWithinRegion = false;              }              parcel->setParcelEnvironmentVersion(parcel_environment_version);              LL_DEBUGS("ENVIRONMENT") << "Parcel environment version is " << parcel->getParcelEnvironmentVersion() << LL_ENDL; @@ -2719,6 +2728,8 @@ void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos          // Local teleport. We already have the agent parcel data.          // Emit the signal immediately.          getInstance()->mTeleportFinishedSignal(new_pos, local); + +        postTeleportFinished(true);      }      else      { @@ -2727,12 +2738,14 @@ void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos          // Let's wait for the update and then emit the signal.          mTeleportInProgressPosition = new_pos;          mTeleportInProgress = true; +        mTeleportWithinRegion = local;      }  }  void LLViewerParcelMgr::onTeleportFailed()  {      mTeleportFailedSignal(); +    LLEventPumps::instance().obtain("LLTeleport").post(llsd::map("success", false));  }  bool  LLViewerParcelMgr::getTeleportInProgress() @@ -2740,3 +2753,20 @@ bool  LLViewerParcelMgr::getTeleportInProgress()      return mTeleportInProgress // case where parcel data arrives after teleport          || gAgent.getTeleportState() > LLAgent::TELEPORT_NONE; // For LOCAL, no mTeleportInProgress  } + +void LLViewerParcelMgr::postTeleportFinished(bool local) +{ +    auto post = []() +    { +        LLEventPumps::instance().obtain("LLTeleport").post(llsd::map("success", true)); +    }; +    if (local) +    { +        static LLCachedControl<F32> teleport_local_delay(gSavedSettings, "TeleportLocalDelay"); +        doAfterInterval(post, teleport_local_delay + 0.5f); +    } +    else +    { +        post(); +    } +} diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h index 974ea39359..1925cd23ed 100644 --- a/indra/newview/llviewerparcelmgr.h +++ b/indra/newview/llviewerparcelmgr.h @@ -219,7 +219,7 @@ public:      // containing the southwest corner of the selection.      // If want_reply_to_update, simulator will send back a ParcelProperties      // message. -    void    sendParcelPropertiesUpdate(LLParcel* parcel, bool use_agent_region = false); +    void    sendParcelPropertiesUpdate(LLParcel* parcel);      // Takes an Access List flag, like AL_ACCESS or AL_BAN      void    sendParcelAccessListUpdate(U32 which); @@ -295,6 +295,8 @@ public:      void onTeleportFailed();      bool getTeleportInProgress(); +    void postTeleportFinished(bool local); +      static bool isParcelOwnedByAgent(const LLParcel* parcelp, U64 group_proxy_power);      static bool isParcelModifiableByAgent(const LLParcel* parcelp, U64 group_proxy_power); @@ -344,7 +346,9 @@ private:      std::vector<LLParcelObserver*> mObservers; +    // Used to communicate between onTeleportFinished() and processParcelProperties()      bool                        mTeleportInProgress; +    bool                        mTeleportWithinRegion{ false };      LLVector3d                  mTeleportInProgressPosition;      teleport_finished_signal_t  mTeleportFinishedSignal;      teleport_failed_signal_t    mTeleportFailedSignal; diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 40daac887d..f174e16624 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1447,6 +1447,15 @@ bool LLViewerTextureList::createUploadFile(const std::string& filename,          image->setLastError("Couldn't load the image to be uploaded.");          return false;      } + +    // calcDataSizeJ2C assumes maximum size is 2048 and for bigger images can +    // assign discard to bring imige to needed size, but upload does the scaling +    // as needed, so just reset discard. +    // Assume file is full and has 'discard' 0 data. +    // Todo: probably a better idea to have some setMaxDimentions in J2C +    // called when loading from a local file +    image->setDiscardLevel(0); +      // Decompress or expand it in a raw image structure      LLPointer<LLImageRaw> raw_image = new LLImageRaw;      if (!image->decode(raw_image, 0.0f)) diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index ef6409c23b..d32e3f4cbd 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -4862,12 +4862,12 @@ void LLViewerWindow::movieSize(S32 new_width, S32 new_height)      }  } -bool LLViewerWindow::saveSnapshot(const std::string& filepath, S32 image_width, S32 image_height, bool show_ui, bool show_hud, bool do_rebuild, LLSnapshotModel::ESnapshotLayerType type, LLSnapshotModel::ESnapshotFormat format) +bool LLViewerWindow::saveSnapshot(const std::string& filepath, S32 image_width, S32 image_height, bool show_ui, bool show_hud, bool do_rebuild, bool show_balance, LLSnapshotModel::ESnapshotLayerType type, LLSnapshotModel::ESnapshotFormat format)  {      LL_INFOS() << "Saving snapshot to: " << filepath << LL_ENDL;      LLPointer<LLImageRaw> raw = new LLImageRaw; -    bool success = rawSnapshot(raw, image_width, image_height, true, false, show_ui, show_hud, do_rebuild); +    bool success = rawSnapshot(raw, image_width, image_height, true, false, show_ui, show_hud, do_rebuild, show_balance);      if (success)      { @@ -4928,14 +4928,14 @@ void LLViewerWindow::resetSnapshotLoc() const  bool LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, bool show_ui, bool show_hud, bool do_rebuild, bool no_post, LLSnapshotModel::ESnapshotLayerType type)  { -    return rawSnapshot(raw, preview_width, preview_height, false, false, show_ui, show_hud, do_rebuild, no_post, type); +    return rawSnapshot(raw, preview_width, preview_height, false, false, show_ui, show_hud, do_rebuild, no_post, gSavedSettings.getBOOL("RenderBalanceInSnapshot"), type);  }  // Saves the image from the screen to a raw image  // Since the required size might be bigger than the available screen, this method rerenders the scene in parts (called subimages) and copy  // the results over to the final raw image.  bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, -    bool keep_window_aspect, bool is_texture, bool show_ui, bool show_hud, bool do_rebuild, bool no_post, LLSnapshotModel::ESnapshotLayerType type, S32 max_size) +    bool keep_window_aspect, bool is_texture, bool show_ui, bool show_hud, bool do_rebuild, bool no_post, bool show_balance, LLSnapshotModel::ESnapshotLayerType type, S32 max_size)  {      if (!raw)      { @@ -4993,6 +4993,8 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei          // If the user wants the UI, limit the output size to the available screen size          image_width  = llmin(image_width, window_width);          image_height = llmin(image_height, window_height); + +        setBalanceVisible(show_balance);      }      S32 original_width = 0; @@ -5070,11 +5072,13 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei      }      else      { +        setBalanceVisible(true);          return false;      }      if (raw->isBufferInvalid())      { +        setBalanceVisible(true);          return false;      } @@ -5250,6 +5254,7 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei      {          send_agent_resume();      } +    setBalanceVisible(true);      return ret;  } @@ -5715,6 +5720,14 @@ void LLViewerWindow::setProgressCancelButtonVisible( bool b, const std::string&      }  } +void LLViewerWindow::setBalanceVisible(bool visible) +{ +    if (gStatusBar) +    { +        gStatusBar->setBalanceVisible(visible); +    } +} +  LLProgressView *LLViewerWindow::getProgressView() const  {      return mProgressView; diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index ac0dfa3fe4..d55c2d3817 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -364,9 +364,11 @@ public:      // snapshot functionality.      // perhaps some of this should move to llfloatershapshot?  -MG -    bool            saveSnapshot(const std::string&  filename, S32 image_width, S32 image_height, bool show_ui = true, bool show_hud = true, bool do_rebuild = false, LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::ESnapshotFormat format = LLSnapshotModel::SNAPSHOT_FORMAT_BMP); -    bool            rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, bool keep_window_aspect = true, bool is_texture = false, -        bool show_ui = true, bool show_hud = true, bool do_rebuild = false, bool no_post = false, LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE); +    bool saveSnapshot(const std::string&  filename, S32 image_width, S32 image_height, bool show_ui = true, bool show_hud = true, bool do_rebuild = false, bool show_balance = true, +                     LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::ESnapshotFormat format = LLSnapshotModel::SNAPSHOT_FORMAT_BMP); +    bool rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, bool keep_window_aspect = true, bool is_texture = false, +                     bool show_ui = true, bool show_hud = true, bool do_rebuild = false, bool no_post = false, bool show_balance = true, +                     LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE);      bool            simpleSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, const int num_render_passes); @@ -462,6 +464,8 @@ public:      void            calcDisplayScale();      static LLRect   calcScaledRect(const LLRect & rect, const LLVector2& display_scale); +    void setBalanceVisible(bool visible); +      static std::string getLastSnapshotDir();      LLView* getFloaterSnapRegion() { return mFloaterSnapRegion; } diff --git a/indra/newview/llviewerwindowlistener.cpp b/indra/newview/llviewerwindowlistener.cpp index da7e18af5c..3119c31613 100644 --- a/indra/newview/llviewerwindowlistener.cpp +++ b/indra/newview/llviewerwindowlistener.cpp @@ -100,7 +100,7 @@ void LLViewerWindowListener::saveSnapshot(const LLSD& event) const          }          type = found->second;      } -    bool ok = mViewerWindow->saveSnapshot(event["filename"], width, height, showui, showhud, rebuild, type); +    bool ok = mViewerWindow->saveSnapshot(event["filename"], width, height, showui, showhud, rebuild, true /*L$ Balance*/, type);      sendReply(LLSDMap("ok", ok), event);  } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 1cca2161fe..3a52908b8a 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -123,8 +123,8 @@ extern F32 ANIM_SPEED_MAX;  extern F32 ANIM_SPEED_MIN;  extern U32 JOINT_COUNT_REQUIRED_FOR_FULLRIG; -const F32 MAX_HOVER_Z = 2.0; -const F32 MIN_HOVER_Z = -2.0; +const F32 MAX_HOVER_Z = 3.0; +const F32 MIN_HOVER_Z = -3.0;  const F32 MIN_ATTACHMENT_COMPLEXITY = 0.f;  const F32 DEFAULT_MAX_ATTACHMENT_COMPLEXITY = 1.0e6f; @@ -11006,8 +11006,7 @@ void LLVOAvatar::idleUpdateRenderComplexity()      bool autotune = LLPerfStats::tunables.userAutoTuneEnabled && !mIsControlAvatar && !isSelf();      if (autotune && !isDead())      { -        static LLCachedControl<F32> render_far_clip(gSavedSettings, "RenderFarClip", 64); -        F32 radius = render_far_clip * render_far_clip; +        F32 radius = sRenderDistance * sRenderDistance;          bool is_nearby = true;          if ((dist_vec_squared(getPositionGlobal(), gAgent.getPositionGlobal()) > radius) && @@ -11039,8 +11038,7 @@ void LLVOAvatar::updateNearbyAvatarCount()      if (agent_update_timer.getElapsedTimeF32() > 1.0f)      {          S32 avs_nearby = 0; -        static LLCachedControl<F32> render_far_clip(gSavedSettings, "RenderFarClip", 64); -        F32 radius = render_far_clip * render_far_clip; +        F32 radius = sRenderDistance * sRenderDistance;          for (LLCharacter* character : LLCharacter::sInstances)          {              LLVOAvatar* avatar = (LLVOAvatar*)character; diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp index 294d36b0a9..bc326a74a8 100644 --- a/indra/newview/llvosurfacepatch.cpp +++ b/indra/newview/llvosurfacepatch.cpp @@ -245,6 +245,7 @@ bool LLVOSurfacePatch::updateLOD()  void LLVOSurfacePatch::getTerrainGeometry(LLStrider<LLVector3> &verticesp,                                                LLStrider<LLVector3> &normalsp, +                                              LLStrider<LLVector2> &texCoords0p,                                                LLStrider<LLVector2> &texCoords1p,                                                LLStrider<U16> &indicesp)  { @@ -259,18 +260,21 @@ void LLVOSurfacePatch::getTerrainGeometry(LLStrider<LLVector3> &verticesp,      updateMainGeometry(facep,                      verticesp,                      normalsp, +                    texCoords0p,                      texCoords1p,                      indicesp,                      index_offset);      updateNorthGeometry(facep,                          verticesp,                          normalsp, +                        texCoords0p,                          texCoords1p,                          indicesp,                          index_offset);      updateEastGeometry(facep,                          verticesp,                          normalsp, +                        texCoords0p,                          texCoords1p,                          indicesp,                          index_offset); @@ -279,6 +283,7 @@ void LLVOSurfacePatch::getTerrainGeometry(LLStrider<LLVector3> &verticesp,  void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,                                          LLStrider<LLVector3> &verticesp,                                          LLStrider<LLVector3> &normalsp, +                                        LLStrider<LLVector2> &texCoords0p,                                          LLStrider<LLVector2> &texCoords1p,                                          LLStrider<U16> &indicesp,                                          U32 &index_offset) @@ -317,9 +322,10 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,              {                  x = i * render_stride;                  y = j * render_stride; -                mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); +                mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());                  verticesp++;                  normalsp++; +                texCoords0p++;                  texCoords1p++;              }          } @@ -381,6 +387,7 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,  void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,                                          LLStrider<LLVector3> &verticesp,                                          LLStrider<LLVector3> &normalsp, +                                        LLStrider<LLVector2> &texCoords0p,                                          LLStrider<LLVector2> &texCoords1p,                                          LLStrider<U16> &indicesp,                                          U32 &index_offset) @@ -414,9 +421,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,              x = i * render_stride;              y = 16 - render_stride; -            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); +            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());              verticesp++;              normalsp++; +            texCoords0p++;              texCoords1p++;          } @@ -425,9 +433,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,          {              x = i * render_stride;              y = 16; -            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); +            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());              verticesp++;              normalsp++; +            texCoords0p++;              texCoords1p++;          } @@ -460,9 +469,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,              x = i * render_stride;              y = 16 - render_stride; -            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); +            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());              verticesp++;              normalsp++; +            texCoords0p++;              texCoords1p++;          } @@ -472,9 +482,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,              x = i * render_stride;              y = 16; -            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); +            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());              verticesp++;              normalsp++; +            texCoords0p++;              texCoords1p++;          } @@ -514,9 +525,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,              x = i * north_stride;              y = 16 - render_stride; -            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); +            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());              verticesp++;              normalsp++; +            texCoords0p++;              texCoords1p++;          } @@ -526,9 +538,10 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,              x = i * north_stride;              y = 16; -            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); +            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());              verticesp++;              normalsp++; +            texCoords0p++;              texCoords1p++;          } @@ -564,6 +577,7 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,  void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,                                            LLStrider<LLVector3> &verticesp,                                            LLStrider<LLVector3> &normalsp, +                                          LLStrider<LLVector2> &texCoords0p,                                            LLStrider<LLVector2> &texCoords1p,                                            LLStrider<U16> &indicesp,                                            U32 &index_offset) @@ -592,9 +606,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,              x = 16 - render_stride;              y = i * render_stride; -            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); +            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());              verticesp++;              normalsp++; +            texCoords0p++;              texCoords1p++;          } @@ -603,9 +618,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,          {              x = 16;              y = i * render_stride; -            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); +            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());              verticesp++;              normalsp++; +            texCoords0p++;              texCoords1p++;          } @@ -638,9 +654,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,              x = 16 - render_stride;              y = i * render_stride; -            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); +            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());              verticesp++;              normalsp++; +            texCoords0p++;              texCoords1p++;          }          // Iterate through the east patch's points @@ -649,9 +666,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,              x = 16;              y = i * render_stride; -            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); +            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());              verticesp++;              normalsp++; +            texCoords0p++;              texCoords1p++;          } @@ -690,9 +708,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,              x = 16 - render_stride;              y = i * east_stride; -            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); +            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());              verticesp++;              normalsp++; +            texCoords0p++;              texCoords1p++;          }          // Iterate through the east patch's points @@ -701,9 +720,10 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,              x = 16;              y = i * east_stride; -            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords1p.get()); +            mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());              verticesp++;              normalsp++; +            texCoords0p++;              texCoords1p++;          } @@ -1022,12 +1042,14 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group)      LLStrider<LLVector3> vertices_start;      LLStrider<LLVector3> normals_start;      LLStrider<LLVector4a> tangents_start; +    LLStrider<LLVector2> texcoords0_start; // ownership overlay      LLStrider<LLVector2> texcoords2_start;      LLStrider<U16> indices_start;      llassert_always(buffer->getVertexStrider(vertices_start));      llassert_always(buffer->getNormalStrider(normals_start));      llassert_always(buffer->getTangentStrider(tangents_start)); +    llassert_always(buffer->getTexCoord0Strider(texcoords0_start));      llassert_always(buffer->getTexCoord1Strider(texcoords2_start));      llassert_always(buffer->getIndexStrider(indices_start)); @@ -1037,6 +1059,7 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group)      {          LLStrider<LLVector3> vertices = vertices_start;          LLStrider<LLVector3> normals = normals_start; +        LLStrider<LLVector2> texcoords0 = texcoords0_start;          LLStrider<LLVector2> texcoords2 = texcoords2_start;          LLStrider<U16> indices = indices_start; @@ -1049,7 +1072,7 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group)              facep->setVertexBuffer(buffer);              LLVOSurfacePatch* patchp = (LLVOSurfacePatch*) facep->getViewerObject(); -            patchp->getTerrainGeometry(vertices, normals, texcoords2, indices); +            patchp->getTerrainGeometry(vertices, normals, texcoords0, texcoords2, indices);              indices_index += facep->getIndicesCount();              index_offset += facep->getGeomCount(); diff --git a/indra/newview/llvosurfacepatch.h b/indra/newview/llvosurfacepatch.h index af5f05774b..c93a58d2d9 100644 --- a/indra/newview/llvosurfacepatch.h +++ b/indra/newview/llvosurfacepatch.h @@ -57,6 +57,7 @@ public:      /*virtual*/ void        updateFaceSize(S32 idx);      void getTerrainGeometry(LLStrider<LLVector3> &verticesp,                                  LLStrider<LLVector3> &normalsp, +                                LLStrider<LLVector2> &texCoords0p,                                  LLStrider<LLVector2> &texCoords1p,                                  LLStrider<U16> &indicesp); @@ -109,18 +110,21 @@ protected:      void updateMainGeometry(LLFace *facep,                         LLStrider<LLVector3> &verticesp,                         LLStrider<LLVector3> &normalsp, +                       LLStrider<LLVector2> &texCoords0p,                         LLStrider<LLVector2> &texCoords1p,                         LLStrider<U16> &indicesp,                         U32 &index_offset);      void updateNorthGeometry(LLFace *facep,                         LLStrider<LLVector3> &verticesp,                         LLStrider<LLVector3> &normalsp, +                       LLStrider<LLVector2> &texCoords0p,                         LLStrider<LLVector2> &texCoords1p,                         LLStrider<U16> &indicesp,                         U32 &index_offset);      void updateEastGeometry(LLFace *facep,                         LLStrider<LLVector3> &verticesp,                         LLStrider<LLVector3> &normalsp, +                       LLStrider<LLVector2> &texCoords0p,                         LLStrider<LLVector2> &texCoords1p,                         LLStrider<U16> &indicesp,                         U32 &index_offset); diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index 8ce1a745c3..c708e804b2 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -33,7 +33,6 @@  #include "llagentwearables.h"  #include "llappearancemgr.h" -#include "llinventoryfunctions.h"  #include "llinventoryicon.h"  #include "llgesturemgr.h"  #include "lltransutil.h" @@ -41,15 +40,6 @@  #include "llviewermenu.h"  #include "llvoavatarself.h" -class LLFindOutfitItems : public LLInventoryCollectFunctor -{ -public: -    LLFindOutfitItems() {} -    virtual ~LLFindOutfitItems() {} -    virtual bool operator()(LLInventoryCategory* cat, -                            LLInventoryItem* item); -}; -  bool LLFindOutfitItems::operator()(LLInventoryCategory* cat,                                     LLInventoryItem* item)  { diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index 3fe1059176..7a5f29020e 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -32,6 +32,7 @@  #include "llsingleton.h"  // newview +#include "llinventoryfunctions.h"  #include "llinventoryitemslist.h"  #include "llinventorylistitem.h"  #include "lllistcontextmenu.h" @@ -507,4 +508,12 @@ protected:      LLWearableType::EType mMenuWearableType;  }; +class LLFindOutfitItems : public LLInventoryCollectFunctor +{ +public: +    LLFindOutfitItems() {} +    virtual ~LLFindOutfitItems() {} +    virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item); +}; +  #endif //LL_LLWEARABLEITEMSLIST_H diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 899733ccc3..47e1815bc2 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -1372,10 +1372,8 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi  F32 LLWorld::getNearbyAvatarsAndMaxGPUTime(std::vector<LLVOAvatar*> &valid_nearby_avs)  { -    static LLCachedControl<F32> render_far_clip(gSavedSettings, "RenderFarClip", 64); -      F32 nearby_max_complexity = 0; -    F32 radius = render_far_clip * render_far_clip; +    F32 radius = LLVOAvatar::sRenderDistance * LLVOAvatar::sRenderDistance;      for (LLCharacter* character : LLCharacter::sInstances)      { diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 076459a7b2..6b3a5b1892 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -121,7 +121,7 @@  #include "SMAAAreaTex.h"  #include "SMAASearchTex.h" - +#include "llerror.h"  #ifndef LL_WINDOWS  #define A_GCC 1  #pragma GCC diagnostic ignored "-Wunused-function" @@ -601,7 +601,6 @@ void LLPipeline::init()      connectRefreshCachedSettingsSafe("RenderMirrors");      connectRefreshCachedSettingsSafe("RenderHeroProbeUpdateRate");      connectRefreshCachedSettingsSafe("RenderHeroProbeConservativeUpdateMultiplier"); -    connectRefreshCachedSettingsSafe("RenderAutoHideSurfaceAreaLimit");      LLPointer<LLControlVariable> cntrl_ptr = gSavedSettings.getControl("CollectFontVertexBuffers");      if (cntrl_ptr.notNull()) @@ -1291,8 +1290,11 @@ void LLPipeline::createGLBuffers()      }      allocateScreenBuffer(resX, resY); -    mRT->width = 0; -    mRT->height = 0; +    // Do not zero out mRT dimensions here. allocateScreenBuffer() above +    // already sets the correct dimensions. Zeroing them caused resizeShadowTexture() +    // to fail if called immediately after createGLBuffers (e.g., post graphics change). +    // mRT->width = 0; +    // mRT->height = 0;      if (!mNoiseMap) diff --git a/indra/newview/skins/default/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml index 604eb7c58f..4ea34975e1 100644 --- a/indra/newview/skins/default/xui/da/floater_about.xml +++ b/indra/newview/skins/default/xui/da/floater_about.xml @@ -5,7 +5,7 @@  [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]  	</floater.string>  	<floater.string name="AboutPosition"> -		Du er ved [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] i regionen [REGION] lokaliseret ved <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +		Du er ved [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] i regionen [REGION] lokaliseret ved <nolink>[HOSTNAME]</nolink>  [SERVER_VERSION]  [SERVER_RELEASE_NOTES_URL]  	</floater.string> diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml index a7dff91311..038a2e0fcd 100644 --- a/indra/newview/skins/default/xui/da/strings.xml +++ b/indra/newview/skins/default/xui/da/strings.xml @@ -3723,6 +3723,10 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].  	<string name="conference-title-incoming">  		Konference med [AGENT_NAME]  	</string> +	<string name="bot_warning"> +Du chatter med en bot, [NAME]. Del ikke personlige oplysninger. +Læs mere på https://second.life/scripted-agents. +	</string>  	<string name="no_session_message">  		(IM session eksisterer ikke)  	</string> diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml index 602424821f..09447cbbaf 100644 --- a/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@  		<combo_box.item label="Klein (128x128)" name="Small(128x128)"/>  		<combo_box.item label="Mittel (256x256)" name="Medium(256x256)"/>  		<combo_box.item label="Groß (512x512)" name="Large(512x512)"/> -		<combo_box.item label="Aktuelles Fenster (512x512)" name="CurrentWindow"/> +		<combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>  		<combo_box.item label="Benutzerdefiniert" name="Custom"/>  	</combo_box>  	<spinner label="Breite x Höhe" name="inventory_snapshot_width"/> diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_options.xml b/indra/newview/skins/default/xui/de/panel_snapshot_options.xml index dab20d63eb..2a51f10894 100644 --- a/indra/newview/skins/default/xui/de/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/de/panel_snapshot_options.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="panel_snapshot_options">  	<button label="Auf Datenträger speichern" name="save_to_computer_btn"/> -	<button label="In Inventar speichern ([AMOUNT] L$)" name="save_to_inventory_btn"/> +	<button label="In Inventar speichern" name="save_to_inventory_btn"/>  	<button label="Im Profil-Feed teilen" name="save_to_profile_btn"/>  	<button label="Auf Facebook teilen" name="send_to_facebook_btn"/>  	<button label="Auf Twitter teilen" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index 4bed43dd1d..9057821414 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -12,7 +12,7 @@  	<string name="StartupRequireDriverUpdate">Grafikinitialisierung fehlgeschlagen. Bitte aktualisieren Sie Ihren Grafiktreiber.</string>  	<string name="AboutHeader">[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]Bit) [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]</string>  	<string name="BuildConfig">Build-Konfiguration [BUILD_CONFIG]</string> -	<string name="AboutPosition">Sie befinden sich an [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] auf <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +	<string name="AboutPosition">Sie befinden sich an [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] auf <nolink>[HOSTNAME]</nolink>  SLURL: <nolink>[SLURL]</nolink>  (globale Koordinaten [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])  [SERVER_VERSION] @@ -1613,6 +1613,10 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_  	<string name="conference-title-incoming">Konferenz mit [AGENT_NAME]</string>  	<string name="inventory_item_offered-im">Inventarobjekt „[ITEM_NAME]“ angeboten</string>  	<string name="inventory_folder_offered-im">Inventarordner „[ITEM_NAME]“ angeboten</string> +	<string name="bot_warning"> +	Sie chatten mit einem Bot, [NAME]. Geben Sie keine persönlichen Informationen weiter. +Erfahren Sie mehr unter https://second.life/scripted-agents. +	</string>  	<string name="share_alert">Objekte aus dem Inventar hier her ziehen</string>  	<string name="facebook_post_success">Sie haben auf Facebook gepostet.</string>  	<string name="flickr_post_success">Sie haben auf Flickr gepostet.</string> diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index e6b780728c..acdccdc03a 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -167,8 +167,19 @@           left="30"  		 height="16"           top_pad="8" -         width="180" +         width="80" +         control_name="RenderUIInSnapshot"           name="ui_check" /> +       <check_box +         label="L$ Balance" +         layout="topleft" +         left_pad="16" +         height="16" +         top_delta="0" +         width="80" +         control_name="RenderBalanceInSnapshot" +         enabled_control="RenderUIInSnapshot" +         name="balance_check" />          <check_box           label="HUDs"           layout="topleft" @@ -176,6 +187,7 @@           left="30"           top_pad="1"           width="180" +         control_name="RenderHUDInSnapshot"           name="hud_check" />          <check_box           label="Freeze frame (fullscreen)" diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index e0f380e074..d672ffbc94 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -152,6 +152,14 @@           parameter="category" />      </menu_item_call>      <menu_item_call +     label="New Folder" +     layout="topleft" +     name="New Outfit Folder"> +        <menu_item_call.on_click +         function="Inventory.DoCreate" +         parameter="category" /> +    </menu_item_call> +    <menu_item_call       label="New Outfit"       layout="topleft"       name="New Outfit"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 4245b22e88..bcca3ce495 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -10336,6 +10336,14 @@ You are now the owner of object [OBJECT_NAME]    <notification     icon="alertmodal.tga" +   name="NowOwnObjectInv" +   type="notify"> +   <tag>fail</tag> +You are now the owner of object [OBJECT_NAME] and it has been placed in your inventory. +  </notification> + +    <notification +   icon="alertmodal.tga"     name="CantRezOnLand"     type="notify">     <tag>fail</tag> diff --git a/indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml b/indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml index 7687f7cd96..23bbf45e88 100644 --- a/indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml +++ b/indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml @@ -139,7 +139,7 @@                      max_val_x="30"                      min_val_y="-30"                      max_val_y="30"  -                    logarithmic="1"/> +                    logarithmic="true"/>              <text                      name="cloud_image_label" diff --git a/indra/newview/skins/default/xui/en/panel_settings_water.xml b/indra/newview/skins/default/xui/en/panel_settings_water.xml index 5e65b0e8a2..e062f1710b 100644 --- a/indra/newview/skins/default/xui/en/panel_settings_water.xml +++ b/indra/newview/skins/default/xui/en/panel_settings_water.xml @@ -378,7 +378,7 @@                              initial_value="0"                              layout="topleft"                              left_delta="5" -                            min_val="-0.5" +                            min_val="0"                              max_val="0.5"                              name="water_blur_multip"                              top_pad="5" diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml index f8040b9a65..0cac1b410f 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml @@ -60,7 +60,7 @@           name="Large(512x512)"           value="[i512,i512]" />          <combo_box.item -         label="Current Window(512x512)" +         label="Current Window"           name="CurrentWindow"           value="[i0,i0]" />          <combo_box.item @@ -119,6 +119,8 @@       type="string"       word_wrap="true">          To save your image as a texture select one of the square formats. + +Upload cost: L$[UPLOAD_COST]      </text>      <button       follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml index 3a7731d235..2fb02af61c 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml @@ -31,7 +31,7 @@     image_overlay_alignment="left"     image_top_pad="-1"     imgoverlay_label_space="10" -   label="Save to Inventory (L$[AMOUNT])" +   label="Save to Inventory"     layout="topleft"     left_delta="0"     name="save_to_inventory_btn" diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml index 9a19d06432..af6a9b94d9 100644 --- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml @@ -729,8 +729,8 @@               label_width="205"               layout="topleft"               left="10" -             min_val="-100" -             max_val="100" +             min_val="-10000" +             max_val="10000"               name="TexScaleU"               top_pad="5"               width="265" /> @@ -742,8 +742,8 @@               label_width="205"               layout="topleft"               left="10" -             min_val="-100" -             max_val="100" +             min_val="-10000" +             max_val="10000"               name="TexScaleV"               width="265" />              <spinner @@ -805,8 +805,8 @@               label_width="205"               layout="topleft"               left="10" -             min_val="-100" -             max_val="100" +             min_val="-10000" +             max_val="10000"               name="bumpyScaleU"               top_delta="-115"               width="265" /> @@ -818,8 +818,8 @@               label_width="205"               layout="topleft"               left="10" -             min_val="-100" -             max_val="100" +             min_val="-10000" +             max_val="10000"               name="bumpyScaleV"               width="265" />             <spinner @@ -869,8 +869,8 @@               label_width="205"               layout="topleft"               left="10" -             min_val="-100" -             max_val="100" +             min_val="-10000" +             max_val="10000"               name="shinyScaleU"               top_delta="-115"               width="265" /> @@ -882,8 +882,8 @@               label_width="205"               layout="topleft"               left="10" -             min_val="-100" -             max_val="100" +             min_val="-10000" +             max_val="10000"               name="shinyScaleV"               width="265" />             <spinner diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 44da9a8dac..14123de82c 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -13,7 +13,6 @@  	<string name="SUPPORT_SITE">Second Life Support Portal</string>  	<!-- starting up --> -	<string name="StartupDetectingHardware">Detecting hardware...</string>  	<string name="StartupLoading">Loading [APP_NAME]...</string>  	<string name="StartupClearingCache">Clearing cache...</string>  	<string name="StartupInitializingTextureCache">Initializing texture cache...</string> @@ -71,7 +70,7 @@ Voice Server Version: [VOICE_VERSION]    <string name="LocalTime">[month, datetime, local] [day, datetime, local] [year, datetime, local] [hour, datetime, local]:[min, datetime, local]:[second,datetime, local]</string>  	<string name="ErrorFetchingServerReleaseNotesURL">Error fetching server release notes URL.</string>  	<string name="BuildConfiguration">Build Configuration</string> - +	  	<!--  progress -->  	<string name="ProgressRestoring">Restoring...</string>  	<string name="ProgressChangingResolution">Changing resolution...</string> @@ -114,10 +113,10 @@ Voice Server Version: [VOICE_VERSION]  	<string name="LoginFailedHeader">Login failed.</string>  	<string name="Quit">Quit</string>  	<string name="create_account_url">http://join.secondlife.com/?sourceid=[sourceid]</string> - +	  	<string name="AgniGridLabel">Second Life Main Grid (Agni)</string>  	<string name="AditiGridLabel">Second Life Beta Test Grid (Aditi)</string> - +	  	<string name="ViewerDownloadURL">http://secondlife.com/download</string>  	<string name="LoginFailedViewerNotPermitted">  The viewer you are using can no longer access Second Life. Please visit the following page to download a new viewer: @@ -209,7 +208,7 @@ If you feel this is an error, please contact support@secondlife.com</string>  	<string name="YouHaveBeenDisconnected">You have been disconnected from the region you were in.</string>  	<string name="SentToInvalidRegion">You were sent to an invalid region.</string>  	<string name="TestingDisconnect">Testing viewer disconnect</string> - +    	<!-- SLShare: User Friendly Filter Names Translation -->      <string name="BlackAndWhite">Black & White</string>      <string name="Colors1970">1970's Colors</string> @@ -222,7 +221,7 @@ If you feel this is an error, please contact support@secondlife.com</string>      <string name="LensFlare">Lens Flare</string>      <string name="Miniature">Miniature</string>      <string name="Toycamera">Toy Camera</string> - +	      <!-- Tooltip -->  	<string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar -->  	<string name="TooltipNoName">(no name)</string> <!-- No name on an object --> @@ -259,10 +258,11 @@ If you feel this is an error, please contact support@secondlife.com</string>  	<string name="TooltipOutboxMixedStock">All items in a stock folder must have the same type and permission</string>  	<string name="TooltipOutfitNotInInventory">You can only put items or outfits from your personal inventory into "My outfits"</string>  	<string name="TooltipCantCreateOutfit">One or more items can't be used inside "My outfits"</string> - +    <string name="TooltipCantMoveOutfitIntoOutfit">Can not move an outfit into another outfit</string> +	  	<string name="TooltipDragOntoOwnChild">You can't move a folder into its child</string>  	<string name="TooltipDragOntoSelf">You can't move a folder into itself</string> - +	  	<!-- tooltips for Urls -->  	<string name="TooltipHttpUrl">Click to view this web page</string>  	<string name="TooltipSLURL">Click to view this location's information</string> @@ -370,7 +370,7 @@ are allowed.  	<string name="AssetUploadServerDifficulties">The server is experiencing unexpected difficulties.</string>  	<string name="AssetUploadServerUnavaliable">Service not available or upload timeout was reached.</string>  	<string name="AssetUploadRequestInvalid"> -Error in upload request.  Please visit +Error in upload request.  Please visit   http://secondlife.com/support for help fixing this problem.  </string> @@ -534,7 +534,7 @@ http://secondlife.com/support for help fixing this problem.  	<string name="ChangeYourDefaultAnimations">Change your default animations</string>  	<string name="ForceSitAvatar">Force your avatar to sit</string>  	<string name="ChangeEnvSettings">Change your environment settings</string> - +	  	<string name="NotConnected">Not Connected</string>  	<string name="AgentNameSubst">(You)</string> <!-- Substitution for agent name -->  	<string name="JoinAnExperience"/><!-- intentionally blank --> @@ -2320,7 +2320,7 @@ For AI Character: Get the closest navigable point to the point provided.  	<!-- inventory -->  	<string name="InventoryNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].</string> -	<string name="InventoryNoMatchingRecentItems">Didn't find what you're looking for? Try [secondlife:///app/inventory/filters Show filters].</string> +	<string name="InventoryNoMatchingRecentItems">Didn't find what you're looking for? Try [secondlife:///app/inventory/filters Show filters].</string>	  	<string name="PlacesNoMatchingItems">To add a place to your landmarks, click the star to the right of the location name.</string>  	<string name="FavoritesNoMatchingItems">To add a place to your favorites, click the star to the right of the location name, then save the landmark to "Favorites bar".</string>  	<string name="MarketplaceNoListing">You have no listings yet.</string> @@ -2503,7 +2503,7 @@ If you continue to receive this message, please contact Second Life support for    <string name="InvFolder Materials">Materials</string>    <!-- are used for Friends and Friends/All folders in Inventory "Calling cards" folder. See EXT-694--> -	<string name="InvFolder Friends">Friends</string> +	<string name="InvFolder Friends">Friends</string>	  	<string name="InvFolder All">All</string>  	<string name="no_attachments">No attachments worn</string> @@ -2672,7 +2672,7 @@ If you continue to receive this message, please contact Second Life support for  	<string name="UploadFailed">File upload failed: </string>  	<string name="ObjectOutOfRange">Script (object out of range)</string>  	<string name="ScriptWasDeleted">Script (deleted from inventory)</string> - +	  	<!-- god tools -->  	<string name="GodToolsObjectOwnedBy">Object [OBJECT] owned by [OWNER]</string> @@ -2942,14 +2942,12 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .anim  	<string name="Linden Location">Linden Location</string>  	<string name="Adult">Adult</string>  	<string name="Arts&Culture">Arts & Culture</string> -	<string name="Arts and Culture">Arts & Culture</string>  	<string name="Business">Business</string>  	<string name="Educational">Educational</string>  	<string name="Gaming">Gaming</string>  	<string name="Hangout">Hangout</string>  	<string name="Newcomer Friendly">Newcomer Friendly</string>  	<string name="Parks&Nature">Parks & Nature</string> -	<string name="Parks and Nature">Parks & Nature</string>  	<string name="Residential">Residential</string>  	<!--<string name="Shopping">Shopping</string>	-->  	<string name="Stage">Stage</string> @@ -3719,6 +3717,10 @@ Please reinstall viewer from  https://secondlife.com/support/downloads/ and cont    <string name="inventory_folder_offered-im">      Inventory folder '[ITEM_NAME]' offered    </string> +  <string name="bot_warning"> +  You are chatting with a bot, [NAME]. Do not share any personal information. +Learn more at https://second.life/scripted-agents. +  </string>    <string name="share_alert">      Drag items from inventory here    </string> @@ -3851,7 +3853,7 @@ Please reinstall viewer from  https://secondlife.com/support/downloads/ and cont    <string name="uploading_costs">Uploading costs L$ [AMOUNT]</string>    <string name="this_costs">This costs L$ [AMOUNT]</string> - +      <string name="buying_selected_land">This land costs</string>    <string name="this_object_costs">This item costs</string>    <string name="giving">You want to give</string> @@ -3932,7 +3934,7 @@ Abuse Report</string>    <string name="New Daycycle">New Daycycle</string>    <string name="New Water">New Water</string>    <string name="New Sky">New Sky</string> - +      <string name="/bow">/bow</string>    <string name="/clap">/clap</string> @@ -4014,7 +4016,7 @@ Please check http://status.secondlifegrid.net to see if there is a known problem    <string name="Accounting">Accounting</string>    <string name="Notices">Notices</string>    <string name="Chat">Chat</string> - +      <!-- SL Membership -->    <string name="BaseMembership">Base</string>    <string name="PremiumMembership">Premium</string> @@ -4180,7 +4182,7 @@ Try enclosing path to the editor with double quotes.    <!-- commands --> -  <string +  <string   name="Command_360_Capture_Label">360 snapshot</string>    <string name="Command_AboutLand_Label">About land</string>    <string name="Command_Appearance_Label">Outfits</string> @@ -4213,9 +4215,9 @@ name="Command_360_Capture_Label">360 snapshot</string>    <string name="Command_View_Label">Camera controls</string>    <string name="Command_Voice_Label">Voice settings</string>    <string name="Command_FavoriteFolder_Label">Favorite folder</string> -	<string name="Command_ResyncAnimations_Label">Resync animations</string> +  <string name="Command_ResyncAnimations_Label">Resync animations</string> -  <string +  <string   name="Command_360_Capture_Tooltip">Capture a 360 equirectangular image</string>    <string name="Command_AboutLand_Tooltip">Information about the land you're visiting</string>    <string name="Command_Appearance_Tooltip">Change your avatar</string> @@ -4248,7 +4250,7 @@ name="Command_360_Capture_Tooltip">Capture a 360 equirectangular image</string>    <string name="Command_View_Tooltip">Changing camera angle</string>    <string name="Command_Voice_Tooltip">Volume controls for calls and people near you in world</string>    <string name="Command_FavoriteFolder_Tooltip">Open your favorite inventory folder</string> -	<string name="Command_ResyncAnimations_Tooltip">Synchronizes avatar animations</string> +  <string name="Command_ResyncAnimations_Tooltip">Synchronizes avatar animations</string>    <string name="Toolbar_Bottom_Tooltip">currently in your bottom toolbar</string>    <string name="Toolbar_Left_Tooltip"  >currently in your left toolbar</string> @@ -4282,7 +4284,7 @@ name="Command_360_Capture_Tooltip">Capture a 360 equirectangular image</string>    <!-- Spell check settings floater -->    <string name="UserDictionary">[User]</string> - +      <!-- Experience Tools strings -->    <string name="experience_tools_experience">Experience</string>    <string name="ExperienceNameNull">(no experience)</string> @@ -4344,7 +4346,7 @@ name="Command_360_Capture_Tooltip">Capture a 360 equirectangular image</string>    <string name="Default">Default</string>    <string name="none_paren_cap">(None)</string>    <string name="no_limit">No limit</string> - +      <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">        The physics shape contains triangles which are too small. Try simplifying the physics model.    </string> diff --git a/indra/newview/skins/default/xui/en/widgets/sun_moon_trackball.xml b/indra/newview/skins/default/xui/en/widgets/sun_moon_trackball.xml index cdeff6ab05..f246ff764a 100644 --- a/indra/newview/skins/default/xui/en/widgets/sun_moon_trackball.xml +++ b/indra/newview/skins/default/xui/en/widgets/sun_moon_trackball.xml @@ -3,7 +3,6 @@      name="virtualtrackball"      width="150"      height="150" -    user_resize="false"           increment_angle_mouse="1.5f"      increment_angle_btn="1.0f"          image_sphere="VirtualTrackball_Sphere" diff --git a/indra/newview/skins/default/xui/en/widgets/xy_vector.xml b/indra/newview/skins/default/xui/en/widgets/xy_vector.xml index 23cde55f30..923895be5e 100644 --- a/indra/newview/skins/default/xui/en/widgets/xy_vector.xml +++ b/indra/newview/skins/default/xui/en/widgets/xy_vector.xml @@ -3,11 +3,9 @@      name="xyvector"      width="120"      height="140" -    decimal_digits="1"      label_width="16"      padding="4" -    edit_bar_height="18" -    user_resize="false"> +    edit_bar_height="18">      <xy_vector.border          visible="true"/> diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml index b5cf57ade7..c9eea9a58e 100644 --- a/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@  		Guardar una imagen en el inventario cuesta [UPLOAD_COST] L$. Para guardar una imagen como una textura, selecciona uno de los formatos cuadrados.  	</text>  	<combo_box label="Resolución" name="texture_size_combo"> -		<combo_box.item label="Ventana actual (512 × 512)" name="CurrentWindow"/> +		<combo_box.item label="Ventana actual" name="CurrentWindow"/>  		<combo_box.item label="Pequeña (128x128)" name="Small(128x128)"/>  		<combo_box.item label="Mediana (256x256)" name="Medium(256x256)"/>  		<combo_box.item label="Grande (512x512)" name="Large(512x512)"/> diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_options.xml b/indra/newview/skins/default/xui/es/panel_snapshot_options.xml index 4eb9ecf28f..f3119c739e 100644 --- a/indra/newview/skins/default/xui/es/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/es/panel_snapshot_options.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="panel_snapshot_options">  	<button label="Guardar en disco" name="save_to_computer_btn"/> -	<button label="Guardar en inventario (L$[AMOUNT])" name="save_to_inventory_btn"/> +	<button label="Guardar en inventario" name="save_to_inventory_btn"/>  	<button label="Compartir en los comentarios de Mi perfil" name="save_to_profile_btn"/>  	<button label="Compartir en Facebook" name="send_to_facebook_btn"/>  	<button label="Compartir en Twitter" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index cf86427477..4ec72d0409 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -10,7 +10,7 @@  	<string name="AboutHeader">[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit)   [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]</string>  	<string name="BuildConfig">Configuración de constitución [BUILD_CONFIG]</string> -	<string name="AboutPosition">Estás en la posición [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1], de [REGION], alojada en <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +	<string name="AboutPosition">Estás en la posición [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1], de [REGION], alojada en <nolink>[HOSTNAME]</nolink>  SLURL: <nolink>[SLURL]</nolink>  (coordenadas globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])  [SERVER_VERSION] @@ -1584,6 +1584,10 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].</string>  	<string name="conference-title-incoming">Conferencia con [AGENT_NAME]</string>  	<string name="inventory_item_offered-im">Ítem del inventario '[ITEM_NAME]' ofrecido</string>  	<string name="inventory_folder_offered-im">Carpeta del inventario '[ITEM_NAME]' ofrecida</string> +	<string name="bot_warning"> +Estás conversando con un bot, [NAME]. No compartas información personal. +Más información en https://second.life/scripted-agents. +	</string>  	<string name="share_alert">Arrastra los ítems desde el invenbtario hasta aquí</string>  	<string name="facebook_post_success">Has publicado en Facebook.</string>  	<string name="flickr_post_success">Has publicado en Flickr.</string> diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml index 3cf64583d2..a560ff8d5e 100644 --- a/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@  		L'enregistrement d'une image dans l'inventaire coûte [UPLOAD_COST] L$. Pour enregistrer votre image sous forme de texture, sélectionnez un format carré.  	</text>  	<combo_box label="Résolution" name="texture_size_combo"> -		<combo_box.item label="Fenêtre actuelle (512x512)" name="CurrentWindow"/> +		<combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>  		<combo_box.item label="Petite (128 x 128)" name="Small(128x128)"/>  		<combo_box.item label="Moyenne (256 x 256)" name="Medium(256x256)"/>  		<combo_box.item label="Grande (512 x 512)" name="Large(512x512)"/> diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml index bdedb9162f..52fa318f8e 100644 --- a/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="panel_snapshot_options">  	<button label="Enreg. sur le disque" name="save_to_computer_btn"/> -	<button label="Enreg. dans l'inventaire ([AMOUNT] L$)" name="save_to_inventory_btn"/> +	<button label="Enreg. dans l'inventaire" name="save_to_inventory_btn"/>  	<button label="Partager sur le flux de profil" name="save_to_profile_btn"/>  	<button label="Partager sur Facebook" name="send_to_facebook_btn"/>  	<button label="Partager sur Twitter" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 3889e26aee..5ea33591fc 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -13,7 +13,7 @@  	<string name="AboutHeader">[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit)   [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]</string>  	<string name="BuildConfig">Configuration de la construction [BUILD_CONFIG]</string> -	<string name="AboutPosition">Vous êtes à [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] dans [REGION], se trouvant à <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +	<string name="AboutPosition">Vous êtes à [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] dans [REGION], se trouvant à <nolink>[HOSTNAME]</nolink>  SLURL : <nolink>[SLURL]</nolink>  (coordonnées globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])  [SERVER_VERSION] @@ -1614,6 +1614,10 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].</string>  	<string name="conference-title-incoming">Conférence avec [AGENT_NAME]</string>  	<string name="inventory_item_offered-im">Objet de l’inventaire [ITEM_NAME] offert</string>  	<string name="inventory_folder_offered-im">Dossier de l’inventaire [ITEM_NAME] offert</string> +	<string name="bot_warning"> +Vous discutez avec un bot, [NAME]. Ne partagez pas d’informations personnelles. +En savoir plus sur https://second.life/scripted-agents. +	</string>  	<string name="share_alert">Faire glisser les objets de l'inventaire ici</string>  	<string name="facebook_post_success">Vous avez publié sur Facebook.</string>  	<string name="flickr_post_success">Vous avez publié sur Flickr.</string> diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml index 75b5d64660..21b65e8e69 100644 --- a/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@  		Salvare un'immagine nell'inventario costa L$[UPLOAD_COST]. Per salvare l'immagine come texture, selezionare uno dei formati quadrati.  	</text>  	<combo_box label="Risoluzione" name="texture_size_combo"> -		<combo_box.item label="Finestra corrente (512x512)" name="CurrentWindow"/> +		<combo_box.item label="Finestra corrente" name="CurrentWindow"/>  		<combo_box.item label="Piccola (128x128)" name="Small(128x128)"/>  		<combo_box.item label="Media (256x256)" name="Medium(256x256)"/>  		<combo_box.item label="Grande (512x512)" name="Large(512x512)"/> diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_options.xml b/indra/newview/skins/default/xui/it/panel_snapshot_options.xml index 50fb3d39fa..7fce171326 100644 --- a/indra/newview/skins/default/xui/it/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/it/panel_snapshot_options.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="panel_snapshot_options">  	<button label="Salva sul disco" name="save_to_computer_btn"/> -	<button label="Salva nell'inventario (L$[AMOUNT])" name="save_to_inventory_btn"/> +	<button label="Salva nell'inventario" name="save_to_inventory_btn"/>  	<button label="Condividi sul feed del profilo" name="save_to_profile_btn"/>  	<button label="Condividi su Facebook" name="send_to_facebook_btn"/>  	<button label="Condividi su Twitter" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 270e7ac3a1..61377a7d9d 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -12,7 +12,7 @@  	<string name="AboutHeader">[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit)   [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]</string>  	<string name="BuildConfig">Configurazione struttura [BUILD_CONFIG]</string> -	<string name="AboutPosition">Tu sei a [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] che si trova a <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +	<string name="AboutPosition">Tu sei a [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] che si trova a <nolink>[HOSTNAME]</nolink>  SLURL: <nolink>[SLURL]</nolink>  (coordinate globali [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])  [SERVER_VERSION] @@ -1586,6 +1586,10 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].</string>  	<string name="conference-title-incoming">Chiamata in conferenza con [AGENT_NAME]</string>  	<string name="inventory_item_offered-im">Offerto oggetto di inventario "[ITEM_NAME]"</string>  	<string name="inventory_folder_offered-im">Offerta cartella di inventario "[ITEM_NAME]"</string> +	<string name="bot_warning"> +Stai parlando con un bot, [NAME]. Non condividere informazioni personali. +Scopri di più su https://second.life/scripted-agents. +	</string>  	<string name="facebook_post_success">Hai pubblicato su Facebook.</string>  	<string name="flickr_post_success">Hai pubblicato su Flickr.</string>  	<string name="twitter_post_success">Hai pubblicato su Twitter.</string> diff --git a/indra/newview/skins/default/xui/ja/panel_settings_water.xml b/indra/newview/skins/default/xui/ja/panel_settings_water.xml index ead1ca9b2f..2510523897 100644 --- a/indra/newview/skins/default/xui/ja/panel_settings_water.xml +++ b/indra/newview/skins/default/xui/ja/panel_settings_water.xml @@ -63,7 +63,7 @@  					<text follows="left|top|right" font="SansSerif" height="16" layout="topleft" left_delta="-5" top_pad="5" width="215">  						ブラー乗数  					</text> -					<slider control_name="water_blur_multip" follows="left|top" height="16" increment="0.001" initial_value="0" layout="topleft" left_delta="5" min_val="-0.5" max_val="0.5" name="water_blur_multip" top_pad="5" width="200" can_edit_text="true"/> +					<slider control_name="water_blur_multip" follows="left|top" height="16" increment="0.001" initial_value="0" layout="topleft" left_delta="5" min_val="0" max_val="0.5" name="water_blur_multip" top_pad="5" width="200" can_edit_text="true"/>  				</layout_panel>  			</layout_stack>  		</layout_panel> diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml index c55c11e928..04ecba4264 100644 --- a/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml @@ -6,7 +6,7 @@  	</text>  	<view_border name="hr"/>  	<combo_box label="解像度" name="texture_size_combo"> -		<combo_box.item label="現在のウィンドウ (512✕512)" name="CurrentWindow"/> +		<combo_box.item label="現在のウィンドウ" name="CurrentWindow"/>  		<combo_box.item label="小(128✕128)" name="Small(128x128)"/>  		<combo_box.item label="中(256✕256)" name="Medium(256x256)"/>  		<combo_box.item label="大(512✕512)" name="Large(512x512)"/> @@ -16,7 +16,7 @@  	<spinner label="" name="inventory_snapshot_height"/>  	<check_box label="縦横比の固定" name="inventory_keep_aspect_check"/>  	<text name="hint_lbl"> -		画像をテクスチャとして保存する場合は、いずれかの正方形を選択してください。 +		画像をインベントリに保存するには L$[UPLOAD_COST] の費用がかかります。画像をテクスチャとして保存するには平方形式の 1 つを選択してください。  	</text>  	<button label="キャンセル" name="cancel_btn"/>  	<button label="保存" name="save_btn"/> diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml index 7a1aa280ec..a979e31c9a 100644 --- a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="panel_snapshot_options">  	<button label="ディスクに保存" name="save_to_computer_btn"/> -	<button label="インベントリに保存(L$ [AMOUNT])" name="save_to_inventory_btn"/> +	<button label="インベントリに保存" name="save_to_inventory_btn"/>  	<button label="プロフィールフィードで共有する" name="save_to_profile_btn"/>  	<button label="メールで送信" name="save_to_email_btn"/>  	<text name="fee_hint_lbl"> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index 106bf91d0c..4f7e34774f 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -39,7 +39,7 @@  	</string>  	<string name="AboutPosition">  		あなたは、現在[REGION]の[POSITION_LOCAL_0,number,1],[POSITION_LOCAL_1,number,1],[POSITION_LOCAL_2,number,1]にいます。 -位置は、<nolink>[HOSTNAME]</nolink>です。([HOSTIP]) +位置は、<nolink>[HOSTNAME]</nolink>です。  SLURL:<nolink>[SLURL]</nolink>  (グローバル座標は、[POSITION_0,number,1],[POSITION_1,number,1],[POSITION_2,number,1]です。)  [SERVER_VERSION] @@ -6149,6 +6149,10 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ  	<string name="inventory_folder_offered-im">  		フォルダ「[ITEM_NAME]」がインベントリに送られてきました。  	</string> +	<string name="bot_warning"> +[NAME]とチャットしています。個人情報を共有しないでください。 +詳細は https://second.life/scripted-agents をご覧ください。 +	</string>  	<string name="share_alert">  		インベントリからここにアイテムをドラッグします。  	</string> diff --git a/indra/newview/skins/default/xui/pl/panel_snapshot_options.xml b/indra/newview/skins/default/xui/pl/panel_snapshot_options.xml index 016b9ca197..04c01940e1 100644 --- a/indra/newview/skins/default/xui/pl/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/pl/panel_snapshot_options.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel name="panel_snapshot_options">  	<button label="Zapisz na dysku twardym" name="save_to_computer_btn" /> -	<button label="Zapisz do Szafy ([AMOUNT]L$)" name="save_to_inventory_btn" /> +	<button label="Zapisz do Szafy" name="save_to_inventory_btn" />  	<button label="Wyślij na mój Kanał" name="save_to_profile_btn" />  	<button label="Załaduj na Facebook" name="send_to_facebook_btn" />  	<button label="Załaduj na Twitter" name="send_to_twitter_btn" /> diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index 8032443020..65b487e1b3 100644 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -4412,6 +4412,10 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].  	<string name="inventory_folder_offered-im">  		Zaoferowano folder: '[ITEM_NAME]'  	</string> +	<string name="bot_warning"> +Rozmawiasz z botem [NAME]. Nie udostępniaj żadnych danych osobowych. +Dowiedz się więcej na https://second.life/scripted-agents. +	</string>  	<string name="share_alert">  		Przeciągaj tutaj rzeczy z Szafy  	</string> diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml index f3357026d5..28a5142baa 100644 --- a/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@  		Salvar uma imagem em seu inventário custa L$[UPLOAD_COST]. Para salvar sua imagem como uma textura, selecione um dos formatos quadrados.  	</text>  	<combo_box label="Resolução" name="texture_size_combo"> -		<combo_box.item label="Janela ativa (512x512)" name="CurrentWindow"/> +		<combo_box.item label="Janela ativa" name="CurrentWindow"/>  		<combo_box.item label="Pequeno (128x128)" name="Small(128x128)"/>  		<combo_box.item label="Médio (256x256)" name="Medium(256x256)"/>  		<combo_box.item label="Grande (512x512)" name="Large(512x512)"/> diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml index 067e5dbd76..f71bc7cd12 100644 --- a/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="panel_snapshot_options">  	<button label="Salvar no disco" name="save_to_computer_btn"/> -	<button label="Salvar em inventário (L$[AMOUNT])" name="save_to_inventory_btn"/> +	<button label="Salvar em inventário" name="save_to_inventory_btn"/>  	<button label="Compartilhar no feed do perfil" name="save_to_profile_btn"/>  	<button label="Compartilhar no Facebook" name="send_to_facebook_btn"/>  	<button label="Compartilhar no Twitter" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 3e33744b85..3798431d90 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -10,7 +10,7 @@  	<string name="AboutHeader">[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit)   [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]</string>  	<string name="BuildConfig">Configuração do corpo [BUILD_CONFIG]</string> -	<string name="AboutPosition">Você está em [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] em [REGION] localizado em <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +	<string name="AboutPosition">Você está em [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] em [REGION] localizado em <nolink>[HOSTNAME]</nolink>  SLURL: <nolink>[SLURL]</nolink>  (coordenadas globais [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])  [SERVER_VERSION] @@ -1549,6 +1549,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].</string>  	<string name="conference-title-incoming">Conversa com [AGENT_NAME]</string>  	<string name="inventory_item_offered-im">Item do inventário '[ITEM_NAME]' oferecido</string>  	<string name="inventory_folder_offered-im">Pasta do inventário '[ITEM_NAME]' oferecida</string> +	<string name="bot_warning"> +Você está conversando com um bot, [NAME]. Não compartilhe informações pessoais. +Saiba mais em https://second.life/scripted-agents. +	</string>  	<string name="facebook_post_success">Você publicou no Facebook.</string>  	<string name="flickr_post_success">Você publicou no Flickr.</string>  	<string name="twitter_post_success">Você publicou no Twitter.</string> diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml index f07e12e0ed..adc612dfd8 100644 --- a/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@  		Сохранение изображения в инвентаре стоит L$[UPLOAD_COST]. Чтобы сохранить его как текстуру, выберите один из квадратных форматов.  	</text>  	<combo_box label="Размер" name="texture_size_combo"> -		<combo_box.item label="Текущее окно (512x512)" name="CurrentWindow"/> +		<combo_box.item label="Текущее окно" name="CurrentWindow"/>  		<combo_box.item label="Маленький (128x128)" name="Small(128x128)"/>  		<combo_box.item label="Средний (256x256)" name="Medium(256x256)"/>  		<combo_box.item label="Большой (512x512)" name="Large(512x512)"/> diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml index 7ba03ee0c9..f7fda0b1dc 100644 --- a/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="panel_snapshot_options">  	<button label="Сохранить на диске" name="save_to_computer_btn"/> -	<button label="Сохранить в инвентаре (L$[AMOUNT])" name="save_to_inventory_btn"/> +	<button label="Сохранить в инвентаре" name="save_to_inventory_btn"/>  	<button label="Поделиться в профиле" name="save_to_profile_btn"/>  	<button label="Поделиться в Facebook" name="send_to_facebook_btn"/>  	<button label="Поделиться в Twitter" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index 10b0d3578f..0e6ddb0e34 100644 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -42,7 +42,7 @@  		Конфигурация построения [BUILD_CONFIG]  	</string>  	<string name="AboutPosition"> -		Вы в точке [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] в регионе «[REGION]», расположенном на <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +		Вы в точке [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] в регионе «[REGION]», расположенном на <nolink>[HOSTNAME]</nolink>  SLURL: <nolink>[SLURL]</nolink>  (глобальные координаты [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])  [SERVER_VERSION] @@ -4576,6 +4576,10 @@ support@secondlife.com.  	<string name="inventory_folder_offered-im">  		Предложена папка инвентаря «[ITEM_NAME]»  	</string> +	<string name="bot_warning"> +Вы общаетесь с ботом [NAME]. Не передавайте личные данные. +Подробнее на https://second.life/scripted-agents. +	</string>  	<string name="share_alert">  		Перетаскивайте вещи из инвентаря сюда  	</string> diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml index be5940c4b9..160cba8700 100644 --- a/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@  		Bir görüntüyü envanterinize kaydetmenin maliyeti L$[UPLOAD_COST] olur. Görüntünüzü bir doku olarak kaydetmek için kare formatlardan birini seçin.  	</text>  	<combo_box label="Çözünürlük" name="texture_size_combo"> -		<combo_box.item label="Mevcut Pencere(512x512)" name="CurrentWindow"/> +		<combo_box.item label="Mevcut Pencere" name="CurrentWindow"/>  		<combo_box.item label="Küçük (128x128)" name="Small(128x128)"/>  		<combo_box.item label="Orta (256x256)" name="Medium(256x256)"/>  		<combo_box.item label="Büyük (512x512)" name="Large(512x512)"/> diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml index 1b48bbeec2..a028710b98 100644 --- a/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="panel_snapshot_options">  	<button label="Diske Kaydet" name="save_to_computer_btn"/> -	<button label="Envantere Kaydet (L$[AMOUNT])" name="save_to_inventory_btn"/> +	<button label="Envantere Kaydet" name="save_to_inventory_btn"/>  	<button label="Profil Akışında Paylaş" name="save_to_profile_btn"/>  	<button label="Facebook'ta Paylaş" name="send_to_facebook_btn"/>  	<button label="Twitter'da Paylaş" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index d992788e13..32cf1e14ff 100644 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -42,7 +42,7 @@  		Yapı Konfigürasyonu [BUILD_CONFIG]  	</string>  	<string name="AboutPosition"> -		<nolink>[HOSTNAME]</nolink> ([HOSTIP]) üzerinde bulunan [REGION] içerisinde [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] konumundasınız +		<nolink>[HOSTNAME]</nolink> üzerinde bulunan [REGION] içerisinde [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] konumundasınız  SLURL: <nolink>[SLURL]</nolink>  (küresel koordinatlar [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])  [SERVER_VERSION] @@ -4579,6 +4579,10 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.  	<string name="inventory_folder_offered-im">  		"[ITEM_NAME]" envanter klasörü sunuldu  	</string> +	<string name="bot_warning"> +Bir bot ile sohbet ediyorsunuz, [NAME]. Kişisel bilgilerinizi paylaşmayın. +Daha fazla bilgi için: https://second.life/scripted-agents. +	</string>  	<string name="share_alert">  		Envanterinizden buraya öğeler sürükleyin  	</string> diff --git a/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml index 094bf019b4..9c45c54a5e 100644 --- a/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/zh/panel_snapshot_inventory.xml @@ -7,7 +7,7 @@  		將圖像儲存到收納區的費用為 L$[UPLOAD_COST]。 若要將圖像存為材質,請選擇一個正方格式。  	</text>  	<combo_box label="解析度" name="texture_size_combo"> -		<combo_box.item label="目前視窗(512x512)" name="CurrentWindow"/> +		<combo_box.item label="目前視窗" name="CurrentWindow"/>  		<combo_box.item label="小(128x128)" name="Small(128x128)"/>  		<combo_box.item label="中(256x256)" name="Medium(256x256)"/>  		<combo_box.item label="大(512x512)" name="Large(512x512)"/> diff --git a/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml b/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml index d7c65bb25e..d9536882ac 100644 --- a/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/zh/panel_snapshot_options.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="panel_snapshot_options">  	<button label="儲存到硬碟" name="save_to_computer_btn"/> -	<button label="儲存到收納區(L$[AMOUNT])" name="save_to_inventory_btn"/> +	<button label="儲存到收納區" name="save_to_inventory_btn"/>  	<button label="分享至檔案訊息發佈" name="save_to_profile_btn"/>  	<button label="分享到臉書" name="send_to_facebook_btn"/>  	<button label="分享到推特" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml index d053d2b30d..dee48b3d58 100644 --- a/indra/newview/skins/default/xui/zh/strings.xml +++ b/indra/newview/skins/default/xui/zh/strings.xml @@ -42,7 +42,7 @@  		建製設置 [BUILD_CONFIG]  	</string>  	<string name="AboutPosition"> -		你的方位是 [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1],地區名:[REGION],主機:<nolink>[HOSTNAME]</nolink> ([HOSTIP]) +		你的方位是 [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1],地區名:[REGION],主機:<nolink>[HOSTNAME]</nolink>  第二人生URL:<nolink>[SLURL]</nolink>  (全域坐標:[POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])  [SERVER_VERSION] @@ -4572,6 +4572,10 @@ http://secondlife.com/support 求助解決問題。  	<string name="inventory_folder_offered-im">  		收納區資料夾'[ITEM_NAME]'已向人提供  	</string> +	<string name="bot_warning"> +您正在与人工智能机器人 [NAME] 聊天。请勿分享任何个人信息。 +了解更多:https://second.life/scripted-agents。 +	</string>  	<string name="share_alert">  		將收納區物品拖曳到這裡  	</string> diff --git a/indra/test/llhttpdate_tut.cpp b/indra/test/llhttpdate_tut.cpp index a47602dec5..b580b09a9f 100644 --- a/indra/test/llhttpdate_tut.cpp +++ b/indra/test/llhttpdate_tut.cpp @@ -112,13 +112,8 @@ namespace tut      void httpdate_object::test<4>()      {          // test localization of http dates -#if LL_WINDOWS -        const char *en_locale = "english"; -        const char *fr_locale = "french"; -#else -        const char *en_locale = "en_GB.UTF-8"; +        const char *en_locale = "en_US.UTF-8";          const char *fr_locale = "fr_FR.UTF-8"; -#endif          std::string prev_locale = LLStringUtil::getLocale();          std::string prev_clocale = std::string(setlocale(LC_TIME, NULL));  | 
