Merge branch 'master' into DRTVWR-539

master
Mnikolenko Productengine 2022-06-29 21:02:57 +03:00
commit b0e9840648
108 changed files with 1462 additions and 1525 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1108,16 +1108,18 @@ Nicky Dasmijn
STORM-1937
OPEN-187
SL-15234
STORM-2010
STORM-2010
STORM-2082
MAINT-6665
SL-10291
SL-10293
SL-11061
SL-11072
SL-11072
SL-13141
SL-13642
SL-14541
SL-16438
SL-17218
Nicky Perian
OPEN-1
STORM-1087

View File

@ -13,7 +13,6 @@ project(${ROOT_PROJECT_NAME})
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
include(Variables)
include(bugsplat)
include(BuildVersion)
set(LEGACY_STDIO_LIBS)
@ -73,6 +72,12 @@ if (LINUX)
include(LLAppearanceUtility)
add_subdirectory(${LLAPPEARANCEUTILITY_SRC_DIR} ${LLAPPEARANCEUTILITY_BIN_DIR})
endif (INSTALL_PROPRIETARY)
add_dependencies(viewer linux-crash-logger-strip-target)
elseif (WINDOWS)
# cmake EXISTS requires an absolute path, see indra/cmake/Variables.cmake
if (EXISTS ${VIEWER_DIR}win_setup)
add_subdirectory(${VIEWER_DIR}win_setup)
endif (EXISTS ${VIEWER_DIR}win_setup)
endif (LINUX)
if (WINDOWS)

View File

@ -223,7 +223,6 @@ if (USESYSTEMLIBS)
else (USESYSTEMLIBS)
set(${ARCH}_linux_INCLUDES
ELFIO
atk-1.0
glib-2.0
gstreamer-0.10

View File

@ -1,4 +1,3 @@
include(BerkeleyDB)
include(Linking)
include(Prebuilt)
@ -49,7 +48,7 @@ else (USESYSTEMLIBS)
set(APR_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/apr-1)
if (LINUX)
list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} uuid)
list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} rt)
list(APPEND APRUTIL_LIBRARIES uuid)
list(APPEND APRUTIL_LIBRARIES rt)
endif (LINUX)
endif (USESYSTEMLIBS)

View File

@ -1,17 +0,0 @@
# -*- cmake -*-
include(Prebuilt)
set(DB_FIND_QUIETLY ON)
set(DB_FIND_REQUIRED ON)
if (USESYSTEMLIBS)
include(FindBerkeleyDB)
else (USESYSTEMLIBS)
if (LINUX)
# Need to add dependency pthread explicitely to support ld.gold.
use_prebuilt_binary(db)
set(DB_LIBRARIES db-5.1 pthread)
else (LINUX)
set(DB_LIBRARIES db-4.2)
endif (LINUX)
set(DB_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
endif (USESYSTEMLIBS)

View File

@ -24,57 +24,30 @@ else (USESYSTEMLIBS)
set(addrsfx "-x${ADDRESS_SIZE}")
if (WINDOWS)
if(MSVC80)
# This should be obsolete at this point
set(BOOST_VERSION "1.55")
set(BOOST_CONTEXT_LIBRARY
optimized libboost_context-vc80-mt-${BOOST_VERSION}
debug libboost_context-vc80-mt-gd-${BOOST_VERSION})
set(BOOST_FILESYSTEM_LIBRARY
optimized libboost_filesystem-vc80-mt-${BOOST_VERSION}
debug libboost_filesystem-vc80-mt-gd-${BOOST_VERSION})
set(BOOST_PROGRAM_OPTIONS_LIBRARY
optimized libboost_program_options-vc80-mt-${BOOST_VERSION}
debug libboost_program_options-vc80-mt-gd-${BOOST_VERSION})
set(BOOST_REGEX_LIBRARY
optimized libboost_regex-vc80-mt-${BOOST_VERSION}
debug libboost_regex-vc80-mt-gd-${BOOST_VERSION})
set(BOOST_SIGNALS_LIBRARY
optimized libboost_signals-vc80-mt-${BOOST_VERSION}
debug libboost_signals-vc80-mt-gd-${BOOST_VERSION})
set(BOOST_SYSTEM_LIBRARY
optimized libboost_system-vc80-mt-${BOOST_VERSION}
debug libboost_system-vc80-mt-gd-${BOOST_VERSION})
set(BOOST_THREAD_LIBRARY
optimized libboost_thread-vc80-mt-${BOOST_VERSION}
debug libboost_thread-vc80-mt-gd-${BOOST_VERSION})
else(MSVC80)
# MSVC 10.0 config
set(BOOST_CONTEXT_LIBRARY
optimized libboost_context-mt${addrsfx}
debug libboost_context-mt${addrsfx}-gd)
set(BOOST_FIBER_LIBRARY
optimized libboost_fiber-mt${addrsfx}
debug libboost_fiber-mt${addrsfx}-gd)
set(BOOST_FILESYSTEM_LIBRARY
optimized libboost_filesystem-mt${addrsfx}
debug libboost_filesystem-mt${addrsfx}-gd)
set(BOOST_PROGRAM_OPTIONS_LIBRARY
optimized libboost_program_options-mt${addrsfx}
debug libboost_program_options-mt${addrsfx}-gd)
set(BOOST_REGEX_LIBRARY
optimized libboost_regex-mt${addrsfx}
debug libboost_regex-mt${addrsfx}-gd)
set(BOOST_SIGNALS_LIBRARY
optimized libboost_signals-mt${addrsfx}
debug libboost_signals-mt${addrsfx}-gd)
set(BOOST_SYSTEM_LIBRARY
optimized libboost_system-mt${addrsfx}
debug libboost_system-mt${addrsfx}-gd)
set(BOOST_THREAD_LIBRARY
optimized libboost_thread-mt${addrsfx}
debug libboost_thread-mt${addrsfx}-gd)
endif (MSVC80)
set(BOOST_CONTEXT_LIBRARY
optimized libboost_context-mt${addrsfx}
debug libboost_context-mt${addrsfx}-gd)
set(BOOST_FIBER_LIBRARY
optimized libboost_fiber-mt${addrsfx}
debug libboost_fiber-mt${addrsfx}-gd)
set(BOOST_FILESYSTEM_LIBRARY
optimized libboost_filesystem-mt${addrsfx}
debug libboost_filesystem-mt${addrsfx}-gd)
set(BOOST_PROGRAM_OPTIONS_LIBRARY
optimized libboost_program_options-mt${addrsfx}
debug libboost_program_options-mt${addrsfx}-gd)
set(BOOST_REGEX_LIBRARY
optimized libboost_regex-mt${addrsfx}
debug libboost_regex-mt${addrsfx}-gd)
set(BOOST_SIGNALS_LIBRARY
optimized libboost_signals-mt${addrsfx}
debug libboost_signals-mt${addrsfx}-gd)
set(BOOST_SYSTEM_LIBRARY
optimized libboost_system-mt${addrsfx}
debug libboost_system-mt${addrsfx}-gd)
set(BOOST_THREAD_LIBRARY
optimized libboost_thread-mt${addrsfx}
debug libboost_thread-mt${addrsfx}-gd)
elseif (LINUX)
set(BOOST_CONTEXT_LIBRARY
optimized boost_context-mt${addrsfx}

View File

@ -10,7 +10,6 @@ set(cmake_SOURCE_FILES
00-Common.cmake
APR.cmake
Audio.cmake
BerkeleyDB.cmake
Boost.cmake
bugsplat.cmake
BuildVersion.cmake
@ -26,7 +25,6 @@ set(cmake_SOURCE_FILES
EXPAT.cmake
FindAPR.cmake
FindAutobuild.cmake
FindBerkeleyDB.cmake
FindGLH.cmake
FindHUNSPELL.cmake
FindJsonCpp.cmake
@ -35,7 +33,7 @@ set(cmake_SOURCE_FILES
FindSCP.cmake
FindURIPARSER.cmake
FindXmlRpcEpi.cmake
FindZLIB.cmake
FindZLIBNG.cmake
FMODSTUDIO.cmake
FreeType.cmake
GLEXT.cmake
@ -93,7 +91,7 @@ set(cmake_SOURCE_FILES
VisualLeakDetector.cmake
LibVLCPlugin.cmake
XmlRpcEpi.cmake
ZLIB.cmake
ZLIBNG.cmake
)
source_group("Shared Rules" FILES ${cmake_SOURCE_FILES})

View File

@ -1,50 +0,0 @@
# -*- cmake -*-
# - Find BerkeleyDB
# Find the BerkeleyDB includes and library
# This module defines
# DB_INCLUDE_DIR, where to find db.h, etc.
# DB_LIBRARIES, the libraries needed to use BerkeleyDB.
# DB_FOUND, If false, do not try to use BerkeleyDB.
# also defined, but not for general use are
# DB_LIBRARY, where to find the BerkeleyDB library.
FIND_PATH(DB_INCLUDE_DIR db.h
/usr/local/include/db4
/usr/local/include
/usr/include/db4
/usr/include
)
SET(DB_NAMES ${DB_NAMES} db)
FIND_LIBRARY(DB_LIBRARY
NAMES ${DB_NAMES}
PATHS /usr/lib /usr/local/lib
)
IF (DB_LIBRARY AND DB_INCLUDE_DIR)
SET(DB_LIBRARIES ${DB_LIBRARY})
SET(DB_FOUND "YES")
ELSE (DB_LIBRARY AND DB_INCLUDE_DIR)
SET(DB_FOUND "NO")
ENDIF (DB_LIBRARY AND DB_INCLUDE_DIR)
IF (DB_FOUND)
IF (NOT DB_FIND_QUIETLY)
MESSAGE(STATUS "Found BerkeleyDB: ${DB_LIBRARIES}")
ENDIF (NOT DB_FIND_QUIETLY)
ELSE (DB_FOUND)
IF (DB_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could not find BerkeleyDB library")
ENDIF (DB_FIND_REQUIRED)
ENDIF (DB_FOUND)
# Deprecated declarations.
SET (NATIVE_DB_INCLUDE_PATH ${DB_INCLUDE_DIR} )
GET_FILENAME_COMPONENT (NATIVE_DB_LIB_PATH ${DB_LIBRARY} PATH)
MARK_AS_ADVANCED(
DB_LIBRARY
DB_INCLUDE_DIR
)

View File

@ -1,46 +0,0 @@
# -*- cmake -*-
# - Find zlib
# Find the ZLIB includes and library
# This module defines
# ZLIB_INCLUDE_DIRS, where to find zlib.h, etc.
# ZLIB_LIBRARIES, the libraries needed to use zlib.
# ZLIB_FOUND, If false, do not try to use zlib.
#
# This FindZLIB is about 43 times as fast the one provided with cmake (2.8.x),
# because it doesn't look up the version of zlib, resulting in a dramatic
# speed up for configure (from 4 minutes 22 seconds to 6 seconds).
#
# Note: Since this file is only used for standalone, the windows
# specific parts were left out.
FIND_PATH(ZLIB_INCLUDE_DIR zlib.h
NO_SYSTEM_ENVIRONMENT_PATH
)
FIND_LIBRARY(ZLIB_LIBRARY z)
if (ZLIB_LIBRARY AND ZLIB_INCLUDE_DIR)
SET(ZLIB_INCLUDE_DIRS ${ZLIB_INCLUDE_DIR})
SET(ZLIB_LIBRARIES ${ZLIB_LIBRARY})
SET(ZLIB_FOUND "YES")
else (ZLIB_LIBRARY AND ZLIB_INCLUDE_DIR)
SET(ZLIB_FOUND "NO")
endif (ZLIB_LIBRARY AND ZLIB_INCLUDE_DIR)
if (ZLIB_FOUND)
if (NOT ZLIB_FIND_QUIETLY)
message(STATUS "Found ZLIB: ${ZLIB_LIBRARIES}")
SET(ZLIB_FIND_QUIETLY TRUE)
endif (NOT ZLIB_FIND_QUIETLY)
else (ZLIB_FOUND)
if (ZLIB_FIND_REQUIRED)
message(FATAL_ERROR "Could not find ZLIB library")
endif (ZLIB_FIND_REQUIRED)
endif (ZLIB_FOUND)
mark_as_advanced(
ZLIB_LIBRARY
ZLIB_INCLUDE_DIR
)

View File

@ -0,0 +1,46 @@
# -*- cmake -*-
# - Find zlib-ng
# Find the ZLIB includes and library
# This module defines
# ZLIBNG_INCLUDE_DIRS, where to find zlib.h, etc.
# ZLIBNG_LIBRARIES, the libraries needed to use zlib.
# ZLIBNG_FOUND, If false, do not try to use zlib.
#
# This FindZLIBNG is about 43 times as fast the one provided with cmake (2.8.x),
# because it doesn't look up the version of zlib, resulting in a dramatic
# speed up for configure (from 4 minutes 22 seconds to 6 seconds).
#
# Note: Since this file is only used for standalone, the windows
# specific parts were left out.
FIND_PATH(ZLIBNG_INCLUDE_DIR zlib.h
NO_SYSTEM_ENVIRONMENT_PATH
)
FIND_LIBRARY(ZLIBNG_LIBRARY z)
if (ZLIBNG_LIBRARY AND ZLIBNG_INCLUDE_DIR)
SET(ZLIBNG_INCLUDE_DIRS ${ZLIBNG_INCLUDE_DIR})
SET(ZLIBNG_LIBRARIES ${ZLIBNG_LIBRARY})
SET(ZLIBNG_FOUND "YES")
else (ZLIBNG_LIBRARY AND ZLIBNG_INCLUDE_DIR)
SET(ZLIBNG_FOUND "NO")
endif (ZLINGB_LIBRARY AND ZLIBNG_INCLUDE_DIR)
if (ZLIBNG_FOUND)
if (NOT ZLIBNG_FIND_QUIETLY)
message(STATUS "Found ZLIBNG: ${ZLIBNG_LIBRARIES}")
SET(ZLIBNG_FIND_QUIETLY TRUE)
endif (NOT ZLIBNG_FIND_QUIETLY)
else (ZLIBNG_FOUND)
if (ZLIBNG_FIND_REQUIRED)
message(FATAL_ERROR "Could not find ZLIBNG library")
endif (ZLIBNG_FIND_REQUIRED)
endif (ZLIBNG_FOUND)
mark_as_advanced(
ZLIBNG_LIBRARY
ZLIBNG_INCLUDE_DIR
)

View File

@ -10,5 +10,3 @@ if (INSTALL_PROPRIETARY)
set(LLAPPEARANCEUTILITY_BIN_DIR ${CMAKE_BINARY_DIR}/llappearanceutility)
endif (LINUX)
endif (INSTALL_PROPRIETARY)

View File

@ -4,7 +4,7 @@ include(APR)
include(Boost)
include(EXPAT)
include(Tracy)
include(ZLIB)
include(ZLIBNG)
set(LLCOMMON_INCLUDE_DIRS
${LIBS_OPEN_DIR}/llcommon

View File

@ -5,6 +5,7 @@ include(Prebuilt)
include(Boost)
use_prebuilt_binary(colladadom)
use_prebuilt_binary(minizip-ng) # needed for colladadom
use_prebuilt_binary(pcre)
use_prebuilt_binary(libxml2)
@ -22,6 +23,8 @@ if (WINDOWS)
optimized pcrecpp
debug pcred
optimized pcre
debug libminizip
optimized libminizip
${BOOST_SYSTEM_LIBRARIES}
)
elseif (DARWIN)
@ -29,7 +32,7 @@ elseif (DARWIN)
llprimitive
debug collada14dom-d
optimized collada14dom
minizip
minizip # for collada libminizip.a
xml2
pcrecpp
pcre

View File

@ -1,17 +1,17 @@
# -*- cmake -*-
set(ZLIB_FIND_QUIETLY ON)
set(ZLIB_FIND_REQUIRED ON)
set(ZLIBNG_FIND_QUIETLY ON)
set(ZLIBNG_FIND_REQUIRED ON)
include(Prebuilt)
if (USESYSTEMLIBS)
include(FindZLIB)
include(FindZLIBNG)
else (USESYSTEMLIBS)
use_prebuilt_binary(zlib)
use_prebuilt_binary(zlib-ng)
if (WINDOWS)
set(ZLIB_LIBRARIES
debug zlibd
set(ZLIBNG_LIBRARIES
debug zlib
optimized zlib)
elseif (LINUX)
#
@ -26,10 +26,10 @@ else (USESYSTEMLIBS)
# second whole-archive load of the archive. See viewer's
# CMakeLists.txt for more information.
#
set(ZLIB_PRELOAD_ARCHIVES -Wl,--whole-archive z -Wl,--no-whole-archive)
set(ZLIB_LIBRARIES z)
set(ZLIBNG_PRELOAD_ARCHIVES -Wl,--whole-archive z -Wl,--no-whole-archive)
set(ZLIBNG_LIBRARIES z)
elseif (DARWIN)
set(ZLIB_LIBRARIES z)
set(ZLIBNG_LIBRARIES z)
endif (WINDOWS)
set(ZLIB_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/zlib)
set(ZLIBNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/zlib-ng)
endif (USESYSTEMLIBS)

View File

@ -4,7 +4,7 @@
# other commands to guarantee full compatibility
# with the version specified
## prior to 2.8, the add_custom_target commands used in setting the version did not work correctly
cmake_minimum_required(VERSION 2.8.8 FATAL_ERROR)
cmake_minimum_required(VERSION 3.8.0 FATAL_ERROR)
set(ROOT_PROJECT_NAME "SecondLife" CACHE STRING
"The root project/makefile/solution name. Defaults to SecondLife.")

View File

@ -83,8 +83,7 @@ def proper_windows_path(path, current_platform = sys.platform):
return drive_letter.upper() + ':\\' + rel.replace('/', '\\')
def get_default_platform(dummy):
return {'linux2':'linux',
'linux1':'linux',
return {'linux':'linux',
'cygwin':'windows',
'win32':'windows',
'darwin':'darwin'

View File

@ -446,32 +446,6 @@ const std::string LLTexLayerSet::getBodyRegionName() const
return mInfo->mBodyRegion;
}
// virtual
void LLTexLayerSet::asLLSD(LLSD& sd) const
{
sd["visible"] = LLSD::Boolean(isVisible());
LLSD layer_list_sd;
layer_list_t::const_iterator layer_iter = mLayerList.begin();
layer_list_t::const_iterator layer_end = mLayerList.end();
for(; layer_iter != layer_end; ++layer_iter);
{
LLSD layer_sd;
//LLTexLayerInterface* layer = (*layer_iter);
//if (layer)
//{
// layer->asLLSD(layer_sd);
//}
layer_list_sd.append(layer_sd);
}
LLSD mask_list_sd;
LLSD info_sd;
sd["layers"] = layer_list_sd;
sd["masks"] = mask_list_sd;
sd["info"] = info_sd;
}
void LLTexLayerSet::destroyComposite()
{
if( mComposite )

View File

@ -220,8 +220,6 @@ public:
static BOOL sHasCaches;
virtual void asLLSD(LLSD& sd) const;
protected:
typedef std::vector<LLTexLayerInterface *> layer_list_t;
layer_list_t mLayerList;

View File

@ -10,7 +10,7 @@ include(Boost)
include(LLSharedLibs)
include(JsonCpp)
include(Copy3rdPartyLibs)
include(ZLIB)
include(ZLIBNG)
include(URIPARSER)
include(Tracy)
@ -18,7 +18,7 @@ include_directories(
${EXPAT_INCLUDE_DIRS}
${LLCOMMON_INCLUDE_DIRS}
${JSONCPP_INCLUDE_DIR}
${ZLIB_INCLUDE_DIRS}
${ZLIBNG_INCLUDE_DIRS}
${URIPARSER_INCLUDE_DIRS}
${TRACY_INCLUDE_DIR}
)
@ -129,6 +129,7 @@ set(llcommon_HEADER_FILES
CMakeLists.txt
chrono.h
classic_callback.h
ctype_workaround.h
fix_macros.h
indra_constants.h
@ -300,7 +301,7 @@ target_link_libraries(
${APR_LIBRARIES}
${EXPAT_LIBRARIES}
${JSONCPP_LIBRARIES}
${ZLIB_LIBRARIES}
${ZLIBNG_LIBRARIES}
${WINDOWS_LIBRARIES}
${BOOST_FIBER_LIBRARY}
${BOOST_CONTEXT_LIBRARY}
@ -336,16 +337,17 @@ if (LL_TESTS)
${BOOST_CONTEXT_LIBRARY}
${BOOST_THREAD_LIBRARY}
${BOOST_SYSTEM_LIBRARY})
LL_ADD_INTEGRATION_TEST(commonmisc "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(bitpack "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(classic_callback "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(commonmisc "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llbase64 "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llcond "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lldate "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lldeadmantimer "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lldependencies "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llerror "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lleventdispatcher "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lleventcoro "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lleventdispatcher "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lleventfilter "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llframetimer "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llheteromap "" "${test_libs}")
@ -363,8 +365,8 @@ if (LL_TESTS)
LL_ADD_INTEGRATION_TEST(llstring "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lltrace "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lltreeiterators "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lluri "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llunits "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lluri "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(stringize "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(threadsafeschedule "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(tuple "" "${test_libs}")

View File

@ -0,0 +1,16 @@
/**
* @file classic_callback.cpp
* @author Nat Goodspeed
* @date 2021-09-23
* @brief Implementation for classic_callback.
*
* $LicenseInfo:firstyear=2021&license=viewerlgpl$
* Copyright (c) 2021, Linden Research, Inc.
* $/LicenseInfo$
*/
namespace {
const char dummy[] = "cpp file required to build test program";
} // anonymous namespace

View File

@ -0,0 +1,292 @@
/**
* @file classic_callback.h
* @author Nat Goodspeed
* @date 2016-06-21
* @brief ClassicCallback and HeapClassicCallback
*
* This header file addresses the problem of passing a method on a C++ object
* to an API that requires a classic-C function pointer. Typically such a
* callback API accepts a void* pointer along with the function pointer, and
* the function pointer signature accepts a void* parameter. The API passes
* the caller's pointer value into the callback function so it can find its
* data. In C++, there are a few ways to deal with this case:
*
* - Use a static method with correct signature. If you don't need access to a
* specific instance, that works fine.
* - Store the object statically (or store a static pointer to a non-static
* instance). As long as you only care about one instance, that works, but
* starts to get a little icky. As soon as there's more than one pertinent
* instance, fight valiantly against the temptation to stuff the instance
* pointer into a static pointer variable "just for a moment."
* - Code a static trampoline callback function that accepts the void* user
* data pointer, casts it to the appropriate class type and calls the actual
* method on that class.
*
* ClassicCallback encapsulates the last. You need only construct a
* ClassicCallback instance somewhere that will survive until the callback is
* called, binding the target C++ callable. You then call its get_callback()
* and get_userdata() methods to pass an appropriate classic-C function
* pointer and void* user data pointer, respectively, to the old-style
* callback API. get_callback() synthesizes a static trampoline function
* that casts the user data pointer and calls the bound C++ callable.
*
* $LicenseInfo:firstyear=2016&license=viewerlgpl$
* Copyright (c) 2016, Linden Research, Inc.
* $/LicenseInfo$
*/
#if ! defined(LL_CLASSIC_CALLBACK_H)
#define LL_CLASSIC_CALLBACK_H
#include <tuple>
#include <type_traits> // std::is_same
/*****************************************************************************
* Helpers
*****************************************************************************/
// find a type in a parameter pack: http://stackoverflow.com/q/17844867/5533635
// usage: index_of<0, sought_t, PackName...>::value
template <int idx, typename sought, typename candidate, typename ...rest>
struct index_of
{
static constexpr int const value =
std::is_same<sought, candidate>::value ?
idx : index_of<idx + 1, sought, rest...>::value;
};
// recursion tail
template <int idx, typename sought, typename candidate>
struct index_of<idx, sought, candidate>
{
static constexpr int const value =
std::is_same<sought, candidate>::value ? idx : -1;
};
/*****************************************************************************
* ClassicCallback
*****************************************************************************/
/**
* Instantiate ClassicCallback in whatever storage will persist long enough
* for the callback to be called. It holds a modern C++ callable, providing a
* static function pointer and a USERDATA (default void*) capable of being
* passed through a classic-C callback API. When the static function is called
* with that USERDATA pointer, ClassicCallback forwards the call to the bound
* C++ callable.
*
* Usage:
* @code
* // callback signature required by the API of interest
* typedef void (*callback_t)(int, const char*, void*, double);
* // old-style API that accepts a classic-C callback function pointer
* void oldAPI(callback_t callback, void* userdata);
* // but I want to pass a lambda that references data local to my function!
* // (We don't need to name the void* parameter in the C++ callable;
* // ClassicCallback already used it to locate the lambda instance.)
* auto ccb{
* makeClassicCallback<callback_t>(
* [=](int n, const char* s, void*, double f){ ... }) };
* oldAPI(ccb.get_callback(), ccb.get_userdata());
* // If the passed callback is called before oldAPI() returns, we can now
* // safely destroy ccb. If the callback might be called later, consider
* // HeapClassicCallback instead.
* @endcode
*
* If you have a callable object in hand, and you want to pass that to
* ClassicCallback, you may either consume it by passing std::move(object), or
* explicitly specify a reference to that object type as the CALLABLE template
* parameter:
* @code
* CallableObject obj;
* ClassicCallback<callback_t, void*, CallableObject&> ccb{obj};
* @endcode
*/
// CALLABLE should either be deduced, e.g. by makeClassicCallback(), or
// specified explicitly. Its default type is meaningless, coded only so we can
// provide a useful default for USERDATA.
template <typename SIGNATURE, typename USERDATA=void*, typename CALLABLE=void(*)()>
class ClassicCallback
{
typedef ClassicCallback<SIGNATURE, USERDATA, CALLABLE> self_t;
public:
/// ClassicCallback binds any modern C++ callable.
ClassicCallback(CALLABLE&& callable):
mCallable(std::forward<CALLABLE>(callable))
{}
/**
* ClassicCallback must not itself be copied or moved! Once you've passed
* get_userdata() to some API, this object MUST remain at that address.
*/
// However, we can't yet count on C++17 Class Template Argument Deduction,
// which means makeClassicCallback() is still useful, which means we MUST
// be able to return one to construct into caller's instance (move ctor).
// Possible defense: bool 'referenced' data member set by get_userdata(),
// with an llassert_always(! referenced) check in the move constructor.
ClassicCallback(ClassicCallback const&) = delete;
ClassicCallback(ClassicCallback&&) = default; // delete;
ClassicCallback& operator=(ClassicCallback const&) = delete;
ClassicCallback& operator=(ClassicCallback&&) = delete;
/// Call get_callback() to get the necessary function pointer.
SIGNATURE get_callback() const
{
// This declaration is where the compiler instantiates the correct
// signature for the call() function template.
SIGNATURE callback = call;
return callback;
}
/// Call get_userdata() to get the opaque USERDATA pointer to pass
/// through the classic-C callback API.
USERDATA get_userdata() const
{
// The USERDATA userdata is of course a pointer to this object.
return static_cast<USERDATA>(const_cast<self_t*>(this));
}
protected:
/**
* This call() method accepts one or more callback arguments. It assumes
* the first USERDATA parameter is the userdata.
*/
// Note that we're not literally using C++ perfect forwarding here -- it
// doesn't work to specify (Args&&... args). But that's okay because we're
// dealing with a classic-C callback! It's not going to pass any move-only
// types.
template <typename... Args>
static auto call(Args... args)
{
auto userdata = extract_userdata(std::forward<Args>(args)...);
// cast the userdata param to 'this' and call mCallable
return static_cast<self_t*>(userdata)->
mCallable(std::forward<Args>(args)...);
}
template <typename... Args>
static USERDATA extract_userdata(Args... args)
{
// Search for the first USERDATA parameter type, then extract that pointer.
// extract value from parameter pack: http://stackoverflow.com/a/24710433/5533635
return std::get<index_of<0, USERDATA, Args...>::value>(std::forward_as_tuple(args...));
}
CALLABLE mCallable;
};
/**
* Usage:
* @code
* auto ccb{ makeClassicCallback<classic_callback_signature>(actual_callback) };
* @endcode
*/
template <typename SIGNATURE, typename USERDATA=void*, typename CALLABLE=void(*)()>
auto makeClassicCallback(CALLABLE&& callable)
{
return std::move(ClassicCallback<SIGNATURE, USERDATA, CALLABLE>
(std::forward<CALLABLE>(callable)));
}
/*****************************************************************************
* HeapClassicCallback
*****************************************************************************/
/**
* HeapClassicCallback is like ClassicCallback, with this exception: it MUST
* be allocated on the heap because, once the callback has been called, it
* deletes itself. This addresses the problem of a callback whose lifespan
* must persist beyond the scope in which the callback API is engaged -- but
* naturally this callback must be called exactly ONCE.
*
* Usage:
* @code
* // callback signature required by the API of interest
* typedef void (*callback_t)(int, const char*, void*, double);
* // here's the old-style API
* void oldAPI(callback_t callback, void* userdata);
* // want to call someObjPtr->method() when oldAPI() fires the callback,
* // sometime in the future after the enclosing function has returned
* auto ccb{
* makeHeapClassicCallback<callback_t>(
* [someObjPtr](int n, const char* s, void*, double f)
* { someObjPtr->method(); }) };
* oldAPI(ccb.get_callback(), ccb.get_userdata());
* // We don't need a smart pointer for ccb, because it will be deleted once
* // oldAPI() calls the bound lambda. HeapClassicCallback is for when the
* // callback will be called exactly once. If the classic API might call the
* // passed callback more than once -- or might never call it at all --
* // manually construct a ClassicCallback on the heap and manage its lifespan
* // explicitly.
* @endcode
*/
template <typename SIGNATURE, typename USERDATA=void*, typename CALLABLE=void(*)()>
class HeapClassicCallback: public ClassicCallback<SIGNATURE, USERDATA, CALLABLE>
{
typedef ClassicCallback<SIGNATURE, USERDATA, CALLABLE> super;
typedef HeapClassicCallback<SIGNATURE, USERDATA, CALLABLE> self_t;
// This destructor is intentionally private to prevent allocation anywhere
// but the heap. (The Design and Evolution of C++, section 11.4.2: Control
// of Allocation)
~HeapClassicCallback() {}
public:
HeapClassicCallback(CALLABLE&& callable):
super(std::forward<CALLABLE>(callable))
{}
// makeHeapClassicCallback() only needs to return a pointer -- not an
// instance -- so we can lock down our move constructor too.
HeapClassicCallback(HeapClassicCallback&&) = delete;
/// Replicate get_callback() from the base class because we must
/// instantiate OUR call() function template.
SIGNATURE get_callback() const
{
// This declaration is where the compiler instantiates the correct
// signature for the call() function template.
SIGNATURE callback = call;
return callback;
}
/// Replicate get_userdata() from the base class because our call()
/// method must be able to reconstitute a pointer to this subclass.
USERDATA get_userdata() const
{
// The USERDATA userdata is of course a pointer to this object.
return static_cast<const USERDATA>(const_cast<self_t*>(this));
}
private:
// call() uses a helper class to delete the HeapClassicCallback when done,
// for two reasons. Most importantly, this deletes even if the callback
// throws an exception. But also, call() must directly return the callback
// result for return-type deduction.
struct Destroyer
{
Destroyer(self_t* p): mPtr(p) {}
~Destroyer() { delete mPtr; }
self_t* mPtr;
};
template <typename... Args>
static auto call(Args... args)
{
// extract userdata at this level too
USERDATA userdata = super::extract_userdata(std::forward<Args>(args)...);
// arrange to delete it when we leave by whatever means
Destroyer destroy(static_cast<self_t*>(userdata));
return super::call(std::forward<Args>(args)...);
}
};
template <typename SIGNATURE, typename USERDATA=void*, typename CALLABLE=void(*)()>
auto makeHeapClassicCallback(CALLABLE&& callable)
{
return new HeapClassicCallback<SIGNATURE, USERDATA, CALLABLE>
(std::forward<CALLABLE>(callable));
}
#endif /* ! defined(LL_CLASSIC_CALLBACK_H) */

View File

@ -37,7 +37,7 @@
#ifdef LL_USESYSTEMLIBS
# include <zlib.h>
#else
# include "zlib/zlib.h" // for davep's dirty little zip functions
# include "zlib-ng/zlib.h" // for davep's dirty little zip functions
#endif
#if !LL_WINDOWS

View File

@ -36,7 +36,7 @@
#ifdef LL_USESYSTEMLIBS
# include <zlib.h>
#else
# include "zlib/zlib.h"
# include "zlib-ng/zlib.h"
#endif
#include "llprocessor.h"
@ -456,6 +456,8 @@ LLOSInfo::LLOSInfo() :
dotted_version_string << mMajorVer << "." << mMinorVer << "." << mBuild;
mOSVersionString.append(dotted_version_string.str());
mOSBitness = is64Bit() ? 64 : 32;
LL_INFOS("LLOSInfo") << "OS bitness: " << mOSBitness << LL_ENDL;
}
#ifndef LL_WINDOWS
@ -511,6 +513,11 @@ const std::string& LLOSInfo::getOSVersionString() const
return mOSVersionString;
}
const S32 LLOSInfo::getOSBitness() const
{
return mOSBitness;
}
//static
U32 LLOSInfo::getProcessVirtualSizeKB()
{
@ -564,6 +571,25 @@ U32 LLOSInfo::getProcessResidentSizeKB()
return resident_size;
}
//static
bool LLOSInfo::is64Bit()
{
#if LL_WINDOWS
#if defined(_WIN64)
return true;
#elif defined(_WIN32)
// 32-bit viewer may be run on both 32-bit and 64-bit Windows, need to elaborate
BOOL f64 = FALSE;
return IsWow64Process(GetCurrentProcess(), &f64) && f64;
#else
return false;
#endif
#else // ! LL_WINDOWS
// we only build a 64-bit mac viewer and currently we don't build for linux at all
return true;
#endif
}
LLCPUInfo::LLCPUInfo()
{
std::ostringstream out;

View File

@ -51,6 +51,8 @@ public:
const std::string& getOSStringSimple() const;
const std::string& getOSVersionString() const;
const S32 getOSBitness() const;
S32 mMajorVer;
S32 mMinorVer;
@ -59,6 +61,7 @@ public:
#ifndef LL_WINDOWS
static S32 getMaxOpenFiles();
#endif
static bool is64Bit();
static U32 getProcessVirtualSizeKB();
static U32 getProcessResidentSizeKB();
@ -66,6 +69,7 @@ private:
std::string mOSString;
std::string mOSStringSimple;
std::string mOSVersionString;
S32 mOSBitness;
};

View File

@ -0,0 +1,144 @@
/**
* @file classic_callback_test.cpp
* @author Nat Goodspeed
* @date 2021-09-22
* @brief Test ClassicCallback and HeapClassicCallback.
*
* $LicenseInfo:firstyear=2021&license=viewerlgpl$
* Copyright (c) 2021, Linden Research, Inc.
* $/LicenseInfo$
*/
// Precompiled header
#include "linden_common.h"
// associated header
#include "classic_callback.h"
// STL headers
#include <iostream>
#include <string>
// std headers
// external library headers
// other Linden headers
#include "../test/lltut.h"
/*****************************************************************************
* example callback
*****************************************************************************/
// callback_t is part of the specification of someAPI()
typedef void (*callback_t)(const char*, void*);
void someAPI(callback_t callback, void* userdata)
{
callback("called", userdata);
}
// C++ callable I want as the actual callback
struct MyCallback
{
void operator()(const char* msg, void*)
{
mMsg = msg;
}
void callback_with_extra(const std::string& extra, const char* msg)
{
mMsg = extra + ' ' + msg;
}
std::string mMsg;
};
/*****************************************************************************
* example callback accepting several params, and void* userdata isn't first
*****************************************************************************/
typedef std::string (*complex_callback)(int, const char*, void*, double);
std::string otherAPI(complex_callback callback, void* userdata)
{
return callback(17, "hello world", userdata, 3.0);
}
// struct into which we can capture complex_callback params
static struct Data
{
void set(int i, const char* s, double f)
{
mi = i;
ms = s;
mf = f;
}
void clear() { set(0, "", 0.0); }
int mi;
std::string ms;
double mf;
} sData;
// C++ callable I want to pass
struct OtherCallback
{
std::string operator()(int num, const char* str, void*, double approx)
{
sData.set(num, str, approx);
return "hello back!";
}
};
/*****************************************************************************
* TUT
*****************************************************************************/
namespace tut
{
struct classic_callback_data
{
};
typedef test_group<classic_callback_data> classic_callback_group;
typedef classic_callback_group::object object;
classic_callback_group classic_callbackgrp("classic_callback");
template<> template<>
void object::test<1>()
{
set_test_name("ClassicCallback");
// engage someAPI(MyCallback())
auto ccb{ makeClassicCallback<callback_t>(MyCallback()) };
someAPI(ccb.get_callback(), ccb.get_userdata());
// Unfortunately, with the side effect confined to the bound
// MyCallback instance, that call was invisible. Bind a reference to a
// named instance by specifying a ref type.
MyCallback mcb;
ClassicCallback<callback_t, void*, MyCallback&> ccb2(mcb);
someAPI(ccb2.get_callback(), ccb2.get_userdata());
ensure_equals("failed to call through ClassicCallback", mcb.mMsg, "called");
// try with HeapClassicCallback
mcb.mMsg.clear();
auto hcbp{ makeHeapClassicCallback<callback_t>(mcb) };
someAPI(hcbp->get_callback(), hcbp->get_userdata());
ensure_equals("failed to call through HeapClassicCallback", mcb.mMsg, "called");
// lambda
// The tricky thing here is that a lambda is an unspecified type, so
// you can't declare a ClassicCallback<signature, void*, that type>.
mcb.mMsg.clear();
auto xcb(
makeClassicCallback<callback_t>(
[&mcb](const char* msg, void*)
{ mcb.callback_with_extra("extra", msg); }));
someAPI(xcb.get_callback(), xcb.get_userdata());
ensure_equals("failed to call lambda", mcb.mMsg, "extra called");
// engage otherAPI(OtherCallback())
OtherCallback ocb;
// Instead of specifying a reference type for the bound CALLBACK, as
// with ccb2 above, you can alternatively move the callable object
// into the ClassicCallback (of course AFTER any other reference).
// That's why OtherCallback uses external data for its observable side
// effect.
auto occb{ makeClassicCallback<complex_callback>(std::move(ocb)) };
std::string result{ otherAPI(occb.get_callback(), occb.get_userdata()) };
ensure_equals("failed to return callback result", result, "hello back!");
ensure_equals("failed to set int", sData.mi, 17);
ensure_equals("failed to set string", sData.ms, "hello world");
ensure_equals("failed to set double", sData.mf, 3.0);
}
} // namespace tut

View File

@ -7,7 +7,7 @@ include(GoogleMock)
include(CURL)
include(OpenSSL)
include(NGHTTP2)
include(ZLIB)
include(ZLIBNG)
include(LLCoreHttp)
include(LLAddBuildTest)
include(LLMessage)

View File

@ -9,7 +9,7 @@ include(LLMath)
include(LLFileSystem)
include(LLKDU)
include(LLImageJ2COJ)
include(ZLIB)
include(ZLIBNG)
include(LLAddBuildTest)
include(bugsplat)
include(Tut)
@ -20,7 +20,7 @@ include_directories(
${LLMATH_INCLUDE_DIRS}
${LLFILESYSTEM_INCLUDE_DIRS}
${PNG_INCLUDE_DIRS}
${ZLIB_INCLUDE_DIRS}
${ZLIBNG_INCLUDE_DIRS}
)
set(llimage_SOURCE_FILES
@ -74,7 +74,7 @@ target_link_libraries(llimage
${LLCOMMON_LIBRARIES}
${JPEG_LIBRARIES}
${PNG_LIBRARIES}
${ZLIB_LIBRARIES}
${ZLIBNG_LIBRARIES}
)
# Add tests

View File

@ -463,13 +463,13 @@ BOOL LLParcel::importAccessEntry(std::istream& input_stream, LLAccessEntry* entr
}
else if ("time" == keyword)
{
S32 when;
S32 when{};
LLStringUtil::convertToS32(value, when);
entry->mTime = when;
}
else if ("flags" == keyword)
{
U32 setting;
U32 setting{};
LLStringUtil::convertToU32(value, setting);
entry->mFlags = setting;
}

View File

@ -335,7 +335,7 @@ public:
// "init_history" message
void initializeUrlHistory(const LLSD& url_history);
boost::shared_ptr<LLPluginClassMedia> getSharedPrt() { return boost::dynamic_pointer_cast<LLPluginClassMedia>(shared_from_this()); } // due to enable_shared_from_this
boost::shared_ptr<LLPluginClassMedia> getSharedPtr() { return boost::dynamic_pointer_cast<LLPluginClassMedia>(shared_from_this()); } // due to enable_shared_from_this
protected:

View File

@ -36,7 +36,7 @@
#ifdef LL_USESYSTEMLIBS
# include <zlib.h>
#else
# include "zlib/zlib.h"
# include "zlib-ng/zlib.h"
#endif
std::string model_names[] =

View File

@ -60,11 +60,11 @@
BOOL gDebugSession = FALSE;
BOOL gDebugGLSession = FALSE;
BOOL gClothRipple = FALSE;
BOOL gHeadlessClient = FALSE;
BOOL gNonInteractive = FALSE;
BOOL gGLActive = FALSE;
BOOL gGLDebugLoggingEnabled = TRUE;
static const std::string HEADLESS_VENDOR_STRING("Linden Lab");
static const std::string HEADLESS_RENDERER_STRING("Headless");
@ -86,34 +86,30 @@ void APIENTRY gl_debug_callback(GLenum source,
const GLchar* message,
GLvoid* userParam)
{
if (gGLDebugLoggingEnabled)
{
if (severity != GL_DEBUG_SEVERITY_HIGH_ARB &&
severity != GL_DEBUG_SEVERITY_MEDIUM_ARB &&
severity != GL_DEBUG_SEVERITY_LOW_ARB)
{ //suppress out-of-spec messages sent by nvidia driver (mostly vertexbuffer hints)
return;
}
if (severity == GL_DEBUG_SEVERITY_HIGH_ARB)
{
LL_WARNS() << "----- GL ERROR --------" << LL_ENDL;
}
else
{
LL_WARNS() << "----- GL WARNING -------" << LL_ENDL;
}
LL_WARNS() << "Type: " << std::hex << type << LL_ENDL;
LL_WARNS() << "ID: " << std::hex << id << LL_ENDL;
LL_WARNS() << "Severity: " << std::hex << severity << LL_ENDL;
LL_WARNS() << "Message: " << message << LL_ENDL;
LL_WARNS() << "-----------------------" << LL_ENDL;
if (severity == GL_DEBUG_SEVERITY_HIGH_ARB)
{
LL_ERRS() << "Halting on GL Error" << LL_ENDL;
}
if (severity != GL_DEBUG_SEVERITY_HIGH_ARB &&
severity != GL_DEBUG_SEVERITY_MEDIUM_ARB &&
severity != GL_DEBUG_SEVERITY_LOW_ARB)
{ //suppress out-of-spec messages sent by nvidia driver (mostly vertexbuffer hints)
return;
}
if (severity == GL_DEBUG_SEVERITY_HIGH_ARB)
{
LL_WARNS() << "----- GL ERROR --------" << LL_ENDL;
}
else
{
LL_WARNS() << "----- GL WARNING -------" << LL_ENDL;
}
LL_WARNS() << "Type: " << std::hex << type << LL_ENDL;
LL_WARNS() << "ID: " << std::hex << id << LL_ENDL;
LL_WARNS() << "Severity: " << std::hex << severity << LL_ENDL;
LL_WARNS() << "Message: " << message << LL_ENDL;
LL_WARNS() << "-----------------------" << LL_ENDL;
if (severity == GL_DEBUG_SEVERITY_HIGH_ARB)
{
LL_ERRS() << "Halting on GL Error" << LL_ENDL;
}
}
#endif

View File

@ -47,6 +47,7 @@
extern BOOL gDebugGL;
extern BOOL gDebugSession;
extern BOOL gDebugGLSession;
extern llofstream gFailLog;
#define LL_GL_ERRS LL_ERRS("RenderState")

View File

@ -1363,6 +1363,9 @@ public:
virtual BOOL handleKeyHere(KEY key, MASK mask);
virtual BOOL handleAcceleratorKey(KEY key, MASK mask);
virtual void onFocusLost();
virtual void setFocus(BOOL b);
};
LLMenuItemBranchDownGL::LLMenuItemBranchDownGL( const Params& p) :
@ -1517,6 +1520,21 @@ BOOL LLMenuItemBranchDownGL::handleAcceleratorKey(KEY key, MASK mask)
return handled;
}
void LLMenuItemBranchDownGL::onFocusLost()
{
// needed for tab-based selection
LLMenuItemBranchGL::onFocusLost();
LLMenuGL::setKeyboardMode(FALSE);
setHighlight(FALSE);
}
void LLMenuItemBranchDownGL::setFocus(BOOL b)
{
// needed for tab-based selection
LLMenuItemBranchGL::setFocus(b);
LLMenuGL::setKeyboardMode(b);
setHighlight(b);
}
BOOL LLMenuItemBranchDownGL::handleKeyHere(KEY key, MASK mask)
{

View File

@ -457,6 +457,8 @@ public:
void setSkipLinkUnderline(bool skip_link_underline) { mSkipLinkUnderline = skip_link_underline; }
bool getSkipLinkUnderline() { return mSkipLinkUnderline; }
void setParseURLs(bool parse_urls) { mParseHTML = parse_urls; }
void setPlainText(bool value) { mPlainText = value;}
bool getPlainText() const { return mPlainText; }

View File

@ -229,7 +229,7 @@ S32 LLDXHardware::getMBVideoMemoryViaWMI()
}
//Getting the version of graphics controller driver via WMI
std::string LLDXHardware::getDriverVersionWMI()
std::string LLDXHardware::getDriverVersionWMI(EGPUVendor vendor)
{
std::string mDriverVersion;
HRESULT hrCoInitialize = S_OK;
@ -325,15 +325,68 @@ std::string LLDXHardware::getDriverVersionWMI()
{
break; // If quantity less then 1.
}
if (vendor != GPU_ANY)
{
VARIANT vtCaptionProp;
// Might be preferable to check "AdapterCompatibility" here instead of caption.
hr = pclsObj->Get(L"Caption", 0, &vtCaptionProp, 0, 0);
VARIANT vtProp;
if (FAILED(hr))
{
LL_WARNS("AppInit") << "Query for Caption property failed." << " Error code = 0x" << hr << LL_ENDL;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return std::string(); // Program has failed.
}
// Get the value of the Name property
hr = pclsObj->Get(L"DriverVersion", 0, &vtProp, 0, 0);
// use characters in the returned driver version
BSTR caption(vtCaptionProp.bstrVal);
//convert BSTR to std::string
std::wstring ws(caption, SysStringLen(caption));
std::string caption_str(ws.begin(), ws.end());
LLStringUtil::toLower(caption_str);
bool found = false;
switch (vendor)
{
case GPU_INTEL:
found = caption_str.find("intel") != std::string::npos;
break;
case GPU_NVIDIA:
found = caption_str.find("nvidia") != std::string::npos;
break;
case GPU_AMD:
found = caption_str.find("amd") != std::string::npos
|| caption_str.find("ati ") != std::string::npos
|| caption_str.find("radeon") != std::string::npos;
break;
default:
break;
}
if (found)
{
VariantClear(&vtCaptionProp);
}
else
{
VariantClear(&vtCaptionProp);
pclsObj->Release();
continue;
}
}
VARIANT vtVersionProp;
// Get the value of the DriverVersion property
hr = pclsObj->Get(L"DriverVersion", 0, &vtVersionProp, 0, 0);
if (FAILED(hr))
{
LL_WARNS("AppInit") << "Query for name property failed." << " Error code = 0x" << hr << LL_ENDL;
LL_WARNS("AppInit") << "Query for DriverVersion property failed." << " Error code = 0x" << hr << LL_ENDL;
pSvc->Release();
pLoc->Release();
CoUninitialize();
@ -341,7 +394,7 @@ std::string LLDXHardware::getDriverVersionWMI()
}
// use characters in the returned driver version
BSTR driverVersion(vtProp.bstrVal);
BSTR driverVersion(vtVersionProp.bstrVal);
//convert BSTR to std::string
std::wstring ws(driverVersion, SysStringLen(driverVersion));
@ -354,10 +407,19 @@ std::string LLDXHardware::getDriverVersionWMI()
}
else if (mDriverVersion != str)
{
LL_WARNS("DriverVersion") << "Different versions of drivers. Version of second driver : " << str << LL_ENDL;
if (vendor == GPU_ANY)
{
// Expected from systems with gpus from different vendors
LL_INFOS("DriverVersion") << "Multiple video drivers detected. Version of second driver: " << str << LL_ENDL;
}
else
{
// Not Expected!
LL_WARNS("DriverVersion") << "Multiple video drivers detected from same vendor. Version of second driver : " << str << LL_ENDL;
}
}
VariantClear(&vtProp);
VariantClear(&vtVersionProp);
pclsObj->Release();
}

View File

@ -88,7 +88,15 @@ public:
// vram_only TRUE does a "light" probe.
BOOL getInfo(BOOL vram_only);
std::string getDriverVersionWMI();
// WMI can return multiple GPU drivers
// specify which one to output
typedef enum {
GPU_INTEL,
GPU_NVIDIA,
GPU_AMD,
GPU_ANY
} EGPUVendor;
std::string getDriverVersionWMI(EGPUVendor vendor);
S32 getVRAM() const { return mVRAM; }

View File

@ -3058,8 +3058,20 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
if (raw->header.dwType == RIM_TYPEMOUSE)
{
LLMutexLock lock(&window_imp->mRawMouseMutex);
window_imp->mRawMouseDelta.mX += raw->data.mouse.lLastX;
window_imp->mRawMouseDelta.mY -= raw->data.mouse.lLastY;
S32 speed;
const S32 DEFAULT_SPEED(10);
SystemParametersInfo(SPI_GETMOUSESPEED, 0, &speed, 0);
if (speed == DEFAULT_SPEED)
{
window_imp->mRawMouseDelta.mX += raw->data.mouse.lLastX;
window_imp->mRawMouseDelta.mY -= raw->data.mouse.lLastY;
}
else
{
window_imp->mRawMouseDelta.mX += round((F32)raw->data.mouse.lLastX * (F32)speed / DEFAULT_SPEED);
window_imp->mRawMouseDelta.mY -= round((F32)raw->data.mouse.lLastY * (F32)speed / DEFAULT_SPEED);
}
}
}
}

View File

@ -1,3 +0,0 @@
This component is no longer used in Linden Lab builds.
Change requests to support continued use by open source
builds are welcome.

View File

@ -56,7 +56,7 @@ include(UnixInstall)
include(ViewerMiscLibs)
include(ViewerManager)
include(VisualLeakDetector)
include(ZLIB)
include(ZLIBNG)
include(URIPARSER)
if (NOT HAVOK_TPV)
@ -1847,10 +1847,6 @@ if (WINDOWS)
winmm_shim
)
if (NOT USE_BUGSPLAT)
LIST(APPEND COPY_INPUT_DEPENDENCIES windows-crash-logger)
endif (NOT USE_BUGSPLAT)
if (ADDRESS_SIZE EQUAL 64)
list(APPEND COPY_INPUT_DEPENDENCIES
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk_x64.dll
@ -2015,14 +2011,14 @@ endif (WINDOWS)
#
# We generally want the newest version of the library to provide all symbol
# resolution. To that end, when using static archives, the *_PRELOAD_ARCHIVES
# variables, PNG_PRELOAD_ARCHIVES and ZLIB_PRELOAD_ARCHIVES, get the archives
# variables, PNG_PRELOAD_ARCHIVES and ZLIBNG_PRELOAD_ARCHIVES, get the archives
# dumped into the target binary and runtime lookup will find the most
# modern version.
target_link_libraries(${VIEWER_BINARY_NAME}
${LEGACY_STDIO_LIBS}
${PNG_PRELOAD_ARCHIVES}
${ZLIB_PRELOAD_ARCHIVES}
${ZLIBNG_PRELOAD_ARCHIVES}
${URIPARSER_PRELOAD_ARCHIVES}
${GOOGLE_PERFTOOLS_LIBRARIES}
${LLAUDIO_LIBRARIES}

View File

@ -1 +1 @@
6.6.1
6.6.2

View File

@ -55,7 +55,7 @@
<key>debugsession</key>
<map>
<key>desc</key>
<string>Run as if RenderDebugGL is TRUE, but log errors until end of session.</string>
<string>Run as if RenderDebugGLSession is TRUE, but log errors until end of session.</string>
<key>map-to</key>
<string>DebugSession</string>
</map>

View File

@ -3847,7 +3847,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>http://events.secondlife.com/viewer/embed/event/</string>
<string>http://events.[GRID]/viewer/embed/event/[EVENT_ID]</string>
</map>
<key>FastCacheFetchEnabled</key>
<map>
@ -8635,6 +8635,17 @@
<key>Value</key>
<integer>1</integer>
</map>
<key>UpdateRememberPasswordSetting</key>
<map>
<key>Comment</key>
<string>Save 'rememeber password' setting for current user.</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>OctreeMaxNodeCapacity</key>
<map>
<key>Comment</key>
@ -9174,10 +9185,10 @@
<key>Value</key>
<real>0.5</real>
</map>
<key>RenderDebugGL</key>
<key>RenderDebugGLSession</key>
<map>
<key>Comment</key>
<string>Enable strict GL debugging.</string>
<string>Enable strict GL debugging on the start of next session.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>

View File

@ -713,6 +713,12 @@ void LLAgent::moveYaw(F32 mag, bool reset_view)
setControlFlags(AGENT_CONTROL_YAW_NEG);
}
U32 mask = AGENT_CONTROL_YAW_POS | AGENT_CONTROL_YAW_NEG;
if ((getControlFlags() & mask) == mask)
{
gAgentCamera.setYawKey(0);
}
if (reset_view)
{
gAgentCamera.resetView();
@ -2005,6 +2011,27 @@ void LLAgent::updateAgentPosition(const F32 dt, const F32 yaw_radians, const S32
//
gAgentCamera.updateLookAt(mouse_x, mouse_y);
// When agent has no parents, position updates come from setPositionAgent()
// But when agent has a parent (ex: is seated), position remains unchanged
// relative to parent and no parent's position update trigger
// setPositionAgent().
// But EEP's sky track selection still needs an update if agent has a parent
// and parent moves (ex: vehicles).
if (isAgentAvatarValid()
&& gAgentAvatarp->getParent()
&& !mOnPositionChanged.empty()
)
{
LLVector3d new_position = getPositionGlobal();
if ((mLastTestGlobal - new_position).lengthSquared() > 1.0)
{
// If the position has changed by more than 1 meter since the last time we triggered.
// filters out some noise.
mLastTestGlobal = new_position;
mOnPositionChanged(mFrameAgent.getOrigin(), new_position);
}
}
}
// friends and operators

View File

@ -401,10 +401,9 @@ LLVector3 LLAgentCamera::calcFocusOffset(LLViewerObject *object, LLVector3 origi
LLQuaternion obj_rot = object->getRenderRotation();
LLVector3 obj_pos = object->getRenderPosition();
BOOL is_avatar = object->isAvatar();
// if is avatar - don't do any funk heuristics to position the focal point
// see DEV-30589
if (is_avatar)
if (object->isAvatar() || (object->isAnimatedObject() && object->getControlAvatar()))
{
return original_focus_point - obj_pos;
}
@ -529,7 +528,6 @@ LLVector3 LLAgentCamera::calcFocusOffset(LLViewerObject *object, LLVector3 origi
// or keep the focus point in the object middle when (relatively) far
// NOTE: leave focus point in middle of avatars, since the behavior you want when alt-zooming on avatars
// is almost always "tumble about middle" and not "spin around surface point"
if (!is_avatar)
{
LLVector3 obj_rel = original_focus_point - object->getRenderPosition();
@ -1417,7 +1415,7 @@ void LLAgentCamera::updateCamera()
F32 smoothing = LLSmoothInterpolation::getInterpolant(gSavedSettings.getF32("CameraPositionSmoothing") * SMOOTHING_HALF_LIFE, FALSE);
if (!mFocusObject) // we differentiate on avatar mode
if (mFocusOnAvatar && !mFocusObject) // we differentiate on avatar mode
{
// for avatar-relative focus, we smooth in avatar space -
// the avatar moves too jerkily w/r/t global space to smooth there.

View File

@ -37,6 +37,7 @@
#include "llgesturemgr.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
#include "lllocaltextureobject.h"
@ -1582,6 +1583,14 @@ void LLAgentWearables::editWearable(const LLUUID& item_id)
return;
}
if (!item->isFinished())
{
LL_WARNS() << "Tried to edit wearable that isn't loaded" << LL_ENDL;
// Restart fetch or put item to the front
LLInventoryModelBackgroundFetch::instance().start(item->getUUID(), false);
return;
}
LLViewerWearable* wearable = gAgentWearables.getWearableFromItemID(item_id);
if (!wearable)
{
@ -1595,6 +1604,18 @@ void LLAgentWearables::editWearable(const LLUUID& item_id)
return;
}
S32 shape_count = gAgentWearables.getWearableCount(LLWearableType::WT_SHAPE);
S32 hair_count = gAgentWearables.getWearableCount(LLWearableType::WT_HAIR);
S32 eye_count = gAgentWearables.getWearableCount(LLWearableType::WT_EYES);
S32 skin_count = gAgentWearables.getWearableCount(LLWearableType::WT_SKIN);
if (!shape_count || !hair_count || !eye_count || !skin_count)
{
// Don't let user edit wearables if avatar is cloud due to missing parts.
// Let user edit wearables if avatar is cloud due to missing textures.
LL_WARNS() << "Cannot modify wearable. Avatar is cloud and missing parts." << LL_ENDL;
return;
}
const BOOL disable_camera_switch = LLWearableType::getInstance()->getDisableCameraSwitch(wearable->getType());
LLPanel* panel = LLFloaterSidePanelContainer::getPanel("appearance");
LLSidepanelAppearance::editWearable(wearable, panel, disable_camera_switch);

View File

@ -572,7 +572,7 @@ static void settings_modify()
LLRenderTarget::sUseFBO = LLPipeline::sRenderDeferred;
LLVOSurfacePatch::sLODFactor = gSavedSettings.getF32("RenderTerrainLODFactor");
LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; // square lod factor to get exponential range of [1,4]
gDebugGL = gSavedSettings.getBOOL("RenderDebugGL") || gDebugSession;
gDebugGL = gDebugGLSession || gDebugSession;
gDebugPipeline = gSavedSettings.getBOOL("RenderDebugPipeline");
}
@ -1125,7 +1125,8 @@ bool LLAppViewer::init()
gGLActive = FALSE;
#if LL_RELEASE_FOR_DOWNLOAD
if (!gSavedSettings.getBOOL("CmdLineSkipUpdater"))
// Skip updater if this is a non-interactive instance
if (!gSavedSettings.getBOOL("CmdLineSkipUpdater") && !gNonInteractive)
{
LLProcess::Params updater;
updater.desc = "updater process";
@ -2741,6 +2742,15 @@ bool LLAppViewer::initConfiguration()
ll_init_fail_log(gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "test_failures.log"));
}
if (gSavedSettings.getBOOL("RenderDebugGLSession"))
{
gDebugGLSession = TRUE;
gDebugGL = TRUE;
// gDebugGL can cause excessive logging
// so it's limited to a single session
gSavedSettings.setBOOL("RenderDebugGLSession", FALSE);
}
const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinCurrent");
if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString())
{
@ -3137,6 +3147,11 @@ bool LLAppViewer::isUpdaterMissing()
return mUpdaterNotFound;
}
bool LLAppViewer::waitForUpdater()
{
return !gSavedSettings.getBOOL("CmdLineSkipUpdater") && !mUpdaterNotFound && !gNonInteractive;
}
void LLAppViewer::writeDebugInfo(bool isStatic)
{
#if LL_WINDOWS && LL_BUGSPLAT
@ -3217,7 +3232,28 @@ LLSD LLAppViewer::getViewerInfo() const
info["GRAPHICS_CARD"] = ll_safe_string((const char*)(glGetString(GL_RENDERER)));
#if LL_WINDOWS
std::string drvinfo = gDXHardware.getDriverVersionWMI();
std::string drvinfo;
if (gGLManager.mIsIntel)
{
drvinfo = gDXHardware.getDriverVersionWMI(LLDXHardware::GPU_INTEL);
}
else if (gGLManager.mIsNVIDIA)
{
drvinfo = gDXHardware.getDriverVersionWMI(LLDXHardware::GPU_NVIDIA);
}
else if (gGLManager.mIsAMD)
{
drvinfo = gDXHardware.getDriverVersionWMI(LLDXHardware::GPU_AMD);
}
if (drvinfo.empty())
{
// Generic/substitute windows driver? Unknown vendor?
LL_WARNS("DriverVersion") << "Vendor based driver search failed, searching for any driver" << LL_ENDL;
drvinfo = gDXHardware.getDriverVersionWMI(LLDXHardware::GPU_ANY);
}
if (!drvinfo.empty())
{
info["GRAPHICS_DRIVER_VERSION"] = drvinfo;
@ -4836,13 +4872,18 @@ void LLAppViewer::idle()
}
}
// Update layonts, handle mouse events, tooltips, e t c
// updateUI() needs to be called even in case viewer disconected
// since related notification still needs handling and allows
// opening chat.
gViewerWindow->updateUI();
if (gDisconnected)
{
return;
}
gViewerWindow->updateUI();
if (gTeleportDisplay)
{
return;

View File

@ -106,6 +106,7 @@ public:
bool logoutRequestSent() { return mLogoutRequestSent; }
bool isSecondInstance() { return mSecondInstance; }
bool isUpdaterMissing(); // In use by tests
bool waitForUpdater();
void writeDebugInfo(bool isStatic=true);

View File

@ -34,6 +34,7 @@
#include "llmutelist.h"
#include "llviewercontrol.h"
#include "llviewerparcelmgr.h"
#include "llvoavatarself.h"
LLAudioSourceVO::LLAudioSourceVO(const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, LLViewerObject *objectp)
: LLAudioSource(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX),
@ -141,11 +142,36 @@ void LLAudioSourceVO::updateMute()
LLVector3d pos_global = getPosGlobal();
F32 cutoff = mObjectp->getSoundCutOffRadius();
if ((cutoff > 0.1f && !isInCutOffRadius(pos_global, cutoff)) // consider cutoff below 0.1m as off
|| !LLViewerParcelMgr::getInstance()->canHearSound(pos_global))
{
mute = true;
}
// Object can specify radius at which it turns off
// consider cutoff below 0.1m as 'cutoff off'
if (cutoff > 0.1f && !isInCutOffRadius(pos_global, cutoff))
{
mute = true;
}
// check if parcel allows sounds to pass border
else if (!LLViewerParcelMgr::getInstance()->canHearSound(pos_global))
{
if (isAgentAvatarValid() && gAgentAvatarp->getParent())
{
// Check if agent is riding this object
// Agent can ride something out of region border and canHearSound
// will treat object as not being part of agent's parcel.
LLViewerObject *sound_root = (LLViewerObject*)mObjectp->getRoot();
LLViewerObject *agent_root = (LLViewerObject*)gAgentAvatarp->getRoot();
if (sound_root != agent_root)
{
mute = true;
}
else
{
LL_INFOS() << "roots identical" << LL_ENDL;
}
}
else
{
mute = true;
}
}
if (!mute)
{

View File

@ -558,9 +558,15 @@ public:
mTimeBoxTextBox = getChild<LLTextBox>("time_box");
mInfoCtrl = LLUICtrlFactory::getInstance()->createFromFile<LLUICtrl>("inspector_info_ctrl.xml", this, LLPanel::child_registry_t::instance());
llassert(mInfoCtrl != NULL);
mInfoCtrl->setCommitCallback(boost::bind(&LLChatHistoryHeader::onClickInfoCtrl, mInfoCtrl));
mInfoCtrl->setVisible(FALSE);
if (mInfoCtrl)
{
mInfoCtrl->setCommitCallback(boost::bind(&LLChatHistoryHeader::onClickInfoCtrl, mInfoCtrl));
mInfoCtrl->setVisible(FALSE);
}
else
{
LL_ERRS() << "Failed to create an interface element due to missing or corrupted file inspector_info_ctrl.xml" << LL_ENDL;
}
return LLPanel::postBuild();
}

View File

@ -64,7 +64,6 @@
#pragma GCC diagnostic ignored "-Wuninitialized"
#endif
extern BOOL gGLDebugLoggingEnabled;
#define LL_MAX_INDICES_COUNT 1000000
static LLStaticHashedString sTextureIndexIn("texture_index_in");
@ -1034,12 +1033,12 @@ void LLFace::getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_po
{
const LLMatrix4& vol_mat = getWorldMatrix();
const LLVolumeFace& vf = getViewerObject()->getVolume()->getVolumeFace(mTEOffset);
const LLVector4a& normal4a = vf.mNormals[0];
const LLVector4a& tangent = vf.mTangents[0];
if (!&tangent)
if (! (vf.mNormals && vf.mTangents))
{
return;
}
const LLVector4a& normal4a = *vf.mNormals;
const LLVector4a& tangent = *vf.mTangents;
LLVector4a binormal4a;
binormal4a.setCross3(normal4a, tangent);
@ -1542,7 +1541,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
!rebuild_weights && //TODO: add support for weights
!volume.isUnique()) //source volume is NOT flexi
{ //use transform feedback to pack vertex buffer
//gGLDebugLoggingEnabled = TRUE;
LL_PROFILE_ZONE_NAMED_CATEGORY_FACE("getGeometryVolume - transform feedback");
LLGLEnable discard(GL_RASTERIZER_DISCARD);

View File

@ -772,6 +772,14 @@ void LLFavoritesBarCtrl::updateButtons(bool force_update)
}
LLFavoritesOrderStorage::instance().mPrevFavorites = mItems;
mGetPrevItems = false;
if (LLFavoritesOrderStorage::instance().isStorageUpdateNeeded())
{
if (!mItemsChangedTimer.getStarted())
{
mItemsChangedTimer.start();
}
}
}
const LLButton::Params& button_params = getButtonParams();
@ -1606,7 +1614,7 @@ void LLFavoritesOrderStorage::destroyClass()
file.close();
LLFile::remove(filename);
}
if(mSaveOnExit)
if(mSaveOnExit || gSavedSettings.getBOOL("UpdateRememberPasswordSetting"))
{
LLFavoritesOrderStorage::instance().saveFavoritesRecord(true);
}
@ -1650,7 +1658,6 @@ void LLFavoritesOrderStorage::load()
llifstream in_file;
in_file.open(filename.c_str());
LLSD fav_llsd;
LLSD user_llsd;
if (in_file.is_open())
{
LLSDSerialize::fromXML(fav_llsd, in_file);
@ -1660,12 +1667,12 @@ void LLFavoritesOrderStorage::load()
in_file.close();
if (fav_llsd.isMap() && fav_llsd.has(gAgentUsername))
{
user_llsd = fav_llsd[gAgentUsername];
mStorageFavorites = fav_llsd[gAgentUsername];
S32 index = 0;
bool needs_validation = gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin");
for (LLSD::array_iterator iter = user_llsd.beginArray();
iter != user_llsd.endArray(); ++iter)
for (LLSD::array_iterator iter = mStorageFavorites.beginArray();
iter != mStorageFavorites.endArray(); ++iter)
{
// Validation
LLUUID fv_id = iter->get("id").asUUID();
@ -1967,7 +1974,7 @@ BOOL LLFavoritesOrderStorage::saveFavoritesRecord(bool pref_changed)
}
}
if((items != mPrevFavorites) || name_changed || pref_changed)
if((items != mPrevFavorites) || name_changed || pref_changed || gSavedSettings.getBOOL("UpdateRememberPasswordSetting"))
{
std::string filename = getStoredFavoritesFilename();
if (!filename.empty())
@ -1988,6 +1995,12 @@ BOOL LLFavoritesOrderStorage::saveFavoritesRecord(bool pref_changed)
LLSD user_llsd;
S32 fav_iter = 0;
mMissingSLURLs.clear();
LLSD save_pass;
save_pass["save_password"] = gSavedSettings.getBOOL("RememberPassword");
user_llsd[fav_iter] = save_pass;
fav_iter++;
for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); it++)
{
LLSD value;
@ -2058,6 +2071,23 @@ void LLFavoritesOrderStorage::showFavoritesOnLoginChanged(BOOL show)
}
}
bool LLFavoritesOrderStorage::isStorageUpdateNeeded()
{
if (!mRecreateFavoriteStorage)
{
for (LLSD::array_iterator iter = mStorageFavorites.beginArray();
iter != mStorageFavorites.endArray(); ++iter)
{
if (mFavoriteNames[iter->get("id").asUUID()] != iter->get("name").asString())
{
mRecreateFavoriteStorage = true;
return true;
}
}
}
return false;
}
void AddFavoriteLandmarkCallback::fire(const LLUUID& inv_item_id)
{
if (mTargetLandmarkId.isNull()) return;

View File

@ -226,8 +226,11 @@ public:
BOOL saveFavoritesRecord(bool pref_changed = false);
void showFavoritesOnLoginChanged(BOOL show);
LLInventoryModel::item_array_t mPrevFavorites;
bool isStorageUpdateNeeded();
LLInventoryModel::item_array_t mPrevFavorites;
LLSD mStorageFavorites;
bool mRecreateFavoriteStorage;
const static S32 NO_INDEX;
static bool mSaveOnExit;
@ -254,7 +257,6 @@ private:
slurls_map_t mSLURLs;
std::set<LLUUID> mMissingSLURLs;
bool mIsDirty;
bool mRecreateFavoriteStorage;
struct IsNotInFavorites
{

View File

@ -386,7 +386,8 @@ void LLVolumeImplFlexible::doIdleUpdate()
U64 throttling_delay = (virtual_frame_num + id) % update_period;
if ((throttling_delay == 0 && mLastFrameNum < virtual_frame_num) //one or more virtual frames per frame
|| (mLastFrameNum + update_period < virtual_frame_num)) // missed virtual frame
|| (mLastFrameNum + update_period < virtual_frame_num) // missed virtual frame
|| mLastFrameNum > virtual_frame_num) // overflow
{
// We need mLastFrameNum to compensate for 'unreliable time' and to filter 'duplicate' frames
// If happened too late, subtract throttling_delay (it is zero otherwise)
@ -787,10 +788,7 @@ BOOL LLVolumeImplFlexible::doUpdateGeometry(LLDrawable *drawable)
volume->updateRelativeXform();
if (mRenderRes > -1)
{
doFlexibleUpdate();
}
doFlexibleUpdate();
// Object may have been rotated, which means it needs a rebuild. See SL-47220
BOOL rotated = FALSE;

View File

@ -108,11 +108,12 @@ void LLFloaterEvent::setEventID(const U32 event_id)
LLSD subs;
subs["EVENT_ID"] = (S32)event_id;
// get the search URL and expand all of the substitutions
// (also adds things like [LANGUAGE], [VERSION], [OS], etc.)
std::ostringstream url;
url << gSavedSettings.getString("EventURL") << event_id << std::endl;
// (also adds things like [LANGUAGE], [VERSION], [OS], etc.)
std::string expanded_url = LLWeb::expandURLSubstitutions(gSavedSettings.getString("EventURL"), subs);
// and load the URL in the web view
mBrowser->navigateTo(url.str());
mBrowser->navigateTo(expanded_url);
}
}

View File

@ -292,7 +292,7 @@ void LLFloaterJoystick::refreshListOfDevices()
std::string desc = LLViewerJoystick::getInstance()->getDescription();
if (!desc.empty())
{
LLSD value = LLSD::Integer(0);
LLSD value = LLSD::Integer(1); // value for selection
addDevice(desc, value);
mHasDeviceList = true;
}
@ -392,6 +392,9 @@ void LLFloaterJoystick::onCommitJoystickEnabled(LLUICtrl*, void *joy_panel)
LLSD value = self->mJoysticksCombo->getValue();
bool joystick_enabled = true;
// value is 0 for no device,
// 1 for a device on Mac (single device, no list support yet)
// binary packed guid for a device on windows (can have multiple devices)
if (value.isInteger())
{
// ndof already has a device selected, we are just setting it enabled or disabled
@ -400,7 +403,7 @@ void LLFloaterJoystick::onCommitJoystickEnabled(LLUICtrl*, void *joy_panel)
else
{
LLViewerJoystick::getInstance()->initDevice(value);
// else joystick is enabled, because combobox holds id of device
// else joystick is enabled, because combobox holds id of the device
joystick_enabled = true;
}
gSavedSettings.setBOOL("JoystickEnabled", joystick_enabled);

View File

@ -452,7 +452,8 @@ BOOL LLPanelLandGeneral::postBuild()
mEditDesc = getChild<LLTextEditor>("Description");
mEditDesc->setCommitOnFocusLost(TRUE);
mEditDesc->setCommitCallback(onCommitAny, this);
mEditDesc->setCommitCallback(onCommitAny, this);
mEditDesc->setContentTrusted(false);
// No prevalidate function - historically the prevalidate function was broken,
// allowing residents to put in characters like U+2661 WHITE HEART SUIT, so
// preserve that ability.
@ -749,6 +750,7 @@ void LLPanelLandGeneral::refresh()
BOOL can_edit_identity = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_CHANGE_IDENTITY);
mEditName->setEnabled(can_edit_identity);
mEditDesc->setEnabled(can_edit_identity);
mEditDesc->setParseURLs(!can_edit_identity);
BOOL can_edit_agent_only = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_NO_POWERS);
mBtnSetGroup->setEnabled(can_edit_agent_only && !parcel->getIsGroupOwned());

View File

@ -2108,6 +2108,8 @@ bool LLPanelEstateCovenant::refreshFromRegion(LLViewerRegion* region)
LLTextBox* region_landtype = getChild<LLTextBox>("region_landtype_text");
region_landtype->setText(region->getLocalizedSimProductName());
getChild<LLButton>("reset_covenant")->setEnabled(gAgent.isGodlike() || (region && region->canManageEstate()));
// let the parent class handle the general data collection.
bool rv = LLPanelRegionInfo::refreshFromRegion(region);

View File

@ -28,16 +28,17 @@
#include "llinspectobject.h"
// Viewer
#include "llagent.h" // To standup
#include "llfloatersidepanelcontainer.h"
#include "llinspect.h"
#include "llmediaentry.h"
#include "llnotificationsutil.h" // *TODO: Eliminate, add LLNotificationsUtil wrapper
#include "llselectmgr.h"
#include "llslurl.h"
#include "llviewermenu.h" // handle_object_touch(), handle_buy()
#include "llviewermedia.h"
#include "llviewermediafocus.h"
#include "llviewerobjectlist.h" // to select the requested object
#include "llvoavatarself.h"
// Linden libraries
#include "llbutton.h" // setLabel(), not virtual!
@ -635,7 +636,31 @@ void LLInspectObject::onClickTouch()
void LLInspectObject::onClickSit()
{
handle_object_sit_or_stand();
bool is_sitting = false;
if (mObjectSelection)
{
LLSelectNode* node = mObjectSelection->getFirstRootNode();
if (node && node->mValid)
{
LLViewerObject* root_object = node->getObject();
if (root_object
&& isAgentAvatarValid()
&& gAgentAvatarp->isSitting()
&& gAgentAvatarp->getRoot() == root_object)
{
is_sitting = true;
}
}
}
if (is_sitting)
{
gAgent.standUp();
}
else
{
handle_object_sit(mObjectID);
}
closeFloater();
}

View File

@ -280,7 +280,7 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
mRequestData["options"] = requested_options;
mRequestData["http_params"] = http_params;
#if LL_RELEASE_FOR_DOWNLOAD
mRequestData["wait_for_updater"] = !gSavedSettings.getBOOL("CmdLineSkipUpdater") && !LLAppViewer::instance()->isUpdaterMissing();
mRequestData["wait_for_updater"] = LLAppViewer::instance()->waitForUpdater();
#else
mRequestData["wait_for_updater"] = false;
#endif

View File

@ -97,6 +97,7 @@ BOOL LLPanelGroupGeneral::postBuild()
mEditCharter->setCommitCallback(onCommitAny, this);
mEditCharter->setFocusReceivedCallback(boost::bind(onFocusEdit, _1, this));
mEditCharter->setFocusChangedCallback(boost::bind(onFocusEdit, _1, this));
mEditCharter->setContentTrusted(false);
}
// Options
@ -575,7 +576,8 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
if (mEditCharter)
{
mEditCharter->setText(gdatap->mCharter);
mEditCharter->setParseURLs(!mAllowEdit || !can_change_ident);
mEditCharter->setText(gdatap->mCharter);
}
resetDirty();

View File

@ -92,44 +92,6 @@ LLPointer<LLCredential> load_user_credentials(std::string &user_key)
}
}
// keys are lower case to be case insensitive so they are not always
// identical to names which retain user input, like:
// "AwEsOmE Resident" -> "awesome_resident"
std::string get_user_key_from_name(const std::string &username)
{
std::string key = username;
LLStringUtil::trim(key);
LLStringUtil::toLower(key);
if (!LLGridManager::getInstance()->isSystemGrid())
{
size_t separator_index = username.find_first_of(" ");
if (separator_index == username.npos)
{
// CRED_IDENTIFIER_TYPE_ACCOUNT
return key;
}
}
// CRED_IDENTIFIER_TYPE_AGENT
size_t separator_index = username.find_first_of(" ._");
std::string first = username.substr(0, separator_index);
std::string last;
if (separator_index != username.npos)
{
last = username.substr(separator_index + 1, username.npos);
LLStringUtil::trim(last);
}
else
{
// ...on Linden grids, single username users as considered to have
// last name "Resident"
// *TODO: Make login.cgi support "account_name" like above
last = "resident";
}
key = first + "_" + last;
return key;
}
class LLLoginLocationAutoHandler : public LLCommandHandler
{
public:
@ -361,11 +323,10 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
username_combo->setReturnCallback(boost::bind(&LLPanelLogin::onClickConnect, this));
username_combo->setKeystrokeOnEsc(TRUE);
if (!mFirstLoginThisInstall)
{
LLCheckBoxCtrl* remember_name = getChild<LLCheckBoxCtrl>("remember_name");
remember_name->setCommitCallback(boost::bind(&LLPanelLogin::onRememberUserCheck, this));
}
LLCheckBoxCtrl* remember_name = getChild<LLCheckBoxCtrl>("remember_name");
remember_name->setCommitCallback(boost::bind(&LLPanelLogin::onRememberUserCheck, this));
getChild<LLCheckBoxCtrl>("remember_password")->setCommitCallback(boost::bind(&LLPanelLogin::onRememberPasswordCheck, this));
}
void LLPanelLogin::addFavoritesToStartLocation()
@ -438,10 +399,22 @@ void LLPanelLogin::addFavoritesToStartLocation()
combo->addSeparator();
LL_DEBUGS() << "Loading favorites for " << iter->first << LL_ENDL;
LLSD user_llsd = iter->second;
bool update_password_setting = true;
for (LLSD::array_const_iterator iter1 = user_llsd.beginArray();
iter1 != user_llsd.endArray(); ++iter1)
{
std::string label = (*iter1)["name"].asString();
if ((*iter1).has("save_password"))
{
bool save_password = (*iter1)["save_password"].asBoolean();
gSavedSettings.setBOOL("RememberPassword", save_password);
if (!save_password)
{
getChild<LLButton>("connect_btn")->setEnabled(false);
}
update_password_setting = false;
}
std::string label = (*iter1)["name"].asString();
std::string value = (*iter1)["slurl"].asString();
if(label != "" && value != "")
{
@ -453,6 +426,10 @@ void LLPanelLogin::addFavoritesToStartLocation()
}
}
}
if (update_password_setting)
{
gSavedSettings.setBOOL("UpdateRememberPasswordSetting", TRUE);
}
break;
}
if (combo->getValue().asString().empty())
@ -565,21 +542,12 @@ void LLPanelLogin::populateFields(LLPointer<LLCredential> credential, bool remem
LL_WARNS() << "Attempted fillFields with no login view shown" << LL_ENDL;
return;
}
if (sInstance->mFirstLoginThisInstall)
{
LLUICtrl* remember_check = sInstance->getChild<LLUICtrl>("remember_check");
remember_check->setValue(remember_psswrd);
// no list to populate
setFields(credential);
}
else
{
sInstance->getChild<LLUICtrl>("remember_name")->setValue(remember_user);
LLUICtrl* remember_password = sInstance->getChild<LLUICtrl>("remember_password");
remember_password->setValue(remember_user && remember_psswrd);
remember_password->setEnabled(remember_user);
sInstance->populateUserList(credential);
}
sInstance->getChild<LLUICtrl>("remember_name")->setValue(remember_user);
LLUICtrl* remember_password = sInstance->getChild<LLUICtrl>("remember_password");
remember_password->setValue(remember_user && remember_psswrd);
remember_password->setEnabled(remember_user);
sInstance->populateUserList(credential);
}
//static
@ -690,39 +658,6 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
LL_INFOS("Credentials", "Authentication") << "retrieving username:" << username << LL_ENDL;
// determine if the username is a first/last form or not.
size_t separator_index = username.find_first_of(' ');
if (separator_index == username.npos
&& !LLGridManager::getInstance()->isSystemGrid())
{
LL_INFOS("Credentials", "Authentication") << "account: " << username << LL_ENDL;
// single username, so this is a 'clear' identifier
identifier["type"] = CRED_IDENTIFIER_TYPE_ACCOUNT;
identifier["account_name"] = username;
if (LLPanelLogin::sInstance->mPasswordModified)
{
// password is plaintext
authenticator["type"] = CRED_AUTHENTICATOR_TYPE_CLEAR;
authenticator["secret"] = password;
}
else
{
credential = load_user_credentials(username);
if (credential.notNull())
{
authenticator = credential->getAuthenticator();
if (authenticator.emptyMap())
{
// Likely caused by user trying to log in to non-system grid
// with unsupported name format, just retry
LL_WARNS() << "Authenticator failed to load for: " << username << LL_ENDL;
// password is plaintext
authenticator["type"] = CRED_AUTHENTICATOR_TYPE_CLEAR;
authenticator["secret"] = password;
}
}
}
}
else
{
// Be lenient in terms of what separators we allow for two-word names
// and allow legacy users to login with firstname.lastname
@ -773,16 +708,9 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
}
}
credential = gSecAPIHandler->createCredential(LLGridManager::getInstance()->getGrid(), identifier, authenticator);
if (!sInstance->mFirstLoginThisInstall)
{
remember_psswrd = sInstance->getChild<LLUICtrl>("remember_password")->getValue();
remember_user = sInstance->getChild<LLUICtrl>("remember_name")->getValue();
}
else
{
remember_psswrd = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
remember_user = remember_psswrd; // on panel_login_first "remember_check" is named as 'remember me'
}
remember_psswrd = sInstance->getChild<LLUICtrl>("remember_password")->getValue();
remember_user = sInstance->getChild<LLUICtrl>("remember_name")->getValue();
}
@ -1145,17 +1073,18 @@ void LLPanelLogin::onUserListCommit(void*)
}
// static
// At the moment only happens if !mFirstLoginThisInstall
void LLPanelLogin::onRememberUserCheck(void*)
{
if (sInstance && !sInstance->mFirstLoginThisInstall)
if (sInstance)
{
LLCheckBoxCtrl* remember_name(sInstance->getChild<LLCheckBoxCtrl>("remember_name"));
LLCheckBoxCtrl* remember_psswrd(sInstance->getChild<LLCheckBoxCtrl>("remember_password"));
LLComboBox* user_combo(sInstance->getChild<LLComboBox>("username_combo"));
bool remember = remember_name->getValue().asBoolean();
if (user_combo->getCurrentIndex() != -1 && !remember)
if (!sInstance->mFirstLoginThisInstall
&& user_combo->getCurrentIndex() != -1
&& !remember)
{
remember = true;
remember_name->setValue(true);
@ -1169,6 +1098,14 @@ void LLPanelLogin::onRememberUserCheck(void*)
}
}
void LLPanelLogin::onRememberPasswordCheck(void*)
{
if (sInstance)
{
gSavedSettings.setBOOL("UpdateRememberPasswordSetting", TRUE);
}
}
// static
void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
{

View File

@ -107,6 +107,7 @@ private:
static void onUserNameTextEnty(void*);
static void onUserListCommit(void*);
static void onRememberUserCheck(void*);
static void onRememberPasswordCheck(void*);
static void onPassKey(LLLineEditor* caller, void* user_data);
static void updateServerCombo();

View File

@ -47,5 +47,5 @@ LLPanelLoginListener::LLPanelLoginListener(LLPanelLogin* instance):
void LLPanelLoginListener::onClickConnect(const LLSD&) const
{
mPanel->onClickConnect(NULL);
mPanel->onClickConnect(false);
}

View File

@ -1672,8 +1672,19 @@ void LLPanelObject::sendPosition(BOOL btn_down)
// Make sure new position is in a valid region, so the object
// won't get dumped by the simulator.
LLVector3d new_pos_global = regionp->getPosGlobalFromRegion(newpos);
bool is_valid_pos = true;
if (mObject->isAttachment())
{
LLVector3 delta_pos = mObject->getPositionEdit() - newpos;
LLVector3d attachment_pos = regionp->getPosGlobalFromRegion(mObject->getPositionRegion() + delta_pos);
is_valid_pos = LLWorld::getInstance()->positionRegionValidGlobal(attachment_pos);
}
else
{
is_valid_pos = LLWorld::getInstance()->positionRegionValidGlobal(new_pos_global);
}
if ( LLWorld::getInstance()->positionRegionValidGlobal(new_pos_global) )
if (is_valid_pos)
{
// send only if the position is changed, that is, the delta vector is not zero
LLVector3d old_pos_global = mObject->getPositionGlobal();

View File

@ -61,7 +61,8 @@
#define CAP_SERVICE_NAVMESH_STATUS "NavMeshGenerationStatus"
#define CAP_SERVICE_OBJECT_LINKSETS "RegionObjects"
#define CAP_SERVICE_GET_OBJECT_LINKSETS "RegionObjects"
#define CAP_SERVICE_SET_OBJECT_LINKSETS "ObjectNavMeshProperties"
#define CAP_SERVICE_TERRAIN_LINKSETS "TerrainNavMeshProperties"
#define CAP_SERVICE_CHARACTERS "CharacterProperties"
@ -244,7 +245,7 @@ void LLPathfindingManager::requestGetLinksets(request_id_t pRequestId, object_re
}
else
{
std::string objectLinksetsURL = getObjectLinksetsURLForCurrentRegion();
std::string objectLinksetsURL = getRetrieveObjectLinksetsURLForCurrentRegion();
std::string terrainLinksetsURL = getTerrainLinksetsURLForCurrentRegion();
if (objectLinksetsURL.empty() || terrainLinksetsURL.empty())
{
@ -273,7 +274,7 @@ void LLPathfindingManager::requestSetLinksets(request_id_t pRequestId, const LLP
{
LLPathfindingObjectListPtr emptyLinksetListPtr;
std::string objectLinksetsURL = getObjectLinksetsURLForCurrentRegion();
std::string objectLinksetsURL = getChangeObjectLinksetsURLForCurrentRegion();
std::string terrainLinksetsURL = getTerrainLinksetsURLForCurrentRegion();
if (objectLinksetsURL.empty() || terrainLinksetsURL.empty())
{
@ -755,9 +756,14 @@ std::string LLPathfindingManager::getRetrieveNavMeshURLForRegion(LLViewerRegion
return getCapabilityURLForRegion(pRegion, CAP_SERVICE_RETRIEVE_NAVMESH);
}
std::string LLPathfindingManager::getObjectLinksetsURLForCurrentRegion() const
std::string LLPathfindingManager::getRetrieveObjectLinksetsURLForCurrentRegion() const
{
return getCapabilityURLForCurrentRegion(CAP_SERVICE_OBJECT_LINKSETS);
return getCapabilityURLForCurrentRegion(CAP_SERVICE_GET_OBJECT_LINKSETS);
}
std::string LLPathfindingManager::getChangeObjectLinksetsURLForCurrentRegion() const
{
return getCapabilityURLForCurrentRegion(CAP_SERVICE_SET_OBJECT_LINKSETS);
}
std::string LLPathfindingManager::getTerrainLinksetsURLForCurrentRegion() const

View File

@ -122,7 +122,8 @@ private:
std::string getNavMeshStatusURLForCurrentRegion() const;
std::string getNavMeshStatusURLForRegion(LLViewerRegion *pRegion) const;
std::string getRetrieveNavMeshURLForRegion(LLViewerRegion *pRegion) const;
std::string getObjectLinksetsURLForCurrentRegion() const;
std::string getRetrieveObjectLinksetsURLForCurrentRegion() const;
std::string getChangeObjectLinksetsURLForCurrentRegion() const;
std::string getTerrainLinksetsURLForCurrentRegion() const;
std::string getCharactersURLForCurrentRegion() const;
std::string getAgentStateURLForRegion(LLViewerRegion *pRegion) const;

View File

@ -347,9 +347,6 @@ BOOL LLPreviewGesture::postBuild()
LLTextBox* text;
LLCheckBoxCtrl* check;
edit = getChild<LLLineEditor>("name");
edit->setKeystrokeCallback(onKeystrokeCommit, this);
edit = getChild<LLLineEditor>("desc");
edit->setKeystrokeCallback(onKeystrokeCommit, this);
@ -482,9 +479,6 @@ BOOL LLPreviewGesture::postBuild()
{
getChild<LLUICtrl>("desc")->setValue(item->getDescription());
getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("name")->setValue(item->getName());
getChild<LLLineEditor>("name")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
}
return LLPreview::postBuild();

View File

@ -1026,12 +1026,39 @@ LLSettingsDay::ptr_t LLSettingsVODay::buildFromLegacyPreset(const std::string &n
std::set<std::string> framenames;
std::set<std::string> notfound;
// expected and correct folder sctructure is to have
// three folders in widnlight's root: days, water, skies
std::string base_path(gDirUtilp->getDirName(path));
std::string water_path(base_path);
std::string sky_path(base_path);
std::string day_path(base_path);
gDirUtilp->append(water_path, "water");
gDirUtilp->append(sky_path, "skies");
gDirUtilp->append(day_path, "days");
if (!gDirUtilp->fileExists(day_path))
{
LL_WARNS("SETTINGS") << "File " << name << ".xml is not in \"days\" folder." << LL_ENDL;
}
if (!gDirUtilp->fileExists(water_path))
{
LL_WARNS("SETTINGS") << "Failed to find accompaniying water folder for file " << name
<< ".xml. Falling back to using default folder" << LL_ENDL;
water_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight");
gDirUtilp->append(water_path, "water");
}
if (!gDirUtilp->fileExists(sky_path))
{
LL_WARNS("SETTINGS") << "Failed to find accompaniying skies folder for file " << name
<< ".xml. Falling back to using default folder" << LL_ENDL;
sky_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight");
gDirUtilp->append(sky_path, "skies");
}
newsettings[SETTING_NAME] = name;

View File

@ -1062,7 +1062,7 @@ bool idle_startup()
{
// Generic failure message
std::ostringstream emsg;
emsg << LLTrans::getString("LoginFailed") << "\n";
emsg << LLTrans::getString("LoginFailedHeader") << "\n";
if(LLLoginInstance::getInstance()->authFailure())
{
LL_INFOS("LLStartup") << "Login failed, LLLoginInstance::getResponse(): "
@ -1075,11 +1075,37 @@ bool idle_startup()
std::string message_id = response["message_id"];
std::string message; // actual string to show the user
if(!message_id.empty() && LLTrans::findString(message, message_id, response["message_args"]))
{
// message will be filled in with the template and arguments
}
else if(!message_response.empty())
bool localized_by_id = false;
if(!message_id.empty())
{
LLSD message_args = response["message_args"];
if (message_args.has("TIME")
&& (message_id == "LoginFailedAcountSuspended"
|| message_id == "LoginFailedAccountMaintenance"))
{
LLDate date;
std::string time_string;
if (date.fromString(message_args["TIME"].asString()))
{
LLSD args;
args["datetime"] = (S32)date.secondsSinceEpoch();
LLTrans::findString(time_string, "LocalTime", args);
}
else
{
time_string = message_args["TIME"].asString() + " " + LLTrans::getString("PacificTime");
}
message_args["TIME"] = time_string;
}
// message will be filled in with the template and arguments
if (LLTrans::findString(message, message_id, message_args))
{
localized_by_id = true;
}
}
if(!localized_by_id && !message_response.empty())
{
// *HACK: "no_inventory_host" sent as the message itself.
// Remove this clause when server is sending message_id as well.

View File

@ -483,13 +483,6 @@ static bool handleRenderBumpChanged(const LLSD& newval)
return true;
}
static bool handleRenderDebugGLChanged(const LLSD& newvalue)
{
gDebugGL = newvalue.asBoolean() || gDebugSession;
gGL.clearErrors();
return true;
}
static bool handleRenderDebugPipelineChanged(const LLSD& newvalue)
{
gDebugPipeline = newvalue.asBoolean();
@ -696,7 +689,6 @@ void settings_setup_listeners()
gSavedSettings.getControl("RenderMaxVBOSize")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderVSyncEnable")->getSignal()->connect(boost::bind(&handleVSyncChanged, _2));
gSavedSettings.getControl("RenderDeferredNoise")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
gSavedSettings.getControl("RenderDebugGL")->getSignal()->connect(boost::bind(&handleRenderDebugGLChanged, _2));
gSavedSettings.getControl("RenderDebugPipeline")->getSignal()->connect(boost::bind(&handleRenderDebugPipelineChanged, _2));
gSavedSettings.getControl("RenderResolutionDivisor")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2));
gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleRenderDeferredChanged, _2));

View File

@ -398,7 +398,19 @@ void set_merchant_SLM_menu()
// All other cases (new merchant, not merchant, migrated merchant): show the new Marketplace Listings menu and enable the tool
gMenuHolder->getChild<LLView>("MarketplaceListings")->setVisible(TRUE);
LLCommand* command = LLCommandManager::instance().getCommand("marketplacelistings");
gToolBarView->enableCommand(command->id(), true);
gToolBarView->enableCommand(command->id(), true);
const LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
if (marketplacelistings_id.isNull())
{
U32 mkt_status = LLMarketplaceData::instance().getSLMStatus();
bool is_merchant = (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_MERCHANT) || (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_MIGRATED_MERCHANT);
if (is_merchant)
{
gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, true);
LL_WARNS("SLM") << "Creating the marketplace listings folder for a merchant" << LL_ENDL;
}
}
}
void check_merchant_status(bool force)
@ -4179,23 +4191,9 @@ bool is_object_sittable()
}
}
// only works on pie menu
void handle_object_sit_or_stand()
void handle_object_sit(LLViewerObject *object, const LLVector3 &offset)
{
LLPickInfo pick = LLToolPie::getInstance()->getPick();
LLViewerObject *object = pick.getObject();;
if (!object || pick.mPickType == LLPickInfo::PICK_FLORA)
{
return;
}
if (sitting_on_selection())
{
gAgent.standUp();
return;
}
// get object selection offset
if (object && object->getPCode() == LL_PCODE_VOLUME)
@ -4207,12 +4205,42 @@ void handle_object_sit_or_stand()
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
gMessageSystem->nextBlockFast(_PREHASH_TargetObject);
gMessageSystem->addUUIDFast(_PREHASH_TargetID, object->mID);
gMessageSystem->addVector3Fast(_PREHASH_Offset, pick.mObjectOffset);
gMessageSystem->addVector3Fast(_PREHASH_Offset, offset);
object->getRegion()->sendReliableMessage();
}
}
void handle_object_sit_or_stand()
{
LLPickInfo pick = LLToolPie::getInstance()->getPick();
LLViewerObject *object = pick.getObject();
if (!object || pick.mPickType == LLPickInfo::PICK_FLORA)
{
return;
}
if (sitting_on_selection())
{
gAgent.standUp();
return;
}
handle_object_sit(object, pick.mObjectOffset);
}
void handle_object_sit(const LLUUID& object_id)
{
LLViewerObject* obj = gObjectList.findObject(object_id);
if (!obj)
{
return;
}
LLVector3 offset(0, 0, 0);
handle_object_sit(obj, offset);
}
void near_sit_down_point(BOOL success, void *)
{
if (success)
@ -6347,6 +6375,24 @@ class LLAvatarResetSkeletonAndAnimations : public view_listener_t
}
};
class LLAvatarResetSelfSkeletonAndAnimations : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
LLVOAvatar* avatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
if (avatar)
{
avatar->resetSkeleton(true);
}
else
{
gAgentAvatarp->resetSkeleton(true);
}
return true;
}
};
class LLAvatarAddContact : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@ -9455,6 +9501,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLAvatarResetSkeleton(), "Avatar.ResetSkeleton");
view_listener_t::addMenu(new LLAvatarEnableResetSkeleton(), "Avatar.EnableResetSkeleton");
view_listener_t::addMenu(new LLAvatarResetSkeletonAndAnimations(), "Avatar.ResetSkeletonAndAnimations");
view_listener_t::addMenu(new LLAvatarResetSelfSkeletonAndAnimations(), "Avatar.ResetSelfSkeletonAndAnimations");
enable.add("Avatar.IsMyProfileOpen", boost::bind(&my_profile_visible));
commit.add("Avatar.OpenMarketplace", boost::bind(&LLWeb::loadURLExternal, gSavedSettings.getString("MarketplaceURL")));

View File

@ -135,6 +135,7 @@ void handle_save_snapshot(void *);
void handle_toggle_flycam();
void handle_object_sit_or_stand();
void handle_object_sit(const LLUUID& object_id);
void handle_give_money_dialog();
bool enable_pay_object();
bool enable_buy_object();

View File

@ -255,13 +255,13 @@ void LLFilePickerReplyThread::notify(const std::vector<std::string>& filenames)
LLMediaFilePicker::LLMediaFilePicker(LLPluginClassMedia* plugin, LLFilePicker::ELoadFilter filter, bool get_multiple)
: LLFilePickerThread(filter, get_multiple),
mPlugin(plugin->getSharedPrt())
mPlugin(plugin->getSharedPtr())
{
}
LLMediaFilePicker::LLMediaFilePicker(LLPluginClassMedia* plugin, LLFilePicker::ESaveFilter filter, const std::string &proposed_name)
: LLFilePickerThread(filter, proposed_name),
mPlugin(plugin->getSharedPrt())
mPlugin(plugin->getSharedPtr())
{
}

View File

@ -3334,6 +3334,13 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
// trigger a control event.
U32 control_flags = gAgent.getControlFlags();
// Rotation into both directions should cancel out
U32 mask = AGENT_CONTROL_YAW_POS | AGENT_CONTROL_YAW_NEG;
if ((control_flags & mask) == mask)
{
control_flags &= ~mask;
}
MASK key_mask = gKeyboard->currentMask(TRUE);
if (key_mask & MASK_ALT || key_mask & MASK_CONTROL)
@ -5805,15 +5812,15 @@ void process_script_question(LLMessageSystem *msg, void **user_data)
if (("ScriptTakeMoney" == script_perm.question) && has_not_only_debit)
continue;
if (script_perm.question == "JoinAnExperience")
{ // Some experience only permissions do not have an explicit permission bit. Add them here.
script_question += " " + LLTrans::getString("ForceSitAvatar") + "\n";
if (LLTrans::getString(script_perm.question).empty())
{
continue;
}
script_question += " " + LLTrans::getString(script_perm.question) + "\n";
}
}
args["QUESTIONS"] = script_question;
if (known_questions != questions)

View File

@ -72,7 +72,7 @@
#ifdef LL_USESYSTEMLIBS
#include <zlib.h>
#else
#include "zlib/zlib.h"
#include "zlib-ng/zlib.h"
#endif
#include "object_flags.h"

View File

@ -3060,6 +3060,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("ObjectAnimation");
capabilityNames.append("ObjectMedia");
capabilityNames.append("ObjectMediaNavigate");
capabilityNames.append("ObjectNavMeshProperties");
capabilityNames.append("ParcelPropertiesUpdate");
capabilityNames.append("ParcelVoiceInfoRequest");
capabilityNames.append("ProductInfoRequest");

View File

@ -507,6 +507,7 @@ void send_viewer_stats(bool include_preferences)
system["os"] = LLOSInfo::instance().getOSStringSimple();
system["cpu"] = gSysCPU.getCPUString();
system["address_size"] = ADDRESS_SIZE;
system["os_bitness"] = LLOSInfo::instance().getOSBitness();
unsigned char MACAddress[MAC_ADDRESS_BYTES];
LLUUID::getNodeID(MACAddress);
std::string macAddressString = llformat("%02x-%02x-%02x-%02x-%02x-%02x",

View File

@ -1269,7 +1269,7 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename,
LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec);
if (image.isNull())
{
image->setLastError("Couldn't open the image to be uploaded.");
LL_WARNS() << "Couldn't open the image to be uploaded." << LL_ENDL;
return FALSE;
}
if (!image->load(filename))

