Merge
commit
96bb17f20b
1
.hgtags
1
.hgtags
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -198,7 +198,7 @@ public:
|
|||
void setHasMipMaps(bool hasMips) { mHasMipMaps = hasMips; }
|
||||
|
||||
protected:
|
||||
S32 mIndex;
|
||||
const S32 mIndex;
|
||||
U32 mCurrTexture;
|
||||
eTextureType mCurrTexType;
|
||||
eTextureBlendType mCurrBlendType;
|
||||
|
|
|
|||
|
|
@ -443,6 +443,7 @@ void LLComboBox::onFocusLost()
|
|||
{
|
||||
mTextEntry->selectAll();
|
||||
}
|
||||
mButton->setForcePressedState(false);
|
||||
LLUICtrl::onFocusLost();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2292,6 +2292,7 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
|
|||
sHandleLeftMouseUp = true;
|
||||
break;
|
||||
}
|
||||
sHandleDoubleClick = true;
|
||||
|
||||
//if (gDebugClicks)
|
||||
//{
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
3.8.3
|
||||
3.8.4
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -23,4 +23,7 @@
|
|||
<command name="snapshot"/>
|
||||
<command name="facebook"/>
|
||||
</left_toolbar>
|
||||
<right_toolbar
|
||||
button_display_mode="icons_only">
|
||||
</right_toolbar>
|
||||
</toolbars>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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>);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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*)
|
||||
|
|
|
|||
|
|
@ -201,11 +201,13 @@ private:
|
|||
|
||||
std::map<std::string, std::string> mStatusText;
|
||||
|
||||
|
||||
protected:
|
||||
LLSD mMediaSettings;
|
||||
|
||||
public:
|
||||
static bool sShowObjectCost;
|
||||
static bool sPreviousFocusOnAvatar;
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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()
|
|||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -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); };
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -97,6 +97,7 @@ void LLPanelGroupBulkImpl::callbackClickAdd(void* userdata)
|
|||
if(picker)
|
||||
{
|
||||
root_floater->addDependentFloater(picker);
|
||||
LLGroupMgr::getInstance()->sendCapGroupMembersRequest(panelp->mImplementation->mGroupID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@ private:
|
|||
*/
|
||||
S32 mSelectedParcelID;
|
||||
LLUUID mLastSelectedRegionID;
|
||||
F64 mNextCovenantUpdateTime; //seconds since client start
|
||||
|
||||
LLPanel* mForSalePanel;
|
||||
LLPanel* mYouAreHerePanel;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -506,6 +506,8 @@ public:
|
|||
|
||||
bool unlinkObjects();
|
||||
|
||||
void confirmUnlinkObjects(const LLSD& notification, const LLSD& response);
|
||||
|
||||
bool enableLinkObjects();
|
||||
|
||||
bool enableUnlinkObjects();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"))
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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/",
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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's inventory?
|
||||
Are you sure you want to return all listed objects back to their owner's inventory? This will return ALL scripted objects in the region!
|
||||
<tag>confirm</tag>
|
||||
<usetemplate
|
||||
name="okcancelbuttons"
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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'utilisateur" name="username_combo" tool_tip="Nom d'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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue