master
Rider Linden 2015-08-25 11:40:36 -07:00
commit 96bb17f20b
98 changed files with 1444 additions and 289 deletions

View File

@ -506,3 +506,4 @@ d07f76c5b9860fb87924d00ca729f7d4532534d6 3.7.29-release
797ed69e6134ef48bb922577ab2540fb2d964668 3.8.0-release
3f61ed662347dc7c6941b8266e72746a66d90e2a 3.8.1-release
3a62616f3dd8bd512fcdfd29ef033b2505b11213 3.8.2-release
60572f718879f786f6bc8b5c9373ebebf4693078 3.8.3-release

View File

@ -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
{

View File

@ -633,6 +633,10 @@ void LLAssetStorage::downloadCompleteCallback(
vfile.remove();
}
}
// we will be deleting elements of mPendingDownloads which req might be part of, save id and type for reference
LLUUID callback_id = req->getUUID();
LLAssetType::EType callback_type = req->getType();
// find and callback ALL pending requests for this UUID
// SJB: We process the callbacks in reverse order, I do not know if this is important,
@ -660,7 +664,7 @@ void LLAssetStorage::downloadCompleteCallback(
{
add(sFailedDownloadCount, 1);
}
tmp->mDownCallback(gAssetStorage->mVFS, req->getUUID(), req->getType(), tmp->mUserData, result, ext_status);
tmp->mDownCallback(gAssetStorage->mVFS, callback_id, callback_type, tmp->mUserData, result, ext_status);
}
delete tmp;
}

View File

@ -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();

View File

@ -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();

View File

@ -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);
}
}
{
//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
{

View File

@ -198,7 +198,7 @@ public:
void setHasMipMaps(bool hasMips) { mHasMipMaps = hasMips; }
protected:
S32 mIndex;
const S32 mIndex;
U32 mCurrTexture;
eTextureType mCurrTexType;
eTextureBlendType mCurrBlendType;

View File

@ -443,6 +443,7 @@ void LLComboBox::onFocusLost()
{
mTextEntry->selectAll();
}
mButton->setForcePressedState(false);
LLUICtrl::onFocusLost();
}

View File

@ -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;
}
}

View File

@ -2292,6 +2292,7 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
sHandleLeftMouseUp = true;
break;
}
sHandleDoubleClick = true;
//if (gDebugClicks)
//{

View File

@ -1 +1 @@
3.8.3
3.8.4

View File

@ -3470,6 +3470,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>
@ -14175,6 +14186,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>

View File

@ -23,4 +23,7 @@
<command name="snapshot"/>
<command name="facebook"/>
</left_toolbar>
<right_toolbar
button_display_mode="icons_only">
</right_toolbar>
</toolbars>

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -223,7 +223,7 @@ void AISAPI::RemoveItem(const LLUUID &itemId, completion_t callback)
EnqueueAISCommand("RemoveItem", proc);
}
void AISAPI::CopyLibraryCategory(const LLUUID& sourceId, const LLUUID& destId, completion_t callback)
void AISAPI::CopyLibraryCategory(const LLUUID& sourceId, const LLUUID& destId, bool copySubfolders, completion_t callback)
{
std::string cap;
@ -240,6 +240,10 @@ void AISAPI::CopyLibraryCategory(const LLUUID& sourceId, const LLUUID& destId, c
tid.generate();
std::string url = cap + std::string("/category/") + sourceId.asString() + "?tid=" + tid.asString();
if (!copySubfolders)
{
url += ",depth=0";
}
LL_INFOS() << url << LL_ENDL;
std::string destination = destId.asString();

View File

@ -53,7 +53,7 @@ public:
static void PurgeDescendents(const LLUUID &categoryId, completion_t callback);
static void UpdateCategory(const LLUUID &categoryId, const LLSD &updates, completion_t callback);
static void UpdateItem(const LLUUID &itemId, const LLSD &updates, completion_t callback);
static void CopyLibraryCategory(const LLUUID& sourceId, const LLUUID& destId, completion_t callback);
static void CopyLibraryCategory(const LLUUID& sourceId, const LLUUID& destId, bool copySubfolders, completion_t callback);
private:
typedef enum {

View File

@ -1802,9 +1802,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
@ -2482,7 +2488,7 @@ void LLAppearanceMgr::wearInventoryCategory(LLInventoryCategory* category, bool
std::string("wear_inventory_category_callback"), copy_cb);
AISAPI::completion_t cr = boost::bind(&doAppearanceCb, track_cb, _1);
AISAPI::CopyLibraryCategory(category->getUUID(), parent_id, cr);
AISAPI::CopyLibraryCategory(category->getUUID(), parent_id, false, cr);
}
else
{

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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.

View File

@ -214,9 +214,9 @@ void LLFloaterAbout::startFetchServerReleaseNotes()
/*static*/
void LLFloaterAbout::handleServerReleaseNotes(LLSD results)
{
LLFloaterAbout* floater_about = LLFloaterReg::getTypedInstance<LLFloaterAbout>("sl_about");
if (floater_about)
{
// LLFloaterAbout* floater_about = LLFloaterReg::getTypedInstance<LLFloaterAbout>("sl_about");
// if (floater_about)
// {
LLSD http_headers;
if (results.has(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS))
{
@ -234,7 +234,7 @@ void LLFloaterAbout::handleServerReleaseNotes(LLSD results)
location = LLTrans::getString("ErrorFetchingServerReleaseNotesURL");
}
LLAppViewer::instance()->setServerReleaseNotesURL(location);
}
// }
}
class LLFloaterAboutListener: public LLEventAPI
@ -300,3 +300,4 @@ void LLFloaterAboutUtil::registerFloater()
&LLFloaterReg::build<LLFloaterAbout>);
}

View File

@ -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 );
}

View File

@ -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:
};

View File

@ -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

View File

@ -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

View File

@ -3810,11 +3810,8 @@ void LLModelPreview::loadModelCallback(S32 lod)
mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->set(FALSE);
if (!mBaseModel.empty())
{
if (mFMP->getChild<LLUICtrl>("description_form")->getValue().asString().empty())
{
const std::string& model_name = mBaseModel[0]->getName();
mFMP->getChild<LLUICtrl>("description_form")->setValue(model_name);
}
const std::string& model_name = mBaseModel[0]->getName();
mFMP->getChild<LLUICtrl>("description_form")->setValue(model_name);
}
}
refresh();
@ -4854,7 +4851,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;
@ -5138,8 +5135,11 @@ BOOL LLModelPreview::render()
mViewOption["show_skin_weight"] = false;
fmp->disableViewOption("show_skin_weight");
fmp->disableViewOption("show_joint_positions");
skin_weight = false;
mFMP->childSetValue("show_skin_weight", false);
fmp->setViewOptionEnabled("show_skin_weight", skin_weight);
}
skin_weight = false;
}
if (upload_skin && !has_skin_weights)
@ -5243,6 +5243,16 @@ BOOL LLModelPreview::render()
const LLVertexBuffer* buff = vb_vec[0];
regen = buff->hasDataType(LLVertexBuffer::TYPE_WEIGHT4) != skin_weight;
}
else
{
LL_INFOS(" ") << "Vertex Buffer[" << mPreviewLOD << "]" << " is EMPTY!!!" << LL_ENDL;
regen = TRUE;
}
}
if (regen)
{
genBuffers(mPreviewLOD, skin_weight);
}
//make sure material lists all match
@ -5263,11 +5273,6 @@ BOOL LLModelPreview::render()
}
}
if (regen)
{
genBuffers(mPreviewLOD, skin_weight);
}
if (!skin_weight)
{
for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
@ -5286,7 +5291,7 @@ BOOL LLModelPreview::render()
gGL.multMatrix((GLfloat*) mat.mMatrix);
for (U32 i = 0; i < mVertexBuffer[mPreviewLOD][model].size(); ++i)
for (U32 i = 0, e = mVertexBuffer[mPreviewLOD][model].size(); i < e; ++i)
{
LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i];
@ -5561,7 +5566,7 @@ BOOL LLModelPreview::render()
if (!model->mSkinWeights.empty())
{
for (U32 i = 0; i < mVertexBuffer[mPreviewLOD][model].size(); ++i)
for (U32 i = 0, e = mVertexBuffer[mPreviewLOD][model].size(); i < e; ++i)
{
LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i];
@ -5630,6 +5635,7 @@ BOOL LLModelPreview::render()
position[j] = v;
}
llassert(model->mMaterialList.size() > i);
const std::string& binding = instance.mModel->mMaterialList[i];
const LLImportMaterial& material = instance.mMaterial[binding];

View File

@ -161,14 +161,6 @@ LLFloaterReporter::LLFloaterReporter(const LLSD& key)
{
}
// static
void LLFloaterReporter::processRegionInfo(LLMessageSystem* msg)
{
if ( LLFloaterReg::instanceVisible("reporter") )
{
LLNotificationsUtil::add("HelpReportAbuseEmailLL");
};
}
// virtual
BOOL LLFloaterReporter::postBuild()
{
@ -202,16 +194,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 );

View File

@ -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:

View File

@ -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);
}
}