View File

@ -2233,6 +2233,7 @@ void LLViewerWindow::initWorldUI()
gStatusBar->setShape(status_bar_container->getLocalRect());
// sync bg color with menu bar
gStatusBar->setBackgroundColor( gMenuBarView->getBackgroundColor().get() );
// add InBack so that gStatusBar won't be drawn over menu
status_bar_container->addChildInBack(gStatusBar);
status_bar_container->setVisible(TRUE);
@ -3212,6 +3213,11 @@ void LLViewerWindow::handleScrollWheel(S32 clicks)
void LLViewerWindow::handleScrollHWheel(S32 clicks)
{
if (LLAppViewer::instance()->quitRequested())
{
return;
}
LLUI::getInstance()->resetMouseIdleTimer();
LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();

View File

@ -660,9 +660,7 @@ void LLVOSky::idleUpdate(LLAgent &agent, const F64 &time)
void LLVOSky::forceSkyUpdate()
{
mForceUpdate = TRUE;
memset(&m_lastAtmosphericsVars, 0x00, sizeof(AtmosphericsVars));
m_lastAtmosphericsVars = {};
mCubeMapUpdateStage = -1;
}

View File

@ -105,8 +105,6 @@ S32 LLVOVolume::mRenderComplexity_current = 0;
LLPointer<LLObjectMediaDataClient> LLVOVolume::sObjectMediaClient = NULL;
LLPointer<LLObjectMediaNavigateClient> LLVOVolume::sObjectMediaNavigateClient = NULL;
extern BOOL gGLDebugLoggingEnabled;
// Implementation class of LLMediaDataClientObject. See llmediadataclient.h
class LLMediaDataClientObjectImpl : public LLMediaDataClientObject
{

View File

@ -10897,22 +10897,47 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar)
{
markVisible(avatar->mDrawable, *viewer_camera);
LLVOAvatar::attachment_map_t::iterator iter;
for (iter = avatar->mAttachmentPoints.begin();
iter != avatar->mAttachmentPoints.end();
++iter)
{
LLViewerJointAttachment *attachment = iter->second;
for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
attachment_iter != attachment->mAttachedObjects.end();
++attachment_iter)
{
if (LLViewerObject* attached_object = attachment_iter->get())
{
markVisible(attached_object->mDrawable->getSpatialBridge(), *viewer_camera);
}
}
}
if (preview_avatar)
{
// Only show rigged attachments for preview
LLVOAvatar::attachment_map_t::iterator iter;
for (iter = avatar->mAttachmentPoints.begin();
iter != avatar->mAttachmentPoints.end();
++iter)
{
LLViewerJointAttachment *attachment = iter->second;
for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
attachment_iter != attachment->mAttachedObjects.end();
++attachment_iter)
{
LLViewerObject* attached_object = attachment_iter->get();
if (attached_object && attached_object->isRiggedMesh())
{
markVisible(attached_object->mDrawable->getSpatialBridge(), *viewer_camera);
}
}
}
}
else
{
LLVOAvatar::attachment_map_t::iterator iter;
for (iter = avatar->mAttachmentPoints.begin();
iter != avatar->mAttachmentPoints.end();
++iter)
{
LLViewerJointAttachment *attachment = iter->second;
for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
attachment_iter != attachment->mAttachedObjects.end();
++attachment_iter)
{
LLViewerObject* attached_object = attachment_iter->get();
if (attached_object)
{
markVisible(attached_object->mDrawable->getSpatialBridge(), *viewer_camera);
}
}
}
}
}
stateSort(*LLViewerCamera::getInstance(), result);

View File

@ -613,8 +613,7 @@ with the same filename but different name
<texture name="login_sl_logo" file_name="windows/login_sl_logo.png" preload="true" />
<texture name="login_sl_logo_small" file_name="windows/login_sl_logo_small.png" preload="true" />
<texture name="first_login_image_left" file_name="windows/first_login_image_left.png" preload="true" />
<texture name="first_login_image_right" file_name="windows/first_login_image_right.png" preload="true" />
<texture name="first_login_image" file_name="windows/first_login_image.jpg" preload="true" />
<texture name="Stepper_Down_Off" file_name="widgets/Stepper_Down_Off.png" preload="false" />
<texture name="Stepper_Down_Press" file_name="widgets/Stepper_Down_Press.png" preload="false" />

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 358 KiB

View File

@ -106,7 +106,7 @@
<string name="LoginFailedNoNetwork">
Netværksfejl: Kunne ikke etablere forbindelse, check venligst din netværksforbindelse.
</string>
<string name="LoginFailed">
<string name="LoginFailedHeader">
Login fejlede.
</string>
<string name="Quit">

View File

@ -186,7 +186,7 @@ Voice-Server-Version: [VOICE_VERSION]
<string name="LoginFailedNoNetwork">
Netzwerkfehler: Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung.
</string>
<string name="LoginFailed">
<string name="LoginFailedHeader">
Anmeldung fehlgeschlagen
</string>
<string name="Quit">

