diff options
93 files changed, 1396 insertions, 255 deletions
| diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 16df27bb8e..08462c7834 100755 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -40,6 +40,545 @@  #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 >= (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 +1098,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 +1129,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 +1164,7 @@ void LLImageRaw::compositeUnscaled4onto3( LLImageRaw* src )  	}  } +  void LLImageRaw::copyUnscaledAlphaMask( LLImageRaw* src, const LLColor4U& fill)  {  	LLImageRaw* dst = this;  // Just for clarity. @@ -846,6 +1372,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 +1393,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 +1413,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 +1433,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/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 4b08798892..701a06a085 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/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/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 9d9bc43bd7..daeec74364 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/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 8c8b4971cf..95cdf90e99 100755 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -298,6 +298,11 @@ CreateShortCut "$INSTDIR\$INSTSHORTCUT.lnk" \  CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \
  				'"$INSTDIR\uninst.exe"' ''
 +# Create *.bat file to specify lang params on first run from installer - see MAINT-5259
 +FileOpen $9 "$INSTDIR\autorun.bat" w
 +FileWrite $9 'start "$INSTDIR\$INSTEXE" "$INSTDIR\$INSTEXE" $SHORTCUT_LANG_PARAM$\r$\n'
 +FileClose $9
 +
  # Write registry
  WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" "$INSTDIR"
  WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" "${VERSION_LONG}"
 @@ -682,7 +687,7 @@ Call CheckWindowsServPack		# Warn if not on the latest SP before asking to launc  	Push $R0					# Option value, unused
  	StrCmp $SKIP_AUTORUN "true" +2;
  # Assumes SetOutPath $INSTDIR
 -	Exec '"$WINDIR\explorer.exe" "$INSTDIR\$INSTEXE"'
 +	Exec '"$WINDIR\explorer.exe" "$INSTDIR\autorun.bat"'
  	Pop $R0
  FunctionEnd
 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 06b86e311a..cce1eb5895 100755 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -986,6 +986,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++)  	{ @@ -1013,10 +1014,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())  		{ @@ -1024,10 +1024,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++;  	} @@ -1041,14 +1040,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 @@ -1069,7 +1069,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()); @@ -1077,11 +1078,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);  		} @@ -1089,6 +1097,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 3be705dd95..35593dd4ff 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1786,9 +1786,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 @@ -2465,7 +2471,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/llappviewer.cpp b/indra/newview/llappviewer.cpp index a2aee2e000..9b9b591cd1 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3091,8 +3091,8 @@ void LLAppViewer::initUpdater()  	U32 check_period = gSavedSettings.getU32("UpdaterServiceCheckPeriod");  	bool willing_to_test;  	LL_DEBUGS("UpdaterService") << "channel " << channel << LL_ENDL; -	static const boost::regex is_test_channel("\\bTest$"); -	if (boost::regex_search(channel, is_test_channel))  + +	if (LLVersionInfo::TEST_VIEWER == LLVersionInfo::getViewerMaturity())   	{  		LL_INFOS("UpdaterService") << "Test build: overriding willing_to_test by sending testno" << LL_ENDL;  		willing_to_test = false; 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 f9c39a02c9..ce32aeda94 100755 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -81,6 +81,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"; @@ -2444,33 +2446,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);  		} @@ -2490,33 +2492,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);  		} @@ -2919,14 +2921,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()  { @@ -2973,14 +2984,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 8e8b61c333..0540ddb880 100755 --- a/indra/newview/llfloaterland.h +++ b/indra/newview/llfloaterland.h @@ -394,6 +394,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); @@ -402,6 +403,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..a4dde62056 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -4854,7 +4854,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 +5286,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 +5561,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 +5630,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 5e028e6d43..2f4d2a93b2 100755 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -107,14 +107,6 @@ LLFloaterReporter::LLFloaterReporter(const LLSD& key)  {  } -// static -void LLFloaterReporter::processRegionInfo(LLMessageSystem* msg) -{ -	if ( LLFloaterReg::instanceVisible("reporter") ) -	{ -		LLNotificationsUtil::add("HelpReportAbuseEmailLL"); -	}; -}  // virtual  BOOL LLFloaterReporter::postBuild()  { @@ -148,16 +140,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 5eb5c20665..d857528f10 100755 --- a/indra/newview/llfloaterreporter.h +++ b/indra/newview/llfloaterreporter.h @@ -100,10 +100,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..16fa4684ab 100755 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -448,9 +448,9 @@ 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" )); +			shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD +			&& got_bytes +			&& previewp->getDataSize() > MAX_POSTCARD_DATASIZE ? LLUIColor(LLColor4::red) : LLUIColorTable::instance().getColor( "LabelTextColor" ));  	// Update the width and height spinners based on the corresponding resolution combos. (?)  	switch(shot_type) @@ -600,7 +600,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 +618,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);  	}  } 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/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/llinspecttoast.cpp b/indra/newview/llinspecttoast.cpp index d04378daaf..47560341e7 100755 --- a/indra/newview/llinspecttoast.cpp +++ b/indra/newview/llinspecttoast.cpp @@ -47,6 +47,7 @@ public:  	/*virtual*/ void onOpen(const LLSD& notification_id);  	/*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask); +	/*virtual*/ void removeChild(LLView* child);  private:  	void onToastDestroy(LLToast * toast); @@ -98,7 +99,7 @@ void LLInspectToast::onOpen(const LLSD& notification_id)  	panel->setMouseOpaque(FALSE);  	if(mPanel != NULL && mPanel->getParent() == this)  	{ -		removeChild(mPanel); +		LLInspect::removeChild(mPanel);  	}  	addChild(panel);  	panel->setFocus(TRUE); @@ -121,6 +122,16 @@ BOOL LLInspectToast::handleToolTip(S32 x, S32 y, MASK mask)  	return LLFloater::handleToolTip(x, y, mask);  } +// virtual +void LLInspectToast::removeChild(LLView* child) +{ +	if (mPanel == child) +	{ +		mPanel = NULL; +	} +	LLInspect::removeChild(child); +} +  void LLInspectToast::onToastDestroy(LLToast * toast)  {  	closeFloater(false); 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 605a63aa33..6f6861dc7b 100755 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -459,7 +459,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 1380345164..4e9947fca0 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/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp index 8e37b1418c..8e37b1418c 100755..100644 --- a/indra/newview/llpanelsnapshotpostcard.cpp +++ b/indra/newview/llpanelsnapshotpostcard.cpp 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 69c577f445..4fafbf917b 100755 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -620,10 +620,33 @@ bool LLSelectMgr::linkObjects()  bool LLSelectMgr::unlinkObjects()  { +	S32 min_objects_for_confirm = gSavedSettings.getS32("MinObjectsForUnlinkConfirm"); +	S32 unlink_object_count = mSelectedObjects->getObjectCount(); // clears out nodes with NULL objects +	if (unlink_object_count >= min_objects_for_confirm +		&& unlink_object_count > mSelectedObjects->getRootObjectCount()) +	{ +		// total count > root count means that there are childer inside and that there are linksets that will be unlinked +		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 29c111b24f..87d25e3a8c 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/llstartup.cpp b/indra/newview/llstartup.cpp index d7bfd22cc9..f94c348b76 100755 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -242,7 +242,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()); @@ -3504,15 +3505,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/llversioninfo.cpp b/indra/newview/llversioninfo.cpp index 5cc7d7bed3..e53de8be32 100755 --- a/indra/newview/llversioninfo.cpp +++ b/indra/newview/llversioninfo.cpp @@ -29,6 +29,7 @@  #include <iostream>  #include <sstream>  #include "llversioninfo.h" +#include <boost/regex.hpp>  #if ! defined(LL_VIEWER_CHANNEL)       \   || ! defined(LL_VIEWER_VERSION_MAJOR) \ @@ -131,3 +132,43 @@ void LLVersionInfo::resetChannel(const std::string& channel)  	sWorkingChannelName = channel;  	sVersionChannel.clear(); // Reset version and channel string til next use.  } + +//static +LLVersionInfo::ViewerMaturity LLVersionInfo::getViewerMaturity() +{ +    ViewerMaturity maturity; +     +    std::string channel = getChannel(); + +	static const boost::regex is_test_channel("\\bTest\\b"); +	static const boost::regex is_beta_channel("\\bBeta\\b"); +	static const boost::regex is_project_channel("\\bProject\\b"); +	static const boost::regex is_release_channel("\\bRelease\\b"); + +    if (boost::regex_search(channel, is_release_channel)) +    { +        maturity = RELEASE_VIEWER; +    } +    else if (boost::regex_search(channel, is_beta_channel)) +    { +        maturity = BETA_VIEWER; +    } +    else if (boost::regex_search(channel, is_project_channel)) +    { +        maturity = PROJECT_VIEWER; +    } +    else if (boost::regex_search(channel, is_test_channel)) +    { +        maturity = TEST_VIEWER; +    } +    else +    { +        LL_WARNS() << "Channel '" << channel +                   << "' does not follow naming convention, assuming Test" +                   << LL_ENDL; +        maturity = TEST_VIEWER; +    } +    return maturity; +} + +     diff --git a/indra/newview/llversioninfo.h b/indra/newview/llversioninfo.h index 077105cae8..4e75535ec5 100755 --- a/indra/newview/llversioninfo.h +++ b/indra/newview/llversioninfo.h @@ -68,6 +68,15 @@ public:  	/// reset the channel name used by the viewer.  	static void resetChannel(const std::string& channel); + +    typedef enum +    { +        TEST_VIEWER, +        PROJECT_VIEWER, +        BETA_VIEWER, +        RELEASE_VIEWER +    } ViewerMaturity; +    static ViewerMaturity getViewerMaturity();  };  #endif diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index b797e0c835..ab36312cee 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 459bdca8df..96fce9c89f 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2706,6 +2706,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); @@ -3600,6 +3607,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) 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 59f57c218e..2a6b105cab 100755 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -1602,8 +1602,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 ec28461201..ea7af35842 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/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index e317989f04..ba84d7aa2c 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2336,12 +2336,6 @@ void LLViewerWindow::setMenuBackgroundColor(bool god_mode, bool dev_grid)      LLSD args;      LLColor4 new_bg_color; -	// no l10n problem because channel is always an english string -	std::string channel = LLVersionInfo::getChannel(); -	static const boost::regex is_beta_channel("\\bBeta\\b"); -	static const boost::regex is_project_channel("\\bProject\\b"); -	static const boost::regex is_test_channel("\\bTest$"); -	  	// god more important than project, proj more important than grid      if ( god_mode )       { @@ -2354,27 +2348,35 @@ void LLViewerWindow::setMenuBackgroundColor(bool god_mode, bool dev_grid)  			new_bg_color = LLUIColorTable::instance().getColor( "MenuNonProductionGodBgColor" );  		}      } -	else if (boost::regex_search(channel, is_beta_channel)) -	{ -		new_bg_color = LLUIColorTable::instance().getColor( "MenuBarBetaBgColor" ); -	} -	else if (boost::regex_search(channel, is_project_channel)) -	{ -		new_bg_color = LLUIColorTable::instance().getColor( "MenuBarProjectBgColor" ); -	} -	else if (boost::regex_search(channel, is_test_channel)) -	{ -		new_bg_color = LLUIColorTable::instance().getColor( "MenuBarTestBgColor" ); -	} -	else if(!LLGridManager::getInstance()->isInProductionGrid()) -	{ -		new_bg_color = LLUIColorTable::instance().getColor( "MenuNonProductionBgColor" ); -	} -	else  -	{ -		new_bg_color = LLUIColorTable::instance().getColor( "MenuBarBgColor" ); -	} - +    else +    { +        switch (LLVersionInfo::getViewerMaturity()) +        { +        case LLVersionInfo::TEST_VIEWER: +            new_bg_color = LLUIColorTable::instance().getColor( "MenuBarTestBgColor" ); +            break; + +        case LLVersionInfo::PROJECT_VIEWER: +            new_bg_color = LLUIColorTable::instance().getColor( "MenuBarProjectBgColor" ); +            break; +             +        case LLVersionInfo::BETA_VIEWER: +            new_bg_color = LLUIColorTable::instance().getColor( "MenuBarBetaBgColor" ); +            break; +             +        case LLVersionInfo::RELEASE_VIEWER: +            if(!LLGridManager::getInstance()->isInProductionGrid()) +            { +                new_bg_color = LLUIColorTable::instance().getColor( "MenuNonProductionBgColor" ); +            } +            else  +            { +                new_bg_color = LLUIColorTable::instance().getColor( "MenuBarBgColor" ); +            } +            break; +        } +    } +          if(gMenuBarView)      {          gMenuBarView->setBackgroundColor( new_bg_color ); diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml index 3f5bbda724..3f5bbda724 100755..100644 --- a/indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml +++ b/indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml 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 62ab8ed193..90d45d5ebc 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/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index cfe56e6a95..7d7778f421 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's inventory? +Are you sure you want to return all listed objects back to their owner's inventory? This will return ALL scripted objects in the region!      <tag>confirm</tag>      <usetemplate       name="okcancelbuttons" @@ -5460,16 +5460,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 selection with linksets. If you unlink it, you may not be able to link it again. You may wish to take copies of linksets into your inventory as a precaution. +    <tag>confirm</tag> +    <usetemplate +     ignoretext="Confirm when unlinking a linkset" +     name="okcancelignore" +     notext="Cancel" +     yestext="Unlink"/>    </notification>    <notification @@ -8015,9 +8018,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 @@ -8258,7 +8260,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_postcard.xml b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml index 975b08be05..975b08be05 100755..100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index ca38a9bc3f..5e58360158 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: @@ -4075,5 +4078,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 index 357b432c4c..357b432c4c 100755..100644 --- a/indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml +++ b/indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml 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 index 067fa091d8..067fa091d8 100755..100644 --- a/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml +++ b/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml index be7d8763b6..be7d8763b6 100755..100644 --- a/indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml +++ b/indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml index 569c07ad47..569c07ad47 100755..100644 --- a/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml +++ b/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml index ab1545a231..ab1545a231 100755..100644 --- a/indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml +++ b/indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml index 8f6ab612ff..8f6ab612ff 100755..100644 --- a/indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml +++ b/indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml index ecb47b2218..ecb47b2218 100755..100644 --- a/indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml +++ b/indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml diff --git a/indra/newview/skins/default/xui/zh/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/zh/panel_snapshot_postcard.xml index 77f8b335db..77f8b335db 100755..100644 --- a/indra/newview/skins/default/xui/zh/panel_snapshot_postcard.xml +++ b/indra/newview/skins/default/xui/zh/panel_snapshot_postcard.xml 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 | 