View File

@ -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*)

View File

@ -201,11 +201,13 @@ private:
std::map<std::string, std::string> mStatusText;
protected:
LLSD mMediaSettings;
public:
static bool sShowObjectCost;
static bool sPreviousFocusOnAvatar;
};

View File

@ -2006,7 +2006,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)

View File

@ -1421,8 +1421,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.
@ -1471,7 +1478,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);

View File

@ -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);

View File

@ -70,7 +70,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),
@ -634,6 +635,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)
{
@ -641,11 +657,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;
}
}
}
@ -836,6 +847,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;

View File

@ -204,6 +204,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
// +-------------------------------------------------------------------+
@ -278,6 +281,7 @@ private:
FilterOps mFilterOps;
FilterOps mDefaultFilterOps;
FilterOps mBackupFilterOps; // for backup purposes when leaving 'search link' mode
std::string mFilterSubString;
std::string mFilterSubStringOrig;

View File

@ -737,7 +737,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)
{
@ -2473,7 +2473,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
{
LLSD args;
args["QUESTION"] = LLTrans::getString(root->getSelectedCount() > 1 ? "DeleteItems" : "DeleteItem");
LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLInventoryAction::onItemsRemovalConfirmation, _1, _2, root));
LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&onItemsRemovalConfirmation, _1, _2, root->getHandle()));
// Note: marketplace listings will be updated in the callback if delete confirmed
return;
}
@ -2583,18 +2583,19 @@ void LLInventoryAction::removeItemFromDND(LLFolderView* root)
}
}
void LLInventoryAction::onItemsRemovalConfirmation( const LLSD& notification, const LLSD& response, LLFolderView* root )
void LLInventoryAction::onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFolderView> root)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0)
if (option == 0 && !root.isDead() && !root.get()->isDead())
{
//Need to remove item from DND before item is removed from root folder view
//because once removed from root folder view the item is no longer a selected item
removeItemFromDND(root);
root->removeSelectedItems();
// Update the marketplace listings that have been affected by the operation
updateMarketplaceFolders();
LLFolderView* folder_root = root.get();
//Need to remove item from DND before item is removed from root folder view
//because once removed from root folder view the item is no longer a selected item
removeItemFromDND(folder_root);
folder_root->removeSelectedItems();
// Update the marketplace listings that have been affected by the operation
updateMarketplaceFolders();
}
}
@ -2650,4 +2651,3 @@ void LLInventoryAction::updateMarketplaceFolders()
}

View File

@ -30,6 +30,7 @@
#include "llinventorymodel.h"
#include "llinventory.h"
#include "llhandle.h"
#include "llwearabletype.h"
// compute_stock_count() return error code
@ -444,7 +445,8 @@ public:
*******************************************************************************/
class LLFolderViewItem;
class LLFolderViewFolder;
class LLInventoryModel;
class LLFolderView;
class LLInventoryState
{
@ -456,13 +458,12 @@ public:
struct LLInventoryAction
{
static void doToSelected(class LLInventoryModel* model, class LLFolderView* root, const std::string& action, BOOL user_confirm = TRUE);
static void callback_doToSelected(const LLSD& notification, const LLSD& response, class LLInventoryModel* model, class LLFolderView* root, const std::string& action);
static void callback_copySelected(const LLSD& notification, const LLSD& response, class LLInventoryModel* model, class LLFolderView* root, const std::string& action);
static void doToSelected(LLInventoryModel* model, LLFolderView* root, const std::string& action, BOOL user_confirm = TRUE);
static void callback_doToSelected(const LLSD& notification, const LLSD& response, class LLInventoryModel* model, class LLFolderView* root, const std::string& action);
static void callback_copySelected(const LLSD& notification, const LLSD& response, class LLInventoryModel* model, class LLFolderView* root, const std::string& action);
static void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFolderView> root);
static void removeItemFromDND(LLFolderView* root);
static void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLFolderView* root);
static void removeItemFromDND(LLFolderView* root);
private:
static void buildMarketplaceFolders(LLFolderView* root);
static void updateMarketplaceFolders();

View File

@ -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();

View File

@ -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);

View File

@ -72,6 +72,7 @@
#include "bufferstream.h"
#include "llfasttimer.h"
#include "llcorehttputil.h"
#include "lltrans.h"
#include "llstatusbar.h"
#include "llinventorypanel.h"
#include "lluploaddialog.h"
@ -708,12 +709,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"];
@ -723,8 +728,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();
@ -732,6 +740,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();
@ -748,6 +763,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()

View File

@ -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()
//-----------------------------------------------------------------------------

View File

@ -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); };

View File

@ -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();

View File

@ -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.

View File

@ -97,6 +97,7 @@ void LLPanelGroupBulkImpl::callbackClickAdd(void* userdata)
if(picker)
{
root_floater->addDependentFloater(picker);
LLGroupMgr::getInstance()->sendCapGroupMembersRequest(panelp->mImplementation->mGroupID);
}
}
}

View File

@ -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.

View File

@ -228,7 +228,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,

View File

@ -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);
LLInventoryFilter &filter = mActivePanel->getFilter();
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);
}
}

View File

@ -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)

View File

@ -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;

View File

@ -71,6 +71,7 @@ private:
*/
S32 mSelectedParcelID;
LLUUID mLastSelectedRegionID;
F64 mNextCovenantUpdateTime; //seconds since client start
LLPanel* mForSalePanel;
LLPanel* mYouAreHerePanel;

View File

@ -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();

View File

@ -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));
}

0
indra/newview/llpanelsnapshotpostcard.cpp Executable file → Normal file
View File

View File

@ -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);

View File

@ -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

View File

@ -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();

View File

@ -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;
}

View File

@ -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)

View File

@ -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;

View File

@ -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

View File

@ -506,6 +506,8 @@ public:
bool unlinkObjects();
void confirmUnlinkObjects(const LLSD& notification, const LLSD& response);
bool enableLinkObjects();
bool enableUnlinkObjects();

View File

@ -241,7 +241,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());
@ -3492,15 +3493,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;
}

View File

@ -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 )

View File

@ -1009,9 +1009,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;

View File

@ -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();

View File

@ -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 );
}

View File

@ -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;
}

View File

@ -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

View File

@ -2757,6 +2757,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"))

View File

@ -2707,6 +2707,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);
@ -3601,6 +3608,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)

View File

@ -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/",

View File

@ -1608,8 +1608,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);
}
}
}

View File

@ -919,7 +919,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)

View File

@ -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 );

View File

View File

@ -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">

View File

@ -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>

View File

@ -1025,7 +1025,7 @@ Objects: [N]
icon="alertmodal.tga"
name="ReturnAllTopObjects"
type="alertmodal">
Are you sure you want to return all listed objects back to their owner&apos;s inventory?
Are you sure you want to return all listed objects back to their owner&apos;s inventory? This will return ALL scripted objects in the region!
<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
@ -5709,16 +5709,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
@ -8264,9 +8267,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
@ -8507,7 +8509,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>

View File

@ -59,6 +59,10 @@
label="Large (512x512)"
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"

View File

View File

@ -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:
@ -4115,5 +4118,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>

View File

View File

@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_login">
<panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=fr</panel.string>
<panel.string name="forgot_password_url">
http://secondlife.com/account/request.php?lang=fr
</panel.string>
<layout_stack name="ui_stack">
<layout_panel name="ui_container">
<combo_box label="Nom d&apos;utilisateur" name="username_combo" tool_tip="Nom d&apos;utilisateur que vous avez choisi lors de votre inscription (par exemple, bobsmith12 ou Steller Sunshine)."/>
@ -12,7 +15,7 @@
<button label="Connexion" name="connect_btn"/>
<check_box label="Mémoriser mes informations" name="remember_check"/>
<text name="forgot_password_text">Mot de passe oublié</text>
<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>

View File

View File

View File

View File

View File

View File

View File

View File

@ -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

View File

@ -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