View File

@ -164,6 +164,7 @@
left_pad="2"
name="Description"
spellcheck="true"
parse_urls="true"
top_delta="0"
width="365"
word_wrap="true" />

View File

@ -8,6 +8,16 @@
tab_stop="false"
name="main_view"
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"
@ -18,12 +28,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"
@ -31,13 +41,13 @@
left="0"
top="0"
width="1024"
tab_group="1"
height="19"/>
</layout_panel>
<layout_panel auto_resize="false"
height="34"
mouse_opaque="false"
name="nav_bar_container"
tab_stop="false"
width="1024"
visible="false"/>
<layout_panel auto_resize="true"
@ -99,6 +109,7 @@
tab_stop="false"/>
</layout_panel>
</layout_stack>
</panel> <!--menu_tab_wrapper-->
<panel top="0"
follows="all"

View File

@ -471,7 +471,7 @@
layout="topleft"
name="Reset Skeleton And Animations">
<menu_item_call.on_click
function="Avatar.ResetSkeletonAndAnimations" />
function="Avatar.ResetSelfSkeletonAndAnimations" />
</menu_item_call>
<menu_item_call
label="Attachment scripts..."
@ -3130,14 +3130,14 @@ function="World.EnvPreset"
<menu_item_separator />
<menu_item_check
label="Debug GL"
label="Start Debug GL on next run"
name="Debug GL">
<menu_item_check.on_check
function="CheckControl"
parameter="RenderDebugGL" />
parameter="RenderDebugGLSession" />
<menu_item_check.on_click
function="ToggleControl"
parameter="RenderDebugGL" />
parameter="RenderDebugGLSession" />
</menu_item_check>
<menu_item_check
label="Debug Pipeline"

