Ansariel 2022-08-30 09:43:24 +02:00
commit 29cf23c852
143 changed files with 1759 additions and 1028 deletions

View File

@ -724,9 +724,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>4699b8389dfb754da0393ddb5d325722</string>
<string>f283a064c30695bd7bf071f1bd481f32</string>
<key>url</key>
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/95882/856117/colladadom-2.3.569219-darwin64-569219.tar.bz2</string>
<string>https://3p.firestormviewer.org/colladadom-2.3.222232011-darwin64-222232011.tar.bz2</string>
</map>
<key>name</key>
<string>darwin64</string>
@ -736,9 +736,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>e1a8e9eca2894687b3532474ffc9b326</string>
<string>30b1a9b7637f7a1546d38430064ca582</string>
<key>url</key>
<string>http://3p.firestormviewer.org/colladadom-2.3.222130404-linux64-222130404.tar.bz2</string>
<string>https://3p.firestormviewer.org/colladadom-2.3.222261253-linux64-222261253.tar.bz2</string>
</map>
<key>name</key>
<string>linux64</string>
@ -748,9 +748,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>343e46ea49a08ad6596d3dc702d5b812</string>
<string>1c094d709a35b252bba7b6ef1871085c</string>
<key>url</key>
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/95883/856128/colladadom-2.3.569219-windows-569219.tar.bz2</string>
<string>https://3p.firestormviewer.org/colladadom-2.3.222231850-windows-222231850.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@ -760,9 +760,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>de5bdfb61b31db56c5fe7d0962ad11e2</string>
<string>a7596da3696fc423ec1bc7d6764c01ab</string>
<key>url</key>
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/95884/856129/colladadom-2.3.569219-windows64-569219.tar.bz2</string>
<string>https://3p.firestormviewer.org/colladadom-2.3.222231903-windows64-222231903.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
@ -2939,7 +2939,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<string>http://3p.firestormviewer.org/threejs-0.132.2-linux64-213500940.tar.bz2</string>
</map>
<key>name</key>
<string>darwin64</string>
<string>linux64</string>
</map>
<key>darwin64</key>
<map>

View File

@ -6,8 +6,10 @@
## 3.8 added VS_DEBUGGER_WORKING_DIRECTORY support
cmake_minimum_required(VERSION 3.12.0 FATAL_ERROR)
set(ROOT_PROJECT_NAME "SecondLife" CACHE STRING
"The root project/makefile/solution name. Defaults to SecondLife.")
set(CMAKE_CXX_STANDARD 17) #<FS> Enable c++17 on all platforms
set(ROOT_PROJECT_NAME "Firestorm" CACHE STRING
"The root project/makefile/solution name. Defaults to Firestorm.")
project(${ROOT_PROJECT_NAME})
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
@ -21,8 +23,8 @@ if (WINDOWS)
endif (WINDOWS)
if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
"Build type. One of: Debug Release RelWithDebInfo" FORCE)
set(CMAKE_BUILD_TYPE Release CACHE STRING
"Build type. One of: Release RelWithDebInfo" FORCE)
endif (NOT CMAKE_BUILD_TYPE)
#<FS:AW optional opensim support>

View File

@ -109,38 +109,6 @@ if (WINDOWS)
/DNOMINMAX
# /DDOM_DYNAMIC # For shared library colladadom
)
# <FS:Ansariel> AVX/AVX2 support
if (USE_AVX_OPTIMIZATION)
add_compile_options(
/GS
/TP
/W3
/c
/Zc:forScope
/nologo
/Oy-
/Oi
/Ot
/arch:AVX
/fp:fast
)
elseif (USE_AVX2_OPTIMIZATION)
add_compile_options(
/GS
/TP
/W3
/c
/Zc:forScope
/nologo
/Oy-
/Oi
/Ot
/arch:AVX2
/fp:fast
)
else (USE_AVX_OPTIMIZATION)
# </FS:Ansariel> AVX/AVX2 support
add_compile_options(
/GS
/TP
@ -154,13 +122,20 @@ if (WINDOWS)
# /arch:SSE2
/fp:fast
)
# Nicky: x64 implies SSE2
if( ADDRESS_SIZE EQUAL 32 )
add_definitions( /arch:SSE2 )
endif()
# <FS:Ansariel> AVX/AVX2 support
if (USE_AVX_OPTIMIZATION)
add_compile_options(/arch:AVX)
elseif (USE_AVX2_OPTIMIZATION)
add_compile_options(/arch:AVX2)
else (USE_AVX_OPTIMIZATION)
# Nicky: x64 implies SSE2
if (ADDRESS_SIZE EQUAL 32)
add_compile_options(/arch:SSE2)
endif()
endif (USE_AVX_OPTIMIZATION)
# </FS:Ansariel> AVX/AVX2 support
# Are we using the crummy Visual Studio KDU build workaround?
if (NOT VS_DISABLE_FATAL_WARNINGS)
add_definitions(/WX)
@ -276,9 +251,13 @@ if (LINUX OR DARWIN)
set(GCC_CXX_WARNINGS "$[GCC_WARNINGS] -Wno-reorder -Wno-unused-const-variable -Wno-format-extra-args -Wno-unused-private-field -Wno-unused-function -Wno-tautological-compare -Wno-empty-body -Wno-unused-variable -Wno-unused-value")
else (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" AND DARWIN AND XCODE_VERSION GREATER 4.9)
#elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
set(GCC_CXX_WARNINGS "${GCC_WARNINGS} -Wno-reorder -Wno-non-virtual-dtor")
set(GCC_CXX_WARNINGS "${GCC_WARNINGS} -Wno-reorder -Wno-non-virtual-dtor -Wno-unused-variable")
endif ()
if(LINUX)
set(GCC_CXX_WARNINGS "${GCC_WARNINGS} -Wno-reorder -Wno-non-virtual-dtor -Wno-unused-variable -Wno-unused-but-set-variable -Wno-pragmas -Wno-deprecated")
endif()
set(CMAKE_C_FLAGS "${GCC_WARNINGS} ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${GCC_CXX_WARNINGS} ${CMAKE_CXX_FLAGS}")

View File

@ -421,49 +421,6 @@ public:
static std::string typeString(Type type); // Return human-readable type as a string
};
struct llsd_select_bool : public std::unary_function<LLSD, LLSD::Boolean>
{
LLSD::Boolean operator()(const LLSD& sd) const
{
return sd.asBoolean();
}
};
struct llsd_select_integer : public std::unary_function<LLSD, LLSD::Integer>
{
LLSD::Integer operator()(const LLSD& sd) const
{
return sd.asInteger();
}
};
struct llsd_select_real : public std::unary_function<LLSD, LLSD::Real>
{
LLSD::Real operator()(const LLSD& sd) const
{
return sd.asReal();
}
};
struct llsd_select_float : public std::unary_function<LLSD, F32>
{
F32 operator()(const LLSD& sd) const
{
return (F32)sd.asReal();
}
};
struct llsd_select_uuid : public std::unary_function<LLSD, LLSD::UUID>
{
LLSD::UUID operator()(const LLSD& sd) const
{
return sd.asUUID();
}
};
struct llsd_select_string : public std::unary_function<LLSD, LLSD::String>
{
LLSD::String operator()(const LLSD& sd) const
{
return sd.asString();
}
};
LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLSD& llsd);
namespace llsd

View File

@ -40,31 +40,6 @@
// <ND> For strcmp
#include <string.h>
#endif
// Use to compare the first element only of a pair
// e.g. typedef std::set<std::pair<int, Data*>, compare_pair<int, Data*> > some_pair_set_t;
template <typename T1, typename T2>
struct compare_pair_first
{
bool operator()(const std::pair<T1, T2>& a, const std::pair<T1, T2>& b) const
{
return a.first < b.first;
}
};
template <typename T1, typename T2>
struct compare_pair_greater
{
bool operator()(const std::pair<T1, T2>& a, const std::pair<T1, T2>& b) const
{
if (!(a.first < b.first))
return true;
else if (!(b.first < a.first))
return false;
else
return !(a.second < b.second);
}
};
// Use to compare the contents of two pointers (e.g. std::string*)
template <typename T>
struct compare_pointer_contents
@ -123,58 +98,6 @@ struct DeletePairedPointerArray
};
// Alternate version of the above so that has a more cumbersome
// syntax, but it can be used with compositional functors.
// NOTE: The functor retuns a bool because msdev bombs during the
// composition if you return void. Once we upgrade to a newer
// compiler, the second unary_function template parameter can be set
// to void.
//
// Here's a snippet showing how you use this object:
//
// typedef std::map<int, widget*> map_type;
// map_type widget_map;
// ... // add elements
// // delete them all
// for_each(widget_map.begin(),
// widget_map.end(),
// llcompose1(DeletePointerFunctor<widget>(),
// llselect2nd<map_type::value_type>()));
template<typename T>
struct DeletePointerFunctor : public std::unary_function<T*, bool>
{
bool operator()(T* ptr) const
{
delete ptr;
return true;
}
};
// See notes about DeleteArray for why you should consider avoiding this.
template<typename T>
struct DeleteArrayFunctor : public std::unary_function<T*, bool>
{
bool operator()(T* ptr) const
{
delete[] ptr;
return true;
}
};
// CopyNewPointer is a simple helper which accepts a pointer, and
// returns a new pointer built with the copy constructor. Example:
//
// transform(in.begin(), in.end(), out.end(), CopyNewPointer());
struct CopyNewPointer
{
template<typename T> T* operator()(const T* ptr) const
{
return new T(*ptr);
}
};
template<typename T, typename ALLOC>
void delete_and_clear(std::list<T*, ALLOC>& list)
{
@ -363,161 +286,6 @@ OutputIter ll_transform_n(
}
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996-1998
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
// helper to deal with the fact that MSDev does not package
// select... with the stl. Look up usage on the sgi website.
template <class _Pair>
struct _LLSelect1st : public std::unary_function<_Pair, typename _Pair::first_type> {
const typename _Pair::first_type& operator()(const _Pair& __x) const {
return __x.first;
}
};
template <class _Pair>
struct _LLSelect2nd : public std::unary_function<_Pair, typename _Pair::second_type>
{
const typename _Pair::second_type& operator()(const _Pair& __x) const {
return __x.second;
}
};
template <class _Pair> struct llselect1st : public _LLSelect1st<_Pair> {};
template <class _Pair> struct llselect2nd : public _LLSelect2nd<_Pair> {};
// helper to deal with the fact that MSDev does not package
// compose... with the stl. Look up usage on the sgi website.
template <class _Operation1, class _Operation2>
class ll_unary_compose :
public std::unary_function<typename _Operation2::argument_type,
typename _Operation1::result_type>
{
protected:
_Operation1 __op1;
_Operation2 __op2;
public:
ll_unary_compose(const _Operation1& __x, const _Operation2& __y)
: __op1(__x), __op2(__y) {}
typename _Operation1::result_type
operator()(const typename _Operation2::argument_type& __x) const {
return __op1(__op2(__x));
}
};
template <class _Operation1, class _Operation2>
inline ll_unary_compose<_Operation1,_Operation2>
llcompose1(const _Operation1& __op1, const _Operation2& __op2)
{
return ll_unary_compose<_Operation1,_Operation2>(__op1, __op2);
}
template <class _Operation1, class _Operation2, class _Operation3>
class ll_binary_compose
: public std::unary_function<typename _Operation2::argument_type,
typename _Operation1::result_type> {
protected:
_Operation1 _M_op1;
_Operation2 _M_op2;
_Operation3 _M_op3;
public:
ll_binary_compose(const _Operation1& __x, const _Operation2& __y,
const _Operation3& __z)
: _M_op1(__x), _M_op2(__y), _M_op3(__z) { }
typename _Operation1::result_type
operator()(const typename _Operation2::argument_type& __x) const {
return _M_op1(_M_op2(__x), _M_op3(__x));
}
};
template <class _Operation1, class _Operation2, class _Operation3>
inline ll_binary_compose<_Operation1, _Operation2, _Operation3>
llcompose2(const _Operation1& __op1, const _Operation2& __op2,
const _Operation3& __op3)
{
return ll_binary_compose<_Operation1,_Operation2,_Operation3>
(__op1, __op2, __op3);
}
// helpers to deal with the fact that MSDev does not package
// bind... with the stl. Again, this is from sgi.
template <class _Operation>
class llbinder1st :
public std::unary_function<typename _Operation::second_argument_type,
typename _Operation::result_type> {
protected:
_Operation op;
typename _Operation::first_argument_type value;
public:
llbinder1st(const _Operation& __x,
const typename _Operation::first_argument_type& __y)
: op(__x), value(__y) {}
typename _Operation::result_type
operator()(const typename _Operation::second_argument_type& __x) const {
return op(value, __x);
}
};
template <class _Operation, class _Tp>
inline llbinder1st<_Operation>
llbind1st(const _Operation& __oper, const _Tp& __x)
{
typedef typename _Operation::first_argument_type _Arg1_type;
return llbinder1st<_Operation>(__oper, _Arg1_type(__x));
}
template <class _Operation>
class llbinder2nd
: public std::unary_function<typename _Operation::first_argument_type,
typename _Operation::result_type> {
protected:
_Operation op;
typename _Operation::second_argument_type value;
public:
llbinder2nd(const _Operation& __x,
const typename _Operation::second_argument_type& __y)
: op(__x), value(__y) {}
typename _Operation::result_type
operator()(const typename _Operation::first_argument_type& __x) const {
return op(__x, value);
}
};
template <class _Operation, class _Tp>
inline llbinder2nd<_Operation>
llbind2nd(const _Operation& __oper, const _Tp& __x)
{
typedef typename _Operation::second_argument_type _Arg2_type;
return llbinder2nd<_Operation>(__oper, _Arg2_type(__x));
}
/**
* Compare std::type_info* pointers a la std::less. We break this out as a
* separate function for use in two different std::less specializations.
@ -548,8 +316,7 @@ bool before(const std::type_info* lhs, const std::type_info* rhs)
namespace std
{
template <>
struct less<const std::type_info*>:
public std::binary_function<const std::type_info*, const std::type_info*, bool>
struct less<const std::type_info*>
{
bool operator()(const std::type_info* lhs, const std::type_info* rhs) const
{
@ -558,8 +325,7 @@ namespace std
};
template <>
struct less<std::type_info*>:
public std::binary_function<std::type_info*, std::type_info*, bool>
struct less<std::type_info*>
{
bool operator()(std::type_info* lhs, std::type_info* rhs) const
{

View File

@ -42,6 +42,7 @@
// [RLVa:KB] - Checked: RLVa-2.1.0
#include <list>
// [/RLVa:KB]
#include <string_view>
#if LL_LINUX
#include <wctype.h>

View File

@ -531,7 +531,7 @@ namespace tut
result.ensure();
}
struct TestLargeMessage: public std::binary_function<size_t, size_t, bool>
struct TestLargeMessage
{
TestLargeMessage(const std::string& PYTHON_, const std::string& reader_module_,
const std::string& test_name_):

View File

@ -24,9 +24,11 @@ include_directories (${CMAKE_CURRENT_SOURCE_DIR})
include_directories(
${LLMESSAGE_INCLUDE_DIRS}
${LLCOMMON_INCLUDE_DIRS}
${LLCOREHTTP_INCLUDE_DIRS}
# ${LLCOREHTTP_INCLUDE_DIRS} <FS:ND> Make this system include directories.
)
include_directories( SYSTEM ${LLCOREHTTP_INCLUDE_DIRS} )
set(llcorehttp_SOURCE_FILES
bufferarray.cpp
bufferstream.cpp

View File

@ -1269,5 +1269,5 @@ U32 LLParcel::countExperienceKeyType( U32 type )
return std::count_if(
boost::begin(mExperienceKeys | boost::adaptors::map_values),
boost::end(mExperienceKeys | boost::adaptors::map_values),
std::bind2nd(std::equal_to<U32>(), type));
[type](U32 key) { return key == type; });
}

View File

@ -141,14 +141,14 @@ struct LLCalcParser : grammar<LLCalcParser>
power =
unary_expr[power.value = arg1] >>
*('^' >> assert_syntax(unary_expr[power.value = /*<FS:ND/> Replace bind with phoenix::bind to make GCC happy*/ phoenix::bind(&powf)(power.value, arg1)]))
*('^' >> assert_syntax(unary_expr[power.value = /*<FS:ND/> Replace bind with phoenix::bind to make GCC happy*/ phoenix::bind(&LLCalcParser::_pow)(self, power.value, arg1)]))
;
term =
power[term.value = arg1] >>
*(('*' >> assert_syntax(power[term.value *= arg1])) |
('/' >> assert_syntax(power[term.value /= arg1])) |
('%' >> assert_syntax(power[term.value = /*<FS:ND/> Replace bind with phoenix::bind to make GCC happy*/ phoenix::bind(&fmodf)(term.value, arg1)]))
('%' >> assert_syntax(power[term.value = /*<FS:ND/> Replace bind with phoenix::bind to make GCC happy*/ phoenix::bind(&LLCalcParser::_fmod)(self, term.value, arg1)]))
)
;
@ -195,6 +195,8 @@ private:
F32 _floor(const F32& a) const { return (F32)llfloor(a); }
F32 _ceil(const F32& a) const { return llceil(a); }
F32 _atan2(const F32& a,const F32& b) const { return atan2(a,b); }
F32 _pow(const F32& a, const F32& b) const { return powf(a, b); }
F32 _fmod(const F32&a, const F32& b) const { return fmodf(a, b); }
LLCalc::calc_map_t* mConstants;
LLCalc::calc_map_t* mVariables;

View File

@ -443,12 +443,11 @@ LLCircuit::LLCircuit(const F32Seconds circuit_heartbeat_interval, const F32Secon
LLCircuit::~LLCircuit()
{
// delete pointers in the map.
std::for_each(mCircuitData.begin(),
mCircuitData.end(),
llcompose1(
DeletePointerFunctor<LLCircuitData>(),
llselect2nd<circuit_data_map::value_type>()));
// delete pointers in the map.
for (auto circ_pair : mCircuitData)
{
delete circ_pair.second;
}
}
LLCircuitData *LLCircuit::addCircuitData(const LLHost &host, TPACKETID in_id)

View File

@ -62,7 +62,7 @@ void LLDispatcher::copyAllHandlerNames(keys_t& names) const
mHandlers.begin(),
mHandlers.end(),
std::back_insert_iterator<keys_t>(names),
llselect1st<dispatch_map_t::value_type>());
[](const dispatch_map_t::value_type& pair) { return pair.first; });
}
bool LLDispatcher::dispatch(

View File

@ -32,18 +32,8 @@
#include "llframetimer.h"
// This is used for the stl search_n function.
#if _MSC_VER >= 1500 // VC9 has a bug in search_n
struct eq_message_throttle_entry : public std::binary_function< LLMessageThrottleEntry, LLMessageThrottleEntry, bool >
{
bool operator()(const LLMessageThrottleEntry& a, const LLMessageThrottleEntry& b) const
{
return a.getHash() == b.getHash();
}
};
#else
bool eq_message_throttle_entry(LLMessageThrottleEntry a, LLMessageThrottleEntry b)
{ return a.getHash() == b.getHash(); }
#endif
const U64 SEC_TO_USEC = 1000000;
@ -118,14 +108,8 @@ BOOL LLMessageThrottle::addViewerAlert(const LLUUID& to, const std::string& mesg
LLMessageThrottleEntry entry(hash, LLFrameTimer::getTotalTime());
// Check if this message is already in the list.
#if _MSC_VER >= 1500 // VC9 has a bug in search_n
// SJB: This *should* work but has not been tested yet *TODO: Test!
message_list_iterator_t found = std::find_if(message_list->begin(), message_list->end(),
std::bind2nd(eq_message_throttle_entry(), entry));
#else
message_list_iterator_t found = std::search_n(message_list->begin(), message_list->end(),
1, entry, eq_message_throttle_entry);
#endif
if (found == message_list->end())
{
// This message was not found. Add it to the list.
@ -152,14 +136,8 @@ BOOL LLMessageThrottle::addAgentAlert(const LLUUID& agent, const LLUUID& task, c
LLMessageThrottleEntry entry(hash, LLFrameTimer::getTotalTime());
// Check if this message is already in the list.
#if _MSC_VER >= 1500 // VC9 has a bug in search_n
// SJB: This *should* work but has not been tested yet *TODO: Test!
message_list_iterator_t found = std::find_if(message_list->begin(), message_list->end(),
std::bind2nd(eq_message_throttle_entry(), entry));
#else
message_list_iterator_t found = std::search_n(message_list->begin(), message_list->end(),
1, entry, eq_message_throttle_entry);
#endif
if (found == message_list->end())
{

View File

@ -22,18 +22,14 @@ include_directories(
${LLRENDER_INCLUDE_DIRS}
# ${LIBS_PREBUILT_DIR}/include/collada
# ${LIBS_PREBUILT_DIR}/include/collada/1.4
${COLLADA_INCLUDE_DIRS}
${LLCHARACTER_INCLUDE_DIRS}
${TINYGLTF_INCLUDE_DIR}
)
include_directories(SYSTEM
${LLCOMMON_SYSTEM_INCLUDE_DIRS}
${LLXML_SYSTEM_INCLUDE_DIRS}
)
include_directories(SYSTEM
${LLCOMMON_SYSTEM_INCLUDE_DIRS}
${LLXML_SYSTEM_INCLUDE_DIRS}
${LLPHYSICSEXTENSIONS_INCLUDE_DIRS}
${COLLADA_INCLUDE_DIRS}
)
set(llprimitive_SOURCE_FILES

View File

@ -166,7 +166,6 @@ void LLDockableFloater::setMinimized(BOOL minimize)
{
// minimizing a docked floater just hides it
setVisible(FALSE);
gFocusMgr.releaseFocusIfNeeded(this); // <FS:Ansariel> FIRE-31882: Release focus or main menu bar would receive it in LLViewerWindow::updateKeyboardFocus()
}
else
{

View File

@ -108,7 +108,7 @@ public:
*
* By default returns false.
*/
virtual bool overlapsScreenChannel() { return mOverlapsScreenChannel && getVisible() && isDocked(); }
virtual bool overlapsScreenChannel() const { return mOverlapsScreenChannel && getVisible() && isDocked(); }
virtual void setOverlapsScreenChannel(bool overlaps) { mOverlapsScreenChannel = overlaps; }
bool getUniqueDocking() { return mUniqueDocking; }
@ -131,7 +131,7 @@ protected:
boost::function<BOOL ()> mIsDockedStateForcedCallback;
//private: // <FS:Ansariel> Make mDockControl accessible from children because of FIRE-16803
std::auto_ptr<LLDockControl> mDockControl;
std::unique_ptr<LLDockControl> mDockControl;
private: // <FS:Ansariel> Make mDockControl accessible from children because of FIRE-16803
LLUIImagePtr mDockTongue;
static LLHandle<LLFloater> sInstanceHandle;

View File

@ -1545,16 +1545,18 @@ void LLMenuItemBranchDownGL::onFocusLost()
{
// needed for tab-based selection
LLMenuItemBranchGL::onFocusLost();
LLMenuGL::setKeyboardMode(FALSE);
setHighlight(FALSE);
// <FS:Ansariel> FIRE-31882 / FIRE-31896 / FIRE-31913 / FIRE-31920: Fix all kind of weird menu focus issues
//LLMenuGL::setKeyboardMode(FALSE);
//setHighlight(FALSE);
}
void LLMenuItemBranchDownGL::setFocus(BOOL b)
{
// needed for tab-based selection
LLMenuItemBranchGL::setFocus(b);
LLMenuGL::setKeyboardMode(b);
setHighlight(b);
// <FS:Ansariel> FIRE-31882 / FIRE-31896 / FIRE-31913 / FIRE-31920: Fix all kind of weird menu focus issues
//LLMenuGL::setKeyboardMode(b);
//setHighlight(b);
}
BOOL LLMenuItemBranchDownGL::handleKeyHere(KEY key, MASK mask)

View File

@ -2454,6 +2454,18 @@ void LLTextBase::setFont(const LLFontGL* font)
{
mFont = font;
mStyleDirty = true;
// <FS:Ansariel> FIRE-29425: User-selectable font and size for notecards
for (auto segment : mSegments)
{
LLStyleConstSP style = segment->getStyle();
LLStyleSP new_style(new LLStyle(*style));
new_style->setFont(mFont);
LLStyleConstSP sp(new_style);
segment->setStyle(sp);
}
needsReflow();
// </FS:Ansariel>
}
void LLTextBase::needsReflow(S32 index)

View File

@ -505,14 +505,14 @@ attributedStringInfo getSegments(NSAttributedString *str)
// e.g. OS Window for upload something or Input Window...
// mModifiers instance variable is for insertText: or insertText:replacementRange: (by Pell Smit)
mModifiers = [theEvent modifierFlags];
unichar ch = [[theEvent charactersIgnoringModifiers] characterAtIndex:0];
bool acceptsText = mHasMarkedText ? false : callKeyDown(&eventData, keycode, mModifiers, ch);
bool acceptsText = mHasMarkedText ? false : callKeyDown(&eventData, keycode, mModifiers, [[theEvent characters] characterAtIndex:0]);
unichar ch;
if (acceptsText &&
!mMarkedTextAllowed &&
!(mModifiers & (NSControlKeyMask | NSCommandKeyMask)) && // commands don't invoke InputWindow
![(LLAppDelegate*)[NSApp delegate] romanScript] &&
(ch = [[theEvent charactersIgnoringModifiers] characterAtIndex:0]) > ' ' &&
ch > ' ' &&
ch != NSDeleteCharacter &&
(ch < 0xF700 || ch > 0xF8FF)) // 0xF700-0xF8FF: reserved for function keys on the keyboard(from NSEvent.h)
{
@ -549,7 +549,9 @@ attributedStringInfo getSegments(NSAttributedString *str)
if (mModifiers & mask)
{
eventData.mKeyEvent = NativeKeyEventData::KEYDOWN;
callKeyDown(&eventData, [theEvent keyCode], 0, [[theEvent characters] characterAtIndex:0]);
// <FS:Ansariel> Speculative fix for FIRE-31473
//callKeyDown(&eventData, [theEvent keyCode], 0, [[theEvent characters] characterAtIndex:0]);
callKeyDown(&eventData, [theEvent keyCode], 0, L'\0');
}
else
{

View File

@ -476,14 +476,6 @@ long showAlert(std::string text, std::string title, int type)
unsigned int getModifiers()
{
// <FS:ND> Try current event of app first, otherwise we might get wrong results
NSEvent *pEvent = [NSApp currentEvent];
if( pEvent != nil )
{
return [pEvent modifierFlags];
}
// </FS:ND>
return [NSEvent modifierFlags];
}

View File

@ -105,12 +105,8 @@ include_directories(
${LLWINDOW_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
${LLLOGIN_INCLUDE_DIRS}
${LIBS_PREBUILT_DIR}/include/collada
${LIBS_PREBUILD_DIR}/include/hunspell
${OPENAL_LIB_INCLUDE_DIRS}
${LIBS_PREBUILT_DIR}/include/collada/1.4
${GROWL_INCLUDE_DIRS}
${COLLADA_INCLUDE_DIRS}
${LLAPPEARANCE_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
@ -121,6 +117,10 @@ include_directories(SYSTEM
${LLCOMMON_SYSTEM_INCLUDE_DIRS}
${LLXML_SYSTEM_INCLUDE_DIRS}
${LLPHYSICSEXTENSIONS_INCLUDE_DIRS}
${LIBS_PREBUILT_DIR}/include/collada
${LIBS_PREBUILT_DIR}/include/collada/1.4
${LIBS_PREBUILD_DIR}/include/hunspell
${COLLADA_INCLUDE_DIRS}
)
if (USE_BUGSPLAT)
@ -171,6 +171,7 @@ set(viewer_SOURCE_FILES
fsfloaterim.cpp
fsfloaterimcontainer.cpp
fsfloaternearbychat.cpp
fsfloaterpartialinventory.cpp
fsfloaterplacedetails.cpp
fsfloaterposestand.cpp
fsfloaterprofile.cpp
@ -950,6 +951,7 @@ set(viewer_HEADER_FILES
fsfloaterim.h
fsfloaterimcontainer.h
fsfloaternearbychat.h
fsfloaterpartialinventory.h
fsfloaterplacedetails.h
fsfloaterposestand.h
fsfloaterprofile.h
@ -2789,31 +2791,32 @@ if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIE
if (USE_BUGSPLAT)
# BugSplat symbol-file generation
if (WINDOWS)
#<FS:ND> Comment this out, we do our own symbol package which also includes the exe and build_data.json
# Just pack up a tarball containing only the .pdb file for the
# executable. Because we intend to use cygwin tar, we must render
# VIEWER_SYMBOL_FILE in cygwin path syntax.
execute_process(COMMAND "cygpath" "-u" "${VIEWER_SYMBOL_FILE}"
OUTPUT_VARIABLE VIEWER_SYMBOL_FILE_CYGWIN
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND "cygpath" "-u" "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}"
OUTPUT_VARIABLE PARENT_DIRECTORY_CYGWIN
OUTPUT_STRIP_TRAILING_WHITESPACE)
add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}"
# Use of 'tar ...j' here assumes VIEWER_SYMBOL_FILE endswith .tar.bz2;
# testing a string suffix is painful enough in CMake language that
# we'll continue assuming it until forced to generalize.
COMMAND "tar"
ARGS
"cjf"
"${VIEWER_SYMBOL_FILE_CYGWIN}"
"-C"
"${PARENT_DIRECTORY_CYGWIN}"
"firestorm-bin.pdb"
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/firestorm-bin.pdb"
COMMENT "Packing viewer PDB into ${VIEWER_SYMBOL_FILE_CYGWIN}"
)
add_custom_target(generate_symbols DEPENDS "${VIEWER_SYMBOL_FILE}" ${VIEWER_BINARY_NAME})
add_dependencies(generate_symbols ${VIEWER_BINARY_NAME})
# execute_process(COMMAND "cygpath" "-u" "${VIEWER_SYMBOL_FILE}"
# OUTPUT_VARIABLE VIEWER_SYMBOL_FILE_CYGWIN
# OUTPUT_STRIP_TRAILING_WHITESPACE)
# execute_process(COMMAND "cygpath" "-u" "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}"
# OUTPUT_VARIABLE PARENT_DIRECTORY_CYGWIN
# OUTPUT_STRIP_TRAILING_WHITESPACE)
# add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}"
# # Use of 'tar ...j' here assumes VIEWER_SYMBOL_FILE endswith .tar.bz2;
# # testing a string suffix is painful enough in CMake language that
# # we'll continue assuming it until forced to generalize.
# COMMAND "tar"
# ARGS
# "cjf"
# "${VIEWER_SYMBOL_FILE_CYGWIN}"
# "-C"
# "${PARENT_DIRECTORY_CYGWIN}"
# "firestorm-bin.pdb"
# DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/firestorm-bin.pdb"
# COMMENT "Packing viewer PDB into ${VIEWER_SYMBOL_FILE_CYGWIN}"
# )
# add_custom_target(generate_symbols DEPENDS "${VIEWER_SYMBOL_FILE}" ${VIEWER_BINARY_NAME})
# add_dependencies(generate_symbols ${VIEWER_BINARY_NAME})
endif (WINDOWS)
if (DARWIN)
# Have to run dsymutil first, then pack up the resulting .dSYM directory
@ -2872,7 +2875,7 @@ if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIE
endif (LINUX)
endif (USE_BUGSPLAT)
if (NOT LINUX) #Linux generates symbols via viewer_manifest.py/fs_viewer_manifest.py
if (DARWIN) #Linux/Windows generates symbols via viewer_manifest.py/fs_viewer_manifest.py
# for both Bugsplat and Breakpad
add_dependencies(llpackage generate_symbols)
endif()

View File

@ -223,19 +223,18 @@ bool AOEngine::foreignAnimations()
LL_DEBUGS("AOEngine") << "Checking for foreign animation on seat " << seat << LL_ENDL;
for (LLVOAvatar::AnimSourceIterator sourceIterator = gAgentAvatarp->mAnimationSources.begin();
sourceIterator != gAgentAvatarp->mAnimationSources.end(); ++sourceIterator)
for (const auto&[source_id, animation_id] : gAgentAvatarp->mAnimationSources)
{
// skip animations run by the avatar itself
if (sourceIterator->first != gAgentID)
if (source_id != gAgentID)
{
// find the source object where the animation came from
LLViewerObject* source = gObjectList.findObject(sourceIterator->first);
LLViewerObject* source = gObjectList.findObject(source_id);
// proceed if it's not an attachment
if (source && !source->isAttachment())
{
LL_DEBUGS("AOEngine") << "Source " << sourceIterator->first << " is running animation " << sourceIterator->second << LL_ENDL;
LL_DEBUGS("AOEngine") << "Source " << source_id << " is running animation " << animation_id << LL_ENDL;
// get the source's root prim
LLViewerObject* sourceRoot = dynamic_cast<LLViewerObject*>(source->getRoot());
@ -243,7 +242,7 @@ bool AOEngine::foreignAnimations()
// if the root prim is the same as the animation source, report back as TRUE
if (sourceRoot && sourceRoot->getID() == seat)
{
LL_DEBUGS("AOEngine") << "foreign animation " << sourceIterator->second << " found on seat." << LL_ENDL;
LL_DEBUGS("AOEngine") << "foreign animation " << animation_id << " found on seat." << LL_ENDL;
return true;
}
}
@ -1018,12 +1017,12 @@ bool AOEngine::createAnimationLink(const AOSet* set, AOSet::AOState* state, cons
if (cats)
{
for (S32 index = 0; index < cats->size(); ++index)
for (auto cat : *cats)
{
if (cats->at(index)->getName().compare(state->mName) == 0)
if (cat->getName().compare(state->mName) == 0)
{
LL_DEBUGS("AOEngine") << "UUID found!" << LL_ENDL;
newStateFolderUUID = cats->at(index)->getUUID();
newStateFolderUUID = cat->getUUID();
state->mInventoryUUID = newStateFolderUUID;
break;
}
@ -1195,8 +1194,7 @@ bool AOEngine::removeAnimation(const AOSet* set, AOSet::AOState* state, S32 inde
// this item was not an animation link, move it to lost and found
if (move)
{
LLInventoryModel* model = &gInventory;
model->changeItemParent(item, gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND), false);
gInventory.changeItemParent(item, gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND), false);
LLNotificationsUtil::add("AOForeignItemsFound", LLSD());
update();
return false;
@ -1209,7 +1207,7 @@ bool AOEngine::removeAnimation(const AOSet* set, AOSet::AOState* state, S32 inde
state->mAnimations.erase(state->mAnimations.begin() + index);
if (state->mAnimations.size() == 0)
if (state->mAnimations.empty())
{
LL_DEBUGS("AOEngine") << "purging folder " << state->mName << " from inventory because it's empty." << LL_ENDL;
@ -1219,12 +1217,18 @@ bool AOEngine::removeAnimation(const AOSet* set, AOSet::AOState* state, S32 inde
if (cats)
{
for (LLInventoryModel::cat_array_t::iterator it = cats->begin(); it != cats->end(); ++it)
for (auto cat : *cats)
{
LLPointer<LLInventoryCategory> cat = (*it);
std::vector<std::string> params;
LLStringUtil::getTokens(cat->getName(), params, ":");
std::string stateName = params[0];
if (params.empty())
{
LL_WARNS("AOEngine") << "Unexpected folder found in ao set folder: " << cat->getName() << LL_ENDL;
return false;
}
const std::string& stateName = params[0];
if (state->mName.compare(stateName) == 0)
{
@ -1290,25 +1294,25 @@ void AOEngine::reloadStateAnimations(AOSet::AOState* state)
if (items)
{
for (S32 num = 0; num < items->size(); ++num)
for (auto item : *items)
{
LL_DEBUGS("AOEngine") << "Found animation link " << items->at(num)->LLInventoryItem::getName()
<< " desc " << items->at(num)->LLInventoryItem::getDescription()
<< " asset " << items->at(num)->getAssetUUID() << LL_ENDL;
LL_DEBUGS("AOEngine") << "Found animation link " << item->LLInventoryItem::getName()
<< " desc " << item->LLInventoryItem::getDescription()
<< " asset " << item->getAssetUUID() << LL_ENDL;
AOSet::AOAnimation anim;
anim.mAssetUUID = items->at(num)->getAssetUUID();
LLViewerInventoryItem* linkedItem = items->at(num)->getLinkedItem();
anim.mAssetUUID = item->getAssetUUID();
LLViewerInventoryItem* linkedItem = item->getLinkedItem();
if (!linkedItem)
{
LL_WARNS("AOEngine") << "linked item for link " << items->at(num)->LLInventoryItem::getName() << " not found (broken link). Skipping." << LL_ENDL;
LL_WARNS("AOEngine") << "linked item for link " << item->LLInventoryItem::getName() << " not found (broken link). Skipping." << LL_ENDL;
continue;
}
anim.mName = linkedItem->LLInventoryItem::getName();
anim.mInventoryUUID = items->at(num)->getUUID();
anim.mInventoryUUID = item->getUUID();
S32 sortOrder;
if (!LLStringUtil::convertToS32(items->at(num)->LLInventoryItem::getDescription(), sortOrder))
if (!LLStringUtil::convertToS32(item->LLInventoryItem::getDescription(), sortOrder))
{
sortOrder = -1;
}
@ -1370,9 +1374,8 @@ void AOEngine::update()
if (categories)
{
for (S32 index = 0; index < categories->size(); ++index)
for (auto currentCategory : *categories)
{
LLViewerInventoryCategory* currentCategory = categories->at(index);
const std::string& setFolderName = currentCategory->getName();
if (setFolderName.empty())
@ -1383,6 +1386,11 @@ void AOEngine::update()
std::vector<std::string> params;
LLStringUtil::getTokens(setFolderName, params, ":");
if (params.empty())
{
LL_WARNS("AOEngine") << "Unexpected folder found in ao set folder: " << currentCategory->getName() << LL_ENDL;
continue;
}
AOSet* newSet = getSetByName(params[0]);
if (!newSet)
@ -1440,11 +1448,16 @@ void AOEngine::update()
gInventory.getDirectDescendentsOf(currentCategory->getUUID(), stateCategories, items);
newSet->setComplete(true);
for (S32 state_index = 0; state_index < stateCategories->size(); ++state_index)
for (auto stateCategory : *stateCategories)
{
std::vector<std::string> state_params;
LLStringUtil::getTokens(stateCategories->at(state_index)->getName(), state_params, ":");
std::string stateName = state_params[0];
LLStringUtil::getTokens(stateCategory->getName(), state_params, ":");
if (params.empty())
{
LL_WARNS("AOEngine") << "Unexpected state folder found in ao set: " << stateCategory->getName() << LL_ENDL;
continue;
}
const std::string& stateName = state_params[0];
AOSet::AOState* state = newSet->getStateByName(stateName);
if (!state)
@ -1454,7 +1467,7 @@ void AOEngine::update()
}
LL_DEBUGS("AOEngine") << "Reading state " << stateName << LL_ENDL;
state->mInventoryUUID = stateCategories->at(state_index)->getUUID();
state->mInventoryUUID = stateCategory->getUUID();
for (U32 num = 1; num < state_params.size(); ++num)
{
if (state_params[num] == "CY")
@ -1544,11 +1557,11 @@ void AOEngine::reload(bool aFromTimer)
AOSet* AOEngine::getSetByName(const std::string& name) const
{
AOSet* found = nullptr;
for (U32 index = 0; index < mSets.size(); ++index)
for (auto set : mSets)
{
if (mSets[index]->getName().compare(name) == 0)
if (set->getName().compare(name) == 0)
{
found = mSets[index];
found = set;
break;
}
}
@ -1692,9 +1705,8 @@ void AOEngine::saveState(const AOSet::AOState* state)
void AOEngine::saveSettings()
{
for (U32 index = 0; index < mSets.size(); ++index)
for (auto set : mSets)
{
AOSet* set = mSets[index];
if (set->getDirty())
{
saveSet(set);
@ -1772,9 +1784,9 @@ void AOEngine::inMouselook(bool mouselook)
void AOEngine::setDefaultSet(AOSet* set)
{
mDefaultSet = set;
for (U32 index = 0; index < mSets.size(); ++index)
for (auto set : mSets)
{
mSets[index]->setDirty(true);
set->setDirty(true);
}
}
@ -1910,12 +1922,12 @@ void AOEngine::tick()
gInventory.getDirectDescendentsOf(categoryID, categories, items);
LL_DEBUGS("AOEngine") << "cat " << categories->size() << " items " << items->size() << LL_ENDL;
for (S32 index = 0; index < categories->size(); ++index)
for (auto cat : *categories)
{
const std::string& catName = categories->at(index)->getName();
const std::string& catName = cat->getName();
if (catName.compare(ROOT_AO_FOLDER) == 0)
{
mAOFolder = categories->at(index)->getUUID();
mAOFolder = cat->getUUID();
break;
}
}

View File

@ -85,7 +85,6 @@
<binding key="DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
<binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/>
<binding key="" mask="NONE" mouse="LMB" command="walk_to"/>
<binding key="" mask="NONE" mouse="LMB" command="script_trigger_lbutton"/>
</third_person>

View File

@ -14698,17 +14698,6 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>1</integer>
</map>
<key>BasicUITooltips</key>
<map>
<key>Comment</key>
<string>Show tooltips for various 2D UI elements like buttons or checkboxes, won't supress tooltips like drag'n'drop, inworld, links or media</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>ShowHoverTips</key>
<map>
<key>Comment</key>
@ -22189,6 +22178,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>3</integer>
</map>
<key>360QualitySelection</key>
<map>
<key>Comment</key>
<string>Quality level for the 360 snapshot</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>128</integer>
</map>
<key>MFAHash</key>
<map>
<key>Comment</key>
@ -25732,6 +25732,28 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<string>Scripting</string>
</map>
<key>FSNotecardFontName</key>
<map>
<key>Comment</key>
<string>The name of the font used for the notecard editor</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>SansSerif</string>
</map>
<key>FSNotecardFontSize</key>
<map>
<key>Comment</key>
<string>The size of the font used for the notecard editor</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>Medium</string>
</map>
<key>FSEnableRightclickOnTransparentObjects</key>
<map>
<key>Comment</key>
@ -26260,5 +26282,16 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>473405</integer>
</map>
<key>FSUseCoRoFor360Capture</key>
<map>
<key>Comment</key>
<string>Use co-routine to extract 360 photos.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
</map>
</llsd>

View File

@ -72,9 +72,9 @@ std::string cmd_line_mPackagerTargetFolderName;
LLUUID cmd_line_mPackagerTargetFolder;
LLUUID cmd_line_mPackagerDest;
LLViewerInventoryItem::item_array_t findInventoryInFolder(const std::string& ifolder)
LLViewerInventoryItem::item_array_t findInventoryInFolder(std::string_view ifolder)
{
LLUUID folder = gInventory.findCategoryByName(ifolder);
LLUUID folder = gInventory.findCategoryByName(static_cast<std::string>(ifolder));
LLViewerInventoryCategory::cat_array_t cats;
LLViewerInventoryItem::item_array_t items;
gInventory.collectDescendents(folder, cats, items, FALSE);
@ -88,14 +88,15 @@ class JCZdrop : public LLEventTimer
public:
BOOL mRunning;
JCZdrop(std::stack<LLViewerInventoryItem*> stack, LLUUID dest, std::string sFolder, std::string sUUID, bool package = false) : LLEventTimer(1.f), mRunning(FALSE)
{
mPackage = package;
mStack = stack;
mDestination = dest;
mFolderName = sFolder;
mDropUUID = sUUID;
}
JCZdrop(std::stack<LLViewerInventoryItem*> stack, LLUUID dest, std::string_view sFolder, std::string_view sUUID, bool package = false)
: LLEventTimer(1.f),
mRunning(FALSE),
mPackage(package),
mStack(stack),
mDestination(dest),
mFolderName(sFolder),
mDropUUID(sUUID)
{ }
~JCZdrop()
{
@ -129,7 +130,7 @@ public:
LLViewerObject* objectp = gObjectList.findObject(mDestination);
if (objectp)
{
report_to_nearby_chat(std::string("transferring ") + subj->getName());
report_to_nearby_chat(std::string("Transferring ") + subj->getName());
LLToolDragAndDrop::dropInventory(objectp, subj, LLToolDragAndDrop::SOURCE_AGENT, gAgentID);
if (mStack.size() > 0)
{
@ -137,7 +138,7 @@ public:
}
else
{
return (mStack.size() == 0);
return (mStack.empty());
}
}
else
@ -156,7 +157,7 @@ private:
bool mPackage;
};
JCZdrop* zdrop;
JCZdrop* gZDrop{ nullptr };
class ZdCleanup: public LLEventTimer
{
@ -168,7 +169,7 @@ public:
BOOL tick()
{
zdrop = NULL;
gZDrop = nullptr;
return TRUE;
}
};
@ -193,7 +194,7 @@ class JCZtake : public LLEventTimer
public:
BOOL mRunning;
JCZtake(const LLUUID& target, bool package = false, LLUUID destination = LLUUID::null, std::string dtarget = "", EDeRezDestination dest = DRD_TAKE_INTO_AGENT_INVENTORY, bool use_selection = true, std::vector<U32> to_take = std::vector<U32>()) :
JCZtake(const LLUUID& target, bool package = false, const LLUUID& destination = LLUUID::null, std::string_view dtarget = "", EDeRezDestination dest = DRD_TAKE_INTO_AGENT_INVENTORY, bool use_selection = true, std::vector<U32> to_take = std::vector<U32>()) :
LLEventTimer(0.66f),
mTarget(target),
mRunning(FALSE),
@ -255,11 +256,14 @@ public:
mToTake.push_back(localid);
}
}
if (mToTake.size() > 0) mState = ZTS_TAKE;
if (!mToTake.empty())
{
mState = ZTS_TAKE;
}
break;
case ZTS_TAKE:
if (mToTake.size() > 0)
if (!mToTake.empty())
{
std::vector<LLPointer<LLViewerInventoryItem> > inventory = findInventoryInFolder(mFolderName);
mPackSize = mToTake.size() + inventory.size();
@ -285,7 +289,7 @@ public:
if (mToTake.size() % 10 == 0)
{
if (mToTake.size() == 0)
if (mToTake.empty())
{
if (mPackage)
{
@ -348,7 +352,8 @@ public:
if (itemstack.size() >= mPackSize || mCountdown == 0)
{
if (itemstack.size() < mPackSize) {
if (itemstack.size() < mPackSize)
{
report_to_nearby_chat("Phase 1 of the packager finished, but some items mave have been missed.");
}
else
@ -358,8 +363,8 @@ public:
report_to_nearby_chat("Do not have the destination prim selected while transfer is running to reduce the chances of \"Inventory creation on in-world object failed.\"");
LLUUID sdest = LLUUID(mPackageDest);
new JCZdrop(itemstack, sdest, mFolderName.c_str(), mPackageDest.asString().c_str(), true);
LLUUID sdest{ mPackageDest };
gZDrop = new JCZdrop(itemstack, sdest, mFolderName.c_str(), mPackageDest.asString().c_str(), true);
doZtCleanup();
mState = ZTS_DONE;
@ -388,7 +393,7 @@ private:
EZtakeState mState;
};
JCZtake* ztake;
JCZtake* gZTake{ nullptr };
class LOZtCleanup: public LLEventTimer
{
@ -400,9 +405,9 @@ public:
BOOL tick()
{
ztake->mRunning = TRUE;
delete ztake;
ztake = NULL;
gZTake->mRunning = TRUE;
delete gZTake;
gZTake = nullptr;
return TRUE;
}
};
@ -470,7 +475,7 @@ public:
{
report_to_nearby_chat(llformat("%i...", mCountdown--));
}
else if (mToTake.size() > 0)
else if (!mToTake.empty())
{
msg->newMessageFast(_PREHASH_DeRezObject);
msg->nextBlockFast(_PREHASH_AgentData);
@ -492,7 +497,7 @@ public:
if (mToTake.size() % 10 == 0)
{
if (mToTake.size() == 0)
if (mToTake.empty())
{
report_to_nearby_chat("Mtake has taken all selected objects. Say \"mtake off\" to deactivate Mtake or select more objects to continue.");
}
@ -515,7 +520,7 @@ private:
S32 zeroClearY;
S32 zeroClearZ;
};
TMZtake* mtake;
TMZtake* gMTake;
void invrepair()
{
@ -534,7 +539,7 @@ void key_to_name_callback(const LLUUID& id, const LLAvatarName& av_name)
report_to_nearby_chat(llformat("%s: (%s)", id.asString().c_str(), name.c_str()));
}
bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_gesture)
bool cmd_line_chat(std::string_view revised_text, EChatType type, bool from_gesture)
{
static LLCachedControl<bool> sFSCmdLine(gSavedSettings, "FSCmdLine");
static LLCachedControl<std::string> sFSCmdLinePos(gSavedSettings, "FSCmdLinePos");
@ -556,12 +561,11 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
static LLCachedControl<std::string> sFSCmdLineMusic(gSavedSettings, "FSCmdLineMusic");
static LLCachedControl<std::string> sFSCmdLineCopyCam(gSavedSettings, "FSCmdLineCopyCam");
static LLCachedControl<std::string> sFSCmdLineRollDice(gSavedSettings, "FSCmdLineRollDice");
//<FS:HG> FIRE-6340, FIRE-6567 - Setting Bandwidth issues
static LLCachedControl<std::string> sFSCmdLineBandwidth(gSavedSettings, "FSCmdLineBandWidth");
if (sFSCmdLine)
{
std::istringstream i(revised_text);
std::istringstream i(static_cast<std::string>(revised_text));
std::string command;
i >> command;
if (!command.empty())
@ -651,7 +655,6 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
return false;
}
}
//<FS:HG> FIRE-6340, FIRE-6567 - Setting Bandwidth issues
else if (command == sFSCmdLineBandwidth())
{
S32 band_width;
@ -667,7 +670,6 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
return false;
}
}
//</FS:HG> FIRE-6340, FIRE-6567 - Setting Bandwidth issues
else if (command == sFSCmdLineAO())
{
std::string status;
@ -936,7 +938,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
}
else
{
region_name = LLWeb::escapeURL(revised_text.substr(command.length() + 1));
region_name = LLWeb::escapeURL(static_cast<std::string>(revised_text.substr(command.length() + 1)));
LLVector3d agentPos = gAgent.getPositionGlobal();
agent_x = ll_round((F32)agentPos.mdV[VX]);
agent_y = ll_round((F32)agentPos.mdV[VY]);
@ -961,7 +963,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
F32 result = 0.f;
if (revised_text.length() > command.length() + 1)
{
std::string expr = revised_text.substr(command.length()+1);
std::string expr = static_cast<std::string>(revised_text.substr(command.length() + 1));
LLStringUtil::toUpper(expr);
std::string original_expr = expr;
@ -1024,7 +1026,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
{
if (revised_text.length() > command.length() + 1) //Typing this command with no argument was causing a crash. -Madgeek
{
std::string name = revised_text.substr(command.length() + 1);
std::string_view name = revised_text.substr(command.length() + 1);
cmdline_tp2name(name);
}
return false;
@ -1047,7 +1049,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
{
if (setting == "on")
{
if (zdrop)
if (gZDrop)
{
report_to_nearby_chat("Zdrop is already active.");
}
@ -1083,12 +1085,11 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
report_to_nearby_chat("Verifying folder location...");
std::stack<LLViewerInventoryItem*> inventorystack;
std::vector<LLPointer<LLViewerInventoryItem> > inventory = findInventoryInFolder(folder);
for (std::vector<LLPointer<LLViewerInventoryItem> >::iterator it = inventory.begin(); it != inventory.end(); ++it)
for (const auto& item : inventory)
{
LLViewerInventoryItem* item = *it;
inventorystack.push(item);
inventorystack.emplace(item);
}
if (inventorystack.size())
if (!inventorystack.empty())
{
report_to_nearby_chat(llformat("Found folder \"%s\".", folder.c_str()));
report_to_nearby_chat(llformat("Found prim \"%s\".", destination.c_str()));
@ -1097,7 +1098,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
report_to_nearby_chat("Do not have the prim selected while transfer is running to reduce the chances of \"Inventory creation on in-world object failed.\"");
report_to_nearby_chat("Use \"zdrop off\" to stop the transfer");
LLUUID sdest = LLUUID(destination);
zdrop = new JCZdrop(inventorystack, sdest, folder.c_str(), destination.c_str());
gZDrop = new JCZdrop(inventorystack, sdest, folder.c_str(), destination.c_str());
}
}
else
@ -1121,15 +1122,15 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
}
else if (setting == "off")
{
if (!zdrop)
if (!gZDrop)
{
report_to_nearby_chat("Zdrop is already deactivated.");
}
else
{
zdrop ->mRunning = TRUE;
delete zdrop;
zdrop = NULL;
gZDrop->mRunning = TRUE;
delete gZDrop;
gZDrop = nullptr;
}
}
else
@ -1151,7 +1152,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
{
if (setting == "on")
{
if (ztake)
if (gZTake)
{
report_to_nearby_chat("Ztake is already active.");
}
@ -1172,7 +1173,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
if (folder.notNull())
{
report_to_nearby_chat(llformat("Found destination folder \"%s\".", folder_name.c_str()));
ztake = new JCZtake(folder);
gZTake = new JCZtake(folder);
}
else
{
@ -1188,15 +1189,15 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
}
else if (setting == "off")
{
if (!ztake)
if (!gZTake)
{
report_to_nearby_chat("Ztake is already deactivated.");
}
else
{
ztake->mRunning = TRUE;
delete ztake;
ztake = NULL;
gZTake->mRunning = TRUE;
delete gZTake;
gZTake = nullptr;
}
}
else
@ -1241,7 +1242,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
if (folder.notNull())
{
report_to_nearby_chat(llformat("Found destination folder \"%s\".", folder_name.c_str()));
ztake = new JCZtake(folder, true, LLUUID(destination), folder_name, (command == "cpackage") ? DRD_ACQUIRE_TO_AGENT_INVENTORY : DRD_TAKE_INTO_AGENT_INVENTORY);
gZTake = new JCZtake(folder, true, LLUUID(destination), folder_name, (command == "cpackage") ? DRD_ACQUIRE_TO_AGENT_INVENTORY : DRD_TAKE_INTO_AGENT_INVENTORY);
}
else
{
@ -1307,7 +1308,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
U32 localid = objectp->getLocalID();
if (std::find(to_take.begin(), to_take.end(), localid) == to_take.end())
{
to_take.push_back(localid);
to_take.emplace_back(localid);
}
}
}
@ -1320,7 +1321,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
else
{
report_to_nearby_chat(llformat("Found destination folder \"%s\".", folder_name.c_str()));
ztake = new JCZtake(folder, true, LLUUID(destination), folder_name, DRD_ACQUIRE_TO_AGENT_INVENTORY, false, to_take);
gZTake = new JCZtake(folder, true, LLUUID(destination), folder_name, DRD_ACQUIRE_TO_AGENT_INVENTORY, false, to_take);
}
}
else
@ -1438,7 +1439,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
U32 localid = objectp->getLocalID();
if (std::find(to_take.begin(), to_take.end(), localid) == to_take.end())
{
to_take.push_back(localid);
to_take.emplace_back(localid);
}
}
}
@ -1451,7 +1452,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
else
{
report_to_nearby_chat(llformat("Found destination folder \"%s\".", folder_name.c_str()));
ztake = new JCZtake(folder, true, LLUUID::null, folder_name, (command == "kcopy") ? DRD_ACQUIRE_TO_AGENT_INVENTORY : DRD_TAKE_INTO_AGENT_INVENTORY, false, to_take);
gZTake = new JCZtake(folder, true, LLUUID::null, folder_name, (command == "kcopy") ? DRD_ACQUIRE_TO_AGENT_INVENTORY : DRD_TAKE_INTO_AGENT_INVENTORY, false, to_take);
}
}
else
@ -1474,7 +1475,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
{
if (setting == "on")
{
if (mtake)
if (gMTake)
{
report_to_nearby_chat("Mtake is already active.");
}
@ -1495,7 +1496,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
if (folder.notNull())
{
report_to_nearby_chat(llformat("Found destination folder \"%s\".", folder_name.c_str()));
mtake = new TMZtake(folder);
gMTake = new TMZtake(folder);
}
else
{
@ -1511,15 +1512,15 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
}
else if (setting == "off")
{
if (!mtake)
if (!gMTake)
{
report_to_nearby_chat("Mtake is already deactivated.");
}
else
{
mtake->mRunning = TRUE;
delete mtake;
mtake = NULL;
gMTake->mRunning = TRUE;
delete gMTake;
gMTake = nullptr;
}
}
else
@ -1729,29 +1730,25 @@ LLUUID cmdline_partial_name2key(std::string partial_name)
LLStringUtil::toLower(partial_name);
LLStringUtil::replaceString(partial_name, ".", " ");
FSRadar* radar = FSRadar::getInstance();
if (radar)
FSRadar::entry_map_t radar_list = FSRadar::getInstance()->getRadarList();
FSRadar::entry_map_t::iterator it_end = radar_list.end();
for (const auto& [avid, entry] : radar_list)
{
FSRadar::entry_map_t radar_list = radar->getRadarList();
FSRadar::entry_map_t::iterator it_end = radar_list.end();
for (FSRadar::entry_map_t::iterator it = radar_list.begin(); it != it_end; ++it)
{
FSRadarEntry* entry = it->second;
av_name = entry->getUserName();
av_name = entry->getUserName();
LLStringUtil::toLower(av_name);
if (strstr(av_name.c_str(), partial_name.c_str()))
{
return entry->getId();
}
LLStringUtil::toLower(av_name);
if (strstr(av_name.c_str(), partial_name.c_str()))
{
return entry->getId();
}
}
return LLUUID::null;
}
void cmdline_tp2name(const std::string& target)
void cmdline_tp2name(std::string_view target)
{
LLUUID avkey = cmdline_partial_name2key(target);
LLUUID avkey = cmdline_partial_name2key(static_cast<std::string>(target));
if (avkey.notNull() && avkey != gAgentID)
{
LLAvatarActions::teleportTo(avkey);
@ -1822,17 +1819,17 @@ void cmdline_rezplat(bool use_saved_value, F32 visual_radius) //cmdline_rezplat(
msg->sendReliable(gAgent.getRegionHost());
}
bool cmdline_packager(const std::string& message, const LLUUID& fromID, const LLUUID& ownerID)
bool cmdline_packager(std::string_view message, const LLUUID& fromID, const LLUUID& ownerID)
{
if (message.empty() || cmd_line_mPackagerDest.isNull() || fromID != cmd_line_mPackagerDest)
{
return false;
}
std::string cmd = message.substr(0, 12);
std::string_view cmd = message.substr(0, 12);
if (cmd == "kpackageradd") {
std::string csv = message.substr(13, -1);
std::string_view csv = message.substr(13, -1);
std::string::size_type start = 0;
std::string::size_type comma = 0;
do
@ -1863,13 +1860,13 @@ bool cmdline_packager(const std::string& message, const LLUUID& fromID, const LL
}
while(comma < csv.length());
report_to_nearby_chat(llformat("Packager: adding objects: \"%s\"", csv.c_str()));
report_to_nearby_chat(llformat("Packager: adding objects: \"%s\"", static_cast<std::string>(csv).c_str()));
return true;
}
else if (cmd == "kpackagerend") {
report_to_nearby_chat("Packager: finalizing.");
ztake = new JCZtake(cmd_line_mPackagerTargetFolder, true, cmd_line_mPackagerDest, cmd_line_mPackagerTargetFolderName, DRD_ACQUIRE_TO_AGENT_INVENTORY, false, cmd_line_mPackagerToTake);
gZTake = new JCZtake(cmd_line_mPackagerTargetFolder, true, cmd_line_mPackagerDest, cmd_line_mPackagerTargetFolderName, DRD_ACQUIRE_TO_AGENT_INVENTORY, false, cmd_line_mPackagerToTake);
cmd_line_mPackagerToTake.clear();
cmd_line_mPackagerTargetFolderName = "";
cmd_line_mPackagerTargetFolder.setNull();

View File

@ -36,11 +36,11 @@
#include "llchat.h"
bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_gesture = false);
bool cmd_line_chat(std::string_view revised_text, EChatType type, bool from_gesture = false);
void cmdline_rezplat(bool use_saved_value = true, F32 visual_radius = 30.f);
void cmdline_tp2name(const std::string& target);
void cmdline_tp2name(std::string_view target);
LLUUID cmdline_partial_name2key(std::string name);
bool cmdline_packager(const std::string& message, const LLUUID& fromID, const LLUUID& ownerID);
bool cmdline_packager(std::string_view message, const LLUUID& fromID, const LLUUID& ownerID);
#endif // CHATBAR_AS_CMDLINE_H

View File

@ -3,6 +3,17 @@ import subprocess
import tarfile
class FSViewerManifest:
def fs_installer_basename(self):
substitution_strings = {
'version' : '.'.join(self.args['version']),
'version_short' : '.'.join(self.args['version'][:-1]),
'version_dashes' : '-'.join(self.args['version']),
'app_name':self.app_name(),
'app_name_oneword':self.app_name_oneword()
}
return "Phoenix-%(app_name)s-%(version_dashes)s" % substitution_strings
def fs_is_opensim(self):
return self.args['viewer_flavor'] == 'oss' #Havok would be hvk
@ -99,15 +110,13 @@ class FSViewerManifest:
except:
print("Cannot run pdbcopy, packaging private symbols")
# Store windows symbols we want to keep for debugging in a tar file, this will be later compressed with xz (lzma)
# Using tat+xz gives far superior compression than zip (~half the size of the zip archive).
# Python3 natively supports tar+xz via mode 'w:xz'. But we're stuck with Python2 for now.
symbolTar = tarfile.TarFile("%s/Phoenix_%s_%s_%s_pdbsymbols-windows-%d.tar" % (self.args['configuration'].lower(),
self.fs_channel_legacy_oneword(),
'-'.join(self.args['version']),
self.args['viewer_flavor'],
self.address_size),
'w')
tarName = "%s/Phoenix_%s_%s_%s_pdbsymbols-windows-%d.tar.xz" % (self.args['configuration'].lower(),
self.fs_channel_legacy_oneword(),
'-'.join(self.args['version']),
self.args['viewer_flavor'],
self.address_size)
# Store windows symbols we want to keep for debugging in a tar file.
symbolTar = tarfile.open( name=tarName, mode="w:xz")
symbolTar.add( "%s/Firestorm-bin.exe" % self.args['configuration'].lower(), "firestorm-bin.exe" )
symbolTar.add( "%s/build_data.json" % self.args['configuration'].lower(), "build_data.json" )
symbolTar.add( "%s/%s" % (self.args['configuration'].lower(),pdbName), pdbName )

View File

@ -67,7 +67,7 @@ extern S32 gMaxAgentGroups;
S32 FSCommon::sObjectAddMsg = 0;
void report_to_nearby_chat(const std::string& message)
void report_to_nearby_chat(std::string_view message)
{
LLChat chat;
chat.mText = message;
@ -81,16 +81,16 @@ std::string format_string(std::string text, const LLStringUtil::format_map_t& ar
return text;
}
bool is_irc_me_prefix(const std::string& text)
bool is_irc_me_prefix(std::string_view text)
{
const std::string prefix = text.substr(0, 4);
const std::string_view prefix = text.substr(0, 4);
return (prefix == "/me " || prefix == "/me'");
}
std::string unescape_name(const std::string& name)
std::string unescape_name(std::string_view name)
{
// bugfix for SL-46920: preventing filenames that break stuff.
char * curl_str = curl_unescape(name.c_str(), name.size());
char * curl_str = curl_unescape(name.data(), name.size()); // Calling data() should be ok here because we also pass the length
std::string unescaped_name(curl_str);
curl_free(curl_str);
curl_str = NULL;

View File

@ -37,10 +37,10 @@ class LLViewerParcelMgr;
const F64 AVATAR_UNKNOWN_Z_OFFSET = -1.0; // Const value for avatars at unknown height
const F32 AVATAR_UNKNOWN_RANGE = -1.f;
void report_to_nearby_chat(const std::string& message);
void report_to_nearby_chat(std::string_view message);
std::string format_string(std::string text, const LLStringUtil::format_map_t& args);
bool is_irc_me_prefix(const std::string& text);
std::string unescape_name(const std::string& name);
bool is_irc_me_prefix(std::string_view text);
std::string unescape_name(std::string_view name);
namespace FSCommon
{

View File

@ -0,0 +1,70 @@
/**
* @file fsfloaterpartialinventory.cpp
* @brief Displays the inventory underneath a particular starting folder
*
* $LicenseInfo:firstyear=2022&license=viewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (c) 2022 Ansariel Hiller @ Second Life
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "fsfloaterpartialinventory.h"
#include "llfiltereditor.h"
#include "llinventorypanel.h"
//=========================================================================
//=========================================================================
FSFloaterPartialInventory::FSFloaterPartialInventory(const LLSD& key) : LLFloater(key)
{
mRootFolderId = key["start_folder_id"].asUUID();
}
FSFloaterPartialInventory::~FSFloaterPartialInventory()
{
}
BOOL FSFloaterPartialInventory::postBuild()
{
LLInventoryPanel::Params params;
params.start_folder.id(mRootFolderId);
params.follows.flags(FOLLOWS_ALL);
params.layout("topleft");
params.name("inv_panel");
mInventoryList = LLUICtrlFactory::create<LLInventoryPanel>(params);
auto wrapper_panel = getChild<LLPanel>("pnl_inv_wrap");
wrapper_panel->addChild(mInventoryList);
mInventoryList->reshape(wrapper_panel->getRect().getWidth(), wrapper_panel->getRect().getHeight());
mInventoryList->setOrigin(0, 0);
mFilterEdit = getChild<LLFilterEditor>("flt_search");
mFilterEdit->setCommitCallback([this](LLUICtrl*, const LLSD& param){ mInventoryList->setFilterSubString(param.asString()); });
return TRUE;
}
void FSFloaterPartialInventory::onOpen(const LLSD& key)
{
LLStringUtil::format_map_t args;
args["FOLDERNAME"] = key["start_folder_name"].asString();
setTitle(getString("title", args));
}

View File

@ -0,0 +1,50 @@
/**
* @file fsfloaterpartialinventory.h
* @brief Displays the inventory underneath a particular starting folder
*
* $LicenseInfo:firstyear=2022&license=viewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (c) 2022 Ansariel Hiller @ Second Life
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef FS_FLOATERPARTIALINVENTORY_H
#define FS_FLOATERPARTIALINVENTORY_H
#include "llfloater.h"
class LLFilterEditor;
class LLInventoryPanel;
class FSFloaterPartialInventory : public LLFloater
{
public:
FSFloaterPartialInventory(const LLSD& key);
virtual ~FSFloaterPartialInventory();
BOOL postBuild() override;
void onOpen(const LLSD& key) override;
private:
LLUUID mRootFolderId;
LLInventoryPanel* mInventoryList{ nullptr };
LLFilterEditor* mFilterEdit{ nullptr };
};
#endif

View File

@ -53,6 +53,8 @@ namespace FSPerfStats
U32 lastGlobalPrefChange{0};
std::mutex bufferToggleLock{};
F64 cpu_hertz{0.0};
Tunables tunables;
std::atomic<int> StatsRecorder::writeBuffer{0};
@ -136,6 +138,8 @@ namespace FSPerfStats
// create a queue
// create a thread to consume from the queue
tunables.initialiseFromSettings();
FSPerfStats::cpu_hertz = (F64)LLTrace::BlockTimer::countsPerSecond();
t.detach();
}
@ -342,7 +346,7 @@ namespace FSPerfStats
}
// The frametime budget we have based on the target FPS selected
auto target_frame_time_raw = (U64)llround((F64)LLTrace::BlockTimer::countsPerSecond()/(tunables.userTargetFPS==0?1:tunables.userTargetFPS));
auto target_frame_time_raw = (U64)llround(FSPerfStats::cpu_hertz/(tunables.userTargetFPS==0?1:tunables.userTargetFPS));
// LL_INFOS() << "Effective FPS(raw):" << tot_frame_time_raw << " Target:" << target_frame_time_raw << LL_ENDL;
auto inferredFPS{1000/(U32)std::max(raw_to_ms(tot_frame_time_raw),1.0)};
U32 settingsChangeFrequency{inferredFPS > 25?inferredFPS:25};

View File

@ -76,6 +76,8 @@ namespace FSPerfStats
static constexpr U32 TUNE_AVATARS_ONLY{0};
static constexpr U32 TUNE_SCENE_AND_AVATARS{1};
extern F64 cpu_hertz;
extern std::atomic<int64_t> tunedAvatars;
extern std::atomic<U64> renderAvatarMaxART_ns;
extern bool belowTargetFPS;
@ -491,9 +493,9 @@ namespace FSPerfStats
};
inline double raw_to_ns(U64 raw) { return (static_cast<double>(raw) * 1000000000.0) / (F64)LLTrace::BlockTimer::countsPerSecond(); };
inline double raw_to_us(U64 raw) { return (static_cast<double>(raw) * 1000000.0) / (F64)LLTrace::BlockTimer::countsPerSecond(); };
inline double raw_to_ms(U64 raw) { return (static_cast<double>(raw) * 1000.0) / (F64)LLTrace::BlockTimer::countsPerSecond(); };
inline double raw_to_ns(U64 raw) { return (static_cast<double>(raw) * 1000000000.0) / FSPerfStats::cpu_hertz; };
inline double raw_to_us(U64 raw) { return (static_cast<double>(raw) * 1000000.0) / FSPerfStats::cpu_hertz; };
inline double raw_to_ms(U64 raw) { return (static_cast<double>(raw) * 1000.0) / FSPerfStats::cpu_hertz; };
using RecordSceneTime = RecordTime<ObjType_t::OT_GENERAL>;
using RecordAvatarTime = RecordTime<ObjType_t::OT_AVATAR>;

View File

@ -103,7 +103,7 @@ std::string LGGContactSets::getDefaultFilename()
return path;
}
LLSD LGGContactSets::exportContactSet(const std::string& set_name)
LLSD LGGContactSets::exportContactSet(std::string_view set_name)
{
LLSD ret;
@ -113,9 +113,9 @@ LLSD LGGContactSets::exportContactSet(const std::string& set_name)
ret["groupname"] = set->mName;
ret["color"] = set->mColor.getValue();
ret["notices"] = set->mNotify;
for (uuid_set_t::iterator friend_itr = set->mFriends.begin(); friend_itr != set->mFriends.end(); ++friend_itr)
for (const auto& friend_id : set->mFriends)
{
ret["friends"][(*friend_itr).asString()] = "";
ret["friends"][friend_id.asString()] = "";
}
}
@ -176,12 +176,12 @@ void LGGContactSets::saveToDisk()
file.close();
}
bool LGGContactSets::saveContactSetToDisk(const std::string& set_name, const std::string& filename)
bool LGGContactSets::saveContactSetToDisk(std::string_view set_name, std::string_view filename)
{
if (isValidSet(set_name))
{
llofstream file;
file.open(filename.c_str());
file.open(filename.data());
LLSDSerialize::toPrettyXML(exportContactSet(set_name), file);
file.close();
return true;
@ -300,7 +300,7 @@ void LGGContactSets::importFromLLSD(const LLSD& data)
}
}
LLColor4 LGGContactSets::getSetColor(const std::string& set_name)
LLColor4 LGGContactSets::getSetColor(std::string_view set_name)
{
ContactSet* set = getContactSet(set_name);
if (set)
@ -318,7 +318,7 @@ LLColor4 LGGContactSets::colorize(const LLUUID& uuid, const LLColor4& cur_color,
bool rlv_shownames = !RlvActions::canShowName(RlvActions::SNC_DEFAULT, uuid);
LLColor4 color = cur_color;
if (uuid == gAgent.getID())
if (uuid == gAgentID)
{
switch (type)
{
@ -338,7 +338,7 @@ LLColor4 LGGContactSets::colorize(const LLUUID& uuid, const LLColor4& cur_color,
break;
}
}
else if (LLAvatarTracker::instance().getBuddyInfo(uuid) != NULL)
else if (LLAvatarTracker::instance().getBuddyInfo(uuid))
{
switch (type)
{
@ -452,7 +452,7 @@ LLColor4 LGGContactSets::colorize(const LLUUID& uuid, const LLColor4& cur_color,
return color;
}
LLColor4 LGGContactSets::getFriendColor(const LLUUID& friend_id, const std::string& ignored_set_name)
LLColor4 LGGContactSets::getFriendColor(const LLUUID& friend_id, std::string_view ignored_set_name)
{
LLColor4 color = getDefaultColor();
if (ignored_set_name == CS_SET_NO_SETS)
@ -462,9 +462,8 @@ LLColor4 LGGContactSets::getFriendColor(const LLUUID& friend_id, const std::stri
U32 lowest = U32_MAX;
string_vec_t contact_sets = getFriendSets(friend_id);
for (string_vec_t::iterator it = contact_sets.begin(); it != contact_sets.end(); ++it)
for (const auto& set_name : contact_sets)
{
std::string set_name = *it;
if (set_name != ignored_set_name)
{
U32 set_size = (U32)getFriendsInSet(set_name).size();
@ -489,7 +488,7 @@ LLColor4 LGGContactSets::getFriendColor(const LLUUID& friend_id, const std::stri
{
if (isFriendInSet(friend_id, ignored_set_name) && !isInternalSetName(ignored_set_name))
{
return mContactSets[ignored_set_name]->mColor;
return mContactSets[ignored_set_name.data()]->mColor;
}
}
return color;
@ -555,21 +554,20 @@ bool LGGContactSets::hasFriendColorThatShouldShow(const LLUUID& friend_id, ELGGC
string_vec_t LGGContactSets::getFriendSets(const LLUUID& friend_id)
{
string_vec_t sets;
string_vec_t sets{};
contact_set_map_t::iterator set_itr_end = mContactSets.end();
for (contact_set_map_t::iterator itr = mContactSets.begin(); itr != set_itr_end; ++itr)
for (const auto& [set_name, set] : mContactSets)
{
ContactSet* set = itr->second;
if (set->hasFriend(friend_id))
{
sets.push_back(set->mName);
sets.emplace_back(set->mName);
}
}
return sets;
}
uuid_vec_t LGGContactSets::getFriendsInSet(const std::string& set_name)
uuid_vec_t LGGContactSets::getFriendsInSet(std::string_view set_name)
{
uuid_vec_t friends;
@ -593,9 +591,9 @@ uuid_vec_t LGGContactSets::getFriendsInSet(const std::string& set_name)
ContactSet* set = getContactSet(set_name);
if (set)
{
for (uuid_set_t::iterator itr = set->mFriends.begin(); itr != set->mFriends.end(); ++itr)
for (const auto& id : set->mFriends)
{
friends.push_back(*itr);
friends.emplace_back(id);
}
}
@ -604,11 +602,11 @@ uuid_vec_t LGGContactSets::getFriendsInSet(const std::string& set_name)
string_vec_t LGGContactSets::getAllContactSets()
{
string_vec_t sets;
string_vec_t sets{};
for (contact_set_map_t::iterator itr = mContactSets.begin(); itr != mContactSets.end(); ++itr)
for (const auto& [set_name, set] : mContactSets)
{
sets.push_back(itr->second->mName);
sets.push_back(set->mName);
}
return sets;
@ -616,11 +614,10 @@ string_vec_t LGGContactSets::getAllContactSets()
uuid_vec_t LGGContactSets::getFriendsInAnySet()
{
std::set<LLUUID> friendsInAnySet;
uuid_set_t friendsInAnySet{};
for (contact_set_map_t::iterator set_itr = mContactSets.begin(); set_itr != mContactSets.end(); ++set_itr)
for (const auto& [set_name, set] : mContactSets)
{
ContactSet* set = set_itr->second;
for (uuid_set_t::iterator itr = set->mFriends.begin(); itr != set->mFriends.end(); ++itr)
{
friendsInAnySet.insert(*itr);
@ -632,9 +629,8 @@ uuid_vec_t LGGContactSets::getFriendsInAnySet()
bool LGGContactSets::isFriendInSet(const LLUUID& friend_id)
{
for (contact_set_map_t::iterator itr = mContactSets.begin(); itr != mContactSets.end(); ++itr)
for (const auto& [set_name, set] : mContactSets)
{
ContactSet* set = itr->second;
if (set->hasFriend(friend_id))
{
return true;
@ -644,7 +640,7 @@ bool LGGContactSets::isFriendInSet(const LLUUID& friend_id)
return false;
}
bool LGGContactSets::isFriendInSet(const LLUUID& friend_id, const std::string& set_name)
bool LGGContactSets::isFriendInSet(const LLUUID& friend_id, std::string_view set_name)
{
if (set_name == CS_SET_ALL_SETS)
{
@ -678,9 +674,9 @@ bool LGGContactSets::isFriendInSet(const LLUUID& friend_id, const std::string& s
bool LGGContactSets::notifyForFriend(const LLUUID& friend_id)
{
string_vec_t sets = getFriendSets(friend_id);
for (string_vec_t::const_iterator itr = sets.begin(); itr != sets.end(); ++itr)
for (const auto& set_name : sets)
{
if (mContactSets[*itr]->mNotify)
if (mContactSets[set_name]->mNotify)
{
return true;
}
@ -688,7 +684,7 @@ bool LGGContactSets::notifyForFriend(const LLUUID& friend_id)
return false;
}
void LGGContactSets::addToSet(const uuid_vec_t& avatar_ids, const std::string& set_name)
void LGGContactSets::addToSet(const uuid_vec_t& avatar_ids, std::string_view set_name)
{
LLAvatarTracker& tracker = LLAvatarTracker::instance();
@ -701,7 +697,7 @@ void LGGContactSets::addToSet(const uuid_vec_t& avatar_ids, const std::string& s
if (isValidSet(set_name))
{
mContactSets[set_name]->mFriends.insert(avatar_id);
mContactSets[set_name.data()]->mFriends.insert(avatar_id);
}
}
@ -734,9 +730,9 @@ void LGGContactSets::removeNonFriendFromList(const LLUUID& non_friend_id, bool s
void LGGContactSets::removeFriendFromAllSets(const LLUUID& friend_id, bool save_changes /*= true*/)
{
string_vec_t sets = getFriendSets(friend_id);
for (string_vec_t::const_iterator itr = sets.begin(); itr != sets.end(); ++itr)
for (const auto& set_name : sets)
{
removeFriendFromSet(friend_id, (*itr), save_changes);
removeFriendFromSet(friend_id, set_name, save_changes);
}
}
@ -753,13 +749,13 @@ bool LGGContactSets::isNonFriend(const LLUUID& non_friend_id)
uuid_vec_t LGGContactSets::getListOfNonFriends()
{
LLAvatarTracker& tracker = LLAvatarTracker::instance();
uuid_vec_t nonfriends;
uuid_vec_t nonfriends{};
for (const auto& friend_id : mExtraAvatars)
{
if (!tracker.isBuddy(friend_id))
{
nonfriends.push_back(friend_id);
nonfriends.emplace_back(friend_id);
}
}
@ -768,17 +764,17 @@ uuid_vec_t LGGContactSets::getListOfNonFriends()
uuid_vec_t LGGContactSets::getListOfPseudonymAvs()
{
uuid_vec_t pseudonyms;
uuid_vec_t pseudonyms{};
for (uuid_map_t::iterator itr = mPseudonyms.begin(); itr != mPseudonyms.end(); ++itr)
for (const auto& [id, pseudonym] : mPseudonyms)
{
pseudonyms.push_back(itr->first);
pseudonyms.emplace_back(pseudonym);
}
return pseudonyms;
}
void LGGContactSets::setPseudonym(const LLUUID& friend_id, const std::string& pseudonym)
void LGGContactSets::setPseudonym(const LLUUID& friend_id, std::string_view pseudonym)
{
LLAvatarNameCache* inst = LLAvatarNameCache::getInstance();
mPseudonyms[friend_id] = pseudonym;
@ -863,9 +859,9 @@ bool LGGContactSets::hasPseudonym(const LLUUID& friend_id)
bool LGGContactSets::hasPseudonym(uuid_vec_t ids)
{
bool has_pseudonym = false;
for (uuid_vec_t::const_iterator id = ids.begin(); id != ids.end(); ++id)
for (const auto& id : ids)
{
if (hasPseudonym(*id))
if (hasPseudonym(id))
{
has_pseudonym = true;
break;
@ -882,9 +878,9 @@ bool LGGContactSets::hasDisplayNameRemoved(const LLUUID& friend_id)
bool LGGContactSets::hasDisplayNameRemoved(uuid_vec_t ids)
{
bool has_pseudonym = false;
for (uuid_vec_t::const_iterator id = ids.begin(); id != ids.end(); ++id)
for (const auto& id : ids)
{
if (hasDisplayNameRemoved(*id))
if (hasDisplayNameRemoved(id))
{
has_pseudonym = true;
break;
@ -903,7 +899,7 @@ void LGGContactSets::removeDisplayName(const LLUUID& friend_id)
setPseudonym(friend_id, CS_PSEUDONYM);
}
void LGGContactSets::removeFriendFromSet(const LLUUID& friend_id, const std::string& set_name, bool save_changes /*= true*/)
void LGGContactSets::removeFriendFromSet(const LLUUID& friend_id, std::string_view set_name, bool save_changes /*= true*/)
{
if (set_name == CS_SET_EXTRA_AVS)
{
@ -926,12 +922,12 @@ void LGGContactSets::removeFriendFromSet(const LLUUID& friend_id, const std::str
}
}
bool LGGContactSets::isValidSet(const std::string& set_name)
bool LGGContactSets::isValidSet(std::string_view set_name)
{
return (mContactSets.find(set_name) != mContactSets.end());
return (mContactSets.find(set_name.data()) != mContactSets.end());
}
void LGGContactSets::addSet(const std::string& set_name)
void LGGContactSets::addSet(std::string_view set_name)
{
if (!isInternalSetName(set_name) && !isValidSet(set_name))
{
@ -939,21 +935,21 @@ void LGGContactSets::addSet(const std::string& set_name)
set->mName = set_name;
set->mColor = LLColor4::red;
set->mNotify = false;
mContactSets[set_name] = set;
mContactSets[set_name.data()] = set;
saveToDisk();
mChangedSignal(UPDATED_LISTS);
}
}
bool LGGContactSets::renameSet(const std::string& set_name, const std::string& new_set_name)
bool LGGContactSets::renameSet(std::string_view set_name, std::string_view new_set_name)
{
if (!isInternalSetName(set_name) && isValidSet(set_name) &&
!isInternalSetName(new_set_name) && !isValidSet(new_set_name))
{
ContactSet* set = getContactSet(set_name);
set->mName = new_set_name;
mContactSets.erase(set_name);
mContactSets[new_set_name] = set;
mContactSets.erase(set_name.data());
mContactSets[new_set_name.data()] = set;
saveToDisk();
mChangedSignal(UPDATED_LISTS);
return true;
@ -961,27 +957,27 @@ bool LGGContactSets::renameSet(const std::string& set_name, const std::string& n
return false;
}
void LGGContactSets::removeSet(const std::string& set_name)
void LGGContactSets::removeSet(std::string_view set_name)
{
contact_set_map_t::iterator found = mContactSets.find(set_name);
contact_set_map_t::iterator found = mContactSets.find(set_name.data());
if (found != mContactSets.end())
{
LLAvatarTracker& tracker = LLAvatarTracker::instance();
uuid_vec_t non_friends_for_removal;
ContactSet* cset = found->second;
for (uuid_set_t::iterator member_it = cset->mFriends.begin(); member_it != cset->mFriends.end(); ++member_it)
for (const auto& friend_id : cset->mFriends)
{
if (!tracker.isBuddy(*member_it) &&
getFriendSets(*member_it).size() == 1 && // Current set is only set!
!hasPseudonym(*member_it))
if (!tracker.isBuddy(friend_id) &&
getFriendSets(friend_id).size() == 1 && // Current set is only set!
!hasPseudonym(friend_id))
{
non_friends_for_removal.push_back(*member_it);
non_friends_for_removal.emplace_back(friend_id);
}
}
for (uuid_vec_t::iterator nf_it = non_friends_for_removal.begin(); nf_it != non_friends_for_removal.end(); ++nf_it)
for (const auto& non_friend_id : non_friends_for_removal)
{
removeNonFriendFromList(*nf_it, false);
removeNonFriendFromList(non_friend_id, false);
}
delete found->second;
@ -991,7 +987,7 @@ void LGGContactSets::removeSet(const std::string& set_name)
}
}
void LGGContactSets::setNotifyForSet(const std::string& set_name, bool notify)
void LGGContactSets::setNotifyForSet(std::string_view set_name, bool notify)
{
ContactSet* set = getContactSet(set_name);
if (set)
@ -1001,7 +997,7 @@ void LGGContactSets::setNotifyForSet(const std::string& set_name, bool notify)
}
}
bool LGGContactSets::getNotifyForSet(const std::string& set_name)
bool LGGContactSets::getNotifyForSet(std::string_view set_name)
{
ContactSet* set = getContactSet(set_name);
if (set)
@ -1011,7 +1007,7 @@ bool LGGContactSets::getNotifyForSet(const std::string& set_name)
return false;
}
void LGGContactSets::setSetColor(const std::string& set_name, const LLColor4& color)
void LGGContactSets::setSetColor(std::string_view set_name, const LLColor4& color)
{
ContactSet* set = getContactSet(set_name);
if (set)
@ -1021,7 +1017,7 @@ void LGGContactSets::setSetColor(const std::string& set_name, const LLColor4& co
}
}
bool LGGContactSets::isInternalSetName(const std::string& set_name)
bool LGGContactSets::isInternalSetName(std::string_view set_name)
{
return (set_name.empty() ||
set_name == CS_SET_EXTRA_AVS ||
@ -1031,21 +1027,21 @@ bool LGGContactSets::isInternalSetName(const std::string& set_name)
set_name == CS_GLOBAL_SETTINGS);
}
LGGContactSets::ContactSet* LGGContactSets::getContactSet(const std::string& set_name)
LGGContactSets::ContactSet* LGGContactSets::getContactSet(std::string_view set_name)
{
if (set_name.empty())
{
LL_WARNS("ContactSets") << "No contact set specified" << LL_ENDL;
return NULL;
return nullptr;
}
contact_set_map_t::iterator found = mContactSets.find(set_name);
contact_set_map_t::iterator found = mContactSets.find(set_name.data());
if (found != mContactSets.end())
{
return found->second;
}
LL_WARNS("ContactSets") << "No contact set named " << set_name << LL_ENDL;
return NULL;
return nullptr;
}
bool LGGContactSets::checkCustomName(const LLUUID& id, bool& dn_removed, std::string& pseudonym)
@ -1097,7 +1093,7 @@ bool LGGContactSets::handleRemoveAvatarFromSetCallback(const LLSD& notification,
instance.removeFriendFromSet(id, set_name, false);
if (!tracker.isBuddy(id) &&
instance.getFriendSets(id).size() == 0 &&
instance.getFriendSets(id).empty() &&
!instance.hasPseudonym(id))
{
instance.removeNonFriendFromList(id, false);

View File

@ -55,9 +55,9 @@ public:
void loadFromDisk();
void setSetColor(const std::string& set_name, const LLColor4& color);
LLColor4 getSetColor(const std::string& set_name);
LLColor4 getFriendColor(const LLUUID& friend_id, const std::string& ignored_set_name = "");
void setSetColor(std::string_view set_name, const LLColor4& color);
LLColor4 getSetColor(std::string_view set_name);
LLColor4 getFriendColor(const LLUUID& friend_id, std::string_view ignored_set_name = "");
LLColor4 colorize(const LLUUID& uuid, const LLColor4& cur_color, ELGGCSType type);
void setDefaultColor(const LLColor4& default_color) { mDefaultColor = default_color; };
@ -77,17 +77,17 @@ public:
string_vec_t getFriendSets(const LLUUID& friend_id);
string_vec_t getAllContactSets();
void addToSet(const uuid_vec_t&, const std::string& set_name);
void removeFriendFromSet(const LLUUID& friend_id, const std::string& set_name, bool save_changes = true);
void addToSet(const uuid_vec_t&, std::string_view set_name);
void removeFriendFromSet(const LLUUID& friend_id, std::string_view set_name, bool save_changes = true);
void removeFriendFromAllSets(const LLUUID& friend_id, bool save_changes = true);
bool isFriendInSet(const LLUUID& friend_id, const std::string& set_name);
bool isFriendInSet(const LLUUID& friend_id, std::string_view set_name);
bool hasFriendColorThatShouldShow(const LLUUID& friend_id, ELGGCSType type);
bool hasFriendColorThatShouldShow(const LLUUID& friend_id, ELGGCSType type, LLColor4& color);
void addSet(const std::string& set_name);
bool renameSet(const std::string& set_name, const std::string& new_set_name);
void removeSet(const std::string& set_name);
bool isValidSet(const std::string& set_name);
void addSet(std::string_view set_name);
bool renameSet(std::string_view set_name, std::string_view new_set_name);
void removeSet(std::string_view set_name);
bool isValidSet(std::string_view set_name);
void removeNonFriendFromList(const LLUUID& non_friend_id, bool save_changes = true);
bool isNonFriend(const LLUUID& non_friend_id);
@ -96,12 +96,12 @@ public:
uuid_vec_t getListOfPseudonymAvs();
bool notifyForFriend(const LLUUID& friend_id);
void setNotifyForSet(const std::string& set_name, bool notify);
bool getNotifyForSet(const std::string& set_name);
void setNotifyForSet(std::string_view set_name, bool notify);
bool getNotifyForSet(std::string_view set_name);
bool callbackAliasReset(const LLSD& notification, const LLSD& response);
bool isInternalSetName(const std::string& set_name);
bool isInternalSetName(std::string_view set_name);
bool hasSets() { return !mContactSets.empty(); }
class ContactSet
@ -117,7 +117,7 @@ public:
bool mNotify;
LLColor4 mColor;
};
ContactSet* getContactSet(const std::string& set_name);
ContactSet* getContactSet(std::string_view set_name);
// [FS:CR] Signals for updating the various UI
typedef enum e_contact_set_update {
@ -140,14 +140,14 @@ public:
private:
void toneDownColor(LLColor4& color) const;
uuid_vec_t getFriendsInSet(const std::string& set_name);
uuid_vec_t getFriendsInSet(std::string_view set_name);
uuid_vec_t getFriendsInAnySet();
void setPseudonym(const LLUUID& friend_id, const std::string& pseudonym);
void setPseudonym(const LLUUID& friend_id, std::string_view pseudonym);
bool hasVisuallyDifferentPseudonym(const LLUUID& friend_id);
LLSD exportContactSet(const std::string& set_name);
bool saveContactSetToDisk(const std::string& set_name, const std::string& filename);
LLSD exportContactSet(std::string_view set_name);
bool saveContactSetToDisk(std::string_view set_name, std::string_view filename);
std::string getFilename();
std::string getDefaultFilename();

View File

@ -45,7 +45,7 @@ if [ ! -z "$XBROWSER" ]; then
echo "$0: Trying some others..."
fi
# Launcher the default GNOME browser.
# Launch the default GNOME browser.
if [ ! -z "$GNOME_DESKTOP_SESSION_ID" ] && which gnome-open >/dev/null; then
gnome-open "$URL" &
exit
@ -60,6 +60,7 @@ fi
# List of browser commands that will be tried in the order listed. x-www-browser
# will be tried first, which is a debian alternative.
BROWSER_COMMANDS=" \
xdg-open \
x-www-browser \
firefox \
mozilla-firefox \

View File

@ -305,7 +305,7 @@ private:
LLUUID mCOFImageID;
std::auto_ptr<LLOutfitUnLockTimer> mUnlockOutfitTimer;
std::unique_ptr<LLOutfitUnLockTimer> mUnlockOutfitTimer;
// Set of temp attachment UUIDs that should be removed
typedef std::set<LLUUID> doomed_temp_attachments_t;

View File

@ -1231,11 +1231,6 @@ bool LLFace::canRenderAsMask()
{
return false;
}
// <FS:Beq> shortcircuit fully alpha faces
if (getViewerObject()->isHUDAttachment()) { return false; }
if (te->getAlpha() == 0.0f && (te->getGlow() == 0.f)) { return true; }
// </FS:Beq>
LLMaterial* mat = te->getMaterialParams();
if (mat && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND)

View File

@ -1002,7 +1002,7 @@ void LLFavoritesBarCtrl::updateButtons(bool force_update)
{
//find last visible child to get the rightest button offset
child_list_const_reverse_iter_t last_visible_it = std::find_if(childs->rbegin(), childs->rend(),
std::mem_fun(&LLView::getVisible));
[](child_list_t::value_type child){ return child->getVisible(); });
if(last_visible_it != childs->rend())
{
last_right_edge = (*last_visible_it)->getRect().mRight;

View File

@ -112,7 +112,8 @@ BOOL LLFloater360Capture::postBuild()
// UX/UI called for preview mode (always the first index/option)
// by default each time vs restoring the last value
mQualityRadioGroup->setSelectedIndex(0);
// <FS:Ansariel> UX/UI has no clue what the users actually want!
//mQualityRadioGroup->setSelectedIndex(0);
// Construct a URL pointing to the first page to load. Although
// we do not use this page for anything (after some significant
@ -319,6 +320,11 @@ const std::string LLFloater360Capture::getHTMLBaseFolder()
// triggered when the 'capture' button in the UI is pressed
void LLFloater360Capture::onCapture360ImagesBtn()
{
// <FS:Beq> FIRE-31942 Avoid CoRo that appears to never usefully yield
// Allow option to re-enable on the off chance a low power machine can benefit
if(gSavedSettings.getBOOL("FSUseCoRoFor360Capture"))
{
// </FS:Beq>
// launch the main capture code in a coroutine so we can
// yield/suspend at some points to give the main UI
// thread a look-in occasionally.
@ -326,6 +332,13 @@ void LLFloater360Capture::onCapture360ImagesBtn()
{
capture360Images();
});
// <FS:Beq> FIRE-31942 Avoid CoRo that appears to never usefully yield
}
else
{
capture360Images();
}
// </FS:Beq>
}
// Gets the full path name for a given JavaScript file in the HTML folder. We
@ -682,6 +695,7 @@ void LLFloater360Capture::capture360Images()
// allow the UI to update by suspending and waiting for the
// main render loop to update the UI
if(gSavedSettings.getBOOL("FSUseCoRoFor360Capture")) // <FS:Beq/> FIRE-31942 - make apparently pointless CoRo optional (just in case)
suspendForAFrame();
}
@ -892,7 +906,7 @@ const std::string LLFloater360Capture::generate_proposed_filename()
// this looks complex but it's straightforward - removes all non-alpha chars from a string
// which in this case is the SL region name - we use it as a proposed filename but the user is free to change
std::string region_name = region->getName();
std::replace_if(region_name.begin(), region_name.end(), std::not1(std::ptr_fun(isalnum)), '_');
std::replace_if(region_name.begin(), region_name.end(), [](const auto& c) { return isalnum(c) == 0; }, '_');
if (region_name.length() > 0)
{
filename << region_name;

View File

@ -571,9 +571,9 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
}
msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_EstateID, estate_id);
panel->getChild<LLLineEditor>("estate_id")->setValue(LLSD((F32) estate_id));
panel->getChild<LLLineEditor>("grid_position_x")->setValue(LLSD((F32) grid_pos_x));
panel->getChild<LLLineEditor>("grid_position_y")->setValue(LLSD((F32) grid_pos_y));
panel->getChild<LLLineEditor>("estate_id")->setValue(LLSD::Integer(estate_id));
panel->getChild<LLLineEditor>("grid_position_x")->setValue(LLSD::Integer(grid_pos_x));
panel->getChild<LLLineEditor>("grid_position_y")->setValue(LLSD::Integer(grid_pos_y));
// </FS:Zi>
// DEBUG PANEL
@ -719,9 +719,7 @@ void LLFloaterRegionInfo::refreshFromRegion(LLViewerRegion* region)
std::for_each(
mInfoPanels.begin(),
mInfoPanels.end(),
llbind2nd(
std::mem_fun(&LLPanelRegionInfo::refreshFromRegion),
region));
[region](info_panels_t::value_type panel) { panel->refreshFromRegion(region); });
mEnvironmentPanel->refreshFromRegion(region);
}

View File

@ -659,14 +659,33 @@ void LLFloaterTools::refresh()
LLViewerObject* selected_object = mObjectSelection->getFirstObject();
if (selected_object)
{
// Select a parcel at the currently selected object's position.
LLViewerParcelMgr::getInstance()->selectParcelAt(selected_object->getPositionGlobal());
// <FS:Ansariel> FIRE-20387: Editing HUD attachment shows [CAPACITY_STRING] in tools floater
//LLViewerParcelMgr::getInstance()->selectParcelAt(selected_object->getPositionGlobal());
if (!selected_object->isAttachment())
{
LLViewerParcelMgr::getInstance()->selectParcelAt(selected_object->getPositionGlobal());
}
else
{
const LLStringExplicit empty_str("");
childSetTextArg("more info label", "[CAPACITY_STRING]", empty_str);
}
// </FS:Ansariel>
}
else
{
LL_WARNS() << "Failed to get selected object" << LL_ENDL;
}
}
// <FS:Ansariel> Bring back remaining capacity info
else
{
// Selection crosses parcel bounds.
// We don't display remaining land capacity in this case.
const LLStringExplicit empty_str("");
childSetTextArg("more info label", "[CAPACITY_STRING]", empty_str);
}
// </FS:Ansariel>
// <FS:Ansariel> We got this already
//if (object_count == 1)
@ -1071,8 +1090,9 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
// <FS>
getChildView("more info label")->setVisible(!land_visible && have_selection);
getChildView("selection_count")->setVisible(!land_visible && have_selection);
getChildView("selection_faces")->setVisible(LLToolFace::getInstance() == LLToolMgr::getInstance()->getCurrentTool()
&& LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1);
// <FS:Ansariel> We got this already
//getChildView("selection_faces")->setVisible(LLToolFace::getInstance() == LLToolMgr::getInstance()->getCurrentTool()
// && LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1);
getChildView("selection_empty")->setVisible(!land_visible && !have_selection);
//mTab->setVisible(!land_visible);
@ -1485,6 +1505,27 @@ void LLFloaterTools::updateLandImpacts()
return;
}
// <FS:Ansariel> Bring back remaining capacity info
S32 rezzed_prims = parcel->getSimWidePrimCount();
S32 total_capacity = parcel->getSimWideMaxPrimCapacity();
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
if (region)
{
S32 max_tasks_per_region = (S32)region->getMaxTasks();
total_capacity = llmin(total_capacity, max_tasks_per_region);
}
std::string remaining_capacity_str = "";
if (gMeshRepo.meshRezEnabled())
{
LLStringUtil::format_map_t remaining_capacity_args;
remaining_capacity_args["LAND_CAPACITY"] = llformat("%d", total_capacity - rezzed_prims);
remaining_capacity_str = getString("status_remaining_capacity", remaining_capacity_args);
}
childSetTextArg("more info label", "[CAPACITY_STRING]", remaining_capacity_str);
// </FS:Ansariel>
// Update land impacts info in the weights floater
LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::findTypedInstance<LLFloaterObjectWeights>("object_weights");
if(object_weights_floater)

View File

@ -773,7 +773,7 @@ S32 LLGestureMgr::getPlayingCount() const
}
struct IsGesturePlaying : public std::unary_function<LLMultiGesture*, bool>
struct IsGesturePlaying
{
bool operator()(const LLMultiGesture* gesture) const
{

View File

@ -371,7 +371,7 @@ void LLHUDText::updateVisibility()
if (!mSourceObject)
{
LL_WARNS() << "HUD text: mSourceObject is NULL, mOnHUDAttachment: " << mOnHUDAttachment << LL_ENDL;
LL_WARNS_ONCE() << "HUD text: mSourceObject is NULL, mOnHUDAttachment: " << mOnHUDAttachment << LL_ENDL;
mVisible = TRUE;
if (mOnHUDAttachment)
{

View File

@ -3748,6 +3748,12 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
gSavedPerAccountSettings.setLLSD("FSProtectedFolders", new_protected_folders);
}
// </FS:Ansariel>
// <FS:Ansariel> Show folder in new window option
else if ("show_in_new_window" == action)
{
LLFloaterReg::showInstance("fs_partial_inventory", LLSD().with("start_folder_id", mUUID).with("start_folder_name", mDisplayName));
}
// </FS:Ansariel>
}
void LLFolderBridge::gatherMessage(std::string& message, S32 depth, LLError::ELevel log_level)
@ -4701,6 +4707,9 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
}
// </FS:Ansariel>
// <FS:Ansariel> Show folder in new window option
items.push_back((std::string("Show in new Window")));
// Add menu items that are dependent on the contents of the folder.
LLViewerInventoryCategory* category = (LLViewerInventoryCategory *) model->getCategory(mUUID);
if (category && (marketplace_listings_id != mUUID))

View File

@ -2653,7 +2653,38 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
// </FS:Ansariel>
LLSD args;
args["QUESTION"] = LLTrans::getString(root->getSelectedCount() > 1 ? "DeleteItems" : "DeleteItem");
// <FS:Ansariel> FIRE-31816: Include selection count when deleting more than one object from inventory
//args["QUESTION"] = LLTrans::getString(root->getSelectedCount() > 1 ? "DeleteItems" : "DeleteItem");
//args["QUESTION"] = LLTrans::getString(root->getSelectedCount() > 1 ? "DeleteItems" : "DeleteItem", args);
LLLocale locale("");
std::string count_str{};
S32 selection_count = root->getSelectedCount();
S32 total_count{ 0 };
for (const auto item : root->getSelectedItems())
{
total_count++;
LLFolderViewModelItemInventory * view_model = dynamic_cast<LLFolderViewModelItemInventory *>(item->getViewModelItem());
if (view_model)
{
auto cat = model->getCategory(view_model->getUUID());
if (cat)
{
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
model->collectDescendents(cat->getUUID(), cats, items, TRUE);
total_count += (S32)(cats.size() + items.size());
}
}
}
LLResMgr::instance().getIntegerString(count_str, selection_count);
args["COUNT_SELECTION"] = count_str;
LLResMgr::instance().getIntegerString(count_str, total_count);
args["COUNT_TOTAL"] = count_str;
args["QUESTION"] = LLTrans::getString(selection_count > 1 ? "DeleteItems" : "DeleteItem", args);
// </FS:Ansariel>
LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLInventoryAction::onItemsRemovalConfirmation, _1, _2, root->getHandle()));
}
// Note: marketplace listings will be updated in the callback if delete confirmed

View File

@ -1862,9 +1862,9 @@ void LLNetMap::setAvatarMarkColors(const uuid_vec_t& avatar_ids, const LLSD& col
// Use the name as color definition name from colors.xml
LLColor4 mark_color = LLUIColorTable::instance().getColor(color.asString(), LLColor4::green);
for (uuid_vec_t::const_iterator it = avatar_ids.begin(); it != avatar_ids.end(); ++it)
for (const auto& avatar_id : avatar_ids)
{
sAvatarMarksMap[*it] = mark_color;
sAvatarMarksMap[avatar_id] = mark_color;
}
}
@ -1879,13 +1879,9 @@ void LLNetMap::clearAvatarMarkColor(const LLUUID& avatar_id)
// static
void LLNetMap::clearAvatarMarkColors(const uuid_vec_t& avatar_ids)
{
for (uuid_vec_t::const_iterator it = avatar_ids.begin(); it != avatar_ids.end(); ++it)
for (const auto& avatar_id : avatar_ids)
{
avatar_marks_map_t::iterator found = sAvatarMarksMap.find(*it);
if (found != sAvatarMarksMap.end())
{
sAvatarMarksMap.erase(found);
}
sAvatarMarksMap.erase(avatar_id);
}
}
@ -1907,10 +1903,7 @@ LLColor4 LLNetMap::getAvatarColor(const LLUUID& avatar_id)
color = cs_instance.colorize(avatar_id, color, LGG_CS_MINIMAP);
// Color based on contact sets prefs
if (cs_instance.hasFriendColorThatShouldShow(avatar_id, LGG_CS_MINIMAP))
{
color = cs_instance.getFriendColor(avatar_id);
}
cs_instance.hasFriendColorThatShouldShow(avatar_id, LGG_CS_MINIMAP, color);
// Mark Avatars with special colors
avatar_marks_map_t::iterator found = sAvatarMarksMap.find(avatar_id);

View File

@ -1439,7 +1439,7 @@ void LLPanelEditWearable::changeCamera(U8 subpart)
gMorphView->setCameraOffset( subpart_entry->mCameraOffset );
if (gSavedSettings.getBOOL("AppearanceCameraMovement"))
{
gAgentCamera.setFocusOnAvatar(FALSE, FALSE);
// gAgentCamera.setFocusOnAvatar(FALSE, FALSE); <FS:Beq/> FIRE-31959 Restore proper turning behaviour.
gMorphView->updateCamera();
}
}

View File

@ -76,6 +76,10 @@ LLPreviewNotecard::LLPreviewNotecard(const LLSD& key) //const LLUUID& item_id,
// <FS:Ansariel> FIRE-24306: Retain cursor position when saving notecards
,mCursorPos(0)
,mScrollPos(0)
// <FS:Ansariel> FIRE-29425: User-selectable font and size for notecards
,mFontNameChangedCallbackConnection()
,mFontSizeChangedCallbackConnection()
// </FS:Ansariel>
{
const LLInventoryItem *item = getItem();
if (item)
@ -87,6 +91,17 @@ LLPreviewNotecard::LLPreviewNotecard(const LLSD& key) //const LLUUID& item_id,
LLPreviewNotecard::~LLPreviewNotecard()
{
delete mLiveFile;
// <FS:Ansariel> FIRE-29425: User-selectable font and size for notecards
if (mFontNameChangedCallbackConnection.connected())
{
mFontNameChangedCallbackConnection.disconnect();
}
if (mFontSizeChangedCallbackConnection.connected())
{
mFontSizeChangedCallbackConnection.disconnect();
}
// </FS:Ansariel>
}
BOOL LLPreviewNotecard::postBuild()
@ -118,6 +133,12 @@ BOOL LLPreviewNotecard::postBuild()
}
getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
// <FS:Ansariel> FIRE-29425: User-selectable font and size for notecards
mFontNameChangedCallbackConnection = gSavedSettings.getControl("FSNotecardFontName")->getSignal()->connect(boost::bind(&LLPreviewNotecard::onFontChanged, this));
mFontSizeChangedCallbackConnection = gSavedSettings.getControl("FSNotecardFontSize")->getSignal()->connect(boost::bind(&LLPreviewNotecard::onFontChanged, this));
onFontChanged();
// </FS:Ansariel>
return LLPreview::postBuild();
}
@ -983,5 +1004,15 @@ void LLPreviewNotecard::checkCloseAfterSave()
}
// </FS:Ansariel>
// <FS:Ansariel> FIRE-29425: User-selectable font and size for notecards
void LLPreviewNotecard::onFontChanged()
{
LLFontGL* font = LLFontGL::getFont(LLFontDescriptor(gSavedSettings.getString("FSNotecardFontName"), gSavedSettings.getString("FSNotecardFontSize"), LLFontGL::NORMAL));
if (font)
{
mEditor->setFont(font);
}
}
// </FS:Ansariel>
// EOF

View File

@ -129,6 +129,12 @@ protected:
bool writeToFile(const std::string& filename);
std::string getTmpFileName();
// <FS:Ansariel> FIRE-29425: User-selectable font and size for notecards
boost::signals2::connection mFontNameChangedCallbackConnection;
boost::signals2::connection mFontSizeChangedCallbackConnection;
void onFontChanged();
// </FS:Ansariel>
protected:
LLViewerTextEditor* mEditor;
LLButton* mSaveBtn;

View File

@ -1839,11 +1839,9 @@ void LLScriptEdCore::onFontChanged()
if (font)
{
mEditor->setFont(font);
mEditor->needsReflow();
if (mPostEditor)
{
mPostEditor->setFont(font);
mPostEditor->needsReflow();
}
}
}

View File

@ -222,7 +222,7 @@ private:
LLPanel* mWrapperPanel;
// timer counts a lifetime of a toast
std::auto_ptr<LLToastLifeTimer> mTimer;
std::unique_ptr<LLToastLifeTimer> mTimer;
F32 mToastLifetime; // in seconds
F32 mToastFadingTime; // in seconds

View File

@ -196,6 +196,7 @@
#include "fsfloaterimport.h"
#include "fsfloaterim.h"
#include "fsfloaterimcontainer.h"
#include "fsfloaterpartialinventory.h"
#include "fsfloaterplacedetails.h"
#include "fsfloaterposestand.h"
#include "fsfloaterprofile.h"
@ -500,6 +501,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("fs_export", "floater_fs_export.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterObjectExport>);
LLFloaterReg::add("fs_import", "floater_fs_import.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterImport>);
LLFloaterReg::add("fs_posestand", "floater_fs_posestand.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterPoseStand>);
LLFloaterReg::add("fs_partial_inventory", "floater_fs_partial_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterPartialInventory>);
LLFloaterReg::add("fs_placedetails", "floater_fs_placedetails.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterPlaceDetails>);
LLFloaterReg::add("fs_protectedfolders", "floater_fs_protectedfolders.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterProtectedFolders>);
LLFloaterReg::add("fs_radar", "floater_fs_radar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterRadar>);

View File

@ -211,7 +211,9 @@ public:
// [/SL:KB]
{
mStyle = new LLStyle(LLStyle::Params().font(LLFontGL::getFontSansSerif()));
// <FS:Ansariel> FIRE-29425: User-selectable font and size for notecards
//mStyle = new LLStyle(LLStyle::Params().font(LLFontGL::getFontSansSerif()));
mStyle = new LLStyle(LLStyle::Params().font(mEditor.getFont()));
mToolTip = inv_item->getName() + '\n' + inv_item->getDescription();
}
@ -328,11 +330,15 @@ public:
// [/SL:KB]
/*virtual*/ LLStyleConstSP getStyle() const { return mStyle; }
/*virtual*/ void setStyle(LLStyleConstSP style) { mStyle = style; } // <FS:Ansariel> FIRE-29425: User-selectable font and size for notecards
private:
LLUIImagePtr mImage;
LLWString mLabel;
LLStyleSP mStyle;
// <FS:Ansariel> FIRE-29425: User-selectable font and size for notecards
//LLStyleSP mStyle;
LLStyleConstSP mStyle;
// </FS:Ansariel>
std::string mToolTip;
LLPointer<LLInventoryItem> mItem;
LLTextEditor& mEditor;

View File

@ -294,6 +294,9 @@ static const F32 MIN_UI_SCALE = 0.75f;
static const F32 MAX_UI_SCALE = 7.0f;
static const F32 MIN_DISPLAY_SCALE = 0.75f;
// <FS:Ansariel> FIRE-31852: Now it aggressively executes gestures within focussed floaters...
//static const char KEY_MOUSELOOK = 'M';
static LLCachedControl<std::string> sSnapshotBaseName(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseName", "Snapshot"));
static LLCachedControl<std::string> sSnapshotDir(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseDir", ""));
@ -3297,9 +3300,17 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
if (keyboard_focus
&& !gFocusMgr.getKeystrokesOnly())
{
// <FS:Ansariel> FIRE-31551: This causes aggressive switching into mouselook while any floater has focus
//Most things should fall through, but mouselook is an exception,
//don't switch to mouselook if any floater has focus
// <FS:Ansariel> FIRE-31852: Now it aggressively executes gestures within focussed floaters...
//if ((key == KEY_MOUSELOOK) && !(mask & (MASK_CONTROL | MASK_ALT)))
//{
// return TRUE;
//}
//LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(keyboard_focus);
//if (cur_focus && cur_focus->acceptsTextInput())
// </FS:Ansariel>
{
#ifdef LL_WINDOWS
// On windows Alt Gr key generates additional Ctrl event, as result handling situations

View File

@ -1922,7 +1922,7 @@ BOOL LLVOVolume::genBBoxes(BOOL force_global, BOOL should_update_octree_bounds)
break;
// </FS:ND>
LLFace *face = mDrawable->getFace(i);
LLFace* face = mDrawable->getFace(i);
if (!face)
{
continue;
@ -5851,7 +5851,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
}
}
// if (type == LLRenderPass::PASS_ALPHA) // <FS:Beq> allow tracking through pipeline
if (type == LLRenderPass::PASS_ALPHA)
{ //for alpha sorting
facep->setDrawInfo(draw_info);
}
@ -6770,7 +6770,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
}
#endif
//calculate maximum number of vertices to store in a single buffer
static LLCachedControl<S32> max_vbo_size(gSavedSettings, "RenderMaxVBOSize", 512);
U32 max_vertices = (max_vbo_size * 1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask);
max_vertices = llmin(max_vertices, (U32) 65535);
@ -6838,14 +6838,6 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
LLFace* facep = *face_iter;
LLViewerTexture* tex = facep->getTexture();
const LLTextureEntry* te = facep->getTextureEntry();
// <FS:Beq> Don't batch fully transparent faces
if (te && ( te->getAlpha() == 0.f ) && ( te->getGlow() == 0.0 ) && !LLDrawPoolAlpha::sShowDebugAlpha)
{
facep->setSize(0,0);
++face_iter;
continue;
}
// </FS:Beq>
LLMaterialPtr mat = te->getMaterialParams();
LLMaterialID matId = te->getMaterialID();
@ -7264,10 +7256,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
else if (is_alpha)
{
// can we safely treat this as an alpha mask?
// <FS:Beq> Nothing actually sets facecolor use the TE alpha instead.
// if (facep->getFaceColor().mV[3] <= 0.f)
if ((te->getAlpha() <=0.f || facep->getFaceColor().mV[3] <= 0.f) && te->getGlow() == 0.0 )
// </FS:Beq>
if (facep->getFaceColor().mV[3] <= 0.f)
{ //100% transparent, don't render unless we're highlighting transparent
LL_PROFILE_ZONE_NAMED_CATEGORY_VOLUME("facep->alpha -> invisible");
registerFace(group, facep, LLRenderPass::PASS_ALPHA_INVISIBLE);

View File

@ -231,7 +231,7 @@ void LLWatchdog::run()
LL_INFOS() << "Watchdog thread delayed: resetting entries." << LL_ENDL;
std::for_each(mSuspects.begin(),
mSuspects.end(),
std::mem_fun(&LLWatchdogEntry::reset)
[](SuspectsRegistry::value_type suspect) { suspect->reset(); }
);
}
else
@ -239,7 +239,7 @@ void LLWatchdog::run()
SuspectsRegistry::iterator result =
std::find_if(mSuspects.begin(),
mSuspects.end(),
std::not1(std::mem_fun(&LLWatchdogEntry::isAlive))
[](SuspectsRegistry::value_type suspect) { return !suspect->isAlive(); }
);
if(result != mSuspects.end())
{

View File

@ -201,7 +201,7 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32
//LL_INFOS("WorldMap") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL;
LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, FTT_MAP_TILE, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
LL_INFOS("MAPURL") << "fetching map tile from " << imageurl << LL_ENDL;
//LL_INFOS("MAPURL") << "fetching map tile from " << imageurl << LL_ENDL;
img->setBoostLevel(LLGLTexture::BOOST_MAP);

View File

@ -11480,7 +11480,10 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar)
++attachment_iter)
{
LLViewerObject* attached_object = attachment_iter->get();
if (attached_object && attached_object->isRiggedMesh())
// <FS:Ansariel> FIRE-31966: Some mesh bodies/objects don't show in shape editor previews -> show everything but animesh
//if (attached_object && attached_object->isRiggedMesh())
if (attached_object && !attached_object->getControlAvatar())
// </FS:Ansariel>
{
markVisible(attached_object->mDrawable->getSpatialBridge(), *viewer_camera);
}
@ -11765,36 +11768,71 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar)
bool LLPipeline::hasRenderBatches(const U32 type) const
{
// <FS:ND> FIRE-31942, sCull can be invalid if triggering 360 snapshosts fast enough (due to snapshots running in their own co routine)
if( !sCull )
return {};
// </FS:ND>
return sCull->getRenderMapSize(type) > 0;
}
LLCullResult::drawinfo_iterator LLPipeline::beginRenderMap(U32 type)
{
// <FS:ND> FIRE-31942, sCull can be invalid if triggering 360 snapshosts fast enough (due to snapshots running in their own co routine)
if( !sCull )
return {};
// </FS:ND>
return sCull->beginRenderMap(type);
}
LLCullResult::drawinfo_iterator LLPipeline::endRenderMap(U32 type)
{
// <FS:ND> FIRE-31942, sCull can be invalid if triggering 360 snapshosts fast enough (due to snapshots running in their own co routine)
if( !sCull )
return {};
// </FS:ND>
return sCull->endRenderMap(type);
}
LLCullResult::sg_iterator LLPipeline::beginAlphaGroups()
{
// <FS:ND> FIRE-31942, sCull can be invalid if triggering 360 snapshosts fast enough (due to snapshots running in their own co routine)
if( !sCull )
return {};
// </FS:ND>
return sCull->beginAlphaGroups();
}
LLCullResult::sg_iterator LLPipeline::endAlphaGroups()
{
// <FS:ND> FIRE-31942, sCull can be invalid if triggering 360 snapshosts fast enough (due to snapshots running in their own co routine)
if( !sCull )
return {};
// </FS:ND>
return sCull->endAlphaGroups();
}
LLCullResult::sg_iterator LLPipeline::beginRiggedAlphaGroups()
{
// <FS:ND> FIRE-31942, sCull can be invalid if triggering 360 snapshosts fast enough (due to snapshots running in their own co routine)
if( !sCull )
return {};
// </FS:ND>
return sCull->beginRiggedAlphaGroups();
}
LLCullResult::sg_iterator LLPipeline::endRiggedAlphaGroups()
{
// <FS:ND> FIRE-31942, sCull can be invalid if triggering 360 snapshosts fast enough (due to snapshots running in their own co routine)
if( !sCull )
return {};
// </FS:ND>
return sCull->endRiggedAlphaGroups();
}

View File

@ -1397,4 +1397,16 @@
<color
name="AreaSearchBeaconColor"
reference="Blue_80" />
<color
name="NotecardBackgroundColor"
reference="TextBgFocusColor" />
<color
name="NotecardTextColor"
reference="TextFgColor" />
<color
name="NotecardSelectionColor"
reference="EmphasisColor" />
<color
name="NotecardCursorColor"
reference="TextCursorColor" />
</colors>

View File

@ -1175,4 +1175,16 @@
<color
name="OutfitGalleryItemUnselected"
value="0.4 0.4 0.4 1" />
<color
name="NotecardBackgroundColor"
reference="TextBgFocusColor" />
<color
name="NotecardTextColor"
reference="TextFgColor" />
<color
name="NotecardSelectionColor"
reference="EmphasisColor" />
<color
name="NotecardCursorColor"
reference="TextCursorColor" />
</colors>

View File

@ -1394,4 +1394,16 @@
<color
name="AreaSearchBeaconColor"
reference="Blue_80" />
<color
name="NotecardBackgroundColor"
reference="TextBgFocusColor" />
<color
name="NotecardTextColor"
reference="TextFgColor" />
<color
name="NotecardSelectionColor"
reference="EmphasisColor" />
<color
name="NotecardCursorColor"
reference="TextCursorColor" />
</colors>

View File

@ -1163,4 +1163,16 @@
<color
name="OutfitGalleryItemUnselected"
value="0.4 0.4 0.4 1" />
<color
name="NotecardBackgroundColor"
reference="TextBgFocusColor" />
<color
name="NotecardTextColor"
reference="TextFgColor" />
<color
name="NotecardSelectionColor"
reference="EmphasisColor" />
<color
name="NotecardCursorColor"
reference="TextCursorColor" />
</colors>

View File

@ -1351,4 +1351,16 @@
<color
name="AreaSearchBeaconColor"
reference="Blue_80" />
<color
name="NotecardBackgroundColor"
reference="TextBgFocusColor" />
<color
name="NotecardTextColor"
reference="TextFgColor" />
<color
name="NotecardSelectionColor"
reference="EmphasisColor" />
<color
name="NotecardCursorColor"
reference="TextCursorColor" />
</colors>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<floater name="fs_partial_inventory" title="Inventar">
<floater.string name="title">Inventar: [FOLDERNAME]</floater.string>
<filter_editor label="Inventar-Ordner filtern" name="flt_search"/>
</floater>

View File

@ -146,7 +146,7 @@
Flächen ausgewählt: [FACES_STRING]
</text>
<text name="more info label">
[secondlife:///app/openfloater/object_weights Mehr Infos]
[CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Mehr Infos]
</text>
<text name="selection_weight">
Physikgewicht [PHYS_WEIGHT], Darstellungskosten [DISP_WEIGHT].

View File

@ -121,6 +121,7 @@
<menu_item_call label="Berühren" name="Attachment Touch" />
<menu_item_call label="Bearbeiten" name="Wearable Edit"/>
<menu_item_call label="In Gesamtansicht anzeigen" name="Show in Main Panel"/>
<menu_item_call label="In neuem Fenster anzeigen" name="Show in new Window"/>
<menu_item_call label="Hinzufügen" name="Wearable Add"/>
<menu_item_call label="Texturen aktualisieren" name="Texture Refresh Attachment"/>
<menu_item_call label="Ausziehen" name="Take Off"/>

View File

@ -4355,7 +4355,7 @@ Sie ist voll oder startet in Kürze neu.
Sie können die Form eines Mesh-Objekts nicht ändern.
</notification>
<notification name="FullRegionCantEnter">
Sie können diese Region nicht betreten, \nda die Region voll ist.
Sie können diese Region nicht betreten, da die Region voll ist.
</notification>
<notification name="LinkFailedOwnersDiffer">
Verknüpfungsfehler Eigentümer sind unterschiedlich
@ -4659,7 +4659,7 @@ Wählen Sie eine kleinere Landfläche aus.
Passkauf momentan nicht möglich. Versuchen Sie es später erneut.
</notification>
<notification name="CantCreateObjectParcelFull">
Objekt kann nicht erstellt werden, \nda die Parzelle voll ist.
Objekt kann nicht erstellt werden, da die Parzelle voll ist.
</notification>
<notification name="FailedPlacingObject">
Objekt konnte nicht an festgelegtem Ort platziert werden. Versuchen Sie es erneut.
@ -5596,7 +5596,7 @@ Falls Sie diesen Nutzungsbestimmungen nicht zustimmen, sollten keinerlei finanzi
Mehrfach-Import von Windlight abgeschlossen.
</notification>
<notification name="AttachedRiggedObjectToHUD">
Der Anhang „[NAME]“ enthält geriggtes Mesh, ist aber am HUD-Punkt „[HUD_POINT]“ angehängt. Das bedeutet, dass Sie es korrekt sehen werden, alle anderen werden es hingegen gar nicht sehen. Denken Sie darüber nach, den Anhang zu entfernen und an einem regulären Punkt am Körper anzuhängen.
Der Anhang „[NAME]“ enthält geriggtes Mesh, ist aber am HUD-Punkt „[HUD_POINT]“ angehängt. Geriggte Meshes an HUD-Punkten sind nicht sichtbar, weder für Sie selbst noch für andere. Denken Sie darüber nach, den Anhang zu entfernen und an einem regulären Punkt am Körper anzuhängen.
<usetemplate ignoretext="Warnen, wenn ein geriggtes Mesh an einem HUD-Punkt angehängt wird." name="notifyignore"/>
</notification>
<notification name="WarnForceLoginURL">

View File

@ -264,6 +264,23 @@ Standard 0. Größere Werte können nicht korrekt funktionieren.
Pixel (Erfordert Neustart)
[VIEWER_GENERATION]-Standard 20. Viewer 1-Standard 18.
</text>
<text name="text_box_notecard_font" width="125">
Schrift für Notizkarten:
</text>
<combo_box name="FSNotecardFontName" tool_tip="Name der Schrift, die für den Notizkarten-Editor verwendet wird">
<combo_item name="Sans Serif" label="Sans Serif"/>
<combo_item name="Monospace" label="Monospace"/>
<combo_item name="Scripting" label="Scripting"/>
<combo_item name="Cascadia" label="Cascadia Code"/>
</combo_box>
<combo_box name="FSNotecardFontSize" tool_tip="Größe der Schrift, die für den Notizkarten-Editor verwendet wird">
<combo_item name="Monospace" label="Monospace"/>
<combo_item name="Scripting" label="Scripting"/>
<combo_item name="Cascadia" label="Cascadia Code"/>
<combo_item name="Small" label="Klein"/>
<combo_item name="Medium" label="Mittel"/>
<combo_item name="Large" label="Groß"/>
</combo_box>
</panel>
</tab_container>
</panel>

View File

@ -206,6 +206,26 @@
<text name="area_search_beacon_color_label">
Farbe für Markierung der Umgebungssuche:
</text>
<text name="notecard_editor_color_label">
Farben für Notizkarten:
</text>
<text name="notecard_editor_writable_text_color_label">
Text:
</text>
<color_swatch name="notecard_editor_writable_text_color" tool_tip="Farbe für Notizkarten-Text"/>
<text name="notecard_editor_writable_bg_color_label">
Hintergrund:
</text>
<color_swatch name="notecard_editor_writable_bg_color" tool_tip="Farbe für Notizkarten-Hintergrund"/>
<text name="notecard_editor_writable_cursor_color_label">
Cursor:
</text>
<color_swatch name="notecard_editor_writable_cursor_color" tool_tip="Farbe für Notizkarten-Cursor"/>
<text name="notecard_editor_writable_selection_color_label">
Auswahl:
</text>
<color_swatch name="notecard_editor_writable_cursor_color" tool_tip="Farbe für selektierten Text in Notizkarten"/>
<color_swatch name="area_search_beacon_color" tool_tip="Farbe für Markierung der Umgebungssuche"/>
<check_box label="Zeige Skript-Dialoge auf undurchsichtigem Hintergrund" name="FSScriptDialogNoTransparency"/>
<check_box name="FSGroupNotifyNoTransparency" label="Zeige Gruppenmitteilungen auf undurchsichtigem Hintergrund"/>

View File

@ -19,8 +19,8 @@
<text name="grid_position_lbl">
Grid-Position:
</text>
<line_editor name="grid_position_x" initial_value="unbekannt"/>
<line_editor name="grid_position_y" initial_value="unbekannt"/>
<line_editor name="grid_position_x" default_text="n./v."/>
<line_editor name="grid_position_y" default_text="n./v."/>
<text name="region_type_lbl">
Typ:
</text>

View File

@ -5465,10 +5465,10 @@ Falls der Fehler weiterhin auftritt, überprüfen Sie bitte Ihre Netzwerk- und F
Meine Premium-Mitgliedschaft
</string>
<string name="DeleteItems">
Ausgewählte Objekte löschen?
Ausgewählte [COUNT_SELECTION] Objekte löschen ([COUNT_TOTAL] insgesamt)?
</string>
<string name="DeleteItem">
Ausgewähltes Objekt löschen?
Ausgewähltes Objekt löschen ([COUNT_TOTAL] insgesamt)?
</string>
<string name="EmptyOutfitText">
Keine Objekte in diesem Outfit

View File

@ -165,7 +165,7 @@ Additional code generously contributed to Firestorm by:
top_pad="4"
width="450"
wrap="true">
Albatroz Hird, Alexie Birman, Andromeda Rage, Angeldark Raymaker, Angus Boyd, Animats, Armin Weatherwax, Beq Janus, Casper Warden, Chalice Yao, Chaser Zaks, Chorazin Allen, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Denver Maksim, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Laurent Bechir, Magne Metaverse LLC, Magus Freston, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, Mister Acacia, MorganMegan, mygoditsfullofstars, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Oren Hurvitz, Paladin Forzane, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, Rebecca Ashbourne, Revolution Smythe, Romka Swallowtail, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Testicular Slingshot, Thickbrick Sleaford, Ubit Umarov, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, Zwagoth Klaar and others.
Albatroz Hird, Alexie Birman, Andromeda Rage, Angeldark Raymaker, Angus Boyd, Animats, Armin Weatherwax, Beq Janus, Casper Warden, Chalice Yao, Chaser Zaks, Chorazin Allen, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Denver Maksim, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Laurent Bechir, Magne Metaverse LLC, Magus Freston, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, Mister Acacia, MorganMegan, Morgan Pennent, mygoditsfullofstars, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Oren Hurvitz, Paladin Forzane, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, Rebecca Ashbourne, Revolution Smythe, Romka Swallowtail, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Testicular Slingshot, Thickbrick Sleaford, Ubit Umarov, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, Zwagoth Klaar and others.
</text>
<text
follows="top|left"

View File

@ -7,6 +7,7 @@
height="305"
layout="topleft"
name="create_landmark"
positioning="centered"
title="Create Landmark"
width="330">
<string name="favorites_bar">

View File

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<floater
positioning="cascading"
save_rect="true"
can_resize="true"
height="463"
name="fs_partial_inventory"
help_topic="fs_partial_inventory"
title="Inventory"
background_visible="true"
layout="topleft"
min_height="350"
min_width="265"
width="313">
<floater.string name="title">Inventory: [FOLDERNAME]</floater.string>
<filter_editor
follows="left|top|right"
height="23"
label="Filter inventory folder"
layout="topleft"
left="4"
name="flt_search"
top="2"
right="-4" />
<panel
name="pnl_inv_wrap"
follows="all"
layout="topleft"
left="4"
top_pad="2"
right="-4"
height="430">
</panel>
</floater>

View File

@ -60,6 +60,11 @@
name="desc"
width="296" />
<text_editor
bg_focus_color="NotecardBackgroundColor"
bg_writeable_color="NotecardBackgroundColor"
bg_selected_color="NotecardSelectionColor"
text_color="NotecardTextColor"
cursor_color="NotecardCursorColor"
type="string"
length="1"
embedded_items="true"

View File

@ -873,7 +873,7 @@
top_pad="-5"
visible="false"
width="280">
[secondlife:///app/openfloater/object_weights More info]
[CAPACITY_STRING] [secondlife:///app/openfloater/object_weights More info]
</text>
<view_border
bevel_style="none"

View File

@ -23,16 +23,6 @@
visible="false"
width="1024" />
<!-- At the moment layout_stack is not an LLUICtrl,
but Tab requires focus_root to function and focus_root
functionality is implemented in LLUICtrl -->
<panel follows="all"
height="768"
name="menu_tab_wrapper"
mouse_opaque="false"
focus_root="true"
top="0">
<layout_stack border_size="0"
follows="all"
mouse_opaque="false"
@ -43,12 +33,12 @@
<layout_panel mouse_opaque="true"
follows="left|right|top"
name="status_bar_container"
tab_stop="false"
height="19"
left="0"
top="0"
width="1024"
auto_resize="false"
default_tab_group="1"
visible="true">
<view mouse_opaque="false"
follows="all"
@ -56,7 +46,6 @@
left="0"
top="0"
width="1024"
tab_group="1"
height="19"/>
</layout_panel>
<layout_panel auto_resize="true"
@ -119,8 +108,7 @@
tab_stop="false"/>
</layout_panel>
</layout_stack>
</panel> <!--menu_tab_wrapper-->
<panel top="0"
follows="all"
mouse_opaque="false"

View File

@ -386,6 +386,14 @@
function="Inventory.DoToSelected"
parameter="show_in_main_panel" />
</menu_item_call>
<menu_item_call
label="Show in new Window"
layout="topleft"
name="Show in new Window">
<menu_item_call.on_click
function="Inventory.DoToSelected"
parameter="show_in_new_window" />
</menu_item_call>
<menu_item_call
label="Restore to Last Position"
layout="topleft"

View File

@ -11831,7 +11831,7 @@ You may not alter the shape of a mesh object
name="FullRegionCantEnter"
type="notify">
<tag>fail</tag>
You can't enter this region because \nthe region is full.
You can't enter this region because the region is full.
</notification>
<notification
@ -12637,7 +12637,7 @@ Unable to buy pass right now. Try again later.
name="CantCreateObjectParcelFull"
type="notify">
<tag>fail</tag>
Can't create object because \nthe parcel is full.
Can't create object because the parcel is full.
</notification>
<notification
@ -13947,7 +13947,7 @@ Firestorm Animation Overrider: [AO_MESSAGE]
icon="alertmodal.tga"
name="AttachedRiggedObjectToHUD"
type="alertmodal">
An attachment named "[NAME]" contains rigged mesh but is attached to the HUD point "[HUD_POINT]". This means you will see it rendered correctly, but everyone else is not going to be able see it at all. You might want to consider taking it off and re-attaching it to a regular body attachment point.
An attachment named "[NAME]" contains rigged mesh but is attached to the HUD point "[HUD_POINT]". Rigged meshes attached to HUD points won't be visible at all - neither for you nor for anybody else. You might want to consider taking it off and re-attaching it to a regular body attachment point.
<usetemplate
ignoretext="Warn me when a rigged attachment is worn on a HUD attachment point"
name="notifyignore"/>

View File

@ -8,6 +8,7 @@
top="19"
left="0"
follows="left|top|right"
focus_root="true"
height="39"
layout="topleft"
name="navigation_bar"

View File

@ -1734,6 +1734,49 @@ Default 0. Larger values may not work well.
[VIEWER_GENERATION] default 20. Viewer 1 default 18.
</text>
<text
top_pad="10"
left="10"
follows="left|top"
name="text_box_notecard_font"
width="120">
Notecard Editor Font:
</text>
<combo_box
allow_text_entry="false"
top_delta="-5"
left_pad="5"
follows="left|top"
max_chars="20"
mouse_opaque="true"
name="FSNotecardFontName"
width="150"
control_name="FSNotecardFontName"
tool_tip="Name of the font used in the notecard editor">
<combo_item name="Sans Serif" value="SansSerif" label="Sans Serif"/>
<combo_item name="Monospace" value="Monospace" label="Monospace"/>
<combo_item name="Scripting" value="Scripting" label="Scripting"/>
<combo_item name="Cascadia" value="Cascadia" label="Cascadia Code"/>
</combo_box>
<combo_box
allow_text_entry="false"
top_delta="0"
left_pad="5"
follows="left|top"
max_chars="20"
mouse_opaque="true"
name="FSNotecardFontSize"
width="150"
control_name="FSNotecardFontSize"
tool_tip="Size of the font used in the notecard editor">
<combo_item name="Monospace" value="Monospace" label="Monospace"/>
<combo_item name="Scripting" value="Scripting" label="Scripting"/>
<combo_item name="Cascadia" value="Cascadia" label="Cascadia Code"/>
<combo_item name="Small" value="Small" label="Small"/>
<combo_item name="Medium" value="Medium" label="Medium"/>
<combo_item name="Large" value="Large" label="Large"/>
</combo_box>
<!-- not a live preview
<text
name="tooltip_textbox"

View File

@ -1830,10 +1830,10 @@
<text
follows="left|top"
layout="topleft"
left="30"
left="250"
height="12"
name="area_search_beacon_color_label"
top_pad="15"
top_delta="-17"
width="400">
Area search beacon Color:
</text>
@ -1843,7 +1843,7 @@
height="24"
label_height="0"
layout="topleft"
left="40"
left="260"
top_pad="5"
name="area_search_beacon_color"
tool_tip="Choose area search beacon color"
@ -1856,6 +1856,133 @@
parameter="AreaSearchBeaconColor" />
</color_swatch>
<text
follows="left|top"
layout="topleft"
left="30"
height="12"
name="notecard_editor_color_label"
top_pad="15"
width="400">
Notecard Colors:
</text>
<text
follows="left|top"
layout="topleft"
left="40"
height="12"
name="notecard_editor_writable_text_color_label"
top_pad="15"
width="30">
Text:
</text>
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="24"
label_height="0"
layout="topleft"
left_pad="10"
top_delta="-6"
name="notecard_editor_writable_text_color"
tool_tip="Notecard Text Color"
width="44">
<color_swatch.init_callback
function="Pref.getUIColor"
parameter="NotecardTextColor" />
<color_swatch.commit_callback
function="Pref.applyUIColor"
parameter="NotecardTextColor" />
</color_swatch>
<text
follows="left|top"
layout="topleft"
left_pad="20"
height="12"
name="notecard_editor_writable_bg_color_label"
top_delta="6"
width="70">
Background:
</text>
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="24"
label_height="0"
layout="topleft"
left_pad="10"
top_delta="-6"
name="notecard_editor_writable_bg_color"
tool_tip="Notecard Background Color"
width="44">
<color_swatch.init_callback
function="Pref.getUIColor"
parameter="NotecardBackgroundColor" />
<color_swatch.commit_callback
function="Pref.applyUIColor"
parameter="NotecardBackgroundColor" />
</color_swatch>
<text
follows="left|top"
layout="topleft"
left_pad="20"
height="12"
name="notecard_editor_writable_cursor_color_label"
top_delta="6"
width="40">
Cursor:
</text>
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="24"
label_height="0"
layout="topleft"
left_pad="10"
top_delta="-6"
name="notecard_editor_writable_cursor_color"
tool_tip="Notecard Cursor Color"
width="44">
<color_swatch.init_callback
function="Pref.getUIColor"
parameter="NotecardCursorColor" />
<color_swatch.commit_callback
function="Pref.applyUIColor"
parameter="NotecardCursorColor" />
</color_swatch>
<text
follows="left|top"
layout="topleft"
left_pad="20"
height="12"
name="notecard_editor_writable_selection_color_label"
top_delta="6"
width="60">
Selection:
</text>
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="24"
label_height="0"
layout="topleft"
left_pad="10"
top_delta="-6"
name="notecard_editor_writable_selection_color"
tool_tip="Notecard Selected Text Color"
width="44">
<color_swatch.init_callback
function="Pref.getUIColor"
parameter="NotecardSelectionColor" />
<color_swatch.commit_callback
function="Pref.applyUIColor"
parameter="NotecardSelectionColor" />
</color_swatch>
<check_box
control_name="FSScriptDialogNoTransparency"
follows="left|top"

View File

@ -29,7 +29,8 @@
left_delta="50"
name="region_text"
top_delta="0"
width="400">
use_ellipses="true"
width="235">
unknown
</text>
<text
@ -94,7 +95,7 @@
right="-55"
name="grid_position_x"
top_delta="0"
initial_value="unknown"
default_text="n/a"
width="40" />
<line_editor
follows="right|top"
@ -104,7 +105,7 @@
right="-10"
name="grid_position_y"
top_delta="0"
initial_value="unknown"
default_text="n/a"
width="40" />
<text
follows="left|top"

View File

@ -10,6 +10,7 @@
left="0"
mouse_opaque="false"
name="status"
tab_stop="false"
top="19"
width="1000">
<!-- icon

View File

@ -2505,8 +2505,8 @@ If you continue to experience problems, please check your network and firewall s
<string name="MembershipPremiumText">My Premium membership</string>
<!-- Question strings for delete items notifications -->
<string name="DeleteItems">Delete selected items?</string>
<string name="DeleteItem">Delete selected item?</string>
<string name="DeleteItems">Delete selected [COUNT_SELECTION] items ([COUNT_TOTAL]] total)?</string>
<string name="DeleteItem">Delete selected item ([COUNT_TOTAL]] total)?</string>
<string name="EmptyOutfitText">There are no items in this outfit</string>

View File

@ -4146,7 +4146,7 @@ Prueba otra vez dentro de un minuto.
No se puede cambiar la forma de un objeto de la malla
</notification>
<notification name="FullRegionCantEnter">
No puedes entrar en esta región porque \nla región está llena.
No puedes entrar en esta región porque la región está llena.
</notification>
<notification name="LinkFailedOwnersDiffer">
Error de vínculo: los propietarios son diferentes
@ -4447,7 +4447,7 @@ Prueba a seleccionar un terreno más pequeño.
No se puede comprar el pase ahora mismo. Vuelve a intentarlo más tarde.
</notification>
<notification name="CantCreateObjectParcelFull">
No se puede crear el objeto porque \nla parcela está llena.
No se puede crear el objeto porque la parcela está llena.
</notification>
<notification name="FailedPlacingObject">
Error al colocar el objeto en el lugar especificado. Vuelve a intentarlo.

View File

@ -19,8 +19,6 @@
<text name="grid_position_lbl">
Pos. en la red:
</text>
<line_editor name="grid_position_x" initial_value="desconocida"/>
<line_editor name="grid_position_y" initial_value="desconocida"/>
<text name="region_type_lbl">
Tipo:
</text>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<floater name="fs_partial_inventory" title="Inventaire">
<floater.string name="title">Inventaire : [FOLDERNAME]</floater.string>
<filter_editor label="Filtrer le dossier d'inventaire" name="flt_search"/>
</floater>

View File

@ -126,7 +126,7 @@
Aucune sélection effectuée.
</text>
<text name="more info label">
[secondlife:///app/openfloater/object_weights Plus d&apos;infos]
[CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Plus d&apos;infos]
</text>
<tab_container name="Object Info Tabs">
<panel label="Général" name="General">

View File

@ -83,6 +83,7 @@
<menu_item_call label="Protéger" name="ProtectFolder"/>
<menu_item_call label="Copier l&apos;UUID (identifiant universel unique)" name="Copy Asset UUID"/>
<menu_item_call label="Affiche le Panneau principal" name="Show in Main Panel"/>
<menu_item_call label="Afficher dans une nouvelle fenêtre" name="Show in new Window"/>
<menu_item_call label="Remettre à la dernière position" name="Restore to Last Position"/>
<menu_item_call label="Couper" name="Cut"/>
<menu_item_call label="Copier" name="Copy"/>

View File

@ -4635,7 +4635,7 @@ Elle est peut-être pleine ou sur le point de redémarrer.
Vous ne pouvez pas changer la forme d&apos;un objet avec maillage.
</notification>
<notification name="FullRegionCantEnter">
Vous ne pouvez pas pénétrer dans cette région car \ncar la région est pleine.
Vous ne pouvez pas pénétrer dans cette région car car la région est pleine.
</notification>
<notification name="LinkFailedOwnersDiffer">
Échec du lien -- les propriétaires sont différents
@ -4939,7 +4939,7 @@ Veuillez sélectionner un terrain plus petit.
Impossible d&apos;acheter le pass actuellement. Réessayez ultérieurement.
</notification>
<notification name="CantCreateObjectParcelFull">
Création de l&apos;objet impossible car \nla parcelle est pleine.
Création de l&apos;objet impossible car la parcelle est pleine.
</notification>
<notification name="FailedPlacingObject">
Échec du placement de l&apos;objet à l&apos;emplacement spécifié. Veuillez réessayer.
@ -5405,7 +5405,7 @@ Veuillez noter que "Utiliser l'environnement partagé" et "Basé sur le cycle jo
Superviseur d'animation Firestorm : [AO_MESSAGE]
</notification>
<notification name="AttachedRiggedObjectToHUD">
Un objet attaché "[NAME]" contient du mesh lié à l'avatar mais est attaché au point HUD "[HUD_POINT]". Cela signifie que vous le verrez correctement affiché, mais que les autres ne pourront pas le voir. Retirez et de réattachez à un point d'attachement normal du corps.
Un objet attaché "[NAME]" contient du mesh lié à l'avatar mais est attaché au point HUD "[HUD_POINT]". Les mesh liés à l'avatar attachés à un point HUD ne seront visibles ni par vous ni par les autres. Retirez et de réattachez à un point d'attachement normal du corps.
</notification>
<notification name="WarnForceLoginURL">
L'URL de l'écran d'accueil de connexion est remplacée à des fins de test.

View File

@ -175,6 +175,15 @@
pixels (Redémarrage requis)
20 par défaut pour le [VIEWER_GENERATION], 18 pour le Viewer 1.
</text>
<text name="text_box_notecard_font" width="170">
Police de l'éditeur de notices :
</text>
<combo_box name="FSNotecardFontName" tool_tip="Nom de la police utilisée dans l'éditeur de notices" />
<combo_box name="FSNotecardFontSize" tool_tip="Taille de la police utilisée dans l'éditeur de notices">
<combo_item name="Small" label="Petite"/>
<combo_item name="Medium" label="Moyenne"/>
<combo_item name="Large" label="Grande"/>
</combo_box>
</panel>
</tab_container>
</panel>

View File

@ -49,22 +49,22 @@
<text name="beyond_shout_distance_tag_label">Hors de portée de cri</text>
</panel>
<panel name="client_tags_panel">
<text name="client_tags_colors">Couleur selon le Viewer : (OpenSim/AuroraSim seulement)</text>
<text name="client_tags_colors">Couleur selon la visionneuse : (OpenSim/AuroraSim seulement)</text>
<text name="whattagstoshow">Quelles étiquettes voulez-vous voir ?</text>
<combo_box name="ClientTagsVisibility">
<combo_box.item name="No Viewertags" label=" Aucun"/>
<combo_box.item name="TPVD Viewer" label="Les 'Third-Party Viewers' officiels"/>
<combo_box.item name="All known Viewers" label="Tous les Viewers connus (définis par une liste)"/>
<combo_box.item name="All Viewers" label="Tous les Viewers"/>
<combo_box.item name="All known Viewers" label="Toutes les visionneuses connues (définies par une liste)"/>
<combo_box.item name="All Viewers" label="Toutes les visionneuses"/>
</combo_box>
<text name="colorbasedonviewer">Couleur de l'étiquette basé sur le Viewer ?</text>
<text name="colorbasedonviewer">Couleur d'étiquette par visionneuse</text>
<combo_box name="ColorClienttags">
<combo_box.item name="Color not based on Viewer" label="Non"/>
<combo_box.item name="Single color per Viewer" label="Une couleur par Viewer"/>
<combo_box.item name="Multiple colors per Viewer" label="Plusieurs couleurs par Viewer"/>
<combo_box.item name="Single color per Viewer" label="Une couleur par visionneuse"/>
<combo_box.item name="Multiple colors per Viewer" label="Plusieurs couleurs par visionneuse"/>
<combo_box.item name="Userdefined color" label="Couleurs définies par l'utilisateur"/>
</combo_box>
<text name="listtodisplayviewertags_txt">Liste prédéfinie pour les étiquettes de Viewer ?</text>
<text name="listtodisplayviewertags_txt">Liste prédéf. d'étiquettes de visionneuse ?</text>
<combo_box name="UseLegacyClienttags">
<combo_box.item name="Don't use a list" label="Non"/>
<combo_box.item name="Local Clienttags" label="Liste statique"/>
@ -95,6 +95,7 @@
<text name="floater_opacity">Transparence des fenêtres :</text>
<slider label="Actives :" name="active"/>
<slider label="Inactives :" name="inactive"/>
<slider label="Caméra / Mouvement :" name="camera_movement"/>
<text name="console_opacity">Transparence de la console :</text>
<color_swatch name="console_background" tool_tip="Sélectionnez la couleur de la console"/>
<slider label="Transparence :" name="console_background_opacity" tool_tip="Sélectionnez la transparence de l'arrière-plan de la console"/>
@ -102,6 +103,25 @@
<color_swatch name="preferences_search_color" tool_tip="Sélectionnez la couleur des préférences surlignées par les résultats de recherche"/>
<text name="area_search_beacon_color_label">Couleur de la balise de recherche zonière : </text>
<color_swatch name="area_search_beacon_color" tool_tip="Choix de la couleur de la balise de recherche zonière"/>
<text name="notecard_editor_color_label">
Couleurs de la notice :
</text>
<text name="notecard_editor_writable_text_color_label">
Texte:
</text>
<color_swatch name="notecard_editor_writable_text_color" tool_tip="Couleur du texte de la notice"/>
<text name="notecard_editor_writable_bg_color_label">
Arrière-plan :
</text>
<color_swatch name="notecard_editor_writable_bg_color" tool_tip="Couleur d'arrière-plan de la notice"/>
<text name="notecard_editor_writable_cursor_color_label">
Curs. :
</text>
<color_swatch name="notecard_editor_writable_cursor_color" tool_tip="Couleur du curseur dans la notice"/>
<text name="notecard_editor_writable_selection_color_label">
Sélection :
</text>
<color_swatch name="notecard_editor_writable_selection_color" tool_tip="Couleur du texte sélectionné dans la notice"/>
<check_box name="FSScriptDialogNoTransparency" label="Toujours afficher les dialogues de scripts sur un arrière-plan opaque"/>
<check_box name="FSGroupNotifyNoTransparency" label="Toujours afficher les notices de groupe avec un arrière-plan opaque"/>
<check_box name="override_pie_color_checkbox" label="Définir la couleur d'arrière-plan et la transparence des menus circulaires :"/>

View File

@ -2,12 +2,15 @@
<panel label="Région" name="General">
<text name="region_text_lbl">Région :</text>
<text name="region_text">inconnue</text>
<text name="estate_id_lbl" width="95">ID du domaine :</text>
<text name="version_channel_text_lbl">Version :</text>
<text name="version_channel_text">inconnue</text>
<text name="estate_id_lbl" width="95">ID du domaine : </text>
<line_editor name="estate_id" initial_value="inconnue"/>
<text name="region_type_lbl">Type : </text>
<text name="region_type">inconnu</text>
<text name="grid_position_lbl" width="115">Pos. dans la Grille :</text>
<text name="region_type_lbl">Type :</text>
<text name="region_type">inconnue</text>
<line_editor name="grid_position_x" default_text="n/a"/>
<line_editor name="grid_position_y" default_text="n/a"/>
<text name="version_channel_text_lbl">Version : </text>
<text name="version_channel_text">inconnue</text>
<check_box label="Interdire la terraformation" name="block_terraform_check"/>
<check_box label="Interdire le vol" name="block_fly_check"/>
<check_box label="Interdire le survol" name="block_fly_over_check" tool_tip="Empêche le survol des terrains"/>
@ -19,7 +22,7 @@
<spinner label="Limite de personnes" name="agent_limit_spin" label_width="125" width="190"/>
<spinner label="Objets bonus" name="object_bonus_spin" label_width="125" width="190"/>
<text label="Classification" name="access_text">
Classification :
Classification :
</text>
<icons_combo_box label="Modérée" name="access_combo">
<icons_combo_box.item label="Adulte" name="Adult"/>

View File

@ -5346,10 +5346,10 @@ Si le problème persiste, vérifiez la configuration de votre réseau et de votr
Mon abonnement Premium
</string>
<string name="DeleteItems">
Supprimer les articles sélectionnés ?
Supprimer les [COUNT_SELECTION] articles sélectionnés ([COUNT_TOTAL]] total) ?
</string>
<string name="DeleteItem">
Supprimer l&apos;article sélectionné ?
Supprimer l&apos;article sélectionné ([COUNT_TOTAL]] total) ?
</string>
<string name="EmptyOutfitText">
Cette tenue ne contient aucun article.

View File

@ -19,8 +19,8 @@
<text name="grid_position_lbl" right="-75">
Pos. grid:
</text>
<line_editor name="grid_position_x" initial_value="scon"/>
<line_editor name="grid_position_y" initial_value="scon"/>
<line_editor name="grid_position_x" default_text="scon"/>
<line_editor name="grid_position_y" default_text="scon"/>
<text name="region_type_lbl">
Tipo:
</text>

View File

@ -4756,7 +4756,7 @@ Phoenix/Firestorm ビューワのサポート・グループへようこそ!
メッシュオブジェクトの形状を変更することはできません
</notification>
<notification name="FullRegionCantEnter">
リージョンが埋まっているため、\nこのリージョンに入場できません。
リージョンが埋まっているため、このリージョンに入場できません。
</notification>
<notification name="LinkFailedOwnersDiffer">
リンクエラー -- 所有者が違います
@ -5060,7 +5060,7 @@ Phoenix/Firestorm ビューワのサポート・グループへようこそ!
今すぐには入場許可を購入できません。後でもう一度お試しください。
</notification>
<notification name="CantCreateObjectParcelFull">
区画が埋まっているため、オブジェクトを\n作成することができません。
区画が埋まっているため、オブジェクトを 作成することができません。
</notification>
<notification name="FailedPlacingObject">
指定した場所にオブジェクトを配置できませんでした。もう一度お試しください。

View File

@ -205,9 +205,6 @@
レンダリングその他:
</text>
<!--
<check_box label="スクリーン空間の反射を有効にする" name="FSRenderSSR" tool_tip="「高度な照明モデル」が有効になっている時、スクリーン空間の反射をレンダリングします。「環境大気シェーダー」、アバターの「ハードウェアスキニング」、「影」が何れも有効になっている必要がありますEnables the rendering of screen space reflections when Advanced Lighting Model is enabled. Requires atmmospheric shaders, avatar hardware skinning and enabled shadows." />
-->
<check_box label="グローをレンダリング" tool_tip="グロー輝きをレンダリングします。影のオプションが有効になっている時は、この効果を無効にするには強度を0にする必要があります。" name="RenderGlow" />
<slider label="強度:" tool_tip="グローの強度です。値が大きいほど、光の範囲が広く、スムーズになります。2がデフォルト" name="glow_strength" />
<check_box label="読み込みの終わっていないアバターを表示" name="RenderUnloadedAvatars" />

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<floater name="fs_partial_inventory" title="Folder">
<floater.string name="title">
Folder: [FOLDERNAME]
</floater.string>
<filter_editor label="Filtruj folder" name="flt_search" />
</floater>

Some files were not shown because too many files have changed in this diff Show More