diff options
Diffstat (limited to 'indra')
174 files changed, 3937 insertions, 1112 deletions
diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index 6504002dd9..8fde58fa43 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 e0807a7d19..310659686d 100644 --- a/indra/cmake/APR.cmake +++ b/indra/cmake/APR.cmake @@ -31,3 +31,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 4608f68f50..2ba282bdb7 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -62,6 +62,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 80d243d9f8..84722b45a7 100644 --- a/indra/cmake/LLPhysicsExtensions.cmake +++ b/indra/cmake/LLPhysicsExtensions.cmake @@ -22,14 +22,25 @@ if (HAVOK) include(Havok) use_prebuilt_binary(llphysicsextensions_source) set(LLPHYSICSEXTENSIONS_SRC_DIR ${LIBS_PREBUILT_DIR}/llphysicsextensions/src) - target_link_libraries( llphysicsextensions_impl INTERFACE llphysicsextensions) + if(DARWIN) + set(LLPHYSICSEXTENSIONS_STUB_DIR ${LIBS_PREBUILT_DIR}/llphysicsextensions/stub) + # can't set these library dependencies per-arch here, need to do it using XCODE_ATTRIBUTE_OTHER_LDFLAGS[arch=*] in newview/CMakeLists.txt + #target_link_libraries( llphysicsextensions_impl INTERFACE llphysicsextensions) + #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) - 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..9f37f32b2d --- /dev/null +++ b/indra/cmake/VHACD.cmake @@ -0,0 +1,9 @@ +# -*- cmake -*- +include(Prebuilt) + +add_library(ll::vhacd INTERFACE IMPORTED) + +use_system_binary(vhacd) +use_prebuilt_binary(vhacd) + +target_include_directories(ll::vhacd SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/vhacd/) 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/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/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/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..7b9d775c53 --- /dev/null +++ b/indra/llphysicsextensionsos/llconvexdecomposition.cpp @@ -0,0 +1,83 @@ +/** +* @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 "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/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(); + 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]; - // 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 e13f0bbd96..ff0cad58d6 100644 --- a/indra/llprimitive/CMakeLists.txt +++ b/indra/llprimitive/CMakeLists.txt @@ -65,11 +65,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 () + #add unit tests if (LL_TESTS) INCLUDE(LLAddBuildTest) diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index 00ef79ce7f..8055bffd32 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 6501b3dc50..ac88af18f0 100644 --- a/indra/llprimitive/llmodel.h +++ b/indra/llprimitive/llmodel.h @@ -305,7 +305,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/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/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index 0f9fd35868..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(); } 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/llwebrtc/llwebrtc.cpp b/indra/llwebrtc/llwebrtc.cpp index 2cf3f6bbf8..b9f126e511 100644 --- a/indra/llwebrtc/llwebrtc.cpp +++ b/indra/llwebrtc/llwebrtc.cpp @@ -914,6 +914,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()) { @@ -1533,6 +1540,10 @@ void freePeerConnection(LLWebRTCPeerConnectionInterface* peer_connection) void init(LLWebRTCLogCallback* logCallback) { + if (gWebRTCImpl) + { + return; + } gWebRTCImpl = new LLWebRTCImpl(logCallback); gWebRTCImpl->init(); } diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm index c9a62eedb1..403103991e 100644 --- a/indra/llwindow/llopenglview-objc.mm +++ b/indra/llwindow/llopenglview-objc.mm @@ -114,7 +114,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) @@ -132,29 +132,29 @@ 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)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]; @@ -188,28 +188,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 @@ -221,90 +221,90 @@ 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). - NSOpenGLPixelFormatAttribute attrs[] = { + // 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 attrs[] = { NSOpenGLPFANoRecovery, - NSOpenGLPFADoubleBuffer, - NSOpenGLPFAClosestPolicy, - NSOpenGLPFAAccelerated, - NSOpenGLPFASampleBuffers, 0, - NSOpenGLPFASamples, 0, - NSOpenGLPFAStencilSize, 8, - NSOpenGLPFADepthSize, 24, - NSOpenGLPFAAlphaSize, 8, - NSOpenGLPFAColorSize, 24, - NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core, - 0 + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAClosestPolicy, + NSOpenGLPFAAccelerated, + NSOpenGLPFASampleBuffers, 0, + NSOpenGLPFASamples, 0, + NSOpenGLPFAStencilSize, 8, + NSOpenGLPFADepthSize, 24, + NSOpenGLPFAAlphaSize, 8, + NSOpenGLPFAColorSize, 24, + NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core, + 0 }; - NSOpenGLPixelFormat *pixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:attrs] autorelease]; + NSOpenGLPixelFormat *pixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:attrs] 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; + } - NSOpenGLContext *glContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:nil]; + NSOpenGLContext *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]; - //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]; - } + } - 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 @@ -313,14 +313,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. @@ -365,29 +365,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. @@ -395,23 +395,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 @@ -426,29 +426,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 @@ -462,7 +462,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) @@ -490,8 +490,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]) @@ -532,69 +532,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 @@ -680,21 +680,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 @@ -707,9 +707,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]; @@ -727,7 +727,7 @@ attributedStringInfo getSegments(NSAttributedString *str) NSLog(@"Encountered an unsupported attributed character. Exception: %@ String: %@", e.name, aString); return; } - } + } @try { @@ -760,36 +760,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 @@ -824,7 +824,7 @@ attributedStringInfo getSegments(NSAttributedString *str) - (void) setGLView:(LLOpenGLView *)view { - glview = view; + glview = view; } - (void)keyDown:(NSEvent *)theEvent @@ -875,24 +875,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 d0fa16b26a..7a5404e615 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -95,6 +95,7 @@ public: #if LL_WINDOWS 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/llwindowheadless.h b/indra/llwindow/llwindowheadless.h index 5696b69a59..dc7b833013 100644 --- a/indra/llwindow/llwindowheadless.h +++ b/indra/llwindow/llwindowheadless.h @@ -63,6 +63,7 @@ public: #if LL_WINDOWS /*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.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.h b/indra/llwindow/llwindowsdl.h index 196ad2986d..521d52df30 100644 --- a/indra/llwindow/llwindowsdl.h +++ b/indra/llwindow/llwindowsdl.h @@ -68,6 +68,7 @@ public: /*virtual*/ bool switchContext(bool fullscreen, const LLCoordScreen &size, bool disable_vsync, const LLCoordScreen * const posp = NULL); /*virtual*/ bool setCursorPosition(LLCoordWindow position); /*virtual*/ bool getCursorPosition(LLCoordWindow *position); + /*virtual*/ bool isWrapMouse() const override { return true; } /*virtual*/ void showCursor(); /*virtual*/ void hideCursor(); /*virtual*/ void showCursorFromMouseMove(); diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 23d5866710..824d0f5ec6 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) { @@ -3156,6 +3157,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 { @@ -3172,6 +3174,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 239193001c..fb74cf0b5a 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -50,7 +50,7 @@ include(VulkanGltf) include(ZLIBNG) include(LLPrimitive) -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 @@ -59,6 +59,11 @@ if (NOT HAVOK_TPV) # which means we need to duct tape this togther ... add_subdirectory(${LLPHYSICSEXTENSIONS_SRC_DIR} llphysicsextensions) + if (NOT "${LLPHYSICSEXTENSIONS_STUB_DIR}" STREQUAL "") + # for darwin universal builds we need both real llphysicsextensions and the stub for aarch64 fallback + # this will only be set when HAVOK is ON, otherwise the normal stub fallback will be in effect + add_subdirectory(${LLPHYSICSEXTENSIONS_STUB_DIR} llphysicsextensionsstub) + endif() # Another hack that works with newer cmake versions: cmake_policy( SET CMP0079 NEW) @@ -71,7 +76,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 @@ -1711,10 +1716,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}") @@ -1952,9 +1953,31 @@ elseif (DARWIN) set_target_properties(${VIEWER_BINARY_NAME} PROPERTIES RESOURCE SecondLife.xib - #LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -Xlinker -dead_strip -Xlinker -map -Xlinker ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_BINARY_NAME}.MAP" LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -Xlinker -dead_strip" ) + 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} @@ -2031,6 +2054,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 ac79223738..d6a1fbd124 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2469,16 +2469,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> 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 caf3990801..0d57b33a51 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; 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/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/llfloateremojipicker.cpp b/indra/newview/llfloateremojipicker.cpp index c5f4a2f0cf..ab76f3473b 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/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/llfloatermarketplace.cpp b/indra/newview/llfloatermarketplace.cpp index 889daf84ab..4abea64302 100644 --- a/indra/newview/llfloatermarketplace.cpp +++ b/indra/newview/llfloatermarketplace.cpp @@ -27,10 +27,11 @@ #include "llviewerprecompiledheaders.h" #include "llfloatermarketplace.h" +#include "llviewercontrol.h" #include "lluictrlfactory.h" LLFloaterMarketplace::LLFloaterMarketplace(const LLSD& key) - : LLFloater(key) + : LLFloaterWebContent(key) { } @@ -38,10 +39,25 @@ LLFloaterMarketplace::~LLFloaterMarketplace() { } +// just to override LLFloaterWebContent +void LLFloaterMarketplace::onClose(bool app_quitting) +{ +} + bool LLFloaterMarketplace::postBuild() { - enableResizeCtrls(true, true, false); + LLFloaterWebContent::postBuild(); + mWebBrowser = getChild<LLMediaCtrl>("marketplace_contents"); + mWebBrowser->addObserver(this); + return true; } - +void LLFloaterMarketplace::openMarketplace() +{ + std::string url = gSavedSettings.getString("MarketplaceURL"); + if (mCurrentURL != url) + { + mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML); + } +} diff --git a/indra/newview/llfloatermarketplace.h b/indra/newview/llfloatermarketplace.h index 2ae4d0d64a..9524c94eee 100644 --- a/indra/newview/llfloatermarketplace.h +++ b/indra/newview/llfloatermarketplace.h @@ -27,14 +27,20 @@ #pragma once #include "llfloater.h" +#include "llfloaterwebcontent.h" class LLFloaterMarketplace: - public LLFloater + public LLFloaterWebContent { friend class LLFloaterReg; + +public: + void openMarketplace(); + private: LLFloaterMarketplace(const LLSD& key); ~LLFloaterMarketplace(); bool postBuild() override; + void onClose(bool app_quitting) override; }; 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 5a39d41478..99161d8d93 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -774,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(); diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index 8e6a47dce5..7ee1b88f05 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -66,7 +66,7 @@ class LLSearchHandler : public LLCommandHandler { LLSearchHandler gSearchHandler; LLFloaterSearch::LLFloaterSearch(const LLSD& key) - : LLFloater(key) + : LLFloaterWebContent(key) { mSearchType.insert("standard"); mSearchType.insert("land"); @@ -86,6 +86,12 @@ LLFloaterSearch::~LLFloaterSearch() void LLFloaterSearch::onOpen(const LLSD& tokens) { initiateSearch(tokens); + mWebBrowser->setFocus(true); +} + +// just to override LLFloaterWebContent +void LLFloaterSearch::onClose(bool app_quitting) +{ } void LLFloaterSearch::initiateSearch(const LLSD& tokens) @@ -161,7 +167,11 @@ void LLFloaterSearch::initiateSearch(const LLSD& tokens) bool LLFloaterSearch::postBuild() { - enableResizeCtrls(true, true, false); + LLFloaterWebContent::postBuild(); + mWebBrowser = getChild<LLMediaCtrl>("search_contents"); + mWebBrowser->addObserver(this); + getChildView("address")->setEnabled(false); + getChildView("popexternal")->setEnabled(false); // This call is actioned by the preload code in llViewerWindow // that creates the search floater during the login process diff --git a/indra/newview/llfloatersearch.h b/indra/newview/llfloatersearch.h index e8a2be4797..6d93474f4a 100644 --- a/indra/newview/llfloatersearch.h +++ b/indra/newview/llfloatersearch.h @@ -27,13 +27,15 @@ #pragma once #include "llfloater.h" +#include "llfloaterwebcontent.h" class LLFloaterSearch: - public LLFloater { + public LLFloaterWebContent { friend class LLFloaterReg; public: void onOpen(const LLSD& key) override; + void onClose(bool app_quitting) override; private: LLFloaterSearch(const LLSD& key); diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index c1e80ba4f1..bda4afcc04 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -809,6 +809,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 1e6c5cf04a..e322d3ae28 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 e129a1296a..eda93e3e79 100644 --- a/indra/newview/llinventorygallerymenu.cpp +++ b/indra/newview/llinventorygallerymenu.cpp @@ -603,20 +603,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(); @@ -735,8 +738,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")); } @@ -764,6 +766,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) @@ -1020,9 +1038,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/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index e0f942b083..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,7 +2572,7 @@ EMeshProcessingResult LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_ { LLMutexLock lock(mLoadedMutex); - mDecompositionQ.push_back(d); + mPhysicsQ.push_back(d); } return MESH_OK; } @@ -3376,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()) { @@ -3399,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 @@ -3415,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(); + } } } @@ -4659,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 @@ -4673,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) @@ -4823,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 450afd5d5a..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; @@ -871,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 46411fc4a0..6b1fbdce4c 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -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 diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 3ab48f69c8..182b648914 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/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/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/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp index eb7fe06e7d..c6fa64753c 100644 --- a/indra/newview/llreflectionmapmanager.cpp +++ b/indra/newview/llreflectionmapmanager.cpp @@ -998,11 +998,11 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face) mTexture->bind(channel); } } + + gIrradianceGenProgram.unbind(); } mMipChain[0].flush(); - - gIrradianceGenProgram.unbind(); } } diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 82c959d7f7..2727127633 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -41,6 +41,7 @@ #include "llpanelpresetscamerapulldown.h" #include "llpanelpresetspulldown.h" #include "llpanelvolumepulldown.h" +#include "llfloatermarketplace.h" #include "llfloaterregioninfo.h" #include "llfloaterscriptdebug.h" #include "llhints.h" @@ -523,7 +524,11 @@ void LLStatusBar::onClickBuyCurrency() void LLStatusBar::onClickShop() { - LLFloaterReg::toggleInstanceOrBringToFront("marketplace"); + LLFloaterReg::showInstanceOrBringToFront("marketplace"); + if (LLFloaterMarketplace* marketplace = LLFloaterReg::getTypedInstance<LLFloaterMarketplace>("marketplace")) + { + marketplace->openMarketplace(); + } } void LLStatusBar::onMouseEnterPresetsCamera() 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/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 3695478061..801ff3c212 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -912,7 +912,23 @@ class LLFileUploadModel : public view_listener_t { bool handleEvent(const LLSD& userdata) { - LLFloaterModelPreview::showModelPreview(); + if (LLConvexDecomposition::isFunctional()) + { + LLFloaterModelPreview::showModelPreview(); + } + else + { + if (gGLManager.mIsApple) + { + LLNotificationsUtil::add("ModelUploaderMissingPhysicsApple"); + } + else + { + // TPV? + LLNotificationsUtil::add("ModelUploaderMissingPhysics"); + LLFloaterModelPreview::showModelPreview(); + } + } return true; } }; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index d72d428c08..fb9e5fd0a9 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/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 3849c286c5..670a3b2939 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -3340,7 +3340,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/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index 83f104ef01..e6fcc7bd6b 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -273,6 +273,11 @@ void LLWebRTCVoiceClient::cleanupSingleton() void LLWebRTCVoiceClient::init(LLPumpIO* pump) { // constructor will set up LLVoiceClient::getInstance() + initWebRTC(); +} + +void LLWebRTCVoiceClient::initWebRTC() +{ llwebrtc::init(this); mWebRTCDeviceInterface = llwebrtc::getDeviceInterface(); @@ -293,6 +298,8 @@ void LLWebRTCVoiceClient::terminate() mVoiceEnabled = false; sShuttingDown = true; // so that coroutines won't post more work. llwebrtc::terminate(); + + mWebRTCDeviceInterface = nullptr; } //--------------------------------------------------- @@ -1804,6 +1811,15 @@ void LLWebRTCVoiceClient::onChangeDetailed(const LLMute& mute) } } +void LLWebRTCVoiceClient::userAuthorized(const std::string& user_id, const LLUUID& agentID) +{ + if (sShuttingDown) + { + sShuttingDown = false; // was terminated, restart + initWebRTC(); + } +} + void LLWebRTCVoiceClient::predSetUserMute(const LLWebRTCVoiceClient::sessionStatePtr_t &session, const LLUUID &id, bool mute) { session->setUserMute(id, mute); diff --git a/indra/newview/llvoicewebrtc.h b/indra/newview/llvoicewebrtc.h index 722d81fdc2..2ce575852a 100644 --- a/indra/newview/llvoicewebrtc.h +++ b/indra/newview/llvoicewebrtc.h @@ -204,7 +204,7 @@ public: //@} // authorize the user - void userAuthorized(const std::string &user_id, const LLUUID &agentID) override {}; + void userAuthorized(const std::string &user_id, const LLUUID &agentID) override; void OnConnectionEstablished(const std::string& channelID, const LLUUID& regionID); @@ -443,6 +443,8 @@ public: boost::signals2::connection mAvatarNameCacheConnection; private: + // init or restart the WebRTC device interface. + void initWebRTC(); // Coroutine support methods //--- diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 80fc486a10..aa230f4636 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) { @@ -6765,7 +6765,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()) { @@ -6805,7 +6805,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/pipeline.cpp b/indra/newview/pipeline.cpp index 8b6680ee10..fc66e9283e 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -4340,7 +4340,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); diff --git a/indra/newview/skins/default/xui/en/floater_marketplace.xml b/indra/newview/skins/default/xui/en/floater_marketplace.xml index 2299e02c63..99fb3a1ad8 100644 --- a/indra/newview/skins/default/xui/en/floater_marketplace.xml +++ b/indra/newview/skins/default/xui/en/floater_marketplace.xml @@ -1,26 +1,201 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater - positioning="cascading" - legacy_header_height="225" - can_minimize="true" - can_close="true" - can_resize="true" - min_height="800" - min_width="800" - height="800" - layout="topleft" - name="Marketplace" - single_instance="true" - help_topic="marketplace" - save_rect="true" - save_visibility="true" - title="MARKETPLACE" - width="800"> - <web_browser - top="25" - height="775" - width="800" - follows="all" - name="marketplace_contents" - trusted_content="true"/> + legacy_header_height="18" + can_minimize="true" + can_close="true" + can_resize="true" + height="775" + layout="topleft" + min_height="500" + min_width="600" + name="Marketplace" + save_rect="true" + single_instance="true" + save_visibility="true" + title="MARKETPLACE" + tab_stop="true" + width="780"> + <layout_stack + bottom="775" + follows="left|right|top|bottom" + layout="topleft" + left="5" + animate="false" + name="stack1" + orientation="vertical" + top="20" + width="770"> + <layout_panel + auto_resize="false" + default_tab_group="1" + height="22" + layout="topleft" + left="0" + min_height="20" + name="nav_controls" + top="400" + width="770"> + <button + image_overlay="Arrow_Left_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + hover_glow_amount="0.15" + tool_tip="Navigate back" + follows="left|top" + height="22" + layout="topleft" + left="1" + name="back" + top="0" + width="22"> + <button.commit_callback + function="WebContent.Back" /> + </button> + <button + image_overlay="Arrow_Right_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Navigate forward" + follows="left|top" + height="22" + layout="topleft" + left="27" + name="forward" + top_delta="0" + width="22"> + <button.commit_callback + function="WebContent.Forward" /> + </button> + <button + image_overlay="Stop_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Stop navigation" + enabled="true" + follows="left|top" + height="22" + layout="topleft" + left="51" + name="stop" + top_delta="0" + width="22"> + <button.commit_callback + function="WebContent.Stop" /> + </button> + <button + image_overlay="Refresh_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Reload page" + follows="left|top" + height="22" + layout="topleft" + left="51" + name="reload" + top_delta="0" + width="22"> + <button.commit_callback + function="WebContent.Reload" /> + </button> + <combo_box + allow_text_entry="true" + follows="left|top|right" + tab_group="1" + height="22" + layout="topleft" + left_pad="4" + max_chars="1024" + name="address" + combo_editor.select_on_focus="true" + tool_tip="Enter URL here" + top_delta="0" + width="672"> + <combo_box.commit_callback + function="WebContent.EnterAddress" /> + </combo_box> + <icon + name="media_secure_lock_flag" + height="16" + follows="top|left" + image_name="Lock2" + layout="topleft" + left_delta="2" + top_delta="2" + visible="false" + tool_tip="Secured Browsing" + width="16" /> + <button + image_overlay="ExternalBrowser_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Open current URL in your desktop browser" + follows="right|top" + enabled="true" + height="22" + layout="topleft" + name="popexternal" + right="770" + top_delta="-2" + width="22"> + <button.commit_callback + function="WebContent.PopExternal" /> + </button> + </layout_panel> + <layout_panel + height="40" + layout="topleft" + left_delta="0" + name="external_controls" + top_delta="0" + auto_resize="true" + width="585"> + <web_browser + bottom="-2" + follows="all" + layout="topleft" + left="0" + name="marketplace_contents" + top="0"/> + </layout_panel> + <layout_panel name="status_bar" + height="23" + auto_resize="false"> + <text + type="string" + length="200" + follows="bottom|left" + height="20" + layout="topleft" + left_delta="0" + name="statusbartext" + parse_urls="false" + text_color="0.4 0.4 0.4 1" + top_pad="3" + width="495"/> + <progress_bar + color_bar="0.3 1.0 0.3 1" + follows="bottom|right" + height="16" + top_delta="-1" + left_pad="24" + layout="topleft" + name="statusbarprogress" + width="64"/> + </layout_panel> + </layout_stack> </floater> 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/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml index 76a486e211..43c4aa1b9d 100644 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ b/indra/newview/skins/default/xui/en/floater_search.xml @@ -1,26 +1,202 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater - positioning="cascading" - legacy_header_height="225" - can_minimize="true" - can_close="true" - can_resize="true" - min_height="800" - min_width="800" - height="800" - layout="topleft" - name="Search" - single_instance="true" - help_topic="search" - save_rect="true" - save_visibility="true" - title="SEARCH" - width="800"> - <web_browser - top="25" - height="775" - width="800" - follows="all" - name="search_contents" - trusted_content="true"/> + legacy_header_height="18" + can_minimize="true" + can_close="true" + can_resize="true" + height="775" + layout="topleft" + min_height="500" + min_width="600" + name="Search" + save_rect="true" + single_instance="true" + save_visibility="true" + title="SEARCH" + tab_stop="true" + width="780"> + <layout_stack + bottom="775" + follows="left|right|top|bottom" + layout="topleft" + left="5" + animate="false" + name="stack1" + orientation="vertical" + top="20" + width="770"> + <layout_panel + auto_resize="false" + default_tab_group="1" + height="22" + layout="topleft" + left="0" + min_height="20" + name="nav_controls" + top="400" + width="770"> + <button + image_overlay="Arrow_Left_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + hover_glow_amount="0.15" + tool_tip="Navigate back" + follows="left|top" + height="22" + layout="topleft" + left="1" + name="back" + top="0" + width="22"> + <button.commit_callback + function="WebContent.Back" /> + </button> + <button + image_overlay="Arrow_Right_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Navigate forward" + follows="left|top" + height="22" + layout="topleft" + left="27" + name="forward" + top_delta="0" + width="22"> + <button.commit_callback + function="WebContent.Forward" /> + </button> + <button + image_overlay="Stop_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Stop navigation" + enabled="true" + follows="left|top" + height="22" + layout="topleft" + left="51" + name="stop" + top_delta="0" + width="22"> + <button.commit_callback + function="WebContent.Stop" /> + </button> + <button + image_overlay="Refresh_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Reload page" + follows="left|top" + height="22" + layout="topleft" + left="51" + name="reload" + top_delta="0" + width="22"> + <button.commit_callback + function="WebContent.Reload" /> + </button> + <combo_box + allow_text_entry="true" + follows="left|top|right" + tab_group="1" + height="22" + layout="topleft" + left_pad="4" + max_chars="1024" + name="address" + combo_editor.select_on_focus="true" + tool_tip="Enter URL here" + top_delta="0" + width="672"> + <combo_box.commit_callback + function="WebContent.EnterAddress" /> + </combo_box> + <icon + name="media_secure_lock_flag" + height="16" + follows="top|left" + image_name="Lock2" + layout="topleft" + left_delta="2" + top_delta="2" + visible="false" + tool_tip="Secured Browsing" + width="16" /> + <button + image_overlay="ExternalBrowser_Off" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Disabled" + image_selected="PushButton_Selected" + image_unselected="PushButton_Off" + chrome="true" + tool_tip="Open current URL in your desktop browser" + follows="right|top" + enabled="true" + height="22" + layout="topleft" + name="popexternal" + right="770" + top_delta="-2" + width="22"> + <button.commit_callback + function="WebContent.PopExternal" /> + </button> + </layout_panel> + <layout_panel + height="40" + layout="topleft" + left_delta="0" + name="external_controls" + top_delta="0" + auto_resize="true" + width="585"> + <web_browser + bottom="-2" + follows="all" + layout="topleft" + left="0" + trusted_content="true" + name="search_contents" + top="0"/> + </layout_panel> + <layout_panel name="status_bar" + height="23" + auto_resize="false"> + <text + type="string" + length="200" + follows="bottom|left" + height="20" + layout="topleft" + left_delta="0" + name="statusbartext" + parse_urls="false" + text_color="0.4 0.4 0.4 1" + top_pad="3" + width="495"/> + <progress_bar + color_bar="0.3 1.0 0.3 1" + follows="bottom|right" + height="16" + top_delta="-1" + left_pad="24" + layout="topleft" + name="statusbarprogress" + width="64"/> + </layout_panel> + </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index fa3fd86d59..dbd513afe8 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -2239,6 +2239,25 @@ Couldn't open uploaded sound file for reading: <notification icon="alertmodal.tga" + name="ModelUploaderMissingPhysicsApple" + type="alertmodal"> +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' + <tag>fail</tag> + </notification> + + <notification + icon="alertmodal.tga" + name="ModelUploaderMissingPhysics" + type="alertmodal"> +Physics library is not present, some of the model uploader's functionality might not work or might not work correctly. + <tag>fail</tag> + </notification> + + <notification + icon="alertmodal.tga" name="SoundFileNotRIFF" type="alertmodal"> File does not appear to be a RIFF WAVE file: @@ -6576,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_preferences_move.xml b/indra/newview/skins/default/xui/en/panel_preferences_move.xml index 4aafceb112..3a5a8cbfec 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 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="360度Sショット"> +<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="360度画像を作成" 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で自動返却なし): + 他者のオブジェクトの自動返却(分単位、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"> - 区画面積が128㎡未満のため、このオプションは無効です。 + 区画面積が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ページ、その他のメディアのURLを指定します。"/> + <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メディアのサイズです。デフォルトの0のままにします。"> + <text name="media_size" tool_tip="レンダリングするWebメディアのサイズです。デフォルトの0のままにします。"> サイズ: </text> - <spinner name="media_size_width" tool_tip="レンダリングするWebメディアのサイズです。デフォルトの0のままにします。"/> - <spinner name="media_size_height" tool_tip="レンダリングするWebメディアのサイズです。デフォルトの0のままにします。"/> + <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="この区画にアクセスするには、18歳以上でなければなりません。詳細につきましては、[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="これは、このリージョン(地域)のグリッドX座標です。"/> - <line_editor name="gridposy" tool_tip="これは、このリージョン(地域)のグリッドY座標です。"/> + <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="軸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_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 + 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="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.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 + 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 + 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 + アクティブな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 + 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="Y" 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="Y" 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/O" 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"> - 360度Sショットを撮影 + 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="受信したUDPデータ" 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="シムのFPS" name="simfps"/> - <stat_bar label="物理作用のFPS" 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="Y" 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="Y" 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="Y" 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="Y" 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="Y" 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="Y" 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="密度(100㎏/㎥)" 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="選択したXMLファイルで定義されたXUIフロータを表示します。"/> + <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="選択した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="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="選択したXMLファイルで定義されたXUIフロータを表示します。"/> + <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="フローターXMLファイルを編集するためのエディター(実行可能ファイル)へのフルパス。(引用符は必要ありません)"/> - <button follows="left|bottom" label="ブラウズ…" label_selected="ブラウズ…" name="browse_for_executable" tool_tip="フローターXMLファイルを編集するためのエディター(実行可能ファイル)を参照します。"/> + <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によって生成されたXMLの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かURLパターンを入力して、許可するドメインをリストに追加します。 </text> - <line_editor name="whitelist_entry" tool_tip="URLか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="IM" 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="XMLとしてダンプ" 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="IM" 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="XMLとしてダンプ" 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="IM" 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="IM…" 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="アセットのUUIDをコピー" 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="IM" 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="IM" 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="IM" 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="IM" 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="IMを送信…" 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="360度スナップショット" 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="オブジェクトのXY軸をグリッドに吸着" 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="次回起動時にGLをデバッグ" 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="テストIMを送信する" 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="アセットのIDを取得" 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">オーディオファイルが長すぎます。(最大10秒): + <notification name="SoundFileInvalidTooLong">オーディオファイルが長すぎます。(最大30秒): [FILE] <tag> fail @@ -1411,7 +1411,7 @@ L$が不足しているので、このグループに参加することができ fail </tag> </notification> - <notification name="invalid_tport">テレポートの試行は1分間に6回までと制限されています。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="IMでチャット"/> + <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]について知りたいときは、F1キーを押してください。 +ヘルプが必要なときや、[SECOND_LIFE]について知りたいときは、F1キーを押してください。 男性あるいは女性のアバターを選択してください。この設定は後で変更できます。 <tag> confirm @@ -2189,8 +2189,8 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries 発行元:[ISSUER_NAME_STRING] 有効日:[VALID_FROM] 次の更新日:[VALID_TO] -MD5フィンガープリント:[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] - MD5フィンガープリント:[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分経過すると、全員のマップが再度ログイン後に更新されます) +(作成中は5分経過すると、全員のマップが再度ログイン後に更新されます) <tag> fail </tag> @@ -2281,7 +2281,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries テクスチャは、24ビットの512✕512以下の画像を選択し、「適用」ボタンを再度クリックしてください。 </notification> <notification name="RawUploadStarted"> - アップロードを開始しました。接続速度によっては、最大2分程度かかります。 + アップロードを開始しました。接続速度によっては、最大2分程度かかります。 </notification> <notification name="ConfirmBakeTerrain">現在の地形を構築しようとしています。この操作を行うと現在の地形が、土地の隆起と沈降の制限範囲の基準となり、「復元」ツールのデフォルトになります。操作を続行しますか? <tag> @@ -2606,7 +2606,7 @@ OKをクリックして、ダウンロードとインストールを開始しま </tag> <form name="form"> <input name="message"> - あなたはフリーズされています。動くこともチャットすることもできません。管理者がIMであなたに連絡します。 + あなたはフリーズされています。動くこともチャットすることもできません。管理者が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">現在ノートカードのアセットIDを読み込むことができません。 + <notification name="UnableToLoadNotecardAsset">現在ノートカードのアセットIDを読み込むことができません。 <tag> fail </tag> <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="NotAllowedToViewNotecard">要求したアセットIDに関するノートカードを閲覧するには、権限が不十分です。 + <notification name="NotAllowedToViewNotecard">要求したアセットIDに関するノートカードを閲覧するには、権限が不十分です。 <tag> fail </tag> <usetemplate name="okbutton" yestext="OK"/> </notification> - <notification name="MissingNotecardAssetID">ノートカード用のアセットIDがデータベースに登録されていません。 + <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 DCMAポリシー]に規定されている有効な権利侵害通知を提出する必要があります。 +⑵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">保存されたURLのリストを消去します。このまま、リストを消去してもよろしいですか? + <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">訪問しようとしている場所は、18歳以上の住人に制限されています。 + <notification name="NotAgeVerified">訪問しようとしている場所は、18歳以上の住人に制限されています。 <usetemplate ignoretext="年齢制限付きのエリアを訪問する年齢に達していません。" name="okignore" yestext="OK"/> </notification> - <notification name="NotAgeVerified_Notify">この場所への入場は、18歳以上に制限されています。 + <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を送信できません。 + 親不動産間では、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」を選択します。 + 誰かとのプライベートな会話を開くには、相手のアバターをクリックして、メニューから「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">この区画にいるアバターやこの区画内で行われる文字チャットは、他の区画から見えません。あなたには、この区画外にいる住人が見えず、外の住人にはあなたの姿が見えません。チャンネル0での通常の文字チャットもブロックされます。 + <notification name="SeeAvatars">この区画にいるアバターやこの区画内で行われる文字チャットは、他の区画から見えません。あなたには、この区画外にいる住人が見えず、外の住人にはあなたの姿が見えません。チャンネル0での通常の文字チャットもブロックされます。 <unique/> </notification> <notification name="ScriptsStopped"> @@ -4048,12 +4048,12 @@ Webページにリンクすると、他人がこの場所に簡単にアクセ fail </tag> </notification> - <notification name="MustGetAgeRegion">このリージョン(地域)に入るには、18歳以上である必要があります。 + <notification name="MustGetAgeRegion">このリージョン(地域)に入るには、18歳以上である必要があります。 <tag> fail </tag> </notification> - <notification name="MustGetAgeParcel">この区画に入るには、18歳以上である必要があります。 + <notification name="MustGetAgeParcel">この区画に入るには、18歳以上である必要があります。 <tag> fail </tag> @@ -4296,7 +4296,7 @@ Webページにリンクすると、他人がこの場所に簡単にアクセ </tag> </notification> <notification name="OfferCallingCard">[NAME]が、コーリングカードを渡そうとしています。 -あなたのインベントリにブックマークが追加され、この住人に素早くIMを送ることができます。 +あなたのインベントリにブックマークが追加され、この住人に素早く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$残高は、処理が完了するとアップデートされます。処理に20分以上かかった場合、お取り引きがキャンセルされることがあります。その場合は、購入金額はあなたの 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">すべてのIMを閉じますか? + <notification name="ConfirmCloseAll">すべてのIMを閉じますか? <tag> confirm </tag> - <usetemplate ignoretext="すべてのIMを閉じる前の確認" 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"> - メモリ不足のため30秒以内に[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">選択された最初の10個のオブジェクトのみが無効にされました。必要に応じて、リフレッシュして選択内容を追加してください。 + <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のレベル6で圧縮したテスト結果: -圧縮:[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="リグメッシュがHUDポイントにアタッチされている場合に警告します。" 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="0秒"/> + <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人に制限されています。 + グループのバンが送信されていません:選択した住人が多すぎます。グループへの立入禁止の数は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時間メンバーが2人未満のグループは、自動的に解散されます。 + 注: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人に制限されています。 +グループへの招待は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"> - 通知は14日間保存されます。 -1日の制限数は200通です。 + 通知は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"> 役割には、タイトルと許可された能力が割り当てられています。 メンバーは1つ以上の役割を持つことができます。 -グループで使える役割は10個までで、「全員(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="ビューアーは、目標FPSを満たすように設定が調整されるまで停止します。"/> + <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="ビューアーは、このフローターが閉じていても停止するまで、目標FPSを満たすように設定を継続的に調整します。"> + <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 + アクティブなHUD </text> <text name="huds_desc1"> - 使用していないHUDを取り外すとメモリが節約され、Second Lifeの処理が高速化されます。 + 使用していないHUDを取り外すとメモリが節約され、Second Lifeの処理が高速化されます。 </text> <text name="huds_desc2"> - 注意:HUDの最小化ボタンを使用しても、HUDを取り外したことにはなりません。 + 注意: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 + 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="640✕480" name="640x480"/> - <combo_box.item label="800✕600" name="800x600"/> - <combo_box.item label="1024✕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="オフライン時に受け取ったIMはメールで受信する" name="send_im_to_email"/> - <check_box label="フレンドとグループ以外からのコールとIMは受信しない" 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 オフライン時のIMのメール送信先の設定] + [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"> - フレンドIM: + フレンドからの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"> - フレンドのいないIM: + フレンド以外からの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"> - 会話IM: + 会議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: + オブジェクトによる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="これを選択すると、チャット、IMなどで表示名が表示されます。"/> + <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="10分" name="item2"/> - <combo_box.item label="30分" 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 + 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]m) + 空 [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]m + 空[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]m + 空[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]m + 空[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 + 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番のテクスチャの高さの「最低値」です。 + 計測単位はメートルで、「低」の値は、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がもしあれば、ここに入ります。 + 選択したメディアの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="使用できる名前の文字数は最大63文字までです。長いプリム名は短縮されます。名前に使用できる文字は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="マウスで1回左クリックすると、オブジェクトに対してアクションを起こせるようになります。各クリックアクションには、何ができるかを示す特別なカーソルがあります。クリックアクションによっては、動作要件が必要なものもあります。例えば、「触る」や「支払い」にはスクリプトが必要になります。"> + <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 2a338123f3..7d618bc337 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]m -帯域幅:[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取得時にエラーが発生しました。 + サーバーのリリースノートのURL取得時にエラーが発生しました。 </string> <string name="BuildConfiguration"> ビルド構成 @@ -357,7 +357,7 @@ support@secondlife.com にお問い合わせください。 白黒 </string> <string name="Colors1970"> - 1970年代のカラー + 1970年代のカラー </string> <string name="Intense"> 強調 @@ -540,7 +540,7 @@ support@secondlife.com にお問い合わせください。 <string name="TooltipSLAPP"> クリックして secondlife:// コマンドを出します。 </string> - <string name="CurrentURL" value="現在のURL:[CurrentURL]"/> + <string name="CurrentURL" value="現在のURL:[CurrentURL]"/> <string name="TooltipEmail"> クリックして電子メールを作成します。 </string> @@ -557,7 +557,7 @@ support@secondlife.com にお問い合わせください。 ミュート解除 </string> <string name="SLappAgentIM"> - IM + 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 + 利用中の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 + 中央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"> - 使用されたURL:[MAX]件中[COUNT]件 [AVAILABLE]件利用可 + 使用されたURL:[MAX]件中[COUNT]件 [AVAILABLE]件利用可 </string> <string name="ScriptLimitsURLsUsedSimple"> - 使用されたURL:[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"> - (IMセッションが存在しません) + (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月:10月: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"> - 360度Sショット + 360度スナップショット </string> <string name="Command_AboutLand_Label"> 土地情報 @@ -7198,7 +7198,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ ボイス設定 </string> <string name="Command_360_Capture_Tooltip"> - 360度の正距円筒図法のスナップショット画像を撮影します。 + 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経由で確認できませんでした。 + ログインサーバーが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"> - このリージョン(地域)に入るには、18歳以上である必要があります。 + このリージョン(地域)に入るには、18歳以上である必要があります。 </message> <message name="RegionTPSpecialUsageBlocked"> リージョンに入ることができません。 diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index e46073057e..0e2c9d177e 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -245,6 +245,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() @@ -1068,7 +1078,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 |