View File

@ -95,6 +95,7 @@ Hover your mouse over the options for more help.
layout="topleft"
max_length="511"
name="charter"
parse_urls="true"
top="105"
right="-4"
bg_readonly_color="DkGray2"

View File

@ -145,7 +145,7 @@
follows="left|top"
font="SansSerifMedium"
text_color="EmphasisColor"
height="16"
height="24"
left="408"
bottom_delta="0"
label="Remember password"

View File

@ -98,7 +98,7 @@
auto_resize="false"
follows="left|right|top"
name="widget_container"
width="532"
width="730"
left="0"
top="0"
height="80">
@ -106,7 +106,7 @@
allow_text_entry="true"
follows="left|bottom"
height="32"
left="2"
left="42"
label="Username"
combo_editor.font="SansSerifLarge"
max_chars="128"
@ -126,7 +126,7 @@
follows="left|top"
width="200"
height="32"
left="220"
left="262"
max_length_chars="16"
name="password_edit"
label="Password"
@ -145,43 +145,59 @@
label_color="White"
font="SansSerifLarge"
name="connect_btn"
left="432"
width="100"
left_pad="15"
width="120"
height="32"
top="0" />
<text
follows="left|top"
font="SansSerifLarge"
font.style="BOLD"
text_color="EmphasisColor"
height="34"
name="sign_up_text"
left_pad="10"
top="0"
width="200"
valign="center">
Sign up
</text>
<check_box
follows="left|top"
font="SansSerifLarge"
left="42"
top="32"
height="24"
label="Remember me"
word_wrap="down"
check_button.bottom="3"
name="remember_name"
tool_tip="Already remembered user can be forgotten from Me &gt; Preferences &gt; Advanced &gt; Remembered Usernames."
width="198" />
<check_box
control_name="RememberPassword"
follows="left|top"
font="SansSerifLarge"
left="0"
top="32"
text_color="EmphasisColor"
height="24"
label="Remember me"
left="262"
bottom_delta="0"
label="Remember password"
word_wrap="down"
check_button.bottom="3"
name="remember_check"
width="145" />
name="remember_password"
width="198" />
<text
follows="left|top"
font="SansSerifLarge"
text_color="EmphasisColor"
height="16"
name="forgot_password_text"
left="219"
left="492"
top="34"
width="200">
Forgotten password
</text>
<text
follows="left|top"
font="SansSerifLarge"
text_color="EmphasisColor"
height="16"
name="sign_up_text"
left="432"
top="34"
width="200">
Sign up
</text>
</layout_panel>
<layout_panel
height="100"
@ -216,24 +232,17 @@
auto_resize="false"
follows="left|right|top"
name="images_container"
width="832"
width="675"
left="0"
top="0"
height="500">
<icon
height="400"
width="400"
image_name="first_login_image_left"
height="450"
width="675"
image_name="first_login_image"
left="0"
name="image_left"
top="0" />
<icon
height="400"
width="400"
image_name="first_login_image_right"
left_pad="32"
name="image_right"
top="0" />
</layout_panel>
<layout_panel
height="100"

View File

@ -4,7 +4,6 @@
background_visible="true"
bg_opaque_color="MouseGray"
follows="left|top|right"
focus_root="true"
height="34"
layout="topleft"
name="navigation_bar"

View File

@ -11,7 +11,6 @@
mouse_opaque="false"
name="status"
top="19"
tab_stop="false"
width="1000">
<panel.string
name="packet_loss_tooltip">

View File

@ -69,6 +69,7 @@ Voice Server Version: [VOICE_VERSION]
</string>
<string name="AboutTraffic">Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)</string>
<string name="AboutTime">[month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]</string>
<string name="LocalTime">[month, datetime, local] [day, datetime, local] [year, datetime, local] [hour, datetime, local]:[min, datetime, local]:[second,datetime, local]</string>
<string name="ErrorFetchingServerReleaseNotesURL">Error fetching server release notes URL.</string>
<string name="BuildConfiguration">Build Configuration</string>
@ -111,7 +112,7 @@ Voice Server Version: [VOICE_VERSION]
<string name="CertAllocationFailure">Failed to allocate openssl memory for certificate.</string>
<string name="LoginFailedNoNetwork">Network error: Could not establish connection, please check your network connection.</string>
<string name="LoginFailed">Login failed.</string>
<string name="LoginFailedHeader">Login failed.</string>
<string name="Quit">Quit</string>
<string name="create_account_url">http://join.secondlife.com/?sourceid=[sourceid]</string>
@ -125,6 +126,8 @@ http://secondlife.com/download
For more information, see our FAQ below:
http://secondlife.com/viewer-access-faq</string>
<string name="LoginFailed">Grid emergency login failure.
If you feel this is an error, please contact support@secondlife.com.</string>
<string name="LoginIntermediateOptionalUpdateAvailable">Optional viewer update available: [VERSION]</string>
<string name="LoginFailedRequiredUpdate">Required viewer update: [VERSION]</string>
<string name="LoginFailedAlreadyLoggedIn">This agent is already logged in.
@ -152,15 +155,18 @@ People with free accounts will not be able to access Second Life during this tim
<string name="LoginFailedComputerProhibited">Second Life cannot be accessed from this computer.
If you feel this is an error, please contact
support@secondlife.com.</string>
<!--'Pacific time' placeholder for [TIME] in case time from server can't be decoded-->
<string name="PacificTime">Pacific Time</string>
<string name="LoginFailedAcountSuspended">Your account is not accessible until
[TIME] Pacific Time.</string>
[TIME].
If you feel this is an error, please contact support@secondlife.com.</string>
<string name="LoginFailedAccountDisabled">We are unable to complete your request at this time.
Please contact Second Life support for assistance at http://support.secondlife.com.</string>
<string name="LoginFailedTransformError">Data inconsistency found during login.
Please contact support@secondlife.com.</string>
<string name="LoginFailedAccountMaintenance">Your account is undergoing minor maintenance.
Your account is not accessible until
[TIME] Pacific Time.
[TIME].
If you feel this is an error, please contact support@secondlife.com.</string>
<string name="LoginFailedPendingLogoutFault">Request for logout responded with a fault from simulator.</string>
<string name="LoginFailedPendingLogout">The system is logging you out right now.

View File

@ -178,7 +178,7 @@ Versión del servidor de voz: [VOICE_VERSION]
<string name="LoginFailedNoNetwork">
Error de red: no se ha podido conectar; por favor, revisa tu conexión a internet.
</string>
<string name="LoginFailed">
<string name="LoginFailedHeader">
Error en el inicio de sesión.
</string>
<string name="Quit">

View File

@ -187,7 +187,7 @@ Voice Server Version: [VOICE_VERSION]
<string name="LoginFailedNoNetwork">
Erreur réseau : impossible d&apos;établir la connexion. Veuillez vérifier votre connexion réseau.
</string>
<string name="LoginFailed">
<string name="LoginFailedHeader">
Échec de la connexion.
</string>
<string name="Quit">

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