diff options
280 files changed, 6330 insertions, 2535 deletions
diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index c68131402b..ce934f1a21 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -1,6 +1,7 @@  # Replace tabs with spaces  1b68f71348ecf3983b76b40d7940da8377f049b7  33418a77b716e122da9778869cdbabe97c83ff37 +6b974724826a038b0db794460b322eb4921da735  # Trim trailing whitespace  a0b3021bdcf76859054fda8e30abb3ed47749e83  8444cd9562a6a7b755fcb075864e205122354192 diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml new file mode 100644 index 0000000000..3e3e1df3e2 --- /dev/null +++ b/.github/dependabot.yaml @@ -0,0 +1,7 @@ +version: 2 +updates: + +  - package-ecosystem: github-actions +    directory: / +    schedule: +      interval: monthly diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 8f89db0923..4c948e5586 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,6 +1,7 @@  name: Build  on: +  workflow_dispatch:    pull_request:    push:      branches: ["main", "release/*", "project/*"] @@ -85,7 +86,7 @@ jobs:        variants: ${{ matrix.configuration }}      steps:        - name: Checkout code -        uses: actions/checkout@v4 +        uses: actions/checkout@v5          with:            ref: ${{ github.event.pull_request.head.sha || github.sha }} @@ -94,14 +95,14 @@ jobs:          with:            python-version: "3.11"        - name: Checkout build variables -        uses: actions/checkout@v4 +        uses: actions/checkout@v5          with:            repository: secondlife/build-variables            ref: master            path: .build-variables        - name: Checkout master-message-template -        uses: actions/checkout@v4 +        uses: actions/checkout@v5          with:            repository: secondlife/master-message-template            path: .master-message-template @@ -309,7 +310,7 @@ jobs:      steps:        - name: Sign and package Windows viewer          if: env.AZURE_KEY_VAULT_URI && env.AZURE_CERT_NAME && env.AZURE_CLIENT_ID && env.AZURE_CLIENT_SECRET && env.AZURE_TENANT_ID -        uses: secondlife/viewer-build-util/sign-pkg-windows@v2 +        uses: secondlife/viewer-build-util/sign-pkg-windows@v2.0.4          with:            vault_uri: "${{ env.AZURE_KEY_VAULT_URI }}"            cert_name: "${{ env.AZURE_CERT_NAME }}" diff --git a/.github/workflows/pre-commit.yaml b/.github/workflows/pre-commit.yaml index d626eef38d..726e1cd889 100644 --- a/.github/workflows/pre-commit.yaml +++ b/.github/workflows/pre-commit.yaml @@ -11,8 +11,8 @@ jobs:    pre-commit:      runs-on: ubuntu-latest      steps: -      - uses: actions/checkout@v4 +      - uses: actions/checkout@v5        - uses: actions/setup-python@v4          with:            python-version: 3.x -      - uses: pre-commit/action@v3.0.0 +      - uses: pre-commit/action@v3.0.1 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8baac5a81d..d1dcc93976 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,14 +7,14 @@ repos:        - id: no-trigraphs        - id: copyright        - id: end-of-file -        files: \.(cpp|c|h|py|glsl|cmake|txt)$ +        files: \.(cpp|c|m|mm|h|py|glsl|cmake|txt)$          exclude: language.txt        - id: indent-with-spaces -        files: \.(cpp|c|h|inl|py|glsl|cmake)$ +        files: \.(cpp|c|m|mm|h|inl|py|glsl|cmake)$    - repo: https://github.com/pre-commit/pre-commit-hooks -    rev: v5.0.0 +    rev: v6.0.0      hooks:        - id: check-xml        - id: mixed-line-ending        - id: trailing-whitespace -        files: \.(cpp|c|h|inl|py|glsl|cmake|yaml|sh)$ +        files: \.(cpp|c|m|mm|h|inl|py|glsl|cmake|yaml|sh)$ @@ -64,7 +64,7 @@ $ megapahit  ### Fedora  ``` -$ sudo dnf install cmake gcc-c++ patch patchelf rpm-build perl-FindBin apr-util-devel boost-devel boost-url expat-devel fltk-devel glm-devel mesa-libGLU-devel hunspell-devel minizip-ng-compat-devel libnghttp2-devel nanosvg-devel openjpeg-devel pipewire-devel pulseaudio-libs-devel SDL2-devel vlc-devel libvorbis-devel libXcursor-devel libXfixes-devel libXinerama-devel xxhash-devel +$ sudo dnf install cmake gcc-c++ patch patchelf rpm-build perl-FindBin apr-util-devel boost-devel boost-url expat-devel fltk-devel glm-devel mesa-libGLU-devel hunspell-devel minizip-ng-compat-devel libnghttp2-devel nanosvg-devel openjpeg-devel pipewire-devel pulseaudio-libs-devel SDL2-devel v-hacd-devel vlc-devel libvorbis-devel libXcursor-devel libXfixes-devel libXinerama-devel xxhash-devel  $ export LL_BUILD="-O3 -std=c++20 -fPIC -DLL_LINUX=1"  ```  build with FMOD Studio: ([register with fmod to get linux package][fmod] and then place the `.tar.gz` in `~/Downloads`) diff --git a/autobuild.xml b/autobuild.xml index 26c3532170..a14d477234 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1468,58 +1468,6 @@          <key>name</key>          <string>llphysicsextensions_source</string>        </map> -      <key>llphysicsextensions_stub</key> -      <map> -        <key>platforms</key> -        <map> -          <key>darwin64</key> -          <map> -            <key>archive</key> -            <map> -              <key>hash</key> -              <string>f290b000b31f9e36f2489946cbc99f5e</string> -              <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/59995/563653/llphysicsextensions_stub-1.0.542456-darwin64-542456.tar.bz2</string> -            </map> -            <key>name</key> -            <string>darwin64</string> -          </map> -          <key>linux64</key> -          <map> -            <key>archive</key> -            <map> -              <key>hash</key> -              <string>711f4ec769e4b5f59ba25ee43c11bcbc</string> -              <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/4724/14846/llphysicsextensions_stub-1.0.504712-linux64-504712.tar.bz2</string> -            </map> -            <key>name</key> -            <string>linux64</string> -          </map> -          <key>windows64</key> -          <map> -            <key>archive</key> -            <map> -              <key>hash</key> -              <string>2e5f1f7046a49d8b0bc295aa878116bc</string> -              <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/60043/564063/llphysicsextensions_stub-1.0.542456-windows-542456.tar.bz2</string> -            </map> -            <key>name</key> -            <string>windows64</string> -          </map> -        </map> -        <key>license</key> -        <string>internal</string> -        <key>license_file</key> -        <string>LICENSES/llphysicsextensions.txt</string> -        <key>copyright</key> -        <string>Copyright (c) 2010, Linden Research, Inc.</string> -        <key>version</key> -        <string>1.0.542456</string> -        <key>name</key> -        <string>llphysicsextensions_stub</string> -      </map>        <key>llphysicsextensions_tpv</key>        <map>          <key>platforms</key> @@ -2947,6 +2895,38 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>          <key>description</key>          <string>Discord Social SDK</string>        </map> +      <key>vhacd</key> +      <map> +        <key>platforms</key> +        <map> +          <key>common</key> +          <map> +            <key>archive</key> +            <map> +              <key>hash</key> +              <string>140d8fc952a10edb5f2d72ab405336019ef32cadfa64f0cfce76c9de4bc6268cbc87cc8cd89d3417fb78b531d441701afc8d016bafe4bd275df2707f7daf1387</string> +              <key>hash_algorithm</key> +              <string>blake2b</string> +              <key>url</key> +              <string>https://github.com/AlchemyViewer/3p-vhacd/releases/download/v4.1.0-r2/vhacd-4.1.0-r2-common-18166921729.tar.zst</string> +            </map> +            <key>name</key> +            <string>common</string> +          </map> +        </map> +        <key>license</key> +        <string>BSD</string> +        <key>license_file</key> +        <string>LICENSES/vhacd.txt</string> +        <key>copyright</key> +        <string>Copyright (c) 2011, Khaled Mamou</string> +        <key>version</key> +        <string>4.1.0-r2</string> +        <key>name</key> +        <string>vhacd</string> +        <key>description</key> +        <string>Voxelized Hierarchical Approximate Convex Decomposition</string> +      </map>      </map>      <key>package_description</key>      <map> @@ -70,7 +70,7 @@ installer_Darwin()  {    local package_name="$1"    local package_dir="$(build_dir_Darwin)/newview/" -  local pattern=".*$(viewer_channel_suffix ${package_name})_[0-9]+_[0-9]+_[0-9]+_[0-9]+_x86_64\\.dmg\$" +  local pattern=".*$(viewer_channel_suffix ${package_name})_[0-9]+_[0-9]+_[0-9]+_[0-9]+_universal\\.dmg\$"    # since the additional packages are built after the base package,    # sorting oldest first ensures that the unqualified package is returned    # even if someone makes a qualified name that duplicates the last word of the base name diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index adf30de2b5..6f3ec1cfff 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -70,6 +70,7 @@ add_subdirectory(${LIBS_OPEN_PREFIX}llinventory)  add_subdirectory(${LIBS_OPEN_PREFIX}llmath)  add_subdirectory(${LIBS_OPEN_PREFIX}llmeshoptimizer)  add_subdirectory(${LIBS_OPEN_PREFIX}llmessage) +add_subdirectory(${LIBS_OPEN_PREFIX}llphysicsextensionsos)  add_subdirectory(${LIBS_OPEN_PREFIX}llprimitive)  add_subdirectory(${LIBS_OPEN_PREFIX}llrender)  add_subdirectory(${LIBS_OPEN_PREFIX}llfilesystem) diff --git a/indra/cmake/APR.cmake b/indra/cmake/APR.cmake index 4ce0d47f7f..22e94f2c8f 100644 --- a/indra/cmake/APR.cmake +++ b/indra/cmake/APR.cmake @@ -45,3 +45,8 @@ if(DARWIN)  endif()  target_include_directories(ll::apr SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/apr-1) + +# Fix erroneous check for __attribute__ definition introduced with APR 1.7.5, causing lots of "this declaration may not have extern 'C' linkage" errors in VS +file(READ ${LIBS_PREBUILT_DIR}/include/apr-1/apr.h APR_HEADER_CONTENTS) +string(REPLACE "#if !(defined(__attribute__) || defined(__has_attribute))" "#if !defined(__attribute__)" APR_HEADER_CONTENTS "${APR_HEADER_CONTENTS}") +file(WRITE ${LIBS_PREBUILT_DIR}/include/apr-1/apr.h "${APR_HEADER_CONTENTS}") diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index a3233f1c6f..be1e9008e5 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -61,6 +61,7 @@ set(cmake_SOURCE_FILES          UI.cmake          UnixInstall.cmake          Variables.cmake +        VHACD.cmake          ViewerMiscLibs.cmake          VisualLeakDetector.cmake          LibVLCPlugin.cmake diff --git a/indra/cmake/LLPhysicsExtensions.cmake b/indra/cmake/LLPhysicsExtensions.cmake index f9870e4a28..84722b45a7 100644 --- a/indra/cmake/LLPhysicsExtensions.cmake +++ b/indra/cmake/LLPhysicsExtensions.cmake @@ -29,17 +29,18 @@ if (HAVOK)        #target_link_libraries( llphysicsextensions_impl INTERFACE llphysicsextensionsstub)     else()       target_link_libraries( llphysicsextensions_impl INTERFACE llphysicsextensions) +     target_compile_definitions( llphysicsextensions_impl INTERFACE LL_HAVOK=1 )     endif() +   target_include_directories( llphysicsextensions_impl INTERFACE   ${LIBS_PREBUILT_DIR}/include/llphysicsextensions)  elseif (HAVOK_TPV)     use_prebuilt_binary(llphysicsextensions_tpv) -    if (CMAKE_OSX_ARCHITECTURES MATCHES x86_64) -        target_link_directories( llphysicsextensions_impl INTERFACE ${ARCH_PREBUILT_DIRS_RELEASE} ) -    endif () -   target_link_libraries( llphysicsextensions_impl INTERFACE llphysicsextensions_tpv) -else (HAVOK) -   use_prebuilt_binary(llphysicsextensions_stub) -   set(LLPHYSICSEXTENSIONS_SRC_DIR ${LIBS_PREBUILT_DIR}/llphysicsextensions/stub) -   target_link_libraries( llphysicsextensions_impl INTERFACE llphysicsextensionsstub) -endif (HAVOK) - -target_include_directories( llphysicsextensions_impl INTERFACE   ${LIBS_PREBUILT_DIR}/include/llphysicsextensions) +   if (NOT DARWIN) +      if(WINDOWS) +         target_link_libraries( llphysicsextensions_impl INTERFACE ${ARCH_PREBUILT_DIRS}/llphysicsextensions_tpv.lib) +      elseif(LINUX) +         target_link_libraries( llphysicsextensions_impl INTERFACE ${ARCH_PREBUILT_DIRS}/libllphysicsextensions_tpv.a) +      endif() +      target_compile_definitions( llphysicsextensions_impl INTERFACE LL_HAVOK=1 ) +   endif() +   target_include_directories( llphysicsextensions_impl INTERFACE   ${LIBS_PREBUILT_DIR}/include/llphysicsextensions) +endif () diff --git a/indra/cmake/VHACD.cmake b/indra/cmake/VHACD.cmake new file mode 100644 index 0000000000..b368fe28e0 --- /dev/null +++ b/indra/cmake/VHACD.cmake @@ -0,0 +1,30 @@ +# -*- cmake -*- +include(Prebuilt) + +add_library(ll::vhacd INTERFACE IMPORTED) + +if (FALSE) +use_system_binary(vhacd) +use_prebuilt_binary(vhacd) + +elseif (NOT (${LINUX_DISTRO} MATCHES fedora)) +    if (${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/vhacd_installed OR NOT ${vhacd_installed} EQUAL 0) +        if (NOT EXISTS ${CMAKE_BINARY_DIR}/v-hacd-4.1.0.tar.gz) +            file(DOWNLOAD +                https://github.com/kmammou/v-hacd/archive/refs/tags/v4.1.0.tar.gz +                ${CMAKE_BINARY_DIR}/v-hacd-4.1.0.tar.gz +                ) +        endif () +        file(ARCHIVE_EXTRACT +            INPUT ${CMAKE_BINARY_DIR}/v-hacd-4.1.0.tar.gz +            DESTINATION ${CMAKE_BINARY_DIR} +            ) +        file(MAKE_DIRECTORY ${LIBS_PREBUILT_DIR}/include/vhacd) +        file( +            COPY ${CMAKE_BINARY_DIR}/v-hacd-4.1.0/include/VHACD.h +            DESTINATION ${LIBS_PREBUILT_DIR}/include/vhacd +            ) +        file(WRITE ${PREBUILD_TRACKING_DIR}/vhacd_installed "0") +    endif () +target_include_directories(ll::vhacd SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/vhacd/) +endif () diff --git a/indra/llappearance/llpolymesh.cpp b/indra/llappearance/llpolymesh.cpp index 719381b4fc..d5323e0b84 100644 --- a/indra/llappearance/llpolymesh.cpp +++ b/indra/llappearance/llpolymesh.cpp @@ -283,6 +283,7 @@ bool LLPolyMeshSharedData::loadMesh( const std::string& fileName )          LLFILE* fp = LLFile::fopen(fileName, "rb");                     /*Flawfinder: ignore*/          if (!fp)          { +                LLError::LLUserWarningMsg::showMissingFiles();                  LL_ERRS() << "can't open: " << fileName << LL_ENDL;                  return false;          } diff --git a/indra/llcommon/llfile.cpp b/indra/llcommon/llfile.cpp index 53659ac13f..a539e4fe28 100644 --- a/indra/llcommon/llfile.cpp +++ b/indra/llcommon/llfile.cpp @@ -35,7 +35,6 @@  #if LL_WINDOWS  #include "llwin32headers.h" -#include <stdlib.h>                 // Windows errno  #include <vector>  #else  #include <errno.h> @@ -49,6 +48,86 @@ static std::string empty;  // variants of strerror() to report errors.  #if LL_WINDOWS +// For the situations where we directly call into Windows API functions we need to translate +// the Windows error codes into errno values +namespace +{ +    struct errentry +    { +        unsigned long oserr; // Windows OS error value +        int errcode;         // System V error code +    }; +} + +// translation table between Windows OS error value and System V errno code +static errentry const errtable[] +{ +    { ERROR_INVALID_FUNCTION,       EINVAL    },  //    1 +    { ERROR_FILE_NOT_FOUND,         ENOENT    },  //    2 +    { ERROR_PATH_NOT_FOUND,         ENOENT    },  //    3 +    { ERROR_TOO_MANY_OPEN_FILES,    EMFILE    },  //    4 +    { ERROR_ACCESS_DENIED,          EACCES    },  //    5 +    { ERROR_INVALID_HANDLE,         EBADF     },  //    6 +    { ERROR_ARENA_TRASHED,          ENOMEM    },  //    7 +    { ERROR_NOT_ENOUGH_MEMORY,      ENOMEM    },  //    8 +    { ERROR_INVALID_BLOCK,          ENOMEM    },  //    9 +    { ERROR_BAD_ENVIRONMENT,        E2BIG     },  //   10 +    { ERROR_BAD_FORMAT,             ENOEXEC   },  //   11 +    { ERROR_INVALID_ACCESS,         EINVAL    },  //   12 +    { ERROR_INVALID_DATA,           EINVAL    },  //   13 +    { ERROR_INVALID_DRIVE,          ENOENT    },  //   15 +    { ERROR_CURRENT_DIRECTORY,      EACCES    },  //   16 +    { ERROR_NOT_SAME_DEVICE,        EXDEV     },  //   17 +    { ERROR_NO_MORE_FILES,          ENOENT    },  //   18 +    { ERROR_LOCK_VIOLATION,         EACCES    },  //   33 +    { ERROR_BAD_NETPATH,            ENOENT    },  //   53 +    { ERROR_NETWORK_ACCESS_DENIED,  EACCES    },  //   65 +    { ERROR_BAD_NET_NAME,           ENOENT    },  //   67 +    { ERROR_FILE_EXISTS,            EEXIST    },  //   80 +    { ERROR_CANNOT_MAKE,            EACCES    },  //   82 +    { ERROR_FAIL_I24,               EACCES    },  //   83 +    { ERROR_INVALID_PARAMETER,      EINVAL    },  //   87 +    { ERROR_NO_PROC_SLOTS,          EAGAIN    },  //   89 +    { ERROR_DRIVE_LOCKED,           EACCES    },  //  108 +    { ERROR_BROKEN_PIPE,            EPIPE     },  //  109 +    { ERROR_DISK_FULL,              ENOSPC    },  //  112 +    { ERROR_INVALID_TARGET_HANDLE,  EBADF     },  //  114 +    { ERROR_WAIT_NO_CHILDREN,       ECHILD    },  //  128 +    { ERROR_CHILD_NOT_COMPLETE,     ECHILD    },  //  129 +    { ERROR_DIRECT_ACCESS_HANDLE,   EBADF     },  //  130 +    { ERROR_NEGATIVE_SEEK,          EINVAL    },  //  131 +    { ERROR_SEEK_ON_DEVICE,         EACCES    },  //  132 +    { ERROR_DIR_NOT_EMPTY,          ENOTEMPTY },  //  145 +    { ERROR_NOT_LOCKED,             EACCES    },  //  158 +    { ERROR_BAD_PATHNAME,           ENOENT    },  //  161 +    { ERROR_MAX_THRDS_REACHED,      EAGAIN    },  //  164 +    { ERROR_LOCK_FAILED,            EACCES    },  //  167 +    { ERROR_ALREADY_EXISTS,         EEXIST    },  //  183 +    { ERROR_FILENAME_EXCED_RANGE,   ENOENT    },  //  206 +    { ERROR_NESTING_NOT_ALLOWED,    EAGAIN    },  //  215 +    { ERROR_NO_UNICODE_TRANSLATION, EILSEQ    },  // 1113 +    { ERROR_NOT_ENOUGH_QUOTA,       ENOMEM    }   // 1816 +}; + +static int set_errno_from_oserror(unsigned long oserr) +{ +    if (!oserr) +        return 0; + +    // Check the table for the Windows OS error code +    for (const struct errentry &entry : errtable) +    { +        if (oserr == entry.oserr) +        { +            _set_errno(entry.errcode); +            return -1; +        } +    } + +    _set_errno(EINVAL); +    return -1; +} +  // On Windows, use strerror_s().  std::string strerr(int errn)  { @@ -57,7 +136,67 @@ std::string strerr(int errn)      return buffer;  } -typedef std::basic_ios<char,std::char_traits < char > > _Myios; +inline bool is_slash(wchar_t const c) +{ +    return c == L'\\' || c == L'/'; +} + +static std::wstring utf8path_to_wstring(const std::string& utf8path) +{ +    if (utf8path.size() >= MAX_PATH) +    { +        // By prepending "\\?\" to a path, Windows widechar file APIs will not fail on long path names +        std::wstring utf16path = L"\\\\?\\" + ll_convert<std::wstring>(utf8path); +        // We need to make sure that the path does not contain forward slashes as above +        // prefix does bypass the path normalization that replaces slashes with backslashes +        // before passing the path to kernel mode APIs +        std::replace(utf16path.begin(), utf16path.end(), L'/', L'\\'); +        return utf16path; +    } +    return ll_convert<std::wstring>(utf8path); +} + +static unsigned short get_fileattr(const std::wstring& utf16path, bool dontFollowSymLink = false) +{ +    unsigned long  flags = FILE_FLAG_BACKUP_SEMANTICS; +    if (dontFollowSymLink) +    { +        flags |= FILE_FLAG_OPEN_REPARSE_POINT; +    } +    HANDLE file_handle = CreateFileW(utf16path.c_str(), FILE_READ_ATTRIBUTES, +                                     FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, +                                     nullptr, OPEN_EXISTING, flags, nullptr); +    if (file_handle != INVALID_HANDLE_VALUE) +    { +        FILE_ATTRIBUTE_TAG_INFO attribute_info; +        if (GetFileInformationByHandleEx(file_handle, FileAttributeTagInfo, &attribute_info, sizeof(attribute_info))) +        { +            // A volume path alone (only drive letter) is not recognized as directory while it technically is +            bool is_directory = (attribute_info.FileAttributes & FILE_ATTRIBUTE_DIRECTORY) || +                                (iswalpha(utf16path[0]) && utf16path[1] == ':' && +                                 (!utf16path[2] || (is_slash(utf16path[2]) && !utf16path[3]))); +            unsigned short st_mode = is_directory ? S_IFDIR : +                                     (attribute_info.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT ? S_IFLNK : S_IFREG); +            st_mode |= (attribute_info.FileAttributes & FILE_ATTRIBUTE_READONLY) ? S_IREAD : S_IREAD | S_IWRITE; +            // we do not try to guess executable flag + +            // propagate user bits to group/other fields: +            st_mode |= (st_mode & 0700) >> 3; +            st_mode |= (st_mode & 0700) >> 6; + +            CloseHandle(file_handle); +            return st_mode; +        } +    } +    // Retrieve last error and set errno before calling CloseHandle() +    set_errno_from_oserror(GetLastError()); + +    if (file_handle != INVALID_HANDLE_VALUE) +    { +        CloseHandle(file_handle); +    } +    return 0; +}  #else  // On Posix we want to call strerror_r(), but alarmingly, there are two @@ -108,18 +247,13 @@ std::string strerr(int errn)  }  #endif  // ! LL_WINDOWS -// On either system, shorthand call just infers global 'errno'. -std::string strerr() -{ -    return strerr(errno); -} - -int warnif(const std::string& desc, const std::string& filename, int rc, int accept=0) +static int warnif(const std::string& desc, const std::string& filename, int rc, int accept = 0)  {      if (rc < 0)      {          // Capture errno before we start emitting output          int errn = errno; +          // For certain operations, a particular errno value might be          // acceptable -- e.g. stat() could permit ENOENT, mkdir() could permit          // EEXIST. Don't warn if caller explicitly says this errno is okay. @@ -176,62 +310,59 @@ int warnif(const std::string& desc, const std::string& filename, int rc, int acc  // static  int LLFile::mkdir(const std::string& dirname, int perms)  { +    // We often use mkdir() to ensure the existence of a directory that might +    // already exist. There is no known case in which we want to call out as +    // an error the requested directory already existing.  #if LL_WINDOWS      // permissions are ignored on Windows -    std::wstring utf16dirname = ll_convert<std::wstring>(dirname); -    int rc = _wmkdir(utf16dirname.c_str()); +    int rc = 0; +    std::wstring utf16dirname = utf8path_to_wstring(dirname); +    if (!CreateDirectoryW(utf16dirname.c_str(), nullptr)) +    { +        // Only treat other errors than an already existing file as a real error +        unsigned long oserr = GetLastError(); +        if (oserr != ERROR_ALREADY_EXISTS) +        { +            rc = set_errno_from_oserror(oserr); +        } +    }  #else      int rc = ::mkdir(dirname.c_str(), (mode_t)perms); -#endif -    // We often use mkdir() to ensure the existence of a directory that might -    // already exist. There is no known case in which we want to call out as -    // an error the requested directory already existing.      if (rc < 0 && errno == EEXIST)      {          // this is not the error you want, move along          return 0;      } +#endif      // anything else might be a problem -    return warnif("mkdir", dirname, rc, EEXIST); +    return warnif("mkdir", dirname, rc);  }  // static -int LLFile::rmdir(const std::string& dirname) +int LLFile::rmdir(const std::string& dirname, int suppress_error)  {  #if LL_WINDOWS -    // permissions are ignored on Windows -    std::wstring utf16dirname = ll_convert<std::wstring>(dirname); +    std::wstring utf16dirname = utf8path_to_wstring(dirname);      int rc = _wrmdir(utf16dirname.c_str());  #else      int rc = ::rmdir(dirname.c_str());  #endif -    return warnif("rmdir", dirname, rc); +    return warnif("rmdir", dirname, rc, suppress_error);  }  // static -LLFILE* LLFile::fopen(const std::string& filename, const char* mode)    /* Flawfinder: ignore */ -{ -#if LL_WINDOWS -    std::wstring utf16filename = ll_convert<std::wstring>(filename); -    std::wstring utf16mode = ll_convert<std::wstring>(std::string(mode)); -    return _wfopen(utf16filename.c_str(),utf16mode.c_str()); -#else -    return ::fopen(filename.c_str(),mode);  /* Flawfinder: ignore */ -#endif -} - -LLFILE* LLFile::_fsopen(const std::string& filename, const char* mode, int sharingFlag) +LLFILE* LLFile::fopen(const std::string& filename, const char* mode)  {  #if LL_WINDOWS -    std::wstring utf16filename = ll_convert<std::wstring>(filename); +    std::wstring utf16filename = utf8path_to_wstring(filename);      std::wstring utf16mode = ll_convert<std::wstring>(std::string(mode)); -    return _wfsopen(utf16filename.c_str(),utf16mode.c_str(),sharingFlag); +    return _wfopen(utf16filename.c_str(), utf16mode.c_str());  #else -    llassert(0);//No corresponding function on non-windows -    return NULL; +    return ::fopen(filename.c_str(),mode);  #endif  } +// static  int LLFile::close(LLFILE * file)  {      int ret_value = 0; @@ -242,9 +373,10 @@ int LLFile::close(LLFILE * file)      return ret_value;  } +// static  std::string LLFile::getContents(const std::string& filename)  { -    LLFILE* fp = fopen(filename, "rb"); /* Flawfinder: ignore */ +    LLFILE* fp = LLFile::fopen(filename, "rb");      if (fp)      {          fseek(fp, 0, SEEK_END); @@ -261,42 +393,80 @@ std::string LLFile::getContents(const std::string& filename)      return LLStringUtil::null;  } -int LLFile::remove(const std::string& filename, int supress_error) +// static +int LLFile::remove(const std::string& filename, int suppress_error)  {  #if LL_WINDOWS -    std::wstring utf16filename = ll_convert<std::wstring>(filename); -    int rc = _wremove(utf16filename.c_str()); +    // Posix remove() works on both files and directories although on Windows +    // remove() and its wide char variant _wremove() only removes files just +    // as its siblings unlink() and _wunlink(). +    // If we really only want to support files we should instead use +    // unlink() in the non-Windows part below too +    int rc = -1; +    std::wstring utf16filename = utf8path_to_wstring(filename); +    unsigned short st_mode = get_fileattr(utf16filename); +    if (S_ISDIR(st_mode)) +    { +        rc = _wrmdir(utf16filename.c_str()); +    } +    else if (S_ISREG(st_mode)) +    { +        rc = _wunlink(utf16filename.c_str()); +    } +    else if (st_mode) +    { +        // it is something else than a file or directory +        // this should not really happen as long as we do not allow for symlink +        // detection in the optional parameter to get_fileattr() +        rc = set_errno_from_oserror(ERROR_INVALID_PARAMETER); +    } +    else +    { +        // get_fileattr() failed and already set errno, preserve it for correct error reporting +    }  #else      int rc = ::remove(filename.c_str());  #endif -    return warnif("remove", filename, rc, supress_error); +    return warnif("remove", filename, rc, suppress_error);  } -int LLFile::rename(const std::string& filename, const std::string& newname, int supress_error) +// static +int LLFile::rename(const std::string& filename, const std::string& newname, int suppress_error)  {  #if LL_WINDOWS -    std::wstring utf16filename = ll_convert<std::wstring>(filename); -    std::wstring utf16newname = ll_convert<std::wstring>(newname); -    int rc = _wrename(utf16filename.c_str(),utf16newname.c_str()); +    // Posix rename() will gladly overwrite a file at newname if it exists, the Windows +    // rename(), respectively _wrename(), will bark on that. Instead call directly the Windows +    // API MoveFileEx() and use its flags to specify that overwrite is allowed. +    std::wstring utf16filename = utf8path_to_wstring(filename); +    std::wstring utf16newname = utf8path_to_wstring(newname); +    int rc = 0; +    if (!MoveFileExW(utf16filename.c_str(), utf16newname.c_str(), MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED)) +    { +        rc = set_errno_from_oserror(GetLastError()); +    }  #else      int rc = ::rename(filename.c_str(),newname.c_str());  #endif -    return warnif(STRINGIZE("rename to '" << newname << "' from"), filename, rc, supress_error); +    return warnif(STRINGIZE("rename to '" << newname << "' from"), filename, rc, suppress_error);  } +// Make this a define rather than using magic numbers multiple times in the code +#define LLFILE_COPY_BUFFER_SIZE 16384 + +// static  bool LLFile::copy(const std::string& from, const std::string& to)  {      bool copied = false; -    LLFILE* in = LLFile::fopen(from, "rb");     /* Flawfinder: ignore */ +    LLFILE* in = LLFile::fopen(from, "rb");      if (in)      { -        LLFILE* out = LLFile::fopen(to, "wb");      /* Flawfinder: ignore */ +        LLFILE* out = LLFile::fopen(to, "wb");          if (out)          { -            char buf[16384];        /* Flawfinder: ignore */ +            char buf[LLFILE_COPY_BUFFER_SIZE];              size_t readbytes;              bool write_ok = true; -            while(write_ok && (readbytes = fread(buf, 1, 16384, in))) /* Flawfinder: ignore */ +            while (write_ok && (readbytes = fread(buf, 1, LLFILE_COPY_BUFFER_SIZE, in)))              {                  if (fwrite(buf, 1, readbytes, out) != readbytes)                  { @@ -315,33 +485,62 @@ bool LLFile::copy(const std::string& from, const std::string& to)      return copied;  } -int LLFile::stat(const std::string& filename, llstat* filestatus) +// static +int LLFile::stat(const std::string& filename, llstat* filestatus, int suppress_error)  {  #if LL_WINDOWS -    std::wstring utf16filename = ll_convert<std::wstring>(filename); -    int rc = _wstat(utf16filename.c_str(),filestatus); +    std::wstring utf16filename = utf8path_to_wstring(filename); +    int rc = _wstat64(utf16filename.c_str(), filestatus);  #else -    int rc = ::stat(filename.c_str(),filestatus); +    int rc = ::stat(filename.c_str(), filestatus);  #endif -    // We use stat() to determine existence (see isfile(), isdir()). -    // Don't spam the log if the subject pathname doesn't exist. -    return warnif("stat", filename, rc, ENOENT); +    return warnif("stat", filename, rc, suppress_error);  } -bool LLFile::isdir(const std::string& filename) +// static +unsigned short LLFile::getattr(const std::string& filename, bool dontFollowSymLink, int suppress_error)  { -    llstat st; +#if LL_WINDOWS +    // _wstat64() is a bit heavyweight on Windows, use a more lightweight API +    // to just get the attributes +    int rc = -1; +    std::wstring utf16filename = utf8path_to_wstring(filename); +    unsigned short st_mode = get_fileattr(utf16filename, dontFollowSymLink); +    if (st_mode) +    { +        return st_mode; +    } +#else +    llstat filestatus; +    int rc = dontFollowSymLink ? ::lstat(filename.c_str(), &filestatus) : ::stat(filename.c_str(), &filestatus); +    if (rc == 0) +    { +        return filestatus.st_mode; +    } +#endif +    warnif("getattr", filename, rc, suppress_error); +    return 0; +} -    return stat(filename, &st) == 0 && S_ISDIR(st.st_mode); +// static +bool LLFile::isdir(const std::string& filename) +{ +    return S_ISDIR(getattr(filename));  } +// static  bool LLFile::isfile(const std::string& filename)  { -    llstat st; +    return S_ISREG(getattr(filename)); +} -    return stat(filename, &st) == 0 && S_ISREG(st.st_mode); +// static +bool LLFile::islink(const std::string& filename) +{ +    return S_ISLNK(getattr(filename, true));  } +// static  const char *LLFile::tmpdir()  {      static std::string utf8path; @@ -368,75 +567,8 @@ const char *LLFile::tmpdir()      return utf8path.c_str();  } - -/***************** Modified file stream created to overcome the incorrect behaviour of posix fopen in windows *******************/ -  #if LL_WINDOWS -LLFILE *    LLFile::_Fiopen(const std::string& filename, -        std::ios::openmode mode) -{   // open a file -    static const char *mods[] = -    {   // fopen mode strings corresponding to valid[i] -    "r", "w", "w", "a", "rb", "wb", "wb", "ab", -    "r+", "w+", "a+", "r+b", "w+b", "a+b", -    0}; -    static const int valid[] = -    {   // valid combinations of open flags -        ios_base::in, -        ios_base::out, -        ios_base::out | ios_base::trunc, -        ios_base::out | ios_base::app, -        ios_base::in | ios_base::binary, -        ios_base::out | ios_base::binary, -        ios_base::out | ios_base::trunc | ios_base::binary, -        ios_base::out | ios_base::app | ios_base::binary, -        ios_base::in | ios_base::out, -        ios_base::in | ios_base::out | ios_base::trunc, -        ios_base::in | ios_base::out | ios_base::app, -        ios_base::in | ios_base::out | ios_base::binary, -        ios_base::in | ios_base::out | ios_base::trunc -            | ios_base::binary, -        ios_base::in | ios_base::out | ios_base::app -            | ios_base::binary, -    0}; - -    LLFILE *fp = 0; -    int n; -    ios_base::openmode atendflag = mode & ios_base::ate; -    ios_base::openmode norepflag = mode & ios_base::_Noreplace; - -    if (mode & ios_base::_Nocreate) -        mode |= ios_base::in;   // file must exist -    mode &= ~(ios_base::ate | ios_base::_Nocreate | ios_base::_Noreplace); -    for (n = 0; valid[n] != 0 && valid[n] != mode; ++n) -        ;   // look for a valid mode - -    if (valid[n] == 0) -        return (0); // no valid mode -    else if (norepflag && mode & (ios_base::out | ios_base::app) -        && (fp = LLFile::fopen(filename, "r")) != 0)    /* Flawfinder: ignore */ -        {   // file must not exist, close and fail -        fclose(fp); -        return (0); -        } -    else if (fp != 0 && fclose(fp) != 0) -        return (0); // can't close after test open -// should open with protection here, if other than default -    else if ((fp = LLFile::fopen(filename, mods[n])) == 0)  /* Flawfinder: ignore */ -        return (0); // open failed - -    if (!atendflag || fseek(fp, 0, SEEK_END) == 0) -        return (fp);    // no need to seek to end, or seek succeeded - -    fclose(fp); // can't position at end -    return (0); -} - -#endif /* LL_WINDOWS */ - - -#if LL_WINDOWS  /************** input file stream ********************************/  llifstream::llifstream() {} diff --git a/indra/llcommon/llfile.h b/indra/llcommon/llfile.h index 1661cbeb55..04a2946ac4 100644 --- a/indra/llcommon/llfile.h +++ b/indra/llcommon/llfile.h @@ -41,8 +41,9 @@ typedef FILE    LLFILE;  #include <sys/stat.h>  #if LL_WINDOWS -// windows version of stat function and stat data structure are called _stat -typedef struct _stat    llstat; +// The Windows version of stat function and stat data structure are called _stat64 +// We use _stat64 here to support 64-bit st_size and time_t values +typedef struct _stat64  llstat;  #else  typedef struct stat     llstat;  #include <sys/types.h> @@ -56,35 +57,110 @@ typedef struct stat     llstat;  # define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR)  #endif +// Windows C runtime library does not define this and does not support symlink detection in the +// stat functions but we do in our getattr() function +#ifndef S_IFLNK +#define S_IFLNK 0xA000 /* symlink */ +#endif + +#ifndef S_ISLNK +#define S_ISLNK(x) (((x) & S_IFMT) == S_IFLNK) +#endif +  #include "llstring.h" // safe char* -> std::string conversion +/// LLFile is a class of static functions operating on paths +/// All the functions with a path string input take UTF8 path/filenames  class LL_COMMON_API LLFile  {  public: -    // All these functions take UTF8 path/filenames. -    static  LLFILE* fopen(const std::string& filename,const char* accessmode);  /* Flawfinder: ignore */ -    static  LLFILE* _fsopen(const std::string& filename,const char* accessmode,int  sharingFlag); +    /// open a file with the specified access mode +    static  LLFILE* fopen(const std::string& filename, const char* accessmode);  /* Flawfinder: ignore */ +    ///< 'accessmode' follows the rules of the Posix fopen() mode parameter +    /// "r" open the file for reading only and positions the stream at the beginning +    /// "r+" open the file for reading and writing and positions the stream at the beginning +    /// "w" open the file for reading and writing and truncate it to zero length +    /// "w+" open or create the file for reading and writing and truncate to zero length if it existed +    /// "a" open the file for reading and writing and position the stream at the end of the file +    /// "a+" open or create the file for reading and writing and position the stream at the end of the file +    /// +    /// in addition to these values, "b" can be appended to indicate binary stream access, but on Linux and Mac +    /// this is strictly for compatibility and has no effect. On Windows this makes the file functions not +    /// try to translate line endings. Windows also allows to append "t" to indicate text mode. If neither +    /// "b" or "t" is defined, Windows uses the value set by _fmode which by default is _O_TEXT. +    /// This means that it is always a good idea to append "b" specifically for binary file access to +    /// avoid corruption of the binary consistency of the data stream when reading or writing +    /// Other characters in 'accessmode' will usually cause an error as fopen will verify this parameter +    /// @returns a valid LLFILE* pointer on success or NULL on failure      static  int     close(LLFILE * file); +    /// retrieve the content of a file into a string      static std::string getContents(const std::string& filename); +    ///< @returns the content of the file or an empty string on failure -    // perms is a permissions mask like 0777 or 0700.  In most cases it will -    // be overridden by the user's umask.  It is ignored on Windows. -    // mkdir() considers "directory already exists" to be SUCCESS. +    /// create a directory      static  int     mkdir(const std::string& filename, int perms = 0700); - -    static  int     rmdir(const std::string& filename); -    static  int     remove(const std::string& filename, int supress_error = 0); -    static  int     rename(const std::string& filename,const std::string& newname, int supress_error = 0); +    ///< perms is a permissions mask like 0777 or 0700.  In most cases it will be +    ///  overridden by the user's umask. It is ignored on Windows. +    ///  mkdir() considers "directory already exists" to be not an error. +    ///  @returns 0 on success and -1 on failure. + +    //// remove a directory +    static  int     rmdir(const std::string& filename, int suppress_error = 0); +    ///< pass ENOENT in the optional 'suppress_error' parameter +    ///  if you don't want a warning in the log when the directory does not exist +    ///  @returns 0 on success and -1 on failure. + +    /// remove a file or directory +    static  int     remove(const std::string& filename, int suppress_error = 0); +    ///< pass ENOENT in the optional 'suppress_error' parameter +    ///  if you don't want a warning in the log when the directory does not exist +    ///  @returns 0 on success and -1 on failure. + +    /// rename a file +    static  int     rename(const std::string& filename, const std::string& newname, int suppress_error = 0); +    ///< it will silently overwrite newname if it exists without returning an error +    ///  Posix guarantees that if newname already exists, then there will be no moment +    ///  in which for other processes newname does not exist. There is no such guarantee +    ///  under Windows at this time. It may do it in the same way but the used Windows API +    ///  does not make such guarantees. +    ///  @returns 0 on success and -1 on failure. + + +    /// copy the contents of file from 'from' to 'to' filename      static  bool    copy(const std::string& from, const std::string& to); - -    static  int     stat(const std::string& filename,llstat*    file_status); -    static  bool    isdir(const std::string&    filename); -    static  bool    isfile(const std::string&   filename); -    static  LLFILE *    _Fiopen(const std::string& filename, -            std::ios::openmode mode); - +    ///< @returns true on success and false on failure. + +    /// return the file stat structure for filename +    static  int     stat(const std::string& filename, llstat* file_status, int suppress_error = ENOENT); +    ///< for compatibility with existing uses of LL_File::stat() we use ENOENT as default in the +    ///  optional 'suppress_error' parameter to avoid spamming the log with warnings when the API +    ///  is used to detect if a file exists +    ///  @returns 0 on success and -1 on failure. + +    /// get the file or directory attributes for filename +    static  unsigned short getattr(const std::string& filename, bool dontFollowSymLink = false, int suppress_error = ENOENT); +    ///< a more lightweight function on Windows to stat, that just returns the file attribute flags +    ///  dontFollowSymLinks set to true returns the attributes of the symlink if it is one, rather than resolving it +    ///  we pass by default ENOENT in the optional 'suppress_error' parameter to not spam the log with +    ///  warnings when the file or directory does not exist +    ///  @returns 0 on failure and a st_mode value with either S_IFDIR or S_IFREG set otherwise +    ///  together with the three access bits which under Windows only the write bit is relevant. + +    /// check if filename is an existing directory +    static  bool    isdir(const std::string& filename); +    ///< @returns true if the path is for an existing directory + +    /// check if filename is an existing file +    static  bool    isfile(const std::string& filename); +    ///< @returns true if the path is for an existing file + +    /// check if filename is a symlink +    static  bool    islink(const std::string& filename); +    ///< @returns true if the path is pointing at a symlink + +    /// return a path to the temporary directory on the system      static  const char * tmpdir();  }; diff --git a/indra/llcommon/llleap.cpp b/indra/llcommon/llleap.cpp index 662a2511cd..ada6b9519e 100644 --- a/indra/llcommon/llleap.cpp +++ b/indra/llcommon/llleap.cpp @@ -188,6 +188,17 @@ public:                                 << childout.peek(0, peeklen) << "..." << LL_ENDL;          } +        // Handle any remaining stderr data (partial lines) the same way as we do +        // for stdout: log it. +        LLProcess::ReadPipe& childerr(mChild->getReadPipe(LLProcess::STDERR)); +        if (childerr.size()) +        { +            LLProcess::ReadPipe::size_type +                peeklen((std::min)(LLProcess::ReadPipe::size_type(50), childerr.size())); +            LL_WARNS("LLLeap") << "Final stderr " << childerr.size() << " bytes: " +                               << childerr.peek(0, peeklen) << "..." << LL_ENDL; +        } +          // Kill this instance. MUST BE LAST before return!          delete this;          return false; diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 2c46c59aa5..edc891f5ec 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -1357,10 +1357,6 @@ bool gunzip_file(const std::string& srcfile, const std::string& dstfile)      } while(gzeof(src) == 0);      fclose(dst);      dst = NULL; -#if LL_WINDOWS -    // Rename in windows needs the dstfile to not exist. -    LLFile::remove(dstfile, ENOENT); -#endif      if (LLFile::rename(tmpfile, dstfile) == -1) goto err;       /* Flawfinder: ignore */      retval = true;  err: @@ -1408,10 +1404,6 @@ bool gzip_file(const std::string& srcfile, const std::string& dstfile)      gzclose(dst);      dst = NULL; -#if LL_WINDOWS -    // Rename in windows needs the dstfile to not exist. -    LLFile::remove(dstfile); -#endif      if (LLFile::rename(tmpfile, dstfile) == -1) goto err;       /* Flawfinder: ignore */      retval = true;   err: diff --git a/indra/llcommon/tests/llprocess_test.cpp b/indra/llcommon/tests/llprocess_test.cpp index b63cc52bec..13422612d6 100644 --- a/indra/llcommon/tests/llprocess_test.cpp +++ b/indra/llcommon/tests/llprocess_test.cpp @@ -54,14 +54,29 @@ std::string apr_strerror_helper(apr_status_t rv)  *****************************************************************************/  #define ensure_equals_(left, right) \ -        ensure_equals(STRINGIZE(#left << " != " << #right), (left), (right)) +do { \ +    auto _left_val = (left); \ +    auto _right_val = (right); \ +    if (_left_val != _right_val) { \ +        std::string _msg = std::string(#left) + " != " + std::string(#right); \ +        tut::ensure_equals(_msg, _left_val, _right_val); \ +    } else { \ +        tut::ensure_equals("", _left_val, _right_val); \ +    } \ +} while(0)  #define aprchk(expr) aprchk_(#expr, (expr))  static void aprchk_(const char* call, apr_status_t rv, apr_status_t expected=APR_SUCCESS)  { -    tut::ensure_equals(STRINGIZE(call << " => " << rv << ": " << apr_strerror_helper -                                 (rv)), -                       rv, expected); +    if (rv != expected) +    { +        std::string msg = std::string(call) + " => " + std::to_string(rv) + ": " + apr_strerror_helper(rv); +        tut::ensure_equals(msg, rv, expected); +    } +    else +    { +        tut::ensure_equals("", rv, expected); +    }  }  /** @@ -78,11 +93,14 @@ static std::string readfile(const std::string& pathname, const std::string& desc      std::string use_desc(desc);      if (use_desc.empty())      { -        use_desc = STRINGIZE("in " << pathname); +        use_desc = "in " + pathname;      }      std::ifstream inf(pathname.c_str());      std::string output; -    tut::ensure(STRINGIZE("No output " << use_desc), bool(std::getline(inf, output))); +    if (!std::getline(inf, output)) +    { +        tut::ensure("No output " + use_desc, false); +    }      std::string more;      while (std::getline(inf, more))      { @@ -108,8 +126,8 @@ void waitfor(LLProcess& proc, int timeout=60)      {          yield();      } -    tut::ensure(STRINGIZE("process took longer than " << timeout << " seconds to terminate"), -                i < timeout); +    std::string msg = "process took longer than " + std::to_string(timeout) + " seconds to terminate"; +    tut::ensure(msg, i < timeout);  }  void waitfor(LLProcess::handle h, const std::string& desc, int timeout=60) @@ -119,8 +137,8 @@ void waitfor(LLProcess::handle h, const std::string& desc, int timeout=60)      {          yield();      } -    tut::ensure(STRINGIZE("process took longer than " << timeout << " seconds to terminate"), -                i < timeout); +    std::string msg = "process took longer than " + std::to_string(timeout) + " seconds to terminate"; +    tut::ensure(msg, i < timeout);  }  /** @@ -153,7 +171,8 @@ struct PythonProcessLauncher          try          {              mPy = LLProcess::create(mParams); -            tut::ensure(STRINGIZE("Couldn't launch " << mDesc << " script"), bool(mPy)); +            std::string msg = "Couldn't launch " + mDesc + " script"; +            tut::ensure(msg, bool(mPy));          }          catch (const tut::failure&)          { @@ -214,7 +233,8 @@ struct PythonProcessLauncher          mParams.args.add(out.getName());          run();          // assuming the script wrote to that file, read it -        return readfile(out.getName(), STRINGIZE("from " << mDesc << " script")); +        std::string desc = "from " + mDesc + " script"; +        return readfile(out.getName(), desc);      }      LLProcess::Params mParams; diff --git a/indra/llcorehttp/llhttpconstants.cpp b/indra/llcorehttp/llhttpconstants.cpp index 40d6c7506c..7a671543d9 100755 --- a/indra/llcorehttp/llhttpconstants.cpp +++ b/indra/llcorehttp/llhttpconstants.cpp @@ -100,6 +100,7 @@ const std::string HTTP_IN_HEADER_LOCATION("location");  const std::string HTTP_IN_HEADER_RETRY_AFTER("retry-after");  const std::string HTTP_IN_HEADER_SET_COOKIE("set-cookie");  const std::string HTTP_IN_HEADER_USER_AGENT("user-agent"); +const std::string HTTP_IN_HEADER_X_CONTENT_TYPE_OPTIONS("x-content-type-options");  const std::string HTTP_IN_HEADER_X_FORWARDED_FOR("x-forwarded-for");  const std::string HTTP_CONTENT_LLSD_XML("application/llsd+xml"); @@ -122,6 +123,7 @@ const std::string HTTP_CONTENT_IMAGE_BMP("image/bmp");  const std::string HTTP_NO_CACHE("no-cache");  const std::string HTTP_NO_CACHE_CONTROL("no-cache, max-age=0"); +const std::string HTTP_NOSNIFF("nosniff");  const std::string HTTP_VERB_INVALID("(invalid)");  const std::string HTTP_VERB_HEAD("HEAD"); diff --git a/indra/llcorehttp/llhttpconstants.h b/indra/llcorehttp/llhttpconstants.h index 583f9fbcb7..71c1dfa173 100755 --- a/indra/llcorehttp/llhttpconstants.h +++ b/indra/llcorehttp/llhttpconstants.h @@ -190,6 +190,7 @@ extern const std::string HTTP_IN_HEADER_LOCATION;  extern const std::string HTTP_IN_HEADER_RETRY_AFTER;  extern const std::string HTTP_IN_HEADER_SET_COOKIE;  extern const std::string HTTP_IN_HEADER_USER_AGENT; +extern const std::string HTTP_IN_HEADER_X_CONTENT_TYPE_OPTIONS;  extern const std::string HTTP_IN_HEADER_X_FORWARDED_FOR;  //// HTTP Content Types //// @@ -215,5 +216,6 @@ extern const std::string HTTP_CONTENT_IMAGE_BMP;  //// HTTP Cache Settings ////  extern const std::string HTTP_NO_CACHE;  extern const std::string HTTP_NO_CACHE_CONTROL; +extern const std::string HTTP_NOSNIFF;  #endif diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp index b1b698375a..d5c585b45e 100644 --- a/indra/llcrashlogger/llcrashlogger.cpp +++ b/indra/llcrashlogger/llcrashlogger.cpp @@ -576,10 +576,6 @@ bool LLCrashLogger::init()      std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "crashreport.log.old");      std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "crashreport.log"); -#if LL_WINDOWS -    LLAPRFile::remove(old_log_file); -#endif -      LLFile::rename(log_file.c_str(), old_log_file.c_str());      // Set the log file to crashreport.log diff --git a/indra/llfilesystem/lldir_utils_objc.mm b/indra/llfilesystem/lldir_utils_objc.mm index 01fe9e1f2c..35513d5647 100644 --- a/indra/llfilesystem/lldir_utils_objc.mm +++ b/indra/llfilesystem/lldir_utils_objc.mm @@ -1,28 +1,28 @@ -/**  +/**   * @file lldir_utils_objc.mm   * @brief Cocoa implementation of directory utilities for macOS   *   * $LicenseInfo:firstyear=2020&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2020, Linden Research, Inc. - *  + *   * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public   * License as published by the Free Software Foundation;   * version 2.1 of the License only. - *  + *   * This library is distributed in the hope that it will be useful,   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   * Lesser General Public License for more details. - *  + *   * You should have received a copy of the GNU Lesser General Public   * License along with this library; if not, write to the Free Software   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  + *   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$ - */  + */  #if LL_DARWIN  //WARNING:  This file CANNOT use standard linden includes due to conflicts between definitions of BOOL @@ -39,18 +39,18 @@ std::string getSystemTempFolder()              tempDir = @"/tmp";          result = std::string([tempDir UTF8String]);      } -     +      return result;  } -//findSystemDirectory scoped exclusively to this file.  +//findSystemDirectory scoped exclusively to this file.  std::string findSystemDirectory(NSSearchPathDirectory searchPathDirectory,                                     NSSearchPathDomainMask domainMask)  {      std::string result;      @autoreleasepool {          NSString *path = nil; -         +          // Search for the path          NSArray* paths = NSSearchPathForDirectoriesInDomains(searchPathDirectory,                                                               domainMask, @@ -60,10 +60,10 @@ std::string findSystemDirectory(NSSearchPathDirectory searchPathDirectory,              path = [paths objectAtIndex:0];              //HACK:  Always attempt to create directory, ignore errors.              NSError *error = nil; -             +              [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error]; -             -             + +              result = std::string([path UTF8String]);          }      } @@ -88,7 +88,7 @@ std::string getSystemResourceFolder()          NSString *bundlePath = [[NSBundle mainBundle] resourcePath];          result = std::string([bundlePath UTF8String]);      } -     +      return result;  } @@ -102,7 +102,7 @@ std::string getSystemApplicationSupportFolder()  {      return findSystemDirectory (NSApplicationSupportDirectory,                                  NSUserDomainMask); -     +  }  #endif // LL_DARWIN diff --git a/indra/llfilesystem/llfilesystem.cpp b/indra/llfilesystem/llfilesystem.cpp index 5ce5244107..541266af4f 100644 --- a/indra/llfilesystem/llfilesystem.cpp +++ b/indra/llfilesystem/llfilesystem.cpp @@ -103,9 +103,6 @@ bool LLFileSystem::renameFile(const LLUUID& old_file_id, const LLAssetType::ETyp      const std::string old_filename = LLDiskCache::metaDataToFilepath(old_file_id, old_file_type);      const std::string new_filename = LLDiskCache::metaDataToFilepath(new_file_id, new_file_type); -    // Rename needs the new file to not exist. -    LLFileSystem::removeFile(new_file_id, new_file_type, ENOENT); -      if (LLFile::rename(old_filename, new_filename) != 0)      {          // We would like to return false here indicating the operation diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp index 5b672bf171..9350901324 100644 --- a/indra/llimagej2coj/llimagej2coj.cpp +++ b/indra/llimagej2coj/llimagej2coj.cpp @@ -554,11 +554,6 @@ public:          } -        if (!opj_setup_encoder(encoder, ¶meters, image)) -        { -            return false; -        } -          U32 width_tiles = (rawImageIn.getWidth() >> 6);          U32 height_tiles = (rawImageIn.getHeight() >> 6); @@ -572,6 +567,19 @@ public:              height_tiles = 1;          } +        if (width_tiles == 1 || height_tiles == 1) +        { +            // Images with either dimension less than 32 need less number of resolutions otherwise they error +            int min_dim = rawImageIn.getWidth() < rawImageIn.getHeight() ? rawImageIn.getWidth() : rawImageIn.getHeight(); +            int max_res = 1 + (int)floor(log2(min_dim)); +            parameters.numresolution = max_res; +        } + +        if (!opj_setup_encoder(encoder, ¶meters, image)) +        { +            return false; +        } +          U32 tile_count = width_tiles * height_tiles;          U32 data_size_guess = tile_count * TILE_SIZE; diff --git a/indra/llinventory/llpermissions.cpp b/indra/llinventory/llpermissions.cpp index ebf7445c65..b17e22e465 100644 --- a/indra/llinventory/llpermissions.cpp +++ b/indra/llinventory/llpermissions.cpp @@ -774,6 +774,7 @@ void LLPermissions::importLLSD(const LLSD& sd_perm)          }      } +    fixOwnership();      fix();  } diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index e5521e0ffc..0cf5ecd3d0 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -5713,6 +5713,8 @@ bool LLVolumeFace::cacheOptimize(bool gen_tangents)          {              try              { +                // providing mIndices should help avoid unused vertices +                // but those should have been filtered out on upload                  vert_count = static_cast<S32>(meshopt_generateVertexRemapMulti(&remap[0], nullptr, data.p.size(), data.p.size(), mos, stream_count));              }              catch (std::bad_alloc&) @@ -5722,10 +5724,16 @@ bool LLVolumeFace::cacheOptimize(bool gen_tangents)              }          } -        if (vert_count < 65535 && vert_count != 0) +        // Probably should be using meshopt_remapVertexBuffer instead of remaping manually +        if (vert_count < 65535 && vert_count > 0)          {              //copy results back into volume              resizeVertices(vert_count); +            if (mNumVertices == 0) +            { +                LLError::LLUserWarningMsg::showOutOfMemory(); +                LL_ERRS("LLCoros") << "Failed to allocate memory for resizeVertices(" << vert_count << ")" << LL_ENDL; +            }              if (!data.w.empty())              { @@ -5738,13 +5746,27 @@ bool LLVolumeFace::cacheOptimize(bool gen_tangents)              {                  U32 src_idx = i;                  U32 dst_idx = remap[i]; -                if (dst_idx >= (U32)mNumVertices) +                if (dst_idx == U32_MAX) +                { +                    // Unused indices? Probably need to resize mIndices +                    dst_idx = mNumVertices - 1; +                    llassert(false); +                    LL_DEBUGS_ONCE("LLVOLUME") << "U32_MAX destination index, substituting" << LL_ENDL; +                } +                else if (dst_idx >= (U32)mNumVertices)                  {                      dst_idx = mNumVertices - 1;                      // Shouldn't happen, figure out what gets returned in remap and why.                      llassert(false);                      LL_DEBUGS_ONCE("LLVOLUME") << "Invalid destination index, substituting" << LL_ENDL;                  } +                if (src_idx >= (U32)data.p.size()) +                { +                    // data.p.size() is supposed to be equal to mNumIndices +                    src_idx = (U32)(data.p.size() - 1); +                    llassert(false); +                    LL_DEBUGS_ONCE("LLVOLUME") << "Invalid source index, substituting" << LL_ENDL; +                }                  mIndices[i] = dst_idx;                  mPositions[dst_idx].load3(data.p[src_idx].mV); @@ -5778,7 +5800,7 @@ bool LLVolumeFace::cacheOptimize(bool gen_tangents)          }          else          { -            if (vert_count == 0) +            if (vert_count <= 0)              {                  LL_WARNS_ONCE("LLVOLUME") << "meshopt_generateVertexRemapMulti failed to process a model or model was invalid" << LL_ENDL;              } diff --git a/indra/llmessage/llcoproceduremanager.cpp b/indra/llmessage/llcoproceduremanager.cpp index 563dd9459c..5c7b1c4235 100644 --- a/indra/llmessage/llcoproceduremanager.cpp +++ b/indra/llmessage/llcoproceduremanager.cpp @@ -138,7 +138,22 @@ LLCoprocedureManager::LLCoprocedureManager()  LLCoprocedureManager::~LLCoprocedureManager()  { -    close(); +    try +    { +        close(); +    } +    catch (const boost::fibers::fiber_error&) +    { +        LL_WARNS() << "Fiber error during ~LLCoprocedureManager()" << LL_ENDL; +    } +    catch (const std::exception& e) +    { +        // Shutting down, just log it +        LL_WARNS() << "Exception during ~LLCoprocedureManager(): " << e.what() << LL_ENDL; +    } +    mPropertyQueryFn.clear(); +    mPropertyDefineFn.clear(); +    mPoolMap.clear();  }  void LLCoprocedureManager::initializePool(const std::string &poolName, size_t queue_size) @@ -365,6 +380,22 @@ LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size, s  LLCoprocedurePool::~LLCoprocedurePool()  { +    try +    { +        close(); // should have been closed already, but shouldn't hurt +        mStatusListener.disconnect(); +        mPendingCoprocs.reset(); +        mCoroMapping.clear(); +    } +    catch (const boost::fibers::fiber_error&) +    { +        LL_WARNS() << "Fiber error during ~LLCoprocedurePool() " << mPoolName << LL_ENDL; +    } +    catch (const std::exception& e) +    { +        // Shutting down, just log it +        LL_WARNS() << "Exception " << e.what() << " during ~LLCoprocedurePool() in " << mPoolName << LL_ENDL; +    }  }  //------------------------------------------------------------------------- diff --git a/indra/llphysicsextensionsos/CMakeLists.txt b/indra/llphysicsextensionsos/CMakeLists.txt new file mode 100644 index 0000000000..c04115ef26 --- /dev/null +++ b/indra/llphysicsextensionsos/CMakeLists.txt @@ -0,0 +1,47 @@ +# -*- cmake -*- + +project(llphysicsextensionsos) + +include(00-Common) +include(LLCommon) +include(LLMath) +include(VHACD) + +set(llphysicsextensionsos_SOURCE_FILES +        llconvexdecomposition.cpp +        llconvexdecompositionvhacd.cpp +        llpathinglib.cpp +        LLPathingLibStubImpl.cpp +        llphysicsextensions.cpp +        LLPhysicsExtensionsStubImpl.cpp +        ) + +set(llphysicsextensionsos_HEADER_FILES +        CMakeLists.txt +        llconvexdecomposition.h +        llconvexdecompositionvhacd.h +        llpathinglib.h +        LLPathingLibStubImpl.h +        llphysicsextensions.h +        LLPhysicsExtensionsStubImpl.h +        ) + +set_source_files_properties(${llphysicsextensionsos_HEADER_FILES} +        PROPERTIES HEADER_FILE_ONLY TRUE) + +list(APPEND llphysicsextensionsos_SOURCE_FILES ${llphysicsextensionsos_HEADER_FILES}) + +add_library (llphysicsextensionsos ${llphysicsextensionsos_SOURCE_FILES}) +target_include_directories(llphysicsextensionsos INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) + +target_link_libraries(llphysicsextensionsos +        llcommon +        llmath +        ll::vhacd) + +if(WINDOWS) +  target_compile_options(llphysicsextensionsos PRIVATE /bigobj) +endif() + +# Add tests + diff --git a/indra/llphysicsextensionsos/LLPathingLibStubImpl.cpp b/indra/llphysicsextensionsos/LLPathingLibStubImpl.cpp new file mode 100644 index 0000000000..9830fd1ad0 --- /dev/null +++ b/indra/llphysicsextensionsos/LLPathingLibStubImpl.cpp @@ -0,0 +1,109 @@ +/** +* @file   LLPathingLibStubImpl.cpp +* @author prep@lindenlab.com +* @brief  A stubbed implementation of LLPathingLib +* +* $LicenseInfo:firstyear=2012&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 20112010, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +#include "linden_common.h" + +#include "llpathinglib.h" +#include "LLPathingLibStubImpl.h" + +#include "llsd.h" + +//============================================================================= +LLPathingLibImpl::LLPathingLibImpl() +{ +} + +LLPathingLibImpl::~LLPathingLibImpl() +{ + +} + +LLPathingLib* LLPathingLibImpl::getInstance() +{ +    return NULL; +} + + +LLPathingLib::LLPLResult LLPathingLibImpl::initSystem() +{ +    return LLPL_NOT_IMPLEMENTED; +} + +LLPathingLib::LLPLResult LLPathingLibImpl::quitSystem() +{ +    return LLPL_NOT_IMPLEMENTED; +} + +LLPathingLib::LLPLResult LLPathingLibImpl::extractNavMeshSrcFromLLSD( const LLSD::Binary& dataBlock, int dir ) +{ +    return LLPL_NOT_IMPLEMENTED; +} + +void LLPathingLibImpl::processNavMeshData() +{ +} + +LLPathingLibImpl::LLPLResult LLPathingLibImpl::generatePath( const PathingPacket& pathingPacket ) +{ +    return LLPL_NOT_IMPLEMENTED; +} + +void LLPathingLibImpl::setNavMeshMaterialType( LLPLCharacterType materialType ) +{ +} + +void LLPathingLibImpl::setNavMeshColors( const NavMeshColors& color ) +{ +} + +void LLPathingLibImpl::renderNavMesh() +{ +} + +void LLPathingLibImpl::renderNavMeshEdges() +{ +} + +void LLPathingLibImpl::renderNavMeshShapesVBO( U32 shapeRenderFlags ) +{ +} + +void LLPathingLibImpl::renderPath() +{ +} + +void LLPathingLibImpl::renderPathBookend( LLRender& gl, LLPathingLib::LLPLPathBookEnd type ) +{ +} + +void LLPathingLibImpl::cleanupVBOManager() +{ +} + +void LLPathingLibImpl::cleanupResidual() +{ +} diff --git a/indra/llphysicsextensionsos/LLPathingLibStubImpl.h b/indra/llphysicsextensionsos/LLPathingLibStubImpl.h new file mode 100644 index 0000000000..8a97566e8c --- /dev/null +++ b/indra/llphysicsextensionsos/LLPathingLibStubImpl.h @@ -0,0 +1,78 @@ +/** +* @file   LLPathingLibSubImpl.h +* @author prep@lindenlab.com +* @brief  A stubbed implementation of LLPathingLib +* +* $LicenseInfo:firstyear=2012&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2012, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +#ifndef LL_PATHING_LIB_H +#define LL_PATHING_LIB_H + +#include "llpathinglib.h" + +class LLSD; + +//============================================================================= +class LLPathingLibImpl : public LLPathingLib +{ +public: +    LLPathingLibImpl(); +    virtual ~LLPathingLibImpl(); + +    // Obtain a pointer to the actual implementation +    static LLPathingLib* getInstance(); +    static LLPathingLib::LLPLResult initSystem(); +    static LLPathingLib::LLPLResult quitSystem(); + +    //Extract and store navmesh data from the llsd datablock sent down by the server +    virtual LLPLResult extractNavMeshSrcFromLLSD( const LLSD::Binary& dataBlock, int dir ); +    //Stitch any stored navmeshes together +    virtual void processNavMeshData(); + +    //Method used to generate and visualize a path on the viewers navmesh +    virtual LLPLResult generatePath( const PathingPacket& pathingPacket ); + +    //Set the material type for the heatmap type +    virtual void setNavMeshMaterialType( LLPLCharacterType materialType ); +    //Set the various navmesh colors +    virtual void setNavMeshColors( const NavMeshColors& color ); + +    //The entry method to rendering the client side navmesh +    virtual void renderNavMesh(); +    //The entry method to rendering the client side navmesh edges +    virtual void renderNavMeshEdges(); +    //The entry method to render the client navmesh shapes VBO +    virtual void renderNavMeshShapesVBO( U32 shapeRenderFlags ); +    //The entry method to render the clients designated path +    virtual void renderPath(); +    //The entry method to render the capsule bookends for the clients designated path +    virtual void renderPathBookend( LLRender& gl, LLPathingLib::LLPLPathBookEnd type ); + +    //Method to delete any vbo's that are currently being managed by the pathing library +    virtual void cleanupVBOManager(); +    //Method to cleanup any allocations within the implementation +    virtual void cleanupResidual(); +}; + +#endif //LL_PATHING_LIB_H + diff --git a/indra/llphysicsextensionsos/LLPhysicsExtensionsStubImpl.cpp b/indra/llphysicsextensionsos/LLPhysicsExtensionsStubImpl.cpp new file mode 100644 index 0000000000..8401e16e9c --- /dev/null +++ b/indra/llphysicsextensionsos/LLPhysicsExtensionsStubImpl.cpp @@ -0,0 +1,51 @@ +/** +* @file   LLPhysicsExtensionsStubImpl.cpp +* @author prep@lindenlab.com +* @brief  A stubbed implementation of LLPhysicsExtensions +* +* $LicenseInfo:firstyear=2012&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2012, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +#include "linden_common.h" + +#include "llphysicsextensions.h" +#include "LLPhysicsExtensionsStubImpl.h" + +//============================================================================= +LLPhysicsExtensionsImpl::LLPhysicsExtensionsImpl() +{ +} + +LLPhysicsExtensionsImpl::~LLPhysicsExtensionsImpl() +{ +} + +bool LLPhysicsExtensionsImpl::initSystem() +{ +    return false; +} + +bool LLPhysicsExtensionsImpl::quitSystem() +{ +    return false; +} + diff --git a/indra/llphysicsextensionsos/LLPhysicsExtensionsStubImpl.h b/indra/llphysicsextensionsos/LLPhysicsExtensionsStubImpl.h new file mode 100644 index 0000000000..135f92bb88 --- /dev/null +++ b/indra/llphysicsextensionsos/LLPhysicsExtensionsStubImpl.h @@ -0,0 +1,46 @@ +/** +* @file   LLPhysicsExtensionsSubImpl.h +* @author prep@lindenlab.com +* @brief  A stubbed implementation of LLPhysicsExtensions +* +* $LicenseInfo:firstyear=2012&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2012, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +#ifndef LL_PHYSICS_EXTENSIONS_STUB_IMPL_H +#define LL_PHYSICS_EXTENSIONS_STUB_IMPL_H + +#include "llphysicsextensions.h" + +//============================================================================= +class LLPhysicsExtensionsImpl : public LLPhysicsExtensions +{ +    public: + +        LLPhysicsExtensionsImpl(); +        virtual ~LLPhysicsExtensionsImpl(); + +        static bool initSystem(); +        static bool quitSystem(); +}; + +#endif //LL_PHYSICS_EXTENSIONS_STUB_IMPL_H + diff --git a/indra/llphysicsextensionsos/llconvexdecomposition.cpp b/indra/llphysicsextensionsos/llconvexdecomposition.cpp new file mode 100644 index 0000000000..d58c0fec54 --- /dev/null +++ b/indra/llphysicsextensionsos/llconvexdecomposition.cpp @@ -0,0 +1,84 @@ +/** +* @file   llconvexdecomposition.cpp +* @author falcon@lindenlab.com +* @brief  Inner implementation of LLConvexDecomposition interface +* +* $LicenseInfo:firstyear=2011&license=lgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2011, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +#include <unordered_map> +#include "linden_common.h" + +#include "llconvexdecompositionvhacd.h" +#include "llconvexdecomposition.h" + +bool LLConvexDecomposition::s_isInitialized = false; + +// static +bool LLConvexDecomposition::isFunctional() +{ +    return LLConvexDecompositionVHACD::isFunctional(); +} + +// static +LLConvexDecomposition* LLConvexDecomposition::getInstance() +{ +    if ( !s_isInitialized ) +    { +        return nullptr; +    } +    else +    { +        return LLConvexDecompositionVHACD::getInstance(); +    } +} + +// static +LLCDResult LLConvexDecomposition::initSystem() +{ +    LLCDResult result = LLConvexDecompositionVHACD::initSystem(); +    if ( result == LLCD_OK ) +    { +        s_isInitialized = true; +    } +    return result; +} + +// static +LLCDResult LLConvexDecomposition::initThread() +{ +    return LLConvexDecompositionVHACD::initThread(); +} + +// static +LLCDResult LLConvexDecomposition::quitThread() +{ +    return LLConvexDecompositionVHACD::quitThread(); +} + +// static +LLCDResult LLConvexDecomposition::quitSystem() +{ +    return LLConvexDecompositionVHACD::quitSystem(); +} + + diff --git a/indra/llphysicsextensionsos/llconvexdecomposition.h b/indra/llphysicsextensionsos/llconvexdecomposition.h new file mode 100644 index 0000000000..8008bc6e12 --- /dev/null +++ b/indra/llphysicsextensionsos/llconvexdecomposition.h @@ -0,0 +1,231 @@ +/** + * @file llconvexdecomposition.cpp + * @brief LLConvexDecomposition interface definition + * + * $LicenseInfo:firstyear=2011&license=lgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifndef LL_CONVEX_DECOMPOSITION +#define LL_CONVEX_DECOMPOSITION + +typedef int bool32; + +#if defined(_WIN32) || defined(_WIN64) +#define LLCD_CALL __cdecl +#else +#define LLCD_CALL +#endif + +struct LLCDParam +{ +    enum LLCDParamType +    { +        LLCD_INVALID = 0, +        LLCD_INTEGER, +        LLCD_FLOAT, +        LLCD_BOOLEAN, +        LLCD_ENUM +    }; + +    struct LLCDEnumItem +    { +        const char* mName; +        int         mValue; +    }; + +    union LLCDValue +    { +        float   mFloat; +        int     mIntOrEnumValue; +        bool32  mBool; +    }; + +    union LLCDParamDetails +    { +        struct { +            LLCDValue mLow; +            LLCDValue mHigh; +            LLCDValue mDelta; +        } mRange; + +        struct { +            int             mNumEnums; +            LLCDEnumItem*   mEnumsArray; +        } mEnumValues; +    }; + +    const char*                 mName; +    const char*                 mDescription; +    LLCDParamType               mType; +    LLCDParamDetails            mDetails; +    LLCDValue                   mDefault; +    int                         mStage; + +    // WARNING: Only the LLConvexDecomposition implementation +    // should change this value +    int                         mReserved; +}; + +struct LLCDStageData +{ +    const char* mName; +    const char* mDescription; +    bool32 mSupportsCallback; +}; + +struct LLCDMeshData +{ +    enum IndexType +    { +        INT_16, +        INT_32 +    }; + +    const float*    mVertexBase; +    int             mVertexStrideBytes; +    int             mNumVertices; +    const void*     mIndexBase; +    IndexType       mIndexType; +    int             mIndexStrideBytes; +    int             mNumTriangles; +}; + +struct LLCDHull +{ +    const float*    mVertexBase; +    int             mVertexStrideBytes; +    int             mNumVertices; +}; + +enum LLCDResult +{ +    LLCD_OK = 0, +    LLCD_UNKOWN_ERROR, +    LLCD_NULL_PTR, +    LLCD_INVALID_STAGE, +    LLCD_UNKNOWN_PARAM, +    LLCD_BAD_VALUE, +    LLCD_REQUEST_OUT_OF_RANGE, +    LLCD_INVALID_MESH_DATA, +    LLCD_INVALID_HULL_DATA, +    LLCD_STAGE_NOT_READY, +    LLCD_INVALID_THREAD, +    LLCD_NOT_IMPLEMENTED +}; + +// This callback will receive a string describing the current subtask being performed +// as well as a pair of numbers indicating progress. (The values should not be interpreted +// as a completion percentage as 'current' may be greater than 'final'.) +// If the callback returns zero, the decomposition will be terminated +typedef int             (LLCD_CALL *llcdCallbackFunc)(const char* description, int current_progress, int final_progress); + +class LLConvexDecomposition +{ +public: +    // Obtain a pointer to the actual implementation +    static LLConvexDecomposition* getInstance(); + +    /// @returns false if this is the stub +    static bool isFunctional(); + +    static LLCDResult initSystem(); +    static LLCDResult initThread(); +    static LLCDResult quitThread(); +    static LLCDResult quitSystem(); + +    // Generate a decomposition object handle +    virtual void genDecomposition(int& decomp) = 0; +    // Delete decomposition object handle +    virtual void deleteDecomposition(int decomp) = 0; +    // Bind given decomposition handle +    // Commands operate on currently bound decomposition +    virtual void bindDecomposition(int decomp) = 0; + +    // Sets *paramsOut to the address of the LLCDParam array and returns +    // the number of parameters +    virtual int getParameters(const LLCDParam** paramsOut) = 0; + + +    // Sets *stagesOut to the address of the LLCDStageData array and returns +    // the number of stages +    virtual int getStages(const LLCDStageData** stagesOut) = 0; + + +    // Set a parameter by name. Pass enum values as integers. +    virtual LLCDResult  setParam(const char* name, float val)   = 0; +    virtual LLCDResult  setParam(const char* name, int val)     = 0; +    virtual LLCDResult  setParam(const char* name, bool val)    = 0; + + +    // Set incoming mesh data. Data is copied to local buffers and will +    // persist until the next setMeshData call +    virtual LLCDResult  setMeshData( const LLCDMeshData* data, bool vertex_based ) = 0; + + +    // Register a callback to be called periodically during the specified stage +    // See the typedef above for more information +    virtual LLCDResult  registerCallback( int stage, llcdCallbackFunc callback ) = 0; + + +    // Execute the specified decomposition stage +    virtual LLCDResult  executeStage(int stage) = 0; +    virtual LLCDResult  buildSingleHull() = 0 ; + + +    // Gets the number of hulls generated by the specified decompositions stage +    virtual int getNumHullsFromStage(int stage) = 0; + + +    // Populates hullOut to reference the internal copy of the requested hull +    // The data will persist only until the next executeStage call for that stage. +    virtual LLCDResult  getHullFromStage( int stage, int hull, LLCDHull* hullOut ) = 0; + +    virtual LLCDResult  getSingleHull( LLCDHull* hullOut ) = 0 ; + + +    // TODO: Implement lock of some kind to disallow this call if data not yet ready +    // Populates the meshDataOut to reference the utility's copy of the mesh geometry +    // for the hull and stage specified. +    // You must copy this data if you want to continue using it after the next executeStage +    // call +    virtual LLCDResult  getMeshFromStage( int stage, int hull, LLCDMeshData* meshDataOut) = 0; + + +    // Creates a mesh from hullIn and temporarily stores it internally in the utility. +    // The mesh data persists only until the next call to getMeshFromHull +    virtual LLCDResult  getMeshFromHull( LLCDHull* hullIn, LLCDMeshData* meshOut ) = 0; + +    // Takes meshIn, generates a single convex hull from it, converts that to a mesh +    // stored internally, and populates meshOut to reference the internally stored data. +    // The data is persistent only until the next call to generateSingleHullMeshFromMesh +    virtual LLCDResult generateSingleHullMeshFromMesh( LLCDMeshData* meshIn, LLCDMeshData* meshOut) = 0; + +    // +    /// Debug +    virtual void loadMeshData(const char* fileIn, LLCDMeshData** meshDataOut) = 0; + +private: +    static bool s_isInitialized; +}; + +#endif //LL_CONVEX_DECOMPOSITION + diff --git a/indra/llphysicsextensionsos/llconvexdecompositionvhacd.cpp b/indra/llphysicsextensionsos/llconvexdecompositionvhacd.cpp new file mode 100644 index 0000000000..78876f9f36 --- /dev/null +++ b/indra/llphysicsextensionsos/llconvexdecompositionvhacd.cpp @@ -0,0 +1,492 @@ +/** +* @file   llconvexdecompositionvhacd.cpp +* @author rye@alchemyviewer.org +* @brief  A VHACD based implementation of LLConvexDecomposition +* +* $LicenseInfo:firstyear=2025&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2025, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +#include "linden_common.h" + +#include "llmath.h" +#include "v3math.h" + +#include <string.h> +#include <memory> + +#define ENABLE_VHACD_IMPLEMENTATION 1 +#include "VHACD.h" + +#include "llconvexdecompositionvhacd.h" + +constexpr S32 MAX_HULLS = 256; +constexpr S32 MAX_VERTICES_PER_HULL = 256; + +bool LLConvexDecompositionVHACD::isFunctional() +{ +    return true; +} + +LLConvexDecomposition* LLConvexDecompositionVHACD::getInstance() +{ +    return LLSimpleton::getInstance(); +} + +LLCDResult LLConvexDecompositionVHACD::initSystem() +{ +    createInstance(); +    return LLCD_OK; +} + +LLCDResult LLConvexDecompositionVHACD::initThread() +{ +    return LLCD_OK; +} + +LLCDResult LLConvexDecompositionVHACD::quitThread() +{ +    return LLCD_OK; +} + +LLCDResult LLConvexDecompositionVHACD::quitSystem() +{ +    deleteSingleton(); +    return LLCD_OK; +} + +LLConvexDecompositionVHACD::LLConvexDecompositionVHACD() +{ +    //Create our vhacd instance and setup default parameters +    mVHACD = VHACD::CreateVHACD(); + +    mVHACDParameters.m_callback = &mVHACDCallback; +    mVHACDParameters.m_logger = &mVHACDLogger; + +    mDecompStages[0].mName = "Analyze"; +    mDecompStages[0].mDescription = nullptr; + +    LLCDParam param; +    param.mName = "Fill Mode"; +    param.mDescription = nullptr; +    param.mType = LLCDParam::LLCD_ENUM; +    param.mDetails.mEnumValues.mNumEnums = 3; + +    static LLCDParam::LLCDEnumItem fill_enums[3]; +    fill_enums[(size_t)VHACD::FillMode::FLOOD_FILL].mName = "Flood"; +    fill_enums[(size_t)VHACD::FillMode::FLOOD_FILL].mValue = (int)VHACD::FillMode::FLOOD_FILL; +    fill_enums[(size_t)VHACD::FillMode::SURFACE_ONLY].mName = "Surface Only"; +    fill_enums[(size_t)VHACD::FillMode::SURFACE_ONLY].mValue = (int)VHACD::FillMode::SURFACE_ONLY; +    fill_enums[(size_t)VHACD::FillMode::RAYCAST_FILL].mName = "Raycast"; +    fill_enums[(size_t)VHACD::FillMode::RAYCAST_FILL].mValue = (int)VHACD::FillMode::RAYCAST_FILL; + +    param.mDetails.mEnumValues.mEnumsArray = fill_enums; +    param.mDefault.mIntOrEnumValue = (int)VHACD::FillMode::FLOOD_FILL; +    param.mStage = 0; +    param.mReserved = -1; +    mDecompParams.push_back(param); + +    enum EVoxelQualityLevels +    { +        E_LOW_QUALITY = 0, +        E_NORMAL_QUALITY, +        E_HIGH_QUALITY, +        E_VERY_HIGH_QUALITY, +        E_ULTRA_QUALITY, +        E_MAX_QUALITY, +        E_NUM_QUALITY_LEVELS +    }; + +    param.mName = "Voxel Resolution"; +    param.mDescription = nullptr; +    param.mType = LLCDParam::LLCD_ENUM; +    param.mDetails.mEnumValues.mNumEnums = E_NUM_QUALITY_LEVELS; + +    static LLCDParam::LLCDEnumItem voxel_quality_enums[E_NUM_QUALITY_LEVELS]; +    voxel_quality_enums[E_LOW_QUALITY].mName = "Low"; +    voxel_quality_enums[E_LOW_QUALITY].mValue = 200000; +    voxel_quality_enums[E_NORMAL_QUALITY].mName = "Normal"; +    voxel_quality_enums[E_NORMAL_QUALITY].mValue = 400000; +    voxel_quality_enums[E_HIGH_QUALITY].mName = "High"; +    voxel_quality_enums[E_HIGH_QUALITY].mValue = 800000; +    voxel_quality_enums[E_VERY_HIGH_QUALITY].mName = "Very High"; +    voxel_quality_enums[E_VERY_HIGH_QUALITY].mValue = 1200000; +    voxel_quality_enums[E_ULTRA_QUALITY].mName = "Ultra"; +    voxel_quality_enums[E_ULTRA_QUALITY].mValue = 1600000; +    voxel_quality_enums[E_MAX_QUALITY].mName = "Maximum"; +    voxel_quality_enums[E_MAX_QUALITY].mValue = 2000000; + +    param.mDetails.mEnumValues.mEnumsArray = voxel_quality_enums; +    param.mDefault.mIntOrEnumValue = 400000; +    param.mStage = 0; +    param.mReserved = -1; +    mDecompParams.push_back(param); + +    param.mName = "Num Hulls"; +    param.mDescription = nullptr; +    param.mType = LLCDParam::LLCD_FLOAT; +    param.mDetails.mRange.mLow.mFloat = 1.f; +    param.mDetails.mRange.mHigh.mFloat = MAX_HULLS; +    param.mDetails.mRange.mDelta.mFloat = 1.f; +    param.mDefault.mFloat = 8.f; +    param.mStage = 0; +    param.mReserved = -1; +    mDecompParams.push_back(param); + +    param.mName = "Num Vertices"; +    param.mDescription = nullptr; +    param.mType = LLCDParam::LLCD_FLOAT; +    param.mDetails.mRange.mLow.mFloat = 3.f; +    param.mDetails.mRange.mHigh.mFloat = MAX_VERTICES_PER_HULL; +    param.mDetails.mRange.mDelta.mFloat = 1.f; +    param.mDefault.mFloat = 32.f; +    param.mStage = 0; +    param.mReserved = -1; +    mDecompParams.push_back(param); + +    param.mName = "Error Tolerance"; +    param.mDescription = nullptr; +    param.mType = LLCDParam::LLCD_FLOAT; +    param.mDetails.mRange.mLow.mFloat = 0.0001f; +    param.mDetails.mRange.mHigh.mFloat = 99.f; +    param.mDetails.mRange.mDelta.mFloat = 0.001f; +    param.mDefault.mFloat = 1.f; +    param.mStage = 0; +    param.mReserved = -1; +    mDecompParams.push_back(param); + +    for (const LLCDParam& param : mDecompParams) +    { +        const char* const name = param.mName; + +        switch (param.mType) +        { +        case LLCDParam::LLCD_FLOAT: +        { +            setParam(name, param.mDefault.mFloat); +            break; +        } +        case LLCDParam::LLCD_ENUM: +        case LLCDParam::LLCD_INTEGER: +        { +            setParam(name, param.mDefault.mIntOrEnumValue); +            break; +        } +        case LLCDParam::LLCD_BOOLEAN: +        { +            setParam(name, (param.mDefault.mBool != 0)); +            break; +        } +        case LLCDParam::LLCD_INVALID: +        default: +        { +            break; +        } +        } +    } +} + +LLConvexDecompositionVHACD::~LLConvexDecompositionVHACD() +{ +    mBoundDecomp = nullptr; +    mDecompData.clear(); + +    mVHACD->Release(); +} + +void LLConvexDecompositionVHACD::genDecomposition(int& decomp) +{ +    int new_decomp_id = static_cast<int>(mDecompData.size()) + 1; +    mDecompData[new_decomp_id] = LLDecompData(); +    decomp = new_decomp_id; +} + +void LLConvexDecompositionVHACD::deleteDecomposition(int decomp) +{ +    auto iter = mDecompData.find(decomp); +    if (iter != mDecompData.end()) +    { +        if (mBoundDecomp == &iter->second) +        { +            mBoundDecomp = nullptr; +        } +        mDecompData.erase(iter); +    } +} + +void LLConvexDecompositionVHACD::bindDecomposition(int decomp) +{ +    auto iter = mDecompData.find(decomp); +    if (iter != mDecompData.end()) +    { +        mBoundDecomp = &iter->second; +    } +    else +    { +        LL_WARNS() << "Failed to bind unknown decomposition: " << decomp << LL_ENDL; +        mBoundDecomp = nullptr; +    } +} + +LLCDResult LLConvexDecompositionVHACD::setParam(const char* name, float val) +{ +    if (name == std::string("Num Hulls")) +    { +        mVHACDParameters.m_maxConvexHulls = llclamp(ll_round(val), 1, MAX_HULLS); +    } +    else if (name == std::string("Num Vertices")) +    { +        mVHACDParameters.m_maxNumVerticesPerCH = llclamp(ll_round(val), 3, MAX_VERTICES_PER_HULL); +    } +    else if (name == std::string("Error Tolerance")) +    { +        mVHACDParameters.m_minimumVolumePercentErrorAllowed = val; +    } +    return LLCD_OK; +} + +LLCDResult LLConvexDecompositionVHACD::setParam(const char* name, bool val) +{ +    return LLCD_OK; +} + +LLCDResult LLConvexDecompositionVHACD::setParam(const char* name, int val) +{ +    if (name == std::string("Fill Mode")) +    { +        mVHACDParameters.m_fillMode = (VHACD::FillMode)val; +    } +    else if (name == std::string("Voxel Resolution")) +    { +        mVHACDParameters.m_resolution = val; +    } +    return LLCD_OK; +} + +LLCDResult LLConvexDecompositionVHACD::setMeshData( const LLCDMeshData* data, bool vertex_based ) +{ +    if (!mBoundDecomp) +    { +        return LLCD_NULL_PTR; +    } + +    return mBoundDecomp->mSourceMesh.from(data, vertex_based); +} + +LLCDResult LLConvexDecompositionVHACD::registerCallback(int stage, llcdCallbackFunc callback ) +{ +    if (stage == 0) +    { +        mVHACDCallback.setCallbackFunc(callback); +        return LLCD_OK; +    } +    else +    { +        return LLCD_INVALID_STAGE; +    } +} + +LLCDResult LLConvexDecompositionVHACD::executeStage(int stage) +{ +    if (!mBoundDecomp) +    { +        return LLCD_NULL_PTR; +    } + +    if (stage != 0) +    { +        return LLCD_INVALID_STAGE; +    } + +    mBoundDecomp->mDecomposedHulls.clear(); + +    const auto& decomp_mesh = mBoundDecomp->mSourceMesh; +    if (!mVHACD->Compute((const double* const)decomp_mesh.mVertices.data(), static_cast<uint32_t>(decomp_mesh.mVertices.size()), (const uint32_t* const)decomp_mesh.mIndices.data(), static_cast<uint32_t>(decomp_mesh.mIndices.size()), mVHACDParameters)) +    { +        return LLCD_INVALID_HULL_DATA; +    } + +    uint32_t num_nulls = mVHACD->GetNConvexHulls(); +    if (num_nulls == 0) +    { +        return LLCD_INVALID_HULL_DATA; +    } + +    for (uint32_t i = 0; num_nulls > i; ++i) +    { +        VHACD::IVHACD::ConvexHull ch; +        if (!mVHACD->GetConvexHull(i, ch)) +            continue; + +        LLConvexMesh out_mesh; +        out_mesh.setVertices(ch.m_points); +        out_mesh.setIndices(ch.m_triangles); + +        mBoundDecomp->mDecomposedHulls.push_back(std::move(out_mesh)); +    } + +    mVHACD->Clean(); + +    return LLCD_OK; +} + +LLCDResult LLConvexDecompositionVHACD::buildSingleHull() +{ +    LL_INFOS() << "Building single hull mesh" << LL_ENDL; +    if (!mBoundDecomp || mBoundDecomp->mSourceMesh.mVertices.empty()) +    { +        return LLCD_NULL_PTR; +    } + +    mBoundDecomp->mSingleHullMesh.clear(); + +    VHACD::QuickHull quickhull; +    uint32_t num_tris = quickhull.ComputeConvexHull(mBoundDecomp->mSourceMesh.mVertices, MAX_VERTICES_PER_HULL); +    if (num_tris > 0) +    { +        mBoundDecomp->mSingleHullMesh.setVertices(quickhull.GetVertices()); +        mBoundDecomp->mSingleHullMesh.setIndices(quickhull.GetIndices()); + +        return LLCD_OK; +    } + +    return LLCD_INVALID_MESH_DATA; +} + +int LLConvexDecompositionVHACD::getNumHullsFromStage(int stage) +{ +    if (!mBoundDecomp || stage != 0) +    { +        return 0; +    } + +    return narrow(mBoundDecomp->mDecomposedHulls.size()); +} + +LLCDResult LLConvexDecompositionVHACD::getSingleHull( LLCDHull* hullOut ) +{ +    memset( hullOut, 0, sizeof(LLCDHull) ); + +    if (!mBoundDecomp) +    { +        return LLCD_NULL_PTR; +    } + +    if (mBoundDecomp->mSingleHullMesh.vertices.empty()) +    { +        return LLCD_INVALID_HULL_DATA; +    } + +    mBoundDecomp->mSingleHullMesh.to(hullOut); +    return LLCD_OK; +} + +LLCDResult LLConvexDecompositionVHACD::getHullFromStage( int stage, int hull, LLCDHull* hullOut ) +{ +    memset( hullOut, 0, sizeof(LLCDHull) ); + +    if (!mBoundDecomp) +    { +        return LLCD_NULL_PTR; +    } + +    if (stage != 0) +    { +        return LLCD_INVALID_STAGE; +    } + +    if (mBoundDecomp->mDecomposedHulls.empty() || mBoundDecomp->mDecomposedHulls.size() <= hull) +    { +        return LLCD_REQUEST_OUT_OF_RANGE; +    } + +    mBoundDecomp->mDecomposedHulls[hull].to(hullOut); +    return LLCD_OK; +} + +LLCDResult LLConvexDecompositionVHACD::getMeshFromStage( int stage, int hull, LLCDMeshData* meshDataOut ) +{ +    memset( meshDataOut, 0, sizeof(LLCDMeshData)); +    if (!mBoundDecomp) +    { +        return LLCD_NULL_PTR; +    } + +    if (stage != 0) +    { +        return LLCD_INVALID_STAGE; +    } + +    if (mBoundDecomp->mDecomposedHulls.empty() || mBoundDecomp->mDecomposedHulls.size() <= hull) +    { +        return LLCD_REQUEST_OUT_OF_RANGE; +    } + +    mBoundDecomp->mDecomposedHulls[hull].to(meshDataOut); +    return LLCD_OK; +} + +LLCDResult LLConvexDecompositionVHACD::getMeshFromHull( LLCDHull* hullIn, LLCDMeshData* meshOut ) +{ +    memset(meshOut, 0, sizeof(LLCDMeshData)); + +    LLVHACDMesh inMesh(hullIn); + +    VHACD::QuickHull quickhull; +    uint32_t num_tris = quickhull.ComputeConvexHull(inMesh.mVertices, MAX_VERTICES_PER_HULL); +    if (num_tris > 0) +    { +        mMeshFromHullData.setVertices(quickhull.GetVertices()); +        mMeshFromHullData.setIndices(quickhull.GetIndices()); + +        mMeshFromHullData.to(meshOut); +        return LLCD_OK; +    } + +    return LLCD_INVALID_HULL_DATA; +} + +LLCDResult LLConvexDecompositionVHACD::generateSingleHullMeshFromMesh(LLCDMeshData* meshIn, LLCDMeshData* meshOut) +{ +    memset( meshOut, 0, sizeof(LLCDMeshData) ); + +    LLVHACDMesh inMesh(meshIn, true); + +    VHACD::QuickHull quickhull; +    uint32_t num_tris = quickhull.ComputeConvexHull(inMesh.mVertices, MAX_VERTICES_PER_HULL); +    if (num_tris > 0) +    { +        mSingleHullMeshFromMeshData.setVertices(quickhull.GetVertices()); +        mSingleHullMeshFromMeshData.setIndices(quickhull.GetIndices()); + +        mSingleHullMeshFromMeshData.to(meshOut); +        return LLCD_OK; +    } + +    return LLCD_INVALID_MESH_DATA; +} + +void LLConvexDecompositionVHACD::loadMeshData(const char* fileIn, LLCDMeshData** meshDataOut) +{ +    static LLCDMeshData meshData; +    memset( &meshData, 0, sizeof(LLCDMeshData) ); +    *meshDataOut = &meshData; +} diff --git a/indra/llphysicsextensionsos/llconvexdecompositionvhacd.h b/indra/llphysicsextensionsos/llconvexdecompositionvhacd.h new file mode 100644 index 0000000000..675356629c --- /dev/null +++ b/indra/llphysicsextensionsos/llconvexdecompositionvhacd.h @@ -0,0 +1,339 @@ +/** +* @file   llconvexdecompositionvhacd.h +* @author rye@alchemyviewer.org +* @brief  A VHACD based implementation of LLConvexDecomposition +* +* $LicenseInfo:firstyear=2025&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2025, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +#ifndef LL_CONVEX_DECOMP_UTIL_VHACD_H +#define LL_CONVEX_DECOMP_UTIL_VHACD_H + +#include "llconvexdecomposition.h" +#include "llsingleton.h" +#include "llmath.h" + +#include <vector> + +#include "VHACD.h" + +class LLDecompDataVHACD; + +class LLConvexDecompositionVHACD : public LLSimpleton<LLConvexDecompositionVHACD>, public LLConvexDecomposition +{ +    class VHACDCallback : public VHACD::IVHACD::IUserCallback +    { +    public: +        void Update(const double overallProgress, const double stageProgress, const char* const stage, const char* operation) override +        { +            std::string out_msg = llformat("Stage: %s Operation: %s", stage, operation); +            if (mCurrentStage != stage && mCurrentOperation != operation) +            { +                mCurrentStage = stage; +                mCurrentOperation = operation; +                LL_INFOS("VHACD") << out_msg << LL_ENDL; +            } + +            if(mCallbackFunc) +            { +                mCallbackFunc(out_msg.c_str(), ll_round(static_cast<F32>(stageProgress)), ll_round(static_cast<F32>(overallProgress))); +            } +        } + +        void setCallbackFunc(llcdCallbackFunc func) +        { +            mCallbackFunc = func; +        } + +    private: +        std::string mCurrentStage; +        std::string mCurrentOperation; +        llcdCallbackFunc mCallbackFunc = nullptr; +    }; + +    class VHACDLogger : public VHACD::IVHACD::IUserLogger +    { +        void Log(const char* const msg) override +        { +            LL_INFOS("VHACD") << msg << LL_ENDL; +        } +    }; + +public: + +    LLConvexDecompositionVHACD(); +    virtual ~LLConvexDecompositionVHACD(); + +    static bool isFunctional(); +    static LLConvexDecomposition* getInstance(); +    static LLCDResult initSystem(); +    static LLCDResult initThread(); +    static LLCDResult quitThread(); +    static LLCDResult quitSystem(); + +    void genDecomposition(int& decomp); +    void deleteDecomposition(int decomp); +    void bindDecomposition(int decomp); + +    // Sets *paramsOut to the address of the LLCDParam array and returns +    // the length of the array +    int getParameters(const LLCDParam** paramsOut) +    { +        *paramsOut = mDecompParams.data(); +        return narrow(mDecompParams.size()); +    } + +    int getStages(const LLCDStageData** stagesOut) +    { +        *stagesOut = mDecompStages.data(); +        return narrow(mDecompStages.size()); +    } + +    // Set a parameter by name. Returns false if out of bounds or unsupported parameter +    LLCDResult  setParam(const char* name, float val); +    LLCDResult  setParam(const char* name, int val); +    LLCDResult  setParam(const char* name, bool val); +    LLCDResult  setMeshData( const LLCDMeshData* data, bool vertex_based ); +    LLCDResult  registerCallback(int stage, llcdCallbackFunc callback ); + +    LLCDResult  executeStage(int stage); +    LLCDResult  buildSingleHull(); + +    int getNumHullsFromStage(int stage); + +    LLCDResult  getHullFromStage( int stage, int hull, LLCDHull* hullOut ); +    LLCDResult  getSingleHull( LLCDHull* hullOut ) ; + +    // TODO: Implement lock of some kind to disallow this call if data not yet ready +    LLCDResult  getMeshFromStage( int stage, int hull, LLCDMeshData* meshDataOut); +    LLCDResult  getMeshFromHull( LLCDHull* hullIn, LLCDMeshData* meshOut ); + +    // For visualizing convex hull shapes in the viewer physics shape display +    LLCDResult generateSingleHullMeshFromMesh( LLCDMeshData* meshIn, LLCDMeshData* meshOut); + +    /// Debug +    void loadMeshData(const char* fileIn, LLCDMeshData** meshDataOut); + +private: +    std::vector<LLCDParam>       mDecompParams; +    std::array<LLCDStageData, 1> mDecompStages; + +    struct LLVHACDMesh +    { +        using vertex_type = VHACD::Vertex; +        using index_type = VHACD::Triangle; +        using vertex_array_type = std::vector<vertex_type>; +        using index_array_type = std::vector<index_type>; + +        LLVHACDMesh() = default; +        LLVHACDMesh(const LLCDHull* hullIn) +        { +            if (hullIn) +            { +                from(hullIn); +            } +        }; + +        LLVHACDMesh(const LLCDMeshData* meshIn, bool vertex_based) +        { +            if (meshIn) +            { +                from(meshIn, vertex_based); +            } +        }; + +        void clear() +        { +            mVertices.clear(); +            mIndices.clear(); +        } + +        void setVertices(const float* data, int num_vertices, int vertex_stride_bytes) +        { +            vertex_array_type vertices; +            vertices.reserve(num_vertices); + +            const int stride = vertex_stride_bytes / sizeof(float); +            for (int i = 0; i < num_vertices; ++i) +            { +                vertices.emplace_back(data[i * stride + 0], +                    data[i * stride + 1], +                    data[i * stride + 2]); +            } + +            mVertices = std::move(vertices); +        } + +        void setIndices(const void* data, int num_indices, int index_stride_bytes, LLCDMeshData::IndexType type) +        { +            index_array_type indices; +            indices.reserve(num_indices); + +            if (type == LLCDMeshData::INT_16) +            { +                const U16* index_data = static_cast<const U16*>(data); +                const int stride = index_stride_bytes / sizeof(U16); +                for (int i = 0; i < num_indices; ++i) +                { +                    indices.emplace_back(index_data[i * stride + 0], +                                         index_data[i * stride + 1], +                                         index_data[i * stride + 2]); +                } +            } +            else +            { +                const U32* index_data = static_cast<const U32*>(data); +                const int stride = index_stride_bytes / sizeof(U32); +                for (int i = 0; i < num_indices; ++i) +                { +                    indices.emplace_back(index_data[i * stride + 0], +                                         index_data[i * stride + 1], +                                         index_data[i * stride + 2]); +                } +            } + +            mIndices = std::move(indices); +        } + +        LLCDResult from(const LLCDHull* hullIn) +        { +            clear(); + +            if (!hullIn || !hullIn->mVertexBase || (hullIn->mNumVertices < 3) || (hullIn->mVertexStrideBytes != 12 && hullIn->mVertexStrideBytes != 16)) +            { +                return LLCD_INVALID_HULL_DATA; +            } + +            setVertices(hullIn->mVertexBase, hullIn->mNumVertices, hullIn->mVertexStrideBytes); + +            return LLCD_OK; +        } + +        LLCDResult from(const LLCDMeshData* meshIn, bool vertex_based) +        { +            clear(); + +            if (!meshIn || !meshIn->mVertexBase || (meshIn->mNumVertices < 3) || (meshIn->mVertexStrideBytes != 12 && meshIn->mVertexStrideBytes != 16)) +            { +                return LLCD_INVALID_MESH_DATA; +            } + +            if (!vertex_based && ((meshIn->mNumTriangles < 1) || !meshIn->mIndexBase)) +            { +                return LLCD_INVALID_MESH_DATA; +            } + +            setVertices(meshIn->mVertexBase, meshIn->mNumVertices, meshIn->mVertexStrideBytes); +            if(!vertex_based) +            { +                setIndices(meshIn->mIndexBase, meshIn->mNumTriangles, meshIn->mIndexStrideBytes, meshIn->mIndexType); +            } + +            return LLCD_OK; +        } + +        vertex_array_type mVertices; +        index_array_type mIndices; +    }; + +    struct LLConvexMesh +    { +        using vertex_type = glm::vec3; +        using index_type = glm::u32vec3; +        using vertex_array_type = std::vector<vertex_type>; +        using index_array_type = std::vector<index_type>; + +        LLConvexMesh() = default; + +        void clear() +        { +            vertices.clear(); +            indices.clear(); +        } + +        void setVertices(const std::vector<VHACD::Vertex>& in_vertices) +        { +            vertices.clear(); +            vertices.reserve(in_vertices.size()); + +            for (const auto& vertex : in_vertices) +            { +                vertices.emplace_back(narrow(vertex.mX), narrow(vertex.mY), narrow(vertex.mZ)); +            } +        } + +        void setIndices(const std::vector<VHACD::Triangle>& in_indices) +        { +            indices.clear(); +            indices.reserve(in_indices.size()); + +            for (const auto& triangle : in_indices) +            { +                indices.emplace_back(narrow(triangle.mI0), narrow(triangle.mI1), narrow(triangle.mI2)); +            } +        } + +        void to(LLCDHull* meshOut) const +        { +            meshOut->mVertexBase = (float*)vertices.data(); +            meshOut->mVertexStrideBytes = sizeof(vertex_type); +            meshOut->mNumVertices = (int)vertices.size(); +        } + +        void to(LLCDMeshData* meshOut) const +        { +            meshOut->mVertexBase = (float*)vertices.data(); +            meshOut->mVertexStrideBytes = sizeof(vertex_type); +            meshOut->mNumVertices = (int)vertices.size(); + +            meshOut->mIndexType = LLCDMeshData::INT_32; +            meshOut->mIndexBase = indices.data(); +            meshOut->mIndexStrideBytes = sizeof(index_type); +            meshOut->mNumTriangles = (int)indices.size(); +        } + +        vertex_array_type vertices; +        index_array_type indices; +    }; + +    struct LLDecompData +    { +        LLVHACDMesh mSourceMesh; +        LLConvexMesh mSingleHullMesh; + +        std::vector<LLConvexMesh> mDecomposedHulls; +    }; + +    std::unordered_map<int, LLDecompData> mDecompData; + +    LLDecompData* mBoundDecomp = nullptr; + +    VHACD::IVHACD* mVHACD = nullptr; +    VHACDCallback  mVHACDCallback; +    VHACDLogger    mVHACDLogger; +    VHACD::IVHACD::Parameters mVHACDParameters; + +    LLConvexMesh mMeshFromHullData; +    LLConvexMesh mSingleHullMeshFromMeshData; +}; + +#endif //LL_CONVEX_DECOMP_UTIL_VHACD_H diff --git a/indra/llphysicsextensionsos/llpathinglib.cpp b/indra/llphysicsextensionsos/llpathinglib.cpp new file mode 100644 index 0000000000..f41cb9c45f --- /dev/null +++ b/indra/llphysicsextensionsos/llpathinglib.cpp @@ -0,0 +1,83 @@ +/** +* @file   llpathinglib.cpp +* @author prep@lindenlab.com +* @brief  LLPathingLib core creation methods +* +* $LicenseInfo:firstyear=2012&license=lgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2011, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +#include "linden_common.h" + +#include "LLPathingLibStubImpl.h" + +#include "llpathinglib.h" + +//============================================================================= + +/*static */bool LLPathingLib::s_isInitialized = false; + +//============================================================================= + + +/*static*/bool LLPathingLib::isFunctional() +{ +    return false; +} + +/*static*/LLPathingLib* LLPathingLib::getInstance() +{ +    if ( !s_isInitialized ) +    { +        return NULL; +    } +    else +    { +        return LLPathingLibImpl::getInstance(); +    } +} + +//============================================================================= + +/*static */LLPathingLib::LLPLResult LLPathingLib::initSystem() +{ +    if ( LLPathingLibImpl::initSystem() == LLPL_OK ) +    { +        s_isInitialized = true; +        return LLPL_OK; +    } +    return LLPL_UNKOWN_ERROR; +} +//============================================================================= +/*static */LLPathingLib::LLPLResult LLPathingLib::quitSystem() +{ +    LLPLResult quitResult = LLPL_UNKOWN_ERROR; + +    if (s_isInitialized) +    { +        quitResult = LLPathingLibImpl::quitSystem(); +        s_isInitialized = false; +    } + +    return quitResult; +} +//============================================================================= + diff --git a/indra/llphysicsextensionsos/llpathinglib.h b/indra/llphysicsextensionsos/llpathinglib.h new file mode 100644 index 0000000000..41583f1fd1 --- /dev/null +++ b/indra/llphysicsextensionsos/llpathinglib.h @@ -0,0 +1,187 @@ +/** + * @file llpathinglib.cpp + * @author prep@lindenlab.com + * @brief LLPathingLib interface definition + * + * $LicenseInfo:firstyear=2012&license=lgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifndef LL_PATHING_LIBRARY +#define LL_PATHING_LIBRARY + +#include "llpreprocessor.h" +#include "llsd.h" +#include "v3dmath.h" +#include "v4math.h" + +#include "v4color.h" +#include "v4coloru.h" +#include "llphysicsextensions.h" + +typedef int bool32; + +#if defined(_WIN32) || defined(_WIN64) +#define LLCD_CALL __cdecl +#else +#define LLCD_CALL +#endif + +class LLRender; + +//============================================================================= +class LLPathingLib +{ + +public: +    enum LLShapeType +    { +        LLST_WalkableObjects = 0, +        LLST_ObstacleObjects, +        LLST_MaterialPhantoms, +        LLST_ExclusionPhantoms, +        LLST_MaxShapeTypes  = LLST_ExclusionPhantoms+1, +        LLST_None           = LLST_MaxShapeTypes+2, +        LLST_SimpleBox      = LLST_None+1, +        LLST_SimpleCapsule  = LLST_SimpleBox+1, +    }; + +    enum LLShapeTypeFlag +    { +        LLSTB_WalkableObjects   = 0x1 << 1, +        LLSTB_ObstacleObjects   = 0x1 << 2, +        LLSTB_MaterialPhantoms  = 0x1 << 3, +        LLSTB_ExclusionPhantoms = 0x1 << 4, +        LLSTB_None              = 0x1 << 5 +    }; + +    enum LLPLPathBookEnd +    { +        LLPL_START = 0, +        LLPL_END, +    }; + +    enum LLPLResult +    { +        LLPL_OK = 0, +        LLPL_NOTSET, +        LLPL_ERROR, +        LLPL_NO_NAVMESH, +        LLPL_UNKOWN_ERROR, +        LLPL_NO_PATH, +        LLPL_PATH_GENERATED_OK, +        LLPL_NOT_IMPLEMENTED, +    }; + +    enum LLPLCharacterType +    { +        LLPL_CHARACTER_TYPE_A    = 4, +        LLPL_CHARACTER_TYPE_B    = 3, +        LLPL_CHARACTER_TYPE_C    = 2, +        LLPL_CHARACTER_TYPE_D    = 1, +        LLPL_CHARACTER_TYPE_NONE = 0 +    }; + +    struct PathingPacket +    { +        PathingPacket() : mHasPointA(false), mHasPointB(false), mCharacterWidth(0.0f), mCharacterType(LLPL_CHARACTER_TYPE_NONE) {} +        bool              mHasPointA; +        LLVector3         mStartPointA; +        LLVector3         mEndPointA; +        bool              mHasPointB; +        LLVector3         mStartPointB; +        LLVector3         mEndPointB; +        F32               mCharacterWidth; +        LLPLCharacterType mCharacterType; +    }; + +    struct NavMeshColors +    { +        LLColor4U     mWalkable; +        LLColor4U     mObstacle; +        LLColor4U     mMaterial; +        LLColor4U     mExclusion; +        LLColor4U     mConnectedEdge; +        LLColor4U     mBoundaryEdge; +        LLColor4      mHeatColorBase; +        LLColor4      mHeatColorMax; +        LLColor4U     mFaceColor; +        LLColor4U     mStarValid; +        LLColor4U     mStarInvalid; +        LLColor4U     mTestPath; +        LLColor4U     mWaterColor; +    }; + +public: +    //Ctor +    LLPathingLib() {} +    virtual ~LLPathingLib() {} + +    /// @returns false if this is the stub +    static bool isFunctional(); + +    // Obtain a pointer to the actual implementation +    static LLPathingLib* getInstance(); +    static LLPathingLib::LLPLResult initSystem(); +    static LLPathingLib::LLPLResult quitSystem(); + +    //Extract and store navmesh data from the llsd datablock sent down by the server +    virtual LLPLResult extractNavMeshSrcFromLLSD( const LLSD::Binary& dataBlock, int dir )  = 0; +    //Stitch any stored navmeshes together +    virtual void processNavMeshData( ) = 0; + +    //Method used to generate and visualize a path on the viewers navmesh +    virtual LLPLResult generatePath( const PathingPacket& pathingPacket ) = 0; + +    //Set the material type for the heatmap type +    virtual void setNavMeshMaterialType( LLPLCharacterType materialType ) = 0; +    //Set the various navmesh colors +    virtual void setNavMeshColors( const NavMeshColors& color ) = 0; + +    //The entry method to rendering the client side navmesh +    virtual void renderNavMesh()  = 0; +    //The entry method to rendering the client side navmesh edges +    virtual void renderNavMeshEdges()  = 0; +    //The entry method to render the client navmesh shapes VBO +    virtual void renderNavMeshShapesVBO( U32 shapeRenderFlags )  = 0; +    //The entry method to render the clients designated path +    virtual void renderPath() = 0; +    //The entry method to render the capsule bookends for the clients designated path +    virtual void renderPathBookend( LLRender& gl, LLPathingLib::LLPLPathBookEnd type ) = 0; +    //Renders all of the generated simple shapes (using their default transforms) +    virtual void renderSimpleShapes( LLRender& gl, F32 regionsWaterHeight ) = 0; + +    //Method called from second life to create a capsule from properties of a character +    virtual void createPhysicsCapsuleRep( F32 length, F32 radius,  BOOL horizontal, const LLUUID& id ) = 0; +    //Removes any cached physics capsule using a list of cached uuids +    virtual void cleanupPhysicsCapsuleRepResiduals() = 0; +    //Renders a selected uuids physics rep +    virtual void renderSimpleShapeCapsuleID( LLRender& gl, const LLUUID& id, const LLVector3& pos, const LLQuaternion& rot  ) = 0; + +    //Method to delete any vbo's that are currently being managed by the pathing library +    virtual void cleanupVBOManager( ) = 0; +    //Method to cleanup any allocations within the implementation +    virtual void cleanupResidual( ) = 0; +private: +    static bool s_isInitialized; +}; + +#endif //LL_PATHING_LIBRARY diff --git a/indra/llphysicsextensionsos/llphysicsextensions.cpp b/indra/llphysicsextensionsos/llphysicsextensions.cpp new file mode 100644 index 0000000000..3bb8ffbf1a --- /dev/null +++ b/indra/llphysicsextensionsos/llphysicsextensions.cpp @@ -0,0 +1,78 @@ +/** +* @file   llphysicsextensions.cpp +* @author nyx@lindenlab.com +* @brief  LLPhysicsExtensions core initialization methods +* +* $LicenseInfo:firstyear=2012&license=lgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2011, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +#include "linden_common.h" + +#include "llphysicsextensions.h" +#include "LLPhysicsExtensionsStubImpl.h" + + +//disable the undefined symbol optimization +//#pragma warning (disable : 4221) + +//============================================================================= + +/*static */bool LLPhysicsExtensions::s_isInitialized = false; + + +/*static*/bool LLPhysicsExtensions::isFunctional() +{ +    return false; +} + +//============================================================================= + +/*static*/LLPhysicsExtensions* LLPhysicsExtensions::getInstance() +{ +    if ( !s_isInitialized ) +    { +        return NULL; +    } +    else +    { +        return LLPhysicsExtensionsImpl::getInstance(); +    } +} + +//============================================================================= + +/*static */bool LLPhysicsExtensions::initSystem() +{ +    bool result = LLPhysicsExtensionsImpl::initSystem(); +    if ( result ) +    { +        s_isInitialized = true; +    } +    return result; +} +//============================================================================= +/*static */bool LLPhysicsExtensions::quitSystem() +{ +    return LLPhysicsExtensionsImpl::quitSystem(); +} +//============================================================================= + diff --git a/indra/llphysicsextensionsos/llphysicsextensions.h b/indra/llphysicsextensionsos/llphysicsextensions.h new file mode 100644 index 0000000000..fa23ebd725 --- /dev/null +++ b/indra/llphysicsextensionsos/llphysicsextensions.h @@ -0,0 +1,59 @@ +/** +* @file   llphysicsextensions.h +* @author nyx@lindenlab.com +* @brief  LLPhysicsExtensions core shared initialization +*         routines +* +* $LicenseInfo:firstyear=2012&license=lgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2011, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +#ifndef LL_PHYSICS_EXTENSIONS +#define LL_PHYSICS_EXTENSIONS + +#include "llpreprocessor.h" +#include "llsd.h" +#include "v3dmath.h" + +#define LLPHYSICSEXTENSIONS_VERSION "1.0" + +typedef int bool32; + +class LLPhysicsExtensions +{ + +public: +    // Obtain a pointer to the actual implementation +    static LLPhysicsExtensions* getInstance(); + +    /// @returns false if this is the stub +    static bool isFunctional(); + +    static bool initSystem(); +    static bool quitSystem(); + +private: +    static bool s_isInitialized; +}; + +#endif //LL_PATHING_LIBRARY + + diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp index 63f1de8d6a..d6ab52a17a 100644 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -986,6 +986,7 @@ void LLPluginProcessParent::poll(F64 timeout)      }      // Remove instances in the done state from the sInstances map. +    LLCoros::LockType lock(*sInstancesMutex);      mapInstances_t::iterator itClean = sInstances.begin();      while (itClean != sInstances.end())      { diff --git a/indra/llplugin/slplugin/slplugin-objc.mm b/indra/llplugin/slplugin/slplugin-objc.mm index 68ff196eaf..adde594b59 100644 --- a/indra/llplugin/slplugin/slplugin-objc.mm +++ b/indra/llplugin/slplugin/slplugin-objc.mm @@ -7,21 +7,21 @@   * $LicenseInfo:firstyear=2010&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2010, Linden Research, Inc. - *  + *   * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public   * License as published by the Free Software Foundation;   * version 2.1 of the License only. - *  + *   * This library is distributed in the hope that it will be useful,   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   * Lesser General Public License for more details. - *  + *   * You should have received a copy of the GNU Lesser General Public   * License along with this library; if not, write to the Free Software   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  + *   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   * @@ -38,51 +38,51 @@  void LLCocoaPlugin::setupCocoa()  { -	static bool inited = false; -	 -	if(!inited) -	{ -		createAutoReleasePool(); -		 -		// The following prevents the Cocoa command line parser from trying to open 'unknown' arguements as documents. -		// ie. running './secondlife -set Language fr' would cause a pop-up saying can't open document 'fr'  -		// when init'ing the Cocoa App window.		 -		[[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"]; -		 -		// This is a bit of voodoo taken from the Apple sample code "CarbonCocoa_PictureCursor": -		//   http://developer.apple.com/samplecode/CarbonCocoa_PictureCursor/index.html -		 -		//	Needed for Carbon based applications which call into Cocoa -		NSApplicationLoad(); - -		//	Must first call [[[NSWindow alloc] init] release] to get the NSWindow machinery set up so that NSCursor can use a window to cache the cursor image -		[[[NSWindow alloc] init] release]; -		 +    static bool inited = false; + +    if(!inited) +    { +        createAutoReleasePool(); + +        // The following prevents the Cocoa command line parser from trying to open 'unknown' arguements as documents. +        // ie. running './secondlife -set Language fr' would cause a pop-up saying can't open document 'fr' +        // when init'ing the Cocoa App window. +        [[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"]; + +        // This is a bit of voodoo taken from the Apple sample code "CarbonCocoa_PictureCursor": +        //   http://developer.apple.com/samplecode/CarbonCocoa_PictureCursor/index.html + +        //  Needed for Carbon based applications which call into Cocoa +        NSApplicationLoad(); + +        //  Must first call [[[NSWindow alloc] init] release] to get the NSWindow machinery set up so that NSCursor can use a window to cache the cursor image +        [[[NSWindow alloc] init] release]; +          mPluginWindow = [NSApp mainWindow]; -         -		deleteAutoReleasePool(); -		 -		inited = true; -	} + +        deleteAutoReleasePool(); + +        inited = true; +    }  }  static NSAutoreleasePool *sPool = NULL;  void LLCocoaPlugin::createAutoReleasePool()  { -	if(!sPool) -	{ -		sPool = [[NSAutoreleasePool alloc] init]; -	} +    if(!sPool) +    { +        sPool = [[NSAutoreleasePool alloc] init]; +    }  }  void LLCocoaPlugin::deleteAutoReleasePool()  { -	if(sPool) -	{ -		[sPool release]; -		sPool = NULL; -	} +    if(sPool) +    { +        [sPool release]; +        sPool = NULL; +    }  }  LLCocoaPlugin::LLCocoaPlugin():mHackState(0) @@ -110,12 +110,12 @@ void LLCocoaPlugin::setupGroup()      //    {      //        // Start out with a window layer that's way out in front (fixes the problem with the menubar not getting hidden on first switch to fullscreen youtube)      //        SetWindowGroupName(layer_group, CFSTR("SLPlugin Layer")); -    //        SetWindowGroupLevel(layer_group, kCGOverlayWindowLevel);		 +    //        SetWindowGroupLevel(layer_group, kCGOverlayWindowLevel);      //    } -     +  } -void LLCocoaPlugin::updateWindows()   +void LLCocoaPlugin::updateWindows()  {  //    NSArray* window_list = [NSApp orderedWindows];  //    NSWindow* current_window = [window_list objectAtIndex:0]; @@ -123,38 +123,38 @@ void LLCocoaPlugin::updateWindows()  //    bool this_is_front_process = false;  //    bool parent_is_front_process = false;  // -//     +//  //    // Check for a change in this process's frontmost window.  //    if ( current_window != mFrontWindow )  //    {  //        // and figure out whether this process or its parent are currently frontmost  //        if ( current_window == parent_window ) parent_is_front_process = true;  //        if ( current_window == mPluginWindow ) this_is_front_process = true; -//     +//  //        if (current_window != NULL && mFrontWindow == NULL)  //        {  //            // Opening the first window -//             +//  //            if(mHackState == 0)  //            {  //                // Next time through the event loop, lower the window group layer  //                mHackState = 1;  //            } -//             +//  //            if(parent_is_front_process)  //            {  //                // Bring this process's windows to the front.  //                [mPluginWindow makeKeyAndOrderFront:NSApp];  //                [mPluginWindow setOrderedIndex:0];  //            } -//             +//  //            [NSApp activateIgnoringOtherApps:YES];  //        } -//         +//  //        else if (( current_window == NULL) && (mFrontWindow != NULL))  //        {  //            // Closing the last window -//             +//  //            if(this_is_front_process)  //            {  //                // Try to bring this process's parent to the front @@ -171,7 +171,7 @@ void LLCocoaPlugin::updateWindows()  ////            }  //            mHackState = 2;  //        } -//         +//  //        mFrontWindow = [window_list objectAtIndex:0];  //    }   } diff --git a/indra/llprimitive/CMakeLists.txt b/indra/llprimitive/CMakeLists.txt index b084098532..d93a75b05d 100644 --- a/indra/llprimitive/CMakeLists.txt +++ b/indra/llprimitive/CMakeLists.txt @@ -87,11 +87,20 @@ target_link_libraries(llprimitive          llxml          llcharacter          llrender -        llphysicsextensions_impl          ll::colladadom          ll::glm          ) +if (HAVOK OR HAVOK_TPV) +    target_link_libraries(llprimitive +        llphysicsextensions_impl +        ) +else() +    target_link_libraries(llprimitive +        llphysicsextensionsos +        ) +endif () +  include(LibraryInstall)  #add unit tests diff --git a/indra/llprimitive/llgltfmaterial.cpp b/indra/llprimitive/llgltfmaterial.cpp index cc4921416f..930222e3db 100644 --- a/indra/llprimitive/llgltfmaterial.cpp +++ b/indra/llprimitive/llgltfmaterial.cpp @@ -923,3 +923,34 @@ void LLGLTFMaterial::updateTextureTracking()      // setTEGLTFMaterialOverride is responsible for tracking      // for material overrides editor will set it  } + +void LLGLTFMaterial::convertTextureTransformToPBR( +    F32 tex_scale_s, +    F32 tex_scale_t, +    F32 tex_offset_s, +    F32 tex_offset_t, +    F32 tex_rotation, +    LLVector2& pbr_scale, +    LLVector2& pbr_offset, +    F32& pbr_rotation) +{ +    pbr_scale.set(tex_scale_s, tex_scale_t); +    pbr_rotation = -(tex_rotation) / 2.f; +    const F32 adjusted_offset_s = tex_offset_s; +    const F32 adjusted_offset_t = -tex_offset_t; +    F32 center_adjust_s = 0.5f * (1.0f - tex_scale_s); +    F32 center_adjust_t = 0.5f * (1.0f - tex_scale_t); + +    if (pbr_rotation != 0.0f) +    { +        const F32 c = cosf(pbr_rotation); +        const F32 s = sinf(pbr_rotation); +        const F32 tmp_s = center_adjust_s * c - center_adjust_t * s; +        const F32 tmp_t = center_adjust_s * s + center_adjust_t * c; +        center_adjust_s = tmp_s; +        center_adjust_t = tmp_t; +    } + +    pbr_offset.set(adjusted_offset_s + center_adjust_s, +                   adjusted_offset_t + center_adjust_t); +} diff --git a/indra/llprimitive/llgltfmaterial.h b/indra/llprimitive/llgltfmaterial.h index b89853c9fd..6bb021254b 100644 --- a/indra/llprimitive/llgltfmaterial.h +++ b/indra/llprimitive/llgltfmaterial.h @@ -215,6 +215,14 @@ public:      bool hasLocalTextures() { return !mTrackingIdToLocalTexture.empty(); }      virtual bool replaceLocalTexture(const LLUUID& tracking_id, const LLUUID &old_id, const LLUUID& new_id);      virtual void updateTextureTracking(); + +    // Convert legacy TE transform values to PBR transform values. +    static void convertTextureTransformToPBR(F32 tex_scale_s, F32 tex_scale_t, +                                             F32 tex_offset_s, F32 tex_offset_t, +                                             F32 tex_rotation, +                                             LLVector2& pbr_scale, +                                             LLVector2& pbr_offset, +                                             F32& pbr_rotation);  protected:      static LLVector2 vec2FromJson(const std::map<std::string, tinygltf::Value>& object, const char* key, const LLVector2& default_value);      static F32 floatFromJson(const std::map<std::string, tinygltf::Value>& object, const char* key, const F32 default_value); diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index 98faa88968..db752411fc 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -1296,10 +1296,10 @@ LLModel::weight_list& LLModel::getJointInfluences(const LLVector3& pos)  }  void LLModel::setConvexHullDecomposition( -    const LLModel::convex_hull_decomposition& decomp) +    const LLModel::convex_hull_decomposition& decomp, const std::vector<LLModel::PhysicsMesh>& decomp_mesh)  {      mPhysics.mHull = decomp; -    mPhysics.mMesh.clear(); +    mPhysics.mMesh = decomp_mesh;      updateHullCenters();  } diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h index a4ba6acd7e..854c77e63a 100644 --- a/indra/llprimitive/llmodel.h +++ b/indra/llprimitive/llmodel.h @@ -307,7 +307,8 @@ public:      S32 mDecompID;      void setConvexHullDecomposition( -        const convex_hull_decomposition& decomp); +        const convex_hull_decomposition& decomp, +        const std::vector<LLModel::PhysicsMesh>& decomp_mesh);      void updateHullCenters();      LLVector3 mCenterOfHullCenters; diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 9ff483b92b..bc80bd9556 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -1152,6 +1152,8 @@ void sub_image_lines(U32 target, S32 miplevel, S32 x_offset, S32 y_offset, S32 w          // full width texture, do 32 lines at a time          for (U32 y_pos = y_offset; y_pos < y_offset_end; y_pos += batch_size)          { +            // If this keeps crashing, pass down data_size, looks like it is using +            // imageraw->getData(); for data, but goes way over allocated size limit              glTexSubImage2D(target, miplevel, x_offset, y_pos, width, batch_size, pixformat, pixtype, src);              src += line_width * batch_size;          } @@ -1161,6 +1163,8 @@ void sub_image_lines(U32 target, S32 miplevel, S32 x_offset, S32 y_offset, S32 w          // partial width or strange height          for (U32 y_pos = y_offset; y_pos < y_offset_end; y_pos += 1)          { +            // If this keeps crashing, pass down data_size, looks like it is using +            // imageraw->getData(); for data, but goes way over allocated size limit              glTexSubImage2D(target, miplevel, x_offset, y_pos, width, 1, pixformat, pixtype, src);              src += line_width;          } @@ -1635,6 +1639,7 @@ bool LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S          llassert(mCurrentDiscardLevel >= 0);          discard_level = mCurrentDiscardLevel;      } +    discard_level = llmin(discard_level, MAX_DISCARD_LEVEL);      // Actual image width/height = raw image width/height * 2^discard_level      S32 raw_w = imageraw->getWidth() ; @@ -1741,6 +1746,7 @@ bool LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, bool data_          discard_level = mCurrentDiscardLevel;      }      discard_level = llclamp(discard_level, 0, (S32)mMaxDiscardLevel); +    discard_level = llmin(discard_level, MAX_DISCARD_LEVEL);      if (main_thread // <--- always force creation of new_texname when not on main thread ...          && !defer_copy // <--- ... or defer copy is set diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 6dd3634309..ea8530f282 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -1050,6 +1050,7 @@ void LLShaderMgr::clearShaderCache()      LL_INFOS("ShaderMgr") << "Removing shader cache at " << shader_cache << LL_ENDL;      const std::string mask = "*";      gDirUtilp->deleteFilesInDir(shader_cache, mask); +    LLFile::rmdir(shader_cache);      mShaderBinaryCache.clear();  } diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp index 495ba2f40f..1a64c2699d 100644 --- a/indra/llui/llaccordionctrl.cpp +++ b/indra/llui/llaccordionctrl.cpp @@ -303,8 +303,11 @@ void LLAccordionCtrl::ctrlSetLeftTopAndSize(LLView* panel, S32 left, S32 top, S3          return;      LLRect panel_rect = panel->getRect();      panel_rect.setLeftTopAndSize( left, top, width, height); -    panel->reshape( width, height, 1); -    panel->setRect(panel_rect); +    if (panel->getRect() != panel_rect) +    { +        panel->reshape( width, height, 1); +        panel->setRect(panel_rect); +    }  }  void LLAccordionCtrl::ctrlShiftVertical(LLView* panel, S32 delta) @@ -494,6 +497,7 @@ void LLAccordionCtrl::arrangeMultiple()  void LLAccordionCtrl::arrange()  { +    LL_PROFILE_ZONE_SCOPED;      updateNoTabsHelpTextVisibility();      if (mAccordionTabs.empty()) diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index ac66525030..bdf93348bb 100644 --- a/indra/llui/llaccordionctrltab.cpp +++ b/indra/llui/llaccordionctrltab.cpp @@ -248,10 +248,22 @@ void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::draw()  void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::reshape(S32 width, S32 height, bool called_from_parent /* = true */)  {      S32 header_height = mHeaderTextbox->getTextPixelHeight(); +    LLRect old_header_rect = mHeaderTextbox->getRect();      LLRect textboxRect(HEADER_TEXT_LEFT_OFFSET, (height + header_height) / 2, width, (height - header_height) / 2); -    mHeaderTextbox->reshape(textboxRect.getWidth(), textboxRect.getHeight()); -    mHeaderTextbox->setRect(textboxRect); +    if (old_header_rect.getHeight() != textboxRect.getHeight() +        || old_header_rect.mLeft != textboxRect.mLeft +        || old_header_rect.mTop != textboxRect.mTop +        || old_header_rect.getWidth() > textboxRect.getWidth() // reducing header's width +        || (old_header_rect.getWidth() < textboxRect.getWidth() && old_header_rect.getWidth() < mHeaderTextbox->getTextPixelWidth())) +    { +        // Expensive text reflow +        // Update if position or height changes +        // Update if width reduces +        // But do not update if text already fits and width increases (arguably LLTextBox::reshape should be smarter, not Accordion) +        mHeaderTextbox->reshape(textboxRect.getWidth(), textboxRect.getHeight()); +        mHeaderTextbox->setRect(textboxRect); +    }      if (mHeaderTextbox->getTextPixelWidth() > mHeaderTextbox->getRect().getWidth())      { @@ -416,8 +428,11 @@ void LLAccordionCtrlTab::reshape(S32 width, S32 height, bool called_from_parent      LLRect headerRect;      headerRect.setLeftTopAndSize(0, height, width, HEADER_HEIGHT); -    mHeader->setRect(headerRect); -    mHeader->reshape(headerRect.getWidth(), headerRect.getHeight()); +    if (mHeader->getRect() != headerRect) +    { +        mHeader->setRect(headerRect); +        mHeader->reshape(headerRect.getWidth(), headerRect.getHeight()); +    }      if (!mDisplayChildren)          return; @@ -932,7 +947,7 @@ void LLAccordionCtrlTab::adjustContainerPanel(const LLRect& child_rect)          show_hide_scrollbar(child_rect);          updateLayout(child_rect);      } -    else +    else if (mContainerPanel->getRect() != child_rect)      {          mContainerPanel->reshape(child_rect.getWidth(), child_rect.getHeight());          mContainerPanel->setRect(child_rect); diff --git a/indra/llui/llemojidictionary.cpp b/indra/llui/llemojidictionary.cpp index 925608e47e..16e6f0591a 100644 --- a/indra/llui/llemojidictionary.cpp +++ b/indra/llui/llemojidictionary.cpp @@ -390,14 +390,17 @@ void LLEmojiDictionary::loadEmojis()              continue;          } +        std::string category;          std::list<std::string> categories = loadCategories(sd);          if (categories.empty())          { -            LL_WARNS() << "Skipping invalid emoji descriptor (no categories)" << LL_ENDL; -            continue; +            // Should already have a localization for "other symbols" +            category = "other symbols"; +        } +        else +        { +            category = categories.front();          } - -        std::string category = categories.front();          if (std::find(mSkipCategories.begin(), mSkipCategories.end(), category) != mSkipCategories.end())          { diff --git a/indra/llui/llemojihelper.cpp b/indra/llui/llemojihelper.cpp index b2c59ce775..7cdd19bebc 100644 --- a/indra/llui/llemojihelper.cpp +++ b/indra/llui/llemojihelper.cpp @@ -117,7 +117,17 @@ void LLEmojiHelper::showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, c      S32 top = floater_y - HELPER_FLOATER_OFFSET_Y + rect.getHeight();      rect.setLeftTopAndSize(left, top, rect.getWidth(), rect.getHeight());      pHelperFloater->setRect(rect); + +    // Hack: Trying to open floater, search for a match, +    // and hide floater immediately if no match found, +    // instead of checking prior to opening +    // +    // Supress sounds in case floater won't be shown. +    // Todo: add some kind of shouldShow(short_code) +    U8 sound_flags = pHelperFloater->getSoundFlags(); +    pHelperFloater->setSoundFlags(LLView::SILENT);      pHelperFloater->openFloater(LLSD().with("hint", short_code)); +    pHelperFloater->setSoundFlags(sound_flags);  }  void LLEmojiHelper::hideHelper(const LLUICtrl* ctrl_p, bool strict) diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index fd07b2ec5d..52a5e3dbd6 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -2274,7 +2274,7 @@ void LLFloater::drawConeToOwner(F32 &context_cone_opacity,          LLRect local_rect = getLocalRect();          gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -        LLGLEnable(GL_CULL_FACE); +        LLGLEnable cull_face(GL_CULL_FACE);          gGL.begin(LLRender::TRIANGLE_STRIP);          {              gGL.color4f(0.f, 0.f, 0.f, contex_cone_in_alpha * context_cone_opacity); diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index b664065532..db4ab8487e 100644 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -1510,6 +1510,7 @@ bool LLFolderView::handleRightMouseDown( S32 x, S32 y, MASK mask )          && ( count > 0 && (hasVisibleChildren()) ))) && // show menu only if selected items are visible          !hide_folder_menu)      { +        LL_INFOS("Inventory") << "Opening inventory menu from path: " << getPathname() << LL_ENDL;          if (mCallbackRegistrar)          {              mCallbackRegistrar->pushScope(); diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index 9ca77dbe46..878f1cb856 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -1884,10 +1884,18 @@ void LLFolderViewFolder::updateHasFavorites(bool new_childs_value)  void LLFolderViewFolder::onIdleUpdateFavorites(void* data)  {      LLFolderViewFolder* self = reinterpret_cast<LLFolderViewFolder*>(data); +    if (self->mFavoritesDirtyFlags == FAVORITE_CLEANUP) +    { +        // parent or child already processed the update, clean the callback +        self->mFavoritesDirtyFlags = 0; +        gIdleCallbacks.deleteFunction(&LLFolderViewFolder::onIdleUpdateFavorites, data); +        return; +    } +      if (self->mFavoritesDirtyFlags == 0)      { -        // already processed either on previous run or by a different callback -        gIdleCallbacks.deleteFunction(&LLFolderViewFolder::onIdleUpdateFavorites, self); +        llassert(false); // should not happen, everything that sets to 0 should clean callback +        gIdleCallbacks.deleteFunction(&LLFolderViewFolder::onIdleUpdateFavorites, data);          return;      } @@ -1915,7 +1923,7 @@ void LLFolderViewFolder::onIdleUpdateFavorites(void* data)                      // Parent will remove onIdleUpdateFavorites later, don't remove now,                      // We are inside gIdleCallbacks. Removing 'self' callback is safe,                      // but removing 'parent' can invalidate following iterator -                    parent->mFavoritesDirtyFlags = 0; +                    parent->mFavoritesDirtyFlags = FAVORITE_CLEANUP;                  }                  parent = parent->getParentFolder();              } @@ -1981,7 +1989,7 @@ void LLFolderViewFolder::onIdleUpdateFavorites(void* data)                          // Parent will remove onIdleUpdateFavorites later, don't remove now,                          // We are inside gIdleCallbacks. Removing 'self' callback is safe,                          // but removing 'parent' can invalidate following iterator -                        parent->mFavoritesDirtyFlags = 0; +                        parent->mFavoritesDirtyFlags = FAVORITE_CLEANUP;                      }                      parent = parent->getParentFolder();                  } @@ -1992,7 +2000,7 @@ void LLFolderViewFolder::onIdleUpdateFavorites(void* data)                  // Parent will remove onIdleUpdateFavorites later, don't remove now.                  // We are inside gIdleCallbacks. Removing 'self' callback is safe,                  // but removing 'parent' can invalidate following iterator -                parent->mFavoritesDirtyFlags = 0; +                parent->mFavoritesDirtyFlags = FAVORITE_CLEANUP;              }              parent = parent->getParentFolder();          } @@ -2106,10 +2114,14 @@ void LLFolderViewFolder::setOpen(bool openitem)      {          // navigateToFolder can destroy this view          // delay it in case setOpen was called from click or key processing -        doOnIdleOneTime([this]() -                        { -                            getViewModelItem()->navigateToFolder(); -                        }); +        LLPointer<LLFolderViewModelItem> view_model_item = mViewModelItem; +        doOnIdleOneTime([view_model_item]() +        { +            if (view_model_item.notNull()) +            { +                view_model_item.get()->navigateToFolder(); +            } +        });      }      else      { diff --git a/indra/llui/llfolderviewitem.h b/indra/llui/llfolderviewitem.h index c9b003b892..23d794bf26 100644 --- a/indra/llui/llfolderviewitem.h +++ b/indra/llui/llfolderviewitem.h @@ -421,6 +421,7 @@ private:      constexpr static S32 FAVORITE_ADDED = 1;      constexpr static S32 FAVORITE_REMOVED = 2; +    constexpr static S32 FAVORITE_CLEANUP = 4;      S32 mFavoritesDirtyFlags { 0 };  public: diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 3fe0df1848..1de12896eb 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -185,6 +185,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)      mURLClickSignal(NULL),      mIsFriendSignal(NULL),      mIsObjectBlockedSignal(NULL), +    mIsObjectReachableSignal(NULL),      mMaxTextByteLength( p.max_text_length ),      mFont(p.font),      mFontShadow(p.font_shadow), @@ -290,6 +291,7 @@ LLTextBase::~LLTextBase()      delete mURLClickSignal;      delete mIsFriendSignal;      delete mIsObjectBlockedSignal; +    delete mIsObjectReachableSignal;  }  void LLTextBase::initFromParams(const LLTextBase::Params& p) @@ -1446,6 +1448,8 @@ void LLTextBase::reshape(S32 width, S32 height, bool called_from_parent)          // up-to-date mVisibleTextRect          updateRects(); +        // Todo: This might be wrong. updateRects already sets needsReflow conditionaly. +        // Reflow is expensive and doing it at any twith can be too much.          needsReflow();      }  } @@ -2281,6 +2285,15 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)                  unblockButton->setVisible(is_blocked);              }          } + +        if (mIsObjectReachableSignal) +        { +            bool is_reachable = *(*mIsObjectReachableSignal)(LLUUID(LLUrlAction::getObjectId(url))); +            if (LLView* zoom_btn = menu->getChild<LLView>("zoom_in")) +            { +                zoom_btn->setEnabled(is_reachable); +            } +        }          menu->show(x, y);          LLMenuGL::showPopup(this, menu, x, y);      } @@ -3387,6 +3400,15 @@ boost::signals2::connection LLTextBase::setIsObjectBlockedCallback(const is_bloc      return mIsObjectBlockedSignal->connect(cb);  } +boost::signals2::connection LLTextBase::setIsObjectReachableCallback(const is_obj_reachable_signal_t::slot_type& cb) +{ +    if (!mIsObjectReachableSignal) +    { +        mIsObjectReachableSignal = new is_obj_reachable_signal_t(); +    } +    return mIsObjectReachableSignal->connect(cb); +} +  //  // LLTextSegment  // diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 8ca653acb9..07cd9a1ee5 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -325,6 +325,7 @@ public:      typedef boost::signals2::signal<bool (const LLUUID& user_id)> is_friend_signal_t;      typedef boost::signals2::signal<bool (const LLUUID& blocked_id, const std::string from)> is_blocked_signal_t; +    typedef boost::signals2::signal<bool (const LLUUID& obj_id)> is_obj_reachable_signal_t;      struct LineSpacingParams : public LLInitParam::ChoiceBlock<LineSpacingParams>      { @@ -535,6 +536,7 @@ public:      boost::signals2::connection setURLClickedCallback(const commit_signal_t::slot_type& cb);      boost::signals2::connection setIsFriendCallback(const is_friend_signal_t::slot_type& cb);      boost::signals2::connection setIsObjectBlockedCallback(const is_blocked_signal_t::slot_type& cb); +    boost::signals2::connection setIsObjectReachableCallback(const is_obj_reachable_signal_t::slot_type& cb);      void                    setWordWrap(bool wrap);      LLScrollContainer*      getScrollContainer() const { return mScroller; } @@ -783,6 +785,7 @@ protected:      // Used to check if user with given ID is avatar's friend      is_friend_signal_t*         mIsFriendSignal;      is_blocked_signal_t*        mIsObjectBlockedSignal; +    is_obj_reachable_signal_t*  mIsObjectReachableSignal;      LLUIString                  mLabel; // text label that is visible when no user text provided  }; diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp index 5955a28fa3..56ab6e9bae 100644 --- a/indra/llui/lltoolbar.cpp +++ b/indra/llui/lltoolbar.cpp @@ -1054,7 +1054,7 @@ bool LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, bool drop,      // if drop is set, it's time to call the callback to get the operation done      if (handled && drop)      { -        handled = mHandleDropCallback(cargo_data, x, y, this); +        handled = mHandleDropCallback(cargo_data, cargo_type, x, y, this);      }      // We accept only single tool drop on toolbars diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h index 5556406fbd..a3f044c256 100644 --- a/indra/llui/lltoolbar.h +++ b/indra/llui/lltoolbar.h @@ -41,7 +41,7 @@ class LLIconCtrl;  typedef boost::function<void (S32 x, S32 y, LLToolBarButton* button)> tool_startdrag_callback_t;  typedef boost::function<bool (S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type)> tool_handledrag_callback_t; -typedef boost::function<bool (void* data, S32 x, S32 y, LLToolBar* toolbar)> tool_handledrop_callback_t; +typedef boost::function<bool (void* data, EDragAndDropType cargo_type, S32 x, S32 y, LLToolBar* toolbar)> tool_handledrop_callback_t;  class LLToolBarButton : public LLButton  { diff --git a/indra/llui/llviewereventrecorder.cpp b/indra/llui/llviewereventrecorder.cpp index 6d907d7e45..9eefba1390 100644 --- a/indra/llui/llviewereventrecorder.cpp +++ b/indra/llui/llviewereventrecorder.cpp @@ -34,8 +34,6 @@ LLViewerEventRecorder::LLViewerEventRecorder() {    logEvents = false;    // Remove any previous event log file    std::string old_log_ui_events_to_llsd_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife_Events_log.old"); -  LLFile::remove(old_log_ui_events_to_llsd_file, ENOENT); -    mLogFilename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife_Events_log.llsd");    LLFile::rename(mLogFilename, old_log_ui_events_to_llsd_file, ENOENT); diff --git a/indra/llwebrtc/llwebrtc.cpp b/indra/llwebrtc/llwebrtc.cpp index 7e2b5d2741..d453ad0c7b 100644 --- a/indra/llwebrtc/llwebrtc.cpp +++ b/indra/llwebrtc/llwebrtc.cpp @@ -390,8 +390,6 @@ void LLWebRTCImpl::terminate()      mSignalingThread->BlockingCall([this]() { mPeerConnectionFactory = nullptr; }); -    mPeerConnections.clear(); -      mWorkerThread->BlockingCall(          [this]()          { @@ -402,6 +400,14 @@ void LLWebRTCImpl::terminate()              mDeviceModule     = nullptr;              mTaskQueueFactory = nullptr;          }); + +    // In case peer connections still somehow have jobs in workers, +    // only clear connections up after clearing workers. +    mNetworkThread = nullptr; +    mWorkerThread = nullptr; +    mSignalingThread = nullptr; + +    mPeerConnections.clear();      webrtc::LogMessage::RemoveLogToStream(mLogSink);  } @@ -651,6 +657,13 @@ void LLWebRTCImpl::OnDevicesUpdated()  void LLWebRTCImpl::setTuningMode(bool enable)  {      mTuningMode = enable; +    if (!mTuningMode +        && !mMute +        && mPeerCustomProcessor +        && mPeerCustomProcessor->getGain() != mGain) +    { +        mPeerCustomProcessor->setGain(mGain); +    }      mWorkerThread->PostTask(          [this]          { @@ -782,6 +795,7 @@ void LLWebRTCImpl::freePeerConnection(LLWebRTCPeerConnectionInterface* peer_conn      std::find(mPeerConnections.begin(), mPeerConnections.end(), peer_connection);      if (it != mPeerConnections.end())      { +        // Todo: make sure conection had no jobs in workers          mPeerConnections.erase(it);          if (mPeerConnections.empty())          { @@ -801,7 +815,8 @@ LLWebRTCPeerConnectionImpl::LLWebRTCPeerConnectionImpl() :      mWebRTCImpl(nullptr),      mPeerConnection(nullptr),      mMute(MUTE_INITIAL), -    mAnswerReceived(false) +    mAnswerReceived(false), +    mPendingJobs(0)  {  } @@ -809,6 +824,10 @@ LLWebRTCPeerConnectionImpl::~LLWebRTCPeerConnectionImpl()  {      mSignalingObserverList.clear();      mDataObserverList.clear(); +    if (mPendingJobs > 0) +    { +        RTC_LOG(LS_ERROR) << __FUNCTION__ << "Destroying a connection that has " << std::to_string(mPendingJobs) << " unfinished jobs that might cause workers to crash"; +    }  }  // @@ -820,8 +839,10 @@ void LLWebRTCPeerConnectionImpl::init(LLWebRTCImpl * webrtc_impl)      mWebRTCImpl = webrtc_impl;      mPeerConnectionFactory = mWebRTCImpl->getPeerConnectionFactory();  } +  void LLWebRTCPeerConnectionImpl::terminate()  { +    mPendingJobs++;      mWebRTCImpl->PostSignalingTask(          [this]()          { @@ -864,7 +885,9 @@ void LLWebRTCPeerConnectionImpl::terminate()                      observer->OnPeerConnectionClosed();                  }              } +            mPendingJobs--;          }); +    mPeerConnectionFactory.release();  }  void LLWebRTCPeerConnectionImpl::setSignalingObserver(LLWebRTCSignalingObserver *observer) { mSignalingObserverList.emplace_back(observer); } @@ -885,6 +908,7 @@ bool LLWebRTCPeerConnectionImpl::initializeConnection(const LLWebRTCPeerConnecti      RTC_DCHECK(!mPeerConnection);      mAnswerReceived = false; +    mPendingJobs++;      mWebRTCImpl->PostSignalingTask(          [this,options]()          { @@ -906,6 +930,13 @@ bool LLWebRTCPeerConnectionImpl::initializeConnection(const LLWebRTCPeerConnecti              config.set_max_port(60100);              webrtc::PeerConnectionDependencies pc_dependencies(this); +            if (mPeerConnectionFactory == nullptr) +            { +                RTC_LOG(LS_ERROR) << __FUNCTION__ << "Error creating peer connection, factory doesn't exist"; +                // Too early? +                mPendingJobs--; +                return; +            }              auto error_or_peer_connection = mPeerConnectionFactory->CreatePeerConnectionOrError(config, std::move(pc_dependencies));              if (error_or_peer_connection.ok())              { @@ -918,6 +949,7 @@ bool LLWebRTCPeerConnectionImpl::initializeConnection(const LLWebRTCPeerConnecti                  {                      observer->OnRenegotiationNeeded();                  } +                mPendingJobs--;                  return;              } @@ -980,6 +1012,7 @@ bool LLWebRTCPeerConnectionImpl::initializeConnection(const LLWebRTCPeerConnecti              webrtc::PeerConnectionInterface::RTCOfferAnswerOptions offerOptions;              mPeerConnection->CreateOffer(this, offerOptions); +            mPendingJobs--;          });      return true; @@ -1022,6 +1055,7 @@ void LLWebRTCPeerConnectionImpl::AnswerAvailable(const std::string &sdp)  {      RTC_LOG(LS_INFO) << __FUNCTION__ << " Remote SDP: " << sdp; +    mPendingJobs++;      mWebRTCImpl->PostSignalingTask(                                 [this, sdp]()                                 { @@ -1031,6 +1065,7 @@ void LLWebRTCPeerConnectionImpl::AnswerAvailable(const std::string &sdp)                                         mPeerConnection->SetRemoteDescription(webrtc::CreateSessionDescription(webrtc::SdpType::kAnswer, sdp),                                                                               webrtc::scoped_refptr<webrtc::SetRemoteDescriptionObserverInterface>(this));                                     } +                                   mPendingJobs--;                                 });  } @@ -1053,6 +1088,7 @@ void LLWebRTCPeerConnectionImpl::setMute(bool mute)      mMute = new_state; +    mPendingJobs++;      mWebRTCImpl->PostSignalingTask(          [this, force_reset, enable]()          { @@ -1076,6 +1112,7 @@ void LLWebRTCPeerConnectionImpl::setMute(bool mute)                      track->set_enabled(enable);                  }              } +            mPendingJobs--;          }      });  } @@ -1097,6 +1134,7 @@ void LLWebRTCPeerConnectionImpl::resetMute()  void LLWebRTCPeerConnectionImpl::setReceiveVolume(float volume)  { +    mPendingJobs++;      mWebRTCImpl->PostSignalingTask(          [this, volume]()          { @@ -1115,11 +1153,13 @@ void LLWebRTCPeerConnectionImpl::setReceiveVolume(float volume)                      }                  }              } +            mPendingJobs--;          });  }  void LLWebRTCPeerConnectionImpl::setSendVolume(float volume)  { +    mPendingJobs++;      mWebRTCImpl->PostSignalingTask(          [this, volume]()          { @@ -1130,6 +1170,7 @@ void LLWebRTCPeerConnectionImpl::setSendVolume(float volume)                      track->GetSource()->SetVolume(volume*5.0);                  }              } +            mPendingJobs--;          });  } @@ -1206,11 +1247,13 @@ void LLWebRTCPeerConnectionImpl::OnConnectionChange(webrtc::PeerConnectionInterf      {          case webrtc::PeerConnectionInterface::PeerConnectionState::kConnected:          { +            mPendingJobs++;              mWebRTCImpl->PostWorkerTask([this]() {                  for (auto &observer : mSignalingObserverList)                  {                      observer->OnAudioEstablished(this);                  } +                mPendingJobs--;              });              break;          } @@ -1468,11 +1511,13 @@ void LLWebRTCPeerConnectionImpl::sendData(const std::string& data, bool binary)      {          webrtc::CopyOnWriteBuffer cowBuffer(data.data(), data.length());          webrtc::DataBuffer     buffer(cowBuffer, binary); +        mPendingJobs++;          mWebRTCImpl->PostNetworkTask([this, buffer]() {                  if (mDataChannel)                  {                      mDataChannel->Send(buffer);                  } +                mPendingJobs--;              });      }  } diff --git a/indra/llwebrtc/llwebrtc_impl.h b/indra/llwebrtc/llwebrtc_impl.h index fbc60d48e3..9d3af985ef 100644 --- a/indra/llwebrtc/llwebrtc_impl.h +++ b/indra/llwebrtc/llwebrtc_impl.h @@ -428,6 +428,9 @@ class LLWebRTCImpl : public LLWebRTCDeviceInterface, public webrtc::AudioDeviceO      ~LLWebRTCImpl()      {          delete mLogSink; + +        // Explicit cleanup for the sake of debugging and crash stacks +        mPeerCustomProcessor = nullptr;      }      void init(); @@ -679,6 +682,8 @@ class LLWebRTCPeerConnectionImpl : public LLWebRTCPeerConnectionInterface,      // data      std::vector<LLWebRTCDataObserver *> mDataObserverList;      webrtc::scoped_refptr<webrtc::DataChannelInterface> mDataChannel; + +    std::atomic<int> mPendingJobs;  };  } diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm index 268afe843d..bdb5d8def0 100644 --- a/indra/llwindow/llopenglview-objc.mm +++ b/indra/llwindow/llopenglview-objc.mm @@ -125,7 +125,7 @@ attributedStringInfo getSegments(NSAttributedString *str)  - (unsigned long)getVramSize  {      CGLRendererInfoObj info = 0; -	GLint vram_megabytes = 0; +    GLint vram_megabytes = 0;      int num_renderers = 0;      CGLError the_err = CGLQueryRendererInfo (CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), &info, &num_renderers);      if(0 == the_err) @@ -143,7 +143,7 @@ attributedStringInfo getSegments(NSAttributedString *str)          vram_megabytes = 256;      } -	return (unsigned long)vram_megabytes; // return value is in megabytes. +    return (unsigned long)vram_megabytes; // return value is in megabytes.  }  - (void)viewWillMoveToWindow:(nullable NSWindow *)newWindow @@ -164,24 +164,24 @@ attributedStringInfo getSegments(NSAttributedString *str)  - (void)viewDidMoveToWindow  { -	[[NSNotificationCenter defaultCenter] addObserver:self -											 selector:@selector(windowResized:) name:NSWindowDidResizeNotification -											   object:[self window]]; +    [[NSNotificationCenter defaultCenter] addObserver:self +                                             selector:@selector(windowResized:) name:NSWindowDidResizeNotification +                                               object:[self window]];      [[NSNotificationCenter defaultCenter] addObserver:self -											 selector:@selector(windowWillMiniaturize:) name:NSWindowWillMiniaturizeNotification -											   object:[self window]]; +                                             selector:@selector(windowWillMiniaturize:) name:NSWindowWillMiniaturizeNotification +                                               object:[self window]];      [[NSNotificationCenter defaultCenter] addObserver:self -											 selector:@selector(windowDidDeminiaturize:) name:NSWindowDidDeminiaturizeNotification -											   object:[self window]]; +                                             selector:@selector(windowDidDeminiaturize:) name:NSWindowDidDeminiaturizeNotification +                                               object:[self window]];      [[NSNotificationCenter defaultCenter] addObserver:self -											 selector:@selector(windowDidBecomeKey:) name:NSWindowDidBecomeKeyNotification -											   object:[self window]]; -	[[NSNotificationCenter defaultCenter] addObserver:self -											 selector:@selector(windowDidChangeScreen:) name:NSWindowDidChangeScreenNotification -											   object:[self window]]; +                                             selector:@selector(windowDidBecomeKey:) name:NSWindowDidBecomeKeyNotification +                                               object:[self window]]; +    [[NSNotificationCenter defaultCenter] addObserver:self +                                             selector:@selector(windowDidChangeScreen:) name:NSWindowDidChangeScreenNotification +                                               object:[self window]];      NSRect wnd_rect = [[self window] frame]; @@ -215,28 +215,28 @@ attributedStringInfo getSegments(NSAttributedString *str)  -(void)windowDidChangeScreen:(NSNotification *)notification;  { -	callWindowDidChangeScreen(); +    callWindowDidChangeScreen();  }  - (void)dealloc  { -	[[NSNotificationCenter defaultCenter] removeObserver:self]; -	[super dealloc]; +    [[NSNotificationCenter defaultCenter] removeObserver:self]; +    [super dealloc];  }  - (id) init  { -	return [self initWithFrame:[self bounds] withSamples:2 andVsync:TRUE]; +    return [self initWithFrame:[self bounds] withSamples:2 andVsync:TRUE];  }  - (id) initWithSamples:(NSUInteger)samples  { -	return [self initWithFrame:[self bounds] withSamples:samples andVsync:TRUE]; +    return [self initWithFrame:[self bounds] withSamples:samples andVsync:TRUE];  }  - (id) initWithSamples:(NSUInteger)samples andVsync:(BOOL)vsync  { -	return [self initWithFrame:[self bounds] withSamples:samples andVsync:vsync]; +    return [self initWithFrame:[self bounds] withSamples:samples andVsync:vsync];  }  #if LL_DARWIN @@ -248,21 +248,21 @@ attributedStringInfo getSegments(NSAttributedString *str)  - (id) initWithFrame:(NSRect)frame withSamples:(NSUInteger)samples andVsync:(BOOL)vsync  {      [self registerForDraggedTypes:[NSArray arrayWithObject:NSPasteboardTypeURL]]; -	[self initWithFrame:frame]; +    [self initWithFrame:frame]; -	// Initialize with a default "safe" pixel format that will work with versions dating back to OS X 10.6. -	// Any specialized pixel formats, i.e. a core profile pixel format, should be initialized through rebuildContextWithFormat. -	// 10.7 and 10.8 don't really care if we're defining a profile or not.  If we don't explicitly request a core or legacy profile, it'll always assume a legacy profile (for compatibility reasons). +    // Initialize with a default "safe" pixel format that will work with versions dating back to OS X 10.6. +    // Any specialized pixel formats, i.e. a core profile pixel format, should be initialized through rebuildContextWithFormat. +    // 10.7 and 10.8 don't really care if we're defining a profile or not.  If we don't explicitly request a core or legacy profile, it'll always assume a legacy profile (for compatibility reasons). -	NSOpenGLPixelFormatAttribute SDRAttrs[] = { +    NSOpenGLPixelFormatAttribute SDRAttrs[] = {          NSOpenGLPFANoRecovery, -		NSOpenGLPFADoubleBuffer, -		NSOpenGLPFAClosestPolicy, -		NSOpenGLPFAAccelerated, -		NSOpenGLPFADepthSize, 24, -		NSOpenGLPFAColorSize, 32, -		NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core, -		0 +        NSOpenGLPFADoubleBuffer, +        NSOpenGLPFAClosestPolicy, +        NSOpenGLPFAAccelerated, +        NSOpenGLPFADepthSize, 24, +        NSOpenGLPFAColorSize, 32, +        NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core, +        0      };      NSOpenGLPixelFormatAttribute HDRAttrs[] = { @@ -298,21 +298,21 @@ attributedStringInfo getSegments(NSAttributedString *str)          pixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:SDRAttrs] autorelease];      } -	if (pixelFormat == nil) -	{ -		NSLog(@"Failed to create pixel format!", nil); -		return nil; -	} +    if (pixelFormat == nil) +    { +        NSLog(@"Failed to create pixel format!", nil); +        return nil; +    } -	glContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:nil]; +    glContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:nil]; -	if (glContext == nil) -	{ -		NSLog(@"Failed to create OpenGL context!", nil); -		return nil; -	} +    if (glContext == nil) +    { +        NSLog(@"Failed to create OpenGL context!", nil); +        return nil; +    } -	[self setPixelFormat:pixelFormat]; +    [self setPixelFormat:pixelFormat];      if(mHDRDisplay)      { @@ -327,55 +327,55 @@ attributedStringInfo getSegments(NSAttributedString *str)          NSLog(@"Extended color space applied for HDR Display", nil);      } -	//for retina support -	[self setWantsBestResolutionOpenGLSurface:gHiDPISupport]; +    //for retina support +    [self setWantsBestResolutionOpenGLSurface:gHiDPISupport]; -	[self setOpenGLContext:glContext]; +    [self setOpenGLContext:glContext]; -	[glContext setView:self]; +    [glContext setView:self]; -	[glContext makeCurrentContext]; +    [glContext makeCurrentContext]; -	if (vsync) -	{ -		GLint value = 1; +    if (vsync) +    { +        GLint value = 1;          [glContext setValues:&value forParameter:NSOpenGLContextParameterSwapInterval]; -	} else { -		// supress this error after move to Xcode 7: -		// error: null passed to a callee that requires a non-null argument [-Werror,-Wnonnull] -		// Tried using ObjC 'nonnull' keyword as per SO article but didn't build -		GLint swapInterval=0; +    } else { +        // supress this error after move to Xcode 7: +        // error: null passed to a callee that requires a non-null argument [-Werror,-Wnonnull] +        // Tried using ObjC 'nonnull' keyword as per SO article but didn't build +        GLint swapInterval=0;          [glContext setValues:&swapInterval forParameter:NSOpenGLContextParameterSwapInterval]; -	} +    }      GLint opacity = 1;      [glContext setValues:&opacity forParameter:NSOpenGLCPSurfaceOpacity]; -	return self; +    return self;  }  - (BOOL) rebuildContext  { -	return [self rebuildContextWithFormat:[self pixelFormat]]; +    return [self rebuildContextWithFormat:[self pixelFormat]];  }  - (BOOL) rebuildContextWithFormat:(NSOpenGLPixelFormat *)format  { -	NSOpenGLContext *ctx = [self openGLContext]; +    NSOpenGLContext *ctx = [self openGLContext]; -	[ctx clearDrawable]; -	[ctx initWithFormat:format shareContext:nil]; +    [ctx clearDrawable]; +    [ctx initWithFormat:format shareContext:nil]; -	if (ctx == nil) -	{ -		NSLog(@"Failed to create OpenGL context!", nil); -		return false; -	} +    if (ctx == nil) +    { +        NSLog(@"Failed to create OpenGL context!", nil); +        return false; +    } -	[self setOpenGLContext:ctx]; -	[ctx setView:self]; -	[ctx makeCurrentContext]; -	return true; +    [self setOpenGLContext:ctx]; +    [ctx setView:self]; +    [ctx makeCurrentContext]; +    return true;  }  #if LL_DARWIN @@ -384,14 +384,14 @@ attributedStringInfo getSegments(NSAttributedString *str)  - (CGLContextObj)getCGLContextObj  { -	NSOpenGLContext *ctx = [self openGLContext]; -	return (CGLContextObj)[ctx CGLContextObj]; +    NSOpenGLContext *ctx = [self openGLContext]; +    return (CGLContextObj)[ctx CGLContextObj];  }  - (CGLPixelFormatObj*)getCGLPixelFormatObj  { -	NSOpenGLPixelFormat *fmt = [self pixelFormat]; -	return (CGLPixelFormatObj*)[fmt	CGLPixelFormatObj]; +    NSOpenGLPixelFormat *fmt = [self pixelFormat]; +    return (CGLPixelFormatObj*)[fmt CGLPixelFormatObj];  }  // Various events can be intercepted by our view, thus not reaching our window. @@ -436,29 +436,29 @@ attributedStringInfo getSegments(NSAttributedString *str)  - (void) rightMouseDown:(NSEvent *)theEvent  { -	callRightMouseDown(mMousePos, [theEvent modifierFlags]); +    callRightMouseDown(mMousePos, [theEvent modifierFlags]);  }  - (void) rightMouseUp:(NSEvent *)theEvent  { -	callRightMouseUp(mMousePos, [theEvent modifierFlags]); +    callRightMouseUp(mMousePos, [theEvent modifierFlags]);  }  - (void)mouseMoved:(NSEvent *)theEvent  {      NSPoint dev_delta = [self convertPointToBacking:NSMakePoint([theEvent deltaX], [theEvent deltaY])]; -	float mouseDeltas[] = { -		float(dev_delta.x), -		float(dev_delta.y) -	}; +    float mouseDeltas[] = { +        float(dev_delta.x), +        float(dev_delta.y) +    }; -	callDeltaUpdate(mouseDeltas, 0); +    callDeltaUpdate(mouseDeltas, 0);      NSPoint mPoint = [self convertPointToBacking:[theEvent locationInWindow]]; -	mMousePos[0] = mPoint.x; -	mMousePos[1] = mPoint.y; -	callMouseMoved(mMousePos, 0); +    mMousePos[0] = mPoint.x; +    mMousePos[1] = mPoint.y; +    callMouseMoved(mMousePos, 0);  }  // NSWindow doesn't trigger mouseMoved when the mouse is being clicked and dragged. @@ -466,23 +466,23 @@ attributedStringInfo getSegments(NSAttributedString *str)  - (void) mouseDragged:(NSEvent *)theEvent  { -	// Trust the deltas supplied by NSEvent. -	// The old CoreGraphics APIs we previously relied on are now flagged as obsolete. -	// NSEvent isn't obsolete, and provides us with the correct deltas. +    // Trust the deltas supplied by NSEvent. +    // The old CoreGraphics APIs we previously relied on are now flagged as obsolete. +    // NSEvent isn't obsolete, and provides us with the correct deltas.      NSPoint dev_delta = [self convertPointToBacking:NSMakePoint([theEvent deltaX], [theEvent deltaY])]; -	float mouseDeltas[] = { -		float(dev_delta.x), -		float(dev_delta.y) -	}; +    float mouseDeltas[] = { +        float(dev_delta.x), +        float(dev_delta.y) +    }; -	callDeltaUpdate(mouseDeltas, 0); +    callDeltaUpdate(mouseDeltas, 0); -	NSPoint mPoint = [self convertPointToBacking:[theEvent locationInWindow]]; -	mMousePos[0] = mPoint.x; -	mMousePos[1] = mPoint.y; -	callMouseDragged(mMousePos, 0); +    NSPoint mPoint = [self convertPointToBacking:[theEvent locationInWindow]]; +    mMousePos[0] = mPoint.x; +    mMousePos[1] = mPoint.y; +    callMouseDragged(mMousePos, 0);  }  - (void) otherMouseDown:(NSEvent *)theEvent @@ -497,29 +497,29 @@ attributedStringInfo getSegments(NSAttributedString *str)  - (void) rightMouseDragged:(NSEvent *)theEvent  { -	[self mouseDragged:theEvent]; +    [self mouseDragged:theEvent];  }  - (void) otherMouseDragged:(NSEvent *)theEvent  { -	[self mouseDragged:theEvent]; +    [self mouseDragged:theEvent];  }  - (void) scrollWheel:(NSEvent *)theEvent  { -	callScrollMoved(-[theEvent deltaX], -[theEvent deltaY]); +    callScrollMoved(-[theEvent deltaX], -[theEvent deltaY]);  }  - (void) mouseExited:(NSEvent *)theEvent  { -	callMouseExit(); +    callMouseExit();  }  - (void) keyUp:(NSEvent *)theEvent  {      NativeKeyEventData eventData = extractKeyDataFromKeyEvent(theEvent);      eventData.mKeyEvent = NativeKeyEventData::KEYUP; -	callKeyUp(&eventData, [theEvent keyCode], [theEvent modifierFlags]); +    callKeyUp(&eventData, [theEvent keyCode], [theEvent modifierFlags]);  }  - (void) keyDown:(NSEvent *)theEvent @@ -533,7 +533,7 @@ attributedStringInfo getSegments(NSAttributedString *str)      // Because flagsChange event handler misses event when other window is activated,      // e.g. OS Window for upload something or Input Window...      // mModifiers instance variable is for insertText: or insertText:replacementRange:  (by Pell Smit) -	mModifiers = [theEvent modifierFlags]; +    mModifiers = [theEvent modifierFlags];      NSString *str_no_modifiers = [theEvent charactersIgnoringModifiers];      unichar ch = 0;      if (str_no_modifiers.length) @@ -561,8 +561,8 @@ attributedStringInfo getSegments(NSAttributedString *str)  {      NativeKeyEventData eventData = extractKeyDataFromModifierEvent(theEvent); -	mModifiers = [theEvent modifierFlags]; -	callModifier([theEvent modifierFlags]); +    mModifiers = [theEvent modifierFlags]; +    callModifier([theEvent modifierFlags]);      NSInteger mask = 0;      switch([theEvent keyCode]) @@ -603,69 +603,69 @@ attributedStringInfo getSegments(NSAttributedString *str)  - (BOOL) acceptsFirstResponder  { -	return YES; +    return YES;  }  - (NSDragOperation) draggingEntered:(id<NSDraggingInfo>)sender  { -	NSPasteboard *pboard; +    NSPasteboard *pboard;      NSDragOperation sourceDragMask; -	sourceDragMask = [sender draggingSourceOperationMask]; +    sourceDragMask = [sender draggingSourceOperationMask]; -	pboard = [sender draggingPasteboard]; +    pboard = [sender draggingPasteboard];      if ([[pboard types] containsObject:NSPasteboardTypeURL]) -	{ -		if (sourceDragMask & NSDragOperationLink) { -			NSURL *fileUrl = [[pboard readObjectsForClasses:[NSArray arrayWithObject:[NSURL class]] options:[NSDictionary dictionary]] objectAtIndex:0]; -			mLastDraggedUrl = [[fileUrl absoluteString] UTF8String]; +    { +        if (sourceDragMask & NSDragOperationLink) { +            NSURL *fileUrl = [[pboard readObjectsForClasses:[NSArray arrayWithObject:[NSURL class]] options:[NSDictionary dictionary]] objectAtIndex:0]; +            mLastDraggedUrl = [[fileUrl absoluteString] UTF8String];              return NSDragOperationLink;          } -	} -	return NSDragOperationNone; +    } +    return NSDragOperationNone;  }  - (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender  { -	callHandleDragUpdated(mLastDraggedUrl); +    callHandleDragUpdated(mLastDraggedUrl); -	return NSDragOperationLink; +    return NSDragOperationLink;  }  - (void) draggingExited:(id<NSDraggingInfo>)sender  { -	callHandleDragExited(mLastDraggedUrl); +    callHandleDragExited(mLastDraggedUrl);  }  - (BOOL)prepareForDragOperation:(id < NSDraggingInfo >)sender  { -	return YES; +    return YES;  }  - (BOOL) performDragOperation:(id<NSDraggingInfo>)sender  { -	callHandleDragDropped(mLastDraggedUrl); -	return true; +    callHandleDragDropped(mLastDraggedUrl); +    return true;  }  - (BOOL)hasMarkedText  { -	return mHasMarkedText; +    return mHasMarkedText;  }  - (NSRange)markedRange  { -	int range[2]; -	getPreeditMarkedRange(&range[0], &range[1]); -	return NSMakeRange(range[0], range[1]); +    int range[2]; +    getPreeditMarkedRange(&range[0], &range[1]); +    return NSMakeRange(range[0], range[1]);  }  - (NSRange)selectedRange  { -	int range[2]; -	getPreeditSelectionRange(&range[0], &range[1]); -	return NSMakeRange(range[0], range[1]); +    int range[2]; +    getPreeditSelectionRange(&range[0], &range[1]); +    return NSMakeRange(range[0], range[1]);  }  - (void)setMarkedText:(id)aString selectedRange:(NSRange)selectedRange replacementRange:(NSRange)replacementRange @@ -751,21 +751,21 @@ attributedStringInfo getSegments(NSAttributedString *str)  - (void)unmarkText  { -	[[self inputContext] discardMarkedText]; -	resetPreedit(); -	mHasMarkedText = FALSE; +    [[self inputContext] discardMarkedText]; +    resetPreedit(); +    mHasMarkedText = FALSE;  }  // We don't support attributed strings.  - (NSArray *)validAttributesForMarkedText  { -	return [NSArray array]; +    return [NSArray array];  }  // See above.  - (NSAttributedString *)attributedSubstringForProposedRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange  { -	return nil; +    return nil;  }  - (void)insertText:(id)insertString @@ -778,9 +778,9 @@ attributedStringInfo getSegments(NSAttributedString *str)  - (void)insertText:(id)aString replacementRange:(NSRange)replacementRange  { -	// SL-19801 Special workaround for system emoji picker -	if ([aString length] == 2) -	{ +    // SL-19801 Special workaround for system emoji picker +    if ([aString length] == 2) +    {          @try          {              uint32_t b0 = [aString characterAtIndex:0]; @@ -798,7 +798,7 @@ attributedStringInfo getSegments(NSAttributedString *str)              NSLog(@"Encountered an unsupported attributed character. Exception: %@ String: %@", e.name, aString);              return;          } -	} +    }      @try      { @@ -831,36 +831,36 @@ attributedStringInfo getSegments(NSAttributedString *str)      if (!(mModifiers & NSEventModifierFlagCommand) &&          !(mModifiers & NSEventModifierFlagShift) &&          !(mModifiers & NSEventModifierFlagOption)) -	{ -		callUnicodeCallback(13, 0); -	} else { -		callUnicodeCallback(13, mModifiers); -	} +    { +        callUnicodeCallback(13, 0); +    } else { +        callUnicodeCallback(13, mModifiers); +    }  }  - (NSUInteger)characterIndexForPoint:(NSPoint)aPoint  { -	return NSNotFound; +    return NSNotFound;  }  - (NSRect)firstRectForCharacterRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange  { -	float pos[4] = {0, 0, 0, 0}; -	getPreeditLocation(pos, mMarkedTextLength); -	return NSMakeRect(pos[0], pos[1], pos[2], pos[3]); +    float pos[4] = {0, 0, 0, 0}; +    getPreeditLocation(pos, mMarkedTextLength); +    return NSMakeRect(pos[0], pos[1], pos[2], pos[3]);  }  - (void)doCommandBySelector:(SEL)aSelector  { -	if (aSelector == @selector(insertNewline:)) -	{ -		[self insertNewline:self]; -	} +    if (aSelector == @selector(insertNewline:)) +    { +        [self insertNewline:self]; +    }  }  - (BOOL)drawsVerticallyForCharacterAtIndex:(NSUInteger)charIndex  { -	return NO; +    return NO;  }  - (void) allowMarkedTextInput:(bool)allowed @@ -895,7 +895,7 @@ attributedStringInfo getSegments(NSAttributedString *str)  - (void) setGLView:(LLOpenGLView *)view  { -	glview = view; +    glview = view;  }  - (void)keyDown:(NSEvent *)theEvent @@ -946,24 +946,24 @@ attributedStringInfo getSegments(NSAttributedString *str)  - (id) init  { -	return self; +    return self;  }  - (BOOL) becomeFirstResponder  { -	callFocus(); -	return true; +    callFocus(); +    return true;  }  - (BOOL) resignFirstResponder  { -	callFocusLost(); -	return true; +    callFocusLost(); +    return true;  }  - (void) close  { -	callQuitHandler(); +    callQuitHandler();  }  @end diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index 8f8ea7fdb6..d63927d23d 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -95,6 +95,7 @@ public:  #if LL_WINDOWS && !LL_SDL      virtual bool getCursorDelta(LLCoordCommon* delta) = 0;  #endif +    virtual bool isWrapMouse() const = 0;      virtual void showCursor() = 0;      virtual void hideCursor() = 0;      virtual bool isCursorHidden() = 0; diff --git a/indra/llwindow/llwindowcallbacks.cpp b/indra/llwindow/llwindowcallbacks.cpp index 195f68e08b..7331f50ba0 100644 --- a/indra/llwindow/llwindowcallbacks.cpp +++ b/indra/llwindow/llwindowcallbacks.cpp @@ -68,7 +68,13 @@ void LLWindowCallbacks::handleMouseLeave(LLWindow *window)      return;  } -bool LLWindowCallbacks::handleCloseRequest(LLWindow *window) +bool LLWindowCallbacks::handleCloseRequest(LLWindow *window, bool from_user) +{ +    //allow the window to close +    return true; +} + +bool LLWindowCallbacks::handleSessionExit(LLWindow* window)  {      //allow the window to close      return true; diff --git a/indra/llwindow/llwindowcallbacks.h b/indra/llwindow/llwindowcallbacks.h index d812f93524..59dcdd3ade 100644 --- a/indra/llwindow/llwindowcallbacks.h +++ b/indra/llwindow/llwindowcallbacks.h @@ -42,7 +42,8 @@ public:      virtual bool handleMouseUp(LLWindow *window,  LLCoordGL pos, MASK mask);      virtual void handleMouseLeave(LLWindow *window);      // return true to allow window to close, which will then cause handleQuit to be called -    virtual bool handleCloseRequest(LLWindow *window); +    virtual bool handleCloseRequest(LLWindow *window, bool from_user); +    virtual bool handleSessionExit(LLWindow* window);      // window is about to be destroyed, clean up your business      virtual void handleQuit(LLWindow *window);      virtual bool handleRightMouseDown(LLWindow *window,  LLCoordGL pos, MASK mask); diff --git a/indra/llwindow/llwindowheadless.h b/indra/llwindow/llwindowheadless.h index acec401133..0a1ecb05e0 100644 --- a/indra/llwindow/llwindowheadless.h +++ b/indra/llwindow/llwindowheadless.h @@ -63,6 +63,7 @@ public:  #if LL_WINDOWS && !LL_SDL      /*virtual*/ bool getCursorDelta(LLCoordCommon* delta) override { return false; }  #endif +    /*virtual*/ bool isWrapMouse() const override { return true; }      /*virtual*/ void showCursor() override {}      /*virtual*/ void hideCursor() override {}      /*virtual*/ void showCursorFromMouseMove() override {} diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm index 42cd95be5d..d902a82a3c 100644 --- a/indra/llwindow/llwindowmacosx-objc.mm +++ b/indra/llwindow/llwindowmacosx-objc.mm @@ -41,15 +41,15 @@  int createNSApp(int argc, const char *argv[])  { -	return NSApplicationMain(argc, argv); +    return NSApplicationMain(argc, argv);  }  void setupCocoa()  { -	static bool inited = false; -	 -	if(!inited) -	{ +    static bool inited = false; + +    if(!inited) +    {          @autoreleasepool {              // The following prevents the Cocoa command line parser from trying to open 'unknown' arguements as documents.              // ie. running './secondlife -set Language fr' would cause a pop-up saying can't open document 'fr' @@ -57,8 +57,8 @@ void setupCocoa()              [[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"];          } -		inited = true; -	} +        inited = true; +    }  }  bool copyToPBoard(const unsigned short *str, unsigned int len) @@ -66,7 +66,7 @@ bool copyToPBoard(const unsigned short *str, unsigned int len)      @autoreleasepool {          NSPasteboard *pboard = [NSPasteboard generalPasteboard];          [pboard clearContents]; -         +          NSArray *contentsToPaste = [[[NSArray alloc] initWithObjects:[NSString stringWithCharacters:str length:len], nil] autorelease];          return [pboard writeObjects:contentsToPaste];      } @@ -74,8 +74,8 @@ bool copyToPBoard(const unsigned short *str, unsigned int len)  bool pasteBoardAvailable()  { -	NSArray *classArray = [NSArray arrayWithObject:[NSString class]]; -	return [[NSPasteboard generalPasteboard] canReadObjectForClasses:classArray options:[NSDictionary dictionary]]; +    NSArray *classArray = [NSArray arrayWithObject:[NSString class]]; +    return [[NSPasteboard generalPasteboard] canReadObjectForClasses:classArray options:[NSDictionary dictionary]];  }  unsigned short *copyFromPBoard() @@ -111,55 +111,55 @@ CursorRef createImageCursor(const char *fullpath, int hotspotX, int hotspotY)            hotSpot:NSMakePoint(hotspotX, hotspotY)           ] retain];      } -	 -	return (CursorRef)cursor; + +    return (CursorRef)cursor;  }  void setArrowCursor()  { -	NSCursor *cursor = [NSCursor arrowCursor]; -	[NSCursor unhide]; -	[cursor set]; +    NSCursor *cursor = [NSCursor arrowCursor]; +    [NSCursor unhide]; +    [cursor set];  }  void setIBeamCursor()  { -	NSCursor *cursor = [NSCursor IBeamCursor]; -	[cursor set]; +    NSCursor *cursor = [NSCursor IBeamCursor]; +    [cursor set];  }  void setPointingHandCursor()  { -	NSCursor *cursor = [NSCursor pointingHandCursor]; -	[cursor set]; +    NSCursor *cursor = [NSCursor pointingHandCursor]; +    [cursor set];  }  void setCopyCursor()  { -	NSCursor *cursor = [NSCursor dragCopyCursor]; -	[cursor set]; +    NSCursor *cursor = [NSCursor dragCopyCursor]; +    [cursor set];  }  void setCrossCursor()  { -	NSCursor *cursor = [NSCursor crosshairCursor]; -	[cursor set]; +    NSCursor *cursor = [NSCursor crosshairCursor]; +    [cursor set];  }  void setNotAllowedCursor()  { -	NSCursor *cursor = [NSCursor operationNotAllowedCursor]; -	[cursor set]; +    NSCursor *cursor = [NSCursor operationNotAllowedCursor]; +    [cursor set];  }  void hideNSCursor()  { -	[NSCursor hide]; +    [NSCursor hide];  }  void showNSCursor()  { -	[NSCursor unhide]; +    [NSCursor unhide];  }  #if LL_DARWIN @@ -179,42 +179,42 @@ bool isCGCursorVisible()  void hideNSCursorTillMove(bool hide)  { -	[NSCursor setHiddenUntilMouseMoves:hide]; +    [NSCursor setHiddenUntilMouseMoves:hide];  }  // This is currently unused, since we want all our cursors to persist for the life of the app, but I've included it for completeness.  OSErr releaseImageCursor(CursorRef ref)  { -	if( ref != NULL ) -	{ +    if( ref != NULL ) +    {          @autoreleasepool {              NSCursor *cursor = (NSCursor*)ref;              [cursor autorelease];          } -	} -	else -	{ -		return paramErr; -	} -	 -	return noErr; +    } +    else +    { +        return paramErr; +    } + +    return noErr;  }  OSErr setImageCursor(CursorRef ref)  { -	if( ref != NULL ) -	{ +    if( ref != NULL ) +    {          @autoreleasepool {              NSCursor *cursor = (NSCursor*)ref;              [cursor set];          } -	} -	else -	{ -		return paramErr; -	} -	 -	return noErr; +    } +    else +    { +        return paramErr; +    } + +    return noErr;  }  // Now for some unholy juggling between generic pointers and casting them to Obj-C objects! @@ -222,46 +222,46 @@ OSErr setImageCursor(CursorRef ref)  NSWindowRef createNSWindow(int x, int y, int width, int height)  { -	LLNSWindow *window = [[LLNSWindow alloc]initWithContentRect:NSMakeRect(x, y, width, height) +    LLNSWindow *window = [[LLNSWindow alloc]initWithContentRect:NSMakeRect(x, y, width, height)                                                        styleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskResizable | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable                                                          backing:NSBackingStoreBuffered defer:NO]; -	[window makeKeyAndOrderFront:nil]; -	[window setAcceptsMouseMovedEvents:TRUE]; +    [window makeKeyAndOrderFront:nil]; +    [window setAcceptsMouseMovedEvents:TRUE];      [window setRestorable:FALSE]; // Viewer manages state from own settings -	return window; +    return window;  }  GLViewRef createOpenGLView(NSWindowRef window, unsigned int samples, bool vsync)  { -	LLOpenGLView *glview = [[LLOpenGLView alloc]initWithFrame:[(LLNSWindow*)window frame] withSamples:samples andVsync:vsync]; -	[(LLNSWindow*)window setContentView:glview]; -	return glview; +    LLOpenGLView *glview = [[LLOpenGLView alloc]initWithFrame:[(LLNSWindow*)window frame] withSamples:samples andVsync:vsync]; +    [(LLNSWindow*)window setContentView:glview]; +    return glview;  }  void glSwapBuffers(void* context)  { -	[(NSOpenGLContext*)context flushBuffer]; +    [(NSOpenGLContext*)context flushBuffer];  }  CGLContextObj getCGLContextObj(GLViewRef view)  { -	return [(LLOpenGLView *)view getCGLContextObj]; +    return [(LLOpenGLView *)view getCGLContextObj];  }  CGLPixelFormatObj* getCGLPixelFormatObj(NSWindowRef window)  { -	LLOpenGLView *glview = [(LLNSWindow*)window contentView]; -	return [glview getCGLPixelFormatObj]; +    LLOpenGLView *glview = [(LLNSWindow*)window contentView]; +    return [glview getCGLPixelFormatObj];  }  unsigned long getVramSize(GLViewRef view)  { -	return [(LLOpenGLView *)view getVramSize]; +    return [(LLOpenGLView *)view getVramSize];  }  float getDeviceUnitSize(GLViewRef view)  { -	return [(LLOpenGLView*)view convertSizeToBacking:NSMakeSize(1, 1)].width; +    return [(LLOpenGLView*)view convertSizeToBacking:NSMakeSize(1, 1)].width;  }  CGRect getContentViewRect(NSWindowRef window) @@ -276,48 +276,48 @@ CGRect getBackingViewRect(NSWindowRef window, GLViewRef view)  void getWindowSize(NSWindowRef window, float* size)  { -	NSRect frame = [(LLNSWindow*)window frame]; -	size[0] = frame.origin.x; -	size[1] = frame.origin.y; -	size[2] = frame.size.width; -	size[3] = frame.size.height; +    NSRect frame = [(LLNSWindow*)window frame]; +    size[0] = frame.origin.x; +    size[1] = frame.origin.y; +    size[2] = frame.size.width; +    size[3] = frame.size.height;  }  void setWindowSize(NSWindowRef window, int width, int height)  { -	NSRect frame = [(LLNSWindow*)window frame]; -	frame.size.width = width; -	frame.size.height = height; -	[(LLNSWindow*)window setFrame:frame display:TRUE]; +    NSRect frame = [(LLNSWindow*)window frame]; +    frame.size.width = width; +    frame.size.height = height; +    [(LLNSWindow*)window setFrame:frame display:TRUE];  }  void setWindowPos(NSWindowRef window, float* pos)  { -	NSPoint point; -	point.x = pos[0]; -	point.y = pos[1]; -	[(LLNSWindow*)window setFrameOrigin:point]; +    NSPoint point; +    point.x = pos[0]; +    point.y = pos[1]; +    [(LLNSWindow*)window setFrameOrigin:point];  }  void getCursorPos(NSWindowRef window, float* pos)  { -	NSPoint mLoc; -	mLoc = [(LLNSWindow*)window mouseLocationOutsideOfEventStream]; -	pos[0] = mLoc.x; -	pos[1] = mLoc.y; +    NSPoint mLoc; +    mLoc = [(LLNSWindow*)window mouseLocationOutsideOfEventStream]; +    pos[0] = mLoc.x; +    pos[1] = mLoc.y;  }  void makeWindowOrderFront(NSWindowRef window)  { -	[(LLNSWindow*)window makeKeyAndOrderFront:nil]; +    [(LLNSWindow*)window makeKeyAndOrderFront:nil];  }  void convertScreenToWindow(NSWindowRef window, float *coord)  {      NSRect point = NSMakeRect(coord[0], coord[1], 0,0); -	point = [(LLNSWindow*)window convertRectFromScreen:point]; -	coord[0] = point.origin.x; -	coord[1] = point.origin.y; +    point = [(LLNSWindow*)window convertRectFromScreen:point]; +    coord[0] = point.origin.x; +    coord[1] = point.origin.y;  }  void convertRectToScreen(NSWindowRef window, float *coord) @@ -325,21 +325,21 @@ void convertRectToScreen(NSWindowRef window, float *coord)      NSRect rect = NSMakeRect(coord[0], coord[1], coord[2], coord[3]);;      rect = [(LLNSWindow*)window convertRectToScreen:rect]; -	coord[0] = rect.origin.x; -	coord[1] = rect.origin.y; -	coord[2] = rect.size.width; -	coord[3] = rect.size.height; +    coord[0] = rect.origin.x; +    coord[1] = rect.origin.y; +    coord[2] = rect.size.width; +    coord[3] = rect.size.height;  }  void convertRectFromScreen(NSWindowRef window, float *coord)  { -	NSRect point = NSMakeRect(coord[0], coord[1], coord[2], coord[3]); -	point = [(LLNSWindow*)window convertRectFromScreen:point]; -	 -	coord[0] = point.origin.x; -	coord[1] = point.origin.y; -	coord[2] = point.size.width; -	coord[3] = point.size.height; +    NSRect point = NSMakeRect(coord[0], coord[1], coord[2], coord[3]); +    point = [(LLNSWindow*)window convertRectFromScreen:point]; + +    coord[0] = point.origin.x; +    coord[1] = point.origin.y; +    coord[2] = point.size.width; +    coord[3] = point.size.height;  }  void convertWindowToScreen(NSWindowRef window, float *coord) @@ -353,24 +353,24 @@ void convertWindowToScreen(NSWindowRef window, float *coord)  void closeWindow(NSWindowRef window)  { -	[(LLNSWindow*)window close]; -	[(LLNSWindow*)window release]; +    [(LLNSWindow*)window close]; +    [(LLNSWindow*)window release];  }  void removeGLView(GLViewRef view)  { -	[(LLOpenGLView*)view clearGLContext]; -	[(LLOpenGLView*)view removeFromSuperview]; +    [(LLOpenGLView*)view clearGLContext]; +    [(LLOpenGLView*)view removeFromSuperview];  }  void setupInputWindow(NSWindowRef window, GLViewRef glview)  { -	[[(LLAppDelegate*)[NSApp delegate] inputView] setGLView:(LLOpenGLView*)glview]; +    [[(LLAppDelegate*)[NSApp delegate] inputView] setGLView:(LLOpenGLView*)glview];  }  void commitCurrentPreedit(GLViewRef glView)  { -	[(LLOpenGLView*)glView commitCurrentPreedit]; +    [(LLOpenGLView*)glView commitCurrentPreedit];  }  void allowDirectMarkedTextInput(bool allow, GLViewRef glView) @@ -380,20 +380,20 @@ void allowDirectMarkedTextInput(bool allow, GLViewRef glView)  NSWindowRef getMainAppWindow()  { -	LLNSWindow *winRef = [(LLAppDelegate*)[[NSApplication sharedApplication] delegate] window]; -	 -	[winRef setAcceptsMouseMovedEvents:TRUE]; -	return winRef; +    LLNSWindow *winRef = [(LLAppDelegate*)[[NSApplication sharedApplication] delegate] window]; + +    [winRef setAcceptsMouseMovedEvents:TRUE]; +    return winRef;  }  void makeFirstResponder(NSWindowRef window, GLViewRef view)  { -	[(LLNSWindow*)window makeFirstResponder:(LLOpenGLView*)view]; +    [(LLNSWindow*)window makeFirstResponder:(LLOpenGLView*)view];  }  void requestUserAttention()  { -	[[NSApplication sharedApplication] requestUserAttention:NSInformationalRequest]; +    [[NSApplication sharedApplication] requestUserAttention:NSInformationalRequest];  }  long showAlert(std::string text, std::string title, int type) @@ -401,7 +401,7 @@ long showAlert(std::string text, std::string title, int type)      long ret = 0;      @autoreleasepool {          NSAlert *alert = [[[NSAlert alloc] init] autorelease]; -         +          [alert setMessageText:[NSString stringWithCString:title.c_str() encoding:[NSString defaultCStringEncoding]]];          [alert setInformativeText:[NSString stringWithCString:text.c_str() encoding:[NSString defaultCStringEncoding]]];          if (type == 0) @@ -418,7 +418,7 @@ long showAlert(std::string text, std::string title, int type)          }          ret = [alert runModal];      } -     +      if (ret == NSAlertFirstButtonReturn)      {          if (type == 1) @@ -438,7 +438,7 @@ long showAlert(std::string text, std::string title, int type)              ret = 1;          }      } -     +      return ret;  } @@ -451,5 +451,5 @@ long showAlert(std::string text, std::string title, int type)  unsigned int getModifiers()  { -	return [NSEvent modifierFlags]; +    return [NSEvent modifierFlags];  } diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 4a4b2658f6..0bf1c4b057 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -613,7 +613,7 @@ void callQuitHandler()  {      if (gWindowImplementation && gWindowImplementation->getCallbacks())      { -        if(gWindowImplementation->getCallbacks()->handleCloseRequest(gWindowImplementation)) +        if(gWindowImplementation->getCallbacks()->handleCloseRequest(gWindowImplementation, true))          {              gWindowImplementation->getCallbacks()->handleQuit(gWindowImplementation);          } diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index 110c5756d0..d703a84d02 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -63,6 +63,7 @@ public:      bool switchContext(bool fullscreen, const LLCoordScreen &size, bool enable_vsync, const LLCoordScreen * const posp = NULL) override;      bool setCursorPosition(LLCoordWindow position) override;      bool getCursorPosition(LLCoordWindow *position) override; +    bool isWrapMouse() const override { return !mCursorDecoupled; };      void showCursor() override;      void hideCursor() override;      void showCursorFromMouseMove() override; diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 0a117be1fc..ad40dea0c3 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -1722,7 +1722,7 @@ void LLWindowSDL::gatherInput()                  break;              }              case SDL_QUIT: -                if(mCallbacks->handleCloseRequest(this)) +                if(mCallbacks->handleCloseRequest(this, true))                  {                      // Get the app to initiate cleanup.                      mCallbacks->handleQuit(this); diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h index 076d7234bc..d9b6be5fdc 100644 --- a/indra/llwindow/llwindowsdl.h +++ b/indra/llwindow/llwindowsdl.h @@ -91,6 +91,8 @@ public:      bool getCursorPosition(LLCoordWindow *position) override; +    bool isWrapMouse() const override { return true; } +      void showCursor() override;      void hideCursor() override; diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index cfc2038be9..5471e1c87a 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -450,6 +450,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,                               F32 max_gl_version)      :      LLWindow(callbacks, fullscreen, flags), +    mAbsoluteCursorPosition(false),      mMaxGLVersion(max_gl_version),      mMaxCores(max_cores)  { @@ -2466,10 +2467,13 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_          case WM_CLOSE:          {              LL_PROFILE_ZONE_NAMED_CATEGORY_WIN32("mwp - WM_CLOSE"); +            // todo: WM_CLOSE can be caused by user and by task manager, +            // distinguish these cases. +            // For now assume it is always user.              window_imp->post([=]()                  {                      // Will the app allow the window to close? -                    if (window_imp->mCallbacks->handleCloseRequest(window_imp)) +                    if (window_imp->mCallbacks->handleCloseRequest(window_imp, true))                      {                          // Get the app to initiate cleanup.                          window_imp->mCallbacks->handleQuit(window_imp); @@ -2487,6 +2491,50 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_              }              return 0;          } +        case WM_QUERYENDSESSION: +        { +            // Generally means that OS is going to shut down or user is going to log off. +            // Can use ShutdownBlockReasonCreate here. +            LL_INFOS("Window") << "Received WM_QUERYENDSESSION with wParam: " << (U32)w_param << " lParam: " << (U32)l_param << LL_ENDL; +            return TRUE; // 1 = ok to end session. 0 no longer works by itself, use ShutdownBlockReasonCreate +        } +        case WM_ENDSESSION: +        { +            // OS session is shutting down, initiate cleanup. +            // Comes after WM_QUERYENDSESSION +            LL_PROFILE_ZONE_NAMED_CATEGORY_WIN32("mwp - WM_ENDSESSION"); +            LL_INFOS("Window") << "Received WM_ENDSESSION with wParam: " << (U32)w_param << " lParam: " << (U32)l_param << LL_ENDL; +            unsigned int end_session_flags = (U32)w_param; +            if (end_session_flags == 0) +            { +                // session is not actually ending +                return 0; +            } + +            if ((end_session_flags & ENDSESSION_CLOSEAPP) +                || (end_session_flags & ENDSESSION_CRITICAL) +                || (end_session_flags & ENDSESSION_LOGOFF)) +            { +                window_imp->post([=]() +                { +                    // Check if app needs cleanup or can be closed immediately. +                    if (window_imp->mCallbacks->handleSessionExit(window_imp)) +                    { +                        // Get the app to initiate cleanup. +                        window_imp->mCallbacks->handleQuit(window_imp); +                        // The app is responsible for calling destroyWindow when done with GL +                    } +                }); +                // Give app a second to finish up. That's not enough for a clean exit, +                // but better than nothing. +                // Todo: sync this better, some kind of waitForResult? Can't wait forever, +                // but can potentially use ShutdownBlockReasonCreate for a bigger delay. +                ms_sleep(1000); +            } +            // Don't need to post quit or destroy window, +            // if session is ending OS is going to take care of it. +            return 0; +        }          case WM_COMMAND:          {              LL_PROFILE_ZONE_NAMED_CATEGORY_WIN32("mwp - WM_COMMAND"); @@ -3111,6 +3159,7 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_                          prev_absolute_x = absolute_x;                          prev_absolute_y = absolute_y; +                        window_imp->mAbsoluteCursorPosition = true;                      }                      else                      { @@ -3127,6 +3176,7 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_                              window_imp->mRawMouseDelta.mX += (S32)round((F32)raw->data.mouse.lLastX * (F32)speed / DEFAULT_SPEED);                              window_imp->mRawMouseDelta.mY -= (S32)round((F32)raw->data.mouse.lLastY * (F32)speed / DEFAULT_SPEED);                          } +                        window_imp->mAbsoluteCursorPosition = false;                      }                  }              } diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h index 7196706f87..0fc93ad0b1 100644 --- a/indra/llwindow/llwindowwin32.h +++ b/indra/llwindow/llwindowwin32.h @@ -70,6 +70,7 @@ public:      /*virtual*/ bool setCursorPosition(LLCoordWindow position);      /*virtual*/ bool getCursorPosition(LLCoordWindow *position);      /*virtual*/ bool getCursorDelta(LLCoordCommon* delta); +    /*virtual*/ bool isWrapMouse() const override { return !mAbsoluteCursorPosition; };      /*virtual*/ void showCursor();      /*virtual*/ void hideCursor();      /*virtual*/ void showCursorFromMouseMove(); @@ -195,6 +196,7 @@ protected:      HCURSOR     mCursor[ UI_CURSOR_COUNT ];  // Array of all mouse cursors      LLCoordWindow mCursorPosition;  // mouse cursor position, should only be mutated on main thread +    bool        mAbsoluteCursorPosition; // true if last position was received in absolute coordinates.      LLMutex mRawMouseMutex;      RAWINPUTDEVICE mRawMouse;      LLCoordWindow mLastCursorPosition; // mouse cursor position from previous frame diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index e033fd57bf..88e12e07cf 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -58,7 +58,7 @@ if (ENABLE_MEDIA_PLUGINS)      include(CEFPlugin)  endif () -if (NOT HAVOK_TPV) +if (HAVOK)     # When using HAVOK_TPV, the library is precompiled, so no need for this     # Stub and probably havok lib itself is a hack, autobuild loads a 3p that really is a source tarball @@ -84,7 +84,7 @@ if (NOT HAVOK_TPV)          target_compile_options( llphysicsextensions  PRIVATE -Wno-unused-local-typedef)        endif (DARWIN)     endif() -endif (NOT HAVOK_TPV) +endif ()  set(viewer_SOURCE_FILES      gltfscenemanager.cpp @@ -1744,10 +1744,6 @@ if (WINDOWS)    list(APPEND viewer_SOURCE_FILES ${viewer_INSTALLER_FILES})  endif (WINDOWS) -if (HAVOK OR HAVOK_TPV) -  set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_HAVOK") -endif (HAVOK OR HAVOK_TPV) -  if( DEFINED LLSTARTUP_COMPILE_FLAGS )     # progress view disables/enables icons based on available packages     set_source_files_properties(llprogressview.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}") @@ -2093,13 +2089,30 @@ elseif (DARWIN)          PROPERTIES          RESOURCE SecondLife.xib          LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -Xlinker -dead_strip" -        # arch specific flags for universal builds: https://stackoverflow.com/a/77942065 -        XCODE_ATTRIBUTE_OTHER_CFLAGS[arch=x86_64]  "$(inherited) -DLLPHYSICSEXTENSIONS_USE_FULL" -        XCODE_ATTRIBUTE_OTHER_CFLAGS[arch=arm64]   "$(inherited) -DLLPHYSICSEXTENSIONS_USE_STUB" -        # only generate the .MAP file for llphysicsextensions_tpv on x86_64 -        XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=x86_64] "$(inherited) -L${CMAKE_CURRENT_BINARY_DIR}/llphysicsextensions/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,${CMAKE_CFG_INTDIR}>/ -lllphysicsextensions  -Xlinker -map -Xlinker ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_BINARY_NAME}.MAP" -        XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=arm64]  "$(inherited) -L${CMAKE_CURRENT_BINARY_DIR}/llphysicsextensionsstub/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,${CMAKE_CFG_INTDIR}>/ -lllphysicsextensionsstub"          ) +    if(HAVOK) +      set_target_properties(${VIEWER_BINARY_NAME} +          PROPERTIES +          # arch specific flags for universal builds: https://stackoverflow.com/a/77942065 +          XCODE_ATTRIBUTE_OTHER_CFLAGS[arch=x86_64]  "$(inherited) -DLLPHYSICSEXTENSIONS_USE_FULL -DLL_HAVOK=1" +          XCODE_ATTRIBUTE_OTHER_CFLAGS[arch=arm64]   "$(inherited) -DLLPHYSICSEXTENSIONS_USE_STUB" +          # only generate the .MAP file for llphysicsextensions_tpv on x86_64 +          XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=x86_64] "$(inherited) -L${CMAKE_CURRENT_BINARY_DIR}/llphysicsextensions/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,${CMAKE_CFG_INTDIR}>/ -lllphysicsextensions  -Xlinker -map -Xlinker ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_BINARY_NAME}.MAP" +          XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=arm64]  "$(inherited) -L${CMAKE_BINARY_DIR}/llphysicsextensionsos/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,${CMAKE_CFG_INTDIR}>/ -lllphysicsextensionsos" +          ) +    elseif(HAVOK_TPV) +      set_target_properties(${VIEWER_BINARY_NAME} +          PROPERTIES +          # arch specific flags for universal builds: https://stackoverflow.com/a/77942065 +          XCODE_ATTRIBUTE_OTHER_CFLAGS[arch=x86_64]  "$(inherited) -DLLPHYSICSEXTENSIONS_USE_FULL -DLL_HAVOK=1" +          XCODE_ATTRIBUTE_OTHER_CFLAGS[arch=arm64]   "$(inherited) -DLLPHYSICSEXTENSIONS_USE_STUB" +          # only generate the .MAP file for llphysicsextensions_tpv on x86_64 +          XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=x86_64] "$(inherited) -L${ARCH_PREBUILT_DIRS}/ -lllphysicsextensions_tpv" +          XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=arm64]  "$(inherited) -L${CMAKE_BINARY_DIR}/llphysicsextensionsos/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,${CMAKE_CFG_INTDIR}>/ -lllphysicsextensionsos" +          ) +    else() +      target_link_libraries(${VIEWER_BINARY_NAME} llphysicsextensionsos) +    endif()  else (WINDOWS)          # Linux      set_target_properties(${VIEWER_BINARY_NAME} @@ -2187,6 +2200,10 @@ if( TARGET ll::nvapi )     target_link_libraries(${VIEWER_BINARY_NAME} ll::nvapi )  endif() +if ( TARGET llconvexdecomposition ) +    target_link_libraries(${VIEWER_BINARY_NAME} llconvexdecomposition ) +endif () +  set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH      "Path to artwork files.") diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 77f5bec5b2..429dc57af3 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -7.2.2 +7.2.3 diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index d9cf46a4af..ecea9a3238 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2491,16 +2491,16 @@        <key>Value</key>        <integer>0</integer>      </map> -    <key>DisableMouseWarp</key> +    <key>MouseWarpMode</key>      <map>        <key>Comment</key> -      <string>Disable warping of the mouse to the center of the screen during alt-zoom and mouse look. Useful with certain input devices, mouse sharing programs like Synergy, or running under Parallels.</string> +      <string>Controls warping of the mouse to the center of the screen during alt-zoom and mouse look. Useful with certain input devices, mouse sharing programs like Synergy, or running under Parallels. 0 - automatic, 1 - on, 2 - off</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> -      <string>Boolean</string> +      <string>S32</string>        <key>Value</key> -      <integer>0</integer> +      <integer>1</integer>      </map>      <key>DisableExternalBrowser</key>      <map> @@ -2612,7 +2612,7 @@        <key>Value</key>        <integer>0</integer>      </map> -    <key>DoubleClickTeleport</key> +    <key>DoubleClickTeleport</key>       <map>        <key>Comment</key>        <string>Enable double-click to teleport where allowed (afects minimap and people panel)</string> @@ -4413,7 +4413,7 @@      <key>Type</key>      <string>F32</string>      <key>Value</key> -    <real>40.0</real> +    <real>90.0</real>    </map>    <key>LogMessages</key>      <map> @@ -7929,7 +7929,7 @@    <key>RenderMaxOpenGLVersion</key>    <map>      <key>Comment</key> -    <string>Maximum OpenGL version to attempt use (minimum 3.1 maximum 4.6).  Requires restart.</string> +    <string>Maximum OpenGL version to attempt use (minimum 3.1 maximum 4.6).  Requires restart. Windows only.</string>      <key>Persist</key>      <integer>1</integer>      <key>Type</key> @@ -9177,7 +9177,7 @@      <key>RenderQualityPerformance</key>      <map>        <key>Comment</key> -      <string>Which graphics settings you've chosen</string> +      <string>Which graphics settings you've chosen. Don't use this setting to change quality directly from debug settings.</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -9185,6 +9185,17 @@        <key>Value</key>        <integer>1</integer>      </map> +    <key>DebugQualityPerformance</key> +    <map> +        <key>Comment</key> +        <string>Allows to change performance quality directly from debug settings.</string> +        <key>Persist</key> +        <integer>1</integer> +        <key>Type</key> +        <string>U32</string> +        <key>Value</key> +        <integer>1</integer> +    </map>    <key>RenderReflectionDetail</key>      <map> @@ -9274,7 +9285,7 @@      <key>Value</key>      <real>1.0</real>    </map> - +      <key>RenderReflectionProbeDrawDistance</key>    <map>      <key>Comment</key> @@ -9473,7 +9484,7 @@      <key>Value</key>      <real>1.0</real>    </map> - +      <key>RenderReflectionProbeMaxLocalLightAmbiance</key>    <map>      <key>Comment</key> @@ -10473,13 +10484,13 @@    <key>SceneLoadRearMaxRadiusFraction</key>    <map>      <key>Comment</key> -    <string>a percentage of draw distance beyond which all objects outside of view frustum will be unloaded, regardless of pixel threshold</string> +    <string>a fraction of draw distance beyond which all objects outside of view frustum will be unloaded, regardless of pixel threshold</string>      <key>Persist</key>      <integer>1</integer>      <key>Type</key>      <string>F32</string>      <key>Value</key> -    <real>75.0</real> +    <real>0.75</real>    </map>      <key>SceneLoadRearPixelThreshold</key>      <map> @@ -11074,7 +11085,7 @@              <string>Boolean</string>          <key>Value</key>              <integer>0</integer> -    </map> +    </map>       <key>NearbyListShowMap</key>      <map>        <key>Comment</key> @@ -13190,9 +13201,9 @@      <key>Use24HourClock</key>      <map>          <key>Comment</key> -        <string>12 vs 24. At the moment only for region restart schedule floater</string> +        <string>12 vs 24. At the moment coverage is partial</string>          <key>Persist</key> -        <integer>0</integer> +        <integer>1</integer>          <key>Type</key>          <string>Boolean</string>          <key>Value</key> diff --git a/indra/newview/gltf/accessor.cpp b/indra/newview/gltf/accessor.cpp index 03f7331893..f0ad3fa594 100644 --- a/indra/newview/gltf/accessor.cpp +++ b/indra/newview/gltf/accessor.cpp @@ -158,6 +158,11 @@ bool Buffer::prep(Asset& asset)      {          std::string dir = gDirUtilp->getDirName(asset.mFilename);          std::string bin_file = dir + gDirUtilp->getDirDelimiter() + mUri; +        if (!gDirUtilp->fileExists(bin_file)) +        { +            // Characters might be escaped in the URI +            bin_file = dir + gDirUtilp->getDirDelimiter() + LLURI::unescape(mUri); +        }          llifstream file(bin_file.c_str(), std::ios::binary);          if (!file.is_open()) diff --git a/indra/newview/gltf/llgltfloader.cpp b/indra/newview/gltf/llgltfloader.cpp index dd1d327683..4f8f80129d 100644 --- a/indra/newview/gltf/llgltfloader.cpp +++ b/indra/newview/gltf/llgltfloader.cpp @@ -412,17 +412,14 @@ void LLGLTFLoader::processNodeHierarchy(S32 node_idx, std::map<std::string, S32>      // Process this node's mesh if it has one      if (node.mMesh >= 0 && node.mMesh < mGLTFAsset.mMeshes.size())      { -        LLMatrix4    transformation; -        material_map mats; - -        LLModel* pModel = new LLModel(volume_params, 0.f); -        const LL::GLTF::Mesh& mesh = mGLTFAsset.mMeshes[node.mMesh]; - -        // Get base mesh name and track usage -        std::string base_name = getLodlessLabel(mesh); +        // Get base node name and track usage +        // Potentially multiple nodes can reuse the same mesh and Collada used +        // node name instead of mesh name, so for consistency use node name if +        // avaliable, node index otherwise. +        std::string base_name = getLodlessLabel(node);          if (base_name.empty())          { -            base_name = "mesh_" + std::to_string(node.mMesh); +            base_name = "node_" + std::to_string(node_idx);          }          S32 instance_count = mesh_name_counts[base_name]++; @@ -433,6 +430,12 @@ void LLGLTFLoader::processNodeHierarchy(S32 node_idx, std::map<std::string, S32>              base_name = base_name + "_copy_" + std::to_string(instance_count);          } +        LLMatrix4    transformation; +        material_map mats; + +        LLModel* pModel = new LLModel(volume_params, 0.f); +        const LL::GLTF::Mesh& mesh = mGLTFAsset.mMeshes[node.mMesh]; +          if (populateModelFromMesh(pModel, base_name, mesh, node, mats) &&              (LLModel::NO_ERRORS == pModel->getStatus()) &&              validate_model(pModel)) @@ -652,6 +655,14 @@ std::string LLGLTFLoader::processTexture(S32 texture_index, const std::string& t              filename = filename.substr(pos + 1);          } +        std::string dir = gDirUtilp->getDirName(mFilename); +        std::string full_path = dir + gDirUtilp->getDirDelimiter() + filename; +        if (!gDirUtilp->fileExists(full_path) && filename.find("data:") == std::string::npos) +        { +            // Uri might be escaped +            filename = LLURI::unescape(filename); +        } +          LL_INFOS("GLTF_IMPORT") << "Found texture: " << filename << " for material: " << material_name << LL_ENDL;          LLSD args; @@ -1810,13 +1821,13 @@ size_t LLGLTFLoader::getSuffixPosition(const std::string &label)      return -1;  } -std::string LLGLTFLoader::getLodlessLabel(const LL::GLTF::Mesh& mesh) +std::string LLGLTFLoader::getLodlessLabel(const LL::GLTF::Node& node)  { -    size_t ext_pos = getSuffixPosition(mesh.mName); +    size_t ext_pos = getSuffixPosition(node.mName);      if (ext_pos != -1)      { -        return mesh.mName.substr(0, ext_pos); +        return node.mName.substr(0, ext_pos);      } -    return mesh.mName; +    return node.mName;  } diff --git a/indra/newview/gltf/llgltfloader.h b/indra/newview/gltf/llgltfloader.h index e8b91996c7..7aa1a94c20 100644 --- a/indra/newview/gltf/llgltfloader.h +++ b/indra/newview/gltf/llgltfloader.h @@ -170,7 +170,7 @@ private:      void notifyUnsupportedExtension(bool unsupported);      static size_t getSuffixPosition(const std::string& label); -    static std::string getLodlessLabel(const LL::GLTF::Mesh& mesh); +    static std::string getLodlessLabel(const LL::GLTF::Node& mesh);      //    bool mPreprocessGLTF; diff --git a/indra/newview/licenses-linux.txt b/indra/newview/licenses-linux.txt index 23dace4de0..daa069db4c 100644 --- a/indra/newview/licenses-linux.txt +++ b/indra/newview/licenses-linux.txt @@ -431,3 +431,36 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE  SOFTWARE. + +====== +V-HACD +====== +BSD 3-Clause License + +Copyright (c) 2011, Khaled Mamou (kmamou at gmail dot com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +   list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +   this list of conditions and the following disclaimer in the documentation +   and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its +   contributors may be used to endorse or promote products derived from +   this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/indra/newview/licenses-mac.txt b/indra/newview/licenses-mac.txt index a3792f0b6b..1765cc95f0 100644 --- a/indra/newview/licenses-mac.txt +++ b/indra/newview/licenses-mac.txt @@ -765,6 +765,41 @@ sse2neon   * SOFTWARE.   */ + +====== +V-HACD +====== +BSD 3-Clause License + +Copyright (c) 2011, Khaled Mamou (kmamou at gmail dot com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +   list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +   this list of conditions and the following disclaimer in the documentation +   and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its +   contributors may be used to endorse or promote products derived from +   this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +  ===============================  libwebrtc binaries (unofficial)  =============================== diff --git a/indra/newview/licenses-win32.txt b/indra/newview/licenses-win32.txt index eddc9a4475..170fa2884a 100644 --- a/indra/newview/licenses-win32.txt +++ b/indra/newview/licenses-win32.txt @@ -821,6 +821,41 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE  SOFTWARE. + +====== +V-HACD +====== +BSD 3-Clause License + +Copyright (c) 2011, Khaled Mamou (kmamou at gmail dot com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +   list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +   this list of conditions and the following disclaimer in the documentation +   and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its +   contributors may be used to endorse or promote products derived from +   this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +  ==============  Vulkan GLTF   ============== diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 93cc4941f1..5801ba1eb8 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -538,6 +538,27 @@ LLInventoryItem* LLAgentWearables::getWearableInventoryItem(LLWearableType::ETyp      return item;  } +const S32 LLAgentWearables::getWearableIdxFromItem(const LLViewerInventoryItem* item) const +{ +    if (!item) return -1; +    if (!item->isWearableType()) return -1; + +    LLWearableType::EType type = item->getWearableType(); +    U32 wearable_count = getWearableCount(type); +    if (0 == wearable_count) return -1; + +    const LLUUID& asset_id = item->getAssetUUID(); + +    for (U32 i = 0; i < wearable_count; ++i) +    { +        const LLViewerWearable* wearable = getViewerWearable(type, i); +        if (!wearable) continue; +        if (wearable->getAssetID() != asset_id) continue; +        return i; +    } + +    return -1; +}  const LLViewerWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id) const  {      const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id); @@ -1471,7 +1492,7 @@ bool LLAgentWearables::moveWearable(const LLViewerInventoryItem* item, bool clos      LLWearableType::EType type = item->getWearableType();      U32 wearable_count = getWearableCount(type); -    if (0 == wearable_count) return false; +    if (wearable_count < 2) return false;      const LLUUID& asset_id = item->getAssetUUID(); diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index 3b8ff93c76..1e118ffa98 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -87,6 +87,7 @@ public:  public:      const LLUUID        getWearableItemID(LLWearableType::EType type, U32 index /*= 0*/) const;      const LLUUID        getWearableAssetID(LLWearableType::EType type, U32 index /*= 0*/) const; +    const S32 getWearableIdxFromItem(const LLViewerInventoryItem* item) const;      const LLViewerWearable* getWearableFromItemID(const LLUUID& item_id) const;      LLViewerWearable*   getWearableFromItemID(const LLUUID& item_id);      LLViewerWearable*   getWearableFromAssetID(const LLUUID& asset_id); diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm index b8fd3dc189..af18dca185 100644 --- a/indra/newview/llappdelegate-objc.mm +++ b/indra/newview/llappdelegate-objc.mm @@ -57,42 +57,42 @@  - (void) applicationDidFinishLaunching:(NSNotification *)notification  { -	// Call constructViewer() first so our logging subsystem is in place. This -	// risks missing crashes in the LLAppViewerMacOSX constructor, but for -	// present purposes it's more important to get the startup sequence -	// properly logged. -	// Someday I would like to modify the logging system so that calls before -	// it's initialized are cached in a std::ostringstream and then, once it's -	// initialized, "played back" into whatever handlers have been set up. -	constructViewer(); +    // Call constructViewer() first so our logging subsystem is in place. This +    // risks missing crashes in the LLAppViewerMacOSX constructor, but for +    // present purposes it's more important to get the startup sequence +    // properly logged. +    // Someday I would like to modify the logging system so that calls before +    // it's initialized are cached in a std::ostringstream and then, once it's +    // initialized, "played back" into whatever handlers have been set up. +    constructViewer();  #if defined(LL_BUGSPLAT)      infos("bugsplat setup"); -	// Engage BugsplatStartupManager *before* calling initViewer() to handle -	// any crashes during initialization. -	// https://www.bugsplat.com/docs/platforms/os-x#initialization -	[BugsplatStartupManager sharedManager].autoSubmitCrashReport = YES; -	[BugsplatStartupManager sharedManager].askUserDetails = NO; -	[BugsplatStartupManager sharedManager].delegate = self; -	[[BugsplatStartupManager sharedManager] start]; +    // Engage BugsplatStartupManager *before* calling initViewer() to handle +    // any crashes during initialization. +    // https://www.bugsplat.com/docs/platforms/os-x#initialization +    [BugsplatStartupManager sharedManager].autoSubmitCrashReport = YES; +    [BugsplatStartupManager sharedManager].askUserDetails = NO; +    [BugsplatStartupManager sharedManager].delegate = self; +    [[BugsplatStartupManager sharedManager] start];  #endif      infos("post-bugsplat setup"); -	frameTimer = nil; +    frameTimer = nil; -	[self languageUpdated]; +    [self languageUpdated]; -	if (initViewer()) -	{ -		// Set up recurring calls to oneFrame (repeating timer with timeout 0) -		// until applicationShouldTerminate. -		frameTimer = [NSTimer scheduledTimerWithTimeInterval:0.0 target:self -							  selector:@selector(oneFrame) userInfo:nil repeats:YES]; -	} else { -		exit(0); -	} +    if (initViewer()) +    { +        // Set up recurring calls to oneFrame (repeating timer with timeout 0) +        // until applicationShouldTerminate. +        frameTimer = [NSTimer scheduledTimerWithTimeInterval:0.0 target:self +                              selector:@selector(oneFrame) userInfo:nil repeats:YES]; +    } else { +        exit(0); +    } -	[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(languageUpdated) name:@"NSTextInputContextKeyboardSelectionDidChangeNotification" object:nil]; +    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(languageUpdated) name:@"NSTextInputContextKeyboardSelectionDidChangeNotification" object:nil];   //   [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];  } @@ -110,74 +110,74 @@  - (void) applicationDidBecomeActive:(NSNotification *)notification  { -	callWindowFocus(); +    callWindowFocus();  }  - (void) applicationDidResignActive:(NSNotification *)notification  { -	callWindowUnfocus(); +    callWindowUnfocus();  }  - (void) applicationDidHide:(NSNotification *)notification  { -	callWindowHide(); +    callWindowHide();  }  - (void) applicationDidUnhide:(NSNotification *)notification  { -	callWindowUnhide(); +    callWindowUnhide();  }  - (NSApplicationTerminateReply) applicationShouldTerminate:(NSApplication *)sender  { -	// run one frame to assess state -	if (!pumpMainLoop()) -	{ -		// pumpMainLoop() returns true when done, false if it wants to be -		// called again. Since it returned false, do not yet cancel -		// frameTimer. -		handleQuit(); -		[[NSApplication sharedApplication] stopModal]; -		return NSTerminateCancel; -	} else { -		// pumpMainLoop() returned true: it's done. Okay, done with frameTimer. -		[frameTimer release]; -		cleanupViewer(); -		return NSTerminateNow; -	} +    // run one frame to assess state +    if (!pumpMainLoop()) +    { +        // pumpMainLoop() returns true when done, false if it wants to be +        // called again. Since it returned false, do not yet cancel +        // frameTimer. +        handleQuit(); +        [[NSApplication sharedApplication] stopModal]; +        return NSTerminateCancel; +    } else { +        // pumpMainLoop() returned true: it's done. Okay, done with frameTimer. +        [frameTimer release]; +        cleanupViewer(); +        return NSTerminateNow; +    }  }  - (void) oneFrame  { -	bool appExiting = pumpMainLoop(); -	if (appExiting) -	{ -		// Once pumpMainLoop() reports that we're done, cancel frameTimer: -		// stop the repetitive calls. -		[frameTimer release]; -		[[NSApplication sharedApplication] terminate:self]; -	} +    bool appExiting = pumpMainLoop(); +    if (appExiting) +    { +        // Once pumpMainLoop() reports that we're done, cancel frameTimer: +        // stop the repetitive calls. +        [frameTimer release]; +        [[NSApplication sharedApplication] terminate:self]; +    }  }  - (void) showInputWindow:(bool)show withEvent:(NSEvent*)textEvent  { -	if (![self romanScript]) -	{ -		if (show) -		{ -			NSLog(@"Showing input window."); -			[inputWindow makeKeyAndOrderFront:inputWindow]; +    if (![self romanScript]) +    { +        if (show) +        { +            NSLog(@"Showing input window."); +            [inputWindow makeKeyAndOrderFront:inputWindow];              if (textEvent != nil)              {                  [[inputView inputContext] discardMarkedText];                  [[inputView inputContext] handleEvent:textEvent];              } -		} else { -			NSLog(@"Hiding input window."); -			[inputWindow orderOut:inputWindow]; -			[window makeKeyAndOrderFront:window]; -		} -	} +        } else { +            NSLog(@"Hiding input window."); +            [inputWindow orderOut:inputWindow]; +            [window makeKeyAndOrderFront:window]; +        } +    }  }  // This will get called multiple times by NSNotificationCenter. @@ -187,15 +187,15 @@  - (void) languageUpdated  { -	TISInputSourceRef currentInput = TISCopyCurrentKeyboardInputSource(); -	CFArrayRef languages = (CFArrayRef)TISGetInputSourceProperty(currentInput, kTISPropertyInputSourceLanguages); -	 +    TISInputSourceRef currentInput = TISCopyCurrentKeyboardInputSource(); +    CFArrayRef languages = (CFArrayRef)TISGetInputSourceProperty(currentInput, kTISPropertyInputSourceLanguages); +  #if 0 // In the event of ever needing to add new language sources, change this to 1 and watch the terminal for "languages:" -	NSLog(@"languages: %@", TISGetInputSourceProperty(currentInput, kTISPropertyInputSourceLanguages)); +    NSLog(@"languages: %@", TISGetInputSourceProperty(currentInput, kTISPropertyInputSourceLanguages));  #endif -	 -	// Typically the language we want is going to be the very first result in the array. -	currentInputLanguage = (NSString*)CFArrayGetValueAtIndex(languages, 0); + +    // Typically the language we want is going to be the very first result in the array. +    currentInputLanguage = (NSString*)CFArrayGetValueAtIndex(languages, 0);  }  - (bool) romanScript @@ -209,7 +209,7 @@              return false;          }      } -     +      return true;  } @@ -313,11 +313,11 @@ struct AttachmentInfo      // We "happen to know" that info[0].basename is "SecondLife.old" -- due to      // the fact that BugsplatMac only notices a crash during the viewer run -    // following the crash.  +    // following the crash.      // The Bugsplat service doesn't respect the MIME type above when returning      // the log data to a browser, so take this opportunity to rename the file      // from <base>.old to <base>_log.txt -    info[0].basename =  +    info[0].basename =          boost::filesystem::path(info[0].pathname).stem().string() + "_log.txt";      infos("attachmentsForBugsplatStartupManager attaching log " + info[0].basename); @@ -373,7 +373,7 @@ struct AttachmentInfo  {      [super sendEvent:event];      if ([event type] == NSEventTypeKeyUp && ([event modifierFlags] & NSEventModifierFlagCommand)) -    {    +    {          [[self keyWindow] sendEvent:event];      }  } diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 71dec10e01..cb352ac3e5 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1500,6 +1500,27 @@ void wear_on_avatar_cb(const LLUUID& inv_item, bool do_replace = false)      }  } +bool needs_to_replace(LLViewerInventoryItem* item_to_wear, bool & first_for_object, std::vector<bool>& first_for_type, bool replace) +{ +    bool res = false; +    LLAssetType::EType type = item_to_wear->getType(); +    if (type == LLAssetType::AT_OBJECT) +    { +        res = first_for_object && replace; +        first_for_object = false; +    } +    else if (type == LLAssetType::AT_CLOTHING) +    { +        LLWearableType::EType wtype = item_to_wear->getWearableType(); +        if (wtype >= 0 && wtype < LLWearableType::WT_COUNT) +        { +            res = first_for_type[wtype] && replace; +            first_for_type[wtype] = false; +        } +    } +    return res; +} +  void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear,                                          bool do_update,                                          bool replace, @@ -1508,7 +1529,8 @@ void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear,      LL_DEBUGS("UIUsage") << "wearItemsOnAvatar" << LL_ENDL;      LLUIUsage::instance().logCommand("Avatar.WearItem"); -    bool first = true; +    bool first_for_object = true; +    std::vector<bool> first_for_type(LLWearableType::WT_COUNT, true);      LLInventoryObject::const_object_list_t items_to_link; @@ -1516,9 +1538,6 @@ void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear,           it != item_ids_to_wear.end();           ++it)      { -        replace = first && replace; -        first = false; -          const LLUUID& item_id_to_wear = *it;          if (item_id_to_wear.isNull()) @@ -1537,8 +1556,9 @@ void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear,          if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getLibraryRootFolderID()))          {              LL_DEBUGS("Avatar") << "inventory item in library, will copy and wear " -                                << item_to_wear->getName() << " id " << item_id_to_wear << LL_ENDL; -            LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(wear_on_avatar_cb,_1,replace)); +                << item_to_wear->getName() << " id " << item_id_to_wear << LL_ENDL; +            bool replace_item = needs_to_replace(item_to_wear, first_for_object, first_for_type, replace); +            LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(wear_on_avatar_cb, _1, replace_item));              copy_inventory_item(gAgent.getID(), item_to_wear->getPermissions().getOwner(),                                  item_to_wear->getUUID(), LLUUID::null, std::string(), cb);              continue; @@ -1576,7 +1596,8 @@ void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear,                      }                      LLWearableType::EType type = item_to_wear->getWearableType();                      S32 wearable_count = gAgentWearables.getWearableCount(type); -                    if ((replace && wearable_count != 0) || !gAgentWearables.canAddWearable(type)) +                    bool replace_item = needs_to_replace(item_to_wear, first_for_object, first_for_type, replace); +                    if ((replace_item && wearable_count != 0) || !gAgentWearables.canAddWearable(type))                      {                          LLUUID item_id = gAgentWearables.getWearableItemID(item_to_wear->getWearableType(),                                                                             wearable_count-1); @@ -1605,7 +1626,13 @@ void LLAppearanceMgr::wearItemsOnAvatar(const uuid_vec_t& item_ids_to_wear,              case LLAssetType::AT_OBJECT:              { -                rez_attachment(item_to_wear, NULL, replace); +                // Note that this will replace only first attachment regardless of attachment point, +                // so if user is wearing two items over other two on different attachment points, +                // only one will be replaced. +                // Unfortunately we have no way to determine attachment point from inventory item. +                // We might want to forbid wearing multiple objects with replace option in future. +                bool replace_item = needs_to_replace(item_to_wear, first_for_object, first_for_type, replace); +                rez_attachment(item_to_wear, NULL, replace_item);              }              break; @@ -4220,37 +4247,54 @@ bool LLAppearanceMgr::moveWearable(LLViewerInventoryItem* item, bool closer_to_b      if (item->getType() != LLAssetType::AT_CLOTHING) return false;      if (!gInventory.isObjectDescendentOf(item->getUUID(), getCOF())) return false; +    S32 pos = gAgentWearables.getWearableIdxFromItem(item); +    if (pos < 0) return false; // Not found + +    U32 count = gAgentWearables.getWearableCount(item->getWearableType()); +    if (count < 2) return false; // Nothing to swap with +    if (closer_to_body) +    { +        if (pos == 0) return false; // already first +    } +    else +    { +        if (pos == count - 1)  return false; // already last +    } + +    U32 old_pos = (U32)pos; +    U32 swap_with = closer_to_body ? old_pos - 1 : old_pos + 1; +    LLUUID swap_item_id = gAgentWearables.getWearableItemID(item->getWearableType(), swap_with); + +    // Find link item from item id.      LLInventoryModel::cat_array_t cats;      LLInventoryModel::item_array_t items;      LLFindWearablesOfType filter_wearables_of_type(item->getWearableType());      gInventory.collectDescendentsIf(getCOF(), cats, items, true, filter_wearables_of_type);      if (items.empty()) return false; -    // We assume that the items have valid descriptions. -    std::sort(items.begin(), items.end(), WearablesOrderComparator(item->getWearableType())); - -    if (closer_to_body && items.front() == item) return false; -    if (!closer_to_body && items.back() == item) return false; - -    LLInventoryModel::item_array_t::iterator it = std::find(items.begin(), items.end(), item); -    if (items.end() == it) return false; - - -    //swapping descriptions -    closer_to_body ? --it : ++it; -    LLViewerInventoryItem* swap_item = *it; -    if (!swap_item) return false; -    std::string tmp = swap_item->getActualDescription(); -    swap_item->setDescription(item->getActualDescription()); -    item->setDescription(tmp); +    LLViewerInventoryItem* swap_item = nullptr; +    for (auto iter : items) +    { +        if (iter->getLinkedUUID() == swap_item_id) +        { +            swap_item = iter.get(); +            break; +        } +    } +    if (!swap_item) +    { +        return false; +    } -    // LL_DEBUGS("Inventory") << "swap, item " -    //                     << ll_pretty_print_sd(item->asLLSD()) -    //                     << " swap_item " -    //                     << ll_pretty_print_sd(swap_item->asLLSD()) << LL_ENDL; +    // Description is supposed to hold sort index, but user could have changed +    // order rapidly and there might be a state mismatch between description +    // and gAgentWearables, trust gAgentWearables over description. +    // Generate new description. +    std::string new_desc = build_order_string(item->getWearableType(), old_pos); +    swap_item->setDescription(new_desc); +    new_desc = build_order_string(item->getWearableType(), swap_with); +    item->setDescription(new_desc); -    // FIXME switch to use AISv3 where supported. -    //items need to be updated on a dataserver      item->setComplete(true);      item->updateServer(false);      gInventory.updateItem(item); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index c3dc821b13..c34441932d 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1288,6 +1288,7 @@ bool LLAppViewer::init()      LLViewerCamera::createInstance();      LL::GLTFSceneManager::createInstance(); +    gSavedSettings.setU32("DebugQualityPerformance", gSavedSettings.getU32("RenderQualityPerformance"));  #if LL_WINDOWS      if (!mSecondInstance) @@ -2458,7 +2459,6 @@ void LLAppViewer::initLoggingAndGetLastDuration()          if (gDirUtilp->fileExists(user_data_path_cef_log))          {              std::string user_data_path_cef_old = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "cef.old"); -            LLFile::remove(user_data_path_cef_old, ENOENT);              LLFile::rename(user_data_path_cef_log, user_data_path_cef_old);          }      } @@ -4006,8 +4006,15 @@ void LLAppViewer::processMarkerFiles()          else if (marker_is_same_version)          {              // the file existed, is ours, and matched our version, so we can report on what it says -            LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found; last exec crashed" << LL_ENDL; +            LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found; last exec crashed or froze" << LL_ENDL; +#if LL_WINDOWS && LL_BUGSPLAT +            // bugsplat will set correct state in bugsplatSendLog +            // Might be more accurate to rename this one into 'unknown' +            gLastExecEvent = LAST_EXEC_FROZE; +#else              gLastExecEvent = LAST_EXEC_OTHER_CRASH; +#endif // LL_WINDOWS +          }          else          { @@ -4256,7 +4263,7 @@ void LLAppViewer::earlyExit(const std::string& name, const LLSD& substitutions)  // case where we need the viewer to exit without any need for notifications  void LLAppViewer::earlyExitNoNotify()  { -    LL_WARNS() << "app_early_exit with no notification: " << LL_ENDL; +    LL_WARNS() << "app_early_exit with no notification." << LL_ENDL;      gDoDisconnect = true;      finish_early_exit( LLSD(), LLSD() );  } @@ -4535,6 +4542,7 @@ void LLAppViewer::purgeCache()      LLAppViewer::getTextureCache()->purgeCache(LL_PATH_CACHE);      LLVOCache::getInstance()->removeCache(LL_PATH_CACHE);      LLViewerShaderMgr::instance()->clearShaderCache(); +    purgeCefStaleCaches();      gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""), "*");  } @@ -5469,6 +5477,12 @@ void LLAppViewer::createErrorMarker(eLastExecEvent error_code) const      }  } +bool LLAppViewer::errorMarkerExists() const +{ +    std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ERROR_MARKER_FILE_NAME); +    return LLAPRFile::isExist(error_marker_file, NULL, LL_APR_RB); +} +  void LLAppViewer::outOfMemorySoftQuit()  {      if (!mQuitRequested) @@ -5600,7 +5614,10 @@ void LLAppViewer::idleNetwork()      add(LLStatViewer::NUM_NEW_OBJECTS, gObjectList.mNumNewObjects);      // Retransmit unacknowledged packets. -    gXferManager->retransmitUnackedPackets(); +    if (gXferManager) +    { +        gXferManager->retransmitUnackedPackets(); +    }      gAssetStorage->checkForTimeouts();      gViewerThrottle.setBufferLoadRate(gMessageSystem->getBufferLoadRate());      gViewerThrottle.updateDynamicThrottle(); diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 3afde6b9f5..4f2583cb16 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -149,6 +149,12 @@ public:      std::string getWindowTitle() const; // The window display name.      void forceDisconnect(const std::string& msg); // Force disconnection, with a message to the user. + +    // sendSimpleLogoutRequest does not create a marker file. +    // Meant for lost network case, and for forced shutdowns, +    // to at least attempt to remove the ghost from the world. +    void sendSimpleLogoutRequest(); +      void badNetworkHandler(); // Cause a crash state due to bad network packet.      bool hasSavedFinalSnapshot() { return mSavedFinalSnapshot; } @@ -245,6 +251,7 @@ public:      // Writes an error code into the error_marker file for use on next startup.      void createErrorMarker(eLastExecEvent error_code) const; +    bool errorMarkerExists() const;      // Attempt a 'soft' quit with disconnect and saving of settings/cache.      // Intended to be thread safe. @@ -311,10 +318,6 @@ private:      void sendLogoutRequest();      void disconnectViewer(); -    // Does not create a marker file. For lost network case, -    // to at least attempt to remove the ghost from the world. -    void sendSimpleLogoutRequest(); -      // *FIX: the app viewer class should be some sort of singleton, no?      // Perhaps its child class is the singleton and this should be an abstract base.      static LLAppViewer* sInstance; diff --git a/indra/newview/llappviewermacosx-objc.mm b/indra/newview/llappviewermacosx-objc.mm index 2ea3f2f171..96a6bc6edc 100644 --- a/indra/newview/llappviewermacosx-objc.mm +++ b/indra/newview/llappviewermacosx-objc.mm @@ -5,27 +5,27 @@   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2010, Linden Research, Inc. - *  + *   * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public   * License as published by the Free Software Foundation;   * version 2.1 of the License only. - *  + *   * This library is distributed in the hope that it will be useful,   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   * Lesser General Public License for more details. - *  + *   * You should have received a copy of the GNU Lesser General Public   * License along with this library; if not, write to the Free Software   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  + *   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$ - */  + */  #if !defined LL_DARWIN -	#error "Use only with macOS" +    #error "Use only with macOS"  #endif  #import <Cocoa/Cocoa.h> diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index f612495953..76c71f8778 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -176,6 +176,15 @@ namespace                                      << '/' << loc.mV[1]                                      << '/' << loc.mV[2])));              } + +            LLAppViewer* app = LLAppViewer::instance(); +            if (!app->isSecondInstance() && !app->errorMarkerExists()) +            { +                // If marker doesn't exist, create a marker with 'other' code for next launch +                // otherwise don't override existing file +                // Any unmarked crashes will be considered as freezes +                app->createErrorMarker(LAST_EXEC_OTHER_CRASH); +            }          } // MDSCB_EXCEPTIONCODE          return false; diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 21a29bb1bb..8617183840 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -215,7 +215,8 @@ public:              LLUUID obj_id = mObjectData["object_id"];              if (obj_id.notNull())              { -                return nullptr != gObjectList.findObject(mAvatarID); +                LLViewerObject* object = gObjectList.findObject(obj_id); +                return object && object->isReachable();              }              return false;          } @@ -441,6 +442,7 @@ public:                  time_t current_time = time_corrected();                  time_t message_time = (time_t)(current_time - LLFrameTimer::getElapsedSeconds() + mTime); +                // Report abuse shouldn't use AM/PM, use 24-hour time                  time_string = "[" + LLTrans::getString("TimeMonth") + "]/["                      + LLTrans::getString("TimeDay") + "]/["                      + LLTrans::getString("TimeYear") + "] [" @@ -1117,7 +1119,11 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p)      mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this);      mEditor->setIsFriendCallback(LLAvatarActions::isFriend);      mEditor->setIsObjectBlockedCallback(boost::bind(&LLMuteList::isMuted, LLMuteList::getInstance(), _1, _2, 0)); - +    mEditor->setIsObjectReachableCallback([](const LLUUID& obj_id) +        { +            LLViewerObject* object = gObjectList.findObject(obj_id); +            return object && object->isReachable(); +        });  }  LLSD LLChatHistory::getValue() const diff --git a/indra/newview/llconversationlog.cpp b/indra/newview/llconversationlog.cpp index cea68c1779..65a068e08d 100644 --- a/indra/newview/llconversationlog.cpp +++ b/indra/newview/llconversationlog.cpp @@ -118,11 +118,21 @@ const std::string LLConversation::createTimestamp(const U64Seconds& utc_time)      LLSD substitution;      substitution["datetime"] = (S32)utc_time.value(); -    timeStr = "["+LLTrans::getString ("TimeMonth")+"]/[" -                 +LLTrans::getString ("TimeDay")+"]/[" -                 +LLTrans::getString ("TimeYear")+"] [" -                 +LLTrans::getString ("TimeHour")+"]:[" -                 +LLTrans::getString ("TimeMin")+"]"; +    static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); +    timeStr = "[" + LLTrans::getString("TimeMonth") + "]/[" +        + LLTrans::getString("TimeDay") + "]/[" +        + LLTrans::getString("TimeYear") + "] ["; +    if (use_24h) +    { +        timeStr += LLTrans::getString("TimeHour") + "]:[" +            + LLTrans::getString("TimeMin") + "]"; +    } +    else +    { +        timeStr += LLTrans::getString("TimeHour12") + "]:[" +            + LLTrans::getString("TimeMin") + "] [" +            + LLTrans::getString("TimeAMPM") + "]"; +    }      LLStringUtil::format (timeStr, substitution); diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp index c6fea1ba82..86c58a3497 100644 --- a/indra/newview/lleventpoll.cpp +++ b/indra/newview/lleventpoll.cpp @@ -54,13 +54,6 @@ namespace Details          void stop();      private: -        // We will wait RETRY_SECONDS + (errorCount * RETRY_SECONDS_INC) before retrying after an error. -        // This means we attempt to recover relatively quickly but back off giving more time to recover -        // until we finally give up after MAX_EVENT_POLL_HTTP_ERRORS attempts. -        static const F32                EVENT_POLL_ERROR_RETRY_SECONDS; -        static const F32                EVENT_POLL_ERROR_RETRY_SECONDS_INC; -        static const S32                MAX_EVENT_POLL_HTTP_ERRORS; -          void                            eventPollCoro(std::string url);          void                            handleMessage(const LLSD &content); @@ -76,9 +69,13 @@ namespace Details      }; -    const F32 LLEventPollImpl::EVENT_POLL_ERROR_RETRY_SECONDS = 15.f; // ~ half of a normal timeout. -    const F32 LLEventPollImpl::EVENT_POLL_ERROR_RETRY_SECONDS_INC = 5.f; // ~ half of a normal timeout. -    const S32 LLEventPollImpl::MAX_EVENT_POLL_HTTP_ERRORS = 10; // ~5 minutes, by the above rules. +    // We will wait RETRY_SECONDS + (errorCount * RETRY_SECONDS_INC) before retrying after an error. +    // This means we attempt to recover relatively quickly but back off giving more time to recover +    // until we finally give up after MAX_EVENT_POLL_HTTP_ERRORS attempts. +    constexpr F32 EVENT_POLL_ERROR_RETRY_SECONDS = 15.f; // ~ half of a normal timeout. +    constexpr F32 EVENT_POLL_ERROR_RETRY_SECONDS_INC = 5.f; // ~ half of a normal timeout. +    constexpr S32 MAX_EVENT_POLL_HTTP_ERRORS = 10; // ~5 minutes, by the above rules. +    constexpr F64 MIN_SECONDS_PASSED = 10.0; // Minimum time we expect the server to hold the request.      int LLEventPollImpl::sNextCounter = 1; @@ -151,11 +148,17 @@ namespace Details          LLSD acknowledge;          int errorCount = 0;          int counter = mCounter; // saved on the stack for logging. +        LLTimer message_time;          LL_DEBUGS("LLEventPollImpl") << " <" << counter << "> entering coroutine." << LL_ENDL;          mAdapter = httpAdapter; +        // This is a loop with its own waitToRetry implementation, +        // so disable retries. +        LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); +        httpOpts->setRetries(0); +          LL::WorkQueue::ptr_t main_queue = nullptr;          // HACK -- grab the mainloop workqueue to move execution of the handler @@ -172,11 +175,13 @@ namespace Details              request["ack"] = acknowledge;              request["done"] = mDone; +            message_time.reset(); +  //          LL_DEBUGS("LLEventPollImpl::eventPollCoro") << "<" << counter << "> request = "  //              << LLSDXMLStreamer(request) << LL_ENDL;              LL_DEBUGS("LLEventPollImpl") << " <" << counter << "> posting and yielding." << LL_ENDL; -            LLSD result = httpAdapter->postAndSuspend(mHttpRequest, url, request); +            LLSD result = httpAdapter->postAndSuspend(mHttpRequest, url, request, httpOpts);  //          LL_DEBUGS("LLEventPollImpl::eventPollCoro") << "<" << counter << "> result = "  //              << LLSDXMLStreamer(result) << LL_ENDL; @@ -194,11 +199,30 @@ namespace Details              if (!status)              { -                if (status == LLCore::HttpStatus(LLCore::HttpStatus::EXT_CURL_EASY, CURLE_OPERATION_TIMEDOUT)) -                {   // A standard timeout response we get this when there are no events. -                    LL_DEBUGS("LLEventPollImpl") << "All is very quiet on target server. It may have gone idle?" << LL_ENDL; -                    errorCount = 0; -                    continue; +                if (status == LLCore::HttpStatus(LLCore::HttpStatus::EXT_CURL_EASY, CURLE_OPERATION_TIMEDOUT) // A standard timeout, no events. +                    || status == LLCore::HttpStatus(HTTP_BAD_GATEWAY) // An expected 'No events' case. +                    || status == LLCore::HttpStatus(HTTP_INTERNAL_ERROR) +                    || status == LLCore::HttpStatus(HTTP_SERVICE_UNAVAILABLE) +                    || status == LLCore::HttpStatus(HTTP_GATEWAY_TIME_OUT)) +                { +                    if (message_time.getElapsedSeconds() < MIN_SECONDS_PASSED) +                    { +                        // Server is supposed to hold request for 20 to 30 seconds. +                        // If it didn't hold the request at least for 10s, treat as an error. +                        LL_WARNS("LLEventPollImpl") << "Response arrived too early, status: " << status.toTerseString() +                            << ", time passed: " << message_time.getElapsedSeconds() << LL_ENDL; +                    } +                    else +                    { +                        // Timeout, expected and means 'no events'. Request is to be re-issued immediately. +                        // Current definition of a timeout is any of : +                        // - libcurl easy 28 status code +                        // - Linden 499 special http status code +                        // - RFC - standard 502 - 504 http status codes +                        LL_DEBUGS("LLEventPollImpl") << "No events, from: " << mSenderIp <<" status: " << (S32)status.getStatus() << LL_ENDL; +                        errorCount = 0; +                        continue; +                    }                  }                  else if ((status == LLCore::HttpStatus(LLCore::HttpStatus::LLCORE, LLCore::HE_OP_CANCELED)) ||                          (status == LLCore::HttpStatus(HTTP_NOT_FOUND))) @@ -206,13 +230,13 @@ namespace Details                      // some cases the server gets ahead of the viewer and will                      // return a 404 error (Not Found) before the cancel event                      // comes back in the queue -                    LL_WARNS("LLEventPollImpl") << "Canceling coroutine" << LL_ENDL; +                    LL_WARNS("LLEventPollImpl") << "<" << counter << "> Canceling coroutine, status: " << status.toTerseString() << LL_ENDL;                      break;                  }                  else if (!status.isHttpStatus())                  {                      /// Some LLCore or LIBCurl error was returned.  This is unlikely to be recoverable -                    LL_WARNS("LLEventPollImpl") << "Critical error from poll request returned from libraries.  Canceling coroutine." << LL_ENDL; +                    LL_WARNS("LLEventPollImpl") << "<" << counter << "> Critical error from poll request returned from libraries.  Canceling coroutine." << LL_ENDL;                      break;                  }                  LL_WARNS("LLEventPollImpl") << "<" << counter << "> Error result from LLCoreHttpUtil::HttpCoroHandler. Code " @@ -255,6 +279,10 @@ namespace Details                          LL_WARNS("LLEventPollImpl") << "< " << counter << "> Forcing disconnect due to stalled main region event poll." << LL_ENDL;                          LLAppViewer::instance()->forceDisconnect(LLTrans::getString("AgentLostConnection"));                      } +                    else +                    { +                        LL_WARNS("LLEventPollImpl") << "< " << counter << "> Stopping event poll for " << mSenderIp << " due to failures." << LL_ENDL; +                    }                      break;                  }              } diff --git a/indra/newview/lleventpoll.h b/indra/newview/lleventpoll.h index bb407b3799..ea186aa803 100644 --- a/indra/newview/lleventpoll.h +++ b/indra/newview/lleventpoll.h @@ -40,7 +40,30 @@ namespace Details  class LLEventPoll -    ///< implements the viewer side of server-to-viewer pushed events. +    ///< Implements the viewer side of server-to-viewer pushed events. +    /// +    /// This class implements the sole consumer of the EventQueueGet capability +    /// and delivers data, including llsd-encoded llmessage payloads, from +    /// simulator to viewer. +    /// +    /// https://wiki.secondlife.com/wiki/EventQueueGet +    /// The wiki page is neither complete nor entirely correct. Request timeouts +    /// became the de facto method of returning an empty event set to the viewer. +    /// But the timeout behavior was never defined. It was simply whatever +    /// behavior a given grid implementation implemented. +    /// +    /// In SL's case, the path may include reverse proxies, http caches, http and +    /// socks proxies, transparent hijacking, and other horrors. A pitfall for +    /// implementors. +    /// +    /// Current definition of a timeout is any of : +    /// - libcurl easy 28 status code +    /// - Linden 499 special http status code +    /// - RFC - standard 502 - 504 http status codes +    /// If requests are failing too quickly with the above errors, they are treated +    /// as actual errors and not an empty payload. These will count towards a final +    /// error declaration and can lead to disconnection from a simulator or the +    /// entire grid.  {  public:      LLEventPoll(const std::string& pollURL, const LLHost& sender); diff --git a/indra/newview/llfetchedgltfmaterial.cpp b/indra/newview/llfetchedgltfmaterial.cpp index 558fc92018..a05f725673 100644 --- a/indra/newview/llfetchedgltfmaterial.cpp +++ b/indra/newview/llfetchedgltfmaterial.cpp @@ -222,6 +222,14 @@ void LLFetchedGLTFMaterial::updateTextureTracking()      }  } +void LLFetchedGLTFMaterial::clearFetchedTextures() +{ +    mBaseColorTexture = nullptr; +    mNormalTexture = nullptr; +    mMetallicRoughnessTexture = nullptr; +    mEmissiveTexture = nullptr; +} +  void LLFetchedGLTFMaterial::materialBegin()  {      llassert(!mFetching); diff --git a/indra/newview/llfetchedgltfmaterial.h b/indra/newview/llfetchedgltfmaterial.h index 4a33b9f05f..074e3fef41 100644 --- a/indra/newview/llfetchedgltfmaterial.h +++ b/indra/newview/llfetchedgltfmaterial.h @@ -67,6 +67,7 @@ public:      LLPointer<LLViewerFetchedTexture> mNormalTexture;      LLPointer<LLViewerFetchedTexture> mMetallicRoughnessTexture;      LLPointer<LLViewerFetchedTexture> mEmissiveTexture; +    void clearFetchedTextures();      std::set<LLTextureEntry*> mTextureEntires; diff --git a/indra/newview/llfilepicker_mac.mm b/indra/newview/llfilepicker_mac.mm index 978069457c..6cb7c4ad51 100644 --- a/indra/newview/llfilepicker_mac.mm +++ b/indra/newview/llfilepicker_mac.mm @@ -1,25 +1,25 @@ -/**  +/**   * @file llfilepicker_mac.cpp   * @brief OS-specific file picker   *   * $LicenseInfo:firstyear=2001&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2010, Linden Research, Inc. - *  + *   * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public   * License as published by the Free Software Foundation;   * version 2.1 of the License only. - *  + *   * This library is distributed in the hope that it will be useful,   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   * Lesser General Public License for more details. - *  + *   * You should have received a copy of the GNU Lesser General Public   * License along with this library; if not, write to the Free Software   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  + *   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ @@ -32,15 +32,15 @@  NSOpenPanel *init_panel(const std::vector<std::string>* allowed_types, unsigned int flags)  {      int i; -     +      NSOpenPanel *panel = [NSOpenPanel openPanel];      NSMutableArray *fileTypes = nil; -     -     + +      if ( allowed_types && !allowed_types->empty())      {          fileTypes = [[NSMutableArray alloc] init]; -         +          for (i=0;i<allowed_types->size();++i)          {              [fileTypes addObject: @@ -48,7 +48,7 @@ NSOpenPanel *init_panel(const std::vector<std::string>* allowed_types, unsigned                                  encoding:[NSString defaultCStringEncoding]]];          }      } -         +      //[panel setMessage:@"Import one or more files or directories."];      [panel setAllowsMultipleSelection: ( (flags & F_MULTIPLE)?true:false ) ];      [panel setCanChooseDirectories: ( (flags & F_DIRECTORY)?true:false ) ]; @@ -56,7 +56,7 @@ NSOpenPanel *init_panel(const std::vector<std::string>* allowed_types, unsigned      [panel setResolvesAliases: true];      [panel setCanChooseFiles: ( (flags & F_FILE)?true:false )];      [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; -     +      if (fileTypes)      {          [panel setAllowedFileTypes:fileTypes]; @@ -77,7 +77,7 @@ std::unique_ptr<std::vector<std::string>> doLoadDialog(const std::vector<std::st      std::unique_ptr<std::vector<std::string>> outfiles;      @autoreleasepool -	{ +    {          int result;          //Aura TODO:  We could init a small window and release it at the end of this routine          //for a modeless interface. @@ -85,17 +85,17 @@ std::unique_ptr<std::vector<std::string>> doLoadDialog(const std::vector<std::st          NSOpenPanel *panel = init_panel(allowed_types,flags);          result = [panel runModal]; -         +          if (result == NSModalResponseOK)          {              NSArray *filesToOpen = [panel URLs];              int i, count = [filesToOpen count]; -             +              if (count > 0)              {                  outfiles.reset(new std::vector<std::string>);              } -             +              for (i=0; i<count; i++) {                  NSString *aFile = [[filesToOpen objectAtIndex:i] path];                  std::string afilestr = std::string([aFile UTF8String]); @@ -113,11 +113,11 @@ void doLoadDialogModeless(const std::vector<std::string>* allowed_types,  {      @autoreleasepool -	{ +    {          // Note: might need to return and save this panel          // so that it does not close immediately          NSOpenPanel *panel = init_panel(allowed_types,flags); -     +          [panel beginWithCompletionHandler:^(NSModalResponse result)          {              std::vector<std::string> outfiles; @@ -125,10 +125,10 @@ void doLoadDialogModeless(const std::vector<std::string>* allowed_types,              {                  NSArray *filesToOpen = [panel URLs];                  int i, count = [filesToOpen count]; -                 +                  if (count > 0)                  { -                     +                      for (i=0; i<count; i++) {                          NSString *aFile = [[filesToOpen objectAtIndex:i] path];                          std::string *afilestr = new std::string([aFile UTF8String]); @@ -149,7 +149,7 @@ void doLoadDialogModeless(const std::vector<std::string>* allowed_types,      }  } -std::unique_ptr<std::string> doSaveDialog(const std::string* file,  +std::unique_ptr<std::string> doSaveDialog(const std::string* file,                    const std::string* type,                    const std::string* creator,                    const std::string* extension, @@ -157,18 +157,18 @@ std::unique_ptr<std::string> doSaveDialog(const std::string* file,  {      std::unique_ptr<std::string> outfile;      @autoreleasepool -	{ +    {          NSSavePanel *panel = [NSSavePanel savePanel]; -         +          NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]];          NSArray *fileType = [extensionns componentsSeparatedByString:@","]; -         +          //[panel setMessage:@"Save Image File"];          [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ];          [panel setCanSelectHiddenExtension:true];          [panel setAllowedFileTypes:fileType];          NSString *fileName = [NSString stringWithCString:file->c_str() encoding:[NSString defaultCStringEncoding]]; -         +          NSURL* url = [NSURL fileURLWithPath:fileName];          [panel setNameFieldStringValue: fileName];          [panel setDirectoryURL: url]; @@ -193,39 +193,39 @@ void doSaveDialogModeless(const std::string* file,                    void *userdata)  {      @autoreleasepool { -		NSSavePanel *panel = [NSSavePanel savePanel]; -     -		NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]]; -		NSArray *fileType = [extensionns componentsSeparatedByString:@","]; -     -		//[panel setMessage:@"Save Image File"]; -		[panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; -		[panel setCanSelectHiddenExtension:true]; -		[panel setAllowedFileTypes:fileType]; -		NSString *fileName = [NSString stringWithCString:file->c_str() encoding:[NSString defaultCStringEncoding]]; -     -		NSURL* url = [NSURL fileURLWithPath:fileName]; -		[panel setNameFieldStringValue: fileName]; -		[panel setDirectoryURL: url]; -     -     -		[panel beginWithCompletionHandler:^(NSModalResponse result) -		{ +        NSSavePanel *panel = [NSSavePanel savePanel]; + +        NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]]; +        NSArray *fileType = [extensionns componentsSeparatedByString:@","]; + +        //[panel setMessage:@"Save Image File"]; +        [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; +        [panel setCanSelectHiddenExtension:true]; +        [panel setAllowedFileTypes:fileType]; +        NSString *fileName = [NSString stringWithCString:file->c_str() encoding:[NSString defaultCStringEncoding]]; + +        NSURL* url = [NSURL fileURLWithPath:fileName]; +        [panel setNameFieldStringValue: fileName]; +        [panel setDirectoryURL: url]; + + +        [panel beginWithCompletionHandler:^(NSModalResponse result) +        {              if (result == NSModalResponseOK) -			{ -				NSURL* url = [panel URL]; -				NSString* p = [url path]; -				std::string outfile([p UTF8String]); -             -				callback(true, outfile, userdata); -			} -			else // cancel -			{ -				std::string outfile; -				callback(false, outfile, userdata); -			} -		}]; -	} +            { +                NSURL* url = [panel URL]; +                NSString* p = [url path]; +                std::string outfile([p UTF8String]); + +                callback(true, outfile, userdata); +            } +            else // cancel +            { +                std::string outfile; +                callback(false, outfile, userdata); +            } +        }]; +    }  }  #endif diff --git a/indra/newview/llfloaterdisplayname.cpp b/indra/newview/llfloaterdisplayname.cpp index 236aadfbc1..4843a48e66 100644 --- a/indra/newview/llfloaterdisplayname.cpp +++ b/indra/newview/llfloaterdisplayname.cpp @@ -56,6 +56,7 @@ private:      void onCacheSetName(bool success,                                            const std::string& reason,                                            const LLSD& content); +    bool mIsLockedOut = false;  };  LLFloaterDisplayName::LLFloaterDisplayName(const LLSD& key) : @@ -72,8 +73,8 @@ void LLFloaterDisplayName::onOpen(const LLSD& key)      LLAvatarNameCache::get(gAgent.getID(), &av_name);      F64 now_secs = LLDate::now().secondsSinceEpoch(); - -    if (now_secs < av_name.mNextUpdate) +    mIsLockedOut = now_secs < av_name.mNextUpdate; +    if (mIsLockedOut)      {          // ...can't update until some time in the future          F64 next_update_local_secs = @@ -167,18 +168,19 @@ void LLFloaterDisplayName::onReset()      }      getChild<LLUICtrl>("display_name_editor")->setValue(av_name.getUserName()); -    if (getChild<LLUICtrl>("display_name_editor")->getEnabled()) +    if (mIsLockedOut)      { -        // UI is enabled, fill the first field -        getChild<LLUICtrl>("display_name_confirm")->clear(); -        getChild<LLUICtrl>("display_name_confirm")->setFocus(true); +        // UI is disabled. +        // We should allow resetting even if user already +        // set a display name, enable save button +        getChild<LLUICtrl>("display_name_confirm")->setValue(av_name.getUserName()); +        getChild<LLUICtrl>("save_btn")->setEnabled(true);      }      else      { -        // UI is disabled, looks like we should allow resetting -        // even if user already set a display name, enable save button -        getChild<LLUICtrl>("display_name_confirm")->setValue(av_name.getUserName()); -        getChild<LLUICtrl>("save_btn")->setEnabled(true); +        // UI is enabled, focus on the confirm field +        getChild<LLUICtrl>("display_name_confirm")->clear(); +        getChild<LLUICtrl>("display_name_confirm")->setFocus(true);      }  } diff --git a/indra/newview/llfloateremojipicker.cpp b/indra/newview/llfloateremojipicker.cpp index af0ef7223d..b7f4df874c 100644 --- a/indra/newview/llfloateremojipicker.cpp +++ b/indra/newview/llfloateremojipicker.cpp @@ -377,6 +377,9 @@ void LLFloaterEmojiPicker::initialize()      {          if (!mHint.empty())          { +            // Hack: Trying to open floater, search for a match, +            // and hide floater immediately if no match found, +            // instead of checking prior to opening              hideFloater();              return;          } @@ -406,6 +409,12 @@ void LLFloaterEmojiPicker::initialize()          return;      } +    if (!mHint.empty() && getSoundFlags() == LLView::SILENT) +    { +        // Sounds were supressed +        make_ui_sound("UISndWindowOpen"); +    } +      mGroups->setVisible(true);      mPreview->setIcon(nullptr);      showPreview(true); diff --git a/indra/newview/llfloaterfixedenvironment.cpp b/indra/newview/llfloaterfixedenvironment.cpp index d28c987414..1825797159 100644 --- a/indra/newview/llfloaterfixedenvironment.cpp +++ b/indra/newview/llfloaterfixedenvironment.cpp @@ -134,12 +134,15 @@ void LLFloaterFixedEnvironment::onClose(bool app_quitting)  {      doCloseInventoryFloater(app_quitting); -    LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL); -    LLEnvironment::instance().setCurrentEnvironmentSelection(LLEnvironment::ENV_LOCAL); -    LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_EDIT); +    if (!app_quitting) +    { +        LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL); +        LLEnvironment::instance().setCurrentEnvironmentSelection(LLEnvironment::ENV_LOCAL); +        LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_EDIT); -    mSettings.reset(); -    syncronizeTabs(); +        mSettings.reset(); +        syncronizeTabs(); +    }  }  void LLFloaterFixedEnvironment::refresh() diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index 550c3adc27..c924807273 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -267,6 +267,14 @@ void LLFloaterImagePreview::onBtnOK()          LLPointer<LLImageJ2C> formatted = new LLImageJ2C; +        if (mRawImagep->getWidth() * mRawImagep->getHeight() <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF) +        { +            if (gSavedSettings.getBOOL("LosslessJ2CUpload")) +            { +                formatted->setReversible(true); +            } +        } +          if (formatted->encode(mRawImagep, 0.0f))          {              LLFileSystem fmt_file(new_asset_id, LLAssetType::AT_TEXTURE, LLFileSystem::WRITE); diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 3d88e117ac..143781a225 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -1706,6 +1706,11 @@ void LLFloaterIMContainer::showConversation(const LLUUID& session_id)      if (session_floater)      {          session_floater->restoreFloater(); +        if (session_floater->isTornOff() && session_floater->isMinimized()) +        { +            session_floater->setMinimized(false); +            session_floater->setFocus(true); +        }      }  } diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 5160ac4d34..48360f30d4 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -618,9 +618,21 @@ void LLFloaterIMSessionTab::deleteAllChildren()  std::string LLFloaterIMSessionTab::appendTime()  { -    std::string timeStr = "[" + LLTrans::getString("TimeHour") + "]:" -                          "[" + LLTrans::getString("TimeMin") + "]:" -                          "[" + LLTrans::getString("TimeSec") + "]"; +    std::string timeStr; +    static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); +    if (use_24h) +    { +        timeStr = "[" + LLTrans::getString("TimeHour") + "]:" +            "[" + LLTrans::getString("TimeMin") + "]:" +            "[" + LLTrans::getString("TimeSec") + "]"; +    } +    else +    { +        timeStr = "[" + LLTrans::getString("TimeHour12") + "]:" +            "[" + LLTrans::getString("TimeMin") + "]:" +            "[" + LLTrans::getString("TimeSec") + "] [" +            + LLTrans::getString("TimeAMPM") + "]"; +    }      LLSD substitution;      substitution["datetime"] = (S32)time_corrected(); diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp index 4f993ca0e1..c0fe7ad896 100644 --- a/indra/newview/llfloaterinspect.cpp +++ b/indra/newview/llfloaterinspect.cpp @@ -220,7 +220,8 @@ void LLFloaterInspect::refresh()          }          time_t timestamp = (time_t) (obj->mCreationDate/1000000); -        std::string timeStr = getString("timeStamp"); +        static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); +        std::string timeStr = use_24h ? getString("timeStamp") : getString("timeStampAMPM");          LLSD substitution;          substitution["datetime"] = (S32) timestamp;          LLStringUtil::format (timeStr, substitution); diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 52a3e78d04..5c5219bcdd 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -733,7 +733,8 @@ void LLPanelLandGeneral::refresh()              // Display claim date              time_t claim_date = parcel->getClaimDate(); -            std::string claim_date_str = getString("time_stamp_template"); +            static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); +            std::string claim_date_str = use_24h ? getString("time_stamp_template") : getString("time_stamp_template_ampm");              LLSD substitution;              substitution["datetime"] = (S32) claim_date;              LLStringUtil::format (claim_date_str, substitution); diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index f76f39222b..ef29be8200 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -1035,8 +1035,13 @@ void LLFloaterModelPreview::onPhysicsStageExecute(LLUICtrl* ctrl, void* data)                  gMeshRepo.mDecompThread->submitRequest(request);              }          } - -        if (stage == "Decompose") +        if (stage == "Analyze") +        { +            sInstance->setStatusMessage(sInstance->getString("decomposing")); +            sInstance->childSetVisible("Analyze", false); +            sInstance->childSetVisible("analyze_cancel", true); +        } +        else if (stage == "Decompose")          {              sInstance->setStatusMessage(sInstance->getString("decomposing"));              sInstance->childSetVisible("Decompose", false); @@ -1137,6 +1142,7 @@ void LLFloaterModelPreview::initDecompControls()      childSetCommitCallback("simplify_cancel", onPhysicsStageCancel, NULL);      childSetCommitCallback("decompose_cancel", onPhysicsStageCancel, NULL); +    childSetCommitCallback("analyze_cancel", onPhysicsStageCancel, NULL);      childSetCommitCallback("physics_lod_combo", onPhysicsUseLOD, NULL);      childSetCommitCallback("physics_browse", onPhysicsBrowse, NULL); @@ -2018,7 +2024,7 @@ void LLFloaterModelPreview::DecompRequest::completed()  { //called from the main thread      if (mContinue)      { -        mModel->setConvexHullDecomposition(mHull); +        mModel->setConvexHullDecomposition(mHull, mHullMesh);          if (sInstance)          { diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index d9753596e6..aa36782942 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -475,6 +475,8 @@ bool LLFloaterPreference::postBuild()      getChild<LLUICtrl>("log_path_string")->setEnabled(false); // make it read-only but selectable      getChild<LLComboBox>("language_combobox")->setCommitCallback(boost::bind(&LLFloaterPreference::onLanguageChange, this)); +    mTimeFormatCombobox = getChild<LLComboBox>("time_format_combobox"); +    mTimeFormatCombobox->setCommitCallback(boost::bind(&LLFloaterPreference::onTimeFormatChange, this));      getChild<LLComboBox>("FriendIMOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"FriendIMOptions"));      getChild<LLComboBox>("NonFriendIMOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"NonFriendIMOptions")); @@ -772,6 +774,17 @@ void LLFloaterPreference::onOpen(const LLSD& key)      // Load (double-)click to walk/teleport settings.      updateClickActionViews(); +#if LL_LINUX +    // Lixux doesn't support automatic mode +    LLComboBox* combo = getChild<LLComboBox>("double_click_action_combo"); +    S32 mode = gSavedSettings.getS32("MouseWarpMode"); +    if (mode == 0) +    { +        combo->setValue("1"); +    } +    combo->setEnabledByValue("0", false); +#endif +      // Enabled/disabled popups, might have been changed by user actions      // while preferences floater was closed.      buildPopupLists(); @@ -1103,6 +1116,13 @@ void LLFloaterPreference::onLanguageChange()      }  } +void LLFloaterPreference::onTimeFormatChange() +{ +    std::string val = mTimeFormatCombobox->getValue(); +    gSavedSettings.setBOOL("Use24HourClock", val == "1"); +    onLanguageChange(); +} +  void LLFloaterPreference::onNotificationsChange(const std::string& OptionName)  {      mNotificationOptions[OptionName] = getChild<LLComboBox>(OptionName)->getSelectedItemLabel(); @@ -1318,6 +1338,8 @@ void LLFloaterPreference::refresh()          advanced->refresh();      }      updateClickActionViews(); + +    mTimeFormatCombobox->selectByValue(gSavedSettings.getBOOL("Use24HourClock") ? "1" : "0");  }  void LLFloaterPreference::onCommitWindowedMode() @@ -1356,6 +1378,7 @@ void LLFloaterPreference::onChangeQuality(const LLSD& data)      }      mLastQualityLevel = level;      LLFeatureManager::getInstance()->setGraphicsLevel(level, true); +    gSavedSettings.setU32("DebugQualityPerformance", level);      refreshEnabledGraphics();      refresh();  } diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index c93b837e82..8d3f1ed6b0 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -117,6 +117,7 @@ protected:      void        onClickClearCache();            // Clear viewer texture cache, file cache on next startup      void        onClickBrowserClearCache();     // Clear web history and caches as well as viewer caches above      void        onLanguageChange(); +    void        onTimeFormatChange();      void        onNotificationsChange(const std::string& OptionName);      void        onNameTagOpacityChange(const LLSD& newvalue); @@ -235,6 +236,7 @@ private:      LLButton*       mDeleteTranscriptsBtn = nullptr;      LLButton*       mEnablePopupBtn = nullptr;      LLButton*       mDisablePopupBtn = nullptr; +    LLComboBox*     mTimeFormatCombobox = nullptr;      std::unique_ptr< ll::prefs::SearchData > mSearchData;      bool mSearchDataDirty; diff --git a/indra/newview/llfloatertoybox.cpp b/indra/newview/llfloatertoybox.cpp index f6257dbd3d..5e3ec366d5 100644 --- a/indra/newview/llfloatertoybox.cpp +++ b/indra/newview/llfloatertoybox.cpp @@ -63,7 +63,7 @@ bool LLFloaterToybox::postBuild()      mToolBar->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3));      mToolBar->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4)); -    mToolBar->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4)); +    mToolBar->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4,_5));      mToolBar->setButtonEnterCallback(boost::bind(&LLFloaterToybox::onToolBarButtonEnter,this,_1));      // diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp index 7651b2528f..2f1857ec61 100644 --- a/indra/newview/llfloaterurlentry.cpp +++ b/indra/newview/llfloaterurlentry.cpp @@ -242,6 +242,16 @@ void LLFloaterURLEntry::getMediaTypeCoro(std::string url, LLHandle<LLFloater> pa              resolvedMimeType = mimeType;          }      } +    else if (resultHeaders.has(HTTP_IN_HEADER_X_CONTENT_TYPE_OPTIONS)) +    { +        const std::string& val = resultHeaders[HTTP_IN_HEADER_X_CONTENT_TYPE_OPTIONS]; +        if (val == HTTP_NOSNIFF) +        { +            // Doesn't permit 'sniffing' mime type, default to either html or plain +            // If this doesn't work user will have to choose something manually. +            resolvedMimeType = HTTP_CONTENT_TEXT_HTML; +        } +    }      floaterUrlEntry->headerFetchComplete(status.getType(), resolvedMimeType); diff --git a/indra/newview/llgltfmateriallist.cpp b/indra/newview/llgltfmateriallist.cpp index 8da835ed7d..3e4aadc381 100644 --- a/indra/newview/llgltfmateriallist.cpp +++ b/indra/newview/llgltfmateriallist.cpp @@ -359,6 +359,7 @@ void LLGLTFMaterialList::queueApply(const LLViewerObject* obj, S32 side, const L  {      if (asset_id.isNull() || override_json.empty())      { +        // If there is no asset, there can't be an override          queueApply(obj, side, asset_id);      }      else @@ -371,6 +372,7 @@ void LLGLTFMaterialList::queueApply(const LLViewerObject* obj, S32 side, const L  {      if (asset_id.isNull() || material_override == nullptr)      { +        // If there is no asset, there can't be an override          queueApply(obj, side, asset_id);      }      else @@ -470,7 +472,7 @@ void LLGLTFMaterialList::flushUpdatesOnce(std::shared_ptr<CallbackHolder> callba          {              data[i]["gltf_json"] = e.override_data->asJSON();          } -        if (!e.override_json.empty()) +        else if (!e.override_json.empty())          {              data[i]["gltf_json"] = e.override_json;          } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index bc89af2eed..67b62433f8 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -811,6 +811,10 @@ void LLIMModel::LLIMSession::initVoiceChannel(const LLSD& voiceChannelInfo)  {      if (mVoiceChannel)      { +        if (!voiceChannelInfo.isMap()) +        { +            LL_WARNS() << "initVoiceChannel called without voiceChannelInfo" << LL_ENDL; +        }          if (mVoiceChannel->isThisVoiceChannel(voiceChannelInfo))          {              return; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index f508935799..1ec7ec85c9 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -4390,6 +4390,32 @@ void LLFolderBridge::pasteLinkFromClipboard()          std::vector<LLUUID> objects;          LLClipboard::instance().pasteFromClipboard(objects); +        if (objects.size() == 0) +        { +            LLClipboard::instance().setCutMode(false); +            return; +        } + +        LLUUID& first_id = objects[0]; +        LLInventoryItem* item = model->getItem(first_id); +        if (item && item->getAssetUUID().isNull()) +        { +            if (item->getActualType() == LLAssetType::AT_NOTECARD) +            { +                // otehrwise AIS will return 'Cannot link to items with a NULL asset_id.' +                LLNotificationsUtil::add("CantLinkNotecard"); +                LLClipboard::instance().setCutMode(false); +                return; +            } +            else if (item->getActualType() == LLAssetType::AT_MATERIAL) +            { +                LLNotificationsUtil::add("CantLinkMaterial"); +                LLClipboard::instance().setCutMode(false); +                return; +            } +        } + +          LLPointer<LLInventoryCallback> cb = NULL;          LLInventoryPanel* panel = mInventoryPanel.get();          if (panel->getRootFolder()->isSingleFolderMode()) diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index a4cb6ea65d..c54af7d9f1 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -2120,6 +2120,30 @@ void LLInventoryGallery::pasteAsLink()      std::vector<LLUUID> objects;      LLClipboard::instance().pasteFromClipboard(objects); +    if (objects.size() == 0) +    { +        LLClipboard::instance().setCutMode(false); +        return; +    } + +    LLUUID& first_id = objects[0]; +    LLInventoryItem* item = gInventory.getItem(first_id); +    if (item && item->getAssetUUID().isNull()) +    { +        if (item->getActualType() == LLAssetType::AT_NOTECARD) +        { +            LLNotificationsUtil::add("CantLinkNotecard"); +            LLClipboard::instance().setCutMode(false); +            return; +        } +        else if (item->getActualType() == LLAssetType::AT_MATERIAL) +        { +            LLNotificationsUtil::add("CantLinkMaterial"); +            LLClipboard::instance().setCutMode(false); +            return; +        } +    } +      bool paste_into_root = mSelectedItemIDs.empty();      for (LLUUID& dest : mSelectedItemIDs)      { diff --git a/indra/newview/llinventorygallerymenu.cpp b/indra/newview/llinventorygallerymenu.cpp index b9d4f4471a..6bea648380 100644 --- a/indra/newview/llinventorygallerymenu.cpp +++ b/indra/newview/llinventorygallerymenu.cpp @@ -624,20 +624,23 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men      bool has_children = false;      bool is_full_perm_item = false;      bool is_copyable = false; -    LLViewerInventoryItem* selected_item = gInventory.getItem(selected_id); + +    LLViewerInventoryCategory* selected_category = nullptr; +    LLViewerInventoryItem* selected_item = nullptr;      if(is_folder)      { -        LLInventoryCategory* category = gInventory.getCategory(selected_id); -        if (category) +        selected_category = dynamic_cast<LLViewerInventoryCategory*>(obj); +        if (selected_category)          { -            folder_type = category->getPreferredType(); +            folder_type = selected_category->getPreferredType();              is_system_folder = LLFolderType::lookupIsProtectedType(folder_type);              has_children = (gInventory.categoryHasChildren(selected_id) != LLInventoryModel::CHILDREN_NO);          }      }      else      { +        selected_item = dynamic_cast<LLViewerInventoryItem*>(obj);          if (selected_item)          {              is_full_perm_item = selected_item->getIsFullPerm(); @@ -756,8 +759,7 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men      {          if (is_agent_inventory && !is_inbox && !is_cof && !is_in_favorites && !is_outfits && !is_in_outfits)          { -            LLViewerInventoryCategory* category = gInventory.getCategory(selected_id); -            if (!category || !LLFriendCardsManager::instance().isCategoryInFriendFolder(category)) +            if (!selected_category || !LLFriendCardsManager::instance().isCategoryInFriendFolder(selected_category))              {                  items.push_back(std::string("New Folder"));              } @@ -785,6 +787,22 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men              if (inventory_linking)              {                  items.push_back(std::string("Paste As Link")); + +                if (selected_item) +                { +                    if (!LLAssetType::lookupCanLink(selected_item->getActualType())) +                    { +                        disabled_items.push_back(std::string("Paste As Link")); +                    } +                    else if (gInventory.isObjectDescendentOf(selected_item->getUUID(), gInventory.getLibraryRootFolderID())) +                    { +                        disabled_items.push_back(std::string("Paste As Link")); +                    } +                } +                else if (selected_category && LLFolderType::lookupIsProtectedType(selected_category->getPreferredType())) +                { +                    disabled_items.push_back(std::string("Paste As Link")); +                }              }          }          if (is_folder && is_agent_inventory) @@ -1045,9 +1063,8 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men          {              if (is_folder)              { -                LLViewerInventoryCategory* cat = gInventory.getCategory(selected_id); -                if (cat -                    && !LLFolderType::lookupIsProtectedType(cat->getPreferredType()) +                if (selected_category +                    && !LLFolderType::lookupIsProtectedType(selected_category->getPreferredType())                      && gInventory.isObjectDescendentOf(selected_id, gInventory.getRootFolderID()))                  {                      can_list = true; diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp index cfa37cc3ee..73cc953692 100644 --- a/indra/newview/llinventoryitemslist.cpp +++ b/indra/newview/llinventoryitemslist.cpp @@ -40,6 +40,10 @@  #include "llinventorymodel.h"  #include "llviewerinventory.h" +bool LLInventoryItemsList::sListIdleRegistered = false; +LLInventoryItemsList::all_list_t LLInventoryItemsList::sAllLists; +LLInventoryItemsList::all_list_t::iterator LLInventoryItemsList::sAllListIter; +  LLInventoryItemsList::Params::Params()  {} @@ -55,13 +59,39 @@ LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p      setNoFilteredItemsMsg(LLTrans::getString("InventoryNoMatchingItems")); -    gIdleCallbacks.addFunction(idle, this); +    sAllLists.push_back(this); +    sAllListIter = sAllLists.begin(); + +    if (!sListIdleRegistered) +    { +        sAllListIter = sAllLists.begin(); +        gIdleCallbacks.addFunction(idle, nullptr); + +        LLEventPumps::instance().obtain("LLApp").listen( +            "LLInventoryItemsList", +            [](const LLSD& stat) +        { +            std::string status(stat["status"]); +            if (status != "running") +            { +                // viewer is starting shutdown +                gIdleCallbacks.deleteFunction(idle, nullptr); +            } +            return false; +        }); +        sListIdleRegistered = true; +    }  }  // virtual  LLInventoryItemsList::~LLInventoryItemsList()  { -    gIdleCallbacks.deleteFunction(idle, this); +    auto it = std::find(sAllLists.begin(), sAllLists.end(), this); +    if (it != sAllLists.end()) +    { +        sAllLists.erase(it); +        sAllListIter = sAllLists.begin(); +    }  }  void LLInventoryItemsList::refreshList(const LLInventoryModel::item_array_t item_array) @@ -111,25 +141,55 @@ void LLInventoryItemsList::updateSelection()      mSelectTheseIDs.clear();  } -void LLInventoryItemsList::doIdle() +bool LLInventoryItemsList::doIdle()  { -    if (mRefreshState == REFRESH_COMPLETE) return; +    if (mRefreshState == REFRESH_COMPLETE) return true; // done      if (isInVisibleChain() || mForceRefresh || !getFilterSubString().empty())      {          refresh();          mRefreshCompleteSignal(this, LLSD()); +        return false; // keep going      } +    return true; // done  }  //static  void LLInventoryItemsList::idle(void* user_data)  { -    LLInventoryItemsList* self = static_cast<LLInventoryItemsList*>(user_data); -    if ( self ) -    {   // Do the real idle -        self->doIdle(); +    if (sAllLists.empty()) +        return; + +    LL_PROFILE_ZONE_SCOPED; + +    using namespace std::chrono; +    auto start = steady_clock::now(); +    const milliseconds time_limit = milliseconds(3); +    const auto end_time = start + time_limit; +    S32 max_update_count = 50; + +    if (sAllListIter == sAllLists.end()) +    { +        sAllListIter = sAllLists.begin(); +    } + +    S32 updated = 0; +    while (steady_clock::now() < end_time +           && updated < max_update_count +           && sAllListIter != sAllLists.end()) +    { +        LLInventoryItemsList* list = *sAllListIter; +        // Refresh is split into multiple separate parts, +        // so keep repeating it while there is time, until done. +        // Todo: refresh() split is pointless now? +        // Or still useful for large folders? +        if (list->doIdle()) +        { +            // Item is done +            ++sAllListIter; +            updated++; +        }      }  } @@ -141,6 +201,7 @@ void LLInventoryItemsList::refresh()      {      case REFRESH_ALL:          { +            LL_PROFILE_ZONE_NAMED("items_refresh_all");              mAddedItems.clear();              mRemovedItems.clear();              computeDifference(getIDs(), mAddedItems, mRemovedItems); @@ -163,6 +224,7 @@ void LLInventoryItemsList::refresh()          }      case REFRESH_LIST_ERASE:          { +            LL_PROFILE_ZONE_NAMED("items_refresh_erase");              uuid_vec_t::const_iterator it = mRemovedItems.begin();              for (; mRemovedItems.end() != it; ++it)              { @@ -175,6 +237,7 @@ void LLInventoryItemsList::refresh()          }      case REFRESH_LIST_APPEND:          { +            LL_PROFILE_ZONE_NAMED("items_refresh_append");              static const unsigned ADD_LIMIT = 25; // Note: affects perfomance              unsigned int nadded = 0; @@ -239,6 +302,7 @@ void LLInventoryItemsList::refresh()          }      case REFRESH_LIST_SORT:          { +            LL_PROFILE_ZONE_NAMED("items_refresh_sort");              // Filter, sort, rearrange and notify parent about shape changes              filterItems(true, true); @@ -255,7 +319,10 @@ void LLInventoryItemsList::refresh()              break;          }      default: -        break; +        { +            mRefreshState = REFRESH_COMPLETE; +            break; +        }      }      setForceRefresh(mRefreshState != REFRESH_COMPLETE); diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h index 9ebeb5e52b..b20c27eec8 100644 --- a/indra/newview/llinventoryitemslist.h +++ b/indra/newview/llinventoryitemslist.h @@ -59,7 +59,10 @@ public:       * Sets the flag indicating that the list needs to be refreshed even if it is       * not currently visible.       */ -    void setForceRefresh(bool force_refresh) { mForceRefresh = force_refresh; } +    void setForceRefresh(bool force_refresh) +    { +        mForceRefresh = force_refresh; +    }      /**      * If refreshes when invisible. @@ -76,7 +79,7 @@ public:       * This is needed for example to filter items of the list hidden by closed       * accordion tab.       */ -    virtual void doIdle();                      // Real idle routine +    bool doIdle();                          // Real idle routine      static void idle(void* user_data);      // static glue to doIdle()  protected: @@ -126,6 +129,12 @@ private:      bool mForceRefresh;      commit_signal_t mRefreshCompleteSignal; + +    // Update synchronization +    typedef std::vector<LLInventoryItemsList*> all_list_t; +    static all_list_t sAllLists; +    static all_list_t::iterator sAllListIter; +    static bool sListIdleRegistered;  };  #endif //LL_LLINVENTORYITEMSLIST_H diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 999f431bd6..1a07efe25d 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -80,8 +80,8 @@ const static std::string MULTI_LINE_PREFIX(" ");   *   * Note: "You" was used as an avatar names in viewers of previous versions   */ -const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}:\\d{2}\\]\\s+|\\[\\d{1,2}:\\d{2}\\]\\s+)?(.*)$"); -const static boost::regex TIMESTAMP("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}\\]|\\[\\d{1,2}:\\d{2}\\]).*"); +const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}:\\d{2}\\s[AaPp][Mm]\\]\\s+|\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}:\\d{2}\\]\\s+|\\[\\d{1,2}:\\d{2}:\\d{2}\\s[AaPp][Mm]\\]\\s+|\\[\\d{1,2}:\\d{2}\\]\\s+)?(.*)$"); +const static boost::regex TIMESTAMP("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}(\\s[AaPp][Mm])?\\]|\\[\\d{1,2}:\\d{2}(\\s[AaPp][Mm])?\\]).*");  /**   *  Regular expression suitable to match names like @@ -152,6 +152,10 @@ public:      void checkAndCutOffDate(std::string& time_str)      { +        if (time_str.size() < 10) // not enough space for a date +        { +            return; +        }          // Cuts off the "%Y/%m/%d" from string for todays timestamps.          // Assume that passed string has at least "%H:%M" time format.          date log_date(not_a_date_time); @@ -168,20 +172,12 @@ public:          if ( days_alive == zero_days )          { -            // Yep, today's so strip "%Y/%m/%d" info -            ptime stripped_time(not_a_date_time); - -            mTimeStream.str(LLStringUtil::null); -            mTimeStream << time_str; -            mTimeStream >> stripped_time; -            mTimeStream.clear(); - -            time_str.clear(); - -            mTimeStream.str(LLStringUtil::null); -            mTimeStream << stripped_time; -            mTimeStream >> time_str; -            mTimeStream.clear(); +            size_t pos = time_str.find_first_of(' '); +            if (pos != std::string::npos) +            { +                time_str.erase(0, pos + 1); +                LLStringUtil::trim(time_str); +            }          }          LL_DEBUGS("LLChatLogParser") @@ -310,18 +306,24 @@ std::string LLLogChat::timestamp2LogString(U32 timestamp, bool withdate)      std::string timeStr;      if (withdate)      { -        timeStr = "[" + LLTrans::getString ("TimeYear") + "]/[" -                  + LLTrans::getString ("TimeMonth") + "]/[" -                  + LLTrans::getString ("TimeDay") + "] [" -                  + LLTrans::getString ("TimeHour") + "]:[" -                  + LLTrans::getString ("TimeMin") + "]:[" -                  + LLTrans::getString ("TimeSec") + "]"; +        timeStr = "[" + LLTrans::getString("TimeYear") + "]/[" +            + LLTrans::getString("TimeMonth") + "]/[" +            + LLTrans::getString("TimeDay") + "] "; +    } + +    static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); +    if (use_24h) +    { +        timeStr += "[" + LLTrans::getString("TimeHour") + "]:[" +            + LLTrans::getString("TimeMin") + "]:[" +            + LLTrans::getString("TimeSec") + "]";      }      else      { -        timeStr = "[" + LLTrans::getString("TimeHour") + "]:[" -                  + LLTrans::getString ("TimeMin")+"]:[" -                  + LLTrans::getString ("TimeSec")+"]"; +        timeStr += "[" + LLTrans::getString("TimeHour12") + "]:[" +            + LLTrans::getString("TimeMin") + "]:[" +            + LLTrans::getString("TimeSec") + "] [" +            + LLTrans::getString("TimeAMPM") + "]";      }      LLSD substitution; diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 4bffe7feac..41cec4f074 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -62,7 +62,7 @@  const S32 LOGIN_MAX_RETRIES = 0; // Viewer should not autmatically retry login  const F32 LOGIN_SRV_TIMEOUT_MIN = 10; -const F32 LOGIN_SRV_TIMEOUT_MAX = 120; +const F32 LOGIN_SRV_TIMEOUT_MAX = 180;  const F32 LOGIN_DNS_TIMEOUT_FACTOR = 0.9; // make DNS wait shorter then retry time  class LLLoginInstance::Disposable { diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 8d5f94cdbb..413f02b723 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -256,6 +256,7 @@  //     mDecompositionRequests   mMutex        rw.repo.mMutex, ro.repo.none [5]  //     mPhysicsShapeRequests    mMutex        rw.repo.mMutex, ro.repo.none [5]  //     mDecompositionQ          mMutex        rw.repo.mLoadedMutex, rw.main.mLoadedMutex [5] (was:  [0]) +//     mPhysicsQ                mMutex        rw.repo.mLoadedMutex, rw.main.mLoadedMutex [5] (was:  [0])  //     mHeaderReqQ              mMutex        ro.repo.none [5], rw.repo.mMutex, rw.any.mMutex  //     mLODReqQ                 mMutex        ro.repo.none [5], rw.repo.mMutex, rw.any.mMutex  //     mUnavailableQ            mMutex        rw.repo.none [0], ro.main.none [5], rw.main.mLoadedMutex @@ -982,6 +983,12 @@ LLMeshRepoThread::~LLMeshRepoThread()          mDecompositionQ.pop_front();      } +    while (!mPhysicsQ.empty()) +    { +        delete mPhysicsQ.front(); +        mPhysicsQ.pop_front(); +    } +      delete mHttpRequest;      mHttpRequest = nullptr;      delete mMutex; @@ -2565,12 +2572,12 @@ EMeshProcessingResult LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_      {          LLMutexLock lock(mLoadedMutex); -        mDecompositionQ.push_back(d); +        mPhysicsQ.push_back(d);      }      return MESH_OK;  } -LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, const LLMeshUploadThread::lod_sources_map_t& sources_list, +LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list_t& data, const LLMeshUploadThread::lod_sources_map_t& sources_list,                                         LLVector3& scale, bool upload_textures,                                         bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position,                                         const std::string & upload_url, LLUUID destination_folder_id, bool do_upload, @@ -2652,7 +2659,7 @@ void LLMeshUploadThread::DecompRequest::completed()  void LLMeshUploadThread::preStart()  {      //build map of LLModel refs to instances for callbacks -    for (instance_list::iterator iter = mInstanceList.begin(); iter != mInstanceList.end(); ++iter) +    for (instance_list_t::iterator iter = mInstanceList.begin(); iter != mInstanceList.end(); ++iter)      {          mInstance[iter->mModel].push_back(*iter);      } @@ -2701,6 +2708,179 @@ LLSD llsd_from_file(std::string filename)      return result;  } +void LLMeshUploadThread::packModelIntance( +    LLModel* model, +    LLMeshUploadThread::instance_list_t& instance_list, +    std::string& model_name, +    LLSD& res, +    S32& mesh_num, +    S32& texture_num, +    S32& instance_num, +    std::unordered_set<LLViewerTexture* >& textures, +    std::unordered_map<LLViewerTexture*, S32> texture_index, +    std::unordered_map<LLModel*, S32>& mesh_index, +    std::vector<std::string>& texture_list_dest, +    bool include_textures +    ) +{ +    LLMeshUploadData data; +    data.mBaseModel = model; + +    LLModelInstance& first_instance = *(instance_list.begin()); +    for (S32 i = 0; i < 5; i++) +    { +        data.mModel[i] = first_instance.mLOD[i]; +    } + +    if (mesh_index.find(data.mBaseModel) == mesh_index.end()) +    { +        // Have not seen this model before - create a new mesh_list entry for it. +        if (model_name.empty()) +        { +            model_name = data.mBaseModel->getName(); +        } + +        std::stringstream ostr; + +        LLModel::Decomposition& decomp = +            data.mModel[LLModel::LOD_PHYSICS].notNull() ? +            data.mModel[LLModel::LOD_PHYSICS]->mPhysics : +            data.mBaseModel->mPhysics; + +        decomp.mBaseHull = mHullMap[data.mBaseModel]; + +        LLSD mesh_header = LLModel::writeModel( +            ostr, +            data.mModel[LLModel::LOD_PHYSICS], +            data.mModel[LLModel::LOD_HIGH], +            data.mModel[LLModel::LOD_MEDIUM], +            data.mModel[LLModel::LOD_LOW], +            data.mModel[LLModel::LOD_IMPOSTOR], +            decomp, +            mUploadSkin, +            mUploadJoints, +            mLockScaleIfJointPosition, +            LLModel::WRITE_BINARY, +            false, +            data.mBaseModel->mSubmodelID); + +        data.mAssetData = ostr.str(); +        std::string str = ostr.str(); + +        res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(), str.end()); +        mesh_index[data.mBaseModel] = mesh_num; +        mesh_num++; +    } + +    // For all instances that use this model +    for (instance_list_t::iterator instance_iter = instance_list.begin(); +        instance_iter != instance_list.end(); +        ++instance_iter) +    { +        LLModelInstance& instance = *instance_iter; + +        LLSD instance_entry; + +        for (S32 i = 0; i < 5; i++) +        { +            data.mModel[i] = instance.mLOD[i]; +        } + +        LLVector3 pos, scale; +        LLQuaternion rot; +        LLMatrix4 transformation = instance.mTransform; +        decomposeMeshMatrix(transformation, pos, rot, scale); +        instance_entry["position"] = ll_sd_from_vector3(pos); +        instance_entry["rotation"] = ll_sd_from_quaternion(rot); +        instance_entry["scale"] = ll_sd_from_vector3(scale); + +        instance_entry["material"] = LL_MCODE_WOOD; +        if (model->mSubmodelID) +        { +            // Should it really be different? +            instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_NONE); +        } +        else +        { +            instance_entry["physics_shape_type"] = data.mModel[LLModel::LOD_PHYSICS].notNull() ? (U8)(LLViewerObject::PHYSICS_SHAPE_PRIM) : (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL); +        } +        instance_entry["mesh"] = mesh_index[data.mBaseModel]; +        instance_entry["mesh_name"] = instance.mLabel; + +        instance_entry["face_list"] = LLSD::emptyArray(); + +        // We want to be able to allow more than 8 materials... +        // +        S32 end = llmin((S32)data.mBaseModel->mMaterialList.size(), instance.mModel->getNumVolumeFaces()); + +        for (S32 face_num = 0; face_num < end; face_num++) +        { +            // multiple faces can reuse the same material +            LLImportMaterial& material = instance.mMaterial[data.mBaseModel->mMaterialList[face_num]]; +            LLSD face_entry = LLSD::emptyMap(); + +            LLViewerFetchedTexture* texture = NULL; + +            if (material.mDiffuseMapFilename.size()) +            { +                texture = FindViewerTexture(material); +            } + +            if ((texture != NULL) && +                (textures.find(texture) == textures.end())) +            { +                textures.insert(texture); +            } + +            std::stringstream texture_str; +            if (texture != NULL && include_textures && mUploadTextures) +            { +                if (texture->hasSavedRawImage()) +                { +                    LLImageDataLock lock(texture->getSavedRawImage()); + +                    LLPointer<LLImageJ2C> upload_file = +                        LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage()); + +                    if (!upload_file.isNull() && upload_file->getDataSize() && !upload_file->isBufferInvalid()) +                    { +                        texture_str.write((const char*)upload_file->getData(), upload_file->getDataSize()); +                    } +                } +            } + +            if (texture != NULL && +                mUploadTextures && +                texture_index.find(texture) == texture_index.end()) +            { +                texture_index[texture] = texture_num; +                std::string str = texture_str.str(); +                res["texture_list"][texture_num] = LLSD::Binary(str.begin(), str.end()); +                // store indexes for error handling; +                texture_list_dest.push_back(material.mDiffuseMapFilename); +                texture_num++; +            } + +            // Subset of TextureEntry fields. +            if (texture != NULL && mUploadTextures) +            { +                face_entry["image"] = texture_index[texture]; +                face_entry["scales"] = 1.0; +                face_entry["scalet"] = 1.0; +                face_entry["offsets"] = 0.0; +                face_entry["offsett"] = 0.0; +                face_entry["imagerot"] = 0.0; +            } +            face_entry["diffuse_color"] = ll_sd_from_color4(material.mDiffuseColor); +            face_entry["fullbright"] = material.mFullbright; +            instance_entry["face_list"][face_num] = face_entry; +        } + +        res["instance_list"][instance_num] = instance_entry; +        instance_num++; +    } +} +  void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>& texture_list_dest, bool include_textures)  {      LLSD result; @@ -2734,6 +2914,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>&      }      S32 mesh_num = 0;      S32 texture_num = 0; +    S32 instance_num = 0;      std::unordered_set<LLViewerTexture* > textures;      std::unordered_map<LLViewerTexture*,S32> texture_index; @@ -2741,7 +2922,34 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>&      std::unordered_map<LLModel*,S32> mesh_index;      std::string model_name; -    S32 instance_num = 0; +    // If server gets a m1, m2, m3, m4 list, m1 becomes the root +    // and the rest go as m4, m3, m2 +    // to counter that mInstance is sorted as m4, m3, m2, m1 +    // and we grab m1 from the end and send it first +    LLModel* root_model = nullptr; +    for (instance_map_t::reverse_iterator iter = mInstance.rbegin(); iter != mInstance.rend(); ++iter) +    { +        if (iter->first->mSubmodelID) +        { +            // Submodel can't be root +            continue; +        } +        root_model = iter->first; +        packModelIntance( +            iter->first, +            iter->second, +            model_name, +            res, +            mesh_num, +            texture_num, +            instance_num, +            textures, +            texture_index, +            mesh_index, +            texture_list_dest, +            include_textures); +        break; +    }      // Handle models, ignore submodels for now.      // Probably should pre-sort by mSubmodelID instead of running twice. @@ -2749,319 +2957,53 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>&      // deterministic order.      for (auto& iter : mInstance)      { -        LLMeshUploadData data; -        data.mBaseModel = iter.first; - -        if (data.mBaseModel->mSubmodelID) +        if (iter.first->mSubmodelID)          {              // These are handled below to insure correct parenting order on creation              // due to map walking being based on model address (aka random)              continue;          } - -        LLModelInstance& first_instance = *(iter.second.begin()); -        for (S32 i = 0; i < 5; i++) -        { -            data.mModel[i] = first_instance.mLOD[i]; -        } - -        if (mesh_index.find(data.mBaseModel) == mesh_index.end()) -        { -            // Have not seen this model before - create a new mesh_list entry for it. -            if (model_name.empty()) -            { -                model_name = data.mBaseModel->getName(); -            } - -            std::stringstream ostr; - -            LLModel::Decomposition& decomp = -                data.mModel[LLModel::LOD_PHYSICS].notNull() ? -                data.mModel[LLModel::LOD_PHYSICS]->mPhysics : -                data.mBaseModel->mPhysics; - -            decomp.mBaseHull = mHullMap[data.mBaseModel]; - -            LLSD mesh_header = LLModel::writeModel( -                ostr, -                data.mModel[LLModel::LOD_PHYSICS], -                data.mModel[LLModel::LOD_HIGH], -                data.mModel[LLModel::LOD_MEDIUM], -                data.mModel[LLModel::LOD_LOW], -                data.mModel[LLModel::LOD_IMPOSTOR], -                decomp, -                mUploadSkin, -                mUploadJoints, -                mLockScaleIfJointPosition, -                LLModel::WRITE_BINARY, -                false, -                data.mBaseModel->mSubmodelID); - -            data.mAssetData = ostr.str(); -            std::string str = ostr.str(); - -            res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(),str.end()); -            mesh_index[data.mBaseModel] = mesh_num; -            mesh_num++; -        } - -        // For all instances that use this model -        for (instance_list::iterator instance_iter = iter.second.begin(); -             instance_iter != iter.second.end(); -             ++instance_iter) +        if (root_model == iter.first)          { - -            LLModelInstance& instance = *instance_iter; - -            LLSD instance_entry; - -            for (S32 i = 0; i < 5; i++) -            { -                data.mModel[i] = instance.mLOD[i]; -            } - -            LLVector3 pos, scale; -            LLQuaternion rot; -            LLMatrix4 transformation = instance.mTransform; -            decomposeMeshMatrix(transformation,pos,rot,scale); -            instance_entry["position"] = ll_sd_from_vector3(pos); -            instance_entry["rotation"] = ll_sd_from_quaternion(rot); -            instance_entry["scale"] = ll_sd_from_vector3(scale); - -            instance_entry["material"] = LL_MCODE_WOOD; -            instance_entry["physics_shape_type"] = data.mModel[LLModel::LOD_PHYSICS].notNull() ? (U8)(LLViewerObject::PHYSICS_SHAPE_PRIM) : (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL); -            instance_entry["mesh"] = mesh_index[data.mBaseModel]; -            instance_entry["mesh_name"] = instance.mLabel; - -            instance_entry["face_list"] = LLSD::emptyArray(); - -            // We want to be able to allow more than 8 materials... -            // -            S32 end = llmin((S32)data.mBaseModel->mMaterialList.size(), instance.mModel->getNumVolumeFaces()) ; - -            for (S32 face_num = 0; face_num < end; face_num++) -            { -                // multiple faces can reuse the same material -                LLImportMaterial& material = instance.mMaterial[data.mBaseModel->mMaterialList[face_num]]; -                LLSD face_entry = LLSD::emptyMap(); - -                LLViewerFetchedTexture *texture = NULL; - -                if (material.mDiffuseMapFilename.size()) -                { -                    texture = FindViewerTexture(material); -                } - -                if ((texture != NULL) && -                    (textures.find(texture) == textures.end())) -                { -                    textures.insert(texture); -                } - -                std::stringstream texture_str; -                if (texture != NULL && include_textures && mUploadTextures) -                { -                    if (texture->hasSavedRawImage()) -                    { -                        LLImageDataLock lock(texture->getSavedRawImage()); - -                        LLPointer<LLImageJ2C> upload_file = -                            LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage()); - -                        if (!upload_file.isNull() && upload_file->getDataSize() && !upload_file->isBufferInvalid()) -                        { -                            texture_str.write((const char*) upload_file->getData(), upload_file->getDataSize()); -                        } -                    } -                } - -                if (texture != NULL && -                    mUploadTextures && -                    texture_index.find(texture) == texture_index.end()) -                { -                    texture_index[texture] = texture_num; -                    std::string str = texture_str.str(); -                    res["texture_list"][texture_num] = LLSD::Binary(str.begin(),str.end()); -                    // store indexes for error handling; -                    texture_list_dest.push_back(material.mDiffuseMapFilename); -                    texture_num++; -                } - -                // Subset of TextureEntry fields. -                if (texture != NULL && mUploadTextures) -                { -                    face_entry["image"] = texture_index[texture]; -                    face_entry["scales"] = 1.0; -                    face_entry["scalet"] = 1.0; -                    face_entry["offsets"] = 0.0; -                    face_entry["offsett"] = 0.0; -                    face_entry["imagerot"] = 0.0; -                } -                face_entry["diffuse_color"] = ll_sd_from_color4(material.mDiffuseColor); -                face_entry["fullbright"] = material.mFullbright; -                instance_entry["face_list"][face_num] = face_entry; -            } - -            res["instance_list"][instance_num] = instance_entry; -            instance_num++; +            // Reached root, root was already packed and is last non-submodel +            break;          } +        packModelIntance( +            iter.first, +            iter.second, +            model_name, +            res, +            mesh_num, +            texture_num, +            instance_num, +            textures, +            texture_index, +            mesh_index, +            texture_list_dest, +            include_textures);      }      // Now handle the submodels.      for (auto& iter : mInstance)      { -        LLMeshUploadData data; -        data.mBaseModel = iter.first; - -        if (!data.mBaseModel->mSubmodelID) +        if (!iter.first->mSubmodelID)          {              // These were handled above already... -            //              continue;          } - -        LLModelInstance& first_instance = *(iter.second.begin()); -        for (S32 i = 0; i < 5; i++) -        { -            data.mModel[i] = first_instance.mLOD[i]; -        } - -        if (mesh_index.find(data.mBaseModel) == mesh_index.end()) -        { -            // Have not seen this model before - create a new mesh_list entry for it. -            if (model_name.empty()) -            { -                model_name = data.mBaseModel->getName(); -            } - -            std::stringstream ostr; - -            LLModel::Decomposition& decomp = -                data.mModel[LLModel::LOD_PHYSICS].notNull() ? -                data.mModel[LLModel::LOD_PHYSICS]->mPhysics : -                data.mBaseModel->mPhysics; - -            decomp.mBaseHull = mHullMap[data.mBaseModel]; - -            LLSD mesh_header = LLModel::writeModel( -                ostr, -                data.mModel[LLModel::LOD_PHYSICS], -                data.mModel[LLModel::LOD_HIGH], -                data.mModel[LLModel::LOD_MEDIUM], -                data.mModel[LLModel::LOD_LOW], -                data.mModel[LLModel::LOD_IMPOSTOR], -                decomp, -                mUploadSkin, -                mUploadJoints, -                mLockScaleIfJointPosition, -                LLModel::WRITE_BINARY, -                false, -                data.mBaseModel->mSubmodelID); - -            data.mAssetData = ostr.str(); -            std::string str = ostr.str(); - -            res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(),str.end()); -            mesh_index[data.mBaseModel] = mesh_num; -            mesh_num++; -        } - -        // For all instances that use this model -        for (instance_list::iterator instance_iter = iter.second.begin(); -             instance_iter != iter.second.end(); -             ++instance_iter) -        { - -            LLModelInstance& instance = *instance_iter; - -            LLSD instance_entry; - -            for (S32 i = 0; i < 5; i++) -            { -                data.mModel[i] = instance.mLOD[i]; -            } - -            LLVector3 pos, scale; -            LLQuaternion rot; -            LLMatrix4 transformation = instance.mTransform; -            decomposeMeshMatrix(transformation,pos,rot,scale); -            instance_entry["position"] = ll_sd_from_vector3(pos); -            instance_entry["rotation"] = ll_sd_from_quaternion(rot); -            instance_entry["scale"] = ll_sd_from_vector3(scale); - -            instance_entry["material"] = LL_MCODE_WOOD; -            instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_NONE); -            instance_entry["mesh"] = mesh_index[data.mBaseModel]; - -            instance_entry["face_list"] = LLSD::emptyArray(); - -            // We want to be able to allow more than 8 materials... -            // -            S32 end = llmin((S32)instance.mMaterial.size(), instance.mModel->getNumVolumeFaces()) ; - -            for (S32 face_num = 0; face_num < end; face_num++) -            { -                LLImportMaterial& material = instance.mMaterial[data.mBaseModel->mMaterialList[face_num]]; -                LLSD face_entry = LLSD::emptyMap(); - -                LLViewerFetchedTexture *texture = NULL; - -                if (material.mDiffuseMapFilename.size()) -                { -                    texture = FindViewerTexture(material); -                } - -                if ((texture != NULL) && -                    (textures.find(texture) == textures.end())) -                { -                    textures.insert(texture); -                } - -                std::stringstream texture_str; -                if (texture != NULL && include_textures && mUploadTextures) -                { -                    if (texture->hasSavedRawImage()) -                    { -                        LLImageDataLock lock(texture->getSavedRawImage()); - -                        LLPointer<LLImageJ2C> upload_file = -                            LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage()); - -                        if (!upload_file.isNull() && upload_file->getDataSize()) -                        { -                            texture_str.write((const char*) upload_file->getData(), upload_file->getDataSize()); -                        } -                    } -                } - -                if (texture != NULL && -                    mUploadTextures && -                    texture_index.find(texture) == texture_index.end()) -                { -                    texture_index[texture] = texture_num; -                    std::string str = texture_str.str(); -                    res["texture_list"][texture_num] = LLSD::Binary(str.begin(),str.end()); -                    texture_num++; -                } - -                // Subset of TextureEntry fields. -                if (texture != NULL && mUploadTextures) -                { -                    face_entry["image"] = texture_index[texture]; -                    face_entry["scales"] = 1.0; -                    face_entry["scalet"] = 1.0; -                    face_entry["offsets"] = 0.0; -                    face_entry["offsett"] = 0.0; -                    face_entry["imagerot"] = 0.0; -                } -                face_entry["diffuse_color"] = ll_sd_from_color4(material.mDiffuseColor); -                face_entry["fullbright"] = material.mFullbright; -                instance_entry["face_list"][face_num] = face_entry; -            } - -            res["instance_list"][instance_num] = instance_entry; -            instance_num++; -        } +        packModelIntance( +            iter.first, +            iter.second, +            model_name, +            res, +            mesh_num, +            texture_num, +            instance_num, +            textures, +            texture_index, +            mesh_index, +            texture_list_dest, +            include_textures);      }      if (model_name.empty()) model_name = "mesh model"; @@ -3077,7 +3019,7 @@ void LLMeshUploadThread::generateHulls()  {      bool has_valid_requests = false ; -    for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter) +    for (instance_map_t::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)      {          LLMeshUploadData data;          data.mBaseModel = iter->first; @@ -3441,13 +3383,14 @@ void LLMeshRepoThread::notifyLoadedMeshes()          }      } -    if (!mSkinInfoQ.empty() || !mSkinUnavailableQ.empty() || ! mDecompositionQ.empty()) +    if (!mSkinInfoQ.empty() || !mSkinUnavailableQ.empty() || !mDecompositionQ.empty() || !mPhysicsQ.empty())      {          if (mLoadedMutex->trylock())          {              std::deque<LLPointer<LLMeshSkinInfo>> skin_info_q;              std::deque<UUIDBasedRequest> skin_info_unavail_q;              std::list<LLModel::Decomposition*> decomp_q; +            std::list<LLModel::Decomposition*> physics_q;              if (! mSkinInfoQ.empty())              { @@ -3464,6 +3407,11 @@ void LLMeshRepoThread::notifyLoadedMeshes()                  decomp_q.swap(mDecompositionQ);              } +            if (!mPhysicsQ.empty()) +            { +                physics_q.swap(mPhysicsQ); +            } +              mLoadedMutex->unlock();              // Process the elements free of the lock @@ -3480,9 +3428,15 @@ void LLMeshRepoThread::notifyLoadedMeshes()              while (! decomp_q.empty())              { -                gMeshRepo.notifyDecompositionReceived(decomp_q.front()); +                gMeshRepo.notifyDecompositionReceived(decomp_q.front(), false);                  decomp_q.pop_front();              } + +            while (!physics_q.empty()) +            { +                gMeshRepo.notifyDecompositionReceived(physics_q.front(), true); +                physics_q.pop_front(); +            }          }      } @@ -4724,13 +4678,13 @@ void LLMeshRepository::notifySkinInfoUnavailable(const LLUUID& mesh_id)      }  } -void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decomp) +void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decomp, bool physics_mesh)  { -    decomposition_map::iterator iter = mDecompositionMap.find(decomp->mMeshID); +    LLUUID decomp_id = decomp->mMeshID; // Copy to avoid invalidation in below deletion +    decomposition_map::iterator iter = mDecompositionMap.find(decomp_id);      if (iter == mDecompositionMap.end())      { //just insert decomp into map -        mDecompositionMap[decomp->mMeshID] = decomp; -        mLoadingDecompositions.erase(decomp->mMeshID); +        mDecompositionMap[decomp_id] = decomp;          sCacheBytesDecomps += decomp->sizeBytes();      }      else @@ -4738,10 +4692,17 @@ void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decom          sCacheBytesDecomps -= iter->second->sizeBytes();          iter->second->merge(decomp);          sCacheBytesDecomps += iter->second->sizeBytes(); - -        mLoadingDecompositions.erase(decomp->mMeshID);          delete decomp;      } + +    if (physics_mesh) +    { +        mLoadingPhysicsShapes.erase(decomp_id); +    } +    else +    { +        mLoadingDecompositions.erase(decomp_id); +    }  }  void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVolume* volume, S32 lod) @@ -4888,7 +4849,6 @@ void LLMeshRepository::fetchPhysicsShape(const LLUUID& mesh_id)              std::unordered_set<LLUUID>::iterator iter = mLoadingPhysicsShapes.find(mesh_id);              if (iter == mLoadingPhysicsShapes.end())              { //no request pending for this skin info -                // *FIXME:  Nothing ever deletes entries, can't be right                  mLoadingPhysicsShapes.insert(mesh_id);                  mPendingPhysicsShapeRequests.push(mesh_id);              } diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index ab17b921d6..01b51e753e 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -521,6 +521,9 @@ public:      // list of completed Decomposition info requests      std::list<LLModel::Decomposition*> mDecompositionQ; +    // list of completed Physics Mesh info requests +    std::list<LLModel::Decomposition*> mPhysicsQ; +      //queue of requested headers      std::queue<HeaderRequest> mHeaderReqQ; @@ -668,11 +671,11 @@ public:      LLPointer<DecompRequest> mFinalDecomp;      volatile bool   mPhysicsComplete; -    typedef std::map<LLPointer<LLModel>, std::vector<LLVector3> > hull_map; -    hull_map        mHullMap; +    typedef std::map<LLPointer<LLModel>, std::vector<LLVector3> > hull_map_t; +    hull_map_t      mHullMap; -    typedef std::vector<LLModelInstance> instance_list; -    instance_list   mInstanceList; +    typedef std::vector<LLModelInstance> instance_list_t; +    instance_list_t mInstanceList;      // Upload should happen in deterministic order, so sort instances by model name.      struct LLUploadModelInstanceLess @@ -686,11 +689,11 @@ public:              }              // Note: probably can sort by mBaseModel->mSubmodelID here as well to avoid              // running over the list twice in wholeModelToLLSD. -            return a->mLabel < b->mLabel; +            return a->mLabel > b->mLabel;          }      }; -    typedef std::map<LLPointer<LLModel>, instance_list, LLUploadModelInstanceLess> instance_map; -    instance_map    mInstance; +    typedef std::map<LLPointer<LLModel>, instance_list_t, LLUploadModelInstanceLess> instance_map_t; +    instance_map_t    mInstance;      typedef std::map<std::string, std::string> lod_sources_map_t;      lod_sources_map_t mLodSources; @@ -709,7 +712,7 @@ public:      std::string     mWholeModelUploadURL;      LLUUID          mDestinationFolderId; -    LLMeshUploadThread(instance_list& data, const lod_sources_map_t& sources_list, +    LLMeshUploadThread(instance_list_t& data, const lod_sources_map_t& sources_list,                         LLVector3& scale, bool upload_textures,                         bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position,                         const std::string & upload_url, @@ -745,6 +748,22 @@ public:      static LLViewerFetchedTexture* FindViewerTexture(const LLImportMaterial& material); +protected: +    void packModelIntance( +        LLModel* model, +        LLMeshUploadThread::instance_list_t& instance_list, +        std::string& model_name, +        LLSD& res, +        S32& mesh_num, +        S32& texture_num, +        S32& instance_num, +        std::unordered_set<LLViewerTexture* > &textures, +        std::unordered_map<LLViewerTexture*, S32> texture_index, +        std::unordered_map<LLModel*, S32>& mesh_index, +        std::vector<std::string>& texture_list_dest, +        bool include_textures +        ); +  private:      LLHandle<LLWholeModelFeeObserver> mFeeObserverHandle;      LLHandle<LLWholeModelUploadObserver> mUploadObserverHandle; @@ -855,7 +874,7 @@ public:      void notifyMeshUnavailable(const LLVolumeParams& mesh_params, S32 request_lod, S32 volume_lod);      void notifySkinInfoReceived(LLMeshSkinInfo* info);      void notifySkinInfoUnavailable(const LLUUID& info); -    void notifyDecompositionReceived(LLModel::Decomposition* info); +    void notifyDecompositionReceived(LLModel::Decomposition* info, bool physics_mesh);      S32 getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod);      static S32 getActualMeshLOD(LLMeshHeader& header, S32 lod); diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index 887d53b918..6a7c25ec0f 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -576,7 +576,7 @@ void LLModelPreview::rebuildUploadData()          for (U32 model_ind = 0; model_ind < mModel[lod].size(); ++model_ind)          {              bool found_model = false; -            for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) +            for (LLMeshUploadThread::instance_list_t::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)              {                  LLModelInstance& instance = *iter;                  if (instance.mLOD[lod] == mModel[lod][model_ind]) @@ -2209,7 +2209,7 @@ void LLModelPreview::updateStatusMessages()          total_submeshes[i] = 0;      } -    for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) +    for (LLMeshUploadThread::instance_list_t::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)      {          LLModelInstance& instance = *iter; @@ -2626,7 +2626,16 @@ void LLModelPreview::updateStatusMessages()          //enable = enable && !use_hull && fmp->childGetValue("physics_optimize").asBoolean();          //enable/disable "analysis" UI -        LLPanel* panel = fmp->getChild<LLPanel>("physics analysis"); +#if LL_HAVOK +        LLPanel* panel = fmp->getChild<LLPanel>("physics simplification"); +        panel->setVisible(true); + +        panel = fmp->getChild<LLPanel>("physics analysis havok"); +        panel->setVisible(true); +#else +        LLPanel* panel = fmp->getChild<LLPanel>("physics analysis vhacd"); +        panel->setVisible(true); +#endif          LLView* child = panel->getFirstChild();          while (child)          { @@ -2650,6 +2659,8 @@ void LLModelPreview::updateStatusMessages()              fmp->childSetVisible("simplify_cancel", false);              fmp->childSetVisible("Decompose", true);              fmp->childSetVisible("decompose_cancel", false); +            fmp->childSetVisible("Analyze", true); +            fmp->childSetVisible("analyze_cancel", false);              if (phys_hulls > 0)              { @@ -2659,6 +2670,7 @@ void LLModelPreview::updateStatusMessages()              if (phys_tris || phys_hulls > 0)              {                  fmp->childEnable("Decompose"); +                fmp->childEnable("Analyze");              }          }          else @@ -3530,7 +3542,7 @@ bool LLModelPreview::render()          if (!show_skin_weight)          { -            for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) +            for (LLMeshUploadThread::instance_list_t::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)              {                  LLModelInstance& instance = *iter; @@ -3620,7 +3632,7 @@ bool LLModelPreview::render()                      gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA); -                    for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) +                    for (LLMeshUploadThread::instance_list_t::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)                      {                          LLModelInstance& instance = *iter; @@ -3745,7 +3757,7 @@ bool LLModelPreview::render()                          gGL.diffuseColor4f(1.f, 0.f, 0.f, 1.f);                          const LLVector4a scale(0.5f); -                        for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) +                        for (LLMeshUploadThread::instance_list_t::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)                          {                              LLModelInstance& instance = *iter; diff --git a/indra/newview/llmodelpreview.h b/indra/newview/llmodelpreview.h index 7b3b699b33..92ac2d1faf 100644 --- a/indra/newview/llmodelpreview.h +++ b/indra/newview/llmodelpreview.h @@ -319,7 +319,7 @@ protected:      // Amount of triangles in original(base) model      U32 mMaxTriangleLimit; -    LLMeshUploadThread::instance_list mUploadData; +    LLMeshUploadThread::instance_list_t mUploadData;      std::set<LLViewerFetchedTexture * > mTextureSet;      LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList; diff --git a/indra/newview/llnotificationlistitem.cpp b/indra/newview/llnotificationlistitem.cpp index 5b8b28ebe6..9a33bcb1b9 100644 --- a/indra/newview/llnotificationlistitem.cpp +++ b/indra/newview/llnotificationlistitem.cpp @@ -38,6 +38,7 @@  #include "lluicolortable.h"  #include "message.h"  #include "llnotificationsutil.h" +#include "llviewercontrol.h"  #include <boost/regex.hpp>  LLNotificationListItem::LLNotificationListItem(const Params& p) : LLPanel(p), @@ -133,10 +134,22 @@ std::string LLNotificationListItem::buildNotificationDate(const LLDate& time_sta          default:              timeStr = "[" + LLTrans::getString("TimeMonth") + "]/["                  +LLTrans::getString("TimeDay")+"]/[" -                +LLTrans::getString("TimeYear")+"] [" -                +LLTrans::getString("TimeHour")+"]:[" -                +LLTrans::getString("TimeMin")+"] [" -                +LLTrans::getString("TimeTimezone")+"]"; +                +LLTrans::getString("TimeYear")+"] ["; + +            static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); +            if (use_24h) +            { +                timeStr += LLTrans::getString("TimeHour") + "]:[" +                    + LLTrans::getString("TimeMin") + "] [" +                    + LLTrans::getString("TimeTimezone") + "]"; +            } +            else +            { +                timeStr += LLTrans::getString("TimeHour12") + "]:[" +                    + LLTrans::getString("TimeMin") + "] [" +                    + LLTrans::getString("TimeAMPM") + "] [" +                    + LLTrans::getString("TimeTimezone") + "]"; +            }              break;      }      LLSD substitution; diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp index 3adee9fa16..8589afae06 100644 --- a/indra/newview/lloutfitgallery.cpp +++ b/indra/newview/lloutfitgallery.cpp @@ -818,6 +818,7 @@ void LLOutfitGallery::getCurrentCategories(uuid_vec_t& vcur)  void LLOutfitGallery::updateAddedCategory(LLUUID cat_id)  { +    LL_PROFILE_ZONE_SCOPED;      LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);      if (!cat) return; diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 4e594af432..58cd9fab83 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -181,6 +181,7 @@ void LLOutfitsList::onOpen(const LLSD& info)  void LLOutfitsList::updateAddedCategory(LLUUID cat_id)  { +    LL_PROFILE_ZONE_SCOPED;      LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);      if (!cat) return; @@ -251,7 +252,9 @@ void LLOutfitsList::updateAddedCategory(LLUUID cat_id)      if (AISAPI::isAvailable() && LLInventoryModelBackgroundFetch::instance().folderFetchActive())      { -        // for reliability just fetch it whole, linked items included +        // For reliability just fetch it whole, linked items included +        // Todo: list is not warrantied to exist once callback arrives +        // Fix it!          LLInventoryModelBackgroundFetch::instance().fetchFolderAndLinks(cat_id, [cat_id, list]          {              if (list) @@ -1059,6 +1062,7 @@ void LLOutfitListBase::onIdle(void* userdata)  void LLOutfitListBase::onIdleRefreshList()  { +    LL_PROFILE_ZONE_SCOPED;      if (LLAppViewer::instance()->quitRequested())      {          mRefreshListState.CategoryUUID.setNull(); @@ -1072,7 +1076,7 @@ void LLOutfitListBase::onIdleRefreshList()          return;      } -    const F64 MAX_TIME = 0.05f; +    const F64 MAX_TIME = 0.005f;      F64 curent_time = LLTimer::getTotalSeconds();      const F64 end_time = curent_time + MAX_TIME; diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 514d772340..fc5c468297 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -4721,7 +4721,6 @@ void LLPanelFace::onPasteTexture(LLViewerObject* objectp, S32 te)                  if (allow)                  {                      objectp->setRenderMaterialID(te, te_data["te"]["pbr"].asUUID(), false /*managing our own update*/); -                    tep->setGLTFRenderMaterial(nullptr);                      tep->setGLTFMaterialOverride(nullptr);                      if (te_data["te"].has("pbr_override")) @@ -4737,7 +4736,6 @@ void LLPanelFace::onPasteTexture(LLViewerObject* objectp, S32 te)              else              {                  objectp->setRenderMaterialID(te, LLUUID::null, false /*send in bulk later*/ ); -                tep->setGLTFRenderMaterial(nullptr);                  tep->setGLTFMaterialOverride(nullptr);                  // blank out most override data on the server diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index 41373cd7f5..7596c0eba8 100644 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -41,6 +41,7 @@  #include "lllandmarkactions.h"  #include "llparcel.h"  #include "llslurl.h" +#include "llviewercontrol.h"  #include "llviewerinventory.h"  #include "llviewerparcelmgr.h"  #include "llviewerregion.h" @@ -326,7 +327,8 @@ void LLPanelLandmarkInfo::displayItemInfo(const LLInventoryItem* pItem)      }      else      { -        std::string timeStr = getString("acquired_date"); +        static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); +        std::string timeStr = use_24h ? getString("acquired_date") : getString("acquired_date_ampm");          LLSD substitution;          substitution["datetime"] = (S32) time_utc;          LLStringUtil::format (timeStr, substitution); diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index f90d6d5b3f..a31a54bb67 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -385,10 +385,7 @@ bool LLTaskInvFVBridge::removeItem()                  return true;              } -            LLSD payload; -            payload["task_id"] = mPanel->getTaskUUID(); -            payload["inventory_ids"].append(mUUID); -            LLNotificationsUtil::add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel)); +            LLNotificationsUtil::add("CantModifyContentInNoModTask");              return false;          }      } @@ -411,13 +408,7 @@ void LLTaskInvFVBridge::removeBatch(std::vector<LLFolderViewModelItem*>& batch)      if (!object->permModify())      { -        LLSD payload; -        payload["task_id"] = mPanel->getTaskUUID(); -        for (LLFolderViewModelItem* item : batch) -        { -            payload["inventory_ids"].append(((LLTaskInvFVBridge*)item)->getUUID()); -        } -        LLNotificationsUtil::add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel)); +        LLNotificationsUtil::add("CantModifyContentInNoModTask");      }      else      { diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index 578bc5b9a7..24a6875d5a 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -859,7 +859,7 @@ void LLPanelProfileSecondLife::resetData()      resetLoading();      // Set default image and 1:1 dimensions for it -    mSecondLifePic->setValue("Generic_Person_Large"); +    mSecondLifePic->setValue(LLUUID());      LLRect imageRect = mSecondLifePicLayout->getRect();      mSecondLifePicLayout->reshape(imageRect.getWidth(), imageRect.getWidth()); diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 902412d359..bfdfa68e01 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -42,6 +42,7 @@  #include "llnotificationsutil.h"  #include "lltextbox.h"  #include "lltoggleablemenu.h" +#include "llviewercontrol.h"  #include "llviewermenu.h"  #include "lllandmarkactions.h"  #include "llclipboard.h" @@ -215,8 +216,18 @@ std::string LLTeleportHistoryFlatItem::getTimestamp()      // Only show timestamp for today and yesterday      if(time_diff < seconds_today + seconds_in_day)      { -        timestamp = "[" + LLTrans::getString("TimeHour12")+"]:[" -                        + LLTrans::getString("TimeMin")+"] ["+ LLTrans::getString("TimeAMPM")+"]"; +        static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); +        if (use_24h) +        { +            timestamp = "[" + LLTrans::getString("TimeHour") + "]:[" +                + LLTrans::getString("TimeMin") + "]"; +        } +        else +        { +            timestamp = "[" + LLTrans::getString("TimeHour12") + "]:[" +                + LLTrans::getString("TimeMin") + "] [" + LLTrans::getString("TimeAMPM") + "]"; +        } +          LLSD substitution;          substitution["datetime"] = (S32) date.secondsSinceEpoch();          LLStringUtil::format(timestamp, substitution); diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp index 60877494e7..d8d6bcf5fd 100644 --- a/indra/newview/llpanelvoicedevicesettings.cpp +++ b/indra/newview/llpanelvoicedevicesettings.cpp @@ -240,13 +240,38 @@ void LLPanelVoiceDeviceSettings::refresh()          if(mCtrlInputDevices)          {              mCtrlInputDevices->removeall(); -            mCtrlInputDevices->add(getLocalizedDeviceName(mInputDevice), mInputDevice, ADD_BOTTOM); +            auto it = mLocalizedDeviceNames.find(mInputDevice); +            if (it != mLocalizedDeviceNames.end()) +            { +                mCtrlInputDevices->add(getLocalizedDeviceName(mInputDevice), mInputDevice, ADD_BOTTOM); +            } +            else +            { +                // Display name generaly doesn't match value. +                // Value is an id so it's not nessesary readable, +                // might not even be valid (disconnected usb). +                // Until we get the data, don't change the device, +                // otherwise box might override the control. +                // But show a readable placeholder. +                // Combo is disabled so it's safe to show +                // a placeholder. +                mCtrlInputDevices->add(getString("device_not_loaded"), mInputDevice, ADD_BOTTOM); +            }              mCtrlInputDevices->setValue(mInputDevice);          }          if(mCtrlOutputDevices)          {              mCtrlOutputDevices->removeall(); -            mCtrlOutputDevices->add(getLocalizedDeviceName(mOutputDevice), mOutputDevice, ADD_BOTTOM); +            auto it = mLocalizedDeviceNames.find(mOutputDevice); +            if (it != mLocalizedDeviceNames.end()) +            { +                mCtrlOutputDevices->add(getLocalizedDeviceName(mOutputDevice), mOutputDevice, ADD_BOTTOM); +            } +            else +            { +                // Don't change the device, only the label +                mCtrlOutputDevices->add(getString("device_not_loaded"), mOutputDevice, ADD_BOTTOM); +            }              mCtrlOutputDevices->setValue(mOutputDevice);          }      } diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index 2fbdbeaf59..5916163f60 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -582,7 +582,7 @@ void LLPanelVolume::getState( )      bool enable_material = editable && single_volume && material_same;      LLCachedControl<bool> edit_linked(gSavedSettings, "EditLinkedParts", false); -    if (!enable_material && !edit_linked()) +    if (!enable_material)      {          LLViewerObject* root = selection->getPrimaryObject();          while (root && !root->isAvatar() && root->getParent()) @@ -592,6 +592,10 @@ void LLPanelVolume::getState( )              {                  break;              } +            if (!parent->isSelected()) +            { +                break; +            }              root = parent;          }          if (root) diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index 22a9dd0027..2fdec14f6d 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -109,25 +109,27 @@ bool LLScriptFloater::toggle(const LLUUID& notification_id)  LLScriptFloater* LLScriptFloater::show(const LLUUID& notification_id)  {      LLScriptFloater* floater = LLFloaterReg::getTypedInstance<LLScriptFloater>("script_floater", notification_id); -    floater->setNotificationId(notification_id); -    floater->createForm(notification_id); - -    //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445) -    floater->setAutoFocus(false); - -    if(LLScriptFloaterManager::OBJ_SCRIPT == LLScriptFloaterManager::getObjectType(notification_id)) +    if (floater)      { -        floater->setSavePosition(true); -        floater->restorePosition(); -    } -    else -    { -        floater->dockToChiclet(true); -    } +        floater->setNotificationId(notification_id); +        floater->createForm(notification_id); -    //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445) -    LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, false); +        //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445) +        floater->setAutoFocus(false); +        if (LLScriptFloaterManager::OBJ_SCRIPT == LLScriptFloaterManager::getObjectType(notification_id)) +        { +            floater->setSavePosition(true); +            floater->restorePosition(); +        } +        else +        { +            floater->dockToChiclet(true); +        } + +        //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445) +        LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, false); +    }      return floater;  } diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 329522f18c..e171136ffa 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -1996,9 +1996,96 @@ bool LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)                      asset_id = BLANK_MATERIAL_ASSET_ID;                  }              } + +            // If this face already has the target material ID, do nothing. +            // This prevents re-sending the same ID on OK, which can cause the server +            // to drop overrides when queueApply is invoked with the OLD id. +            if (objectp->getRenderMaterialID(te) == asset_id) +            { +                return true; +            } + +            // Preserve existing texture transforms when switching to PBR material +            LLTextureEntry* tep = objectp->getTE(te); +            bool should_preserve_transforms = false; +            LLGLTFMaterial* preserved_override = nullptr; + +            if (tep && asset_id.notNull()) +            { +                // Only preserve transforms from existing GLTF material override +                // Do not fall back to texture entry transforms when switching between PBR materials +                LLGLTFMaterial* existing_override = tep->getGLTFMaterialOverride(); +                if (existing_override) +                { +                    // Check if existing override has non-default transforms +                    const LLGLTFMaterial::TextureTransform& existing_transform = existing_override->mTextureTransform[0]; +                    const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform(); + +                    if (existing_transform.mScale != default_transform.mScale || +                        existing_transform.mOffset != default_transform.mOffset || +                        existing_transform.mRotation != default_transform.mRotation) +                    { +                        // Preserve non-default transforms from current PBR material +                        preserved_override = new LLGLTFMaterial(); +                        for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) +                        { +                            preserved_override->mTextureTransform[i].mScale = existing_transform.mScale; +                            preserved_override->mTextureTransform[i].mOffset = existing_transform.mOffset; +                            preserved_override->mTextureTransform[i].mRotation = existing_transform.mRotation; +                        } +                        should_preserve_transforms = true; +                    } +                    // If existing override has default transforms, don't preserve anything +                } +                else +                { +                    // No existing PBR material override - check texture entry transforms +                    // This handles the case of switching from Blinn-Phong to PBR material +                    F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation; +                    tep->getScale(&existing_scale_s, &existing_scale_t); +                    tep->getOffset(&existing_offset_s, &existing_offset_t); +                    existing_rotation = tep->getRotation(); + +                    const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform(); +                    if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] || +                        existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] || +                        existing_rotation != default_transform.mRotation) +                    { +                        // Preserve non-default transforms from texture entry +                        preserved_override = new LLGLTFMaterial(); +                        for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) +                        { +                            LLVector2 pbr_scale, pbr_offset; +                            F32 pbr_rotation; +                            LLGLTFMaterial::convertTextureTransformToPBR( +                                existing_scale_s, existing_scale_t, +                                existing_offset_s, existing_offset_t, +                                existing_rotation, +                                pbr_scale, pbr_offset, pbr_rotation); +                            preserved_override->mTextureTransform[i].mScale = pbr_scale; +                            preserved_override->mTextureTransform[i].mOffset = pbr_offset; +                            preserved_override->mTextureTransform[i].mRotation = pbr_rotation; +                        } +                        should_preserve_transforms = true; +                    } +                } +            } +              objectp->clearTEWaterExclusion(te);              // Blank out most override data on the object and send to server              objectp->setRenderMaterialID(te, asset_id); +            if (should_preserve_transforms && preserved_override) +            { +                // Apply material with preserved transforms +                LLGLTFMaterialList::queueApply(objectp, te, asset_id, preserved_override); +                // Update local state +                objectp->setRenderMaterialID(te, asset_id, false, true); +                tep->setGLTFMaterialOverride(preserved_override); +            } +            else +            { +                objectp->setRenderMaterialID(te, asset_id); +            }              return true;          } @@ -2265,23 +2352,9 @@ void LLSelectMgr::selectionRevertGLTFMaterials()                      //blank override out                      LLGLTFMaterialList::queueApply(objectp, te, asset_id);                  } -                if (old_asset_id != asset_id) -                { -                    // Restore overrides and base material -                    // Note: might not work reliably if asset is already there, might -                    // have a server sided problem where servers applies override -                    // first then resets it by adding asset, in which case need -                    // to create a server ticket and chain asset then override -                    // application. -                    LLGLTFMaterialList::queueApply(objectp, te, asset_id, material); -                }                  else                  { -                    // Enqueue override update to server -                    // Note: this is suboptimal, better to send asset id as well -                    // but there seems to be a server problem with queueApply -                    // that ignores override in some cases -                    LLGLTFMaterialList::queueModify(objectp, te, material); +                    LLGLTFMaterialList::queueApply(objectp, te, asset_id, material);                  }              }              return true; diff --git a/indra/newview/llsettingspicker.cpp b/indra/newview/llsettingspicker.cpp index 619882dc5e..5fc39b0dd8 100644 --- a/indra/newview/llsettingspicker.cpp +++ b/indra/newview/llsettingspicker.cpp @@ -152,7 +152,11 @@ void LLFloaterSettingsPicker::onClose(bool app_quitting)          owner->setFocus(true);      }      mSettingItemID.setNull(); -    mInventoryPanel->getRootFolder()->clearSelection(); +    mInventoryPanel->clearSelection(); +    if (mInventoryPanel->getRootFolder()) +    { +        mInventoryPanel->getRootFolder()->clearSelection(); +    }  }  void LLFloaterSettingsPicker::setValue(const LLSD& value) diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 3d4b4fb9c1..6d50f216f5 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -487,7 +487,8 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)      }      else      { -        std::string timeStr = getString("acquiredDate"); +        static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); +        std::string timeStr = use_24h ? getString("acquiredDate") : getString("acquiredDateAMPM");          LLSD substitution;          substitution["datetime"] = (S32) time_utc;          LLStringUtil::format (timeStr, substitution); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index eca5ba82ac..c3c7945763 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -446,7 +446,26 @@ bool idle_startup()      system = osString.substr (begIdx, endIdx - begIdx);      system += "Locale"; -    LLStringUtil::setLocale (LLTrans::getString(system)); +    std::string locale = LLTrans::getString(system); +    if (locale != LLStringUtil::getLocale()) // is there a reason to do this on repeat? +    { +        LLStringUtil::setLocale(locale); + +        // Not all locales have AMPM, test it +        if (LLStringOps::sAM.empty()) // Might already be overriden from LLAppViewer::init() +        { +            LLDate datetime(0.0); +            std::string val = datetime.toHTTPDateString("%p"); +            if (val.empty()) +            { +                LL_DEBUGS("InitInfo") << "Current locale \"" << locale << "\" " +                    << "doesn't support AM/PM time format" << LL_ENDL; +                // fallback to declarations in strings.xml +                LLStringOps::sAM = LLTrans::getString("dateTimeAM"); +                LLStringOps::sPM = LLTrans::getString("dateTimePM"); +            } +        } +    }      //note: Removing this line will cause incorrect button size in the login screen. -- bao.      gTextureList.updateImages(0.01f) ; diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp index 1826885069..64359b6cbe 100644 --- a/indra/newview/llsurface.cpp +++ b/indra/newview/llsurface.cpp @@ -28,9 +28,6 @@  #include "llsurface.h" -#include "llrender.h" - -#include "llviewertexturelist.h"  #include "llpatchvertexarray.h"  #include "patch_dct.h"  #include "patch_code.h" @@ -39,28 +36,25 @@  #include "llregionhandle.h"  #include "llagent.h"  #include "llagentcamera.h" -#include "llappviewer.h"  #include "llworld.h"  #include "llviewercontrol.h"  #include "llviewertexture.h"  #include "llsurfacepatch.h" -#include "llvosurfacepatch.h"  #include "llvowater.h"  #include "pipeline.h"  #include "llviewerregion.h" -#include "llvlcomposition.h" -#include "noise.h" -#include "llviewercamera.h" -#include "llglheaders.h"  #include "lldrawpoolterrain.h" -#include "lldrawable.h"  #include "llworldmipmap.h"  extern LLPipeline gPipeline;  extern bool gShiftFrame; -LLColor4U MAX_WATER_COLOR(0, 48, 96, 240); +namespace +{ +    static constexpr float MIN_TEXTURE_REQUEST_INTERVAL = 5.0f; +} +LLColor4U MAX_WATER_COLOR(0, 48, 96, 240);  S32 LLSurface::sTextureSize = 256; @@ -74,18 +68,18 @@ LLSurface::LLSurface(U32 type, LLViewerRegion *regionp) :      mType(type),      mDetailTextureScale(0.f),      mOriginGlobal(0.0, 0.0, 0.0), -    mSTexturep(NULL), +    mSTexturep(nullptr),      mGridsPerPatchEdge(0),      mMetersPerGrid(1.0f),      mMetersPerEdge(1.0f),      mRegionp(regionp)  {      // Surface data -    mSurfaceZ = NULL; -    mNorm = NULL; +    mSurfaceZ = nullptr; +    mNorm = nullptr;      // Patch data -    mPatchList = NULL; +    mPatchList = nullptr;      // One of each for each camera      mVisiblePatchCount = 0; @@ -95,14 +89,14 @@ LLSurface::LLSurface(U32 type, LLViewerRegion *regionp) :      mMinZ = 10000.f;      mMaxZ = -10000.f; -    mWaterObjp = NULL; +    mWaterObjp = nullptr;      // In here temporarily.      mSurfacePatchUpdateCount = 0;      for (S32 i = 0; i < 8; i++)      { -        mNeighbors[i] = NULL; +        mNeighbors[i] = nullptr;      }  } @@ -110,7 +104,7 @@ LLSurface::LLSurface(U32 type, LLViewerRegion *regionp) :  LLSurface::~LLSurface()  {      delete [] mSurfaceZ; -    mSurfaceZ = NULL; +    mSurfaceZ = nullptr;      delete [] mNorm; @@ -129,7 +123,7 @@ LLSurface::~LLSurface()      {          gPipeline.removePool(poolp);          // Don't enable this until we blitz the draw pool for it as well.  -- djs -        mSTexturep = NULL; +        mSTexturep = nullptr;      }      else      { @@ -144,7 +138,7 @@ void LLSurface::initClasses()  void LLSurface::setRegion(LLViewerRegion *regionp)  {      mRegionp = regionp; -    mWaterObjp = NULL; // depends on regionp, needs recreating +    mWaterObjp = nullptr; // depends on regionp, needs recreating  }  // Assumes that arguments are powers of 2, and that @@ -211,16 +205,29 @@ LLViewerTexture* LLSurface::getSTexture()  void LLSurface::createSTexture()  { -    if (!mSTexturep) +    if (mSTexturep.isNull()) +    { +        mTimer.setTimerExpirySec(MIN_TEXTURE_REQUEST_INTERVAL); +    } +    else if (mSTexturep->hasGLTexture())      { -        U64 handle = mRegionp->getHandle(); +        // Unexpected: createSTexture() called when a valid texture already exists. +        // This may indicate a logic error in the caller, as textures should not be recreated unnecessarily. +        LL_WARNS() << "Called LLSurface::createSTexture() while we already have a valid texture!" << LL_ENDL; +        return; +    } +    else if (!mTimer.checkExpirationAndReset(MIN_TEXTURE_REQUEST_INTERVAL)) +    { +        // We haven't gotten a valid texture yet, but throttle the number of requests to avoid server flooding +        return; +    } -        U32 grid_x, grid_y; +    U64 handle = mRegionp->getHandle(); +    U32 grid_x, grid_y; -        grid_from_region_handle(handle, &grid_x, &grid_y); +    grid_from_region_handle(handle, &grid_x, &grid_y); -        mSTexturep = LLWorldMipmap::loadObjectsTile(grid_x, grid_y, 1); -    } +    mSTexturep = LLWorldMipmap::loadObjectsTile(grid_x, grid_y, 1);  }  void LLSurface::initTextures() @@ -285,7 +292,7 @@ void LLSurface::getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegio      S32 i;      for (i = 0; i < 8; i++)      { -        if ( mNeighbors[i] != NULL ) +        if (mNeighbors[i] != nullptr)          {              uniqueRegions.push_back( mNeighbors[i]->getRegion() );          } @@ -298,7 +305,7 @@ void LLSurface::getNeighboringRegionsStatus( std::vector<S32>& regions )      S32 i;      for (i = 0; i < 8; i++)      { -        if ( mNeighbors[i] != NULL ) +        if (mNeighbors[i] != nullptr)          {              regions.push_back( i );          } @@ -498,7 +505,7 @@ void LLSurface::disconnectNeighbor(LLSurface *surfacep)      {          if (surfacep == mNeighbors[i])          { -            mNeighbors[i] = NULL; +            mNeighbors[i] = nullptr;          }      } @@ -518,7 +525,7 @@ void LLSurface::disconnectAllNeighbors()          if (mNeighbors[i])          {              mNeighbors[i]->disconnectNeighbor(this); -            mNeighbors[i] = NULL; +            mNeighbors[i] = nullptr;          }      }  } @@ -910,7 +917,7 @@ LLSurfacePatch *LLSurface::resolvePatchRegion(const F32 x, const F32 y) const          if(0 == mNumberOfPatches)          {              LL_WARNS() << "No patches for current region!" << LL_ENDL; -            return NULL; +            return nullptr;          }          S32 old_index = index;          index = llclamp(old_index, 0, (mNumberOfPatches - 1)); @@ -996,7 +1003,7 @@ void LLSurface::createPatchData()              }              else              { -                patchp->setNeighborPatch(EAST, NULL); +                patchp->setNeighborPatch(EAST, nullptr);              }              if (j < mPatchesPerEdge-1) @@ -1005,7 +1012,7 @@ void LLSurface::createPatchData()              }              else              { -                patchp->setNeighborPatch(NORTH, NULL); +                patchp->setNeighborPatch(NORTH, nullptr);              }              if (i > 0) @@ -1014,7 +1021,7 @@ void LLSurface::createPatchData()              }              else              { -                patchp->setNeighborPatch(WEST, NULL); +                patchp->setNeighborPatch(WEST, nullptr);              }              if (j > 0) @@ -1023,7 +1030,7 @@ void LLSurface::createPatchData()              }              else              { -                patchp->setNeighborPatch(SOUTH, NULL); +                patchp->setNeighborPatch(SOUTH, nullptr);              }              if (i < (mPatchesPerEdge-1)  &&  j < (mPatchesPerEdge-1)) @@ -1032,7 +1039,7 @@ void LLSurface::createPatchData()              }              else              { -                patchp->setNeighborPatch(NORTHEAST, NULL); +                patchp->setNeighborPatch(NORTHEAST, nullptr);              }              if (i > 0  &&  j < (mPatchesPerEdge-1)) @@ -1041,7 +1048,7 @@ void LLSurface::createPatchData()              }              else              { -                patchp->setNeighborPatch(NORTHWEST, NULL); +                patchp->setNeighborPatch(NORTHWEST, nullptr);              }              if (i > 0  &&  j > 0) @@ -1050,7 +1057,7 @@ void LLSurface::createPatchData()              }              else              { -                patchp->setNeighborPatch(SOUTHWEST, NULL); +                patchp->setNeighborPatch(SOUTHWEST, nullptr);              }              if (i < (mPatchesPerEdge-1)  &&  j > 0) @@ -1059,7 +1066,7 @@ void LLSurface::createPatchData()              }              else              { -                patchp->setNeighborPatch(SOUTHEAST, NULL); +                patchp->setNeighborPatch(SOUTHEAST, nullptr);              }              LLVector3d origin_global; @@ -1077,7 +1084,7 @@ void LLSurface::destroyPatchData()      // Delete all of the cached patch data for these patches.      delete [] mPatchList; -    mPatchList = NULL; +    mPatchList = nullptr;      mVisiblePatchCount = 0;  } @@ -1105,12 +1112,12 @@ LLSurfacePatch *LLSurface::getPatch(const S32 x, const S32 y) const      if ((x < 0) || (x >= mPatchesPerEdge))      {          LL_ERRS() << "Asking for patch out of bounds" << LL_ENDL; -        return NULL; +        return nullptr;      }      if ((y < 0) || (y >= mPatchesPerEdge))      {          LL_ERRS() << "Asking for patch out of bounds" << LL_ENDL; -        return NULL; +        return nullptr;      }      return mPatchList + x + y*mPatchesPerEdge; diff --git a/indra/newview/llsurface.h b/indra/newview/llsurface.h index fc72ab7db7..a599019ca5 100644 --- a/indra/newview/llsurface.h +++ b/indra/newview/llsurface.h @@ -29,14 +29,8 @@  #include "v3math.h"  #include "v3dmath.h" -#include "v4math.h" -#include "m3math.h" -#include "m4math.h" -#include "llquaternion.h" - -#include "v4coloru.h" -#include "v4color.h" +#include "lltimer.h"  #include "llvowater.h"  #include "llpatchvertexarray.h"  #include "llviewertexture.h" @@ -65,7 +59,7 @@ class LLGroupHeader;  class LLSurface  {  public: -    LLSurface(U32 type, LLViewerRegion *regionp = NULL); +    LLSurface(U32 type, LLViewerRegion *regionp = nullptr);      virtual ~LLSurface();      static void initClasses(); // Do class initialization for LLSurface and its child classes. @@ -169,14 +163,13 @@ public:      F32 mDetailTextureScale;    //  Number of times to repeat detail texture across this surface -protected: +private:      void createSTexture();      void initTextures();      void createPatchData();     // Allocates memory for patches.      void destroyPatchData();    // Deallocates memory for patches. -protected:      LLVector3d  mOriginGlobal;      // In absolute frame      LLSurfacePatch *mPatchList;     // Array of all patches @@ -212,6 +205,7 @@ protected:  private:      LLViewerRegion *mRegionp; // Patch whose coordinate system this surface is using.      static S32  sTextureSize;               // Size of the surface texture +    LLTimer     mTimer; // timer to throttle initial requests until the mSTexture is fully fetched  };  extern template bool LLSurface::idleUpdate</*PBR=*/false>(F32 max_update_time); diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 5507ef517a..b2f2509e80 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -1012,6 +1012,8 @@ void LLFloaterTexturePicker::onBtnSetToDefault(void* userdata)      {          self->setImageID( self->getDefaultImageAssetID() );          self->setTentative(false); +        // Deselect in case inventory has a selected item with the same id +        self->mInventoryPanel->getRootFolder()->clearSelection();      }      self->commitIfImmediateSet();  } @@ -1023,6 +1025,8 @@ void LLFloaterTexturePicker::onBtnBlank(void* userdata)      self->setCanApply(true, true);      self->setImageID( self->getBlankImageAssetID() );      self->setTentative(false); +    // Deselect in case inventory has a selected item with the same id +    self->mInventoryPanel->getRootFolder()->clearSelection();      self->commitIfImmediateSet();  } @@ -1034,6 +1038,8 @@ void LLFloaterTexturePicker::onBtnNone(void* userdata)      self->setCanApply(true, true);      self->setImageID( LLUUID::null );      self->setTentative(false); +    // Deselect in case inventory has a selected item with null id +    self->mInventoryPanel->getRootFolder()->clearSelection();      self->commitIfImmediateSet();  } @@ -1698,10 +1704,16 @@ LLTextureCtrl::LLTextureCtrl(const LLTextureCtrl::Params& p)      mDefaultImageName(p.default_image_name),      mFallbackImage(p.fallback_image)  { - -    // Default of defaults is white image for diff tex -    // -    setBlankImageAssetID(IMG_WHITE); +    if (mInventoryPickType == PICK_MATERIAL) +    { +        setBlankImageAssetID(BLANK_MATERIAL_ASSET_ID); +    } +    else +    { +        // Default of defaults is white image for diff tex +        // +        setBlankImageAssetID(IMG_WHITE); +    }      setAllowNoTexture(p.allow_no_texture);      setCanApplyImmediately(p.can_apply_immediately); diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 93b5806acf..f7cb0ee7ed 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -1295,10 +1295,19 @@ bool LLTextureFetchWorker::doWork(S32 param)                  else                  {                      mCanUseCapability = false; -                    mRegionRetryAttempt++; -                    mRegionRetryTimer.setTimerExpirySec(CAP_MISSING_EXPIRATION_DELAY); -                    // ex: waiting for caps -                    LL_INFOS_ONCE(LOG_TXT) << "Texture not available via HTTP: empty URL." << LL_ENDL; +                    if (gDisconnected) +                    { +                        // We lost connection or are shutting down. +                        mCanUseHTTP = false; +                        return true; // abort +                    } +                    else +                    { +                        // Ex: waiting for caps +                        mRegionRetryAttempt++; +                        mRegionRetryTimer.setTimerExpirySec(CAP_MISSING_EXPIRATION_DELAY); +                        LL_INFOS_ONCE(LOG_TXT) << "Texture not available via HTTP: empty URL." << LL_ENDL; +                    }                  }              }              else @@ -1694,10 +1703,10 @@ bool LLTextureFetchWorker::doWork(S32 param)              mHttpReplyOffset = 0;              mLoadedDiscard = mRequestedDiscard; -            if (mLoadedDiscard < 0) +            if (mLoadedDiscard < 0 || (mLoadedDiscard > MAX_DISCARD_LEVEL && mFormattedImage->getCodec() == IMG_CODEC_J2C))              {                  LL_WARNS(LOG_TXT) << mID << " mLoadedDiscard is " << mLoadedDiscard -                                  << ", should be >=0" << LL_ENDL; +                                  << ", should be >=0 and <=" << MAX_DISCARD_LEVEL << LL_ENDL;              }              setState(DECODE_IMAGE);              if (mWriteToCacheState != NOT_WRITE) @@ -1759,14 +1768,27 @@ bool LLTextureFetchWorker::doWork(S32 param)              LL_DEBUGS(LOG_TXT) << mID << " DECODE_IMAGE abort: mLoadedDiscard < 0" << LL_ENDL;              return true;          } + +        llassert_always(mFormattedImage.notNull()); +        S32 discard = mHaveAllData && mFormattedImage->getCodec() != IMG_CODEC_J2C ? 0 : mLoadedDiscard; +        if (discard > MAX_DISCARD_LEVEL) // only warn for j2c +        { +            // We encode j2c with fixed amount of discard levels, +            // Trying to decode beyound that will fail. +            LL_WARNS(LOG_TXT) << "Decode entered with invalid discard. ID = " << mID << LL_ENDL; + +            //abort, don't decode +            setState(DONE); +            LL_DEBUGS(LOG_TXT) << mID << " DECODE_IMAGE abort: mLoadedDiscard > MAX_DISCARD_LEVEL" << LL_ENDL; +            return true; +        } +          mDecodeTimer.reset();          mRawImage = NULL;          mAuxImage = NULL; -        llassert_always(mFormattedImage.notNull());          // if we have the entire image data (and the image is not J2C), decode the full res image          // DO NOT decode a higher res j2c than was requested.  This is a waste of time and memory. -        S32 discard = mHaveAllData && mFormattedImage->getCodec() != IMG_CODEC_J2C ? 0 : mLoadedDiscard;          mDecoded  = false;          setState(DECODE_IMAGE_UPDATE);          LL_DEBUGS(LOG_TXT) << mID << ": Decoding. Bytes: " << mFormattedImage->getDataSize() << " Discard: " << discard diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index 3c3440d41a..95653dc19b 100644 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -87,10 +87,21 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(const LLNotificationPtr& notifi      std::string timeStr = "[" + LLTrans::getString("TimeWeek") + "], ["                                + LLTrans::getString("TimeMonth") + "]/["                                + LLTrans::getString("TimeDay") + "]/[" -                              + LLTrans::getString("TimeYear") + "] [" -                              + LLTrans::getString("TimeHour") + "]:[" -                              + LLTrans::getString("TimeMin") + "] [" -                              + LLTrans::getString("TimeTimezone") + "]"; +                              + LLTrans::getString("TimeYear") + "] ["; +    static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); +    if (use_24h) +    { +        timeStr += LLTrans::getString("TimeHour") + "]:[" +            + LLTrans::getString("TimeMin") + "] [" +            + LLTrans::getString("TimeTimezone") + "]"; +    } +    else +    { +        timeStr += LLTrans::getString("TimeHour12") + "]:[" +            + LLTrans::getString("TimeMin") + "] [" +            + LLTrans::getString("TimeAMPM") + "] [" +            + LLTrans::getString("TimeTimezone") + "]"; +    }      const LLDate timeStamp = notification->getDate();      LLDate notice_date = timeStamp.notNull() ? timeStamp : payload["received_time"].asDate(); diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp index 0063e0b7fd..c1ec5fa183 100644 --- a/indra/newview/lltoolbarview.cpp +++ b/indra/newview/lltoolbarview.cpp @@ -110,7 +110,7 @@ bool LLToolBarView::postBuild()      {          mToolbars[i]->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3));          mToolbars[i]->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4)); -        mToolbars[i]->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4)); +        mToolbars[i]->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4,_5));          mToolbars[i]->setButtonAddCallback(boost::bind(LLToolBarView::onToolBarButtonAdded,_1));          mToolbars[i]->setButtonRemoveCallback(boost::bind(LLToolBarView::onToolBarButtonRemoved,_1));      } @@ -624,8 +624,14 @@ bool LLToolBarView::handleDragTool( S32 x, S32 y, const LLUUID& uuid, LLAssetTyp      return false;  } -bool LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* toolbar) +bool LLToolBarView::handleDropTool( void* cargo_data, EDragAndDropType cargo_type, S32 x, S32 y, LLToolBar* toolbar)  { +    if (cargo_type == DAD_PERSON) +    { +        // DAD_PERSON means that cargo_data contains an uuid, not an LLInventoryObject +        resetDragTool(NULL); +        return false; +    }      bool handled = false;      LLInventoryObject* inv_item = static_cast<LLInventoryObject*>(cargo_data); @@ -647,15 +653,18 @@ bool LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* t              if (old_toolbar_loc != LLToolBarEnums::TOOLBAR_NONE)              {                  llassert(gToolBarView->mDragToolbarButton); -                old_toolbar = gToolBarView->mDragToolbarButton->getParentByType<LLToolBar>(); -                if (old_toolbar->isReadOnly() && toolbar->isReadOnly()) -                { -                    // do nothing -                } -                else +                if (gToolBarView->mDragToolbarButton)                  { -                    int old_rank = LLToolBar::RANK_NONE; -                    gToolBarView->removeCommand(command_id, old_rank); +                    old_toolbar = gToolBarView->mDragToolbarButton->getParentByType<LLToolBar>(); +                    if (old_toolbar->isReadOnly() && toolbar->isReadOnly()) +                    { +                        // do nothing +                    } +                    else +                    { +                        int old_rank = LLToolBar::RANK_NONE; +                        gToolBarView->removeCommand(command_id, old_rank); +                    }                  }              } diff --git a/indra/newview/lltoolbarview.h b/indra/newview/lltoolbarview.h index 7cecd81052..7212f099b7 100644 --- a/indra/newview/lltoolbarview.h +++ b/indra/newview/lltoolbarview.h @@ -92,7 +92,7 @@ public:      static void startDragTool(S32 x, S32 y, LLToolBarButton* toolbarButton);      static bool handleDragTool(S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type); -    static bool handleDropTool(void* cargo_data, S32 x, S32 y, LLToolBar* toolbar); +    static bool handleDropTool(void* cargo_data, EDragAndDropType cargo_type, S32 x, S32 y, LLToolBar* toolbar);      static void resetDragTool(LLToolBarButton* toolbarButton);      LLInventoryObject* getDragItem();      LLView* getBottomToolbar() { return mBottomToolbarPanel; } diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index b4a5955be3..d0c0bdb5ce 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -29,6 +29,8 @@  // library headers  #include "llnotificationsutil.h" +#include <vector> +#include <tuple>  // project headers  #include "llagent.h"  #include "llagentcamera.h" @@ -1297,7 +1299,89 @@ void LLToolDragAndDrop::dropMaterialOneFace(LLViewerObject* hit_obj,          asset_id = BLANK_MATERIAL_ASSET_ID;      } -    hit_obj->setRenderMaterialID(hit_face, asset_id); +        // Preserve existing texture transforms when switching to PBR material +    LLTextureEntry* tep = hit_obj->getTE(hit_face); +    F32 existing_scale_s = LLGLTFMaterial::TextureTransform().mScale.mV[0]; +    F32 existing_scale_t = LLGLTFMaterial::TextureTransform().mScale.mV[1]; +    F32 existing_offset_s = LLGLTFMaterial::TextureTransform().mOffset.mV[0]; +    F32 existing_offset_t = LLGLTFMaterial::TextureTransform().mOffset.mV[1]; +    F32 existing_rotation = LLGLTFMaterial::TextureTransform().mRotation; +    bool should_preserve_transforms = false; +    LLGLTFMaterial* preserved_override = nullptr; + +    if (tep && asset_id.notNull()) +    { +        // Only preserve transforms from existing GLTF material override +        // Do not fall back to texture entry transforms when switching between PBR materials +        LLGLTFMaterial* existing_override = tep->getGLTFMaterialOverride(); +        if (existing_override) +        { +            // Check if existing override has non-default transforms +            const LLGLTFMaterial::TextureTransform& existing_transform = existing_override->mTextureTransform[0]; +            const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform(); + +            if (existing_transform.mScale != default_transform.mScale || +                existing_transform.mOffset != default_transform.mOffset || +                existing_transform.mRotation != default_transform.mRotation) +            { +                // Preserve non-default transforms from current PBR material +                preserved_override = new LLGLTFMaterial(); +                for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) +                { +                    preserved_override->mTextureTransform[i].mScale = existing_transform.mScale; +                    preserved_override->mTextureTransform[i].mOffset = existing_transform.mOffset; +                    preserved_override->mTextureTransform[i].mRotation = existing_transform.mRotation; +                } +                should_preserve_transforms = true; +            } +            // If existing override has default transforms, don't preserve anything +        } +        else +        { +            // No existing PBR material override - check texture entry transforms +            // This handles the case of switching from Blinn-Phong to PBR material +            F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation; +            tep->getScale(&existing_scale_s, &existing_scale_t); +            tep->getOffset(&existing_offset_s, &existing_offset_t); +            existing_rotation = tep->getRotation(); + +            const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform(); +            if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] || +                existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] || +                existing_rotation != default_transform.mRotation) +            { +                // Preserve non-default transforms from texture entry +                preserved_override = new LLGLTFMaterial(); +                for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) +                { +                    LLVector2 pbr_scale, pbr_offset; +                    F32 pbr_rotation; +                    LLGLTFMaterial::convertTextureTransformToPBR( +                        existing_scale_s, existing_scale_t, +                        existing_offset_s, existing_offset_t, +                        existing_rotation, +                        pbr_scale, pbr_offset, pbr_rotation); +                    preserved_override->mTextureTransform[i].mScale = pbr_scale; +                    preserved_override->mTextureTransform[i].mOffset = pbr_offset; +                    preserved_override->mTextureTransform[i].mRotation = pbr_rotation; +                } +                should_preserve_transforms = true; +            } +        } +    } + +    if (should_preserve_transforms && preserved_override) +    { +        // Apply material with preserved transforms +        LLGLTFMaterialList::queueApply(hit_obj, hit_face, asset_id, preserved_override); +        // Update local state +        hit_obj->setRenderMaterialID(hit_face, asset_id, false, true); +        tep->setGLTFMaterialOverride(preserved_override); +    } +    else +    { +        hit_obj->setRenderMaterialID(hit_face, asset_id); +    }      dialog_refresh_all(); @@ -1333,7 +1417,134 @@ void LLToolDragAndDrop::dropMaterialAllFaces(LLViewerObject* hit_obj,          asset_id = BLANK_MATERIAL_ASSET_ID;      } -    hit_obj->setRenderMaterialIDs(asset_id); +        // Preserve existing texture transforms when switching to PBR material for all faces +    std::vector<std::pair<bool, LLGLTFMaterial*>> preserved_transforms(hit_obj->getNumTEs()); + +    if (asset_id.notNull()) +    { +        for (S32 te = 0; te < hit_obj->getNumTEs(); ++te) +        { +            LLTextureEntry* tep = hit_obj->getTE(te); +            if (!tep) continue; + +            bool should_preserve = false; +            LLGLTFMaterial* preserved_override = nullptr; + +            // Only preserve transforms from existing GLTF material override +            // Do not fall back to texture entry transforms when switching between PBR materials +            LLGLTFMaterial* existing_override = tep->getGLTFMaterialOverride(); +            if (existing_override) +            { +                // Check if existing override has non-default transforms +                const LLGLTFMaterial::TextureTransform& existing_transform = existing_override->mTextureTransform[0]; +                const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform(); + +                if (existing_transform.mScale != default_transform.mScale || +                    existing_transform.mOffset != default_transform.mOffset || +                    existing_transform.mRotation != default_transform.mRotation) +                { +                    // Preserve non-default transforms from current PBR material +                    preserved_override = new LLGLTFMaterial(); +                    for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) +                    { +                        preserved_override->mTextureTransform[i].mScale = existing_transform.mScale; +                        preserved_override->mTextureTransform[i].mOffset = existing_transform.mOffset; +                        preserved_override->mTextureTransform[i].mRotation = existing_transform.mRotation; +                    } +                    should_preserve = true; +                } +                else +                { +                    // Existing override has default transforms, fall back to texture entry +                    F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation; +                    tep->getScale(&existing_scale_s, &existing_scale_t); +                    tep->getOffset(&existing_offset_s, &existing_offset_t); +                    existing_rotation = tep->getRotation(); + +                    if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] || +                        existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] || +                        existing_rotation != default_transform.mRotation) +                    { +                        // Preserve non-default transforms from texture entry +                        preserved_override = new LLGLTFMaterial(); +                        for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) +                        { +                            LLVector2 pbr_scale, pbr_offset; +                            F32 pbr_rotation; +                            LLGLTFMaterial::convertTextureTransformToPBR( +                                existing_scale_s, existing_scale_t, +                                existing_offset_s, existing_offset_t, +                                existing_rotation, +                                pbr_scale, pbr_offset, pbr_rotation); +                            preserved_override->mTextureTransform[i].mScale = pbr_scale; +                            preserved_override->mTextureTransform[i].mOffset = pbr_offset; +                            preserved_override->mTextureTransform[i].mRotation = pbr_rotation; +                        } +                        should_preserve = true; +                    } +                } +            } +            else +            { +                // No existing PBR material override - check texture entry transforms +                // This handles the case of switching from Blinn-Phong to PBR material +                F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation; +                tep->getScale(&existing_scale_s, &existing_scale_t); +                tep->getOffset(&existing_offset_s, &existing_offset_t); +                existing_rotation = tep->getRotation(); + +                const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform(); +                if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] || +                    existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] || +                    existing_rotation != default_transform.mRotation) +                { +                    // Preserve non-default transforms from texture entry +                    preserved_override = new LLGLTFMaterial(); +                    for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) +                    { +                        LLVector2 pbr_scale, pbr_offset; +                        F32 pbr_rotation; +                        LLGLTFMaterial::convertTextureTransformToPBR( +                            existing_scale_s, existing_scale_t, +                            existing_offset_s, existing_offset_t, +                            existing_rotation, +                            pbr_scale, pbr_offset, pbr_rotation); +                        preserved_override->mTextureTransform[i].mScale = pbr_scale; +                        preserved_override->mTextureTransform[i].mOffset = pbr_offset; +                        preserved_override->mTextureTransform[i].mRotation = pbr_rotation; +                    } +                    should_preserve = true; +                } +            } + +            preserved_transforms[te] = std::make_pair(should_preserve, preserved_override); +        } +    } + +    // Apply materials with preserved transforms +    if (asset_id.notNull()) +    { +        for (S32 te = 0; te < hit_obj->getNumTEs(); ++te) +        { +            LLGLTFMaterial* preserved_override = preserved_transforms[te].second; +            if (preserved_override) +            { +                // Apply material with preserved transforms +                LLGLTFMaterialList::queueApply(hit_obj, te, asset_id, preserved_override); +                // Update local state +                hit_obj->setRenderMaterialID(te, asset_id, false, true); +                hit_obj->getTE(te)->setGLTFMaterialOverride(preserved_override); +            } +            else +            { +                hit_obj->setRenderMaterialID(te, asset_id, false, true); +            } +        } +    } +    else +    { +        hit_obj->setRenderMaterialIDs(asset_id); +    }      dialog_refresh_all();      // send the update to the simulator      hit_obj->sendTEUpdate(); diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 6a3be8c882..c15fa52aa4 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -68,6 +68,8 @@  #include "llrender.h"  #include "llnavigationbar.h"  #include "llnotificationsutil.h" +#include "llfloaterpreference.h" +#include "llfloaterreg.h"  #include "llfloatertools.h"  #include "llpaneloutfitsinventory.h"  #include "llpanellogin.h" @@ -150,6 +152,21 @@ static bool handleDebugAvatarJointsChanged(const LLSD& newvalue)      return true;  } +static bool handleDebugQualityPerformanceChanged(const LLSD& newvalue) +{ +    // control was set directly or after adjusting Preference setting, no need to update +    if (gSavedSettings.getU32("RenderQualityPerformance") != gSavedSettings.getU32("DebugQualityPerformance")) +    { +        LLFloaterPreference* instance = LLFloaterReg::getTypedInstance<LLFloaterPreference>("preferences"); +        if (instance) +        { +            gSavedSettings.setU32("RenderQualityPerformance", newvalue.asInteger()); +            instance->onChangeQuality(newvalue); +        } +    } +    return true; +} +  static bool handleAvatarHoverOffsetChanged(const LLSD& newvalue)  {      if (isAgentAvatarValid()) @@ -947,6 +964,7 @@ void settings_setup_listeners()      setting_setup_signal_listener(gSavedSettings, "SpellCheckDictionary", handleSpellCheckChanged);      setting_setup_signal_listener(gSavedSettings, "LoginLocation", handleLoginLocationChanged);      setting_setup_signal_listener(gSavedSettings, "DebugAvatarJoints", handleDebugAvatarJointsChanged); +    setting_setup_signal_listener(gSavedSettings, "DebugQualityPerformance", handleDebugQualityPerformanceChanged);      setting_setup_signal_listener(gSavedSettings, "TargetFPS", handleTargetFPSChanged);      setting_setup_signal_listener(gSavedSettings, "AutoTuneFPS", handleAutoTuneFPSChanged); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index f6ad29d085..4a4a43c2b9 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -1566,6 +1566,11 @@ void render_ui(F32 zoom_factor, int subfield)                  render_disconnected_background();              }          } +        else +        { +            // Make sure particle effects disappear +            LLHUDObject::renderAllForTimer(); +        }          if (render_ui)          { diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 6155058f14..ec5381ddfc 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -419,7 +419,9 @@ void LLViewerInventoryItem::updateServer(bool is_new) const                           << LL_ENDL;          return;      } -    if(gAgent.getID() != mPermissions.getOwner()) +    LLUUID owner = mPermissions.getOwner(); +    if(gAgent.getID() != owner +        && owner.notNull()) // incomplete?      {          // *FIX: deal with this better.          LL_WARNS(LOG_INV) << "LLViewerInventoryItem::updateServer() - for unowned item " diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 452a2cec50..374a2ae075 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -6531,7 +6531,7 @@ bool handle_zoom_to_object(const LLUUID& object_id)      LLViewerObject* object = gObjectList.findObject(object_id); -    if (object) +    if (object && object->isReachable())      {          gAgentCamera.setFocusOnAvatar(false, ANIMATE); diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index b0401b1425..c13e541da0 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -5091,11 +5091,10 @@ void LLViewerObject::setNumTEs(const U8 num_tes)                      if (base_material && override_material)                      {                          tep->setGLTFMaterialOverride(new LLGLTFMaterial(*override_material)); - -                        LLGLTFMaterial* render_material = new LLFetchedGLTFMaterial(); -                        *render_material = *base_material; -                        render_material->applyOverride(*override_material); -                        tep->setGLTFRenderMaterial(render_material); +                    } +                    if (base_material) +                    { +                        initRenderMaterial(i);                      }                  }              } @@ -5271,6 +5270,9 @@ void LLViewerObject::updateTEMaterialTextures(U8 te)                  });          }          getTE(te)->setGLTFMaterial(mat); +        initRenderMaterial(te); +        mat = (LLFetchedGLTFMaterial*) getTE(te)->getGLTFRenderMaterial(); +        llassert(mat == nullptr || dynamic_cast<LLFetchedGLTFMaterial*>(getTE(te)->getGLTFRenderMaterial()) != nullptr);      }      else if (mat_id.isNull() && mat != nullptr)      { @@ -5660,6 +5662,42 @@ S32 LLViewerObject::setTEMaterialParams(const U8 te, const LLMaterialPtr pMateri      return retval;  } +// Set render material if there are overrides or if the base material is has a +// baked texture. Otherwise, set it to null. +// If you are setting the material override and not sending an update message, +// you should probably call this function. +S32 LLViewerObject::initRenderMaterial(U8 te) +{ +    LL_PROFILE_ZONE_SCOPED; + +    LLTextureEntry* tep = getTE(te); +    if (!tep) { return 0; } +    const LLFetchedGLTFMaterial* base_material = static_cast<LLFetchedGLTFMaterial*>(tep->getGLTFMaterial()); +    llassert(base_material); +    if (!base_material) { return 0; } +    const LLGLTFMaterial* override_material = tep->getGLTFMaterialOverride(); +    LLFetchedGLTFMaterial* render_material = nullptr; +    bool need_render_material = override_material; +    if (!need_render_material) +    { +        for (const LLUUID& texture_id : base_material->mTextureId) +        { +            if (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(texture_id)) +            { +                need_render_material = true; +                break; +            } +        } +    } +    if (need_render_material) +    { +        render_material = new LLFetchedGLTFMaterial(*base_material); +        if (override_material) { render_material->applyOverride(*override_material); } +        render_material->clearFetchedTextures(); +    } +    return tep->setGLTFRenderMaterial(render_material); +} +  S32 LLViewerObject::setTEGLTFMaterialOverride(U8 te, LLGLTFMaterial* override_mat)  {      LL_PROFILE_ZONE_SCOPED; @@ -5693,22 +5731,13 @@ S32 LLViewerObject::setTEGLTFMaterialOverride(U8 te, LLGLTFMaterial* override_ma      if (retval)      { +        retval = initRenderMaterial(te) | retval;          if (override_mat)          { -            LLFetchedGLTFMaterial* render_mat = new LLFetchedGLTFMaterial(*src_mat); -            render_mat->applyOverride(*override_mat); -            tep->setGLTFRenderMaterial(render_mat); -            retval = TEM_CHANGE_TEXTURE; -              for (LLGLTFMaterial::local_tex_map_t::value_type &val : override_mat->mTrackingIdToLocalTexture)              {                  LLLocalBitmapMgr::getInstance()->associateGLTFMaterial(val.first, override_mat);              } - -        } -        else if (tep->setGLTFRenderMaterial(nullptr)) -        { -            retval = TEM_CHANGE_TEXTURE;          }      } @@ -7578,25 +7607,15 @@ void LLViewerObject::setRenderMaterialID(S32 te_in, const LLUUID& id, bool updat              // the overrides have not changed due to being only texture              // transforms. Re-apply the overrides to the render material here,              // if present. -            const LLGLTFMaterial* override_material = tep->getGLTFMaterialOverride(); -            if (override_material) +            // Also, sometimes, the material has baked textures, which requires +            // a copy unique to this object. +            // Currently, we do not deduplicate render materials. +            new_material->onMaterialComplete([obj_id = getID(), te]()              { -                new_material->onMaterialComplete([obj_id = getID(), te]() -                    { -                        LLViewerObject* obj = gObjectList.findObject(obj_id); -                        if (!obj) { return; } -                        LLTextureEntry* tep = obj->getTE(te); -                        if (!tep) { return; } -                        const LLGLTFMaterial* new_material = tep->getGLTFMaterial(); -                        if (!new_material) { return; } -                        const LLGLTFMaterial* override_material = tep->getGLTFMaterialOverride(); -                        if (!override_material) { return; } -                        LLGLTFMaterial* render_material = new LLFetchedGLTFMaterial(); -                        *render_material = *new_material; -                        render_material->applyOverride(*override_material); -                        tep->setGLTFRenderMaterial(render_material); -                    }); -            } +                LLViewerObject* obj = gObjectList.findObject(obj_id); +                if (!obj) { return; } +                obj->initRenderMaterial(te); +            });          }      } @@ -7718,6 +7737,51 @@ void LLViewerObject::clearTEWaterExclusion(const U8 te)      }  } +bool LLViewerObject::isReachable() +{ +    LLViewerRegion* agent_region = gAgent.getRegion(); +    LLViewerRegion* object_region = getRegion(); + +    if (!agent_region || !object_region) +    { +        return false; +    } +    if (agent_region == object_region) +    { +        return true; +    } + +    std::unordered_set<LLViewerRegion*> visited; +    std::queue<LLViewerRegion*> pending; +    visited.insert(agent_region); +    pending.push(agent_region); + +    while (!pending.empty()) +    { +        LLViewerRegion* current = pending.front(); +        pending.pop(); + +        std::vector<LLViewerRegion*> neighbors; +        current->getNeighboringRegions(neighbors); + +        for (LLViewerRegion* neighbor : neighbors) +        { +            if (!neighbor) continue; + +            if (neighbor == object_region) +            { +                return true; +            } +            // region's neighbors were not checked +            if (visited.insert(neighbor).second) +            { +                pending.push(neighbor); +            } +        } +    } +    return false; +} +  class ObjectPhysicsProperties : public LLHTTPNode  {  public: diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 972f8cf846..6e26da74e7 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -249,6 +249,9 @@ public:      // Accessor functions      LLViewerRegion* getRegion() const               { return mRegionp; } +    // Check if object is reachable from agent region by traversing loaded neighboring regions +    bool isReachable(); +      bool isSelected() const                         { return mUserSelected; }      // Check whole linkset      bool isAnySelected() const; @@ -389,6 +392,7 @@ public:      /*virtual*/ S32     setTEGlow(const U8 te, const F32 glow);      /*virtual*/ S32     setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID);      /*virtual*/ S32     setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams); +    S32 initRenderMaterial(const U8 te);      virtual     S32     setTEGLTFMaterialOverride(U8 te, LLGLTFMaterial* mat);      // Used by Materials update functions to properly kick off rebuilds diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index c15fd86f71..0a6197a67a 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -1070,7 +1070,7 @@ void LLViewerObjectList::fetchObjectCostsCoro(std::string url)      if (diff.empty())      { -        LL_INFOS() << "No outstanding object IDs to request. Pending count: " << mPendingObjectCost.size() << LL_ENDL; +        LL_DEBUGS() << "No outstanding object IDs to request. Pending count: " << mPendingObjectCost.size() << LL_ENDL;          return;      } @@ -1205,7 +1205,7 @@ void LLViewerObjectList::fetchPhisicsFlagsCoro(std::string url)      if (idList.size() < 1)      { -        LL_INFOS() << "No outstanding object physics flags to request." << LL_ENDL; +        LL_DEBUGS() << "No outstanding object physics flags to request." << LL_ENDL;          return;      } diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index e40f109e55..b669ec2c31 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -2153,7 +2153,7 @@ bool LLViewerFetchedTexture::updateFetch()          }          const U32 override_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); -        if (override_tex_discard_level != 0) +        if (override_tex_discard_level != 0 && override_tex_discard_level <= MAX_DISCARD_LEVEL)          {              desired_discard = override_tex_discard_level;          } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 9942ea3de8..bcd6ba4ec2 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1466,18 +1466,43 @@ void LLViewerWindow::handleMouseLeave(LLWindow *window)      LLToolTipMgr::instance().blockToolTips();  } -bool LLViewerWindow::handleCloseRequest(LLWindow *window) +bool LLViewerWindow::handleCloseRequest(LLWindow *window, bool from_user)  {      if (!LLApp::isExiting() && !LLApp::isStopped())      { -        // User has indicated they want to close, but we may need to ask -        // about modified documents. -        LLAppViewer::instance()->userQuit(); -        // Don't quit immediately +        if (from_user) +        { +            // User has indicated they want to close, but we may need to ask +            // about modified documents. +            LLAppViewer::instance()->userQuit(); +            // Don't quit immediately +        } +        else +        { +            // OS is asking us to quit, assume we have time and start cleanup +            LLAppViewer::instance()->requestQuit(); +        }      }      return false;  } +bool LLViewerWindow::handleSessionExit(LLWindow* window) +{ +    if (!LLApp::isExiting() && !LLApp::isStopped()) +    { +        // Viewer received WM_ENDSESSION and app will be killed soon if it doesn't respond +        LLAppViewer* app = LLAppViewer::instance(); +        app->sendSimpleLogoutRequest(); +        app->earlyExitNoNotify(); + +        // Not viewer's fault, remove marker files so +        // that statistics won't consider this to be a crash +        app->removeMarkerFiles(); +        return false; +    } +    return true; +} +  void LLViewerWindow::handleQuit(LLWindow *window)  {      if (gNonInteractive) @@ -1897,7 +1922,7 @@ LLViewerWindow::LLViewerWindow(const Params& p)          p.ignore_pixel_depth,          0,          max_core_count, -        max_gl_version); //don't use window level anti-aliasing +        max_gl_version); //don't use window level anti-aliasing, windows only      if (NULL == mWindow)      { @@ -3317,7 +3342,31 @@ void LLViewerWindow::clearPopups()  void LLViewerWindow::moveCursorToCenter()  { -    if (! gSavedSettings.getBOOL("DisableMouseWarp")) +    bool mouse_warp = false; +    LLCachedControl<S32> mouse_warp_mode(gSavedSettings, "MouseWarpMode", 1); + +    switch (mouse_warp_mode()) +    { +    case 0: +        // For Windows: +        // Mouse usually uses 'delta' position since it isn't aware of own location, keep it centered. +        // Touch screen reports absolute or virtual absolute position and warping a physical +        // touch is pointless, so don't move it. +        // +        // MacOS +        // If 'decoupled', CGAssociateMouseAndMouseCursorPosition can make mouse stay in +        // one place and not move, do not move it (needs testing). +        mouse_warp = mWindow->isWrapMouse(); +        break; +    case 1: +        mouse_warp = true; +        break; +    default: +        mouse_warp = false; +        break; +    } + +    if (mouse_warp)      {          S32 x = getWorldViewWidthScaled() / 2;          S32 y = getWorldViewHeightScaled() / 2; diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index d55c2d3817..61aa84394c 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -197,7 +197,8 @@ public:      /*virtual*/ bool handleUnicodeChar(llwchar uni_char, MASK mask);    // NOT going to handle extended      /*virtual*/ bool handleMouseDown(LLWindow *window,  LLCoordGL pos, MASK mask);      /*virtual*/ bool handleMouseUp(LLWindow *window,  LLCoordGL pos, MASK mask); -    /*virtual*/ bool handleCloseRequest(LLWindow *window); +    /*virtual*/ bool handleCloseRequest(LLWindow *window, bool from_user); +    /*virtual*/ bool handleSessionExit(LLWindow* window);      /*virtual*/ void handleQuit(LLWindow *window);      /*virtual*/ bool handleRightMouseDown(LLWindow *window,  LLCoordGL pos, MASK mask);      /*virtual*/ bool handleRightMouseUp(LLWindow *window,  LLCoordGL pos, MASK mask); diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index 52a6afc2d0..5d456b1a19 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -498,7 +498,7 @@ void LLVOCacheEntry::updateDebugSettings()      sNearRadius = MIN_RADIUS + ((clamped_min_radius - MIN_RADIUS) * adjust_factor);      // a percentage of draw distance beyond which all objects outside of view frustum will be unloaded, regardless of pixel threshold -    static LLCachedControl<F32> rear_max_radius_frac(gSavedSettings,"SceneLoadRearMaxRadiusFraction"); +    static LLCachedControl<F32> rear_max_radius_frac(gSavedSettings,"SceneLoadRearMaxRadiusFraction", .75f);      const F32 min_radius_plus_one = sNearRadius + 1.f;      const F32 max_radius = rear_max_radius_frac * draw_radius;      const F32 clamped_max_radius = llclamp(max_radius, min_radius_plus_one, draw_radius); // [sNearRadius, mDrawDistance] diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 14f0b52174..40de236c90 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -1023,7 +1023,6 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()              std::string old_log = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SLVoice.old");              if (gDirUtilp->fileExists(new_log))              { -                LLFile::remove(old_log, ENOENT);                  LLFile::rename(new_log, old_log);              } diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index e1667c505e..447f1b652a 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -296,10 +296,10 @@ void LLWebRTCVoiceClient::terminate()      LL_INFOS("Voice") << "Terminating WebRTC" << LL_ENDL;      mVoiceEnabled = false; +    sShuttingDown = true; // so that coroutines won't post more work.      llwebrtc::terminate(); -    mWebRTCDeviceInterface = nullptr; -    sShuttingDown = true; +    mWebRTCDeviceInterface = nullptr;  }  //--------------------------------------------------- @@ -396,7 +396,7 @@ void LLWebRTCVoiceClient::updateSettings()              config.mNoiseSuppressionLevel = noiseSuppressionLevel;              audioConfigChanged            = true;          } -        if (audioConfigChanged) +        if (audioConfigChanged && mWebRTCDeviceInterface)          {              mWebRTCDeviceInterface->setAudioConfig(config);          } @@ -797,7 +797,10 @@ void LLWebRTCVoiceClient::tuningStart()  {      if (!mIsInTuningMode)      { -        mWebRTCDeviceInterface->setTuningMode(true); +        if (mWebRTCDeviceInterface) +        { +            mWebRTCDeviceInterface->setTuningMode(true); +        }          mIsInTuningMode = true;      }  } @@ -806,7 +809,10 @@ void LLWebRTCVoiceClient::tuningStop()  {      if (mIsInTuningMode)      { -        mWebRTCDeviceInterface->setTuningMode(false); +        if (mWebRTCDeviceInterface) +        { +            mWebRTCDeviceInterface->setTuningMode(false); +        }          mIsInTuningMode = false;      }  } @@ -839,6 +845,10 @@ void LLWebRTCVoiceClient::tuningSetSpeakerVolume(float volume)  float LLWebRTCVoiceClient::tuningGetEnergy(void)  { +    if (!mWebRTCDeviceInterface) +    { +        return 0.f; +    }      float rms = mWebRTCDeviceInterface->getTuningAudioLevel();      return TUNING_LEVEL_START_POINT - TUNING_LEVEL_SCALE * rms;  } @@ -866,7 +876,10 @@ void LLWebRTCVoiceClient::refreshDeviceLists(bool clearCurrentList)          clearCaptureDevices();          clearRenderDevices();      } -    mWebRTCDeviceInterface->refreshDevices(); +    if (mWebRTCDeviceInterface) +    { +        mWebRTCDeviceInterface->refreshDevices(); +    }  } @@ -1174,7 +1187,7 @@ void LLWebRTCVoiceClient::sendPositionUpdate(bool force)  void LLWebRTCVoiceClient::updateOwnVolume()  {      F32 audio_level = 0.0f; -    if (!mMuteMic) +    if (!mMuteMic && mWebRTCDeviceInterface)      {          float rms = mWebRTCDeviceInterface->getPeerConnectionAudioLevel();          audio_level = LEVEL_START_POINT - LEVEL_SCALE * rms; @@ -2674,6 +2687,11 @@ void LLVoiceWebRTCConnection::breakVoiceConnectionCoro(connectionPtr_t connectio  void LLVoiceWebRTCSpatialConnection::requestVoiceConnection()  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE; +    if (LLWebRTCVoiceClient::isShuttingDown()) +    { +        mOutstandingRequests--; +        return; +    }      LLViewerRegion *regionp = LLWorld::instance().getRegionFromID(mRegionID); @@ -3281,6 +3299,12 @@ void LLVoiceWebRTCAdHocConnection::requestVoiceConnection()  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE; +    if (LLWebRTCVoiceClient::isShuttingDown()) +    { +        mOutstandingRequests--; +        return; +    } +      LLViewerRegion *regionp = LLWorld::instance().getRegionFromID(mRegionID);      LL_DEBUGS("Voice") << "Requesting voice connection." << LL_ENDL; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index acdb1a3edb..4f828cc0ff 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -5025,7 +5025,7 @@ void LLRiggedVolume::update(      else      {          face_begin = face_index; -        face_end = face_begin + 1; +        face_end = llmin(face_begin + 1, volume->getNumVolumeFaces());      }      for (S32 i = face_begin; i < face_end; ++i)      { @@ -6764,7 +6764,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace                  && te->getShiny()                  && can_be_shiny)              { //shiny -                if (tex->getPrimaryFormat() == GL_ALPHA) +                if (tex && tex->getPrimaryFormat() == GL_ALPHA)                  { //invisiprim+shiny                      if (!facep->getViewerObject()->isAttachment() && !facep->getViewerObject()->isRiggedMesh())                      { @@ -6804,7 +6804,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace              }              else              { //not alpha and not shiny -                if (!is_alpha && tex->getPrimaryFormat() == GL_ALPHA) +                if (!is_alpha && tex && tex->getPrimaryFormat() == GL_ALPHA)                  { //invisiprim                      if (!facep->getViewerObject()->isAttachment() && !facep->getViewerObject()->isRiggedMesh())                      { diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index 7962c28e6d..153bee3aef 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -32,6 +32,7 @@  #include "message.h"  #include "lltracker.h"  #include "lluistring.h" +#include "llviewercontrol.h"  #include "llviewertexturelist.h"  #include "lltrans.h"  #include "llgltexture.h" @@ -492,9 +493,20 @@ bool LLWorldMap::insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID&          case MAP_ITEM_MATURE_EVENT:          case MAP_ITEM_ADULT_EVENT:          { -            std::string timeStr = "["+ LLTrans::getString ("TimeHour")+"]:[" -                                       +LLTrans::getString ("TimeMin")+"] [" -                                       +LLTrans::getString ("TimeAMPM")+"]"; +            std::string timeStr; + +            static bool use_24h = gSavedSettings.getBOOL("Use24HourClock"); +            if (use_24h) +            { +                timeStr = "[" + LLTrans::getString("TimeHour") + "]:[" +                    + LLTrans::getString("TimeMin") + "]"; +            } +            else +            { +                timeStr = "[" + LLTrans::getString("TimeHour12") + "]:[" +                    + LLTrans::getString("TimeMin") + "] [" +                    + LLTrans::getString("TimeAMPM") + "]"; +            }              LLSD substitution;              substitution["datetime"] = (S32) extra;              LLStringUtil::format (timeStr, substitution); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index dde8b8ed2a..1415e40ed8 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -4509,7 +4509,7 @@ void LLPipeline::renderPhysicsDisplay()      gGL.flush();      gDebugProgram.bind(); -    LLGLEnable(GL_POLYGON_OFFSET_LINE); +    LLGLEnable polygon_offset_line(GL_POLYGON_OFFSET_LINE);      glPolygonOffset(3.f, 3.f);      //glLineWidth(3.f);      LLGLEnable blend(GL_BLEND); @@ -11997,21 +11997,24 @@ public:      }  }; - +// Called from LLViewHighlightTransparent when "Highlight Transparent" is toggled  void LLPipeline::rebuildDrawInfo()  { -    for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); -        iter != LLWorld::getInstance()->getRegionList().end(); ++iter) +    const U32 types_to_traverse[] =      { -        LLViewerRegion* region = *iter; - -        LLOctreeDirty dirty; - -        LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_VOLUME); -        dirty.traverse(part->mOctree); +        LLViewerRegion::PARTITION_VOLUME, +        LLViewerRegion::PARTITION_BRIDGE, +        LLViewerRegion::PARTITION_AVATAR +    }; -        part = region->getSpatialPartition(LLViewerRegion::PARTITION_BRIDGE); -        dirty.traverse(part->mOctree); +    LLOctreeDirty dirty; +    for (LLViewerRegion* region : LLWorld::getInstance()->getRegionList()) +    { +        for (U32 type : types_to_traverse) +        { +            LLSpatialPartition* part = region->getSpatialPartition(type); +            dirty.traverse(part->mOctree); +        }      }  } diff --git a/indra/newview/skins/default/xui/da/sidepanel_item_info.xml b/indra/newview/skins/default/xui/da/sidepanel_item_info.xml index d52845160b..e5ad86b315 100644 --- a/indra/newview/skins/default/xui/da/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/da/sidepanel_item_info.xml @@ -15,6 +15,9 @@  	<panel.string name="acquiredDate">  		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]  	</panel.string> +  <panel.string name="acquiredDateAMPM"> +    [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour12,datetime,local]:[min,datetime,local]:[second,datetime,local] [ampm,datetime,local] [year,datetime,local] +  </panel.string>  	<panel.string name="origin_inventory">  		(Beholdning)  	</panel.string> diff --git a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml index 168bb14248..3570ccacd2 100644 --- a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml @@ -21,6 +21,9 @@  	<panel.string name="acquiredDate">  		[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]  	</panel.string> +  <panel.string name="acquiredDateAMPM"> +    [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour12,datetime,local]:[min,datetime,local]:[second,datetime,local] [ampm,datetime,local] [year,datetime,local] +  </panel.string>  	<panel.string name="origin_inventory">  		(Inventar)  	</panel.string> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index 7284e4e6a8..a17eb22d89 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -5074,10 +5074,10 @@ Bitte überprüfen Sie http://status.secondlifegrid.net, um herauszufinden, ob e  		[MDAY]  	</string>  	<string name="dateTimeAM"> -		Uhr +		AM  	</string>  	<string name="dateTimePM"> -		Uhr +		PM  	</string>  	<string name="LocalEstimateUSD">  		[AMOUNT] US$ diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index 2726ad8fe7..3311e0fc0f 100644 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -232,6 +232,8 @@ SDL Copyright (C) 1997-2024 Sam Lantinga  SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) +V-HACD Copyright (c) 2011, Khaled Mamou (kmamou at gmail dot com) +  xxHash Copyright (C) 2012-2020 Yann Collet.  zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler. diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 508aba6ae1..c5b42b6dae 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -125,6 +125,9 @@               name="no_selection_text">                  No parcel selected.              </panel.string> +            <panel.string name="time_stamp_template_ampm"> +              [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour12,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [ampm,datetime,slt] [year,datetime,slt] +            </panel.string>              <panel.string name="time_stamp_template">                [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt]              </panel.string> diff --git a/indra/newview/skins/default/xui/en/floater_inspect.xml b/indra/newview/skins/default/xui/en/floater_inspect.xml index 9403d58441..a083683c23 100644 --- a/indra/newview/skins/default/xui/en/floater_inspect.xml +++ b/indra/newview/skins/default/xui/en/floater_inspect.xml @@ -12,6 +12,10 @@   title="INSPECT OBJECTS"   width="400">      <floater.string +     name="timeStampAMPM"> +      [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour12,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [ampm,datetime,slt] [year,datetime,slt] +    </floater.string> +    <floater.string       name="timeStamp">          [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt]      </floater.string> diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index f11d687840..39e9de0980 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -40,7 +40,7 @@    <string name="simplifying">Simplifying...</string>    <string name="tbd">TBD</string>    <string name="ModelTextureScaling">One or more textures in this model were scaled to be within the allowed limits.</string> -   +    <!-- Warnings and info from model loader-->    <string name="TooManyJoint">Skinning disabled due to too many joints: [JOINTS], maximum: [MAX]</string>    <string name="UnrecognizedJoint">Rigged to unrecognized joint name [NAME]</string> @@ -807,7 +807,7 @@            help_topic="upload_model_physics"            label="Physics"            name="physics_panel"> -             +              <!-- ==== STEP 1: Level of Detail ==== -->              <view_border                bevel_style="none" @@ -873,7 +873,7 @@                      <!-- <check_box name="physics_optimize" follows="left|top" width="130" left="10" top_pad="5" height="20" label="Optimize"/>                      <check_box name="physics_use_hull" follows="left|top" width="130" left_pad="5" height="20" label="Use Convex Hull"/> -->                  </panel> -             +              <!-- ==== STEP 2: Analyze ==== -->              <view_border                bevel_style="none" @@ -890,9 +890,9 @@                    height="65"                    follows="top|left"                    left="18" -                  name="physics analysis" +                  name="physics analysis havok"                    top_pad="10" -                  visible="true" +                  visible="false"                    width="589">                      <text                        follows="left|top" @@ -980,7 +980,131 @@                        visible="false"                        width="90"/>                  </panel> -             +                <panel +                  bg_alpha_color="0 0 0 0" +                  bg_opaque_color="0 0 0 0.3" +                  height="65" +                  follows="top|left" +                  left="18" +                  name="physics analysis vhacd" +                  top_delta="0" +                  visible="false" +                  width="589"> +                    <text +                      follows="left|top" +                      font="SansSerif" +                      height="20" +                      layout="topleft" +                      left="0" +                      name="method_label" +                      text_color="White" +                      top_pad="0"> +                      Step 2: Convert to hulls (optional) +                    </text> +                    <text +                      follows="top|left" +                      height="15" +                      layout="topleft" +                      name="analysis_method_label" +                      top_pad="10" +                      width="100"> +                      Fill Mode: +                    </text> +                    <text +                      follows="top|left" +                      height="15" +                      name="quality_label" +                      layout="topleft" +                      left_pad="5" +                      width="85"> +                      Resolution: +                    </text> +                    <text +                      follows="top|left" +                      height="15" +                      name="quality_label" +                      layout="topleft" +                      left_pad="25" +                      width="95"> +                      Hulls per Mesh: +                    </text> +                    <text +                      follows="top|left" +                      height="15" +                      name="smooth_method_label" +                      layout="topleft" +                      left_pad="5" +                      width="95"> +                      Vertices per hull: +                    </text> +                    <text +                      follows="top|left" +                      height="15" +                      name="tolerance_label" +                      layout="topleft" +                      left_pad="5" +                      width="100"> +                      Error tolerance: +                    </text> +                    <combo_box +                      follows="top|left" +                      layout="topleft" +                      left="0" +                      name="Fill Mode" +                      top_pad="0" +                      height="20" +                      width="100"/> +                    <combo_box +                      follows="top|left" +                      layout="topleft" +                      left_pad="5" +                      name="Voxel Resolution" +                      height="20" +                      width="100"/> +                    <spinner +                      follows="top|left" +                      name="Num Hulls" +                      height="20" +                      left_pad="10" +                      width="60" +                      decimal_digits="0" +                      allow_digits_only="true"/> +                    <spinner +                      follows="top|left" +                      name="Num Vertices" +                      height="20" +                      left_pad="40" +                      width="60" +                      decimal_digits="0" +                      allow_digits_only="true"/> +                    <spinner +                      follows="top|left" +                      name="Error Tolerance" +                      height="20" +                      left_pad="40" +                      width="60" +                      decimal_digits="4" +                      allow_digits_only="true"/> +                    <button +                      bottom="1" +                      follows="top|right" +                      height="20" +                      label="Analyze" +                      layout="bottomleft" +                      name="Analyze" +                      right="-1" +                      width="90"/> +                    <button +                      follows="top|left" +                      height="20" +                      label="Cancel" +                      layout="topleft" +                      left_delta="0" +                      name="analyze_cancel" +                      visible="false" +                      width="90"/> +                </panel> +              <!-- ==== STEP 3: Simplify ==== -->              <view_border                bevel_style="none" @@ -999,7 +1123,8 @@                    left="18"                    name="physics simplification"                    top_pad="10" -                  width="589"> +                  width="589" +                  visible="false">                      <text                        text_color="White"                        follows="left|top" @@ -1088,7 +1213,7 @@                        name="simplify_cancel"                        width="90"/>                  </panel> -             +              <!-- ==== Results ==== -->              <view_border                bevel_style="none" @@ -1186,7 +1311,7 @@         name="modifiers_panel"         help_topic="upload_model_modifiers">           <view_border -          bevel_style="none"   +          bevel_style="none"            follows="top|left"            height="306"            layout="topleft" @@ -1593,7 +1718,7 @@ Model:  [MODEL]          </text>        </panel> -       <!--  +       <!--         Streaming breakdown numbers are available but not fully understood         uncommenting the following sections will display the numbers for debugging purposes         <text @@ -1695,7 +1820,7 @@ Analysed:           width="462"           visible="true">           You don't have rights to upload mesh models. [[VURL] Find out how] to get certified. -       </text>  +       </text>         <text           text_color="Yellow"           layout="topleft" @@ -1706,7 +1831,7 @@ Analysed:         </text>      </panel>    </panel> -   +    <text     follows="left|top"     layout="topleft" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index be40ca2f1f..5b9144e535 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -1670,7 +1670,7 @@ The new skin will appear after you restart [APP_NAME].     icon="alertmodal.tga"     name="ChangeLanguage"     type="alertmodal"> -Changing language will take effect after you restart [APP_NAME]. +Changing language or time format will take effect after you restart [APP_NAME].    </notification>    <notification @@ -2244,7 +2244,7 @@ Couldn't open uploaded sound file for reading:  Model upload is not yet available on Apple Silicon, but will be supported in an upcoming release.  Workaround: Right-click the Second Life app in Finder, select -"Get Info", then check "Open using Rosetta" +'Get Info', then check 'Open using Rosetta'    <tag>fail</tag>    </notification> @@ -6595,6 +6595,22 @@ Do you want to replace it with the selected object?    </notification>    <notification +   icon="alertmodal.tga" +   name="CantLinkNotecard" +   type="alertmodal"> +    You must save the notecard before creating a link to it. +    <tag>fail</tag> +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantLinkMaterial" +   type="alertmodal"> +    You must save the material before creating a link to it. +    <tag>fail</tag> +  </notification> + +  <notification     icon="alert.tga"     label="Do Not Disturb Mode Warning"     name="DoNotDisturbModePay" diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index 02e135a2c7..868d54401e 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel - height="750" + height="770"   label="Members & Roles"   layout="topleft"   left="0" @@ -18,9 +18,9 @@      <panel.string       name="help_text" />      <tab_container -    border="false" +     border="false"       follows="left|top|right" -     height="552" +     height="770"       halign="center"       layout="topleft"       left="0" @@ -29,16 +29,10 @@       tab_position="top"       tab_height="22"       tab_min_width="90" -     top="0" -     width="304"> +     top="0">          <panel           border="false" -         follows="all" -         height="303"           label="MEMBERS" -         layout="topleft" -         left="0" -         right="-1"           help_topic="roles_members_tab"           name="members_sub_tab"           tool_tip="Members" @@ -65,16 +59,16 @@ clicking on their names.               name="power_partial_icon" translate="false">                  Checkbox_Off              </panel.string> -         <filter_editor -         layout="topleft" -         top="5" -         left="5" -         right="-5" -         height="22" -         search_button_visible="false" -         follows="left|top|right" -         label="Filter Members" -         name="filter_input" /> +            <filter_editor +             layout="topleft" +             top="5" +             left="5" +             right="-5" +             height="22" +             search_button_visible="false" +             follows="left|top|right" +             label="Filter Members" +             name="filter_input" />              <name_list               column_padding="2"               draw_heading="true" @@ -90,11 +84,11 @@ clicking on their names.                  <name_list.columns                   label="Member"                   name="name" -               relative_width="0.44" /> +                 relative_width="0.44" />                  <name_list.columns                   label="Donation"                   name="donated" -         		 relative_width="0.2" /> +                 relative_width="0.2" />                  <name_list.columns                   label="Status"                   name="online" @@ -118,25 +112,21 @@ clicking on their names.               left_pad="10"               name="member_eject"               width="100" /> -      <button -       height="23" -       label="Ban Member(s)" -       follows="top|left" -       left_pad="10" -       name="member_ban" -       width="100" /> +            <button +             height="23" +             label="Ban Member(s)" +             follows="top|left" +             left_pad="10" +             name="member_ban" +             width="100" />          </panel>          <panel           border="false" -         height="303"           label="ROLES" -         layout="topleft" -         left="0" -         right="-1"           help_topic="roles_roles_tab"           name="roles_sub_tab"           class="panel_group_roles_subtab"> -           <!-- <button +            <!--<button               enabled="false"               height="20"               label="Show All" @@ -145,411 +135,393 @@ clicking on their names.               right="-5"               name="show_all_button"               width="100" />--> -      <panel.string -       name="help_text"> -        Roles have a title and an allowed list of Abilities -        that Members can perform. Members can belong to -        one or more Roles. A group can have up to 10 Roles, -        including the Everyone and Owner Roles. -      </panel.string> -      <panel.string -       name="cant_delete_role"> -        The 'Everyone' and 'Owners' Roles are special and can't be deleted. -      </panel.string> -      <panel.string -       name="power_folder_icon" translate="false"> -        Inv_FolderClosed -      </panel.string> -      <panel.string -       name="power_all_have_icon" translate="false"> -        Checkbox_On -      </panel.string> -      <panel.string -       name="power_partial_icon" translate="false"> -        Checkbox_Off -      </panel.string> -      <filter_editor -      layout="topleft" -      top="5" -      left="5" -      right="-5" -      height="22" -      search_button_visible="false" -      follows="left|top|right" -      label="Filter Roles" -      name="filter_input" /> -      <scroll_list -       column_padding="0" -       draw_heading="true" -       draw_stripes="false" -       heading_height="23" -       height="132" -       layout="topleft" -       search_column="1" -       left="0" -       follows="left|top|right" -       right="-1" -       name="role_list" -       top_pad="2" -       width="310"> -        <scroll_list.columns -         label="Role" -         name="name" -       relative_width="0.45"  /> -        <scroll_list.columns -         label="Title" -         name="title" -       relative_width="0.45"  /> -        <scroll_list.columns -         label="#" -         name="members" -       relative_width="0.15"  /> -      </scroll_list> -      <button -      follows="top|left" -       height="23" -       label="New Role" -       layout="topleft" -       left="0" -       name="role_create" -       width="100" /> -      <button -       follows="top|left" -       height="23" -       label="Copy Role" -       layout="topleft" -       left_pad="10" -       name="role_copy" -       width="100" /> -      <button -       height="23" -       follows="top|left" -       label="Delete Role" -       layout="topleft" -       left_pad="10" -       name="role_delete" -       width="100" /> -    </panel> +            <panel.string +             name="help_text"> +                Roles have a title and an allowed list of Abilities +that Members can perform. Members can belong to +one or more Roles. A group can have up to 10 Roles, +including the Everyone and Owner Roles. +            </panel.string> +            <panel.string +             name="cant_delete_role"> +                The 'Everyone' and 'Owners' Roles are special and can't be deleted. +            </panel.string> +            <panel.string +             name="power_folder_icon" translate="false"> +                Inv_FolderClosed +            </panel.string> +            <panel.string +             name="power_all_have_icon" translate="false"> +                Checkbox_On +            </panel.string> +            <panel.string +             name="power_partial_icon" translate="false"> +                Checkbox_Off +            </panel.string> +            <filter_editor +             layout="topleft" +             top="5" +             left="5" +             right="-5" +             height="22" +             search_button_visible="false" +             follows="left|top|right" +             label="Filter Roles" +             name="filter_input" /> +            <scroll_list +             column_padding="0" +             draw_heading="true" +             draw_stripes="false" +             heading_height="23" +             height="138" +             layout="topleft" +             search_column="1" +             left="0" +             follows="left|top|right" +             right="-1" +             name="role_list" +             top_pad="2"> +                <scroll_list.columns +                 label="Role" +                 name="name" +                 relative_width="0.45" /> +                <scroll_list.columns +                 label="Title" +                 name="title" +                 relative_width="0.45" /> +                <scroll_list.columns +                 label="#" +                 name="members" +                 relative_width="0.15" /> +            </scroll_list> +            <button +             follows="top|left" +             height="23" +             label="New Role" +             layout="topleft" +             left="0" +             name="role_create" +             width="100" /> +            <button +             follows="top|left" +             height="23" +             label="Copy Role" +             layout="topleft" +             left_pad="10" +             name="role_copy" +             width="100" /> +            <button +             height="23" +             follows="top|left" +             label="Delete Role" +             layout="topleft" +             left_pad="10" +             name="role_delete" +             width="100" /> +        </panel> +        <panel +         border="false" +         label="ABILITIES" +         help_topic="roles_actions_tab" +         name="actions_sub_tab" +         class="panel_group_actions_subtab" +         tool_tip="You can view an Ability's Description and which Roles and Members can execute the Ability."> +            <panel.string +             name="help_text"> +                Abilities allow Members in Roles to do specific +things in this group. There's a broad variety of Abilities. +            </panel.string> +            <panel.string +             name="power_folder_icon" translate="false"> +                Inv_FolderClosed +            </panel.string> +            <panel.string +             name="power_all_have_icon" translate="false"> +                Checkbox_On +            </panel.string> +            <panel.string +             name="power_partial_icon" translate="false"> +                Checkbox_Off +            </panel.string> +            <filter_editor +             layout="topleft" +             top="5" +             left="5" +             right="-5" +             height="22" +             search_button_visible="false" +             follows="left|top|right" +             label="Filter Abilities" +             name="filter_input" /> +            <scroll_list +             column_padding="0" +             draw_stripes="true" +             height="200" +             follows="left|top|right" +             layout="topleft" +             left="0" +             right="-1" +             name="action_list" +             search_column="2" +             tool_tip="Select an Ability to view more details" +             top_pad="5"> +                <scroll_list.columns +                 label="" +                 name="icon" +                 width="2" /> +                <scroll_list.columns +                 label="" +                 name="checkbox" +                 width="20" /> +                <scroll_list.columns +                 label="" +                 name="action" /> +            </scroll_list> +        </panel> +        <panel +         border="false" +         label="BANNED RESIDENTS" +         help_topic="roles_banlist_tab" +         name="banlist_sub_tab" +         class="panel_group_banlist_subtab" +         tool_tip="View the banned residents from this group."> +            <panel.string +             name="help_text"> +                Any resident on the ban list will be unable to join the group. +            </panel.string> +            <panel.string +             name="ban_count_template"> +                Ban count: [COUNT]/[LIMIT] +            </panel.string> +            <name_list +             column_padding="0" +             draw_heading="true" +             height="714" +             follows="left|top|right" +             layout="topleft" +             left="0" +             right="-1" +             multi_select="true" +             name="ban_list" +             short_names="false" +             top_pad="5"> +                <name_list.columns +                 label="Resident" +                 name="name" +                 font.name="SANSSERIF_SMALL" +                 font.style="NORMAL" +                 relative_width="0.7" /> +                <name_list.columns +                 label="Date Banned" +                 name="ban_date" +                 relative_width="0.3" /> +            </name_list> +            <button +             follows="top|left" +             height="23" +             label="Ban Resident(s)" +             layout="topleft" +             left="3" +             name="ban_create" +             tool_tip="Ban residents from your group" +             width="120" /> +            <button +             follows="top|left" +             height="23" +             label="Remove Ban(s)" +             layout="topleft" +             left_pad="5" +             name="ban_delete" +             tool_tip="Unban selected residents from your group" +             width="120" /> +            <button +             follows="top|left" +             height="23" +             width="23" +             image_overlay="Refresh_Off" +             layout="topleft" +             left_pad="5" +             name="ban_refresh" +             tool_tip="Refresh the ban list" /> +            <text +             type="string" +             height="18" +             left_pad="5" +             follows="top|left" +             layout="topleft" +             name="ban_count" +             width="100"> +            </text> +        </panel> +    </tab_container>      <panel -     border="false" -     height="303" -     label="ABILITIES" +     height="350" +     background_visible="false" +     bg_alpha_color="FloaterUnfocusBorderColor"       layout="topleft" +     follows="top|left|right"       left="0"       right="-1" -     help_topic="roles_actions_tab" -     name="actions_sub_tab" -     class="panel_group_actions_subtab" -     tool_tip="You can view an Ability's Description and which Roles and Members can execute the Ability." -     width="310"> -      <panel.string -       name="help_text"> -        Abilities allow Members in Roles to do specific -        things in this group. There's a broad variety of Abilities. -      </panel.string> -      <panel.string -       name="power_folder_icon" translate="false"> -        Inv_FolderClosed -      </panel.string> -      <panel.string -       name="power_all_have_icon" translate="false"> -        Checkbox_On -      </panel.string> -      <panel.string -       name="power_partial_icon" translate="false"> -        Checkbox_Off -      </panel.string> -      <filter_editor -      layout="topleft" -      top="5" -      left="5" -      right="-5" -      height="22" -      search_button_visible="false" -      follows="left|top|right" -      label="Filter Abilities" -      name="filter_input" /> -      <scroll_list -       column_padding="0" -       draw_stripes="true" -       height="200" -       follows="left|top|right" -       layout="topleft" -       left="0" -       right="-1" -       name="action_list" -       search_column="2" -       tool_tip="Select an Ability to view more details" -       top_pad="5" -       width="300"> -        <scroll_list.columns -         label="" -         name="icon" -         width="2" /> -        <scroll_list.columns -         label="" -         name="checkbox" -         width="20" /> -        <scroll_list.columns -         label="" -         name="action" /> -      </scroll_list> +     mouse_opaque="false" +     name="members_footer" +     top="325" +     visible="false"> +        <text +         type="string" +         height="16" +         layout="topleft" +         follows="left|top" +         left="5" +         top="8" +         text_color="EmphasisColor" +         name="static" +         width="300"> +            Assigned Roles +        </text> +        <scroll_list +         draw_stripes="true" +         follows="left|top|right" +         height="150" +         layout="topleft" +         left="0" +         right="-1" +         name="member_assigned_roles" +         top_pad="0"> +            <scroll_list.columns +             label="" +             name="checkbox" +             width="20" /> +            <scroll_list.columns +             label="" +             name="role" +             width="270" /> +        </scroll_list> +        <text +         type="string" +         height="16" +         layout="topleft" +         follows="left|top" +         left="5" +         top_pad="5" +         text_color="EmphasisColor" +         name="static2" +         width="285"> +            Allowed Abilities +        </text> +        <scroll_list +         draw_stripes="true" +         follows="left|top|right" +         height="150" +         layout="topleft" +         left="0" +         right="-1" +         name="member_allowed_actions" +         search_column="2" +         tool_tip="For details of each allowed ability see the abilities tab" +         top_pad="0"> +            <scroll_list.columns +             label="" +             name="icon" +             width="2" /> +            <scroll_list.columns +             label="" +             name="checkbox" +             width="20" /> +            <scroll_list.columns +             label="" +             name="action" +             width="270" /> +        </scroll_list>      </panel>      <panel -     border="false" -     height="303" -     label="BANNED RESIDENTS" +     height="90" +     background_visible="false" +     bg_alpha_color="FloaterUnfocusBorderColor"       layout="topleft" +     follows="top|left|right"       left="0"       right="-1" -     help_topic="roles_banlist_tab" -     name="banlist_sub_tab" -     class="panel_group_banlist_subtab" -     tool_tip="View the banned residents from this group." -     width="310"> -      <panel.string -       name="help_text"> -        Any resident on the ban list will be unable to join the group. -      </panel.string> -      <panel.string -       name="ban_count_template"> -        Ban count: [COUNT]/[LIMIT] -      </panel.string> -      <name_list -           column_padding="0" -           draw_heading="true" -           height="400" -           follows="left|top|right" -           layout="topleft" -           left="0" -           right="-1" -           multi_select="true" -           name="ban_list" -           short_names="false" -           top_pad="5"> -        <name_list.columns -         label="Resident" -         name="name" -         font.name="SANSSERIF_SMALL" -         font.style="NORMAL" -         relative_width="0.7" /> -        <name_list.columns -         label="Date Banned" -         name="ban_date" -         relative_width="0.3" /> -      </name_list> -      <button -        follows="top|left" -        height="23" -        label="Ban Resident(s)" -        layout="topleft" -        left="3" -        name="ban_create" -        tool_tip="Ban residents from your group" -        width="120" /> -      <button -        follows="top|left" -        height="23" -        label="Remove Ban(s)" -        layout="topleft" -        left_pad="5" -        name="ban_delete" -        tool_tip="Unban selected residents from your group" -        width="120" /> -      <button -        follows="top|left" -        height="23" -        width="23" -        image_overlay="Refresh_Off" -        layout="topleft" -        left_pad="5" -        name="ban_refresh" -        tool_tip="Refresh the ban list" -        /> -      <text -        type="string" -        height="18" -        left_pad="5" -        follows="top|left" -        layout="topleft" -        name="ban_count" -        width="100"> -      </text> +     mouse_opaque="false" +     name="members_header" +     top_pad="3" +     visible="false"> +        <text_editor +         bg_readonly_color="Transparent" +         text_readonly_color="EmphasisColor" +         font="SansSerifSmall" +         type="string" +         enabled="false" +         halign="left" +         layout="topleft" +         top_pad="0" +         follows="left|top|right" +         left="0" +         right="-1" +         height="90" +         max_length="512" +         name="member_action_description" +         word_wrap="true"> +            This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner. +        </text_editor>      </panel> -  </tab_container> -  <panel -   height="350" -   background_visible="false" -   bg_alpha_color="FloaterUnfocusBorderColor" -   layout="topleft" -   follows="top|left|right" -   left="0" -   right="-1" -   width="313" -   mouse_opaque="false" -   name="members_footer" -   top="325" -   visible="false"> -    <text -     type="string" -     height="16" -     layout="topleft" -     follows="left|top" -     left="5" -     top="8" -     text_color="EmphasisColor" -     name="static" -     width="300"> -      Assigned Roles -    </text> -    <scroll_list -     draw_stripes="true" -    follows="left|top|right" -     height="150" +    <panel +     height="460" +     background_visible="false" +     bg_alpha_color="FloaterUnfocusBorderColor"       layout="topleft" +     follows="top|left|right"       left="0"       right="-1" -     name="member_assigned_roles" -     top_pad="0"> -      <scroll_list.columns -       label="" -       name="checkbox" -       width="20" /> -      <scroll_list.columns -       label="" -       name="role" -       width="270" /> -    </scroll_list> -    <text -   type="string" -   height="16" -   layout="topleft" -   follows="left|top" -   left="5" -   top_pad="5" -   text_color="EmphasisColor" -   name="static2" -   width="285"> -      Allowed Abilities -    </text> -    <scroll_list -     draw_stripes="true" +     mouse_opaque="false" +     name="roles_footer" +     top_delta="0" +     top="215" +     visible="false"> +        <text +         type="string" +         height="16" +         layout="topleft" +         follows="left|top" +         left="5" +         top="5" +         name="static" +         width="300"> +            Role Name +        </text> +        <line_editor +         type="string" +         height="20" +         layout="topleft" +         left="0"           follows="left|top|right" -     height="150" -     layout="topleft" -     left="0" -     right="-1" -     name="member_allowed_actions" -     search_column="2" -     tool_tip="For details of each allowed ability see the abilities tab" -     top_pad="0"> -      <scroll_list.columns -       label="" -       name="icon" -       width="2" /> -      <scroll_list.columns -       label="" -       name="checkbox" -       width="20" /> -      <scroll_list.columns -       label="" -       name="action" -       width="270" /> -    </scroll_list> -  </panel> -  <panel -   height="90" -   background_visible="false" -   bg_alpha_color="FloaterUnfocusBorderColor" -   layout="topleft" -   follows="top|left|right" -   left="0" -   right="-1" -   width="313" -   mouse_opaque="false" -   name="members_header" -   top_pad="3" -   visible="false"> -    <text_editor -     bg_readonly_color="Transparent" -     text_readonly_color="EmphasisColor" -     font="SansSerifSmall" -     type="string" -     enabled="false" -     halign="left" -     layout="topleft" -     top_pad="0" -     follows="left|top|right" -     left="0" -     right="-1" -     height="90" -     max_length="512" -     name="member_action_description" -     word_wrap="true"> -      This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner. -   </text_editor> -  </panel> -  <panel -   height="460" -   background_visible="false" -   bg_alpha_color="FloaterUnfocusBorderColor" -   layout="topleft" -   follows="top|left|right" -   left="0" -   right="-1" -   width="313" -   mouse_opaque="false" -   name="roles_footer" -   top_delta="0" -   top="209" -   visible="false"> -    <text -     type="string" -     height="16" -     layout="topleft" -     follows="left|top" -     left="5" -     top="5" -     name="static" -     width="300"> -      Role Name -    </text> -    <line_editor -     type="string" -     height="20" -     layout="topleft" -     left="0" -     follows="left|top|right" -     right="-1" -     max_length_bytes="20" -     name="role_name" -     top_pad="0" -     width="300"> -    </line_editor> -    <text -     type="string" -     height="16" -     layout="topleft" -     follows="left|top" -     left="5" -     name="static3" -     top_pad="5" -     width="300"> -      Role Title -    </text> -    <line_editor -     type="string" -     height="20" -     layout="topleft" -     left="0" -     follows="left|top|right" -     right="-1" -     max_length_bytes="20" -     name="role_title" -     top_pad="0" -     width="300"> -    </line_editor> -    <text +         right="-1" +         max_length_bytes="20" +         name="role_name" +         top_pad="0"> +        </line_editor> +        <text +         type="string" +         height="16" +         layout="topleft" +         follows="left|top" +         left="5" +         name="static3" +         top_pad="5" +         width="300"> +            Role Title +        </text> +        <line_editor +         type="string" +         height="20" +         layout="topleft" +         left="0" +         follows="left|top|right" +         right="-1" +         max_length_bytes="20" +         name="role_title" +         top_pad="0"> +        </line_editor> +        <text           type="string"           height="16"           layout="topleft" @@ -558,192 +530,185 @@ clicking on their names.           name="static2"           top_pad="5"           width="200"> -      Description -    </text> -    <text_editor -     type="string" -     layout="topleft" -     left="0" -     follows="left|top|right" -     right="-1" -     max_length="295" -     height="35" -     name="role_description" -     top_pad="0" -     width="300" -     word_wrap="true"> -    </text_editor> -    <text -     type="string" -     height="16" -     layout="topleft" -     follows="left|top" -     left="5" -     text_color="EmphasisColor" -     name="static4" -     top_pad="5" -     width="300"> -      Assigned Members -    </text> -    <name_list -     draw_stripes="true" -     height="128" -     layout="topleft" -     left="0" -     follows="left|top|right" -     right="-1" -     name="role_assigned_members" -     top_pad="0" -     width="300" /> -    <check_box -     height="15" -     label="Reveal members" -     left="5" -     layout="topleft" -     name="role_visible_in_list" -     tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group." -     top_pad="4" -     width="300" /> -    <text -    type="string" -    height="16" -    layout="topleft" -    follows="left|top" -    left="5" -    text_color="EmphasisColor" -    name="static5" -    top_pad="2" -    width="300"> -      Allowed Abilities -    </text> -    <scroll_list -     draw_stripes="true" -     height="140" -     layout="topleft" -     left="0" -     follows="left|top|right" -     right="-1" -     name="role_allowed_actions" -     search_column="2" -     tool_tip="For details of each allowed ability see the abilities tab" -     top_pad="0" -     width="300"> -      <scroll_list.columns -       label="" -       name="icon" -       width="2" /> -      <scroll_list.columns -       label="" -       name="checkbox" -       width="20" /> -      <scroll_list.columns -       label="" -       name="action" /> -    </scroll_list> -  </panel> -  <panel -   height="90" -   background_visible="false" -   bg_alpha_color="FloaterUnfocusBorderColor" -   layout="topleft" -   follows="top|left|right" -   left="0" -   right="-1" -   width="313" -   mouse_opaque="false" -   name="roles_header" -   top_pad="3" -   visible="false"> -    <text_editor -     bg_readonly_color="Transparent" -     text_readonly_color="EmphasisColor" -     font="SansSerifSmall" -     type="string" -     enabled="false" -     halign="left" -     layout="topleft" -     top_pad="0" -     follows="left|top|right" -     left="0" -     right="-1" +            Description +        </text> +        <text_editor +         type="string" +         layout="topleft" +         left="0" +         follows="left|top|right" +         right="-1" +         max_length="295" +         height="35" +         name="role_description" +         top_pad="0" +         word_wrap="true"> +        </text_editor> +        <text +         type="string" +         height="16" +         layout="topleft" +         follows="left|top" +         left="5" +         text_color="EmphasisColor" +         name="static4" +         top_pad="5" +         width="300"> +            Assigned Members +        </text> +        <name_list +         draw_stripes="true" +         height="128" +         layout="topleft" +         left="0" +         follows="left|top|right" +         right="-1" +         name="role_assigned_members" +         top_pad="0" /> +        <check_box +         height="15" +         label="Reveal members" +         left="5" +         layout="topleft" +         name="role_visible_in_list" +         tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group." +         top_pad="4" +         width="300" /> +        <text +         type="string" +         height="16" +         layout="topleft" +         follows="left|top" +         left="5" +         text_color="EmphasisColor" +         name="static5" +         top_pad="2" +         width="300"> +            Allowed Abilities +        </text> +        <scroll_list +         draw_stripes="true" +         height="140" +         layout="topleft" +         left="0" +         follows="left|top|right" +         right="-1" +         name="role_allowed_actions" +         search_column="2" +         tool_tip="For details of each allowed ability see the abilities tab" +         top_pad="0"> +          <scroll_list.columns +           label="" +           name="icon" +           width="2" /> +          <scroll_list.columns +           label="" +           name="checkbox" +           width="20" /> +          <scroll_list.columns +           label="" +           name="action" /> +        </scroll_list> +    </panel> +    <panel       height="90" -     max_length="512" -     name="role_action_description" -     word_wrap="true"> -      This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner. -    </text_editor> -  </panel> -  <panel -    height="424" -    background_visible="false" -    bg_alpha_color="FloaterUnfocusBorderColor" -    layout="topleft" -    follows="top|left|right" -    left="0" -    right="-1" -    width="313" -    mouse_opaque="false" -    name="actions_footer" -    top_delta="0" -    top="255" -    visible="false"> -    <text_editor -   bg_readonly_color="Transparent" -   text_readonly_color="EmphasisColor" -   font="SansSerifSmall" -     type="string" -     enabled="false" -     halign="left" +     background_visible="false" +     bg_alpha_color="FloaterUnfocusBorderColor"       layout="topleft" -     follows="left|top|right" +     follows="top|left|right"       left="0"       right="-1" -     height="90" -     max_length="512" -     name="action_description" -     top="0" -     word_wrap="true"> -      This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner. -    </text_editor> -    <text -     type="string" -     height="16" -     layout="topleft" -     follows="left|top" -     left="5" -     name="static2" -     top_pad="1" -     width="300"> -      Roles with this ability -    </text> -    <scroll_list -     height="172" -     layout="topleft" -     follows="left|top|right" -     left="5" -     right="-1" -     name="action_roles" -     top_pad="0" -     width="300" /> -    <text -     type="string" -     height="16" -     layout="topleft" -     follows="left|top" -     left="5" -     name="static3" -     top_pad="5" -     width="300"> -      Members with this ability -    </text> -    <name_list -     height="122" -     follows="left|top|right" +     mouse_opaque="false" +     name="roles_header" +     top_pad="3" +     visible="false"> +        <text_editor +         bg_readonly_color="Transparent" +         text_readonly_color="EmphasisColor" +         font="SansSerifSmall" +         type="string" +         enabled="false" +         halign="left" +         layout="topleft" +         top_pad="0" +         follows="left|top|right" +         left="0" +         right="-1" +         height="90" +         max_length="512" +         name="role_action_description" +         word_wrap="true"> +            This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner. +        </text_editor> +    </panel> +    <panel +     height="513" +     background_visible="false" +     bg_alpha_color="FloaterUnfocusBorderColor"       layout="topleft" -     left="5" +     follows="top|left|right" +     left="0"       right="-1" -     name="action_members" -     top_pad="0" -     width="300" /> -  </panel> +     mouse_opaque="false" +     name="actions_footer" +     top_delta="0" +     top="255" +     visible="false"> +        <text_editor +         bg_readonly_color="Transparent" +         text_readonly_color="EmphasisColor" +         font="SansSerifSmall" +         type="string" +         enabled="false" +         halign="left" +         layout="topleft" +         follows="left|top|right" +         left="0" +         right="-1" +         height="90" +         max_length="512" +         name="action_description" +         top="0" +         word_wrap="true"> +            This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner. +        </text_editor> +        <text +         type="string" +         height="16" +         layout="topleft" +         follows="left|top" +         left="5" +         name="static2" +         top_pad="1" +         width="300"> +            Roles with this ability +        </text> +        <scroll_list +         height="216" +         layout="topleft" +         follows="left|top|right" +         left="5" +         right="-1" +         name="action_roles" +         top_pad="0" /> +        <text +         type="string" +         height="16" +         layout="topleft" +         follows="left|top" +         left="5" +         name="static3" +         top_pad="5" +         width="300"> +            Members with this ability +        </text> +        <name_list +         height="167" +         follows="left|top|right" +         layout="topleft" +         left="5" +         right="-1" +         name="action_members" +         top_pad="0" /> +    </panel>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml index e25145dd2a..9cb64e7a13 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -40,6 +40,10 @@          Information about this location is unavailable due to access restrictions.  Please check your permissions with the parcel owner.      </string>      <string +     name="acquired_date_ampm"> +        [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour12,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [ampm,datetime,slt] [year,datetime,slt] +    </string> +    <string       name="acquired_date">          [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt]      </string> diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml index 9aa0907a38..66cd1cacf1 100644 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -89,6 +89,10 @@          Information about this location is unavailable due to access restrictions.  Please check your permissions with the parcel owner.      </string>      <string +     name="acquired_date_ampm"> +        [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour12,datetime,local]:[min,datetime,local]:[second,datetime,local] [ampm,datetime,local] [year,datetime,local] +    </string> +    <string       name="acquired_date">          [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]      </string> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml index 101c506309..ddddb4855f 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -91,6 +91,37 @@           name="Traditional Chinese"           value="zh" />      </combo_box> +   <text +     type="string" +     length="1" +     follows="left|top" +     height="15" +     layout="topleft" +     left="255" +     name="time_format_textbox" +     top="10" +     width="200"> +        Time Format: +    </text> +    <combo_box +     follows="left|top" +     height="23" +     layout="topleft" +     left="255" +     max_chars="135" +     name="time_format_combobox" +     width="70"> +        <combo_box.item +         enabled="true" +         label="1:00 AM" +         name="12H" +         value="0" /> +        <combo_box.item +         enabled="true" +         label="13:00" +         name="24H" +         value="1" /> +    </combo_box>      <text   font="SansSerifSmall"       type="string" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_move.xml b/indra/newview/skins/default/xui/en/panel_preferences_move.xml index 395efe3169..1de660078f 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_move.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_move.xml @@ -202,9 +202,43 @@     height="10"     layout="topleft"     left="86" -   name="single_click_action_lbl" +   name="mouse_warp_lbl"     width="150"     top_pad="20"> +    Mouse Warp: +  </text> +  <combo_box +   control_name="MouseWarpMode" +   height="23" +   layout="topleft" +   left_pad="10" +   top_delta="-6" +   name="mouse_warp_combo" +   tooltip="Controls warping of the mouse to the center of the screen during alt-zoom and mouse look." +   width="200"> +    <combo_box.item +     label="Automatic" +     name="0" +     value="0"/> +    <combo_box.item +     label="On" +     name="1" +     value="1"/> +    <combo_box.item +     label="Off" +     name="2" +     value="2"/> +  </combo_box> +  <text +   follows="left|top" +   type="string" +   length="1" +   height="10" +   layout="topleft" +   left="86" +   name="single_click_action_lbl" +   width="150" +   top_pad="12">      Single click on land:    </text>    <combo_box @@ -266,7 +300,7 @@     layout="topleft"     left="83"     name="sound_on_collisions" -   top_pad="10" +   top_pad="0"     width="200" />    <check_box     control_name="DoubleClickZoomIn" @@ -275,7 +309,7 @@     layout="topleft"     left="83"     name="double_click_zoom_in" -   top_pad="10" +   top_pad="0"     width="200" />    <button     height="23" diff --git a/indra/newview/skins/default/xui/en/panel_profile_firstlife.xml b/indra/newview/skins/default/xui/en/panel_profile_firstlife.xml index 6554dd0952..831b631505 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_firstlife.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_firstlife.xml @@ -22,7 +22,6 @@      <profile_image       name="real_world_pic"       image_name="Generic_Person_Large" -     show_loading="false"       follows="top|left"       layout="topleft"       top="10" diff --git a/indra/newview/skins/default/xui/en/panel_profile_secondlife.xml b/indra/newview/skins/default/xui/en/panel_profile_secondlife.xml index e361a0f28c..4d4c7f2252 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_secondlife.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_secondlife.xml @@ -74,7 +74,6 @@ Account: [ACCTTYPE]        <profile_image         name="2nd_life_pic"         image_name="Generic_Person_Large" -       show_loading="false"         layout="topleft"         follows="all"         interactable="true" @@ -191,7 +190,7 @@ Account: [ACCTTYPE]       visible="false">        <icon         name="badge_icon" -       image_name="Beta_Tester" +       image_name="Profile_Badge_Beta"         layout="topleft"         follows="left|top"         top="10" diff --git a/indra/newview/skins/default/xui/en/panel_sound_devices.xml b/indra/newview/skins/default/xui/en/panel_sound_devices.xml index 7598f7d7e5..b858d0ed02 100644 --- a/indra/newview/skins/default/xui/en/panel_sound_devices.xml +++ b/indra/newview/skins/default/xui/en/panel_sound_devices.xml @@ -20,6 +20,10 @@       name="name_default_system_device">          Default System Device      </string> +    <string +     name="device_not_loaded"> +        Device not loaded +    </string>      <icon       follows="left|top"       height="18" diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index 1cb3eca2eb..40a88d4121 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -32,6 +32,10 @@      Owner can:    </panel.string>    <panel.string +    name="acquiredDateAMPM"> +    [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour12,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [ampm,datetime,slt] [year,datetime,slt] +  </panel.string> +  <panel.string      name="acquiredDate">      [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt]    </panel.string> diff --git a/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml b/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml index 83f204648d..db833e2c8e 100644 --- a/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml +++ b/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml @@ -2,6 +2,6 @@  <contents>  	<columns label="アクション" name="lst_action"/>  	<columns label="優先コントãƒãƒ¼ãƒ«" name="lst_ctrl1"/> -	<columns label="代ã‚り1" name="lst_ctrl2"/> -	<columns label="代ã‚り2" name="lst_ctrl3"/> +	<columns label="代替1" name="lst_ctrl2"/> +	<columns label="代替2" name="lst_ctrl3"/>  </contents> diff --git a/indra/newview/skins/default/xui/ja/floater_360capture.xml b/indra/newview/skins/default/xui/ja/floater_360capture.xml index d0a6eef0e0..4199327e88 100644 --- a/indra/newview/skins/default/xui/ja/floater_360capture.xml +++ b/indra/newview/skins/default/xui/ja/floater_360capture.xml @@ -1,5 +1,5 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="360capture" title="36ï¼åº¦ï¼³ã‚·ãƒ§ãƒƒãƒˆ"> +<floater name="360capture" title="360度スナップショット">  	<panel name="ui_panel_left">  		<text name="quality_level_label">  			å“質 @@ -11,7 +11,7 @@  			<radio_item label="最高å“ä½" name="maximum_quality" value="2048" tool_tip="最高å“質"/>  		</radio_group>  		<check_box label="ã‚¢ãƒã‚¿ãƒ¼ã‚’ã™ã¹ã¦éš ã™" name="360_hide_avatar"/> -		<button label="36ï¼åº¦ç”»åƒã‚’作æˆ" name="capture_button"/> +		<button label="360度画åƒã‚’作æˆ" name="capture_button"/>  		<button label="åå‰ã‚’ã¤ã‘ã¦ä¿å˜â€¦" name="save_local_button"/>  	</panel>  	<panel name="ui_panel_right"> diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml index 7da5f41f90..ed057704fe 100644 --- a/indra/newview/skins/default/xui/ja/floater_about_land.xml +++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml @@ -45,7 +45,7 @@  				[AREA]㎡  			</panel.string>  			<panel.string name="auction_id_text"> -				オークションID:[ID] +				オークションID:[ID]  			</panel.string>  			<panel.string name="need_tier_to_modify">  				ã“ã®åœŸåœ°ã‚’ä¿®æ£å¤‰æ›´ã™ã‚‹ã«ã¯ã€è³¼å…¥ã‚’承èªã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ @@ -72,7 +72,7 @@  				区画ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。  			</panel.string>  			<panel.string name="time_stamp_template"> -				[year,datetime,local]å¹´[mth,datetime,local]月[day,datetime,local]æ—¥[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] +				[year,datetime,local]å¹´[mth,datetime,local]月[day,datetime,local]æ—¥[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]  			</panel.string>  			<text name="Name:">  				åå‰ï¼š @@ -85,7 +85,7 @@  				種類:  			</text>  			<text name="LandTypeText"> -				メインランドï¼å…¥æ¤åœ° +				メインランド / ホームステッド  			</text>  			<text name="ContentRating">  				区分: @@ -136,7 +136,7 @@  				4048m²  			</text>  			<text name="Traffic:"> -				トラフィック: +				交通é‡ï¼š  			</text>  			<text name="DwellText">  				èªã¿è¾¼ã‚“ã§ã„ã¾ã™â€¦ @@ -178,7 +178,7 @@  				ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。  			</text_editor>  			<text name="covenant_timestamp_text"> -				最後更新:1969å¹´12月31日水曜日 16:00:00 +				最後更新:1969å¹´12月31日水曜日 16:00:00  			</text>  			<text font="SansSerifLarge" name="region_section_lbl">  				地域: @@ -190,7 +190,7 @@  				種類:  			</text>  			<text name="region_landtype_text"> -				メインランドï¼å…¥æ¤åœ° +				メインランド / ホームステッド  			</text>  			<text name="region_maturity_lbl">  				区分: @@ -270,7 +270,7 @@  				[COUNT]個  			</text>  			<text name="Autoreturn"> -				他者ã®ã‚ªãƒ–ジェクトã®è‡ªå‹•è¿”å´ï¼ˆåˆ†å˜ä½ã€ï¼ã§è‡ªå‹•è¿”å´ãªã—): +				他者ã®ã‚ªãƒ–ジェクトã®è‡ªå‹•è¿”å´ï¼ˆåˆ†å˜ä½ã€0ã§è‡ªå‹•è¿”å´ãªã—):  			</text>  			<line_editor name="clean other time"/>  			<text name="Object Owners:"> @@ -291,7 +291,7 @@  				ã“ã®åŒºç”»ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã™ã‚‹  			</panel.string>  			<panel.string name="search_disabled_small_tooltip"> -				区画é¢ç©ãŒï¼‘28㎡未満ã®ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚ +				区画é¢ç©ãŒ128㎡未満ã®ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚  大ããªåŒºç”»ã®ã¿æ¤œç´¢ã«è¡¨ç¤ºã•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚  			</panel.string>  			<panel.string name="search_disabled_permissions_tooltip"> @@ -385,7 +385,7 @@  			<text name="with media:">  				種類:  			</text> -			<combo_box name="media type" tool_tip="動画やã€Webページã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®ï¼µï¼²ï¼¬ã‚’指定ã—ã¾ã™ã€‚"/> +			<combo_box name="media type" tool_tip="動画やã€Webページã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®URLを指定ã—ã¾ã™ã€‚"/>  			<text name="at URL:">  				ホームページ:  			</text> @@ -402,11 +402,11 @@  				ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’使用ã™ã‚‹ã‚ªãƒ–ジェクトã®ã€Œå†ç”Ÿã€ã‚’クリックã™ã‚‹ã¨ã€å‹•画やWebページを表示ã—ã¾ã™ã€‚テクスãƒãƒ£ã‚’変更ã™ã‚‹ã«ã¯ã‚µãƒ ãƒã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。  			</text>  			<check_box label="スケールを自動è¨å®š" name="media_auto_scale" tool_tip="ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€ã“ã®åŒºç”»ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ã‚¹ã‚±ãƒ¼ãƒ«ãŒè‡ªå‹•çš„ã«è¨å®šã•れã¾ã™ã€‚動作速度ã¨ç”»è³ªãŒå°‘ã—低下ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ãŒã€ä»–ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚¹ã‚±ãƒ¼ãƒªãƒ³ã‚°ã‚„整列ãŒå¿…è¦ã«ãªã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。"/> -			<text name="media_size" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルトã®ï¼ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"> +			<text name="media_size" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルトã®0ã®ã¾ã¾ã«ã—ã¾ã™ã€‚">  				サイズ:  			</text> -			<spinner name="media_size_width" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルトã®ï¼ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> -			<spinner name="media_size_height" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルトã®ï¼ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> +			<spinner name="media_size_width" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルトã®0ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> +			<spinner name="media_size_height" tool_tip="レンダリングã™ã‚‹Webメディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルトã®0ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/>  			<text name="pixels">  				ピクセル  			</text> @@ -417,7 +417,7 @@  		</panel>  		<panel label="サウンド" name="land_audio_panel">  			<text name="MusicURL:"> -				音楽URL: +				音楽URL:  			</text>  			<text name="Sound:">  				サウンド: @@ -443,7 +443,7 @@  				1ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションãŒã€ä¸å‹•産レベルã§è¨å®šã•れã¦ã„ã¾ã™ã€‚  			</panel.string>  			<check_box label="誰ã§ã‚‚訪å•å¯ï¼ˆã“ã®ã‚ªãƒ—ションをオフã«ã™ã‚‹ã¨ç«‹å…¥ç¦æ¢ãƒ©ã‚¤ãƒ³ãŒä½œæˆã•れã¾ã™ï¼‰" name="public_access"/> -			<check_box label="18æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚[ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€ï¼‘8æ³ä»¥ä¸Šã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。詳細ã«ã¤ãã¾ã—ã¦ã¯ã€[SUPPORT_SITE]ã‚’ã”覧ã«ãªã£ã¦ãã ã•ã„。"/> +			<check_box label="18æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚[ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€18æ³ä»¥ä¸Šã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。詳細ã«ã¤ãã¾ã—ã¦ã¯ã€[SUPPORT_SITE]ã‚’ã”覧ã«ãªã£ã¦ãã ã•ã„。"/>  			<check_box label="支払情報ãŒç™»éŒ²ã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚[ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«æ”¯æ‰•情報ãŒç™»éŒ²ã•れã¦ã„ãªã„å ´åˆã€ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。詳細ã«ã¤ãã¾ã—ã¦ã¯ã€[SUPPORT_SITE]ã‚’ã”覧ã«ãªã£ã¦ãã ã•ã„。"/>  			<check_box label="制約ãªã—ã«ã‚°ãƒ«ãƒ¼ãƒ—[GROUP]を許å¯ã™ã‚‹ã€‚" name="GroupCheck" tool_tip="「一般ã€ã‚¿ãƒ–ã§ã€ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„。"/>  			<check_box label="入場許å¯ã‚’販売:" name="PassCheck" tool_tip="ã“ã®åŒºç”»ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™ã€‚"/> diff --git a/indra/newview/skins/default/xui/ja/floater_add_payment_method.xml b/indra/newview/skins/default/xui/ja/floater_add_payment_method.xml index fb2cd37cc3..b420bf7d20 100644 --- a/indra/newview/skins/default/xui/ja/floater_add_payment_method.xml +++ b/indra/newview/skins/default/xui/ja/floater_add_payment_method.xml @@ -5,7 +5,7 @@  	</floater.string>  	<panel label="wrapper_panel" name="wrapper_panel">  		<text name="title_txt"> -			æ”¯æ‰•ã„æ–¹æ³•を登録ã—ã¦ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚’購入ã—ã€Second Lifeã‚’ã‚‚ã£ã¨æ¥½ã—ã¿ã¾ã—ょã†ã€‚ +			æ”¯æ‰•ã„æ–¹æ³•を追加ã—ã¦ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚’購入ã—ã€Second Lifeã‚’ã‚‚ã£ã¨æ¥½ã—ã¿ã¾ã—ょã†ã€‚  		</text>  		<button label="å§‹ã‚ã¾ã—ょã†" name="continue_btn"/>  		<button label="ã¾ãŸå¾Œã§"/> diff --git a/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml b/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml index 5de3486ea1..a4909c18fd 100644 --- a/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml @@ -6,13 +6,13 @@  	<scroll_container name="profile_scroll">  		<panel name="scroll_content_panel">  			<text name="label"> -				ベークド +				ベイク済㿠 テクスãƒãƒ£  			</text>  			<text name="composite_label">  				åˆæˆãƒ†ã‚¯ã‚¹ãƒãƒ£  			</text> -			<button label="IDをコンソールã«ãƒ€ãƒ³ãƒ—" label_selected="ダンプ" name="Dump"/> +			<button label="IDをコンソールã«ãƒ€ãƒ³ãƒ—" label_selected="ダンプ" name="Dump"/>  			<panel name="scroll_content_panel2">  				<texture_picker label="髪" name="hair-baked"/>  				<texture_picker label="髪" name="hair_grain"/> @@ -53,12 +53,12 @@  				<texture_picker label="左腕ã®ã‚¿ãƒˆã‚¥" name="leftarm_tattoo"/>  				<texture_picker label="左足" name="leftleg-baked"/>  				<texture_picker label="左足ã®ã‚¿ãƒˆã‚¥" name="leftleg_tattoo"/> -				<texture_picker label="予備1" name="aux1-baked"/> -				<texture_picker label="予備1タトゥ" name="aux1_tattoo"/> -				<texture_picker label="予備2" name="aux2-baked"/> -				<texture_picker label="予備2タトゥ" name="aux2_tattoo"/> -				<texture_picker label="予備3" name="aux3-baked"/> -				<texture_picker label="予備3タトゥ" name="aux3_tattoo"/> +				<texture_picker label="予備1" name="aux1-baked"/> +				<texture_picker label="予備1タトゥ" name="aux1_tattoo"/> +				<texture_picker label="予備2" name="aux2-baked"/> +				<texture_picker label="予備2タトゥ" name="aux2_tattoo"/> +				<texture_picker label="予備3" name="aux3-baked"/> +				<texture_picker label="予備3タトゥ" name="aux3_tattoo"/>  			</panel>  		</panel>  	</scroll_container> diff --git a/indra/newview/skins/default/xui/ja/floater_bumps.xml b/indra/newview/skins/default/xui/ja/floater_bumps.xml index 8cd9c0cff9..c48296fa8f 100644 --- a/indra/newview/skins/default/xui/ja/floater_bumps.xml +++ b/indra/newview/skins/default/xui/ja/floater_bumps.xml @@ -4,21 +4,21 @@  		検出ãªã—  	</floater.string>  	<floater.string name="bump"> -		[TIME] [NAME]ãŒã‚ãªãŸã«è¡çªã—ã¾ã—ãŸã€‚ +		[TIME]  [NAME]ãŒã‚ãªãŸã«è¡çªã—ã¾ã—ãŸã€‚  	</floater.string>  	<floater.string name="llpushobject"> -		[TIME] [NAME]ãŒã‚¹ã‚¯ãƒªãƒ—トã§ã‚ãªãŸã‚’押ã—ã¾ã—ãŸã€‚ +		[TIME]  [NAME]ãŒã‚¹ã‚¯ãƒªãƒ—トã§ã‚ãªãŸã‚’押ã—ã¾ã—ãŸã€‚  	</floater.string>  	<floater.string name="selected_object_collide"> -		[TIME] [NAME]ãŒã€ã‚ªãƒ–ジェクトã§ã‚ãªãŸã‚’å©ãã¾ã—ãŸã€‚ +		[TIME]  [NAME]ãŒã€ã‚ªãƒ–ジェクトã§ã‚ãªãŸã‚’å©ãã¾ã—ãŸã€‚  	</floater.string>  	<floater.string name="scripted_object_collide"> -		[TIME] [NAME]ãŒã€ã‚¹ã‚¯ãƒªãƒ—トã®ã‚ªãƒ–ジェクトã§ã‚ãªãŸã‚’å©ãã¾ã—ãŸã€‚ +		[TIME]  [NAME]ãŒã€ã‚¹ã‚¯ãƒªãƒ—トã®ã‚ªãƒ–ジェクトã§ã‚ãªãŸã‚’å©ãã¾ã—ãŸã€‚  	</floater.string>  	<floater.string name="physical_object_collide"> -		[TIME] [NAME]ãŒã€ç‰©ç†ã‚ªãƒ–ジェクトã§ã‚ãªãŸã‚’å©ãã¾ã—ãŸã€‚ +		[TIME]  [NAME]ãŒã€ç‰©ç†ã‚ªãƒ–ジェクトã§ã‚ãªãŸã‚’å©ãã¾ã—ãŸã€‚  	</floater.string>  	<floater.string name="timeStr"> -		[[hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt]] +		[[hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt]]  	</floater.string>  </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml b/indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml index f75564cd4c..a72836bbbc 100644 --- a/indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml +++ b/indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml @@ -13,7 +13,7 @@  		自分ã§ä½œæˆã—ãŸãƒ‡ã‚¤ã‚µã‚¤ã‚¯ãƒ«ã‚’編集ã™ã‚‹ã«ã¯ã€å¸Œæœ›ã®è¨å®šã«èª¿ç¯€ã—ã¦ã€ã€Œä¿å˜ã€ã‚’クリックã—ã¾ã™ã€‚  	</string>  	<string name="time_label"> -		([HH]:[MM]) +		([HH]:[MM])  	</string>  	<string name="sky_track_label">  		空[ALT] @@ -42,9 +42,9 @@  			<layout_stack name="content_stack">  				<layout_panel name="timeline_track_selection">  					<panel name="timeline_layers"> -						<button label="空4" name="sky4_track"/> -						<button label="空3" name="sky3_track"/> -						<button label="空2" name="sky2_track"/> +						<button label="空4" name="sky4_track"/> +						<button label="空3" name="sky3_track"/> +						<button label="空2" name="sky2_track"/>  						<button label="地é¢" name="sky1_track"/>  						<button label="æ°´é¢" name="water_track"/>  					</panel> diff --git a/indra/newview/skins/default/xui/ja/floater_god_tools.xml b/indra/newview/skins/default/xui/ja/floater_god_tools.xml index 3c96e2e340..d82be80c95 100644 --- a/indra/newview/skins/default/xui/ja/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_god_tools.xml @@ -20,17 +20,17 @@  			<button label="åœ°å½¢ã‚’å…ƒã«æˆ»ã™" label_selected="åœ°å½¢ã‚’å…ƒã«æˆ»ã™" name="Revert Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã«ç½®æ›ã—ã¾ã™ã€‚"/>  			<button label="地形を交æ›" label_selected="地形を交æ›" name="Swap Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã¨å…¥ã‚Œæ›¿ãˆã¾ã™ã€‚"/>  			<text name="estate id"> -				ä¸å‹•産ID: +				ä¸å‹•産ID:  			</text>  			<text name="parent id"> -				親ID: +				親ID:  			</text>  			<line_editor name="parentestate" tool_tip="ã“れã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã®è¦ªä¸å‹•産ã§ã™ã€‚"/>  			<text name="Grid Pos: ">  				グリッドä½ç½®ï¼š  			</text> -			<line_editor name="gridposx" tool_tip="ã“れã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã®ã‚°ãƒªãƒƒãƒ‰ï¼¸åº§æ¨™ã§ã™ã€‚"/> -			<line_editor name="gridposy" tool_tip="ã“れã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã®ã‚°ãƒªãƒƒãƒ‰ï¼¹åº§æ¨™ã§ã™ã€‚"/> +			<line_editor name="gridposx" tool_tip="ã“れã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã®ã‚°ãƒªãƒƒãƒ‰X座標ã§ã™ã€‚"/> +			<line_editor name="gridposy" tool_tip="ã“れã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã®ã‚°ãƒªãƒƒãƒ‰Y座標ã§ã™ã€‚"/>  			<text name="Redirect to Grid: ">  				グリッドã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆï¼š  			</text> @@ -85,7 +85,7 @@  				<combo_box.item label="コライダー<ステップ>" name="item1"/>  				<combo_box.item label="スクリプト<回数>ã€ï¼œã‚ªãƒ—ション・パターン>" name="item2"/>  				<combo_box.item label="オブジェクト<パターン>" name="item3"/> -				<combo_box.item label="rez <アセットID>" name="item4"/> +				<combo_box.item label="rez <アセットID>" name="item4"/>  			</combo_box>  			<text name="Parameter:">  				パラメーター: diff --git a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml index 319db34879..5b09d2da53 100644 --- a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml @@ -4,7 +4,7 @@  		5  	</floater.string>  	<floater.string name="localchat"> -		近隣ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆ +		è¿‘ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆ  	</floater.string>  	<floater.string name="anonymous">  		匿åユーザー diff --git a/indra/newview/skins/default/xui/ja/floater_inspect.xml b/indra/newview/skins/default/xui/ja/floater_inspect.xml index fca7b2eab8..0a859f9142 100644 --- a/indra/newview/skins/default/xui/ja/floater_inspect.xml +++ b/indra/newview/skins/default/xui/ja/floater_inspect.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="inspect" title="オブジェクトã®èª¿æŸ»">  	<floater.string name="timeStamp"> -		[year,datetime,slt]å¹´[mth,datetime,slt]月[day,datetime,slt]日([wkday,datetime,slt]) [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] +		[year,datetime,slt]å¹´[mth,datetime,slt]月[day,datetime,slt]日([wkday,datetime,slt]) [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt]  	</floater.string>  	<scroll_list name="object_list" tool_tip="ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ã€ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§ãƒã‚¤ãƒ©ã‚¤ãƒˆã—ã¾ã™ã€‚">  		<scroll_list.columns label="オブジェクトå" name="object_name"/> diff --git a/indra/newview/skins/default/xui/ja/floater_joystick.xml b/indra/newview/skins/default/xui/ja/floater_joystick.xml index 559ecee5a8..0d3f0992a2 100644 --- a/indra/newview/skins/default/xui/ja/floater_joystick.xml +++ b/indra/newview/skins/default/xui/ja/floater_joystick.xml @@ -6,9 +6,9 @@  	<text name="joystick_lbl">  		ジョイスティック:  	</text> -	<spinner label="X軸マッピング" name="JoystickAxis1"/> -	<spinner label="Y軸マッピング" name="JoystickAxis2"/> -	<spinner label="Z軸マッピング" name="JoystickAxis0"/> +	<spinner label="X軸マッピング" name="JoystickAxis1"/> +	<spinner label="Y軸マッピング" name="JoystickAxis2"/> +	<spinner label="Z軸マッピング" name="JoystickAxis0"/>  	<spinner label="ピッãƒãƒ»ãƒžãƒƒãƒ”ング" name="JoystickAxis4"/>  	<spinner label="ヨー・マッピング" name="JoystickAxis5"/>  	<spinner label="ãƒãƒ¼ãƒ«ãƒ»ãƒžãƒƒãƒ”ング" name="JoystickAxis3"/> @@ -23,19 +23,19 @@  	<check_box label="造る" name="JoystickBuildEnabled"/>  	<check_box label="フライ・カメラ" name="JoystickFlycamEnabled"/>  	<text name="XScale"> -		Xスケール +		Xスケール  	</text>  	<spinner name="AvatarAxisScale1"/>  	<spinner name="BuildAxisScale1"/>  	<spinner name="FlycamAxisScale1"/>  	<text name="YScale"> -		Yスケール +		Yスケール  	</text>  	<spinner name="AvatarAxisScale2"/>  	<spinner name="BuildAxisScale2"/>  	<spinner name="FlycamAxisScale2"/>  	<text name="ZScale"> -		Zスケール +		Zスケール  	</text>  	<spinner name="AvatarAxisScale0"/>  	<spinner name="BuildAxisScale0"/> @@ -58,19 +58,19 @@  	<spinner name="BuildAxisScale3"/>  	<spinner name="FlycamAxisScale3"/>  	<text name="XDeadZone"> -		Xデッド・ゾーン +		Xデッド・ゾーン  	</text>  	<spinner name="AvatarAxisDeadZone1"/>  	<spinner name="BuildAxisDeadZone1"/>  	<spinner name="FlycamAxisDeadZone1"/>  	<text name="YDeadZone"> -		Yデッド・ゾーン +		Yデッド・ゾーン  	</text>  	<spinner name="AvatarAxisDeadZone2"/>  	<spinner name="BuildAxisDeadZone2"/>  	<spinner name="FlycamAxisDeadZone2"/>  	<text name="ZDeadZone"> -		Zデッド・ゾーン +		Zデッド・ゾーン  	</text>  	<spinner name="AvatarAxisDeadZone0"/>  	<spinner name="BuildAxisDeadZone0"/> @@ -110,12 +110,12 @@  	<button label="OK" label_selected="OK" name="ok_btn"/>  	<button label="ã‚ャンセル" label_selected="ã‚ャンセル" name="cancel_btn"/>  	<stat_view label="ジョイスティック・モニター" name="axis_view"> -		<stat_bar label="軸ï¼" name="axis0"/> -		<stat_bar label="軸1" name="axis1"/> -		<stat_bar label="軸2" name="axis2"/> -		<stat_bar label="軸3" name="axis3"/> -		<stat_bar label="軸4" name="axis4"/> -		<stat_bar label="軸5" name="axis5"/> +		<stat_bar label="軸0" name="axis0"/> +		<stat_bar label="軸1" name="axis1"/> +		<stat_bar label="軸2" name="axis2"/> +		<stat_bar label="軸3" name="axis3"/> +		<stat_bar label="軸4" name="axis4"/> +		<stat_bar label="軸5" name="axis5"/>  	</stat_view>  	<string name="NoDevice">  		デãƒã‚¤ã‚¹ã¯æ¤œå‡ºã•れã¾ã›ã‚“ã§ã—ãŸã€‚ diff --git a/indra/newview/skins/default/xui/ja/floater_lagmeter.xml b/indra/newview/skins/default/xui/ja/floater_lagmeter.xml index e7830bbd25..67b4e29e45 100644 --- a/indra/newview/skins/default/xui/ja/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/ja/floater_lagmeter.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="floater_lagmeter" title="ラグメーター">  	<floater.string name="max_title_msg"> -		é…延計測器 +		ラグメーター  	</floater.string>  	<floater.string name="max_width_px">  		360 diff --git a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml index 31009cb2e0..cd32fac8ac 100644 --- a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml @@ -17,13 +17,13 @@  		<column label="é¢ç©" name="area"/>  	</scroll_list>  	<text name="allowed_label"> -		ç¾åœ¨ã®æ”¯æ‰•ã„プランã§åˆ©ç”¨å¯èƒ½ãªå…¥æ¤åœ°ï¼š +		ç¾åœ¨ã®æ”¯æ‰•ã„ãƒ—ãƒ©ãƒ³ã§æ‰€æœ‰å¯èƒ½ãªåœŸåœ°:  	</text>  	<text name="allowed_text">  		[AREA]㎡  	</text>  	<text name="current_label"> -		ç¾åœ¨ã®ä¿æœ‰åœ°ï¼š +		ç¾åœ¨æ‰€æœ‰ã—ã¦ã„る土地:  	</text>  	<text name="current_text">  		[AREA]㎡ diff --git a/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml b/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml index 4bb370f6ea..f362bff2bd 100644 --- a/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml @@ -1,5 +1,5 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script ed float" title="LSLレファレンス"> +<floater name="script ed float" title="LSLレファレンス">  	<check_box label="カーソルを追ã†" name="lock_check"/>  	<combo_box label="ãƒãƒƒã‚¯" name="history_combo"/>  	<button label="戻る" name="back_btn"/> diff --git a/indra/newview/skins/default/xui/ja/floater_model_preview.xml b/indra/newview/skins/default/xui/ja/floater_model_preview.xml index 69629f357f..123421a97d 100644 --- a/indra/newview/skins/default/xui/ja/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/ja/floater_model_preview.xml @@ -233,7 +233,7 @@  			</panel>  			<panel label="アップãƒãƒ¼ãƒ‰ã®ã‚ªãƒ—ション" name="modifiers_panel">  				<text name="scale_label"> -					スケール(1ï¼å¢—減ãªã—): +					スケール(1ï¼å¢—減ãªã—):  				</text>  				<spinner name="import_scale" value="1.0"/>  				<text name="dimensions_label"> @@ -250,7 +250,7 @@  				<check_box label="ジョイントä½ç½®ã‚’å«ã‚€" name="upload_joints"/>  				<check_box label="ジョイントä½ç½®ãŒå®šç¾©ã•れã¦ã„ã‚‹å ´åˆã€ã‚¹ã‚±ãƒ¼ãƒ«ã‚’ãƒãƒƒã‚¯" name="lock_scale_if_joint_position"/>  				<text name="pelvis_offset_label"> -					Zオフセット(アãƒã‚¿ãƒ¼ã‚’上下調整): +					Zオフセット(アãƒã‚¿ãƒ¼ã‚’上下調整):  				</text>  				<spinner name="pelvis_offset" value="0.0"/>  			</panel> diff --git a/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml b/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml index d74b714b1a..35f4cd3ca3 100644 --- a/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml @@ -4,7 +4,7 @@  		5  	</floater.string>  	<floater.string name="localchat"> -		近隣ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆ +		è¿‘ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆ  	</floater.string>  	<floater.string name="anonymous">  		匿åユーザー diff --git a/indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml b/indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml index 00742aef23..092b564455 100644 --- a/indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml +++ b/indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml @@ -32,7 +32,7 @@  			<scroll_list.columns label="åå‰" name="name"/>  			<scroll_list.columns label="説明" name="description"/>  			<scroll_list.columns label="所有者" name="owner"/> -			<scroll_list.columns label="CPU" name="cpu_time"/> +			<scroll_list.columns label="CPU" name="cpu_time"/>  			<scroll_list.columns label="高度" name="altitude"/>  		</scroll_list>  		<text name="messaging_status"> diff --git a/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml index 218fade27b..72d9f4b44a 100644 --- a/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml @@ -89,17 +89,17 @@  			</text>  			<combo_box name="show_heatmap_mode">  				<combo_box.item label="表示ã—ãªã„" name="show_heatmap_mode_none"/> -				<combo_box.item label="ã‚ャラクタータイプA" name="show_heatmap_mode_a"/> -				<combo_box.item label="ã‚ャラクタータイプB" name="show_heatmap_mode_b"/> -				<combo_box.item label="ã‚ャラクタータイプC" name="show_heatmap_mode_c"/> -				<combo_box.item label="ã‚ャラクタータイプD" name="show_heatmap_mode_d"/> +				<combo_box.item label="ã‚ャラクタータイプA" name="show_heatmap_mode_a"/> +				<combo_box.item label="ã‚ャラクタータイプB" name="show_heatmap_mode_b"/> +				<combo_box.item label="ã‚ャラクタータイプC" name="show_heatmap_mode_c"/> +				<combo_box.item label="ã‚ャラクタータイプD" name="show_heatmap_mode_d"/>  			</combo_box>  			<check_box label="æ©è¡Œå¯èƒ½" name="show_walkables"/>  			<check_box label="ç´ æãƒœãƒªãƒ¥ãƒ¼ãƒ " name="show_material_volumes"/>  			<check_box label="é™çš„障害物" name="show_static_obstacles"/>  			<check_box label="除外ボリューム" name="show_exclusion_volumes"/>  			<check_box label="水上飛行機" name="show_water_plane"/> -			<check_box label="X線表示" name="show_xray"/> +			<check_box label="X線表示" name="show_xray"/>  		</panel>  		<panel label="パスをテスト" name="test_panel">  			<text name="ctrl_click_label"> @@ -113,17 +113,17 @@  			</text>  			<slider name="character_width" value="1"/>  			<text name="character_width_unit_label"> -				ï½ +				m  			</text>  			<text name="character_type_label">  				ã‚ャラクタータイプ  			</text>  			<combo_box name="path_character_type">  				<combo_box.item label="ãªã—" name="path_character_type_none"/> -				<combo_box.item label="A" name="path_character_type_a"/> -				<combo_box.item label="ï¼¢" name="path_character_type_b"/> -				<combo_box.item label="ï¼£" name="path_character_type_c"/> -				<combo_box.item label="D" name="path_character_type_d"/> +				<combo_box.item label="A" name="path_character_type_a"/> +				<combo_box.item label="B" name="path_character_type_b"/> +				<combo_box.item label="C" name="path_character_type_c"/> +				<combo_box.item label="D" name="path_character_type_d"/>  			</combo_box>  			<button label="経路をクリア" name="clear_path"/>  		</panel> diff --git a/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml index 0189cbd47b..0bf9b6a308 100644 --- a/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml +++ b/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml @@ -119,10 +119,10 @@  			<scroll_list.columns label="ランドインパクト" name="land_impact"/>  			<scroll_list.columns label="è·é›¢" name="dist_from_you"/>  			<scroll_list.columns label="経路探索ã§ä½¿ç”¨" name="linkset_use"/> -			<scroll_list.columns label="A%" name="a_percent"/> -			<scroll_list.columns label="B%" name="b_percent"/> -			<scroll_list.columns label="C%" name="c_percent"/> -			<scroll_list.columns label="D%" name="d_percent"/> +			<scroll_list.columns label="A %" name="a_percent"/> +			<scroll_list.columns label="B %" name="b_percent"/> +			<scroll_list.columns label="C %" name="c_percent"/> +			<scroll_list.columns label="D %" name="d_percent"/>  		</scroll_list>  		<text name="messaging_status">  			リンクセット: @@ -150,21 +150,21 @@  			æ©è¡Œå¯èƒ½æ€§ï¼š  		</text>  		<text name="edit_a_label"> -			A +			A  		</text> -		<line_editor name="edit_a_value" tool_tip="タイプAã®ã‚ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®æ©è¡Œå¯èƒ½æ€§ã€‚ã‚ャラクタータイプã®ä¾‹ã¯ãƒ’ューマノイドã§ã™ã€‚"/> +		<line_editor name="edit_a_value" tool_tip="タイプAã®ã‚ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®æ©è¡Œå¯èƒ½æ€§ã€‚ã‚ャラクタータイプã®ä¾‹ã¯ãƒ’ューマノイドã§ã™ã€‚"/>  		<text name="edit_b_label"> -			ï¼¢ +			B  		</text> -		<line_editor name="edit_b_value" tool_tip="タイプBã®ã‚ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®æ©è¡Œå¯èƒ½æ€§ã€‚ã‚ャラクタータイプã®ä¾‹ã¯ã‚¯ãƒªãƒ¼ãƒãƒ£ãƒ¼ã§ã™ã€‚"/> +		<line_editor name="edit_b_value" tool_tip="タイプBã®ã‚ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®æ©è¡Œå¯èƒ½æ€§ã€‚ã‚ャラクタータイプã®ä¾‹ã¯ã‚¯ãƒªãƒ¼ãƒãƒ£ãƒ¼ã§ã™ã€‚"/>  		<text name="edit_c_label"> -			ï¼£ +			C  		</text> -		<line_editor name="edit_c_value" tool_tip="タイプCã®ã‚ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®æ©è¡Œå¯èƒ½æ€§ã€‚ã‚ャラクタータイプã®ä¾‹ã¯ãƒ¡ã‚«ãƒ‹ã‚«ãƒ«ã§ã™ã€‚"/> +		<line_editor name="edit_c_value" tool_tip="タイプCã®ã‚ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®æ©è¡Œå¯èƒ½æ€§ã€‚ã‚ャラクタータイプã®ä¾‹ã¯ãƒ¡ã‚«ãƒ‹ã‚«ãƒ«ã§ã™ã€‚"/>  		<text name="edit_d_label"> -			D +			D  		</text> -		<line_editor name="edit_d_value" tool_tip="タイプDã®ã‚ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®æ©è¡Œå¯èƒ½æ€§ã€‚ã‚ャラクタータイプã®ä¾‹ã¯ãã®ä»–ã§ã™ã€‚"/> +		<line_editor name="edit_d_value" tool_tip="タイプDã®ã‚ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®æ©è¡Œå¯èƒ½æ€§ã€‚ã‚ャラクタータイプã®ä¾‹ã¯ãã®ä»–ã§ã™ã€‚"/>  		<button label="変更をé©ç”¨" name="apply_edit_values"/>  		<text name="suggested_use_a_label">  			(ヒューマノイド) diff --git a/indra/newview/skins/default/xui/ja/floater_performance.xml b/indra/newview/skins/default/xui/ja/floater_performance.xml index e2efc152a4..ecb00dd58c 100644 --- a/indra/newview/skins/default/xui/ja/floater_performance.xml +++ b/indra/newview/skins/default/xui/ja/floater_performance.xml @@ -39,7 +39,7 @@  		</panel>  		<panel name="nearby_subpanel">  			<text name="avatars_nearby_lbl"> -				近隣ã®ã‚¢ãƒã‚¿ãƒ¼ +				è¿‘ãã®ã‚¢ãƒã‚¿ãƒ¼  			</text>  			<text name="avatars_nearby_desc">  				è¿‘ãã«ã„ã‚‹ã‚¢ãƒã‚¿ãƒ¼ã®ã†ã¡ã€ã©ã®ã‚¿ã‚¤ãƒ—ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’完全ã«è¡¨ç¤ºã™ã‚‹ã‹ã‚’管ç†ã—ã¾ã™ã€‚ @@ -51,16 +51,16 @@  				ã‚¢ãƒã‚¿ãƒ¼ã®è¤‡é›‘度  			</text>  			<text name="complexity_info"> -				FPSãŒå‡ºãªã„å ´åˆã¯ã€ã‚¢ãƒã‚¿ãƒ¼ã®è¤‡é›‘度を減らã—ã¦ãã ã•ã„。 +				FPSãŒå‡ºãªã„å ´åˆã¯ã€ã‚¢ãƒã‚¿ãƒ¼ã®è¤‡é›‘度を減らã—ã¦ãã ã•ã„。  			</text>  			<icon name="icon_arrow4"/>  		</panel>  		<panel name="huds_subpanel">  			<text name="huds_lbl"> -				アクティブãªï¼¨ï¼µï¼¤ +				アクティブãªHUD  			</text>  			<text name="huds_desc"> -				使用ã—ã¦ã„ãªã„HUDを外ã™ã¨ã€é€Ÿåº¦ãŒå‘上ã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ +				使用ã—ã¦ã„ãªã„HUDを外ã™ã¨ã€é€Ÿåº¦ãŒå‘上ã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚  			</text>  			<icon name="icon_arrow4"/>  		</panel> diff --git a/indra/newview/skins/default/xui/ja/floater_preferences.xml b/indra/newview/skins/default/xui/ja/floater_preferences.xml index c26bad3176..f75026c6a6 100644 --- a/indra/newview/skins/default/xui/ja/floater_preferences.xml +++ b/indra/newview/skins/default/xui/ja/floater_preferences.xml @@ -15,7 +15,7 @@  		<panel label="色" name="colors"/>  		<panel label="プライãƒã‚·ãƒ¼" name="im"/>  		<panel label="セットアップ" name="input"/> -		<panel label="æ‹¡å¼µ" name="advanced1"/> +		<panel label="アドãƒãƒ³ã‚¹" name="advanced1"/>  		<panel label="アップãƒãƒ¼ãƒ‰" name="uploads"/>  		<panel label="æ“作" name="controls"/>  	</tab_container> diff --git a/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml index 66a416f416..9a2ed64291 100644 --- a/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml +++ b/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml @@ -1,11 +1,11 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="prefs_graphics_advanced" title="拡張グラフィックè¨å®š"> +<floater name="prefs_graphics_advanced" title="グラフィック詳細è¨å®š">  	<text name="GeneralText">  		全般  	</text>  	<slider label="æç”»è·é›¢ï¼š" name="DrawDistance"/>  	<text name="DrawDistanceMeterText2"> -		ï½ +		m  	</text>  	<slider label="最大パーティクル数:" name="MaxParticleCount"/>  	<slider label="ãƒã‚¹ãƒˆãƒ—ãƒã‚»ã‚¹å“質:" name="RenderPostProcess"/> diff --git a/indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml b/indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml index 5efbbf7e17..5f686e41e4 100644 --- a/indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml +++ b/indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml @@ -4,14 +4,14 @@  		カメラã®ã‚ªãƒ•セット:  	</text>  	<spinner name="camera_x"/> -	<spinner label="ï¼¹" name="camera_y"/> -	<spinner label="Z" name="camera_z"/> +	<spinner label="Y" name="camera_y"/> +	<spinner label="Z" name="camera_z"/>  	<text name="focus_offset_lbl">  		焦点ã®ã‚ªãƒ•セット:  	</text>  	<spinner name="focus_x"/> -	<spinner label="ï¼¹" name="focus_y"/> -	<spinner label="Z" name="focus_z"/> +	<spinner label="Y" name="focus_y"/> +	<spinner label="Z" name="focus_z"/>  	<text name="offset_scale_lbl">  		カメラã®ã‚ªãƒ•セットå€çŽ‡ï¼š  	</text> diff --git a/indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml b/indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml index 43d5223ecc..b43d54001c 100644 --- a/indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml +++ b/indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml @@ -4,7 +4,7 @@  		<container_view name="statistics_view">  			<stat_view name="basic" label="基本">  				<stat_bar label="フレームã”ã¨ã®ãƒ”クセル差" name="frame difference" unit_label="ï¼…"/> -				<stat_bar label="UDPデータã®å—ä¿¡é‡" name="bandwidth" unit_label="kbps"/> +				<stat_bar label="UDPデータã®å—ä¿¡é‡" name="bandwidth" unit_label="kbps"/>  				<stat_bar label="パケットãƒã‚¹" name="packet_loss" unit_label="ï¼…"/>  			</stat_view>  			<stat_view name="advanced" label="æ‹¡å¼µ"> @@ -57,15 +57,15 @@  						<stat_bar name="simsimphysicsshapeupdatemsec" label=" 物ç†å½¢çŠ¶æ›´æ–°" unit_label="㎳"/>  						<stat_bar name="simsimphysicsothermsec" label=" 他ã®ç‰©ç†ä½œç”¨" unit_label="㎳"/>  						<stat_bar name="simsleepmsec" label=" スリープ時間" unit_label="㎳"/> -						<stat_bar name="simpumpiomsec" label=" ãƒãƒ³ãƒ—Iï¼ï¼¯" unit_label="㎳"/> +						<stat_bar name="simpumpiomsec" label=" ãƒãƒ³ãƒ—IO" unit_label="㎳"/>  					</stat_view>  				</stat_view>  			</stat_view>  			<stat_view name="frame_stats" label="フレームã®å†…訳">  				<stat_bar name="scenery_frame_pct" label="景色" unit_label="ï¼…"/>  				<stat_bar name="avatar_frame_pct" label="ã‚¢ãƒã‚¿ãƒ¼" unit_label="ï¼…"/> -				<stat_bar name="ui_frame_pct" label="UI" unit_label="ï¼…"/> -				<stat_bar name="huds_frame_pct" label="HUD" unit_label="ï¼…"/> +				<stat_bar name="ui_frame_pct" label="UI" unit_label="ï¼…"/> +				<stat_bar name="huds_frame_pct" label="HUD" unit_label="ï¼…"/>  				<stat_bar name="swap_frame_pct" label="スワップ" unit_label="ï¼…"/>  				<stat_bar name="idle_frame_pct" label="タスク" unit_label="ï¼…"/>  			</stat_view> diff --git a/indra/newview/skins/default/xui/ja/floater_settings_debug.xml b/indra/newview/skins/default/xui/ja/floater_settings_debug.xml index f304ab9769..ef1947dbce 100644 --- a/indra/newview/skins/default/xui/ja/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/ja/floater_settings_debug.xml @@ -16,10 +16,10 @@  	</radio_group>  	<line_editor name="val_text"/>  	<color_swatch label="色" name="val_color_swatch"/> -	<spinner label="X" name="val_spinner_1"/> -	<spinner label="X" name="val_spinner_2"/> -	<spinner label="X" name="val_spinner_3"/> -	<spinner label="X" name="val_spinner_4"/> +	<spinner label="x" name="val_spinner_1"/> +	<spinner label="x" name="val_spinner_2"/> +	<spinner label="x" name="val_spinner_3"/> +	<spinner label="x" name="val_spinner_4"/>  	<button label="デフォルトã«ãƒªã‚»ãƒƒãƒˆ" name="default_btn"/>  	<check_box label="変更ã•れãŸè¨å®šã®ã¿è¡¨ç¤º" name="hide_default"/>  </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_snapshot.xml b/indra/newview/skins/default/xui/ja/floater_snapshot.xml index 8035e8a13f..be9c52fb12 100644 --- a/indra/newview/skins/default/xui/ja/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/ja/floater_snapshot.xml @@ -49,7 +49,7 @@  			<combo_box.item label="色深度" name="Depth" value="depth"/>  		</combo_box>  		<check_box label="インターフェース" name="ui_check"/> -		<check_box label="HUD" name="hud_check"/> +		<check_box label="HUD" name="hud_check"/>  		<check_box label="フレームをフリーズ(全画é¢ï¼‰" name="freeze_frame_check"/>  		<check_box label="自動リフレッシュ" name="auto_snapshot_check"/>  		<text name="filter_list_label"> @@ -93,6 +93,6 @@  		[SIZE]㎅  	</text>  	<text name="360_label"> -		36ï¼åº¦ï¼³ã‚·ãƒ§ãƒƒãƒˆã‚’撮影 +		360度スナップショットを撮影  	</text>  </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_stats.xml b/indra/newview/skins/default/xui/ja/floater_stats.xml index 0c28b47351..41a482a4b9 100644 --- a/indra/newview/skins/default/xui/ja/floater_stats.xml +++ b/indra/newview/skins/default/xui/ja/floater_stats.xml @@ -3,15 +3,15 @@  	<scroll_container name="statistics_scroll">  		<container_view name="statistics_view">  			<stat_view label="基本" name="basic"> -				<stat_bar label="FPS" name="fps" unit_label="ï¼ç§’"/> +				<stat_bar label="FPS" name="fps" unit_label="ï¼ç§’"/>  				<stat_bar name="frame_mean" label="フレーム(平å‡ï¼‰" unit_label="㎳"/>  				<stat_bar name="frame_median" label="フレーム(ä¸å¤®å€¤ï¼‰" unit_label="㎳"/>  				<stat_bar name="framet_jitter" label="ジッタ"/> -				<stat_bar label="å—ä¿¡ã—ãŸï¼µï¼¤ï¼°ãƒ‡ãƒ¼ã‚¿" name="bandwidth"/> +				<stat_bar label="å—ä¿¡ã—ãŸUDPデータ" name="bandwidth"/>  				<stat_bar label="パケットãƒã‚¹" name="packet_loss"/>  				<stat_bar label="シムã®Ping" name="ping"/>  			</stat_view> -			<stat_view label="æ‹¡å¼µ" name="advanced"> +			<stat_view label="詳細" name="advanced">  				<stat_view label="æç”»" name="render">  					<stat_bar label="フレームã‚ãŸã‚Šã®KTris" name="ktrisframe" unit_label="ktrisï¼ãƒ•レーム"/>  					<stat_bar label="ç§’ã‚ãŸã‚Šã®KTris" name="ktrissec"/> @@ -27,15 +27,15 @@  					<stat_bar label="ã‚ャッシュヒット率" name="texture_cache_hits"/>  					<stat_bar label="ã‚ャッシュèªã¿å–りé…å»¶" name="texture_cache_read_latency"/>  					<stat_bar label="カウント" name="numimagesstat"/> -					<stat_bar label="RAWカウント" name="numrawimagesstat"/> -					<stat_bar label="GLメモリ" name="gltexmemstat"/> +					<stat_bar label="Rawカウント" name="numrawimagesstat"/> +					<stat_bar label="GLメモリ" name="gltexmemstat"/>  					<stat_bar label="フォーマット済メモリ" name="formattedmemstat"/> -					<stat_bar label="RAWメモリ" name="rawmemstat"/> +					<stat_bar label="Rawメモリ" name="rawmemstat"/>  					<stat_bar label="çµ±åˆãƒ¡ãƒ¢ãƒª" name="glboundmemstat"/>  				</stat_view>  				<stat_view label="メモリ使用é‡" name="memory"> -					<stat_bar label="LLトレース" name="LLTrace"/> -					<stat_bar label="UI" name="LLView"/> +					<stat_bar label="LLトレース" name="LLTrace"/> +					<stat_bar label="UI" name="LLView"/>  					<stat_bar label="フォント" name="LLFontFreetype"/>  					<stat_bar label="インベントリ" name="LLInventoryObject"/>  					<stat_bar label="ビューアオブジェクト" name="LLViewerObject"/> @@ -47,7 +47,7 @@  					<stat_bar label="æç”»æƒ…å ±" name="LLDrawInfo"/>  					<stat_bar label="テクスãƒãƒ£ãƒ‡ãƒ¼ã‚¿" name="LLTexture"/>  					<stat_bar label="ç”»åƒãƒ‡ãƒ¼ã‚¿" name="LLImage"/> -					<stat_bar label="GL画åƒãƒ‡ãƒ¼ã‚¿" name="LLImageGL"/> +					<stat_bar label="GLç”»åƒãƒ‡ãƒ¼ã‚¿" name="LLImageGL"/>  					<stat_bar label="頂点ãƒãƒƒãƒ•ã‚¡" name="LLVertexBuffer"/>  				</stat_view>  				<stat_view label="ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" name="network"> @@ -63,11 +63,11 @@  			</stat_view>  			<stat_view label="シミュレーター" name="sim">  				<stat_bar label="é…延時間" name="simtimedilation"/> -				<stat_bar label="シムã®ï¼¦ï¼°ï¼³" name="simfps"/> -				<stat_bar label="物ç†ä½œç”¨ã®ï¼¦ï¼°ï¼³" name="simphysicsfps"/> +				<stat_bar label="シムã®FPS" name="simfps"/> +				<stat_bar label="物ç†ä½œç”¨ã®FPS" name="simphysicsfps"/>  				<stat_view label="物ç†ä½œç”¨ã®è©³ç´°" name="physicsdetail">  					<stat_bar label="ピン留ã‚オブジェクト" name="physicspinnedtasks"/> -					<stat_bar label="低LODオブジェクト" name="physicslodtasks"/> +					<stat_bar label="低LODオブジェクト" name="physicslodtasks"/>  					<stat_bar label="メモリé…分" name="physicsmemoryallocated"/>  				</stat_view>  				<stat_bar label="ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã®æ›´æ–°ï¼ç§’" name="simagentups"/> @@ -79,7 +79,7 @@  				<stat_bar label="スクリプト実行" name="simpctscriptsrun"/>  				<stat_bar label="スクリプトイベント" name="simscripteps" unit_label="eps"/>  				<stat_view label="経路探索" name="simpathfinding"> -					<stat_bar label="AIステップ時間" name="simsimaistepmsec"/> +					<stat_bar label="AIステップ時間" name="simsimaistepmsec"/>  					<stat_bar label="スã‚ップã•れãŸã‚·ãƒ«ã‚¨ãƒƒãƒˆã‚¹ãƒ†ãƒƒãƒ—" name="simsimskippedsilhouettesteps" unit_label="ï¼ç§’"/>  					<stat_bar label="æ›´æ–°ã•れãŸã‚ャラクター" name="simsimpctsteppedcharacters" unit_label="ï¼…"/>  				</stat_view> diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml index fb95a71ce0..f14d8f7241 100644 --- a/indra/newview/skins/default/xui/ja/floater_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_tools.xml @@ -40,7 +40,7 @@  		土地をクリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦é¸æŠž  	</floater.string>  	<floater.string name="status_selectcount"> -		é¸æŠžã•れã¦ã„るオブジェクトã¯[OBJ_COUNT]個ã€åœŸåœ°ã®è² è·ã¯[LAND_IMPACT] [secondlife:///app/openfloater/object_weights 詳細] +		é¸æŠžã•れã¦ã„るオブジェクトã¯[OBJ_COUNT]個ã€åœŸåœ°ã®è² è·ã¯[LAND_IMPACT] [secondlife:///app/openfloater/object_weights 詳細]  	</floater.string>  	<floater.string name="status_remaining_capacity">  		残りã®è¨±å®¹æ•°[LAND_CAPACITY] @@ -123,7 +123,7 @@  		ä½•ã‚‚é¸æŠžã•れã¦ã„ã¾ã›ã‚“。  	</text>  	<text name="remaining_capacity"> -		[CAPACITY_STRING] [secondlife:///app/openfloater/object_weights 詳細] +		[CAPACITY_STRING] [secondlife:///app/openfloater/object_weights 詳細]  	</text>  	<tab_container name="Object Info Tabs">  		<panel label="一般" name="General"> @@ -232,22 +232,22 @@  				<check_box label="コピー" name="checkbox next owner can copy" tool_tip="è²æ¸¡å…ˆã®æ‰€æœ‰è€…ã¯ã€ã“ã®ã‚ªãƒ–ジェクトを無制é™ã«ã‚³ãƒ”ーã§ãã¾ã™ã€‚コピーã«ã¯åˆ¶ä½œè€…ã®æƒ…å ±ãŒå«ã¾ã‚Œã€ã‚³ãƒ”ー元ã®ã‚¢ã‚¤ãƒ†ãƒ ã¨é•ã£ã¦è¨±å¯ãªã©ã«é–¢ã—制約ãŒã‚りã¾ã™ã€‚"/>  				<check_box label="å†è²©ãƒ»è²æ¸¡" name="checkbox next owner can transfer" tool_tip="è²æ¸¡å…ˆã®æ‰€æœ‰è€…ã¯ã€ã“ã®ã‚ªãƒ–ジェクトを他人ã«è²æ¸¡ã—ãŸã‚Šå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/>  				<text name="B:"> -					B: +					B:  				</text>  				<text name="O:"> -					C: +					O:  				</text>  				<text name="G:"> -					G: +					G:  				</text>  				<text name="E:"> -					E: +					E:  				</text>  				<text name="N:"> -					N: +					N:  				</text>  				<text name="F:"> -					F: +					F:  				</text>  			</panel>  			<panel name="pathfinding_attrs_panel"> @@ -264,21 +264,21 @@  			<text name="label position">  				ä½ç½®ï¼ˆãƒ¡ãƒ¼ãƒˆãƒ«ï¼‰  			</text> -			<spinner label="X" name="Pos X"/> -			<spinner label="ï¼¹" name="Pos Y"/> -			<spinner label="Z" name="Pos Z"/> +			<spinner label="X" name="Pos X"/> +			<spinner label="Y" name="Pos Y"/> +			<spinner label="Z" name="Pos Z"/>  			<text name="label size">  				サイズ(メートル)  			</text> -			<spinner label="X" name="Scale X"/> -			<spinner label="ï¼¹" name="Scale Y"/> -			<spinner label="Z" name="Scale Z"/> +			<spinner label="X" name="Scale X"/> +			<spinner label="Y" name="Scale Y"/> +			<spinner label="Z" name="Scale Z"/>  			<text name="label rotation">  				回転(度)  			</text> -			<spinner label="X" name="Rot X"/> -			<spinner label="ï¼¹" name="Rot Y"/> -			<spinner label="Z" name="Rot Z"/> +			<spinner label="X" name="Rot X"/> +			<spinner label="Y" name="Rot Y"/> +			<spinner label="Z" name="Rot Z"/>  			<combo_box name="comboBaseType">  				<combo_box.item label="ボックス" name="Box"/>  				<combo_box.item label="シリンダー" name="Cylinder"/> @@ -320,13 +320,13 @@  			<text name="scale_hole">  				穴寸法  			</text> -			<spinner label="X" name="Taper Scale X"/> -			<spinner label="ï¼¹" name="Taper Scale Y"/> +			<spinner label="X" name="Taper Scale X"/> +			<spinner label="Y" name="Taper Scale Y"/>  			<text name="text topshear">  				上部層  			</text> -			<spinner label="X" name="Shear X"/> -			<spinner label="ï¼¹" name="Shear Y"/> +			<spinner label="X" name="Shear X"/> +			<spinner label="Y" name="Shear Y"/>  			<text name="advanced_cut">  				プãƒãƒ•ィールカット(始点ã¨çµ‚点)  			</text> @@ -341,8 +341,8 @@  			<text name="text taper2">  				テーパー  			</text> -			<spinner label="X" name="Taper X"/> -			<spinner label="ï¼¹" name="Taper Y"/> +			<spinner label="X" name="Taper X"/> +			<spinner label="Y" name="Taper Y"/>  			<text name="text radius delta">  				åŠå¾„  			</text> @@ -350,7 +350,7 @@  				回転体  			</text>  			<texture_picker label="スカルプトテクスãƒãƒ£" name="sculpt texture control" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã—ã¦ãã ã•ã„。"/> -			<check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトプリムをX軸上ã§å転ã•ã›ã¾ã™"/> +			<check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトプリムをX軸上ã§å転ã•ã›ã¾ã™"/>  			<check_box label="è£è¿”ã—" name="sculpt invert control" tool_tip="スカルプトプリムをå転ã•ã›ã¦è£è¿”ã—ã¾ã™"/>  			<text name="label sculpt type">  				縫ã„ç›®ã®ã‚¿ã‚¤ãƒ— @@ -379,20 +379,20 @@  				オブジェクトã®ç‰¹å¾´ã‚’編集:  			</text>  			<check_box label="アニメーションメッシュ" name="Animated Mesh Checkbox Ctrl" tool_tip="リグ入りメッシュオブジェクトをã€ãれãžã‚Œã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã•ã›ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚"/> -			<check_box label="フレã‚シブルパス" name="Flexible1D Checkbox Ctrl" tool_tip="Z軸をä¸å¿ƒã«ã€ã‚ªãƒ–ジェクトã®å±ˆæ›²ã‚’有効ã«ã—ã¾ã™ã€‚(クライアントå´ã®ã¿ï¼‰"/> +			<check_box label="フレã‚シブルパス" name="Flexible1D Checkbox Ctrl" tool_tip="Z軸をä¸å¿ƒã«ã€ã‚ªãƒ–ジェクトã®å±ˆæ›²ã‚’有効ã«ã—ã¾ã™ã€‚(クライアントå´ã®ã¿ï¼‰"/>  			<spinner label="柔軟性" name="FlexNumSections"/>  			<spinner label="é‡åŠ›" name="FlexGravity"/>  			<spinner label="ドラッグ" name="FlexFriction"/>  			<spinner label="風" name="FlexWind"/>  			<spinner label="ç·Šå¼µ" name="FlexTension"/> -			<spinner label="X軸方å‘ã®åŠ›" name="FlexForceX"/> -			<spinner label="Y軸方å‘ã®åŠ›" name="FlexForceY"/> -			<spinner label="Z軸方å‘ã®åŠ›" name="FlexForceZ"/> +			<spinner label="X軸方å‘ã®åŠ›" name="FlexForceX"/> +			<spinner label="Y軸方å‘ã®åŠ›" name="FlexForceY"/> +			<spinner label="Z軸方å‘ã®åŠ›" name="FlexForceZ"/>  			<check_box label="発光" name="Light Checkbox Ctrl" tool_tip="オブジェクトãŒç™ºå…‰ã—ã¾ã™"/>  			<color_swatch label="" name="colorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>  			<texture_picker label="" name="light texture control" tool_tip="ã‚¯ãƒªãƒƒã‚¯ã§æŠ•å½±ç”»ã‚’é¸æŠžã—ã¾ã™ï¼ˆé…延レンダリング有効時ã®ã¿ï¼‰"/>  			<spinner label="è¼åº¦" name="Light Intensity"/> -			<spinner label="FOV" name="Light FOV"/> +			<spinner label="FOV" name="Light FOV"/>  			<spinner label="åŠå¾„" name="Light Radius"/>  			<spinner label="焦点" name="Light Focus"/>  			<spinner label="å¼±ã¾ã‚‹" name="Light Falloff"/> @@ -412,7 +412,7 @@  			</combo_box>  			<spinner label="é‡åŠ›" name="Physics Gravity"/>  			<spinner label="摩擦" name="Physics Friction"/> -			<spinner label="密度(1ï¼ï¼ãŽ/㎥)" name="Physics Density"/> +			<spinner label="密度(100ãŽ/㎥)" name="Physics Density"/>  			<spinner label="復元" name="Physics Restitution"/>  		</panel>  		<panel label="æè³ª" name="Texture"/> @@ -426,13 +426,13 @@  			区画情報  		</text>  		<text name="label_area_price"> -			価格:[AREA]㎡ L$ [PRICE] +			価格:[AREA]㎡ L$ [PRICE]  		</text>  		<text name="label_area">  			é¢ç©ï¼š[AREA]㎡  		</text>  		<button label="土地情報" label_selected="土地情報" name="button about land"/> -		<check_box label="所有者を表示" name="checkbox show owners" tool_tip="所有者ã®ç¨®é¡žåˆ¥ã«åŒºç”»ã‚’色ã¥ã‘ã¾ã™ï¼šç·‘色ï¼ã‚ãªãŸã®åœŸåœ°ã€€æ°´è‰²ï¼ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地 赤色ï¼ä»–äººãŒæ‰€æœ‰ã™ã‚‹åœŸåœ°ã€€é»„色 = 売り出ã—ä¸ã€€ç´«è‰²ï¼ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã€€ç°è‰²ï¼å…¬å…±é ˜åŸŸ"/> +		<check_box label="所有者を表示" name="checkbox show owners" tool_tip="所有者ã®ç¨®é¡žåˆ¥ã«åŒºç”»ã‚’色ã¥ã‘ã¾ã™ï¼š

緑色ï¼ã‚ãªãŸã®åœŸåœ° 
水色ï¼ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地 
赤色ï¼ä»–äººãŒæ‰€æœ‰ã™ã‚‹åœŸåœ° 
黄色 = 売り出ã—ä¸ 
紫色ï¼ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ 
ç°è‰²ï¼å…¬å…±é ˜åŸŸ"/>  		<text name="label_parcel_modify">  			区画ã®ç·¨é›†  		</text> diff --git a/indra/newview/skins/default/xui/ja/floater_top_objects.xml b/indra/newview/skins/default/xui/ja/floater_top_objects.xml index 86ab64cb3e..69d527a087 100644 --- a/indra/newview/skins/default/xui/ja/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/ja/floater_top_objects.xml @@ -22,7 +22,7 @@  		何も見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚  	</floater.string>  	<floater.string name="URLs"> -		URL +		URL  	</floater.string>  	<floater.string name="memory">  		メモリ(㎅) @@ -41,7 +41,7 @@  		<scroll_list.columns label="メモリ(㎅)" name="memory"/>  	</scroll_list>  	<text name="id_text"> -		物体ID: +		物体ID:  	</text>  	<button label="標è˜ã‚’表示" name="show_beacon_btn"/>  	<text name="obj_name_text"> diff --git a/indra/newview/skins/default/xui/ja/floater_translation_settings.xml b/indra/newview/skins/default/xui/ja/floater_translation_settings.xml index 8bbcbcdfed..dbe5c3007a 100644 --- a/indra/newview/skins/default/xui/ja/floater_translation_settings.xml +++ b/indra/newview/skins/default/xui/ja/floater_translation_settings.xml @@ -1,13 +1,13 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="floater_translation_settings" title="ãƒãƒ£ãƒƒãƒˆã®ç¿»è¨³è¨å®š">  	<string name="azure_api_key_not_verified"> -		Azureサービスè˜åˆ¥åã®èªè¨¼ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ステータス:[STATUS] è¨å®šã‚’ãŠç¢ºã‹ã‚ã®ä¸Šã€ã‚‚ã†ä¸€åº¦ã‚„り直ã—ã¦ãã ã•ã„。 +		Azureサービスè˜åˆ¥åã®èªè¨¼ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ステータス:[STATUS] è¨å®šã‚’ãŠç¢ºã‹ã‚ã®ä¸Šã€ã‚‚ã†ä¸€åº¦ã‚„り直ã—ã¦ãã ã•ã„。  	</string>  	<string name="google_api_key_not_verified"> -		Google APIã‚ーã®èªè¨¼ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ステータス:[STATUS] è¨å®šã‚’ãŠç¢ºã‹ã‚ã®ä¸Šã€ã‚‚ã†ä¸€åº¦ã‚„り直ã—ã¦ãã ã•ã„。 +		Google APIã‚ーã®èªè¨¼ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ステータス:[STATUS] è¨å®šã‚’ãŠç¢ºã‹ã‚ã®ä¸Šã€ã‚‚ã†ä¸€åº¦ã‚„り直ã—ã¦ãã ã•ã„。  	</string>  	<string name="deepl_api_key_not_verified"> -		DeepL Authã‚ーã®èªè¨¼ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ステータス:[STATUS] è¨å®šã‚’ãŠç¢ºã‹ã‚ã®ä¸Šã€ã‚‚ã†ä¸€åº¦ã‚„り直ã—ã¦ãã ã•ã„。 +		DeepL Authã‚ーã®èªè¨¼ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ステータス:[STATUS] è¨å®šã‚’ãŠç¢ºã‹ã‚ã®ä¸Šã€ã‚‚ã†ä¸€åº¦ã‚„り直ã—ã¦ãã ã•ã„。  	</string>  	<string name="azure_api_key_verified">  		Azureサービスè˜åˆ¥åãŒèªè¨¼ã•れã¾ã—ãŸã€‚ diff --git a/indra/newview/skins/default/xui/ja/floater_ui_preview.xml b/indra/newview/skins/default/xui/ja/floater_ui_preview.xml index b907b4e8d7..c3d70e7055 100644 --- a/indra/newview/skins/default/xui/ja/floater_ui_preview.xml +++ b/indra/newview/skins/default/xui/ja/floater_ui_preview.xml @@ -1,5 +1,5 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="gui_preview_tool" title="XUIプレビューツール"> +<floater name="gui_preview_tool" title="XUIプレビューツール">  	<string name="ExternalEditorNotSet">  		環境変数LL_XUI_EDITORã¾ãŸã¯ExternalEditorè¨å®šã‚’è¨å®šã™ã‚‹ã‹ã€[EDITOR PATH]フィールドã«ãã®ãƒ‘スを指定ã—ã¦ã€ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ã‚’é¸æŠžã—ã¾ã™ã€‚  	</string> @@ -10,11 +10,11 @@  		<combo_box name="language_select_combo">  			<combo_box.item label="ja" name="item1" value="ja"/>  		</combo_box> -		<button label="表示" label_selected="表示" name="display_floater" tool_tip="é¸æŠžã—ãŸï¼¸ï¼ï¼¬ãƒ•ァイルã§å®šç¾©ã•れãŸï¼¸ï¼µï¼©ãƒ•ãƒãƒ¼ã‚¿ã‚’表示ã—ã¾ã™ã€‚"/> +		<button label="表示" label_selected="表示" name="display_floater" tool_tip="é¸æŠžã—ãŸXMLファイルã§å®šç¾©ã•れãŸXUIフãƒãƒ¼ã‚¿ã‚’表示ã—ã¾ã™ã€‚"/>  		<button label="éžè¡¨ç¤º" label_selected="éžè¡¨ç¤º" name="close_displayed_floater" tool_tip="ç¾åœ¨è¡¨ç¤ºã•れã¦ã„るフãƒãƒ¼ã‚¿ãƒ¼ãŒå˜åœ¨ã™ã‚‹å ´åˆã¯ã€ãれを閉ã˜ã¾ã™ã€‚"/> -		<button label="編集…" label_selected="編集…" name="edit_floater" tool_tip="é¸æŠžã—ãŸï¼¸ï¼ï¼¬ãƒ•ァイルã«ã‚ˆã£ã¦å®šç¾©ã•れãŸï¼¸ï¼µï¼©ãƒ•ãƒãƒ¼ã‚¿ãƒ¼ã‚’編集ã—ã¾ã™ã€‚(外部エディターを開ãã¾ã™ï¼‰ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚ºã•れãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå˜åœ¨ã—ãªã„å ´åˆã¯ã€enãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’é–‹ãã¾ã™ã€‚"/> -		<button label="ä¿å˜" label_selected="ä¿å˜" name="save_floater" tool_tip="é¸æŠžã—ãŸï¼¸ï¼ï¼¬ãƒ•ァイルã§å®šç¾©ã•れãŸï¼¸ï¼µï¼©ãƒ•ãƒãƒ¼ã‚¿ã‚’ä¿å˜ã—ã¾ã™ã€‚"/> -		<button label="å…¨ã¦ä¿å˜" label_selected="å…¨ã¦ä¿å˜" name="save_all_floaters" tool_tip="é¸æŠžã—ãŸè¨€èªžã§å®šç¾©ã•れãŸã™ã¹ã¦ã®ï¼¸ï¼µï¼©ãƒ•ãƒãƒ¼ã‚¿ã‚’ä¿å˜ã—ã¾ã™ã€‚"/> +		<button label="編集…" label_selected="編集…" name="edit_floater" tool_tip="é¸æŠžã—ãŸXMLファイルã«ã‚ˆã£ã¦å®šç¾©ã•れãŸXUIフãƒãƒ¼ã‚¿ãƒ¼ã‚’編集ã—ã¾ã™ã€‚(外部エディターを開ãã¾ã™ï¼‰ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚ºã•れãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå˜åœ¨ã—ãªã„å ´åˆã¯ã€enãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’é–‹ãã¾ã™ã€‚"/> +		<button label="ä¿å˜" label_selected="ä¿å˜" name="save_floater" tool_tip="é¸æŠžã—ãŸXMLファイルã§å®šç¾©ã•れãŸXUIフãƒãƒ¼ã‚¿ã‚’ä¿å˜ã—ã¾ã™ã€‚"/> +		<button label="å…¨ã¦ä¿å˜" label_selected="å…¨ã¦ä¿å˜" name="save_all_floaters" tool_tip="é¸æŠžã—ãŸè¨€èªžã§å®šç¾©ã•れãŸã™ã¹ã¦ã®XUIフãƒãƒ¼ã‚¿ã‚’ä¿å˜ã—ã¾ã™ã€‚"/>  		<button label="≫" label_selected="≪" name="toggle_overlap_panel" tool_tip="é‡ãªã£ã¦ã„ã‚‹è¦ç´ ã®å¼·èª¿è¡¨ç¤ºã¨è¡¨ç¤ºãƒ‘ãƒãƒ«ã‚’切り替ãˆã¾ã™ã€‚è¦ç´ ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€ã“ã®æ©Ÿèƒ½ç”¨ã«é¸æŠžã—ã¾ã™ã€‚é¸æŠžã—ãŸè¦ç´ ã¯ã€èµ¤ã„四角形ã§ãƒžãƒ¼ã‚¯ã•れã¾ã™ã€‚"/>  		<text name="select_language_label_2">  			二次言語: @@ -22,7 +22,7 @@  		<combo_box name="language_select_combo_2">  			<combo_box.item label="en" name="item1" value="en"/>  		</combo_box> -		<button label="表示" name="display_floater_2" tool_tip="é¸æŠžã—ãŸï¼¸ï¼ï¼¬ãƒ•ァイルã§å®šç¾©ã•れãŸï¼¸ï¼µï¼©ãƒ•ãƒãƒ¼ã‚¿ã‚’表示ã—ã¾ã™ã€‚"/> +		<button label="表示" name="display_floater_2" tool_tip="é¸æŠžã—ãŸXMLファイルã§å®šç¾©ã•れãŸXUIフãƒãƒ¼ã‚¿ã‚’表示ã—ã¾ã™ã€‚"/>  		<button enabled="false" label="éžè¡¨ç¤º" name="close_displayed_floater_2" tool_tip="ç¾åœ¨è¡¨ç¤ºã•れã¦ã„るフãƒãƒ¼ã‚¿ãƒ¼ãŒå˜åœ¨ã™ã‚‹å ´åˆã¯ã€ãれを閉ã˜ã¾ã™ã€‚"/>  		<button label="スã‚ーマをエクスãƒãƒ¼ãƒˆ" name="export_schema"/>  		<check_box label="四角形を表示" name="show_rectangles"/> @@ -35,8 +35,8 @@  			<text name="editor_path_label">  				エディタã®ãƒ‘ス:  			</text> -			<line_editor name="executable_path_field" tool_tip="フãƒãƒ¼ã‚¿ãƒ¼ï¼¸ï¼ï¼¬ãƒ•ァイルを編集ã™ã‚‹ãŸã‚ã®ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ï¼ˆå®Ÿè¡Œå¯èƒ½ãƒ•ァイル)ã¸ã®ãƒ•ルパス。(引用符ã¯å¿…è¦ã‚りã¾ã›ã‚“)"/> -			<button follows="left|bottom" label="ブラウズ…" label_selected="ブラウズ…" name="browse_for_executable" tool_tip="フãƒãƒ¼ã‚¿ãƒ¼ï¼¸ï¼ï¼¬ãƒ•ァイルを編集ã™ã‚‹ãŸã‚ã®ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ï¼ˆå®Ÿè¡Œå¯èƒ½ãƒ•ァイル)をå‚ç…§ã—ã¾ã™ã€‚"/> +			<line_editor name="executable_path_field" tool_tip="フãƒãƒ¼ã‚¿ãƒ¼XMLファイルを編集ã™ã‚‹ãŸã‚ã®ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ï¼ˆå®Ÿè¡Œå¯èƒ½ãƒ•ァイル)ã¸ã®ãƒ•ルパス。(引用符ã¯å¿…è¦ã‚りã¾ã›ã‚“)"/> +			<button follows="left|bottom" label="ブラウズ…" label_selected="ブラウズ…" name="browse_for_executable" tool_tip="フãƒãƒ¼ã‚¿ãƒ¼XMLファイルを編集ã™ã‚‹ãŸã‚ã®ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ï¼ˆå®Ÿè¡Œå¯èƒ½ãƒ•ァイル)をå‚ç…§ã—ã¾ã™ã€‚"/>  			<text name="executable_args_label">  				エディタã®å¼•数:  			</text> @@ -46,7 +46,7 @@  			<text name="diff_file_label">  				差分ファイル:  			</text> -			<line_editor name="vlt_diff_path_field" tool_tip="Viewer Localization Toolkitã«ã‚ˆã£ã¦ç”Ÿæˆã•れãŸï¼¸ï¼ï¼¬ã®D0ã€D1言語差分ファイルã¸ã®ãƒ•ルパス"/> +			<line_editor name="vlt_diff_path_field" tool_tip="Viewer Localization Toolkitã«ã‚ˆã£ã¦ç”Ÿæˆã•れãŸXMLã®D0ã€D1言語差分ファイルã¸ã®ãƒ•ルパス"/>  			<button label="ブラウズ…" label_selected="ブラウズ…" name="browse_for_vlt_diffs" tool_tip="VLTã§ç”Ÿæˆã•れãŸD0ã€D1差分ファイルをå‚ç…§ã—ã¦ã€å¤‰æ›´ã•れãŸãƒ•ァイルã¨è¦ç´ ã‚’強調表示ã—ã¾ã™ã€‚"/>  			<button label="差分をãƒã‚¤ãƒ©ã‚¤ãƒˆ" label_selected="ãƒã‚¤ãƒ©ã‚¤ãƒˆã‚’解除" name="toggle_vlt_diff_highlight" tool_tip="変更ã•れãŸè¨€èªžãƒ‡ãƒ¼ã‚¿ã‚’å«ã‚€ãƒ•ァイルã¨è¦ç´ ã®å¼·èª¿è¡¨ç¤ºã‚’切り替ãˆã¾ã™ã€‚"/>  		</panel> diff --git a/indra/newview/skins/default/xui/ja/floater_url_entry.xml b/indra/newview/skins/default/xui/ja/floater_url_entry.xml index 3ff50854a5..534e0156c5 100644 --- a/indra/newview/skins/default/xui/ja/floater_url_entry.xml +++ b/indra/newview/skins/default/xui/ja/floater_url_entry.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="url_entry">  	<text name="media_label"> -		メディアURL: +		メディアURL:  	</text>  	<combo_box name="media_entry"/>  	<button label="OK" name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml index be59547bf3..fd8e75da87 100644 --- a/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml +++ b/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml @@ -1,9 +1,9 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="whitelist_entry" title="ホワイトリストã®å…¥åŠ›">  	<text name="media_label"> -		URLã‹ï¼µï¼²ï¼¬ãƒ‘ターンを入力ã—ã¦ã€è¨±å¯ã™ã‚‹ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’リストã«è¿½åŠ ã—ã¾ã™ã€‚ +		URLã‹URLパターンを入力ã—ã¦ã€è¨±å¯ã™ã‚‹ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’リストã«è¿½åŠ ã—ã¾ã™ã€‚  	</text> -	<line_editor name="whitelist_entry" tool_tip="URLã‹ï¼µï¼²ï¼¬ãƒ‘ターンをホワイトリストã«å…¥åŠ›ã—ã¾ã™ã€‚"/> +	<line_editor name="whitelist_entry" tool_tip="URLã‹URLパターンをホワイトリストã«å…¥åŠ›ã—ã¾ã™ã€‚"/>  	<button label="OK" name="ok_btn"/>  	<button label="ã‚ャンセル" name="cancel_btn"/>  </floater> diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml index 284449d59d..87f469f91d 100644 --- a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml @@ -2,7 +2,7 @@  <context_menu name="Avatar Pie">  	<menu_item_call label="プãƒãƒ•ィールを見る" name="Profile..."/>  	<menu_item_call label="フレンドã«è¿½åŠ " name="Add Friend"/> -	<menu_item_call label="Iï¼" name="Send IM..."/> +	<menu_item_call label="IM" name="Send IM..."/>  	<menu_item_call label="コール" name="Call"/>  	<menu_item_call label="ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‹›å¾……" name="Invite..."/>  	<menu_item_separator/> @@ -14,7 +14,7 @@  	<menu_item_call label="フリーズ" name="Freeze..."/>  	<menu_item_call label="追放" name="Eject..."/>  	<menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/> -	<menu_item_call label="Xï¼ï¼¬ã¨ã—ã¦ãƒ€ãƒ³ãƒ—" name="Dump XML"/> +	<menu_item_call label="XMLã¨ã—ã¦ãƒ€ãƒ³ãƒ—" name="Dump XML"/>  	<menu_item_call label="ズームイン" name="Zoom In"/>  	<menu_item_call label="支払ã†" name="Pay..."/>  	<menu_item_separator/> diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml index a7989b35c8..0a022d16a1 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml @@ -2,7 +2,7 @@  <context_menu name="Avatar Pie">  	<menu_item_call label="プãƒãƒ•ィールを見る" name="Profile..."/>  	<menu_item_call label="フレンドã«è¿½åŠ " name="Add Friend"/> -	<menu_item_call label="Iï¼" name="Send IM..."/> +	<menu_item_call label="IM" name="Send IM..."/>  	<menu_item_call label="コール" name="Call"/>  	<menu_item_call label="ã‚°ãƒ«ãƒ¼ãƒ—ã¸æ‹›å¾…" name="Invite..."/>  	<menu_item_separator/> @@ -14,7 +14,7 @@  	<menu_item_call label="フリーズ" name="Freeze..."/>  	<menu_item_call label="追放" name="Eject..."/>  	<menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/> -	<menu_item_call label="Xï¼ï¼¬ã¨ã—ã¦ãƒ€ãƒ³ãƒ—" name="Dump XML"/> +	<menu_item_call label="XMLã¨ã—ã¦ãƒ€ãƒ³ãƒ—" name="Dump XML"/>  	<menu_item_call label="ズームイン" name="Zoom In"/>  	<menu_item_call label="支払ã†" name="Pay..."/>  	<menu_item_separator/> diff --git a/indra/newview/skins/default/xui/ja/menu_conversation.xml b/indra/newview/skins/default/xui/ja/menu_conversation.xml index 047f5d57cf..163feb5b56 100644 --- a/indra/newview/skins/default/xui/ja/menu_conversation.xml +++ b/indra/newview/skins/default/xui/ja/menu_conversation.xml @@ -5,7 +5,7 @@  	<menu_item_call label="ボイスãƒãƒ£ãƒƒãƒˆã‚’切æ–ã™ã‚‹" name="disconnect_from_voice"/>  	<menu_item_call label="é¸æŠžã—ãŸé …目を閉ã˜ã‚‹" name="close_selected_conversations"/>  	<menu_item_call label="プãƒãƒ•ィールを表示" name="view_profile"/> -	<menu_item_call label="Iï¼" name="im"/> +	<menu_item_call label="IM" name="im"/>  	<menu_item_call label="テレãƒãƒ¼ãƒˆã®ã‚ªãƒ•ァー" name="offer_teleport"/>  	<menu_item_call label="ボイスコール" name="voice_call"/>  	<menu_item_call label="ãƒãƒ£ãƒƒãƒˆã®å±¥æ´â€¦" name="chat_history"/> diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml index 78c46d13b4..438b0c304b 100644 --- a/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <toggleable_menu name="Conversation Context Menu"> -	<menu_item_call label="Iï¼â€¦" name="IM"/> +	<menu_item_call label="IM..." name="IM"/>  	<menu_item_call label="ボイスコール…" name="Call"/>  	<menu_item_call label="ãƒãƒ£ãƒƒãƒˆã®å±¥æ´ã‚’é–‹ã…" name="Chat history"/>  	<menu_item_call label="プãƒãƒ•ィールを表示" name="View Profile"/> diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml index bcda112d2f..2012eb88cc 100644 --- a/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml @@ -3,5 +3,5 @@  	<menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_name"/>  	<menu_item_check label="日付ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_date"/>  	<menu_item_check label="上ä½ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’ä¸¦ã¹æ›¿ãˆ" name="sort_by_friends"/> -	<menu_item_call label="近隣ãƒãƒ£ãƒƒãƒˆã®å±¥æ´ã‚’表示…" name="view_nearby_chat_history"/> +	<menu_item_call label="ãƒãƒ£ãƒƒãƒˆå±¥æ´ã‚’表示…" name="view_nearby_chat_history"/>  </toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml b/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml index e1f24cdb39..3a8fd36ceb 100644 --- a/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml @@ -4,7 +4,7 @@  	<menu_item_call label="åå‰å¤‰æ›´" name="rename"/>  	<menu_item_call label="コピー" name="copy_gesture"/>  	<menu_item_call label="ペースト" name="paste"/> -	<menu_item_call label="UUIDをコピー" name="copy_uuid"/> +	<menu_item_call label="UUIDをコピー" name="copy_uuid"/>  	<menu_item_call label="ç¾åœ¨ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã«ä¿å˜" name="save_to_outfit"/>  	<menu_item_call label="編集" name="edit_gesture"/>  	<menu_item_call label="調ã¹ã‚‹" name="inspect"/> diff --git a/indra/newview/skins/default/xui/ja/menu_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml index c7cba4845d..d602823fe4 100644 --- a/indra/newview/skins/default/xui/ja/menu_inventory.xml +++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml @@ -82,7 +82,7 @@  	<menu_item_call label="オリジナルを開ã" name="Open Original"/>  	<menu_item_call label="プãƒãƒ‘ティ" name="Properties"/>  	<menu_item_call label="åå‰ã‚’変更" name="Rename"/> -	<menu_item_call label="アセットã®ï¼µï¼µï¼©ï¼¤ã‚’コピー" name="Copy Asset UUID"/> +	<menu_item_call label="アセットã®UUIDをコピー" name="Copy Asset UUID"/>  	<menu_item_call label="メインパãƒãƒ«ã§è¡¨ç¤º" name="Show in Main Panel"/>  	<menu_item_call label="カット" name="Cut"/>  	<menu_item_call label="コピー" name="Copy"/> @@ -113,7 +113,7 @@  	<menu_item_separator name="Wearable And Object Separator"/>  	<menu_item_call label="装ç€" name="Wearable And Object Wear"/>  	<menu label="装ç€å…ˆ" name="Attach To"/> -	<menu label="HUD 装ç€å…ˆ" name="Attach To HUD"/> +	<menu label="HUDã®è£…ç€å…ˆ" name="Attach To HUD"/>  	<menu_item_call label="触る" name="Attachment Touch"/>  	<menu_item_call label="編集" name="Wearable Edit"/>  	<menu_item_call label="追加" name="Wearable Add"/> diff --git a/indra/newview/skins/default/xui/ja/menu_participant_list.xml b/indra/newview/skins/default/xui/ja/menu_participant_list.xml index ebce5f7e6b..5756e3f8b5 100644 --- a/indra/newview/skins/default/xui/ja/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/ja/menu_participant_list.xml @@ -4,7 +4,7 @@  	<menu_item_check label="最近ã®ç™ºè¨€è€…ã§ä¸¦ã¹æ›¿ãˆ" name="SortByRecentSpeakers"/>  	<menu_item_call label="プãƒãƒ•ィールã®è¡¨ç¤º" name="View Profile"/>  	<menu_item_call label="フレンド登録" name="Add Friend"/> -	<menu_item_call label="Iï¼" name="IM"/> +	<menu_item_call label="IM" name="IM"/>  	<menu_item_call label="コール" name="Call"/>  	<menu_item_call label="共有" name="Share"/>  	<menu_item_call label="支払ã†" name="Pay"/> diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml index bbe842a37e..13c940abf4 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <context_menu name="Avatar Context Menu">  	<menu_item_call label="プãƒãƒ•ィールを表示" name="view_profile"/> -	<menu_item_call label="Iï¼" name="im"/> +	<menu_item_call label="IM" name="im"/>  	<menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="offer_teleport"/>  	<menu_item_call label="ボイスコール" name="voice_call"/>  	<menu_item_call label="ãƒãƒ£ãƒƒãƒˆã®å±¥æ´ã‚’表示…" name="chat_history"/> diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml index 4e3dbd3279..e8b8f0f694 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml @@ -2,7 +2,7 @@  <context_menu name="Multi-Selected People Context Menu">  	<menu_item_call label="フレンド登録" name="add_friends"/>  	<menu_item_call label="フレンドを削除" name="remove_friends"/> -	<menu_item_call label="Iï¼" name="im"/> +	<menu_item_call label="IM" name="im"/>  	<menu_item_call label="コール" name="call"/>  	<menu_item_call label="共有" name="share"/>  	<menu_item_call label="支払ã„" name="pay"/> diff --git a/indra/newview/skins/default/xui/ja/menu_profile_other.xml b/indra/newview/skins/default/xui/ja/menu_profile_other.xml index 0247a60803..9803735afc 100644 --- a/indra/newview/skins/default/xui/ja/menu_profile_other.xml +++ b/indra/newview/skins/default/xui/ja/menu_profile_other.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <toggleable_menu name="Avatar Profile Menu"> -	<menu_item_call label="Iï¼" name="im"/> +	<menu_item_call label="IM" name="im"/>  	<menu_item_call label="テレãƒãƒ¼ãƒˆã®ã‚ªãƒ•ァー" name="offer_teleport"/>  	<menu_item_call label="テレãƒãƒ¼ãƒˆã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆ" name="request_teleport"/>  	<menu_item_call label="ボイスコール" name="voice_call"/> @@ -19,5 +19,5 @@  	<menu_item_separator name="separator_copy_options"/>  	<menu_item_call label="表示åをコピー" name="copy_display_name"/>  	<menu_item_call label="エージェントåをコピー" name="copy_name"/> -	<menu_item_call label="エージェントIDをコピー" name="copy_id"/> +	<menu_item_call label="エージェントIDをコピー" name="copy_id"/>  </toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_profile_self.xml b/indra/newview/skins/default/xui/ja/menu_profile_self.xml index 7c9570378e..f39593e417 100644 --- a/indra/newview/skins/default/xui/ja/menu_profile_self.xml +++ b/indra/newview/skins/default/xui/ja/menu_profile_self.xml @@ -8,5 +8,5 @@  	<menu_item_separator name="separator_copy_options"/>  	<menu_item_call label="表示åをコピー" name="copy_display_name"/>  	<menu_item_call label="エージェントåをコピー" name="copy_name"/> -	<menu_item_call label="エージェントIDをコピー" name="copy_id"/> +	<menu_item_call label="エージェントIDをコピー" name="copy_id"/>  </toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_settings_gear.xml b/indra/newview/skins/default/xui/ja/menu_settings_gear.xml index a8ff0d3721..3f5d30073b 100644 --- a/indra/newview/skins/default/xui/ja/menu_settings_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_settings_gear.xml @@ -6,5 +6,5 @@  	<menu_item_call label="リージョン(地域)ã«é©ç”¨" name="Settings Apply Region"/>  	<menu_item_call label="コピー" name="copy_settings"/>  	<menu_item_call label="ペースト" name="paste_settings"/> -	<menu_item_call label="UUIDをコピー" name="copy_uuid"/> +	<menu_item_call label="UUIDをコピー" name="copy_uuid"/>  </toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_slurl.xml b/indra/newview/skins/default/xui/ja/menu_slurl.xml index 820cc3cd53..e68128e429 100644 --- a/indra/newview/skins/default/xui/ja/menu_slurl.xml +++ b/indra/newview/skins/default/xui/ja/menu_slurl.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <menu name="Popup"> -	<menu_item_call label="URLã«ã¤ã„ã¦" name="about_url"/> -	<menu_item_call label="URLã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹" name="teleport_to_url"/> +	<menu_item_call label="URLã«ã¤ã„ã¦" name="about_url"/> +	<menu_item_call label="URLã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹" name="teleport_to_url"/>  	<menu_item_call label="マップ" name="show_on_map"/>  </menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_agent.xml b/indra/newview/skins/default/xui/ja/menu_url_agent.xml index 9ce9a070f2..d06f4896b2 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_agent.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <context_menu name="Url Popup">  	<menu_item_call label="プãƒãƒ•ィールを表示" name="show_agent"/> -	<menu_item_call label="Iï¼ã‚’é€ä¿¡â€¦" name="send_im"/> +	<menu_item_call label="IMã‚’é€ä¿¡â€¦" name="send_im"/>  	<menu_item_call label="フレンドを追加…" name="add_friend"/>  	<menu_item_call label="フレンドを削除…" name="remove_friend"/>  	<menu_item_call label="嫌ãŒã‚‰ã›ã®å ±å‘Š" name="report_abuse"/> diff --git a/indra/newview/skins/default/xui/ja/menu_url_http.xml b/indra/newview/skins/default/xui/ja/menu_url_http.xml index ae97e8bd8d..c3da8a8686 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_http.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_http.xml @@ -3,5 +3,5 @@  	<menu_item_call label="Web ページを開ã" name="url_open"/>  	<menu_item_call label="内蔵ブラウザã§é–‹ã" name="url_open_internal"/>  	<menu_item_call label="外部ブラウザã§é–‹ã" name="url_open_external"/> -	<menu_item_call label="URLをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> +	<menu_item_call label="URLをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>  </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml index f6b10bb121..41df8fdbb1 100644 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -17,7 +17,7 @@  		<menu_item_call label="アカウントã®ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰â€¦" name="Manage My Account"/>  		<menu_item_call label="[Membership]" name="Membership"/>  		<menu_item_separator/> -		<menu_item_call label="åˆæœŸè¨å®šâ€¦" name="Preferences"/> +		<menu_item_call label="環境è¨å®šâ€¦" name="Preferences"/>  		<menu_item_call label="ツールãƒãƒ¼ã®ãƒœã‚¿ãƒ³â€¦" name="Toolbars"/>  		<menu_item_call label="å…¨ã¦ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’éš ã™" name="Hide UI" shortcut="control|shift|U"/>  		<menu_item_check label="HUDを表示" name="Show HUD Attachments" shortcut="alt|shift|H"/> @@ -47,7 +47,7 @@  				<menu_item_separator/>  				<menu_item_call label="ã™ã¹ã¦ã®æœè£…" name="All Clothes"/>  			</menu> -			<menu label="HUD" name="Avatar Detach HUD"/> +			<menu label="HUD" name="Avatar Detach HUD"/>  			<menu label="å–り外ã™" name="Avatar Detach"/>  			<menu_item_call label="å…¨ã¦ã‚’å–り外ã™" name="Detach All"/>  		</menu> @@ -70,7 +70,7 @@  	</menu>  	<menu label="コミュニケーション" name="Communicate">  		<menu_item_check label="会話…" name="Conversations"/> -		<menu_item_check label="近隣ã®ãƒãƒ£ãƒƒãƒˆâ€¦" name="Nearby Chat"/> +		<menu_item_check label="周辺ãƒãƒ£ãƒƒãƒˆâ€¦" name="Nearby Chat"/>  		<menu_item_check label="ボイスãƒãƒ£ãƒƒãƒˆ" name="Speak"/>  		<menu_item_check name="Conversation Log..." label="会話ãƒã‚°â€¦"/>  		<menu_item_separator/> @@ -95,7 +95,7 @@  		<menu_item_call label="ç¾åœ¨åœ°ã‚’ホームã«è¨å®š" name="Set Home to Here"/>  		<menu_item_separator/>  		<menu_item_call label="スナップショット" name="Take Snapshot"/> -		<menu_item_call label="36ï¼åº¦ã‚¹ãƒŠãƒƒãƒ—ショット" name="Capture 360"/> +		<menu_item_call label="360度スナップショット" name="Capture 360"/>  		<menu_item_separator/>  		<menu_item_call label="場所ã®ãƒ—ãƒãƒ•ィール" name="Place Profile"/>  		<menu_item_call label="土地情報" name="About Land"/> @@ -112,14 +112,14 @@  			<menu_item_check label="座標" name="Coordinates"/>  			<menu_item_check label="区画ã®ãƒ—ãƒãƒ‘ティ" name="Parcel Properties"/>  			<menu_item_separator/> -			<menu_item_check label="拡張メニュー" name="Show Advanced Menu"/> +			<menu_item_check label="アドãƒãƒ³ã‚¹ãƒ¡ãƒ‹ãƒ¥ãƒ¼" name="Show Advanced Menu"/>  		</menu>  		<menu_item_check label="ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯æ€§èƒ½ã®æœ€é©åŒ–…" name="Performance"/>  		<menu_item_separator/>  		<menu label="環境" name="Environment"> -			<menu_item_check label="夜明ã‘" name="Sunrise"/> +			<menu_item_check label="æ—¥ã®å‡º" name="Sunrise"/>  			<menu_item_check label="æ£åˆ" name="Noon"/> -			<menu_item_check label="夕方" name="Sunset"/> +			<menu_item_check label="日没" name="Sunset"/>  			<menu_item_check label="深夜" name="Midnight"/>  			<menu_item_check label="共有ã•れãŸç’°å¢ƒã‚’使用" name="Use Shared Environment"/>  			<menu_item_separator/> @@ -188,7 +188,7 @@  			<menu_item_check label="é¸æŠžãƒ“ãƒ¼ãƒ ã‚’è¡¨ç¤ºã™ã‚‹" name="Show Selection Beam"/>  			<menu_item_separator/>  			<menu_item_check label="グリッドå¸ç€" name="Snap to Grid"/> -			<menu_item_call label="オブジェクトã®ï¼¸ï¼¹è»¸ã‚’グリッドã«å¸ç€" name="Snap Object XY to Grid"/> +			<menu_item_call label="オブジェクトã®XY軸をグリッドã«å¸ç€" name="Snap Object XY to Grid"/>  			<menu_item_call label="é¸æŠžã‚’ã‚°ãƒªãƒƒãƒ‰ã«ä½¿ç”¨ã™ã‚‹" name="Use Selection for Grid"/>  			<menu_item_separator/>  			<menu_item_call label="グリッドオプション…" name="Grid Options"/> @@ -221,9 +221,9 @@  		<menu_item_call label="è¡çªãƒ»ãƒ—ッシュ&打撃" name="Bumps, Pushes &amp; Hits"/>  		<menu_item_call label="[APP_NAME]ã«ã¤ã„ã¦" name="About Second Life"/>  	</menu> -	<menu label="æ‹¡å¼µ" name="Advanced"> +	<menu label="アドãƒãƒ³ã‚¹" name="Advanced">  		<menu_item_call label="テクスãƒãƒ£ã‚’リベークã™ã‚‹" name="Rebake Texture"/> -		<menu_item_call label="UIサイズをデフォルトã«ã™ã‚‹" name="Set UI Size to Default"/> +		<menu_item_call label="UIサイズをデフォルトã«ã™ã‚‹" name="Set UI Size to Default"/>  		<menu_item_call label="ウィンドウサイズè¨å®šâ€¦" name="Set Window Size..."/>  		<menu_item_separator/>  		<menu_item_check label="オブジェクトã®é¸æŠžè·é›¢ã®åˆ¶é™" name="Limit Select Distance"/> @@ -233,7 +233,7 @@  		<menu_item_check label="スナップショットをディスクã«ä¿å˜" name="QuietSnapshotsToDisk"/>  		<menu_item_separator/>  		<menu label="パフォーマンスツール" name="Performance Tools"> -			<menu_item_call label="é…延メーター" name="Lag Meter"/> +			<menu_item_call label="ラグメーター" name="Lag Meter"/>  			<menu_item_check label="統計ãƒãƒ¼" name="Statistics Bar"/>  			<menu_item_call label="シーン負è·ã®çµ±è¨ˆæƒ…å ±" name="Scene Load Statistics"/>  			<menu_item_check label="ã‚¢ãƒã‚¿ãƒ¼ã®è¤‡é›‘度を表示" name="Avatar Draw Info"/> @@ -262,7 +262,7 @@  			<menu_item_check label="è¡çª" name="Rendering Type Bump"/>  		</menu>  		<menu label="レンダリング機能" name="Rendering Features"> -			<menu_item_check label="UI" name="ToggleUI"/> +			<menu_item_check label="UI" name="ToggleUI"/>  			<menu_item_check label="é¸æŠžæ¸ˆ" name="Selected"/>  			<menu_item_check label="ãƒã‚¤ãƒ©ã‚¤ãƒˆ" name="Highlighted"/>  			<menu_item_check label="動的テクスãƒãƒ£" name="Dynamic Textures"/> @@ -313,7 +313,7 @@  			<menu_item_separator/>  			<menu_item_check label="カメラ" name="Camera"/>  			<menu_item_check label="風" name="Wind"/> -			<menu_item_check label="FOV" name="FOV"/> +			<menu_item_check label="FOV" name="FOV"/>  			<menu_item_check label="ãƒãƒƒã‚¸" name="Badge"/>  		</menu>  		<menu label="情報を表示" name="Display Info"> @@ -352,7 +352,7 @@  		</menu>  		<menu label="ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã®æç”»" name="Render Metadata">  			<menu_item_check label="ãƒã‚¦ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãƒœãƒƒã‚¯ã‚¹" name="Bounding Boxes"/> -			<menu_item_check label="普通" name="Normals"/> +			<menu_item_check label="法線" name="Normals"/>  			<menu_item_check label="八分木" name="Octree"/>  			<menu_item_check label="シャドウ円éŒ" name="Shadow Frusta"/>  			<menu_item_check label="実åƒ" name="Physics Shapes"/> @@ -363,7 +363,7 @@  			<menu_item_check label="テクスãƒãƒ£å„ªå…ˆåº¦" name="Texture Priority"/>  			<menu_item_check label="テクスãƒãƒ£ã®ç¯„囲" name="Texture Area"/>  			<menu_item_check label="å´é¢" name="Face Area"/> -			<menu_item_check label="LOD情報" name="LOD Info"/> +			<menu_item_check label="LOD情報" name="LOD Info"/>  			<menu_item_check label="ä¸‰è§’å½¢ã®æ•°" name="Triangle Count"/>  			<menu_item_check label="制作・ã‚ュー" name="Build Queue"/>  			<menu_item_check label="å…‰" name="Lights"/> @@ -372,7 +372,7 @@  			<menu_item_check label="ジョイント" name="Joints"/>  			<menu_item_check label="レイã‚ャスト" name="Raycast"/>  			<menu_item_check label="風ã®ãƒ™ã‚¯ãƒˆãƒ«" name="Wind Vectors"/> -			<menu_item_check label="彫刻" name="Sculpt"/> +			<menu_item_check label="スカルプト" name="Sculpt"/>  			<menu label="テクスãƒãƒ£ã®å¯†åº¦" name="Texture Density">  				<menu_item_check label="ç„¡ã—" name="None"/>  				<menu_item_check label="原行" name="Current"/> @@ -389,10 +389,10 @@  			<menu_item_check label="オブジェクト間ã®ã‚ªã‚¯ãƒ«ãƒ¼ã‚¸ãƒ§ãƒ³" name="Object-Object Occlusion"/>  			<menu_item_separator/>  			<menu_item_check label="高度ãªå…‰æºãƒ¢ãƒ‡ãƒ«" name="Advanced Lighting Model"/> -			<menu_item_check label=" 太陽・月・プãƒã‚¸ã‚§ã‚¯ã‚¿ã‹ã‚‰ã®å½±" name="Shadows from Sun/Moon/Projectors"/> -			<menu_item_check label=" SSAOã¨å½±ã®ã‚¹ãƒ ãƒ¼ã‚¸ãƒ³ã‚°" name="SSAO and Shadow Smoothing"/> +			<menu_item_check label="   太陽・月・プãƒã‚¸ã‚§ã‚¯ã‚¿ã‹ã‚‰ã®å½±" name="Shadows from Sun/Moon/Projectors"/> +			<menu_item_check label="   SSAOã¨å½±ã®ã‚¹ãƒ ãƒ¼ã‚¸ãƒ³ã‚°" name="SSAO and Shadow Smoothing"/>  			<menu_item_separator/> -			<menu_item_check label="次回起動時ã«ï¼§ï¼¬ã‚’デãƒãƒƒã‚°" name="Debug GL"/> +			<menu_item_check label="次回起動時ã«GLã®ãƒ‡ãƒãƒƒã‚°ã‚’é–‹å§‹" name="Debug GL"/>  			<menu_item_check label="パイプラインをデãƒãƒƒã‚°" name="Debug Pipeline"/>  			<menu_item_check label="自動アルファマスク(é…延)" name="Automatic Alpha Masks (deferred)"/>  			<menu_item_check label="自動アルファマスク(é…å»¶ãªã—)" name="Automatic Alpha Masks (non-deferred)"/> @@ -439,7 +439,7 @@  			<menu_item_call label="リージョンオブジェクトã®ã‚ャッシュをダンプ" name="Dump Region Object Cache"/>  			<menu_item_call label="関心リスト:フルアップデート" name="Interest List: Full Update"/>  		</menu> -		<menu label="UI" name="UI"> +		<menu label="UI" name="UI">  			<menu_item_call label="メディアブラウザ" name="Media Browser"/>  			<menu_item_call label="インベントリã®å‡ºåŠ›" name="Dump Inventory"/>  			<menu_item_call label="タイマーをダンプ" name="Dump Timers"/> @@ -455,15 +455,15 @@  			<menu_item_check label="デãƒãƒƒã‚°ã‚ー" name="Debug Keys"/>  			<menu_item_check label="WindowProcã®ãƒ‡ãƒãƒƒã‚°" name="Debug WindowProc"/>  		</menu> -		<menu label="XUI" name="XUI"> +		<menu label="XUI" name="XUI">  			<menu_item_call label="色ã®è¨å®šã‚’リãƒãƒ¼ãƒ‰" name="Reload Color Settings"/>  			<menu_item_call label="フォントテストを表示" name="Show Font Test"/> -			<menu_item_check label="XUIåを表示" name="Show XUI Names"/> -			<menu_item_call label="テストIï¼ã‚’é€ä¿¡ã™ã‚‹" name="Send Test IMs"/> +			<menu_item_check label="XUIåを表示" name="Show XUI Names"/> +			<menu_item_call label="テストIMã‚’é€ä¿¡ã™ã‚‹" name="Send Test IMs"/>  			<menu_item_call label="åå‰ã‚ャッシュをフラッシュ" name="Flush Names Caches"/>  		</menu> -		<menu label="ã‚¢ãƒã‚¿ãƒ¼" name="Character"> -			<menu label="ベークドテクスãƒãƒ£ã‚’å–å¾—ã™ã‚‹" name="Grab Baked Texture"> +		<menu label="ã‚ャラクター" name="Character"> +			<menu label="ベイク済ã¿ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’å–å¾—ã™ã‚‹" name="Grab Baked Texture">  				<menu_item_call label="çž³" name="Grab Iris"/>  				<menu_item_call label="é " name="Grab Head"/>  				<menu_item_call label="上åŠèº«" name="Grab Upper Body"/> @@ -488,7 +488,7 @@  			<menu_item_check label="見ã¦ã„ã‚‹ã‚‚ã®ã‚’表示ã™ã‚‹" name="Show Look At"/>  			<menu_item_check label="クリックã—ãŸå ´æ‰€ã‚’表示ã™ã‚‹" name="Show Point At"/>  			<menu_item_check label="çµåˆéƒ¨ã®ã‚¢ãƒƒãƒ—デートã®ãƒ‡ãƒãƒƒã‚°" name="Debug Joint Updates"/> -			<menu_item_check label="LODを無効ã«ã™ã‚‹" name="Disable LOD"/> +			<menu_item_check label="LODを無効ã«ã™ã‚‹" name="Disable LOD"/>  			<menu_item_check label="ã‚ャラクターVisã®ãƒ‡ãƒãƒƒã‚°" name="Debug Character Vis"/>  			<menu_item_check label="スケルトンã®è¡çªåˆ¤å®šã‚’表示ã™ã‚‹" name="Show Collision Skeleton"/>  			<menu_item_check label="ボーンを表示" name="Show Bones"/> @@ -499,7 +499,7 @@  			<menu_item_call label="ãƒãƒ¼ã‚«ãƒ«ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’ダンプ" name="Dump Local Textures"/>  		</menu>  		<menu_item_separator/> -		<menu_item_check label="HTTPテスクãƒãƒ£" name="HTTP Textures"/> +		<menu_item_check label="HTTPテスクãƒãƒ£" name="HTTP Textures"/>  		<menu_item_call label="圧縮画åƒ" name="Compress Images"/>  		<menu_item_call label="圧縮ファイルテスト" name="Compress File Test"/>  		<menu_item_call label="Visual Leak Detectorを有効ã«ã™ã‚‹" name="Enable Visual Leak Detector"/> @@ -517,14 +517,14 @@  		<menu_item_call label="管ç†è€…ステータス解除" name="Leave Admin Options"/>  		<menu_item_check label="管ç†è€…メニューを表示ã™ã‚‹" name="View Admin Options"/>  	</menu> -	<menu label="管ç†" name="Admin"> +	<menu label="管ç†è€…" name="Admin">  		<menu label="オブジェクト" name="AdminObject">  			<menu_item_call label="コピーをå–ã‚‹" name="Admin Take Copy"/>  			<menu_item_call label="自分を所有者ã«ã™ã‚‹" name="Force Owner To Me"/>  			<menu_item_call label="所有者権é™ã®å®Ÿè¡Œ" name="Force Owner Permissive"/>  			<menu_item_call label="削除" name="Delete"/>  			<menu_item_call label="ãƒãƒƒã‚¯" name="Lock"/> -			<menu_item_call label="アセットã®ï¼©ï¼¤ã‚’å–å¾—" name="Get Assets IDs"/> +			<menu_item_call label="アセットã®IDã‚’å–å¾—" name="Get Assets IDs"/>  		</menu>  		<menu label="区画" name="Parcel">  			<menu_item_call label="自分を所有者ã«ã™ã‚‹" name="Owner To Me"/> diff --git a/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml index 213a554bbd..2c13d50226 100644 --- a/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml +++ b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml @@ -6,8 +6,8 @@  	<menu_item_call label="触る" name="touch"/>  	<menu_item_call label="脱ã" name="take_off_or_detach"/>  	<menu_item_call label="å–り外ã™" name="detach"/> -	<context_menu label="装ç€ï¼š" name="wearable_attach_to"/> -	<context_menu label="HUDã«è£…ç€" name="wearable_attach_to_hud"/> +	<context_menu label="装ç€" name="wearable_attach_to"/> +	<context_menu label="HUDã«è£…ç€" name="wearable_attach_to_hud"/>  	<menu_item_call label="å–り外ã™" name="take_off"/>  	<menu_item_call label="編集" name="edit"/>  	<menu_item_call label="アイテムã®ãƒ—ãƒãƒ•ィール" name="object_profile"/> diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index 123e95df04..9ec7a0de98 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -451,7 +451,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ã  	</notification>  	<notification name="CreateGroupCost">ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—作æˆã«ã‹ã‹ã‚‹è²»ç”¨ï¼šL$ [COST]  一人ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã«ãªã‚‰ãªã„ã®ã§ã€æ°¸ä¹…ã«å‰Šé™¤ã•れã¦ã—ã¾ã„ã¾ã™ã€‚ -48時間以内ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’勧誘ã—ã€å…¥ä¼šã—ã¦ã‚‚らã£ã¦ãã ã•ã„。 +48時間以内ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’勧誘ã—ã€å…¥ä¼šã—ã¦ã‚‚らã£ã¦ãã ã•ã„。      <tag>  			group  		</tag> @@ -1260,7 +1260,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ã  			fail  		</tag>  	</notification> -	<notification name="SoundFileInvalidTooLong">オーディオファイルãŒé•·ã™ãŽã¾ã™ã€‚(最大1ï¼ç§’): +	<notification name="SoundFileInvalidTooLong">オーディオファイルãŒé•·ã™ãŽã¾ã™ã€‚(最大30秒):  [FILE]      <tag>  			fail @@ -1411,7 +1411,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ã  			fail  		</tag>  	</notification> -	<notification name="invalid_tport">テレãƒãƒ¼ãƒˆã®è©¦è¡Œã¯ï¼‘分間ã«ï¼–回ã¾ã§ã¨åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚1分待ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¦ã¿ã¦ãã ã•ã„。å•題ãŒè§£æ±ºã—ãªã„å ´åˆã¯ã€ãƒã‚°ã‚¤ãƒ³ã—ç›´ã—ã¦ãã ã•ã„。 +	<notification name="invalid_tport">テレãƒãƒ¼ãƒˆã®è©¦è¡Œã¯1分間ã«6回ã¾ã§ã¨åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚1分待ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¦ã¿ã¦ãã ã•ã„。å•題ãŒè§£æ±ºã—ãªã„å ´åˆã¯ã€ãƒã‚°ã‚¤ãƒ³ã—ç›´ã—ã¦ãã ã•ã„。      <tag>  			fail  		</tag> @@ -1735,7 +1735,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ã  		</tag>  	</notification>  	<notification name="YouHaveBeenLoggedOut">ã—ã¾ã£ãŸã€[SECOND_LIFE]ã‹ã‚‰ãƒã‚°ã‚¢ã‚¦ãƒˆã•れã¦ã—ã¾ã„ã¾ã—ãŸã€‚[MESSAGE] -    <usetemplate name="okcancelbuttons" notext="終了" yestext="Iï¼ã§ãƒãƒ£ãƒƒãƒˆ"/> +    <usetemplate name="okcancelbuttons" notext="終了" yestext="IM & ãƒãƒ£ãƒƒãƒˆã‚’見る"/>  	</notification>  	<notification name="InventoryUnusable">インベントリã®èªã¿è¾¼ã¿ä¸ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã¾ãšã€ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã¦å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ç›´ã—ã¦ã¿ã¦ãã ã•ã„。  ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå†åº¦è¡¨ç¤ºã•れる場åˆã¯ã€ã‚µãƒãƒ¼ãƒˆã«é€£çµ¡ã—ã¦å•題を解決ã—ã¦ãã ã•ã„。 @@ -2126,7 +2126,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries  				HUDComplexityWarning  			</context>  		</unique> -		<usetemplate ignoretext="HUDãŒè¤‡é›‘ã™ãŽã‚‹å ´åˆã®è¦å‘Š" name="notifyignore"/> +		<usetemplate ignoretext="HUDãŒè¤‡é›‘ã™ãŽã‚‹å ´åˆã®è¦å‘Š" name="notifyignore"/>  	</notification>  	<notification name="FirstRun">[APP_NAME]ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒå®Œäº†ã—ã¾ã—ãŸã€‚  [SECOND_LIFE]を使ã£ãŸã“ã¨ãŒãªã„å ´åˆã¯ã€ãƒã‚°ã‚¤ãƒ³ã™ã‚‹å‰ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆã‚’行ã£ã¦ãã ã•ã„。 @@ -2162,7 +2162,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries  		</form>  	</notification>  	<notification name="WelcomeChooseSex">ã¾ã‚‚ãªãã€ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ãŒè¡¨ç¤ºã•れã¾ã™ã€‚矢å°ã‚ーを使用ã—ã¦æ©ãã¾ã™ã€‚ -ヘルプãŒå¿…è¦ãªã¨ãã‚„ã€[SECOND_LIFE]ã«ã¤ã„ã¦çŸ¥ã‚ŠãŸã„ã¨ãã¯ã€ï¼¦ï¼‘ã‚ーを押ã—ã¦ãã ã•ã„。 +ヘルプãŒå¿…è¦ãªã¨ãã‚„ã€[SECOND_LIFE]ã«ã¤ã„ã¦çŸ¥ã‚ŠãŸã„ã¨ãã¯ã€F1ã‚ーを押ã—ã¦ãã ã•ã„。  男性ã‚ã‚‹ã„ã¯å¥³æ€§ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„。ã“ã®è¨å®šã¯å¾Œã§å¤‰æ›´ã§ãã¾ã™ã€‚      <tag>  			confirm @@ -2189,8 +2189,8 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries  発行元:[ISSUER_NAME_STRING]  有効日:[VALID_FROM]  æ¬¡ã®æ›´æ–°æ—¥ï¼š[VALID_TO] -ï¼ï¼¤ï¼•フィンガープリント:[SHA1_DIGEST] -SHA1フィンガープリント:[MD5_DIGEST] +MD5フィンガープリント:[SHA1_DIGEST] +SHA1フィンガープリント:[MD5_DIGEST]  ã‚ー使用法:[KEYUSAGE]   æ‹¡å¼µã‚ー使用法:[EXTENDEDKEYUSAGE]  サブジェクトã‚ーèªè˜åˆ¥å:[SUBJECTKEYIDENTIFIER] @@ -2201,15 +2201,15 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries  	</notification>  	<notification name="TrustCertificateError">ã“ã®ã‚µãƒ¼ãƒãƒ¼ã®èªè¨¼æ©Ÿé–¢ã¯ä¸æ˜Žã§ã™ã€‚  èªè¨¼æƒ…報: - サブジェクトå:[SUBJECT_NAME_STRING] - 発行元:[ISSUER_NAME_STRING] - 有効日:[VALID_FROM] -ã€€æ¬¡ã®æ›´æ–°æ—¥ï¼š[VALID_TO] - ï¼ï¼¤ï¼•フィンガープリント:[SHA1_DIGEST]  - SHA1フィンガープリント:[MD5_DIGEST] - ã‚ー使用法:[KEYUSAGE]  - 拡張ã‚ー使用法:[EXTENDEDKEYUSAGE]  - サブジェクトã‚ーèªè˜åˆ¥å:[SUBJECTKEYIDENTIFIER]  +サブジェクトå:[SUBJECT_NAME_STRING] +発行元:[ISSUER_NAME_STRING] +有効日:[VALID_FROM] +æ¬¡ã®æ›´æ–°æ—¥ï¼š[VALID_TO] +MD5フィンガープリント:[SHA1_DIGEST]  +SHA1フィンガープリント:[MD5_DIGEST] +ã‚ー使用法:[KEYUSAGE]  +æ‹¡å¼µã‚ー使用法:[EXTENDEDKEYUSAGE]  +サブジェクトã‚ーèªè˜åˆ¥å:[SUBJECTKEYIDENTIFIER]   ã“ã®èªè¨¼å±€ã‚’ä¿¡é ¼ã—ã¾ã™ã‹ï¼Ÿ      <tag> @@ -2232,7 +2232,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries  		[NAME]ã¯ã€ã‚ªãƒ–ジェクトを編集ã™ã‚‹æ¨©é™ã‚’å–り消ã•れã¾ã—ãŸã€‚  	</notification>  	<notification name="FlushMapVisibilityCaches">ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒžãƒƒãƒ—ã®ã‚ャッシュを消去ã—ã¾ã™ã€‚デãƒãƒƒã‚°ç›®çš„ã®ã¿ã«ä¾¿åˆ©ãªæ“作ã§ã™ã€‚ -(作æˆä¸ã¯ï¼•分経éŽã™ã‚‹ã¨ã€å…¨å“¡ã®ãƒžãƒƒãƒ—ãŒå†åº¦ãƒã‚°ã‚¤ãƒ³å¾Œã«æ›´æ–°ã•れã¾ã™ï¼‰ +(作æˆä¸ã¯5分経éŽã™ã‚‹ã¨ã€å…¨å“¡ã®ãƒžãƒƒãƒ—ãŒå†åº¦ãƒã‚°ã‚¤ãƒ³å¾Œã«æ›´æ–°ã•れã¾ã™ï¼‰      <tag>  			fail  		</tag> @@ -2281,7 +2281,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries  テクスãƒãƒ£ã¯ã€24ビットã®512✕512以下ã®ç”»åƒã‚’é¸æŠžã—ã€ã€Œé©ç”¨ã€ãƒœã‚¿ãƒ³ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。  	</notification>  	<notification name="RawUploadStarted"> -		アップãƒãƒ¼ãƒ‰ã‚’é–‹å§‹ã—ã¾ã—ãŸã€‚接続速度ã«ã‚ˆã£ã¦ã¯ã€æœ€å¤§ï¼’分程度ã‹ã‹ã‚Šã¾ã™ã€‚ +		アップãƒãƒ¼ãƒ‰ã‚’é–‹å§‹ã—ã¾ã—ãŸã€‚接続速度ã«ã‚ˆã£ã¦ã¯ã€æœ€å¤§2分程度ã‹ã‹ã‚Šã¾ã™ã€‚  	</notification>  	<notification name="ConfirmBakeTerrain">ç¾åœ¨ã®åœ°å½¢ã‚’構築ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®æ“作を行ã†ã¨ç¾åœ¨ã®åœ°å½¢ãŒã€åœŸåœ°ã®éš†èµ·ã¨æ²ˆé™ã®åˆ¶é™ç¯„囲ã®åŸºæº–ã¨ãªã‚Šã€ã€Œå¾©å…ƒã€ãƒ„ールã®ãƒ‡ãƒ•ォルトã«ãªã‚Šã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ      <tag> @@ -2606,7 +2606,7 @@ OKをクリックã—ã¦ã€ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã¨ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’é–‹å§‹ã—ã¾  		</tag>  		<form name="form">  			<input name="message"> -				ã‚ãªãŸã¯ãƒ•リーズã•れã¦ã„ã¾ã™ã€‚å‹•ãã“ã¨ã‚‚ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。管ç†è€…ãŒï¼©ï¼ã§ã‚ãªãŸã«é€£çµ¡ã—ã¾ã™ã€‚ +				ã‚ãªãŸã¯ãƒ•リーズã•れã¦ã„ã¾ã™ã€‚å‹•ãã“ã¨ã‚‚ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。管ç†è€…ãŒIMã§ã‚ãªãŸã«é€£çµ¡ã—ã¾ã™ã€‚  			</input>  			<button name="OK" text="OK"/>  			<button name="Cancel" text="ã‚ャンセル"/> @@ -3150,19 +3150,19 @@ https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83  			fail  		</tag>  	</notification> -	<notification name="UnableToLoadNotecardAsset">ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ã‚¢ã‚»ãƒƒãƒˆï¼©ï¼¤ã‚’èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 +	<notification name="UnableToLoadNotecardAsset">ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ã‚¢ã‚»ãƒƒãƒˆIDã‚’èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。      <tag>  			fail  		</tag>  		<usetemplate name="okbutton" yestext="OK"/>  	</notification> -	<notification name="NotAllowedToViewNotecard">è¦æ±‚ã—ãŸã‚¢ã‚»ãƒƒãƒˆï¼©ï¼¤ã«é–¢ã™ã‚‹ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’閲覧ã™ã‚‹ã«ã¯ã€æ¨©é™ãŒä¸å分ã§ã™ã€‚ +	<notification name="NotAllowedToViewNotecard">è¦æ±‚ã—ãŸã‚¢ã‚»ãƒƒãƒˆIDã«é–¢ã™ã‚‹ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’閲覧ã™ã‚‹ã«ã¯ã€æ¨©é™ãŒä¸å分ã§ã™ã€‚      <tag>  			fail  		</tag>  		<usetemplate name="okbutton" yestext="OK"/>  	</notification> -	<notification name="MissingNotecardAssetID">ノートカード用ã®ã‚¢ã‚»ãƒƒãƒˆï¼©ï¼¤ãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“。 +	<notification name="MissingNotecardAssetID">ノートカード用ã®ã‚¢ã‚»ãƒƒãƒˆIDãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“。      <tag>  			fail  		</tag> @@ -3189,7 +3189,7 @@ https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83  		</tag>  		<usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>  	</notification> -	<notification label="å†èµ·å‹•を確èª" name="ConfirmRestart">ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã‚’2分後ã«å†èµ·å‹•ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®ã¾ã¾ç¶šã‘ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ +	<notification label="å†èµ·å‹•を確èª" name="ConfirmRestart">ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã‚’2分後ã«å†èµ·å‹•ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®ã¾ã¾ç¶šã‘ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ      <tag>  			confirm  		</tag> @@ -3489,7 +3489,7 @@ https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83  ⑴嫌ãŒã‚‰ã›ã®å ±å‘Šã®æ‰‹é †ã€‚å±…ä½è€…ãŒã€[SECOND_LIFE]権é™ã‚·ã‚¹ãƒ†ãƒ ã‚’悪用ã—ã¦ã„ã‚‹ã¨æ€ã‚れる場åˆï¼ˆãŸã¨ãˆã°ã€CopyBotã¾ãŸã¯åŒæ§˜ã®ã‚³ãƒ”ーツールを使用ã—ã¦ã€çŸ¥çš„財産権を侵害ã—ã¦ã„ã‚‹ã¨æ€ã‚れる場åˆï¼‰ã¯ã€ä¸æ£ä½¿ç”¨å ±å‘Šã‚’æå‡ºã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚䏿£è¡Œç‚ºãƒãƒ¼ãƒ ã¯ã€[SECOND_LIFE][http://secondlife.com/corporate/tos.php 利用è¦ç´„]ã‚„ã€[http://jp.secondlife.com/corporate/cs.php コミュニティ・スタンダード]ã«é•åã™ã‚‹è¡Œç‚ºã‚’調査ã—ã€ã«é•åã™ã‚‹è¡Œç‚ºã«å¯¾ã™ã‚‹é©åˆ‡ãªå‡¦ç½°ã‚’下ã—ã¾ã™ã€‚ãŸã ã—ã€æ‹…当ãƒãƒ¼ãƒ ã¯[SECOND_LIFE]ã®ä¸–界ã‹ã‚‰ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を削除ã—ã¦æ¬²ã—ã„ã¨ã„ã†ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¯å¿œã˜ã¾ã›ã‚“。 -⑵DMCA ã¾ãŸã¯ã‚³ãƒ³ãƒ†ãƒ³ãƒ„削除プãƒã‚»ã‚¹ã€‚[SECOND_LIFE]ã‹ã‚‰ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®å‰Šé™¤ã‚’リクエストã™ã‚‹ã«ã¯ã€[https://www.lindenlab.com/legal/intellectual-property-infringement-notification-policy DCï¼ï¼¡ãƒãƒªã‚·ãƒ¼]ã«è¦å®šã•れã¦ã„ã‚‹æœ‰åŠ¹ãªæ¨©åˆ©ä¾µå®³é€šçŸ¥ã‚’æå‡ºã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +⑵DMCA ã¾ãŸã¯ã‚³ãƒ³ãƒ†ãƒ³ãƒ„削除プãƒã‚»ã‚¹ã€‚[SECOND_LIFE]ã‹ã‚‰ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®å‰Šé™¤ã‚’リクエストã™ã‚‹ã«ã¯ã€[https://www.lindenlab.com/legal/intellectual-property-infringement-notification-policy DMCAãƒãƒªã‚·ãƒ¼]ã«è¦å®šã•れã¦ã„ã‚‹æœ‰åŠ¹ãªæ¨©åˆ©ä¾µå®³é€šçŸ¥ã‚’æå‡ºã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚  ã“ã®ã¾ã¾å«ŒãŒã‚‰ã›ã®å ±å‘Šã‚’ç¶šã‘ãŸã„å ´åˆã¯ã€ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã¦å ±å‘Šã®é€ä¿¡ã‚’完了ã—ã¦ãã ã•ã„。特定ã®ã‚«ãƒ†ã‚´ãƒªã€Œã‚³ãƒ”ー Bot åŠã³æ¨©é™ã®æ‚ªç”¨ã€ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆãŒã‚りã¾ã™ã€‚ @@ -3578,7 +3578,7 @@ Linden Lab  		</tag>  		<usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="ã¯ã„"/>  	</notification> -	<notification name="ConfirmClearMediaUrlList">ä¿å˜ã•れãŸï¼µï¼²ï¼¬ã®ãƒªã‚¹ãƒˆã‚’消去ã—ã¾ã™ã€‚ã“ã®ã¾ã¾ã€ãƒªã‚¹ãƒˆã‚’消去ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ +	<notification name="ConfirmClearMediaUrlList">ä¿å˜ã•れãŸURLã®ãƒªã‚¹ãƒˆã‚’消去ã—ã¾ã™ã€‚ã“ã®ã¾ã¾ã€ãƒªã‚¹ãƒˆã‚’消去ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ      <tag>  			confirm  		</tag> @@ -3669,10 +3669,10 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚  	<notification name="AutoWearNewClothing">作æˆã™ã‚‹æœè£…を自動的ã«è£…ç€ã—ã¾ã™ã‹ï¼Ÿ      <usetemplate ignoretext="「容姿ã€ã‚’編集ä¸ã«ã€ä½œæˆã™ã‚‹æœè£…を装ç€ã™ã‚‹ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>  	</notification> -	<notification name="NotAgeVerified">訪å•ã—よã†ã¨ã—ã¦ã„る場所ã¯ã€ï¼‘8æ³ä»¥ä¸Šã®ä½äººã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ +	<notification name="NotAgeVerified">訪å•ã—よã†ã¨ã—ã¦ã„る場所ã¯ã€18æ³ä»¥ä¸Šã®ä½äººã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚      <usetemplate ignoretext="年齢制é™ä»˜ãã®ã‚¨ãƒªã‚¢ã‚’訪å•ã™ã‚‹å¹´é½¢ã«é”ã—ã¦ã„ã¾ã›ã‚“。" name="okignore" yestext="OK"/>  	</notification> -	<notification name="NotAgeVerified_Notify">ã“ã®å ´æ‰€ã¸ã®å…¥å ´ã¯ã€ï¼‘8æ³ä»¥ä¸Šã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ +	<notification name="NotAgeVerified_Notify">ã“ã®å ´æ‰€ã¸ã®å…¥å ´ã¯ã€18æ³ä»¥ä¸Šã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚      <tag>  			fail  		</tag> @@ -3708,7 +3708,7 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚  	<notification name="ReplacedMissingWearable">  		欠è½ã—ã¦ã„ã‚‹æœè£…や身体部ä½ã‚’デフォルトã«ç½®ãæ›ãˆã¾ã™ã€‚  	</notification> -	<notification name="GroupNotice">ä»¶å:[SUBJECT] メッセージ:[MESSAGE] +	<notification name="GroupNotice">ä»¶å:[SUBJECT] メッセージ:[MESSAGE]      <tag>  			group  		</tag> @@ -3726,7 +3726,7 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚  	</notification>  	<notification name="UploadingAuctionSnapshot">  		インワールドã¨Webサイトã®ã‚¹ãƒŠãƒƒãƒ—ショットをアップãƒãƒ¼ãƒ‰ä¸ã§ã™â€¦ -ï¼ˆæ‰€è¦æ™‚間:約5分) +ï¼ˆæ‰€è¦æ™‚間:約5分)  	</notification>  	<notification name="UploadPayment">アップãƒãƒ¼ãƒ‰ã«L$ [AMOUNT]支払ã„ã¾ã—ãŸã€‚      <tag> @@ -3774,7 +3774,7 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚  		</tag>  	</notification>  	<notification name="IMAcrossParentEstates"> -		親ä¸å‹•産間ã§ã¯ã€ï¼©ï¼ã‚’é€ä¿¡ã§ãã¾ã›ã‚“。 +		親ä¸å‹•産間ã§ã¯ã€IMã‚’é€ä¿¡ã§ãã¾ã›ã‚“。  	</notification>  	<notification name="TransferInventoryAcrossParentEstates">  		親ä¸å‹•産間ã§ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‚’移動ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 @@ -3855,7 +3855,7 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚  		[NAME]ã¯ã€ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã®æä¾›ã‚’æ–りã¾ã—ãŸã€‚  	</notification>  	<notification name="ObjectMessage"> -		[NAME]:[MESSAGE] +		[NAME]: [MESSAGE]  	</notification>  	<notification name="CallingCardAccepted">  		コーリングカードãŒå—ç†ã•れã¾ã—ãŸã€‚ @@ -3870,7 +3870,7 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚  (ã“ã®æ“作ã¯ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’ダブルクリックã™ã‚‹ã‹ã€å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€ã‚’é¸æŠžã—ã¦å®Ÿè¡Œã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚)  	</notification>  	<notification name="TeleportToPerson"> -		誰ã‹ã¨ã®ãƒ—ライベートãªä¼šè©±ã‚’é–‹ãã«ã¯ã€ç›¸æ‰‹ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’クリックã—ã¦ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰ã€Œï¼©ï¼ã€ã‚’é¸æŠžã—ã¾ã™ã€‚ +		誰ã‹ã¨ã®ãƒ—ライベートãªä¼šè©±ã‚’é–‹ãã«ã¯ã€ç›¸æ‰‹ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’クリックã—ã¦ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰ã€ŒIMã€ã‚’é¸æŠžã—ã¾ã™ã€‚  	</notification>  	<notification name="CantSelectLandFromMultipleRegions">サーãƒãƒ¼ã®å¢ƒç•Œã‚’è¶Šãˆã¦åœŸåœ°ã‚’é¸æŠžã™ã‚‹ã“ã¨ã§ãã¾ã›ã‚“。  ã‚‚ã£ã¨å°ã•ãªåœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。 @@ -4000,14 +4000,14 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚      <unique/>  		<usetemplate name="okbutton" yestext="リージョンã®å†æ§‹ç¯‰"/>  	</notification> -	<notification name="DynamicPathfindingDisabled">ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«ãŠã„ã¦ã€å‹•çš„çµŒè·¯æŽ¢ç´¢ãŒæœ‰åйã«ãªã£ã¦ã„ã¾ã›ã‚“。経路探索LSL呼ã³å‡ºã—を使用ã™ã‚‹ã‚¹ã‚¯ãƒªãƒ—トã®å…¥ã£ãŸã‚ªãƒ–ジェクトã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§æœŸå¾…ã©ãŠã‚Šã«å‹•作ã—ãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ +	<notification name="DynamicPathfindingDisabled">ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«ãŠã„ã¦ã€å‹•çš„çµŒè·¯æŽ¢ç´¢ãŒæœ‰åйã«ãªã£ã¦ã„ã¾ã›ã‚“。経路探索LSL呼ã³å‡ºã—を使用ã™ã‚‹ã‚¹ã‚¯ãƒªãƒ—トã®å…¥ã£ãŸã‚ªãƒ–ジェクトã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§æœŸå¾…ã©ãŠã‚Šã«å‹•作ã—ãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚      <unique/>  	</notification>  	<notification name="PathfindingCannotRebakeNavmesh">エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¾ãŸã¯ã‚µãƒ¼ãƒãƒ¼ã«å•題ãŒã‚ã‚‹ã‹ã€åˆ¶ä½œã™ã‚‹æ¨©é™ãŒãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ã“ã®å•題ã¯ã€ä¸€åº¦ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã¦ã‹ã‚‰ã€ãƒã‚°ã‚¤ãƒ³ã—ç›´ã™ã¨è§£æ±ºã•れる場åˆãŒã‚りã¾ã™ã€‚      <unique/>  		<usetemplate name="okbutton" yestext="OK"/>  	</notification> -	<notification name="SeeAvatars">ã“ã®åŒºç”»ã«ã„ã‚‹ã‚¢ãƒã‚¿ãƒ¼ã‚„ã“ã®åŒºç”»å†…ã§è¡Œã‚れる文å—ãƒãƒ£ãƒƒãƒˆã¯ã€ä»–ã®åŒºç”»ã‹ã‚‰è¦‹ãˆã¾ã›ã‚“。ã‚ãªãŸã«ã¯ã€ã“ã®åŒºç”»å¤–ã«ã„ã‚‹ä½äººãŒè¦‹ãˆãšã€å¤–ã®ä½äººã«ã¯ã‚ãªãŸã®å§¿ãŒè¦‹ãˆã¾ã›ã‚“。ãƒãƒ£ãƒ³ãƒãƒ«ï¼ã§ã®é€šå¸¸ã®æ–‡å—ãƒãƒ£ãƒƒãƒˆã‚‚ブãƒãƒƒã‚¯ã•れã¾ã™ã€‚ +	<notification name="SeeAvatars">ã“ã®åŒºç”»ã«ã„ã‚‹ã‚¢ãƒã‚¿ãƒ¼ã‚„ã“ã®åŒºç”»å†…ã§è¡Œã‚れる文å—ãƒãƒ£ãƒƒãƒˆã¯ã€ä»–ã®åŒºç”»ã‹ã‚‰è¦‹ãˆã¾ã›ã‚“。ã‚ãªãŸã«ã¯ã€ã“ã®åŒºç”»å¤–ã«ã„ã‚‹ä½äººãŒè¦‹ãˆãšã€å¤–ã®ä½äººã«ã¯ã‚ãªãŸã®å§¿ãŒè¦‹ãˆã¾ã›ã‚“。ãƒãƒ£ãƒ³ãƒãƒ«0ã§ã®é€šå¸¸ã®æ–‡å—ãƒãƒ£ãƒƒãƒˆã‚‚ブãƒãƒƒã‚¯ã•れã¾ã™ã€‚      <unique/>  	</notification>  	<notification name="ScriptsStopped"> @@ -4048,12 +4048,12 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚  			fail  		</tag>  	</notification> -	<notification name="MustGetAgeRegion">ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«å…¥ã‚‹ã«ã¯ã€ï¼‘8æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +	<notification name="MustGetAgeRegion">ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«å…¥ã‚‹ã«ã¯ã€18æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚      <tag>  			fail  		</tag>  	</notification> -	<notification name="MustGetAgeParcel">ã“ã®åŒºç”»ã«å…¥ã‚‹ã«ã¯ã€ï¼‘8æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +	<notification name="MustGetAgeParcel">ã“ã®åŒºç”»ã«å…¥ã‚‹ã«ã¯ã€18æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚      <tag>  			fail  		</tag> @@ -4296,7 +4296,7 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚  		</tag>  	</notification>  	<notification name="OfferCallingCard">[NAME]ãŒã€ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’渡ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«ãƒ–ックマークãŒè¿½åŠ ã•れã€ã“ã®ä½äººã«ç´ æ—©ãIï¼ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«ãƒ–ックマークãŒè¿½åŠ ã•れã€ã“ã®ä½äººã«ç´ æ—©ãIMã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚      <tag>  			friendship  		</tag> @@ -4317,7 +4317,7 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚  [MESSAGE] -é€ä¿¡å…ƒã®ã‚ªãƒ–ジェクト:<nolink>[OBJECTNAME]</nolink> 所有者:[NAME_SLURL] +é€ä¿¡å…ƒã®ã‚ªãƒ–ジェクト:<nolink>[OBJECTNAME]</nolink> 所有者:[NAME_SLURL]      <tag>  			confirm  		</tag> @@ -4457,7 +4457,7 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚  	</notification>  	<notification name="BuyLindenDollarSuccess">ãŠæ”¯æ‰•ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚ -ã‚ãªãŸã®L$残高ã¯ã€å‡¦ç†ãŒå®Œäº†ã™ã‚‹ã¨ã‚¢ãƒƒãƒ—デートã•れã¾ã™ã€‚処ç†ã«ï¼’ï¼åˆ†ä»¥ä¸Šã‹ã‹ã£ãŸå ´åˆã€ãŠå–り引ããŒã‚ャンセルã•れるã“ã¨ãŒã‚りã¾ã™ã€‚ãã®å ´åˆã¯ã€è³¼å…¥é‡‘é¡ã¯ã‚ãªãŸã® US$残高ã«è¿½åŠ ã•れã¾ã™ã€‚ [https://secondlife.com/my/account/?lang=ja-JP マイアカウント]ã®å–引履æ´ãƒšãƒ¼ã‚¸ã§ã€æ”¯æ‰•状æ³ã‚’確èªã§ãã¾ã™ã€‚ +ã‚ãªãŸã®L$残高ã¯ã€å‡¦ç†ãŒå®Œäº†ã™ã‚‹ã¨ã‚¢ãƒƒãƒ—デートã•れã¾ã™ã€‚処ç†ã«20分以上ã‹ã‹ã£ãŸå ´åˆã€ãŠå–り引ããŒã‚ャンセルã•れるã“ã¨ãŒã‚りã¾ã™ã€‚ãã®å ´åˆã¯ã€è³¼å…¥é‡‘é¡ã¯ã‚ãªãŸã® US$残高ã«è¿½åŠ ã•れã¾ã™ã€‚ [https://secondlife.com/my/account/?lang=ja-JP マイアカウント]ã®å–引履æ´ãƒšãƒ¼ã‚¸ã§ã€æ”¯æ‰•状æ³ã‚’確èªã§ãã¾ã™ã€‚      <tag>  			funds  		</tag> @@ -4745,11 +4745,11 @@ Webページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚  			<button name="respondbutton" text="è¿”ç”"/>  		</form>  	</notification> -	<notification name="ConfirmCloseAll">ã™ã¹ã¦ã®ï¼©ï¼ã‚’é–‰ã˜ã¾ã™ã‹ï¼Ÿ +	<notification name="ConfirmCloseAll">ã™ã¹ã¦ã®IMã‚’é–‰ã˜ã¾ã™ã‹ï¼Ÿ      <tag>  			confirm  		</tag> -		<usetemplate ignoretext="ã™ã¹ã¦ã®ï¼©ï¼ã‚’é–‰ã˜ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> +		<usetemplate ignoretext="ã™ã¹ã¦ã®IMã‚’é–‰ã˜ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/>  	</notification>  	<notification name="AttachmentSaved">  		装ç€ç‰©ãŒä¿å˜ã•れã¾ã—ãŸã€‚ @@ -5075,7 +5075,7 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000  		メモリプール残é‡ãŒå°‘ãªããªã£ã¦ã„ã¾ã™ã€‚クラッシュをé¿ã‘ã‚‹ãŸã‚[APP_NAME]ã®æ©Ÿèƒ½ã®ä¸€éƒ¨ã¯ç„¡åйã«ãªã‚Šã¾ã—ãŸã€‚ä»–ã®ã‚¢ãƒ—リケーションを終了ã—ã€çжæ³ãŒç¶™ç¶šã¾ãŸã¯å†ç™ºã™ã‚‹å ´åˆã«ã¯Second Lifeã‚’å†èµ·å‹•ã—ã¦ãã ã•ã„。  	</notification>  	<notification name="ForceQuitDueToLowMemory"> -		メモリä¸è¶³ã®ãŸã‚3ï¼ç§’以内ã«[APP_NAME]ã¯çµ‚了ã—ã¾ã™ã€‚ +		メモリä¸è¶³ã®ãŸã‚30秒以内ã«[APP_NAME]ã¯çµ‚了ã—ã¾ã™ã€‚  	</notification>  	<notification name="SOCKS_NOT_PERMITTED">ルールセットã«ã‚ˆã£ã¦è¨±å¯ã•れã¦ã„ãªã„ãŸã‚ã€SOCKS 5プãƒã‚ã‚·"[HOST]:[PORT]"ãŒæŽ¥ç¶šã‚’æ‹’çµ¶ã—ã¾ã—ãŸã€‚      <tag> @@ -5275,7 +5275,7 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000  		<tag>  			confirm  		</tag> -		<usetemplate ignoretext="UIをéžè¡¨ç¤ºå‰ã®ç¢ºèª" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> +		<usetemplate ignoretext="UIã‚’éžè¡¨ç¤ºå‰ã®ç¢ºèª" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/>  	</notification>  	<notification name="PathfindingLinksets_WarnOnPhantom">é¸æŠžã•れãŸä¸€éƒ¨ã®ãƒªãƒ³ã‚¯ã‚»ãƒƒãƒˆã¯ãƒ•ァントムフラグãŒåˆ‡ã‚Šæ›¿ãˆã‚‰ã‚Œã¾ã™ã€‚ @@ -6220,7 +6220,7 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000  			fail  		</tag>  	</notification> -	<notification name="TenObjectsDisabledPlzRefresh">é¸æŠžã•ã‚ŒãŸæœ€åˆã®ï¼‘ï¼å€‹ã®ã‚ªãƒ–ジェクトã®ã¿ãŒç„¡åйã«ã•れã¾ã—ãŸã€‚å¿…è¦ã«å¿œã˜ã¦ã€ãƒªãƒ•レッシュã—ã¦é¸æŠžå†…容を追加ã—ã¦ãã ã•ã„。 +	<notification name="TenObjectsDisabledPlzRefresh">é¸æŠžã•ã‚ŒãŸæœ€åˆã®10個ã®ã‚ªãƒ–ジェクトã®ã¿ãŒç„¡åйã«ã•れã¾ã—ãŸã€‚å¿…è¦ã«å¿œã˜ã¦ã€ãƒªãƒ•レッシュã—ã¦é¸æŠžå†…容を追加ã—ã¦ãã ã•ã„。      <tag>  			fail  		</tag> @@ -6638,9 +6638,9 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000  			fail  		</tag>  	</notification> -	<notification name="CompressionTestResults">サイズ[SIZE]㎅ã®ãƒ•ァイル[FILE]ã‚’gzipã®ãƒ¬ãƒ™ãƒ«ï¼–ã§åœ§ç¸®ã—ãŸãƒ†ã‚¹ãƒˆçµæžœï¼š -圧縮:[PACK_TIME]秒 [PSIZE]㎅ -è§£å‡ï¼š[UNPACK_TIME]秒 [USIZE]㎅ +	<notification name="CompressionTestResults">サイズ[SIZE]㎅ã®ãƒ•ァイル[FILE]ã‚’gzipã®ãƒ¬ãƒ™ãƒ«6ã§åœ§ç¸®ã—ãŸãƒ†ã‚¹ãƒˆçµæžœï¼š +圧縮:[PACK_TIME]ç§’ [PSIZE]㎅ +è§£å‡ï¼š[UNPACK_TIME]ç§’ [USIZE]㎅      <tag>  			fail  		</tag> @@ -6674,7 +6674,7 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000  		</tag>  		<usetemplate name="okbutton" yestext="OK"/>  	</notification> -	<notification name="RiggedMeshAttachedToHUD">HUDãƒã‚¤ãƒ³ãƒˆã€Œ[POINT]ã€ã«ã‚¢ã‚¿ãƒƒãƒã•れãŸã‚ªãƒ–ジェクト「[NAME]ã€ã«ã¯ãƒªã‚°ãƒ¡ãƒƒã‚·ãƒ¥ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ +	<notification name="RiggedMeshAttachedToHUD">HUDãƒã‚¤ãƒ³ãƒˆã€Œ[POINT]ã€ã«ã‚¢ã‚¿ãƒƒãƒã•れãŸã‚ªãƒ–ジェクト「[NAME]ã€ã«ã¯ãƒªã‚°ãƒ¡ãƒƒã‚·ãƒ¥ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚  リグメッシュオブジェクトã¯ã€ã‚¢ãƒã‚¿ãƒ¼ã«å–り付ã‘るよã†ã«è¨è¨ˆã•れã¦ã„ã¾ã™ã€‚ã‚ãªãŸã«ã¯ã“ã®ã‚ªãƒ–ジェクトãŒè¡¨ç¤ºã•れã¾ã™ãŒã€ä»–ã®äººã«ã¯è¡¨ç¤ºã•れã¾ã›ã‚“。 @@ -6682,9 +6682,9 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000      <tag>  			confirm  		</tag> -		<usetemplate ignoretext="リグメッシュãŒï¼¨ï¼µï¼¤ãƒã‚¤ãƒ³ãƒˆã«ã‚¢ã‚¿ãƒƒãƒã•れã¦ã„ã‚‹å ´åˆã«è¦å‘Šã—ã¾ã™ã€‚" name="okignore" yestext="OK"/> +		<usetemplate ignoretext="リグメッシュãŒHUDãƒã‚¤ãƒ³ãƒˆã«ã‚¢ã‚¿ãƒƒãƒã•れã¦ã„ã‚‹å ´åˆã«è¦å‘Šã—ã¾ã™ã€‚" name="okignore" yestext="OK"/>  	</notification> -	<notification name="EnableAutoFPSWarning" type="alertmodal">自動FPSを有効ã«ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ä¿å˜ã•れã¦ã„ãªã„グラフィックè¨å®šã¯ã™ã¹ã¦å¤±ã‚れã¾ã™ã€‚ +	<notification name="EnableAutoFPSWarning" type="alertmodal">自動FPSを有効ã«ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ä¿å˜ã•れã¦ã„ãªã„グラフィックè¨å®šã¯ã™ã¹ã¦å¤±ã‚れã¾ã™ã€‚  ã¾ãšãれらをä¿å˜ã—ã¾ã™ã‹ï¼Ÿ      <tag> diff --git a/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml index b920a0a8f7..848e3d2f33 100644 --- a/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml @@ -24,7 +24,7 @@  	<icon name="hovered_icon"/>  	<icon name="selected_icon"/>  	<text name="avatar_name" value="(èªã¿è¾¼ã‚“ã§ã„ã¾ã™ï¼‰"/> -	<text name="last_interaction" value="ï¼ç§’"/> +	<text name="last_interaction" value="0ç§’"/>  	<icon name="permission_edit_theirs_icon" tool_tip="ã“ã®ãƒ•レンドã®ã‚ªãƒ–ジェクトを編集ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/>  	<icon name="permission_edit_mine_icon" tool_tip="ã“ã®ãƒ•レンドã¯ã€ã‚ãªãŸã®ã‚ªãƒ–ジェクトを編集・削除・å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/>  	<icon tool_tip="ã“ã®ãƒ•レンドã¯ãƒžãƒƒãƒ—上ã§ã‚ãªãŸã®ä½ç½®ã‚’表示ã§ãã¾ã™ã€‚" name="permission_map_icon"/> diff --git a/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml index 156f475fc6..56b6e88c7b 100644 --- a/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml +++ b/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml @@ -1,5 +1,5 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="clothing_list_button_bar_panel"> -	<button label="追加+" name="add_btn"/> +	<button label="追加 +" name="add_btn"/>  	<button name="clothing_shop_btn"/>  </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_universal.xml b/indra/newview/skins/default/xui/ja/panel_edit_universal.xml index fd5fe80848..6d6ee5622f 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_universal.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_universal.xml @@ -10,9 +10,9 @@  			<texture_picker label="ç›®ã®ã‚¿ãƒˆã‚¥" name="Eyes Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/>  			<texture_picker label="左腕ã®ã‚¿ãƒˆã‚¥" name="Left Arm Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/>  			<texture_picker label="左脚ã®ã‚¿ãƒˆã‚¥" name="Left Leg Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/> -			<texture_picker label="予備1ã®ã‚¿ãƒˆã‚¥" name="Aux1 Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/> -			<texture_picker label="予備2ã®ã‚¿ãƒˆã‚¥" name="Aux2 Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/> -			<texture_picker label="予備3ã®ã‚¿ãƒˆã‚¥" name="Aux3 Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/> +			<texture_picker label="予備1ã®ã‚¿ãƒˆã‚¥" name="Aux1 Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/> +			<texture_picker label="予備2ã®ã‚¿ãƒˆã‚¥" name="Aux2 Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/> +			<texture_picker label="予備3ã®ã‚¿ãƒˆã‚¥" name="Aux3 Tattoo" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠžã™ã‚‹"/>  			<color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>  		</panel>  	</scroll_container> diff --git a/indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml b/indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml index 962d69c67c..27d9b088cb 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml @@ -4,7 +4,7 @@  		(èªã¿è¾¼ã‚“ã§ã„ã¾ã™â€¦ï¼‰  	</panel.string>  	<panel.string name="ban_selection_too_large"> -		グループã®ãƒãƒ³ãŒé€ä¿¡ã•れã¦ã„ã¾ã›ã‚“ï¼šé¸æŠžã—ãŸä½äººãŒå¤šã™ãŽã¾ã™ã€‚グループã¸ã®ç«‹å…¥ç¦æ¢ã®æ•°ã¯ï¼‘リクエスト当ãŸã‚Šï¼‘ï¼ï¼äººã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ +		グループã®ãƒãƒ³ãŒé€ä¿¡ã•れã¦ã„ã¾ã›ã‚“ï¼šé¸æŠžã—ãŸä½äººãŒå¤šã™ãŽã¾ã™ã€‚グループã¸ã®ç«‹å…¥ç¦æ¢ã®æ•°ã¯1リクエスト当ãŸã‚Š100人ã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚  	</panel.string>  	<panel.string name="ban_not_permitted">  		グループã®ãƒãƒ³ãŒé€ä¿¡ã•れã¦ã„ã¾ã›ã‚“ï¼šã€Œç«‹å…¥ç¦æ¢ãƒªã‚¹ãƒˆã®ç®¡ç†ã€ã®èƒ½åŠ›ãŒã‚りã¾ã›ã‚“。 diff --git a/indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml b/indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml index 42e3b0050e..5e5fbfff9f 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml @@ -53,7 +53,7 @@          </layout_panel>  			</layout_stack>  			<text name="info_deletion"> -				注:48時間メンãƒãƒ¼ãŒï¼’人未満ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¯ã€è‡ªå‹•çš„ã«è§£æ•£ã•れã¾ã™ã€‚ +				注:48時間メンãƒãƒ¼ãŒ2人未満ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¯ã€è‡ªå‹•çš„ã«è§£æ•£ã•れã¾ã™ã€‚  			</text>  		</layout_panel>  	</layout_stack> diff --git a/indra/newview/skins/default/xui/ja/panel_group_invite.xml b/indra/newview/skins/default/xui/ja/panel_group_invite.xml index 85f0cba760..1177d5930d 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_invite.xml @@ -11,7 +11,7 @@  	</panel.string>  	<panel.string name="invite_selection_too_large">  		グループã¸ã®æ‹›å¾…ãŒé€ä¿¡ã•れã¦ã„ã¾ã›ã‚“ï¼šé¸æŠžã•れãŸä½äººãŒå¤šã™ãŽã¾ã™ã€‚ -グループã¸ã®æ‹›å¾…ã¯ï¼‘回ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚ãŸã‚Šï¼‘ï¼ï¼äººã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ +グループã¸ã®æ‹›å¾…ã¯1回ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚ãŸã‚Š100人ã«åˆ¶é™ã•れã¦ã„ã¾ã™ã€‚  	</panel.string>  	<text name="help_text">  		グループã«ã¯ä¸€åº¦ã«è¤‡æ•°ã®ä½äººã‚’招待ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚「リストã‹ã‚‰ä½äººã‚’é¸æŠžã€ã‚’クリックã—ã¦ãã ã•ã„。 diff --git a/indra/newview/skins/default/xui/ja/panel_group_notices.xml b/indra/newview/skins/default/xui/ja/panel_group_notices.xml index ebde7f9944..8045c26724 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_notices.xml @@ -9,8 +9,8 @@  		éŽåŽ»ã®é€šçŸ¥ã¯ã‚りã¾ã›ã‚“  	</panel.string>  	<text name="lbl2"> -		通知ã¯ï¼‘4日間ä¿å˜ã•れã¾ã™ã€‚ -1日ã®åˆ¶é™æ•°ã¯ï¼’ï¼ï¼é€šã§ã™ã€‚ +		通知ã¯14日間ä¿å˜ã•れã¾ã™ã€‚ +1æ—¥ã®åˆ¶é™æ•°ã¯200通ã§ã™ã€‚  	</text>  	<scroll_list name="notice_list">  		<scroll_list.columns label="" name="icon"/> diff --git a/indra/newview/skins/default/xui/ja/panel_group_roles.xml b/indra/newview/skins/default/xui/ja/panel_group_roles.xml index bd16e3e986..1a063a3592 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_roles.xml @@ -30,7 +30,7 @@ Ctrlã‚ーを押ã—ãªãŒã‚‰ã€ãƒ¡ãƒ³ãƒãƒ¼åをクリックã™ã‚‹ã“ã¨ã§è¤‡æ  			<panel.string name="help_text">  				役割ã«ã¯ã€ã‚¿ã‚¤ãƒˆãƒ«ã¨è¨±å¯ã•れãŸèƒ½åŠ›ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚  メンãƒãƒ¼ã¯ï¼‘ã¤ä»¥ä¸Šã®å½¹å‰²ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã™ã€‚ -グループã§ä½¿ãˆã‚‹å½¹å‰²ã¯ï¼‘ï¼å€‹ã¾ã§ã§ã€ã€Œå…¨å“¡ï¼ˆEveryone)ã€ã¨ã€Œæ‰€æœ‰è€…(Owner)ã€ãŒãれã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ +グループã§ä½¿ãˆã‚‹å½¹å‰²ã¯10個ã¾ã§ã§ã€ã€Œå…¨å“¡ï¼ˆEveryone)ã€ã¨ã€Œæ‰€æœ‰è€…(Owner)ã€ãŒãれã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚  			</panel.string>  			<panel.string name="cant_delete_role">  				「全員(Everyone)ã€ã¨ã€Œæ‰€æœ‰è€…(Owner)ã€ã®å½¹å‰²ã¯å‰Šé™¤ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 diff --git a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml index c95320e53a..4055e23d9f 100644 --- a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml @@ -16,7 +16,7 @@  		ã“ã®ä½ç½®ã®æƒ…å ±ã¯ã€ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™ã®ãŸã‚ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。許å¯ã«ã¤ã„ã¦ã¯åŒºç”»æ‰€æœ‰è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。  	</string>  	<string name="acquired_date"> -		[year,datetime,local]å¹´[mth,datetime,local]月[day,datetime,local]日([wkday,datetime,local]) [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] +		[year,datetime,local]å¹´[mth,datetime,local]月[day,datetime,local]日([wkday,datetime,local]) [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]  	</string>  	<string name="icon_PG" value="Parcel_PG_Dark"/>  	<string name="icon_M" value="Parcel_M_Dark"/> diff --git a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml index 5b5116a05d..c75fd8b1ca 100644 --- a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml @@ -19,7 +19,7 @@                  <item label="åå‰" name="Name" value="search_by_name"/>                  <item label="制作者" name="Creator" value="search_by_creator"/>                  <item label="説明" name="Description" value="search_by_description"/> -                <item label="UUID" name="UUID" value="search_by_UUID"/> +                <item label="UUID" name="UUID" value="search_by_UUID"/>              </combo_box>              <menu_button tool_tip="検索表示オプションを表示" name="options_visibility_btn"/>              <filter_editor label="検索用語を入力ã™ã‚‹" name="inventory search editor"/> diff --git a/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml b/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml index 5d984cb58c..39d9863a0a 100644 --- a/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml +++ b/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml @@ -28,7 +28,7 @@  		サイズ:  	</text>  	<text name="X_label"> -		X +		X  	</text>  	<spinner label="" name="height_pixels"/>  </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml index 08edb447cb..7c7ce83a01 100644 --- a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml +++ b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml @@ -1,5 +1,5 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="nearby_chat"> -	<line_editor label="ã“ã“をクリックã—ã¦ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã—ã¾ã™ã€‚" name="chat_box" tool_tip="Enterã‚ーã§ç™ºè¨€ã—ã€Ctrl+Enterã‚ーã§ã‚·ãƒ£ã‚¦ãƒˆã—ã¾ã™ã€‚"/> +	<line_editor label="ã“ã“をクリックã—ã¦ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã—ã¾ã™ã€‚" name="chat_box" tool_tip="Enterã‚ーã§ç™ºè¨€ã—ã€Ctrl+Enterã‚ーã§å«ã³ã¾ã™ã€‚"/>  	<button name="show_nearby_chat" tool_tip="近隣ãƒãƒ£ãƒƒãƒˆãƒã‚°ã‚’表示ï¼éžè¡¨ç¤º"/>  </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_media.xml b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml index 1093624cda..9c3b51adb9 100644 --- a/indra/newview/skins/default/xui/ja/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml @@ -19,8 +19,8 @@  		<button label="ã™ã¹ã¦åœæ¢" name="all_nearby_media_disable_btn" tool_tip="近隣ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ã™ã¹ã¦ã‚ªãƒ•ã«ã—ã¾ã™"/>  		<button label="ã™ã¹ã¦é–‹å§‹" name="all_nearby_media_enable_btn" tool_tip="近隣ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ã™ã¹ã¦ã‚ªãƒ³ã«ã—ã¾ã™"/>  		<button name="open_prefs_btn" tool_tip="メディアã®è¨å®šã‚’é–‹ãã¾ã™"/> -		<button label="詳細 ≫" label_selected="≪ 簡易" name="more_btn" tool_tip="拡張コントãƒãƒ¼ãƒ«"/> -		<button label="詳細 ≫" label_selected="≪ 簡易" name="less_btn" tool_tip="拡張コントãƒãƒ¼ãƒ«"/> +		<button label="詳細 >>" label_selected="<< 簡易" name="more_btn" tool_tip="拡張コントãƒãƒ¼ãƒ«"/> +		<button label="詳細 >>" label_selected="<< 簡易" name="less_btn" tool_tip="拡張コントãƒãƒ¼ãƒ«"/>  	</panel>  	<panel name="nearby_media_panel">  		<text name="nearby_media_title"> diff --git a/indra/newview/skins/default/xui/ja/panel_notification_list_item.xml b/indra/newview/skins/default/xui/ja/panel_notification_list_item.xml index 00733bf79d..f1fa54d14e 100644 --- a/indra/newview/skins/default/xui/ja/panel_notification_list_item.xml +++ b/indra/newview/skins/default/xui/ja/panel_notification_list_item.xml @@ -40,7 +40,7 @@  									<text name="sender_or_fee_box">  										é€ä¿¡è€…ï¼šä½æ°‘ ã˜ã‚…ã†ã¿ã‚“  									</text> -									<text name="notification_time" value="2014å¹´12月24日 23:30"/> +									<text name="notification_time" value="2014å¹´12月24æ—¥ 23:30"/>  								</panel>  							</panel>  						</layout_panel> @@ -76,7 +76,7 @@  									<text name="sender_or_fee_box_exp">  										é€ä¿¡è€…ï¼šä½æ°‘ ã˜ã‚…ã†ã¿ã‚“  									</text> -									<text name="notification_time_exp" value="2014å¹´12月24日 23:30"/> +									<text name="notification_time_exp" value="2014å¹´12月24æ—¥ 23:30"/>  								</panel>  								<panel name="notification_text_panel_exp">  									<chat_editor name="notification_text_exp"> diff --git a/indra/newview/skins/default/xui/ja/panel_people.xml b/indra/newview/skins/default/xui/ja/panel_people.xml index 516ee3c7d2..fbdaa319a2 100644 --- a/indra/newview/skins/default/xui/ja/panel_people.xml +++ b/indra/newview/skins/default/xui/ja/panel_people.xml @@ -19,7 +19,7 @@  	<string name="AltMiniMapToolTipMsg" value="[地域](ダブルクリックã§ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€‚Shiftâ€ãƒ‰ãƒ©ãƒƒã‚°ã§æ°´å¹³ãƒ»åž‚直移動)"/>  	<string name="GroupCountWithInfo" value="ã‚ãªãŸã¯ç¾åœ¨ã€[COUNT]グループã«å±žã—ã¦ã„ã¾ã™ã€‚ã‚ã¨[REMAINING]グループã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚[secondlife:/// 上é™ã‚’増やã™]"/>  	<tab_container name="tabs"> -		<panel label="近隣" name="nearby_panel"> +		<panel label="è¿‘ã" name="nearby_panel">  			<panel label="bottom_panel" name="nearby_buttons_panel">  				<filter_editor label="人物をフィルタ" name="nearby_filter_input"/>  				<button name="gear_btn" tool_tip="é¸æŠžã—ãŸäººç‰©ã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³"/> diff --git a/indra/newview/skins/default/xui/ja/panel_performance_autoadjustments.xml b/indra/newview/skins/default/xui/ja/panel_performance_autoadjustments.xml index 3a0eeae6d5..fdbfca64ce 100644 --- a/indra/newview/skins/default/xui/ja/panel_performance_autoadjustments.xml +++ b/indra/newview/skins/default/xui/ja/panel_performance_autoadjustments.xml @@ -24,12 +24,12 @@  		<combo_box.item label="ã‚¢ãƒã‚¿ãƒ¼ã¨ãƒ¯ãƒ¼ãƒ«ãƒ‰" name="av_and_scene" value="1"/>  		<combo_box.item label="ワールドã®ã¿" name="scene_only" value="2"/>  	</combo_box> -	<button label="今ã™ã自動調整" name="start_autotune" tool_tip="ビューアーã¯ã€ç›®æ¨™ï¼¦ï¼°ï¼³ã‚’満ãŸã™ã‚ˆã†ã«è¨å®šãŒèª¿æ•´ã•れるã¾ã§åœæ¢ã—ã¾ã™ã€‚"/> +	<button label="今ã™ã自動調整" name="start_autotune" tool_tip="ビューアーã¯ã€ç›®æ¨™FPSを満ãŸã™ã‚ˆã†ã«è¨å®šãŒèª¿æ•´ã•れるã¾ã§åœæ¢ã—ã¾ã™ã€‚"/>  	<button label="ã‚ャンセル" name="stop_autotune" tool_tip="è‡ªå‹•èª¿æ•´ã‚’ä¸æ–ã—ã¾ã™ã€‚"/>  	<text name="wip_desc">  		調整ä¸ã§ã™â€¦  	</text> -	<check_box label="継続的ã«èª¿æ•´ã™ã‚‹" name="AutoTuneContinuous" tool_tip="ビューアーã¯ã€ã“ã®ãƒ•ãƒãƒ¼ã‚¿ãƒ¼ãŒé–‰ã˜ã¦ã„ã¦ã‚‚åœæ¢ã™ã‚‹ã¾ã§ã€ç›®æ¨™ï¼¦ï¼°ï¼³ã‚’満ãŸã™ã‚ˆã†ã«è¨å®šã‚’継続的ã«èª¿æ•´ã—ã¾ã™ã€‚"> +	<check_box label="継続的ã«èª¿æ•´ã™ã‚‹" name="AutoTuneContinuous" tool_tip="ビューアーã¯ã€ã“ã®ãƒ•ãƒãƒ¼ã‚¿ãƒ¼ãŒé–‰ã˜ã¦ã„ã¦ã‚‚åœæ¢ã™ã‚‹ã¾ã§ã€ç›®æ¨™FPSを満ãŸã™ã‚ˆã†ã«è¨å®šã‚’継続的ã«èª¿æ•´ã—ã¾ã™ã€‚">    </check_box>  	<radio_group name="autotune_lock_type">  		<radio_item label="ã“ã®ãƒã‚°ã‚¤ãƒ³ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ã¿" name="one_session_lock" value="0"/> diff --git a/indra/newview/skins/default/xui/ja/panel_performance_huds.xml b/indra/newview/skins/default/xui/ja/panel_performance_huds.xml index 51d9e73540..2d53d74d0d 100644 --- a/indra/newview/skins/default/xui/ja/panel_performance_huds.xml +++ b/indra/newview/skins/default/xui/ja/panel_performance_huds.xml @@ -5,13 +5,13 @@  		戻る  	</text>  	<text name="huds_title"> -		アクティブãªï¼¨ï¼µï¼¤ +		アクティブãªHUD  	</text>  	<text name="huds_desc1"> -		使用ã—ã¦ã„ãªã„HUDをå–り外ã™ã¨ãƒ¡ãƒ¢ãƒªãŒç¯€ç´„ã•れã€Second Lifeã®å‡¦ç†ãŒé«˜é€ŸåŒ–ã•れã¾ã™ã€‚ +		使用ã—ã¦ã„ãªã„HUDã‚’å–り外ã™ã¨ãƒ¡ãƒ¢ãƒªãŒç¯€ç´„ã•れã€Second Lifeã®å‡¦ç†ãŒé«˜é€ŸåŒ–ã•れã¾ã™ã€‚  	</text>  	<text name="huds_desc2"> -		注æ„ï¼šï¼¨ï¼µï¼¤ã®æœ€å°åŒ–ボタンを使用ã—ã¦ã‚‚ã€ï¼¨ï¼µï¼¤ã‚’å–り外ã—ãŸã“ã¨ã«ã¯ãªã‚Šã¾ã›ã‚“。 +		注æ„:HUDã®æœ€å°åŒ–ボタンを使用ã—ã¦ã‚‚ã€HUDã‚’å–り外ã—ãŸã“ã¨ã«ã¯ãªã‚Šã¾ã›ã‚“。  	</text>  	<name_list name="hud_list">  		<name_list.columns label="" name="complex_visual"/> diff --git a/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml b/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml index 40e7800adc..2e165b11b6 100644 --- a/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml +++ b/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml @@ -7,7 +7,7 @@  	<text name="settings_title">  		グラフィックè¨å®š  	</text> -	<button label="æ‹¡å¼µè¨å®šã‚’é–‹ã" name="advanced_btn"/> +	<button label="詳細è¨å®šã‚’é–‹ã" name="advanced_btn"/>  	<button label="推奨è¨å®šã«ãƒªã‚»ãƒƒãƒˆ" name="defaults_btn"/>  	<view_border name="border0"/>  	<text name="quality_lbl"> @@ -40,7 +40,7 @@  	</text>  	<slider name="draw_distance"/>  	<text name="draw_distance_m"> -		ï½ +		m  	</text>  	<text name="farther_lbl">  		é æ™¯ @@ -58,7 +58,7 @@  	<check_box label="大気(周辺)シェーダー" name="atmospheric_shaders"/>  	<check_box label="高度ãªå…‰æºãƒ¢ãƒ‡ãƒ«" name="advanced_lighting_model"/>  	<text name="RenderShadowDetailText"> -		影: +		å½±  	</text>  	<combo_box name="ShadowDetail">  		<combo_box.item label="ãªã—" name="0" value="0"/> diff --git a/indra/newview/skins/default/xui/ja/panel_place_profile.xml b/indra/newview/skins/default/xui/ja/panel_place_profile.xml index 21843e4420..5bd1611a2e 100644 --- a/indra/newview/skins/default/xui/ja/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/ja/panel_place_profile.xml @@ -39,7 +39,7 @@  		ã“ã®å ´æ‰€ã®æƒ…å ±ã¯ã€ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™ã®ãŸã‚ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。許å¯ã«ã¤ã„ã¦ã¯åŒºç”»æ‰€æœ‰è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。  	</string>  	<string name="acquired_date"> -		[year,datetime,local]å¹´[mth,datetime,local]月[day,datetime,local]æ—¥[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] +		[year,datetime,local]å¹´[mth,datetime,local]月[day,datetime,local]æ—¥[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]  	</string>  	<button name="back_btn" tool_tip="戻る"/>  	<text name="title" value="場所ã®ãƒ—ãƒãƒ•ィール"/> diff --git a/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml b/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml index 6373eadabc..f74059e7f1 100644 --- a/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml +++ b/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml @@ -2,9 +2,9 @@  <panel name="panel_postcard_settings">  	<combo_box label="è§£åƒåº¦" name="postcard_size_combo">  		<combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="CurrentWindow"/> -		<combo_box.item label="ï¼–ï¼”ï¼âœ•48ï¼" name="640x480"/> -		<combo_box.item label="8ï¼ï¼âœ•ï¼–ï¼ï¼" name="800x600"/> -		<combo_box.item label="1ï¼ï¼’4✕768" name="1024x768"/> +		<combo_box.item label="640x480" name="640x480"/> +		<combo_box.item label="800x600" name="800x600"/> +		<combo_box.item label="1024x768" name="1024x768"/>  		<combo_box.item label="カスタム" name="Custom"/>  	</combo_box>  	<spinner label="横幅✕高ã•" name="postcard_snapshot_width"/> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml index 40998f8035..72da378efb 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="æ‹¡å¼µ" name="advanced"> +<panel label="アドãƒãƒ³ã‚¹" name="advanced">  	<panel.string name="aspect_ratio_text"> -		[NUM]:[DEN] +		[NUM]:[DEN]  	</panel.string>  	<text name="Cache:">  		ã‚ャッシュ: @@ -17,19 +17,19 @@  	<button label="å‚ç…§" label_selected="å‚ç…§" name="set_cache"/>  	<button label="デフォルトã®å ´æ‰€" label_selected="デフォルトã®å ´æ‰€" name="default_cache_location"/>  	<text name="UI Size:"> -		UIã®ã‚µã‚¤ã‚ºï¼š +		UIã®ã‚µã‚¤ã‚ºï¼š  	</text>  	<text name="HUD Size:"> -		HUDã®ã‚¹ã‚±ãƒ¼ãƒ«ï¼š +		HUDã®ã‚¹ã‚±ãƒ¼ãƒ«ï¼š  	</text> -	<check_box label="スクリプトã®ã‚¨ãƒ©ãƒ¼ã‚’表示:" name="show_script_errors"/> +	<check_box label="スクリプトã®ã‚¨ãƒ©ãƒ¼ã‚’表示:" name="show_script_errors"/>  	<radio_group name="show_location">  		<radio_item label="近隣ãƒãƒ£ãƒƒãƒˆ" name="0"/>  		<radio_item label="別々ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="1"/>  	</radio_group>  	<check_box label="複数ã®ãƒ“ューアを許å¯" name="allow_multiple_viewer_check"/>  	<check_box label="ãƒã‚°ã‚¤ãƒ³æ™‚ã«ã‚°ãƒªãƒƒãƒ‰é¸æŠžã‚’表示" name="show_grid_selection_check"/> -	<check_box label="拡張メニューを表示" name="show_advanced_menu_check"/> +	<check_box label="アドãƒãƒ³ã‚¹ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’表示" name="show_advanced_menu_check"/>  	<check_box label="開発メニューを表示" name="show_develop_menu_check"/>  	<button label="記録済ã¿ã®ãƒ¦ãƒ¼ã‚¶å" name="remembered_usernames"/>  	<button label="デフォルトã®ä½œæˆæ¨©é™" name="default_creation_permissions"/> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml index dd11296729..8246c1e07c 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml @@ -4,12 +4,12 @@  	<panel name="general_chat_settings">  		<check_box initial_value="true" label="ãƒãƒ£ãƒƒãƒˆä¸ã«ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/>  		<check_box label="オフライン時ã«å—ã‘å–ã£ãŸï¼©ï¼ã¯ãƒ¡ãƒ¼ãƒ«ã§å—ä¿¡ã™ã‚‹" name="send_im_to_email"/> -		<check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã®ã‚³ãƒ¼ãƒ«ã¨ï¼©ï¼ã¯å—ä¿¡ã—ãªã„" name="voice_call_friends_only_check"/> +		<check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã®ã‚³ãƒ¼ãƒ«ã¨IMã¯å—ä¿¡ã—ãªã„" name="voice_call_friends_only_check"/>  		<text name="email_settings"> -			[https://accounts.secondlife.com/change_email?lang=ja オフライン時ã®ï¼©ï¼ã®ãƒ¡ãƒ¼ãƒ«é€ä¿¡å…ˆã®è¨å®š] +			[https://accounts.secondlife.com/change_email?lang=ja オフライン時ã®IMã®ãƒ¡ãƒ¼ãƒ«é€ä¿¡å…ˆã®è¨å®š]  		</text>  		<text name="font_size"> -			æ–‡å—ã®å¤§ãã•: +			フォントサイズ:  		</text>  		<combo_box name="chat_font_size">  			<item label="å°" name="Small" value="0"/> @@ -20,7 +20,7 @@  	</panel>  	<panel name="im_notification_settings">  		<text name="friend_ims"> -			フレンドIï¼ï¼š +			フレンドã‹ã‚‰ã®IM:  		</text>  		<combo_box name="FriendIMOptions">  			<item label="é–‹ã„ã¦ã„る会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/> @@ -30,7 +30,7 @@  		</combo_box>  		<check_box label="サウンドをå†ç”Ÿ" name="play_sound_friend_im"/>  		<text name="non_friend_ims"> -			フレンドã®ã„ãªã„Iï¼ï¼š +			フレンド以外ã‹ã‚‰ã®IM:  		</text>  		<combo_box name="NonFriendIMOptions">  			<item label="é–‹ã„ã¦ã„る会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/> @@ -40,7 +40,7 @@  		</combo_box>  		<check_box label="サウンドをå†ç”Ÿ" name="play_sound_non_friend_im"/>  		<text name="conference_ims"> -			会話Iï¼ï¼š +			会è°IM:  		</text>  		<combo_box name="ConferenceIMOptions">  			<item label="é–‹ã„ã¦ã„る会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/> @@ -70,7 +70,7 @@  		</combo_box>  		<check_box label="サウンドをå†ç”Ÿ" name="play_sound_nearby_chat_im"/>  		<text name="object_ims"> -			オブジェクトã«ã‚ˆã‚‹ï¼©ï¼ï¼š +			オブジェクトã«ã‚ˆã‚‹IM:  		</text>  		<combo_box name="ObjectIMOptions">  			<item label="é–‹ã„ã¦ã„る会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml b/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml index b740f85806..d57f8d12f5 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml @@ -29,13 +29,13 @@  		所有者  	</text>  	<text name="text_box9"> -		URL +		URL  	</text>  	<text name="bubble_chat">  		åå‰ã®è¡¨ç¤ºã®èƒŒæ™¯è‰²ï¼ˆå¹ã出ã—ãƒãƒ£ãƒƒãƒˆã«ã‚‚é©ç”¨ï¼‰ï¼š  	</text>  	<color_swatch name="background" tool_tip="åå‰ã®è¡¨ç¤ºè‰²ã‚’é¸æŠž"/> -	<slider label="ä¸é€æ˜Žåº¦ï¼š" name="bubble_chat_opacity" tool_tip="åå‰ã®è¡¨ç¤ºã®ä¸é€æ˜Žåº¦ã‚’é¸æŠž"/> +	<slider label="ä¸é€æ˜Žåº¦:" name="bubble_chat_opacity" tool_tip="åå‰ã®è¡¨ç¤ºã®ä¸é€æ˜Žåº¦ã‚’é¸æŠž"/>  	<text name="floater_opacity">  		フãƒãƒ¼ã‚¿ãƒ¼ã®é€éŽåº¦ï¼š  	</text> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml index 9309dda5af..eff831a7ac 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml @@ -45,7 +45,7 @@  	<check_box label="ユーザーå" name="show_slids" tool_tip="bobsmith123 ãªã©ãƒ¦ãƒ¼ã‚¶ãƒ¼åを表示"/>  	<check_box label="グループタイトル" name="show_all_title_checkbox1" tool_tip="オフィサーã¾ãŸã¯ãƒ¡ãƒ³ãƒãƒ¼ãªã©ã€ã‚°ãƒ«ãƒ¼ãƒ—タイトルを表示"/>  	<check_box label="フレンドをãƒã‚¤ãƒ©ã‚¤ãƒˆè¡¨ç¤º" name="show_friends" tool_tip="フレンドã®åå‰ã‚’ãƒã‚¤ãƒ©ã‚¤ãƒˆè¡¨ç¤º"/> -	<check_box label="表示åを表示" name="display_names_check" tool_tip="ã“ã‚Œã‚’é¸æŠžã™ã‚‹ã¨ã€ãƒãƒ£ãƒƒãƒˆã€ï¼©ï¼ãªã©ã§è¡¨ç¤ºåãŒè¡¨ç¤ºã•れã¾ã™ã€‚"/> +	<check_box label="表示åを表示" name="display_names_check" tool_tip="ã“ã‚Œã‚’é¸æŠžã™ã‚‹ã¨ã€ãƒãƒ£ãƒƒãƒˆã€IMãªã©ã§è¡¨ç¤ºåãŒè¡¨ç¤ºã•れã¾ã™ã€‚"/>  	<text name="inworld_typing_rg_label">  		特定ã‚ーを押ã—ãŸã¨ãã®å‹•作:  	</text> @@ -57,10 +57,10 @@  		「離å¸ã€ã¨ã™ã‚‹ã¾ã§ã®æ™‚間:  	</text>  	<combo_box label="「離å¸ã€ã¨ã™ã‚‹ã¾ã§ã®æ™‚間:" name="afk"> -		<combo_box.item label="2分" name="item0"/> -		<combo_box.item label="5分" name="item1"/> -		<combo_box.item label="1ï¼åˆ†" name="item2"/> -		<combo_box.item label="3ï¼åˆ†" name="item3"/> +		<combo_box.item label="2分" name="item0"/> +		<combo_box.item label="5分" name="item1"/> +		<combo_box.item label="10分" name="item2"/> +		<combo_box.item label="30分" name="item3"/>  		<combo_box.item label="離å¸è¨å®šãªã—" name="item4"/>  	</combo_box>  	<text name="text_box3"> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml index 79a4689526..a70b30c57f 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml @@ -37,7 +37,7 @@  	<slider name="QualityPerformanceSelection"/>  	<slider control_name="RenderFarClip" label="æç”»è·é›¢ï¼š" name="DrawDistance"/>  	<text name="DrawDistanceMeterText2"> -		ï½ +		m  	</text>  	<check_box initial_value="true" label="大気(周辺)シェーダー" name="WindLightUseAtmosShaders"/>  	<check_box initial_value="true" label="高度ãªå…‰æºãƒ¢ãƒ‡ãƒ«" name="UseLightShaders"/> @@ -56,5 +56,5 @@  	<button label="プリセットを削除…" name="PrefDeleteButton"/>  	<button label="プリセットを削除…" name="PrefDeleteButton"/>  	<button label="推奨è¨å®šã«ãƒªã‚»ãƒƒãƒˆ" name="Defaults"/> -	<button label="æ‹¡å¼µè¨å®šâ€¦" name="AdvancedSettings"/> +	<button label="詳細è¨å®šâ€¦" name="AdvancedSettings"/>  </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml index 3956e07bf8..85be779053 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml @@ -4,10 +4,10 @@  		ä¸å¤®ã®ãƒœã‚¿ãƒ³  	</panel.string>  	<panel.string name="button4_mouse"> -		4ボタン +		マウスボタン4  	</panel.string>  	<panel.string name="button5_mouse"> -		5ボタン +		マウスボタン5  	</panel.string>  	<slider label="全体ã®ãƒœãƒªãƒ¥ãƒ¼ãƒ " name="System Volume"/>  	<button name="mute_audio"/> diff --git a/indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml b/indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml index b4504dd39a..128669260a 100644 --- a/indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml +++ b/indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml @@ -5,6 +5,6 @@  	</text>  	<scroll_list name="preset_list"/>  	<view_border name="horiz_separator"/> -	<button name="open_prefs_btn" label="ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯åˆæœŸè¨å®š" tool_tip="グラフィックè¨å®šã‚’呼ã³å‡ºã—ã¾ã™ã€‚"/> -	<button name="open_autofps_btn" label="自動FPSè¨å®š" tool_tip="自動調整è¨å®šã‚’呼ã³å‡ºã—ã¾ã™ã€‚"/> +	<button name="open_prefs_btn" label="グラフィックè¨å®š" tool_tip="グラフィックè¨å®šã‚’呼ã³å‡ºã—ã¾ã™ã€‚"/> +	<button name="open_autofps_btn" label="自動FPSè¨å®š" tool_tip="自動調整è¨å®šã‚’呼ã³å‡ºã—ã¾ã™ã€‚"/>  </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml index 6c33bda5cd..038a7aa49f 100644 --- a/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml @@ -64,7 +64,7 @@  			<button name="close_btn" tool_tip="ズームãƒãƒƒã‚¯"/>  		</layout_panel>  		<layout_panel name="new_window"> -			<button name="new_window_btn" tool_tip="URLをブラウザã§é–‹ã"/> +			<button name="new_window_btn" tool_tip="URLをブラウザã§é–‹ã"/>  		</layout_panel>  	</layout_stack>  	<icon name="media_secure_lock_flag" tool_tip="安全ãªãƒ–ラウジング"/> diff --git a/indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml b/indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml index 71e223b90b..1c9111606e 100644 --- a/indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml +++ b/indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="panel_profile" label="プãƒãƒ•ィール"> -	<string name="date_format" value="SLã§ã®èª•生日:[year,datetime,utc]å¹´[mth,datetime,utc]月[day,datetime,utc]æ—¥"/> +	<string name="date_format" value="SLã§ã®èª•生日:[year,datetime,utc]å¹´[mth,datetime,utc]月[day,datetime,utc]æ—¥"/>  	<string name="age_format" value="[AGE]経éŽ"/>  	<string name="partner_text" value="パートナー:[LINK]"/>  	<string name="CaptionTextAcctInfo"> diff --git a/indra/newview/skins/default/xui/ja/panel_region_covenant.xml b/indra/newview/skins/default/xui/ja/panel_region_covenant.xml index 9b2239e0bb..16349b45d4 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_covenant.xml @@ -45,7 +45,7 @@  		種類:  	</text>  	<text name="region_landtype_text"> -		メインランドï¼å…¥æ¤åœ° +		メインランド / ホームステッド  	</text>  	<text name="region_maturity_lbl">  		区分: diff --git a/indra/newview/skins/default/xui/ja/panel_region_environment.xml b/indra/newview/skins/default/xui/ja/panel_region_environment.xml index 48aa2a0adb..969c8f699c 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_environment.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_environment.xml @@ -7,7 +7,7 @@  		リージョン(地域)ã®è¨å®šã‚’使用  	</string>  	<string name="str_altitude_desription"> -		空 [INDEX]([ALTITUDE]ï½ï¼‰ +		空 [INDEX]([ALTITUDE]m)  	</string>  	<string name="str_no_parcel">  		区画ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。環境ã®è¨å®šã¯ç„¡åйã«ãªã£ã¦ã„ã¾ã™ã€‚ @@ -48,7 +48,7 @@  						</layout_panel>  						<layout_panel name="pnl_environment_length">  							<text name="lbl_apparent_time"> -								[AP] [HH]:[MM]([PRC]%) +								[AP] [HH]:[MM] ([PRC]%)  							</text>  						</layout_panel>  						<layout_panel name="pnl_environment_buttons"/> @@ -57,7 +57,7 @@  				<layout_panel name="pnl_environment_altitudes">  					<panel name="pnl_alt1">  						<text name="txt_alt1"> -							空[INDEX] [ALTITUDE]ï½ +							空[INDEX] [ALTITUDE]m  						</text>  						<line_editor name="edt_invname_alt1">  							䏿˜Ž @@ -66,7 +66,7 @@  					</panel>  					<panel name="pnl_alt2">  						<text name="txt_alt2"> -							空[INDEX] [ALTITUDE]ï½ +							空[INDEX] [ALTITUDE]m  						</text>  						<line_editor name="edt_invname_alt2">  							䏿˜Ž @@ -75,7 +75,7 @@  					</panel>  					<panel name="pnl_alt3">  						<text name="txt_alt3"> -							空[INDEX] [ALTITUDE]ï½ +							空[INDEX] [ALTITUDE]m  						</text>  						<line_editor name="edt_invname_alt3">  							䏿˜Ž diff --git a/indra/newview/skins/default/xui/ja/panel_region_estate.xml b/indra/newview/skins/default/xui/ja/panel_region_estate.xml index df790376ec..429b55cb32 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_estate.xml @@ -19,7 +19,7 @@  		<radio_item label="アクセスタブã«è¨˜è¼‰ã•れãŸä½äººã¨ã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿è¨±å¯ã™ã‚‹" name="estate_restricted_access"/>  		<radio_item label="誰ã§ã‚‚訪å•å¯" name="estate_public_access"/>  	</radio_group> -	<check_box label="18æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" name="limit_age_verified" tool_tip="ã“ã®ä¸å‹•産(ä¸å‹•産)ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€18 æ‰ä»¥ä¸Šã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。詳細ã«ã¤ã„ã¦ã¯ã€[SUPPORT_SITE]ã‚’ã”覧ãã ã•ã„。"/> +	<check_box label="18æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" name="limit_age_verified" tool_tip="ã“ã®ä¸å‹•産(ä¸å‹•産)ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€18 æ‰ä»¥ä¸Šã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。詳細ã«ã¤ã„ã¦ã¯ã€[SUPPORT_SITE]ã‚’ã”覧ãã ã•ã„。"/>  	<check_box label="支払情報ãŒç™»éŒ²ã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™" name="limit_payment" tool_tip="支払情報ãŒç™»éŒ²ã•れã¦ã„ãªã„ã¨ã€ã“ã®ä¸å‹•産ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。詳細ã«ã¤ã„ã¦ã¯ã€[SUPPORT_SITE]ã‚’ã”覧ãã ã•ã„。"/>  	<check_box label="区画所有者" name="parcel_access_override"/>  	<check_box label="ボイスãƒãƒ£ãƒƒãƒˆã‚’許å¯" name="voice_chat_check"/> diff --git a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml index 11e8d0d169..398f8d6718 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml @@ -13,16 +13,16 @@  		地形テクスãƒãƒ£  	</text>  	<text name="height_text_lbl"> -		1(低) +		1(低)  	</text>  	<text name="height_text_lbl2"> -		ï¼’ +		2  	</text>  	<text name="height_text_lbl3"> -		3 +		3  	</text>  	<text name="height_text_lbl4"> -		4(高) +		4(高)  	</text>  	<text name="height_text_lbl5">  		地形ã®éš†èµ·ç¯„囲 @@ -31,7 +31,7 @@  		数値ã¯ä¸Šã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ãƒ–レンド範囲を示ã—ã¾ã™ã€‚  	</text>  	<text name="height_text_lbl11"> -		計測å˜ä½ã¯ãƒ¡ãƒ¼ãƒˆãƒ«ã§ã€ã€Œä½Žã€ã®å€¤ã¯ã€ï¼‘番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€å¤§å€¤ã€ã§ã™ã€‚「高ã€ã®å€¤ã¯ã€ï¼”番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€ä½Žå€¤ã€ã§ã™ã€‚ +		計測å˜ä½ã¯ãƒ¡ãƒ¼ãƒˆãƒ«ã§ã€ã€Œä½Žã€ã®å€¤ã¯ã€1番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€å¤§å€¤ã€ã§ã™ã€‚「高ã€ã®å€¤ã¯ã€4番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€ä½Žå€¤ã€ã§ã™ã€‚  	</text>  	<text name="height_text_lbl6">  		北西 diff --git a/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml index c717b71194..68eb8b4f9d 100644 --- a/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml +++ b/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml @@ -8,7 +8,7 @@  	</text>  	<scroll_list name="scripts_list">  		<scroll_list.columns label="サイズ (㎅)" name="size"/> -		<scroll_list.columns label="URL" name="urls"/> +		<scroll_list.columns label="URL" name="urls"/>  		<scroll_list.columns label="オブジェクトå" name="name"/>  		<scroll_list.columns label="場所" name="location"/>  	</scroll_list> diff --git a/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml index 71dedb55a6..30c3fdc9b5 100644 --- a/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml +++ b/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml @@ -10,7 +10,7 @@  	</text>  	<scroll_list name="scripts_list">  		<scroll_list.columns label="サイズ (㎅)" name="size"/> -		<scroll_list.columns label="URL" name="urls"/> +		<scroll_list.columns label="URL" name="urls"/>  		<scroll_list.columns label="オブジェクトå" name="name"/>  		<scroll_list.columns label="ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…" name="owner"/>  		<scroll_list.columns label="区画" name="parcel"/> diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml index 9cb0b8f116..27a55aa653 100644 --- a/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml +++ b/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml @@ -10,7 +10,7 @@  		é€ä¿¡ä¸â€¦  	</string>  	<text name="title"> -		Eメール +		Eメール  	</text>  	<tab_container name="postcard_tabs">  		<panel label="メッセージ" name="panel_postcard_message"/> diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml index 9feae80624..2497b15548 100644 --- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml @@ -7,10 +7,10 @@  		帯域幅  	</panel.string>  	<panel.string name="time"> -		[ampm, datetime, slt] [hour12, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt] +		[ampm, datetime, slt] [hour12, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt]  	</panel.string>  	<panel.string name="timeTooltip"> -		[year, datetime, slt]å¹´[month, datetime, slt]月[day, datetime, slt]日([weekday, datetime, slt]) +		[year, datetime, slt]å¹´[month, datetime, slt][day, datetime, slt]日([weekday, datetime, slt])  	</panel.string>  	<panel.string name="buycurrencylabel">  		L$ [AMT] @@ -24,7 +24,7 @@  		<button label="ショップ" name="goShop" tool_tip="Second Lifeã®ãƒžãƒ¼ã‚±ãƒƒãƒˆãƒ—レイスを開ãã¾ã™ã€‚" width="70"/>  	</panel>  	<text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋)"> -		åˆå‰ã€€24:00 PST +		åˆå‰ 24:00 PST  	</text>  	<icon image_name="Cam_FreeCam_Off" name="presets_icon_camera" tool_tip="カメラ"/>  	<icon image_name="Presets_Icon" name="presets_icon_graphic" tool_tip="グラフィックã®ãƒ—リセット"/> diff --git a/indra/newview/skins/default/xui/ja/panel_tools_texture.xml b/indra/newview/skins/default/xui/ja/panel_tools_texture.xml index 49efc529e4..968635e55b 100644 --- a/indra/newview/skins/default/xui/ja/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/ja/panel_tools_texture.xml @@ -17,7 +17,7 @@  	</combo_box>  	<radio_group name="radio_material_type">  		<radio_item label="テクスãƒãƒ£ (æ‹¡æ•£)" name="Texture (diffuse)" value="0"/> -		<radio_item label="凹凸 (標準)" name="Bumpiness (normal)" value="1"/> +		<radio_item label="凹凸 (法線)" name="Bumpiness (normal)" value="1"/>  		<radio_item label="è¼ã (åå°„)" name="Shininess (specular)" value="2"/>  	</radio_group>  	<check_box initial_value="false" label="繰り返ã—ã‚’ãƒãƒƒã‚¯ã™ã‚‹" name="checkbox_sync_settings" tool_tip="ã™ã¹ã¦ã®ãƒžãƒƒãƒ—ã®ç¹°ã‚Šè¿”ã—を調整ã™ã‚‹"/> @@ -79,7 +79,7 @@  	</text>  	<color_swatch label="" name="shinycolorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>  	<text name="media_info"> -		é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã®ï¼µï¼²ï¼¬ãŒã‚‚ã—ã‚れã°ã€ã“ã“ã«å…¥ã‚Šã¾ã™ã€‚ +		é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã®URLãŒã‚‚ã—ã‚れã°ã€ã“ã“ã«å…¥ã‚Šã¾ã™ã€‚  	</text>  	<button label="é¸æŠžâ€¦" name="add_media" tool_tip="メディアを追加ã—ã¾ã™"/>  	<button label="削除" name="delete_media" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’削除ã—ã¾ã™"/> diff --git a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml index fe9998b4ce..520ef848a0 100644 --- a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml @@ -19,7 +19,7 @@  		所有者ãŒã§ãã‚‹ã“ã¨ï¼š  	</panel.string>  	<panel.string name="acquiredDate"> -		[year,datetime,local]å¹´[mth,datetime,local]月[day,datetime,local]æ—¥[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] +		[year,datetime,local]å¹´[mth,datetime,local]月[day,datetime,local]æ—¥[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]  	</panel.string>  	<panel.string name="origin_inventory">  		(インベントリ) diff --git a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml index 8ff543bf92..1240a2e670 100644 --- a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml @@ -48,7 +48,7 @@  		<text name="Name:">  			åå‰ï¼š  		</text> -		<line_editor name="Object Name" tool_tip="使用ã§ãã‚‹åå‰ã®æ–‡å—æ•°ã¯æœ€å¤§ï¼–3文å—ã¾ã§ã§ã™ã€‚é•·ã„プリムåã¯çŸç¸®ã•れã¾ã™ã€‚åå‰ã«ä½¿ç”¨ã§ãã‚‹æ–‡å—ã¯ASCII-7 ï¼ˆéžæ‹¡å¼µï¼‰ã«å«ã¾ã‚Œã‚‹å°å—å¯èƒ½ãªæ–‡å—ã®ã¿ã§ã™ï¼ˆç¸¦ç·šã€Œ|ã€ã¯ä¾‹å¤–)。"/> +		<line_editor name="Object Name" tool_tip="使用ã§ãã‚‹åå‰ã®æ–‡å—æ•°ã¯æœ€å¤§63æ–‡å—ã¾ã§ã§ã™ã€‚é•·ã„プリムåã¯çŸç¸®ã•れã¾ã™ã€‚åå‰ã«ä½¿ç”¨ã§ãã‚‹æ–‡å—ã¯ASCII-7 ï¼ˆéžæ‹¡å¼µï¼‰ã«å«ã¾ã‚Œã‚‹å°å—å¯èƒ½ãªæ–‡å—ã®ã¿ã§ã™ï¼ˆç¸¦ç·šã€Œ|ã€ã¯ä¾‹å¤–)。"/>  		<text name="Description:">  			説明:  		</text> @@ -68,7 +68,7 @@  		<text name="label click action">  			クリックã§ï¼š  		</text> -		<combo_box name="clickaction" tool_tip="マウスã§ï¼‘回左クリックã™ã‚‹ã¨ã€ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’èµ·ã“ã›ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚å„クリックアクションã«ã¯ã€ä½•ãŒã§ãã‚‹ã‹ã‚’示ã™ç‰¹åˆ¥ãªã‚«ãƒ¼ã‚½ãƒ«ãŒã‚りã¾ã™ã€‚クリックアクションã«ã‚ˆã£ã¦ã¯ã€å‹•作è¦ä»¶ãŒå¿…è¦ãªã‚‚ã®ã‚‚ã‚りã¾ã™ã€‚例ãˆã°ã€ã€Œè§¦ã‚‹ã€ã‚„「支払ã„ã€ã«ã¯ã‚¹ã‚¯ãƒªãƒ—トãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚"> +		<combo_box name="clickaction" tool_tip="マウスã§1回左クリックã™ã‚‹ã¨ã€ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’èµ·ã“ã›ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚å„クリックアクションã«ã¯ã€ä½•ãŒã§ãã‚‹ã‹ã‚’示ã™ç‰¹åˆ¥ãªã‚«ãƒ¼ã‚½ãƒ«ãŒã‚りã¾ã™ã€‚クリックアクションã«ã‚ˆã£ã¦ã¯ã€å‹•作è¦ä»¶ãŒå¿…è¦ãªã‚‚ã®ã‚‚ã‚りã¾ã™ã€‚例ãˆã°ã€ã€Œè§¦ã‚‹ã€ã‚„「支払ã„ã€ã«ã¯ã‚¹ã‚¯ãƒªãƒ—トãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚">  			<combo_box.item label="触る(デフォルト)" name="Touch/grab(default)"/>  			<combo_box.item label="オブジェクトã«åº§ã‚‹" name="Sitonobject"/>  			<combo_box.item label="オブジェクトを買ã†" name="Buyobject"/> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index 033de9a684..99909d80d1 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -31,7 +31,7 @@  		ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚グラフィックドライãƒã‚’æ›´æ–°ã—ã¦ãã ã•ã„。  	</string>  	<string name="AboutHeader"> -		[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3]([ADDRESS_SIZE]bit) +		[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3]([ADDRESS_SIZE]bit)  [[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]  	</string>  	<string name="BuildConfig"> @@ -46,9 +46,9 @@ SLURL:<nolink>[SLURL]</nolink>  [SERVER_RELEASE_NOTES_URL]  	</string>  	<string name="AboutSystem"> -		CPU:[CPU] +		CPU:[CPU]  メモリ:[MEMORY_MB]㎆ -OSã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š[OS_VERSION] +OSã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š[OS_VERSION]  グラフィックカード製造元:[GRAPHICS_CARD_VENDOR]  グラフィックカード:[GRAPHICS_CARD]  	</string> @@ -61,15 +61,15 @@ SLURL:<nolink>[SLURL]</nolink>  	<string name="AboutSettings">  		ウィンドウサイズ:[WINDOW_WIDTH]x[WINDOW_HEIGHT]  フォントサイズ調整:[FONT_SIZE_ADJUSTMENT]pt -UIスケーリング:[UI_SCALE] -æç”»è·é›¢ï¼š[DRAW_DISTANCE]ï½ -帯域幅:[NET_BANDWITH]kbitï¼ç§’ -LOD係数:[LOD_FACTOR] +UIスケーリング:[UI_SCALE] +æç”»è·é›¢ï¼š[DRAW_DISTANCE]m +帯域幅:[NET_BANDWITH]kbit/s +LOD係数:[LOD_FACTOR]  æç”»ã®è³ªï¼š[RENDER_QUALITY]  テクスãƒãƒ£ãƒ¡ãƒ¢ãƒªï¼š[TEXTURE_MEMORY]㎆  	</string>  	<string name="AboutOSXHiDPI"> -		高DPI表示モード:[HIDPI] +		高DPI表示モード:[HIDPI]  	</string>  	<string name="AboutLibs">  		J2Cデコーダãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š[J2C_VERSION] @@ -82,10 +82,10 @@ LibVLCãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š[LIBVLC_VERSION]  		パケットæå¤±ï¼š[PACKETS_LOST,number,0]ï¼[PACKETS_IN,number,0]([PACKETS_PCT,number,1]%)  	</string>  	<string name="AboutTime"> -		[year, datetime, slt]å¹´[month, datetime, slt]月[day, datetime, slt]日 [hour, datetime, slt]:[min,datetime, slt]:[second,datetime,slt] +		[year, datetime, slt]å¹´[month, datetime, slt]月[day, datetime, slt]æ—¥ [hour, datetime, slt]:[min,datetime, slt]:[second,datetime,slt]  	</string>  	<string name="ErrorFetchingServerReleaseNotesURL"> -		サーãƒãƒ¼ã®ãƒªãƒªãƒ¼ã‚¹ãƒŽãƒ¼ãƒˆã®ï¼µï¼²ï¼¬å–得時ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ +		サーãƒãƒ¼ã®ãƒªãƒªãƒ¼ã‚¹ãƒŽãƒ¼ãƒˆã®URLå–得時ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚  	</string>  	<string name="BuildConfiguration">  		ãƒ“ãƒ«ãƒ‰æ§‹æˆ @@ -357,7 +357,7 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。  		白黒  	</string>  	<string name="Colors1970"> -		197ï¼å¹´ä»£ã®ã‚«ãƒ©ãƒ¼ +		1970年代ã®ã‚«ãƒ©ãƒ¼  	</string>  	<string name="Intense">  		強調 @@ -540,7 +540,7 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。  	<string name="TooltipSLAPP">  		クリックã—㦠secondlife:// コマンドを出ã—ã¾ã™ã€‚  	</string> -	<string name="CurrentURL" value="ç¾åœ¨ã®ï¼µï¼²ï¼¬ï¼š[CurrentURL]"/> +	<string name="CurrentURL" value="ç¾åœ¨ã®URL:[CurrentURL]"/>  	<string name="TooltipEmail">  		クリックã—ã¦é›»åメールを作æˆã—ã¾ã™ã€‚  	</string> @@ -557,7 +557,7 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。  		ミュート解除  	</string>  	<string name="SLappAgentIM"> -		ï¼©ï¼ +		IM  	</string>  	<string name="SLappAgentPay">  		支払ㄠ@@ -821,28 +821,28 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。  		æ³£ã  	</string>  	<string name="anim_dance1"> -		ダンス1 +		ダンス1  	</string>  	<string name="anim_dance2"> -		ダンス2 +		ダンス2  	</string>  	<string name="anim_dance3"> -		ダンス3 +		ダンス3  	</string>  	<string name="anim_dance4"> -		ダンス4 +		ダンス4  	</string>  	<string name="anim_dance5"> -		ダンス5 +		ダンス5  	</string>  	<string name="anim_dance6"> -		ダンス6 +		ダンス6  	</string>  	<string name="anim_dance7"> -		ダンス7 +		ダンス7  	</string>  	<string name="anim_dance8"> -		ダンス8 +		ダンス8  	</string>  	<string name="anim_express_disdain">  		侮蔑 @@ -1010,7 +1010,7 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。  		オフライン  	</string>  	<string name="worldmap_item_tooltip_format"> -		[AREA]㎡ L$ [PRICE]([SQMPRICE] L$ï¼ãŽ¡ï¼‰ +		[AREA]㎡ L$ [PRICE]([SQMPRICE] L$ï¼ãŽ¡ï¼‰  	</string>  	<string name="worldmap_results_none_found">  		何も見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ @@ -1034,7 +1034,7 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。  		ã®ã•ã•ã‚„ã:  	</string>  	<string name="shout"> -		ã®ã‚·ãƒ£ã‚¦ãƒˆï¼š +		ã®å«ã³ï¼š  	</string>  	<string name="ringing">  		インワールドボイスãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸â€¦ @@ -1142,16 +1142,16 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。  		ï¼ˆä¸æ˜Žï¼‰  	</string>  	<string name="Estate / Full Region"> -		ä¸å‹•産ï¼ãƒ•ルリージョン +		ä¸å‹•産 / フルリージョン  	</string>  	<string name="Estate / Homestead"> -		ä¸å‹•産ï¼å…¥æ¤åœ° +		ä¸å‹•産 / ホームステッド  	</string>  	<string name="Mainland / Homestead"> -		メインランドï¼å…¥æ¤åœ° +		メインランド / ホームステッド  	</string>  	<string name="Mainland / Full Region"> -		メインランドï¼ãƒ•ルリージョン +		メインランド / フルリージョン  	</string>  	<string name="all_files">  		å…¨ã¦ã®ãƒ•ァイル @@ -3225,7 +3225,7 @@ For AI Character: Get the closest navigable point to the point provided.  		料金ã¯ã‚µãƒ–スクリプションã®ãƒ¬ãƒ™ãƒ«ã«ã‚ˆã‚Šç•°ãªã‚Šã¾ã™ã€‚レベルãŒé«˜ã„ã»ã©ã€æ–™é‡‘ãŒä¸‹ãŒã‚Šã¾ã™ã€‚[https://accounts.secondlife.com/change_membership/?lang=ja-JP 詳細]  	</string>  	<string name="Open landmarks"> -		オープン ランドマーク +		ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ä¸€è¦§ã‚’é–‹ã  	</string>  	<string name="Unconstrained">  		アンコンストレインド(制約ãªã—) @@ -3602,7 +3602,7 @@ For AI Character: Get the closest navigable point to the point provided.  		ã‚ãªãŸã¯ã€å‘¨å›²ã®èª°ã‹ã‚‰ã‚‚見ãˆã¦ã„ãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚  	</string>  	<string name="hud_description_total"> -		利用ä¸ã®ï¼¨ï¼µï¼¤ +		利用ä¸ã®HUD  	</string>  	<string name="hud_name_with_joint">  		[OBJ_NAME]([JNT_NAME]ã«è£…ç€ä¸ï¼‰ @@ -3695,7 +3695,7 @@ For AI Character: Get the closest navigable point to the point provided.  		å¹´é½¢æœªç¢ºèª  	</string>  	<string name="Center 2"> -		ä¸å¤®ï¼’ +		ä¸å¤®2  	</string>  	<string name="Top Right">  		å³ä¸Š @@ -3874,19 +3874,19 @@ For AI Character: Get the closest navigable point to the point provided.  		区画一覧:[PARCELS]個  	</string>  	<string name="ScriptLimitsMemoryUsed"> -		使用ã•れãŸãƒ¡ãƒ¢ãƒªï¼š[MAX]㎅ä¸[COUNT]㎅ [AVAILABLE]ãŽ…åˆ©ç”¨å¯ +		使用ã•れãŸãƒ¡ãƒ¢ãƒªï¼š[MAX]㎅ä¸[COUNT]㎅ [AVAILABLE]ãŽ…åˆ©ç”¨å¯  	</string>  	<string name="ScriptLimitsMemoryUsedSimple">  		使用ã•れãŸãƒ¡ãƒ¢ãƒªï¼š[COUNT]㎅  	</string>  	<string name="ScriptLimitsParcelScriptURLs"> -		区画ã®ã‚¹ã‚¯ãƒªãƒ—トURL +		区画ã®ã‚¹ã‚¯ãƒªãƒ—トURL  	</string>  	<string name="ScriptLimitsURLsUsed"> -		使用ã•れãŸï¼µï¼²ï¼¬ï¼š[MAX]ä»¶ä¸[COUNT]件 [AVAILABLE]ä»¶åˆ©ç”¨å¯ +		使用ã•れãŸURL:[MAX]ä»¶ä¸[COUNT]ä»¶ [AVAILABLE]ä»¶åˆ©ç”¨å¯  	</string>  	<string name="ScriptLimitsURLsUsedSimple"> -		使用ã•れãŸï¼µï¼²ï¼¬ï¼š[COUNT]ä»¶ +		使用ã•れãŸURL:[COUNT]ä»¶  	</string>  	<string name="ScriptLimitsRequestError">  		情報ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠@@ -3997,28 +3997,28 @@ For AI Character: Get the closest navigable point to the point provided.  		å³èƒ¸ç‹  	</string>  	<string name="ATTACH_HUD_CENTER_2"> -		HUD(ä¸å¤® 2) +		HUD(ä¸å¤® 2)  	</string>  	<string name="ATTACH_HUD_TOP_RIGHT"> -		HUD(å³ä¸Šï¼‰ +		HUD(å³ä¸Šï¼‰  	</string>  	<string name="ATTACH_HUD_TOP_CENTER"> -		HUD(上・ä¸å¤®ï¼‰ +		HUD(上・ä¸å¤®ï¼‰  	</string>  	<string name="ATTACH_HUD_TOP_LEFT"> -		HUD(左上) +		HUD(左上)  	</string>  	<string name="ATTACH_HUD_CENTER_1"> -		HUD(ä¸å¤® 1) +		HUD(ä¸å¤® 1)  	</string>  	<string name="ATTACH_HUD_BOTTOM_LEFT"> -		HUD(左下) +		HUD(左下)  	</string>  	<string name="ATTACH_HUD_BOTTOM"> -		HUD(下) +		HUD(下)  	</string>  	<string name="ATTACH_HUD_BOTTOM_RIGHT"> -		HUD(å³ä¸‹ï¼‰ +		HUD(å³ä¸‹ï¼‰  	</string>  	<string name="ATTACH_NECK">  		首 @@ -4078,10 +4078,10 @@ For AI Character: Get the closest navigable point to the point provided.  		[COUNT]件見ã¤ã‹ã‚Šã¾ã—㟠 	</string>  	<string name="PanelDirTimeStr"> -		[ampm,datetime,utc] [hour12,datetime,utc]:[min,datetime,utc] +		[ampm,datetime,utc] [hour12,datetime,utc]:[min,datetime,utc]  	</string>  	<string name="PanelDirEventsDateText"> -		[mthnum,datetime,slt]ï¼[day,datetime,slt] +		[mthnum,datetime,slt]/[day,datetime,slt]  	</string>  	<string name="PanelContentsTooltip">  		オブジェクトã®ä¸èº« @@ -4545,10 +4545,10 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã  		ピクセル形å¼ãŒè¨å®šã§ãã¾ã›ã‚“。  	</string>  	<string name="MBGLContextErr"> -		GLレンダーコンテã‚ストãŒä½œã‚Œã¾ã›ã‚“ +		GLレンダーコンテã‚ストãŒä½œã‚Œã¾ã›ã‚“  	</string>  	<string name="MBGLContextActErr"> -		GLレンダーコンテã‚ストを有効化ã§ãã¾ã›ã‚“。 +		GLレンダーコンテã‚ストを有効化ã§ãã¾ã›ã‚“。  	</string>  	<string name="MBVideoDrvErr">  		ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã®ãƒ“デオカードã®ãƒ‰ãƒ©ã‚¤ãƒãŒæ£å¸¸ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ãªã„ã‹ã€å¤ã„ã¾ãŸã¯ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ãŸã‚ã€[APP_NAME]を実行ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ @@ -6157,7 +6157,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã  		インベントリã‹ã‚‰ã“ã“ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ドラッグã—ã¾ã™ã€‚  	</string>  	<string name="no_session_message"> -		(Iï¼ã‚»ãƒƒã‚·ãƒ§ãƒ³ãŒå˜åœ¨ã—ã¾ã›ã‚“) +		(IMセッションãŒå˜åœ¨ã—ã¾ã›ã‚“)  	</string>  	<string name="only_user_message">  		ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã„るユーザーã¯ã‚ãªãŸã ã‘ã§ã™ã€‚ @@ -6582,28 +6582,28 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã  		一時退å¸ä¸  	</string>  	<string name="dance1"> -		ダンス1 +		ダンス1  	</string>  	<string name="dance2"> -		ダンス2 +		ダンス2  	</string>  	<string name="dance3"> -		ダンス3 +		ダンス3  	</string>  	<string name="dance4"> -		ダンス4 +		ダンス4  	</string>  	<string name="dance5"> -		ダンス5 +		ダンス5  	</string>  	<string name="dance6"> -		ダンス6 +		ダンス6  	</string>  	<string name="dance7"> -		ダンス7 +		ダンス7  	</string>  	<string name="dance8"> -		ダンス8 +		ダンス8  	</string>  	<string name="AvatarBirthDateFormat">  		[year,datetime,slt]å¹´[mthnum,datetime,slt]月[day,datetime,slt]æ—¥ @@ -6623,7 +6623,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã  	<string name="outfit_photo_verify_dimensions_error">  		ç”»åƒã®å¯¸æ³•を確èªã§ãã¾ã›ã‚“。画åƒã‚µã‚¤ã‚ºãŒãƒ”ッカーã«è¡¨ç¤ºã•れるã¾ã§ãŠå¾…ã¡ãã ã•ã„。  	</string> -	<string name="sentences_separator" value=" "/> +	<string name="sentences_separator" value=" "/>  	<string name="words_separator" value="ã€"/>  	<string name="server_is_down">  		大変申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€äºˆæœŸã—ãªã„å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚サービスã«é–¢ã™ã‚‹æ—¢çŸ¥ã®å•題ã«ã¤ã„ã¦ã¯ã€ https://status.secondlifegrid.net/?lang=ja-JP ã‚’ã”覧ãã ã•ã„。 @@ -6636,7 +6636,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã  		æ—¥:月:ç«:æ°´:木:金:土  	</string>  	<string name="dateTimeMonthNames"> -		1月:2月:3月:4月:5月:6月:7月:8月:9月:ï¼‘ï¼æœˆ:11月:12月 +		1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月  	</string>  	<string name="dateTimeMonthShortNames">  		ã‹€:ã‹:ã‹‚:㋃:ã‹„:ã‹…:㋆:㋇:㋈:㋉:㋊:ã‹‹ @@ -7108,7 +7108,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã  		パーティクルをéžè¡¨ç¤º  	</string>  	<string name="Command_360_Capture_Label"> -		36ï¼åº¦ï¼³ã‚·ãƒ§ãƒƒãƒˆ +		360度スナップショット  	</string>  	<string name="Command_AboutLand_Label">  		土地情報 @@ -7198,7 +7198,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã  		ボイスè¨å®š  	</string>  	<string name="Command_360_Capture_Tooltip"> -		36ï¼åº¦ã®æ£è·å††ç’図法ã®ã‚¹ãƒŠãƒƒãƒ—ショット画åƒã‚’撮影ã—ã¾ã™ã€‚ +		360åº¦ã®æ£è·å††ç’図法ã®ã‚¹ãƒŠãƒƒãƒ—ショット画åƒã‚’撮影ã—ã¾ã™ã€‚  	</string>  	<string name="Command_AboutLand_Tooltip">  		訪å•å…ˆã«é–¢ã™ã‚‹æƒ…報を表示ã—ã¾ã™ã€‚ @@ -7483,7 +7483,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã  		物ç†å½¢çжã«ä¸æ£ãªç¢ºèªãƒ‡ãƒ¼ã‚¿ãŒã‚りã¾ã™ã€‚物ç†ãƒ¢ãƒ‡ãƒ«ã‚’ä¿®æ£ã—ã¦ãã ã•ã„。  	</string>  	<string name="Mav_Details_MAV_BLOCK_MISSING"> -		データãŒã‚りã¾ã›ã‚“。高LODãŒå˜åœ¨ã—ã€æœ‰åйã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。è¨å®šã•れã¦ã„ãªã„å ´åˆã¯ã€ç‰©ç†ãƒ¢ãƒ‡ãƒ«ã‚’è¨å®šã—ã¾ã™ã€‚ +		データãŒã‚りã¾ã›ã‚“。高LODãŒå˜åœ¨ã—ã€æœ‰åйã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。è¨å®šã•れã¦ã„ãªã„å ´åˆã¯ã€ç‰©ç†ãƒ¢ãƒ‡ãƒ«ã‚’è¨å®šã—ã¾ã™ã€‚  	</string>  	<string name="Mav_Details_MAV_UNKNOWN_VERSION">  		物ç†å½¢çжã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒæ£ã—ãã‚りã¾ã›ã‚“。物ç†ãƒ¢ãƒ‡ãƒ«ã«æ£ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’è¨å®šã—ã¦ãã ã•ã„。 @@ -7494,7 +7494,7 @@ www.secondlife.com ã®ã‚¦ã‚§ãƒ–ã‚µã‚¤ãƒˆã«æŽ¥ç¶šã§ãã‚‹ã‹ã”確èªãã ã•ã  æŽ¥ç¶šã§ãã¦ã‚‚ã€ã“ã®ã‚¨ãƒ©ãƒ¼ãŒç¶™ç¶šçš„ã«èµ·ã“ã‚‹å ´åˆã¯ã€ã‚µãƒãƒ¼ãƒˆã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰å•題を報告ã—ã¦ãã ã•ã„。  	</string>  	<string name="ssl_peer_certificate"> -		ãƒã‚°ã‚¤ãƒ³ã‚µãƒ¼ãƒãƒ¼ãŒï¼³ï¼³ï¼¬çµŒç”±ã§ç¢ºèªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +		ãƒã‚°ã‚¤ãƒ³ã‚µãƒ¼ãƒãƒ¼ãŒSSL経由ã§ç¢ºèªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚  ã“ã®ã‚¨ãƒ©ãƒ¼ãŒç¶™ç¶šçš„ã«èµ·ã“ã‚‹å ´åˆã¯ã€Secondlife.com ã®ã‚µãƒãƒ¼ãƒˆã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰å•題を報告ã—ã¦ãã ã•ã„。  	</string>  	<string name="ssl_connect_error"> diff --git a/indra/newview/skins/default/xui/ja/teleport_strings.xml b/indra/newview/skins/default/xui/ja/teleport_strings.xml index c1be98bef9..cdfdb1628b 100644 --- a/indra/newview/skins/default/xui/ja/teleport_strings.xml +++ b/indra/newview/skins/default/xui/ja/teleport_strings.xml @@ -47,7 +47,7 @@  			インベントリシステムã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。  		</message>  		<message name="MustGetAgeRegion"> -			ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«å…¥ã‚‹ã«ã¯ã€ï¼‘8æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +			ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«å…¥ã‚‹ã«ã¯ã€18æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚  		</message>  		<message name="RegionTPSpecialUsageBlocked">  			リージョンã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 diff --git a/indra/newview/tests/llworldmap_test.cpp b/indra/newview/tests/llworldmap_test.cpp index d5bf189d82..60172b3960 100644 --- a/indra/newview/tests/llworldmap_test.cpp +++ b/indra/newview/tests/llworldmap_test.cpp @@ -32,6 +32,7 @@  #include "lltrans.h"  #include "lluistring.h"  #include "../llviewertexture.h" +#include "../llviewercontrol.h"  #include "../llworldmapmessage.h"  // Class to test  #include "../llworldmap.h" @@ -71,6 +72,11 @@ void LLUIString::updateResult() const { }  void LLUIString::setArg(const std::string& , const std::string& ) { }  void LLUIString::assign(const std::string& ) { } +LLControlGroup::LLControlGroup(const std::string& name) : LLInstanceTracker<LLControlGroup, std::string>(name) {} +LLControlGroup::~LLControlGroup() {} +bool LLControlGroup::getBOOL(std::string_view) { return true; } +LLControlGroup gSavedSettings("test_settings"); +  // End Stubbing  // ------------------------------------------------------------------------------------------- diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index d16f427530..0ce89df914 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -247,6 +247,16 @@ class ViewerManifest(LLManifest):              }          return "%(channel_vendor_base)s%(channel_variant_underscores)s_%(version_underscores)s_%(arch)s" % substitution_strings +    def installer_base_name_mac(self): +        global CHANNEL_VENDOR_BASE +        # a standard map of strings for replacing in the templates +        substitution_strings = { +            'channel_vendor_base' : '_'.join(CHANNEL_VENDOR_BASE.split()), +            'channel_variant_underscores':self.channel_variant_app_suffix(), +            'version_underscores' : '_'.join(self.args['version']) +            } +        return "%(channel_vendor_base)s%(channel_variant_underscores)s_%(version_underscores)s_universal" % substitution_strings +      def app_name(self):          global CHANNEL_VENDOR_BASE          channel_type=self.channel_type() @@ -1070,7 +1080,7 @@ class Darwin_x86_64_Manifest(ViewerManifest):      def package_finish(self): -        imagename = self.installer_base_name() +        imagename = self.installer_base_name_mac()          self.set_github_output('imagename', imagename)          finalname = imagename + ".dmg"          self.package_file = finalname diff --git a/scripts/code_tools/fix_whitespace.py b/scripts/code_tools/fix_whitespace.py index 7a88265479..d5f7ce1cce 100644 --- a/scripts/code_tools/fix_whitespace.py +++ b/scripts/code_tools/fix_whitespace.py @@ -70,7 +70,7 @@ def process_directory(directory, extensions, tab_stop):  def main():      parser = argparse.ArgumentParser(description='Convert tabs to spaces in files, considering tab stops.') -    parser.add_argument('-e', '--extensions', type=str, default='c,cpp,h,hpp,inl,py,glsl,cmake', help='Comma-separated list of file extensions to process (default: "c,cpp,h,hpp,inl,py,glsl,cmake")') +    parser.add_argument('-e', '--extensions', type=str, default='c,cpp,m,mm,h,hpp,inl,py,glsl,cmake', help='Comma-separated list of file extensions to process (default: "c,cpp,h,hpp,inl,py,glsl,cmake")')      parser.add_argument('-t', '--tabstop', type=int, default=4, help='Tab stop size (default: 4)')      parser.add_argument('-d', '--directory', type=str, required=True, help='Directory to process')  | 
