Merge branch 'master' of https://vcs.firestormviewer.org/viewer-merges/phoenix-firestorm-ll-master
# Conflicts: # autobuild.xml # indra/llrender/llgl.cpp # indra/newview/CMakeLists.txt # indra/newview/llvovolume.cppmaster
commit
adfc89c831
802
autobuild.xml
802
autobuild.xml
File diff suppressed because it is too large
Load Diff
|
|
@ -1115,16 +1115,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
|
||||
|
|
|
|||
|
|
@ -136,6 +136,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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -24,66 +24,33 @@ 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})
|
||||
set(BOOST_WAVE_LIBRARY
|
||||
optimized libboost_wave-vc80-mt-${BOOST_VERSION}
|
||||
debug libboost_wave-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)
|
||||
set(BOOST_WAVE_LIBRARY
|
||||
optimized libboost_wave-mt${addrsfx}
|
||||
debug libboost_wave-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)
|
||||
set(BOOST_WAVE_LIBRARY
|
||||
optimized libboost_wave-mt${addrsfx}
|
||||
debug libboost_wave-mt${addrsfx}-gd)
|
||||
elseif (LINUX)
|
||||
set(BOOST_CONTEXT_LIBRARY
|
||||
optimized boost_context-mt${addrsfx}
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@ set(cmake_SOURCE_FILES
|
|||
00-Common.cmake
|
||||
APR.cmake
|
||||
Audio.cmake
|
||||
BerkeleyDB.cmake
|
||||
Boost.cmake
|
||||
bugsplat.cmake
|
||||
BuildVersion.cmake
|
||||
|
|
@ -27,7 +26,6 @@ set(cmake_SOURCE_FILES
|
|||
EXPAT.cmake
|
||||
FindAPR.cmake
|
||||
FindAutobuild.cmake
|
||||
FindBerkeleyDB.cmake
|
||||
FindFMODSTUDIO.cmake
|
||||
FindGLH.cmake
|
||||
FindHUNSPELL.cmake
|
||||
|
|
@ -37,7 +35,7 @@ set(cmake_SOURCE_FILES
|
|||
FindSCP.cmake
|
||||
FindURIPARSER.cmake
|
||||
FindXmlRpcEpi.cmake
|
||||
FindZLIB.cmake
|
||||
FindZLIBNG.cmake
|
||||
FMODSTUDIO.cmake
|
||||
FreeType.cmake
|
||||
GLEXT.cmake
|
||||
|
|
@ -97,7 +95,7 @@ set(cmake_SOURCE_FILES
|
|||
VisualLeakDetector.cmake
|
||||
LibVLCPlugin.cmake
|
||||
XmlRpcEpi.cmake
|
||||
ZLIB.cmake
|
||||
ZLIBNG.cmake
|
||||
)
|
||||
|
||||
source_group("Shared Rules" FILES ${cmake_SOURCE_FILES})
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)
|
||||
|
|
@ -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
|
||||
)
|
||||
|
||||
|
|
@ -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
|
||||
)
|
||||
|
||||
|
|
@ -10,5 +10,3 @@ if (INSTALL_PROPRIETARY)
|
|||
set(LLAPPEARANCEUTILITY_BIN_DIR ${CMAKE_BINARY_DIR}/llappearanceutility)
|
||||
endif (LINUX)
|
||||
endif (INSTALL_PROPRIETARY)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3,22 +3,15 @@
|
|||
include(APR)
|
||||
include(Boost)
|
||||
include(EXPAT)
|
||||
include(ZLIB)
|
||||
include(Tracy) # <FS:Beq> Tracy profiler
|
||||
include(Tracy)
|
||||
include(ZLIBNG)
|
||||
|
||||
# <FS:Beq> Add Tracy profiler support
|
||||
#set(LLCOMMON_INCLUDE_DIRS
|
||||
# ${LIBS_OPEN_DIR}/llcommon
|
||||
# ${APRUTIL_INCLUDE_DIR}
|
||||
# ${APR_INCLUDE_DIR}
|
||||
# )
|
||||
set(LLCOMMON_INCLUDE_DIRS
|
||||
${LIBS_OPEN_DIR}/llcommon
|
||||
${APRUTIL_INCLUDE_DIR}
|
||||
${APR_INCLUDE_DIR}
|
||||
${TRACY_INCLUDE_DIR}
|
||||
)
|
||||
# </FS:Beq>
|
||||
set(LLCOMMON_SYSTEM_INCLUDE_DIRS
|
||||
${Boost_INCLUDE_DIRS}
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,12 +26,12 @@ 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)
|
||||
if (WINDOWS OR LINUX)
|
||||
set(ZLIB_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/zlib)
|
||||
set(ZLIBNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/zlib-ng)
|
||||
endif (WINDOWS OR LINUX)
|
||||
endif (USESYSTEMLIBS)
|
||||
|
|
@ -83,9 +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',
|
||||
'linux':'linux',
|
||||
return {'linux':'linux',
|
||||
'cygwin':'windows',
|
||||
'win32':'windows',
|
||||
'darwin':'darwin'
|
||||
|
|
|
|||
|
|
@ -453,32 +453,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 )
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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( SYSTEM
|
|||
${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
|
||||
|
|
@ -339,7 +340,7 @@ target_link_libraries(
|
|||
${APR_LIBRARIES}
|
||||
${EXPAT_LIBRARIES}
|
||||
${JSONCPP_LIBRARIES}
|
||||
${ZLIB_LIBRARIES}
|
||||
${ZLIBNG_LIBRARIES}
|
||||
${WINDOWS_LIBRARIES}
|
||||
${BOOST_FIBER_LIBRARY}
|
||||
${BOOST_CONTEXT_LIBRARY}
|
||||
|
|
@ -375,16 +376,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}")
|
||||
|
|
@ -402,8 +404,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}")
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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) */
|
||||
|
|
@ -41,7 +41,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
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
#ifdef LL_USESYSTEMLIBS
|
||||
# include <zlib.h>
|
||||
#else
|
||||
# include "zlib/zlib.h"
|
||||
# include "zlib-ng/zlib.h"
|
||||
#endif
|
||||
|
||||
#include "llprocessor.h"
|
||||
|
|
@ -467,6 +467,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
|
||||
|
|
@ -522,6 +524,11 @@ const std::string& LLOSInfo::getOSVersionString() const
|
|||
return mOSVersionString;
|
||||
}
|
||||
|
||||
const S32 LLOSInfo::getOSBitness() const
|
||||
{
|
||||
return mOSBitness;
|
||||
}
|
||||
|
||||
//static
|
||||
U32 LLOSInfo::getProcessVirtualSizeKB()
|
||||
{
|
||||
|
|
@ -575,6 +582,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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -11,7 +11,7 @@ include(00-Common)
|
|||
include(CURL)
|
||||
include(OpenSSL)
|
||||
include(NGHTTP2)
|
||||
include(ZLIB)
|
||||
include(ZLIBNG)
|
||||
include(LLCoreHttp)
|
||||
include(LLAddBuildTest)
|
||||
include(LLMessage)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -463,13 +463,13 @@ BOOL LLParcel::importAccessEntry(std::istream& input_stream, LLAccessEntry* entr
|
|||
}
|
||||
else if ("time" == keyword)
|
||||
{
|
||||
S32 when(0);
|
||||
S32 when{};
|
||||
LLStringUtil::convertToS32(value, when);
|
||||
entry->mTime = when;
|
||||
}
|
||||
else if ("flags" == keyword)
|
||||
{
|
||||
U32 setting(0);
|
||||
U32 setting{};
|
||||
LLStringUtil::convertToU32(value, setting);
|
||||
entry->mFlags = setting;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
#ifdef LL_USESYSTEMLIBS
|
||||
# include <zlib.h>
|
||||
#else
|
||||
# include "zlib/zlib.h"
|
||||
# include "zlib-ng/zlib.h"
|
||||
#endif
|
||||
|
||||
extern LLControlGroup gSavedSettings;
|
||||
|
|
|
|||
|
|
@ -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,35 +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
|
||||
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@
|
|||
|
||||
extern BOOL gDebugGL;
|
||||
extern BOOL gDebugSession;
|
||||
extern BOOL gDebugGLSession;
|
||||
extern llofstream gFailLog;
|
||||
|
||||
#define LL_GL_ERRS LL_ERRS("RenderState")
|
||||
|
|
|
|||
|
|
@ -1384,6 +1384,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) :
|
||||
|
|
@ -1538,6 +1541,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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -488,6 +488,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; }
|
||||
|
||||
|
|
|
|||
|
|
@ -229,9 +229,7 @@ S32 LLDXHardware::getMBVideoMemoryViaWMI()
|
|||
}
|
||||
|
||||
//Getting the version of graphics controller driver via WMI
|
||||
// <FS:Ansariel> FIRE-8264: System info displays wrong driver version on Optimus systems
|
||||
//std::string LLDXHardware::getDriverVersionWMI()
|
||||
std::string LLDXHardware::getDriverVersionWMI(const std::string& vendor)
|
||||
std::string LLDXHardware::getDriverVersionWMI(EGPUVendor vendor)
|
||||
{
|
||||
std::string mDriverVersion;
|
||||
HRESULT hrCoInitialize = S_OK;
|
||||
|
|
@ -327,38 +325,68 @@ std::string LLDXHardware::getDriverVersionWMI(const std::string& vendor)
|
|||
{
|
||||
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.
|
||||
}
|
||||
|
||||
// <FS:Ansariel> FIRE-8264: System info displays wrong driver version on Optimus systems
|
||||
hr = pclsObj->Get(L"AdapterCompatibility", 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;
|
||||
pSvc->Release();
|
||||
pLoc->Release();
|
||||
CoUninitialize();
|
||||
return std::string(); // Program has failed.
|
||||
}
|
||||
|
||||
BSTR vendorCompatibility(vtProp.bstrVal);
|
||||
std::wstring vc_ws(vendorCompatibility, SysStringLen(vendorCompatibility));
|
||||
std::string vc_str(vc_ws.begin(), vc_ws.end());
|
||||
|
||||
LLStringUtil::toUpper(vc_str);
|
||||
if (vc_str.find(vendor) == std::string::npos)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
// Get the value of the Name property
|
||||
hr = pclsObj->Get(L"DriverVersion", 0, &vtProp, 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();
|
||||
|
|
@ -366,7 +394,7 @@ std::string LLDXHardware::getDriverVersionWMI(const std::string& vendor)
|
|||
}
|
||||
|
||||
// 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));
|
||||
|
|
@ -379,10 +407,19 @@ std::string LLDXHardware::getDriverVersionWMI(const std::string& vendor)
|
|||
}
|
||||
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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -91,9 +91,15 @@ public:
|
|||
BOOL getInfo(BOOL vram_only, bool disable_wmi);
|
||||
// </FS:Ansariel>
|
||||
|
||||
// <FS:Ansariel> FIRE-8264: System info displays wrong driver version on Optimus systems
|
||||
//std::string getDriverVersionWMI();
|
||||
std::string getDriverVersionWMI(const std::string& vendor);
|
||||
// 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; }
|
||||
|
||||
|
|
|
|||
|
|
@ -3138,8 +3138,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -57,6 +57,7 @@ include(ViewerMiscLibs)
|
|||
#include(ViewerManager) # <FS:Ansariel> Remove VMP
|
||||
include(VisualLeakDetector)
|
||||
include(VulkanGltf)
|
||||
include(ZLIBNG)
|
||||
include(URIPARSER)
|
||||
include(Growl)
|
||||
include(ColladaDom)
|
||||
|
|
@ -2308,10 +2309,6 @@ if (WINDOWS)
|
|||
#media_plugin_example # <FS:Ansariel> Don't package example plugin
|
||||
)
|
||||
|
||||
if (NOT USE_BUGSPLAT)
|
||||
LIST(APPEND COPY_INPUT_DEPENDENCIES windows-crash-logger)
|
||||
endif (NOT USE_BUGSPLAT)
|
||||
|
||||
# <FS:Ansariel> Only copy OpenJPEG dll if needed
|
||||
if (NOT USE_KDU)
|
||||
list(APPEND COPY_INPUT_DEPENDENCIES
|
||||
|
|
@ -2492,14 +2489,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}
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
6.6.1
|
||||
6.6.2
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -5977,7 +5977,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>
|
||||
|
|
@ -11525,6 +11525,17 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<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>
|
||||
|
|
@ -12088,10 +12099,10 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Backup</key>
|
||||
<integer>0</integer>
|
||||
</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>0</integer>
|
||||
<key>Type</key>
|
||||
|
|
|
|||
|
|
@ -595,9 +595,15 @@ public:
|
|||
mHeaderLayoutStack = getChild<LLLayoutStack>("header_ls");
|
||||
|
||||
mInfoCtrl = LLUICtrlFactory::getInstance()->createFromFile<LLUICtrl>("inspector_info_ctrl.xml", this, LLPanel::child_registry_t::instance());
|
||||
llassert(mInfoCtrl != NULL);
|
||||
mInfoCtrl->setCommitCallback(boost::bind(&FSChatHistoryHeader::onClickInfoCtrl, mInfoCtrl));
|
||||
mInfoCtrl->setVisible(FALSE);
|
||||
if (mInfoCtrl)
|
||||
{
|
||||
mInfoCtrl->setCommitCallback(boost::bind(&FSChatHistoryHeader::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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -829,6 +829,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)
|
||||
{
|
||||
// <FS:CR> FIRE-8798: Option to prevent camera reset on movement
|
||||
|
|
@ -2439,6 +2445,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
|
||||
|
|
|
|||
|
|
@ -434,10 +434,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;
|
||||
}
|
||||
|
|
@ -562,7 +561,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();
|
||||
|
||||
|
|
@ -1527,7 +1525,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.
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
@ -1755,6 +1756,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)
|
||||
{
|
||||
|
|
@ -1768,6 +1777,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);
|
||||
|
|
|
|||
|
|
@ -652,8 +652,8 @@ static void settings_modify()
|
|||
LLRenderTarget::sUseFBO = LLPipeline::sRenderDeferred || (gSavedSettings.getBOOL("WindLightUseAtmosShaders") && LLPipeline::sUseDepthTexture);
|
||||
// [/RLVa:KB]
|
||||
LLVOSurfacePatch::sLODFactor = gSavedSettings.getF32("RenderTerrainLODFactor");
|
||||
LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //square lod factor to get exponential range of [1,4]
|
||||
gDebugGL = gSavedSettings.getBOOL("RenderDebugGL") || gDebugSession;
|
||||
LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; // square lod factor to get exponential range of [1,4]
|
||||
gDebugGL = gDebugGLSession || gDebugSession;
|
||||
gDebugPipeline = gSavedSettings.getBOOL("RenderDebugPipeline");
|
||||
}
|
||||
|
||||
|
|
@ -1328,7 +1328,8 @@ bool LLAppViewer::init()
|
|||
|
||||
// <FS:Ansariel> Disable updater
|
||||
//#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";
|
||||
|
|
@ -3258,6 +3259,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);
|
||||
}
|
||||
|
||||
// <FS:TT> Hacking to save the skin and theme for future use.
|
||||
mCurrentSkin = gSavedSettings.getString("SkinCurrent");
|
||||
mCurrentSkinTheme = gSavedSettings.getString("SkinCurrentTheme");
|
||||
|
|
@ -3727,6 +3737,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
|
||||
|
|
@ -3889,9 +3904,28 @@ LLSD LLAppViewer::getViewerInfo() const
|
|||
info["GRAPHICS_CARD_MEMORY"] = gGLManager.mVRAM;
|
||||
|
||||
#if LL_WINDOWS
|
||||
// <FS:Ansariel> FIRE-8264: System info displays wrong driver version on Optimus systems
|
||||
//std::string drvinfo = gDXHardware.getDriverVersionWMI();
|
||||
std::string drvinfo = gDXHardware.getDriverVersionWMI(gGLManager.mGLVendorShort);
|
||||
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;
|
||||
|
|
@ -5726,6 +5760,13 @@ 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)
|
||||
{
|
||||
// <FS:CR> Inworldz hang in disconnecting fix by McCabe Maxstead
|
||||
|
|
@ -5738,8 +5779,6 @@ void LLAppViewer::idle()
|
|||
return;
|
||||
}
|
||||
|
||||
gViewerWindow->updateUI();
|
||||
|
||||
if (gTeleportDisplay)
|
||||
{
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
// <FS:CR> FIRE-10512 - Sound explorer fix by Sei Lisa
|
||||
|
|
@ -144,11 +145,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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -578,9 +578,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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,7 +68,6 @@
|
|||
#pragma GCC diagnostic ignored "-Wuninitialized"
|
||||
#endif
|
||||
|
||||
extern BOOL gGLDebugLoggingEnabled;
|
||||
#define LL_MAX_INDICES_COUNT 1000000
|
||||
|
||||
static LLStaticHashedString sTextureIndexIn("texture_index_in");
|
||||
|
|
@ -1084,22 +1083,12 @@ void LLFace::getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_po
|
|||
}
|
||||
|
||||
const LLVolumeFace& vf = getViewerObject()->getVolume()->getVolumeFace(mTEOffset);
|
||||
|
||||
if( !vf.mNormals )
|
||||
if (! (vf.mNormals && vf.mTangents))
|
||||
{
|
||||
LL_WARNS( ) << "Volume face without normal vector (object id: " << getViewerObject()->getID().asString() << ")" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if( !vf.mTangents )
|
||||
{
|
||||
LL_WARNS() << "Volume face without tangent (object id: " << getViewerObject()->getID().asString() << ")" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
const LLVector4a& normal4a = vf.mNormals[0];
|
||||
const LLVector4a& tangent = vf.mTangents[0];
|
||||
const LLVector4a& normal4a = *vf.mNormals;
|
||||
const LLVector4a& tangent = *vf.mTangents;
|
||||
|
||||
LLVector4a binormal4a;
|
||||
binormal4a.setCross3(normal4a, tangent);
|
||||
|
|
@ -1638,7 +1627,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);
|
||||
|
|
|
|||
|
|
@ -919,6 +919,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();
|
||||
|
|
@ -1782,7 +1790,7 @@ void LLFavoritesOrderStorage::destroyClass()
|
|||
file.close();
|
||||
LLFile::remove(filename);
|
||||
}
|
||||
if(mSaveOnExit)
|
||||
if(mSaveOnExit || gSavedSettings.getBOOL("UpdateRememberPasswordSetting"))
|
||||
{
|
||||
LLFavoritesOrderStorage::instance().saveFavoritesRecord(true);
|
||||
}
|
||||
|
|
@ -1826,7 +1834,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);
|
||||
|
|
@ -1837,16 +1844,16 @@ void LLFavoritesOrderStorage::load()
|
|||
// <FS:Ansariel> FIRE-10122 - User@grid stored_favorites.xml
|
||||
//if (fav_llsd.isMap() && fav_llsd.has(gAgentUsername))
|
||||
//{
|
||||
// user_llsd = fav_llsd[gAgentUsername];
|
||||
// mStorageFavorites = fav_llsd[gAgentUsername];
|
||||
if (fav_llsd.isMap() && fav_llsd.has(gAgentUsername + " @ " + LLGridManager::getInstance()->getGridLabel()))
|
||||
{
|
||||
user_llsd = fav_llsd[gAgentUsername + " @ " + LLGridManager::getInstance()->getGridLabel()];
|
||||
mStorageFavorites = fav_llsd[gAgentUsername + " @ " + LLGridManager::getInstance()->getGridLabel()];
|
||||
// </FS:Ansariel>
|
||||
|
||||
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();
|
||||
|
|
@ -2161,7 +2168,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())
|
||||
|
|
@ -2182,6 +2189,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;
|
||||
|
|
@ -2257,6 +2270,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;
|
||||
|
|
|
|||
|
|
@ -233,8 +233,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;
|
||||
|
|
@ -261,7 +264,6 @@ private:
|
|||
slurls_map_t mSLURLs;
|
||||
std::set<LLUUID> mMissingSLURLs;
|
||||
bool mIsDirty;
|
||||
bool mRecreateFavoriteStorage;
|
||||
|
||||
struct IsNotInFavorites
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -369,9 +369,7 @@ void LLFloaterJoystick::refreshListOfDevices()
|
|||
std::string desc = LLViewerJoystick::getInstance()->getDescription();
|
||||
if (!desc.empty())
|
||||
{
|
||||
// <FS:Zi> FIRE-30846 - Select the first detected device, don't fall back to 0 which will select "None"
|
||||
// LLSD value = LLSD::Integer(0);
|
||||
LLSD value = LLSD::Integer(1);
|
||||
LLSD value = LLSD::Integer(1); // value for selection
|
||||
addDevice(desc, value);
|
||||
mHasDeviceList = true;
|
||||
}
|
||||
|
|
@ -471,6 +469,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
|
||||
|
|
@ -479,7 +480,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);
|
||||
|
|
|
|||
|
|
@ -472,7 +472,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.
|
||||
|
|
@ -778,6 +779,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());
|
||||
|
|
|
|||
|
|
@ -2347,6 +2347,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);
|
||||
|
|
|
|||
|
|
@ -28,18 +28,20 @@
|
|||
#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"
|
||||
// [RLVa:KB] - Checked: 2010-02-27 (RLVa-1.2.0c)
|
||||
#include "rlvactions.h"
|
||||
#include "rlvhandler.h"
|
||||
#include "rlvcommon.h"
|
||||
#include "lltoolpie.h"
|
||||
// [/RLVa:KB]
|
||||
|
|
@ -662,7 +664,37 @@ 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)
|
||||
{
|
||||
// <FS:Ansariel> RLVa fix
|
||||
//gAgent.standUp();
|
||||
if (!rlv_handler_t::isEnabled() || RlvActions::canStand())
|
||||
{
|
||||
gAgent.standUp();
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
else
|
||||
{
|
||||
handle_object_sit(mObjectID);
|
||||
}
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -295,7 +295,9 @@ 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"] = !gSavedSettings.getBOOL("CmdLineSkipUpdater")
|
||||
// && !LLAppViewer::instance()->isUpdaterMissing()
|
||||
// && !gNonInteractive;
|
||||
//#else
|
||||
mRequestData["wait_for_updater"] = false;
|
||||
//#endif
|
||||
|
|
|
|||
|
|
@ -125,6 +125,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);
|
||||
}
|
||||
// <FS> set up callbacks for copy URI and name buttons
|
||||
childSetCommitCallback("copy_uri", boost::bind(&LLPanelGroupGeneral::onCopyURI, this), NULL);
|
||||
|
|
@ -676,7 +677,8 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
|
|||
|
||||
if (mEditCharter)
|
||||
{
|
||||
mEditCharter->setText(gdatap->mCharter);
|
||||
mEditCharter->setParseURLs(!mAllowEdit || !can_change_ident);
|
||||
mEditCharter->setText(gdatap->mCharter);
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Re-add group member list on general panel
|
||||
|
|
|
|||
|
|
@ -94,44 +94,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:
|
||||
|
|
@ -363,11 +325,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()
|
||||
|
|
@ -440,10 +401,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 != "")
|
||||
{
|
||||
|
|
@ -455,6 +428,10 @@ void LLPanelLogin::addFavoritesToStartLocation()
|
|||
}
|
||||
}
|
||||
}
|
||||
if (update_password_setting)
|
||||
{
|
||||
gSavedSettings.setBOOL("UpdateRememberPasswordSetting", TRUE);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (combo->getValue().asString().empty())
|
||||
|
|
@ -567,21 +544,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
|
||||
|
|
@ -692,39 +660,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
|
||||
|
|
@ -775,16 +710,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();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1147,17 +1075,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);
|
||||
|
|
@ -1171,6 +1100,14 @@ void LLPanelLogin::onRememberUserCheck(void*)
|
|||
}
|
||||
}
|
||||
|
||||
void LLPanelLogin::onRememberPasswordCheck(void*)
|
||||
{
|
||||
if (sInstance)
|
||||
{
|
||||
gSavedSettings.setBOOL("UpdateRememberPasswordSetting", TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -109,6 +109,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();
|
||||
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ LLPanelLoginListener::LLPanelLoginListener(LLPanelLogin* instance):
|
|||
|
||||
void LLPanelLoginListener::onClickConnect(const LLSD&) const
|
||||
{
|
||||
mPanel->onClickConnect(NULL);
|
||||
mPanel->onClickConnect(false);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -2290,6 +2290,18 @@ void LLPanelObject::sendPosition(BOOL btn_down)
|
|||
|
||||
// <FS:Zi> Building spin controls for attachments
|
||||
// partly copied from llmaniptranslate.cpp to get the positioning right
|
||||
//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 (is_valid_pos)
|
||||
if (mObject->isAttachment())
|
||||
{
|
||||
LLVector3 old_position_local = mObject->getPosition();
|
||||
|
|
@ -2324,8 +2336,8 @@ void LLPanelObject::sendPosition(BOOL btn_down)
|
|||
|
||||
LLSelectMgr::getInstance()->updateSelectionCenter();
|
||||
}
|
||||
// </FS:Zi> Building spin controls for attachments
|
||||
else if (LLWorld::getInstance()->positionRegionValidGlobal(new_pos_global) )
|
||||
// </FS:Zi> Building spin controls for attachments
|
||||
{
|
||||
// send only if the position is changed, that is, the delta vector is not zero
|
||||
LLVector3d old_pos_global = mObject->getPositionGlobal();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -1027,12 +1027,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;
|
||||
|
||||
|
|
|
|||
|
|
@ -1685,7 +1685,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(): "
|
||||
|
|
@ -1698,11 +1698,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.
|
||||
|
|
|
|||
|
|
@ -585,13 +585,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();
|
||||
|
|
@ -1194,7 +1187,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));
|
||||
// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
|
||||
|
|
|
|||
|
|
@ -473,7 +473,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)
|
||||
|
|
@ -5292,29 +5304,15 @@ 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)
|
||||
// [RLVa:KB] - Checked: 2010-03-06 (RLVa-1.2.0c) | Modified: RLVa-1.2.0c
|
||||
if ( (object && object->getPCode() == LL_PCODE_VOLUME) &&
|
||||
((!rlv_handler_t::isEnabled()) || (RlvActions::canSit(object, pick.mObjectOffset))) )
|
||||
((!rlv_handler_t::isEnabled()) || (RlvActions::canSit(object, offset))) )
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
// [RLVa:KB] - Checked: 2010-08-29 (RLVa-1.2.1c) | Added: RLVa-1.2.1c
|
||||
|
|
@ -5335,12 +5333,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)
|
||||
|
|
@ -7845,6 +7873,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)
|
||||
|
|
@ -12231,6 +12277,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")));
|
||||
|
|
|
|||
|
|
@ -156,6 +156,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();
|
||||
|
|
|
|||
|
|
@ -278,13 +278,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())
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4250,6 +4250,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)
|
||||
|
|
@ -7379,15 +7386,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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -3293,6 +3293,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");
|
||||
|
|
|
|||
|
|
@ -513,6 +513,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",
|
||||
|
|
|
|||
|
|
@ -1409,8 +1409,7 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename,
|
|||
LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec);
|
||||
if (image.isNull())
|
||||
{
|
||||
// <FS:ND> Pointer is null!
|
||||
//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))
|
||||
|
|
|
|||
|
|
@ -2433,6 +2433,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);
|
||||
|
||||
|
|
@ -3692,6 +3693,11 @@ void LLViewerWindow::handleScrollWheel(S32 clicks)
|
|||
|
||||
void LLViewerWindow::handleScrollHWheel(S32 clicks)
|
||||
{
|
||||
if (LLAppViewer::instance()->quitRequested())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
LLUI::getInstance()->resetMouseIdleTimer();
|
||||
|
||||
LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
|
||||
|
|
|
|||
|
|
@ -111,7 +111,6 @@ S32 LLVOVolume::mRenderComplexity_current = 0;
|
|||
LLPointer<LLObjectMediaDataClient> LLVOVolume::sObjectMediaClient = NULL;
|
||||
LLPointer<LLObjectMediaNavigateClient> LLVOVolume::sObjectMediaNavigateClient = NULL;
|
||||
|
||||
extern BOOL gGLDebugLoggingEnabled;
|
||||
extern BOOL gCubeSnapshot;
|
||||
|
||||
// NaCl - Graphics crasher protection
|
||||
|
|
|
|||
|
|
@ -11443,22 +11443,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);
|
||||
|
|
|
|||
|
|
@ -713,8 +713,7 @@ with the same filename but different name
|
|||
<texture name="login_fs_logo" file_name="windows/login_fs_logo.png" preload="true" />
|
||||
<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 |
|
|
@ -103,7 +103,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">
|
||||
|
|
|
|||
|
|
@ -55,6 +55,8 @@
|
|||
<menu_item_call label="Avatar-Animationen stoppen" name="Stop Animating My Avatar"/>
|
||||
<menu_item_call label="Avatar-Animationen stoppen & Skripten Rechte entziehen" name="Stop Animating My Avatar With Revoke"/>
|
||||
<menu_item_call label="Avatar undeformieren" name="undeform_avatar"/>
|
||||
<menu_item_call label="Skelett zurücksetzen" name="Reset Skeleton"/>
|
||||
<menu_item_call label="Skelett und Animationen zurücksetzen" name="Reset Skeleton And Animations"/>
|
||||
<menu_item_call label="Aktualisiere Aussehen (Rebake)" name="Rebake Texture"/>
|
||||
<menu_item_call label="Anhänge aktualisieren" name="Refresh Attachments"/>
|
||||
<menu_item_call label="Auf männlichen Standard-Avatar zurücksetzen" name="ResetDefaultAvM"/>
|
||||
|
|
@ -505,7 +507,7 @@
|
|||
<menu_item_check label="Schatten von Sonne-/Mond-Projektoren" name="Shadows from Sun/Moon/Projectors"/>
|
||||
<menu_item_check label="SSAO und Schattenglättung" name="SSAO and Shadow Smoothing"/>
|
||||
<menu_item_check label="Globale Beleuchtung (experimentell)" name="Global Illumination"/>
|
||||
<menu_item_check label="GL debuggen" name="Debug GL"/>
|
||||
<menu_item_check label="GL beim nächsten Start debuggen" name="Debug GL"/>
|
||||
<menu_item_check label="Pipeline debuggen" name="Debug Pipeline"/>
|
||||
<menu_item_check label="Automatische Alpha-Masken (aufgeschoben)" name="Automatic Alpha Masks (deferred)"/>
|
||||
<menu_item_check label="Automatische Alpha-Masken (nicht aufgeschoben)" name="Automatic Alpha Masks (non-deferred)"/>
|
||||
|
|
|
|||
|
|
@ -1921,7 +1921,7 @@ erlauben bis zu [MAX_PREMIUM_PLUS]. [https://secondlife.com/my/account/membershi
|
|||
wir bitten Sie um Geduld, während Ihr Name im System geändert wird. Es kann einige Tage dauern, bis Ihr [http://wiki.secondlife.com/wiki/Setting_your_display_name neuer Name] in Objekten, Skripts, Suchen usw. erscheint.
|
||||
</notification>
|
||||
<notification name="SetDisplayNameBlocked">
|
||||
Ihr Anzeigename kann leider nicht geändert werden. Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich bitte an unseren Support.
|
||||
Ihr Anzeigename kann leider nicht geändert werden. Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich bitte an den Support des entsprechenden Grids.
|
||||
</notification>
|
||||
<notification name="SetDisplayNameFailedLength">
|
||||
Dieser Name ist leider zu lang. Anzeigenamen können maximal [LENGTH] Zeichen enthalten.
|
||||
|
|
@ -4864,7 +4864,7 @@ Bitte kopieren Sie diese in Ihr Inventar und versuchen Sie es erneut.
|
|||
Der Pfad konnte nicht aus [TRACK1] in [TRACK2] geladen werden.
|
||||
</notification>
|
||||
<notification name="CompressionTestResults">
|
||||
Test-Ergebnis für gip-Level 6 Datei-Komprimierung für [FILE] mit Größe [SIZE] KB:
|
||||
Test-Ergebnis für gzip-Level 6 Komprimierung für [FILE] mit einer Größe von [SIZE] KB:
|
||||
Packen: [PACK_TIME]s [PSIZE]KB
|
||||
Entpacken: [UNPACK_TIME]s [USIZE]KB
|
||||
<tag>fail</tag>
|
||||
|
|
|
|||
|
|
@ -105,6 +105,9 @@ Voice-Serverversion: [VOICE_VERSION]
|
|||
<string name="AboutTime">
|
||||
[day, datetime, slt]. [month, datetime, slt] [year, datetime, slt] [hour24, datetime, slt]:[min, datetime, slt]:[second,datetime,slt] SLT
|
||||
</string>
|
||||
<string name="LocalTime">
|
||||
[day, datetime, local]. [month, datetime, local] [year, datetime, local] [hour24, datetime, local]:[min, datetime, local]:[second,datetime,local]
|
||||
</string>
|
||||
<string name="ErrorFetchingServerReleaseNotesURL">
|
||||
Fehler beim Abrufen der URL für die Server-Versionshinweise.
|
||||
</string>
|
||||
|
|
@ -210,7 +213,7 @@ Voice-Serverversion: [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">
|
||||
|
|
@ -229,11 +232,15 @@ Voice-Serverversion: [VOICE_VERSION]
|
|||
http://secondlife.com/download
|
||||
</string>
|
||||
<string name="LoginFailedViewerNotPermitted">
|
||||
Mit dem von Ihnen verwendeten Viewer ist der Zugriff auf Second Life nicht mehr möglich. Laden Sie von den folgenden Seite einen neuen Viewer herunter:
|
||||
Mit dem von Ihnen verwendeten Viewer ist der Zugriff nicht mehr möglich. Laden Sie von den folgenden Seite einen neuen Viewer herunter:
|
||||
https://www.firestormviewer.org/choose-your-platform/
|
||||
|
||||
Weitere Informationen finden Sie auf der folgenden FAQ-Seite:
|
||||
http://secondlife.com/viewer-access-faq
|
||||
</string>
|
||||
<string name="LoginFailed">Grid-Notfall Login-Fehler.
|
||||
|
||||
Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich bitte an den Support des entsprechenden Grids.
|
||||
</string>
|
||||
<string name="LoginIntermediateOptionalUpdateAvailable">
|
||||
Optionales Viewer-Update verfügbar: [VERSION]
|
||||
|
|
@ -279,9 +286,12 @@ Benutzer mit kostenlosen Konten können sich während dieses Zeitraums nicht bei
|
|||
Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an
|
||||
support@secondlife.com.
|
||||
</string>
|
||||
<string name="PacificTime">
|
||||
Pazifik-Zeit
|
||||
</string>
|
||||
<string name="LoginFailedAcountSuspended">
|
||||
Ihr Konto ist erst ab
|
||||
[TIME] Pacific Time wieder verfügbar.
|
||||
[TIME] wieder verfügbar.
|
||||
</string>
|
||||
<string name="LoginFailedAccountDisabled">
|
||||
Ihre Anfrage kann derzeit nicht bearbeitet werden.
|
||||
|
|
@ -294,7 +304,7 @@ Wenden Sie sich an support@secondlife.com.
|
|||
<string name="LoginFailedAccountMaintenance">
|
||||
An Ihrem Konto werden gerade kleinere Wartungsarbeiten durchgeführt.
|
||||
Ihr Konto ist erst ab
|
||||
[TIME] Pacific Time wieder verfügbar.
|
||||
[TIME] wieder verfügbar.
|
||||
Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
|
||||
</string>
|
||||
<string name="LoginFailedPendingLogoutFault">
|
||||
|
|
|
|||
|
|
@ -185,6 +185,7 @@
|
|||
left_pad="2"
|
||||
name="Description"
|
||||
spellcheck="true"
|
||||
parse_urls="true"
|
||||
top_delta="0"
|
||||
width="365"
|
||||
word_wrap="true" />
|
||||
|
|
|
|||
|
|
@ -23,6 +23,16 @@
|
|||
visible="false"
|
||||
width="1024" />
|
||||
|
||||
|
||||
<!-- At the moment layout_stack is not an LLUICtrl,
|
||||
but Tab requires focus_root to function and focus_root
|
||||
functionality is implemented in LLUICtrl -->
|
||||
<panel follows="all"
|
||||
height="768"
|
||||
name="menu_tab_wrapper"
|
||||
mouse_opaque="false"
|
||||
focus_root="true"
|
||||
top="0">
|
||||
<layout_stack border_size="0"
|
||||
follows="all"
|
||||
mouse_opaque="false"
|
||||
|
|
@ -33,12 +43,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"
|
||||
|
|
@ -46,6 +56,7 @@
|
|||
left="0"
|
||||
top="0"
|
||||
width="1024"
|
||||
tab_group="1"
|
||||
height="19"/>
|
||||
</layout_panel>
|
||||
<layout_panel auto_resize="true"
|
||||
|
|
@ -108,7 +119,8 @@
|
|||
tab_stop="false"/>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
|
||||
</panel> <!--menu_tab_wrapper-->
|
||||
|
||||
<panel top="0"
|
||||
follows="all"
|
||||
mouse_opaque="false"
|
||||
|
|
|
|||
|
|
@ -486,6 +486,18 @@
|
|||
<menu_item_call.on_click
|
||||
function="Tools.Undeform" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Reset skeleton"
|
||||
name="Reset Skeleton">
|
||||
<menu_item_call.on_click
|
||||
function="Avatar.ResetSkeleton" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Reset skeleton and animations"
|
||||
name="Reset Skeleton And Animations">
|
||||
<menu_item_call.on_click
|
||||
function="Avatar.ResetSelfSkeletonAndAnimations" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Force Appearance Update (Rebake)"
|
||||
name="Rebake Texture"
|
||||
|
|
@ -4426,14 +4438,14 @@
|
|||
<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"
|
||||
|
|
|
|||
|
|
@ -4804,7 +4804,7 @@ Just like in real life, it takes a while for everyone to learn about a new name.
|
|||
icon="alertmodal.tga"
|
||||
name="SetDisplayNameBlocked"
|
||||
type="alert">
|
||||
Sorry, you cannot change your display name. If you feel this is in error, please contact Linden Lab support.
|
||||
Sorry, you cannot change your display name. If you feel this is in error, please contact the grid support.
|
||||
<tag>fail</tag>
|
||||
</notification>
|
||||
|
||||
|
|
@ -13792,7 +13792,8 @@ Unpacking: [UNPACK_TIME]s [USIZE]KB
|
|||
<tag>fail</tag>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
label="Prompt for MFA Token"
|
||||
name="PromptMFAToken"
|
||||
|
|
|
|||
|
|
@ -131,6 +131,7 @@ Hover your mouse over the options for more help.
|
|||
type="string"
|
||||
follows="left|top|right"
|
||||
max_length="511"
|
||||
parse_urls="true"
|
||||
word_wrap="true"
|
||||
layout="topleft">
|
||||
Group Charter
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@
|
|||
follows="left|top"
|
||||
font="SansSerifMedium"
|
||||
text_color="EmphasisColor"
|
||||
height="16"
|
||||
height="24"
|
||||
left="408"
|
||||
bottom_delta="0"
|
||||
label="Remember password"
|
||||
|
|
|
|||
|
|
@ -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 > Preferences > Advanced > 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"
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@
|
|||
mouse_opaque="false"
|
||||
name="status"
|
||||
top="19"
|
||||
tab_stop="false"
|
||||
width="1000">
|
||||
<!-- icon
|
||||
top="0"
|
||||
|
|
|
|||
|
|
@ -95,6 +95,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] 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>
|
||||
|
||||
|
|
@ -137,7 +138,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">https://www.firestormviewer.org/join-secondlife/</string>
|
||||
|
||||
|
|
@ -151,6 +152,8 @@ https://www.firestormviewer.org/choose-your-platform/
|
|||
|
||||
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 the grid support.</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.
|
||||
|
|
@ -178,15 +181,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.
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -202,7 +202,7 @@ Version serveur vocal : [VOICE_VERSION]
|
|||
<string name="LoginFailedNoNetwork">
|
||||
Erreur réseau : impossible d'é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
Loading…
Reference in New Issue