summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xindra/llimage/llimage.cpp579
-rwxr-xr-xindra/llprimitive/llmodel.cpp16
-rwxr-xr-xindra/llrender/llglslshader.cpp67
-rwxr-xr-xindra/llrender/llrender.cpp53
-rwxr-xr-xindra/llrender/llrender.h2
-rwxr-xr-xindra/llui/llcombobox.cpp1
-rwxr-xr-xindra/llui/llsearcheditor.cpp13
-rwxr-xr-xindra/llui/llsearcheditor.h2
-rwxr-xr-xindra/llui/lltabcontainer.cpp20
-rwxr-xr-xindra/llui/llurlentry.cpp6
-rwxr-xr-xindra/llwindow/llwindowwin32.cpp1
-rwxr-xr-xindra/newview/CMakeLists.txt1
-rwxr-xr-xindra/newview/app_settings/settings.xml22
-rwxr-xr-xindra/newview/app_settings/toolbars.xml3
-rwxr-xr-xindra/newview/llagentcamera.cpp6
-rwxr-xr-xindra/newview/llagentcamera.h4
-rwxr-xr-xindra/newview/llagentwearables.cpp35
-rwxr-xr-xindra/newview/llaisapi.cpp7
-rwxr-xr-xindra/newview/llaisapi.h2
-rwxr-xr-xindra/newview/llappearancemgr.cpp12
-rwxr-xr-xindra/newview/llchathistory.cpp2
-rwxr-xr-xindra/newview/lldrawpoolavatar.cpp7
-rwxr-xr-xindra/newview/llfavoritesbar.cpp23
-rwxr-xr-xindra/newview/llfloaterhardwaresettings.cpp29
-rwxr-xr-xindra/newview/llfloaterhardwaresettings.h5
-rwxr-xr-xindra/newview/llfloaterland.cpp68
-rwxr-xr-xindra/newview/llfloaterland.h5
-rwxr-xr-xindra/newview/llfloatermodelpreview.cpp14
-rwxr-xr-xindra/newview/llfloaterreporter.cpp18
-rwxr-xr-xindra/newview/llfloaterreporter.h5
-rwxr-xr-xindra/newview/llfloatersnapshot.cpp41
-rwxr-xr-xindra/newview/llfloatersnapshot.h1
-rwxr-xr-xindra/newview/llfloatertools.cpp7
-rwxr-xr-xindra/newview/llfloatertools.h2
-rwxr-xr-xindra/newview/llfloaterworldmap.cpp6
-rwxr-xr-xindra/newview/llgroupmgr.cpp3
-rwxr-xr-xindra/newview/llimview.cpp10
-rwxr-xr-xindra/newview/llinventorybridge.cpp8
-rwxr-xr-xindra/newview/llinventoryfilter.cpp39
-rwxr-xr-xindra/newview/llinventoryfilter.h4
-rwxr-xr-xindra/newview/llinventoryfunctions.cpp2
-rwxr-xr-xindra/newview/lllocalbitmaps.cpp2
-rwxr-xr-xindra/newview/lllocationinputctrl.cpp5
-rwxr-xr-xindra/newview/llmeshrepository.cpp32
-rwxr-xr-xindra/newview/llmutelist.cpp16
-rwxr-xr-xindra/newview/llmutelist.h5
-rwxr-xr-xindra/newview/llnamelistctrl.cpp9
-rwxr-xr-xindra/newview/llnamelistctrl.h5
-rw-r--r--indra/newview/llpanelgroupbulk.cpp1
-rwxr-xr-xindra/newview/llpanellandmarkinfo.cpp10
-rwxr-xr-xindra/newview/llpanellogin.cpp1
-rwxr-xr-xindra/newview/llpanelmaininventory.cpp8
-rwxr-xr-xindra/newview/llpanelobjectinventory.cpp8
-rwxr-xr-xindra/newview/llpanelplaceprofile.cpp30
-rwxr-xr-xindra/newview/llpanelplaceprofile.h1
-rwxr-xr-xindra/newview/llpanelsnapshotinventory.cpp11
-rwxr-xr-xindra/newview/llpanelsnapshotlocal.cpp8
-rwxr-xr-xindra/newview/llpanelsnapshotoptions.cpp7
-rwxr-xr-xindra/newview/llpanelsnapshotpostcard.cpp244
-rwxr-xr-xindra/newview/llpaneltopinfobar.cpp5
-rwxr-xr-xindra/newview/llpreview.cpp20
-rwxr-xr-xindra/newview/llpreview.h6
-rwxr-xr-xindra/newview/llpreviewnotecard.cpp7
-rw-r--r--indra/newview/llscenemonitor.cpp16
-rw-r--r--indra/newview/llscenemonitor.h8
-rwxr-xr-xindra/newview/llselectmgr.cpp31
-rwxr-xr-xindra/newview/llselectmgr.h2
-rwxr-xr-xindra/newview/llslurl.cpp7
-rw-r--r--indra/newview/llsnapshotlivepreview.cpp5
-rw-r--r--indra/newview/llsnapshotlivepreview.h2
-rwxr-xr-xindra/newview/llstartup.cpp26
-rwxr-xr-xindra/newview/lltexturectrl.cpp15
-rwxr-xr-xindra/newview/lltooldraganddrop.cpp12
-rwxr-xr-xindra/newview/lltoolgrab.h2
-rwxr-xr-xindra/newview/lltoolpie.cpp1
-rwxr-xr-xindra/newview/llviewermenu.cpp1
-rwxr-xr-xindra/newview/llviewermessage.cpp27
-rwxr-xr-xindra/newview/llviewernetwork.cpp4
-rwxr-xr-xindra/newview/llviewerparcelmgr.cpp10
-rwxr-xr-xindra/newview/llviewerregion.cpp1
-rwxr-xr-xindra/newview/llworldmap.cpp1
-rwxr-xr-xindra/newview/skins/default/xui/de/panel_snapshot_postcard.xml21
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_about_land.xml6
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_hardware_settings.xml12
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_snapshot.xml6
-rwxr-xr-xindra/newview/skins/default/xui/en/notifications.xml28
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_snapshot_inventory.xml4
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_snapshot_options.xml17
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_snapshot_postcard.xml103
-rwxr-xr-xindra/newview/skins/default/xui/en/strings.xml21
-rwxr-xr-xindra/newview/skins/default/xui/es/panel_snapshot_postcard.xml17
-rwxr-xr-xindra/newview/skins/default/xui/fr/panel_login.xml4
-rwxr-xr-xindra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml17
-rwxr-xr-xindra/newview/skins/default/xui/it/panel_snapshot_postcard.xml17
-rwxr-xr-xindra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml17
-rwxr-xr-xindra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml17
-rwxr-xr-xindra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml17
-rwxr-xr-xindra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml17
-rwxr-xr-xindra/newview/skins/default/xui/zh/panel_snapshot_postcard.xml17
-rwxr-xr-xindra/newview/tests/llslurl_test.cpp16
-rwxr-xr-xindra/newview/tests/llviewernetwork_test.cpp25
101 files changed, 1356 insertions, 806 deletions
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index 16df27bb8e..7645034bd9 100755
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -40,6 +40,547 @@
#include "llimagedxt.h"
#include "llmemory.h"
+#include <boost/preprocessor.hpp>
+
+//..................................................................................
+//..................................................................................
+// Helper macrose's for generate cycle unwrap templates
+//..................................................................................
+#define _UNROL_GEN_TPL_arg_0(arg)
+#define _UNROL_GEN_TPL_arg_1(arg) arg
+
+#define _UNROL_GEN_TPL_comma_0
+#define _UNROL_GEN_TPL_comma_1 BOOST_PP_COMMA()
+//..................................................................................
+#define _UNROL_GEN_TPL_ARGS_macro(z,n,seq) \
+ BOOST_PP_CAT(_UNROL_GEN_TPL_arg_, BOOST_PP_MOD(n, 2))(BOOST_PP_SEQ_ELEM(n, seq)) BOOST_PP_CAT(_UNROL_GEN_TPL_comma_, BOOST_PP_AND(BOOST_PP_MOD(n, 2), BOOST_PP_NOT_EQUAL(BOOST_PP_INC(n), BOOST_PP_SEQ_SIZE(seq))))
+
+#define _UNROL_GEN_TPL_ARGS(seq) \
+ BOOST_PP_REPEAT(BOOST_PP_SEQ_SIZE(seq), _UNROL_GEN_TPL_ARGS_macro, seq)
+//..................................................................................
+
+#define _UNROL_GEN_TPL_TYPE_ARGS_macro(z,n,seq) \
+ BOOST_PP_SEQ_ELEM(n, seq) BOOST_PP_CAT(_UNROL_GEN_TPL_comma_, BOOST_PP_AND(BOOST_PP_MOD(n, 2), BOOST_PP_NOT_EQUAL(BOOST_PP_INC(n), BOOST_PP_SEQ_SIZE(seq))))
+
+#define _UNROL_GEN_TPL_TYPE_ARGS(seq) \
+ BOOST_PP_REPEAT(BOOST_PP_SEQ_SIZE(seq), _UNROL_GEN_TPL_TYPE_ARGS_macro, seq)
+//..................................................................................
+#define _UNROLL_GEN_TPL_foreach_ee(z, n, seq) \
+ executor<n>(_UNROL_GEN_TPL_ARGS(seq));
+
+#define _UNROLL_GEN_TPL(name, args_seq, operation, spec) \
+ template<> struct name<spec> { \
+ private: \
+ template<S32 _idx> inline void executor(_UNROL_GEN_TPL_TYPE_ARGS(args_seq)) { \
+ BOOST_PP_SEQ_ENUM(operation) ; \
+ } \
+ public: \
+ inline void operator()(_UNROL_GEN_TPL_TYPE_ARGS(args_seq)) { \
+ BOOST_PP_REPEAT(spec, _UNROLL_GEN_TPL_foreach_ee, args_seq) \
+ } \
+};
+//..................................................................................
+#define _UNROLL_GEN_TPL_foreach_seq_macro(r, data, elem) \
+ _UNROLL_GEN_TPL(BOOST_PP_SEQ_ELEM(0, data), BOOST_PP_SEQ_ELEM(1, data), BOOST_PP_SEQ_ELEM(2, data), elem)
+
+#define UNROLL_GEN_TPL(name, args_seq, operation, spec_seq) \
+ /*general specialization - should not be implemented!*/ \
+ template<U8> struct name { inline void operator()(_UNROL_GEN_TPL_TYPE_ARGS(args_seq)) { /*static_assert(!"Should not be instantiated.");*/ } }; \
+ BOOST_PP_SEQ_FOR_EACH(_UNROLL_GEN_TPL_foreach_seq_macro, (name)(args_seq)(operation), spec_seq)
+//..................................................................................
+//..................................................................................
+
+
+//..................................................................................
+// Generated unrolling loop templates with specializations
+//..................................................................................
+//example: for(c = 0; c < ch; ++c) comp[c] = cx[0] = 0;
+UNROLL_GEN_TPL(uroll_zeroze_cx_comp, (S32 *)(cx)(S32 *)(comp), (cx[_idx] = comp[_idx] = 0), (1)(3)(4));
+//example: for(c = 0; c < ch; ++c) comp[c] >>= 4;
+UNROLL_GEN_TPL(uroll_comp_rshftasgn_constval, (S32 *)(comp)(const S32)(cval), (comp[_idx] >>= cval), (1)(3)(4));
+//example: for(c = 0; c < ch; ++c) comp[c] = (cx[c] >> 5) * yap;
+UNROLL_GEN_TPL(uroll_comp_asgn_cx_rshft_cval_all_mul_val, (S32 *)(comp)(S32 *)(cx)(const S32)(cval)(S32)(val), (comp[_idx] = (cx[_idx] >> cval) * val), (1)(3)(4));
+//example: for(c = 0; c < ch; ++c) comp[c] += (cx[c] >> 5) * Cy;
+UNROLL_GEN_TPL(uroll_comp_plusasgn_cx_rshft_cval_all_mul_val, (S32 *)(comp)(S32 *)(cx)(const S32)(cval)(S32)(val), (comp[_idx] += (cx[_idx] >> cval) * val), (1)(3)(4));
+//example: for(c = 0; c < ch; ++c) comp[c] += pix[c] * info.xapoints[x];
+UNROLL_GEN_TPL(uroll_inp_plusasgn_pix_mul_val, (S32 *)(comp)(const U8 *)(pix)(S32)(val), (comp[_idx] += pix[_idx] * val), (1)(3)(4));
+//example: for(c = 0; c < ch; ++c) cx[c] = pix[c] * info.xapoints[x];
+UNROLL_GEN_TPL(uroll_inp_asgn_pix_mul_val, (S32 *)(comp)(const U8 *)(pix)(S32)(val), (comp[_idx] = pix[_idx] * val), (1)(3)(4));
+//example: for(c = 0; c < ch; ++c) comp[c] = ((cx[c] * info.yapoints[y]) + (comp[c] * (256 - info.yapoints[y]))) >> 16;
+UNROLL_GEN_TPL(uroll_comp_asgn_cx_mul_apoint_plus_comp_mul_inv_apoint_allshifted_16_r, (S32 *)(comp)(S32 *)(cx)(S32)(apoint), (comp[_idx] = ((cx[_idx] * apoint) + (comp[_idx] * (256 - apoint))) >> 16), (1)(3)(4));
+//example: for(c = 0; c < ch; ++c) comp[c] = (comp[c] + pix[c] * info.yapoints[y]) >> 8;
+UNROLL_GEN_TPL(uroll_comp_asgn_comp_plus_pix_mul_apoint_allshifted_8_r, (S32 *)(comp)(const U8 *)(pix)(S32)(apoint), (comp[_idx] = (comp[_idx] + pix[_idx] * apoint) >> 8), (1)(3)(4));
+//example: for(c = 0; c < ch; ++c) comp[c] = ((comp[c]*(256 - info.xapoints[x])) + ((cx[c] * info.xapoints[x]))) >> 12;
+UNROLL_GEN_TPL(uroll_comp_asgn_comp_mul_inv_apoint_plus_cx_mul_apoint_allshifted_12_r, (S32 *)(comp)(S32)(apoint)(S32 *)(cx), (comp[_idx] = ((comp[_idx] * (256-apoint)) + (cx[_idx] * apoint)) >> 12), (1)(3)(4));
+//example: for(c = 0; c < ch; ++c) *dptr++ = comp[c]&0xff;
+UNROLL_GEN_TPL(uroll_uref_dptr_inc_asgn_comp_and_ff, (U8 *&)(dptr)(S32 *)(comp), (*dptr++ = comp[_idx]&0xff), (1)(3)(4));
+//example: for(c = 0; c < ch; ++c) *dptr++ = (sptr[info.xpoints[x]*ch + c])&0xff;
+UNROLL_GEN_TPL(uroll_uref_dptr_inc_asgn_sptr_apoint_plus_idx_alland_ff, (U8 *&)(dptr)(const U8 *)(sptr)(S32)(apoint), (*dptr++ = sptr[apoint + _idx]&0xff), (1)(3)(4));
+//example: for(c = 0; c < ch; ++c) *dptr++ = (comp[c]>>10)&0xff;
+UNROLL_GEN_TPL(uroll_uref_dptr_inc_asgn_comp_rshft_cval_and_ff, (U8 *&)(dptr)(S32 *)(comp)(const S32)(cval), (*dptr++ = (comp[_idx]>>cval)&0xff), (1)(3)(4));
+//..................................................................................
+
+
+template<U8 ch>
+struct scale_info
+{
+public:
+ std::vector<S32> xpoints;
+ std::vector<const U8*> ystrides;
+ std::vector<S32> xapoints, yapoints;
+ S32 xup_yup;
+
+public:
+ //unrolling loop types declaration
+ typedef uroll_zeroze_cx_comp<ch> uroll_zeroze_cx_comp_t;
+ typedef uroll_comp_rshftasgn_constval<ch> uroll_comp_rshftasgn_constval_t;
+ typedef uroll_comp_asgn_cx_rshft_cval_all_mul_val<ch> uroll_comp_asgn_cx_rshft_cval_all_mul_val_t;
+ typedef uroll_comp_plusasgn_cx_rshft_cval_all_mul_val<ch> uroll_comp_plusasgn_cx_rshft_cval_all_mul_val_t;
+ typedef uroll_inp_plusasgn_pix_mul_val<ch> uroll_inp_plusasgn_pix_mul_val_t;
+ typedef uroll_inp_asgn_pix_mul_val<ch> uroll_inp_asgn_pix_mul_val_t;
+ typedef uroll_comp_asgn_cx_mul_apoint_plus_comp_mul_inv_apoint_allshifted_16_r<ch> uroll_comp_asgn_cx_mul_apoint_plus_comp_mul_inv_apoint_allshifted_16_r_t;
+ typedef uroll_comp_asgn_comp_plus_pix_mul_apoint_allshifted_8_r<ch> uroll_comp_asgn_comp_plus_pix_mul_apoint_allshifted_8_r_t;
+ typedef uroll_comp_asgn_comp_mul_inv_apoint_plus_cx_mul_apoint_allshifted_12_r<ch> uroll_comp_asgn_comp_mul_inv_apoint_plus_cx_mul_apoint_allshifted_12_r_t;
+ typedef uroll_uref_dptr_inc_asgn_comp_and_ff<ch> uroll_uref_dptr_inc_asgn_comp_and_ff_t;
+ typedef uroll_uref_dptr_inc_asgn_sptr_apoint_plus_idx_alland_ff<ch> uroll_uref_dptr_inc_asgn_sptr_apoint_plus_idx_alland_ff_t;
+ typedef uroll_uref_dptr_inc_asgn_comp_rshft_cval_and_ff<ch> uroll_uref_dptr_inc_asgn_comp_rshft_cval_and_ff_t;
+
+public:
+ scale_info(const U8 *src, U32 srcW, U32 srcH, U32 dstW, U32 dstH, U32 srcStride)
+ : xup_yup((dstW >= srcW) + ((dstH >= srcH) << 1))
+ {
+ calc_x_points(srcW, dstW);
+ calc_y_strides(src, srcStride, srcH, dstH);
+ calc_aa_points(srcW, dstW, xup_yup&1, xapoints);
+ calc_aa_points(srcH, dstH, xup_yup&2, yapoints);
+ }
+
+private:
+ //...........................................................................................
+ void calc_x_points(U32 srcW, U32 dstW)
+ {
+ xpoints.resize(dstW+1);
+
+ S32 val = dstW >= srcW ? 0x8000 * srcW / dstW - 0x8000 : 0;
+ S32 inc = (srcW << 16) / dstW;
+
+ for(U32 i = 0, j = 0; i < dstW; ++i, ++j, val += inc)
+ {
+ xpoints[j] = llmax(0, val >> 16);
+ }
+ }
+ //...........................................................................................
+ void calc_y_strides(const U8 *src, U32 srcStride, U32 srcH, U32 dstH)
+ {
+ ystrides.resize(dstH+1);
+
+ S32 val = dstH >= srcH ? 0x8000 * srcH / dstH - 0x8000 : 0;
+ S32 inc = (srcH << 16) / dstH;
+
+ for(U32 i = 0, j = 0; i < dstH; ++i, ++j, val += inc)
+ {
+ ystrides[j] = src + llmax(0, val >> 16) * srcStride;
+ }
+ }
+ //...........................................................................................
+ void calc_aa_points(U32 srcSz, U32 dstSz, bool scale_up, std::vector<S32> &vp)
+ {
+ vp.resize(dstSz);
+
+ if(scale_up)
+ {
+ S32 val = 0x8000 * srcSz / dstSz - 0x8000;
+ S32 inc = (srcSz << 16) / dstSz;
+ U32 pos;
+
+ for(U32 i = 0, j = 0; i < dstSz; ++i, ++j, val += inc)
+ {
+ pos = val >> 16;
+
+ if (pos < 0)
+ vp[j] = 0;
+ else if (pos >= (srcSz - 1))
+ vp[j] = 0;
+ else
+ vp[j] = (val >> 8) - ((val >> 8) & 0xffffff00);
+ }
+ }
+ else
+ {
+ S32 inc = (srcSz << 16) / dstSz;
+ S32 Cp = ((dstSz << 14) / srcSz) + 1;
+ S32 ap;
+
+ for(U32 i = 0, j = 0, val = 0; i < dstSz; ++i, ++j, val += inc)
+ {
+ ap = ((0x100 - ((val >> 8) & 0xff)) * Cp) >> 8;
+ vp[j] = ap | (Cp << 16);
+ }
+ }
+ }
+};
+
+
+template<U8 ch>
+inline void bilinear_scale(
+ const U8 *src, U32 srcW, U32 srcH, U32 srcStride
+ , U8 *dst, U32 dstW, U32 dstH, U32 dstStride
+ )
+{
+ typedef scale_info<ch> scale_info_t;
+
+ scale_info_t info(src, srcW, srcH, dstW, dstH, srcStride);
+
+ const U8 *sptr;
+ U8 *dptr;
+ U32 x, y;
+ const U8 *pix;
+
+ S32 cx[ch], comp[ch];
+
+
+ if(3 == info.xup_yup)
+ { //scale x/y - up
+ for(y = 0; y < dstH; ++y)
+ {
+ dptr = dst + (y * dstStride);
+ sptr = info.ystrides[y];
+
+ if(0 < info.yapoints[y])
+ {
+ for(x = 0; x < dstW; ++x)
+ {
+ //for(c = 0; c < ch; ++c) cx[c] = comp[c] = 0;
+ typename scale_info_t::uroll_zeroze_cx_comp_t()(cx, comp);
+
+ if(0 < info.xapoints[x])
+ {
+ pix = info.ystrides[y] + info.xpoints[x] * ch;
+
+ //for(c = 0; c < ch; ++c) comp[c] = pix[c] * (256 - info.xapoints[x]);
+ typename scale_info_t::uroll_inp_asgn_pix_mul_val_t()(comp, pix, 256 - info.xapoints[x]);
+
+ pix += ch;
+
+ //for(c = 0; c < ch; ++c) comp[c] += pix[c] * info.xapoints[x];
+ typename scale_info_t::uroll_inp_plusasgn_pix_mul_val_t()(comp, pix, info.xapoints[x]);
+
+ pix += srcStride;
+
+ //for(c = 0; c < ch; ++c) cx[c] = pix[c] * info.xapoints[x];
+ typename scale_info_t::uroll_inp_asgn_pix_mul_val_t()(cx, pix, info.xapoints[x]);
+
+ pix -= ch;
+
+ //for(c = 0; c < ch; ++c) {
+ // cx[c] += pix[c] * (256 - info.xapoints[x]);
+ // comp[c] = ((cx[c] * info.yapoints[y]) + (comp[c] * (256 - info.yapoints[y]))) >> 16;
+ // *dptr++ = comp[c]&0xff;
+ //}
+ typename scale_info_t::uroll_inp_plusasgn_pix_mul_val_t()(cx, pix, 256 - info.xapoints[x]);
+ typename scale_info_t::uroll_comp_asgn_cx_mul_apoint_plus_comp_mul_inv_apoint_allshifted_16_r_t()(comp, cx, info.yapoints[y]);
+ typename scale_info_t::uroll_uref_dptr_inc_asgn_comp_and_ff_t()(dptr, comp);
+ }
+ else
+ {
+ pix = info.ystrides[y] + info.xpoints[x] * ch;
+
+ //for(c = 0; c < ch; ++c) comp[c] = pix[c] * (256 - info.yapoints[y]);
+ typename scale_info_t::uroll_inp_asgn_pix_mul_val_t()(comp, pix, 256-info.yapoints[y]);
+
+ pix += srcStride;
+
+ //for(c = 0; c < ch; ++c) {
+ // comp[c] = (comp[c] + pix[c] * info.yapoints[y]) >> 8;
+ // *dptr++ = comp[c]&0xff;
+ //}
+ typename scale_info_t::uroll_comp_asgn_comp_plus_pix_mul_apoint_allshifted_8_r_t()(comp, pix, info.yapoints[y]);
+ typename scale_info_t::uroll_uref_dptr_inc_asgn_comp_and_ff_t()(dptr, comp);
+ }
+ }
+ }
+ else
+ {
+ for(x = 0; x < dstW; ++x)
+ {
+ if(0 < info.xapoints[x])
+ {
+ pix = info.ystrides[y] + info.xpoints[x] * ch;
+
+ //for(c = 0; c < ch; ++c) {
+ // comp[c] = pix[c] * (256 - info.xapoints[x]);
+ // comp[c] = (comp[c] + pix[c] * info.xapoints[x]) >> 8;
+ // *dptr++ = comp[c]&0xff;
+ //}
+ typename scale_info_t::uroll_inp_asgn_pix_mul_val_t()(comp, pix, 256 - info.xapoints[x]);
+ typename scale_info_t::uroll_comp_asgn_comp_plus_pix_mul_apoint_allshifted_8_r_t()(comp, pix, info.xapoints[x]);
+ typename scale_info_t::uroll_uref_dptr_inc_asgn_comp_and_ff_t()(dptr, comp);
+ }
+ else
+ {
+ //for(c = 0; c < ch; ++c) *dptr++ = (sptr[info.xpoints[x]*ch + c])&0xff;
+ typename scale_info_t::uroll_uref_dptr_inc_asgn_sptr_apoint_plus_idx_alland_ff_t()(dptr, sptr, info.xpoints[x]*ch);
+ }
+ }
+ }
+ }
+ }
+ else if(info.xup_yup == 1)
+ { //scaling down vertically
+ S32 Cy, j;
+ S32 yap;
+
+ for(y = 0; y < dstH; y++)
+ {
+ Cy = info.yapoints[y] >> 16;
+ yap = info.yapoints[y] & 0xffff;
+
+ dptr = dst + (y * dstStride);
+
+ for(x = 0; x < dstW; x++)
+ {
+ pix = info.ystrides[y] + info.xpoints[x] * ch;
+
+ //for(c = 0; c < ch; ++c) comp[c] = pix[c] * yap;
+ typename scale_info_t::uroll_inp_asgn_pix_mul_val_t()(comp, pix, yap);
+
+ pix += srcStride;
+
+ for(j = (1 << 14) - yap; j > Cy; j -= Cy, pix += srcStride)
+ {
+ //for(c = 0; c < ch; ++c) comp[c] += pix[c] * Cy;
+ typename scale_info_t::uroll_inp_plusasgn_pix_mul_val_t()(comp, pix, Cy);
+ }
+
+ if(j > 0)
+ {
+ //for(c = 0; c < ch; ++c) comp[c] += pix[c] * j;
+ typename scale_info_t::uroll_inp_plusasgn_pix_mul_val_t()(comp, pix, j);
+ }
+
+ if(info.xapoints[x] > 0)
+ {
+ pix = info.ystrides[y] + info.xpoints[x]*ch + ch;
+ //for(c = 0; c < ch; ++c) cx[c] = pix[c] * yap;
+ typename scale_info_t::uroll_inp_asgn_pix_mul_val_t()(cx, pix, yap);
+
+ pix += srcStride;
+ for(j = (1 << 14) - yap; j > Cy; j -= Cy)
+ {
+ //for(c = 0; c < ch; ++c) cx[c] += pix[c] * Cy;
+ typename scale_info_t::uroll_inp_plusasgn_pix_mul_val_t()(cx, pix, Cy);
+ pix += srcStride;
+ }
+
+ if(j > 0)
+ {
+ //for(c = 0; c < ch; ++c) cx[c] += pix[c] * j;
+ typename scale_info_t::uroll_inp_plusasgn_pix_mul_val_t()(cx, pix, j);
+ }
+
+ //for(c = 0; c < ch; ++c) comp[c] = ((comp[c]*(256 - info.xapoints[x])) + ((cx[c] * info.xapoints[x]))) >> 12;
+ typename scale_info_t::uroll_comp_asgn_comp_mul_inv_apoint_plus_cx_mul_apoint_allshifted_12_r_t()(comp, info.xapoints[x], cx);
+ }
+ else
+ {
+ //for(c = 0; c < ch; ++c) comp[c] >>= 4;
+ typename scale_info_t::uroll_comp_rshftasgn_constval_t()(comp, 4);
+ }
+
+ //for(c = 0; c < ch; ++c) *dptr++ = (comp[c]>>10)&0xff;
+ typename scale_info_t::uroll_uref_dptr_inc_asgn_comp_rshft_cval_and_ff_t()(dptr, comp, 10);
+ }
+ }
+ }
+ else if(info.xup_yup == 2)
+ { // scaling down horizontally
+ S32 Cx, j;
+ S32 xap;
+
+ for(y = 0; y < dstH; y++)
+ {
+ dptr = dst + (y * dstStride);
+
+ for(x = 0; x < dstW; x++)
+ {
+ Cx = info.xapoints[x] >> 16;
+ xap = info.xapoints[x] & 0xffff;
+
+ pix = info.ystrides[y] + info.xpoints[x] * ch;
+
+ //for(c = 0; c < ch; ++c) comp[c] = pix[c] * xap;
+ typename scale_info_t::uroll_inp_asgn_pix_mul_val_t()(comp, pix, xap);
+
+ pix+=ch;
+ for(j = (1 << 14) - xap; j > Cx; j -= Cx)
+ {
+ //for(c = 0; c < ch; ++c) comp[c] += pix[c] * Cx;
+ typename scale_info_t::uroll_inp_plusasgn_pix_mul_val_t()(comp, pix, Cx);
+ pix+=ch;
+ }
+
+ if(j > 0)
+ {
+ //for(c = 0; c < ch; ++c) comp[c] += pix[c] * j;
+ typename scale_info_t::uroll_inp_plusasgn_pix_mul_val_t()(comp, pix, j);
+ }
+
+ if(info.yapoints[y] > 0)
+ {
+ pix = info.ystrides[y] + info.xpoints[x]*ch + srcStride;
+ //for(c = 0; c < ch; ++c) cx[c] = pix[c] * xap;
+ typename scale_info_t::uroll_inp_asgn_pix_mul_val_t()(cx, pix, xap);
+
+ pix+=ch;
+ for(j = (1 << 14) - xap; j > Cx; j -= Cx)
+ {
+ //for(c = 0; c < ch; ++c) cx[c] += pix[c] * Cx;
+ typename scale_info_t::uroll_inp_plusasgn_pix_mul_val_t()(cx, pix, Cx);
+ pix+=ch;
+ }
+
+ if(j > 0)
+ {
+ //for(c = 0; c < ch; ++c) cx[c] += pix[c] * j;
+ typename scale_info_t::uroll_inp_plusasgn_pix_mul_val_t()(cx, pix, j);
+ }
+
+ //for(c = 0; c < ch; ++c) comp[c] = ((comp[c] * (256 - info.yapoints[y])) + ((cx[c] * info.yapoints[y]))) >> 12;
+ typename scale_info_t::uroll_comp_asgn_comp_mul_inv_apoint_plus_cx_mul_apoint_allshifted_12_r_t()(comp, info.yapoints[y], cx);
+ }
+ else
+ {
+ //for(c = 0; c < ch; ++c) comp[c] >>= 4;
+ typename scale_info_t::uroll_comp_rshftasgn_constval_t()(comp, 4);
+ }
+
+ //for(c = 0; c < ch; ++c) *dptr++ = (comp[c]>>10)&0xff;
+ typename scale_info_t::uroll_uref_dptr_inc_asgn_comp_rshft_cval_and_ff_t()(dptr, comp, 10);
+ }
+ }
+ }
+ else
+ { //scale x/y - down
+ S32 Cx, Cy, i, j;
+ S32 xap, yap;
+
+ for(y = 0; y < dstH; y++)
+ {
+ Cy = info.yapoints[y] >> 16;
+ yap = info.yapoints[y] & 0xffff;
+
+ dptr = dst + (y * dstStride);
+ for(x = 0; x < dstW; x++)
+ {
+ Cx = info.xapoints[x] >> 16;
+ xap = info.xapoints[x] & 0xffff;
+
+ sptr = info.ystrides[y] + info.xpoints[x] * ch;
+ pix = sptr;
+ sptr += srcStride;
+
+ //for(c = 0; c < ch; ++c) cx[c] = pix[c] * xap;
+ typename scale_info_t::uroll_inp_asgn_pix_mul_val_t()(cx, pix, xap);
+
+ pix+=ch;
+ for(i = (1 << 14) - xap; i > Cx; i -= Cx)
+ {
+ //for(c = 0; c < ch; ++c) cx[c] += pix[c] * Cx;
+ typename scale_info_t::uroll_inp_plusasgn_pix_mul_val_t()(cx, pix, Cx);
+ pix+=ch;
+ }
+
+ if(i > 0)
+ {
+ //for(c = 0; c < ch; ++c) cx[c] += pix[c] * i;
+ typename scale_info_t::uroll_inp_plusasgn_pix_mul_val_t()(cx, pix, i);
+ }
+
+ //for(c = 0; c < ch; ++c) comp[c] = (cx[c] >> 5) * yap;
+ typename scale_info_t::uroll_comp_asgn_cx_rshft_cval_all_mul_val_t()(comp, cx, 5, yap);
+
+ for(j = (1 << 14) - yap; j > Cy; j -= Cy)
+ {
+ pix = sptr;
+ sptr += srcStride;
+
+ //for(c = 0; c < ch; ++c) cx[c] = pix[c] * xap;
+ typename scale_info_t::uroll_inp_asgn_pix_mul_val_t()(cx, pix, xap);
+
+ pix+=ch;
+ for(i = (1 << 14) - xap; i > Cx; i -= Cx)
+ {
+ //for(c = 0; c < ch; ++c) cx[c] += pix[c] * Cx;
+ typename scale_info_t::uroll_inp_plusasgn_pix_mul_val_t()(cx, pix, Cx);
+ pix+=ch;
+ }
+
+ if(i > 0)
+ {
+ //for(c = 0; c < ch; ++c) cx[c] += pix[c] * i;
+ typename scale_info_t::uroll_inp_plusasgn_pix_mul_val_t()(cx, pix, i);
+ }
+
+ //for(c = 0; c < ch; ++c) comp[c] += (cx[c] >> 5) * Cy;
+ typename scale_info_t::uroll_comp_plusasgn_cx_rshft_cval_all_mul_val_t()(comp, cx, 5, Cy);
+ }
+
+ if(j > 0)
+ {
+ pix = sptr;
+ sptr += srcStride;
+
+ //for(c = 0; c < ch; ++c) cx[c] = pix[c] * xap;
+ typename scale_info_t::uroll_inp_asgn_pix_mul_val_t()(cx, pix, xap);
+
+ pix+=ch;
+ for(i = (1 << 14) - xap; i > Cx; i -= Cx)
+ {
+ //for(c = 0; c < ch; ++c) cx[c] += pix[c] * Cx;
+ typename scale_info_t::uroll_inp_plusasgn_pix_mul_val_t()(cx, pix, Cx);
+ pix+=ch;
+ }
+
+ if(i > 0)
+ {
+ //for(c = 0; c < ch; ++c) cx[c] += pix[c] * i;
+ typename scale_info_t::uroll_inp_plusasgn_pix_mul_val_t()(cx, pix, i);
+ }
+
+ //for(c = 0; c < ch; ++c) comp[c] += (cx[c] >> 5) * j;
+ typename scale_info_t::uroll_comp_plusasgn_cx_rshft_cval_all_mul_val_t()(comp, cx, 5, j);
+ }
+
+ //for(c = 0; c < ch; ++c) *dptr++ = (comp[c]>>23)&0xff;
+ typename scale_info_t::uroll_uref_dptr_inc_asgn_comp_rshft_cval_and_ff_t()(dptr, comp, 23);
+ }
+ }
+ } //else
+}
+
+//wrapper
+static void bilinear_scale(const U8 *src, U32 srcW, U32 srcH, U32 srcCh, U32 srcStride, U8 *dst, U32 dstW, U32 dstH, U32 dstCh, U32 dstStride)
+{
+ llassert(srcCh == dstCh);
+
+ switch(srcCh)
+ {
+ case 1:
+ bilinear_scale<1>(src, srcW, srcH, srcStride, dst, dstW, dstH, dstStride);
+ break;
+ case 3:
+ bilinear_scale<3>(src, srcW, srcH, srcStride, dst, dstW, dstH, dstStride);
+ break;
+ case 4:
+ bilinear_scale<4>(src, srcW, srcH, srcStride, dst, dstW, dstH, dstStride);
+ break;
+ default:
+ llassert(!"Implement if need");
+ break;
+ }
+
+}
+
//---------------------------------------------------------------------------
// LLImage
//---------------------------------------------------------------------------
@@ -559,6 +1100,7 @@ void LLImageRaw::composite( LLImageRaw* src )
}
}
+
// Src and dst can be any size. Src has 4 components. Dst has 3 components.
void LLImageRaw::compositeScaled4onto3(LLImageRaw* src)
{
@@ -589,21 +1131,6 @@ void LLImageRaw::compositeScaled4onto3(LLImageRaw* src)
// Src and dst are same size. Src has 4 components. Dst has 3 components.
void LLImageRaw::compositeUnscaled4onto3( LLImageRaw* src )
{
- /*
- //test fastFractionalMult()
- {
- U8 i = 255;
- U8 j = 255;
- do
- {
- do
- {
- llassert( fastFractionalMult(i, j) == (U8)(255*(i/255.f)*(j/255.f) + 0.5f) );
- } while( j-- );
- } while( i-- );
- }
- */
-
LLImageRaw* dst = this; // Just for clarity.
llassert( (3 == src->getComponents()) || (4 == src->getComponents()) );
@@ -639,6 +1166,7 @@ void LLImageRaw::compositeUnscaled4onto3( LLImageRaw* src )
}
}
+
void LLImageRaw::copyUnscaledAlphaMask( LLImageRaw* src, const LLColor4U& fill)
{
LLImageRaw* dst = this; // Just for clarity.
@@ -846,6 +1374,12 @@ void LLImageRaw::copyScaled( LLImageRaw* src )
return;
}
+ bilinear_scale(
+ src->getData(), src->getWidth(), src->getHeight(), src->getComponents(), src->getWidth()*src->getComponents()
+ , dst->getData(), dst->getWidth(), dst->getHeight(), dst->getComponents(), dst->getWidth()*dst->getComponents()
+ );
+
+ /*
S32 temp_data_size = src->getWidth() * dst->getHeight() * getComponents();
llassert_always(temp_data_size > 0);
std::vector<U8> temp_buffer(temp_data_size);
@@ -861,6 +1395,7 @@ void LLImageRaw::copyScaled( LLImageRaw* src )
{
copyLineScaled( &temp_buffer[0] + (getComponents() * src->getWidth() * row), dst->getData() + (getComponents() * dst->getWidth() * row), src->getWidth(), dst->getWidth(), 1, 1 );
}
+ */
}
@@ -880,6 +1415,7 @@ BOOL LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
if (scale_image_data)
{
+ /*
S32 temp_data_size = old_width * new_height * getComponents();
llassert_always(temp_data_size > 0);
std::vector<U8> temp_buffer(temp_data_size);
@@ -899,6 +1435,19 @@ BOOL LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
{
copyLineScaled( &temp_buffer[0] + (getComponents() * old_width * row), new_buffer + (getComponents() * new_width * row), old_width, new_width, 1, 1 );
}
+ */
+
+ S32 new_data_size = new_width * new_height * getComponents();
+ llassert_always(new_data_size > 0);
+
+ U8 *new_data = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), new_data_size);
+ if(NULL == new_data)
+ {
+ return FALSE;
+ }
+
+ bilinear_scale(getData(), old_width, old_height, getComponents(), old_width*getComponents(), new_data, new_width, new_height, getComponents(), new_width*getComponents());
+ setDataAndSize(new_data, new_width, new_height, getComponents());
}
else
{
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index 1571427d51..ed903146ef 100755
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -316,6 +316,14 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa
if (indices.size()%3 == 0 && verts.size() >= 65532)
{
+ std::string material;
+
+ if (tri->getMaterial())
+ {
+ material = std::string(tri->getMaterial());
+ }
+
+ materials.push_back(material);
face_list.push_back(face);
face_list.rbegin()->fillFromLegacyData(verts, indices);
LLVolumeFace& new_face = *face_list.rbegin();
@@ -587,6 +595,14 @@ LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& fac
if (indices.size()%3 == 0 && indices.size() >= 65532)
{
+ std::string material;
+
+ if (poly->getMaterial())
+ {
+ material = std::string(poly->getMaterial());
+ }
+
+ materials.push_back(material);
face_list.push_back(face);
face_list.rbegin()->fillFromLegacyData(verts, indices);
LLVolumeFace& new_face = *face_list.rbegin();
diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 3ceed95248..f9f7d07c89 100755
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -722,10 +722,77 @@ BOOL LLGLSLShader::mapUniforms(const vector<LLStaticHashedString> * uniforms)
GLint activeCount;
glGetObjectParameterivARB(mProgramObject, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &activeCount);
+ //........................................................................................................................................
+ //........................................................................................
+
+ /*
+ EXPLANATION:
+ This is part of code is temporary because as the final result the mapUniform() should be rewrited.
+ But it's a huge a volume of work which is need to be a more carefully performed for avoid possible
+ regression's (i.e. it should be formalized a separate ticket in JIRA).
+
+ RESON:
+ The reason of this code is that SL engine is very sensitive to fact that "diffuseMap" should be appear
+ first as uniform parameter which is should get 0-"texture channel" index (see mapUniformTextureChannel() and mActiveTextureChannels)
+ it influence to which is texture matrix will be updated during rendering.
+
+ But, order of indexe's of uniform variables is not defined and GLSL compiler can change it as want
+ , even if the "diffuseMap" will be appear and use first in shader code.
+
+ As example where this situation appear see: "Deferred Material Shader 28/29/30/31"
+ And tickets: MAINT-4165, MAINT-4839
+ */
+
+
+ S32 diffuseMap = glGetUniformLocationARB(mProgramObject, "diffuseMap");
+ S32 bumpMap = glGetUniformLocationARB(mProgramObject, "bumpMap");
+
+ std::set<S32> skip_index;
+
+ if(diffuseMap != -1 && bumpMap != -1)
+ {
+ GLenum type;
+ GLsizei length;
+ GLint size = -1;
+ char name[1024];
+
+ //diffuse map
+ for (S32 i = 0; i < activeCount; i++)
+ {
+ name[0] = 0;
+
+ glGetActiveUniformARB(mProgramObject, i, 1024, &length, &size, &type, (GLcharARB *)name);
+
+ if(std::string(name) == "diffuseMap") {
+ diffuseMap = i;
+ }
+
+ if(std::string(name) == "bumpMap") {
+ bumpMap = i;
+ }
+ }
+
+ if(bumpMap < diffuseMap)
+ {
+ mapUniform(diffuseMap, uniforms);
+ mapUniform(bumpMap, uniforms);
+
+ skip_index.insert(diffuseMap);
+ skip_index.insert(bumpMap);
+ }
+ }
+
+ //........................................................................................
+
for (S32 i = 0; i < activeCount; i++)
{
+ //........................................................................................
+ if(skip_index.end() != skip_index.find(i)) continue;
+ //........................................................................................
+
mapUniform(i, uniforms);
}
+ //........................................................................................................................................
unbind();
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 1ca6e99ecf..69420dd0bb 100755
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -104,10 +104,10 @@ LLTexUnit::LLTexUnit(S32 index)
mCurrColorSrc1(TBS_TEX_COLOR), mCurrColorSrc2(TBS_PREV_COLOR),
mCurrAlphaSrc1(TBS_TEX_ALPHA), mCurrAlphaSrc2(TBS_PREV_ALPHA),
mCurrColorScale(1), mCurrAlphaScale(1), mCurrTexture(0),
- mHasMipMaps(false)
+ mHasMipMaps(false),
+ mIndex(index)
{
llassert_always(index < (S32)LL_NUM_TEXTURE_LAYERS);
- mIndex = index;
}
//static
@@ -227,33 +227,34 @@ bool LLTexUnit::bind(LLTexture* texture, bool for_rendering, bool forceBind)
stop_glerror();
if (mIndex >= 0)
{
- gGL.flush();
+ gGL.flush();
+
+ LLImageGL* gl_tex = NULL ;
- LLImageGL* gl_tex = NULL ;
if (texture != NULL && (gl_tex = texture->getGLTexture()))
- {
- if (gl_tex->getTexName()) //if texture exists
- {
- //in audit, replace the selected texture by the default one.
- if ((mCurrTexture != gl_tex->getTexName()) || forceBind)
- {
- activate();
- enable(gl_tex->getTarget());
- mCurrTexture = gl_tex->getTexName();
- glBindTexture(sGLTextureType[gl_tex->getTarget()], mCurrTexture);
- if(gl_tex->updateBindStats(gl_tex->mTextureMemory))
- {
- texture->setActive() ;
- texture->updateBindStatsForTester() ;
- }
- mHasMipMaps = gl_tex->mHasMipMaps;
- if (gl_tex->mTexOptionsDirty)
{
- gl_tex->mTexOptionsDirty = false;
- setTextureAddressMode(gl_tex->mAddressMode);
- setTextureFilteringOption(gl_tex->mFilterOption);
- }
- }
+ if (gl_tex->getTexName()) //if texture exists
+ {
+ //in audit, replace the selected texture by the default one.
+ if ((mCurrTexture != gl_tex->getTexName()) || forceBind)
+ {
+ activate();
+ enable(gl_tex->getTarget());
+ mCurrTexture = gl_tex->getTexName();
+ glBindTexture(sGLTextureType[gl_tex->getTarget()], mCurrTexture);
+ if(gl_tex->updateBindStats(gl_tex->mTextureMemory))
+ {
+ texture->setActive() ;
+ texture->updateBindStatsForTester() ;
+ }
+ mHasMipMaps = gl_tex->mHasMipMaps;
+ if (gl_tex->mTexOptionsDirty)
+ {
+ gl_tex->mTexOptionsDirty = false;
+ setTextureAddressMode(gl_tex->mAddressMode);
+ setTextureFilteringOption(gl_tex->mFilterOption);
+ }
+ }
}
else
{
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index 42b02a8159..a67fb8da52 100755
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -198,7 +198,7 @@ public:
void setHasMipMaps(bool hasMips) { mHasMipMaps = hasMips; }
protected:
- S32 mIndex;
+ const S32 mIndex;
U32 mCurrTexture;
eTextureType mCurrTexType;
eTextureBlendType mCurrBlendType;
diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp
index b32aea5ffa..559895da1a 100755
--- a/indra/llui/llcombobox.cpp
+++ b/indra/llui/llcombobox.cpp
@@ -443,6 +443,7 @@ void LLComboBox::onFocusLost()
{
mTextEntry->selectAll();
}
+ mButton->setForcePressedState(false);
LLUICtrl::onFocusLost();
}
diff --git a/indra/llui/llsearcheditor.cpp b/indra/llui/llsearcheditor.cpp
index ea96fc573d..1fdd05a11c 100755
--- a/indra/llui/llsearcheditor.cpp
+++ b/indra/llui/llsearcheditor.cpp
@@ -29,6 +29,7 @@
#include "linden_common.h"
#include "llsearcheditor.h"
+#include "llkeyboard.h"
LLSearchEditor::LLSearchEditor(const LLSearchEditor::Params& p)
: LLUICtrl(p),
@@ -166,4 +167,16 @@ void LLSearchEditor::handleKeystroke()
{
mKeystrokeCallback(this, getValue());
}
+
+ KEY key = gKeyboard->currentKey();
+ if (key == KEY_LEFT ||
+ key == KEY_RIGHT)
+ {
+ return;
+ }
+
+ if (mTextChangedCallback)
+ {
+ mTextChangedCallback(this, getValue());
+ }
}
diff --git a/indra/llui/llsearcheditor.h b/indra/llui/llsearcheditor.h
index c2d7916938..3b12868225 100755
--- a/indra/llui/llsearcheditor.h
+++ b/indra/llui/llsearcheditor.h
@@ -82,12 +82,14 @@ public:
virtual void setFocus( BOOL b );
void setKeystrokeCallback( commit_callback_t cb ) { mKeystrokeCallback = cb; }
+ void setTextChangedCallback( commit_callback_t cb ) { mTextChangedCallback = cb; }
protected:
void onClearButtonClick(const LLSD& data);
virtual void handleKeystroke();
commit_callback_t mKeystrokeCallback;
+ commit_callback_t mTextChangedCallback;
LLLineEditor* mSearchEditor;
LLButton* mSearchButton;
LLButton* mClearButton;
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 6f858cdeb3..308e83963d 100755
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -1775,6 +1775,11 @@ void LLTabContainer::onNextBtn( const LLSD& data )
scrollNext();
}
mScrolled = FALSE;
+
+ if(mCurrentTabIdx < mTabList.size()-1)
+ {
+ selectNextTab();
+ }
}
void LLTabContainer::onNextBtnHeld( const LLSD& data )
@@ -1783,6 +1788,11 @@ void LLTabContainer::onNextBtnHeld( const LLSD& data )
{
mScrollTimer.reset();
scrollNext();
+
+ if(mCurrentTabIdx < mTabList.size()-1)
+ {
+ selectNextTab();
+ }
mScrolled = TRUE;
}
}
@@ -1794,6 +1804,11 @@ void LLTabContainer::onPrevBtn( const LLSD& data )
scrollPrev();
}
mScrolled = FALSE;
+
+ if(mCurrentTabIdx > 0)
+ {
+ selectPrevTab();
+ }
}
void LLTabContainer::onJumpFirstBtn( const LLSD& data )
@@ -1812,6 +1827,11 @@ void LLTabContainer::onPrevBtnHeld( const LLSD& data )
{
mScrollTimer.reset();
scrollPrev();
+
+ if(mCurrentTabIdx > 0)
+ {
+ selectPrevTab();
+ }
mScrolled = TRUE;
}
}
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index 5f60d80858..c63289aa07 100755
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -202,10 +202,10 @@ std::string LLUrlEntryBase::urlToGreyQuery(const std::string &url) const
{
LLUriParser up(unescapeUrl(url));
- std::string query;
+ std::string label;
up.extractParts();
- up.glueSecond(query);
-
+ up.glueFirst(label);
+ std::string query = url.substr(label.size());
return query;
}
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index cd2be87fad..7e0eb9cf31 100755
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -2292,6 +2292,7 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
sHandleLeftMouseUp = true;
break;
}
+ sHandleDoubleClick = true;
//if (gDebugClicks)
//{
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 13040ea423..3d7fd5bc5e 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -464,7 +464,6 @@ set(viewer_SOURCE_FILES
llpanelsnapshotinventory.cpp
llpanelsnapshotlocal.cpp
llpanelsnapshotoptions.cpp
- llpanelsnapshotpostcard.cpp
llpanelsnapshotprofile.cpp
llpanelteleporthistory.cpp
llpaneltiptoast.cpp
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 845cb5ae96..c98f0736f2 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3459,6 +3459,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>MinObjectsForUnlinkConfirm</key>
+ <map>
+ <key>Comment</key>
+ <string>Minimum amount of objects in linkset for showing confirmation dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>6</integer>
+ </map>
<key>EffectScriptChatParticles</key>
<map>
<key>Comment</key>
@@ -14131,6 +14142,17 @@
<key>Value</key>
<integer>-1</integer>
</map>
+ <key>MaxFPS</key>
+ <map>
+ <key>Comment</key>
+ <string>Yield some time to the local host if we reach a threshold framerate.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>-1.0</real>
+ </map>
<key>ForcePeriodicRenderingTime</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/app_settings/toolbars.xml b/indra/newview/app_settings/toolbars.xml
index d61aee9a14..36e4eb91fd 100755
--- a/indra/newview/app_settings/toolbars.xml
+++ b/indra/newview/app_settings/toolbars.xml
@@ -23,4 +23,7 @@
<command name="snapshot"/>
<command name="facebook"/>
</left_toolbar>
+ <right_toolbar
+ button_display_mode="icons_only">
+ </right_toolbar>
</toolbars>
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 7f0330ee99..aed27924fe 100755
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -147,6 +147,7 @@ LLAgentCamera::LLAgentCamera() :
mCameraUpVector(LLVector3::z_axis), // default is straight up
mFocusOnAvatar(TRUE),
+ mAllowChangeToFollow(FALSE),
mFocusGlobal(),
mFocusTargetGlobal(),
mFocusObject(NULL),
@@ -1152,8 +1153,10 @@ void LLAgentCamera::updateCamera()
mCameraUpVector = mCameraUpVector * gAgentAvatarp->getRenderRotation();
}
- if (cameraThirdPerson() && mFocusOnAvatar && LLFollowCamMgr::getActiveFollowCamParams())
+ if (cameraThirdPerson() && (mFocusOnAvatar || mAllowChangeToFollow) && LLFollowCamMgr::getActiveFollowCamParams())
{
+ mAllowChangeToFollow = FALSE;
+ mFocusOnAvatar = TRUE;
changeCameraToFollow();
}
@@ -2610,6 +2613,7 @@ void LLAgentCamera::setFocusOnAvatar(BOOL focus_on_avatar, BOOL animate)
{
// keep camera focus point consistent, even though it is now unlocked
setFocusGlobal(gAgent.getPositionGlobal() + calcThirdPersonFocusOffset(), gAgent.getID());
+ mAllowChangeToFollow = FALSE;
}
mFocusOnAvatar = focus_on_avatar;
diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h
index 4d0f9a80de..ab793ff316 100755
--- a/indra/newview/llagentcamera.h
+++ b/indra/newview/llagentcamera.h
@@ -206,13 +206,15 @@ public:
void setCameraPosAndFocusGlobal(const LLVector3d& pos, const LLVector3d& focus, const LLUUID &object_id);
void clearFocusObject();
void setFocusObject(LLViewerObject* object);
+ void setAllowChangeToFollow(BOOL focus) { mAllowChangeToFollow = focus; }
void setObjectTracking(BOOL track) { mTrackFocusObject = track; }
const LLVector3d &getFocusGlobal() const { return mFocusGlobal; }
const LLVector3d &getFocusTargetGlobal() const { return mFocusTargetGlobal; }
private:
LLVector3d mCameraFocusOffset; // Offset from focus point in build mode
LLVector3d mCameraFocusOffsetTarget; // Target towards which we are lerping the camera's focus offset
- BOOL mFocusOnAvatar;
+ BOOL mFocusOnAvatar;
+ BOOL mAllowChangeToFollow;
LLVector3d mFocusGlobal;
LLVector3d mFocusTargetGlobal;
LLPointer<LLViewerObject> mFocusObject;
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index f06ffb4fb3..f6ba879fa7 100755
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -982,6 +982,7 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
S32 matched = 0, mismatched = 0;
const S32 arr_size = LLWearableType::WT_COUNT;
S32 type_counts[arr_size];
+ BOOL update_inventory = FALSE;
std::fill(type_counts,type_counts+arr_size,0);
for (S32 i = 0; i < count; i++)
{
@@ -1009,10 +1010,9 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
continue;
}
- // Don't care about this case - ordering of wearables with the same asset id has no effect.
- // Causes the two-alphas error case in MAINT-4158.
+ // Update only inventory in this case - ordering of wearables with the same asset id has no effect.
+ // Updating wearables in this case causes the two-alphas error in MAINT-4158.
// We should actually disallow wearing two wearables with the same asset id.
-#if 0
if (curr_wearable->getName() != new_item->getName() ||
curr_wearable->getItemID() != new_item->getUUID())
{
@@ -1020,10 +1020,9 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
<< curr_wearable->getName() << " vs " << new_item->getName()
<< " item ids " << curr_wearable->getItemID() << " vs " << new_item->getUUID()
<< LL_ENDL;
- mismatched++;
+ update_inventory = TRUE;
continue;
}
-#endif
// If we got here, everything matches.
matched++;
}
@@ -1037,14 +1036,15 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
mismatched++;
}
}
- if (mismatched == 0)
+ if (mismatched == 0 && !update_inventory)
{
LL_DEBUGS("Avatar") << "no changes, bailing out" << LL_ENDL;
mCOFChangeInProgress = false;
return;
}
-
-
+
+ // updating inventory
+
// TODO: Removed check for ensuring that teens don't remove undershirt and underwear. Handle later
// note: shirt is the first non-body part wearable item. Update if wearable order changes.
// This loop should remove all clothing, but not any body parts
@@ -1065,7 +1065,8 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
if (new_wearable)
{
const LLWearableType::EType type = new_wearable->getType();
-
+
+ LLUUID old_wearable_id = new_wearable->getItemID();
new_wearable->setName(new_item->getName());
new_wearable->setItemID(new_item->getUUID());
@@ -1073,11 +1074,18 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
{
// exactly one wearable per body part
setWearable(type,0,new_wearable);
+ if (old_wearable_id.notNull())
+ {
+ // we changed id before setting wearable, update old item manually
+ // to complete the swap.
+ gInventory.addChangedMask(LLInventoryObserver::LABEL, old_wearable_id);
+ }
}
else
{
pushWearable(type,new_wearable);
}
+
const BOOL removed = FALSE;
wearableUpdated(new_wearable, removed);
}
@@ -1085,6 +1093,15 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
gInventory.notifyObservers();
+ if (mismatched == 0)
+ {
+ LL_DEBUGS("Avatar") << "inventory updated, wearable assets not changed, bailing out" << LL_ENDL;
+ mCOFChangeInProgress = false;
+ return;
+ }
+
+ // updating agent avatar
+
if (isAgentAvatarValid())
{
gAgentAvatarp->setCompositeUpdatesEnabled(TRUE);
diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp
index 9d887a61f1..714b456ae7 100755
--- a/indra/newview/llaisapi.cpp
+++ b/indra/newview/llaisapi.cpp
@@ -315,7 +315,8 @@ SlamFolderCommand::SlamFolderCommand(const LLUUID& folder_id, const LLSD& conten
CopyLibraryCategoryCommand::CopyLibraryCategoryCommand(const LLUUID& source_id,
const LLUUID& dest_id,
- LLPointer<LLInventoryCallback> callback):
+ LLPointer<LLInventoryCallback> callback,
+ bool copy_subfolders):
AISCommand(callback)
{
std::string cap;
@@ -328,6 +329,10 @@ CopyLibraryCategoryCommand::CopyLibraryCategoryCommand(const LLUUID& source_id,
LLUUID tid;
tid.generate();
std::string url = cap + std::string("/category/") + source_id.asString() + "?tid=" + tid.asString();
+ if (!copy_subfolders)
+ {
+ url += ",depth=0";
+ }
LL_INFOS() << url << LL_ENDL;
LLCurl::ResponderPtr responder = this;
LLSD headers;
diff --git a/indra/newview/llaisapi.h b/indra/newview/llaisapi.h
index 5a2ec94af9..bb483fb133 100755
--- a/indra/newview/llaisapi.h
+++ b/indra/newview/llaisapi.h
@@ -124,7 +124,7 @@ private:
class CopyLibraryCategoryCommand: public AISCommand
{
public:
- CopyLibraryCategoryCommand(const LLUUID& source_id, const LLUUID& dest_id, LLPointer<LLInventoryCallback> callback);
+ CopyLibraryCategoryCommand(const LLUUID& source_id, const LLUUID& dest_id, LLPointer<LLInventoryCallback> callback, bool copy_subfolders = true);
protected:
/* virtual */ bool getResponseUUID(const LLSD& content, LLUUID& id);
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index a64d5b50b3..96620719bf 100755
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -1730,9 +1730,15 @@ bool LLAppearanceMgr::getCanRemoveFromCOF(const LLUUID& outfit_cat_id)
{
return false;
}
-
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
LLFindWearablesEx is_worn(/*is_worn=*/ true, /*include_body_parts=*/ false);
- return gInventory.hasMatchingDirectDescendent(outfit_cat_id, is_worn);
+ gInventory.collectDescendentsIf(outfit_cat_id,
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ is_worn);
+ return items.size() > 0;
}
// static
@@ -2351,7 +2357,7 @@ void LLAppearanceMgr::wearInventoryCategory(LLInventoryCategory* category, bool
LLPointer<LLInventoryCallback> copy_cb = new LLWearCategoryAfterCopy(append);
LLPointer<LLInventoryCallback> track_cb = new LLTrackPhaseWrapper(
std::string("wear_inventory_category_callback"), copy_cb);
- LLPointer<AISCommand> cmd_ptr = new CopyLibraryCategoryCommand(category->getUUID(), parent_id, track_cb);
+ LLPointer<AISCommand> cmd_ptr = new CopyLibraryCategoryCommand(category->getUUID(), parent_id, track_cb, false);
ais_ran=cmd_ptr->run_command();
}
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index f0bd63ba46..b81b95462e 100755
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -934,7 +934,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
// compact mode: show a timestamp and name
if (use_plain_text_chat_history)
{
- square_brackets = chat.mFromName == SYSTEM_FROM;
+ square_brackets = chat.mSourceType == CHAT_SOURCE_SYSTEM;
LLStyle::Params timestamp_style(body_message_params);
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index e1d3d1a905..821d58a9b2 100755
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -1797,9 +1797,12 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
if (mat)
{
- gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture(LLRender::DIFFUSE_MAP));
- gGL.getTexUnit(normal_channel)->bind(face->getTexture(LLRender::NORMAL_MAP));
+ //order is important here LLRender::DIFFUSE_MAP should be last, becouse it change
+ //(gGL).mCurrTextureUnitIndex
gGL.getTexUnit(specular_channel)->bind(face->getTexture(LLRender::SPECULAR_MAP));
+ gGL.getTexUnit(normal_channel)->bind(face->getTexture(LLRender::NORMAL_MAP));
+ gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture(LLRender::DIFFUSE_MAP), false, true);
+
LLColor4 col = mat->getSpecularLightColor();
F32 spec = mat->getSpecularLightExponent()/255.f;
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index fc9e85caf8..f2b369a9ad 100755
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -1728,6 +1728,17 @@ void LLFavoritesOrderStorage::cleanup()
mSortIndexes.swap(aTempMap);
}
+// See also LLInventorySort where landmarks in the Favorites folder are sorted.
+class LLViewerInventoryItemSort
+{
+public:
+ bool operator()(const LLPointer<LLViewerInventoryItem>& a, const LLPointer<LLViewerInventoryItem>& b)
+ {
+ return LLFavoritesOrderStorage::instance().getSortIndex(a->getUUID())
+ < LLFavoritesOrderStorage::instance().getSortIndex(b->getUUID());
+ }
+};
+
void LLFavoritesOrderStorage::saveOrder()
{
LLInventoryModel::cat_array_t cats;
@@ -1735,6 +1746,7 @@ void LLFavoritesOrderStorage::saveOrder()
LLIsType is_type(LLAssetType::AT_LANDMARK);
LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
gInventory.collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type);
+ std::sort(items.begin(), items.end(), LLViewerInventoryItemSort());
saveItemsOrder(items);
}
@@ -1760,16 +1772,7 @@ void LLFavoritesOrderStorage::saveItemsOrder( const LLInventoryModel::item_array
gInventory.notifyObservers();
}
-// See also LLInventorySort where landmarks in the Favorites folder are sorted.
-class LLViewerInventoryItemSort
-{
-public:
- bool operator()(const LLPointer<LLViewerInventoryItem>& a, const LLPointer<LLViewerInventoryItem>& b)
- {
- return LLFavoritesOrderStorage::instance().getSortIndex(a->getUUID())
- < LLFavoritesOrderStorage::instance().getSortIndex(b->getUUID());
- }
-};
+
// * @param source_item_id - LLUUID of the source item to be moved into new position
// * @param target_item_id - LLUUID of the target item before which source item should be placed.
diff --git a/indra/newview/llfloaterhardwaresettings.cpp b/indra/newview/llfloaterhardwaresettings.cpp
index 035eb307c2..62d7efc8b2 100755
--- a/indra/newview/llfloaterhardwaresettings.cpp
+++ b/indra/newview/llfloaterhardwaresettings.cpp
@@ -82,6 +82,7 @@ void LLFloaterHardwareSettings::refresh()
mVideoCardMem = gSavedSettings.getS32("TextureMemory");
mFogRatio = gSavedSettings.getF32("RenderFogRatio");
mProbeHardwareOnStartup = gSavedSettings.getBOOL("ProbeHardwareOnStartup");
+ mCompressTextures = gSavedSettings.getBOOL("RenderCompressTextures");
getChild<LLUICtrl>("fsaa")->setValue((LLSD::Integer) mFSAASamples);
refreshEnabledState();
@@ -149,6 +150,7 @@ void LLFloaterHardwareSettings::refreshEnabledState()
BOOL LLFloaterHardwareSettings::postBuild()
{
childSetAction("OK", onBtnOK, this);
+ childSetAction("Cancel", onBtnCancel, this);
// Don't do this on Mac as their braindead GL versioning
// sets this when 8x and 16x are indeed available
@@ -179,18 +181,17 @@ void LLFloaterHardwareSettings::apply()
void LLFloaterHardwareSettings::cancel()
{
- gSavedSettings.setBOOL("RenderVBOEnable", mUseVBO);
- gSavedSettings.setBOOL("RenderAnisotropic", mUseAniso);
- gSavedSettings.setU32("RenderFSAASamples", mFSAASamples);
- gSavedSettings.setF32("RenderGamma", mGamma);
- gSavedSettings.setS32("TextureMemory", mVideoCardMem);
- gSavedSettings.setF32("RenderFogRatio", mFogRatio);
- gSavedSettings.setBOOL("ProbeHardwareOnStartup", mProbeHardwareOnStartup );
-
closeFloater();
}
// static
+void LLFloaterHardwareSettings::onBtnCancel( void* userdata )
+{
+ LLFloaterHardwareSettings *fp =(LLFloaterHardwareSettings *)userdata;
+ fp->cancel();
+}
+
+// static
void LLFloaterHardwareSettings::onBtnOK( void* userdata )
{
LLFloaterHardwareSettings *fp =(LLFloaterHardwareSettings *)userdata;
@@ -198,4 +199,14 @@ void LLFloaterHardwareSettings::onBtnOK( void* userdata )
fp->closeFloater(false);
}
-
+void LLFloaterHardwareSettings::onClose(bool app_quitting)
+{
+ gSavedSettings.setBOOL("RenderVBOEnable", mUseVBO);
+ gSavedSettings.setBOOL("RenderAnisotropic", mUseAniso);
+ gSavedSettings.setU32("RenderFSAASamples", mFSAASamples);
+ gSavedSettings.setF32("RenderGamma", mGamma);
+ gSavedSettings.setS32("TextureMemory", mVideoCardMem);
+ gSavedSettings.setF32("RenderFogRatio", mFogRatio);
+ gSavedSettings.setBOOL("ProbeHardwareOnStartup", mProbeHardwareOnStartup );
+ gSavedSettings.setBOOL("RenderCompressTextures", mCompressTextures );
+}
diff --git a/indra/newview/llfloaterhardwaresettings.h b/indra/newview/llfloaterhardwaresettings.h
index 626771b1d2..11c27c266d 100755
--- a/indra/newview/llfloaterhardwaresettings.h
+++ b/indra/newview/llfloaterhardwaresettings.h
@@ -40,6 +40,7 @@ public:
/*virtual*/ ~LLFloaterHardwareSettings();
/*virtual*/ BOOL postBuild();
+ /*virtual*/ void onClose(bool app_quitting);
/// initialize all the callbacks for the menu
void initCallbacks(void);
@@ -47,6 +48,9 @@ public:
/// OK button
static void onBtnOK( void* userdata );
+ /// Cancel button
+ static void onBtnCancel( void* userdata );
+
//// menu management
/// show off our menu
@@ -76,6 +80,7 @@ protected:
S32 mVideoCardMem;
F32 mFogRatio;
BOOL mProbeHardwareOnStartup;
+ BOOL mCompressTextures;
private:
};
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 5ebd25d228..5ec9a96be7 100755
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -78,6 +78,8 @@
#include "llgroupactions.h"
+const F64 COVENANT_REFRESH_TIME_SEC = 60.0f;
+
static std::string OWNER_ONLINE = "0";
static std::string OWNER_OFFLINE = "1";
static std::string OWNER_GROUP = "2";
@@ -2408,33 +2410,33 @@ void LLPanelLandAccess::refresh()
cit != parcel->mAccessList.end(); ++cit)
{
const LLAccessEntry& entry = (*cit).second;
- std::string suffix;
+ std::string prefix;
if (entry.mTime != 0)
{
LLStringUtil::format_map_t args;
S32 now = time(NULL);
S32 seconds = entry.mTime - now;
if (seconds < 0) seconds = 0;
- suffix.assign(" (");
+ prefix.assign(" (");
if (seconds >= 120)
{
args["[MINUTES]"] = llformat("%d", (seconds/60));
std::string buf = parent_floater->getString ("Minutes", args);
- suffix.append(buf);
+ prefix.append(buf);
}
else if (seconds >= 60)
{
- suffix.append("1 " + parent_floater->getString("Minute"));
+ prefix.append("1 " + parent_floater->getString("Minute"));
}
else
{
args["[SECONDS]"] = llformat("%d", seconds);
std::string buf = parent_floater->getString ("Seconds", args);
- suffix.append(buf);
+ prefix.append(buf);
}
- suffix.append(" " + parent_floater->getString("Remaining") + ")");
+ prefix.append(" " + parent_floater->getString("Remaining") + ") ");
}
- mListAccess->addNameItem(entry.mID, ADD_DEFAULT, TRUE, suffix);
+ mListAccess->addNameItem(entry.mID, ADD_DEFAULT, TRUE, "", prefix);
}
mListAccess->sortByName(TRUE);
}
@@ -2454,33 +2456,33 @@ void LLPanelLandAccess::refresh()
cit != parcel->mBanList.end(); ++cit)
{
const LLAccessEntry& entry = (*cit).second;
- std::string suffix;
+ std::string prefix;
if (entry.mTime != 0)
{
LLStringUtil::format_map_t args;
S32 now = time(NULL);
S32 seconds = entry.mTime - now;
if (seconds < 0) seconds = 0;
- suffix.assign(" (");
+ prefix.assign(" (");
if (seconds >= 120)
{
args["[MINUTES]"] = llformat("%d", (seconds/60));
std::string buf = parent_floater->getString ("Minutes", args);
- suffix.append(buf);
+ prefix.append(buf);
}
else if (seconds >= 60)
{
- suffix.append("1 " + parent_floater->getString("Minute"));
+ prefix.append("1 " + parent_floater->getString("Minute"));
}
else
{
args["[SECONDS]"] = llformat("%d", seconds);
std::string buf = parent_floater->getString ("Seconds", args);
- suffix.append(buf);
+ prefix.append(buf);
}
- suffix.append(" " + parent_floater->getString("Remaining") + ")");
+ prefix.append(" " + parent_floater->getString("Remaining") + ") ");
}
- mListBanned->addNameItem(entry.mID, ADD_DEFAULT, TRUE, suffix);
+ mListBanned->addNameItem(entry.mID, ADD_DEFAULT, TRUE, "", prefix);
}
mListBanned->sortByName(TRUE);
}
@@ -2883,14 +2885,23 @@ void LLPanelLandAccess::onClickRemoveBanned(void* data)
//---------------------------------------------------------------------------
LLPanelLandCovenant::LLPanelLandCovenant(LLParcelSelectionHandle& parcel)
: LLPanel(),
- mParcel(parcel)
-{
+ mParcel(parcel),
+ mNextUpdateTime(0)
+{
}
LLPanelLandCovenant::~LLPanelLandCovenant()
{
}
+BOOL LLPanelLandCovenant::postBuild()
+{
+ mLastRegionID = LLUUID::null;
+ mNextUpdateTime = 0;
+
+ return TRUE;
+}
+
// virtual
void LLPanelLandCovenant::refresh()
{
@@ -2937,14 +2948,23 @@ void LLPanelLandCovenant::refresh()
changeable_clause->setText(getString("can_not_change"));
}
}
-
- // send EstateCovenantInfo message
- LLMessageSystem *msg = gMessageSystem;
- msg->newMessage("EstateCovenantRequest");
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
- msg->sendReliable(region->getHost());
+
+ if (mLastRegionID != region->getRegionID()
+ || mNextUpdateTime < LLTimer::getElapsedSeconds())
+ {
+ // Request Covenant Info
+ // Note: LLPanelLandCovenant doesn't change Covenant's content and any
+ // changes made by Estate floater should be requested by Estate floater
+ LLMessageSystem *msg = gMessageSystem;
+ msg->newMessage("EstateCovenantRequest");
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
+ msg->sendReliable(region->getHost());
+
+ mLastRegionID = region->getRegionID();
+ mNextUpdateTime = LLTimer::getElapsedSeconds() + COVENANT_REFRESH_TIME_SEC;
+ }
}
// static
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index 1d9bd33720..92439b69a0 100755
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -391,6 +391,7 @@ class LLPanelLandCovenant
public:
LLPanelLandCovenant(LLSafeHandle<LLParcelSelection>& parcelp);
virtual ~LLPanelLandCovenant();
+ virtual BOOL postBuild();
void refresh();
static void updateCovenantText(const std::string& string);
static void updateEstateName(const std::string& name);
@@ -399,6 +400,10 @@ public:
protected:
LLSafeHandle<LLParcelSelection>& mParcel;
+
+private:
+ LLUUID mLastRegionID;
+ F64 mNextUpdateTime; //seconds since client start
};
#endif
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 72c9170b06..2cad67a47f 100755
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -2226,10 +2226,15 @@ bool LLModelLoader::loadFromSLM(const std::string& filename)
for (U32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
{
- if (!model[lod].empty())
+ if (model[lod].size() > idx)
{
instance_list[i].mLOD[lod] = model[lod][idx];
}
+ else if (!model[lod].empty())
+ {
+ // slm load failed - indexes are corrupted
+ return false;
+ }
}
instance_list[i].mModel = model[LLModel::LOD_HIGH][idx];
@@ -4854,7 +4859,7 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
LLModel* base_mdl = *base_iter;
base_iter++;
- for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
+ for (S32 i = 0, e = mdl->getNumVolumeFaces(); i < e; ++i)
{
const LLVolumeFace &vf = mdl->getVolumeFace(i);
U32 num_vertices = vf.mNumVertices;
@@ -5286,7 +5291,7 @@ BOOL LLModelPreview::render()
gGL.multMatrix((GLfloat*) mat.mMatrix);
- for (U32 i = 0; i < mVertexBuffer[mPreviewLOD][model].size(); ++i)
+ for (U32 i = 0, e = mVertexBuffer[mPreviewLOD][model].size(); i < e; ++i)
{
LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i];
@@ -5561,7 +5566,7 @@ BOOL LLModelPreview::render()
if (!model->mSkinWeights.empty())
{
- for (U32 i = 0; i < mVertexBuffer[mPreviewLOD][model].size(); ++i)
+ for (U32 i = 0, e = mVertexBuffer[mPreviewLOD][model].size(); i < e; ++i)
{
LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i];
@@ -5630,6 +5635,7 @@ BOOL LLModelPreview::render()
position[j] = v;
}
+ llassert(model->mMaterialList.size() > i);
const std::string& binding = instance.mModel->mMaterialList[i];
const LLImportMaterial& material = instance.mMaterial[binding];
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index ae330211db..21acfdbbd0 100755
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -106,14 +106,6 @@ LLFloaterReporter::LLFloaterReporter(const LLSD& key)
{
}
-// static
-void LLFloaterReporter::processRegionInfo(LLMessageSystem* msg)
-{
- if ( LLFloaterReg::instanceVisible("reporter") )
- {
- LLNotificationsUtil::add("HelpReportAbuseEmailLL");
- };
-}
// virtual
BOOL LLFloaterReporter::postBuild()
{
@@ -147,16 +139,6 @@ BOOL LLFloaterReporter::postBuild()
mDefaultSummary = getChild<LLUICtrl>("details_edit")->getValue().asString();
- // send a message and ask for information about this region -
- // result comes back in processRegionInfo(..)
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessage("RequestRegionInfo");
- msg->nextBlock("AgentData");
- msg->addUUID("AgentID", gAgent.getID());
- msg->addUUID("SessionID", gAgent.getSessionID());
- gAgent.sendReliableMessage();
-
-
// abuser name is selected from a list
LLUICtrl* le = getChild<LLUICtrl>("abuser_name_edit");
le->setEnabled( false );
diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h
index d54e7f6ab0..4e0bd14cc2 100755
--- a/indra/newview/llfloaterreporter.h
+++ b/indra/newview/llfloaterreporter.h
@@ -99,10 +99,7 @@ public:
static void uploadDoneCallback(const LLUUID &uuid, void* user_data, S32 result, LLExtStat ext_status);
static void addDescription(const std::string& description, LLMeanCollisionData *mcd = NULL);
static void setDescription(const std::string& description, LLMeanCollisionData *mcd = NULL);
-
- // static
- static void processRegionInfo(LLMessageSystem* msg);
-
+
void setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id);
private:
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index b27a42cb8e..bf127102c1 100755
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -169,11 +169,7 @@ LLSnapshotLivePreview::ESnapshotType LLFloaterSnapshot::Impl::getActiveSnapshotT
name = spanel->getName();
}
- if (name == "panel_snapshot_postcard")
- {
- type = LLSnapshotLivePreview::SNAPSHOT_POSTCARD;
- }
- else if (name == "panel_snapshot_inventory")
+ if (name == "panel_snapshot_inventory")
{
type = LLSnapshotLivePreview::SNAPSHOT_TEXTURE;
}
@@ -424,7 +420,6 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
}
LLSnapshotLivePreview* previewp = getPreviewView(floater);
- BOOL got_bytes = previewp && previewp->getDataSize() > 0;
BOOL got_snap = previewp && previewp->getSnapshotUpToDate();
// *TODO: Separate maximum size for Web images from postcards
@@ -447,10 +442,7 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
}
floater->getChild<LLUICtrl>("file_size_label")->setTextArg("[SIZE]", got_snap ? bytes_string : floater->getString("unknown"));
- floater->getChild<LLUICtrl>("file_size_label")->setColor(
- shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD
- && got_bytes
- && previewp->getDataSize() > MAX_POSTCARD_DATASIZE ? LLUIColor(LLColor4::red) : LLUIColorTable::instance().getColor( "LabelTextColor" ));
+ floater->getChild<LLUICtrl>("file_size_label")->setColor(LLUIColorTable::instance().getColor( "LabelTextColor" ));
// Update the width and height spinners based on the corresponding resolution combos. (?)
switch(shot_type)
@@ -460,11 +452,6 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
floater->getChild<LLUICtrl>("layer_types")->setValue("colors");
setResolution(floater, "profile_size_combo");
break;
- case LLSnapshotLivePreview::SNAPSHOT_POSTCARD:
- layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR;
- floater->getChild<LLUICtrl>("layer_types")->setValue("colors");
- setResolution(floater, "postcard_size_combo");
- break;
case LLSnapshotLivePreview::SNAPSHOT_TEXTURE:
layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR;
floater->getChild<LLUICtrl>("layer_types")->setValue("colors");
@@ -600,7 +587,11 @@ void LLFloaterSnapshot::Impl::onClickUICheck(LLUICtrl *ctrl, void* data)
LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
if (view)
{
- checkAutoSnapshot(getPreviewView(view), TRUE);
+ LLSnapshotLivePreview* previewp = getPreviewView(view);
+ if(previewp)
+ {
+ previewp->updateSnapshot(TRUE, TRUE);
+ }
updateControls(view);
}
}
@@ -614,7 +605,11 @@ void LLFloaterSnapshot::Impl::onClickHUDCheck(LLUICtrl *ctrl, void* data)
LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
if (view)
{
- checkAutoSnapshot(getPreviewView(view), TRUE);
+ LLSnapshotLivePreview* previewp = getPreviewView(view);
+ if(previewp)
+ {
+ previewp->updateSnapshot(TRUE, TRUE);
+ }
updateControls(view);
}
}
@@ -1452,18 +1447,6 @@ const LLVector3d& LLFloaterSnapshot::getPosTakenGlobal()
return previewp->getPosTakenGlobal();
}
-// static
-void LLFloaterSnapshot::setAgentEmail(const std::string& email)
-{
- LLFloaterSnapshot* instance = findInstance();
- if (instance)
- {
- LLSideTrayPanelContainer* panel_container = instance->getChild<LLSideTrayPanelContainer>("panel_container");
- LLPanel* postcard_panel = panel_container->getPanelByName("panel_snapshot_postcard");
- postcard_panel->notify(LLSD().with("agent-email", email));
- }
-}
-
///----------------------------------------------------------------------------
/// Class LLSnapshotFloaterView
///----------------------------------------------------------------------------
diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h
index 0bb9474bb5..5bcf1d3099 100755
--- a/indra/newview/llfloatersnapshot.h
+++ b/indra/newview/llfloatersnapshot.h
@@ -63,7 +63,6 @@ public:
static void postPanelSwitch();
static LLPointer<LLImageFormatted> getImageData();
static const LLVector3d& getPosTakenGlobal();
- static void setAgentEmail(const std::string& email);
static const LLRect& getThumbnailPlaceholderRect() { return sThumbnailPlaceholder->getRect(); }
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 7477b02867..6dbb202c9d 100755
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -92,6 +92,7 @@
// Globals
LLFloaterTools *gFloaterTools = NULL;
bool LLFloaterTools::sShowObjectCost = true;
+bool LLFloaterTools::sPreviousFocusOnAvatar = false;
const std::string PANEL_NAMES[LLFloaterTools::PANEL_COUNT] =
{
@@ -891,6 +892,12 @@ void LLFloaterTools::onClose(bool app_quitting)
// prepare content for next call
mPanelContents->clearContents();
+
+ if(sPreviousFocusOnAvatar)
+ {
+ sPreviousFocusOnAvatar = false;
+ gAgentCamera.setAllowChangeToFollow(TRUE);
+ }
}
void click_popup_info(void*)
diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h
index 189bae46c2..df481b8d4c 100755
--- a/indra/newview/llfloatertools.h
+++ b/indra/newview/llfloatertools.h
@@ -201,11 +201,13 @@ private:
std::map<std::string, std::string> mStatusText;
+
protected:
LLSD mMediaSettings;
public:
static bool sShowObjectCost;
+ static bool sPreviousFocusOnAvatar;
};
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index 1b1c24b19a..ece3e10faa 100755
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -284,12 +284,12 @@ BOOL LLFloaterWorldMap::postBuild()
LLComboBox *avatar_combo = getChild<LLComboBox>("friend combo");
avatar_combo->selectFirstItem();
avatar_combo->setPrearrangeCallback( boost::bind(&LLFloaterWorldMap::onAvatarComboPrearrange, this) );
- avatar_combo->setTextEntryCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) );
+ avatar_combo->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) );
mListFriendCombo = dynamic_cast<LLCtrlListInterface *>(avatar_combo);
LLSearchEditor *location_editor = getChild<LLSearchEditor>("location");
location_editor->setFocusChangedCallback(boost::bind(&LLFloaterWorldMap::onLocationFocusChanged, this, _1));
- location_editor->setKeystrokeCallback( boost::bind(&LLFloaterWorldMap::onSearchTextEntry, this));
+ location_editor->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onSearchTextEntry, this));
getChild<LLScrollListCtrl>("search_results")->setDoubleClickCallback( boost::bind(&LLFloaterWorldMap::onClickTeleportBtn, this));
mListSearchResults = childGetListInterface("search_results");
@@ -297,7 +297,7 @@ BOOL LLFloaterWorldMap::postBuild()
LLComboBox *landmark_combo = getChild<LLComboBox>( "landmark combo");
landmark_combo->selectFirstItem();
landmark_combo->setPrearrangeCallback( boost::bind(&LLFloaterWorldMap::onLandmarkComboPrearrange, this) );
- landmark_combo->setTextEntryCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) );
+ landmark_combo->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) );
mListLandmarkCombo = dynamic_cast<LLCtrlListInterface *>(landmark_combo);
mCurZoomVal = log(LLWorldMapView::sMapScale)/log(2.f);
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 56e671d902..86f9da6318 100755
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -1970,7 +1970,8 @@ void LLGroupMgr::processGroupBanRequest(const LLSD& content)
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(group_id);
if (!gdatap)
return;
-
+
+ gdatap->clearBanList();
LLSD::map_const_iterator i = content["ban_list"].beginMap();
LLSD::map_const_iterator iEnd = content["ban_list"].endMap();
for(;i != iEnd; ++i)
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 5d3a11e245..b8b6bdaa11 100755
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1295,8 +1295,15 @@ void LLIMModel::sendMessage(const std::string& utf8_text,
gAgent.sendReliableMessage();
}
+ bool is_group_chat = false;
+ LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(im_session_id);
+ if(session)
+ {
+ is_group_chat = session->isGroupSessionType();
+ }
+
// If there is a mute list and this is not a group chat...
- if ( LLMuteList::getInstance() )
+ if ( LLMuteList::getInstance() && !is_group_chat)
{
// ... the target should not be in our mute list for some message types.
// Auto-remove them if present.
@@ -1345,7 +1352,6 @@ void LLIMModel::sendMessage(const std::string& utf8_text,
if (is_not_group_id)
{
- LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(im_session_id);
if( session == 0)//??? shouldn't really happen
{
LLRecentPeople::instance().add(other_participant_id);
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 1dc5558555..a160d88b7d 100755
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -5673,12 +5673,8 @@ void LLWearableBridge::performAction(LLInventoryModel* model, std::string action
void LLWearableBridge::openItem()
{
- LLViewerInventoryItem* item = getItem();
-
- if (item)
- {
- LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
- }
+ performAction(getInventoryModel(),
+ get_is_item_worn(mUUID) ? "take_off" : "wear");
}
void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index c66e9da4a9..c054747308 100755
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -68,7 +68,8 @@ LLInventoryFilter::LLInventoryFilter(const Params& p)
: mName(p.name),
mFilterModified(FILTER_NONE),
mEmptyLookupMessage("InventoryNoMatchingItems"),
- mFilterOps(p.filter_ops),
+ mFilterOps(p.filter_ops),
+ mBackupFilterOps(mFilterOps),
mFilterSubString(p.substring),
mCurrentGeneration(0),
mFirstRequiredGeneration(0),
@@ -546,6 +547,21 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)
setModified(FILTER_RESTART);
}
+ // Cancel out filter links once the search string is modified
+ if (mFilterOps.mFilterLinks == FILTERLINK_ONLY_LINKS)
+ {
+ if (mBackupFilterOps.mFilterLinks == FILTERLINK_ONLY_LINKS)
+ {
+ // we started viewer/floater in 'only links' mode
+ mFilterOps.mFilterLinks = FILTERLINK_INCLUDE_LINKS;
+ }
+ else
+ {
+ mFilterOps = mBackupFilterOps;
+ setModified(FILTER_RESTART);
+ }
+ }
+
// Cancel out UUID once the search string is modified
if (mFilterOps.mFilterTypes == FILTERTYPE_UUID)
{
@@ -553,11 +569,6 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)
mFilterOps.mFilterUUID = LLUUID::null;
setModified(FILTER_RESTART);
}
-
- // Cancel out filter links once the search string is modified
- {
- mFilterOps.mFilterLinks = FILTERLINK_INCLUDE_LINKS;
- }
}
}
@@ -748,6 +759,22 @@ void LLInventoryFilter::setShowFolderState(EFolderShow state)
}
}
+void LLInventoryFilter::setFindAllLinksMode(const std::string &search_name, const LLUUID& search_id)
+{
+ // Save a copy of settings so that we will be able to restore it later
+ // but make sure we are not searching for links already
+ if(mFilterOps.mFilterLinks != FILTERLINK_ONLY_LINKS)
+ {
+ mBackupFilterOps = mFilterOps;
+ }
+
+ // set search options
+ setFilterSubString(search_name);
+ setFilterUUID(search_id);
+ setShowFolderState(SHOW_NON_EMPTY_FOLDERS);
+ setFilterLinks(FILTERLINK_ONLY_LINKS);
+}
+
void LLInventoryFilter::markDefault()
{
mDefaultFilterOps = mFilterOps;
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index 5e18ad4d20..6e35c48c7b 100755
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -193,6 +193,9 @@ public:
void setFilterLinks(U64 filter_link);
U64 getFilterLinks() const;
+ // sets params for Link-only search and backs up search settings for future restoration
+ void setFindAllLinksMode(const std::string &search_name, const LLUUID& search_id);
+
// +-------------------------------------------------------------------+
// + Execution And Results
// +-------------------------------------------------------------------+
@@ -267,6 +270,7 @@ private:
FilterOps mFilterOps;
FilterOps mDefaultFilterOps;
+ FilterOps mBackupFilterOps; // for backup purposes when leaving 'search link' mode
std::string mFilterSubString;
std::string mFilterSubStringOrig;
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 1abc09bf3b..a19eed73db 100755
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -458,7 +458,7 @@ void show_item_original(const LLUUID& item_uuid)
{
return;
}
- active_panel->setSelection(gInventory.getLinkedItemID(item_uuid), TAKE_FOCUS_NO);
+ active_panel->setSelection(gInventory.getLinkedItemID(item_uuid), TAKE_FOCUS_YES);
if(do_reset_inventory_filter)
{
diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp
index 8fb7550169..95a4db8a46 100755
--- a/indra/newview/lllocalbitmaps.cpp
+++ b/indra/newview/lllocalbitmaps.cpp
@@ -128,7 +128,7 @@ LLLocalBitmap::LLLocalBitmap(std::string filename)
LLLocalBitmap::~LLLocalBitmap()
{
// replace IDs with defaults, if set to do so.
- if(LL_LOCAL_REPLACE_ON_DEL && mValid) // fix for STORM-1837
+ if(LL_LOCAL_REPLACE_ON_DEL && mValid && gAgentAvatarp) // fix for STORM-1837
{
replaceIDs(mWorldID, IMG_DEFAULT);
LLLocalBitmapMgr::doRebake();
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 8d21fda8f9..cf04c5f7a5 100755
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -862,11 +862,14 @@ void LLLocationInputCtrl::refreshParcelIcons()
bool see_avs = current_parcel->getSeeAVs();
bool pathfinding_dynamic_enabled = agent_region->dynamicPathfindingEnabled();
+ bool is_parcel_owner = (gAgent.getID() == current_parcel->getOwnerID());
+ bool allow_group_modify = (gAgent.isInGroup(current_parcel->getGroupID()) && current_parcel->getAllowGroupModify());
+
// Most icons are "block this ability"
mParcelIcon[VOICE_ICON]->setVisible( !allow_voice );
mParcelIcon[FLY_ICON]->setVisible( !allow_fly );
mParcelIcon[PUSH_ICON]->setVisible( !allow_push );
- mParcelIcon[BUILD_ICON]->setVisible( !allow_build );
+ mParcelIcon[BUILD_ICON]->setVisible( !allow_build && !is_parcel_owner && !allow_group_modify );
mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
mParcelIcon[DAMAGE_ICON]->setVisible( allow_damage );
mParcelIcon[PATHFINDING_DIRTY_ICON]->setVisible(mIsNavMeshDirty);
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 648056484e..9a0bd9d1bc 100755
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -72,6 +72,7 @@
#include "bufferstream.h"
#include "llfasttimer.h"
#include "llcorehttputil.h"
+#include "lltrans.h"
#include "boost/lexical_cast.hpp"
@@ -693,12 +694,16 @@ void log_upload_error(LLCore::HttpStatus status, const LLSD& content,
args["MESSAGE"] = message;
args["IDENTIFIER"] = identifier;
args["LABEL"] = model_name;
- gMeshRepo.uploadError(args);
// Log details.
LL_WARNS(LOG_MESH) << "Error in stage: " << stage
<< ", Reason: " << status.toString()
<< " (" << status.toTerseString() << ")" << LL_ENDL;
+
+ std::ostringstream details;
+ typedef std::set<std::string> mav_errors_set_t;
+ mav_errors_set_t mav_errors;
+
if (content.has("error"))
{
const LLSD& err = content["error"];
@@ -708,8 +713,11 @@ void log_upload_error(LLCore::HttpStatus status, const LLSD& content,
<< "', message '" << err["message"].asString()
<< "', id '" << err["identifier"].asString()
<< "'" << LL_ENDL;
+
if (err.has("errors"))
{
+ details << std::endl << std::endl;
+
S32 error_num = 0;
const LLSD& err_list = err["errors"];
for (LLSD::array_const_iterator it = err_list.beginArray();
@@ -717,6 +725,13 @@ void log_upload_error(LLCore::HttpStatus status, const LLSD& content,
++it)
{
const LLSD& err_entry = *it;
+ std::string message = err_entry["message"];
+
+ if (message.length() > 0)
+ {
+ mav_errors.insert(message);
+ }
+
LL_WARNS(LOG_MESH) << " error[" << error_num << "]:" << LL_ENDL;
for (LLSD::map_const_iterator map_it = err_entry.beginMap();
map_it != err_entry.endMap();
@@ -733,6 +748,21 @@ void log_upload_error(LLCore::HttpStatus status, const LLSD& content,
{
LL_WARNS(LOG_MESH) << "Bad response to mesh request, no additional error information available." << LL_ENDL;
}
+
+ mav_errors_set_t::iterator mav_errors_it = mav_errors.begin();
+ for (; mav_errors_it != mav_errors.end(); ++mav_errors_it)
+ {
+ std::string mav_details = "Mav_Details_" + *mav_errors_it;
+ details << "Message: '" << *mav_errors_it << "': " << LLTrans::getString(mav_details) << std::endl << std::endl;
+ }
+
+ std::string details_str = details.str();
+ if (details_str.length() > 0)
+ {
+ args["DETAILS"] = details_str;
+ }
+
+ gMeshRepo.uploadError(args);
}
LLMeshRepoThread::LLMeshRepoThread()
diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp
index 65ac11092c..d79baf90e7 100755
--- a/indra/newview/llmutelist.cpp
+++ b/indra/newview/llmutelist.cpp
@@ -646,6 +646,22 @@ BOOL LLMuteList::isMuted(const LLUUID& id, const std::string& name, U32 flags) c
return legacy_it != mLegacyMutes.end();
}
+BOOL LLMuteList::isMuted(const std::string& username, U32 flags) const
+{
+ mute_set_t::const_iterator mute_iter = mMutes.begin();
+ while(mute_iter != mMutes.end())
+ {
+ // can't convert "leha.test" into "LeHa TesT" so username comparison is more reliable
+ if (mute_iter->mType == LLMute::AGENT
+ && LLCacheName::buildUsername(mute_iter->mName) == username)
+ {
+ return TRUE;
+ }
+ mute_iter++;
+ }
+ return FALSE;
+}
+
//-----------------------------------------------------------------------------
// requestFromServer()
//-----------------------------------------------------------------------------
diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h
index 3e998b4f0e..4e7b6ee880 100755
--- a/indra/newview/llmutelist.h
+++ b/indra/newview/llmutelist.h
@@ -101,7 +101,10 @@ public:
// Name is required to test against legacy text-only mutes.
BOOL isMuted(const LLUUID& id, const std::string& name = LLStringUtil::null, U32 flags = 0) const;
-
+
+ // Workaround for username-based mute search, a lot of string conversions so use cautiously
+ BOOL isMuted(const std::string& username, U32 flags = 0) const;
+
// Alternate (convenience) form for places we don't need to pass the name, but do need flags
BOOL isMuted(const LLUUID& id, U32 flags) const { return isMuted(id, LLStringUtil::null, flags); };
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 54e4c6c1da..79988a0800 100755
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -70,7 +70,7 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p)
// public
LLScrollListItem* LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos,
- BOOL enabled, const std::string& suffix)
+ BOOL enabled, const std::string& suffix, const std::string& prefix)
{
//LL_INFOS() << "LLNameListCtrl::addNameItem " << agent_id << LL_ENDL;
@@ -79,7 +79,7 @@ LLScrollListItem* LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPositi
item.enabled = enabled;
item.target = INDIVIDUAL;
- return addNameItemRow(item, pos, suffix);
+ return addNameItemRow(item, pos, suffix, prefix);
}
// virtual, public
@@ -291,7 +291,8 @@ LLScrollListItem* LLNameListCtrl::addElement(const LLSD& element, EAddPosition p
LLScrollListItem* LLNameListCtrl::addNameItemRow(
const LLNameListCtrl::NameItem& name_item,
EAddPosition pos,
- const std::string& suffix)
+ const std::string& suffix,
+ const std::string& prefix)
{
LLUUID id = name_item.value().asUUID();
LLNameListItem* item = new LLNameListItem(name_item,name_item.target() == GROUP);
@@ -365,7 +366,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(
LLScrollListCell* cell = item->getColumn(mNameColumnIndex);
if (cell)
{
- cell->setValue(fullname);
+ cell->setValue(prefix + fullname);
}
dirtyColumns();
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index 2c40eeaaca..515962df7d 100755
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -129,11 +129,12 @@ public:
// Add a user to the list by name. It will be added, the name
// requested from the cache, and updated as necessary.
LLScrollListItem* addNameItem(const LLUUID& agent_id, EAddPosition pos = ADD_BOTTOM,
- BOOL enabled = TRUE, const std::string& suffix = LLStringUtil::null);
+ BOOL enabled = TRUE, const std::string& suffix = LLStringUtil::null, const std::string& prefix = LLStringUtil::null);
LLScrollListItem* addNameItem(NameItem& item, EAddPosition pos = ADD_BOTTOM);
/*virtual*/ LLScrollListItem* addElement(const LLSD& element, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL);
- LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, const std::string& suffix = LLStringUtil::null);
+ LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, const std::string& suffix = LLStringUtil::null,
+ const std::string& prefix = LLStringUtil::null);
// Add a user to the list by name. It will be added, the name
// requested from the cache, and updated as necessary.
diff --git a/indra/newview/llpanelgroupbulk.cpp b/indra/newview/llpanelgroupbulk.cpp
index 76792cc6fd..cffda02aa0 100644
--- a/indra/newview/llpanelgroupbulk.cpp
+++ b/indra/newview/llpanelgroupbulk.cpp
@@ -97,6 +97,7 @@ void LLPanelGroupBulkImpl::callbackClickAdd(void* userdata)
if(picker)
{
root_floater->addDependentFloater(picker);
+ LLGroupMgr::getInstance()->sendCapGroupMembersRequest(panelp->mImplementation->mGroupID);
}
}
}
diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
index a660cb3b21..d4894d4a42 100755
--- a/indra/newview/llpanellandmarkinfo.cpp
+++ b/indra/newview/llpanellandmarkinfo.cpp
@@ -128,6 +128,10 @@ void LLPanelLandmarkInfo::setInfoType(EInfoType type)
LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
std::string name = parcel_mgr->getAgentParcelName();
LLVector3 agent_pos = gAgent.getPositionAgent();
+
+ std::string desc;
+ LLAgentUI::buildLocationString(desc, LLAgentUI::LOCATION_FORMAT_FULL, agent_pos);
+ mNotesEditor->setText(desc);
if (name.empty())
{
@@ -143,7 +147,7 @@ void LLPanelLandmarkInfo::setInfoType(EInfoType type)
}
else
{
- region_name = getString("unknown");
+ region_name = desc;
}
mLandmarkTitleEditor->setText(llformat("%s (%d, %d, %d)",
@@ -154,10 +158,6 @@ void LLPanelLandmarkInfo::setInfoType(EInfoType type)
mLandmarkTitleEditor->setText(name);
}
- std::string desc;
- LLAgentUI::buildLocationString(desc, LLAgentUI::LOCATION_FORMAT_FULL, agent_pos);
- mNotesEditor->setText(desc);
-
// Moved landmark creation here from LLPanelLandmarkInfo::processParcelInfo()
// because we use only agent's current coordinates instead of waiting for
// remote parcel request to complete.
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index cc8c3edd51..953f234a53 100755
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -229,7 +229,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
}
}
server_choice_combo->sortByName();
- server_choice_combo->addSeparator(ADD_TOP);
LL_DEBUGS("AppInit")<<"adding current "<<current_grid<<LL_ENDL;
server_choice_combo->add(LLGridManager::getInstance()->getGridLabel(),
current_grid,
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 17c0b226d0..7aaf9510eb 100755
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -1134,14 +1134,12 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
const std::string &item_name = current_item->getViewModelItem()->getName();
mFilterSubString = item_name;
+
LLInventoryFilter &filter = mActivePanel->getFilter();
- filter.setFilterSubString(item_name);
- mFilterEditor->setText(item_name);
+ filter.setFindAllLinksMode(item_name, item_id);
+ mFilterEditor->setText(item_name);
mFilterEditor->setFocus(TRUE);
- filter.setFilterUUID(item_id);
- filter.setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- filter.setFilterLinks(LLInventoryFilter::FILTERLINK_ONLY_LINKS);
}
}
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index bf15f56b44..1ae9d916b3 100755
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -1163,7 +1163,13 @@ void LLTaskNotecardBridge::openItem()
{
return;
}
- if(object->permModify() || gAgent.isGodlike())
+
+ // Note: even if we are not allowed to modify copyable notecard, we should be able to view it
+ LLInventoryItem *item = dynamic_cast<LLInventoryItem*>(object->getInventoryObject(mUUID));
+ BOOL item_copy = item && gAgent.allowOperation(PERM_COPY, item->getPermissions(), GP_OBJECT_MANIPULATE);
+ if( item_copy
+ || object->permModify()
+ || gAgent.isGodlike())
{
LLPreviewNotecard* preview = LLFloaterReg::showTypedInstance<LLPreviewNotecard>("preview_notecard", LLSD(mUUID), TAKE_FOCUS_YES);
if (preview)
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index e853b2d050..1a665d4c1d 100755
--- a/indra/newview/llpanelplaceprofile.cpp
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -53,6 +53,8 @@
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
+const F64 COVENANT_REFRESH_TIME_SEC = 60.0f;
+
static LLPanelInjector<LLPanelPlaceProfile> t_place_profile("panel_place_profile");
// Statics for textures filenames
@@ -76,6 +78,7 @@ static std::string icon_see_avs_off;
LLPanelPlaceProfile::LLPanelPlaceProfile()
: LLPanelPlaceInfo(),
+ mNextCovenantUpdateTime(0),
mForSalePanel(NULL),
mYouAreHerePanel(NULL),
mSelectedParcelID(-1),
@@ -162,6 +165,9 @@ BOOL LLPanelPlaceProfile::postBuild()
icon_see_avs_on = getString("icon_SeeAVs_On");
icon_see_avs_off = getString("icon_SeeAVs_Off");
+ mLastSelectedRegionID = LLUUID::null;
+ mNextCovenantUpdateTime = 0;
+
return TRUE;
}
@@ -170,6 +176,9 @@ void LLPanelPlaceProfile::resetLocation()
{
LLPanelPlaceInfo::resetLocation();
+ mLastSelectedRegionID = LLUUID::null;
+ mNextCovenantUpdateTime = 0;
+
mForSalePanel->setVisible(FALSE);
mYouAreHerePanel->setVisible(FALSE);
@@ -330,13 +339,20 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
if (!region || !parcel)
return;
- // send EstateCovenantInfo message
- LLMessageSystem *msg = gMessageSystem;
- msg->newMessage("EstateCovenantRequest");
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
- msg->sendReliable(region->getHost());
+ if (mLastSelectedRegionID != region->getRegionID()
+ || mNextCovenantUpdateTime < LLTimer::getElapsedSeconds())
+ {
+ // send EstateCovenantInfo message
+ // Note: LLPanelPlaceProfile doesn't change Covenant's content and any
+ // changes made by Estate floater should be requested by Estate floater
+ LLMessageSystem *msg = gMessageSystem;
+ msg->newMessage("EstateCovenantRequest");
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
+ msg->sendReliable(region->getHost());
+ mNextCovenantUpdateTime = LLTimer::getElapsedSeconds() + COVENANT_REFRESH_TIME_SEC;
+ }
LLParcelData parcel_data;
diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h
index 4547e14b2e..3d2654fc12 100755
--- a/indra/newview/llpanelplaceprofile.h
+++ b/indra/newview/llpanelplaceprofile.h
@@ -71,6 +71,7 @@ private:
*/
S32 mSelectedParcelID;
LLUUID mLastSelectedRegionID;
+ F64 mNextCovenantUpdateTime; //seconds since client start
LLPanel* mForSalePanel;
LLPanel* mYouAreHerePanel;
diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp
index c8a201a5c8..c55e230b5e 100755
--- a/indra/newview/llpanelsnapshotinventory.cpp
+++ b/indra/newview/llpanelsnapshotinventory.cpp
@@ -48,6 +48,8 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
+ void onResolutionCommit(LLUICtrl* ctrl);
+
private:
/*virtual*/ std::string getWidthSpinnerName() const { return "inventory_snapshot_width"; }
/*virtual*/ std::string getHeightSpinnerName() const { return "inventory_snapshot_height"; }
@@ -72,6 +74,8 @@ BOOL LLPanelSnapshotInventory::postBuild()
{
getChild<LLSpinCtrl>(getWidthSpinnerName())->setAllowEdit(FALSE);
getChild<LLSpinCtrl>(getHeightSpinnerName())->setAllowEdit(FALSE);
+
+ getChild<LLUICtrl>(getImageSizeComboName())->setCommitCallback(boost::bind(&LLPanelSnapshotInventory::onResolutionCommit, this, _1));
return LLPanelSnapshot::postBuild();
}
@@ -89,6 +93,13 @@ void LLPanelSnapshotInventory::updateControls(const LLSD& info)
getChild<LLUICtrl>("save_btn")->setEnabled(have_snapshot);
}
+void LLPanelSnapshotInventory::onResolutionCommit(LLUICtrl* ctrl)
+{
+ BOOL current_window_selected = (getChild<LLComboBox>(getImageSizeComboName())->getCurrentIndex() == 3);
+ getChild<LLSpinCtrl>(getWidthSpinnerName())->setVisible(!current_window_selected);
+ getChild<LLSpinCtrl>(getHeightSpinnerName())->setVisible(!current_window_selected);
+}
+
void LLPanelSnapshotInventory::onSend()
{
LLFloaterSnapshot::saveTexture();
diff --git a/indra/newview/llpanelsnapshotlocal.cpp b/indra/newview/llpanelsnapshotlocal.cpp
index 43e38b95e2..01dfdc4ece 100755
--- a/indra/newview/llpanelsnapshotlocal.cpp
+++ b/indra/newview/llpanelsnapshotlocal.cpp
@@ -58,6 +58,8 @@ private:
/*virtual*/ LLFloaterSnapshot::ESnapshotFormat getImageFormat() const;
/*virtual*/ void updateControls(const LLSD& info);
+ S32 mLocalFormat;
+
void onFormatComboCommit(LLUICtrl* ctrl);
void onQualitySliderCommit(LLUICtrl* ctrl);
void onSaveFlyoutCommit(LLUICtrl* ctrl);
@@ -67,6 +69,7 @@ static LLPanelInjector<LLPanelSnapshotLocal> panel_class("llpanelsnapshotlocal")
LLPanelSnapshotLocal::LLPanelSnapshotLocal()
{
+ mLocalFormat = gSavedSettings.getS32("SnapshotFormat");
mCommitCallbackRegistrar.add("Local.Cancel", boost::bind(&LLPanelSnapshotLocal::cancel, this));
}
@@ -83,6 +86,10 @@ BOOL LLPanelSnapshotLocal::postBuild()
// virtual
void LLPanelSnapshotLocal::onOpen(const LLSD& key)
{
+ if(gSavedSettings.getS32("SnapshotFormat") != mLocalFormat)
+ {
+ getChild<LLComboBox>("local_format_combo")->selectNthItem(mLocalFormat);
+ }
LLPanelSnapshot::onOpen(key);
}
@@ -129,6 +136,7 @@ void LLPanelSnapshotLocal::updateControls(const LLSD& info)
void LLPanelSnapshotLocal::onFormatComboCommit(LLUICtrl* ctrl)
{
+ mLocalFormat = getImageFormat();
// will call updateControls()
LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true));
}
diff --git a/indra/newview/llpanelsnapshotoptions.cpp b/indra/newview/llpanelsnapshotoptions.cpp
index 0fc9ceec83..f41bdd8881 100755
--- a/indra/newview/llpanelsnapshotoptions.cpp
+++ b/indra/newview/llpanelsnapshotoptions.cpp
@@ -56,7 +56,6 @@ private:
void updateUploadCost();
void openPanel(const std::string& panel_name);
void onSaveToProfile();
- void onSaveToEmail();
void onSaveToInventory();
void onSaveToComputer();
void onSendToFacebook();
@@ -69,7 +68,6 @@ static LLPanelInjector<LLPanelSnapshotOptions> panel_class("llpanelsnapshotoptio
LLPanelSnapshotOptions::LLPanelSnapshotOptions()
{
mCommitCallbackRegistrar.add("Snapshot.SaveToProfile", boost::bind(&LLPanelSnapshotOptions::onSaveToProfile, this));
- mCommitCallbackRegistrar.add("Snapshot.SaveToEmail", boost::bind(&LLPanelSnapshotOptions::onSaveToEmail, this));
mCommitCallbackRegistrar.add("Snapshot.SaveToInventory", boost::bind(&LLPanelSnapshotOptions::onSaveToInventory, this));
mCommitCallbackRegistrar.add("Snapshot.SaveToComputer", boost::bind(&LLPanelSnapshotOptions::onSaveToComputer, this));
mCommitCallbackRegistrar.add("Snapshot.SendToFacebook", boost::bind(&LLPanelSnapshotOptions::onSendToFacebook, this));
@@ -120,11 +118,6 @@ void LLPanelSnapshotOptions::onSaveToProfile()
openPanel("panel_snapshot_profile");
}
-void LLPanelSnapshotOptions::onSaveToEmail()
-{
- openPanel("panel_snapshot_postcard");
-}
-
void LLPanelSnapshotOptions::onSaveToInventory()
{
openPanel("panel_snapshot_inventory");
diff --git a/indra/newview/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp
deleted file mode 100755
index 8e37b1418c..0000000000
--- a/indra/newview/llpanelsnapshotpostcard.cpp
+++ /dev/null
@@ -1,244 +0,0 @@
-/**
- * @file llpanelsnapshotpostcard.cpp
- * @brief Postcard sending panel.
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llcombobox.h"
-#include "llnotificationsutil.h"
-#include "llsidetraypanelcontainer.h"
-#include "llsliderctrl.h"
-#include "llspinctrl.h"
-#include "lltexteditor.h"
-
-#include "llagent.h"
-#include "llagentui.h"
-#include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model
-#include "llpanelsnapshot.h"
-#include "llpostcard.h"
-#include "llviewercontrol.h" // gSavedSettings
-#include "llviewerwindow.h"
-
-#include <boost/regex.hpp>
-
-/**
- * Sends postcard via email.
- */
-class LLPanelSnapshotPostcard
-: public LLPanelSnapshot
-{
- LOG_CLASS(LLPanelSnapshotPostcard);
-
-public:
- LLPanelSnapshotPostcard();
- /*virtual*/ BOOL postBuild();
- /*virtual*/ void onOpen(const LLSD& key);
- /*virtual*/ S32 notify(const LLSD& info);
-
-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*/ LLFloaterSnapshot::ESnapshotFormat getImageFormat() const { return LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG; }
- /*virtual*/ void updateControls(const LLSD& info);
-
- bool missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response);
- void sendPostcard();
-
- void onMsgFormFocusRecieved();
- void onFormatComboCommit(LLUICtrl* ctrl);
- void onQualitySliderCommit(LLUICtrl* ctrl);
- void onSend();
-
- bool mHasFirstMsgFocus;
- std::string mAgentEmail;
-};
-
-static LLPanelInjector<LLPanelSnapshotPostcard> panel_class("llpanelsnapshotpostcard");
-
-LLPanelSnapshotPostcard::LLPanelSnapshotPostcard()
-: mHasFirstMsgFocus(false)
-{
- mCommitCallbackRegistrar.add("Postcard.Send", boost::bind(&LLPanelSnapshotPostcard::onSend, this));
- mCommitCallbackRegistrar.add("Postcard.Cancel", boost::bind(&LLPanelSnapshotPostcard::cancel, this));
-
-}
-
-// virtual
-BOOL LLPanelSnapshotPostcard::postBuild()
-{
- // pick up the user's up-to-date email address
- gAgent.sendAgentUserInfoRequest();
-
- std::string name_string;
- LLAgentUI::buildFullname(name_string);
- getChild<LLUICtrl>("name_form")->setValue(LLSD(name_string));
-
- // For the first time a user focuses to .the msg box, all text will be selected.
- getChild<LLUICtrl>("msg_form")->setFocusChangedCallback(boost::bind(&LLPanelSnapshotPostcard::onMsgFormFocusRecieved, this));
-
- getChild<LLUICtrl>("to_form")->setFocus(TRUE);
-
- getChild<LLUICtrl>("image_quality_slider")->setCommitCallback(boost::bind(&LLPanelSnapshotPostcard::onQualitySliderCommit, this, _1));
-
- return LLPanelSnapshot::postBuild();
-}
-
-// virtual
-void LLPanelSnapshotPostcard::onOpen(const LLSD& key)
-{
- LLPanelSnapshot::onOpen(key);
-}
-
-// virtual
-S32 LLPanelSnapshotPostcard::notify(const LLSD& info)
-{
- if (!info.has("agent-email"))
- {
- llassert(info.has("agent-email"));
- return 0;
- }
-
- if (mAgentEmail.empty())
- {
- mAgentEmail = info["agent-email"].asString();
- }
-
- return 1;
-}
-
-// virtual
-void LLPanelSnapshotPostcard::updateControls(const LLSD& info)
-{
- getChild<LLUICtrl>("image_quality_slider")->setValue(gSavedSettings.getS32("SnapshotQuality"));
- updateImageQualityLevel();
-
- const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true;
- getChild<LLUICtrl>("send_btn")->setEnabled(have_snapshot);
-}
-
-bool LLPanelSnapshotPostcard::missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if(0 == option)
- {
- // User clicked OK
- if((getChild<LLUICtrl>("subject_form")->getValue().asString()).empty())
- {
- // Stuff the subject back into the form.
- getChild<LLUICtrl>("subject_form")->setValue(getString("default_subject"));
- }
-
- if (!mHasFirstMsgFocus)
- {
- // The user never switched focus to the message window.
- // Using the default string.
- getChild<LLUICtrl>("msg_form")->setValue(getString("default_message"));
- }
-
- sendPostcard();
- }
- return false;
-}
-
-
-void LLPanelSnapshotPostcard::sendPostcard()
-{
- std::string to(getChild<LLUICtrl>("to_form")->getValue().asString());
- std::string subject(getChild<LLUICtrl>("subject_form")->getValue().asString());
-
- LLSD postcard = LLSD::emptyMap();
- postcard["pos-global"] = LLFloaterSnapshot::getPosTakenGlobal().getValue();
- postcard["to"] = to;
- postcard["from"] = mAgentEmail;
- postcard["name"] = getChild<LLUICtrl>("name_form")->getValue().asString();
- postcard["subject"] = subject;
- postcard["msg"] = getChild<LLUICtrl>("msg_form")->getValue().asString();
- LLPostCard::send(LLFloaterSnapshot::getImageData(), postcard);
-
- // Give user feedback of the event.
- gViewerWindow->playSnapshotAnimAndSound();
-
- LLFloaterSnapshot::postSave();
-}
-
-void LLPanelSnapshotPostcard::onMsgFormFocusRecieved()
-{
- LLTextEditor* msg_form = getChild<LLTextEditor>("msg_form");
- if (msg_form->hasFocus() && !mHasFirstMsgFocus)
- {
- mHasFirstMsgFocus = true;
- msg_form->setText(LLStringUtil::null);
- }
-}
-
-void LLPanelSnapshotPostcard::onFormatComboCommit(LLUICtrl* ctrl)
-{
- // will call updateControls()
- LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true));
-}
-
-void LLPanelSnapshotPostcard::onQualitySliderCommit(LLUICtrl* ctrl)
-{
- updateImageQualityLevel();
-
- LLSliderCtrl* slider = (LLSliderCtrl*)ctrl;
- S32 quality_val = llfloor((F32)slider->getValue().asReal());
- LLSD info;
- info["image-quality-change"] = quality_val;
- LLFloaterSnapshot::getInstance()->notify(info); // updates the "SnapshotQuality" setting
-}
-
-void LLPanelSnapshotPostcard::onSend()
-{
- // Validate input.
- std::string to(getChild<LLUICtrl>("to_form")->getValue().asString());
-
- boost::regex email_format("[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}(,[ \t]*[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,})*");
-
- if (to.empty() || !boost::regex_match(to, email_format))
- {
- LLNotificationsUtil::add("PromptRecipientEmail");
- return;
- }
-
- if (mAgentEmail.empty() || !boost::regex_match(mAgentEmail, email_format))
- {
- LLNotificationsUtil::add("PromptSelfEmail");
- return;
- }
-
- std::string subject(getChild<LLUICtrl>("subject_form")->getValue().asString());
- if(subject.empty() || !mHasFirstMsgFocus)
- {
- LLNotificationsUtil::add("PromptMissingSubjMsg", LLSD(), LLSD(), boost::bind(&LLPanelSnapshotPostcard::missingSubjMsgAlertCallback, this, _1, _2));
- return;
- }
-
- // Send postcard.
- sendPostcard();
-}
diff --git a/indra/newview/llpaneltopinfobar.cpp b/indra/newview/llpaneltopinfobar.cpp
index 109013498e..ac9a31ce4e 100755
--- a/indra/newview/llpaneltopinfobar.cpp
+++ b/indra/newview/llpaneltopinfobar.cpp
@@ -313,11 +313,14 @@ void LLPanelTopInfoBar::updateParcelIcons()
bool allow_damage = vpm->allowAgentDamage(agent_region, current_parcel);
bool see_avs = current_parcel->getSeeAVs();
+ bool is_parcel_owner = (gAgent.getID() == current_parcel->getOwnerID());
+ bool allow_group_modify = (gAgent.isInGroup(current_parcel->getGroupID()) && current_parcel->getAllowGroupModify());
+
// Most icons are "block this ability"
mParcelIcon[VOICE_ICON]->setVisible( !allow_voice );
mParcelIcon[FLY_ICON]->setVisible( !allow_fly );
mParcelIcon[PUSH_ICON]->setVisible( !allow_push );
- mParcelIcon[BUILD_ICON]->setVisible( !allow_build );
+ mParcelIcon[BUILD_ICON]->setVisible( !allow_build && !is_parcel_owner && !allow_group_modify );
mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
mParcelIcon[DAMAGE_ICON]->setVisible( allow_damage );
mDamageText->setVisible(allow_damage);
diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp
index bf2652cb49..fb21b980dc 100755
--- a/indra/newview/llpreview.cpp
+++ b/indra/newview/llpreview.cpp
@@ -49,6 +49,7 @@
#include "llviewerinventory.h"
#include "llviewerwindow.h"
#include "lltrans.h"
+#include "roles_constants.h"
// Constants
@@ -230,8 +231,23 @@ void LLPreview::refreshFromItem()
}
getChild<LLUICtrl>("desc")->setValue(item->getDescription());
- BOOL can_agent_manipulate = item->getPermissions().allowModifyBy(gAgent.getID());
- getChildView("desc")->setEnabled(can_agent_manipulate);
+ getChildView("desc")->setEnabled(canModify(mObjectUUID, item));
+}
+
+// static
+BOOL LLPreview::canModify(const LLUUID taskUUID, const LLInventoryItem* item)
+{
+ if (taskUUID.notNull())
+ {
+ LLViewerObject* object = gObjectList.findObject(taskUUID);
+ if(object && !object->permModify())
+ {
+ // No permission to edit in-world inventory
+ return FALSE;
+ }
+ }
+
+ return item && gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE);
}
// static
diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h
index 759430c3a5..49c114720b 100755
--- a/indra/newview/llpreview.h
+++ b/indra/newview/llpreview.h
@@ -105,7 +105,11 @@ public:
// llview
/*virtual*/ void draw();
void refreshFromItem();
-
+
+ // We can't modify Item or description in preview if either in-world Object
+ // or Item itself is unmodifiable
+ static BOOL canModify(const LLUUID taskUUID, const LLInventoryItem* item);
+
protected:
virtual void onCommit();
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index 1308d1e9a7..9f88b0db5f 100755
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -218,7 +218,7 @@ void LLPreviewNotecard::loadAsset()
LLPermissions perm(item->getPermissions());
BOOL is_owner = gAgent.allowOperation(PERM_OWNER, perm, GP_OBJECT_MANIPULATE);
BOOL allow_copy = gAgent.allowOperation(PERM_COPY, perm, GP_OBJECT_MANIPULATE);
- BOOL allow_modify = gAgent.allowOperation(PERM_MODIFY, perm, GP_OBJECT_MANIPULATE);
+ BOOL allow_modify = canModify(mObjectUUID, item);
if (allow_copy || gAgent.isGodlike())
{
@@ -338,10 +338,7 @@ void LLPreviewNotecard::onLoadComplete(LLVFS *vfs,
}
previewEditor->makePristine();
-
- const LLInventoryItem* item = preview->getItem();
- BOOL modifiable = item && gAgent.allowOperation(PERM_MODIFY,
- item->getPermissions(), GP_OBJECT_MANIPULATE);
+ BOOL modifiable = preview->canModify(preview->mObjectID, preview->getItem());
preview->setEnabled(modifiable);
preview->mAssetStatus = PREVIEW_ASSET_LOADED;
}
diff --git a/indra/newview/llscenemonitor.cpp b/indra/newview/llscenemonitor.cpp
index 179a73413e..02912f12a9 100644
--- a/indra/newview/llscenemonitor.cpp
+++ b/indra/newview/llscenemonitor.cpp
@@ -39,6 +39,7 @@
#include "llspatialpartition.h"
#include "llagent.h"
#include "pipeline.h"
+#include "llviewerparcelmgr.h"
#include "llviewerpartsim.h"
LLSceneMonitorView* gSceneMonitorView = NULL;
@@ -702,6 +703,13 @@ LLSceneMonitorView::LLSceneMonitorView(const LLRect& rect)
setCanMinimize(false);
setCanClose(true);
+
+ sTeleportFinishConnection = LLViewerParcelMgr::getInstance()->setTeleportFinishedCallback(boost::bind(&LLSceneMonitorView::onTeleportFinished, this));
+}
+
+LLSceneMonitorView::~LLSceneMonitorView()
+{
+ sTeleportFinishConnection.disconnect();
}
void LLSceneMonitorView::onClose(bool app_quitting)
@@ -714,6 +722,14 @@ void LLSceneMonitorView::onClickCloseBtn(bool app_quitting)
setVisible(false);
}
+void LLSceneMonitorView::onTeleportFinished()
+{
+ if(isInVisibleChain())
+ {
+ LLSceneMonitor::getInstance()->reset();
+ }
+}
+
void LLSceneMonitorView::onVisibilityChange(BOOL visible)
{
if (!LLGLSLShader::sNoFixedFunction && visible)
diff --git a/indra/newview/llscenemonitor.h b/indra/newview/llscenemonitor.h
index 5bde3b5aab..2b6ea57b96 100644
--- a/indra/newview/llscenemonitor.h
+++ b/indra/newview/llscenemonitor.h
@@ -64,10 +64,12 @@ public:
void dumpToFile(std::string file_name);
bool hasResults() const { return mSceneLoadRecording.getResults().getDuration() != S32Seconds(0);}
+ void reset();
+
private:
void freezeScene();
void unfreezeScene();
- void reset();
+
LLRenderTarget& getCaptureTarget();
void generateDitheringTexture(S32 width, S32 height);
@@ -109,7 +111,7 @@ class LLSceneMonitorView : public LLFloater
{
public:
LLSceneMonitorView(const LLRect& rect);
-
+ ~LLSceneMonitorView();
virtual void draw();
virtual void onVisibilityChange(BOOL visible);
@@ -117,6 +119,8 @@ public:
protected:
virtual void onClose(bool app_quitting=false);
virtual void onClickCloseBtn(bool app_quitting=false);
+ void onTeleportFinished();
+ boost::signals2::connection sTeleportFinishConnection;
};
extern LLSceneMonitorView* gSceneMonitorView;
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index fdc95c7784..cbc00d8b53 100755
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -619,10 +619,41 @@ bool LLSelectMgr::linkObjects()
bool LLSelectMgr::unlinkObjects()
{
+ LLViewerObject *object = mSelectedObjects->getFirstRootObject();
+ if (!object) return false;
+
+ S32 min_objects_for_confirm = gSavedSettings.getS32("MinObjectsForUnlinkConfirm");
+ for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); iter != getSelection()->root_end(); iter++)
+ {
+ object = (*iter)->getObject();
+ if(object)
+ {
+ S32 objects_in_linkset = object->numChildren() + 1;
+ if(objects_in_linkset >= min_objects_for_confirm)
+ {
+ LLNotificationsUtil::add("ConfirmUnlink", LLSD(), LLSD(), boost::bind(&LLSelectMgr::confirmUnlinkObjects, this, _1, _2));
+ return true;
+ }
+ }
+ }
+
LLSelectMgr::getInstance()->sendDelink();
return true;
}
+void LLSelectMgr::confirmUnlinkObjects(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ // if Cancel pressed
+ if (option == 1)
+ {
+ return;
+ }
+
+ LLSelectMgr::getInstance()->sendDelink();
+ return;
+}
+
// in order to link, all objects must have the same owner, and the
// agent must have the ability to modify all of the objects. However,
// we're not answering that question with this method. The question
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 23c41e4cc1..316e72b11c 100755
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -506,6 +506,8 @@ public:
bool unlinkObjects();
+ void confirmUnlinkObjects(const LLSD& notification, const LLSD& response);
+
bool enableLinkObjects();
bool enableUnlinkObjects();
diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp
index 728fc69723..a8e012bfa1 100755
--- a/indra/newview/llslurl.cpp
+++ b/indra/newview/llslurl.cpp
@@ -271,7 +271,14 @@ LLSLURL::LLSLURL(const std::string& slurl)
// at this point, head of the path array should be [ <region>, <x>, <y>, <z> ] where x, y and z
// are collectively optional
// are optional
+
mRegion = LLURI::unescape(path_array[0].asString());
+
+ if(LLStringUtil::containsNonprintable(mRegion))
+ {
+ LLStringUtil::stripNonprintable(mRegion);
+ }
+
path_array.erase(0);
// parse the x, y, and optionally z
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index 0ae8a338e0..318d1e2861 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -86,7 +86,7 @@ LLSnapshotLivePreview::LLSnapshotLivePreview (const LLSnapshotLivePreview::Param
mNeedsFlash(TRUE),
mSnapshotQuality(gSavedSettings.getS32("SnapshotQuality")),
mDataSize(0),
- mSnapshotType(SNAPSHOT_POSTCARD),
+ mSnapshotType(SNAPSHOT_LOCAL),
mSnapshotFormat(LLFloaterSnapshot::ESnapshotFormat(gSavedSettings.getS32("SnapshotFormat"))),
mSnapshotUpToDate(FALSE),
mCameraPos(LLViewerCamera::getInstance()->getOrigin()),
@@ -194,8 +194,9 @@ void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail
// Stop shining animation.
mShineAnimTimer.stop();
+ mSnapshotDelayTimer.setTimerExpirySec(delay);
mSnapshotDelayTimer.start();
- mSnapshotDelayTimer.setTimerExpirySec(delay);
+
mPosTakenGlobal = gAgentCamera.getCameraPositionGlobal();
diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h
index fed33bf37c..f479de59d4 100644
--- a/indra/newview/llsnapshotlivepreview.h
+++ b/indra/newview/llsnapshotlivepreview.h
@@ -42,7 +42,7 @@ class LLSnapshotLivePreview : public LLView
public:
enum ESnapshotType
{
- SNAPSHOT_POSTCARD,
+ SNAPSHOT_POSTCARD_DEPRECIATED,
SNAPSHOT_TEXTURE,
SNAPSHOT_LOCAL,
SNAPSHOT_WEB
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 42fc300187..e519032b9e 100755
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -240,7 +240,8 @@ static LLVector3 gAgentStartLookAt(1.0f, 0.f, 0.f);
static std::string gAgentStartLocation = "safe";
static bool mLoginStatePastUI = false;
-const S32 DEFAULT_MAX_AGENT_GROUPS = 25;
+const S32 DEFAULT_MAX_AGENT_GROUPS = 42;
+const S32 ALLOWED_MAX_AGENT_GROUPS = 500;
boost::scoped_ptr<LLEventPump> LLStartUp::sStateWatcher(new LLEventStream("StartupState"));
boost::scoped_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener());
@@ -3491,15 +3492,24 @@ bool process_login_success_response()
LLViewerMedia::openIDSetup(openid_url, openid_token);
}
- if(response.has("max-agent-groups")) {
- std::string max_agent_groups(response["max-agent-groups"]);
- gMaxAgentGroups = atoi(max_agent_groups.c_str());
- LL_INFOS("LLStartup") << "gMaxAgentGroups read from login.cgi: "
- << gMaxAgentGroups << LL_ENDL;
+ gMaxAgentGroups = DEFAULT_MAX_AGENT_GROUPS;
+ if(response.has("max-agent-groups"))
+ {
+ S32 agent_groups = atoi(std::string(response["max-agent-groups"]).c_str());
+ if (agent_groups > 0 && agent_groups <= ALLOWED_MAX_AGENT_GROUPS)
+ {
+ gMaxAgentGroups = agent_groups;
+ LL_INFOS("LLStartup") << "gMaxAgentGroups read from login.cgi: "
+ << gMaxAgentGroups << LL_ENDL;
+ }
+ else
+ {
+ LL_INFOS("LLStartup") << "Invalid value received, using defaults for gMaxAgentGroups: "
+ << gMaxAgentGroups << LL_ENDL;
+ }
}
else {
- gMaxAgentGroups = DEFAULT_MAX_AGENT_GROUPS;
- LL_INFOS("LLStartup") << "using gMaxAgentGroups default: "
+ LL_INFOS("LLStartup") << "Missing max-agent-groups, using default value for gMaxAgentGroups: "
<< gMaxAgentGroups << LL_ENDL;
}
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 717807f513..980810835e 100755
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -188,6 +188,7 @@ protected:
private:
bool mCanApply;
bool mCanPreview;
+ bool mPreviewSettingChanged;
texture_selected_callback mTextureSelectedCallback;
};
@@ -215,7 +216,8 @@ LLFloaterTexturePicker::LLFloaterTexturePicker(
mContextConeOpacity(0.f),
mSelectedItemPinned( FALSE ),
mCanApply(true),
- mCanPreview(true)
+ mCanPreview(true),
+ mPreviewSettingChanged(false)
{
buildFromFile("floater_texture_ctrl.xml");
mCanApplyImmediately = can_apply_immediately;
@@ -823,6 +825,16 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem
}
setImageID(itemp->getAssetUUID(),false);
mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?
+
+ if(!mPreviewSettingChanged)
+ {
+ mCanPreview = gSavedSettings.getBOOL("TextureLivePreview");
+ }
+ else
+ {
+ mPreviewSettingChanged = false;
+ }
+
if (user_action && mCanPreview)
{
// only commit intentional selections, not implicit ones
@@ -979,6 +991,7 @@ void LLFloaterTexturePicker::setCanApply(bool can_preview, bool can_apply)
mCanApply = can_apply;
mCanPreview = can_preview ? gSavedSettings.getBOOL("TextureLivePreview") : false;
+ mPreviewSettingChanged = true;
}
void LLFloaterTexturePicker::onFilterEdit(const std::string& search_string )
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 526f8d1cd8..b8df063c53 100755
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -994,9 +994,15 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj,
return TRUE;
}
- // In case the inventory has not been updated (e.g. due to some recent operation
- // causing a dirty inventory), stall the user while fetching the inventory.
- if (hit_obj->isInventoryDirty())
+ // In case the inventory has not been loaded (e.g. due to some recent operation
+ // causing a dirty inventory) and we can do an update, stall the user
+ // while fetching the inventory.
+ //
+ // Note: fetch only if inventory is both dirty and not present since previously checked faces
+ // could have requested new fetch for same item (removed inventory and marked as dirty=false).
+ // Objects without listeners (dirty==true and inventory!=NULL. In this specific case - before
+ // first fetch) shouldn't be updated either since we won't receive any changes.
+ if (hit_obj->isInventoryDirty() && hit_obj->getInventoryRoot() == NULL)
{
hit_obj->fetchInventoryFromServer();
LLSD args;
diff --git a/indra/newview/lltoolgrab.h b/indra/newview/lltoolgrab.h
index 4e22732124..5d24c8813e 100755
--- a/indra/newview/lltoolgrab.h
+++ b/indra/newview/lltoolgrab.h
@@ -78,6 +78,8 @@ public:
// Certain grabs should not highlight the "Build" toolbar button
BOOL getHideBuildHighlight() { return mHideBuildHighlight; }
+ void setClickedInMouselook(BOOL is_clickedInMouselook) {mClickedInMouselook = is_clickedInMouselook;}
+
static void pickCallback(const LLPickInfo& pick_info);
private:
LLVector3d getGrabPointGlobal();
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index e4353aafaa..2081297717 100755
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -319,6 +319,7 @@ BOOL LLToolPie::handleLeftClickPick()
{
gGrabTransientTool = this;
mMouseButtonDown = false;
+ LLToolGrab::getInstance()->setClickedInMouselook(gAgentCamera.cameraMouselook());
LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolGrab::getInstance() );
return LLToolGrab::getInstance()->handleObjectHit( mPick );
}
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 3b0adcf7f4..9d680e23d1 100755
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -2695,6 +2695,7 @@ void handle_object_edit()
if (gAgentCamera.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit())
{
+ LLFloaterTools::sPreviousFocusOnAvatar = true;
LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
if (selection->getSelectType() == SELECT_TYPE_HUD || !gSavedSettings.getBOOL("EditCameraMovement"))
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 5cd92c9920..092fa5501d 100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -2704,6 +2704,13 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
break;
case IM_GROUP_INVITATION:
{
+ if (!is_muted)
+ {
+ // group is not blocked, but we still need to check agent that sent the invitation
+ // and we have no agent's id
+ // Note: server sends username "first.last".
+ is_muted |= LLMuteList::getInstance()->isMuted(name);
+ }
if (is_do_not_disturb || is_muted)
{
send_do_not_disturb_message(msg, from_id);
@@ -3598,6 +3605,11 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
is_linden = chat.mSourceType != CHAT_SOURCE_OBJECT &&
LLMuteList::getInstance()->isLinden(from_name);
+ if (is_muted && (chat.mSourceType == CHAT_SOURCE_OBJECT))
+ {
+ return;
+ }
+
BOOL is_audible = (CHAT_AUDIBLE_FULLY == chat.mAudible);
chatter = gObjectList.findObject(from_id);
if (chatter)
@@ -3774,11 +3786,15 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
}
}
- LLSD msg_notify = LLSD(LLSD::emptyMap());
- msg_notify["session_id"] = LLUUID();
- msg_notify["from_id"] = chat.mFromID;
- msg_notify["source_type"] = chat.mSourceType;
- on_new_message(msg_notify);
+ if (mesg != "")
+ {
+ LLSD msg_notify = LLSD(LLSD::emptyMap());
+ msg_notify["session_id"] = LLUUID();
+ msg_notify["from_id"] = chat.mFromID;
+ msg_notify["source_type"] = chat.mSourceType;
+ on_new_message(msg_notify);
+ }
+
}
}
@@ -7106,7 +7122,6 @@ void process_user_info_reply(LLMessageSystem* msg, void**)
msg->getString( "UserData", "DirectoryVisibility", dir_visibility);
LLFloaterPreference::updateUserInfo(dir_visibility, im_via_email);
- LLFloaterSnapshot::setAgentEmail(email);
}
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index faa58d423f..6666aecca2 100755
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -119,14 +119,14 @@ void LLGridManager::initialize(const std::string& grid_file)
mGridFile = grid_file;
// as we don't want an attacker to override our grid list
// to point the default grid to an invalid grid
- addSystemGrid("Second Life Main Grid (Agni)",
+ addSystemGrid(LLTrans::getString("AgniGridLabel"),
MAINGRID,
MAIN_GRID_LOGIN_URI,
"https://secondlife.com/helpers/",
DEFAULT_LOGIN_PAGE,
SL_UPDATE_QUERY_URL,
"Agni");
- addSystemGrid("Second Life Beta Test Grid (Aditi)",
+ addSystemGrid(LLTrans::getString("AditiGridLabel"),
"util.aditi.lindenlab.com",
"https://login.aditi.lindenlab.com/cgi-bin/login.cgi",
"http://aditi-secondlife.webdev.lindenlab.com/helpers/",
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index d9d4c34fb0..561d237170 100755
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -1594,8 +1594,14 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
}
else if (local_id == parcel_mgr.mAgentParcel->getLocalID())
{
- // updated agent parcel
- parcel_mgr.mAgentParcel->unpackMessage(msg);
+ // 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())
+ {
+ // updated agent parcel
+ parcel_mgr.mAgentParcel->unpackMessage(msg);
+ }
}
}
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 92e07c52a5..b7b402da63 100755
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -828,7 +828,6 @@ void LLViewerRegion::processRegionInfo(LLMessageSystem* msg, void**)
LLRegionInfoModel::instance().update(msg);
LLFloaterGodTools::processRegionInfo(msg);
LLFloaterRegionInfo::processRegionInfo(msg);
- LLFloaterReporter::processRegionInfo(msg);
}
void LLViewerRegion::setCacheID(const LLUUID& id)
diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp
index bfae142812..837b30586b 100755
--- a/indra/newview/llworldmap.cpp
+++ b/indra/newview/llworldmap.cpp
@@ -383,6 +383,7 @@ void LLWorldMap::reloadItems(bool force)
LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_MATURE_EVENT);
LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_ADULT_EVENT);
LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_LAND_FOR_SALE);
+ LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_LAND_FOR_SALE_ADULT);
}
}
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml
deleted file mode 100755
index ead56f2885..0000000000
--- a/indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_snapshot_postcard">
- <string name="default_subject">
- Postkarte aus [SECOND_LIFE].
- </string>
- <string name="default_message">
- Sehen Sie mal!
- </string>
- <string name="upload_message">
- Senden...
- </string>
- <text name="title">
- E-Mail
- </text>
- <tab_container name="postcard_tabs">
- <panel name="panel_postcard_message" label="Nachricht"/>
- <panel name="panel_postcard_settings" label="Einstellungen"/>
- </tab_container>
- <button name="cancel_btn" label="Abbrechen"/>
- <button name="send_btn" label="Absenden"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index a660e812cc..d72937ac63 100755
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -23,15 +23,15 @@
</floater.string>
<floater.string
name="Minutes">
- [MINUTES] minutes
+ [MINUTES] min.
</floater.string>
<floater.string
name="Minute">
- minute
+ min.
</floater.string>
<floater.string
name="Seconds">
- [SECONDS] seconds
+ [SECONDS] sec.
</floater.string>
<floater.string
name="Remaining">
diff --git a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
index 9deb0d2030..dcd6d98581 100755
--- a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
@@ -191,8 +191,18 @@
label="OK"
label_selected="OK"
layout="topleft"
- left="-102"
+ right="-105"
name="OK"
top="192"
width="90" />
+ <button
+ follows="right|bottom"
+ height="22"
+ label="Cancel"
+ label_selected="Cancel"
+ layout="topleft"
+ left_pad="5"
+ name="Cancel"
+ right="-10"
+ width="90" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml
index 76adaad57c..514fb058b9 100755
--- a/indra/newview/skins/default/xui/en/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml
@@ -267,12 +267,6 @@
name="panel_snapshot_profile"
filename="panel_snapshot_profile.xml" />
<panel
- class="llpanelsnapshotpostcard"
- follows="all"
- layout="topleft"
- name="panel_snapshot_postcard"
- filename="panel_snapshot_postcard.xml" />
- <panel
class="llpanelsnapshotinventory"
follows="all"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 28565a85c6..ba8502ba81 100755
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -783,7 +783,7 @@ Objects: [N]
icon="alertmodal.tga"
name="ReturnAllTopObjects"
type="alertmodal">
-Are you sure you want to return all listed objects back to their owner&apos;s inventory?
+Are you sure you want to return all listed objects back to their owner&apos;s inventory? This will return ALL scripted objects in the region!
<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
@@ -5376,16 +5376,19 @@ You cannot undo this action.
notext="Cancel"
yestext="OK"/>
</notification>
-
+
<notification
- icon="alertmodal.tga"
- name="HelpReportAbuseEmailLL"
- type="alert">
+ icon="alertmodal.tga"
+ name="ConfirmUnlink"
+ type="alertmodal">
<unique/>
-
-Use this tool to report violations of the [http://secondlife.com/corporate/tos.php Terms of Service] and [http://secondlife.com/corporate/cs.php Community Standards].
-
-All reported abuses are investigated and resolved.
+ This is a large linkset. If you unlink it, you may not be able to link it again. You may wish to take a copy of the linkset into your inventory as a precaution.
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Confirm when unlinking a linkset"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="Unlink"/>
</notification>
<notification
@@ -7783,9 +7786,8 @@ Select residents to share with.
name="MeshUploadError"
icon="alert.tga"
type="alert">
- [LABEL] failed to upload: [MESSAGE] [IDENTIFIER]
-
-See the log file for details.
+ [LABEL] failed to upload: [MESSAGE] [IDENTIFIER]
+[DETAILS]See SecondLife.log for details
</notification>
<notification
@@ -8026,7 +8028,7 @@ We cannot display a preview of this texture because it is no-copy and/or no-tran
<notification
icon="alertmodal.tga"
name="ConfirmLeaveCall"
- type="alert">
+ type="alertmodal">
Are you sure you want to leave this call?
<tag>confirm</tag>
<tag>voice</tag>
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 ea579c6dae..d019a0a310 100755
--- a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml
@@ -60,6 +60,10 @@
name="Large(512x512)"
value="[i512,i512]" />
<combo_box.item
+ label="Current Window(512x512)"
+ name="CurrentWindow"
+ value="[i0,i0]" />
+ <combo_box.item
label="Custom"
name="Custom"
value="[i-1,i-1]" />
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 265217ef60..cb29e6a87a 100755
--- a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml
@@ -107,21 +107,4 @@
<button.commit_callback
function="Snapshot.SendToFlickr"/>
</button>
- <button
- follows="left|top"
- font="SansSerif"
- halign="left"
- height="22"
- image_overlay="Snapshot_Email"
- image_overlay_alignment="left"
- image_top_pad="0"
- imgoverlay_label_space="10"
- label="Send via E-mail"
- layout="topleft"
- left_delta="0"
- name="save_to_email_btn"
- top_pad="5">
- <button.commit_callback
- function="Snapshot.SaveToEmail" />
- </button>
</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml
deleted file mode 100755
index 975b08be05..0000000000
--- a/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- height="380"
- layout="topleft"
- name="panel_snapshot_postcard"
- width="490">
- <string
- name="default_subject">
- Postcard from [SECOND_LIFE].
- </string>
- <string
- name="default_message">
- Check this out!
- </string>
- <string
- name="upload_message">
- Sending...
- </string>
- <icon
- follows="top|left"
- height="18"
- image_name="Snapshot_Email"
- layout="topleft"
- left="12"
- mouse_opaque="true"
- name="title_icon"
- top="7"
- width="18" />
- <text
- follows="top|left|right"
- font="SansSerifBold"
- height="14"
- layout="topleft"
- left_pad="12"
- length="1"
- name="title"
- right="-10"
- text_color="white"
- type="string"
- top_delta="2">
- E-mail
- </text>
- <view_border
- bevel_style="in"
- follows="left|top|right"
- height="1"
- left="9"
- layout="topleft"
- name="hr"
- right="-5"
- top_pad="5"
- />
- <tab_container
- name="postcard_tabs"
- tab_group="1"
- tab_min_width="97"
- tab_height="21"
- tab_position="top"
- top_pad="7"
- left="5"
- right="-2"
- height="319"
- follows="all"
- halign="center"
- use_highlighting_on_hover="true">
- <panel
- follows="all"
- layout="topleft"
- label="Message"
- name="panel_postcard_message"
- filename="panel_postcard_message.xml" />
- <panel
- follows="all"
- layout="topleft"
- label="Settings"
- name="panel_postcard_settings"
- filename="panel_postcard_settings.xml" />
- </tab_container>
- <button
- follows="right|bottom"
- height="23"
- label="Cancel"
- layout="topleft"
- name="cancel_btn"
- right="-6"
- bottom="-20"
- width="97">
- <button.commit_callback
- function="Postcard.Cancel" />
- </button>
- <button
- follows="left|bottom"
- height="23"
- label="Send"
- layout="topleft"
- left="10"
- name="send_btn"
- top_delta="0"
- width="97">
- <button.commit_callback
- function="Postcard.Send" />
- </button>
-</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index f77678e5f8..309f108ecc 100755
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -96,7 +96,10 @@ Voice Server Version: [VOICE_VERSION]
<string name="LoginFailed">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:
@@ -4046,5 +4049,17 @@ Try enclosing path to the editor with double quotes.
<string name="loading_chat_logs">
Loading...
</string>
-
- </strings>
+
+ <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">
+ The physics shape contains triangles which are too small. Try simplifying the physics model.
+ </string>
+
+ <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">
+ The physics shape contains bad confirmation data. Try to correct the physics model.
+ </string>
+
+ <string name="Mav_Details_MAV_UNKNOWN_VERSION">
+ The physics shape does not have correct version. Set the correct version for the physics model.
+ </string>
+
+</strings>
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml
deleted file mode 100755
index 649d547ba0..0000000000
--- a/indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_snapshot_postcard">
- <string name="default_subject">
- Postal desde [SECOND_LIFE].
- </string>
- <string name="default_message">
- ¡Mira esto!
- </string>
- <string name="upload_message">
- Enviando...
- </string>
- <text name="title">
- Correo-e
- </text>
- <button label="Mensaje" name="message_btn"/>
- <button label="Ajustes" name="settings_btn"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml
index b39920fe13..1cb6d3c935 100755
--- a/indra/newview/skins/default/xui/fr/panel_login.xml
+++ b/indra/newview/skins/default/xui/fr/panel_login.xml
@@ -19,9 +19,9 @@
<combo_box.item label="Domicile" name="MyHome"/>
</combo_box>
<button label="Connexion" name="connect_favorite_btn"/>
- <line_editor label="Tapez un emplacement" name="location_edit"/>
+ <line_editor label="Tapez un emplacement" name="location_edit" left_pad="20"/>
<button label="Connexion" name="connect_location_btn"/>
- <combo_box label="Sélectionner la grille" name="server_combo"/>
+ <combo_box label="Sélectionner la grille" name="server_combo" left_pad="20"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml
deleted file mode 100755
index 82a4815144..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_snapshot_postcard">
- <string name="default_subject">
- Carte postale de [SECOND_LIFE].
- </string>
- <string name="default_message">
- Ouvrez-moi !
- </string>
- <string name="upload_message">
- Envoi en cours...
- </string>
- <text name="title">
- E-mail
- </text>
- <button label="Message" name="message_btn"/>
- <button label="Paramètres" name="settings_btn"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml
deleted file mode 100755
index 3703b97e6c..0000000000
--- a/indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_snapshot_postcard">
- <string name="default_subject">
- Cartolina da [SECOND_LIFE].
- </string>
- <string name="default_message">
- Dai un&apos;occhiata!
- </string>
- <string name="upload_message">
- Invio...
- </string>
- <text name="title">
- E-mail
- </text>
- <button label="Messaggio" name="message_btn"/>
- <button label="Impostazioni" name="settings_btn"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml
deleted file mode 100755
index 1ddd723840..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_snapshot_postcard">
- <string name="default_subject">
- [SECOND_LIFE] からのポストカードです。
- </string>
- <string name="default_message">
- ぜひご覧ください!
- </string>
- <string name="upload_message">
- 送信中...
- </string>
- <text name="title">
- メール
- </text>
- <button label="メッセージ" name="message_btn"/>
- <button label="設定" name="settings_btn"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml
deleted file mode 100755
index 12a648f600..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_snapshot_postcard">
- <string name="default_subject">
- Postal do [SECOND_LIFE].
- </string>
- <string name="default_message">
- Confira!
- </string>
- <string name="upload_message">
- Enviando...
- </string>
- <text name="title">
- E-mail
- </text>
- <button label="Mensagem" name="message_btn"/>
- <button label="Configurações" name="settings_btn"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml
deleted file mode 100755
index 47f4caf8e3..0000000000
--- a/indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_snapshot_postcard">
- <string name="default_subject">
- Открытка из [SECOND_LIFE].
- </string>
- <string name="default_message">
- Побывай здесь!
- </string>
- <string name="upload_message">
- Отправка...
- </string>
- <text name="title">
- Электронное письмо
- </text>
- <button label="Сообщение" name="message_btn"/>
- <button label="Настройки" name="settings_btn"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml
deleted file mode 100755
index e999678a0d..0000000000
--- a/indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_snapshot_postcard">
- <string name="default_subject">
- SECOND_LIFE]&apos;dan posta kartı.
- </string>
- <string name="default_message">
- Buna bakın!
- </string>
- <string name="upload_message">
- Gönderiyor...
- </string>
- <text name="title">
- E-posta
- </text>
- <button label="İleti" name="message_btn"/>
- <button label="Ayarlar" name="settings_btn"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/zh/panel_snapshot_postcard.xml
deleted file mode 100755
index 853a856104..0000000000
--- a/indra/newview/skins/default/xui/zh/panel_snapshot_postcard.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_snapshot_postcard">
- <string name="default_subject">
- 來自 [SECOND_LIFE] 的明信片。
- </string>
- <string name="default_message">
- 快來看看這個!
- </string>
- <string name="upload_message">
- 傳送中...
- </string>
- <text name="title">
- 電郵
- </text>
- <button label="訊息" name="message_btn"/>
- <button label="設定" name="settings_btn"/>
-</panel>
diff --git a/indra/newview/tests/llslurl_test.cpp b/indra/newview/tests/llslurl_test.cpp
index 2bc0d5a086..4694f657b6 100755
--- a/indra/newview/tests/llslurl_test.cpp
+++ b/indra/newview/tests/llslurl_test.cpp
@@ -39,7 +39,21 @@ namespace
static const char * const TEST_FILENAME("llslurl_test.xml");
}
-
+
+//
+// Stub implementation for LLTrans
+//
+class LLTrans
+{
+public:
+ static std::string getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args);
+};
+
+std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args)
+{
+ return std::string();
+}
+
//----------------------------------------------------------------------------
// Mock objects for the dependencies of the code we're testing
diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp
index 0eb0ab6500..e68da14fe9 100755
--- a/indra/newview/tests/llviewernetwork_test.cpp
+++ b/indra/newview/tests/llviewernetwork_test.cpp
@@ -38,6 +38,31 @@ namespace
static const char * const TEST_FILENAME("llviewernetwork_test.xml");
}
+
+//
+// Stub implementation for LLTrans
+//
+class LLTrans
+{
+public:
+ static std::string getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args);
+};
+
+std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args)
+{
+ std::string grid_label = std::string();
+ if(xml_desc == "AgniGridLabel")
+ {
+ grid_label = "Second Life Main Grid (Agni)";
+ }
+ else if(xml_desc == "AditiGridLabel")
+ {
+ grid_label = "Second Life Beta Test Grid (Aditi)";
+ }
+
+ return grid_label;
+}
+
//----------------------------------------------------------------------------
// Mock objects for the dependencies of the code we're testing